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.