Rand Stats

Identity::Utils

zef:lizmat

Actions Status Actions Status Actions Status

NAME

Identity::Utils - Provide utility functions related to distribution identities

SYNOPSIS

use Identity::Utils;

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>:from<Perl5>";

say short-name($identity);   # Foo::Bar

say ver($identity);          # 0.0.42

say without-ver($identity);  # Foo::Bar:auth<zef:lizmat>:api<2.0>:from<Perl5>

say version($identity);      # v0.0.42

say auth($identity);         # zef:lizmat

say without-auth($identity); # Foo::Bar:ver<0.0.42>:api<2.0>:from<Perl5>

say ecosystem($identity);    # zef

say nick($identity);         # lizmat

say api($identity);          # 2.0

say without-api($identity);  # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:from<Perl5>

say from($identity);         # Perl5

say without-from($identity); # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>

say sanitize($identity);     # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>:from<Perl5>

say build("Foo::Bar", :ver<0.0.42>);  # Foo::Bar:ver<0.0.42>

say is-short-name($identity);   # False
say is-short-name("Foo::Bar");  # True

say is-pinned($identity);   # True
say is-pinned("Foo::Bar");  # False

my $spec        = dependency-specification($identity);
my $compunit    = compunit($identity);
my $meta        = meta($identity, $repo);
my $source-io   = source-io($identity, $repo);
my $source      = source($identity, $repo);
my $bytecode-io = bytecode-io($identity, $repo);
my $bytecode    = bytecode($identity, $repo);

use Identity::Utils <short-name auth>;  # only import "short-name" and "auth"

DESCRIPTION

Identity::Utils provides some utility functions for inspecting various aspects of distribution identity strings. They assume any given string is a well-formed identity in the form name:ver<0.0.1>:auth<eco:nick> with an optional api:<1> field.

A general note with regards to api: if it consists of "0", then it is assumed there is no api field specified.

SELECTIVE IMPORTING

use Identity::Utils <short-name auth>;  # only import "short-name" and "auth"

By default all utility functions are exported. But you can limit this to the functions you actually need by specifying the names in the use statement.

To prevent name collisions and/or import any subroutine with a more memorable name, one can use the "original-name:known-as" syntax. A semi-colon in a specified string indicates the name by which the subroutine is known in this distribution, followed by the name with which it will be known in the lexical context in which the use command is executed.

use Identity::Utils <short-name:name>;  # import "short-name" as "name"

say name("Identity::Utils:auth<zef:lizmat>");  # Identity::Utils

SUBROUTINES

api

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say api($identity); # 2.0

Returns the api field of the given identity, or Nil if no api field could be found.

auth

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say auth($identity); # zef:lizmat

Returns the auth field of the given identity, or Nil if no auth field could be found.

build

my $ver  = "0.0.42";
my $auth = "zef:lizmat";
my $api  = "2.0";
my $from = "Perl5";
say build("Foo::Bar", :$ver, :$auth, :$api, :$from);
  # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>:from<Perl5>

say build("Foo::Bar", :$ver, :nick<lizmat>);
  # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>

Builds an identity string from the given short name and optional named arguments:

bytecode

my $buf = bytecode($identity);       # default: $*REPO

my $buf = bytecode($identity, ".");  # as if with -I.

Returns a Buf object with the precompiled bytecode of the given identity and the currently active repository ($*REPO).

It is also possible to override the repository (chain) by specifying a second argument, this can be an object of type:

Attempts to create the bytecode file if there isn't one yet.

Returns Nil if the given identity could not be found, or there is no bytecode file for the short-name of the given identity (probably because it failed to compile).

bytecode-io

my $io = bytecode-io($identity);       # default: $*REPO

my $io = bytecode-io($identity, ".");  # as if with -I.

Returns an IO::Path object of the precompiled bytecode of the given identity and the currently active repository ($*REPO).

It is also possible to override the repository (chain) by specifying a second argument, this can be an object of type:

Attempts to create the bytecode file if there isn't one yet.

Returns Nil if the given identity could not be found, or there is no bytecode file for the short-name of the given identity (probably because it failed to compile).

