Skip to content

Commit

Permalink
feat(ConventionalCommitsCz): allow to override defaults from config
Browse files Browse the repository at this point in the history
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 commitizen-tools#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 <module>
    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 <lambda>
    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 commitizen-tools#535.
  • Loading branch information
Amit Levy committed Aug 3, 2022
1 parent 2ff9f15 commit 2618a07
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 70 deletions.
55 changes: 27 additions & 28 deletions commitizen/cz/base.py
Original file line number Diff line number Diff line change
@@ -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<message>.*)"
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]
Expand All @@ -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:
Expand All @@ -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),
]
)

Expand Down
13 changes: 0 additions & 13 deletions commitizen/cz/conventional_commits/conventional_commits.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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 = [
{
Expand Down
29 changes: 0 additions & 29 deletions commitizen/cz/customize/customize.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -15,41 +14,13 @@


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)

if "customize" not in self.config.settings:
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", [{}])

Expand Down
22 changes: 22 additions & 0 deletions commitizen/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,25 @@ class Settings(TypedDict, total=False):

commit_parser = r"^(?P<change_type>feat|fix|refactor|perf|BREAKING CHANGE)(?:\((?P<scope>[^()\r\n]*)\)|\()?(?P<breaking>!)?:\s(?P<message>.*)?" # noqa
version_parser = r"(?P<version>([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"),
]

0 comments on commit 2618a07

Please sign in to comment.