Skip to content

Commit

Permalink
Switch over most settings to .toml file
Browse files Browse the repository at this point in the history
  • Loading branch information
IanCa committed Feb 2, 2024
1 parent c9f6254 commit f087d7f
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 2,192 deletions.
3 changes: 0 additions & 3 deletions hed/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,5 @@
from hed.schema.hed_schema_io import load_schema, load_schema_version


# from hed import errors, models, schema, tools, validator


from . import _version
__version__ = _version.get_versions()['version']
105 changes: 65 additions & 40 deletions hed/_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
# directories (produced by setup.py build) will contain a much shorter file
# that just contains the computed version number.

# This file is released into the public domain. Generated by
# versioneer-0.22 (https://github.com/python-versioneer/python-versioneer)
# This file is released into the public domain.
# Generated by versioneer-0.29
# https://github.com/python-versioneer/python-versioneer

"""Git implementation of _version.py."""

Expand All @@ -15,11 +16,11 @@
import re
import subprocess
import sys
from typing import Callable, Dict
from typing import Any, Callable, Dict, List, Optional, Tuple
import functools


def get_keywords():
def get_keywords() -> Dict[str, str]:
"""Get the keywords needed to look up the version information."""
# these strings will be replaced by git during git-archive.
# setup.py/versioneer.py will grep for the variable names, so they must
Expand All @@ -35,15 +36,22 @@ def get_keywords():
class VersioneerConfig:
"""Container for Versioneer configuration parameters."""

VCS: str
style: str
tag_prefix: str
parentdir_prefix: str
versionfile_source: str
verbose: bool

def get_config():

def get_config() -> VersioneerConfig:
"""Create, populate and return the VersioneerConfig() object."""
# these strings are filled in when 'setup.py versioneer' creates
# _version.py
cfg = VersioneerConfig()
cfg.VCS = "git"
cfg.style = "pep440"
cfg.tag_prefix = ""
cfg.tag_prefix = "hedtools-"
cfg.parentdir_prefix = "hedtools-"
cfg.versionfile_source = "hed/_version.py"
cfg.verbose = False
Expand All @@ -58,9 +66,9 @@ class NotThisMethod(Exception):
HANDLERS: Dict[str, Dict[str, Callable]] = {}


def register_vcs_handler(vcs, method): # decorator
def register_vcs_handler(vcs: str, method: str) -> Callable: # decorator
"""Create decorator to mark a method as the handler of a VCS."""
def decorate(f):
def decorate(f: Callable) -> Callable:
"""Store f in HANDLERS[vcs][method]."""
if vcs not in HANDLERS:
HANDLERS[vcs] = {}
Expand All @@ -69,13 +77,19 @@ def decorate(f):
return decorate


def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
env=None):
def run_command(
commands: List[str],
args: List[str],
cwd: Optional[str] = None,
verbose: bool = False,
hide_stderr: bool = False,
env: Optional[Dict[str, str]] = None,
) -> Tuple[Optional[str], Optional[int]]:
"""Call the given command(s)."""
assert isinstance(commands, list)
process = None

popen_kwargs = {}
popen_kwargs: Dict[str, Any] = {}
if sys.platform == "win32":
# This hides the console window if pythonw.exe is used
startupinfo = subprocess.STARTUPINFO()
Expand All @@ -91,8 +105,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
stderr=(subprocess.PIPE if hide_stderr
else None), **popen_kwargs)
break
except OSError:
e = sys.exc_info()[1]
except OSError as e:
if e.errno == errno.ENOENT:
continue
if verbose:
Expand All @@ -112,7 +125,11 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
return stdout, process.returncode


