Fix bundle-extensions script to work on recent importlib-resources. (#5050)

Also adds a test case for running the script.
This commit is contained in:
Jannis Leidel
2020-07-16 22:05:22 +02:00
committed by GitHub
parent cb97364771
commit 41a691328a
12 changed files with 100 additions and 51 deletions

View File

@@ -6,8 +6,8 @@ from pathlib import Path
from shutil import copy
from collections import OrderedDict as odict
from importlib_metadata import entry_points
from importlib_resources import contents, is_resource, path
import importlib_metadata
import importlib_resources
# Name of the subdirectory
BUNDLE_DIRECTORY = "bundle"
@@ -25,18 +25,6 @@ if not extensions_directory.exists():
os.environ["EXTENSIONS_DIRECTORY"] = str(extensions_relative_path)
def resource_isdir(module, resource):
"""Whether a given resource is a directory in the given module
https://importlib-resources.readthedocs.io/en/latest/migration.html#pkg-resources-resource-isdir
"""
try:
return resource in contents(module) and not is_resource(module, resource)
except (ImportError, TypeError):
# module isn't a package, so can't have a subdirectory/-package
return False
def entry_point_module(entry_point):
"""Returns the dotted module path for the given entry point"""
return entry_point.pattern.match(entry_point.value).group("module")
@@ -77,18 +65,28 @@ def load_bundles():
"""
bundles = odict()
for entry_point in entry_points().get("redash.bundles", []):
for entry_point in importlib_metadata.entry_points().get("redash.bundles", []):
logger.info('Loading Redash bundle "%s".', entry_point.name)
module = entry_point_module(entry_point)
# Try to get a list of bundle files
if not resource_isdir(module, BUNDLE_DIRECTORY):
try:
bundle_dir = importlib_resources.files(module).joinpath(BUNDLE_DIRECTORY)
except (ImportError, TypeError):
# Module isn't a package, so can't have a subdirectory/-package
logger.error(
'Redash bundle directory "%s" could not be found.', entry_point.name
'Redash bundle module "%s" could not be imported: "%s"',
entry_point.name,
module,
)
continue
with path(module, BUNDLE_DIRECTORY) as bundle_dir:
bundles[entry_point.name] = list(bundle_dir.rglob("*"))
if not bundle_dir.is_dir():
logger.error(
'Redash bundle directory "%s" could not be found or is not a directory: "%s"',
entry_point.name,
bundle_dir,
)
continue
bundles[entry_point.name] = list(bundle_dir.rglob("*"))
return bundles