Skip to content

Commit

Permalink
Merge pull request #823 from RonnyPfannschmidt/cleanups
Browse files Browse the repository at this point in the history
assorted cleanups
  • Loading branch information
RonnyPfannschmidt authored Apr 26, 2023
2 parents 51b3566 + 9e98362 commit 126a49c
Show file tree
Hide file tree
Showing 36 changed files with 739 additions and 662 deletions.
15 changes: 2 additions & 13 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,21 +90,10 @@ jobs:
- run: |
$(hg debuginstall --template "{pythonexe}") -m pip install hg-git --user
if: matrix.os == 'ubuntu-latest'
# this hopefull helps with os caches, hg init sometimes gets 20s timeouts
- run: hg version
- run: pytest

test_legacy_setuptools:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup python
uses: actions/setup-python@v4
with:
python-version: "3.8"
architecture: x64
- run: pip install -e .[toml,test] pytest virtualenv
- run: pytest --test-legacy testing/test_setuptools_support.py || true # ignore fail flaky on ci


dist_upload:

runs-on: ubuntu-latest
Expand Down
1 change: 1 addition & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,4 @@ repos:
- pytest == 7.1
- importlib_metadata
- typing-extensions>=4.5
- rich
10 changes: 9 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,12 @@ breaking
* turn Configuration into a dataclass
* require configuration to always pass into helpers
* hide file-finders implementation in private module
* define own build backend to have setuptools work
* migrate to hatchling
* renamed setuptools_scm.hacks to setuptools_scm.fallbacks and drop support for pip-egg-info
* remove trace function and use logging instead
* unify distance=None and distance=0 they should mean the same
and where hiding dirty states that are now explicitly dirty
* depend on later importlib for the full selectable api

features
--------
Expand All @@ -27,6 +32,9 @@ features
* pre-compiled regex
* move helpers to private modules

* support passing log levels to SETUPTOOLS_SCM_DEBUG
* support using rich.logging as console log handler if installed


