diff --git a/Makefile b/Makefile index 58786bd..8bb8dea 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,18 @@ install-deps: update-deps: @echo "--> Updating dependencies" uv sync -U - uv pip list --format=freeze > requirements.txt uv pip list --outdated + uv pip list --format=freeze > compliance/requirements-full.txt + +## Generate SBOM +generate-sbom: + @echo "--> Generating SBOM" + uv sync --no-dev + uv pip list --format=freeze > compliance/requirements-prod.txt + uv sync + uv run cyclonedx-py requirements \ + --pyproject pyproject.toml -o compliance/sbom-cyclonedx.json \ + compliance/requirements-prod.txt ## Activate pre-commit hook activate-pre-commit: diff --git a/compliance/requirements-prod.txt b/compliance/requirements-prod.txt new file mode 100644 index 0000000..1b6a8a0 --- /dev/null +++ b/compliance/requirements-prod.txt @@ -0,0 +1,46 @@ +alembic==1.14.0 +asttokens==2.4.1 +attrs==24.2.0 +blinker==1.9.0 +cachetools==5.5.0 +certifi==2024.8.30 +charset-normalizer==3.4.0 +click==8.1.7 +devtools==0.12.2 +durationpy==0.9 +executing==2.1.0 +flasgger==0.9.7.1 +flask==3.1.0 +flask-sqlalchemy==3.1.1 +google-auth==2.36.0 +gurobipy==12.0.0 +idna==3.10 +itsdangerous==2.2.0 +jinja2==3.1.4 +jsonschema==4.23.0 +jsonschema-specifications==2024.10.1 +kubernetes==31.0.0 +mako==1.3.6 +markupsafe==3.0.2 +mistune==3.0.2 +oauthlib==3.2.2 +packaging==24.2 +psycopg2-binary==2.9.10 +pyasn1==0.6.1 +pyasn1-modules==0.4.1 +pygments==2.18.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +pyyaml==6.0.2 +referencing==0.35.1 +requests==2.32.3 +requests-oauthlib==2.0.0 +rpds-py==0.21.0 +rsa==4.9 +six==1.16.0 +smo==0.1.0 +sqlalchemy==2.0.36 +typing-extensions==4.12.2 +urllib3==2.2.3 +websocket-client==1.8.0 +werkzeug==3.1.3 diff --git a/compliance/sbom-cyclonedx.json b/compliance/sbom-cyclonedx.json new file mode 100644 index 0000000..ca5d592 --- /dev/null +++ b/compliance/sbom-cyclonedx.json @@ -0,0 +1,932 @@ +{ + "components": [ + { + "bom-ref": "requirements-L1", + "description": "requirements line 1: alembic==1.14.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/alembic/" + } + ], + "name": "alembic", + "purl": "pkg:pypi/alembic@1.14.0", + "type": "library", + "version": "1.14.0" + }, + { + "bom-ref": "requirements-L2", + "description": "requirements line 2: asttokens==2.4.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/asttokens/" + } + ], + "name": "asttokens", + "purl": "pkg:pypi/asttokens@2.4.1", + "type": "library", + "version": "2.4.1" + }, + { + "bom-ref": "requirements-L3", + "description": "requirements line 3: attrs==24.2.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/attrs/" + } + ], + "name": "attrs", + "purl": "pkg:pypi/attrs@24.2.0", + "type": "library", + "version": "24.2.0" + }, + { + "bom-ref": "requirements-L4", + "description": "requirements line 4: blinker==1.9.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/blinker/" + } + ], + "name": "blinker", + "purl": "pkg:pypi/blinker@1.9.0", + "type": "library", + "version": "1.9.0" + }, + { + "bom-ref": "requirements-L5", + "description": "requirements line 5: cachetools==5.5.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/cachetools/" + } + ], + "name": "cachetools", + "purl": "pkg:pypi/cachetools@5.5.0", + "type": "library", + "version": "5.5.0" + }, + { + "bom-ref": "requirements-L6", + "description": "requirements line 6: certifi==2024.8.30", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/certifi/" + } + ], + "name": "certifi", + "purl": "pkg:pypi/certifi@2024.8.30", + "type": "library", + "version": "2024.8.30" + }, + { + "bom-ref": "requirements-L7", + "description": "requirements line 7: charset-normalizer==3.4.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/charset-normalizer/" + } + ], + "name": "charset-normalizer", + "purl": "pkg:pypi/charset-normalizer@3.4.0", + "type": "library", + "version": "3.4.0" + }, + { + "bom-ref": "requirements-L8", + "description": "requirements line 8: click==8.1.7", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/click/" + } + ], + "name": "click", + "purl": "pkg:pypi/click@8.1.7", + "type": "library", + "version": "8.1.7" + }, + { + "bom-ref": "requirements-L9", + "description": "requirements line 9: devtools==0.12.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/devtools/" + } + ], + "name": "devtools", + "purl": "pkg:pypi/devtools@0.12.2", + "type": "library", + "version": "0.12.2" + }, + { + "bom-ref": "requirements-L10", + "description": "requirements line 10: durationpy==0.9", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/durationpy/" + } + ], + "name": "durationpy", + "purl": "pkg:pypi/durationpy@0.9", + "type": "library", + "version": "0.9" + }, + { + "bom-ref": "requirements-L11", + "description": "requirements line 11: executing==2.1.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/executing/" + } + ], + "name": "executing", + "purl": "pkg:pypi/executing@2.1.0", + "type": "library", + "version": "2.1.0" + }, + { + "bom-ref": "requirements-L12", + "description": "requirements line 12: flasgger==0.9.7.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/flasgger/" + } + ], + "name": "flasgger", + "purl": "pkg:pypi/flasgger@0.9.7.1", + "type": "library", + "version": "0.9.7.1" + }, + { + "bom-ref": "requirements-L13", + "description": "requirements line 13: flask==3.1.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/flask/" + } + ], + "name": "flask", + "purl": "pkg:pypi/flask@3.1.0", + "type": "library", + "version": "3.1.0" + }, + { + "bom-ref": "requirements-L14", + "description": "requirements line 14: flask-sqlalchemy==3.1.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/flask-sqlalchemy/" + } + ], + "name": "flask-sqlalchemy", + "purl": "pkg:pypi/flask-sqlalchemy@3.1.1", + "type": "library", + "version": "3.1.1" + }, + { + "bom-ref": "requirements-L15", + "description": "requirements line 15: google-auth==2.36.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/google-auth/" + } + ], + "name": "google-auth", + "purl": "pkg:pypi/google-auth@2.36.0", + "type": "library", + "version": "2.36.0" + }, + { + "bom-ref": "requirements-L16", + "description": "requirements line 16: gurobipy==12.0.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/gurobipy/" + } + ], + "name": "gurobipy", + "purl": "pkg:pypi/gurobipy@12.0.0", + "type": "library", + "version": "12.0.0" + }, + { + "bom-ref": "requirements-L17", + "description": "requirements line 17: idna==3.10", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/idna/" + } + ], + "name": "idna", + "purl": "pkg:pypi/idna@3.10", + "type": "library", + "version": "3.10" + }, + { + "bom-ref": "requirements-L18", + "description": "requirements line 18: itsdangerous==2.2.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/itsdangerous/" + } + ], + "name": "itsdangerous", + "purl": "pkg:pypi/itsdangerous@2.2.0", + "type": "library", + "version": "2.2.0" + }, + { + "bom-ref": "requirements-L19", + "description": "requirements line 19: jinja2==3.1.4", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/jinja2/" + } + ], + "name": "jinja2", + "purl": "pkg:pypi/jinja2@3.1.4", + "type": "library", + "version": "3.1.4" + }, + { + "bom-ref": "requirements-L20", + "description": "requirements line 20: jsonschema==4.23.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/jsonschema/" + } + ], + "name": "jsonschema", + "purl": "pkg:pypi/jsonschema@4.23.0", + "type": "library", + "version": "4.23.0" + }, + { + "bom-ref": "requirements-L21", + "description": "requirements line 21: jsonschema-specifications==2024.10.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/jsonschema-specifications/" + } + ], + "name": "jsonschema-specifications", + "purl": "pkg:pypi/jsonschema-specifications@2024.10.1", + "type": "library", + "version": "2024.10.1" + }, + { + "bom-ref": "requirements-L22", + "description": "requirements line 22: kubernetes==31.0.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/kubernetes/" + } + ], + "name": "kubernetes", + "purl": "pkg:pypi/kubernetes@31.0.0", + "type": "library", + "version": "31.0.0" + }, + { + "bom-ref": "requirements-L23", + "description": "requirements line 23: mako==1.3.6", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/mako/" + } + ], + "name": "mako", + "purl": "pkg:pypi/mako@1.3.6", + "type": "library", + "version": "1.3.6" + }, + { + "bom-ref": "requirements-L24", + "description": "requirements line 24: markupsafe==3.0.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/markupsafe/" + } + ], + "name": "markupsafe", + "purl": "pkg:pypi/markupsafe@3.0.2", + "type": "library", + "version": "3.0.2" + }, + { + "bom-ref": "requirements-L25", + "description": "requirements line 25: mistune==3.0.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/mistune/" + } + ], + "name": "mistune", + "purl": "pkg:pypi/mistune@3.0.2", + "type": "library", + "version": "3.0.2" + }, + { + "bom-ref": "requirements-L26", + "description": "requirements line 26: oauthlib==3.2.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/oauthlib/" + } + ], + "name": "oauthlib", + "purl": "pkg:pypi/oauthlib@3.2.2", + "type": "library", + "version": "3.2.2" + }, + { + "bom-ref": "requirements-L27", + "description": "requirements line 27: packaging==24.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/packaging/" + } + ], + "name": "packaging", + "purl": "pkg:pypi/packaging@24.2", + "type": "library", + "version": "24.2" + }, + { + "bom-ref": "requirements-L28", + "description": "requirements line 28: psycopg2-binary==2.9.10", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/psycopg2-binary/" + } + ], + "name": "psycopg2-binary", + "purl": "pkg:pypi/psycopg2-binary@2.9.10", + "type": "library", + "version": "2.9.10" + }, + { + "bom-ref": "requirements-L29", + "description": "requirements line 29: pyasn1==0.6.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/pyasn1/" + } + ], + "name": "pyasn1", + "purl": "pkg:pypi/pyasn1@0.6.1", + "type": "library", + "version": "0.6.1" + }, + { + "bom-ref": "requirements-L30", + "description": "requirements line 30: pyasn1-modules==0.4.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/pyasn1-modules/" + } + ], + "name": "pyasn1-modules", + "purl": "pkg:pypi/pyasn1-modules@0.4.1", + "type": "library", + "version": "0.4.1" + }, + { + "bom-ref": "requirements-L31", + "description": "requirements line 31: pygments==2.18.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/pygments/" + } + ], + "name": "pygments", + "purl": "pkg:pypi/pygments@2.18.0", + "type": "library", + "version": "2.18.0" + }, + { + "bom-ref": "requirements-L32", + "description": "requirements line 32: python-dateutil==2.9.0.post0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/python-dateutil/" + } + ], + "name": "python-dateutil", + "purl": "pkg:pypi/python-dateutil@2.9.0.post0", + "type": "library", + "version": "2.9.0.post0" + }, + { + "bom-ref": "requirements-L33", + "description": "requirements line 33: python-dotenv==1.0.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/python-dotenv/" + } + ], + "name": "python-dotenv", + "purl": "pkg:pypi/python-dotenv@1.0.1", + "type": "library", + "version": "1.0.1" + }, + { + "bom-ref": "requirements-L34", + "description": "requirements line 34: pyyaml==6.0.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/pyyaml/" + } + ], + "name": "pyyaml", + "purl": "pkg:pypi/pyyaml@6.0.2", + "type": "library", + "version": "6.0.2" + }, + { + "bom-ref": "requirements-L35", + "description": "requirements line 35: referencing==0.35.1", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/referencing/" + } + ], + "name": "referencing", + "purl": "pkg:pypi/referencing@0.35.1", + "type": "library", + "version": "0.35.1" + }, + { + "bom-ref": "requirements-L36", + "description": "requirements line 36: requests==2.32.3", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/requests/" + } + ], + "name": "requests", + "purl": "pkg:pypi/requests@2.32.3", + "type": "library", + "version": "2.32.3" + }, + { + "bom-ref": "requirements-L37", + "description": "requirements line 37: requests-oauthlib==2.0.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/requests-oauthlib/" + } + ], + "name": "requests-oauthlib", + "purl": "pkg:pypi/requests-oauthlib@2.0.0", + "type": "library", + "version": "2.0.0" + }, + { + "bom-ref": "requirements-L38", + "description": "requirements line 38: rpds-py==0.21.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/rpds-py/" + } + ], + "name": "rpds-py", + "purl": "pkg:pypi/rpds-py@0.21.0", + "type": "library", + "version": "0.21.0" + }, + { + "bom-ref": "requirements-L39", + "description": "requirements line 39: rsa==4.9", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/rsa/" + } + ], + "name": "rsa", + "purl": "pkg:pypi/rsa@4.9", + "type": "library", + "version": "4.9" + }, + { + "bom-ref": "requirements-L40", + "description": "requirements line 40: six==1.16.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/six/" + } + ], + "name": "six", + "purl": "pkg:pypi/six@1.16.0", + "type": "library", + "version": "1.16.0" + }, + { + "bom-ref": "requirements-L41", + "description": "requirements line 41: smo==0.1.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/smo/" + } + ], + "name": "smo", + "purl": "pkg:pypi/smo@0.1.0", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "requirements-L42", + "description": "requirements line 42: sqlalchemy==2.0.36", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/sqlalchemy/" + } + ], + "name": "sqlalchemy", + "purl": "pkg:pypi/sqlalchemy@2.0.36", + "type": "library", + "version": "2.0.36" + }, + { + "bom-ref": "requirements-L43", + "description": "requirements line 43: typing-extensions==4.12.2", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/typing-extensions/" + } + ], + "name": "typing-extensions", + "purl": "pkg:pypi/typing-extensions@4.12.2", + "type": "library", + "version": "4.12.2" + }, + { + "bom-ref": "requirements-L44", + "description": "requirements line 44: urllib3==2.2.3", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/urllib3/" + } + ], + "name": "urllib3", + "purl": "pkg:pypi/urllib3@2.2.3", + "type": "library", + "version": "2.2.3" + }, + { + "bom-ref": "requirements-L45", + "description": "requirements line 45: websocket-client==1.8.0", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/websocket-client/" + } + ], + "name": "websocket-client", + "purl": "pkg:pypi/websocket-client@1.8.0", + "type": "library", + "version": "1.8.0" + }, + { + "bom-ref": "requirements-L46", + "description": "requirements line 46: werkzeug==3.1.3", + "externalReferences": [ + { + "comment": "implicit dist url", + "type": "distribution", + "url": "https://pypi.org/simple/werkzeug/" + } + ], + "name": "werkzeug", + "purl": "pkg:pypi/werkzeug@3.1.3", + "type": "library", + "version": "3.1.3" + } + ], + "dependencies": [ + { + "ref": "requirements-L1" + }, + { + "ref": "requirements-L10" + }, + { + "ref": "requirements-L11" + }, + { + "ref": "requirements-L12" + }, + { + "ref": "requirements-L13" + }, + { + "ref": "requirements-L14" + }, + { + "ref": "requirements-L15" + }, + { + "ref": "requirements-L16" + }, + { + "ref": "requirements-L17" + }, + { + "ref": "requirements-L18" + }, + { + "ref": "requirements-L19" + }, + { + "ref": "requirements-L2" + }, + { + "ref": "requirements-L20" + }, + { + "ref": "requirements-L21" + }, + { + "ref": "requirements-L22" + }, + { + "ref": "requirements-L23" + }, + { + "ref": "requirements-L24" + }, + { + "ref": "requirements-L25" + }, + { + "ref": "requirements-L26" + }, + { + "ref": "requirements-L27" + }, + { + "ref": "requirements-L28" + }, + { + "ref": "requirements-L29" + }, + { + "ref": "requirements-L3" + }, + { + "ref": "requirements-L30" + }, + { + "ref": "requirements-L31" + }, + { + "ref": "requirements-L32" + }, + { + "ref": "requirements-L33" + }, + { + "ref": "requirements-L34" + }, + { + "ref": "requirements-L35" + }, + { + "ref": "requirements-L36" + }, + { + "ref": "requirements-L37" + }, + { + "ref": "requirements-L38" + }, + { + "ref": "requirements-L39" + }, + { + "ref": "requirements-L4" + }, + { + "ref": "requirements-L40" + }, + { + "ref": "requirements-L41" + }, + { + "ref": "requirements-L42" + }, + { + "ref": "requirements-L43" + }, + { + "ref": "requirements-L44" + }, + { + "ref": "requirements-L45" + }, + { + "ref": "requirements-L46" + }, + { + "ref": "requirements-L5" + }, + { + "ref": "requirements-L6" + }, + { + "ref": "requirements-L7" + }, + { + "ref": "requirements-L8" + }, + { + "ref": "requirements-L9" + }, + { + "ref": "root-component" + } + ], + "metadata": { + "component": { + "bom-ref": "root-component", + "description": "Add your description here", + "name": "smo", + "type": "application", + "version": "0.1.0" + }, + "timestamp": "2024-11-28T07:52:19.322671+00:00", + "tools": [ + { + "externalReferences": [ + { + "type": "build-system", + "url": "https://github.com/CycloneDX/cyclonedx-python/actions" + }, + { + "type": "distribution", + "url": "https://pypi.org/project/cyclonedx-bom/" + }, + { + "type": "documentation", + "url": "https://cyclonedx-bom-tool.readthedocs.io/" + }, + { + "type": "issue-tracker", + "url": "https://github.com/CycloneDX/cyclonedx-python/issues" + }, + { + "type": "license", + "url": "https://github.com/CycloneDX/cyclonedx-python/blob/main/LICENSE" + }, + { + "type": "release-notes", + "url": "https://github.com/CycloneDX/cyclonedx-python/blob/main/CHANGELOG.md" + }, + { + "type": "vcs", + "url": "https://github.com/CycloneDX/cyclonedx-python/" + }, + { + "type": "website", + "url": "https://github.com/CycloneDX/cyclonedx-python/#readme" + } + ], + "name": "cyclonedx-bom", + "vendor": "CycloneDX", + "version": "4.6.1" + }, + { + "externalReferences": [ + { + "type": "build-system", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions" + }, + { + "type": "distribution", + "url": "https://pypi.org/project/cyclonedx-python-lib/" + }, + { + "type": "documentation", + "url": "https://cyclonedx-python-library.readthedocs.io/" + }, + { + "type": "issue-tracker", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues" + }, + { + "type": "license", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE" + }, + { + "type": "release-notes", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md" + }, + { + "type": "vcs", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib" + }, + { + "type": "website", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/#readme" + } + ], + "name": "cyclonedx-python-lib", + "vendor": "CycloneDX", + "version": "7.6.2" + } + ] + }, + "serialNumber": "urn:uuid:ee109fb2-9025-497e-9829-22d58f6c6852", + "version": 1, + "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json", + "bomFormat": "CycloneDX", + "specVersion": "1.5" +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 6589168..7f802a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,11 @@ dev = [ # Type hints "types-pyyaml>=6.0.12.20240917", "types-requests>=2.32.0.20241016", + # Architecure layering testing "pytest-archon>=0.0.6", + # SBOM generation + "cyclonedx-bom>=4.6.1", + "spdx-tools>=0.8.3", ] # ----------------------------------------------------------------------------- diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index dc99aa7..0000000 --- a/requirements.txt +++ /dev/null @@ -1,149 +0,0 @@ -abilian-devtools==0.7.4 -alembic==1.14.0 -argcomplete==3.5.1 -asttokens==2.4.1 -attrs==24.2.0 -bandit==1.8.0 -beartype==0.19.0 -binaryornot==0.4.4 -black==24.10.0 -blinker==1.9.0 -boolean-py==4.0 -cachecontrol==0.14.1 -cachetools==5.5.0 -certifi==2024.8.30 -cfgv==3.4.0 -chardet==5.2.0 -charset-normalizer==3.4.0 -cleez==0.1.13 -click==8.1.7 -cognitive-complexity==1.3.0 -colorlog==6.9.0 -coverage==7.6.8 -cyclonedx-python-lib==7.6.2 -defusedxml==0.7.1 -deptry==0.21.1 -devtools==0.12.2 -distlib==0.3.9 -dlint==0.16.0 -docformatter==1.7.5 -durationpy==0.9 -execnet==2.1.1 -executing==2.1.0 -filelock==3.16.1 -flake8==7.1.1 -flake8-assertive==2.1.0 -flake8-bandit==4.1.1 -flake8-breakpoint==1.1.0 -flake8-cognitive-complexity==0.1.0 -flake8-datetimez==20.10.0 -flake8-ecocode==0.1.3 -flake8-functions==0.0.8 -flake8-if-expr==1.0.4 -flake8-isort==6.1.1 -flake8-logging-format==2024.24.12 -flake8-mutable==1.2.0 -flake8-no-pep420==2.8.0 -flake8-pep3101==2.1.0 -flake8-pep585==0.1.7 -flake8-pep604==1.1.0 -flake8-plugin-utils==1.3.3 -flake8-pytest==1.4 -flake8-pytest-style==2.0.0 -flake8-super==0.1.3 -flake8-super-call==1.0.0 -flake8-tidy-imports==4.11.0 -flake8-tuple==0.4.1 -flasgger==0.9.7.1 -flask==3.1.0 -flask-sqlalchemy==3.1.1 -git-cliff==2.7.0 -google-auth==2.36.0 -gurobipy==12.0.0 -html5lib==1.1 -identify==2.6.3 -idna==3.10 -iniconfig==2.0.0 -invoke==2.2.0 -isort==5.13.2 -itsdangerous==2.2.0 -jinja2==3.1.4 -jsonschema==4.23.0 -jsonschema-specifications==2024.10.1 -kubernetes==31.0.0 -license-expression==30.4.0 -mako==1.3.6 -markdown-it-py==3.0.0 -markupsafe==3.0.2 -mccabe==0.7.0 -mdurl==0.1.2 -mistune==3.0.2 -mr-proper==0.0.7 -msgpack==1.1.0 -mypy==1.13.0 -mypy-extensions==1.0.0 -nodeenv==1.9.1 -nox==2024.10.9 -oauthlib==3.2.2 -packageurl-python==0.16.0 -packaging==24.2 -pathspec==0.12.1 -pbr==6.1.0 -pip==24.3.1 -pip-api==0.0.34 -pip-audit==2.7.3 -pip-requirements-parser==32.0.1 -platformdirs==4.3.6 -pluggy==1.5.0 -pre-commit==4.0.1 -profilehooks==1.13.0 -psycopg2-binary==2.9.10 -py-serializable==1.1.2 -pyasn1==0.6.1 -pyasn1-modules==0.4.1 -pycodestyle==2.12.1 -pyflakes==3.2.0 -pygments==2.18.0 -pyparsing==3.2.0 -pyright==1.1.389 -pytest==8.3.3 -pytest-archon==0.0.6 -pytest-beartype==0.2.0 -pytest-cov==6.0.0 -pytest-random-order==1.1.1 -pytest-xdist==3.6.1 -python-dateutil==2.9.0.post0 -python-debian==0.1.49 -python-dotenv==1.0.1 -pyyaml==6.0.2 -referencing==0.35.1 -requests==2.32.3 -requests-oauthlib==2.0.0 -requirements-parser==0.11.0 -reuse==5.0.2 -rich==13.9.4 -rpds-py==0.21.0 -rsa==4.9 -ruff==0.8.0 -setuptools==75.6.0 -six==1.16.0 -smo==0.1.0 -sortedcontainers==2.4.0 -sqlalchemy==2.0.36 -stdlib-list==0.11.0 -stevedore==5.4.0 -termcolor==2.5.0 -toml==0.10.2 -tomlkit==0.13.2 -typeguard==4.4.1 -types-pyyaml==6.0.12.20240917 -types-requests==2.32.0.20241016 -types-setuptools==75.6.0.20241126 -typing-extensions==4.12.2 -untokenize==0.1.1 -urllib3==2.2.3 -virtualenv==20.28.0 -vulture==2.13 -webencodings==0.5.1 -websocket-client==1.8.0 -werkzeug==3.1.3 diff --git a/uv.lock b/uv.lock index 6f307f6..f034158 100644 --- a/uv.lock +++ b/uv.lock @@ -80,6 +80,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/be/a606a6701d491cfae75583c80a6583f8abe9c36c0b9666e867e7cdd62fe8/argcomplete-3.5.1-py3-none-any.whl", hash = "sha256:1a1d148bdaa3e3b93454900163403df41448a248af01b6e849edc5ac08e6c363", size = 43498 }, ] +[[package]] +name = "arrow" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "types-python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, +] + [[package]] name = "asttokens" version = "2.4.1" @@ -430,6 +443,23 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "cyclonedx-bom" +version = "4.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chardet" }, + { name = "cyclonedx-python-lib", extra = ["validation"] }, + { name = "packageurl-python" }, + { name = "packaging" }, + { name = "pip-requirements-parser" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/99/039d55af5fd11f096e37e6f3a87a922f597f2ee24e997f6b6b58478442a4/cyclonedx_bom-4.6.1.tar.gz", hash = "sha256:2fe72daadfd8addd824b235f8ea21ff6045ebe00bbb9da48ec07bfc5a3c39169", size = 2271488 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/29/b81f99628ab6f4ce45e6540f6912ea6e0b16a1de40c0c6cf488db4eb2235/cyclonedx_bom-4.6.1-py3-none-any.whl", hash = "sha256:39600cb0fe9231285d9f6c234270e23200f9de28d63a2cc2c50d1f6fab75fe1b", size = 54478 }, +] + [[package]] name = "cyclonedx-python-lib" version = "7.6.2" @@ -445,6 +475,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cf/27/9ec1959eb4c23bdbec690f17a64562e664746762c0b8becf3ec2e95579d7/cyclonedx_python_lib-7.6.2-py3-none-any.whl", hash = "sha256:c42fab352cc0f7418d1b30def6751d9067ebcf0e8e4be210fc14d6e742a9edcc", size = 361381 }, ] +[package.optional-dependencies] +validation = [ + { name = "jsonschema", extra = ["format"] }, + { name = "lxml" }, +] + [[package]] name = "defusedxml" version = "0.7.1" @@ -883,6 +919,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/6a/89963a5c6ecf166e8be29e0d1bf6806051ee8fe6c82e232842e3aeac9204/flask_sqlalchemy-3.1.1-py3-none-any.whl", hash = "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0", size = 25125 }, ] +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, +] + [[package]] name = "git-cliff" version = "2.7.0" @@ -1033,6 +1078,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/66/7f8c48009c72d73bc6bbe6eb87ac838d6a526146f7dab14af671121eb379/invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820", size = 160274 }, ] +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 }, +] + [[package]] name = "isort" version = "5.13.2" @@ -1063,6 +1129,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 }, ] +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + [[package]] name = "jsonschema" version = "4.23.0" @@ -1078,6 +1153,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, ] +[package.optional-dependencies] +format = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3987" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + [[package]] name = "jsonschema-specifications" version = "2024.10.1" @@ -1124,6 +1211,88 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fc/f8/5699e6d6ea5156d53059ff07464b5d64389b084f67cb08ec97c711e587fc/license_expression-30.4.0-py3-none-any.whl", hash = "sha256:7c8f240c6e20d759cb8455e49cb44a923d9e25c436bf48d7e5b8eea660782c04", size = 110571 }, ] +[[package]] +name = "lxml" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ce/2789e39eddf2b13fac29878bfa465f0910eb6b0096e29090e5176bc8cf43/lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656", size = 8124570 }, + { url = "https://files.pythonhosted.org/packages/24/a8/f4010166a25d41715527129af2675981a50d3bbf7df09c5d9ab8ca24fbf9/lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d", size = 4413042 }, + { url = "https://files.pythonhosted.org/packages/41/a4/7e45756cecdd7577ddf67a68b69c1db0f5ddbf0c9f65021ee769165ffc5a/lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a", size = 5139213 }, + { url = "https://files.pythonhosted.org/packages/02/e2/ecf845b12323c92748077e1818b64e8b4dba509a4cb12920b3762ebe7552/lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8", size = 4838814 }, + { url = "https://files.pythonhosted.org/packages/12/91/619f9fb72cf75e9ceb8700706f7276f23995f6ad757e6d400fbe35ca4990/lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330", size = 5425084 }, + { url = "https://files.pythonhosted.org/packages/25/3b/162a85a8f0fd2a3032ec3f936636911c6e9523a8e263fffcfd581ce98b54/lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965", size = 4875993 }, + { url = "https://files.pythonhosted.org/packages/43/af/dd3f58cc7d946da6ae42909629a2b1d5dd2d1b583334d4af9396697d6863/lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22", size = 5012462 }, + { url = "https://files.pythonhosted.org/packages/69/c1/5ea46b2d4c98f5bf5c83fffab8a0ad293c9bc74df9ecfbafef10f77f7201/lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b", size = 4815288 }, + { url = "https://files.pythonhosted.org/packages/1d/51/a0acca077ad35da458f4d3f729ef98effd2b90f003440d35fc36323f8ae6/lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7", size = 5472435 }, + { url = "https://files.pythonhosted.org/packages/4d/6b/0989c9368986961a6b0f55b46c80404c4b758417acdb6d87bfc3bd5f4967/lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8", size = 4976354 }, + { url = "https://files.pythonhosted.org/packages/05/9e/87492d03ff604fbf656ed2bf3e2e8d28f5d58ea1f00ff27ac27b06509079/lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32", size = 5029973 }, + { url = "https://files.pythonhosted.org/packages/f9/cc/9ae1baf5472af88e19e2c454b3710c1be9ecafb20eb474eeabcd88a055d2/lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86", size = 4888837 }, + { url = "https://files.pythonhosted.org/packages/d2/10/5594ffaec8c120d75b17e3ad23439b740a51549a9b5fd7484b2179adfe8f/lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5", size = 5530555 }, + { url = "https://files.pythonhosted.org/packages/ea/9b/de17f05377c8833343b629905571fb06cff2028f15a6f58ae2267662e341/lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03", size = 5405314 }, + { url = "https://files.pythonhosted.org/packages/8a/b4/227be0f1f3cca8255925985164c3838b8b36e441ff0cc10c1d3c6bdba031/lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7", size = 5079303 }, + { url = "https://files.pythonhosted.org/packages/5c/ee/19abcebb7fc40319bb71cd6adefa1ad94d09b5660228715854d6cc420713/lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80", size = 3475126 }, + { url = "https://files.pythonhosted.org/packages/a1/35/183d32551447e280032b2331738cd850da435a42f850b71ebeaab42c1313/lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3", size = 3805065 }, + { url = "https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b", size = 8141056 }, + { url = "https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18", size = 4425238 }, + { url = "https://files.pythonhosted.org/packages/f8/fb/128dddb7f9086236bce0eeae2bfb316d138b49b159f50bc681d56c1bdd19/lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442", size = 5095197 }, + { url = "https://files.pythonhosted.org/packages/b4/f9/a181a8ef106e41e3086629c8bdb2d21a942f14c84a0e77452c22d6b22091/lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4", size = 4809809 }, + { url = "https://files.pythonhosted.org/packages/25/2f/b20565e808f7f6868aacea48ddcdd7e9e9fb4c799287f21f1a6c7c2e8b71/lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f", size = 5407593 }, + { url = "https://files.pythonhosted.org/packages/23/0e/caac672ec246d3189a16c4d364ed4f7d6bf856c080215382c06764058c08/lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e", size = 4866657 }, + { url = "https://files.pythonhosted.org/packages/67/a4/1f5fbd3f58d4069000522196b0b776a014f3feec1796da03e495cf23532d/lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c", size = 4967017 }, + { url = "https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16", size = 4810730 }, + { url = "https://files.pythonhosted.org/packages/1d/ce/fb84fb8e3c298f3a245ae3ea6221c2426f1bbaa82d10a88787412a498145/lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79", size = 5455154 }, + { url = "https://files.pythonhosted.org/packages/b1/72/4d1ad363748a72c7c0411c28be2b0dc7150d91e823eadad3b91a4514cbea/lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080", size = 4969416 }, + { url = "https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654", size = 5013672 }, + { url = "https://files.pythonhosted.org/packages/b9/93/bde740d5a58cf04cbd38e3dd93ad1e36c2f95553bbf7d57807bc6815d926/lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d", size = 4878644 }, + { url = "https://files.pythonhosted.org/packages/56/b5/645c8c02721d49927c93181de4017164ec0e141413577687c3df8ff0800f/lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763", size = 5511531 }, + { url = "https://files.pythonhosted.org/packages/85/3f/6a99a12d9438316f4fc86ef88c5d4c8fb674247b17f3173ecadd8346b671/lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec", size = 5402065 }, + { url = "https://files.pythonhosted.org/packages/80/8a/df47bff6ad5ac57335bf552babfb2408f9eb680c074ec1ba412a1a6af2c5/lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be", size = 5069775 }, + { url = "https://files.pythonhosted.org/packages/08/ae/e7ad0f0fbe4b6368c5ee1e3ef0c3365098d806d42379c46c1ba2802a52f7/lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9", size = 3474226 }, + { url = "https://files.pythonhosted.org/packages/c3/b5/91c2249bfac02ee514ab135e9304b89d55967be7e53e94a879b74eec7a5c/lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1", size = 3814971 }, + { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, + { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, + { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, + { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, + { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, + { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, + { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, + { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, + { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, + { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, + { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, + { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, + { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, + { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, + { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, + { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, + { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, + { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, + { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, + { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, + { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, + { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, + { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, + { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, + { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, + { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, + { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, + { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, + { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, + { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, + { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, + { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, + { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, + { url = "https://files.pythonhosted.org/packages/99/f7/b73a431c8500565aa500e99e60b448d305eaf7c0b4c893c7c5a8a69cc595/lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c", size = 3925431 }, + { url = "https://files.pythonhosted.org/packages/db/48/4a206623c0d093d0e3b15f415ffb4345b0bdf661a3d0b15a112948c033c7/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a", size = 4216683 }, + { url = "https://files.pythonhosted.org/packages/54/47/577820c45dd954523ae8453b632d91e76da94ca6d9ee40d8c98dd86f916b/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005", size = 4326732 }, + { url = "https://files.pythonhosted.org/packages/68/de/96cb6d3269bc994b4f5ede8ca7bf0840f5de0a278bc6e50cb317ff71cafa/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce", size = 4218377 }, + { url = "https://files.pythonhosted.org/packages/a5/43/19b1ef6cbffa4244a217f95cc5f41a6cb4720fed33510a49670b03c5f1a0/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83", size = 4351237 }, + { url = "https://files.pythonhosted.org/packages/ba/b2/6a22fb5c0885da3b00e116aee81f0b829ec9ac8f736cd414b4a09413fc7d/lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba", size = 3487557 }, +] + [[package]] name = "mako" version = "1.3.6" @@ -1484,6 +1653,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] +[[package]] +name = "ply" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567 }, +] + [[package]] name = "pre-commit" version = "4.0.1" @@ -1802,6 +1980,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] +[[package]] +name = "rdflib" +version = "7.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate", marker = "python_full_version < '3.11'" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/b6/4cee25689c7a3dfafeb481d358e74696fe3a8543da4cb2c1b71c0cb6583d/rdflib-7.1.1.tar.gz", hash = "sha256:164de86bd3564558802ca983d84f6616a4a1a420c7a17a8152f5016076b2913e", size = 4864216 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/7d/9add7b22a4e695c4f3011ed084ecf725e1f03954b9fa071f1766890b4989/rdflib-7.1.1-py3-none-any.whl", hash = "sha256:e590fa9a2c34ba33a667818b5a84be3fb8a4d85868f8038f17912ec84f912a25", size = 562443 }, +] + [[package]] name = "referencing" version = "0.35.1" @@ -1875,6 +2066,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/2f/73de654df9e7e5f67d742c1d949b5c0c7c1203e84b2272d9e34a91faaf5c/reuse-5.0.2-cp313-cp313-manylinux_2_40_x86_64.whl", hash = "sha256:7a680f00324e87a72061677a892d8cbabfddf7adcf7a5376aeeed2d78995bbbb", size = 184309 }, ] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, +] + +[[package]] +name = "rfc3987" +version = "1.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/bb/f1395c4b62f251a1cb503ff884500ebd248eed593f41b469f89caa3547bd/rfc3987-1.3.8.tar.gz", hash = "sha256:d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733", size = 20700 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl", hash = "sha256:10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53", size = 13377 }, +] + [[package]] name = "rich" version = "13.9.4" @@ -1998,6 +2210,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/bc/cc8a6a5ca4960b226dc15dd8fb511dd11f2014ff89d325c0b9b9faa9871f/ruff-0.8.0-py3-none-win_arm64.whl", hash = "sha256:ba93e6294e9a737cd726b74b09a6972e36bb511f9a102f1d9a7e1ce94dd206a6", size = 8939733 }, ] +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552 }, +] + [[package]] name = "setuptools" version = "75.6.0" @@ -2041,9 +2262,11 @@ dev = [ { name = "abilian-devtools" }, { name = "beartype" }, { name = "coverage" }, + { name = "cyclonedx-bom" }, { name = "docformatter" }, { name = "pytest-archon" }, { name = "pytest-beartype" }, + { name = "spdx-tools" }, { name = "typeguard" }, { name = "types-pyyaml" }, { name = "types-requests" }, @@ -2071,9 +2294,11 @@ dev = [ { name = "abilian-devtools", specifier = ">=0.7.4" }, { name = "beartype", specifier = ">=0.19.0" }, { name = "coverage", specifier = ">=7.6.7" }, + { name = "cyclonedx-bom", specifier = ">=4.6.1" }, { name = "docformatter", specifier = ">=1.7.5" }, { name = "pytest-archon", specifier = ">=0.0.6" }, { name = "pytest-beartype", specifier = ">=0.2.0" }, + { name = "spdx-tools", specifier = ">=0.8.3" }, { name = "typeguard", specifier = ">=4.4.1" }, { name = "types-pyyaml", specifier = ">=6.0.12.20240917" }, { name = "types-requests", specifier = ">=2.32.0.20241016" }, @@ -2088,6 +2313,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, ] +[[package]] +name = "spdx-tools" +version = "0.8.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "click" }, + { name = "license-expression" }, + { name = "ply" }, + { name = "pyyaml" }, + { name = "rdflib" }, + { name = "semantic-version" }, + { name = "uritools" }, + { name = "xmltodict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/99/3470b28dc4b64fd29db3b1dcf5e84c743ec88e25ea7b214794f5930f0319/spdx-tools-0.8.3.tar.gz", hash = "sha256:68b8f9ce2893b5216bd90b2e63f1c821c2884e4ebc4fd295ebbf1fa8b8a94b93", size = 681626 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/bc/09994d78b66da8535ab339047c2381409f028581c0bbde53287745d3cab1/spdx_tools-0.8.3-py3-none-any.whl", hash = "sha256:638fd9bd8be61901316eb6d063574e16d5403a1870073ec4d9241426a997501a", size = 285435 }, +] + [[package]] name = "sqlalchemy" version = "2.0.36" @@ -2202,6 +2447,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/53/9465dedf2d69fe26008e7732cf6e0a385e387c240869e7d54eed49782a3c/typeguard-4.4.1-py3-none-any.whl", hash = "sha256:9324ec07a27ec67fc54a9c063020ca4c0ae6abad5e9f0f9804ca59aee68c6e21", size = 35635 }, ] +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241003" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f8/f6ee4c803a7beccffee21bb29a71573b39f7037c224843eff53e5308c16e/types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446", size = 9210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/d6/ba5f61958f358028f2e2ba1b8e225b8e263053bd57d3a79e2d2db64c807b/types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d", size = 9693 }, +] + [[package]] name = "types-pyyaml" version = "6.0.12.20240917" @@ -2247,6 +2501,24 @@ version = "0.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz", hash = "sha256:3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2", size = 3099 } +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 }, +] + +[[package]] +name = "uritools" +version = "4.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/43/4182fb2a03145e6d38698e38b49114ce59bc8c79063452eb585a58f8ce78/uritools-4.0.3.tar.gz", hash = "sha256:ee06a182a9c849464ce9d5fa917539aacc8edd2a4924d1b7aabeeecabcae3bc2", size = 24184 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/17/5a4510d9ca9cc8be217ce359eb54e693dca81cf4d442308b282d5131b17d/uritools-4.0.3-py3-none-any.whl", hash = "sha256:bae297d090e69a0451130ffba6f2f1c9477244aa0a5543d66aed2d9f77d0dd9c", size = 10304 }, +] + [[package]] name = "urllib3" version = "2.2.3" @@ -2282,6 +2554,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/1b/bc096603b79edbac62899cbe852bd5ccdf0f8e8a7faa9f7390ee1995cedb/vulture-2.13-py2.py3-none-any.whl", hash = "sha256:34793ba60488e7cccbecdef3a7fe151656372ef94fdac9fe004c52a4000a6d44", size = 27714 }, ] +[[package]] +name = "webcolors" +version = "24.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 }, +] + [[package]] name = "webencodings" version = "0.5.1" @@ -2311,3 +2592,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2 wheels = [ { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498 }, ] + +[[package]] +name = "xmltodict" +version = "0.14.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/05/51dcca9a9bf5e1bce52582683ce50980bcadbc4fa5143b9f2b19ab99958f/xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553", size = 51942 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/45/fc303eb433e8a2a271739c98e953728422fa61a3c1f36077a49e395c972e/xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac", size = 9981 }, +]