Skip to main content

dowsing

Short version:

python -m dowsing.pep517 /path/to/repo | jq .

or

from dowsing.pep517 import get_metadata
dist = get_metadata(Path("/path/to/repo"))

Basic reasoning

I don't want to execute arbitrary setup.py in order to find out their basic metadata. I don't want to use the pep517 module in a sandbox, because commonly packages forget to list their build-time dependencies.

This project is one step better than grepping source files, but also understands build-system in pyproject.toml (from PEP 517/518). It does pretty well run on a sampling of pypi projects, but does fail on some notable ones (including setuptools).

When it fails, a key will be "??" and due to some quirks in list context, this can be ["?", "?"].

A rant

The reality of python packaging, even with recent PEPs, is that most nontrivial python packages do moderately interesting stuff in their setup.py:

  • Imports (either from local code, or setup_requires)
  • Fetching things from the Internet
  • Running commands
  • Making sure native libs are installed, or there's a working C compiler
  • Choosing deps based on platform

From the perspective of basically running a distro, they produce messages intended for humans, rather than actually using the mechanisms that we have in PEP 508 (environment markers) and 518 (pyproject.toml requires). There is also no well-specified way to request native libs, and many projects choose to fail to run setup.py when libs are missing.

Goals

This project is a bridge to find several things out, about primarily setup.py but also understanding some popular PEP 517/518 builders as a one-stop-shop, about:

  • doesn't actually execute, so fetches or execs can't cause it to fail [done]
  • cases where we could find out the version string, but it fails to import [done]
  • lets you simulate the pep517 module's output on different platforms [done]
  • a lower-level api suitable for making edits to the place where the setup args are defined [done]
  • to list potential imports, and guess at missing build-time deps (something like numpy.distutils is pretty clear) [todo]

Doing this "right"

A bunch of this is papering over problems with the current reality. If you have an existing sandbox and are ok with ~30% of projects just failing to build, you can rely on the pep517 module's API to actually execute the code on the current version of python.

If you're willing to run the code and have it take longer, take a look at the pep517 api get_requires_for_* or have it generate the metadata (assuming what you want is in there). An example is in dowsing/_demo_pep517.py

This project's dowsing.pep517 api is designed to do something similar, but not fail on missing build-time requirements.

Further Reading

License

dowsing is copyright Tim Hatch, and licensed under the MIT license. I am providing code in this repository to you under an open source license. This is my personal repository; the license you receive to my code is from me and not from my employer. See the LICENSE file for details.

Metadata

Release files for dowsing 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dowsing 0.8.0
File Size Uploaded Provenance Actions
dowsing-0.8.0.tar.gz 24.8 kB Without provenance Details for dowsing-0.8.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for dowsing 0.8.0
File Interpreter ABI Platform Actions
dowsing-0.8.0-py3-none-any.whl Python 3 none any Details for dowsing-0.8.0-py3-none-any.whl

Total release size: 52.2 kB

Release files / dowsing-0.8.0.tar.gz

Download URL dowsing-0.8.0.tar.gz
Size 24.8 kB
Tags Source
SHA-256 checksum
How to use checksums
076ac8c007cda87099a5290aca5f9fb2ca8a312436eca1581126a2528b4e6534
BLAKE2b-256 checksum
How to use checksums
11c4d69c6e1f5db8de84b0a447e75e2e1494b5ff431e4f29c54263ea3d7efb09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.5

Release files / dowsing-0.8.0-py3-none-any.whl

Download URL dowsing-0.8.0-py3-none-any.whl
Size 27.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f12a4aedcf23ba6f762bd4c64c4b0c90807139959078ed0edea9ac67e8a4a19a
BLAKE2b-256 checksum
How to use checksums
ec986c421234e829cdd81c6b3ac5664c566de8ea4bd4873a6e5fd28329af7521
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.5

Security for dowsing 0.8.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page