Installation¶
This package is available on PyPi, so you can install the latest stable release with you favorite package manager:
Easiest way is to install uv, then use it to add it to your project:
$ uv add extra-platforms
Or to install it in your current virtual environment:
$ uv pip install extra-platforms
You can install the latest stable release and its dependencies with a simple pip call:
$ python -m pip install extra-platforms
See also pip installation instructions.
Try Extra Platforms¶
Before you decide to permanently install Extra Platforms on your system, you may want to try it out first without contaminating your system.
You can do so easily with uvx, which will launch a Python REPL with a pre-installed extra-platforms package:
$ uvx --with extra-platforms python
Installed 3 packages in 5ms
Python 3.11.11 (main, Mar 17 2025, 21:33:08) [Clang 20.1.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import extra_platforms
>>> extra_platforms.__version__
'3.2.3'
>>>
Tip
The uvx command above is going to download the latest stable release of the extra-platforms package from PyPi. If you want to try a development version instead, you can do:
$ uvx --with git+https://github.com/kdeldycke/extra-platforms python
Main dependencies¶
This is a graph of the default, main dependencies of the Python package:
flowchart LR
extra_platforms[["`extra-platforms`"]]
subgraph primary-deps [Primary dependencies]
distro{{"`distro`"}}
end
subgraph grp_docs [--group docs]
sphinx{{"`sphinx >=9.1`"}}
click_extra{{"`click-extra >=7.5`"}}
pytest{{"`pytest >=8.2.1`"}}
myst_parser{{"`myst-parser >=5`"}}
requests{{"`requests`"}}
furo{{"`furo >=2025.9.25`"}}
pygments(["`pygments`"])
jinja2(["`jinja2`"])
sphinxcontrib_mermaid{{"`sphinxcontrib-mermaid >=1.2.2`"}}
beautifulsoup4(["`beautifulsoup4`"])
click_0(["`click`"])
colorama(["`colorama`"])
docutils(["`docutils`"])
markdown_it_py(["`markdown-it-py`"])
wcmatch{{"`wcmatch >=10`"}}
accessible_pygments(["`accessible-pygments`"])
cloup(["`cloup`"])
mdit_py_plugins(["`mdit-py-plugins`"])
packaging(["`packaging`"])
pluggy(["`pluggy`"])
pygments_ansi_color(["`pygments-ansi-color`"])
pyyaml(["`pyyaml`"])
sphinx_autodoc_typehints{{"`sphinx-autodoc-typehints >=2.4`"}}
sphinx_basic_ng(["`sphinx-basic-ng`"])
sphinx_copybutton{{"`sphinx-copybutton >=0.5.2`"}}
sphinx_design{{"`sphinx-design >=0.6`"}}
sphinx_issues{{"`sphinx-issues >=5`"}}
sphinxext_opengraph{{"`sphinxext-opengraph >=0.13`"}}
tabulate(["`tabulate`"])
typing_extensions(["`typing-extensions`"])
urllib3(["`urllib3`"])
alabaster(["`alabaster`"])
babel(["`babel`"])
boltons(["`boltons`"])
bracex(["`bracex`"])
certifi(["`certifi`"])
charset_normalizer(["`charset-normalizer`"])
deepmerge(["`deepmerge`"])
idna(["`idna`"])
imagesize(["`imagesize`"])
iniconfig(["`iniconfig`"])
markupsafe(["`markupsafe`"])
mdurl(["`mdurl`"])
roman_numerals(["`roman-numerals`"])
snowballstemmer(["`snowballstemmer`"])
soupsieve(["`soupsieve`"])
sphinxcontrib_applehelp(["`sphinxcontrib-applehelp`"])
sphinxcontrib_devhelp(["`sphinxcontrib-devhelp`"])
sphinxcontrib_htmlhelp(["`sphinxcontrib-htmlhelp`"])
sphinxcontrib_jsmath(["`sphinxcontrib-jsmath`"])
sphinxcontrib_qthelp(["`sphinxcontrib-qthelp`"])
sphinxcontrib_serializinghtml(["`sphinxcontrib-serializinghtml`"])
wcwidth(["`wcwidth`"])
end
subgraph grp_test [--group test]
pytest_cov{{"`pytest-cov >=7`"}}
pytest_xdist{{"`pytest-xdist >=3.7`"}}
coverage{{"`coverage >=7.11`"}}
tomli{{"`tomli >=2.3`"}}
exceptiongroup(["`exceptiongroup`"])
pytest_github_actions_annotate_failures{{"`pytest-github-actions-annotate-failures >=0.3`"}}
pytest_randomly{{"`pytest-randomly >=4`"}}
execnet(["`execnet`"])
psutil(["`psutil`"])
end
subgraph grp_typing [--group typing]
types_requests{{"`types-requests >=2.32.4.20250611`"}}
end
extra_platforms ==>|" >=1.9 "| distro
sphinx ==> requests
sphinx --> pygments
sphinx --> jinja2
sphinx --> colorama
sphinx --> docutils
sphinx --> packaging
sphinx --> alabaster
sphinx --> babel
sphinx --> imagesize
sphinx --> roman_numerals
sphinx --> snowballstemmer
sphinx --> sphinxcontrib_applehelp
sphinx --> sphinxcontrib_devhelp
sphinx --> sphinxcontrib_htmlhelp
sphinx --> sphinxcontrib_jsmath
sphinx --> sphinxcontrib_qthelp
sphinx --> sphinxcontrib_serializinghtml
click_extra ==> sphinx
click_extra --> extra_platforms
click_extra ==> requests
click_extra --> pygments
click_extra --> click_0
click_extra --> docutils
click_extra ==> wcmatch
click_extra --> cloup
click_extra --> pygments_ansi_color
click_extra --> tabulate
click_extra --> boltons
click_extra --> deepmerge
pytest --> pygments
pytest --> colorama
pytest ==> tomli
pytest --> exceptiongroup
pytest --> packaging
pytest --> pluggy
pytest --> iniconfig
myst_parser ==> sphinx
myst_parser --> jinja2
myst_parser --> docutils
myst_parser --> markdown_it_py
myst_parser --> mdit_py_plugins
myst_parser --> pyyaml
requests --> urllib3
requests --> certifi
requests --> charset_normalizer
requests --> idna
furo ==> sphinx
furo --> pygments
furo --> beautifulsoup4
furo --> accessible_pygments
furo --> sphinx_basic_ng
pytest_cov ==> pytest
pytest_cov ==> coverage
pytest_cov --> pluggy
pytest_xdist ==> pytest
pytest_xdist --> execnet
pytest_xdist --> psutil
sphinxcontrib_mermaid ==> sphinx
sphinxcontrib_mermaid --> jinja2
sphinxcontrib_mermaid --> pyyaml
coverage ==> tomli
wcmatch --> bracex
pytest_github_actions_annotate_failures ==> pytest
pytest_randomly ==> pytest
sphinx_autodoc_typehints ==> sphinx
sphinx_copybutton ==> sphinx
sphinx_design ==> sphinx
sphinx_issues ==> sphinx
sphinxext_opengraph ==> sphinx
types_requests --> urllib3
jinja2 --> markupsafe
beautifulsoup4 --> typing_extensions
beautifulsoup4 --> soupsieve
click_0 --> colorama
markdown_it_py --> mdurl
accessible_pygments --> pygments
cloup --> click_0
exceptiongroup --> typing_extensions
mdit_py_plugins --> markdown_it_py
pygments_ansi_color --> pygments
sphinx_basic_ng ==> sphinx
tabulate --> wcwidth
extra_platforms -.-> grp_docs
extra_platforms -.-> grp_test
extra_platforms -.-> grp_typing
click accessible_pygments "https://pypi.org/project/accessible-pygments/" _blank
click alabaster "https://pypi.org/project/alabaster/" _blank
click babel "https://pypi.org/project/babel/" _blank
click beautifulsoup4 "https://pypi.org/project/beautifulsoup4/" _blank
click boltons "https://pypi.org/project/boltons/" _blank
click bracex "https://pypi.org/project/bracex/" _blank
click certifi "https://pypi.org/project/certifi/" _blank
click charset_normalizer "https://pypi.org/project/charset-normalizer/" _blank
click click_0 "https://pypi.org/project/click/" _blank
click click_extra "https://pypi.org/project/click-extra/" _blank
click cloup "https://pypi.org/project/cloup/" _blank
click colorama "https://pypi.org/project/colorama/" _blank
click coverage "https://pypi.org/project/coverage/" _blank
click deepmerge "https://pypi.org/project/deepmerge/" _blank
click distro "https://pypi.org/project/distro/" _blank
click docutils "https://pypi.org/project/docutils/" _blank
click exceptiongroup "https://pypi.org/project/exceptiongroup/" _blank
click execnet "https://pypi.org/project/execnet/" _blank
click extra_platforms "https://pypi.org/project/extra-platforms/" _blank
click furo "https://pypi.org/project/furo/" _blank
click idna "https://pypi.org/project/idna/" _blank
click imagesize "https://pypi.org/project/imagesize/" _blank
click iniconfig "https://pypi.org/project/iniconfig/" _blank
click jinja2 "https://pypi.org/project/jinja2/" _blank
click markdown_it_py "https://pypi.org/project/markdown-it-py/" _blank
click markupsafe "https://pypi.org/project/markupsafe/" _blank
click mdit_py_plugins "https://pypi.org/project/mdit-py-plugins/" _blank
click mdurl "https://pypi.org/project/mdurl/" _blank
click myst_parser "https://pypi.org/project/myst-parser/" _blank
click packaging "https://pypi.org/project/packaging/" _blank
click pluggy "https://pypi.org/project/pluggy/" _blank
click psutil "https://pypi.org/project/psutil/" _blank
click pygments "https://pypi.org/project/pygments/" _blank
click pygments_ansi_color "https://pypi.org/project/pygments-ansi-color/" _blank
click pytest "https://pypi.org/project/pytest/" _blank
click pytest_cov "https://pypi.org/project/pytest-cov/" _blank
click pytest_github_actions_annotate_failures "https://pypi.org/project/pytest-github-actions-annotate-failures/" _blank
click pytest_randomly "https://pypi.org/project/pytest-randomly/" _blank
click pytest_xdist "https://pypi.org/project/pytest-xdist/" _blank
click pyyaml "https://pypi.org/project/pyyaml/" _blank
click requests "https://pypi.org/project/requests/" _blank
click roman_numerals "https://pypi.org/project/roman-numerals/" _blank
click snowballstemmer "https://pypi.org/project/snowballstemmer/" _blank
click soupsieve "https://pypi.org/project/soupsieve/" _blank
click sphinx "https://pypi.org/project/sphinx/" _blank
click sphinx_autodoc_typehints "https://pypi.org/project/sphinx-autodoc-typehints/" _blank
click sphinx_basic_ng "https://pypi.org/project/sphinx-basic-ng/" _blank
click sphinx_copybutton "https://pypi.org/project/sphinx-copybutton/" _blank
click sphinx_design "https://pypi.org/project/sphinx-design/" _blank
click sphinx_issues "https://pypi.org/project/sphinx-issues/" _blank
click sphinxcontrib_applehelp "https://pypi.org/project/sphinxcontrib-applehelp/" _blank
click sphinxcontrib_devhelp "https://pypi.org/project/sphinxcontrib-devhelp/" _blank
click sphinxcontrib_htmlhelp "https://pypi.org/project/sphinxcontrib-htmlhelp/" _blank
click sphinxcontrib_jsmath "https://pypi.org/project/sphinxcontrib-jsmath/" _blank
click sphinxcontrib_mermaid "https://pypi.org/project/sphinxcontrib-mermaid/" _blank
click sphinxcontrib_qthelp "https://pypi.org/project/sphinxcontrib-qthelp/" _blank
click sphinxcontrib_serializinghtml "https://pypi.org/project/sphinxcontrib-serializinghtml/" _blank
click sphinxext_opengraph "https://pypi.org/project/sphinxext-opengraph/" _blank
click tabulate "https://pypi.org/project/tabulate/" _blank
click tomli "https://pypi.org/project/tomli/" _blank
click types_requests "https://pypi.org/project/types-requests/" _blank
click typing_extensions "https://pypi.org/project/typing-extensions/" _blank
click urllib3 "https://pypi.org/project/urllib3/" _blank
click wcmatch "https://pypi.org/project/wcmatch/" _blank
click wcwidth "https://pypi.org/project/wcwidth/" _blank
style extra_platforms stroke-width:3px
style click_extra stroke-width:3px
style coverage stroke-width:3px
style distro stroke-width:3px
style furo stroke-width:3px
style myst_parser stroke-width:3px
style pytest stroke-width:3px
style pytest_cov stroke-width:3px
style pytest_github_actions_annotate_failures stroke-width:3px
style pytest_randomly stroke-width:3px
style pytest_xdist stroke-width:3px
style requests stroke-width:3px
style sphinx stroke-width:3px
style sphinx_autodoc_typehints stroke-width:3px
style sphinx_copybutton stroke-width:3px
style sphinx_design stroke-width:3px
style sphinx_issues stroke-width:3px
style sphinxcontrib_mermaid stroke-width:3px
style sphinxext_opengraph stroke-width:3px
style tomli stroke-width:3px
style types_requests stroke-width:3px
style wcmatch stroke-width:3px
style primary-deps fill:#1565C020,stroke:#42A5F5
style grp_docs fill:#546E7A20,stroke:#90A4AE
style grp_test fill:#546E7A20,stroke:#90A4AE
style grp_typing fill:#546E7A20,stroke:#90A4AE
Extra dependencies¶
For additional features, you may need to install extra dependencies.
For Pytest¶
Activate new fixtures and utilities for testing Click CLIs:
$ pip install extra-platforms[pytest]
Naming¶
Tip
I wanted to call this package platforms, but it’s already taken on PyPI. So I went with extra-platforms instead, to mark its affiliation with Click Extra.