blob: 3f4634729fe8f82adcfdf496500f76ef79f2d867 [file] [log] [blame]
import os
from twitter.common.dirutil import safe_mkdir
import pkg_resources
def unpack_assets(output_dir, module, asset_path, execute=lambda x: None):
"""
Extract files from a module in a package into 'output_dir'.
:param output_dir: The directory to copy the assets *root* to.
:param module: The module in the package to find the assets in. e.g., mysos.executor.
:param asset_path: The path of the asset relative to the module root to unpack.
:param execute: A function that expects a single argument as the path to an asset file. It can
be used to process this file.
NOTE: If the specified 'asset_path' is a directory, its contents are copied but it itself is not
recreated in the output directory. e.g., <module_dir>/files/bin/file.sh is copied to
<output_dir>/bin/file.sh. An analogy is that its like `cp -R asset_path/* output_dir` and
not like `cp -R asset_path output_dir`.
"""
_unpack_assets(output_dir, module, asset_path, execute, asset_path)
def _unpack_assets(output_dir, module, asset_root, execute, current_path):
"""
The internal helper function for unpack_assets(...) recursion.
:param current_path: Records the current
"""
for asset in pkg_resources.resource_listdir(module, current_path):
asset_target = os.path.join(os.path.relpath(current_path, asset_root), asset)
if pkg_resources.resource_isdir(module, os.path.join(current_path, asset)):
safe_mkdir(os.path.join(output_dir, asset_target))
_unpack_assets(output_dir, module, asset_root, execute, os.path.join(current_path, asset))
else:
output_file = os.path.join(output_dir, asset_target)
with open(output_file, 'wb') as fp:
fp.write(pkg_resources.resource_string(
module, os.path.join(asset_root, asset_target)))
execute(output_file)