예제 #1
0
def test_instantiate_extensions():
    class Extension1:
        pass

    class Extension2:
        pass

    with EntryPointContext(extension1=Extension1, extension2=Extension2):
        # successful instantiation of extensions
        extensions = instantiate_extensions('group')
        assert 'extension1' in extensions.keys()
        assert isinstance(extensions['extension1'], Extension1)
        assert 'extension2' in extensions.keys()
        assert isinstance(extensions['extension2'], Extension2)

        # unique extension instances
        unique_extensions = instantiate_extensions('group',
                                                   unique_instance=True)
        assert 'extension1' in unique_extensions.keys()
        assert isinstance(unique_extensions['extension1'], Extension1)
        assert extensions['extension1'] != unique_extensions['extension1']

        # exclude extension names
        extensions = instantiate_extensions('group',
                                            exclude_names=['extension1'])
        assert 'extension1' not in extensions.keys()
        assert 'extension2' in extensions.keys()
예제 #2
0
def test_instantiate_extensions_exception():
    class ExtensionRaisingException:
        def __init__(self):
            raise Exception('extension raising exception')

    class ExtensionSkipExtensionException:
        def __init__(self):
            raise SkipExtensionException(
                'extension raising skip extension exception')

    with EntryPointContext(
            exception=ExtensionRaisingException,
            skip_extension_exception=ExtensionSkipExtensionException):
        with patch('colcon_core.plugin_system.logger.error') as error:
            with patch('colcon_core.plugin_system.logger.info') as info:
                extensions = instantiate_extensions('group')

                # the entry point raising an exception different than a skip
                # extension exception results in an error message in the log
                assert error.call_count == 1
                assert len(error.call_args[0]) == 1
                assert "Exception instantiating extension 'group.exception'" \
                    in error.call_args[0][0]
                assert 'extension raising exception' in error.call_args[0][0]

                # the entry point raising a skip extension exception results in
                # an info message in the log
                assert info.call_count == 1
                assert len(info.call_args[0]) == 1
                assert "Skipping extension 'group.skip_extension_exception'" \
                    in info.call_args[0][0]
                assert 'extension raising skip extension exception' \
                    in info.call_args[0][0]
        # neither of the entry points was loaded successfully
        assert extensions == {}
예제 #3
0
def test_order_extensions_grouped_by_priority():
    with EntryPointContext(foo=ExtensionA, bar=ExtensionB, baz=ExtensionC):
        extensions = instantiate_extensions('group')
    # ensure correct order based on priority
    grouped_extensions = order_extensions_grouped_by_priority(extensions)
    assert list(grouped_extensions.keys()) == [110, 100]
    # ensure correct order in each priority group based on name
    assert list(grouped_extensions[110].keys()) == ['baz']
    assert list(grouped_extensions[100].keys()) == ['bar', 'foo']
예제 #4
0
def get_argument_parser_extensions():
    """
    Get the available argument parser extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.ARGUMENT_PARSER_DECORATOR_NAME = name
    return order_extensions_by_priority(extensions)
예제 #5
0
def get_desktop_notification_extensions():
    """
    Get the available desktop notification extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.DESKTOP_NOTIFICATION_NAME = name
    return order_extensions_by_priority(extensions)
예제 #6
0
def get_package_discovery_extensions():
    """
    Get the available package discovery extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.PACKAGE_DISCOVERY_NAME = name
    return order_extensions_by_priority(extensions)
예제 #7
0
def get_package_selection_extensions():
    """
    Get the available package selection extensions.

    The extensions are ordered by their entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.PACKAGE_SELECTION_NAME = name
    return order_extensions_by_name(extensions)
예제 #8
0
def get_base_handler_extensions():
    """
    Get the available base handler extensions.

    The extensions are ordered by their entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.BASE_HANDLER_NAME = name
    return order_extensions_by_name(extensions)
예제 #9
0
def get_verb_extensions():
    """
    Get the available verb extensions.

    The extensions are ordered by their entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.VERB_NAME = name
    return order_extensions_by_name(extensions)
예제 #10
0
def get_test_result_extensions(*, exclude_names=None):
    """
    Get the available test result extensions.

    The extensions are ordered by their entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__, exclude_names=exclude_names)
    for name, extension in extensions.items():
        extension.TEST_RESULT_NAME = name
    return order_extensions_by_name(extensions)
예제 #11
0
def get_package_augmentation_extensions():
    """
    Get the available package augmentation extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.PACKAGE_AUGMENTATION_NAME = name
    return order_extensions_by_priority(extensions)
예제 #12
0
def get_event_handler_extensions(*, context):
    """
    Get the available event handler extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.EVENT_HANDLER_NAME = name
        extension.context = context
    return order_extensions_by_priority(extensions)
예제 #13
0
def get_package_identification_extensions():
    """
    Get the available package identification extensions.

    The extensions are grouped by their priority and each group is ordered by
    the entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.PACKAGE_IDENTIFICATION_NAME = name
    return order_extensions_grouped_by_priority(extensions)
