pydistcheck


Namepydistcheck JSON
Version 0.8.0 PyPI version JSON
download
home_pageNone
SummaryInspect Python package distributions and raise warnings on common problems.
upload_time2024-10-22 02:53:28
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseBSD 3-Clause License Copyright (c) 2022, James Lamb All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
keywords linter python-packaging testing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pydistcheck

[![conda-forge version](https://img.shields.io/conda/vn/conda-forge/pydistcheck.svg)](https://anaconda.org/conda-forge/pydistcheck)
[![conda-forge downloads](https://img.shields.io/conda/dn/conda-forge/pydistcheck.svg)](https://anaconda.org/conda-forge/pydistcheck)
[![PyPI Version](https://img.shields.io/pypi/v/pydistcheck.svg?logo=pypi&logoColor=white)](https://pypi.org/project/pydistcheck)
[![PyPI downloads](https://static.pepy.tech/badge/pydistcheck)](https://pypi.org/project/pydistcheck)
[![Documentation Status](https://readthedocs.org/projects/pydistcheck/badge/?version=latest)](https://pydistcheck.readthedocs.io/)
[![GitHub Actions](https://github.com/jameslamb/pydistcheck/workflows/unit-tests/badge.svg?branch=main)](https://github.com/jameslamb/pydistcheck/actions/workflows/unit-tests.yml)
[![GitHub Actions](https://github.com/jameslamb/pydistcheck/workflows/smoke-tests/badge.svg?branch=main)](https://github.com/jameslamb/pydistcheck/actions/workflows/smoke-tests.yml)

## What is `pydistcheck`?

`pydistcheck` is a command line interface (CLI) that you run on Python packages, which can:

* detect common portability issues
* print useful summaries of the package's contents

It's inspired by R's `R CMD check`.

Supported formats:

* Python sdists
* Python wheels
* `conda` packages (both `.conda` and `.tar.bz2`)
* any `.tar.bz2`, `.tar.gz`, or `.zip` archive

See ["Check Reference"](https://pydistcheck.readthedocs.io/en/latest/check-reference.html) for a complete list of the types of issues `pydistcheck` can catch.

See ["How to Test a Python Distribution"](https://pydistcheck.readthedocs.io/en/latest/how-to-test-a-python-distribution.html) to learn how `pydistcheck` and similar tools like [`auditwheel`](https://github.com/pypa/auditwheel), [`check-wheel-contents`](https://github.com/jwodder/check-wheel-contents), and [`twine check`](https://twine.readthedocs.io/en/stable/#twine-check) fit into Python development workflows.

For more background on the value of such a tool, see the SciPy 2022 talk "Does that CSV Belong on PyPI? Probably Not" ([video link](https://www.youtube.com/watch?v=1a7g5l_g_U8)).

## Installation

Install with `pip`.

```shell
pip install pydistcheck
```

Or `conda`.

```shell
conda install -c conda-forge pydistcheck
```

For more details, see "Installation" ([link](./docs/installation.rst)).

## Quickstart

Try it out on a package you like...

```shell
pip download \
  --no-deps \
  -d ./downloads \
  pyarrow

pydistcheck --inspect ./downloads/*.whl
```

... to see what it contains.

```text
----- package inspection summary -----
file size
  * compressed size: 25.9M
  * uncompressed size: 94.0M
  * compression space saving: 72.4%
contents
  * directories: 0
  * files: 809 (30 compiled)
size by extension
  * .dylib - 73.2M (77.9%)
  * .so - 10.8M (11.4%)
  * .h - 4.5M (4.8%)
  * .py - 2.4M (2.5%)
  * .pyx - 0.8M (0.8%)
  * .pxi - 0.7M (0.8%)
  * .cc - 0.4M (0.5%)
  * .cmake - 0.4M (0.4%)
  * .pxd - 0.3M (0.3%)
  * .gz - 0.2M (0.2%)
  * .hpp - 0.1M (0.1%)
  * .txt - 0.1M (0.1%)
  * no-extension - 77.4K (0.1%)
  * .orc - 48.4K (0.1%)
  * .parquet - 14.0K (0.0%)
  * .sh - 7.8K (0.0%)
  * .md - 3.6K (0.0%)
  * .yml - 1.5K (0.0%)
  * .ubuntu - 1.3K (0.0%)
  * .fedora - 1.0K (0.0%)
  * .diff - 1.0K (0.0%)
  * .feather - 0.6K (0.0%)
largest files
  * (49.1M) pyarrow/libarrow.1700.dylib
  * (10.7M) pyarrow/libarrow_flight.1700.dylib
  * (3.8M) pyarrow/lib.cpython-311-darwin.so
  * (3.8M) pyarrow/libparquet.1700.dylib
  * (2.9M) pyarrow/libarrow_substrait.1700.dylib

==================== done running pydistcheck ===============
```

Or on the test data in this repo ...

```shell
pydistcheck tests/data/problematic-package-*
```

... to see the types of issues it checks for.

```text
------------ check results -----------
1. [files-only-differ-by-case] Found files which differ only by case. Files: problematic-package-0.1.0/problematic_package/Question.py,problematic-package-0.1.0/problematic_package/question.PY,problematic-package-0.1.0/problematic_package/question.py
2. [mixed-file-extensions] Found a mix of file extensions for the same file type: .NDJSON (1), .jsonl (1), .ndjson (1)
3. [mixed-file-extensions] Found a mix of file extensions for the same file type: .yaml (2), .yml (1)
4. [path-contains-non-ascii-characters] Found file path containing non-ASCII characters: 'problematic-package-0.1.0/problematic_package/?veryone-loves-python.py'
5. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/beep boop.ini'
6. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/problematic_package/bad code/'
7. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/problematic_package/bad code/__init__.py'
8. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/problematic_package/bad code/ship-it.py'
9. [unexpected-files] Found unexpected directory 'problematic-package-0.1.0/.git/'.
10. [unexpected-files] Found unexpected file 'problematic-package-0.1.0/.gitignore'.
11. [unexpected-files] Found unexpected file 'problematic-package-0.1.0/.hadolint.yaml'.
12. [unexpected-files] Found unexpected file 'problematic-package-0.1.0/problematic_package/.gitignore'.
errors found while checking: 12
```

And on a built distribution containing compiled objects ...

```shell
pydistcheck tests/data/debug-baseballmetrics*.whl
```

... `pydistcheck` can detect the inclusion of debug symbols (which increase distribution size).

```text
checking 'tests/data/debug-baseballmetrics-0.1.0-py3-none-macosx_10_15_x86_64.macosx_11_6_x86_64.macosx_12_5_x86_64.whl'
------------ check results -----------
1. [compiled-objects-have-debug-symbols] Found compiled object containing debug symbols. For details, extract the distribution contents and run 'dsymutil -s "lib/lib_baseballmetrics.dylib"'.
errors found while checking: 1

checking 'tests/data/debug-baseballmetrics-py3-none-manylinux_2_28_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.whl'
------------ check results -----------
1. [compiled-objects-have-debug-symbols] Found compiled object containing debug symbols. For details, extract the distribution contents and run 'objdump --all-headers "lib/lib_baseballmetrics.so"'.
errors found while checking: 1
```

See https://pydistcheck.readthedocs.io/en/latest/ to learn more.

## References

* Python packaging guides: https://packaging.python.org/en/latest/guides/#

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pydistcheck",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "James Lamb <jaylamb20@gmail.com>",
    "keywords": "linter, python-packaging, testing",
    "author": null,
    "author_email": "James Lamb <jaylamb20@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/f1/bb/92700647c3f614fdc8be6c4e2d83e6e9b1e5a2d32c7d418fb97004a0f989/pydistcheck-0.8.0.tar.gz",
    "platform": null,
    "description": "# pydistcheck\n\n[![conda-forge version](https://img.shields.io/conda/vn/conda-forge/pydistcheck.svg)](https://anaconda.org/conda-forge/pydistcheck)\n[![conda-forge downloads](https://img.shields.io/conda/dn/conda-forge/pydistcheck.svg)](https://anaconda.org/conda-forge/pydistcheck)\n[![PyPI Version](https://img.shields.io/pypi/v/pydistcheck.svg?logo=pypi&logoColor=white)](https://pypi.org/project/pydistcheck)\n[![PyPI downloads](https://static.pepy.tech/badge/pydistcheck)](https://pypi.org/project/pydistcheck)\n[![Documentation Status](https://readthedocs.org/projects/pydistcheck/badge/?version=latest)](https://pydistcheck.readthedocs.io/)\n[![GitHub Actions](https://github.com/jameslamb/pydistcheck/workflows/unit-tests/badge.svg?branch=main)](https://github.com/jameslamb/pydistcheck/actions/workflows/unit-tests.yml)\n[![GitHub Actions](https://github.com/jameslamb/pydistcheck/workflows/smoke-tests/badge.svg?branch=main)](https://github.com/jameslamb/pydistcheck/actions/workflows/smoke-tests.yml)\n\n## What is `pydistcheck`?\n\n`pydistcheck` is a command line interface (CLI) that you run on Python packages, which can:\n\n* detect common portability issues\n* print useful summaries of the package's contents\n\nIt's inspired by R's `R CMD check`.\n\nSupported formats:\n\n* Python sdists\n* Python wheels\n* `conda` packages (both `.conda` and `.tar.bz2`)\n* any `.tar.bz2`, `.tar.gz`, or `.zip` archive\n\nSee [\"Check Reference\"](https://pydistcheck.readthedocs.io/en/latest/check-reference.html) for a complete list of the types of issues `pydistcheck` can catch.\n\nSee [\"How to Test a Python Distribution\"](https://pydistcheck.readthedocs.io/en/latest/how-to-test-a-python-distribution.html) to learn how `pydistcheck` and similar tools like [`auditwheel`](https://github.com/pypa/auditwheel), [`check-wheel-contents`](https://github.com/jwodder/check-wheel-contents), and [`twine check`](https://twine.readthedocs.io/en/stable/#twine-check) fit into Python development workflows.\n\nFor more background on the value of such a tool, see the SciPy 2022 talk \"Does that CSV Belong on PyPI? Probably Not\" ([video link](https://www.youtube.com/watch?v=1a7g5l_g_U8)).\n\n## Installation\n\nInstall with `pip`.\n\n```shell\npip install pydistcheck\n```\n\nOr `conda`.\n\n```shell\nconda install -c conda-forge pydistcheck\n```\n\nFor more details, see \"Installation\" ([link](./docs/installation.rst)).\n\n## Quickstart\n\nTry it out on a package you like...\n\n```shell\npip download \\\n  --no-deps \\\n  -d ./downloads \\\n  pyarrow\n\npydistcheck --inspect ./downloads/*.whl\n```\n\n... to see what it contains.\n\n```text\n----- package inspection summary -----\nfile size\n  * compressed size: 25.9M\n  * uncompressed size: 94.0M\n  * compression space saving: 72.4%\ncontents\n  * directories: 0\n  * files: 809 (30 compiled)\nsize by extension\n  * .dylib - 73.2M (77.9%)\n  * .so - 10.8M (11.4%)\n  * .h - 4.5M (4.8%)\n  * .py - 2.4M (2.5%)\n  * .pyx - 0.8M (0.8%)\n  * .pxi - 0.7M (0.8%)\n  * .cc - 0.4M (0.5%)\n  * .cmake - 0.4M (0.4%)\n  * .pxd - 0.3M (0.3%)\n  * .gz - 0.2M (0.2%)\n  * .hpp - 0.1M (0.1%)\n  * .txt - 0.1M (0.1%)\n  * no-extension - 77.4K (0.1%)\n  * .orc - 48.4K (0.1%)\n  * .parquet - 14.0K (0.0%)\n  * .sh - 7.8K (0.0%)\n  * .md - 3.6K (0.0%)\n  * .yml - 1.5K (0.0%)\n  * .ubuntu - 1.3K (0.0%)\n  * .fedora - 1.0K (0.0%)\n  * .diff - 1.0K (0.0%)\n  * .feather - 0.6K (0.0%)\nlargest files\n  * (49.1M) pyarrow/libarrow.1700.dylib\n  * (10.7M) pyarrow/libarrow_flight.1700.dylib\n  * (3.8M) pyarrow/lib.cpython-311-darwin.so\n  * (3.8M) pyarrow/libparquet.1700.dylib\n  * (2.9M) pyarrow/libarrow_substrait.1700.dylib\n\n==================== done running pydistcheck ===============\n```\n\nOr on the test data in this repo ...\n\n```shell\npydistcheck tests/data/problematic-package-*\n```\n\n... to see the types of issues it checks for.\n\n```text\n------------ check results -----------\n1. [files-only-differ-by-case] Found files which differ only by case. Files: problematic-package-0.1.0/problematic_package/Question.py,problematic-package-0.1.0/problematic_package/question.PY,problematic-package-0.1.0/problematic_package/question.py\n2. [mixed-file-extensions] Found a mix of file extensions for the same file type: .NDJSON (1), .jsonl (1), .ndjson (1)\n3. [mixed-file-extensions] Found a mix of file extensions for the same file type: .yaml (2), .yml (1)\n4. [path-contains-non-ascii-characters] Found file path containing non-ASCII characters: 'problematic-package-0.1.0/problematic_package/?veryone-loves-python.py'\n5. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/beep boop.ini'\n6. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/problematic_package/bad code/'\n7. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/problematic_package/bad code/__init__.py'\n8. [path-contains-spaces] Found path with spaces: 'problematic-package-0.1.0/problematic_package/bad code/ship-it.py'\n9. [unexpected-files] Found unexpected directory 'problematic-package-0.1.0/.git/'.\n10. [unexpected-files] Found unexpected file 'problematic-package-0.1.0/.gitignore'.\n11. [unexpected-files] Found unexpected file 'problematic-package-0.1.0/.hadolint.yaml'.\n12. [unexpected-files] Found unexpected file 'problematic-package-0.1.0/problematic_package/.gitignore'.\nerrors found while checking: 12\n```\n\nAnd on a built distribution containing compiled objects ...\n\n```shell\npydistcheck tests/data/debug-baseballmetrics*.whl\n```\n\n... `pydistcheck` can detect the inclusion of debug symbols (which increase distribution size).\n\n```text\nchecking 'tests/data/debug-baseballmetrics-0.1.0-py3-none-macosx_10_15_x86_64.macosx_11_6_x86_64.macosx_12_5_x86_64.whl'\n------------ check results -----------\n1. [compiled-objects-have-debug-symbols] Found compiled object containing debug symbols. For details, extract the distribution contents and run 'dsymutil -s \"lib/lib_baseballmetrics.dylib\"'.\nerrors found while checking: 1\n\nchecking 'tests/data/debug-baseballmetrics-py3-none-manylinux_2_28_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.whl'\n------------ check results -----------\n1. [compiled-objects-have-debug-symbols] Found compiled object containing debug symbols. For details, extract the distribution contents and run 'objdump --all-headers \"lib/lib_baseballmetrics.so\"'.\nerrors found while checking: 1\n```\n\nSee https://pydistcheck.readthedocs.io/en/latest/ to learn more.\n\n## References\n\n* Python packaging guides: https://packaging.python.org/en/latest/guides/#\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License  Copyright (c) 2022, James Lamb All rights reserved.  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:  * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.  * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.  * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ",
    "summary": "Inspect Python package distributions and raise warnings on common problems.",
    "version": "0.8.0",
    "project_urls": {
        "changelog": "https://github.com/jameslamb/pydistcheck/releases",
        "documentation": "https://pydistcheck.readthedocs.io/en/latest/",
        "homepage": "https://pydistcheck.readthedocs.io/en/latest/",
        "repository": "https://github.com/jameslamb/pydistcheck"
    },
    "split_keywords": [
        "linter",
        " python-packaging",
        " testing"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fdd2249fb88d7ed72608e42133d5167280153fb5b710345e87a407bb0116d279",
                "md5": "a2f489c81a3c08b73278ead05a7c9164",
                "sha256": "eb12e0b94715bddeb930d4189e88a341f8b5f1a64a66d3446749f8e197d9afe4"
            },
            "downloads": -1,
            "filename": "pydistcheck-0.8.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a2f489c81a3c08b73278ead05a7c9164",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 20511,
            "upload_time": "2024-10-22T02:53:26",
            "upload_time_iso_8601": "2024-10-22T02:53:26.509805Z",
            "url": "https://files.pythonhosted.org/packages/fd/d2/249fb88d7ed72608e42133d5167280153fb5b710345e87a407bb0116d279/pydistcheck-0.8.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f1bb92700647c3f614fdc8be6c4e2d83e6e9b1e5a2d32c7d418fb97004a0f989",
                "md5": "227562961af23e81e928fdba05d93711",
                "sha256": "9666cce58a05e616d113521fa125127b817ce76d6bdcc22fcf9d9e76e1f1d537"
            },
            "downloads": -1,
            "filename": "pydistcheck-0.8.0.tar.gz",
            "has_sig": false,
            "md5_digest": "227562961af23e81e928fdba05d93711",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 30507,
            "upload_time": "2024-10-22T02:53:28",
            "upload_time_iso_8601": "2024-10-22T02:53:28.141966Z",
            "url": "https://files.pythonhosted.org/packages/f1/bb/92700647c3f614fdc8be6c4e2d83e6e9b1e5a2d32c7d418fb97004a0f989/pydistcheck-0.8.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-22 02:53:28",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jameslamb",
    "github_project": "pydistcheck",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pydistcheck"
}
        
Elapsed time: 0.52173s