compunit

my $compunit = compunit($identity);         # default: $*REPO

my $compunit = compunit($identity, ".");    # as if with -I.

my $compunit = compunit($identity, :need);  # make bytecode

Returns a Compunit object for the given identity and the currently active repository ($*REPO).

It is also possible to override the repository (chain) by specifying a second argument, this can be an object of type:

A boolean named argument need can be specified to indicate that a bytecode file should be created if there is none for this compunit yet.

Returns Nil if the given identity could not be found.

dependency-specification

my $spec = dependency-specification($identity);

Creates a CompUnit::DependencySpecification object for the given identity.

ecosystem

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say ecosystem($identity); # zef

Returns the ecosystem part of the auth field of the given identity, or Nil if no auth field could be found.

from

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>:from<Perl5>";
say from($identity);  # Perl5

Returns the from field of the given identity as a Str, or Nil if no from field could be found.

is-pinned

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say is-pinned($identity);   # True
say is-pinned("Foo::Bar");  # False

Returns a boolean indicating whether the given identity is considered to be pinned to a specific release. This implies: having an auth and having a version without a + or a * in it.

is-short-name

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say is-short-name($identity);   # False
say is-short-name("Foo::Bar");  # True

Returns a boolean indicating whether the given identity consists of just a short-name.

meta

my $meta = meta($identity);       # default: $*REPO

my $meta = meta($identity, ".");  # as if with -I.

Returns a hash with the meta information of the given identity and the currently active repository ($*REPO) as typically found in the META6.json file of a distribution.

It is also possible to override the repository (chain) by specifying a second argument, this can be an object of type:

Returns Nil if the given identity could not be found.

nick

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say nick($identity); # lizmat

Returns the nickname part of the auth field of the given identity, or Nil if no auth field could be found.

sanitize

my $identity = "Foo::Bar:auth<zef:lizmat>:ver<0.0.42>:api<2.0>";
say sanitize($identity);  # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>

Returns a version of the given identity in which any ver, auth and api fields are put in the correct order.

short-name

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say short-name($identity);  # Foo::Bar

Returns the short name part of the given identity, or the identity itself if no ver, auth or api fields could be found.

source

say source($identity);       # default: $*REPO

say source($identity, ".");  # as if with -I.

Returns the source-code of the given identity and the currently active repository ($*REPO) as typically found in the lib directory of a distribution.

It is also possible to override the repository (chain) by specifying a second argument, this can be an object of type:

Returns Nil if the given identity could not be found, or there is no source-file for the short-name of the given identity.

source-io

my $io = source-io($identity);       # default: $*REPO

my $io = source-io($identity, ".");  # as if with -I.

Returns an IO::Path object of the source of the given identity and the currently active repository ($*REPO) as typically found in the lib directory of a distribution.

It is also possible to override the repository (chain) by specifying a second argument, this can be an object of type:

Returns Nil if the given identity could not be found, or there is no source-file for the short-name of the given identity.

ver

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say ver($identity);  # 0.0.42

Returns the ver field of the given identity as a Str, or Nil if no ver field could be found.

version

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say version($identity);  # v0.0.42

Returns the ver field of the given identity as a Version object, or Nil if no ver field could be found.

without-api

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say without-api($identity);  # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>

Returns the identity without any api field of the given identity.

without-auth

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say without-auth($identity);  # Foo::Bar:ver<0.0.42>:api<2.0>

Returns the identity without any auth field of the given identity.

without-from

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:from<Perl5>";
say without-from($identity);  # Foo::Bar:ver<0.0.42>:auth<zef:lizmat>

Returns the identity without any from field of the given identity.

without-ver

my $identity = "Foo::Bar:ver<0.0.42>:auth<zef:lizmat>:api<2.0>";
say without-ver($identity);  # Foo::Bar:auth<zef:lizmat>:api<2.0>

Returns the identity without any ver field of the given identity.

AUTHOR

Elizabeth Mattijsen liz@raku.rocks

Source can be located at: https://github.com/lizmat/Identity-Utils . 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 2022, 2024, 2025 Elizabeth Mattijsen

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.