Skip to content

Commit

Permalink
Remove incremental
Browse files Browse the repository at this point in the history
  • Loading branch information
SmileyChris committed May 2, 2023
1 parent a351582 commit cc040d0
Show file tree
Hide file tree
Showing 13 changed files with 125 additions and 177 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ jobs:

- name: Install dependencies
run: |
python -m pip install --upgrade pip setuptools wheel
python -m pip install --upgrade pip wheel
python -m pip install pep517
- name: Display structure of files to be pushed
Expand Down
13 changes: 6 additions & 7 deletions RELEASE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ The same branch is used for the release candidated and the final release.
In the end, the release branch is merged into the main branch.

Update the version to the release candidate with the first being ``rc1`` (as opposed to 0).
In ``src/towncrier/_version.py`` the version is set using ``incremental`` such as::
In ``pyproject.toml`` the version is set like::

__version__ = Version('towncrier', 19, 9, 0, release_candidate=1)
version = "19.9.0.rc1"

Run ``venv/bin/towncrier build --yes`` to generate the news release NEWS file.
Commit and push to the primary repository, not a fork.
Expand Down Expand Up @@ -59,9 +59,9 @@ Final release
Once the PR is approved, you can trigger the final release.

Update the version to the final version.
In ``src/towncrier/_version.py`` the version is set using ``incremental`` such as::
In ``pyproject.toml`` the version is set like::

__version__ = Version('towncrier', 19, 9, 0)
version = "19.9.0"

Manually update the `NEWS.rst` file to include the final release version and date.
Usually it will look like this::
Expand All @@ -88,10 +88,9 @@ Similar to the release candidate, with the difference:
No need for another review request.

Update the version to the development version.
In ``src/towncrier/_version.py`` the version is set using ``incremental`` such as::

__version__ = Version('towncrier', 19, 9, 1, dev=0)
In ``pyproject.toml`` the version is set like::

version = "19.9.1.dev0"

Commit and push the changes.

Expand Down
32 changes: 0 additions & 32 deletions admin/canonicalize_version.py

This file was deleted.

15 changes: 9 additions & 6 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,14 @@
# ones.
from datetime import date

from towncrier import __version__ as towncrier_version

try:
import importlib.metadata as importlib_metadata
except ImportError: # < Python 3.8
import importlib_metadata


towncrier_version = importlib_metadata.version("towncrier")
extensions = []

# Add any paths that contain templates here, relative to this directory.
Expand All @@ -53,19 +58,17 @@
project = "Towncrier"
copyright = "{}, Towncrier contributors. Ver {}".format(
_today.year,
towncrier_version.public(),
importlib_metadata.version("towncrier"),
)
author = "Amber Brown"

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
# The short X.Y version.
version = "{}.{}.{}".format(
towncrier_version.major, towncrier_version.minor, towncrier_version.micro
)
version = ".".join(towncrier_version.split(".")[:3])
# The full version, including alpha/beta/rc tags.
release = towncrier_version.public()
release = towncrier_version

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
Expand Down
2 changes: 1 addition & 1 deletion noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def check_newsfragment(session: nox.Session) -> None:

@nox.session
def typecheck(session: nox.Session) -> None:
session.install(".", "mypy", "types-setuptools")
session.install(".", "mypy")
session.run("mypy", "src")


Expand Down
23 changes: 3 additions & 20 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
requires = [
"hatchling ~= 1.12.2",
"wheel ~= 0.38.4",
"incremental == 22.10.0",
]
build-backend = "hatchling.build"


[project]
dynamic = ["version"]
name = "towncrier"
version = "22.12.1.dev0"
description = "Building newsfiles for your project."
readme = "README.rst"
license = "MIT"
Expand All @@ -33,18 +32,13 @@ dependencies = [
"click",
"click-default-group",
"importlib-resources>1.3; python_version<'3.9'",
"incremental",
"importlib-metadata; python_version<'3.8'",
"jinja2",
"tomli; python_version<'3.11'",
]

[project.optional-dependencies]
dev = [
"packaging",
"sphinx >= 5",
"furo",
"twisted",
]
dev = ["packaging", "sphinx >= 5", "furo", "twisted"]

[project.scripts]
towncrier = "towncrier._shell:cli"
Expand All @@ -60,11 +54,6 @@ Coverage = "https://codecov.io/gh/twisted/towncrier"
Distribution = "https://pypi.org/project/towncrier"


[tool.hatch.version]
source = "code"
path = "src/towncrier/_version.py"
expression = "_hatchling_version"