def versions_from_parentdir(parentdir_prefix, root, verbose):
def versions_from_parentdir(
parentdir_prefix: str,
root: str,
verbose: bool,
) -> Dict[str, Any]:
"""Try to determine the version from the parent directory name.
Source tarballs conventionally unpack into a directory that includes both
Expand All @@ -137,13 +154,13 @@ def versions_from_parentdir(parentdir_prefix, root, verbose):


@register_vcs_handler("git", "get_keywords")
def git_get_keywords(versionfile_abs):
def git_get_keywords(versionfile_abs: str) -> Dict[str, str]:
"""Extract version information from the given file."""
# the code embedded in _version.py can just fetch the value of these
# keywords. When used from setup.py, we don't want to import _version.py,
# so we do it with a regexp instead. This function is not used from
# _version.py.
keywords = {}
keywords: Dict[str, str] = {}
try:
with open(versionfile_abs, "r") as fobj:
for line in fobj:
Expand All @@ -165,7 +182,11 @@ def git_get_keywords(versionfile_abs):


@register_vcs_handler("git", "keywords")
def git_versions_from_keywords(keywords, tag_prefix, verbose):
def git_versions_from_keywords(
keywords: Dict[str, str],
tag_prefix: str,
verbose: bool,
) -> Dict[str, Any]:
"""Get version information from git keywords."""
if "refnames" not in keywords:
raise NotThisMethod("Short version file found")
Expand Down Expand Up @@ -229,7 +250,12 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):


@register_vcs_handler("git", "pieces_from_vcs")
def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
def git_pieces_from_vcs(
tag_prefix: str,
root: str,
verbose: bool,
runner: Callable = run_command
) -> Dict[str, Any]:
"""Get version from 'git describe' in the root of the source tree.
This only gets called if the git-archive 'subst' keywords were *not*
Expand All @@ -248,19 +274,18 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
runner = functools.partial(runner, env=env)

_, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
hide_stderr=True)
hide_stderr=not verbose)
if rc != 0:
if verbose:
print("Directory %s not under git control" % root)
raise NotThisMethod("'git rev-parse --git-dir' returned error")

MATCH_ARGS = ["--match", "%s*" % tag_prefix] if tag_prefix else []

# if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
# if there isn't one, this yields HEX[-dirty] (no NUM)
describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
"--always", "--long", *MATCH_ARGS],
cwd=root)
describe_out, rc = runner(GITS, [
"describe", "--tags", "--dirty", "--always", "--long",
"--match", f"{tag_prefix}[[:digit:]]*"
], cwd=root)
# --long was added in git-1.5.5
if describe_out is None:
raise NotThisMethod("'git describe' failed")
Expand All @@ -270,7 +295,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
raise NotThisMethod("'git rev-parse' failed")
full_out = full_out.strip()

pieces = {}
pieces: Dict[str, Any] = {}
pieces["long"] = full_out
pieces["short"] = full_out[:7] # maybe improved later
pieces["error"] = None
Expand Down Expand Up @@ -349,8 +374,8 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
else:
# HEX: no tags
pieces["closest-tag"] = None
count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root)
pieces["distance"] = int(count_out) # total number of commits
out, rc = runner(GITS, ["rev-list", "HEAD", "--left-right"], cwd=root)
pieces["distance"] = len(out.split()) # total number of commits

# commit date: see ISO-8601 comment in git_versions_from_keywords()
date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip()
Expand All @@ -362,14 +387,14 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
return pieces


def plus_or_dot(pieces):
def plus_or_dot(pieces: Dict[str, Any]) -> str:
"""Return a + if we don't already have one, else return a ."""
if "+" in pieces.get("closest-tag", ""):
return "."
return "+"


def render_pep440(pieces):
def render_pep440(pieces: Dict[str, Any]) -> str:
"""Build up version string, with post-release "local version identifier".
Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you
Expand All @@ -394,7 +419,7 @@ def render_pep440(pieces):
return rendered


def render_pep440_branch(pieces):
def render_pep440_branch(pieces: Dict[str, Any]) -> str:
"""TAG[[.dev0]+DISTANCE.gHEX[.dirty]] .
The ".dev0" means not master branch. Note that .dev0 sorts backwards
Expand Down Expand Up @@ -424,7 +449,7 @@ def render_pep440_branch(pieces):
return rendered


def pep440_split_post(ver):
def pep440_split_post(ver: str) -> Tuple[str, Optional[int]]:
"""Split pep440 version string at the post-release segment.
Returns the release segments before the post-release and the
Expand All @@ -434,7 +459,7 @@ def pep440_split_post(ver):
return vc[0], int(vc[1] or 0) if len(vc) == 2 else None


def render_pep440_pre(pieces):
def render_pep440_pre(pieces: Dict[str, Any]) -> str:
"""TAG[.postN.devDISTANCE] -- No -dirty.
Exceptions:
Expand All @@ -446,7 +471,7 @@ def render_pep440_pre(pieces):
tag_version, post_version = pep440_split_post(pieces["closest-tag"])
rendered = tag_version
if post_version is not None:
rendered += ".post%d.dev%d" % (post_version+1, pieces["distance"])
rendered += ".post%d.dev%d" % (post_version + 1, pieces["distance"])
else:
rendered += ".post0.dev%d" % (pieces["distance"])
else:
Expand All @@ -458,7 +483,7 @@ def render_pep440_pre(pieces):
return rendered


