diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 83cbd017e..236a922aa 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,32 +1,7 @@ -.wy-nav-content { - padding: 1em; - max-width: 100%; -} - -/* Reduce whitespace on the inline-code snippets and add softer corners */ -.rst-content code { - padding: 2px 3px; - border-radius: 3px; -} - -dl { - /*margin-bottom: 0!important;*/ -} -dt { - display: inline !important; - padding: 3px; -} -dd { - margin-bottom: 2px!important; -} -.rst-content dd p { - margin-bottom: 0px; -} - -/* Reduce whitespace before enumeration */ -.section p { - margin-bottom: 12px; -} -.section ol { - margin-bottom: 12px !important; +blockquote { + border-left: none; + font-style: normal; + margin-left: 1.5rem; + margin-right: 0; + padding: 0; } diff --git a/docs/changelog/1881.doc.rst b/docs/changelog/1881.doc.rst new file mode 100644 index 000000000..d352d501a --- /dev/null +++ b/docs/changelog/1881.doc.rst @@ -0,0 +1,3 @@ +Adopt furo theme, update our state diagram and description in user docs (SVG + light/dark variant), split +the Python API into its own page from under the plugin page, and document plugin adoption under the ``tox-dev`` +organization - by :user:`gaborbernat`. diff --git a/docs/conf.py b/docs/conf.py index f6c4c6116..6c000161c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,7 +6,6 @@ from subprocess import check_output from typing import Any, cast -import sphinx_rtd_theme from docutils.nodes import Element, Node, Text, container, fully_normalize_name, literal, paragraph, reference, strong from docutils.parsers.rst.directives import flag, unchanged, unchanged_required from docutils.parsers.rst.states import RSTState, RSTStateMachine @@ -51,23 +50,16 @@ project = name today_fmt = "%B %d, %Y" -html_theme = "sphinx_rtd_theme" -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] +html_theme = "furo" html_theme_options = { - "canonical_url": "https://tox.readthedocs.io/en/latest/", - "logo_only": False, - "display_version": True, - "prev_next_buttons_location": "bottom", - "collapse_navigation": False, - "sticky_navigation": True, - "navigation_depth": 6, - "includehidden": True, + "navigation_with_keys": True, } +html_title = "tox 4 - rewrite" html_static_path = ["_static"] +html_css_files = ["css/custom.css"] html_last_updated_fmt = datetime.now().isoformat() html_logo = "_static/img/tox.svg" html_favicon = "_static/img/toxfavi.ico" -htmlhelp_basename = "Pastedoc" autoclass_content = "class" autodoc_member_order = "bysource" @@ -148,7 +140,6 @@ def resolve_xref( app.connect("autodoc-skip-member", skip_member) app.connect("autodoc-process-signature", process_signature, priority=400) app.add_domain(PatchedPythonDomain, override=True) - app.add_css_file("custom.css") class ToxConfig(SphinxDirective): name = "conf" diff --git a/docs/config.rst b/docs/config.rst index 18914932d..fcb758c4c 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -195,8 +195,9 @@ Core Indicates where the packaging root file exists (historically setup.py file or pyproject.toml now). -Python -~~~~~~ +Python language core options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + .. conf:: :keys: ignore_base_python_conflict, ignore_basepython_conflict :default: True @@ -218,8 +219,8 @@ Python tox environment --------------- -Base -~~~~ +Base options +~~~~~~~~~~~~ .. conf:: :keys: envname, env_name @@ -466,8 +467,8 @@ Package Indicates where the packaging root file exists (historically setup.py file or pyproject.toml now). -Python -~~~~~~ +Python options +~~~~~~~~~~~~~~ .. conf:: :keys: base_python, basepython :default: {package_root} diff --git a/docs/development.rst b/docs/development.rst index ce0f78d1a..817175b16 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -223,3 +223,15 @@ initiate a vote among the existing maintainers. - PyPI Publishing Access - CI Administration capabilities - ReadTheDocs Administration capabilities + - The list below + +.. _current-maintainers: + +Current maintainers +^^^^^^^^^^^^^^^^^^^ + +- `Anthony Sottile `_ +- `Bernát Gábor `_ +- `Jürgen Gmach `_ +- `Miroslav Šedivý `_ +- `Oliver Bestwalter `_ diff --git a/docs/img/overview.mermaidjs b/docs/img/overview.mermaidjs new file mode 100644 index 000000000..3bd5db100 --- /dev/null +++ b/docs/img/overview.mermaidjs @@ -0,0 +1,40 @@ +stateDiagram-v2 +%%{init:{'state':{'nodeSpacing': 0, 'rankSpacing': 20}}}%% + +[*] --> conf +conf --> tox_env + +state tox_env { + state hdi <> + state hpi <> + state fpi <> + + [*] --> create + create --> hdi : has (new) project dependencies (deps) + hdi --> deps: yes + hdi --> hpi: no, has package + deps --> hpi: has package + hpi --> fpi: yes, built package in this run + hpi --> commands : no + fpi --> install_deps: yes + fpi --> package: no + package --> install_deps + install_deps --> install + install --> commands + commands --> commands: for each entry
in commands* + commands --> [*] : pass outcome to report +} +tox_env --> tox_env :for each tox environment + +tox_env --> report +report --> report :for each tox environment +report --> [*] + +conf: build configuration (CLI + files)
identify environments to run +create: create an isolated tox environment
the other steps executed within this +deps: install project dependencies (if has deps) +package: build package +install: install package without dependencies +install_deps: install (new) package dependencies +commands: run command +report: report the outcome of the run diff --git a/docs/img/overview_dark.svg b/docs/img/overview_dark.svg new file mode 100644 index 000000000..2b488ab51 --- /dev/null +++ b/docs/img/overview_dark.svg @@ -0,0 +1,563 @@ +
for each tox environment
for each tox environment
build configuration (CLI + files)
identify environments to run
tox_env
has (new) project dependencies (deps)
yes
no, has package
has package
yes, built package in this run
no
yes
no
for each entry
in commands*
pass outcome to report
create an isolated tox environment
the other steps executed within this
install project dependencies (if has deps)
run command
install (new) package dependencies
build package
install package without dependencies
report the outcome of the run
diff --git a/docs/img/overview_light.svg b/docs/img/overview_light.svg new file mode 100644 index 000000000..698a04290 --- /dev/null +++ b/docs/img/overview_light.svg @@ -0,0 +1,563 @@ +
for each tox environment
for each tox environment
build configuration (CLI + files)
identify environments to run
tox_env
has (new) project dependencies (deps)
yes
no, has package
has package
yes, built package in this run
no
yes
no
for each entry
in commands*
pass outcome to report
create an isolated tox environment
the other steps executed within this
install project dependencies (if has deps)
run command
install (new) package dependencies
build package
install package without dependencies
report the outcome of the run
diff --git a/docs/img/tox_flow.png b/docs/img/tox_flow.png deleted file mode 100644 index 4f13b8bc7..000000000 Binary files a/docs/img/tox_flow.png and /dev/null differ diff --git a/docs/index.rst b/docs/index.rst index 8fc175110..76d8d66da 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -73,5 +73,6 @@ you want to do more research, we recommend taking a look at these projects: config faq plugins + plugins_api development changelog diff --git a/docs/installation.rst b/docs/installation.rst index 1009f148b..ae3e76164 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -4,12 +4,13 @@ Installation via pipx -------- -:pypi:`tox` is a CLI tool that needs a Python interpreter (version 3.6 or higher) to run. -We recommend :pypi:`pipx` to install tox into an isolated environment. This has the added -benefit that later you'll be able to upgrade tox without affecting other parts of the system. +:pypi:`tox` is a CLI tool that needs a Python interpreter (version 3.6 or higher) to run. We recommend :pypi:`pipx` to +install tox into an isolated environment. This has the added benefit that later you'll be able to upgrade tox without +affecting other parts of the system. -.. code-block:: console +.. code-block:: bash + python -m pip install pipx-in-pipx --user pipx install tox tox --help @@ -18,21 +19,21 @@ via pip Alternatively you can install it within the global Python interpreter itself (perhaps as a user package via the ``--user`` flag). Be cautious if you are using a Python installation that is managed by your operating system or -another package manager. ``pip`` might not coordinate with those tools, and may leave your system in an -inconsistent state. Note, if you go down this path you need to ensure pip is new enough per the subsections below: +another package manager. ``pip`` might not coordinate with those tools, and may leave your system in an inconsistent +state. Note, if you go down this path you need to ensure pip is new enough per the subsections below: -.. code-block:: console +.. code-block:: bash python -m pip install --user tox python -m tox --help wheel ~~~~~ -Installing tox via a wheel (default with pip) requires an installer that can understand the ``python-requires`` -tag (see `PEP-503 `_), with pip this is version ``9.0.0`` (released in -November 2016). Furthermore, in case you're not installing it via PyPi you need to use a mirror that correctly -forwards the ``python-requires`` tag (notably the OpenStack mirrors don't do this, or older -`devpi `_ versions - added with version ``4.7.0``). +Installing tox via a wheel (default with pip) requires an installer that can understand the ``python-requires`` tag (see +`PEP-503 `_), with pip this is version ``9.0.0`` (released in November 2016). +Furthermore, in case you're not installing it via PyPi you need to use a mirror that correctly forwards the +``python-requires`` tag (notably the OpenStack mirrors don't do this, or older `devpi `_ +versions - added with version ``4.7.0``). .. _sdist: @@ -69,7 +70,6 @@ Python and OS Compatibility tox works with the following Python interpreter implementations: - `CPython `_ versions 3.6, 3.7, 3.8, 3.9, 3.10 -- `PyPy `_ 3.6+. -This means tox works on the latest patch version of each of these minor versions. Previous patch versions are -supported on a best effort approach. We support all platforms ``virtualenv`` supports. +This means tox works on the latest patch version of each of these minor versions. Previous patch versions are supported +on a best effort approach. diff --git a/docs/plugins.rst b/docs/plugins.rst index 91a4c538f..8b0693f67 100644 --- a/docs/plugins.rst +++ b/docs/plugins.rst @@ -1,8 +1,9 @@ -Plugin system +Extending tox ============= -Plugin API -~~~~~~~~~~ +Extensions points +~~~~~~~~~~~~~~~~~ + .. automodule:: tox.plugin :members: :exclude-members: impl @@ -13,121 +14,30 @@ Plugin API .. automodule:: tox.plugin.spec :members: -tox objects -~~~~~~~~~~~ - -register --------- - -.. automodule:: tox.tox_env.register - :members: - :exclude-members: REGISTER +Adoption of a plugin under tox-dev Github organization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. autodata:: REGISTER - :no-value: +You're free to host your plugin on your favorite platform, however the core tox development is happening on Github, +under the ``tox-dev`` org organization. We are happy to adopt tox plugins under the ``tox-dev`` organization if: -config ------- -.. autoclass:: tox.config.cli.parser.Parsed - :members: +- we determine it's trying to solve a valid use case and it's not malicious (e.g. no plugin that deletes the users home + directory), +- it's released on PyPi with at least 100 downloads per month (to ensure it's a plugin used by people). -.. autoclass:: tox.config.main.Config - :members: - :exclude-members: __init__, make +What's in for you in this: -.. autoclass:: tox.config.sets.ConfigSet - :members: - :special-members: __iter__, __contains__ +- you get owner rights on the repository under the tox-dev organization, +- exposure of your plugin under the core umbrella, +- backup maintainers from other tox plugin development. -.. autoclass:: tox.config.sets.CoreConfigSet - :members: - -.. autoclass:: tox.config.sets.EnvConfigSet - :members: - -.. autoclass:: tox.config.of_type.ConfigDefinition - :members: - -.. autoclass:: tox.config.of_type.ConfigDynamicDefinition - :members: - -.. autoclass:: tox.config.of_type.ConfigConstantDefinition - :members: - -.. autoclass:: tox.config.source.api.Source - :members: - -.. autoclass:: tox.config.loader.api.Override - :members: - -.. autoclass:: tox.config.loader.api.Loader - :members: - -.. autoclass:: tox.config.loader.convert.Convert - :members: - -.. autoclass:: tox.config.types.EnvList - :members: - :special-members: __bool__, __iter__ - -.. autoclass:: tox.config.types.Command - :members: +How to apply: -environments ------------- -.. autoclass:: tox.tox_env.api.ToxEnv - :members: - -.. autoclass:: tox.tox_env.runner.RunToxEnv - :members: - -.. autoclass:: tox.tox_env.package.PackageToxEnv - :members: - -.. autoclass:: tox.tox_env.package.Package - :members: - -journal -------- -.. autoclass:: tox.journal.env.EnvJournal - :members: - :exclude-members: __init__ - :special-members: __bool__, __setitem__ - -report ------- -.. autoclass:: tox.report.ToxHandler - :members: - :exclude-members: stream, format, patch_thread, write_out_err, suspend_out_err - -execute -------- -.. autoclass:: tox.execute.request.ExecuteRequest - :members: - -.. autoclass:: tox.execute.request.StdinSource - :members: - -.. autoclass:: tox.execute.api.Outcome - :members: - -.. autoclass:: tox.execute.api.Execute - :members: - -.. autoclass:: tox.execute.api.ExecuteStatus - :members: - -.. autoclass:: tox.execute.api.ExecuteInstance - :members: - -.. autoclass:: tox.execute.stream.SyncWrite - :members: - -installer ---------- - -.. autoclass:: tox.tox_env.installer.Installer - :members: +- create an issue under the ``tox-dev/tox`` Github repository with the title `Adopt plugin \ + `_, +- wait for the green light by one of our maintainers (see :ref:`current-maintainers`), +- follow the `guidance by Github + `_, +- (optionally) add at least one other people as co-maintainer on PyPI. Migration from tox 3 ~~~~~~~~~~~~~~~~~~~~ @@ -145,6 +55,6 @@ to ``virtualenv``. Therefore first `define a new virtualenv discovery mechanism --------------- Register new packager types via :func:`tox_register_tox_env `. -``tox_adoption`` ----------------- +``tox_addoption`` +----------------- Renamed to :func:`tox_add_option `. diff --git a/docs/plugins_api.rst b/docs/plugins_api.rst new file mode 100644 index 000000000..e196b2508 --- /dev/null +++ b/docs/plugins_api.rst @@ -0,0 +1,118 @@ +API +=== + +tox objects +~~~~~~~~~~~ + +register +-------- + +.. automodule:: tox.tox_env.register + :members: + :exclude-members: REGISTER + +.. autodata:: REGISTER + :no-value: + +config +------ +.. autoclass:: tox.config.cli.parser.Parsed + :members: + +.. autoclass:: tox.config.main.Config + :members: + :exclude-members: __init__, make + +.. autoclass:: tox.config.sets.ConfigSet + :members: + :special-members: __iter__, __contains__ + +.. autoclass:: tox.config.sets.CoreConfigSet + :members: + +.. autoclass:: tox.config.sets.EnvConfigSet + :members: + +.. autoclass:: tox.config.of_type.ConfigDefinition + :members: + +.. autoclass:: tox.config.of_type.ConfigDynamicDefinition + :members: + +.. autoclass:: tox.config.of_type.ConfigConstantDefinition + :members: + +.. autoclass:: tox.config.source.api.Source + :members: + +.. autoclass:: tox.config.loader.api.Override + :members: + +.. autoclass:: tox.config.loader.api.Loader + :members: + +.. autoclass:: tox.config.loader.convert.Convert + :members: + +.. autoclass:: tox.config.types.EnvList + :members: + :special-members: __bool__, __iter__ + +.. autoclass:: tox.config.types.Command + :members: + +environments +------------ +.. autoclass:: tox.tox_env.api.ToxEnv + :members: + +.. autoclass:: tox.tox_env.runner.RunToxEnv + :members: + +.. autoclass:: tox.tox_env.package.PackageToxEnv + :members: + +.. autoclass:: tox.tox_env.package.Package + :members: + +journal +------- +.. autoclass:: tox.journal.env.EnvJournal + :members: + :exclude-members: __init__ + :special-members: __bool__, __setitem__ + +report +------ +.. autoclass:: tox.report.ToxHandler + :members: + :exclude-members: stream, format, patch_thread, write_out_err, suspend_out_err + +execute +------- +.. autoclass:: tox.execute.request.ExecuteRequest + :members: + +.. autoclass:: tox.execute.request.StdinSource + :members: + +.. autoclass:: tox.execute.api.Outcome + :members: + +.. autoclass:: tox.execute.api.Execute + :members: + +.. autoclass:: tox.execute.api.ExecuteStatus + :members: + +.. autoclass:: tox.execute.api.ExecuteInstance + :members: + +.. autoclass:: tox.execute.stream.SyncWrite + :members: + +installer +--------- + +.. autoclass:: tox.tox_env.installer.Installer + :members: diff --git a/docs/user_guide.rst b/docs/user_guide.rst index 795e7c394..a62ea9259 100644 --- a/docs/user_guide.rst +++ b/docs/user_guide.rst @@ -9,74 +9,96 @@ file residing at the root of your project: .. code-block:: ini - # content of tox.ini at the root of the project [tox] envlist = - py38 - py37 + format + py310 + py39 [testenv] - # install pytest in the virtualenv where commands will be executed + # install pytest in a virtual environment and invoke it on the test folder deps = - pytest >= 5, <6 - commands = - # NOTE: you can run any command line tool here - not just tests - pytest + pytest>=6 + pytest-sugar + commands = pytest tests {posargs} -You can also try generating a ``tox.ini`` file automatically by running ``tox quickstart`` and then answering a few -simple questions. To sdist-package, install and test your project against Python3.7 and Python3.8, just type - -.. code-block:: console - - tox + [testenv:format] + # install black in a virtual environment and invoke it on the current folder + deps = black + skip_install = true + commands = black . -and watch things happening. You must have python3.7 and python3.8 installed in your environment, otherwise you will see -errors. When you run ``tox`` a second time you'll notice that it runs much faster because it keeps track of virtualenv +You can also try generating a ``tox.ini`` file automatically by running ``tox quickstart`` and then answering a few +simple questions. The configuration above will run three separate tox environments ``format``, ``py310`` and ``py39`` +when you type in ``tox`` onto the command line within the projects folder (as defined by ``envlist``). The ``format`` +environment will create a Python virtual environment, install the ``black`` tool in it and the invoke it on the project +root folder. + +The ``py310`` and ``py39`` do not have their own dedicated configuration section as ```format`` had (via +``[testenv:format]``) so they'll pull their configuration entirely from the ``[testenv]`` section. A Python virtual +environment is created, the dependencies from the ``deps`` config installed, the project package built and installed, +and then the ``pytest`` tool invoked. + +The ``{posargs}`` argument is replaced with whatever you pass in after the ``--`` on the CI, so if you'd run +``tox -- -k test_something`` the command tox would run would be ``pytest tests -k test_something``. Note for this to +work you must have Python 3.10 and 3.9 installed on the machine as virtualenv can only create virtual environments if +the given python version is globally available on the machine. + +When you run ``tox`` a second time you'll notice that it runs much faster because it keeps track of virtualenv details and will not recreate or re-install dependencies. System overview --------------- -.. figure:: img/tox_flow.png +Here you can see a graphical representation of its run states: + +.. image:: img/overview_light.svg :align: center - :width: 800px + :class: only-light + +.. image:: img/overview_dark.svg + :align: center + :class: only-dark - tox workflow diagram -tox roughly follows the following phases: +tox roughly follows the following states: -1. **configuration:** load ``tox.ini`` and merge it with options from the command line and the operating system - environment variables -2. **packaging** (optional): create a source distribution of the current project by invoking +#. **configuration:** load tox configuration files (such as ``tox.ini``, ``pyproject.toml``, and ``toxfile.py``) and + merge it with options from the command line and the operating system environment variables - .. code-block:: bash +#. **environment**: for each selected tox environment (e.g. ``py310``, ``py39``) do: - python setup.py sdist + #. **creation**: create a fresh environment; by default :pypi:`virtualenv` is used, but configurable via + :ref:`runner`. For `virtualenv` tox will use the `virtualenv discovery logic + `_ where the python specification is + defined by the tox environments :ref:`base_python` (if not set will default to the environments name). This is + created at first run only to be re-used at subsequent runs. If certain aspects of the project change (python + version, dependencies removed, etc.), a re-creation of the environment is automatically triggered. To force the + recreation tox can be invoked with the :ref:`recreate` flag (``-r``). - Note that for this operation the same Python environment will be used as the one tox is installed into (therefore you - need to make sure that it contains your build dependencies). Skip this step for application projects that don't have - a ``setup.py``. + #. **install dependencies** (optional): install the environment dependencies specified inside the ``deps`` + configuration section, and then the earlier packaged source distribution. By default ``pip`` is used to install + packages, however one can customize this via ``install_command``. Note ``pip`` will not update project + dependencies (specified either in the ``install_requires`` or the ``extras`` section of the ``setup.py``) if any + version already exists in the virtual environment; therefore we recommend to recreate your environments whenever + your project dependencies change. -3. **environment**: for each tox environment (e.g. ``py37``, ``py38``) do: + #. **packaging** (optional): create a distribution of the current project - 1. **environment creation**: create a fresh environment; by default :pypi:`virtualenv` is used. tox will - automatically try to discover a valid Python interpreter version by using the environment name (e.g. ``py37`` means - Python 3.7 and the ``basepython`` configuration value) and the current operating system ``PATH`` value. This is - created at first run only to be re-used at subsequent runs. If certain aspects of the project change, a re-creation - of the environment is automatically triggered. To force the recreation tox can be invoked with - ``-r``/``--recreate``. + #. **Build**: If the tox environment has a package configured tox will build a package from the current source + tree. If multiple tox environments are run and the package built are compatible in between them then it will be + reused. This is to ensure that we build the package as rare as needed. By default for Python a source + distribution is built as defined via the ``pyproject.toml`` style build (see PEP-517 and PEP-518). - 2. **install** (optional): install the environment dependencies specified inside the ``deps`` configuration - section, and then the earlier packaged source distribution. By default ``pip`` is used to install packages, however - one can customize this via ``install_command``. Note ``pip`` will not update project dependencies (specified - either in the ``install_requires`` or the ``extras`` section of the ``setup.py``) if any version already exists in - the virtual environment; therefore we recommend to recreate your environments whenever your project dependencies - change. + #. **Install the package dependencies**. If this has not changed since the last run this step will be skipped. - 3. **commands**: run the specified commands in the specified order. Whenever the exit code of any of them is not - zero, stop and mark the environment failed. When you start a command with a dash character, the exit code will be ignored. + #. **Install the package**. This operation will force reinstall the package without its dependencies. -4. **report** print out a report of outcomes for each tox environment: + #. **commands**: run the specified commands in the specified order. Whenever the exit code of any of them is not + zero, stop and mark the environment failed. When you start a command with a dash character, the exit code will be + ignored. + +#. **report** print out a report of outcomes for each tox environment: .. code:: bash @@ -92,26 +114,23 @@ specified via ``passenv``. Furthermore, it will also alter the ``PATH`` variable within the current active tox environment. In general, all executables in the path are available in ``commands``, but tox will error if it was not explicitly allowed via :ref:`allowlist_externals`. -Current features ----------------- +Main features +------------- * **automation of tedious Python related test activities** * **test your Python package against many interpreter and dependency configurations** - - automatic customizable (re)creation of :pypi:`virtualenv` test environments - - installs your project into each virtual environment - - test-tool agnostic: runs pytest, nose or unittest in a uniform manner + - automatic customizable (re)creation of :pypi:`virtualenv` test environments + - installs your project into each virtual environment + - test-tool agnostic: runs pytest, nose or unittest in a uniform manner * ``plugin system`` to modify tox execution with simple hooks. -* uses :pypi:`pip` and :pypi:`setuptools` by default. Support for configuring the installer command through - ``install_command``. -* **cross-Python compatible**: CPython 3.6 and higher, pypy 3.6+ and higher. -* **cross-platform**: Windows and Unix style environments -* **integrates with continuous integration servers** like Jenkins (formerly known as Hudson) and helps you to avoid - boilerplatish and platform-specific build-step hacks +* uses :pypi:`pip` and :pypi:`virtualenv` by default. Support for plugins replacing it with their own. +* **cross-Python compatible**: CPython 3.6 and higher. +* **cross-platform**: Windows, macOS and Unix style environments * **full interoperability with devpi**: is integrated with and is used for testing in the :pypi:`devpi` system, a versatile PyPI index server and release managing tool -* **driven by a simple ini-style config file** +* **driven by a simple (but flexible to allow expressing more complicated variants) ini-style config file** * **documented** examples and configuration * **concise reporting** about tool invocations and configuration errors * **professionally** supported diff --git a/setup.cfg b/setup.cfg index e312603d1..f14053b12 100644 --- a/setup.cfg +++ b/setup.cfg @@ -60,12 +60,12 @@ console_scripts = [options.extras_require] docs = + furo>=2021.8.17b43 sphinx>=4.1 sphinx-argparse-cli>=1.7 sphinx-autodoc-typehints>=1.12 sphinx-copybutton>=0.4 sphinx-inline-tabs>=2021.4.11b9 - sphinx-rtd-theme>=0.5.2 sphinxcontrib-towncrier>=0.2.0a0 towncrier>=21.3 testing =