[tool.hatch.build]
exclude = [
"admin",
Expand Down Expand Up @@ -147,12 +136,6 @@ module = 'click_default_group'
# 2022-09-04: This library has no type annotations.
ignore_missing_imports = true

[[tool.mypy.overrides]]
module = 'incremental'
# No released version with type hints.
ignore_missing_imports = true


[tool.coverage.run]
parallel = true
branch = true
Expand Down
26 changes: 0 additions & 26 deletions src/towncrier/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,3 @@
"""
towncrier, a builder for your news files.
"""

from __future__ import annotations

from incremental import Version


__all__ = ["__version__"]


def __getattr__(name: str) -> Version:
if name != "__version__":
raise AttributeError(f"module {__name__} has no attribute {name}")

import warnings

from ._version import __version__

warnings.warn(
"Accessing towncrier.__version__ is deprecated and will be "
"removed in a future release. Use importlib.metadata directly "
"to query for towncrier's packaging metadata.",
DeprecationWarning,
stacklevel=2,
)

return __version__
57 changes: 30 additions & 27 deletions src/towncrier/_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@

from importlib import import_module
from types import ModuleType
from typing import Any

from incremental import Version as IncrementalVersion

try:
import importlib.metadata as importlib_metadata
except ImportError: # < Python 3.8
import importlib_metadata # type: ignore


def _get_package(package_dir: str, package: str) -> ModuleType:
Expand All @@ -38,47 +43,45 @@ def _get_package(package_dir: str, package: str) -> ModuleType:


def get_version(package_dir: str, package: str) -> str:
module = _get_package(package_dir, package)
version: Any

module = _get_package(package_dir, package)
version = getattr(module, "__version__", None)

if not version:
raise Exception("No __version__, I don't know how else to look")
try:
version = importlib_metadata.version(package)
except importlib_metadata.PackageNotFoundError:
raise Exception(f"Package not installed and no {package}.__version__ found")

if isinstance(version, str):
return version.strip()

if isinstance(version, IncrementalVersion):
# FIXME:https://github.com/twisted/incremental/issues/81
# Incremental uses `.rcN`.
# importlib uses `rcN` (without a dot separation).
# Here we make incremental work like importlib.
return version.base().strip().replace(".rc", "rc")

if isinstance(version, tuple):
return ".".join(map(str, version)).strip()

# Try duck-typing as an Incremental version.
if hasattr(version, "base"):
try:
version = str(version.base()).strip()
# Incremental uses `X.Y.rcN`.
# Standardize on importlib (and PEP440) use of `X.YrcN`:
return version.replace(".rc", "rc") # type: ignore
except TypeError:
pass

raise Exception(
"I only know how to look at a __version__ that is a str, "
"an Increment Version, or a tuple. If you can't provide "
"that, use the --version argument and specify one."
"Version must be a string, tuple, or an Incremental Version."
" If you can't provide that, use the --version argument and specify one."
)


def get_project_name(package_dir: str, package: str) -> str:
module = _get_package(package_dir, package)

version = getattr(module, "__version__", None)
# Incremental has support for package names, try duck-typing it.
try:
return str(version.package) # type: ignore
except AttributeError:
pass

if not version:
# welp idk
return package.title()

if isinstance(version, str):
return package.title()

if isinstance(version, IncrementalVersion):
# Incremental has support for package names
return version.package

raise TypeError(f"Unsupported type for __version__: {type(version)}")
return package.title()
11 changes: 5 additions & 6 deletions src/towncrier/_settings/load.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,12 +171,11 @@ def parse_toml(base_path: str, config: Mapping[str, Any]) -> Config:
template = str(resource_path)
else:
template = os.path.join(base_path, template)

if not os.path.exists(template):
raise ConfigError(
f"The template file '{template}' does not exist.",
failing_option="template",
)
if not os.path.isfile(template):
raise ConfigError(
f"The template file '{template}' does not exist.",
failing_option="template",
)

return Config(
package=config.get("package", ""),
Expand Down
15 changes: 13 additions & 2 deletions src/towncrier/_shell.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,25 @@

from click_default_group import DefaultGroup

from ._version import __version__
from .build import _main as _build_cmd
from .check import _main as _check_cmd
from .create import _main as _create_cmd


try:
from importlib.metadata import PackageNotFoundError, version
except ImportError: # < Python 3.8
from importlib_metadata import PackageNotFoundError, version # type: ignore


try:
_version = version("towncrier")
except PackageNotFoundError: # pragma: no cover
_version = "unknown"


@click.group(cls=DefaultGroup, default="build", default_if_no_args=True)
@click.version_option(__version__.public())
@click.version_option(_version)
def cli() -> None:
"""
Towncrier is a utility to produce useful, summarised news files for your project.
Expand Down
16 changes: 0 additions & 16 deletions src/towncrier/_version.py

This file was deleted.

16 changes: 5 additions & 11 deletions src/towncrier/test/test_packaging.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
# Copyright (c) Amber Brown, 2015
# See LICENSE for details.

from incremental import Version
from twisted.trial.unittest import TestCase

from towncrier._version import _hatchling_version
import towncrier


class TestPackaging(TestCase):
def test_version_warning(self):
def no_version_attr(self):
"""
Import __version__ from towncrier returns an Incremental version object
and raises a warning.
towncrier.__version__ was deprecated, now no longer exists.
"""
with self.assertWarnsRegex(
DeprecationWarning, "Accessing towncrier.__version__ is deprecated.*"
):
from towncrier import __version__

self.assertIsInstance(__version__, Version)
self.assertEqual(_hatchling_version, __version__.short())
with self.assertRaises(AttributeError):
towncrier.__version__
Loading

0 comments on commit cc040d0

Please sign in to comment.