diff --git a/commitizen/cz/base.py b/commitizen/cz/base.py index a5abe35f1..37294efe0 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 prompt_toolkit.styles import Style -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,28 @@ 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.style = Style(self.config.settings.get("style", defaults.style)) + 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: @@ -53,15 +50,6 @@ def questions(self) -> Questions: def message(self, answers: dict) -> str: """Format your git message.""" - @property - def style(self): - return merge_styles( - [ - Style(BaseCommitizen.default_style_config), - Style(self.config.settings["style"]), - ] - ) - def example(self) -> Optional[str]: """Example of the commit message.""" raise NotImplementedError("Not Implemented yet") diff --git a/commitizen/cz/conventional_commits/conventional_commits.py b/commitizen/cz/conventional_commits/conventional_commits.py index 7989a1712..d17f31c51 100644 --- a/commitizen/cz/conventional_commits/conventional_commits.py +++ b/commitizen/cz/conventional_commits/conventional_commits.py @@ -1,7 +1,11 @@ import os import re -from commitizen import defaults +try: + from jinja2 import Template +except ImportError: + from string import Template # type: ignore + from commitizen.cz.base import BaseCommitizen from commitizen.cz.utils import multiple_line_breaker, required_validator from commitizen.defaults import Questions @@ -28,18 +32,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 = [ { @@ -148,9 +140,20 @@ def questions(self) -> Questions: ), }, ] - return questions + + return self.config.settings.get("questions", questions) def message(self, answers: dict) -> str: + custom_message = self.config.settings.get("message_template") + if custom_message: + message_template = Template( + str(self.config.settings.get("message_template", "")) + ) + if getattr(Template, "substitute", None): + return message_template.substitute(**answers) # type: ignore + else: + return message_template.render(**answers) + prefix = answers["prefix"] scope = answers["scope"] subject = answers["subject"] @@ -172,32 +175,36 @@ def message(self, answers: dict) -> str: return message def example(self) -> str: - return ( - "fix: correct minor typos in code\n" - "\n" - "see the issue for details on the typos fixed\n" - "\n" - "closes issue #12" + return str( + self.config.settings.get( + "example", + "fix: correct minor typos in code\n" + "\n" + "see the issue for details on the typos fixed\n" + "\n" + "closes issue #12", + ) ) def schema(self) -> str: - return ( + return self.config.settings.get( + "schema", "(): \n" "\n" "\n" "\n" - "(BREAKING CHANGE: )