Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-filelock for openSUSE:Factory
checked in at 2023-09-08 21:15:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-filelock (Old)
and /work/SRC/openSUSE:Factory/.python-filelock.new.1766 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-filelock"
Fri Sep 8 21:15:16 2023 rev:15 rq:1109649 version:3.12.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-filelock/python-filelock.changes
2023-06-21 22:37:32.121532065 +0200
+++
/work/SRC/openSUSE:Factory/.python-filelock.new.1766/python-filelock.changes
2023-09-08 21:15:46.698979411 +0200
@@ -1,0 +2,13 @@
+Fri Sep 8 04:26:16 UTC 2023 - Steve Kowalik <[email protected]>
+
+- Add missing Requires on typing-extensions if < 3.11
+
+-------------------------------------------------------------------
+Thu Sep 7 11:00:28 UTC 2023 - Dirk Müller <[email protected]>
+
+- update to 3.12.3:
+ * Fix import ordering
+ * Exclude dependabot and pre-commit ci from release notes
+ * Create parent directories if necessary
+
+-------------------------------------------------------------------
Old:
----
filelock-3.12.2.tar.gz
New:
----
filelock-3.12.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-filelock.spec ++++++
--- /var/tmp/diff_new_pack.KAfqIG/_old 2023-09-08 21:15:47.795018583 +0200
+++ /var/tmp/diff_new_pack.KAfqIG/_new 2023-09-08 21:15:47.799018726 +0200
@@ -19,7 +19,7 @@
%{?sle15_python_module_pythons}
Name: python-filelock
-Version: 3.12.2
+Version: 3.12.3
Release: 0
Summary: Platform Independent File Lock in Python
License: Unlicense
@@ -33,6 +33,9 @@
BuildRequires: %{python_module wheel}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
+%if 0%{?python_version_nodots} < 311
+Requires: python-typing_extensions >= 4.7.1
+%endif
BuildArch: noarch
%python_subpackages
++++++ filelock-3.12.2.tar.gz -> filelock-3.12.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/PKG-INFO new/filelock-3.12.3/PKG-INFO
--- old/filelock-3.12.2/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/filelock-3.12.3/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: filelock
-Version: 3.12.2
+Version: 3.12.3
Summary: A platform independent file lock.
Project-URL: Documentation, https://py-filelock.readthedocs.io
Project-URL: Homepage, https://github.com/tox-dev/py-filelock
@@ -16,7 +16,6 @@
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
@@ -25,22 +24,23 @@
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: System
-Requires-Python: >=3.7
+Requires-Python: >=3.8
+Requires-Dist: typing-extensions>=4.7.1; python_version < '3.11'
Provides-Extra: docs
-Requires-Dist: furo>=2023.5.20; extra == 'docs'
-Requires-Dist: sphinx-autodoc-typehints!=1.23.4,>=1.23; extra == 'docs'
-Requires-Dist: sphinx>=7.0.1; extra == 'docs'
+Requires-Dist: furo>=2023.7.26; extra == 'docs'
+Requires-Dist: sphinx-autodoc-typehints!=1.23.4,>=1.24; extra == 'docs'
+Requires-Dist: sphinx>=7.1.2; extra == 'docs'
Provides-Extra: testing
Requires-Dist: covdefaults>=2.3; extra == 'testing'
-Requires-Dist: coverage>=7.2.7; extra == 'testing'
-Requires-Dist: diff-cover>=7.5; extra == 'testing'
+Requires-Dist: coverage>=7.3; extra == 'testing'
+Requires-Dist: diff-cover>=7.7; extra == 'testing'
Requires-Dist: pytest-cov>=4.1; extra == 'testing'
-Requires-Dist: pytest-mock>=3.10; extra == 'testing'
+Requires-Dist: pytest-mock>=3.11.1; extra == 'testing'
Requires-Dist: pytest-timeout>=2.1; extra == 'testing'
-Requires-Dist: pytest>=7.3.1; extra == 'testing'
+Requires-Dist: pytest>=7.4; extra == 'testing'
Description-Content-Type: text/markdown
-# py-filelock
+# filelock
[](https://pypi.org/project/filelock/)
[](https://py-filelock.readthedocs.io/en/latest/?badge=latest)
[](https://github.com/psf/black)
-[](https://pepy.tech/project/filelock)
+[](https://pepy.tech/project/filelock)
[](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml)
For more information checkout the [official
documentation](https://py-filelock.readthedocs.io/en/latest/index.html).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/README.md
new/filelock-3.12.3/README.md
--- old/filelock-3.12.2/README.md 2020-02-02 01:00:00.000000000 +0100
+++ new/filelock-3.12.3/README.md 2020-02-02 01:00:00.000000000 +0100
@@ -1,4 +1,4 @@
-# py-filelock
+# filelock
[](https://pypi.org/project/filelock/)
[](https://py-filelock.readthedocs.io/en/latest/?badge=latest)
[](https://github.com/psf/black)
-[](https://pepy.tech/project/filelock)
+[](https://pepy.tech/project/filelock)
[](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml)
For more information checkout the [official
documentation](https://py-filelock.readthedocs.io/en/latest/index.html).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/pyproject.toml
new/filelock-3.12.3/pyproject.toml
--- old/filelock-3.12.2/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
+++ new/filelock-3.12.3/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
@@ -2,7 +2,7 @@
build-backend = "hatchling.build"
requires = [
"hatch-vcs>=0.3",
- "hatchling>=1.17.1",
+ "hatchling>=1.18",
]
[project]
@@ -18,7 +18,7 @@
]
license = "Unlicense"
maintainers = [{ name = "Bernát Gábor", email = "[email protected]" }]
-requires-python = ">=3.7"
+requires-python = ">=3.8"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
@@ -26,7 +26,6 @@
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
@@ -39,18 +38,21 @@
dynamic = [
"version",
]
+dependencies = [
+ 'typing-extensions>=4.7.1; python_version < "3.11"',
+]
optional-dependencies.docs = [
- "furo>=2023.5.20",
- "sphinx>=7.0.1",
- "sphinx-autodoc-typehints!=1.23.4,>=1.23",
+ "furo>=2023.7.26",
+ "sphinx>=7.1.2",
+ "sphinx-autodoc-typehints!=1.23.4,>=1.24",
]
optional-dependencies.testing = [
"covdefaults>=2.3",
- "coverage>=7.2.7",
- "diff-cover>=7.5",
- "pytest>=7.3.1",
+ "coverage>=7.3",
+ "diff-cover>=7.7",
+ "pytest>=7.4",
"pytest-cov>=4.1",
- "pytest-mock>=3.10",
+ "pytest-mock>=3.11.1",
"pytest-timeout>=2.1",
]
urls.Documentation = "https://py-filelock.readthedocs.io"
@@ -60,32 +62,17 @@
[tool.hatch]
build.hooks.vcs.version-file = "src/filelock/version.py"
-build.targets.sdist.include = ["/src", "/tests"]
+build.targets.sdist.include = ["/src", "/tests", "/tox.ini"]
version.source = "vcs"
[tool.black]
line-length = 120
-[tool.coverage]
-html.show_contexts = true
-html.skip_covered = false
-paths.source = ["src", ".tox/*/lib/*/site-packages",
".tox\\*\\Lib\\site-packages", "**/src", "**\\src"]
-paths.other = [".", "*/py-filelock", "*\\py-filelock"]
-report.fail_under = 76
-run.parallel = true
-run.plugins = ["covdefaults"]
-
-[tool.mypy]
-python_version = "3.11"
-show_error_codes = true
-strict = true
-overrides = [{ module = ["appdirs.*", "jnius.*"], ignore_missing_imports =
true }]
-
[tool.ruff]
select = ["ALL"]
line-length = 120
-target-version = "py37"
-isort = {known-first-party = ["platformdirs", "tests"], required-imports =
["from __future__ import annotations"]}
+target-version = "py38"
+isort = {known-first-party = ["filelock"], required-imports = ["from
__future__ import annotations"]}
ignore = [
"ANN101", # Missing type annotation for `self` in method
"D301", # Use `r"""` if any backslashes in a docstring
@@ -104,3 +91,18 @@
"S603", # `subprocess` call: check for execution of untrusted input
"PLR2004", # Magic value used in comparison, consider replacing with a
constant variable
]
+
+[tool.coverage]
+html.show_contexts = true
+html.skip_covered = false
+paths.source = ["src", ".tox/*/lib/*/site-packages",
".tox\\*\\Lib\\site-packages", "**/src", "**\\src"]
+paths.other = [".", "*/filelock", "*\\filelock"]
+report.fail_under = 76
+run.parallel = true
+run.plugins = ["covdefaults"]
+
+[tool.mypy]
+python_version = "3.11"
+show_error_codes = true
+strict = true
+overrides = [{ module = ["appdirs.*", "jnius.*"], ignore_missing_imports =
true }]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/__init__.py
new/filelock-3.12.3/src/filelock/__init__.py
--- old/filelock-3.12.2/src/filelock/__init__.py 2020-02-02
01:00:00.000000000 +0100
+++ new/filelock-3.12.3/src/filelock/__init__.py 2020-02-02
01:00:00.000000000 +0100
@@ -24,8 +24,8 @@
if sys.platform == "win32": # pragma: win32 cover
_FileLock: type[BaseFileLock] = WindowsFileLock
-else: # pragma: win32 no cover
- if has_fcntl: # noqa: PLR5501
+else: # pragma: win32 no cover # noqa: PLR5501
+ if has_fcntl:
_FileLock: type[BaseFileLock] = UnixFileLock
else:
_FileLock = SoftFileLock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/_api.py
new/filelock-3.12.3/src/filelock/_api.py
--- old/filelock-3.12.2/src/filelock/_api.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.12.3/src/filelock/_api.py 2020-02-02 01:00:00.000000000
+0100
@@ -13,8 +13,15 @@
from ._error import Timeout
if TYPE_CHECKING:
+ import sys
from types import TracebackType
+ if sys.version_info >= (3, 11): # pragma: no cover (py311+)
+ from typing import Self
+ else: # pragma: no cover (<py311)
+ from typing_extensions import Self
+
+
_LOGGER = logging.getLogger("filelock")
@@ -71,7 +78,7 @@
def __init__(
self,
- lock_file: str | os.PathLike[Any],
+ lock_file: str | os.PathLike[str],
timeout: float = -1,
mode: int = 0o644,
thread_local: bool = True, # noqa: FBT001, FBT002
@@ -246,7 +253,7 @@
self._context.lock_counter = 0
_LOGGER.debug("Lock %s released on %s", lock_id, lock_filename)
- def __enter__(self) -> BaseFileLock:
+ def __enter__(self) -> Self:
"""
Acquire the lock.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/_soft.py
new/filelock-3.12.3/src/filelock/_soft.py
--- old/filelock-3.12.2/src/filelock/_soft.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.12.3/src/filelock/_soft.py 2020-02-02 01:00:00.000000000
+0100
@@ -7,7 +7,7 @@
from pathlib import Path
from ._api import BaseFileLock
-from ._util import raise_on_not_writable_file
+from ._util import ensure_directory_exists, raise_on_not_writable_file
class SoftFileLock(BaseFileLock):
@@ -15,6 +15,7 @@
def _acquire(self) -> None:
raise_on_not_writable_file(self.lock_file)
+ ensure_directory_exists(self.lock_file)
# first check for exists and read-only mode as the open will mask this
case as EEXIST
flags = (
os.O_WRONLY # open for writing only
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/_unix.py
new/filelock-3.12.3/src/filelock/_unix.py
--- old/filelock-3.12.2/src/filelock/_unix.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.12.3/src/filelock/_unix.py 2020-02-02 01:00:00.000000000
+0100
@@ -7,6 +7,7 @@
from typing import cast
from ._api import BaseFileLock
+from ._util import ensure_directory_exists
#: a flag to indicate if the fcntl API is available
has_fcntl = False
@@ -33,6 +34,7 @@
"""Uses the :func:`fcntl.flock` to hard lock the lock file on unix
systems."""
def _acquire(self) -> None:
+ ensure_directory_exists(self.lock_file)
open_flags = os.O_RDWR | os.O_CREAT | os.O_TRUNC
fd = os.open(self.lock_file, open_flags, self._context.mode)
with suppress(PermissionError): # This locked is not owned by
this UID
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/_util.py
new/filelock-3.12.3/src/filelock/_util.py
--- old/filelock-3.12.2/src/filelock/_util.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.12.3/src/filelock/_util.py 2020-02-02 01:00:00.000000000
+0100
@@ -4,6 +4,7 @@
import stat
import sys
from errno import EACCES, EISDIR
+from pathlib import Path
def raise_on_not_writable_file(filename: str) -> None:
@@ -32,6 +33,15 @@
raise IsADirectoryError(EISDIR, "Is a directory", filename)
+def ensure_directory_exists(filename: Path | str) -> None:
+ """
+ Ensure the directory containing the file exists (create it if necessary)
+ :param filename: file.
+ """
+ Path(filename).parent.mkdir(parents=True, exist_ok=True)
+
+
__all__ = [
"raise_on_not_writable_file",
+ "ensure_directory_exists",
]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/_windows.py
new/filelock-3.12.3/src/filelock/_windows.py
--- old/filelock-3.12.2/src/filelock/_windows.py 2020-02-02
01:00:00.000000000 +0100
+++ new/filelock-3.12.3/src/filelock/_windows.py 2020-02-02
01:00:00.000000000 +0100
@@ -8,7 +8,7 @@
from typing import cast
from ._api import BaseFileLock
-from ._util import raise_on_not_writable_file
+from ._util import ensure_directory_exists, raise_on_not_writable_file
if sys.platform == "win32": # pragma: win32 cover
import msvcrt
@@ -18,6 +18,7 @@
def _acquire(self) -> None:
raise_on_not_writable_file(self.lock_file)
+ ensure_directory_exists(self.lock_file)
flags = (
os.O_RDWR # open for read and write
| os.O_CREAT # create file if not exists
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/src/filelock/version.py
new/filelock-3.12.3/src/filelock/version.py
--- old/filelock-3.12.2/src/filelock/version.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.12.3/src/filelock/version.py 2020-02-02 01:00:00.000000000
+0100
@@ -1,4 +1,4 @@
# file generated by setuptools_scm
# don't change, don't track in version control
-__version__ = version = '3.12.2'
-__version_tuple__ = version_tuple = (3, 12, 2)
+__version__ = version = '3.12.3'
+__version_tuple__ = version_tuple = (3, 12, 3)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/tests/test_filelock.py
new/filelock-3.12.3/tests/test_filelock.py
--- old/filelock-3.12.2/tests/test_filelock.py 2020-02-02 01:00:00.000000000
+0100
+++ new/filelock-3.12.3/tests/test_filelock.py 2020-02-02 01:00:00.000000000
+0100
@@ -16,33 +16,27 @@
from uuid import uuid4
import pytest
+
from filelock import BaseFileLock, FileLock, SoftFileLock, Timeout,
UnixFileLock, WindowsFileLock
if TYPE_CHECKING:
from pytest_mock import MockerFixture
[email protected](
- ("lock_type", "path_type"),
- [
- (FileLock, str),
- (FileLock, PurePath),
- (FileLock, Path),
- (SoftFileLock, str),
- (SoftFileLock, PurePath),
- (SoftFileLock, Path),
- ],
-)
[email protected]("lock_type", [FileLock, SoftFileLock])
[email protected]("path_type", [str, PurePath, Path])
[email protected]("filename", ["a", "new/b", "new2/new3/c"])
def test_simple(
lock_type: type[BaseFileLock],
- path_type: type[str] | type[Path],
+ path_type: type[str | Path],
+ filename: str,
tmp_path: Path,
caplog: pytest.LogCaptureFixture,
) -> None:
caplog.set_level(logging.DEBUG)
# test lock creation by passing a `str`
- lock_path = tmp_path / "a"
+ lock_path = tmp_path / filename
lock = lock_type(path_type(lock_path))
with lock as locked:
assert lock.is_locked
@@ -112,7 +106,6 @@
@pytest.mark.parametrize(
("expected_error", "match", "bad_lock_file"),
[
- pytest.param(FileNotFoundError, "No such file or directory:", "a/b",
id="non_existent_directory"),
pytest.param(FileNotFoundError, "No such file or directory:", "",
id="blank_filename"),
pytest.param(ValueError, "embedded null (byte|character)", "\0",
id="null_byte"),
# Should be PermissionError on Windows
@@ -568,11 +561,8 @@
lock_file, txt_file = tmp_path / "test.txt.lock", tmp_path / "test.txt"
lock = lock_type(lock_file)
- results = []
with ThreadPoolExecutor() as executor:
- for _ in range(100):
- results.append(executor.submit(mess_with_file, lock))
-
+ results = [executor.submit(mess_with_file, lock) for _ in range(100)]
assert all(r.result() is None for r in results)
@@ -584,10 +574,8 @@
lock_file, txt_file = tmp_path / "test.txt.lock", tmp_path / "test.txt"
lock = lock_type(lock_file)
- results = []
with ThreadPoolExecutor() as executor:
- for _ in range(100):
- results.append(executor.submit(mess_with_file))
+ results = [executor.submit(mess_with_file) for _ in range(100)]
assert all(r.result() is None for r in results)
@@ -602,10 +590,8 @@
_check_file_read_write(txt_file)
lock_file, txt_file = tmp_path / "test.txt.lock", tmp_path / "test.txt"
- results = []
with ThreadPoolExecutor() as executor:
- for _ in range(100):
- results.append(executor.submit(mess_with_file))
+ results = [executor.submit(mess_with_file) for _ in range(100)]
assert all(r.result() is None for r in results)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/filelock-3.12.2/tox.ini new/filelock-3.12.3/tox.ini
--- old/filelock-3.12.2/tox.ini 1970-01-01 01:00:00.000000000 +0100
+++ new/filelock-3.12.3/tox.ini 2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,109 @@
+[tox]
+requires =
+ tox>=4.2
+env_list =
+ fix
+ py312
+ py311
+ py310
+ py39
+ py38
+ py37
+ type
+ coverage
+ docs
+ readme
+skip_missing_interpreters = true
+
+[testenv]
+description = run tests with {basepython}
+package = wheel
+wheel_build_env = .pkg
+extras =
+ testing
+pass_env =
+ PYTEST_ADDOPTS
+set_env =
+ COVERAGE_FILE = {toxworkdir}{/}.coverage.{envname}
+commands =
+ pytest {tty:--color=yes} {posargs: \
+ --junitxml {toxworkdir}{/}junit.{envname}.xml --cov
{envsitepackagesdir}{/}filelock --cov {toxinidir}{/}tests \
+ --cov-config=pyproject.toml --no-cov-on-fail --cov-report
term-missing:skip-covered --cov-context=test \
+ --cov-report html:{envtmpdir}{/}htmlcov --cov-report
xml:{toxworkdir}{/}coverage.{envname}.xml \
+ tests
+ diff-cover --compare-branch {env:DIFF_AGAINST:origin/main}
{toxworkdir}{/}coverage.{envname}.xml}
+
+[testenv:fix]
+description = format the code base to adhere to our styles, and complain about
what we cannot do automatically
+base_python = python3.10
+skip_install = true
+deps =
+ pre-commit>=3.3.3
+commands =
+ pre-commit run --all-files --show-diff-on-failure
+ python -c 'import pathlib; print("hint: run \{\} install to add checks as
pre-commit hook".format(pathlib.Path(r"{envdir}") / "bin" / "pre-commit"))'
+
+[testenv:type]
+description = run type check on code base
+deps =
+ mypy==1.5
+set_env =
+ {tty:MYPY_FORCE_COLOR = 1}
+commands =
+ mypy --strict src/filelock
+ mypy --strict tests
+
+[testenv:coverage]
+description = combine coverage files and generate diff (against DIFF_AGAINST
defaulting to origin/main)
+skip_install = true
+deps =
+ covdefaults>=2.3
+ coverage[toml]>=7.3
+ diff-cover>=7.7
+extras =
+parallel_show_output = true
+pass_env =
+ DIFF_AGAINST
+set_env =
+ COVERAGE_FILE = {toxworkdir}/.coverage
+commands =
+ coverage combine
+ coverage report --skip-covered --show-missing
+ coverage xml -o {toxworkdir}/coverage.xml
+ coverage html -d {toxworkdir}/htmlcov
+ diff-cover --compare-branch {env:DIFF_AGAINST:origin/main}
{toxworkdir}/coverage.xml
+depends =
+ py311
+ py310
+ py39
+ py38
+ py37
+
+[testenv:docs]
+description = build documentation
+extras =
+ docs
+commands =
+ sphinx-build -d "{envtmpdir}{/}doctree" docs "{toxworkdir}{/}docs_out"
--color -b html -W {posargs}
+ python -c 'print(r"documentation available under
file://{toxworkdir}{/}docs_out{/}index.html")'
+
+[testenv:readme]
+description = check that the long description is valid (need for PyPI)
+skip_install = true
+deps =
+ build[virtualenv]>=0.10
+ twine>=4.0.2
+extras =
+commands =
+ pyproject-build -o {envtmpdir} --wheel --sdist .
+ twine check {envtmpdir}/*
+
+[testenv:dev]
+description = generate a DEV environment
+package = editable
+extras =
+ docs
+ testing
+commands =
+ python -m pip list --format=columns
+ python -c 'import sys; print(sys.executable)'