diff --git a/commitizen/cz/base.py b/commitizen/cz/base.py index a5abe35f16..41ad26bbbe 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] @@ -40,10 +17,34 @@ class BaseCommitizen(metaclass=ABCMeta): # Executed only at the end of the changelog generation changelog_hook: Optional[Callable[[str, Optional[str]], str]] = None + default_style_config = defaults.default_style_config + 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 +59,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..0b97ac0c49 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,21 @@ def questions(self) -> Questions: ), }, ] - return questions + + # TODO: How would filter functions would be handled from config? + 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( + 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,39 +176,47 @@ def message(self, answers: dict) -> str: return message def example(self) -> str: - return ( + return 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" + "closes issue #12", ) def schema(self) -> str: - return ( + return self.config.settings.get( + "schema", "(): \n" "\n" "\n" "\n" - "(BREAKING CHANGE: )