v7.1.0
======
Expand Down
30 changes: 25 additions & 5 deletions _own_version_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,41 @@
"""
from __future__ import annotations

import logging
from typing import Callable

from setuptools_scm import _types as _t
from setuptools_scm import Configuration
from setuptools_scm import get_version
from setuptools_scm import git
from setuptools_scm import hg
from setuptools_scm.hacks import parse_pkginfo
from setuptools_scm.fallbacks import parse_pkginfo
from setuptools_scm.version import get_local_node_and_date
from setuptools_scm.version import guess_next_dev_version
from setuptools_scm.version import ScmVersion

log = logging.getLogger("setuptools_scm")
# todo: take fake entrypoints from pyproject.toml
try_parse: list[Callable[[_t.PathT, Configuration], ScmVersion | None]] = [
parse_pkginfo,
git.parse,
hg.parse,
git.parse_archival,
hg.parse_archival,
]


def parse(root: str, config: Configuration) -> ScmVersion | None:
try:
return parse_pkginfo(root, config)
except OSError:
return git.parse(root, config=config) or hg.parse(root, config=config)
for maybe_parse in try_parse:
try:
parsed = maybe_parse(root, config)
except OSError as e:
log.warning("parse with %s failed with: %s", maybe_parse, e)
else:
if parsed is not None:
return parsed
else:
return None


def scm_version() -> str:
Expand Down
14 changes: 9 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
build-backend = "hatchling.build"
requires = [
"hatchling>=1.10",
'importlib-metadata>=4.6; python_version < "3.10"',
"packaging>=20",
"setuptools>=55",
'tomli; python_version < "3.11"',
Expand Down Expand Up @@ -40,15 +41,19 @@ dynamic = [
"version",
]
dependencies = [
'importlib-metadata; python_version < "3.8"',
'importlib-metadata>=4.6; python_version < "3.10"',
"packaging>=20",
"setuptools",
'tomli>=1; python_version < "3.11"',
"typing-extensions",
]
[project.optional-dependencies]
rich = [
"rich",
]
test = [
"pytest",
"rich",
"virtualenv>20",
]
toml = [
Expand Down Expand Up @@ -78,10 +83,9 @@ node-and-timestamp = "setuptools_scm.version:get_local_node_and_timestamp"
[project.entry-points."setuptools_scm.parse_scm_fallback"]
".git_archival.txt" = "setuptools_scm.git:parse_archival"
".hg_archival.txt" = "setuptools_scm.hg:parse_archival"
PKG-INFO = "setuptools_scm.hacks:parse_pkginfo"
pip-egg-info = "setuptools_scm.hacks:parse_pip_egg_info"
"pyproject.toml" = "setuptools_scm.hacks:fallback_version"
"setup.py" = "setuptools_scm.hacks:fallback_version"
PKG-INFO = "setuptools_scm.fallbacks:parse_pkginfo"
"pyproject.toml" = "setuptools_scm.fallbacks:fallback_version"
"setup.py" = "setuptools_scm.fallbacks:fallback_version"
[project.entry-points."setuptools_scm.version_scheme"]
"calver-by-date" = "setuptools_scm.version:calver_by_date"
"guess-next-dev" = "setuptools_scm.version:guess_next_dev_version"
Expand Down
5 changes: 3 additions & 2 deletions src/setuptools_scm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from typing import NoReturn
from . import _types as _t


TEMPLATES = {
".py": """\
# file generated by setuptools_scm
Expand All @@ -49,9 +50,9 @@ def dump_version(
target = os.path.normpath(os.path.join(root, write_to))
ext = os.path.splitext(target)[1]
template = template or TEMPLATES.get(ext)
from ._trace import trace
from ._log import log

trace("dump", write_to, version)
log.debug("dump %s into %s", version, write_to)
if template is None:
raise ValueError(
"bad file format: '{}' (of {}) \nonly *.txt and *.py are supported".format(
Expand Down
10 changes: 6 additions & 4 deletions src/setuptools_scm/_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,19 @@
from typing import Callable
from typing import Pattern

from . import _log
from . import _types as _t
from ._integration.pyproject_reading import (
get_args_for_pyproject as _get_args_for_pyproject,
)
from ._integration.pyproject_reading import read_pyproject as _read_pyproject
from ._overrides import read_toml_overrides
from ._trace import trace
from ._version_cls import _validate_version_cls
from ._version_cls import _VersionT
from ._version_cls import Version as _Version

log = _log.log.getChild("config")

DEFAULT_TAG_REGEX = re.compile(
r"^(?:[\w-]+-)?(?P<version>[vV]?\d+(?:\.\d+){0,2}[^\+]*)(?:\+.*)?$"
)
Expand All @@ -44,7 +46,7 @@ def _check_tag_regex(value: str | Pattern[str] | None) -> Pattern[str]:


def _check_absolute_root(root: _t.PathT, relative_to: _t.PathT | None) -> str:
trace("abs root", repr(locals()))
log.debug("check absolute root=%s relative_to=%s", root, relative_to)
if relative_to:
if (
os.path.isabs(root)
Expand All @@ -61,10 +63,10 @@ def _check_absolute_root(root: _t.PathT, relative_to: _t.PathT | None) -> str:
" its the directory %r\n"
"assuming the parent directory was passed" % (relative_to,)
)
trace("dir", relative_to)
log.debug("dir %s", relative_to)
root = os.path.join(relative_to, root)
else:
trace("file", relative_to)
log.debug("file %s", relative_to)
root = os.path.join(os.path.dirname(relative_to), root)
return os.path.abspath(root)

Expand Down
79 changes: 36 additions & 43 deletions src/setuptools_scm/_entrypoints.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
from __future__ import annotations

import warnings
from typing import Any
from typing import Callable
from typing import cast
from typing import Iterator
from typing import overload
from typing import TYPE_CHECKING

from typing_extensions import Protocol

from . import _log
from . import version
from ._trace import trace

if TYPE_CHECKING:
from ._config import Configuration
from typing_extensions import Protocol
from . import _types as _t
else:
Configuration = Any

class Protocol:

log = _log.log.getChild("entrypoints")


class EntrypointProtocol(Protocol):
name: str

def load(self) -> Any:
pass


Expand All @@ -34,64 +39,52 @@ def _version_from_entrypoints(

from .discover import iter_matching_entrypoints

trace("version_from_ep", entrypoint, root)
log.debug("version_from_ep %s in %s", entrypoint, root)
for ep in iter_matching_entrypoints(root, entrypoint, config):
fn = ep.load()
maybe_version: version.ScmVersion | None = fn(root, config=config)
trace(ep, version)
log.debug("%s found %r", ep, maybe_version)
if maybe_version is not None:
return maybe_version
return None


try:
from importlib.metadata import entry_points # type: ignore
from importlib.metadata import EntryPoint
from importlib_metadata import entry_points
from importlib_metadata import EntryPoint
except ImportError:
try:
from importlib_metadata import entry_points
from importlib_metadata import EntryPoint
except ImportError:
from collections import defaultdict

def entry_points() -> dict[str, list[_t.EntrypointProtocol]]:
warnings.warn(
"importlib metadata missing, "
"this may happen at build time for python3.7"
)
return defaultdict(list)

class EntryPoint: # type: ignore
def __init__(self, *args: Any, **kwargs: Any):
pass # entry_points() already provides the warning
from importlib.metadata import entry_points # type: ignore [no-redef, import]
from importlib.metadata import EntryPoint # type: ignore [no-redef]


def iter_entry_points(
group: str, name: str | None = None
) -> Iterator[_t.EntrypointProtocol]:
all_eps = entry_points()
if hasattr(all_eps, "select"):
eps = all_eps.select(group=group)
else:
eps = all_eps[group]
if name is None:
return iter(eps)
return (ep for ep in eps if ep.name == name)
) -> Iterator[EntrypointProtocol]:
eps = entry_points(group=group)
res = (
eps
if name is None
else eps.select( # type: ignore [no-untyped-call]
name=name,
)
)
return cast(Iterator[EntrypointProtocol], iter(res))


def _get_ep(group: str, name: str) -> Any | None:
from ._entrypoints import iter_entry_points

for ep in iter_entry_points(group, name):
trace("ep found:", ep.name)
log.debug("ep found: %s", ep.name)
return ep.load()
else:
return None


def _get_from_object_reference_str(path: str) -> Any | None:
ep: EntrypointProtocol = EntryPoint(
path, path, None
) # type: ignore [no-untyped-call]
try:
return EntryPoint(path, path, None).load()
return ep.load()
except (AttributeError, ModuleNotFoundError):
return None

Expand Down Expand Up @@ -121,22 +114,22 @@ def _iter_version_schemes(

@overload
def _call_version_scheme(
version: version.ScmVersion, entypoint: str, given_value: str, default: str
version: version.ScmVersion, entrypoint: str, given_value: str, default: str
) -> str:
...


@overload
def _call_version_scheme(
version: version.ScmVersion, entypoint: str, given_value: str, default: None
version: version.ScmVersion, entrypoint: str, given_value: str, default: None
) -> str | None:
...


def _call_version_scheme(
version: version.ScmVersion, entypoint: str, given_value: str, default: str | None
version: version.ScmVersion, entrypoint: str, given_value: str, default: str | None
) -> str | None:
for scheme in _iter_version_schemes(entypoint, given_value):
for scheme in _iter_version_schemes(entrypoint, given_value):
result = scheme(version)
if result is not None:
return result
Expand Down
10 changes: 6 additions & 4 deletions src/setuptools_scm/_file_finders/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@

from typing_extensions import TypeGuard

from setuptools_scm import _types as _t
from setuptools_scm._entrypoints import iter_entry_points
from setuptools_scm._trace import trace
from .. import _log
from .. import _types as _t
from .._entrypoints import iter_entry_points

log = _log.log.getChild("file_finder")


def scm_find_files(
Expand Down Expand Up @@ -84,7 +86,7 @@ def is_toplevel_acceptable(toplevel: str | None) -> TypeGuard[str]:
)
ignored = [os.path.normcase(p) for p in ignored]

trace(toplevel, ignored)
log.debug("toplevel: %r\n ignored %s", toplevel, ignored)

return toplevel not in ignored

Expand Down
Loading

0 comments on commit 126a49c

Please sign in to comment.