From 05aac7433d0334518b994167422c8f664bcb84d3 Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 28 Jan 2022 17:03:11 +0100 Subject: [PATCH 1/5] fix: Ignore packages that are not plugins When a package starting with a plugin name is found, but it is not a plugin, it becomes safely ignored. --- commitizen/cz/__init__.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/commitizen/cz/__init__.py b/commitizen/cz/__init__.py index a14ea95edf..b681c858f0 100644 --- a/commitizen/cz/__init__.py +++ b/commitizen/cz/__init__.py @@ -1,21 +1,30 @@ import importlib +import logging import pkgutil -from typing import Dict, Type +from typing import Dict, Type from commitizen.cz.base import BaseCommitizen from commitizen.cz.conventional_commits import ConventionalCommitsCz from commitizen.cz.customize import CustomizeCommitsCz from commitizen.cz.jira import JiraSmartCz +logger = logging.getLogger(__name__) + +def discover_plugins(): + plugins = {} + for finder, name, ispkg in pkgutil.iter_modules(): + try: + if name.startswith("cz_"): + plugins[name] = importlib.import_module(name).discover_this + except AttributeError as e: + logger.warning(e.args[0]) + continue + return plugins + registry: Dict[str, Type[BaseCommitizen]] = { "cz_conventional_commits": ConventionalCommitsCz, "cz_jira": JiraSmartCz, "cz_customize": CustomizeCommitsCz, } -plugins = { - name: importlib.import_module(name).discover_this # type: ignore - for finder, name, ispkg in pkgutil.iter_modules() - if name.startswith("cz_") -} -registry.update(plugins) +registry.update(discover_plugins()) From 04989381bcf76cb0285fb5060d3c61ea0955532f Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 28 Jan 2022 17:33:35 +0100 Subject: [PATCH 2/5] style: format code --- commitizen/cz/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/commitizen/cz/__init__.py b/commitizen/cz/__init__.py index b681c858f0..f17f0a7815 100644 --- a/commitizen/cz/__init__.py +++ b/commitizen/cz/__init__.py @@ -1,8 +1,8 @@ import importlib import logging import pkgutil - from typing import Dict, Type + from commitizen.cz.base import BaseCommitizen from commitizen.cz.conventional_commits import ConventionalCommitsCz from commitizen.cz.customize import CustomizeCommitsCz @@ -10,6 +10,7 @@ logger = logging.getLogger(__name__) + def discover_plugins(): plugins = {} for finder, name, ispkg in pkgutil.iter_modules(): @@ -21,6 +22,7 @@ def discover_plugins(): continue return plugins + registry: Dict[str, Type[BaseCommitizen]] = { "cz_conventional_commits": ConventionalCommitsCz, "cz_jira": JiraSmartCz, From fe5e08930379fd0fdc7f4f28f0901a01224104b1 Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 28 Jan 2022 18:33:43 +0100 Subject: [PATCH 3/5] test: Checking that warnings are risen --- commitizen/cz/__init__.py | 20 ++++++++++++++------ tests/test_factory.py | 27 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/commitizen/cz/__init__.py b/commitizen/cz/__init__.py index f17f0a7815..1699649d3e 100644 --- a/commitizen/cz/__init__.py +++ b/commitizen/cz/__init__.py @@ -1,24 +1,32 @@ import importlib -import logging import pkgutil -from typing import Dict, Type +import warnings +from pathlib import Path +from typing import Dict, Iterable, Type from commitizen.cz.base import BaseCommitizen from commitizen.cz.conventional_commits import ConventionalCommitsCz from commitizen.cz.customize import CustomizeCommitsCz from commitizen.cz.jira import JiraSmartCz -logger = logging.getLogger(__name__) +def discover_plugins(path: Iterable[Path] = None) -> Dict[str, Type[BaseCommitizen]]: + """Discover commitizen plugins on the path -def discover_plugins(): + Args: + path (Path, optional): If provided, 'path' should be either None or a list of paths to look for + modules in. If path is None, all top-level modules on sys.path.. Defaults to None. + + Returns: + Dict[str, Type[BaseCommitizen]]: Registry with found plugins + """ plugins = {} - for finder, name, ispkg in pkgutil.iter_modules(): + for finder, name, ispkg in pkgutil.iter_modules(path): try: if name.startswith("cz_"): plugins[name] = importlib.import_module(name).discover_this except AttributeError as e: - logger.warning(e.args[0]) + warnings.warn(UserWarning(e.args[0])) continue return plugins diff --git a/tests/test_factory.py b/tests/test_factory.py index 5fbd2deebb..a78fe65a6e 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -1,7 +1,10 @@ +import sys + import pytest from commitizen import BaseCommitizen, defaults, factory from commitizen.config import BaseConfig +from commitizen.cz import discover_plugins from commitizen.exceptions import NoCommitizenFoundException @@ -19,3 +22,27 @@ def test_factory_fails(): factory.commiter_factory(config) assert "The committer has not been found in the system." in str(excinfo) + + +@pytest.mark.parametrize( + "module_content, plugin_name, expected_plugins", + [ + ("", "cz_no_plugin", {}), + ], +) +def test_discover_plugins(module_content, plugin_name, expected_plugins, tmp_path): + no_plugin_folder = tmp_path / plugin_name + no_plugin_folder.mkdir() + init_file = no_plugin_folder / "__init__.py" + init_file.write_text(module_content) + + sys.path.append(tmp_path.as_posix()) + with pytest.warns(UserWarning) as record: + discovered_plugins = discover_plugins([tmp_path]) + sys.path.pop() + + assert ( + record[0].message.args[0] + == f"module '{plugin_name}' has no attribute 'discover_this'" + ) + assert expected_plugins == discovered_plugins From 16b37ee4ae492a3c8d2752b2fb38a5ca9caa9e99 Mon Sep 17 00:00:00 2001 From: manolo Date: Sat, 29 Jan 2022 08:17:07 +0100 Subject: [PATCH 4/5] refactor: iter_modules only accepts str --- commitizen/cz/__init__.py | 3 +-- tests/test_factory.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/commitizen/cz/__init__.py b/commitizen/cz/__init__.py index 1699649d3e..f141e1c256 100644 --- a/commitizen/cz/__init__.py +++ b/commitizen/cz/__init__.py @@ -1,7 +1,6 @@ import importlib import pkgutil import warnings -from pathlib import Path from typing import Dict, Iterable, Type from commitizen.cz.base import BaseCommitizen @@ -10,7 +9,7 @@ from commitizen.cz.jira import JiraSmartCz -def discover_plugins(path: Iterable[Path] = None) -> Dict[str, Type[BaseCommitizen]]: +def discover_plugins(path: Iterable[str] = None) -> Dict[str, Type[BaseCommitizen]]: """Discover commitizen plugins on the path Args: diff --git a/tests/test_factory.py b/tests/test_factory.py index a78fe65a6e..a8e56f51d6 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -38,7 +38,7 @@ def test_discover_plugins(module_content, plugin_name, expected_plugins, tmp_pat sys.path.append(tmp_path.as_posix()) with pytest.warns(UserWarning) as record: - discovered_plugins = discover_plugins([tmp_path]) + discovered_plugins = discover_plugins([tmp_path.as_posix()]) sys.path.pop() assert ( From e6f1dc379c7749c81057ee14affdaf4dd8d1206b Mon Sep 17 00:00:00 2001 From: manolo Date: Sun, 30 Jan 2022 14:41:56 +0100 Subject: [PATCH 5/5] build: Ignore type checking --- commitizen/cz/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commitizen/cz/__init__.py b/commitizen/cz/__init__.py index f141e1c256..05e54673fb 100644 --- a/commitizen/cz/__init__.py +++ b/commitizen/cz/__init__.py @@ -23,7 +23,7 @@ def discover_plugins(path: Iterable[str] = None) -> Dict[str, Type[BaseCommitize for finder, name, ispkg in pkgutil.iter_modules(path): try: if name.startswith("cz_"): - plugins[name] = importlib.import_module(name).discover_this + plugins[name] = importlib.import_module(name).discover_this # type: ignore except AttributeError as e: warnings.warn(UserWarning(e.args[0])) continue