purl 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2e3a83fa55008ae8b31be8d3e5c7306556e4b7d4371e6db46927deae1edee3c
4
- data.tar.gz: 5a092dfa8e630db8ca28064b1e101a62320d601708b38351a92b2f5431d692dc
3
+ metadata.gz: 519631a904ead8452084959edb20711e684c0fc9c0b0a848ff6775f86bc31675
4
+ data.tar.gz: cb82893be40a50ae28651b78ed293dd0303b6cc926b81985fe256d32f0b0fea7
5
5
  SHA512:
6
- metadata.gz: a8db461d6066ce37a6fb9c50c373e2dd6739fddb123ac0627c14f645dadc0b610b24e30a6d0dbcda28148f103870ba8cbc28e34efb65ab026b463752753fcd6d
7
- data.tar.gz: 5420d53af149d4c1ef1fd8337f232bf4f03f420fcaa3a2de32a38751505167c0eb3d431b382ad803f29ed8b2230f80789cbcdb9c15b4e43a0af5b69fcb554031
6
+ metadata.gz: 5ef9defb2759c124020aa5d6ba88eb281e0bd1fbf256cafdd3ba7c4e17bca09aec0286fe2851b74e12313062a5d3e38a76db85376b60d3f645e9f4720e0cb2b8
7
+ data.tar.gz: 6399a94cf6bd5bd92fa6e5da30f7f9c6e056982728bc5828ead26e9d8c9c17b5beedbe4bdababebc0bee701bdeaf27f4ffa7b84e54a451d45e7dea7c9575c9b7
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "purl-spec"]
2
+ path = purl-spec
3
+ url = https://github.com/package-url/purl-spec.git
data/CHANGELOG.md CHANGED
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.0] - 2025-07-27
11
+
12
+ ### Added
13
+ - Default registry URLs for 10 additional package types:
14
+ - `golang`: https://pkg.go.dev (Go package discovery site)
15
+ - `luarocks`: https://luarocks.org (Lua package repository)
16
+ - `clojars`: https://clojars.org (Clojure package repository)
17
+ - `elm`: https://package.elm-lang.org (Elm package catalog)
18
+ - `deno`: https://deno.land (Deno module registry)
19
+ - `homebrew`: https://formulae.brew.sh (Homebrew package browser)
20
+ - `bioconductor`: https://bioconductor.org (R bioinformatics packages)
21
+ - `huggingface`: https://huggingface.co (Machine learning models)
22
+ - `swift`: https://swiftpackageindex.com (Swift package index)
23
+ - `conan`: https://conan.io/center (C/C++ package center)
24
+
25
+ ### Enhanced
26
+ - Registry configuration support for newly added package types
27
+ - Updated test suite to validate all new default registries
28
+ - Improved package type coverage with comprehensive registry URL mapping
29
+
30
+ ### Configuration
31
+ - Updated `purl-types.json` to version 1.2.0 with enhanced registry configurations
32
+ - Added specialized registry handling for Go's unique import path structure
33
+
10
34
  ## [1.1.2] - 2025-07-25
11
35
 
12
36
  ### Added
data/README.md CHANGED
@@ -385,6 +385,25 @@ rake spec:types
385
385
  rake spec:verify_types
