From b473a195cd16c6dc8bc49d9574feb948fb0408f8 Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Sun, 11 Feb 2024 11:55:12 -0600 Subject: [PATCH 1/6] Added configuration option `ignore_missing_files` --- bumpversion/cli.py | 8 + bumpversion/config/__init__.py | 1 + bumpversion/config/files.py | 1 + bumpversion/config/models.py | 3 + bumpversion/config/utils.py | 1 + bumpversion/files.py | 8 + tests/fixtures/basic_cfg_expected.txt | 4 + tests/fixtures/basic_cfg_expected.yaml | 4 + tests/fixtures/basic_cfg_expected_full.json | 4 + tests/test_cli/test_bump.py | 18 +- tests/test_cli/test_replace.py | 458 ++++++++++++-------- tests/test_configuredfile.py | 2 + tests/test_files.py | 2 + 13 files changed, 322 insertions(+), 192 deletions(-) diff --git a/bumpversion/cli.py b/bumpversion/cli.py index eaf23e91..aa1c8ce7 100644 --- a/bumpversion/cli.py +++ b/bumpversion/cli.py @@ -444,6 +444,12 @@ def show(args: List[str], config_file: Optional[str], format_: str, increment: O envvar="BUMPVERSION_IGNORE_MISSING_VERSION", help="Ignore any Version Not Found errors when searching and replacing in files.", ) +@click.option( + "--ignore-missing-files", + is_flag=True, + envvar="BUMPVERSION_IGNORE_MISSING_FILES", + help="Ignore any missing files when searching and replacing in files.", +) @click.option( "--dry-run", "-n", @@ -465,6 +471,7 @@ def replace( regex: bool, no_configured_files: bool, ignore_missing_version: bool, + ignore_missing_files: bool, dry_run: bool, ) -> None: """ @@ -492,6 +499,7 @@ def replace( message=None, commit_args=None, ignore_missing_version=ignore_missing_version, + ignore_missing_files=ignore_missing_files, regex=regex, ) diff --git a/bumpversion/config/__init__.py b/bumpversion/config/__init__.py index 6bb68846..5fdf3a18 100644 --- a/bumpversion/config/__init__.py +++ b/bumpversion/config/__init__.py @@ -22,6 +22,7 @@ "replace": "{new_version}", "regex": False, "ignore_missing_version": False, + "ignore_missing_files": False, "tag": False, "sign_tags": False, "tag_name": "v{new_version}", diff --git a/bumpversion/config/files.py b/bumpversion/config/files.py index 2fcad842..54675d3b 100644 --- a/bumpversion/config/files.py +++ b/bumpversion/config/files.py @@ -141,6 +141,7 @@ def update_config_file( replace=config.replace, regex=config.regex, ignore_missing_version=True, + ignore_missing_file=True, serialize=config.serialize, parse=config.parse, ) diff --git a/bumpversion/config/models.py b/bumpversion/config/models.py index 261efa59..5b7acf18 100644 --- a/bumpversion/config/models.py +++ b/bumpversion/config/models.py @@ -30,6 +30,7 @@ class FileChange(BaseModel): replace: str regex: bool ignore_missing_version: bool + ignore_missing_file: bool filename: Optional[str] = None glob: Optional[str] = None # Conflicts with filename. If both are specified, glob wins key_path: Optional[str] = None # If specified, and has an appropriate extension, will be treated as a data file @@ -84,6 +85,7 @@ class Config(BaseSettings): replace: str regex: bool ignore_missing_version: bool + ignore_missing_files: bool tag: bool sign_tags: bool tag_name: str @@ -116,6 +118,7 @@ def add_files(self, filename: Union[str, List[str]]) -> None: replace=self.replace, regex=self.regex, ignore_missing_version=self.ignore_missing_version, + ignore_missing_file=self.ignore_missing_files, ) ) self.files = list(files) diff --git a/bumpversion/config/utils.py b/bumpversion/config/utils.py index ffb5f939..860b0cf6 100644 --- a/bumpversion/config/utils.py +++ b/bumpversion/config/utils.py @@ -18,6 +18,7 @@ def get_all_file_configs(config_dict: dict) -> List[FileChange]: "search": config_dict["search"], "replace": config_dict["replace"], "ignore_missing_version": config_dict["ignore_missing_version"], + "ignore_missing_file": config_dict["ignore_missing_files"], "regex": config_dict["regex"], } files = [{k: v for k, v in filecfg.items() if v is not None} for filecfg in config_dict["files"]] diff --git a/bumpversion/files.py b/bumpversion/files.py index f3c3fcc0..82e2f78a 100644 --- a/bumpversion/files.py +++ b/bumpversion/files.py @@ -86,6 +86,7 @@ def __init__( replace=replacement, regex=file_change.regex or False, ignore_missing_version=file_change.ignore_missing_version or False, + ignore_missing_file=file_change.ignore_missing_file or False, filename=file_change.filename, glob=file_change.glob, key_path=file_change.key_path, @@ -176,6 +177,12 @@ def make_file_change( self.file_change.replace, ) logger.indent() + if not os.path.exists(self.file_change.filename): + if self.file_change.ignore_missing_file: + logger.info("File not found, but ignoring") + logger.dedent() + return + raise FileNotFoundError(f"File not found: '{self.file_change.filename}'") logger.debug("Serializing the current version") logger.indent() context["current_version"] = self.version_config.serialize(current_version, context) @@ -273,6 +280,7 @@ def __init__( search=search or file_change.search or version_config.search, replace=replace or file_change.replace or version_config.replace, regex=file_change.regex or False, + ignore_missing_file=file_change.ignore_missing_file or False, ignore_missing_version=file_change.ignore_missing_version or False, filename=file_change.filename, glob=file_change.glob, diff --git a/tests/fixtures/basic_cfg_expected.txt b/tests/fixtures/basic_cfg_expected.txt index a4bbdc63..4ef4dc51 100644 --- a/tests/fixtures/basic_cfg_expected.txt +++ b/tests/fixtures/basic_cfg_expected.txt @@ -5,6 +5,7 @@ 'excluded_paths': [], 'files': [{'filename': 'setup.py', 'glob': None, + 'ignore_missing_file': False, 'ignore_missing_version': False, 'key_path': None, 'parse': '(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?', @@ -15,6 +16,7 @@ '{major}.{minor}.{patch}')}, {'filename': 'bumpversion/__init__.py', 'glob': None, + 'ignore_missing_file': False, 'ignore_missing_version': False, 'key_path': None, 'parse': '(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?', @@ -25,6 +27,7 @@ '{major}.{minor}.{patch}')}, {'filename': 'CHANGELOG.md', 'glob': None, + 'ignore_missing_file': False, 'ignore_missing_version': False, 'key_path': None, 'parse': '(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?', @@ -33,6 +36,7 @@ 'search': '**unreleased**', 'serialize': ('{major}.{minor}.{patch}-{release}', '{major}.{minor}.{patch}')}], + 'ignore_missing_files': False, 'ignore_missing_version': False, 'included_paths': [], 'message': 'Bump version: {current_version} → {new_version}', diff --git a/tests/fixtures/basic_cfg_expected.yaml b/tests/fixtures/basic_cfg_expected.yaml index 34fb8cdd..ef6ba4be 100644 --- a/tests/fixtures/basic_cfg_expected.yaml +++ b/tests/fixtures/basic_cfg_expected.yaml @@ -7,6 +7,7 @@ excluded_paths: files: - filename: "setup.py" glob: null + ignore_missing_file: false ignore_missing_version: false key_path: null parse: "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?" @@ -18,6 +19,7 @@ files: - "{major}.{minor}.{patch}" - filename: "bumpversion/__init__.py" glob: null + ignore_missing_file: false ignore_missing_version: false key_path: null parse: "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?" @@ -29,6 +31,7 @@ files: - "{major}.{minor}.{patch}" - filename: "CHANGELOG.md" glob: null + ignore_missing_file: false ignore_missing_version: false key_path: null parse: "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?" @@ -38,6 +41,7 @@ files: serialize: - "{major}.{minor}.{patch}-{release}" - "{major}.{minor}.{patch}" +ignore_missing_files: false ignore_missing_version: false included_paths: diff --git a/tests/fixtures/basic_cfg_expected_full.json b/tests/fixtures/basic_cfg_expected_full.json index 2027e73e..c1e3a4c7 100644 --- a/tests/fixtures/basic_cfg_expected_full.json +++ b/tests/fixtures/basic_cfg_expected_full.json @@ -8,6 +8,7 @@ { "filename": "setup.py", "glob": null, + "ignore_missing_file": false, "ignore_missing_version": false, "key_path": null, "parse": "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?", @@ -22,6 +23,7 @@ { "filename": "bumpversion/__init__.py", "glob": null, + "ignore_missing_file": false, "ignore_missing_version": false, "key_path": null, "parse": "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?", @@ -36,6 +38,7 @@ { "filename": "CHANGELOG.md", "glob": null, + "ignore_missing_file": false, "ignore_missing_version": false, "key_path": null, "parse": "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?", @@ -48,6 +51,7 @@ ] } ], + "ignore_missing_files": false, "ignore_missing_version": false, "included_paths": [], "message": "Bump version: {current_version} \u2192 {new_version}", diff --git a/tests/test_cli/test_bump.py b/tests/test_cli/test_bump.py index 6105e2d6..81e896b1 100644 --- a/tests/test_cli/test_bump.py +++ b/tests/test_cli/test_bump.py @@ -89,6 +89,7 @@ def test_with_version_part_includes_new_version(self, tmp_path: Path, fixtures_p "search={current_version}", "replace={new_version}", "regex=False", + "ignore_missing_files=False", "ignore_missing_version=False", "included_paths=[]", "tag=True", @@ -105,19 +106,19 @@ def test_with_version_part_includes_new_version(self, tmp_path: Path, fixtures_p "'serialize': ('{major}.{minor}.{patch}-{release}', " "'{major}.{minor}.{patch}'), 'search': '{current_version}', 'replace': " "'{new_version}', 'regex': False, 'ignore_missing_version': False, " - "'filename': 'setup.py', 'glob': None, 'key_path': None}, {'parse': " + "'ignore_missing_file': False, 'filename': 'setup.py', 'glob': None, 'key_path': None}, {'parse': " "'(?P\\\\d+)\\\\.(?P\\\\d+)\\\\.(?P\\\\d+)(\\\\-(?P[a-z]+))?', " "'serialize': ('{major}.{minor}.{patch}-{release}', " "'{major}.{minor}.{patch}'), 'search': '{current_version}', 'replace': " "'{new_version}', 'regex': False, 'ignore_missing_version': False, " - "'filename': 'bumpversion/__init__.py', 'glob': None, 'key_path': None}, " + "'ignore_missing_file': False, 'filename': 'bumpversion/__init__.py', 'glob': None, 'key_path': None}, " "{'parse': " "'(?P\\\\d+)\\\\.(?P\\\\d+)\\\\.(?P\\\\d+)(\\\\-(?P[a-z]+))?', " "'serialize': ('{major}.{minor}.{patch}-{release}', " "'{major}.{minor}.{patch}'), 'search': '**unreleased**', 'replace': " "'**unreleased**\\n**v{new_version}**', 'regex': False, " - "'ignore_missing_version': False, 'filename': 'CHANGELOG.md', 'glob': None, " - "'key_path': None}]" + "'ignore_missing_version': False, 'ignore_missing_file': False, 'filename': 'CHANGELOG.md', " + "'glob': None, 'key_path': None}]" ), } @@ -148,6 +149,7 @@ def test_without_version_part_excludes_new_version(self, tmp_path: Path, fixture "search={current_version}", "replace={new_version}", "regex=False", + "ignore_missing_files=False", "ignore_missing_version=False", "included_paths=[]", "tag=True", @@ -164,19 +166,19 @@ def test_without_version_part_excludes_new_version(self, tmp_path: Path, fixture "'serialize': ('{major}.{minor}.{patch}-{release}', " "'{major}.{minor}.{patch}'), 'search': '{current_version}', 'replace': " "'{new_version}', 'regex': False, 'ignore_missing_version': False, " - "'filename': 'setup.py', 'glob': None, 'key_path': None}, {'parse': " + "'ignore_missing_file': False, 'filename': 'setup.py', 'glob': None, 'key_path': None}, {'parse': " "'(?P\\\\d+)\\\\.(?P\\\\d+)\\\\.(?P\\\\d+)(\\\\-(?P[a-z]+))?', " "'serialize': ('{major}.{minor}.{patch}-{release}', " "'{major}.{minor}.{patch}'), 'search': '{current_version}', 'replace': " "'{new_version}', 'regex': False, 'ignore_missing_version': False, " - "'filename': 'bumpversion/__init__.py', 'glob': None, 'key_path': None}, " + "'ignore_missing_file': False, 'filename': 'bumpversion/__init__.py', 'glob': None, 'key_path': None}, " "{'parse': " "'(?P\\\\d+)\\\\.(?P\\\\d+)\\\\.(?P\\\\d+)(\\\\-(?P[a-z]+))?', " "'serialize': ('{major}.{minor}.{patch}-{release}', " "'{major}.{minor}.{patch}'), 'search': '**unreleased**', 'replace': " "'**unreleased**\\n**v{new_version}**', 'regex': False, " - "'ignore_missing_version': False, 'filename': 'CHANGELOG.md', 'glob': None, " - "'key_path': None}]" + "'ignore_missing_version': False, 'ignore_missing_file': False, 'filename': 'CHANGELOG.md', " + "'glob': None, 'key_path': None}]" ), } diff --git a/tests/test_cli/test_replace.py b/tests/test_cli/test_replace.py index d749d995..3c6c061b 100644 --- a/tests/test_cli/test_replace.py +++ b/tests/test_cli/test_replace.py @@ -9,75 +9,6 @@ from bumpversion import cli from tests.conftest import inside_dir - -def test_replace(mocker, tmp_path, fixtures_path): - """The replace subcommand should replace the version in the file.""" - # Arrange - toml_path = fixtures_path / "basic_cfg.toml" - config_path = tmp_path / "pyproject.toml" - shutil.copy(toml_path, config_path) - - mocked_modify_files = mocker.patch("bumpversion.cli.modify_files") - runner: CliRunner = CliRunner() - with inside_dir(tmp_path): - result: Result = runner.invoke(cli.cli, ["replace", "--new-version", "1.1.0"]) - - if result.exit_code != 0: - print(result.output) - - assert result.exit_code == 0 - - call_args = mocked_modify_files.call_args[0] - configured_files = call_args[0] - assert len(configured_files) == 3 - actual_filenames = {f.file_change.filename for f in configured_files} - assert actual_filenames == {"setup.py", "CHANGELOG.md", "bumpversion/__init__.py"} - - -def test_replace_no_newversion(mocker, tmp_path, fixtures_path): - """The replace subcommand should set new_version to None in the context.""" - # Arrange - toml_path = fixtures_path / "basic_cfg.toml" - config_path = tmp_path / "pyproject.toml" - shutil.copy(toml_path, config_path) - - mocked_modify_files = mocker.patch("bumpversion.cli.modify_files") - runner: CliRunner = CliRunner() - with inside_dir(tmp_path): - result: Result = runner.invoke(cli.cli, ["replace"]) - - if result.exit_code != 0: - print(result.output) - - assert result.exit_code == 0 - - call_args = mocked_modify_files.call_args[0] - assert call_args[2] is None - - -def test_replace_specific_files(mocker, git_repo, fixtures_path): - """The replace subcommand should set the files to only the specified files.""" - # Arrange - toml_path = fixtures_path / "basic_cfg.toml" - config_path = git_repo / "pyproject.toml" - shutil.copy(toml_path, config_path) - - mocked_modify_files = mocker.patch("bumpversion.cli.modify_files") - runner: CliRunner = CliRunner() - with inside_dir(git_repo): - result: Result = runner.invoke(cli.cli, ["replace", "--no-configured-files", "VERSION"]) - - if result.exit_code != 0: - print(result.output) - - assert result.exit_code == 0 - - call_args = mocked_modify_files.call_args[0] - configured_files = call_args[0] - assert len(configured_files) == 1 - assert configured_files[0].file_change.filename == "VERSION" - - TEST_REPLACE_CONFIG = { "tool": { "bumpversion": { @@ -104,118 +35,277 @@ def test_replace_specific_files(mocker, git_repo, fixtures_path): } -def test_replace_search_with_plain_string(tmp_path, fixtures_path): - """Replace should not worry if the search or replace values have version info.""" - from tomlkit import dumps - - # Arrange - config_path = tmp_path / "pyproject.toml" - config_path.write_text(dumps(TEST_REPLACE_CONFIG)) - doc_path = tmp_path / "docs.yaml" - doc_path.write_text("url: https://github.com/sampleuser/workflows/main/.github/update_mailmap.py") - - runner: CliRunner = CliRunner() - with inside_dir(tmp_path): - result: Result = runner.invoke( - cli.cli, - [ - "replace", - "--no-configured-files", - "--search", - "/workflows/main/", - "--replace", - "/workflows/v{current_version}/", - "./docs.yaml", - ], - ) - - if result.exit_code != 0: - print("Here is the output:") - print(result.output) - print(traceback.print_exception(result.exc_info[1])) - - assert result.exit_code == 0 - - -def test_replace_with_empty_string(tmp_path, fixtures_path): - """Replace should not worry if the replace value has version info.""" - from tomlkit import dumps - - # Arrange - config_path = tmp_path / "pyproject.toml" - config_path.write_text(dumps(TEST_REPLACE_CONFIG)) - doc_path = tmp_path / "docs.yaml" - doc_path.write_text("We should censor profanity\n\n") - - runner: CliRunner = CliRunner() - with inside_dir(tmp_path): - result: Result = runner.invoke( - cli.cli, - [ - "replace", - "--verbose", - "--no-configured-files", - "--allow-dirty", - "--search", - "profanity", - "--replace", - "", - "./docs.yaml", - ], - ) - - if result.exit_code != 0: - print("Here is the output:") - print(result.output) - print(traceback.print_exception(result.exc_info[1])) - assert result.exit_code == 0 - assert doc_path.read_text() == "We should censor \n\n" - - -def test_valid_regex_not_ignoring_regex(tmp_path: Path, caplog) -> None: - """A search string not meant to be a regex (but is) is still found and replaced correctly.""" - # Arrange - search = "(unreleased)" - replace = "(2023-01-01)" - - version_path = tmp_path / "VERSION" - version_path.write_text("# Changelog\n\n## [0.0.1 (unreleased)](https://cool.url)\n\n- Test unreleased package.\n") - config_file = tmp_path / ".bumpversion.toml" - config_file.write_text( - "[tool.bumpversion]\n" - 'current_version = "0.0.1"\n' - "allow_dirty = true\n\n" - "[[tool.bumpversion.files]]\n" - 'filename = "VERSION"\n' - "regex = false\n" - f'search = "{search}"\n' - f'replace = "{replace}"\n' - ) - - # Act - runner: CliRunner = CliRunner() - with inside_dir(tmp_path): - result: Result = runner.invoke( - cli.cli, - [ - "replace", - "--verbose", - "--no-regex", - "--no-configured-files", - "--search", - search, - "--replace", - replace, - "VERSION", - ], - ) - - # Assert - if result.exit_code != 0: - print(result.output) - - assert result.exit_code == 0 - assert ( - version_path.read_text() - == "# Changelog\n\n## [0.0.1 (2023-01-01)](https://cool.url)\n\n- Test unreleased package.\n" - ) +class TestReplaceCLI: + """Test the replace CLI subcommand.""" + + class TestDefaultReplacesVersion: + """Test the default behavior of the replace subcommand.""" + + def test_default_affects_all_configured_files(self, mocker, tmp_path, fixtures_path): + """The replace subcommand should replace the version in all configured files.""" + # Arrange + toml_path = fixtures_path / "basic_cfg.toml" + config_path = tmp_path / "pyproject.toml" + shutil.copy(toml_path, config_path) + + mocked_modify_files = mocker.patch("bumpversion.cli.modify_files") + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke(cli.cli, ["replace", "--new-version", "1.1.0"]) + + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + + call_args = mocked_modify_files.call_args[0] + configured_files = call_args[0] + assert len(configured_files) == 3 + actual_filenames = {f.file_change.filename for f in configured_files} + assert actual_filenames == {"setup.py", "CHANGELOG.md", "bumpversion/__init__.py"} + + def test_can_limit_to_specific_files(self, mocker, git_repo, fixtures_path): + """The replace subcommand should set the files to only the specified files.""" + # Arrange + toml_path = fixtures_path / "basic_cfg.toml" + config_path = git_repo / "pyproject.toml" + shutil.copy(toml_path, config_path) + + mocked_modify_files = mocker.patch("bumpversion.cli.modify_files") + runner: CliRunner = CliRunner() + with inside_dir(git_repo): + result: Result = runner.invoke(cli.cli, ["replace", "--no-configured-files", "VERSION"]) + + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + + call_args = mocked_modify_files.call_args[0] + configured_files = call_args[0] + assert len(configured_files) == 1 + assert configured_files[0].file_change.filename == "VERSION" + + class TestOptions: + """Test the options of the replace subcommand.""" + + def test_missing_newversion_is_set_to_none(self, mocker, tmp_path, fixtures_path): + """The replace subcommand should set new_version to None in the context.""" + # Arrange + toml_path = fixtures_path / "basic_cfg.toml" + config_path = tmp_path / "pyproject.toml" + shutil.copy(toml_path, config_path) + + mocked_modify_files = mocker.patch("bumpversion.cli.modify_files") + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke(cli.cli, ["replace"]) + + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + + call_args = mocked_modify_files.call_args[0] + assert call_args[2] is None + + def test_ignores_missing_files_with_option(self, mocker, tmp_path, fixtures_path): + """The replace subcommand should ignore missing.""" + + config_file = tmp_path / ".bumpversion.toml" + config_file.write_text( + "[tool.bumpversion]\n" + 'current_version = "0.0.1"\n' + "allow_dirty = true\n\n" + "[[tool.bumpversion.files]]\n" + 'filename = "VERSION"\n' + "regex = false\n" + ) + + # Act + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke( + cli.cli, + [ + "replace", + "--verbose", + "--no-regex", + "--no-configured-files", + "--ignore-missing-files", + "VERSION", + ], + ) + + # Assert + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + + class TestSearchInputs: + """Test the search inputs of the replace subcommand.""" + + def test_accepts_plain_string(self, tmp_path, fixtures_path): + """Replace should not worry if the search values have version info.""" + from tomlkit import dumps + + # Arrange + config_path = tmp_path / "pyproject.toml" + config_path.write_text(dumps(TEST_REPLACE_CONFIG)) + doc_path = tmp_path / "docs.yaml" + doc_path.write_text("url: https://github.com/sampleuser/workflows/main/.github/update_mailmap.py") + + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke( + cli.cli, + [ + "replace", + "--no-configured-files", + "--search", + "/workflows/main/", + "--replace", + "/workflows/v{current_version}/", + "./docs.yaml", + ], + ) + + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + + def test_unintentional_valid_regex_still_found(self, tmp_path: Path, caplog) -> None: + """A search string not meant to be a regex (but is) is still found and replaced correctly.""" + # Arrange + search = "(unreleased)" + replace = "(2023-01-01)" + + version_path = tmp_path / "VERSION" + version_path.write_text( + "# Changelog\n\n## [0.0.1 (unreleased)](https://cool.url)\n\n- Test unreleased package.\n" + ) + config_file = tmp_path / ".bumpversion.toml" + config_file.write_text( + "[tool.bumpversion]\n" + 'current_version = "0.0.1"\n' + "allow_dirty = true\n\n" + "[[tool.bumpversion.files]]\n" + 'filename = "VERSION"\n' + "regex = false\n" + f'search = "{search}"\n' + f'replace = "{replace}"\n' + ) + + # Act + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke( + cli.cli, + [ + "replace", + "--verbose", + "--no-regex", + "--no-configured-files", + "--search", + search, + "--replace", + replace, + "VERSION", + ], + ) + + # Assert + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + assert ( + version_path.read_text() + == "# Changelog\n\n## [0.0.1 (2023-01-01)](https://cool.url)\n\n- Test unreleased package.\n" + ) + + class TestReplaceInputs: + """Test the replace inputs of the replace subcommand.""" + + def test_accepts_empty_string(self, tmp_path, fixtures_path): + """Replace should be able to replace strings with an empty string.""" + from tomlkit import dumps + + # Arrange + config_path = tmp_path / "pyproject.toml" + config_path.write_text(dumps(TEST_REPLACE_CONFIG)) + doc_path = tmp_path / "docs.yaml" + doc_path.write_text("We should censor profanity\n\n") + + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke( + cli.cli, + [ + "replace", + "--verbose", + "--no-configured-files", + "--allow-dirty", + "--search", + "profanity", + "--replace", + "", + "./docs.yaml", + ], + ) + + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + assert result.exit_code == 0 + assert doc_path.read_text() == "We should censor \n\n" + + def test_accepts_plain_string(self, tmp_path, fixtures_path): + """Replace should not worry if the replace values have version info.""" + from tomlkit import dumps + + # Arrange + config_path = tmp_path / "pyproject.toml" + config_path.write_text(dumps(TEST_REPLACE_CONFIG)) + doc_path = tmp_path / "docs.yaml" + doc_path.write_text("url: https://github.com/sampleuser/workflows/v2.17.7/.github/update_mailmap.py") + + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke( + cli.cli, + [ + "replace", + "--no-configured-files", + "--search", + "/workflows/v{current_version}/", + "--replace", + "/workflows/main/", + "./docs.yaml", + ], + ) + + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 + assert ( + doc_path.read_text() == "url: https://github.com/sampleuser/workflows/main/.github/update_mailmap.py" + ) diff --git a/tests/test_configuredfile.py b/tests/test_configuredfile.py index 2df3c0fc..3ef2ca66 100644 --- a/tests/test_configuredfile.py +++ b/tests/test_configuredfile.py @@ -21,6 +21,7 @@ def test_file_change_is_identical_to_input(self): serialize=("{major}-{minor}-{patch}",), regex=True, ignore_missing_version=False, + ignore_missing_file=False, ) version_config = VersionConfig( parse="(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?", @@ -47,6 +48,7 @@ def test_version_config_uses_file_change_attrs(self): serialize=("{major}-{minor}-{patch}",), regex=True, ignore_missing_version=False, + ignore_missing_file=False, ) version_config = VersionConfig( parse="(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)(\\-(?P[a-z]+))?", diff --git a/tests/test_files.py b/tests/test_files.py index 5b10509b..df8586b4 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -479,6 +479,7 @@ def test_update_file_does_not_modify_non_toml_files(self, tmp_path: Path) -> Non replace=conf.replace, regex=conf.regex, ignore_missing_version=conf.ignore_missing_version, + ignore_missing_file=conf.ignore_missing_files, serialize=conf.serialize, parse=conf.parse, ) @@ -510,6 +511,7 @@ def test_update_replaces_key(self, tmp_path: Path, fixtures_path: Path) -> None: replace=conf.replace, regex=conf.regex, ignore_missing_version=conf.ignore_missing_version, + ignore_missing_file=conf.ignore_missing_files, serialize=conf.serialize, parse=conf.parse, ) From fcfaac707a79533814008effabd4a05aafc04c57 Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Sun, 11 Feb 2024 12:03:24 -0600 Subject: [PATCH 2/6] Added `--ignore-missing-files` option to bump --- bumpversion/cli.py | 11 ++++++++++- tests/test_cli/test_bump.py | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/bumpversion/cli.py b/bumpversion/cli.py index aa1c8ce7..43a096aa 100644 --- a/bumpversion/cli.py +++ b/bumpversion/cli.py @@ -54,6 +54,7 @@ def cli(ctx: Context) -> None: "--search", "--replace", "--no-configured-files", + "--ignore-missing-files", "--ignore-missing-version", ], }, @@ -160,6 +161,12 @@ def cli(ctx: Context) -> None: "ignoring the files from the configuration file." ), ) +@click.option( + "--ignore-missing-files", + is_flag=True, + envvar="BUMPVERSION_IGNORE_MISSING_FILES", + help="Ignore any missing files when searching and replacing in files.", +) @click.option( "--ignore-missing-version", is_flag=True, @@ -240,6 +247,7 @@ def bump( replace: Optional[str], regex: Optional[bool], no_configured_files: bool, + ignore_missing_files: bool, ignore_missing_version: bool, dry_run: bool, commit: Optional[bool], @@ -256,7 +264,7 @@ def bump( ARGS may contain any of the following: - VERSION_PART is the part of the version to increase, e.g. `minor` . + VERSION_PART is the part of the version to increase, e.g. `minor`. Valid values include those given in the `--serialize` / `--parse` option. FILES are additional file(s) to modify. @@ -281,6 +289,7 @@ def bump( tag_message=tag_message, message=message, commit_args=commit_args, + ignore_missing_files=ignore_missing_files, ignore_missing_version=ignore_missing_version, regex=regex, ) diff --git a/tests/test_cli/test_bump.py b/tests/test_cli/test_bump.py index 81e896b1..cc658212 100644 --- a/tests/test_cli/test_bump.py +++ b/tests/test_cli/test_bump.py @@ -2,6 +2,7 @@ import shutil import subprocess +import traceback from datetime import datetime from pathlib import Path @@ -350,3 +351,41 @@ def test_detects_bad_or_missing_version_part(version_part: str, tmp_path: Path, # Assert assert result.exception is not None assert "Unknown version part:" in result.stdout + + +def test_ignores_missing_files_with_option(tmp_path, fixtures_path): + """The replace subcommand should ignore missing.""" + + config_file = tmp_path / ".bumpversion.toml" + config_file.write_text( + "[tool.bumpversion]\n" + 'current_version = "0.0.1"\n' + "allow_dirty = true\n\n" + "[[tool.bumpversion.files]]\n" + 'filename = "VERSION"\n' + "regex = false\n" + ) + + # Act + runner: CliRunner = CliRunner() + with inside_dir(tmp_path): + result: Result = runner.invoke( + cli.cli, + [ + "bump", + "--verbose", + "--no-regex", + "--no-configured-files", + "--ignore-missing-files", + "minor", + "VERSION", + ], + ) + + # Assert + if result.exit_code != 0: + print("Here is the output:") + print(result.output) + print(traceback.print_exception(result.exc_info[1])) + + assert result.exit_code == 0 From 1b8c6b3b61904998ec8bb055b65235c3d3b2b96f Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Sat, 17 Feb 2024 07:27:36 -0600 Subject: [PATCH 3/6] Converted documentation to use MkDocs --- .gitignore | 5 - .pre-commit-config.yaml | 6 +- README.md | 13 +-- docsrc/LICENSE | 3 +- docsrc/Makefile | 20 ---- docsrc/_static/bump-my-version-logo.svg | 1 + docsrc/_static/css/custom.css | 40 +++++-- docsrc/changelog.md | 3 +- docsrc/conf.py | 100 ----------------- docsrc/contributing.md | 3 +- docsrc/index.md | 27 ++--- docsrc/make.bat | 36 ------- docsrc/readme.md | 2 - docsrc/reference/cli.md | 8 ++ docsrc/reference/cli.rst | 6 -- docsrc/reference/configuration.md | 136 ++++++++++++++++-------- docsrc/{ => tutorials}/usage.md | 14 +-- mkdocs.yml | 71 +++++++++++++ pyproject.toml | 19 ++-- 19 files changed, 236 insertions(+), 277 deletions(-) delete mode 100644 docsrc/Makefile create mode 100644 docsrc/_static/bump-my-version-logo.svg delete mode 100644 docsrc/conf.py delete mode 100644 docsrc/make.bat delete mode 100644 docsrc/readme.md create mode 100644 docsrc/reference/cli.md delete mode 100644 docsrc/reference/cli.rst rename docsrc/{ => tutorials}/usage.md (84%) create mode 100644 mkdocs.yml diff --git a/.gitignore b/.gitignore index ba5d9455..738e8c0a 100644 --- a/.gitignore +++ b/.gitignore @@ -78,11 +78,6 @@ instance/ # Scrapy stuff: .scrapy -# Sphinx documentation -docs -docsrc/_build/ -docsrc/_autosummary - # PyBuilder .pybuilder/ target/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8c42c8ff..13224da6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,11 @@ repos: - id: check-symlinks - id: check-toml - id: check-yaml - exclude: test.* + exclude: | + (?x)^( + test.*| + mkdocs.yml + )$ args: [--allow-multiple-documents] - id: debug-statements - id: end-of-file-fixer diff --git a/README.md b/README.md index 0cf481ae..fbf1681e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ > - Add better configuration validation using [Pydantic](https://docs.pydantic.dev) > - Make the code and tests easier to read and maintain + ## Overview @@ -31,12 +32,6 @@ Bump My Version's purpose is to: - Tagging releases - Reading version numbers from tags - -## Future Direction - -- Switch having both the version part and files to change as arguments on the command line. -- Allow for multiple tags, including one that moves for having a `v2` that always points to the latest version of version 2. [For example](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md#recommendations) - ## Installation You can download and install the latest version of this software from the Python package index (PyPI) as follows: @@ -51,10 +46,6 @@ Please find the changelog here: [CHANGELOG.md](CHANGELOG.md) ## Usage for version incrementing -> **NOTE:** -> -> Throughout this document, you can use `bumpversion` or `bump-my-version` interchangeably. - There are two modes of operation: On the command line for single-file operation and using a configuration file (`pyproject.toml` or `.bumpversion.toml`) for more complex multi-file operations. > **WARNING:** @@ -161,3 +152,5 @@ workflow, as it is intended to be very versatile. ## License bump-my-version is licensed under the MIT License - see the [LICENSE](LICENSE) file for details + + diff --git a/docsrc/LICENSE b/docsrc/LICENSE index 39479bb5..e1c8f4da 100644 --- a/docsrc/LICENSE +++ b/docsrc/LICENSE @@ -1,2 +1 @@ -```{include} ../LICENSE -``` +{% include-markdown "../LICENSE" %} diff --git a/docsrc/Makefile b/docsrc/Makefile deleted file mode 100644 index 56fa66d8..00000000 --- a/docsrc/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python -msphinx -SPHINXPROJ = bump_version -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docsrc/_static/bump-my-version-logo.svg b/docsrc/_static/bump-my-version-logo.svg new file mode 100644 index 00000000..6dcfad1d --- /dev/null +++ b/docsrc/_static/bump-my-version-logo.svg @@ -0,0 +1 @@ + diff --git a/docsrc/_static/css/custom.css b/docsrc/_static/css/custom.css index 0f5f134a..dc455b76 100644 --- a/docsrc/_static/css/custom.css +++ b/docsrc/_static/css/custom.css @@ -16,26 +16,54 @@ margin: 0; } -dl.field-list { +.field-list > dl { + --gap: 1rem; + --line-offset: calc(var(--gap) / 2); + --line-thickness: 1px; + --line-color: #e0e0e0; + display: grid; grid-template-columns: fit-content(30%) auto; + grid-gap: var(--gap); margin-bottom: 1rem; + overflow: hidden; } -dl.field-list > dt { +.field-list > dl > dt { + text-align: right; font-weight: bold; word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; + position: relative; } -dl.field-list > dd { - padding-left: 0.5em; +[dir=ltr] .field-list > dl > dd { margin-top: 0; margin-left: 0; margin-bottom: 0; + position: relative; +} + +/* Pseudo Element Shared Styling */ +.field-list > dl > dt::before, +.field-list > dl > dt::after, +.field-list > dl > dd::before, +.field-list > dl > dd::after { + content: ''; + position: absolute; + background-color: var(--line-color); + z-index: 1; } +/* Row Borders */ +.field-list > dl > dt::after, +.field-list > dl > dd::after { + inline-size: 100vw; + block-size: var(--line-thickness); + inset-inline-start: 0; + inset-block-start: calc(var(--line-offset) * -1); +} + + figure { padding-bottom: .75rem; padding-top: .5rem; diff --git a/docsrc/changelog.md b/docsrc/changelog.md index 66efc0fe..e137197f 100644 --- a/docsrc/changelog.md +++ b/docsrc/changelog.md @@ -1,2 +1 @@ -```{include} ../CHANGELOG.md -``` +{% include-markdown "../CHANGELOG.md" %} diff --git a/docsrc/conf.py b/docsrc/conf.py deleted file mode 100644 index 873020ef..00000000 --- a/docsrc/conf.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -Sphinx configuration. -""" - -# flake8: noqa -import os -import sys -from datetime import date - -sys.path.insert(0, os.path.abspath("..")) - -import bumpversion - -project = "bump-my-version" -copyright = f"{date.today():%Y} Calloway Project" -author = "Contributors" - -version = bumpversion.__version__ -release = bumpversion.__version__ - -# -- General configuration --------------------------------------------- - -extensions = [ - "myst_parser", - "autodoc2", - "sphinx.ext.viewcode", - "sphinx.ext.intersphinx", - "sphinx.ext.autosectionlabel", - "sphinx.ext.napoleon", - "sphinx_autodoc_typehints", - "sphinx.ext.coverage", - "sphinx.ext.githubpages", - "sphinx_click", - "sphinx_copybutton", -] -autosectionlabel_prefix_document = True -autosectionlabel_maxdepth = 2 - -autodoc2_packages = ["../bumpversion"] -autodoc2_render_plugin = "myst" -autodoc2_output_dir = "reference" -autodoc2_index_template = None -autodoc2_docstring_parser_regexes = [ - # this will render all docstrings as Markdown - (r".*", "myst"), -] - -napoleon_attr_annotations = True -napoleon_include_special_with_doc = True -napoleon_include_private_with_doc = True -napoleon_include_init_with_doc = True -napoleon_use_admonition_for_examples = True - -myst_enable_extensions = [ - "amsmath", - "colon_fence", - "deflist", - "dollarmath", - "linkify", - "replacements", - "smartquotes", - "substitution", - "tasklist", - "fieldlist", -] -myst_heading_anchors = 2 -intersphinx_mapping = { - "python": ("https://docs.python.org/3", None), -} - -templates_path = ["_templates"] -source_suffix = [".rst", ".md"] -master_doc = "index" -language = "en" -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -html_theme = "furo" -html_static_path = ["_static"] -html_css_files = [ - "css/custom.css", -] -html_theme_options = { - "footer_icons": [ - { - "name": "GitHub", - "url": "https://github.com/callowayproject/bump-my-version", - "html": """ - - - - """, - "class": "", - }, - ], -} -html_title = f"Bump My Version {release}" diff --git a/docsrc/contributing.md b/docsrc/contributing.md index 78caf34e..89e0be46 100644 --- a/docsrc/contributing.md +++ b/docsrc/contributing.md @@ -1,2 +1 @@ -```{include} ../CONTRIBUTING.md -``` +{% include-markdown "../CONTRIBUTING.md" rewrite-relative-urls=false %} diff --git a/docsrc/index.md b/docsrc/index.md index 981fe308..2e69f552 100644 --- a/docsrc/index.md +++ b/docsrc/index.md @@ -1,22 +1,9 @@ # Bump My Version -```{toctree} ---- -maxdepth: 2 -caption: Contents ---- -Introduction -usage -tutorials/index -howtos/index -reference/index -explanation/index -CONTRIBUTING -CHANGELOG -``` - -## Indices and tables - -* {ref}`genindex` -* {ref}`modindex` -* {ref}`search` +{% + include-markdown + "../README.md" + start="" + end="" + rewrite-relative-urls=false +%} diff --git a/docsrc/make.bat b/docsrc/make.bat deleted file mode 100644 index 18eda6c4..00000000 --- a/docsrc/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=bin_bump_version - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/docsrc/readme.md b/docsrc/readme.md deleted file mode 100644 index 451bedae..00000000 --- a/docsrc/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -```{include} ../README.md -``` diff --git a/docsrc/reference/cli.md b/docsrc/reference/cli.md new file mode 100644 index 00000000..23d14e93 --- /dev/null +++ b/docsrc/reference/cli.md @@ -0,0 +1,8 @@ +# Command-line Interface + + +::: mkdocs-click + :module: bumpversion.cli + :command: cli + :prog_name: bump-my-version + :style: table diff --git a/docsrc/reference/cli.rst b/docsrc/reference/cli.rst deleted file mode 100644 index eadf1706..00000000 --- a/docsrc/reference/cli.rst +++ /dev/null @@ -1,6 +0,0 @@ -Command-line Interface -====================== - -.. click:: bumpversion.cli:cli - :prog: bump-my-version - :nested: full diff --git a/docsrc/reference/configuration.md b/docsrc/reference/configuration.md index e43cae22..cd9fa37a 100644 --- a/docsrc/reference/configuration.md +++ b/docsrc/reference/configuration.md @@ -29,29 +29,42 @@ The general configuration is grouped in a `[tool.bumpversion]` or `[bumpversion ### `allow_dirty` -:required: No - -:default: `False` (Don't do anything if there are uncommitted changes) - -:type: boolean - -:command line option: `--allow-dirty | --no-allow-dirty` - -:environment var: `BUMPVERSION_ALLOW_DIRTY` - -Bump-my-version's default behavior is to abort if the working directory is dirty. This is to protect you from releasing unversioned files and/or overwriting unsaved changes. +::: field-list + required + : No + + default + : `False` + + type + : boolean + + command line option + : `--allow-dirty | --no-allow-dirty` + + environment var + : `BUMPVERSION_ALLOW_DIRTY` + + +Bump-my-version's default behavior is to abort if the working directory has uncommitted changes. This is to protect you from releasing unversioned files and/or overwriting unsaved changes. ### `commit` -:required: No - -:default: `False` (Don't create a commit) - -:type: boolean - -:command line option: `--commit | --no-commit` - -:environment var: `BUMPVERSION_COMMIT` +::: field-list + required + : No + + default + : `False` (Don't create a commit) + + type + : boolean + + command line option + : `--commit | --no-commit` + + environment var + : `BUMPVERSION_COMMIT` Whether to create a commit using git or Mercurial. @@ -59,15 +72,22 @@ If you have pre-commit hooks, you might also want to add an option to [`commit_a ### `message` -:required: No - -:default: `Bump version: {current_version} → {new_version}` - -:type: string - -:command line option: `--message` - -:environment var: `BUMPVERSION_MESSAGE` +::: field-list + + required + : No + + default + : `Bump version: {current_version} → {new_version}` + + type + : string + + command line option + : `--message` + + environment var + : `BUMPVERSION_MESSAGE` The commit message template to use when creating a commit. This is only used when the [`commit`](configuration.md#commit) option is set to `True`. @@ -75,15 +95,22 @@ This string is templated using the [Python Format String Syntax](https://docs.py ### `commit_args` -:required: No +::: field-list -:default: `""` + required + : No -:type: string + default + : `""` + + type + : string -:command line option: `--commit-args` + command line option + : `--commit-args` -:environment var: `BUMPVERSION_COMMIT_ARGS` + environment var + : `BUMPVERSION_COMMIT_ARGS` Extra arguments to pass to commit command. This is only used when the [`commit`](configuration.md#commit) option is set to `True`. @@ -91,30 +118,45 @@ If you have pre-commit hooks, you might also want to add an option to disable yo ### `tag` -:required: No +::: field-list -:default: `False` (Don't create a tag) + required + : No -:type: boolean + default + : `False` (Don't create a tag) -:command line option: `(--tag | --no-tag)` + type + : boolean -:environment var: `BUMPVERSION_TAG` + command line option + : `(--tag | --no-tag)` + + environment var + : `BUMPVERSION_TAG` If `True`, create a tag after committing the changes. The tag is named using the [`tag_name`](configuration.md#tag-name) option. If you are using `git`, don't forget to `git-push` with the `--tags` flag when you are done. ### `sign_tags` -:required: No - -:default: `False` (Don't sign tags) - -:type: boolean - -:command line option: `(--sign-tags | --no-sign-tags)` -:environment var: `BUMPVERSION_SIGN_TAGS` +::: field-list + + required + : No + + default + : `False` (Don't sign tags) + + type + : boolean + + command line option + : `(--sign-tags | --no-sign-tags)` + + environment var + : `BUMPVERSION_SIGN_TAGS` If `True`, sign the created tag, when [`tag`](configuration.md#tag) is `True`. diff --git a/docsrc/usage.md b/docsrc/tutorials/usage.md similarity index 84% rename from docsrc/usage.md rename to docsrc/tutorials/usage.md index e6a70819..ec0b0acf 100644 --- a/docsrc/usage.md +++ b/docsrc/tutorials/usage.md @@ -1,22 +1,18 @@ # Usage -```{admonition} NOTE - -You can use `bumpversion` or `bump-my-version` throughout this document interchangeably. -``` There are two modes of operation: On the command line for single-file operation and using a configuration file (`pyproject.toml` or `.bumpversion.toml`) for more complex multi-file processes. We recommend using a configuration file for all but the simplest of projects. -```{admonition} WARNING +!!! Warning + + The invocation of `bump-my-version` changed in version 0.6.0. It splits functionality into sub-commands. It remains backward-compatible with previous versions. Previous usage is discouraged and may be removed in a 1.0 release. -The invocation of `bump-my-version` changed in version 0.6.0. It splits functionality into sub-commands. It remains backward-compatible with previous versions. Previous usage is discouraged and may be removed in a 1.0 release. -``` ## Incrementing a version ```console bump-my-version bump [OPTIONS] [ARGS]... ``` -The `bump` sub-command triggers a version increment. The [complete list of options](reference/cli.rst#bumpversion-bump) is available. The `ARGS` may contain a `VERSION_PART` or `FILES` +The `bump` sub-command triggers a version increment. The [complete list of options](../reference/cli.md#bump-my-version-bump) is available. The `ARGS` may contain a `VERSION_PART` or `FILES` ### `VERSION_PART` @@ -25,7 +21,7 @@ _**[optional]**_ The part of the version to increase, e.g., `minor`. -Valid values include those given in the [`--serialize`](reference/configuration.md#serialize) / [`--parse`](reference/configuration.md#parse) option. +Valid values include those given in the [`--serialize`](../reference/configuration.md#serialize) / [`--parse`](../reference/configuration.md#parse) option. For example, if the current version is `0.5.1` and you want to bump it to `0.6.0`: diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..9ee40155 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,71 @@ +site_name: Bump My Version +repo_url: https://github.com/callowayproject/bump-my-version +edit_uri: edit/master/docs/ +copyright: Calloway Project +docs_dir: docsrc +theme: + name: material + logo: _static/bump-my-version-logo.svg + favicon: _static/favicon.png + features: + - navigation.tabs + - navigation.sections + - navigation.path + - navigation.indexes + - toc.integrate + - content.action.edit + - content.action.view + - content.code.annotate + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode +use_directory_urls: false +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - customblocks + - footnotes + - md_in_html + - mdx_truly_sane_lists + - mkdocs-click + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight + - pymdownx.snippets + - pymdownx.tabbed + - toc: + permalink: true + toc_depth: 3 + - tables + +plugins: + - search + - git-revision-date-localized + - git-authors: + show_email_address: false + - include-markdown + +extra_javascript: + - "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML" + +extra_css: + - _static/css/custom.css + +#nav: +# - General: "general/" +# - Provisioning LLMs for Applications: "provisioning-llms/" +# - Tutorials: "tutorials/" +# - Security & Privacy: "security-and-privacy/" +# - Guilds: "guilds/" diff --git a/pyproject.toml b/pyproject.toml index 1aa304ca..bcefd887 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,15 +58,16 @@ dev = [ "pre-commit", ] docs = [ - "ghp-import", - "linkify-it-py", - "myst-parser", - "furo", - "Sphinx>=4.3.0", - "sphinx-autodoc2", - "sphinx-autodoc-typehints", - "sphinx-click", - "sphinx-copybutton", + "mkdocs", + "mkdocs-material", + "mkdocstrings[python]", + "mkdocs-include-markdown-plugin", + "mkdocs-click", + "markdown-customblocks", + "mkdocs-git-revision-date-localized-plugin", + "mkdocs-git-authors-plugin", + "mkdocs-git-committers-plugin", + "mdx-truly-sane-lists", ] test = [ "coverage", From f805c33fb3e5c7064a84761659fc5d43a0de2975 Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Sun, 18 Feb 2024 10:43:45 -0600 Subject: [PATCH 4/6] Convert docs to MkDocs --- CHANGELOG.md | 25 +- README.md | 6 +- .../bump-my-version-model.drawio | 412 +++++----- docsrc/_static/creating-a-version-spec.png | Bin 39199 -> 0 bytes docsrc/_static/creating-a-version-spec.svg | 562 +------------ docsrc/_static/creating-a-version.png | Bin 62329 -> 0 bytes docsrc/_static/creating-a-version.svg | 739 +----------------- docsrc/_static/css/cards.css | 200 +++++ docsrc/_static/css/mkdocstrings.css | 27 + .../_static/serializing-a-version-1-0-0.png | Bin 25962 -> 0 bytes .../_static/serializing-a-version-1-0-0.svg | 307 +------- .../_static/serializing-a-version-1-2-0.png | Bin 26157 -> 0 bytes .../_static/serializing-a-version-1-2-0.svg | 307 +------- .../_static/serializing-a-version-1-2-3.png | Bin 26003 -> 0 bytes .../_static/serializing-a-version-1-2-3.svg | 307 +------- docsrc/_static/serializing-a-version-1.svg | 266 +------ docsrc/explanation/index.md | 7 - docsrc/explanation/mental-model.md | 97 ++- docsrc/gen_doc_stubs.py | 51 ++ docsrc/howtos/avoid-incorrect-replacements.md | 2 +- .../howtos/custom-version-formats-by-file.md | 2 +- docsrc/howtos/index.md | 9 +- .../bumpversion/bumpversion.__main__.md | 9 - .../bumpversion/bumpversion.aliases.md | 62 -- .../bumpversion/bumpversion.autocast.md | 73 -- .../reference/bumpversion/bumpversion.bump.md | 84 -- .../reference/bumpversion/bumpversion.cli.md | 123 --- .../bumpversion/bumpversion.config.create.md | 47 -- .../bumpversion/bumpversion.config.files.md | 113 --- .../bumpversion.config.files_legacy.md | 71 -- .../bumpversion/bumpversion.config.md | 100 --- .../bumpversion/bumpversion.config.models.md | 537 ------------- .../bumpversion/bumpversion.config.utils.md | 60 -- .../bumpversion/bumpversion.exceptions.md | 175 ----- .../bumpversion/bumpversion.files.md | 241 ------ .../bumpversion.indented_logger.md | 124 --- docsrc/reference/bumpversion/bumpversion.md | 71 -- .../reference/bumpversion/bumpversion.scm.md | 522 ------------- .../reference/bumpversion/bumpversion.show.md | 123 --- .../reference/bumpversion/bumpversion.ui.md | 126 --- .../bumpversion/bumpversion.utils.md | 151 ---- .../bumpversion/bumpversion.version_part.md | 104 --- .../bumpversion.versioning.conventions.md | 149 ---- .../bumpversion.versioning.functions.md | 188 ----- .../bumpversion/bumpversion.versioning.md | 21 - .../bumpversion.versioning.models.md | 330 -------- .../bumpversion.versioning.serialization.md | 84 -- .../bumpversion/bumpversion.visualize.md | 264 ------- .../bumpversion/bumpversion.yaml_dump.md | 247 ------ docsrc/reference/cli.md | 4 +- docsrc/reference/configuration.md | 576 ++++++++------ docsrc/reference/formatting-context.md | 72 +- docsrc/reference/index.md | 18 +- docsrc/reference/search-and-replace-config.md | 18 +- docsrc/reference/version-parts.md | 4 +- docsrc/tutorials/index.md | 6 +- mkdocs.yml | 45 +- pyproject.toml | 15 +- tools/drawioexport.py | 135 ++++ 59 files changed, 1197 insertions(+), 7221 deletions(-) rename docsrc/{ => _static}/bump-my-version-model.drawio (85%) delete mode 100644 docsrc/_static/creating-a-version-spec.png delete mode 100644 docsrc/_static/creating-a-version.png create mode 100644 docsrc/_static/css/cards.css create mode 100644 docsrc/_static/css/mkdocstrings.css delete mode 100644 docsrc/_static/serializing-a-version-1-0-0.png delete mode 100644 docsrc/_static/serializing-a-version-1-2-0.png delete mode 100644 docsrc/_static/serializing-a-version-1-2-3.png create mode 100755 docsrc/gen_doc_stubs.py delete mode 100644 docsrc/reference/bumpversion/bumpversion.__main__.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.aliases.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.autocast.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.bump.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.cli.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.config.create.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.config.files.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.config.files_legacy.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.config.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.config.models.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.config.utils.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.exceptions.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.files.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.indented_logger.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.scm.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.show.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.ui.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.utils.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.version_part.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.versioning.conventions.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.versioning.functions.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.versioning.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.versioning.models.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.versioning.serialization.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.visualize.md delete mode 100644 docsrc/reference/bumpversion/bumpversion.yaml_dump.md create mode 100644 tools/drawioexport.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 196e2db5..8ed9991b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Fix encoding when reading text. [c03476a](https://github.com/callowayproject/bump-my-version/commit/c03476ac51b94cd136c39bb9c48fee4f1a815b42) Fixes #68 + ### Other - [pre-commit.ci] pre-commit autoupdate. [491b4aa](https://github.com/callowayproject/bump-my-version/commit/491b4aa4edc0241edbf5d77cfcf609c6de56f301) @@ -25,6 +26,7 @@ - Refactored VersionComponentConfig to VersionComponentSpec. [b538308](https://github.com/callowayproject/bump-my-version/commit/b53830826c81446576b3979080b05930d71c34e2) More consistent with VersionSpec + ### New - Added mental model documentation. [5cbd250](https://github.com/callowayproject/bump-my-version/commit/5cbd250ab412f0f56af14a0fcc450cb31643e3e4) @@ -97,6 +99,7 @@ - Refactored the create subcommand. [f529d28](https://github.com/callowayproject/bump-my-version/commit/f529d283fb3a32eddee9daf368f9ce17ba5efcf1) - Also organized the CLI tests + ### New - Added `show-bump` subcommand. [0bbd814](https://github.com/callowayproject/bump-my-version/commit/0bbd81489ea0484962e9b3c207e6c6860cab6c55) @@ -105,6 +108,7 @@ - Added sample-config feature. [3d0f67d](https://github.com/callowayproject/bump-my-version/commit/3d0f67dbf9f42ffad1583e1fe08bd0971262257c) - Initial implementation + ### Updates - Updated documentation. [4f90348](https://github.com/callowayproject/bump-my-version/commit/4f903486338af31557c3647fc0ae00d7cc8e4213) @@ -122,6 +126,7 @@ - Removed dotted-notation from requirements. There is an issue on how dotted-notation sets values in the TOMLkit data structure. - Added `get_nested_value` and `set_nested_value` as replacements for dotted-notation. + ### Other - [pre-commit.ci] pre-commit autoupdate. [ee4d2f3](https://github.com/callowayproject/bump-my-version/commit/ee4d2f32af28c650651b9242c09e3b125e0101e2) @@ -184,6 +189,7 @@ - Fixed regression in config update. [2bbbd74](https://github.com/callowayproject/bump-my-version/commit/2bbbd74fe4b80895b3719692d1fe0023cc388bbb) Fixes #108 + ### New - Added a test case for line-start regexes. [ef4823c](https://github.com/callowayproject/bump-my-version/commit/ef4823c0cdb92660439095aacdbac6801953e4ae) @@ -297,6 +303,7 @@ - Added key_path to FileConfig. [e160b40](https://github.com/callowayproject/bump-my-version/commit/e160b401b0d14cef77255bbd87748721db4e2e3d) - Also made all attributes required except `filename`, `glob`, and `key_path` + ### Other - [pre-commit.ci] auto fixes from pre-commit.com hooks. [8188a42](https://github.com/callowayproject/bump-my-version/commit/8188a42d1e25efab1f45499b448f2c007738cbbe) @@ -343,6 +350,7 @@ - Add -h for help option. [fda71b0](https://github.com/callowayproject/bump-my-version/commit/fda71b0fce4115514fa85cf1d627e5f3673dba66) Fixes #67 + ### Other - Drop Python3.7 as compatible version. [890edc8](https://github.com/callowayproject/bump-my-version/commit/890edc8a0c0911ad3696a9bc0ddca7a9a72c5afd) @@ -373,6 +381,7 @@ - Changed the flags to --regex/--no-regex - updated tests and docs + ## 0.11.0 (2023-09-26) [Compare the full difference.](https://github.com/callowayproject/bump-my-version/compare/0.10.0...0.11.0) @@ -516,6 +525,7 @@ - The `--search` and `--replace` options now completely override any other search and replace logic. Fixes #34 + ### Other - [pre-commit.ci] pre-commit autoupdate. [531738d](https://github.com/callowayproject/bump-my-version/commit/531738d62d3a2583c7831d17151cb8ae7b14677c) @@ -540,6 +550,7 @@ - Declared SourceCodeManager attributes as `ClassVar[List[str]]` - `_TEST_USABLE_COMMAND`, `_COMMIT_COMMAND`, and `_ALL_TAGS_COMMAND` affected + ### New - Added tests for CLI replace command. [a53cddc](https://github.com/callowayproject/bump-my-version/commit/a53cddc3c13bb21f5432d1cd331a51027a25981f) @@ -559,6 +570,7 @@ - `short_branch_name` is the branch name, lower case, containing only a-z and 0-9, and truncated to 20 characters. Fixes #28 + ### Other - Check config before tagging. [3a6e3ee](https://github.com/callowayproject/bump-my-version/commit/3a6e3eebdbc16ae509754fd977625a4c9b19d82a) @@ -586,6 +598,7 @@ - `tomlkit.parse()` returns a `TOMLDocument`. - `unwrap()` converts it into a `dict` + ### New - Adds `branch_name` to SCM information. [173be1a](https://github.com/callowayproject/bump-my-version/commit/173be1a7a107639be912d0fb76149accb54b0332) @@ -602,6 +615,7 @@ - Can output in YAML, JSON, and default - Can specify one or more items to display - Can use dotted-notation to pull items from nested data structures. + ### Updates - Changes bump-my-version into subcommands. [31ffbcf](https://github.com/callowayproject/bump-my-version/commit/31ffbcf839e2491c31d90b51041d1e840371108f) @@ -619,6 +633,7 @@ - Fixes issue #20 - Renders the correct `current_version` for each file being modified. + ### Other - [pre-commit.ci] auto fixes from pre-commit.com hooks. [5476cdf](https://github.com/callowayproject/bump-my-version/commit/5476cdf8b66666e06e9bfd4d71eaf2610103079a) @@ -646,12 +661,14 @@ - Added documentation for replacing strings in different files. [893ec03](https://github.com/callowayproject/bump-my-version/commit/893ec03f6ceaf2a050c31f10006aa63c0411af4e) Fixes #6 + ### Other - Made `VERSION_PART` optional. [f236b7d](https://github.com/callowayproject/bump-my-version/commit/f236b7de94d9f58e493c617848e3eb02e85a24c7) - Fixes #16 - `VERSION_PART` is detected from the arguments based on the configuration + ### Updates - Updated docs indicated VERSION_PART is optional. [22edeac](https://github.com/callowayproject/bump-my-version/commit/22edeac9018e75f79d7167fbfc6ca56cda4d3b07) @@ -673,6 +690,7 @@ - Fixes release.yaml. [01870d5](https://github.com/callowayproject/bump-my-version/commit/01870d5878b5f0a6e601863c4b9c25572db6cbb0) Outputs the notes to a file instead of an environment variable. + ### Other - [pre-commit.ci] auto fixes from pre-commit.com hooks. [266002f](https://github.com/callowayproject/bump-my-version/commit/266002f4d60ed6fe3623ba5f713318dc6220ec00) @@ -708,6 +726,7 @@ - Fixes test package. [7c12072](https://github.com/callowayproject/bump-my-version/commit/7c12072b11938385ec81c5e9cd285d91ac1c00d7) - The build-and-inspect action didn't save the dist packages + ### New - Added tests for logging branches. [f8f0278](https://github.com/callowayproject/bump-my-version/commit/f8f027846349df4c66377c2cf4cc6903cd1f9bf7) @@ -757,6 +776,7 @@ - changed name to bump-my-version in setup.cfg - added PAT in release pipeline to (hopefully) allow committing and tagging to master without issue. + ### New - Added codecov to workflow. [a5009e0](https://github.com/callowayproject/bump-my-version/commit/a5009e04068787bb98363c3e6803f84a338ee798) @@ -804,10 +824,12 @@ - Added bumpversion.yaml to increase the version when a PR is closed - - Added release.yaml to create a github relase and upload things to PyPI + - Added release.yaml to create a github release and upload things to PyPI + - Added PYTHONUTF8 mode. [91a73e2](https://github.com/callowayproject/bump-my-version/commit/91a73e26af94185194aea1ddb803ac621c0ae84a) - see https://docs.python.org/3/using/windows.html#utf-8-mode + - Added explicit environment variable declarations. [80fe7ef](https://github.com/callowayproject/bump-my-version/commit/80fe7ef0cf1005333143cce38835dbc9ad811884) - Added a github CI workflow. [2b3b358](https://github.com/callowayproject/bump-my-version/commit/2b3b3585afe3fdcf13ff47a229b4e3d3b5dacdc9) @@ -816,6 +838,7 @@ - __main__.py - aliases.py + - Added LICENSE. [34a9be5](https://github.com/callowayproject/bump-my-version/commit/34a9be5617a24b9d7eb042dc12e657ef1eb4258c) - Added tests for version parsing errors. [71a204b](https://github.com/callowayproject/bump-my-version/commit/71a204b0eb1ea2e7ae291055f26f5c499d429f1b) diff --git a/README.md b/README.md index fbf1681e..650f953e 100644 --- a/README.md +++ b/README.md @@ -121,9 +121,9 @@ Example output: `-h, --help` Print help and exit -## Using bump-my-version in a script +## Using Bump My Version in a script -If you need to use the version generated by bump-my-version in a script, you can make use of the `show` subcommand. +If you need to use the version generated by Bump My Version in a script, you can make use of the `show` subcommand. Say, for example, that you are using git-flow to manage your project and want to automatically create a release. When you issue `git flow release start` you need to know the new version before applying the change. @@ -151,6 +151,6 @@ workflow, as it is intended to be very versatile. ## License -bump-my-version is licensed under the MIT License - see the [LICENSE](LICENSE) file for details +Bump My Version is licensed under the MIT License - see the [LICENSE](LICENSE) file for details diff --git a/docsrc/bump-my-version-model.drawio b/docsrc/_static/bump-my-version-model.drawio similarity index 85% rename from docsrc/bump-my-version-model.drawio rename to docsrc/_static/bump-my-version-model.drawio index c0b86618..d84303ab 100644 --- a/docsrc/bump-my-version-model.drawio +++ b/docsrc/_static/bump-my-version-model.drawio @@ -1,4 +1,4 @@ - + @@ -204,10 +204,10 @@ - + - + @@ -215,7 +215,7 @@ - + @@ -223,7 +223,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -240,7 +240,7 @@ - + @@ -249,7 +249,7 @@ - + @@ -258,386 +258,410 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + + + + + + + + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - - + + - + + + + + + + + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + diff --git a/docsrc/_static/creating-a-version-spec.png b/docsrc/_static/creating-a-version-spec.png deleted file mode 100644 index 01df0d97405403d6b1bb4fdc3050d3e331502381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39199 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 Z_O@(Pk<<~^Ob`UT?5rKF8ZAyI{ToP*%_;x@ diff --git a/docsrc/_static/creating-a-version-spec.svg b/docsrc/_static/creating-a-version-spec.svg index 84e9623e..41a5fcf8 100644 --- a/docsrc/_static/creating-a-version-spec.svg +++ b/docsrc/_static/creating-a-version-spec.svg @@ -1,561 +1,3 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Spec - - - Configuration - - - create_version - - Named - Capture - - - Group - - - Named - Capture - - - Group - - - Named - Capture - - - Group - - - Version Component - - - Spec - - - Version Component - - - Spec - - - Version Component - - - Spec - - - - Version Parser - - Version Component - - - Spec - - - Version Component - - - Spec - - - Group - - - Order - - - component - - - dependency - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Version Spec
Version Spec
Configuration
Configuration
create_version
Named Capture Group
Named...
Named Capture Group
Named...
Named Capture Group
Named...
Version ComponentSpecVersion ComponentSpecVersion ComponentSpecVersion ParserVersion ComponentSpecVersion ComponentSpec
Group Order
Gr...
component dependency
component dependen...

Text is not SVG - cannot display
diff --git a/docsrc/_static/creating-a-version.png b/docsrc/_static/creating-a-version.png deleted file mode 100644 index b2a2c122350406607a7a536de3194c5c9a835e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62329 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®AyqrCZ275)@to++`aYy%OgOl3;I%n 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%0A(bc~FQ_|6Y13&W6~ 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 diff --git a/docsrc/_static/creating-a-version.svg b/docsrc/_static/creating-a-version.svg index 852b4fa9..d1c5cd66 100644 --- a/docsrc/_static/creating-a-version.svg +++ b/docsrc/_static/creating-a-version.svg @@ -1,738 +1,3 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Spec - - - - - value - - - - - " - - - - - 1 - - - - - " - - - - - value - - - - - " - - - - - 2 - - - - - " - - - - - value - - - - - " - - - - - 3 - - - - - " - - - - - create_version - - - - - m - - - - - a - - - - - j - - - - - o - - - - - r= - - - 1 - minor=2 - - - patch=3 - - - - - Version Component Spec - - - - - create_component - - - Version - - - Component - - - - - Version Component Spec - - - - - create_component - - - Version - - - Component - - - - - Version Component Spec - - - - - create_component - - - Version - - - Component - - - - - VersionSpec - - - - - Version - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Component - Version Component - - - Version Component - - - - - Version Spec - - - - - bump - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Version Spec
Version Spec
value
value
"1"
"1"
value
value
"2"
"2"
value
value
"3"
"3"
create_version
major=1
minor=2
patch=3
major=1...
Version Component Spec
Version Component Spec
create_componentVersionComponent
Version Component Spec
Version Component Spec
create_componentVersionComponent
Version Component Spec
Version Component Spec
create_componentVersionComponentVersionSpec
Version
Version
Version ComponentVersion ComponentVersion ComponentVersion Specbump
Text is not SVG - cannot display
diff --git a/docsrc/_static/css/cards.css b/docsrc/_static/css/cards.css new file mode 100644 index 00000000..95d2e5c1 --- /dev/null +++ b/docsrc/_static/css/cards.css @@ -0,0 +1,200 @@ +/************* + Grid Modification +*/ + +.md-typeset .grid.wide-gap { + gap: 1rem; +} + +/************* + Cards +*/ +.card-container { + background-color: white; + color: rgba(0, 0, 0, 0.87); + border-radius: 4px; + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 1px -1px, rgba(0, 0, 0, 0.14) 0 1px 1px 0, rgba(0, 0, 0, 0.12) 0 1px 3px 0; + overflow: hidden; +} + +.card-container.depth-0 { + box-shadow: none; +} + +/************* + Cards - Header +*/ + +.card-header { + padding: 16px 16px 24px; + background: var(--md-primary-fg-color); + color: var(--md-primary-bg-color); +} + +.card-header.backstage-green { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='1368' height='400' fill='none'%3e%3cmask id='a' width='1368' height='401' x='0' y='0' maskUnits='userSpaceOnUse'%3e%3cpath fill='url(%23paint0_linear)' d='M437 116C223 116 112 0 112 0h1256v400c-82 0-225-21-282-109-112-175-436-175-649-175z'/%3e%3cpath fill='url(%23paint1_linear)' d='M1368 400V282C891-29 788 40 711 161 608 324 121 372 0 361v39h1368z'/%3e%3cpath fill='url(%23paint2_linear)' d='M1368 244v156H0V94c92-24 198-46 375 0l135 41c176 51 195 109 858 109z'/%3e%3cpath fill='url(%23paint3_linear)' d='M1252 400h116c-14-7-35-14-116-16-663-14-837-128-1013-258l-85-61C98 28 46 8 0 0v400h1252z'/%3e%3c/mask%3e%3cg mask='url(%23a)'%3e%3cpath fill='white' d='M-172-98h1671v601H-172z'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient id='paint0_linear' x1='602' x2='1093.5' y1='-960.5' y2='272' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint1_linear' x1='482' x2='480' y1='1058.5' y2='70.5' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint2_linear' x1='424' x2='446.1' y1='-587.5' y2='274.6' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint3_linear' x1='587' x2='349' y1='-1120.5' y2='341' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e"), linear-gradient(90deg, rgb(0, 91, 75), rgb(0, 91, 75)); + color: rgb(255, 255, 255); +} + +.card-header.backstage-blue { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='1368' height='400' fill='none'%3e%3cmask id='a' width='1368' height='401' x='0' y='0' maskUnits='userSpaceOnUse'%3e%3cpath fill='url(%23paint0_linear)' d='M437 116C223 116 112 0 112 0h1256v400c-82 0-225-21-282-109-112-175-436-175-649-175z'/%3e%3cpath fill='url(%23paint1_linear)' d='M1368 400V282C891-29 788 40 711 161 608 324 121 372 0 361v39h1368z'/%3e%3cpath fill='url(%23paint2_linear)' d='M1368 244v156H0V94c92-24 198-46 375 0l135 41c176 51 195 109 858 109z'/%3e%3cpath fill='url(%23paint3_linear)' d='M1252 400h116c-14-7-35-14-116-16-663-14-837-128-1013-258l-85-61C98 28 46 8 0 0v400h1252z'/%3e%3c/mask%3e%3cg mask='url(%23a)'%3e%3cpath fill='white' d='M-172-98h1671v601H-172z'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient id='paint0_linear' x1='602' x2='1093.5' y1='-960.5' y2='272' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint1_linear' x1='482' x2='480' y1='1058.5' y2='70.5' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint2_linear' x1='424' x2='446.1' y1='-587.5' y2='274.6' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint3_linear' x1='587' x2='349' y1='-1120.5' y2='341' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e"), linear-gradient(90deg, rgb(0, 109, 143), rgb(0, 73, 161)); + color: rgb(255, 255, 255); +} + +.card-header p.subtitle { + margin: 0; + font-size: 0.8em; + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: 500; + line-height: 1.57; +} + +.card-header p.title { + margin: 0; + font-size: 1.14em; + font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-weight: 700; + line-height: 1.6; + margin-bottom: 2px; +} + +/************* + Cards - Media +*/ + +.card-media { + display: block; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + width: 100%; + object-fit: cover; +} + +.card-media p { + margin: 0; +} + +/************* + Cards - Content +*/ + +.card-content { + padding: 16px; +} + +.card-content p { + margin: 0; +} + +.card-content p + p { + margin-top: 1em; +} + +.card-content-title { + margin-top: 0; + font-weight: 400; + font-size: 1.5rem; + line-height: 1.334; + letter-spacing: 0; + margin-bottom: 0.35em; +} + +.card-content-title p { + margin: 0; +} + +/************* + Cards - Actions +*/ + +.card-actions { + padding: 16px; +} + +.card-actions ul:not([hidden]) { + display: flex; + margin: 0; +} + +.card-actions ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-wrap: wrap; + gap: 16px; +} +.card-actions.right ul { + justify-content: flex-end; +} + +.card-actions p { + margin: 0; +} + +[dir=ltr] .card-actions ul li { + margin: 0; +} + +.card-actions a { + background-color: transparent; + margin-top: 0; + vertical-align: middle; + font-weight: 500; + font-size: 0.8125rem; + line-height: 1.75; + letter-spacing: 0.02857em; + text-transform: uppercase; +} + +/************* + Cards - Tags +*/ + +.card-tags { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + padding: 16px; +} + +.card-tags ul:not([hidden]) { + display: flex; + margin: 0; +} + +.card-tags ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-wrap: wrap; + gap: 16px; +} + +[dir=ltr] .card-tags ul li { + padding: 2px 8px; + margin: 0; + box-sizing: border-box; + font-size: 12px; + font-weight: 500; + color: #000; + background-color: rgba(0, 0, 0, 0.12); + border-radius: 16px; + height: 24px; + line-height: 20px; +} + +/************* + Cards - Divider +*/ + +.card-divider { + margin: 0; + padding: 0 16px; +} + +.card-divider hr { + margin: 0; +} diff --git a/docsrc/_static/css/mkdocstrings.css b/docsrc/_static/css/mkdocstrings.css new file mode 100644 index 00000000..4a69994f --- /dev/null +++ b/docsrc/_static/css/mkdocstrings.css @@ -0,0 +1,27 @@ +/* Indentation. */ +div.doc-contents:not(.first) { + padding-left: 25px; + border-left: .05rem solid var(--md-typeset-table-color); +} + +/* Mark external links as such. */ +a.external::after, +a.autorefs-external::after { + /* https://primer.style/octicons/arrow-up-right-24 */ + mask-image: url('data:image/svg+xml,'); + -webkit-mask-image: url('data:image/svg+xml,'); + content: ' '; + + display: inline-block; + vertical-align: middle; + position: relative; + + height: 1em; + width: 1em; + background-color: var(--md-typeset-a-color); +} + +a.external:hover::after, +a.autorefs-external:hover::after { + background-color: var(--md-accent-fg-color); +} diff --git a/docsrc/_static/serializing-a-version-1-0-0.png b/docsrc/_static/serializing-a-version-1-0-0.png deleted file mode 100644 index 975cdfb4920ee6be77a7bb363abd98cff103a510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25962 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 diff --git a/docsrc/_static/serializing-a-version-1-0-0.svg b/docsrc/_static/serializing-a-version-1-0-0.svg index 921a9e15..d50c9955 100644 --- a/docsrc/_static/serializing-a-version-1-0-0.svg +++ b/docsrc/_static/serializing-a-version-1-0-0.svg @@ -1,306 +1,3 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Serialization Formats - - - Version - - major = 1 - minor = 0 - - - patch = 0 - - - - Version Spec - - - bump - - - { - - - m - - - a - - - j - - - o - - - r - - - } - - - . - - - { - - - m - - - i - - - n - - - o - - - r - - - } - - - . - - - { - - - p - - - a - - - t - - - c - - - h - - - } - - {major}.{minor} - - - {major} - - - - 1 - - - . - - - 0 - - - . - - 0 - - - 1.0 - - - - 1 - - - Selected Format - - - - - - - - - - - - - - - - - - - - - serialize - - - +
Version Serialization Formats
Version Serialization Formats
Version
Version
major = 1minor = 0patch = 0Version Specbump
{major}.{minor}.{patch}
{major}.{minor}.{patch}
{major}.{minor}
{major}.{minor}
{major}
{major}
1.0.0
1.0.0
1.0
1.0
1
1
Selected Format
Sele...
serialize
Text is not SVG - cannot display
diff --git a/docsrc/_static/serializing-a-version-1-2-0.png b/docsrc/_static/serializing-a-version-1-2-0.png deleted file mode 100644 index fcf3fa224f3d5e42b6786506d3df751ff9da024b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26157 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 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Serialization Formats - - - Version - - major = 1 - minor = 2 - - - patch = 0 - - - - Version Spec - - - bump - - - { - - - m - - - a - - - j - - - o - - - r - - - } - - - . - - - { - - - m - - - i - - - n - - - o - - - r - - - } - - - . - - - { - - - p - - - a - - - t - - - c - - - h - - - } - - {major}.{minor} - - - {major} - - - - 1 - - - . - - - 2 - - - . - - 0 - - - 1.2 - - - - 1 - - - Selected Format - - - - - - - - - - - - - - - - - - - - - serialize - - - +
Version Serialization Formats
Version Serialization Formats
Version
Version
major = 1minor = 2patch = 0Version Specbump
{major}.{minor}.{patch}
{major}.{minor}.{patch}
{major}.{minor}
{major}.{minor}
{major}
{major}
1.2.0
1.2.0
1.2
1.2
1
1
Selected Format
Sele...
serialize
Text is not SVG - cannot display
diff --git a/docsrc/_static/serializing-a-version-1-2-3.png b/docsrc/_static/serializing-a-version-1-2-3.png deleted file mode 100644 index 18918524b5e014f33e626c83f45f4d46d5ae3561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26003 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
D1}+>Q|AB&pr*~z})tRRVX+fi|NCXf2l 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 diff --git a/docsrc/_static/serializing-a-version-1-2-3.svg b/docsrc/_static/serializing-a-version-1-2-3.svg index 8d26f778..f66754b8 100644 --- a/docsrc/_static/serializing-a-version-1-2-3.svg +++ b/docsrc/_static/serializing-a-version-1-2-3.svg @@ -1,306 +1,3 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Serialization Formats - - - Version - - major = 1 - minor = 2 - - - patch = 3 - - - - Version Spec - - - bump - - - { - - - m - - - a - - - j - - - o - - - r - - - } - - - . - - - { - - - m - - - i - - - n - - - o - - - r - - - } - - - . - - - { - - - p - - - a - - - t - - - c - - - h - - - } - - {major}.{minor} - - - {major} - - - - 1 - - - . - - - 2 - - - . - - 3 - - - 1.2 - - - - 1 - - - Selected Format - - - - - - - - - - - - - - - - - - - - - serialize - - - +
Version Serialization Formats
Version Serialization Formats
Version
Version
major = 1minor = 2patch = 3Version Specbump
{major}.{minor}.{patch}
{major}.{minor}.{patch}
{major}.{minor}
{major}.{minor}
{major}
{major}
1.2.3
1.2.3
1.2
1.2
1
1
Selected Format
Sele...
serialize
Text is not SVG - cannot display
diff --git a/docsrc/_static/serializing-a-version-1.svg b/docsrc/_static/serializing-a-version-1.svg index 45469bb8..66c307f6 100644 --- a/docsrc/_static/serializing-a-version-1.svg +++ b/docsrc/_static/serializing-a-version-1.svg @@ -1,265 +1,3 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Version Serialization Formats - - - Version - - major = 1 - minor = 2 - - - patch = 3 - - - - Version Spec - - - bump - - - { - - - m - - - a - - - j - - - o - - - r - - } - - - {major} - - - - . - - - { - - - m - - - i - - - n - - - o - - - r - - - } - - - serialize - - 1 - - - 1 - - - - . - - - 2 - - - Selected Format - - - - - - - - - - - +
Version Serialization Formats
Version Serialization Formats
Version
Version
major = 1minor = 2patch = 3Version Specbump
{major}
{major}
{major}.{minor}
{major}.{minor}
serialize
1
1
1.2
1.2
Selected Format
Sele...
Text is not SVG - cannot display
diff --git a/docsrc/explanation/index.md b/docsrc/explanation/index.md index 93fbc8ac..b1303b40 100644 --- a/docsrc/explanation/index.md +++ b/docsrc/explanation/index.md @@ -1,8 +1 @@ # Explanation - -```{toctree} ---- -titlesonly: true ---- -mental-model -``` diff --git a/docsrc/explanation/mental-model.md b/docsrc/explanation/mental-model.md index 90be55cf..0a14f5ff 100644 --- a/docsrc/explanation/mental-model.md +++ b/docsrc/explanation/mental-model.md @@ -1,8 +1,8 @@ -# The mental model used by bump-my-version +# The mental model used by Bump My Version ## Overview -There are four main concepts in bump-my-version: +There are four main concepts in Bump My Version: 1. Configuration 2. Version handling @@ -11,19 +11,19 @@ There are four main concepts in bump-my-version: ## Configuration -The predecessor to bump-my-version, [bumpversion](https://github.com/peritus/bumpversion), was designed to have the configuration file optional. All configuration values could be specified on the command line. This only worked in the simplest of version schemes. +The predecessor to Bump My Version, [bumpversion](https://github.com/peritus/bumpversion), was designed to have the configuration file optional. All configuration values could be specified on the command line. This only worked in the simplest of version schemes. -bump-my-version is designed to have a configuration file. The configuration file is required to specify the version scheme. The configuration file is also used to specify the files to change and how to change them. +While Bump My Version can do many things without a configuration file, it is designed to have a configuration file. The configuration file is required to specify the version scheme. The configuration file also specifies the files to change and how to change them. ## Version handling -bump-my-version abstracts the version handling into a few concepts: +Bump My Version abstracts the version handling into a few concepts: -A **version spec** defines all the possible _version component specs_ of a version and how they work together. +A **version spec** defines the rules for incrementing a version. A **version component spec** defines how a single part of a _version spec,_ such as `major`, `minor`, or `patch`, works. It defines the types of values, how to increment the component, and how to reset it. -A **version parser** is a regular expression used in several ways. It's named capture groups define the possible components in a version spec and the order in which they appear. It is also used to parse a version string into a mapping of version component name to value. +A **version parser** is a regular expression used in several ways. Its named capture groups define the possible components in a version spec and the order in which they appear. It also parses a version string into version component names and their values. A **version** is the concrete representation of a _version spec._ It is a mapping of version component names to _version components._ @@ -33,11 +33,14 @@ A **version serialization format** is a list of format strings used to serialize ### How a version spec is generated -:::{figure-md} fig-version-spec -![How a version spec is generated](../_static/creating-a-version-spec.svg) +
+ [![How a version spec is generated](../_static/creating-a-version-spec.svg)](../_static/creating-a-version-spec.svg) +
How a configuration file is used to generate a version spec.
+
+ + + -How a configuration file is used to generate a version spec. -::: The most important part of the configuration file is the _version parser._ It defines the structure of the _version spec._ @@ -46,21 +49,20 @@ If the configuration file contains a _version component spec_ that matches a nam If the configuration file does not contain a _version component spec_ that matches a named capture group in the _version parser,_ then a default _version component spec_ is used. The blue named capture group in the diagram demonstrates this. -The _component dependency_ graph is used to determine the order in which the _version components_ are incremented and reset. For example in the diagram, the `patch` component depends on the `minor` component which depends on the `major` component. Therefore, when the `major` component is incremented, the `minor` component is reset, which cascades to the `patch` component. +The _component dependency_ graph determines the order in which the _version components_ are incremented and reset. For example, in the diagram, the patch component depends on the minor component, which depends on the `major` component. Therefore, when the `major` component is incremented, the `minor` component is reset, which cascades to the `patch` component. ### How a version is generated -:::{figure-md} fig-version -![How a version is generated](../_static/creating-a-version.svg) - -How a version spec is used to generate a version. -::: +
+ [![How a version is generated](../_static/creating-a-version.svg)](../_static/creating-a-version.svg) +
How a version spec is used to generate a version.
+
The _version spec_ has a `create_version` method that takes a mapping of version component names to values. Each _version component spec_ has a `create_component` method that takes a value. The `create_version` method calls the `create_component` method for each _version component spec_ in the _version spec_ with the value from the mapping. -The `create_component` assembles its own _version spec_ with the _version components_ to create a _version._ +The `create_component` assembles its version spec_ with the _version components_ to create a _version._ ### How a version is serialized @@ -68,34 +70,55 @@ The `create_component` assembles its own _version spec_ with the _version compon **Required value rule.** _Version component specs_ is required if its value or the value of any of its dependent components is not optional. -A valid serialization is one that contains all the components in the _version spec_ that are required based on the _required value rule._ +A valid serialization contains all the required components in the version spec based on the _required value rule._ -An invalid serialization is one that does not contain all the components in the _version spec_ that are required based on the _required value rule._ +An invalid serialization does not contain all the required components in the version spec based on the _required value rule._ -An optimal serialization is the valid serialization that uses the fewest components. +The optimal serialization is the valid serialization that uses the fewest components. The `serialize` method of the _version spec_ returns either the optimal serialization or the first invalid serialization. -:::{figure-md} fig-serialize-1-2-3 -![How a version is serialized with values major=1, minor=2, and patch=3](../_static/serializing-a-version-1-2-3.svg) +### Version serialization examples + +::: grid wide-gap + + ::: card-container depth-0 + ::: card-media + [![How a version is serialized with values major=1, minor=2, and patch=3](../_static/serializing-a-version-1-2-3.svg)](../_static/serializing-a-version-1-2-3.svg) + + ::: card-content + No optional values + {.card-content-title} + + In this example, the `major` component is `1`, the `minor` component is `2`, and `patch` component is `3`. Since none of the values are optional (`0`), only one serialization format is valid. This one valid format is the optimal format. -A version with values major=1, minor=2, and patch=3 only has one valid serialization. It is also the optimal serialization. -::: + ::: card-container depth-0 + ::: card-media + [![How a version is serialized with values major=1, minor=2, and patch=0](../_static/serializing-a-version-1-2-0.svg)](../_static/serializing-a-version-1-2-0.svg) + + ::: card-content + + One optional value + {.card-content-title} + + A version with values major=1, minor=2, and patch=0 has two valid serializations. The optimal serialization is the one that uses the fewest components. `1.2` in this example. -:::{figure-md} fig-serialize-1-2-0 -![How a version is serialized with values major=1, minor=2, and patch=0](../_static/serializing-a-version-1-2-0.svg) + ::: card-container depth-0 + ::: card-media + [![How a version is serialized with values major=1, minor=0, and patch=0](../_static/serializing-a-version-1-0-0.svg)](../_static/serializing-a-version-1-0-0.svg) -A version with values major=1, minor=2, and patch=0 has two valid serializations. The optimal serialization is the one that uses the fewest components. `1.2` in this example -::: + ::: card-content + Two optional values + {.card-content-title} -:::{figure-md} fig-serialize-1-0-0 -![How a version is serialized with values major=1, minor=0, and patch=0](../_static/serializing-a-version-1-0-0.svg) + A version with values major=1, minor=0, and patch=0 has three valid serializations. The optimal serialization is the one that uses the fewest components. `1` in this example. -A version with values major=1, minor=0, and patch=0 has three valid serializations. The optimal serialization is the one that uses the fewest components. `1` in this example. -::: + ::: card-container depth-0 + ::: card-media + [![How a version is serialized with invalid serialization formats](../_static/serializing-a-version-1.svg)](../_static/serializing-a-version-1.svg) -:::{figure-md} fig-serialize-1 -![How a version is serialized with invalid serialization formats](../_static/serializing-a-version-1.svg) + ::: card-content + No valid serialization options + {.card-content-title} -A version with values major=1, minor=2, and patch=3 has no valid serializations in this example. The `serialize` method returns the first invalid serialization. -::: + A version with values major=1, minor=2, and patch=3 has no valid serializations in this example. The `serialize` method returns the first invalid serialization. diff --git a/docsrc/gen_doc_stubs.py b/docsrc/gen_doc_stubs.py new file mode 100755 index 00000000..c2a3bf2f --- /dev/null +++ b/docsrc/gen_doc_stubs.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +""" +Generate documentation stubs for the configured package. + +Configuring this script: + + Change the `package_name` variable to the name of the package you want to generate + +Output: + + This script will generate a `reference/api` directory containing documentation stubs for the package. + It will also generate a `reference/api/SUMMARY.md` file that contains the navigation structure for the + documentation. +""" + +from pathlib import Path + +import mkdocs_gen_files + +package_name = "bumpversion" + +nav = mkdocs_gen_files.Nav() +mod_symbol = '' + +src_root = Path(__file__).parent.parent +package_root = src_root / package_name + +for path in sorted(package_root.rglob("*.py")): + module_path = path.relative_to(src_root).with_suffix("") + doc_path = path.relative_to(src_root).with_suffix(".md") + full_doc_path = Path("reference/api", doc_path) + + parts = tuple(module_path.parts) + if parts[-1] == "__init__": + parts = parts[:-1] + doc_path = doc_path.with_name("index.md") + full_doc_path = full_doc_path.with_name("index.md") + elif parts[-1].startswith("_"): + continue + + nav_parts = [f"{mod_symbol} {part}" for part in parts] + nav[tuple(nav_parts)] = doc_path.as_posix() + + with mkdocs_gen_files.open(full_doc_path, "w") as fd: + ident = ".".join(parts) + fd.write(f"::: {ident}") + + mkdocs_gen_files.set_edit_path(full_doc_path, path) + +with mkdocs_gen_files.open("reference/api/SUMMARY.md", "w") as nav_file: + nav_file.writelines(nav.build_literate_nav()) diff --git a/docsrc/howtos/avoid-incorrect-replacements.md b/docsrc/howtos/avoid-incorrect-replacements.md index 9f5d7f77..c7997fbb 100644 --- a/docsrc/howtos/avoid-incorrect-replacements.md +++ b/docsrc/howtos/avoid-incorrect-replacements.md @@ -1,6 +1,6 @@ # Avoiding incorrect replacements -In files that have multiple version strings, bump-my-version may find the wrong string and replace it. Given this `requirements.txt` for `MyProject`: +In files that have multiple version strings, Bump My Version may find the wrong string and replace it. Given this `requirements.txt` for `MyProject`: ```text Django>=1.5.6,<1.6 diff --git a/docsrc/howtos/custom-version-formats-by-file.md b/docsrc/howtos/custom-version-formats-by-file.md index 07f93d5e..fdbb2c22 100644 --- a/docsrc/howtos/custom-version-formats-by-file.md +++ b/docsrc/howtos/custom-version-formats-by-file.md @@ -22,7 +22,7 @@ require ( stable: "v2.21.4" ``` -You can use bump-my-version to maintain the major version number within the `go.mod` file by using the `parse` and `serialize` options, as in this example: +You can use Bump My Version to maintain the major version number within the `go.mod` file by using the `parse` and `serialize` options, as in this example: `.bumpversion.toml` file: diff --git a/docsrc/howtos/index.md b/docsrc/howtos/index.md index d9c5e687..869c35ee 100644 --- a/docsrc/howtos/index.md +++ b/docsrc/howtos/index.md @@ -1,9 +1,6 @@ # How-To Guides - -```{toctree} -avoid-incorrect-replacements -custom-version-formats-by-file -multiple-replacements -``` +- [Avoid incorrect replacements](avoid-incorrect-replacements.md) +- [Custom version formats by file](custom-version-formats-by-file.md) +- [Multiple replacements](multiple-replacements.md) diff --git a/docsrc/reference/bumpversion/bumpversion.__main__.md b/docsrc/reference/bumpversion/bumpversion.__main__.md deleted file mode 100644 index 7807c995..00000000 --- a/docsrc/reference/bumpversion/bumpversion.__main__.md +++ /dev/null @@ -1,9 +0,0 @@ -# {py:mod}`bumpversion.__main__` - -```{py:module} bumpversion.__main__ -``` - -```{autodoc2-docstring} bumpversion.__main__ -:parser: myst -:allowtitles: -``` diff --git a/docsrc/reference/bumpversion/bumpversion.aliases.md b/docsrc/reference/bumpversion/bumpversion.aliases.md deleted file mode 100644 index 0de83671..00000000 --- a/docsrc/reference/bumpversion/bumpversion.aliases.md +++ /dev/null @@ -1,62 +0,0 @@ -# {py:mod}`bumpversion.aliases` - -```{py:module} bumpversion.aliases -``` - -```{autodoc2-docstring} bumpversion.aliases -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`AliasedGroup ` - - ```{autodoc2-docstring} bumpversion.aliases.AliasedGroup - :parser: myst - :summary: - ``` -```` - -### API - -`````{py:class} AliasedGroup(*args: typing.Any, **kwargs: typing.Any) -:canonical: bumpversion.aliases.AliasedGroup - -Bases: {py:obj}`rich_click.rich_group.RichGroup` - -```{autodoc2-docstring} bumpversion.aliases.AliasedGroup -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.aliases.AliasedGroup.__init__ -:parser: myst -``` - -````{py:method} get_command(ctx: click.Context, cmd_name: str) -> typing.Optional[rich_click.Command] -:canonical: bumpversion.aliases.AliasedGroup.get_command - -```{autodoc2-docstring} bumpversion.aliases.AliasedGroup.get_command -:parser: myst -``` - -```` - -````{py:method} resolve_command(ctx: click.Context, args: typing.List[str]) -> tuple -:canonical: bumpversion.aliases.AliasedGroup.resolve_command - -```{autodoc2-docstring} bumpversion.aliases.AliasedGroup.resolve_command -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.autocast.md b/docsrc/reference/bumpversion/bumpversion.autocast.md deleted file mode 100644 index 065330d3..00000000 --- a/docsrc/reference/bumpversion/bumpversion.autocast.md +++ /dev/null @@ -1,73 +0,0 @@ -# {py:mod}`bumpversion.autocast` - -```{py:module} bumpversion.autocast -``` - -```{autodoc2-docstring} bumpversion.autocast -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`boolify ` - - ```{autodoc2-docstring} bumpversion.autocast.boolify - :parser: myst - :summary: - ``` -* - {py:obj}`noneify ` - - ```{autodoc2-docstring} bumpversion.autocast.noneify - :parser: myst - :summary: - ``` -* - {py:obj}`listify ` - - ```{autodoc2-docstring} bumpversion.autocast.listify - :parser: myst - :summary: - ``` -* - {py:obj}`autocast_value ` - - ```{autodoc2-docstring} bumpversion.autocast.autocast_value - :parser: myst - :summary: - ``` -```` - -### API - -````{py:function} boolify(s: str) -> bool -:canonical: bumpversion.autocast.boolify - -```{autodoc2-docstring} bumpversion.autocast.boolify -:parser: myst -``` -```` - -````{py:function} noneify(s: str) -> None -:canonical: bumpversion.autocast.noneify - -```{autodoc2-docstring} bumpversion.autocast.noneify -:parser: myst -``` -```` - -````{py:function} listify(s: str) -> list -:canonical: bumpversion.autocast.listify - -```{autodoc2-docstring} bumpversion.autocast.listify -:parser: myst -``` -```` - -````{py:function} autocast_value(var: typing.Any) -> typing.Any -:canonical: bumpversion.autocast.autocast_value - -```{autodoc2-docstring} bumpversion.autocast.autocast_value -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.bump.md b/docsrc/reference/bumpversion/bumpversion.bump.md deleted file mode 100644 index 3cf4358c..00000000 --- a/docsrc/reference/bumpversion/bumpversion.bump.md +++ /dev/null @@ -1,84 +0,0 @@ -# {py:mod}`bumpversion.bump` - -```{py:module} bumpversion.bump -``` - -```{autodoc2-docstring} bumpversion.bump -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`get_next_version ` - - ```{autodoc2-docstring} bumpversion.bump.get_next_version - :parser: myst - :summary: - ``` -* - {py:obj}`do_bump ` - - ```{autodoc2-docstring} bumpversion.bump.do_bump - :parser: myst - :summary: - ``` -* - {py:obj}`commit_and_tag ` - - ```{autodoc2-docstring} bumpversion.bump.commit_and_tag - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.bump.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.bump.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.bump.logger -:parser: myst -``` - -```` - -````{py:function} get_next_version(current_version: bumpversion.versioning.models.Version, config: bumpversion.config.Config, version_part: typing.Optional[str], new_version: typing.Optional[str]) -> bumpversion.versioning.models.Version -:canonical: bumpversion.bump.get_next_version - -```{autodoc2-docstring} bumpversion.bump.get_next_version -:parser: myst -``` -```` - -````{py:function} do_bump(version_part: typing.Optional[str], new_version: typing.Optional[str], config: bumpversion.config.Config, config_file: typing.Optional[pathlib.Path] = None, dry_run: bool = False) -> None -:canonical: bumpversion.bump.do_bump - -```{autodoc2-docstring} bumpversion.bump.do_bump -:parser: myst -``` -```` - -````{py:function} commit_and_tag(config: bumpversion.config.Config, config_file: typing.Optional[pathlib.Path], configured_files: typing.List[bumpversion.files.ConfiguredFile], ctx: typing.ChainMap, dry_run: bool = False) -> None -:canonical: bumpversion.bump.commit_and_tag - -```{autodoc2-docstring} bumpversion.bump.commit_and_tag -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.cli.md b/docsrc/reference/bumpversion/bumpversion.cli.md deleted file mode 100644 index 87d44c40..00000000 --- a/docsrc/reference/bumpversion/bumpversion.cli.md +++ /dev/null @@ -1,123 +0,0 @@ -# {py:mod}`bumpversion.cli` - -```{py:module} bumpversion.cli -``` - -```{autodoc2-docstring} bumpversion.cli -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`cli ` - - ```{autodoc2-docstring} bumpversion.cli.cli - :parser: myst - :summary: - ``` -* - {py:obj}`bump ` - - ```{autodoc2-docstring} bumpversion.cli.bump - :parser: myst - :summary: - ``` -* - {py:obj}`show ` - - ```{autodoc2-docstring} bumpversion.cli.show - :parser: myst - :summary: - ``` -* - {py:obj}`replace ` - - ```{autodoc2-docstring} bumpversion.cli.replace - :parser: myst - :summary: - ``` -* - {py:obj}`sample_config ` - - ```{autodoc2-docstring} bumpversion.cli.sample_config - :parser: myst - :summary: - ``` -* - {py:obj}`show_bump ` - - ```{autodoc2-docstring} bumpversion.cli.show_bump - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.cli.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.cli.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.cli.logger -:parser: myst -``` - -```` - -````{py:function} cli(ctx: click.core.Context) -> None -:canonical: bumpversion.cli.cli - -```{autodoc2-docstring} bumpversion.cli.cli -:parser: myst -``` -```` - -````{py:function} bump(args: list, config_file: typing.Optional[str], verbose: int, allow_dirty: typing.Optional[bool], current_version: typing.Optional[str], new_version: typing.Optional[str], parse: typing.Optional[str], serialize: typing.Optional[typing.List[str]], search: typing.Optional[str], replace: typing.Optional[str], regex: typing.Optional[bool], no_configured_files: bool, ignore_missing_version: bool, dry_run: bool, commit: typing.Optional[bool], tag: typing.Optional[bool], sign_tags: typing.Optional[bool], tag_name: typing.Optional[str], tag_message: typing.Optional[str], message: typing.Optional[str], commit_args: typing.Optional[str], show_list: bool) -> None -:canonical: bumpversion.cli.bump - -```{autodoc2-docstring} bumpversion.cli.bump -:parser: myst -``` -```` - -````{py:function} show(args: typing.List[str], config_file: typing.Optional[str], format_: str, increment: typing.Optional[str]) -> None -:canonical: bumpversion.cli.show - -```{autodoc2-docstring} bumpversion.cli.show -:parser: myst -``` -```` - -````{py:function} replace(files: list, config_file: typing.Optional[str], verbose: int, allow_dirty: typing.Optional[bool], current_version: typing.Optional[str], new_version: typing.Optional[str], parse: typing.Optional[str], serialize: typing.Optional[typing.List[str]], search: typing.Optional[str], replace: typing.Optional[str], regex: bool, no_configured_files: bool, ignore_missing_version: bool, dry_run: bool) -> None -:canonical: bumpversion.cli.replace - -```{autodoc2-docstring} bumpversion.cli.replace -:parser: myst -``` -```` - -````{py:function} sample_config(prompt: bool, destination: str) -> None -:canonical: bumpversion.cli.sample_config - -```{autodoc2-docstring} bumpversion.cli.sample_config -:parser: myst -``` -```` - -````{py:function} show_bump(version: str, config_file: typing.Optional[str], ascii: bool) -> None -:canonical: bumpversion.cli.show_bump - -```{autodoc2-docstring} bumpversion.cli.show_bump -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.config.create.md b/docsrc/reference/bumpversion/bumpversion.config.create.md deleted file mode 100644 index 18cee559..00000000 --- a/docsrc/reference/bumpversion/bumpversion.config.create.md +++ /dev/null @@ -1,47 +0,0 @@ -# {py:mod}`bumpversion.config.create` - -```{py:module} bumpversion.config.create -``` - -```{autodoc2-docstring} bumpversion.config.create -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`create_configuration ` - - ```{autodoc2-docstring} bumpversion.config.create.create_configuration - :parser: myst - :summary: - ``` -* - {py:obj}`get_defaults_from_dest ` - - ```{autodoc2-docstring} bumpversion.config.create.get_defaults_from_dest - :parser: myst - :summary: - ``` -```` - -### API - -````{py:function} create_configuration(destination: str, prompt: bool) -> tomlkit.TOMLDocument -:canonical: bumpversion.config.create.create_configuration - -```{autodoc2-docstring} bumpversion.config.create.create_configuration -:parser: myst -``` -```` - -````{py:function} get_defaults_from_dest(destination: str) -> typing.Tuple[dict, tomlkit.TOMLDocument] -:canonical: bumpversion.config.create.get_defaults_from_dest - -```{autodoc2-docstring} bumpversion.config.create.get_defaults_from_dest -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.config.files.md b/docsrc/reference/bumpversion/bumpversion.config.files.md deleted file mode 100644 index c32aff82..00000000 --- a/docsrc/reference/bumpversion/bumpversion.config.files.md +++ /dev/null @@ -1,113 +0,0 @@ -# {py:mod}`bumpversion.config.files` - -```{py:module} bumpversion.config.files -``` - -```{autodoc2-docstring} bumpversion.config.files -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`find_config_file ` - - ```{autodoc2-docstring} bumpversion.config.files.find_config_file - :parser: myst - :summary: - ``` -* - {py:obj}`read_config_file ` - - ```{autodoc2-docstring} bumpversion.config.files.read_config_file - :parser: myst - :summary: - ``` -* - {py:obj}`read_toml_file ` - - ```{autodoc2-docstring} bumpversion.config.files.read_toml_file - :parser: myst - :summary: - ``` -* - {py:obj}`update_config_file ` - - ```{autodoc2-docstring} bumpversion.config.files.update_config_file - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.config.files.logger - :parser: myst - :summary: - ``` -* - {py:obj}`CONFIG_FILE_SEARCH_ORDER ` - - ```{autodoc2-docstring} bumpversion.config.files.CONFIG_FILE_SEARCH_ORDER - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.config.files.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.config.files.logger -:parser: myst -``` - -```` - -````{py:data} CONFIG_FILE_SEARCH_ORDER -:canonical: bumpversion.config.files.CONFIG_FILE_SEARCH_ORDER -:value: > - ('.bumpversion.cfg', '.bumpversion.toml', 'setup.cfg', 'pyproject.toml') - -```{autodoc2-docstring} bumpversion.config.files.CONFIG_FILE_SEARCH_ORDER -:parser: myst -``` - -```` - -````{py:function} find_config_file(explicit_file: typing.Union[str, pathlib.Path, None] = None) -> typing.Union[pathlib.Path, None] -:canonical: bumpversion.config.files.find_config_file - -```{autodoc2-docstring} bumpversion.config.files.find_config_file -:parser: myst -``` -```` - -````{py:function} read_config_file(config_file: typing.Union[str, pathlib.Path, None] = None) -> typing.Dict[str, typing.Any] -:canonical: bumpversion.config.files.read_config_file - -```{autodoc2-docstring} bumpversion.config.files.read_config_file -:parser: myst -``` -```` - -````{py:function} read_toml_file(file_path: pathlib.Path) -> typing.Dict[str, typing.Any] -:canonical: bumpversion.config.files.read_toml_file - -```{autodoc2-docstring} bumpversion.config.files.read_toml_file -:parser: myst -``` -```` - -````{py:function} update_config_file(config_file: typing.Union[str, pathlib.Path], config: bumpversion.config.models.Config, current_version: bumpversion.versioning.models.Version, new_version: bumpversion.versioning.models.Version, context: typing.MutableMapping, dry_run: bool = False) -> None -:canonical: bumpversion.config.files.update_config_file - -```{autodoc2-docstring} bumpversion.config.files.update_config_file -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.config.files_legacy.md b/docsrc/reference/bumpversion/bumpversion.config.files_legacy.md deleted file mode 100644 index 69a0c19f..00000000 --- a/docsrc/reference/bumpversion/bumpversion.config.files_legacy.md +++ /dev/null @@ -1,71 +0,0 @@ -# {py:mod}`bumpversion.config.files_legacy` - -```{py:module} bumpversion.config.files_legacy -``` - -```{autodoc2-docstring} bumpversion.config.files_legacy -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`read_ini_file ` - - ```{autodoc2-docstring} bumpversion.config.files_legacy.read_ini_file - :parser: myst - :summary: - ``` -* - {py:obj}`update_ini_config_file ` - - ```{autodoc2-docstring} bumpversion.config.files_legacy.update_ini_config_file - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.config.files_legacy.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.config.files_legacy.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.config.files_legacy.logger -:parser: myst -``` - -```` - -````{py:function} read_ini_file(file_path: pathlib.Path) -> typing.Dict[str, typing.Any] -:canonical: bumpversion.config.files_legacy.read_ini_file - -```{autodoc2-docstring} bumpversion.config.files_legacy.read_ini_file -:parser: myst -``` -```` - -````{py:function} update_ini_config_file(config_file: typing.Union[str, pathlib.Path], current_version: str, new_version: str, dry_run: bool = False) -> None -:canonical: bumpversion.config.files_legacy.update_ini_config_file - -```{autodoc2-docstring} bumpversion.config.files_legacy.update_ini_config_file -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.config.md b/docsrc/reference/bumpversion/bumpversion.config.md deleted file mode 100644 index 60a744d0..00000000 --- a/docsrc/reference/bumpversion/bumpversion.config.md +++ /dev/null @@ -1,100 +0,0 @@ -# {py:mod}`bumpversion.config` - -```{py:module} bumpversion.config -``` - -```{autodoc2-docstring} bumpversion.config -:parser: myst -:allowtitles: -``` - -## Submodules - -```{toctree} -:titlesonly: -:maxdepth: 1 - -bumpversion.config.files -bumpversion.config.models -bumpversion.config.create -bumpversion.config.files_legacy -bumpversion.config.utils -``` - -## Package Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`get_configuration ` - - ```{autodoc2-docstring} bumpversion.config.get_configuration - :parser: myst - :summary: - ``` -* - {py:obj}`check_current_version ` - - ```{autodoc2-docstring} bumpversion.config.check_current_version - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.config.logger - :parser: myst - :summary: - ``` -* - {py:obj}`DEFAULTS ` - - ```{autodoc2-docstring} bumpversion.config.DEFAULTS - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.config.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.config.logger -:parser: myst -``` - -```` - -````{py:data} DEFAULTS -:canonical: bumpversion.config.DEFAULTS -:value: > - None - -```{autodoc2-docstring} bumpversion.config.DEFAULTS -:parser: myst -``` - -```` - -````{py:function} get_configuration(config_file: typing.Union[str, pathlib.Path, None] = None, **overrides) -> bumpversion.config.models.Config -:canonical: bumpversion.config.get_configuration - -```{autodoc2-docstring} bumpversion.config.get_configuration -:parser: myst -``` -```` - -````{py:function} check_current_version(config: bumpversion.config.models.Config) -> str -:canonical: bumpversion.config.check_current_version - -```{autodoc2-docstring} bumpversion.config.check_current_version -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.config.models.md b/docsrc/reference/bumpversion/bumpversion.config.models.md deleted file mode 100644 index 18034e92..00000000 --- a/docsrc/reference/bumpversion/bumpversion.config.models.md +++ /dev/null @@ -1,537 +0,0 @@ -# {py:mod}`bumpversion.config.models` - -```{py:module} bumpversion.config.models -``` - -```{autodoc2-docstring} bumpversion.config.models -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`FileChange ` - - ```{autodoc2-docstring} bumpversion.config.models.FileChange - :parser: myst - :summary: - ``` -* - {py:obj}`Config ` - - ```{autodoc2-docstring} bumpversion.config.models.Config - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.config.models.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.config.models.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.config.models.logger -:parser: myst -``` - -```` - -`````{py:class} FileChange(**data: typing.Any) -:canonical: bumpversion.config.models.FileChange - -Bases: {py:obj}`pydantic.BaseModel` - -```{autodoc2-docstring} bumpversion.config.models.FileChange -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.config.models.FileChange.__init__ -:parser: myst -``` - -````{py:attribute} parse -:canonical: bumpversion.config.models.FileChange.parse -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.parse -:parser: myst -``` - -```` - -````{py:attribute} serialize -:canonical: bumpversion.config.models.FileChange.serialize -:type: tuple -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.serialize -:parser: myst -``` - -```` - -````{py:attribute} search -:canonical: bumpversion.config.models.FileChange.search -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.search -:parser: myst -``` - -```` - -````{py:attribute} replace -:canonical: bumpversion.config.models.FileChange.replace -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.replace -:parser: myst -``` - -```` - -````{py:attribute} regex -:canonical: bumpversion.config.models.FileChange.regex -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.regex -:parser: myst -``` - -```` - -````{py:attribute} ignore_missing_version -:canonical: bumpversion.config.models.FileChange.ignore_missing_version -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.ignore_missing_version -:parser: myst -``` - -```` - -````{py:attribute} filename -:canonical: bumpversion.config.models.FileChange.filename -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.filename -:parser: myst -``` - -```` - -````{py:attribute} glob -:canonical: bumpversion.config.models.FileChange.glob -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.glob -:parser: myst -``` - -```` - -````{py:attribute} key_path -:canonical: bumpversion.config.models.FileChange.key_path -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.FileChange.key_path -:parser: myst -``` - -```` - -````{py:method} __hash__() -:canonical: bumpversion.config.models.FileChange.__hash__ - -```{autodoc2-docstring} bumpversion.config.models.FileChange.__hash__ -:parser: myst -``` - -```` - -````{py:method} get_search_pattern(context: typing.MutableMapping) -> typing.Tuple[re.Pattern, str] -:canonical: bumpversion.config.models.FileChange.get_search_pattern - -```{autodoc2-docstring} bumpversion.config.models.FileChange.get_search_pattern -:parser: myst -``` - -```` - -````` - -`````{py:class} Config(_case_sensitive: bool | None = None, _env_prefix: str | None = None, _env_file: pydantic_settings.sources.DotenvType | None = ENV_FILE_SENTINEL, _env_file_encoding: str | None = None, _env_nested_delimiter: str | None = None, _secrets_dir: str | pathlib.Path | None = None, **values: typing.Any) -:canonical: bumpversion.config.models.Config - -Bases: {py:obj}`pydantic_settings.BaseSettings` - -```{autodoc2-docstring} bumpversion.config.models.Config -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.config.models.Config.__init__ -:parser: myst -``` - -````{py:attribute} current_version -:canonical: bumpversion.config.models.Config.current_version -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.current_version -:parser: myst -``` - -```` - -````{py:attribute} parse -:canonical: bumpversion.config.models.Config.parse -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.parse -:parser: myst -``` - -```` - -````{py:attribute} serialize -:canonical: bumpversion.config.models.Config.serialize -:type: tuple -:value: > - 'Field(...)' - -```{autodoc2-docstring} bumpversion.config.models.Config.serialize -:parser: myst -``` - -```` - -````{py:attribute} search -:canonical: bumpversion.config.models.Config.search -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.search -:parser: myst -``` - -```` - -````{py:attribute} replace -:canonical: bumpversion.config.models.Config.replace -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.replace -:parser: myst -``` - -```` - -````{py:attribute} regex -:canonical: bumpversion.config.models.Config.regex -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.regex -:parser: myst -``` - -```` - -````{py:attribute} ignore_missing_version -:canonical: bumpversion.config.models.Config.ignore_missing_version -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.ignore_missing_version -:parser: myst -``` - -```` - -````{py:attribute} tag -:canonical: bumpversion.config.models.Config.tag -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.tag -:parser: myst -``` - -```` - -````{py:attribute} sign_tags -:canonical: bumpversion.config.models.Config.sign_tags -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.sign_tags -:parser: myst -``` - -```` - -````{py:attribute} tag_name -:canonical: bumpversion.config.models.Config.tag_name -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.tag_name -:parser: myst -``` - -```` - -````{py:attribute} tag_message -:canonical: bumpversion.config.models.Config.tag_message -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.tag_message -:parser: myst -``` - -```` - -````{py:attribute} allow_dirty -:canonical: bumpversion.config.models.Config.allow_dirty -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.allow_dirty -:parser: myst -``` - -```` - -````{py:attribute} commit -:canonical: bumpversion.config.models.Config.commit -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.commit -:parser: myst -``` - -```` - -````{py:attribute} message -:canonical: bumpversion.config.models.Config.message -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.message -:parser: myst -``` - -```` - -````{py:attribute} commit_args -:canonical: bumpversion.config.models.Config.commit_args -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.commit_args -:parser: myst -``` - -```` - -````{py:attribute} scm_info -:canonical: bumpversion.config.models.Config.scm_info -:type: typing.Optional[bumpversion.scm.SCMInfo] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.scm_info -:parser: myst -``` - -```` - -````{py:attribute} parts -:canonical: bumpversion.config.models.Config.parts -:type: typing.Dict[str, bumpversion.versioning.models.VersionComponentSpec] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config.parts -:parser: myst -``` - -```` - -````{py:attribute} files -:canonical: bumpversion.config.models.Config.files -:type: typing.List[bumpversion.config.models.FileChange] -:value: > - 'Field(...)' - -```{autodoc2-docstring} bumpversion.config.models.Config.files -:parser: myst -``` - -```` - -````{py:attribute} included_paths -:canonical: bumpversion.config.models.Config.included_paths -:type: typing.List[str] -:value: > - 'Field(...)' - -```{autodoc2-docstring} bumpversion.config.models.Config.included_paths -:parser: myst -``` - -```` - -````{py:attribute} excluded_paths -:canonical: bumpversion.config.models.Config.excluded_paths -:type: typing.List[str] -:value: > - 'Field(...)' - -```{autodoc2-docstring} bumpversion.config.models.Config.excluded_paths -:parser: myst -``` - -```` - -````{py:attribute} model_config -:canonical: bumpversion.config.models.Config.model_config -:value: > - 'SettingsConfigDict(...)' - -```{autodoc2-docstring} bumpversion.config.models.Config.model_config -:parser: myst -``` - -```` - -````{py:attribute} _resolved_filemap -:canonical: bumpversion.config.models.Config._resolved_filemap -:type: typing.Optional[typing.Dict[str, typing.List[bumpversion.config.models.FileChange]]] -:value: > - None - -```{autodoc2-docstring} bumpversion.config.models.Config._resolved_filemap -:parser: myst -``` - -```` - -````{py:method} add_files(filename: typing.Union[str, typing.List[str]]) -> None -:canonical: bumpversion.config.models.Config.add_files - -```{autodoc2-docstring} bumpversion.config.models.Config.add_files -:parser: myst -``` - -```` - -````{py:property} resolved_filemap -:canonical: bumpversion.config.models.Config.resolved_filemap -:type: typing.Dict[str, typing.List[bumpversion.config.models.FileChange]] - -```{autodoc2-docstring} bumpversion.config.models.Config.resolved_filemap -:parser: myst -``` - -```` - -````{py:method} _resolve_filemap() -> typing.Dict[str, typing.List[bumpversion.config.models.FileChange]] -:canonical: bumpversion.config.models.Config._resolve_filemap - -```{autodoc2-docstring} bumpversion.config.models.Config._resolve_filemap -:parser: myst -``` - -```` - -````{py:property} files_to_modify -:canonical: bumpversion.config.models.Config.files_to_modify -:type: typing.List[bumpversion.config.models.FileChange] - -```{autodoc2-docstring} bumpversion.config.models.Config.files_to_modify -:parser: myst -``` - -```` - -````{py:property} version_config -:canonical: bumpversion.config.models.Config.version_config -:type: bumpversion.version_part.VersionConfig - -```{autodoc2-docstring} bumpversion.config.models.Config.version_config -:parser: myst -``` - -```` - -````{py:method} version_spec(version: typing.Optional[str] = None) -> bumpversion.versioning.models.VersionSpec -:canonical: bumpversion.config.models.Config.version_spec - -```{autodoc2-docstring} bumpversion.config.models.Config.version_spec -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.config.utils.md b/docsrc/reference/bumpversion/bumpversion.config.utils.md deleted file mode 100644 index e0c481fd..00000000 --- a/docsrc/reference/bumpversion/bumpversion.config.utils.md +++ /dev/null @@ -1,60 +0,0 @@ -# {py:mod}`bumpversion.config.utils` - -```{py:module} bumpversion.config.utils -``` - -```{autodoc2-docstring} bumpversion.config.utils -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`get_all_file_configs ` - - ```{autodoc2-docstring} bumpversion.config.utils.get_all_file_configs - :parser: myst - :summary: - ``` -* - {py:obj}`get_all_part_configs ` - - ```{autodoc2-docstring} bumpversion.config.utils.get_all_part_configs - :parser: myst - :summary: - ``` -* - {py:obj}`resolve_glob_files ` - - ```{autodoc2-docstring} bumpversion.config.utils.resolve_glob_files - :parser: myst - :summary: - ``` -```` - -### API - -````{py:function} get_all_file_configs(config_dict: dict) -> typing.List[bumpversion.config.models.FileChange] -:canonical: bumpversion.config.utils.get_all_file_configs - -```{autodoc2-docstring} bumpversion.config.utils.get_all_file_configs -:parser: myst -``` -```` - -````{py:function} get_all_part_configs(config_dict: dict) -> typing.Dict[str, bumpversion.versioning.models.VersionComponentSpec] -:canonical: bumpversion.config.utils.get_all_part_configs - -```{autodoc2-docstring} bumpversion.config.utils.get_all_part_configs -:parser: myst -``` -```` - -````{py:function} resolve_glob_files(file_cfg: bumpversion.config.models.FileChange) -> typing.List[bumpversion.config.models.FileChange] -:canonical: bumpversion.config.utils.resolve_glob_files - -```{autodoc2-docstring} bumpversion.config.utils.resolve_glob_files -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.exceptions.md b/docsrc/reference/bumpversion/bumpversion.exceptions.md deleted file mode 100644 index 9aabf6b0..00000000 --- a/docsrc/reference/bumpversion/bumpversion.exceptions.md +++ /dev/null @@ -1,175 +0,0 @@ -# {py:mod}`bumpversion.exceptions` - -```{py:module} bumpversion.exceptions -``` - -```{autodoc2-docstring} bumpversion.exceptions -:parser: myst -:allowtitles: -``` - -## Module Contents - -### API - -````{py:exception} BumpVersionError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.BumpVersionError - -Bases: {py:obj}`click.UsageError` - -```{autodoc2-docstring} bumpversion.exceptions.BumpVersionError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.BumpVersionError.__init__ -:parser: myst -``` - -```` - -````{py:exception} FormattingError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.FormattingError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.FormattingError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.FormattingError.__init__ -:parser: myst -``` - -```` - -````{py:exception} MissingValueError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.MissingValueError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.MissingValueError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.MissingValueError.__init__ -:parser: myst -``` - -```` - -````{py:exception} DirtyWorkingDirectoryError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.DirtyWorkingDirectoryError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.DirtyWorkingDirectoryError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.DirtyWorkingDirectoryError.__init__ -:parser: myst -``` - -```` - -````{py:exception} SignedTagsError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.SignedTagsError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.SignedTagsError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.SignedTagsError.__init__ -:parser: myst -``` - -```` - -````{py:exception} VersionNotFoundError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.VersionNotFoundError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.VersionNotFoundError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.VersionNotFoundError.__init__ -:parser: myst -``` - -```` - -````{py:exception} InvalidVersionPartError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.InvalidVersionPartError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.InvalidVersionPartError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.InvalidVersionPartError.__init__ -:parser: myst -``` - -```` - -````{py:exception} ConfigurationError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.ConfigurationError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.ConfigurationError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.ConfigurationError.__init__ -:parser: myst -``` - -```` - -````{py:exception} BadInputError(message: str, ctx: typing.Optional[click.Context] = None) -:canonical: bumpversion.exceptions.BadInputError - -Bases: {py:obj}`bumpversion.exceptions.BumpVersionError` - -```{autodoc2-docstring} bumpversion.exceptions.BadInputError -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.exceptions.BadInputError.__init__ -:parser: myst -``` - -```` diff --git a/docsrc/reference/bumpversion/bumpversion.files.md b/docsrc/reference/bumpversion/bumpversion.files.md deleted file mode 100644 index 66835fb7..00000000 --- a/docsrc/reference/bumpversion/bumpversion.files.md +++ /dev/null @@ -1,241 +0,0 @@ -# {py:mod}`bumpversion.files` - -```{py:module} bumpversion.files -``` - -```{autodoc2-docstring} bumpversion.files -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`ConfiguredFile ` - - ```{autodoc2-docstring} bumpversion.files.ConfiguredFile - :parser: myst - :summary: - ``` -* - {py:obj}`FileUpdater ` - - ```{autodoc2-docstring} bumpversion.files.FileUpdater - :parser: myst - :summary: - ``` -* - {py:obj}`DataFileUpdater ` - - ```{autodoc2-docstring} bumpversion.files.DataFileUpdater - :parser: myst - :summary: - ``` -```` - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`contains_pattern ` - - ```{autodoc2-docstring} bumpversion.files.contains_pattern - :parser: myst - :summary: - ``` -* - {py:obj}`log_changes ` - - ```{autodoc2-docstring} bumpversion.files.log_changes - :parser: myst - :summary: - ``` -* - {py:obj}`resolve_file_config ` - - ```{autodoc2-docstring} bumpversion.files.resolve_file_config - :parser: myst - :summary: - ``` -* - {py:obj}`modify_files ` - - ```{autodoc2-docstring} bumpversion.files.modify_files - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.files.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.files.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.files.logger -:parser: myst -``` - -```` - -````{py:function} contains_pattern(search: re.Pattern, contents: str) -> bool -:canonical: bumpversion.files.contains_pattern - -```{autodoc2-docstring} bumpversion.files.contains_pattern -:parser: myst -``` -```` - -````{py:function} log_changes(file_path: str, file_content_before: str, file_content_after: str, dry_run: bool = False) -> None -:canonical: bumpversion.files.log_changes - -```{autodoc2-docstring} bumpversion.files.log_changes -:parser: myst -``` -```` - -`````{py:class} ConfiguredFile(file_change: bumpversion.config.models.FileChange, version_config: bumpversion.version_part.VersionConfig, search: typing.Optional[str] = None, replace: typing.Optional[str] = None) -:canonical: bumpversion.files.ConfiguredFile - -```{autodoc2-docstring} bumpversion.files.ConfiguredFile -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.files.ConfiguredFile.__init__ -:parser: myst -``` - -````{py:method} get_file_contents() -> str -:canonical: bumpversion.files.ConfiguredFile.get_file_contents - -```{autodoc2-docstring} bumpversion.files.ConfiguredFile.get_file_contents -:parser: myst -``` - -```` - -````{py:method} write_file_contents(contents: str) -> None -:canonical: bumpversion.files.ConfiguredFile.write_file_contents - -```{autodoc2-docstring} bumpversion.files.ConfiguredFile.write_file_contents -:parser: myst -``` - -```` - -````{py:method} _contains_change_pattern(search_expression: re.Pattern, raw_search_expression: str, version: bumpversion.versioning.models.Version, context: typing.MutableMapping) -> bool -:canonical: bumpversion.files.ConfiguredFile._contains_change_pattern - -```{autodoc2-docstring} bumpversion.files.ConfiguredFile._contains_change_pattern -:parser: myst -``` - -```` - -````{py:method} make_file_change(current_version: bumpversion.versioning.models.Version, new_version: bumpversion.versioning.models.Version, context: typing.MutableMapping, dry_run: bool = False) -> None -:canonical: bumpversion.files.ConfiguredFile.make_file_change - -```{autodoc2-docstring} bumpversion.files.ConfiguredFile.make_file_change -:parser: myst -``` - -```` - -````{py:method} __str__() -> str -:canonical: bumpversion.files.ConfiguredFile.__str__ - -```` - -````{py:method} __repr__() -> str -:canonical: bumpversion.files.ConfiguredFile.__repr__ - -```` - -````` - -````{py:function} resolve_file_config(files: typing.List[bumpversion.config.models.FileChange], version_config: bumpversion.version_part.VersionConfig, search: typing.Optional[str] = None, replace: typing.Optional[str] = None) -> typing.List[bumpversion.files.ConfiguredFile] -:canonical: bumpversion.files.resolve_file_config - -```{autodoc2-docstring} bumpversion.files.resolve_file_config -:parser: myst -``` -```` - -````{py:function} modify_files(files: typing.List[bumpversion.files.ConfiguredFile], current_version: bumpversion.versioning.models.Version, new_version: bumpversion.versioning.models.Version, context: typing.MutableMapping, dry_run: bool = False) -> None -:canonical: bumpversion.files.modify_files - -```{autodoc2-docstring} bumpversion.files.modify_files -:parser: myst -``` -```` - -`````{py:class} FileUpdater(file_change: bumpversion.config.models.FileChange, version_config: bumpversion.version_part.VersionConfig, search: typing.Optional[str] = None, replace: typing.Optional[str] = None) -:canonical: bumpversion.files.FileUpdater - -```{autodoc2-docstring} bumpversion.files.FileUpdater -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.files.FileUpdater.__init__ -:parser: myst -``` - -````{py:method} update_file(current_version: bumpversion.versioning.models.Version, new_version: bumpversion.versioning.models.Version, context: typing.MutableMapping, dry_run: bool = False) -> None -:canonical: bumpversion.files.FileUpdater.update_file - -```{autodoc2-docstring} bumpversion.files.FileUpdater.update_file -:parser: myst -``` - -```` - -````` - -`````{py:class} DataFileUpdater(file_change: bumpversion.config.models.FileChange, version_part_configs: typing.Dict[str, bumpversion.versioning.models.VersionComponentSpec]) -:canonical: bumpversion.files.DataFileUpdater - -```{autodoc2-docstring} bumpversion.files.DataFileUpdater -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.files.DataFileUpdater.__init__ -:parser: myst -``` - -````{py:method} update_file(current_version: bumpversion.versioning.models.Version, new_version: bumpversion.versioning.models.Version, context: typing.MutableMapping, dry_run: bool = False) -> None -:canonical: bumpversion.files.DataFileUpdater.update_file - -```{autodoc2-docstring} bumpversion.files.DataFileUpdater.update_file -:parser: myst -``` - -```` - -````{py:method} _update_toml_file(search_for: re.Pattern, raw_search_pattern: str, replace_with: str, dry_run: bool = False) -> None -:canonical: bumpversion.files.DataFileUpdater._update_toml_file - -```{autodoc2-docstring} bumpversion.files.DataFileUpdater._update_toml_file -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.indented_logger.md b/docsrc/reference/bumpversion/bumpversion.indented_logger.md deleted file mode 100644 index 6818cb89..00000000 --- a/docsrc/reference/bumpversion/bumpversion.indented_logger.md +++ /dev/null @@ -1,124 +0,0 @@ -# {py:mod}`bumpversion.indented_logger` - -```{py:module} bumpversion.indented_logger -``` - -```{autodoc2-docstring} bumpversion.indented_logger -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`IndentedLoggerAdapter ` - - ```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`CURRENT_INDENT ` - - ```{autodoc2-docstring} bumpversion.indented_logger.CURRENT_INDENT - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} CURRENT_INDENT -:canonical: bumpversion.indented_logger.CURRENT_INDENT -:value: > - 'ContextVar(...)' - -```{autodoc2-docstring} bumpversion.indented_logger.CURRENT_INDENT -:parser: myst -``` - -```` - -`````{py:class} IndentedLoggerAdapter(logger: logging.Logger, extra: typing.Optional[dict] = None, depth: int = 2, indent_char: str = ' ', reset: bool = False) -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter - -Bases: {py:obj}`logging.LoggerAdapter` - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.__init__ -:parser: myst -``` - -````{py:property} current_indent -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter.current_indent -:type: int - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.current_indent -:parser: myst -``` - -```` - -````{py:method} indent(amount: int = 1) -> None -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter.indent - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.indent -:parser: myst -``` - -```` - -````{py:method} dedent(amount: int = 1) -> None -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter.dedent - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.dedent -:parser: myst -``` - -```` - -````{py:method} reset() -> None -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter.reset - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.reset -:parser: myst -``` - -```` - -````{py:property} indent_str -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter.indent_str -:type: str - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.indent_str -:parser: myst -``` - -```` - -````{py:method} process(msg: str, kwargs: typing.Optional[typing.MutableMapping[str, typing.Any]]) -> typing.Tuple[str, typing.MutableMapping[str, typing.Any]] -:canonical: bumpversion.indented_logger.IndentedLoggerAdapter.process - -```{autodoc2-docstring} bumpversion.indented_logger.IndentedLoggerAdapter.process -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.md b/docsrc/reference/bumpversion/bumpversion.md deleted file mode 100644 index 348a25b4..00000000 --- a/docsrc/reference/bumpversion/bumpversion.md +++ /dev/null @@ -1,71 +0,0 @@ -# {py:mod}`bumpversion` - -```{py:module} bumpversion -``` - -```{autodoc2-docstring} bumpversion -:parser: myst -:allowtitles: -``` - -## Subpackages - -```{toctree} -:titlesonly: -:maxdepth: 3 - -bumpversion.config -bumpversion.versioning -``` - -## Submodules - -```{toctree} -:titlesonly: -:maxdepth: 1 - -bumpversion.version_part -bumpversion.files -bumpversion.show -bumpversion.indented_logger -bumpversion.ui -bumpversion.autocast -bumpversion.visualize -bumpversion.aliases -bumpversion.cli -bumpversion.utils -bumpversion.bump -bumpversion.exceptions -bumpversion.scm -bumpversion.yaml_dump -bumpversion.__main__ -``` - -## Package Contents - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`__version__ ` - - ```{autodoc2-docstring} bumpversion.__version__ - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} __version__ -:canonical: bumpversion.__version__ -:type: str -:value: > - '0.17.4' - -```{autodoc2-docstring} bumpversion.__version__ -:parser: myst -``` - -```` diff --git a/docsrc/reference/bumpversion/bumpversion.scm.md b/docsrc/reference/bumpversion/bumpversion.scm.md deleted file mode 100644 index a4143205..00000000 --- a/docsrc/reference/bumpversion/bumpversion.scm.md +++ /dev/null @@ -1,522 +0,0 @@ -# {py:mod}`bumpversion.scm` - -```{py:module} bumpversion.scm -``` - -```{autodoc2-docstring} bumpversion.scm -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`SCMInfo ` - - ```{autodoc2-docstring} bumpversion.scm.SCMInfo - :parser: myst - :summary: - ``` -* - {py:obj}`SourceCodeManager ` - - ```{autodoc2-docstring} bumpversion.scm.SourceCodeManager - :parser: myst - :summary: - ``` -* - {py:obj}`Git ` - - ```{autodoc2-docstring} bumpversion.scm.Git - :parser: myst - :summary: - ``` -* - {py:obj}`Mercurial ` - - ```{autodoc2-docstring} bumpversion.scm.Mercurial - :parser: myst - :summary: - ``` -```` - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`get_scm_info ` - - ```{autodoc2-docstring} bumpversion.scm.get_scm_info - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.scm.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.scm.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.scm.logger -:parser: myst -``` - -```` - -`````{py:class} SCMInfo -:canonical: bumpversion.scm.SCMInfo - -```{autodoc2-docstring} bumpversion.scm.SCMInfo -:parser: myst -``` - -````{py:attribute} tool -:canonical: bumpversion.scm.SCMInfo.tool -:type: typing.Optional[typing.Type[SourceCodeManager]] -:value: > - None - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.tool -:parser: myst -``` - -```` - -````{py:attribute} commit_sha -:canonical: bumpversion.scm.SCMInfo.commit_sha -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.commit_sha -:parser: myst -``` - -```` - -````{py:attribute} distance_to_latest_tag -:canonical: bumpversion.scm.SCMInfo.distance_to_latest_tag -:type: int -:value: > - 0 - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.distance_to_latest_tag -:parser: myst -``` - -```` - -````{py:attribute} current_version -:canonical: bumpversion.scm.SCMInfo.current_version -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.current_version -:parser: myst -``` - -```` - -````{py:attribute} branch_name -:canonical: bumpversion.scm.SCMInfo.branch_name -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.branch_name -:parser: myst -``` - -```` - -````{py:attribute} short_branch_name -:canonical: bumpversion.scm.SCMInfo.short_branch_name -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.short_branch_name -:parser: myst -``` - -```` - -````{py:attribute} dirty -:canonical: bumpversion.scm.SCMInfo.dirty -:type: typing.Optional[bool] -:value: > - None - -```{autodoc2-docstring} bumpversion.scm.SCMInfo.dirty -:parser: myst -``` - -```` - -````{py:method} __str__() -:canonical: bumpversion.scm.SCMInfo.__str__ - -```` - -````{py:method} __repr__() -:canonical: bumpversion.scm.SCMInfo.__repr__ - -```` - -````` - -`````{py:class} SourceCodeManager -:canonical: bumpversion.scm.SourceCodeManager - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager -:parser: myst -``` - -````{py:attribute} _TEST_USABLE_COMMAND -:canonical: bumpversion.scm.SourceCodeManager._TEST_USABLE_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - [] - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager._TEST_USABLE_COMMAND -:parser: myst -``` - -```` - -````{py:attribute} _COMMIT_COMMAND -:canonical: bumpversion.scm.SourceCodeManager._COMMIT_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - [] - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager._COMMIT_COMMAND -:parser: myst -``` - -```` - -````{py:attribute} _ALL_TAGS_COMMAND -:canonical: bumpversion.scm.SourceCodeManager._ALL_TAGS_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - [] - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager._ALL_TAGS_COMMAND -:parser: myst -``` - -```` - -````{py:method} commit(message: str, current_version: str, new_version: str, extra_args: typing.Optional[list] = None) -> None -:canonical: bumpversion.scm.SourceCodeManager.commit -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.commit -:parser: myst -``` - -```` - -````{py:method} is_usable() -> bool -:canonical: bumpversion.scm.SourceCodeManager.is_usable -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.is_usable -:parser: myst -``` - -```` - -````{py:method} assert_nondirty() -> None -:canonical: bumpversion.scm.SourceCodeManager.assert_nondirty -:abstractmethod: -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.assert_nondirty -:parser: myst -``` - -```` - -````{py:method} latest_tag_info(tag_name: str, parse_pattern: str) -> bumpversion.scm.SCMInfo -:canonical: bumpversion.scm.SourceCodeManager.latest_tag_info -:abstractmethod: -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.latest_tag_info -:parser: myst -``` - -```` - -````{py:method} add_path(path: typing.Union[str, pathlib.Path]) -> None -:canonical: bumpversion.scm.SourceCodeManager.add_path -:abstractmethod: -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.add_path -:parser: myst -``` - -```` - -````{py:method} tag(name: str, sign: bool = False, message: typing.Optional[str] = None) -> None -:canonical: bumpversion.scm.SourceCodeManager.tag -:abstractmethod: -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.tag -:parser: myst -``` - -```` - -````{py:method} get_all_tags() -> typing.List[str] -:canonical: bumpversion.scm.SourceCodeManager.get_all_tags -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.get_all_tags -:parser: myst -``` - -```` - -````{py:method} get_version_from_tag(tag: str, tag_name: str, parse_pattern: str) -> typing.Optional[str] -:canonical: bumpversion.scm.SourceCodeManager.get_version_from_tag -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.get_version_from_tag -:parser: myst -``` - -```` - -````{py:method} commit_to_scm(files: typing.List[typing.Union[str, pathlib.Path]], config: bumpversion.config.Config, context: typing.MutableMapping, extra_args: typing.Optional[typing.List[str]] = None, dry_run: bool = False) -> None -:canonical: bumpversion.scm.SourceCodeManager.commit_to_scm -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.commit_to_scm -:parser: myst -``` - -```` - -````{py:method} tag_in_scm(config: bumpversion.config.Config, context: typing.MutableMapping, dry_run: bool = False) -> None -:canonical: bumpversion.scm.SourceCodeManager.tag_in_scm -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.SourceCodeManager.tag_in_scm -:parser: myst -``` - -```` - -````{py:method} __str__() -:canonical: bumpversion.scm.SourceCodeManager.__str__ - -```` - -````{py:method} __repr__() -:canonical: bumpversion.scm.SourceCodeManager.__repr__ - -```` - -````` - -`````{py:class} Git -:canonical: bumpversion.scm.Git - -Bases: {py:obj}`bumpversion.scm.SourceCodeManager` - -```{autodoc2-docstring} bumpversion.scm.Git -:parser: myst -``` - -````{py:attribute} _TEST_USABLE_COMMAND -:canonical: bumpversion.scm.Git._TEST_USABLE_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - ['git', 'rev-parse', '--git-dir'] - -```{autodoc2-docstring} bumpversion.scm.Git._TEST_USABLE_COMMAND -:parser: myst -``` - -```` - -````{py:attribute} _COMMIT_COMMAND -:canonical: bumpversion.scm.Git._COMMIT_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - ['git', 'commit', '-F'] - -```{autodoc2-docstring} bumpversion.scm.Git._COMMIT_COMMAND -:parser: myst -``` - -```` - -````{py:attribute} _ALL_TAGS_COMMAND -:canonical: bumpversion.scm.Git._ALL_TAGS_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - ['git', 'tag', '--list'] - -```{autodoc2-docstring} bumpversion.scm.Git._ALL_TAGS_COMMAND -:parser: myst -``` - -```` - -````{py:method} assert_nondirty() -> None -:canonical: bumpversion.scm.Git.assert_nondirty -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Git.assert_nondirty -:parser: myst -``` - -```` - -````{py:method} latest_tag_info(tag_name: str, parse_pattern: str) -> bumpversion.scm.SCMInfo -:canonical: bumpversion.scm.Git.latest_tag_info -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Git.latest_tag_info -:parser: myst -``` - -```` - -````{py:method} add_path(path: typing.Union[str, pathlib.Path]) -> None -:canonical: bumpversion.scm.Git.add_path -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Git.add_path -:parser: myst -``` - -```` - -````{py:method} tag(name: str, sign: bool = False, message: typing.Optional[str] = None) -> None -:canonical: bumpversion.scm.Git.tag -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Git.tag -:parser: myst -``` - -```` - -````` - -`````{py:class} Mercurial -:canonical: bumpversion.scm.Mercurial - -Bases: {py:obj}`bumpversion.scm.SourceCodeManager` - -```{autodoc2-docstring} bumpversion.scm.Mercurial -:parser: myst -``` - -````{py:attribute} _TEST_USABLE_COMMAND -:canonical: bumpversion.scm.Mercurial._TEST_USABLE_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - ['hg', 'root'] - -```{autodoc2-docstring} bumpversion.scm.Mercurial._TEST_USABLE_COMMAND -:parser: myst -``` - -```` - -````{py:attribute} _COMMIT_COMMAND -:canonical: bumpversion.scm.Mercurial._COMMIT_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - ['hg', 'commit', '--logfile'] - -```{autodoc2-docstring} bumpversion.scm.Mercurial._COMMIT_COMMAND -:parser: myst -``` - -```` - -````{py:attribute} _ALL_TAGS_COMMAND -:canonical: bumpversion.scm.Mercurial._ALL_TAGS_COMMAND -:type: typing.ClassVar[typing.List[str]] -:value: > - ['hg', 'log', '--rev="tag()"', '--template="{tags}\n"'] - -```{autodoc2-docstring} bumpversion.scm.Mercurial._ALL_TAGS_COMMAND -:parser: myst -``` - -```` - -````{py:method} latest_tag_info(tag_name: str, parse_pattern: str) -> bumpversion.scm.SCMInfo -:canonical: bumpversion.scm.Mercurial.latest_tag_info -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Mercurial.latest_tag_info -:parser: myst -``` - -```` - -````{py:method} assert_nondirty() -> None -:canonical: bumpversion.scm.Mercurial.assert_nondirty -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Mercurial.assert_nondirty -:parser: myst -``` - -```` - -````{py:method} add_path(path: typing.Union[str, pathlib.Path]) -> None -:canonical: bumpversion.scm.Mercurial.add_path -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Mercurial.add_path -:parser: myst -``` - -```` - -````{py:method} tag(name: str, sign: bool = False, message: typing.Optional[str] = None) -> None -:canonical: bumpversion.scm.Mercurial.tag -:classmethod: - -```{autodoc2-docstring} bumpversion.scm.Mercurial.tag -:parser: myst -``` - -```` - -````` - -````{py:function} get_scm_info(tag_name: str, parse_pattern: str) -> bumpversion.scm.SCMInfo -:canonical: bumpversion.scm.get_scm_info - -```{autodoc2-docstring} bumpversion.scm.get_scm_info -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.show.md b/docsrc/reference/bumpversion/bumpversion.show.md deleted file mode 100644 index c10101d6..00000000 --- a/docsrc/reference/bumpversion/bumpversion.show.md +++ /dev/null @@ -1,123 +0,0 @@ -# {py:mod}`bumpversion.show` - -```{py:module} bumpversion.show -``` - -```{autodoc2-docstring} bumpversion.show -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`output_default ` - - ```{autodoc2-docstring} bumpversion.show.output_default - :parser: myst - :summary: - ``` -* - {py:obj}`output_yaml ` - - ```{autodoc2-docstring} bumpversion.show.output_yaml - :parser: myst - :summary: - ``` -* - {py:obj}`output_json ` - - ```{autodoc2-docstring} bumpversion.show.output_json - :parser: myst - :summary: - ``` -* - {py:obj}`resolve_name ` - - ```{autodoc2-docstring} bumpversion.show.resolve_name - :parser: myst - :summary: - ``` -* - {py:obj}`log_list ` - - ```{autodoc2-docstring} bumpversion.show.log_list - :parser: myst - :summary: - ``` -* - {py:obj}`do_show ` - - ```{autodoc2-docstring} bumpversion.show.do_show - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`OUTPUTTERS ` - - ```{autodoc2-docstring} bumpversion.show.OUTPUTTERS - :parser: myst - :summary: - ``` -```` - -### API - -````{py:function} output_default(value: dict) -> None -:canonical: bumpversion.show.output_default - -```{autodoc2-docstring} bumpversion.show.output_default -:parser: myst -``` -```` - -````{py:function} output_yaml(value: dict) -> None -:canonical: bumpversion.show.output_yaml - -```{autodoc2-docstring} bumpversion.show.output_yaml -:parser: myst -``` -```` - -````{py:function} output_json(value: dict) -> None -:canonical: bumpversion.show.output_json - -```{autodoc2-docstring} bumpversion.show.output_json -:parser: myst -``` -```` - -````{py:data} OUTPUTTERS -:canonical: bumpversion.show.OUTPUTTERS -:value: > - None - -```{autodoc2-docstring} bumpversion.show.OUTPUTTERS -:parser: myst -``` - -```` - -````{py:function} resolve_name(obj: typing.Any, name: str, default: typing.Any = None, err_on_missing: bool = False) -> typing.Any -:canonical: bumpversion.show.resolve_name - -```{autodoc2-docstring} bumpversion.show.resolve_name -:parser: myst -``` -```` - -````{py:function} log_list(config: bumpversion.config.Config, version_part: typing.Optional[str], new_version: typing.Optional[str]) -> None -:canonical: bumpversion.show.log_list - -```{autodoc2-docstring} bumpversion.show.log_list -:parser: myst -``` -```` - -````{py:function} do_show(*args, config: bumpversion.config.Config, format_: str = 'default', increment: typing.Optional[str] = None) -> None -:canonical: bumpversion.show.do_show - -```{autodoc2-docstring} bumpversion.show.do_show -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.ui.md b/docsrc/reference/bumpversion/bumpversion.ui.md deleted file mode 100644 index eb6a991d..00000000 --- a/docsrc/reference/bumpversion/bumpversion.ui.md +++ /dev/null @@ -1,126 +0,0 @@ -# {py:mod}`bumpversion.ui` - -```{py:module} bumpversion.ui -``` - -```{autodoc2-docstring} bumpversion.ui -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`get_indented_logger ` - - ```{autodoc2-docstring} bumpversion.ui.get_indented_logger - :parser: myst - :summary: - ``` -* - {py:obj}`setup_logging ` - - ```{autodoc2-docstring} bumpversion.ui.setup_logging - :parser: myst - :summary: - ``` -* - {py:obj}`print_info ` - - ```{autodoc2-docstring} bumpversion.ui.print_info - :parser: myst - :summary: - ``` -* - {py:obj}`print_error ` - - ```{autodoc2-docstring} bumpversion.ui.print_error - :parser: myst - :summary: - ``` -* - {py:obj}`print_warning ` - - ```{autodoc2-docstring} bumpversion.ui.print_warning - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.ui.logger - :parser: myst - :summary: - ``` -* - {py:obj}`VERBOSITY ` - - ```{autodoc2-docstring} bumpversion.ui.VERBOSITY - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.ui.logger -:value: > - 'getLogger(...)' - -```{autodoc2-docstring} bumpversion.ui.logger -:parser: myst -``` - -```` - -````{py:data} VERBOSITY -:canonical: bumpversion.ui.VERBOSITY -:value: > - None - -```{autodoc2-docstring} bumpversion.ui.VERBOSITY -:parser: myst -``` - -```` - -````{py:function} get_indented_logger(name: str) -> bumpversion.indented_logger.IndentedLoggerAdapter -:canonical: bumpversion.ui.get_indented_logger - -```{autodoc2-docstring} bumpversion.ui.get_indented_logger -:parser: myst -``` -```` - -````{py:function} setup_logging(verbose: int = 0) -> None -:canonical: bumpversion.ui.setup_logging - -```{autodoc2-docstring} bumpversion.ui.setup_logging -:parser: myst -``` -```` - -````{py:function} print_info(msg: str) -> None -:canonical: bumpversion.ui.print_info - -```{autodoc2-docstring} bumpversion.ui.print_info -:parser: myst -``` -```` - -````{py:function} print_error(msg: str) -> None -:canonical: bumpversion.ui.print_error - -```{autodoc2-docstring} bumpversion.ui.print_error -:parser: myst -``` -```` - -````{py:function} print_warning(msg: str) -> None -:canonical: bumpversion.ui.print_warning - -```{autodoc2-docstring} bumpversion.ui.print_warning -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.utils.md b/docsrc/reference/bumpversion/bumpversion.utils.md deleted file mode 100644 index f8d94a3f..00000000 --- a/docsrc/reference/bumpversion/bumpversion.utils.md +++ /dev/null @@ -1,151 +0,0 @@ -# {py:mod}`bumpversion.utils` - -```{py:module} bumpversion.utils -``` - -```{autodoc2-docstring} bumpversion.utils -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`extract_regex_flags ` - - ```{autodoc2-docstring} bumpversion.utils.extract_regex_flags - :parser: myst - :summary: - ``` -* - {py:obj}`recursive_sort_dict ` - - ```{autodoc2-docstring} bumpversion.utils.recursive_sort_dict - :parser: myst - :summary: - ``` -* - {py:obj}`key_val_string ` - - ```{autodoc2-docstring} bumpversion.utils.key_val_string - :parser: myst - :summary: - ``` -* - {py:obj}`prefixed_environ ` - - ```{autodoc2-docstring} bumpversion.utils.prefixed_environ - :parser: myst - :summary: - ``` -* - {py:obj}`labels_for_format ` - - ```{autodoc2-docstring} bumpversion.utils.labels_for_format - :parser: myst - :summary: - ``` -* - {py:obj}`base_context ` - - ```{autodoc2-docstring} bumpversion.utils.base_context - :parser: myst - :summary: - ``` -* - {py:obj}`get_context ` - - ```{autodoc2-docstring} bumpversion.utils.get_context - :parser: myst - :summary: - ``` -* - {py:obj}`get_overrides ` - - ```{autodoc2-docstring} bumpversion.utils.get_overrides - :parser: myst - :summary: - ``` -* - {py:obj}`get_nested_value ` - - ```{autodoc2-docstring} bumpversion.utils.get_nested_value - :parser: myst - :summary: - ``` -* - {py:obj}`set_nested_value ` - - ```{autodoc2-docstring} bumpversion.utils.set_nested_value - :parser: myst - :summary: - ``` -```` - -### API - -````{py:function} extract_regex_flags(regex_pattern: str) -> typing.Tuple[str, str] -:canonical: bumpversion.utils.extract_regex_flags - -```{autodoc2-docstring} bumpversion.utils.extract_regex_flags -:parser: myst -``` -```` - -````{py:function} recursive_sort_dict(input_value: typing.Any) -> typing.Any -:canonical: bumpversion.utils.recursive_sort_dict - -```{autodoc2-docstring} bumpversion.utils.recursive_sort_dict -:parser: myst -``` -```` - -````{py:function} key_val_string(d: dict) -> str -:canonical: bumpversion.utils.key_val_string - -```{autodoc2-docstring} bumpversion.utils.key_val_string -:parser: myst -``` -```` - -````{py:function} prefixed_environ() -> dict -:canonical: bumpversion.utils.prefixed_environ - -```{autodoc2-docstring} bumpversion.utils.prefixed_environ -:parser: myst -``` -```` - -````{py:function} labels_for_format(serialize_format: str) -> typing.List[str] -:canonical: bumpversion.utils.labels_for_format - -```{autodoc2-docstring} bumpversion.utils.labels_for_format -:parser: myst -``` -```` - -````{py:function} base_context(scm_info: typing.Optional[bumpversion.scm.SCMInfo] = None) -> collections.ChainMap -:canonical: bumpversion.utils.base_context - -```{autodoc2-docstring} bumpversion.utils.base_context -:parser: myst -``` -```` - -````{py:function} get_context(config: bumpversion.config.Config, current_version: typing.Optional[bumpversion.versioning.models.Version] = None, new_version: typing.Optional[bumpversion.versioning.models.Version] = None) -> collections.ChainMap -:canonical: bumpversion.utils.get_context - -```{autodoc2-docstring} bumpversion.utils.get_context -:parser: myst -``` -```` - -````{py:function} get_overrides(**kwargs) -> dict -:canonical: bumpversion.utils.get_overrides - -```{autodoc2-docstring} bumpversion.utils.get_overrides -:parser: myst -``` -```` - -````{py:function} get_nested_value(d: dict, path: str) -> typing.Any -:canonical: bumpversion.utils.get_nested_value - -```{autodoc2-docstring} bumpversion.utils.get_nested_value -:parser: myst -``` -```` - -````{py:function} set_nested_value(d: dict, value: typing.Any, path: str) -> None -:canonical: bumpversion.utils.set_nested_value - -```{autodoc2-docstring} bumpversion.utils.set_nested_value -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.version_part.md b/docsrc/reference/bumpversion/bumpversion.version_part.md deleted file mode 100644 index c20cf510..00000000 --- a/docsrc/reference/bumpversion/bumpversion.version_part.md +++ /dev/null @@ -1,104 +0,0 @@ -# {py:mod}`bumpversion.version_part` - -```{py:module} bumpversion.version_part -``` - -```{autodoc2-docstring} bumpversion.version_part -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`VersionConfig ` - - ```{autodoc2-docstring} bumpversion.version_part.VersionConfig - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.version_part.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.version_part.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.version_part.logger -:parser: myst -``` - -```` - -`````{py:class} VersionConfig(parse: str, serialize: typing.Tuple[str], search: str, replace: str, part_configs: typing.Optional[typing.Dict[str, bumpversion.versioning.models.VersionComponentSpec]] = None) -:canonical: bumpversion.version_part.VersionConfig - -```{autodoc2-docstring} bumpversion.version_part.VersionConfig -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.version_part.VersionConfig.__init__ -:parser: myst -``` - -````{py:method} __repr__() -> str -:canonical: bumpversion.version_part.VersionConfig.__repr__ - -```` - -````{py:method} __eq__(other: typing.Any) -> bool -:canonical: bumpversion.version_part.VersionConfig.__eq__ - -```` - -````{py:property} order -:canonical: bumpversion.version_part.VersionConfig.order -:type: typing.List[str] - -```{autodoc2-docstring} bumpversion.version_part.VersionConfig.order -:parser: myst -``` - -```` - -````{py:method} parse(version_string: typing.Optional[str] = None) -> typing.Optional[bumpversion.versioning.models.Version] -:canonical: bumpversion.version_part.VersionConfig.parse - -```{autodoc2-docstring} bumpversion.version_part.VersionConfig.parse -:parser: myst -``` - -```` - -````{py:method} serialize(version: bumpversion.versioning.models.Version, context: typing.MutableMapping) -> str -:canonical: bumpversion.version_part.VersionConfig.serialize - -```{autodoc2-docstring} bumpversion.version_part.VersionConfig.serialize -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.versioning.conventions.md b/docsrc/reference/bumpversion/bumpversion.versioning.conventions.md deleted file mode 100644 index 3bc8d18a..00000000 --- a/docsrc/reference/bumpversion/bumpversion.versioning.conventions.md +++ /dev/null @@ -1,149 +0,0 @@ -# {py:mod}`bumpversion.versioning.conventions` - -```{py:module} bumpversion.versioning.conventions -``` - -```{autodoc2-docstring} bumpversion.versioning.conventions -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`pep440_version_spec ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.pep440_version_spec - :parser: myst - :summary: - ``` -* - {py:obj}`semver_spec ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.semver_spec - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`PEP440_PATTERN ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.PEP440_PATTERN - :parser: myst - :summary: - ``` -* - {py:obj}`PEP440_SERIALIZE_PATTERNS ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.PEP440_SERIALIZE_PATTERNS - :parser: myst - :summary: - ``` -* - {py:obj}`PEP440_COMPONENT_CONFIGS ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.PEP440_COMPONENT_CONFIGS - :parser: myst - :summary: - ``` -* - {py:obj}`SEMVER_PATTERN ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.SEMVER_PATTERN - :parser: myst - :summary: - ``` -* - {py:obj}`SEMVER_SERIALIZE_PATTERNS ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.SEMVER_SERIALIZE_PATTERNS - :parser: myst - :summary: - ``` -* - {py:obj}`SEMVER_COMPONENT_CONFIGS ` - - ```{autodoc2-docstring} bumpversion.versioning.conventions.SEMVER_COMPONENT_CONFIGS - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} PEP440_PATTERN -:canonical: bumpversion.versioning.conventions.PEP440_PATTERN -:value: - -```{autodoc2-docstring} bumpversion.versioning.conventions.PEP440_PATTERN -:parser: myst -``` - -```` - -````{py:data} PEP440_SERIALIZE_PATTERNS -:canonical: bumpversion.versioning.conventions.PEP440_SERIALIZE_PATTERNS -:value: > - ['{major}.{minor}.{patch}{pre_l}{pre_n}.{post}.{dev}+{local}', '{major}.{minor}.{patch}{pre_l}{pre_n... - -```{autodoc2-docstring} bumpversion.versioning.conventions.PEP440_SERIALIZE_PATTERNS -:parser: myst -``` - -```` - -````{py:data} PEP440_COMPONENT_CONFIGS -:canonical: bumpversion.versioning.conventions.PEP440_COMPONENT_CONFIGS -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.conventions.PEP440_COMPONENT_CONFIGS -:parser: myst -``` - -```` - -````{py:function} pep440_version_spec() -> bumpversion.versioning.models.VersionSpec -:canonical: bumpversion.versioning.conventions.pep440_version_spec - -```{autodoc2-docstring} bumpversion.versioning.conventions.pep440_version_spec -:parser: myst -``` -```` - -````{py:data} SEMVER_PATTERN -:canonical: bumpversion.versioning.conventions.SEMVER_PATTERN -:value: - -```{autodoc2-docstring} bumpversion.versioning.conventions.SEMVER_PATTERN -:parser: myst -``` - -```` - -````{py:data} SEMVER_SERIALIZE_PATTERNS -:canonical: bumpversion.versioning.conventions.SEMVER_SERIALIZE_PATTERNS -:value: > - ['{major}.{minor}.{patch}-{pre_l}{pre_n}+{buildmetadata}', '{major}.{minor}.{patch}-{pre_l}{pre_n}',... - -```{autodoc2-docstring} bumpversion.versioning.conventions.SEMVER_SERIALIZE_PATTERNS -:parser: myst -``` - -```` - -````{py:data} SEMVER_COMPONENT_CONFIGS -:canonical: bumpversion.versioning.conventions.SEMVER_COMPONENT_CONFIGS -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.conventions.SEMVER_COMPONENT_CONFIGS -:parser: myst -``` - -```` - -````{py:function} semver_spec() -> bumpversion.versioning.models.VersionSpec -:canonical: bumpversion.versioning.conventions.semver_spec - -```{autodoc2-docstring} bumpversion.versioning.conventions.semver_spec -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.versioning.functions.md b/docsrc/reference/bumpversion/bumpversion.versioning.functions.md deleted file mode 100644 index 3c244c65..00000000 --- a/docsrc/reference/bumpversion/bumpversion.versioning.functions.md +++ /dev/null @@ -1,188 +0,0 @@ -# {py:mod}`bumpversion.versioning.functions` - -```{py:module} bumpversion.versioning.functions -``` - -```{autodoc2-docstring} bumpversion.versioning.functions -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`PartFunction ` - - ```{autodoc2-docstring} bumpversion.versioning.functions.PartFunction - :parser: myst - :summary: - ``` -* - {py:obj}`IndependentFunction ` - - ```{autodoc2-docstring} bumpversion.versioning.functions.IndependentFunction - :parser: myst - :summary: - ``` -* - {py:obj}`NumericFunction ` - - ```{autodoc2-docstring} bumpversion.versioning.functions.NumericFunction - :parser: myst - :summary: - ``` -* - {py:obj}`ValuesFunction ` - - ```{autodoc2-docstring} bumpversion.versioning.functions.ValuesFunction - :parser: myst - :summary: - ``` -```` - -### API - -`````{py:class} PartFunction -:canonical: bumpversion.versioning.functions.PartFunction - -```{autodoc2-docstring} bumpversion.versioning.functions.PartFunction -:parser: myst -``` - -````{py:attribute} first_value -:canonical: bumpversion.versioning.functions.PartFunction.first_value -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.functions.PartFunction.first_value -:parser: myst -``` - -```` - -````{py:attribute} optional_value -:canonical: bumpversion.versioning.functions.PartFunction.optional_value -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.functions.PartFunction.optional_value -:parser: myst -``` - -```` - -````{py:attribute} independent -:canonical: bumpversion.versioning.functions.PartFunction.independent -:type: bool -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.functions.PartFunction.independent -:parser: myst -``` - -```` - -````{py:method} bump(value: str) -> str -:canonical: bumpversion.versioning.functions.PartFunction.bump -:abstractmethod: - -```{autodoc2-docstring} bumpversion.versioning.functions.PartFunction.bump -:parser: myst -``` - -```` - -````` - -`````{py:class} IndependentFunction(value: typing.Union[str, int, None] = None) -:canonical: bumpversion.versioning.functions.IndependentFunction - -Bases: {py:obj}`bumpversion.versioning.functions.PartFunction` - -```{autodoc2-docstring} bumpversion.versioning.functions.IndependentFunction -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.functions.IndependentFunction.__init__ -:parser: myst -``` - -````{py:method} bump(value: typing.Optional[str] = None) -> str -:canonical: bumpversion.versioning.functions.IndependentFunction.bump - -```{autodoc2-docstring} bumpversion.versioning.functions.IndependentFunction.bump -:parser: myst -``` - -```` - -````` - -`````{py:class} NumericFunction(optional_value: typing.Union[str, int, None] = None, first_value: typing.Union[str, int, None] = None) -:canonical: bumpversion.versioning.functions.NumericFunction - -Bases: {py:obj}`bumpversion.versioning.functions.PartFunction` - -```{autodoc2-docstring} bumpversion.versioning.functions.NumericFunction -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.functions.NumericFunction.__init__ -:parser: myst -``` - -````{py:attribute} FIRST_NUMERIC -:canonical: bumpversion.versioning.functions.NumericFunction.FIRST_NUMERIC -:value: > - 'compile(...)' - -```{autodoc2-docstring} bumpversion.versioning.functions.NumericFunction.FIRST_NUMERIC -:parser: myst -``` - -```` - -````{py:method} bump(value: typing.Union[str, int]) -> str -:canonical: bumpversion.versioning.functions.NumericFunction.bump - -```{autodoc2-docstring} bumpversion.versioning.functions.NumericFunction.bump -:parser: myst -``` - -```` - -````` - -`````{py:class} ValuesFunction(values: typing.List[str], optional_value: typing.Optional[str] = None, first_value: typing.Optional[str] = None) -:canonical: bumpversion.versioning.functions.ValuesFunction - -Bases: {py:obj}`bumpversion.versioning.functions.PartFunction` - -```{autodoc2-docstring} bumpversion.versioning.functions.ValuesFunction -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.functions.ValuesFunction.__init__ -:parser: myst -``` - -````{py:method} bump(value: str) -> str -:canonical: bumpversion.versioning.functions.ValuesFunction.bump - -```{autodoc2-docstring} bumpversion.versioning.functions.ValuesFunction.bump -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.versioning.md b/docsrc/reference/bumpversion/bumpversion.versioning.md deleted file mode 100644 index 58dff562..00000000 --- a/docsrc/reference/bumpversion/bumpversion.versioning.md +++ /dev/null @@ -1,21 +0,0 @@ -# {py:mod}`bumpversion.versioning` - -```{py:module} bumpversion.versioning -``` - -```{autodoc2-docstring} bumpversion.versioning -:parser: myst -:allowtitles: -``` - -## Submodules - -```{toctree} -:titlesonly: -:maxdepth: 1 - -bumpversion.versioning.functions -bumpversion.versioning.models -bumpversion.versioning.conventions -bumpversion.versioning.serialization -``` diff --git a/docsrc/reference/bumpversion/bumpversion.versioning.models.md b/docsrc/reference/bumpversion/bumpversion.versioning.models.md deleted file mode 100644 index cd6156c2..00000000 --- a/docsrc/reference/bumpversion/bumpversion.versioning.models.md +++ /dev/null @@ -1,330 +0,0 @@ -# {py:mod}`bumpversion.versioning.models` - -```{py:module} bumpversion.versioning.models -``` - -```{autodoc2-docstring} bumpversion.versioning.models -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`VersionComponent ` - - ```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent - :parser: myst - :summary: - ``` -* - {py:obj}`VersionComponentSpec ` - - ```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec - :parser: myst - :summary: - ``` -* - {py:obj}`VersionSpec ` - - ```{autodoc2-docstring} bumpversion.versioning.models.VersionSpec - :parser: myst - :summary: - ``` -* - {py:obj}`Version ` - - ```{autodoc2-docstring} bumpversion.versioning.models.Version - :parser: myst - :summary: - ``` -```` - -### API - -`````{py:class} VersionComponent(values: typing.Optional[list] = None, optional_value: typing.Optional[str] = None, first_value: typing.Union[str, int, None] = None, independent: bool = False, source: typing.Optional[str] = None, value: typing.Union[str, int, None] = None) -:canonical: bumpversion.versioning.models.VersionComponent - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.__init__ -:parser: myst -``` - -````{py:property} value -:canonical: bumpversion.versioning.models.VersionComponent.value -:type: str - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.value -:parser: myst -``` - -```` - -````{py:method} copy() -> bumpversion.versioning.models.VersionComponent -:canonical: bumpversion.versioning.models.VersionComponent.copy - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.copy -:parser: myst -``` - -```` - -````{py:method} bump() -> bumpversion.versioning.models.VersionComponent -:canonical: bumpversion.versioning.models.VersionComponent.bump - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.bump -:parser: myst -``` - -```` - -````{py:method} null() -> bumpversion.versioning.models.VersionComponent -:canonical: bumpversion.versioning.models.VersionComponent.null - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.null -:parser: myst -``` - -```` - -````{py:property} is_optional -:canonical: bumpversion.versioning.models.VersionComponent.is_optional -:type: bool - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.is_optional -:parser: myst -``` - -```` - -````{py:property} is_independent -:canonical: bumpversion.versioning.models.VersionComponent.is_independent -:type: bool - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponent.is_independent -:parser: myst -``` - -```` - -````{py:method} __format__(format_spec: str) -> str -:canonical: bumpversion.versioning.models.VersionComponent.__format__ - -```` - -````{py:method} __repr__() -> str -:canonical: bumpversion.versioning.models.VersionComponent.__repr__ - -```` - -````{py:method} __eq__(other: typing.Any) -> bool -:canonical: bumpversion.versioning.models.VersionComponent.__eq__ - -```` - -````` - -`````{py:class} VersionComponentSpec(**data: typing.Any) -:canonical: bumpversion.versioning.models.VersionComponentSpec - -Bases: {py:obj}`pydantic.BaseModel` - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.__init__ -:parser: myst -``` - -````{py:attribute} values -:canonical: bumpversion.versioning.models.VersionComponentSpec.values -:type: typing.Optional[list] -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.values -:parser: myst -``` - -```` - -````{py:attribute} optional_value -:canonical: bumpversion.versioning.models.VersionComponentSpec.optional_value -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.optional_value -:parser: myst -``` - -```` - -````{py:attribute} first_value -:canonical: bumpversion.versioning.models.VersionComponentSpec.first_value -:type: typing.Union[str, int, None] -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.first_value -:parser: myst -``` - -```` - -````{py:attribute} independent -:canonical: bumpversion.versioning.models.VersionComponentSpec.independent -:type: bool -:value: > - False - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.independent -:parser: myst -``` - -```` - -````{py:attribute} depends_on -:canonical: bumpversion.versioning.models.VersionComponentSpec.depends_on -:type: typing.Optional[str] -:value: > - None - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.depends_on -:parser: myst -``` - -```` - -````{py:method} create_component(value: typing.Union[str, int, None] = None) -> bumpversion.versioning.models.VersionComponent -:canonical: bumpversion.versioning.models.VersionComponentSpec.create_component - -```{autodoc2-docstring} bumpversion.versioning.models.VersionComponentSpec.create_component -:parser: myst -``` - -```` - -````` - -`````{py:class} VersionSpec(components: typing.Dict[str, bumpversion.versioning.models.VersionComponentSpec], order: typing.Optional[typing.List[str]] = None) -:canonical: bumpversion.versioning.models.VersionSpec - -```{autodoc2-docstring} bumpversion.versioning.models.VersionSpec -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.models.VersionSpec.__init__ -:parser: myst -``` - -````{py:method} create_version(values: typing.Dict[str, str]) -> bumpversion.versioning.models.Version -:canonical: bumpversion.versioning.models.VersionSpec.create_version - -```{autodoc2-docstring} bumpversion.versioning.models.VersionSpec.create_version -:parser: myst -``` - -```` - -````{py:method} get_dependents(component_name: str) -> typing.List[str] -:canonical: bumpversion.versioning.models.VersionSpec.get_dependents - -```{autodoc2-docstring} bumpversion.versioning.models.VersionSpec.get_dependents -:parser: myst -``` - -```` - -````` - -`````{py:class} Version(version_spec: bumpversion.versioning.models.VersionSpec, components: typing.Dict[str, bumpversion.versioning.models.VersionComponent], original: typing.Optional[str] = None) -:canonical: bumpversion.versioning.models.Version - -```{autodoc2-docstring} bumpversion.versioning.models.Version -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.versioning.models.Version.__init__ -:parser: myst -``` - -````{py:method} values() -> typing.Dict[str, str] -:canonical: bumpversion.versioning.models.Version.values - -```{autodoc2-docstring} bumpversion.versioning.models.Version.values -:parser: myst -``` - -```` - -````{py:method} __getitem__(key: str) -> bumpversion.versioning.models.VersionComponent -:canonical: bumpversion.versioning.models.Version.__getitem__ - -```{autodoc2-docstring} bumpversion.versioning.models.Version.__getitem__ -:parser: myst -``` - -```` - -````{py:method} __len__() -> int -:canonical: bumpversion.versioning.models.Version.__len__ - -```{autodoc2-docstring} bumpversion.versioning.models.Version.__len__ -:parser: myst -``` - -```` - -````{py:method} __iter__() -:canonical: bumpversion.versioning.models.Version.__iter__ - -```{autodoc2-docstring} bumpversion.versioning.models.Version.__iter__ -:parser: myst -``` - -```` - -````{py:method} __repr__() -:canonical: bumpversion.versioning.models.Version.__repr__ - -```` - -````{py:method} __eq__(other: typing.Any) -> bool -:canonical: bumpversion.versioning.models.Version.__eq__ - -```` - -````{py:method} required_components() -> typing.List[str] -:canonical: bumpversion.versioning.models.Version.required_components - -```{autodoc2-docstring} bumpversion.versioning.models.Version.required_components -:parser: myst -``` - -```` - -````{py:method} bump(component_name: str) -> bumpversion.versioning.models.Version -:canonical: bumpversion.versioning.models.Version.bump - -```{autodoc2-docstring} bumpversion.versioning.models.Version.bump -:parser: myst -``` - -```` - -````` diff --git a/docsrc/reference/bumpversion/bumpversion.versioning.serialization.md b/docsrc/reference/bumpversion/bumpversion.versioning.serialization.md deleted file mode 100644 index 35bfad2f..00000000 --- a/docsrc/reference/bumpversion/bumpversion.versioning.serialization.md +++ /dev/null @@ -1,84 +0,0 @@ -# {py:mod}`bumpversion.versioning.serialization` - -```{py:module} bumpversion.versioning.serialization -``` - -```{autodoc2-docstring} bumpversion.versioning.serialization -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`parse_version ` - - ```{autodoc2-docstring} bumpversion.versioning.serialization.parse_version - :parser: myst - :summary: - ``` -* - {py:obj}`multisort ` - - ```{autodoc2-docstring} bumpversion.versioning.serialization.multisort - :parser: myst - :summary: - ``` -* - {py:obj}`serialize ` - - ```{autodoc2-docstring} bumpversion.versioning.serialization.serialize - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`logger ` - - ```{autodoc2-docstring} bumpversion.versioning.serialization.logger - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} logger -:canonical: bumpversion.versioning.serialization.logger -:value: > - 'get_indented_logger(...)' - -```{autodoc2-docstring} bumpversion.versioning.serialization.logger -:parser: myst -``` - -```` - -````{py:function} parse_version(version_string: str, parse_pattern: str) -> typing.Dict[str, str] -:canonical: bumpversion.versioning.serialization.parse_version - -```{autodoc2-docstring} bumpversion.versioning.serialization.parse_version -:parser: myst -``` -```` - -````{py:function} multisort(xs: list, specs: tuple) -> list -:canonical: bumpversion.versioning.serialization.multisort - -```{autodoc2-docstring} bumpversion.versioning.serialization.multisort -:parser: myst -``` -```` - -````{py:function} serialize(version: bumpversion.versioning.models.Version, serialize_patterns: typing.List[str], context: typing.MutableMapping) -> str -:canonical: bumpversion.versioning.serialization.serialize - -```{autodoc2-docstring} bumpversion.versioning.serialization.serialize -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.visualize.md b/docsrc/reference/bumpversion/bumpversion.visualize.md deleted file mode 100644 index 20963908..00000000 --- a/docsrc/reference/bumpversion/bumpversion.visualize.md +++ /dev/null @@ -1,264 +0,0 @@ -# {py:mod}`bumpversion.visualize` - -```{py:module} bumpversion.visualize -``` - -```{autodoc2-docstring} bumpversion.visualize -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`Border ` - - ```{autodoc2-docstring} bumpversion.visualize.Border - :parser: myst - :summary: - ``` -```` - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`lead_string ` - - ```{autodoc2-docstring} bumpversion.visualize.lead_string - :parser: myst - :summary: - ``` -* - {py:obj}`connection_str ` - - ```{autodoc2-docstring} bumpversion.visualize.connection_str - :parser: myst - :summary: - ``` -* - {py:obj}`labeled_line ` - - ```{autodoc2-docstring} bumpversion.visualize.labeled_line - :parser: myst - :summary: - ``` -* - {py:obj}`filter_version_parts ` - - ```{autodoc2-docstring} bumpversion.visualize.filter_version_parts - :parser: myst - :summary: - ``` -* - {py:obj}`visualize ` - - ```{autodoc2-docstring} bumpversion.visualize.visualize - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`BOX_CHARS ` - - ```{autodoc2-docstring} bumpversion.visualize.BOX_CHARS - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} BOX_CHARS -:canonical: bumpversion.visualize.BOX_CHARS -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.BOX_CHARS -:parser: myst -``` - -```` - -`````{py:class} Border -:canonical: bumpversion.visualize.Border - -```{autodoc2-docstring} bumpversion.visualize.Border -:parser: myst -``` - -````{py:attribute} corner_bottom_right -:canonical: bumpversion.visualize.Border.corner_bottom_right -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.corner_bottom_right -:parser: myst -``` - -```` - -````{py:attribute} corner_top_right -:canonical: bumpversion.visualize.Border.corner_top_right -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.corner_top_right -:parser: myst -``` - -```` - -````{py:attribute} corner_top_left -:canonical: bumpversion.visualize.Border.corner_top_left -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.corner_top_left -:parser: myst -``` - -```` - -````{py:attribute} corner_bottom_left -:canonical: bumpversion.visualize.Border.corner_bottom_left -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.corner_bottom_left -:parser: myst -``` - -```` - -````{py:attribute} divider_left -:canonical: bumpversion.visualize.Border.divider_left -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.divider_left -:parser: myst -``` - -```` - -````{py:attribute} divider_up -:canonical: bumpversion.visualize.Border.divider_up -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.divider_up -:parser: myst -``` - -```` - -````{py:attribute} divider_down -:canonical: bumpversion.visualize.Border.divider_down -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.divider_down -:parser: myst -``` - -```` - -````{py:attribute} divider_right -:canonical: bumpversion.visualize.Border.divider_right -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.divider_right -:parser: myst -``` - -```` - -````{py:attribute} line -:canonical: bumpversion.visualize.Border.line -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.line -:parser: myst -``` - -```` - -````{py:attribute} pipe -:canonical: bumpversion.visualize.Border.pipe -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.pipe -:parser: myst -``` - -```` - -````{py:attribute} cross -:canonical: bumpversion.visualize.Border.cross -:type: str -:value: > - None - -```{autodoc2-docstring} bumpversion.visualize.Border.cross -:parser: myst -``` - -```` - -````` - -````{py:function} lead_string(version_str: str, border: bumpversion.visualize.Border, blank: bool = False) -> str -:canonical: bumpversion.visualize.lead_string - -```{autodoc2-docstring} bumpversion.visualize.lead_string -:parser: myst -``` -```` - -````{py:function} connection_str(border: bumpversion.visualize.Border, has_next: bool = False, has_previous: bool = False) -> str -:canonical: bumpversion.visualize.connection_str - -```{autodoc2-docstring} bumpversion.visualize.connection_str -:parser: myst -``` -```` - -````{py:function} labeled_line(label: str, border: bumpversion.visualize.Border, fit_length: typing.Optional[int] = None) -> str -:canonical: bumpversion.visualize.labeled_line - -```{autodoc2-docstring} bumpversion.visualize.labeled_line -:parser: myst -``` -```` - -````{py:function} filter_version_parts(config: bumpversion.config.Config) -> typing.List[str] -:canonical: bumpversion.visualize.filter_version_parts - -```{autodoc2-docstring} bumpversion.visualize.filter_version_parts -:parser: myst -``` -```` - -````{py:function} visualize(config: bumpversion.config.Config, version_str: str, box_style: str = 'light') -> None -:canonical: bumpversion.visualize.visualize - -```{autodoc2-docstring} bumpversion.visualize.visualize -:parser: myst -``` -```` diff --git a/docsrc/reference/bumpversion/bumpversion.yaml_dump.md b/docsrc/reference/bumpversion/bumpversion.yaml_dump.md deleted file mode 100644 index 034426da..00000000 --- a/docsrc/reference/bumpversion/bumpversion.yaml_dump.md +++ /dev/null @@ -1,247 +0,0 @@ -# {py:mod}`bumpversion.yaml_dump` - -```{py:module} bumpversion.yaml_dump -``` - -```{autodoc2-docstring} bumpversion.yaml_dump -:parser: myst -:allowtitles: -``` - -## Module Contents - -### Classes - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`YAMLDumpers ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.YAMLDumpers - :parser: myst - :summary: - ``` -```` - -### Functions - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`dump ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.dump - :parser: myst - :summary: - ``` -* - {py:obj}`format_str ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_str - :parser: myst - :summary: - ``` -* - {py:obj}`format_int ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_int - :parser: myst - :summary: - ``` -* - {py:obj}`format_float ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_float - :parser: myst - :summary: - ``` -* - {py:obj}`format_bool ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_bool - :parser: myst - :summary: - ``` -* - {py:obj}`format_dict ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_dict - :parser: myst - :summary: - ``` -* - {py:obj}`format_sequence ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_sequence - :parser: myst - :summary: - ``` -* - {py:obj}`format_none ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_none - :parser: myst - :summary: - ``` -* - {py:obj}`format_date ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_date - :parser: myst - :summary: - ``` -* - {py:obj}`format_datetime ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.format_datetime - :parser: myst - :summary: - ``` -```` - -### Data - -````{list-table} -:class: autosummary longtable -:align: left - -* - {py:obj}`DumperFunc ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.DumperFunc - :parser: myst - :summary: - ``` -* - {py:obj}`YAML_DUMPERS ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.YAML_DUMPERS - :parser: myst - :summary: - ``` -* - {py:obj}`INDENT ` - - ```{autodoc2-docstring} bumpversion.yaml_dump.INDENT - :parser: myst - :summary: - ``` -```` - -### API - -````{py:data} DumperFunc -:canonical: bumpversion.yaml_dump.DumperFunc -:value: > - None - -```{autodoc2-docstring} bumpversion.yaml_dump.DumperFunc -:parser: myst -``` - -```` - -`````{py:class} YAMLDumpers(dict=None, /, **kwargs) -:canonical: bumpversion.yaml_dump.YAMLDumpers - -Bases: {py:obj}`collections.UserDict` - -```{autodoc2-docstring} bumpversion.yaml_dump.YAMLDumpers -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} bumpversion.yaml_dump.YAMLDumpers.__init__ -:parser: myst -``` - -````{py:method} add_dumper(data_type: type, dumper: bumpversion.yaml_dump.DumperFunc) -> None -:canonical: bumpversion.yaml_dump.YAMLDumpers.add_dumper - -```{autodoc2-docstring} bumpversion.yaml_dump.YAMLDumpers.add_dumper -:parser: myst -``` - -```` - -````` - -````{py:data} YAML_DUMPERS -:canonical: bumpversion.yaml_dump.YAML_DUMPERS -:value: > - 'YAMLDumpers(...)' - -```{autodoc2-docstring} bumpversion.yaml_dump.YAML_DUMPERS -:parser: myst -``` - -```` - -````{py:data} INDENT -:canonical: bumpversion.yaml_dump.INDENT -:value: > - ' ' - -```{autodoc2-docstring} bumpversion.yaml_dump.INDENT -:parser: myst -``` - -```` - -````{py:function} dump(data: typing.Any) -> str -:canonical: bumpversion.yaml_dump.dump - -```{autodoc2-docstring} bumpversion.yaml_dump.dump -:parser: myst -``` -```` - -````{py:function} format_str(val: str) -> str -:canonical: bumpversion.yaml_dump.format_str - -```{autodoc2-docstring} bumpversion.yaml_dump.format_str -:parser: myst -``` -```` - -````{py:function} format_int(val: int) -> str -:canonical: bumpversion.yaml_dump.format_int - -```{autodoc2-docstring} bumpversion.yaml_dump.format_int -:parser: myst -``` -```` - -````{py:function} format_float(data: float) -> str -:canonical: bumpversion.yaml_dump.format_float - -```{autodoc2-docstring} bumpversion.yaml_dump.format_float -:parser: myst -``` -```` - -````{py:function} format_bool(val: bool) -> str -:canonical: bumpversion.yaml_dump.format_bool - -```{autodoc2-docstring} bumpversion.yaml_dump.format_bool -:parser: myst -``` -```` - -````{py:function} format_dict(val: dict) -> str -:canonical: bumpversion.yaml_dump.format_dict - -```{autodoc2-docstring} bumpversion.yaml_dump.format_dict -:parser: myst -``` -```` - -````{py:function} format_sequence(val: typing.Union[list, tuple]) -> str -:canonical: bumpversion.yaml_dump.format_sequence - -```{autodoc2-docstring} bumpversion.yaml_dump.format_sequence -:parser: myst -``` -```` - -````{py:function} format_none(_: None) -> str -:canonical: bumpversion.yaml_dump.format_none - -```{autodoc2-docstring} bumpversion.yaml_dump.format_none -:parser: myst -``` -```` - -````{py:function} format_date(val: datetime.date) -> str -:canonical: bumpversion.yaml_dump.format_date - -```{autodoc2-docstring} bumpversion.yaml_dump.format_date -:parser: myst -``` -```` - -````{py:function} format_datetime(val: datetime.datetime) -> str -:canonical: bumpversion.yaml_dump.format_datetime - -```{autodoc2-docstring} bumpversion.yaml_dump.format_datetime -:parser: myst -``` -```` diff --git a/docsrc/reference/cli.md b/docsrc/reference/cli.md index 23d14e93..7e32e484 100644 --- a/docsrc/reference/cli.md +++ b/docsrc/reference/cli.md @@ -1,8 +1,6 @@ -# Command-line Interface - - ::: mkdocs-click :module: bumpversion.cli :command: cli :prog_name: bump-my-version :style: table + :list_subcommands: true diff --git a/docsrc/reference/configuration.md b/docsrc/reference/configuration.md index cd9fa37a..6b424e25 100644 --- a/docsrc/reference/configuration.md +++ b/docsrc/reference/configuration.md @@ -1,6 +1,6 @@ # Configuration -`bump-my-version` looks in three places for configuration information (in order of precedence): +Bump My Version looks in three places for configuration information (in order of precedence): 1. command line 2. configuration file @@ -9,7 +9,7 @@ ## Configuration files -`bump-my-version` looks in four places for the configuration file to parse (in order of precedence): +Bump My Version looks in four places for the configuration file to parse (in order of precedence): 1. `--config-file ` _(command line argument)_ 2. `BUMPVERSION_CONFIG_FILE=file` _(environment variable)_ @@ -70,29 +70,6 @@ Whether to create a commit using git or Mercurial. If you have pre-commit hooks, you might also want to add an option to [`commit_args`](configuration.md#commit-args) to disable your pre-commit hooks. For Git use `--no-verify` and use `--config hooks.pre-commit=` for Mercurial. -### `message` - -::: field-list - - required - : No - - default - : `Bump version: {current_version} → {new_version}` - - type - : string - - command line option - : `--message` - - environment var - : `BUMPVERSION_MESSAGE` - -The commit message template to use when creating a commit. This is only used when the [`commit`](configuration.md#commit) option is set to `True`. - -This string is templated using the [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. - ### `commit_args` ::: field-list @@ -116,121 +93,149 @@ Extra arguments to pass to commit command. This is only used when the [`commit`] If you have pre-commit hooks, you might also want to add an option to disable your pre-commit hooks. For Git use `--no-verify` and use `--config hooks.pre-commit=` for Mercurial. -### `tag` +### `current_version` ::: field-list required - : No + : **Yes** default - : `False` (Don't create a tag) + : `""` type - : boolean + : string command line option - : `(--tag | --no-tag)` + : `--current-version` environment var - : `BUMPVERSION_TAG` + : `BUMPVERSION_CURRENT_VERSION` -If `True`, create a tag after committing the changes. The tag is named using the [`tag_name`](configuration.md#tag-name) option. - -If you are using `git`, don't forget to `git-push` with the `--tags` flag when you are done. +The current version of the software package before bumping. A value for this is required. -### `sign_tags` +### `ignore_missing_version` ::: field-list - required : No default - : `False` (Don't sign tags) + : `False` type : boolean command line option - : `(--sign-tags | --no-sign-tags)` + : `--ignore-missing-version` environment var - : `BUMPVERSION_SIGN_TAGS` - -If `True`, sign the created tag, when [`tag`](configuration.md#tag) is `True`. - -### `tag_name` -:required: No - -:default: `v{new_version}` - -:type: string - -:command line option: `--tag-name` - -:environment var: `BUMPVERSION_TAG_NAME` + : `BUMPVERSION_IGNORE_MISSING_VERSION` -The name template used to render the tag, when [`tag`](configuration.md#tag) is `True`. - -This string is templated using the [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. - -### `tag_message` -:required: No - -:default: `Bump version: {current_version} → {new_version}` +If `True`, don't fail if the version string to be replaced is not found in the file. -:type: string +### `message` -:command line option: `--tag-message` +::: field-list -:environment var: `BUMPVERSION_TAG_MESSAGE` + required + : No + + default + : `Bump version: {current_version} → {new_version}` + + type + : string + + command line option + : `--message` + + environment var + : `BUMPVERSION_MESSAGE` -The tag message template to use when creating a tag, when [`tag`](configuration.md#tag) is `True` +The commit message template to use when creating a commit. This is only used when the [`commit`](configuration.md#commit) option is set to `True`. This string is templated using the [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. -`bump-my-version` creates an *annotated* tag in Git by default. To disable this and create a *lightweight* tag, you must explicitly set an empty `tag_message` value. - -### `current_version` - -:required: **Yes** - -:default: `""` - -:type: string - -:command line option: `--current-version` - -:environment var: `BUMPVERSION_CURRENT_VERSION` - -The current version of the software package before bumping. A value for this is required. - ### `parse` -:required: No - -:default: `(?P\d+)\.(?P\d+)\.(?P\d+)` +::: field-list + required + : No + + default + : `(?P\d+)\.(?P\d+)\.(?P\d+)` + + type + : string + + command line option + : `--parse` + + environment var + : `BUMPVERSION_PARSE` -:type: string +This is the default regular expression (using [Python regular expression syntax](https://docs.python.org/3/library/re.html#regular-expression-syntax)) for finding and parsing the version string into its components. Individual part or file configurations may override this. -:command line option: `--parse` +The regular expression must be able to parse all strings produced by the configured [`serialize`](configuration.md#serialize) value. Named matching groups ("`(?P...)`") indicate the version part the matched value belongs to. -:environment var: `BUMPVERSION_PARSE` +### `replace` +::: field-list + required + : No + + default + : `{new_version}` + + type + : string + + command line option + : `--replace` + + environment var + : `BUMPVERSION_REPLACE` -This is the default regular expression (using [Python regular expression syntax](https://docs.python.org/3/library/re.html#regular-expression-syntax)) for finding and parsing the version string into its components. Individual part or file configurations may override this. +This is the template to create the string that will replace the current version number in the file. -The regular expression must be able to parse all strings produced by the configured [`serialize`](configuration.md#serialize) value. Named matching groups ("`(?P...)`") indicate the version part the matched value belongs to. +### `search` -### `serialize` -:required: No +::: field-list + required + : No + + default + : `{current_version}` + + type + : string + + command line option + : `--search` + + environment var + : `BUMPVERSION_SEARCH` -:default: `["{major}.{minor}.{patch}"]` +This is the template string how to search for the string to be replaced in the file. Individual file configurations may override this. This can span multiple lines, and is templated using [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. -:type: an array of strings +This is useful if there is the remotest possibility that the current version number might be present multiple times in the file and you mean to only bump one of the occurrences. -:command line option: `--serialize` +### `serialize` -:environment var: `BUMPVERSION_SERIALIZE` +::: field-list + required + : No + + default + : `["{major}.{minor}.{patch}"]` + + type + : an array of strings + + command line option + : `--serialize` + + environment var + : `BUMPVERSION_SERIALIZE` This is the default list of templates specifying how to serialize the version parts back to a version string. Individual part or file configurations may override this. @@ -250,87 +255,139 @@ Since `0` is optional by default, Version `1.8.9` will serialize to `1.8.9`, `1 Each string is templated using the [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. -### `search` -:required: No +### `sign_tags` + +::: field-list + + required + : No + + default + : `False` (Don't sign tags) + + type + : boolean + + command line option + : `(--sign-tags | --no-sign-tags)` + + environment var + : `BUMPVERSION_SIGN_TAGS` -:default: `{current_version}` +If `True`, sign the created tag, when [`tag`](configuration.md#tag) is `True`. -:type: string +### `tag` -:command line option: `--search` +::: field-list -:environment var: `BUMPVERSION_SEARCH` + required + : No -This is the template string how to search for the string to be replaced in the file. Individual file configurations may override this. This can span multiple lines, and is templated using [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. + default + : `False` (Don't create a tag) -This is useful if there is the remotest possibility that the current version number might be present multiple times in the file and you mean to only bump one of the occurrences. + type + : boolean -### `replace` -:required: No + command line option + : `(--tag | --no-tag)` -:default: `{new_version}` + environment var + : `BUMPVERSION_TAG` -:type: string +If `True`, create a tag after committing the changes. The tag is named using the [`tag_name`](configuration.md#tag-name) option. -:command line option: `--replace` +If you are using `git`, don't forget to `git-push` with the `--tags` flag when you are done. -:environment var: `BUMPVERSION_REPLACE` +### `tag_name` -This is the template to create the string that will replace the current version number in the file. +::: field-list -### `ignore_missing_version` -:required: No + required + : No -:default: `False` + default + : `v{new_version}` -:type: boolean + type + : string -:command line option: `--ignore-missing-version` + command line option + : `--tag-name` -:environment var: `BUMPVERSION_IGNORE_MISSING_VERSION` + environment var + : `BUMPVERSION_TAG_NAME` -If `True`, don't fail if the version string to be replaced is not found in the file. +The name template used to render the tag, when [`tag`](configuration.md#tag) is `True`. -### TOML example +This string is templated using the [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. -```toml -[tool.bumpversion] -allow_dirty = false -commit = false -message = "Bump version: {current_version} → {new_version}" -commit_args = "" -tag = false -sign_tags = false -tag_name = "v{new_version}" -tag_message = "Bump version: {current_version} → {new_version}" -current_version = "1.0.0" -parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)" -serialize = [ - "{major}.{minor}.{patch}" -] -search = "{current_version}" -replace = "{new_version}" -``` +### `tag_message` -### INI-style example +::: field-list + required + : No + + default + : `Bump version: {current_version} → {new_version}` + + type + : string + + command line option + : `--tag-message` + + environment var + : `BUMPVERSION_TAG_MESSAGE` -```ini -[bumpversion] -allow_dirty = False -commit = False -message = Bump version: {current_version} → {new_version} -commit_args = -tag = False -sign_tags = False -tag_name = v{new_version} -tag_message = Bump version: {current_version} → {new_version} -current_version = 1.0.0 -parse = (?P\d+)\.(?P\d+)\.(?P\d+) -serialize = - {major}.{minor}.{patch} -search = {current_version} -replace = {new_version} -``` +The tag message template to use when creating a tag, when [`tag`](configuration.md#tag) is `True` + +This string is templated using the [Python Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax). The [formatting context reference](formatting-context.md) describes the available variables. + +Bump My Version creates an *annotated* tag in Git by default. To disable this and create a *lightweight* tag, you must explicitly set an empty `tag_message` value. + +### Examples + +=== "TOML" + + ```toml + [tool.bumpversion] + allow_dirty = false + commit = false + message = "Bump version: {current_version} → {new_version}" + commit_args = "" + tag = false + sign_tags = false + tag_name = "v{new_version}" + tag_message = "Bump version: {current_version} → {new_version}" + current_version = "1.0.0" + parse = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)" + serialize = [ + "{major}.{minor}.{patch}" + ] + search = "{current_version}" + replace = "{new_version}" + ``` + +=== "CFG" + + ```ini + [bumpversion] + allow_dirty = False + commit = False + message = Bump version: {current_version} → {new_version} + commit_args = + tag = False + sign_tags = False + tag_name = v{new_version} + tag_message = Bump version: {current_version} → {new_version} + current_version = 1.0.0 + parse = (?P\d+)\.(?P\d+)\.(?P\d+) + serialize = + {major}.{minor}.{patch} + search = {current_version} + replace = {new_version} + ``` ## Version part-specific configuration @@ -340,161 +397,211 @@ You only need to configure version parts if they deviate from the default, and t ### `values` -:required: No - -:default: numeric (i.e. `0`, `1`, `2`, …) - -:type: an array of strings. An empty array is treated as indicating `numeric` values. +::: field-list + required + : No + + default + : numeric (i.e. `0`, `1`, `2`, …) + + type + : array of strings -An explicit list of all values to iterate through when bumping this part. +An explicit list of all values to iterate through when bumping this part. An empty array is treated as indicating `numeric` values. ### `optional_value` -:required: No - -:default: The first entry in `values`, `0` when using numeric values -:type: string +::: field-list + required + : No + + default + : The first entry in `values`, `0` when using numeric values + + type + : string When the version part matches this value it is considered optional when serializing the final version string. -:::{note} +!!! note -Numeric values are still treated as strings internally, so when specifying an optional value, you must use a string. + Numeric values are still treated as strings internally, so when specifying an optional value, you must use a string. -::: ### `first_value` -:required: No -:default: The first entry in `values`, `0` when using numeric values +::: field-list + required + : No + + default + : The first entry in `values`, `0` when using numeric values -:type: string + type + : string When the part is reset, the value will be set to the value specified here. -:::{note} +!!! note -Numeric values are still treated as strings internally, so when specifying a first value, you must use a string. - -::: + Numeric values are still treated as strings internally, so when specifying a first value, you must use a string. ### `independent` -:required: No - -:default: `False` -:type: boolean +::: field-list + required + : No + + default + : `False` + + type + : boolean When this value is set to `True`, the part is not reset when other parts are incremented. Its incrementation is independent of the other parts. It is useful when you have a build number in your version that is incremented independently of the actual version. -### TOML example +### Examples -```toml -[tool.bumpversion.parts.release] -values = [ - "alpha", - "beta", - "gamma" -] -optional_value = "gamma" -``` +=== "TOML" -### INI-style example + ```toml + [tool.bumpversion.parts.release] + values = [ + "alpha", + "beta", + "gamma" + ] + optional_value = "gamma" + ``` -```ini -[bumpversion:part:release] -optional_value = gamma -values = - alpha - beta - gamma -``` +=== "CFG" + + ```ini + [bumpversion:part:release] + optional_value = gamma + values = + alpha + beta + gamma + ``` ## File-specific configuration -This section configures which files bump-my-version should update by replacing their current version with the newly bumped version. +This section configures which files Bump My Version should update by replacing their current version with the newly bumped version. ### `filename` -:required: **Yes‡** - -:default: empty - -:type: string +::: field-list + required + : **Yes‡** + + default + : empty + + type + : string The name of the file to modify. -:::{Note} +!!! note -‡ This is only used with TOML configuration, and is only required if [`glob`](#glob) is _not_ specified. INI-style configuration files specify the file name as part of the grouping. + ‡ This is only used with TOML configuration, and is only required if [`glob`](#glob) is _not_ specified. INI-style configuration files specify the file name as part of the grouping. -::: ### `glob` -:required: **Yes‡** - -:default: empty - -:type: string +::: field-list + required + : **Yes‡** + + default + : empty + + type + : string The glob pattern specifying the files to modify. -:::{Note} +!!! note -‡ This is only used with TOML configuration, and is only required if [`filename`](#filename) is _not_ specified. INI-style configuration files specify the glob pattern as part of the grouping. + ‡ This is only used with TOML configuration, and is only required if [`filename`](#filename) is _not_ specified. INI-style configuration files specify the glob pattern as part of the grouping. -::: ### `parse` -:required: No - -:default: the value configured in the global `parse` field +::: field-list -:type: string + required + : No + + default + : the value configured in the global `parse` field + + type + : string This is an override to the default pattern to parse the version number from this file. ### `serialize` -:required: No - -:default: The value configured in the global `serialize` field +::: field-list -:type: an array of strings + required + : No + + default + : the value configured in the global `serialize` field + + type + : an array of strings This is an override to the default templates to serialize the new version number in this file. ### `search` -:required: No - -:default: The value configured in the global `search` field +::: field-list -:type: string + required + : No + + default + : the value configured in the global `search` field + + type + : string This is an override to the default template string how to search for the string to be replaced in the file. ### `replace` -:required: No - -:default: The value configured in the global `replace` field +::: field-list -:type: string + required + : No + + default + : the value configured in the global `replace` field + + type + : string This is an override to the template to create the string that will replace the current version number in the file. ### `ignore_missing_version` -:required: No -:default: The value configured in the global `ignore_missing_version` field +::: field-list -:type: boolean + required + : No + + default + : The value configured in the global `ignore_missing_version` field + + type + : boolean If `True`, don't fail if the version string to be replaced is not found in the file. @@ -504,11 +611,10 @@ INI-style configuration is in the section: `[bumpversion:file:]` or `[ Both, `file:` and `glob:` are configured the same. Their difference is that file will match file names directly like `requirements.txt`. While glob also matches multiple files via wildcards like `**/pom.xml`. -:::{note} +!!! note -The configuration file format requires each section header to be unique. If you want to process a certain file multiple times, you may append a description between parens to the `file` keyword: `[bumpversion:file (special one):…]`. + The configuration file format requires each section header to be unique. If you want to process a certain file multiple times, you may append a description between parens to the `file` keyword: `[bumpversion:file (special one):…]`. -::: For example, to change `coolapp/__init__.py` with the defaults, and alter `CHANGELOG.md` in twice: diff --git a/docsrc/reference/formatting-context.md b/docsrc/reference/formatting-context.md index 1f7bb7dc..345fe0c9 100644 --- a/docsrc/reference/formatting-context.md +++ b/docsrc/reference/formatting-context.md @@ -10,16 +10,24 @@ These fields are available for ## Escaped characters -**`#`** The literal hash or [octothorpe](https://www.merriam-webster.com/dictionary/octothorpe) character. +::: field-list -**`;`** The literal semicolon character. + `#` + : The literal hash or [octothorpe](https://www.merriam-webster.com/dictionary/octothorpe) character. + + `;` + : The literal semicolon character. ## Date and time fields -**`now`** A Python datetime object representing the current local time, without a time zone reference. +::: field-list -**`utcnow`** A Python datetime object representing the current local time in the UTC time zone. + `now` + : A Python datetime object representing the current local time, without a time zone reference. + + `utcnow` + : A Python datetime object representing the current local time in the UTC time zone. You can provide [additional formatting guidance](https://docs.python.org/3.11/library/datetime.html#strftime-and-strptime-format-codes) for datetime objects using formatting codes. Put the formatting codes after the field and a colon. For example, `{now:%Y-%m-%d}` would output the current local time as `2023-04-20`. @@ -27,34 +35,50 @@ You can provide [additional formatting guidance](https://docs.python.org/3.11/li These fields will only have values if the code is in a Git or Mercurial repository. -**`commit_sha`** The latest commit reference. - -**`distance_to_latest_tag`** The number of commits since the latest tag. - -**`dirty`** A boolean indicating if the current repository has pending changes. - -**`branch_name`** The current branch name. - -**`short_branch_name`** The current branch name, converted to lowercase, with non-alphanumeric characters removed and truncated to 20 characters. For example, `feature/MY-long_branch-name` would become `featuremylongbranchn`. +::: field-list + + `commit_sha` + : The latest commit reference. + + `distance_to_latest_tag` + : The number of commits since the latest tag. + + `dirty` + : A boolean indicating if the current repository has pending changes. + + `branch_name` + : The current branch name. + + `short_branch_name` + : The current branch name, converted to lowercase, with non-alphanumeric characters removed and truncated to 20 characters. For example, `feature/MY-long_branch-name` would become `featuremylongbranchn`. ## Version fields -**`current_version`** The current version serialized as a string +::: field-list + `current_version` + : The current version serialized as a string + + `current_` + : Each version part defined by the [version configuration parsing regular expression](version-parts.md#version-configuration). The default configuration would have `current_major`, `current_minor`, and `current_patch` available. + + `new_version` + : The new version serialized as a string + + `new_` + : Each version part defined by the [version configuration parsing regular expression](version-parts.md#version-configuration). The default configuration would have `new_major`, `new_minor`, and `new_patch` available. -**`current_`** Each version part defined by the [version configuration parsing regular expression](version-parts.md#version-configuration). The default configuration would have `current_major`, `current_minor`, and `current_patch` available. +!!! note -**`new_version`** The new version serialized as a string + The following fields are only available when serializing a version. -**`new_`** Each version part defined by the [version configuration parsing regular expression](version-parts.md#version-configuration). The default configuration would have `new_major`, `new_minor`, and `new_patch` available. - -:::{note} -The following fields are only available when serializing a version. -::: - -**``** Each version part defined by the [version configuration parsing regular expression](version-parts.md#version-configuration). The default configuration would have `major`, `minor`, and `patch` available. +::: field-list + `` + : Each version part defined by the [version configuration parsing regular expression](version-parts.md#version-configuration). The default configuration would have `major`, `minor`, and `patch` available. ## Environment variables Every environment variable available at runtime is included with a `$` prefix. For example if `USER` was in the environment, `{$USER}` would render that value. -If you use environment variables in your version serialization, you might want to ensure they are set by executing `export VAR=value` before running the `bump-my-version` command. +!!! tip + + If you use environment variables in your version serialization, you might want to ensure they are set by executing `export VAR=value` before running the `bump-my-version` command. diff --git a/docsrc/reference/index.md b/docsrc/reference/index.md index 61c12d36..598778f3 100644 --- a/docsrc/reference/index.md +++ b/docsrc/reference/index.md @@ -1,15 +1,9 @@ # Reference - -```{toctree} ---- -titlesonly: true ---- -cli -configuration -formatting-context -version-parts -search-and-replace-config -bumpversion/bumpversion -``` +- [Command-line interface](cli.md) +- [Configuration](configuration.md) +- [Formatting context](formatting-context.md) +- [Version parts](version-parts.md) +- [Search and replace configuration](search-and-replace-config.md) +- [API](api/bumpversion.md) diff --git a/docsrc/reference/search-and-replace-config.md b/docsrc/reference/search-and-replace-config.md index d4dd4ecc..6a74f2ec 100644 --- a/docsrc/reference/search-and-replace-config.md +++ b/docsrc/reference/search-and-replace-config.md @@ -53,17 +53,17 @@ If you are using a TOML-formatted configuration file, you must also escape backs The following template: -```toml -# TOML-formatted configuration file -search = "{current_version} date-released: \\d{{4}}-\\d{{2}}-\\d{{2}}" -``` +=== "TOML" -or + ```toml + search = "{current_version} date-released: \\d{{4}}-\\d{{2}}-\\d{{2}}" + ``` -```ini -# INI-formatted configuration file -search = "{current_version} date-released: \d{{4}}-\d{{2}}-\d{{2}}" -``` +=== "CFG" + + ```ini + search = "{current_version} date-released: \d{{4}}-\d{{2}}-\d{{2}}" + ``` Gets rendered to: diff --git a/docsrc/reference/version-parts.md b/docsrc/reference/version-parts.md index 116da766..06900061 100644 --- a/docsrc/reference/version-parts.md +++ b/docsrc/reference/version-parts.md @@ -1,7 +1,7 @@ # Version parts - The version string is the rendering of some or all version parts. -- While the version string may be rendered differently in various places, the value for all parts is maintained in bump-my-version's configuration. +- While the version string may be rendered differently in various places, the value for all parts is maintained in Bump My Version's configuration. - The version parts are typically dependent on each other. Incrementing one part might change other elements. - You can compare two version strings (of the same project) and know which is more recent. @@ -25,7 +25,7 @@ serialize = [ ] ``` -Bump-my-version will serialize using the first format if the `patch` value is not `0`. If the `patch` value *is* `0`, bump-my-version will use the second format. +Bump-my-version will serialize using the first format if the `patch` value is not `0`. If the `patch` value *is* `0`, Bump My Version will use the second format. ## Version part configuration diff --git a/docsrc/tutorials/index.md b/docsrc/tutorials/index.md index 46166c25..4978d42d 100644 --- a/docsrc/tutorials/index.md +++ b/docsrc/tutorials/index.md @@ -1,7 +1,5 @@ # Tutorials - -```{toctree} -semantic-versioning-example -``` +- [Versioning using semantic versioning](semantic-versioning-example.md) +- [Basic usage](usage.md) diff --git a/mkdocs.yml b/mkdocs.yml index 9ee40155..15527dd7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,8 +3,11 @@ repo_url: https://github.com/callowayproject/bump-my-version edit_uri: edit/master/docs/ copyright: Calloway Project docs_dir: docsrc +watch: + - overrides theme: name: material + custom_dir: overrides logo: _static/bump-my-version-logo.svg favicon: _static/favicon.png features: @@ -16,6 +19,7 @@ theme: - content.action.edit - content.action.view - content.code.annotate + - content.tabs.link palette: - media: "(prefers-color-scheme: light)" scheme: default @@ -44,7 +48,12 @@ markdown_extensions: emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.highlight - pymdownx.snippets - - pymdownx.tabbed + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower - toc: permalink: true toc_depth: 3 @@ -56,12 +65,46 @@ plugins: - git-authors: show_email_address: false - include-markdown + - drawio + - literate-nav: + nav_file: SUMMARY.md + - gen-files: + scripts: + - docsrc/gen_doc_stubs.py + - mkdocstrings: + custom_templates: overrides/mkdocstrings + handlers: + python: + import: + - https://docs.python.org/3/objects.inv + - https://numpy.org/doc/stable/objects.inv + - https://pandas.pydata.org/docs/objects.inv + - https://api.python.langchain.com/en/latest/objects.inv + options: + allow_inspection: true + docstring_style: google + docstring_options: + ignore_init_summary: true + docstring_section_style: spacy + enable_inventory: true + group_by_category: true + members_order: alphabetical + merge_init_into_class: true + separate_signature: true + show_docstring_parameters: true + show_signature_annotations: true + show_source: false + show_symbol_type_heading: true + show_symbol_type_toc: true + show_category_heading: true extra_javascript: - "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML" extra_css: - _static/css/custom.css + - _static/css/mkdocstrings.css + - _static/css/cards.css #nav: # - General: "general/" diff --git a/pyproject.toml b/pyproject.toml index bcefd887..0f54d7b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,16 +58,19 @@ dev = [ "pre-commit", ] docs = [ + "markdown-customblocks", + "mdx-truly-sane-lists", "mkdocs", - "mkdocs-material", - "mkdocstrings[python]", - "mkdocs-include-markdown-plugin", "mkdocs-click", - "markdown-customblocks", - "mkdocs-git-revision-date-localized-plugin", + "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-git-committers-plugin", - "mdx-truly-sane-lists", + "mkdocs-git-revision-date-localized-plugin", + "mkdocs-include-markdown-plugin", + "mkdocs-literate-nav", + "mkdocs-material", + "mkdocstrings", + "mkdocstrings[python]", ] test = [ "coverage", diff --git a/tools/drawioexport.py b/tools/drawioexport.py new file mode 100644 index 00000000..3d22a27e --- /dev/null +++ b/tools/drawioexport.py @@ -0,0 +1,135 @@ +"""Draw.io export script.""" + +import os.path +import shutil +import subprocess +import sys +from pathlib import Path +from typing import List, Optional + + +def get_executable_paths() -> list[str]: + """Get the Draw.io executable paths for the platform. + + Declared as a function to allow us to use API/environment information + available only when running under the specified platform. + + Returns: + All known paths. + """ + if sys.platform.startswith("darwin"): + applications = [os.path.expanduser("~/Applications"), "/Applications"] + drawio_path = os.path.join("draw.io.app", "Contents", "MacOS", "draw.io") + return [os.path.join(d, drawio_path) for d in applications] + elif sys.platform.startswith("linux"): + return ["/opt/draw.io/drawio"] + elif sys.platform.startswith("win32"): + program_files = [os.environ["ProgramFiles"]] + if "ProgramFiles(x86)" in os.environ: + program_files.append(os.environ["ProgramFiles(x86)"]) + return [os.path.join(d, "draw.io", "draw.io.exe") for d in program_files] + else: + return [] + + +def get_drawio_executable(executable_names: Optional[List[str]] = None) -> Optional[str]: + """Ensure the Draw.io executable path is configured, or guess it. + + Args: + executable_names: List of executable names to check. + + Returns: + Final Draw.io executable. + """ + executable_names = executable_names or ["draw.io", "drawio"] + + for executable_name in executable_names: + executable = shutil.which(executable_name) + if executable: + return executable + + executable_paths = get_executable_paths() + + return next( + (executable_path for executable_path in executable_paths if os.path.isfile(executable_path)), + None, + ) + + +def use_cached_file(source: Path, cache_filename: Path) -> bool: + """Is the cached copy up to date? + + Args: + source: Source path. + cache_filename: Export cache filename. + + Returns: + True if cache is up to date else False. + """ + return cache_filename.exists() and cache_filename.stat().st_mtime >= source.stat().st_mtime + + +def export_file( + source: Path, + page_index: int, + dest: Path, + export_format: str, +) -> int: + """Export an individual file. + + Args: + source: Source path, absolute. + page_index: Page index, numbered from zero. + dest: Destination path, within cache. + export_format: Export format. + + Returns: + The Draw.io exit status. + """ + drawio_executable = get_drawio_executable() + cmd = [ + str(drawio_executable), + "--export", + str(source), + "--page-index", + str(page_index), + "--output", + str(dest), + "--format", + export_format, + "--embed-svg-images", + "--scale", + "2", + ] + result = subprocess.run(cmd) # noqa: S603 + return result.returncode + + +def export_file_if_needed(source: Path, page_index: int, dest_path: Path) -> None: + """Export an individual file if needed. + + Args: + source: Source path, absolute. + page_index: Page index, numbered from zero. + dest_path: Destination path. + """ + if not use_cached_file(source, dest_path): + export_file(source, page_index, dest_path, "svg") + else: + print(f"Using cached file {dest_path}") # noqa: T201 + + +if __name__ == "__main__": + output_files = [ + "creating-a-version-spec.svg", + "creating-a-version.svg", + "serializing-a-version-1.svg", + "serializing-a-version-1-0-0.svg", + "serializing-a-version-1-2-0.svg", + "serializing-a-version-1-2-3.svg", + ] + source_path = Path(__file__).parent.parent.joinpath("docsrc/_static/bump-my-version-model.drawio") + dest_path = Path(__file__).parent.parent.joinpath("docsrc/_static/") + for index, filename in enumerate(output_files): + filepath = dest_path.joinpath(filename) + export_file_if_needed(source_path, index, filepath) From 7b6ef7dee877bffd826af28cd735f0dd392e9356 Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Sun, 18 Feb 2024 10:50:38 -0600 Subject: [PATCH 5/6] Fixes coverage issues !minor --- bumpversion/files.py | 2 +- pyproject.toml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/bumpversion/files.py b/bumpversion/files.py index 82e2f78a..48f8a4c3 100644 --- a/bumpversion/files.py +++ b/bumpversion/files.py @@ -111,7 +111,7 @@ def get_file_contents(self) -> str: The contents of the file """ if not os.path.exists(self.file_change.filename): - raise FileNotFoundError(f"File not found: '{self.file_change.filename}'") + raise FileNotFoundError(f"File not found: '{self.file_change.filename}'") # pragma: no-coverage with open(self.file_change.filename, "rt", encoding="utf-8") as f: contents = f.read() diff --git a/pyproject.toml b/pyproject.toml index 0f54d7b3..97b1eb24 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -230,9 +230,6 @@ values = ["release", "post"] [[tool.bumpversion.files]] filename = "bumpversion/__init__.py" -[[tool.bumpversion.files]] -filename = "docsrc/reference/bumpversion/bumpversion.md" - [[tool.bumpversion.files]] filename = "CHANGELOG.md" search = "Unreleased" From 406199e5394087af3a8afcd124acff6731f90c9e Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Sun, 18 Feb 2024 10:59:38 -0600 Subject: [PATCH 6/6] Fixed a coverage error !minor --- bumpversion/files.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bumpversion/files.py b/bumpversion/files.py index 48f8a4c3..5ba9edfc 100644 --- a/bumpversion/files.py +++ b/bumpversion/files.py @@ -182,7 +182,7 @@ def make_file_change( logger.info("File not found, but ignoring") logger.dedent() return - raise FileNotFoundError(f"File not found: '{self.file_change.filename}'") + raise FileNotFoundError(f"File not found: '{self.file_change.filename}'") # pragma: no-coverage logger.debug("Serializing the current version") logger.indent() context["current_version"] = self.version_config.serialize(current_version, context)