예제 #14
0
def get_prefix_path_extensions():
    """
    Get the available prefix path extensions.

    The extensions are grouped by their priority and each group is ordered by
    the entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.PREFIX_PATH_NAME = name
    return order_extensions_grouped_by_priority(extensions)
예제 #15
0
def get_environment_extensions():
    """
    Get the available environment extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name in list(extensions.keys()):
        extension = extensions[name]
        extension.ENVIRONMENT_NAME = name
    return order_extensions_by_priority(extensions)
예제 #16
0
def get_executor_extensions():
    """
    Get the available executor extensions.

    The extensions are grouped by their priority and each group is ordered by
    the entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    for name, extension in extensions.items():
        extension.EXECUTOR_NAME = name
    return order_extensions_grouped_by_priority(extensions)
예제 #17
0
def get_python_testing_step_extensions():
    """
    Get the available Python testing step extensions.

    The extensions are ordered by their priority and entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions('colcon_core.python_testing',
                                        unique_instance=False)
    for name in list(extensions.keys()):
        extension = extensions[name]
        extension.STEP_TYPE = name
    return order_extensions_by_priority(extensions)
예제 #18
0
def get_python_testing_step_extension(step_name):
    """
    Get a specific Python testing step extension.

    :param str step_name: The entry point name of the extension
    :returns: A unique instance of the extension, otherwise None
    """
    extensions = instantiate_extensions('colcon_core.python_testing.' +
                                        step_name,
                                        unique_instance=True)
    if step_name not in extensions:
        return None
    extension = extensions[step_name]
    extension.STEP_NAME = step_name
    return extension
예제 #19
0
def get_bundle_installer_extensions():
    """
    Get the bundle installer extensions and verify if they should be loaded.

    The extensions are ordered by their entry point name.

    :rtype: OrderedDict
    """
    extensions = instantiate_extensions(__name__)
    filtered_extensions = {
        name: extension
        for name, extension in extensions.items() if extension.should_load()
    }
    for name, extension in filtered_extensions.items():
        extension.INSTALLER_NAME = name
    return order_extensions_by_priority(extensions)
예제 #20
0
def get_task_extension(task_name, package_type):
    """
    Get a specific task extension.

    :param str task_name: The entry point name identifying a group of task
      extensions
    :param str package_type: The package type identifying a task extension
      within the group
    :returns: The task extension
    """
    extensions = instantiate_extensions(task_name, unique_instance=True)
    if package_type not in extensions:
        return None
    extension = extensions[package_type]
    extension.TASK_NAME = task_name.split('.')[-1]
    extension.PACKAGE_TYPE = package_type
    return extension
예제 #21
0
def get_task_extensions(task_name, *, unique_instance=False):
    """
    Get the available task extensions.

    The extensions are ordered by their entry point name.

    :param str task_name: The task name identifying a group of task extensions
    :param bool unique_instance: The flag if the returned instances should be
      unique or cached instances can be returned instead
    :rtype: OrderedDict
    """
    extensions = instantiate_extensions('%s.%s' % (__name__, task_name),
                                        unique_instance=unique_instance)
    for name in list(extensions.keys()):
        extension = extensions[name]
        assert hasattr(extension, task_name)
        extension.TASK_NAME = task_name
        extension.PACKAGE_TYPE = name
    return order_extensions_by_name(extensions)
예제 #22
0
def get_python_testing_step_extension(step_name):
    """
    Get a specific Python testing step extension.

    :param str step_name: The entry point name of the extension
    :returns: A unique instance of the extension, otherwise None
    """
    group_name = 'colcon_core.python_testing'
    extension_types = load_entry_points(group_name)
    extension_names = list(extension_types.keys())
    if step_name not in extension_names:
        return None
    extension_names.remove(step_name)
    extensions = instantiate_extensions(
        group_name, exclude_names=extension_names, unique_instance=True)
    if step_name not in extensions:
        return None
    extension = extensions[step_name]
    extension.STEP_NAME = step_name
    return extension
예제 #23
0
def get_argcomplete_completer_extensions(*, exclude_names=None):
    """Get the argcomplete completer extensions in priority order."""
    extensions = instantiate_extensions(__name__, exclude_names=exclude_names)
    for name, extension in extensions.items():
        extension.ARGCOMPLETE_COMPLETER_NAME = name
    return order_extensions_by_priority(extensions)
예제 #24
0
def test_order_extensions_by_name():
    with EntryPointContext(foo=ExtensionA, bar=ExtensionB, baz=ExtensionC):
        extensions = instantiate_extensions('group')
    # ensure correct order based on name
    ordered_extensions = order_extensions_by_name(extensions)
    assert list(ordered_extensions.keys()) == ['bar', 'baz', 'foo']
예제 #25
0
def instantiate_extensions_without_cache(group_name,
                                         *,
                                         exclude_names=None,
                                         unique_instance=False):
    return instantiate_extensions(group_name)