386
386
  ```
387
387
 
388
+ ### Testing Against Official Specification
389
+
390
+ This library includes the official [purl-spec](https://github.com/package-url/purl-spec) repository as a git submodule for testing and validation:
391
+
392
+ ```bash
393
+ # Initialize submodule (first time only)
394
+ git submodule update --init --recursive
395
+
396
+ # Update submodule to latest spec
397
+ git submodule update --remote purl-spec
398
+ ```
399
+
400
+ The tests use files from the submodule to:
401
+ - **Schema validation**: Validate our `purl-types.json` against the official schema in `purl-spec/schemas/`
402
+ - **Type compliance**: Ensure our supported types match the official types in `purl-spec/types/`
403
+ - **Test data**: Access official test cases and examples from `purl-spec/tests/`
404
+
405
+ The submodule is automatically updated weekly via Dependabot, ensuring tests stay current with the latest specification changes. When the submodule updates, you can review and merge the PR to adopt new spec requirements.
406
+
388
407
  ### Rake Tasks
389
408
 
390
409
  - `rake spec:update` - Fetch latest test cases from official PURL spec repository
@@ -532,14 +532,15 @@ module Purl
532
532
  end
533
533
 
534
534
  def validate_conan_specific_rules
535
- # For conan packages, if a namespace is present WITHOUT any qualifiers,
536
- # it's ambiguous (test case 30)
537
- if @namespace && (@qualifiers.nil? || (@qualifiers["user"].nil? && @qualifiers["channel"].nil?))
535
+ # For conan packages, if a namespace is present WITHOUT any qualifiers at all,
536
+ # it's ambiguous. However, any qualifiers (including build settings) make it unambiguous.
537
+ # According to the official spec, user/channel are only required if the package was published with them.
538
+ if @namespace && (@qualifiers.nil? || @qualifiers.empty?)
538
539
  raise ValidationError.new(
539
- "Conan PURLs with namespace require 'user' and/or 'channel' qualifiers to be unambiguous",
540
+ "Conan PURLs with namespace require qualifiers to be unambiguous",
540
541
  component: :qualifiers,
541
542
  value: @qualifiers,
542
- rule: "conan packages with namespace need user/channel qualifiers"
543
+ rule: "conan packages with namespace need qualifiers for disambiguation"
543
544
  )
544
545
  end
545
546
 
@@ -5,7 +5,7 @@ module Purl
5
5
  # Load registry patterns from JSON configuration
6
6
  def self.load_registry_patterns
7
7
  @registry_patterns ||= begin
8
- # Load JSON config directly to avoid circular dependency
8
+ # Load extended registry configs
9
9
  config_path = File.join(__dir__, "..", "..", "purl-types.json")
10
10
  require "json"
11
11
  config = JSON.parse(File.read(config_path))
@@ -16,37 +16,19 @@ module Purl
16
16
  next unless type_config["registry_config"]
17
17
 
18
18
  registry_config = type_config["registry_config"]
19
- patterns[type] = build_pattern_config(type, registry_config)
19
+ patterns[type] = build_pattern_config(type, registry_config, type_config)
20
20
  end
21
21
 
22
22
  patterns
23
23
  end
24
24
  end
25
25
 
26
- def self.build_pattern_config(type, config)
27
- # Get the default registry for this type from parent config
28
- type_config = load_types_config["types"][type]
26
+ def self.build_pattern_config(type, config, type_config)
27
+ # Get the default registry for this type from the extended config
29
28
  default_registry = type_config["default_registry"]
30
29
 
31
- # Build full URLs from templates if we have a default registry
32
- route_patterns = []
33
- if default_registry
34
- # Add all template variations
35
- if config["path_template"]
36
- route_patterns << default_registry + config["path_template"]
37
- end
38
- if config["namespace_path_template"]
39
- route_patterns << default_registry + config["namespace_path_template"]
40
- end
41
- if config["version_path_template"]
42
- route_patterns << default_registry + config["version_path_template"]
43
- end
44
- if config["namespace_version_path_template"]
45
- route_patterns << default_registry + config["namespace_version_path_template"]
46
- end
47
- end
48
- # Fall back to legacy route_patterns if available
49
- route_patterns = config["route_patterns"] if route_patterns.empty? && config["route_patterns"]
30
+ # Use route_patterns directly from our extended registry config
31
+ route_patterns = config["route_patterns"] || []
50
32
 
51
33
  # Build reverse regex from template or use legacy format
52
34
  reverse_regex = nil
data/lib/purl/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Purl
4
- VERSION = "1.1.2"
4
+ VERSION = "1.2.0"
5
5
  end
data/purl-types.json CHANGED
@@ -1,25 +1,24 @@
1
1
  {
2
- "version": "1.0.0",
3
- "description": "PURL types and registry URL patterns for package ecosystems",
4
- "source": "https://github.com/package-url/purl-spec/blob/main/PURL-TYPES.rst",
5
- "last_updated": "2025-07-24",
2
+ "version": "1.2.0",
3
+ "description": "Official PURL types with registry configurations",
4
+ "source": "https://github.com/package-url/purl-spec",
5
+ "last_updated": "2025-07-27",
6
6
  "types": {
7
7
  "alpm": {
8
- "description": "Arch Linux and other users of the libalpm/pacman package manager",
8
+ "description": "Arch Linux packages and other users of the libalpm/pacman package manager.",
9
9
  "default_registry": null,
10
10
  "examples": [
11
- "pkg:alpm/arch/pacman@6.0.2-5?distro=arch",
12
- "pkg:alpm/arch/curl@7.87.0-2?distro=arch",
13
- "pkg:alpm/arch/systemd@252.4-2?distro=arch"
11
+ "pkg:alpm/arch/pacman@6.0.1-1?arch=x86_64",
12
+ "pkg:alpm/arch/python-pip@21.0-1?arch=any",
13
+ "pkg:alpm/arch/containers-common@1:0.47.4-4?arch=x86_64"
14
14
  ]
15
15
  },
16
16
  "apk": {
17
- "description": "APK-based packages",
17
+ "description": "Alpine Linux APK-based packages",
18
18
  "default_registry": null,
19
19
  "examples": [
20
- "pkg:apk/alpine/curl@7.83.0-r0?distro=alpine-3.16",
21
- "pkg:apk/alpine/busybox@1.35.0-r17?distro=alpine-3.16",
22
- "pkg:apk/alpine/musl@1.2.3-r0?distro=alpine-3.16"
20
+ "pkg:apk/alpine/curl@7.83.0-r0?arch=x86",
21
+ "pkg:apk/alpine/apk@2.12.9-r3?arch=x86"
23
22
  ]
24
23
  },
25
24
  "bitbucket": {
@@ -33,15 +32,16 @@
33
32
  },
34
33
  "bitnami": {
35
34
  "description": "Bitnami-based packages",
36
- "default_registry": "https://downloads.bitnami.com/files/stacksmith",
35
+ "default_registry": null,
37
36
  "examples": [
38
- "pkg:bitnami/wordpress@6.1.1-0",
39
- "pkg:bitnami/mysql@8.0.31-0",
40
- "pkg:bitnami/apache@2.4.54-0"
37
+ "pkg:bitnami/wordpress?distro=debian-12",
38
+ "pkg:bitnami/wordpress@6.2.0?distro=debian-12",
39
+ "pkg:bitnami/wordpress@6.2.0?arch=arm64&distro=debian-12",
40
+ "pkg:bitnami/wordpress@6.2.0?arch=arm64&distro=photon-4"
41
41
  ]
42
42
  },
43
43
  "cargo": {
44
- "description": "Rust packages",
44
+ "description": "Cargo packages for Rust",
45
45
  "default_registry": "https://crates.io",
46
46
  "examples": [
47
47
  "pkg:cargo/rand@0.7.2",
@@ -61,7 +61,7 @@
61
61
  }
62
62
  },
63
63
  "cocoapods": {
64
- "description": "CocoaPods",
64
+ "description": "CocoaPods pods",
65
65
  "default_registry": "https://cdn.cocoapods.org/",
66
66
  "examples": [
67
67
  "pkg:cocoapods/Alamofire@5.6.4",
@@ -102,16 +102,27 @@
102
102
  }
103
103
  },
104
104
  "conan": {
105
- "description": "Conan C/C++ packages",
106
- "default_registry": "https://center.conan.io",
105
+ "description": "Conan C/C++ packages. The purl is designed to closely resemble the Conan-native <package-name>/<package-version>@<user>/<channel> syntax for package references as specified in https://docs.conan.io/en/1.46/cheatsheet.html#package-terminology",
106
+ "default_registry": "https://conan.io/center",
107
107
  "examples": [
108
- "pkg:conan/boost@1.80.0",
109
- "pkg:conan/openssl@1.1.1s",
110
- "pkg:conan/zlib@1.2.13"
111
- ]
108
+ "pkg:conan/openssl@3.0.3",
109
+ "pkg:conan/openssl.org/openssl@3.0.3?user=bincrafters&channel=stable",
110
+ "pkg:conan/openssl.org/openssl@3.0.3?arch=x86_64&build_type=Debug&compiler=Visual%20Studio&compiler.runtime=MDd&compiler.version=16&os=Windows&shared=True&rrev=93a82349c31917d2d674d22065c7a9ef9f380c8e&prev=b429db8a0e324114c25ec387bfd8281f330d7c5c"
111
+ ],
112
+ "registry_config": {
113
+ "base_url": "https://conan.io/center/recipes",
114
+ "route_patterns": [
115
+ "https://conan.io/center/recipes/:name"
116
+ ],
117
+ "reverse_regex": "^https://conan\\.io/center/recipes/([^/?#]+)",
118
+ "components": {
119
+ "namespace": false,
120
+ "version_in_url": false
121
+ }
122
+ }
112
123
  },
113
124
  "conda": {
114
- "description": "Conda packages",
125
+ "description": "conda is for Conda packages",
115
126
  "default_registry": "https://repo.anaconda.com",
116
127
  "examples": [
117
128
  "pkg:conda/numpy@1.24.1",
@@ -160,16 +171,18 @@
160
171
  ]
161
172
  },
162
173
  "deb": {
163
- "description": "Debian, Debian derivatives, and Ubuntu packages",
174
+ "description": "Debian packages, Debian derivatives, and Ubuntu packages",
164
175
  "default_registry": null,
165
176
  "examples": [
166
- "pkg:deb/debian/curl@7.74.0-1.3+deb11u3?distro=debian-11",
167
- "pkg:deb/ubuntu/nginx@1.18.0-0ubuntu1.4?distro=ubuntu-20.04",
168
- "pkg:deb/debian/git@1:2.30.2-1+deb11u2?distro=debian-11"
177
+ "pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie",
178
+ "pkg:deb/debian/dpkg@1.19.0.4?arch=amd64&distro=stretch",
179
+ "pkg:deb/ubuntu/dpkg@1.19.0.4?arch=amd64",
180
+ "pkg:deb/debian/attr@1:2.4.47-2?arch=source",
181
+ "pkg:deb/debian/attr@1:2.4.47-2%2Bb1?arch=amd64"
169
182
  ]
170
183
  },
171
184
  "docker": {
172
- "description": "Docker images",
185
+ "description": "for Docker images",
173
186
  "default_registry": "https://hub.docker.com",
174
187
  "examples": [
175
188
  "pkg:docker/nginx@1.21.6",
@@ -200,12 +213,12 @@
200
213
  }
201
214
  },
202
215
  "generic": {
203
- "description": "Plain packages that do not fit anywhere else",
216
+ "description": "The generic type is for plain, generic packages that do not fit anywhere else such as for \"upstream-from-distro\" packages. In particular this is handy for a plain version control repository such as a bare git repo in combination with a vcs_url.",
204
217
  "default_registry": null,
205
218
  "examples": [
206
- "pkg:generic/bitwardeninc/mobile@2023.1.0",
207
- "pkg:generic/curl@7.80.0?distro=fedora-35",
208
- "pkg:generic/openssl@1.1.1q"
219
+ "pkg:generic/openssl@1.1.10g",
220
+ "pkg:generic/openssl@1.1.10g?download_url=https://openssl.org/source/openssl-1.1.0g.tar.gz&checksum=sha256:de4d501267da",
221
+ "pkg:generic/bitwarderl?vcs_url=git%2Bhttps://git.fsfe.org/dxtr/bitwarderl%40cc55108da32"
209
222
  ]
210
223
  },
211
224
  "github": {
@@ -219,22 +232,24 @@
219
232
  },
220
233
  "golang": {
221
234
  "description": "Go packages",
222
- "default_registry": null,
235
+ "default_registry": "https://pkg.go.dev",
223
236
  "examples": [
237
+ "pkg:golang/github.com/gorilla/context@234fd47e07d1004f0aed9c",
224
238
  "pkg:golang/google.golang.org/genproto#googleapis/api/annotations",
225
- "pkg:golang/github.com/gorilla/mux@v1.8.0"
239
+ "pkg:golang/github.com/gorilla/context@234fd47e07d1004f0aed9c#api"
226
240
  ],
227
241
  "registry_config": {
228
242
  "base_url": "https://pkg.go.dev",
229
243
  "route_patterns": [
230
244
  "https://pkg.go.dev/:namespace/:name",
231
- "https://pkg.go.dev/:name"
245
+ "https://pkg.go.dev/:full_path"
232
246
  ],
233
- "reverse_regex": "^https://pkg\\.go\\.dev/(?:([^/?#]+)/)?([^/?#]+)",
247
+ "reverse_regex": "^https://pkg\\.go\\.dev/(.+)",
234
248
  "components": {
235
249
  "namespace": true,
236
- "namespace_required": false,
237
- "version_in_url": false
250
+ "namespace_required": true,
251
+ "version_in_url": false,
252
+ "special_handling": "golang_import_path"
238
253
  }
239
254
  }
240
255
  },
@@ -284,22 +299,47 @@
284
299
  "description": "Hugging Face ML models",
285
300
  "default_registry": "https://huggingface.co",
286
301
  "examples": [
287
- "pkg:huggingface/transformers@4.25.1",
288
- "pkg:huggingface/tokenizers@0.13.2",
289
- "pkg:huggingface/datasets@2.7.1"
290
- ]
302
+ "pkg:huggingface/distilbert-base-uncased@043235d6088ecd3dd5fb5ca3592b6913fd516027",
303
+ "pkg:huggingface/microsoft/deberta-v3-base@559062ad13d311b87b2c455e67dcd5f1c8f65111?repository_url=https://hub-ci.huggingface.co"
304
+ ],
305
+ "registry_config": {
306
+ "base_url": "https://huggingface.co",
307
+ "route_patterns": [
308
+ "https://huggingface.co/:namespace/:name",
309
+ "https://huggingface.co/:name"
310
+ ],
311
+ "reverse_regex": "^https://huggingface\\.co/(?:([^/?#]+)/)?([^/?#]+)",
312
+ "components": {
313
+ "namespace": true,
314
+ "namespace_required": false,
315
+ "version_in_url": false
316
+ }
317
+ }
291
318
  },
292
319
  "luarocks": {
293
320
  "description": "Lua packages installed with LuaRocks",
294
321
  "default_registry": "https://luarocks.org",
295
322
  "examples": [
296
- "pkg:luarocks/luasocket@3.0.0-1",
297
- "pkg:luarocks/lfs@1.8.0-1",
298
- "pkg:luarocks/lua-cjson@2.1.0-1"
299
- ]
323
+ "pkg:luarocks/luasocket@3.1.0-1",
324
+ "pkg:luarocks/hisham/luafilesystem@1.8.0-1",
325
+ "pkg:luarocks/username/packagename@0.1.0-1?repository_url=https://example.com/private_rocks_server/"
326
+ ],
327
+ "registry_config": {
328
+ "base_url": "https://luarocks.org/modules",
329
+ "route_patterns": [
330
+ "https://luarocks.org/modules/:namespace/:name",
331
+ "https://luarocks.org/modules/:name"
332
+ ],
333
+ "reverse_regex": "^https://luarocks\\.org/modules/(?:([^/?#]+)/)?([^/?#]+)",
334
+ "components": {
335
+ "namespace": true,
336
+ "namespace_required": false,
337
+ "version_in_url": false
338
+ }
339
+ }
300
340
  },
301
341
  "maven": {
302
- "description": "Maven JARs and related artifacts",
342
+ "description": "PURL type for Maven JARs and related artifacts.",
303
343
  "default_registry": "https://repo.maven.apache.org/maven2",
304
344
  "examples": [
305
345
  "pkg:maven/org.apache.commons/commons-lang3@3.12.0",
@@ -322,16 +362,15 @@
322
362
  }
323
363
  },
324
364
  "mlflow": {
325
- "description": "MLflow ML models",
365
+ "description": "MLflow ML models (Azure ML, Databricks, etc.)",
326
366
  "default_registry": null,
327
367
  "examples": [
328
- "pkg:mlflow/model/sklearn-iris@1.0.0",
329
- "pkg:mlflow/model/pytorch-mnist@2.1.0",
330
- "pkg:mlflow/model/tensorflow-classification@1.5.0"
368
+ "pkg:mlflow/creditfraud@3?repository_url=https://westus2.api.azureml.ms/mlflow/v1.0/subscriptions/a50f2011-fab8-4164-af23-c62881ef8c95/resourceGroups/TestResourceGroup/providers/Microsoft.MachineLearningServices/workspaces/TestWorkspace",
369
+ "pkg:mlflow/trafficsigns@10?model_uuid=36233173b22f4c89b451f1228d700d49&run_id=410a3121-2709-4f88-98dd-dba0ef056b0a&repository_url=https://adb-5245952564735461.0.azuredatabricks.net/api/2.0/mlflow"
331
370
  ]
332
371
  },
333
372
  "npm": {
334
- "description": "Node NPM packages",
373
+ "description": "PURL type for npm packages.",
335
374
  "default_registry": "https://registry.npmjs.org",
336
375
  "examples": [
337
376
  "pkg:npm/@babel/core@7.20.0",
@@ -379,16 +418,17 @@
379
418
  }
380
419
  },
381
420
  "oci": {
382
- "description": "Artifacts stored in registries that conform to OCI Distribution Specification",
421
+ "description": "For artifacts stored in registries that conform to the OCI Distribution Specification https://github.com/opencontainers/distribution-spec including container images built by Docker and others",
383
422
  "default_registry": null,
384
423
  "examples": [
385
- "pkg:oci/hello-world@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042",
386
- "pkg:oci/nginx@1.21.6",
387
- "pkg:oci/ubuntu@20.04"
424
+ "pkg:oci/debian@sha256%3A244fd47e07d10?repository_url=docker.io/library/debian&arch=amd64&tag=latest",
425
+ "pkg:oci/debian@sha256%3A244fd47e07d10?repository_url=ghcr.io/debian&tag=bullseye",
426
+ "pkg:oci/static@sha256%3A244fd47e07d10?repository_url=gcr.io/distroless/static&tag=latest",
427
+ "pkg:oci/hello-wasm@sha256%3A244fd47e07d10?tag=v1"
388
428
  ]
389
429
  },
390
430
  "pub": {
391
- "description": "Dart and Flutter packages",
431
+ "description": "Dart and Flutter pub packages",
392
432
  "default_registry": "https://pub.dartlang.org",
393
433
  "examples": [
394
434
  "pkg:pub/http@0.13.5",
@@ -434,32 +474,30 @@
434
474
  "description": "QNX packages",
435
475
  "default_registry": null,
436
476
  "examples": [
437
- "pkg:qpkg/qnx/libc@7.1.0",
438
- "pkg:qpkg/qnx/procnto-smp@7.1.0",
439
- "pkg:qpkg/qnx/ph@7.1.0"
477
+ "pkg:qpkg/blackberry/com.qnx.sdp@7.0.0.SGA201702151847",
478
+ "pkg:qpkg/blackberry/com.qnx.qnx710.foo.bar.qux@0.0.4.01449T202205040833L"
440
479
  ]
441
480
  },
442
481
  "rpm": {
443
- "description": "RPMs",
482
+ "description": "RPM packages",
444
483
  "default_registry": null,
445
484
  "examples": [
446
- "pkg:rpm/fedora/curl@7.87.0-1.fc37?distro=fedora-37",
447
- "pkg:rpm/centos/httpd@2.4.51-7.el8_5?distro=centos-8",
448
- "pkg:rpm/opensuse/git@2.38.1-1.1?distro=opensuse-tumbleweed"
485
+ "pkg:rpm/fedora/curl@7.50.3-1.fc25?arch=i386&distro=fedora-25",
486
+ "pkg:rpm/centerim@4.22.10-1.el6?arch=i686&epoch=1&distro=fedora-25"
449
487
  ]
450
488
  },
451
489
  "swid": {
452
- "description": "Software Identification (SWID) tags",
490
+ "description": "PURL type for ISO-IEC 19770-2 Software Identification (SWID) tags.",
453
491
  "default_registry": null,
454
492
  "examples": [
455
- "pkg:swid/microsoft.com/Microsoft%20Office@16.0.12345.67890",
456
- "pkg:swid/adobe.com/Photoshop@23.1.0",
457
- "pkg:swid/oracle.com/Java%20SE@8u351"
493
+ "pkg:swid/Acme/example.com/Enterprise+Server@1.0.0?tag_id=75b8c285-fa7b-485b-b199-4745e3004d0d",
494
+ "pkg:swid/Fedora@29?tag_id=org.fedoraproject.Fedora-29",
495
+ "pkg:swid/Adobe+Systems+Incorporated/Adobe+InDesign@CC?tag_id=CreativeCloud-CS6-Win-GM-MUL"
458
496
  ]
459
497
  },
460
498
  "swift": {
461
499
  "description": "Swift packages",
462
- "default_registry": null,
500
+ "default_registry": "https://swiftpackageindex.com",
463
501
  "examples": [
464
502
  "pkg:swift/github.com/Alamofire/Alamofire@5.6.4",
465
503
  "pkg:swift/github.com/apple/swift-package-manager@1.7.0"
@@ -477,9 +515,52 @@
477
515
  }
478
516
  }
479
517
  },
518
+ "clojars": {
519
+ "description": "Clojars packages",
520
+ "default_registry": "https://clojars.org",
521
+ "examples": [
522
+ "pkg:clojars/org.clojure/clojure@1.11.1",
523
+ "pkg:clojars/ring/ring-core@1.9.5"
524
+ ],
525
+ "registry_config": {
526
+ "base_url": "https://clojars.org",
527
+ "route_patterns": [
528
+ "https://clojars.org/:namespace/:name",
529
+ "https://clojars.org/:name"
530
+ ],
531
+ "reverse_regex": "^https://clojars\\.org/(?:([^/?#]+)/)?([^/?#]+)",
532
+ "components": {
533
+ "namespace": true,
534
+ "namespace_required": false,
535
+ "version_in_url": false
536
+ }
537
+ }
538
+ },
539
+ "elm": {
540
+ "description": "Elm packages",
541
+ "default_registry": "https://package.elm-lang.org",
542
+ "examples": [
543
+ "pkg:elm/elm/http@2.0.0",
544
+ "pkg:elm/elm-community/json-extra@4.3.0"
545
+ ],
546
+ "registry_config": {
547
+ "base_url": "https://package.elm-lang.org/packages",
548
+ "route_patterns": [
549
+ "https://package.elm-lang.org/packages/:namespace/:name/latest",
550
+ "https://package.elm-lang.org/packages/:namespace/:name/:version"
551
+ ],
552
+ "reverse_regex": "^https://package\\.elm-lang\\.org/packages/([^/?#]+)/([^/?#]+)(?:/([^/?#]+))?",
553
+ "components": {
554
+ "namespace": true,
555
+ "namespace_required": true,
556
+ "version_in_url": true,
557
+ "default_version": "latest"
558
+ }
559
+ }
560
+ },
480
561
  "deno": {
481
562
  "description": "Deno packages",
482
- "default_registry": null,
563
+ "default_registry": "https://deno.land",
483
564
  "examples": [
484
565
  "pkg:deno/oak@12.0.0",
485
566
  "pkg:deno/std@0.177.0#http/server"
@@ -500,7 +581,7 @@
500
581
  },
501
582
  "homebrew": {
502
583
  "description": "Homebrew packages",
503
- "default_registry": null,
584
+ "default_registry": "https://formulae.brew.sh",
504
585
  "examples": [
505
586
  "pkg:homebrew/wget@1.21.3",
506
587
  "pkg:homebrew/node@19.6.0"
@@ -519,7 +600,7 @@
519
600
  },
520
601
  "bioconductor": {
521
602
  "description": "Bioconductor packages",
522
- "default_registry": null,
603
+ "default_registry": "https://bioconductor.org",
523
604
  "examples": [
524
605
  "pkg:bioconductor/IRanges@2.28.0",
525
606
  "pkg:bioconductor/GenomicRanges@1.46.1"
@@ -535,49 +616,6 @@
535
616
  "version_in_url": false
536
617
  }
537
618
  }
538
- },
539
- "clojars": {
540
- "description": "Clojars packages",
541
- "default_registry": null,
542
- "examples": [
543
- "pkg:clojars/org.clojure/clojure@1.11.1",
544
- "pkg:clojars/ring/ring-core@1.9.5"
545
- ],
546
- "registry_config": {
547
- "base_url": "https://clojars.org",
548
- "route_patterns": [
549
- "https://clojars.org/:namespace/:name",
550
- "https://clojars.org/:name"
551
- ],
552
- "reverse_regex": "^https://clojars\\.org/(?:([^/?#]+)/)?([^/?#]+)",
553
- "components": {
554
- "namespace": true,
555
- "namespace_required": false,
556
- "version_in_url": false
557
- }
558
- }
559
- },
560
- "elm": {
561
- "description": "Elm packages",
562
- "default_registry": null,
563
- "examples": [
564
- "pkg:elm/elm/http@2.0.0",
565
- "pkg:elm/elm-community/json-extra@4.3.0"
566
- ],
567
- "registry_config": {
568
- "base_url": "https://package.elm-lang.org/packages",
569
- "route_patterns": [
570
- "https://package.elm-lang.org/packages/:namespace/:name/latest",
571
- "https://package.elm-lang.org/packages/:namespace/:name/:version"
572
- ],
573
- "reverse_regex": "^https://package\\.elm-lang\\.org/packages/([^/?#]+)/([^/?#]+)(?:/([^/?#]+))?",
574
- "components": {
575
- "namespace": true,
576
- "namespace_required": true,
577
- "version_in_url": true,
578
- "default_version": "latest"
579
- }
580
- }
581
619
  }
582
620
  }
583
621
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: purl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Nesbitt
@@ -18,6 +18,7 @@ executables: []
18
18
  extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
+ - ".gitmodules"
21
22
  - CHANGELOG.md
22
23
  - CODE_OF_CONDUCT.md
23
24
  - CONTRIBUTING.md
@@ -31,10 +32,7 @@ files:
31
32
  - lib/purl/registry_url.rb
32
33
  - lib/purl/version.rb
33
34
  - purl-types.json
34
- - schemas/purl-types.schema.json
35
- - schemas/test-suite-data.schema.json
36
35
  - sig/purl.rbs
37
- - test-suite-data.json
38
36
  homepage: https://github.com/andrew/purl
39
37
  licenses: []
40
38
  metadata: