# PURL2NOTICES - Package URL (PURL) to Legal Notices
Generate legal notices (attribution to authors and copyrights) for software packages.
## Features
- **Multi-format support**: Process PURLs, archives (JAR/WAR/WHL), directories, and cache files
- **12+ ecosystems**: npm, PyPI, Maven, Cargo, Go, NuGet, Conda, and more
- **Smart extraction**: Uses multiple engines (purl2src, upmex, oslili) for accurate license detection
- **Flexible output**: Text/HTML with customizable Jinja2 templates
- **Cache management**: CycloneDX format with merge capabilities
- **Override system**: Customize licenses and filter unwanted content
## Installation
```bash
pip install semantic-copycat-purl2notices
```
For development:
```bash
git clone https://github.com/oscarvalenzuelab/semantic-copycat-purl2notices.git
cd semantic-copycat-purl2notices
pip install -e .[dev]
```
## Quick Start
```bash
# Process a single package
purl2notices -i pkg:npm/express@4.0.0
# Process an archive file
purl2notices -i library.jar -o NOTICE.txt
# Scan a directory
purl2notices -i ./src --recursive -o NOTICE.html -f html
# Process multiple packages
echo "pkg:npm/express@4.0.0" > packages.txt
echo "pkg:pypi/django@4.2.0" >> packages.txt
purl2notices -i packages.txt -o NOTICE.txt
```
## Documentation
- **[User Guide](docs/user-guide.md)** - Complete usage documentation
- **[Examples](docs/examples.md)** - Detailed examples and use cases
- **[Configuration](docs/configuration.md)** - Configuration options and customization
## Common Use Cases
### Generate notices for a project
```bash
purl2notices -i ./my-project --recursive --cache project.cache.json -o NOTICE.txt
```
### Merge notices from multiple sources
```bash
purl2notices -i cache1.json --merge-cache cache2.json -o combined-NOTICE.txt
```
### Customize output with overrides
```bash
purl2notices -i packages.txt --overrides custom.json -o NOTICE.txt
```
## API Usage
```python
from purl2notices import Purl2Notices
import asyncio
processor = Purl2Notices()
package = asyncio.run(processor.process_single_purl("pkg:npm/express@4.0.0"))
notices = processor.generate_notices([package])
print(notices)
```
Raw data
{
"_id": null,
"home_page": null,
"name": "semantic-copycat-purl2notices",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "sbom, license, copyright, attribution, purl, package-url, legal-notices, compliance",
"author": null,
"author_email": "Oscar Valenzuela B <oscar.valenzuela.b@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/50/e5/63a9ef059b0f445ccac782b32a1736f8e6e95a755f644e0f961f4d6c399b/semantic_copycat_purl2notices-1.1.3.tar.gz",
"platform": null,
"description": "# PURL2NOTICES - Package URL (PURL) to Legal Notices\n\nGenerate legal notices (attribution to authors and copyrights) for software packages.\n\n## Features\n\n- **Multi-format support**: Process PURLs, archives (JAR/WAR/WHL), directories, and cache files\n- **12+ ecosystems**: npm, PyPI, Maven, Cargo, Go, NuGet, Conda, and more\n- **Smart extraction**: Uses multiple engines (purl2src, upmex, oslili) for accurate license detection\n- **Flexible output**: Text/HTML with customizable Jinja2 templates\n- **Cache management**: CycloneDX format with merge capabilities\n- **Override system**: Customize licenses and filter unwanted content\n\n## Installation\n\n```bash\npip install semantic-copycat-purl2notices\n```\n\nFor development:\n```bash\ngit clone https://github.com/oscarvalenzuelab/semantic-copycat-purl2notices.git\ncd semantic-copycat-purl2notices\npip install -e .[dev]\n```\n\n## Quick Start\n\n```bash\n# Process a single package\npurl2notices -i pkg:npm/express@4.0.0\n\n# Process an archive file\npurl2notices -i library.jar -o NOTICE.txt\n\n# Scan a directory\npurl2notices -i ./src --recursive -o NOTICE.html -f html\n\n# Process multiple packages\necho \"pkg:npm/express@4.0.0\" > packages.txt\necho \"pkg:pypi/django@4.2.0\" >> packages.txt\npurl2notices -i packages.txt -o NOTICE.txt\n```\n\n## Documentation\n\n- **[User Guide](docs/user-guide.md)** - Complete usage documentation\n- **[Examples](docs/examples.md)** - Detailed examples and use cases\n- **[Configuration](docs/configuration.md)** - Configuration options and customization\n\n## Common Use Cases\n\n### Generate notices for a project\n\n```bash\npurl2notices -i ./my-project --recursive --cache project.cache.json -o NOTICE.txt\n```\n\n### Merge notices from multiple sources\n\n```bash\npurl2notices -i cache1.json --merge-cache cache2.json -o combined-NOTICE.txt\n```\n\n### Customize output with overrides\n\n```bash\npurl2notices -i packages.txt --overrides custom.json -o NOTICE.txt\n```\n\n## API Usage\n\n```python\nfrom purl2notices import Purl2Notices\nimport asyncio\n\nprocessor = Purl2Notices()\npackage = asyncio.run(processor.process_single_purl(\"pkg:npm/express@4.0.0\"))\nnotices = processor.generate_notices([package])\nprint(notices)\n```\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Generate legal notices (attribution to authors and copyrights) for software packages",
"version": "1.1.3",
"project_urls": {
"Homepage": "https://github.com/oscarvalenzuelab/semantic-copycat-purl2notices",
"Issues": "https://github.com/oscarvalenzuelab/semantic-copycat-purl2notices/issues",
"Repository": "https://github.com/oscarvalenzuelab/semantic-copycat-purl2notices"
},
"split_keywords": [
"sbom",
" license",
" copyright",
" attribution",
" purl",
" package-url",
" legal-notices",
" compliance"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "eebc26acd751901885191868f8ff9298864a0c5d75e8d44848d6800f7f174cf5",
"md5": "32406719c01fdec0e27c7f6ee98862ce",
"sha256": "7fa623062cda0dc9bf6649eb9fe84085cdb9a9ff8a3838648fc13878aebc0741"
},
"downloads": -1,
"filename": "semantic_copycat_purl2notices-1.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "32406719c01fdec0e27c7f6ee98862ce",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 2004162,
"upload_time": "2025-09-06T08:54:01",
"upload_time_iso_8601": "2025-09-06T08:54:01.742225Z",
"url": "https://files.pythonhosted.org/packages/ee/bc/26acd751901885191868f8ff9298864a0c5d75e8d44848d6800f7f174cf5/semantic_copycat_purl2notices-1.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "50e563a9ef059b0f445ccac782b32a1736f8e6e95a755f644e0f961f4d6c399b",
"md5": "675e056d142474bea7c29c29e4531ad6",
"sha256": "2c835597607fd7272ac6eb06885ee79cf4697f45aa54976b7fac6551a607f270"
},
"downloads": -1,
"filename": "semantic_copycat_purl2notices-1.1.3.tar.gz",
"has_sig": false,
"md5_digest": "675e056d142474bea7c29c29e4531ad6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 1125514,
"upload_time": "2025-09-06T08:54:03",
"upload_time_iso_8601": "2025-09-06T08:54:03.286226Z",
"url": "https://files.pythonhosted.org/packages/50/e5/63a9ef059b0f445ccac782b32a1736f8e6e95a755f644e0f961f4d6c399b/semantic_copycat_purl2notices-1.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-06 08:54:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "oscarvalenzuelab",
"github_project": "semantic-copycat-purl2notices",
"github_not_found": true,
"lcname": "semantic-copycat-purl2notices"
}