def render_pep440_post(pieces):
def render_pep440_post(pieces: Dict[str, Any]) -> str:
"""TAG[.postDISTANCE[.dev0]+gHEX] .
The ".dev0" means dirty. Note that .dev0 sorts backwards
Expand All @@ -485,7 +510,7 @@ def render_pep440_post(pieces):
return rendered


def render_pep440_post_branch(pieces):
def render_pep440_post_branch(pieces: Dict[str, Any]) -> str:
"""TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] .
The ".dev0" means not master branch.
Expand Down Expand Up @@ -514,7 +539,7 @@ def render_pep440_post_branch(pieces):
return rendered


def render_pep440_old(pieces):
def render_pep440_old(pieces: Dict[str, Any]) -> str:
"""TAG[.postDISTANCE[.dev0]] .
The ".dev0" means dirty.
Expand All @@ -536,7 +561,7 @@ def render_pep440_old(pieces):
return rendered


def render_git_describe(pieces):
def render_git_describe(pieces: Dict[str, Any]) -> str:
"""TAG[-DISTANCE-gHEX][-dirty].
Like 'git describe --tags --dirty --always'.
Expand All @@ -556,7 +581,7 @@ def render_git_describe(pieces):
return rendered


def render_git_describe_long(pieces):
def render_git_describe_long(pieces: Dict[str, Any]) -> str:
"""TAG-DISTANCE-gHEX[-dirty].
Like 'git describe --tags --dirty --always -long'.
Expand All @@ -576,7 +601,7 @@ def render_git_describe_long(pieces):
return rendered


def render(pieces, style):
def render(pieces: Dict[str, Any], style: str) -> Dict[str, Any]:
"""Render the given version pieces into the requested style."""
if pieces["error"]:
return {"version": "unknown",
Expand Down Expand Up @@ -612,7 +637,7 @@ def render(pieces, style):
"date": pieces.get("date")}


def get_versions():
def get_versions() -> Dict[str, Any]:
"""Get version information or return default if unable to do so."""
# I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have
# __file__, we can work backwards from there to the root. Some
Expand Down
68 changes: 67 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,73 @@
[build-system]
requires = ["setuptools>=42", "versioneer-518"]
requires = ["setuptools>=42", "versioneer[toml]"]
build-backend = "setuptools.build_meta"

[project]
name = "hedtools"
dynamic = ["version"]
description = "HED validation, summary, and analysis tools."
readme = "README.md"
authors = [
{ name = "VisLab" },
{ name = "Ian Callanan" },
{ name = "Jeremy Cockfield" },
{ name = "Alexander Jones" },
{ name = "Owen Winterberg" },
{ name = "Kay Robbins", email = "[email protected]" },
]
license = { text = "MIT License" }
keywords = [] # Add keywords here if any
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]

requires-python = ">=3.7"

dependencies = [
"defusedxml",
"et-xmlfile",
"inflect",
"jdcal",
"jsonschema",
"numpy",
"openpyxl",
"pandas",
"portalocker",
"python-dateutil",
"pytz",
"rdflib",
"semantic-version",
"six"
]

[project.urls]
"Homepage" = "https://github.com/hed-standard/hed-python/"
"Bug Tracker" = "https://github.com/hed-standard/hed-python/issues"

[project.optional-dependencies]
# Define any optional dependencies here

[project.scripts]
run_remodel = "hed.tools.remodeling.cli.run_remodel:main"
run_remodel_backup = "hed.tools.remodeling.cli.run_remodel_backup:main"
run_remodel_restore = "hed.tools.remodeling.cli.run_remodel_restore:main"

[tool.versioneer]
VCS = "git"
style = "pep440"
versionfile_source = "hed/_version.py"
versionfile_build = "hed/_version.py"
tag_prefix = ""
parentdir_prefix = "hedtools-"

[tool.setuptools]
packages = ["hed"]

[tool.setuptools.package-data]
hed = ["schema/schema_data/*.xml"]

[tool.codespell]
skip = '*.git,*.pdf,*.xml,*.mediawiki,*.svg,versioneer.py,venv*,*.tsv,*.yaml,*.yml,*.json,*.rdf,*.jsonld,spec_tests'
ignore-words-list = 'te,parms'
Loading

0 comments on commit f087d7f

Please sign in to comment.