{"id":21000745,"url":"https://github.com/phylum-dev/purl-survey","last_synced_at":"2025-08-05T08:08:48.662Z","repository":{"id":207043143,"uuid":"718272185","full_name":"phylum-dev/purl-survey","owner":"phylum-dev","description":"Package URL implementation test harness","archived":false,"fork":false,"pushed_at":"2025-03-19T12:11:06.000Z","size":69,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-14T23:36:49.703Z","etag":null,"topics":["package-url","purl"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phylum-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-11-13T18:37:50.000Z","updated_at":"2025-03-19T12:11:08.000Z","dependencies_parsed_at":"2024-05-17T19:43:31.025Z","dependency_job_id":"12f49afa-fa69-48c4-bd3b-04de3060cbec","html_url":"https://github.com/phylum-dev/purl-survey","commit_stats":null,"previous_names":["phylum-dev/purl-survey"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/phylum-dev/purl-survey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phylum-dev%2Fpurl-survey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phylum-dev%2Fpurl-survey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phylum-dev%2Fpurl-survey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phylum-dev%2Fpurl-survey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phylum-dev","download_url":"https://codeload.github.com/phylum-dev/purl-survey/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phylum-dev%2Fpurl-survey/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268859120,"owners_count":24318874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-05T02:00:12.334Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["package-url","purl"],"created_at":"2024-11-19T08:12:11.270Z","updated_at":"2025-08-05T08:08:48.652Z","avatar_url":"https://github.com/phylum-dev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# purl-survey\n\nThis repository contains code for exercising several PURL implementations.\n\n- [althonos/packageurl.rs](https://github.com/althonos/packageurl.rs)\n- [anchore/packageurl-go](https://github.com/anchore/packageurl-go)\n- [giterlizzi/perl-URI-PackageURL](https://github.com/giterlizzi/perl-URI-PackageURL)\n- [iseki0/PUrlKt](https://github.com/iseki0/PUrlKt)\n- [maennchen/purl](https://github.com/maennchen/purl)\n- [package-url/packageurl-dotnet](https://github.com/package-url/packageurl-dotnet)\n- [package-url/packageurl-go](https://github.com/package-url/packageurl-go)\n- [package-url/packageurl-java](https://github.com/package-url/packageurl-java)\n- [package-url/packageurl-js](https://github.com/package-url/packageurl-js)\n- [package-url/packageurl-php](https://github.com/package-url/packageurl-php)\n- [package-url/packageurl-python](https://github.com/package-url/packageurl-python)\n- [package-url/packageurl-ruby](https://github.com/package-url/packageurl-ruby)\n- [package-url/packageurl-swift](https://github.com/package-url/packageurl-swift)\n- [phylum-dev/purl](https://github.com/phylum-dev/purl)\n- [sonatype/package-url-java](https://github.com/sonatype/package-url-java)\n\nFor each supported implementation, there are two small programs that read lines from stdin and write lines to stdout:\n\n`parse`\n: Parses a PURL and outputs a JSON description\n\n`format`\n: Parses a JSON description and outputs a PURL\n\nThese programs are in survey/drivers.\n\n## Usage\n\n```shell\n# Create a virtual environment\npython3 -m venv env\n# Activate the virtual environment (command is different on Windows)\n. env/bin/activate\n# Install requirements into virtual environment.\npip install -r requirements.txt\n# Build drivers for implementations.\npython -m survey.build\n```\n\n### survey.parse\n\n\u003e Parse PURL to JSON\n\n```\n$ python -m survey.parse\npkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\nalthonos/packageurl.rs: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\nanchore/packageurl-go: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\ngiterlizzi/perl-URI-PackageURL: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\niseki0/PUrlKt: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\nmaennchen/purl: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-dotnet: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-go: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-java: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-js: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-php: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-python: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-ruby: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\npackage-url/packageurl-swift: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\nphylum-dev/purl: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\nsonatype/package-url-java: {\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\n```\n\n(press ^D to close stdin and exit)\n\n### survey.format\n\n\u003e Format JSON to PURL\n\n```\n$ python -m survey.format\n{\"type\": \"deb\", \"name\": \"curl\", \"namespace\": \"debian\", \"version\": \"7.50.3-1\", \"qualifiers\": {\"arch\": \"i386\", \"distro\": \"jessie\"}}\nalthonos/packageurl.rs: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\nanchore/packageurl-go: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\ngiterlizzi/perl-URI-PackageURL: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\niseki0/PUrlKt: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\nmaennchen/purl: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-dotnet: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-go: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-java: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-js: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-php: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-python: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-ruby: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\npackage-url/packageurl-swift: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\nphylum-dev/purl: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\nsonatype/package-url-java: pkg:deb/debian/curl@7.50.3-1?arch=i386\u0026distro=jessie\n```\n\n(press ^D to close stdin and exit)\n\n### survey.check\n\n\u003e Parse PURL to JSON and format it back to PURL, ensuring that every PURL parses the same for all implementations.\n\n```\n$ python -m survey.check\npkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io%2Frelease\npkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io%2Frelease parsed to {\"type\": \"maven\", \"name\": \"batik-anim\", \"namespace\": \"org.apache.xmlgraphics\", \"version\": \"1.9.1\", \"qualifiers\": {\"repository_url\": \"repo.spring.io/release\"}}\nFormatted as \"pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io/release\" by althonos/packageurl.rs, giterlizzi/perl-URI-PackageURL, maennchen/purl, phylum-dev/purl, iseki0/PUrlKt, sonatype/package-url-java, package-url/packageurl-python, package-url/packageurl-swift, package-url/packageurl-dotnet, package-url/packageurl-php\npkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io/release parsed to {\"type\": \"maven\", \"name\": \"batik-anim\", \"namespace\": \"org.apache.xmlgraphics\", \"version\": \"1.9.1\", \"qualifiers\": {\"repository_url\": \"repo.spring.io/release\"}}\n```\n\n(press ^D to close stdin and exit)\n\n### survey.suite\n\n\u003e Run the PURL spec test suite.\n\nResults are output as JSON.\n\n```\n$ python -m survey.suite\n[\n  {\n    \"implementation\": \"althonos/packageurl.rs\",\n    \"code\": \"unexpected_success\",\n    \"test\": \"invalid swift purl without name\",\n    \"reason\": \"Expected an error for invalid purl pkg:swift/github.com/Alamofire/@5.4.3\",\n    \"expected\": \"[error]\",\n    \"actual\": {\n      \"type\": \"swift\",\n      \"name\": \"Alamofire\",\n      \"namespace\": \"github.com\",\n      \"version\": \"5.4.3\"\n    }\n  },\n…\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphylum-dev%2Fpurl-survey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphylum-dev%2Fpurl-survey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphylum-dev%2Fpurl-survey/lists"}