1From 938d220ce48859cfbb117fb8df42c94c64b88043 Mon Sep 17 00:00:00 2001
2From: Leona Maroni <dev@leona.is>
3Date: Mon, 11 Nov 2024 12:03:54 +0000
4Subject: [PATCH] Enable support for python 3.13 and 3.13 (#96)
5
6adapter from 938d220ce48859cfbb117fb8df42c94c64b88043
7
8---
9 .gitignore | 1 +
10 pyproject.toml | 18 ++++++-----
11 setup.cfg | 3 ++
12 src/tendo/tee.py | 4 +--
13 tox.ini | 67 +++++++++++++++++++--------------------
14 5 files changed, 49 insertions(+), 44 deletions(-)
15
16index 215dce7..a1f51a7 100644
17--- a/.gitignore
18+++ b/.gitignore
19@@ -29,3 +29,4 @@ test-distribute.sh
20 /.pytest_cache
21 venv/*
22 src/tendo/_version.py
23+coverage.lcov
24diff --git a/pyproject.toml b/pyproject.toml
25index ef76df7..ad86d7d 100644
26--- a/pyproject.toml
27+++ b/pyproject.toml
28@@ -10,18 +10,20 @@ build-backend = "setuptools.build_meta"
29 [tool.black]
30 target-version = ["py38"]
31
32+[tool.coverage.report]
33+exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:"]
34+fail_under = 100
35+skip_covered = true
36+show_missing = true
37+
38 [tool.coverage.run]
39-source_pkgs = ["tendo"]
40-branch = true
41+source = ["src"]
42+# Do not use branch until bug is fixes:
43+# https://github.com/nedbat/coveragepy/issues/605
44+branch = false
45 parallel = true
46 concurrency = ["multiprocessing", "thread"]
47
48-[tool.coverage.paths]
49-source = ["src", ".tox/*/site-packages"]
50-
51-[tool.coverage.report]
52-exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:"]
53-
54 [tool.isort]
55 profile = "black"
56 add_imports = "from __future__ import annotations"
57diff --git a/setup.cfg b/setup.cfg
58index 0a6d8c0..bf97071 100644
59--- a/setup.cfg
60+++ b/setup.cfg
61@@ -23,6 +23,8 @@ classifier =
62 Programming Language :: Python :: 3.9
63 Programming Language :: Python :: 3.10
64 Programming Language :: Python :: 3.11
65+ Programming Language :: Python :: 3.12
66+ Programming Language :: Python :: 3.13
67 Topic :: Software Development :: Libraries :: Python Modules
68 Topic :: Internet :: WWW/HTTP
69
70@@ -52,6 +54,7 @@ test =
71 coverage[toml]>=6.5.0
72 coveralls~=3.3.1
73 pre-commit>=3.3.3
74+ pip
75 pytest-cache~=1.0
76 pytest-cov~=3.0.0
77 pytest-html~=3.1.1
78diff --git a/src/tendo/tee.py b/src/tendo/tee.py
79index 04d21cf..5b08794 100755
80--- a/src/tendo/tee.py
81+++ b/src/tendo/tee.py
82@@ -3,7 +3,7 @@
83 import codecs
84 import logging
85 import os
86-import pipes
87+from shlex import quote
88 import subprocess
89 import sys
90 import time
91@@ -57,7 +57,7 @@ def system2(
92 # because collections.Iterable seems to be missing on Debian Python 2.5.5
93 # (but not on OS X 10.8 with Python 2.5.6)
94 if hasattr(cmd, "__iter__"):
95- cmd = " ".join(pipes.quote(s) for s in cmd)
96+ cmd = " ".join(quote(s) for s in cmd)
97
98 t = time.process_time()
99 output = []
100diff --git a/tox.ini b/tox.ini
101index 5faabef..7f81e8b 100644
102--- a/tox.ini
103+++ b/tox.ini
104@@ -11,45 +11,44 @@ isolated_build = True
105
106 [testenv]
107 sitepackages=False
108+commands_pre =
109+ # safety measure to assure we do not accidentally run tests with broken dependencies
110+ {envpython} -m pip check
111+ # cleaning needed to prevent errors between runs
112+ sh -c "rm -f {envdir}/.coverage.* 2>/dev/null || true"
113+commands=
114+ # We add coverage options but not making them mandatory as we do not want to force
115+ # pytest users to run coverage when they just want to run a single test with `pytest -k test`
116+ coverage run -m pytest {posargs:}
117+ # needed for upload to codecov.io
118+ {py,py39,py310,py311,py312,py313}: sh -c "coverage combine -q --data-file={envdir}/.coverage {envdir}/.coverage.* && coverage xml --data-file={envdir}/.coverage -o {envdir}/coverage.xml --ignore-errors --fail-under=0 && COVERAGE_FILE={envdir}/.coverage coverage lcov --fail-under=0 --ignore-errors -q && COVERAGE_FILE={envdir}/.coverage coverage report --fail-under=0 --ignore-errors"
119+ # lcov needed for vscode integration due to https://github.com/ryanluker/vscode-coverage-gutters/issues/403
120+editable = true
121+extras = test
122 passenv =
123- CURL_CA_BUNDLE # https proxies, https://github.com/tox-dev/tox/issues/1437
124- FORCE_COLOR
125- HOME
126- LANG
127- LC_ALL
128- LC_CTYPE
129- NO_COLOR
130- PYENV_VERSION
131- PYTEST_* # allows developer to define their own preferences
132- PYTEST_REQPASS # needed for CI
133- PY_*
134- PY_COLORS
135- REQUESTS_CA_BUNDLE # https proxies
136- RTD_TOKEN
137- RTOX*
138- SSH_AUTH_SOCK
139- SSL_CERT_FILE # https proxies
140+ CURL_CA_BUNDLE # https proxies, https://github.com/tox-dev/tox/issues/1437
141+ FORCE_COLOR
142+ HOME
143+ NO_COLOR
144+ PYTEST_* # allows developer to define their own preferences
145+ PYTEST_REQPASS # needed for CI
146+ PYTHON* # PYTHONPYCACHEPREFIX, PYTHONIOENCODING, PYTHONBREAKPOINT,...
147+ PY_COLORS
148+ RTD_TOKEN
149+ REQUESTS_CA_BUNDLE # https proxies
150+ SETUPTOOLS_SCM_DEBUG
151+ SSL_CERT_FILE # https proxies
152+ SSH_AUTH_SOCK # may be needed by git
153+ LANG
154+ LC_*
155 setenv =
156- COVERAGE_FILE={env:COVERAGE_FILE:{toxworkdir}/.coverage.{envname}}
157- COVERAGE_PROCESS_START={toxinidir}/pyproject.toml
158-commands=
159- coverage run -m pytest --color=yes --html={envlogdir}/report.html --self-contained-html
160- # --pyargs tendo
161+ COVERAGE_FILE = {env:COVERAGE_FILE:{envdir}/.coverage.{envname}}
162+ COVERAGE_PROCESS_START={toxinidir}/pyproject.toml
163+ PIP_DISABLE_PIP_VERSION_CHECK = 1
164 allowlist_externals =
165 sh
166-deps =
167- --editable .[test]
168
169-[testenv:coverage]
170-description = Combines and displays coverage results
171-commands =
172- sh -c "coverage combine .tox/.coverage.*"
173- # needed by codecov github actions:
174- coverage xml
175- # just for humans running it:
176- coverage report --skip-covered --fail-under=43
177-deps =
178- coverage[toml]>=6.5.0
179+
180
181 [testenv:docs]
182 changedir=docs
183