From 2618a07a0af3a63d6e9efb0c1ebe7c975fecfc9d Mon Sep 17 00:00:00 2001 From: Amit Levy Date: Wed, 3 Aug 2022 14:56:50 +0300 Subject: [PATCH] feat(ConventionalCommitsCz): allow to override defaults from config Before fixing tests and adding extra ones, I would like to received partial feedback about my changes to see if this aligns with the desired code changes by maintainers. As addressed on #535, when using customize commitizen, if we want to customize a small attribute, we need to redefine all commitizens options to make our custom class work. For example: ```suggestion diff --git a/cz.yaml b/cz.yaml index 2e847b0..302e961 100644 --- a/cz.yaml +++ b/cz.yaml @@ -1,17 +1,18 @@ commitizen: annotated_tag: true bump_message: 'bump: $current_version -> $new_version [skip ci]' - bump_pattern: '^(fix|feat|docs|style|refactor|test|build|ci)' - bump_map: - fix: PATCH - feat: PATCH - docs: PATCH - style: PATCH - refactor: PATCH - test: PATCH - build: PATCH - ci: PATCH - - name: cz_conventional_commits + name: cz_customize update_changelog_on_bump: true version: 0.11.0 + + customize: + bump_pattern: '^(fix|feat|docs|style|refactor|test|build|ci)' + bump_map: + fix: PATCH + feat: PATCH + docs: PATCH + style: PATCH + refactor: PATCH + test: PATCH + build: PATCH + ci: PATCH ``` making the following change on a repo would cause an unexpected behavior: ```python + bash -c cz commit Traceback (most recent call last): File "/home/amit/.local/bin/cz", line 8, in sys.exit(main()) File "/home/amit/.local/lib/python3.10/site-packages/commitizen/cli.py", line 382, in main args.func(conf, vars(args))() File "/home/amit/.local/lib/python3.10/site-packages/commitizen/commands/commit.py", line 74, in __call__ m = self.prompt_commit_questions() File "/home/amit/.local/lib/python3.10/site-packages/commitizen/commands/commit.py", line 49, in prompt_commit_questions for question in filter(lambda q: q["type"] == "list", questions): File "/home/amit/.local/lib/python3.10/site-packages/commitizen/commands/commit.py", line 49, in for question in filter(lambda q: q["type"] == "list", questions): KeyError: 'type' ``` From my best understanding, this error happens because I didn't defined question section in config, though I'm ok with using ConventionalCommitsCz default ones. This commit extends ConventionalCommitsCz to read from config and fallbacks to defaults if some are not provided. By adding this change, potentially customize commitizen can be deprecated. Closes #535. --- commitizen/cz/base.py | 55 +++++++++---------- .../conventional_commits.py | 13 ----- commitizen/cz/customize/customize.py | 29 ---------- commitizen/defaults.py | 22 ++++++++ 4 files changed, 49 insertions(+), 70 deletions(-) diff --git a/commitizen/cz/base.py b/commitizen/cz/base.py index a5abe35f16..ac847a9802 100644 --- a/commitizen/cz/base.py +++ b/commitizen/cz/base.py @@ -1,37 +1,14 @@ from abc import ABCMeta, abstractmethod -from typing import Callable, Dict, List, Optional, Tuple +from typing import Callable, Dict, List, Optional from prompt_toolkit.styles import Style, merge_styles -from commitizen import git +from commitizen import defaults, git from commitizen.config.base_config import BaseConfig from commitizen.defaults import Questions class BaseCommitizen(metaclass=ABCMeta): - bump_pattern: Optional[str] = None - bump_map: Optional[Dict[str, str]] = None - default_style_config: List[Tuple[str, str]] = [ - ("qmark", "fg:#ff9d00 bold"), - ("question", "bold"), - ("answer", "fg:#ff9d00 bold"), - ("pointer", "fg:#ff9d00 bold"), - ("highlighted", "fg:#ff9d00 bold"), - ("selected", "fg:#cc5454"), - ("separator", "fg:#cc5454"), - ("instruction", ""), - ("text", ""), - ("disabled", "fg:#858585 italic"), - ] - - # The whole subject will be parsed as message by default - # This allows supporting changelog for any rule system. - # It can be modified per rule - commit_parser: Optional[str] = r"(?P.*)" - changelog_pattern: Optional[str] = r".*" - change_type_map: Optional[Dict[str, str]] = None - change_type_order: Optional[List[str]] = None - # Executed per message parsed by the commitizen changelog_message_builder_hook: Optional[ Callable[[Dict, git.GitCommit], Dict] @@ -42,8 +19,30 @@ class BaseCommitizen(metaclass=ABCMeta): def __init__(self, config: BaseConfig): self.config = config - if not self.config.settings.get("style"): - self.config.settings.update({"style": BaseCommitizen.default_style_config}) + self.default_style_config: Optional[Dict[str, str]] = self.config.settings.get( + "default_style_config", defaults.default_style_config + ) + self.bump_pattern: Optional[str] = self.config.settings.get( + "bump_pattern", defaults.bump_pattern + ) + self.bump_map: Optional[Dict[str, str]] = self.config.settings.get( + "bump_map", defaults.bump_map + ) + self.change_type_order: Optional[List[str]] = self.config.settings.get( + "change_type_order", defaults.change_type_order + ) + self.change_type_map: Optional[Dict[str, str]] = self.config.settings.get( + "change_type_map", defaults.change_type_map + ) + self.commit_parser: Optional[str] = self.config.settings.get( + "commit_parser", defaults.commit_parser + ) + self.changelog_pattern: Optional[str] = self.config.settings.get( + "changelog_pattern", defaults.changelog_pattern + ) + self.version_parser = self.config.settings.get( + "version_parser", defaults.version_parser + ) @abstractmethod def questions(self) -> Questions: @@ -58,7 +57,7 @@ def style(self): return merge_styles( [ Style(BaseCommitizen.default_style_config), - Style(self.config.settings["style"]), + Style(self.default_style_config), ] ) diff --git a/commitizen/cz/conventional_commits/conventional_commits.py b/commitizen/cz/conventional_commits/conventional_commits.py index 7989a17122..0677f1b141 100644 --- a/commitizen/cz/conventional_commits/conventional_commits.py +++ b/commitizen/cz/conventional_commits/conventional_commits.py @@ -1,7 +1,6 @@ import os import re -from commitizen import defaults from commitizen.cz.base import BaseCommitizen from commitizen.cz.utils import multiple_line_breaker, required_validator from commitizen.defaults import Questions @@ -28,18 +27,6 @@ def parse_subject(text): class ConventionalCommitsCz(BaseCommitizen): - bump_pattern = defaults.bump_pattern - bump_map = defaults.bump_map - commit_parser = defaults.commit_parser - version_parser = defaults.version_parser - change_type_map = { - "feat": "Feat", - "fix": "Fix", - "refactor": "Refactor", - "perf": "Perf", - } - changelog_pattern = defaults.bump_pattern - def questions(self) -> Questions: questions: Questions = [ { diff --git a/commitizen/cz/customize/customize.py b/commitizen/cz/customize/customize.py index 994c21c714..4aa089feac 100644 --- a/commitizen/cz/customize/customize.py +++ b/commitizen/cz/customize/customize.py @@ -5,7 +5,6 @@ from typing import Optional -from commitizen import defaults from commitizen.config import BaseConfig from commitizen.cz.base import BaseCommitizen from commitizen.defaults import Questions @@ -15,10 +14,6 @@ class CustomizeCommitsCz(BaseCommitizen): - bump_pattern = defaults.bump_pattern - bump_map = defaults.bump_map - change_type_order = defaults.change_type_order - def __init__(self, config: BaseConfig): super(CustomizeCommitsCz, self).__init__(config) @@ -26,30 +21,6 @@ def __init__(self, config: BaseConfig): raise MissingCzCustomizeConfigError() self.custom_settings = self.config.settings["customize"] - custom_bump_pattern = self.custom_settings.get("bump_pattern") - if custom_bump_pattern: - self.bump_pattern = custom_bump_pattern - - custom_bump_map = self.custom_settings.get("bump_map") - if custom_bump_map: - self.bump_map = custom_bump_map - - custom_change_type_order = self.custom_settings.get("change_type_order") - if custom_change_type_order: - self.change_type_order = custom_change_type_order - - commit_parser = self.custom_settings.get("commit_parser") - if commit_parser: - self.commit_parser = commit_parser - - changelog_pattern = self.custom_settings.get("changelog_pattern") - if changelog_pattern: - self.changelog_pattern = changelog_pattern - - change_type_map = self.custom_settings.get("change_type_map") - if change_type_map: - self.change_type_map = change_type_map - def questions(self) -> Questions: return self.custom_settings.get("questions", [{}]) diff --git a/commitizen/defaults.py b/commitizen/defaults.py index 35a518adc9..d04ec67033 100644 --- a/commitizen/defaults.py +++ b/commitizen/defaults.py @@ -87,3 +87,25 @@ class Settings(TypedDict, total=False): commit_parser = r"^(?Pfeat|fix|refactor|perf|BREAKING CHANGE)(?:\((?P[^()\r\n]*)\)|\()?(?P!)?:\s(?P.*)?" # noqa version_parser = r"(?P([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?(\w+)?)" + +change_type_map = { + "feat": "Feat", + "fix": "Fix", + "refactor": "Refactor", + "perf": "Perf", +} + +changelog_pattern = r".*" + +default_style_config: List[Tuple[str, str]] = [ + ("qmark", "fg:#ff9d00 bold"), + ("question", "bold"), + ("answer", "fg:#ff9d00 bold"), + ("pointer", "fg:#ff9d00 bold"), + ("highlighted", "fg:#ff9d00 bold"), + ("selected", "fg:#cc5454"), + ("separator", "fg:#cc5454"), + ("instruction", ""), + ("text", ""), + ("disabled", "fg:#858585 italic"), +]