Skip to content

Commit 4263302

Browse files
authored
Dev (#8)
* Update template - drop py38 and py39 support - update dependency constraints - update tooling - replace tox with nox * Use py310 for lint * Update GitHub templates
1 parent ac41cfe commit 4263302

14 files changed

+609
-352
lines changed

.github/ISSUE_TEMPLATE/bug_report.md

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
name: Bug report
3+
about: Create a bug report to help us reproduce and fix it.
4+
title: "<Please write a descriptive title>"
5+
labels: ["bug"]
6+
---
7+
8+
## Summary
9+
10+
## Expected results
11+
12+
## Actual results
13+
14+
## Steps to reproduce
15+
16+
## Environment
17+
18+
Please include the outputs of `python --version` and `pip list`.
19+
20+
## Additional information

.github/ISSUE_TEMPLATE/config.yml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Configuration: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository
2+
3+
blank_issues_enabled: true
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
name: New feature
3+
about: Request a new feature.
4+
title: "<Please write a descriptive title>"
5+
labels: ["enhancement"]
6+
---
7+
8+
## What
9+
10+
## Why
11+
12+
## How
13+
14+
## Additional information

.github/PULL_REQUEST_TEMPLATE/pull_request_template.md renamed to .github/pull_request_template.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66

77
## Testing
88

9-
## Anything else
9+
## Additional information

.github/workflows/tests.yaml

+15-11
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,36 @@ jobs:
1414
runs-on: ubuntu-latest
1515
strategy:
1616
matrix:
17-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
17+
python-version: ["3.10", "3.11", "3.12", "3.13"]
1818
steps:
1919
- name: Checkout
20-
uses: actions/checkout@v3
20+
uses: actions/checkout@v4
21+
- name: Install uv
22+
uses: astral-sh/setup-uv@v3
2123
- name: Set up Python ${{ matrix.python-version }}
22-
uses: actions/setup-python@v4
24+
uses: actions/setup-python@v5
2325
with:
2426
python-version: ${{ matrix.python-version }}
2527
- name: Install dependencies
2628
run: |
27-
python -m pip install --upgrade pip
28-
python -m pip install tox tox-gh-actions
29+
uv venv
30+
uv pip install nox
2931
- name: Run tests
3032
run: |
31-
python -m tox
33+
uv run --no-project nox --python ${{ matrix.python-version }}
3234
lint:
3335
runs-on: ubuntu-latest
3436
steps:
35-
- uses: actions/checkout@v3
37+
- uses: actions/checkout@v4
38+
- name: Install uv
39+
uses: astral-sh/setup-uv@v3
3640
- name: Setup Python
37-
uses: actions/setup-python@v4
41+
uses: actions/setup-python@v5
3842
with:
3943
python-version: "3.10"
4044
- name: Install dependencies
4145
run: |
42-
python -m pip install --upgrade pip
43-
python -m pip install tox
46+
uv venv
47+
uv pip install nox
4448
- name: Lint the code
45-
run: python -m tox -e lint
49+
run: uv run --no-project nox -e lint

.pre-commit-config.yaml

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@ ci:
33

44
repos:
55
- repo: https://github.com/pre-commit/pre-commit-hooks
6-
rev: v4.4.0
6+
rev: v4.6.0
77
hooks:
88
- id: trailing-whitespace
99
- id: end-of-file-fixer
1010
exclude_types: [json, binary]
1111
- id: mixed-line-ending
1212
- repo: https://github.com/astral-sh/ruff-pre-commit
13-
rev: v0.1.5
13+
rev: v0.7.0
1414
hooks:
1515
- id: ruff
16+
args: [--fix]
1617
- id: ruff-format
1718
- repo: https://github.com/pre-commit/mirrors-mypy
18-
rev: "v1.2.0"
19+
rev: "v1.11.2"
1920
hooks:
2021
- id: mypy

noxfile.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""noxfile.py."""
2+
3+
import nox
4+
5+
nox.options.default_venv_backend = "uv"
6+
7+
8+
@nox.session(python=["3.10", "3.11", "3.12", "3.13"])
9+
@nox.parametrize("resolution", ["highest", "lowest-direct"])
10+
def tests(session: nox.Session, resolution: str) -> None:
11+
"""Test session."""
12+
session.install("pytest~=8.3", "pytest-cov~=5.0")
13+
session.install(".", "--resolution", resolution)
14+
session.run("python", "-m", "pytest", *session.posargs)
15+
16+
17+
@nox.session(default=False)
18+
def coverage(session: nox.Session) -> None:
19+
"""Coverage session."""
20+
tests(session, "highest")
21+
session.install("pytest-cov~=5.0")
22+
session.run("coverage", "html")
23+
session.run("coverage", "report")
24+
25+
26+
@nox.session
27+
def lint(session: nox.Session) -> None:
28+
"""Lint session."""
29+
session.install("pre-commit~=3.8")
30+
session.run("pre-commit", "run", "--all-files", *session.posargs)

poetry.lock

+368-237
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+87-23
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
44

55
[tool.poetry]
66
name = "zwog"
7-
version = "1.0.0"
7+
version = "1.1.0"
88
description = "Zwift workout generator"
99
authors = [
1010
"Tarmo Äijö <tarmo.aijo@gmail.com>",
@@ -30,15 +30,16 @@ packages = [
3030
]
3131

3232
[tool.poetry.dependencies]
33-
python = "^3.8"
34-
lark = "^1.1.2"
33+
python = "^3.10"
34+
lark = ">=1.1.2"
3535

3636
[tool.poetry.group.dev.dependencies]
37-
pytest = "^7.4"
38-
tox = "^4.11"
39-
ruff = "^0.1"
40-
mypy = "^1.6"
41-
pre-commit = "^3.5"
37+
nox = {extras = ["uv"], version = "^2024.10.9"}
38+
pytest = "^8.3"
39+
ruff = "^0.7"
40+
mypy = "^1.11"
41+
pytest-cov = "^5.0"
42+
pre-commit = "^3.8"
4243

4344
[tool.poetry.scripts]
4445
zwog = "zwog.utils:main"
@@ -47,8 +48,13 @@ zwog = "zwog.utils:main"
4748
"Bug Tracker" = "https://github.com/tare/zwog/issues"
4849

4950
[tool.ruff]
50-
target-version = "py38"
51+
target-version = "py310"
5152
fix = true
53+
exclude = []
54+
force-exclude = true
55+
56+
[tool.ruff.lint]
57+
preview = true
5258
fixable = [
5359
"I001", # https://docs.astral.sh/ruff/rules/unsorted-imports/
5460
]
@@ -63,61 +69,119 @@ select = [
6369
"N", # https://docs.astral.sh/ruff/rules/#pep8-naming-n
6470
"D", # https://docs.astral.sh/ruff/rules/#pydocstyle-d
6571
"UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up
72+
"YTT", # https://docs.astral.sh/ruff/rules/#flake8-2020-ytt
6673
"ANN", # https://docs.astral.sh/ruff/rules/#flake8-annotations-ann
67-
"A", # https://docs.astral.sh/ruff/rules/#flake8-builtins-a
74+
"ASYNC", # https://docs.astral.sh/ruff/rules/#flake8-async-async
75+
"S", # https://docs.astral.sh/ruff/rules/#flake8-bandit-s
76+
"BLE", # https://docs.astral.sh/ruff/rules/#flake8-blind-except-ble
77+
"FBT", # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt
6878
"B", # https://docs.astral.sh/ruff/rules/#flake8-bugbear-b
79+
"A", # https://docs.astral.sh/ruff/rules/#flake8-builtins-a
80+
"COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com
81+
# "CPY", # https://docs.astral.sh/ruff/rules/#flake8-copyright-cpy
6982
"C4", # https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4
70-
"EM101", # https://docs.astral.sh/ruff/rules/#flake8-errmsg-em
83+
"DTZ", # https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz
84+
"T10", # https://docs.astral.sh/ruff/rules/#flake8-debugger-t10
85+
"DJ", # https://docs.astral.sh/ruff/rules/#flake8-django-dj
86+
"EM", # https://docs.astral.sh/ruff/rules/#flake8-errmsg-em
7187
"EXE", # https://docs.astral.sh/ruff/rules/#flake8-executable-exe
88+
"FA", # https://docs.astral.sh/ruff/rules/#flake8-future-annotations-fa
7289
"ISC", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc
90+
"ICN", # https://docs.astral.sh/ruff/rules/#flake8-import-conventions-icn
91+
"LOG", # https://docs.astral.sh/ruff/rules/#flake8-logging-log
7392
"G", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g
93+
"INP", # https://docs.astral.sh/ruff/rules/#flake8-no-pep420-inp
7494
"PIE", # https://docs.astral.sh/ruff/rules/#flake8-pie-pie
95+
"T20", # https://docs.astral.sh/ruff/rules/#flake8-print-t20
96+
"PYI", # https://docs.astral.sh/ruff/rules/#flake8-pyi-pyi
7597
"PT", # https://docs.astral.sh/ruff/rules/#flake8-pytest-style-pt
7698
"Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q
99+
"RSE", # https://docs.astral.sh/ruff/rules/#flake8-raise-rse
77100
"RET", # https://docs.astral.sh/ruff/rules/#flake8-return-ret
78101
"SLF", # https://docs.astral.sh/ruff/rules/#flake8-self-slf
102+
"SLOT", # https://docs.astral.sh/ruff/rules/#flake8-slots-slot
79103
"SIM", # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim
80104
"TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid
105+
"TCH", # https://docs.astral.sh/ruff/rules/#flake8-type-checking-tch
106+
"INT", # https://docs.astral.sh/ruff/rules/#flake8-gettext-int
81107
"ARG", # https://docs.astral.sh/ruff/rules/#flake8-unused-arguments-arg
82108
"PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth
83-
"TD", # https://docs.astral.sh/ruff/rules/#flake8-todos-td
109+
# "TD", # https://docs.astral.sh/ruff/rules/#flake8-todos-td
110+
# "FIX", # https://docs.astral.sh/ruff/rules/#flake8-fixme-fix
84111
"ERA", # https://docs.astral.sh/ruff/rules/#eradicate-era
112+
"PD", # https://docs.astral.sh/ruff/rules/#pandas-vet-pd
85113
"PGH", # https://docs.astral.sh/ruff/rules/#pygrep-hooks-pgh
86114
"PL", # https://docs.astral.sh/ruff/rules/#pylint-pl
87115
"TRY", # https://docs.astral.sh/ruff/rules/#tryceratops-try
116+
"FLY", # https://docs.astral.sh/ruff/rules/#flynt-fly
88117
"NPY", # https://docs.astral.sh/ruff/rules/#numpy-specific-rules-npy
118+
"FAST", # https://docs.astral.sh/ruff/rules/#fastapi-fast
119+
"AIR", # https://docs.astral.sh/ruff/rules/#airflow-air
89120
"PERF", # https://docs.astral.sh/ruff/rules/#perflint-perf
90121
"FURB", # https://docs.astral.sh/ruff/rules/#refurb-furb
91-
"LOG", # https://docs.astral.sh/ruff/rules/#flake8-logging-log
122+
"DOC", # https://docs.astral.sh/ruff/rules/#pydoclint-doc
92123
"RUF", # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf
93124
]
94125
ignore = [
95-
"ANN101", # https://docs.astral.sh/ruff/rules/missing-type-self/
96-
"ISC001", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc
126+
"ANN101", # https://docs.astral.sh/ruff/rules/missing-type-function-argument/
127+
"S101", # https://docs.astral.sh/ruff/rules/assert/
97128
"UP034", # https://docs.astral.sh/ruff/rules/extraneous-parentheses/
129+
"PD002", # https://docs.astral.sh/ruff/rules/pandas-use-of-inplace-argument/
130+
# https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
131+
"W191", # https://docs.astral.sh/ruff/rules/tab-indentation/
132+
"E111", # https://docs.astral.sh/ruff/rules/indentation-with-invalid-multiple/
133+
"E114", # https://docs.astral.sh/ruff/rules/indentation-with-invalid-multiple-comment/
134+
"E117", # https://docs.astral.sh/ruff/rules/over-indented/
135+
"D206", # https://docs.astral.sh/ruff/rules/indent-with-spaces/
136+
"D300", # https://docs.astral.sh/ruff/rules/triple-single-quotes/
137+
"Q000", # https://docs.astral.sh/ruff/rules/bad-quotes-inline-string/
138+
"Q001", # https://docs.astral.sh/ruff/rules/bad-quotes-multiline-string/
139+
"Q002", # https://docs.astral.sh/ruff/rules/bad-quotes-docstring/
140+
"Q003", # https://docs.astral.sh/ruff/rules/avoidable-escaped-quote/
141+
"COM812", # https://docs.astral.sh/ruff/rules/missing-trailing-comma/
142+
"COM819", # https://docs.astral.sh/ruff/rules/prohibited-trailing-comma/
143+
"ISC001", # https://docs.astral.sh/ruff/rules/single-line-implicit-string-concatenation/
144+
"ISC002", # https://docs.astral.sh/ruff/rules/multi-line-implicit-string-concatenation/
98145
]
99146

100-
[tool.ruff.lint]
101-
preview = true
102-
103-
[tool.ruff.lint.pylint]
104-
max-args = 10
105-
106147
[tool.ruff.lint.mccabe]
107148
max-complexity = 10
108149

109150
[tool.ruff.lint.pydocstyle]
110151
convention = "google"
111152

153+
[tool.ruff.lint.pylint]
154+
max-args = 10
155+
156+
[tool.ruff.format]
157+
docstring-code-format = true
158+
159+
[tool.uv]
160+
reinstall-package = ["zwog"]
161+
112162
[tool.pytest.ini_options]
113163
minversion = "6.0"
114-
addopts = "-v"
164+
addopts = """\
165+
-v \
166+
--cov-config=pyproject.toml \
167+
--cov=zwog \
168+
--cov=tests \
169+
--cov-report=term-missing \
170+
--no-cov-on-fail \
171+
"""
115172
testpaths = [
116173
"tests",
117174
]
118175

176+
[tool.coverage.run]
177+
branch = true
178+
relative_files = true
179+
180+
[tool.coverage.report]
181+
fail_under = 90
182+
119183
[tool.mypy]
120-
python_version = "3.8"
184+
python_version = "3.10"
121185
follow_imports = "normal"
122186
ignore_missing_imports = true
123187
check_untyped_defs = true

src/zwog/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""zwog."""
2+
23
from zwog.utils import ZWOG
34

45
__all__ = [

0 commit comments

Comments
 (0)