|  | 
| 3 | 3 | import os | 
| 4 | 4 | from pathlib import Path | 
| 5 | 5 | from textwrap import dedent | 
| 6 |  | -from typing import TYPE_CHECKING, Iterator, Optional | 
|  | 6 | +from typing import TYPE_CHECKING, Iterator, Optional, Type | 
| 7 | 7 | 
 | 
| 8 | 8 | import pytest | 
| 9 | 9 | 
 | 
|  | 
| 17 | 17 |     Pep621Provider, | 
| 18 | 18 |     PoetryProvider, | 
| 19 | 19 |     ScmProvider, | 
|  | 20 | +    VersionProvider, | 
| 20 | 21 |     get_provider, | 
| 21 | 22 | ) | 
| 22 | 23 | from tests.utils import create_file_and_commit, create_tag | 
| @@ -56,137 +57,101 @@ def test_commitizen_provider(config: BaseConfig, mocker: MockerFixture): | 
| 56 | 57 |     mock.assert_called_once_with("version", "43.1") | 
| 57 | 58 | 
 | 
| 58 | 59 | 
 | 
| 59 |  | -def test_pep621_provider(config: BaseConfig, chdir: Path): | 
| 60 |  | -    pyproject_toml = chdir / "pyproject.toml" | 
| 61 |  | -    pyproject_toml.write_text( | 
| 62 |  | -        dedent( | 
| 63 |  | -            """\ | 
| 64 |  | -            [project] | 
| 65 |  | -            version = "0.1.0" | 
| 66 |  | -            """ | 
| 67 |  | -        ) | 
| 68 |  | -    ) | 
| 69 |  | - | 
| 70 |  | -    provider = Pep621Provider(config) | 
| 71 |  | - | 
| 72 |  | -    assert provider.get_version() == "0.1.0" | 
| 73 |  | - | 
| 74 |  | -    provider.set_version("43.1") | 
| 75 |  | - | 
| 76 |  | -    assert pyproject_toml.read_text() == dedent( | 
|  | 60 | +FILE_PROVIDERS = dict( | 
|  | 61 | +    pep621=( | 
|  | 62 | +        "pyproject.toml", | 
|  | 63 | +        Pep621Provider, | 
| 77 | 64 |         """\ | 
| 78 | 65 |         [project] | 
| 79 |  | -        version = "43.1" | 
| 80 |  | -        """ | 
| 81 |  | -    ) | 
| 82 |  | - | 
| 83 |  | - | 
| 84 |  | -def test_poetry_provider(config: BaseConfig, chdir: Path): | 
| 85 |  | -    pyproject_toml = chdir / "pyproject.toml" | 
| 86 |  | -    pyproject_toml.write_text( | 
| 87 |  | -        dedent( | 
| 88 |  | -            """\ | 
| 89 |  | -            [tool.poetry] | 
| 90 |  | -            version = "0.1.0" | 
| 91 |  | -            """ | 
| 92 |  | -        ) | 
| 93 |  | -    ) | 
| 94 |  | -    config.settings["version_provider"] = "poetry" | 
| 95 |  | - | 
| 96 |  | -    provider = get_provider(config) | 
| 97 |  | -    assert isinstance(provider, PoetryProvider) | 
| 98 |  | -    assert provider.get_version() == "0.1.0" | 
| 99 |  | - | 
| 100 |  | -    provider.set_version("43.1") | 
| 101 |  | -    assert pyproject_toml.read_text() == dedent( | 
|  | 66 | +        version = "0.1.0" | 
|  | 67 | +        """, | 
|  | 68 | +        """\ | 
|  | 69 | +        [project] | 
|  | 70 | +        version = "42.1" | 
|  | 71 | +        """, | 
|  | 72 | +    ), | 
|  | 73 | +    poetry=( | 
|  | 74 | +        "pyproject.toml", | 
|  | 75 | +        PoetryProvider, | 
| 102 | 76 |         """\ | 
| 103 | 77 |         [tool.poetry] | 
| 104 |  | -        version = "43.1" | 
| 105 |  | -        """ | 
| 106 |  | -    ) | 
| 107 |  | - | 
| 108 |  | - | 
| 109 |  | -def test_cargo_provider(config: BaseConfig, chdir: Path): | 
| 110 |  | -    cargo_toml = chdir / "Cargo.toml" | 
| 111 |  | -    cargo_toml.write_text( | 
| 112 |  | -        dedent( | 
| 113 |  | -            """\ | 
| 114 |  | -            [package] | 
| 115 |  | -            version = "0.1.0" | 
| 116 |  | -            """ | 
| 117 |  | -        ) | 
| 118 |  | -    ) | 
| 119 |  | -    config.settings["version_provider"] = "cargo" | 
| 120 |  | - | 
| 121 |  | -    provider = get_provider(config) | 
| 122 |  | -    assert isinstance(provider, CargoProvider) | 
| 123 |  | -    assert provider.get_version() == "0.1.0" | 
| 124 |  | - | 
| 125 |  | -    provider.set_version("43.1") | 
| 126 |  | -    assert cargo_toml.read_text() == dedent( | 
|  | 78 | +        version = "0.1.0" | 
|  | 79 | +        """, | 
|  | 80 | +        """\ | 
|  | 81 | +        [tool.poetry] | 
|  | 82 | +        version = "42.1" | 
|  | 83 | +        """, | 
|  | 84 | +    ), | 
|  | 85 | +    cargo=( | 
|  | 86 | +        "Cargo.toml", | 
|  | 87 | +        CargoProvider, | 
| 127 | 88 |         """\ | 
| 128 | 89 |         [package] | 
| 129 |  | -        version = "43.1" | 
| 130 |  | -        """ | 
| 131 |  | -    ) | 
| 132 |  | - | 
| 133 |  | - | 
| 134 |  | -def test_npm_provider(config: BaseConfig, chdir: Path): | 
| 135 |  | -    package_json = chdir / "package.json" | 
| 136 |  | -    package_json.write_text( | 
| 137 |  | -        dedent( | 
| 138 |  | -            """\ | 
| 139 |  | -            { | 
| 140 |  | -              "name": "whatever", | 
| 141 |  | -              "version": "0.1.0" | 
| 142 |  | -            } | 
| 143 |  | -            """ | 
| 144 |  | -        ) | 
| 145 |  | -    ) | 
| 146 |  | -    config.settings["version_provider"] = "npm" | 
| 147 |  | - | 
| 148 |  | -    provider = get_provider(config) | 
| 149 |  | -    assert isinstance(provider, NpmProvider) | 
| 150 |  | -    assert provider.get_version() == "0.1.0" | 
| 151 |  | - | 
| 152 |  | -    provider.set_version("43.1") | 
| 153 |  | -    assert package_json.read_text() == dedent( | 
|  | 90 | +        version = "0.1.0" | 
|  | 91 | +        """, | 
|  | 92 | +        """\ | 
|  | 93 | +        [package] | 
|  | 94 | +        version = "42.1" | 
|  | 95 | +        """, | 
|  | 96 | +    ), | 
|  | 97 | +    npm=( | 
|  | 98 | +        "package.json", | 
|  | 99 | +        NpmProvider, | 
| 154 | 100 |         """\ | 
| 155 | 101 |         { | 
| 156 | 102 |           "name": "whatever", | 
| 157 |  | -          "version": "43.1" | 
|  | 103 | +          "version": "0.1.0" | 
| 158 | 104 |         } | 
| 159 |  | -        """ | 
| 160 |  | -    ) | 
| 161 |  | - | 
| 162 |  | - | 
| 163 |  | -def test_composer_provider(config: BaseConfig, chdir: Path): | 
| 164 |  | -    composer_json = chdir / "composer.json" | 
| 165 |  | -    composer_json.write_text( | 
| 166 |  | -        dedent( | 
| 167 |  | -            """\ | 
| 168 |  | -            { | 
| 169 |  | -                "name": "whatever", | 
| 170 |  | -                "version": "0.1.0" | 
| 171 |  | -            } | 
| 172 |  | -            """ | 
| 173 |  | -        ) | 
| 174 |  | -    ) | 
| 175 |  | -    config.settings["version_provider"] = "composer" | 
| 176 |  | - | 
| 177 |  | -    provider = get_provider(config) | 
| 178 |  | -    assert isinstance(provider, ComposerProvider) | 
| 179 |  | -    assert provider.get_version() == "0.1.0" | 
| 180 |  | - | 
| 181 |  | -    provider.set_version("43.1") | 
| 182 |  | -    assert composer_json.read_text() == dedent( | 
|  | 105 | +        """, | 
|  | 106 | +        """\ | 
|  | 107 | +        { | 
|  | 108 | +          "name": "whatever", | 
|  | 109 | +          "version": "42.1" | 
|  | 110 | +        } | 
|  | 111 | +        """, | 
|  | 112 | +    ), | 
|  | 113 | +    composer=( | 
|  | 114 | +        "composer.json", | 
|  | 115 | +        ComposerProvider, | 
| 183 | 116 |         """\ | 
| 184 | 117 |         { | 
| 185 | 118 |             "name": "whatever", | 
| 186 |  | -            "version": "43.1" | 
|  | 119 | +            "version": "0.1.0" | 
| 187 | 120 |         } | 
| 188 |  | -        """ | 
| 189 |  | -    ) | 
|  | 121 | +        """, | 
|  | 122 | +        """\ | 
|  | 123 | +        { | 
|  | 124 | +            "name": "whatever", | 
|  | 125 | +            "version": "42.1" | 
|  | 126 | +        } | 
|  | 127 | +        """, | 
|  | 128 | +    ), | 
|  | 129 | +) | 
|  | 130 | + | 
|  | 131 | + | 
|  | 132 | +@pytest.mark.parametrize( | 
|  | 133 | +    "id,filename,cls,content,expected", | 
|  | 134 | +    (pytest.param(id, *FILE_PROVIDERS[id], id=id) for id in FILE_PROVIDERS), | 
|  | 135 | +) | 
|  | 136 | +def test_file_providers( | 
|  | 137 | +    config: BaseConfig, | 
|  | 138 | +    chdir: Path, | 
|  | 139 | +    id: str, | 
|  | 140 | +    filename: str, | 
|  | 141 | +    cls: Type[VersionProvider], | 
|  | 142 | +    content: str, | 
|  | 143 | +    expected: str, | 
|  | 144 | +): | 
|  | 145 | +    file = chdir / filename | 
|  | 146 | +    file.write_text(dedent(content)) | 
|  | 147 | +    config.settings["version_provider"] = id | 
|  | 148 | + | 
|  | 149 | +    provider = get_provider(config) | 
|  | 150 | +    assert isinstance(provider, cls) | 
|  | 151 | +    assert provider.get_version() == "0.1.0" | 
|  | 152 | + | 
|  | 153 | +    provider.set_version("42.1") | 
|  | 154 | +    assert file.read_text() == dedent(expected) | 
| 190 | 155 | 
 | 
| 191 | 156 | 
 | 
| 192 | 157 | @pytest.mark.parametrize( | 
|  | 
0 commit comments