PURL
NAME
PURL - Package URL specification v1.0.X
SYNOPSIS
use PURL;
my $purl := PURL.new("pkg:maven/org.apache.commons/[email protected]");
say $purl.type; # maven
say $purl.namespace; # org.apache.commons
say $purl.name; # io
say $purl.version, # 1.3.4
# Stringifies to the canonical version of the PURL
say $purl; # pkg:maven/org.apache.commons/[email protected]
# If only interested in validity
if PURL("pkg:maven/org.apache.commons/[email protected]") {
say "Valid Package URL";
}
# Create from an identity string
$purl = PURL.from-identity("PURL:auth<zef:lizmat>");
$purl = PURL.from-identity(
"PURL:ver<0.0.5>:auth<zef:lizmat>"
:must-be-pinned
);
DESCRIPTION
PURL is distribution that provides a PURL class that implements the
Package URL
specification, an attempt to standardize existing approaches to reliably
identify and locate software packages.
CHECKING VALIDITY
if PURL("pkg:maven/org.apache.commons/[email protected]") {
say "Valid Package URL";
}
To just see whether a string that claims to be a Package URL is
valid, one can call the class itself with that string to check:
it will return either True or False (without throwing any
exception).
INSTANTIATION
An instantiated object will stringify in the canonical version of the package URL.
new
my $purl := PURL.new("pkg:maven/org.apache.commons/[email protected]");
The PURL object is instantiated with the .new method and the
Package URL as the only positional argument. It will throw an error
if there is some type of problem with the Package URL.
say PURL.new(:type<maven>, :name<io>, :version<3>); # pkg:maven/io@3
It can also be instantiated in the ordinary named arguments way with
the .new method.
from-identity
my $purl = PURL.from-identity("PURL:auth<zef:lizmat>");
Alternately a PURL object can be instantiated from a Raku module
identity with the .from-identity method.
my $purl = PURL.from-identity(
"PURL:ver<0.0.5>:auth<zef:lizmat>"
:must-be-pinned
);
If the PURL reference must be referencing a specific version of a
distribution, then the :must-be-pinned named argument can be
specified. An error will be thrown if the specified identity is not
pinned in that case.
ACCESSORS
scheme
The scheme of the package specification: always 'pkg'.
type
The type of the package specification.
name
The name of the package specification.
namespace
The namespace of the package specification.
version
The version of the package specification.
qualifiers
The qualifiers of the package specification.
subpath
The subpath of tha package specification.
OTHER METHODS
VERS
my $purl = PURL.new("pkg:raku/zef:lizmat/PURL?vers=vers:raku/<2.0|>=1.0");
say $purl.VERS; # vers:raku/>=1.10 | <2.0
Returns the associated VERS object if there is any (as specified
by the "vers" qualifier key). Returns Nil if none found.
SUPPORTED TYPES
The PURL::Type class allows for various types of introspection.
Calling the class with a string will either return the type object
for the given string, or a Failure.
my $class = PURL::Type("bitbucket");
say "bitbucket is valid" unless $class ~~ Failure;
supported-names
say PURL::Type.supported-names; # (alpm apk bitbucket bitnami...
The supported-names class method returns the names of the supported
PURL types, in alphabetical order.
supported-types
say PURL::Type.supported-types; # ((alpm) (apk) (bitbucket)...
The supported-types class method returns the type objects of the
supported PURL types, in alphabetical order.
description
say PURL::Type.description("bitbucket"); # Bitbucket-based packages.
The description class method takes the name of a PURL type and
returns its description.
examples
.say for PURL::Type.examples("bitbucket"); # pkg:bitbucket/birke...
The examples class method takes the name of a PURL type and
returns a list of valid PURL examples of that PURL type.
AUTHOR
Elizabeth Mattijsen <[email protected]>
Source can be located at: https://github.com/lizmat/PURL . Comments and Pull Requests are welcome.
If you like this module, or what Iām doing more generally, committing to a small sponsorship would mean a great deal to me!
COPYRIGHT AND LICENSE
Copyright 2025, 2026 Elizabeth Mattijsen
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.
# vim: expandtab shiftwidth=4