From 2f9c5a86bfaa4992218c4093fab08f83116f8ac5 Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Fri, 26 Jul 2024 10:30:29 -0500 Subject: [PATCH] Add top-level executable for rosdistro-reviewer --- rosdistro_reviewer/__main__.py | 9 +++++++ rosdistro_reviewer/command.py | 34 +++++++++++++++++++++++ rosdistro_reviewer/verb/__init__.py | 0 rosdistro_reviewer/verb/review.py | 42 +++++++++++++++++++++++++++++ setup.cfg | 8 +++++- test/spell_check.words | 2 ++ test/test_main.py | 28 +++++++++++++++++++ 7 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 rosdistro_reviewer/__main__.py create mode 100644 rosdistro_reviewer/command.py create mode 100644 rosdistro_reviewer/verb/__init__.py create mode 100644 rosdistro_reviewer/verb/review.py create mode 100644 test/test_main.py diff --git a/rosdistro_reviewer/__main__.py b/rosdistro_reviewer/__main__.py new file mode 100644 index 0000000..70c8ea8 --- /dev/null +++ b/rosdistro_reviewer/__main__.py @@ -0,0 +1,9 @@ +# Copyright 2024 Open Source Robotics Foundation, Inc. +# Licensed under the Apache License, Version 2.0 + +import sys + +from rosdistro_reviewer.command import main + + +sys.exit(main()) diff --git a/rosdistro_reviewer/command.py b/rosdistro_reviewer/command.py new file mode 100644 index 0000000..6e75d42 --- /dev/null +++ b/rosdistro_reviewer/command.py @@ -0,0 +1,34 @@ +# Copyright 2024 Open Source Robotics Foundation, Inc. +# Licensed under the Apache License, Version 2.0 + +from typing import Any + +from colcon_core.command \ + import LOG_LEVEL_ENVIRONMENT_VARIABLE \ + as COLCON_LOG_LEVEL_ENVIRONMENT_VARIABLE +from colcon_core.command import main as colcon_main +from colcon_core.environment_variable import EnvironmentVariable +from rosdistro_reviewer.verb.review import ReviewVerb + +"""Environment variable to set the log level""" +LOG_LEVEL_ENVIRONMENT_VARIABLE = EnvironmentVariable( + 'ROSDISTRO_REVIEWER_LOG_LEVEL', + COLCON_LOG_LEVEL_ENVIRONMENT_VARIABLE.description) + +"""Environment variable to set the configuration directory""" +HOME_ENVIRONMENT_VARIABLE = EnvironmentVariable( + 'ROSDISTRO_REVIEWER_HOME', + 'Set the configuration directory (default: ~/.rosdistro_reviewer)') + + +def main(*args: str, **kwargs: str) -> Any: + """Execute the main logic of the command.""" + colcon_kwargs = { + 'command_name': 'rosdistro-reviewer', + 'verb_group_name': 'rosdistro_reviewer.verb', + 'environment_variable_group_name': + 'rosdistro_reviewer.environment_variable', + 'default_verb': ReviewVerb, + **kwargs, + } + return colcon_main(*args, **colcon_kwargs) diff --git a/rosdistro_reviewer/verb/__init__.py b/rosdistro_reviewer/verb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rosdistro_reviewer/verb/review.py b/rosdistro_reviewer/verb/review.py new file mode 100644 index 0000000..7d22276 --- /dev/null +++ b/rosdistro_reviewer/verb/review.py @@ -0,0 +1,42 @@ +# Copyright 2024 Open Source Robotics Foundation, Inc. +# Licensed under the Apache License, Version 2.0 + +import logging +from pathlib import Path + +from colcon_core.logging import colcon_logger +from colcon_core.logging import get_effective_console_level +from colcon_core.plugin_system import satisfies_version +from colcon_core.verb import VerbExtensionPoint +from rosdistro_reviewer.element_analyzer import analyze + + +class ReviewVerb(VerbExtensionPoint): + """Generate a review for rosdistro changes.""" + + def __init__(self): # noqa: D107 + super().__init__() + satisfies_version(VerbExtensionPoint.EXTENSION_POINT_VERSION, '^1.0') + log_level = get_effective_console_level(colcon_logger) + logging.getLogger('git').setLevel(log_level) + + def add_arguments(self, *, parser): # noqa: D102 + parser.add_argument( + '--target-ref', default=None, metavar='COMMITTISH', + help='Git commit-ish to use as the base for determining what ' + 'changes should be reviewed (default: commit prior to ' + '--head-ref)') + parser.add_argument( + '--head-ref', default=None, metavar='COMMITTISH', + help='Git commit-ish which contains changes that should be ' + 'reviewed (default: uncommitted changes)') + + def main(self, *, context): # noqa: D102 + review = analyze( + Path.cwd(), + target_ref=context.args.target_ref, + head_ref=context.args.head_ref) + if review: + root = Path.cwd() if context.args.head_ref is None else None + print('\n' + review.to_text(root=root) + '\n') + return 0 diff --git a/setup.cfg b/setup.cfg index c70b468..556b901 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,7 +20,7 @@ long_description_content_type = text/markdown [options] python_requires = >=3.6 install_requires = - colcon-core + colcon-core>=0.17.1 GitPython unidiff PyYAML @@ -49,6 +49,12 @@ markers = [options.entry_points] colcon_core.extension_point = rosdistro_reviewer.element_analyzer = rosdistro_reviewer.element_analyzer:ElementAnalyzerExtensionPoint +console_scripts = + rosdistro-reviewer = rosdistro_reviewer.command:main +rosdistro_reviewer.environment_variable = + extension_blocklist = colcon_core.extension_point:EXTENSION_BLOCKLIST_ENVIRONMENT_VARIABLE + home = rosdistro_reviewer.command:HOME_ENVIRONMENT_VARIABLE + log_level = rosdistro_reviewer.command:LOG_LEVEL_ENVIRONMENT_VARIABLE [flake8] extend_ignore = diff --git a/test/spell_check.words b/test/spell_check.words index 9f146ef..14e1f91 100644 --- a/test/spell_check.words +++ b/test/spell_check.words @@ -26,9 +26,11 @@ returncode rosdistro rstrip rtype +runpy scspell setuptools thomas unidiff +unittest waldo yaml diff --git a/test/test_main.py b/test/test_main.py new file mode 100644 index 0000000..4d16879 --- /dev/null +++ b/test/test_main.py @@ -0,0 +1,28 @@ +# Copyright 2024 Open Source Robotics Foundation, Inc. +# Licensed under the Apache License, Version 2.0 + +from runpy import run_module +from unittest.mock import patch + +import pytest + + +@patch( + 'colcon_core.argument_parser.get_argument_parser_extensions', + return_value={}, +) +def test_main(get_argument_parser_extensions): + with patch('sys.argv', ['__main__', '--help']): + with pytest.raises(SystemExit) as e: + run_module('rosdistro_reviewer') + assert e.value.code == 0 + + with patch( + 'rosdistro_reviewer.verb.review.ReviewVerb.main', + return_value=42, + ) as verb_main: + with patch('sys.argv', ['__main__', '--log-base', '/dev/null']): + with pytest.raises(SystemExit) as e: + run_module('rosdistro_reviewer') + assert e.value.code == 42 + verb_main.assert_called_once()