diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9521358b..bfd92756 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,9 @@ defaults: run: shell: bash +env: + PIP_DISABLE_PIP_VERSION_CHECK: "1" + jobs: build: name: ${{ matrix.task.name}} - ${{ matrix.os.name }} ${{ matrix.python.name }} @@ -252,16 +255,13 @@ jobs: with: python-version: 3.12 - - name: Install dependencies - run: | - python -m pip install --upgrade pip wheel - python -m pip install pep517 - - name: Display structure of files to be pushed run: ls --recursive dist/ - - name: Check matched tag version and branch version - on tag - run: python admin/check_tag_version_match.py "${{ github.ref }}" + - name: Ensure tag and package versions match. + run: | + python -Im pip install dist/*.whl + python -I admin/check_tag_version_match.py "${{ github.ref }}" - name: Publish to PyPI - on tag # This was tag 1.9.0 on 2024-07-30 diff --git a/admin/check_tag_version_match.py b/admin/check_tag_version_match.py index f340e040..25ae1809 100644 --- a/admin/check_tag_version_match.py +++ b/admin/check_tag_version_match.py @@ -1,15 +1,16 @@ # # Used during the release process to make sure that we release based on a -# tag that has the same version as the current twisted.__version. +# tag that has the same version as the current packaging metadata. # # Designed to be conditionally called inside GitHub Actions release job. # Tags should use PEP440 version scheme. # -# To be called as: admin/check_tag_version_match.py refs/tags/twisted-20.3.0 +# To be called as: admin/check_tag_version_match.py refs/tags/20.3.0 # + import sys -import pep517.meta +from importlib import metadata TAG_PREFIX = "refs/tags/" @@ -18,7 +19,8 @@ print("No tag check requested.") sys.exit(0) -branch_version = pep517.meta.load(".").version +pkg_version = metadata.version("towncrier") +print(f"Package version is {pkg_version}.") run_version = sys.argv[1] if not run_version.startswith(TAG_PREFIX): @@ -27,9 +29,9 @@ run_version = run_version[len(TAG_PREFIX) :] # noqa: E203 -if run_version != branch_version: - print(f"Branch is at '{branch_version}' while tag is '{run_version}'") +if run_version != pkg_version: + print(f"Package is at '{pkg_version}' while tag is '{run_version}'") exit(1) -print(f"All good. Branch and tag versions match for '{branch_version}'.") +print(f"All good. Package and tag versions match for '{pkg_version}'.") sys.exit(0) diff --git a/docs/configuration.rst b/docs/configuration.rst index 955f62e2..4f253cd8 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -135,7 +135,7 @@ Top level keys ``towncrier check`` will fail if there are any news fragment files that have invalid filenames, except for those in the list. ``towncrier build`` will likewise fail, but only if this list has been configured (set to an empty list if there are no files to ignore). - Some filenames such as ``.gitignore`` and ``README`` are automatically ignored. However, if a custom template is stored in the news fragment directory, you should add it to this list. + Some filenames such as .gitignore, README.rst. README.md, and the template file, are automatically ignored. ``None`` by default. diff --git a/pyproject.toml b/pyproject.toml index 01f99241..4e46bdc5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,5 @@ [build-system] -requires = [ - "hatchling", - "wheel", -] +requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/src/towncrier/_builder.py b/src/towncrier/_builder.py index 62a7d3f3..4192942a 100644 --- a/src/towncrier/_builder.py +++ b/src/towncrier/_builder.py @@ -115,6 +115,11 @@ def find_fragments( If strict, raise ClickException if any fragments have an invalid name. """ ignored_files = {".gitignore", ".keep", "readme", "readme.md", "readme.rst"} + if isinstance(config.template, str): + # Template can be a tuple of (package_name, resource_name). + # + # See https://github.com/twisted/towncrier/issues/634 + ignored_files.add(config.template) if config.ignore: ignored_files.update(filename.lower() for filename in config.ignore) diff --git a/src/towncrier/newsfragments/629.misc b/src/towncrier/newsfragments/629.misc new file mode 100644 index 00000000..0a4215f8 --- /dev/null +++ b/src/towncrier/newsfragments/629.misc @@ -0,0 +1 @@ +Removed build-time dependency on `wheel`. diff --git a/src/towncrier/newsfragments/630.misc.rst b/src/towncrier/newsfragments/630.misc.rst new file mode 100644 index 00000000..e69de29b diff --git a/src/towncrier/newsfragments/632.bugfix.rst b/src/towncrier/newsfragments/632.bugfix.rst new file mode 100644 index 00000000..ea6b68ca --- /dev/null +++ b/src/towncrier/newsfragments/632.bugfix.rst @@ -0,0 +1 @@ +When the template file is stored in the same directory with the news fragments, it is automatically ignored when checking for valid fragment file names. diff --git a/src/towncrier/test/test_build.py b/src/towncrier/test/test_build.py index c14fd582..aa989fd2 100644 --- a/src/towncrier/test/test_build.py +++ b/src/towncrier/test/test_build.py @@ -1631,6 +1631,29 @@ def test_invalid_fragment_name(self, runner): self.assertEqual(1, result.exit_code, result.output) self.assertIn("Invalid news fragment name: feature.124", result.output) + @with_project( + config=""" + [tool.towncrier] + package = "foo" + template = "foo/newsfragments/template.jinja" + """ + ) + def test_ignored_template_string(self, runner): + """ + Files used in `template` are automatically ignored. + """ + with open("foo/newsfragments/123.feature", "w") as f: + f.write("This has valid filename (control case)") + with open("foo/newsfragments/template.jinja", "w") as f: + f.write("Template file should be automatically ignored") + with open("foo/newsfragments/.gitignore", "w") as f: + f.write("gitignore is automatically ignored") + + result = runner.invoke( + _main, ["--draft", "--date", "01-01-2001", "--version", "1.0.0"] + ) + self.assertEqual(0, result.exit_code, result.output) + @with_project() def test_no_ignore_configured(self, runner): """