This project has been archived by its maintainers, and is no longer receiving any updates.
PURL2SRC - Package URL (PURL) to Source
Translate Package URLs (PURLs) into validated download URLs for source code artifacts.
Features
- Multi-ecosystem support: NPM, PyPI, Cargo, NuGet, GitHub, Maven, RubyGems, Go, Conda, and more
- Three-level resolution strategy:
- Direct URL construction based on known patterns
- Package registry API queries
- Local package manager fallback
- URL validation: Verify download URLs are accessible
- Batch processing: Process multiple PURLs from files
- Multiple output formats: JSON, CSV, or plain text
- Extensible architecture: Easy to add new package ecosystems
Installation
pip install semantic-copycat-purl2src
Usage
Command Line
# Single PURL (default text output)
purl2src "pkg:npm/express@4.17.1"
# Output: pkg:npm/express@4.17.1 -> https://registry.npmjs.org/express/-/express-4.17.1.tgz
# JSON output format
purl2src "pkg:npm/express@4.17.1" --format json
# With validation
purl2src "pkg:pypi/requests@2.28.0" --validate
# Batch processing from file
purl2src -f purls.txt --output results.json
# Batch processing with JSON to stdout
purl2src -f purls.txt --format json
Python API
from purl2src import get_download_url
# Get download URL for a PURL
result = get_download_url("pkg:npm/express@4.17.1")
print(result.download_url)
# https://registry.npmjs.org/express/-/express-4.17.1.tgz
# Without validation (faster)
result = get_download_url("pkg:pypi/requests@2.28.0", validate=False)
Supported Ecosystems
| Ecosystem | PURL Type | Example |
|---|---|---|
| NPM | npm |
pkg:npm/@angular/core@12.0.0 |
| PyPI | pypi |
pkg:pypi/django@4.0.0 |
| Cargo | cargo |
pkg:cargo/serde@1.0.0 |
| NuGet | nuget |
pkg:nuget/Newtonsoft.Json@13.0.1 |
| Maven | maven |
pkg:maven/org.apache.commons/commons-lang3@3.12.0 |
| RubyGems | gem |
pkg:gem/rails@7.0.0 |
| Go | golang |
pkg:golang/github.com/gin-gonic/gin@v1.8.0 |
| GitHub | github |
pkg:github/facebook/react@v18.0.0 |
| Conda | conda |
pkg:conda/numpy@1.23.0?channel=conda-forge&subdir=linux-64&build=py39h1234567_0 |
| Generic | generic |
pkg:generic/package@1.0.0?download_url=https://example.com/file.tar.gz |
Examples
NPM with Scoped Package
purl2src "pkg:npm/@angular/core@12.0.0"
# Output: https://registry.npmjs.org/@angular/core/-/core-12.0.0.tgz
Maven with Classifier
purl2src "pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?classifier=sources"
# Output: https://repo.maven.apache.org/maven2/org/apache/xmlgraphics/batik-anim/1.9.1/batik-anim-1.9.1-sources.jar
Generic with Checksum Validation
purl2src "pkg:generic/mypackage@1.0.0?download_url=https://example.com/pkg.tar.gz&checksum=sha256:abcd1234..."
License
Apache License 2.0 - see LICENSE file for details
Release files for semantic-copycat-purl2src 1.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| semantic_copycat_purl2src-1.2.2.tar.gz | 22.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| semantic_copycat_purl2src-1.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.0 kB
Release files / semantic_copycat_purl2src-1.2.2.tar.gz
| Download URL | semantic_copycat_purl2src-1.2.2.tar.gz |
|---|---|
| Size | 22.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a543710f40d92ac6f944042149a07b039c6287eb9f9a636ed481afe1c31a6a2c
|
|
BLAKE2b-256 checksum How to use checksums |
130a4ad941df4d90f8c99f9dfefe42b203c97490fb52448d33ac3a7edcf2f153
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2025.
Transparency logRelease files / semantic_copycat_purl2src-1.2.2-py3-none-any.whl
| Download URL | semantic_copycat_purl2src-1.2.2-py3-none-any.whl |
|---|---|
| Size | 27.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6a152082960dc89224568bc0b41981b6cc1d8de79ef58ea155cbd27121895250
|
|
BLAKE2b-256 checksum How to use checksums |
00e34d9d30685ed28ddb3e17cd8b5dbaa636de73977dbd04cc6425ad94baa785
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2025.
Transparency log