You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.6 KiB
45 lines
1.6 KiB
# 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']
|
|
|