| # Copyright (c) 2022 Nordic Semiconductor ASA |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import importlib |
| import logging |
| import os |
| from pathlib import Path |
| |
| from fetchers.core import ZephyrBlobFetcher |
| |
| _logger = logging.getLogger('fetchers') |
| |
| def _import_fetcher_module(fetcher_name): |
| try: |
| importlib.import_module(f'fetchers.{fetcher_name}') |
| except ImportError as ie: |
| # Fetchers are supposed to gracefully handle failures when they |
| # import anything outside of stdlib, but they sometimes do |
| # not. Catch ImportError to handle this. |
| _logger.warning(f'The module for fetcher "{fetcher_name}" ' |
| f'could not be imported ({ie}). This most likely ' |
| 'means it is not handling its dependencies properly. ' |
| 'Please report this to the zephyr developers.') |
| |
| # We import these here to ensure the BlobFetcher subclasses are |
| # defined; otherwise, BlobFetcher.get_fetchers() won't work. |
| |
| # Those do not contain subclasses of ZephyrBlobFetcher |
| name_blocklist = ['__init__', 'core'] |
| |
| fetchers_dir = Path(__file__).parent.resolve() |
| for f in [f for f in os.listdir(fetchers_dir)]: |
| file = fetchers_dir / Path(f) |
| if file.suffix == '.py' and file.stem not in name_blocklist: |
| _import_fetcher_module(file.stem) |
| |
| def get_fetcher_cls(scheme): |
| '''Get a fetcher's class object, given a scheme.''' |
| for cls in ZephyrBlobFetcher.get_fetchers(): |
| if scheme in cls.schemes(): |
| return cls |
| raise ValueError('unknown fetcher for scheme "{}"'.format(scheme)) |
| |
| __all__ = ['ZephyrBlobFetcher', 'get_fetcher_cls'] |