Name
WWW::PGXN - Interface to PGXN mirrors and the PGXN API
Synopsis
my $pgxn = WWW::PGXN->new( url => 'https://api.pgxn.org/' );
my $dist = $pgxn->get_distribution('pgTAP');
$dist->download_to('.');
Description
This module provide a simple Perl interface over the the PGXN API. It also works with any PGXN mirror server. It provides an interface for finding distributions, extensions, users, and tags, as well as for accessing documentation, lists of users, and the full-text search interface. WWW::PGXN is designed to make it dead simple for applications such as web apps and command-line clients to get the data they need from a PGXN mirror with a minimum of hassle, including via the file system, if there is a local mirror.
PGXN is a CPAN-inspired network for distributing extensions for the PostgreSQL RDBMS. All of the infrastructure tools, however, have been designed to be used to create networks for distributing any kind of release distributions and for providing a lightweight static file JSON REST API. As such, WWW::PGXN should work with any mirror that gets its data from a PGXN::Manager-managed master server, and with any PGXN::API-powered server.
Interface
Constructor
new
my $pgxn = WWW::PGXN->new(url => 'https://api.pgxn.org/');
Construct a new WWW::PGXN object. The only required attribute is url
. The supported parameters are:
url
-
The base URL for the API server or mirror the client should fetch from. Required.
proxy
-
URL of a proxy server to use. Ignored if
url
is afile:
URL.
Instance Accessors
url
my $url = $pgxn->url;
$pgxn->url($url);
Get or set the URL for the PGXN mirror or API server. May be a file:
URL, in which case the API will be accessed purely via the file system. Otherwise it uses HTTP::Tiny to access the API.
proxy
my $proxy = $pgxn->proxy;
$pgxn->proxy($proxy);
Get or set the URL for a proxy server to use. Ignored if url
is a file:
URL.
Instance Methods
get_distribution
my $dist = $pgxn->get_distribution($dist_name, $version);
Finds the data for a distribution. Returns a WWW::PGXN::Distribution object. The first argument, the name of the distribution, is required. The second argument, the version, is optional. If not present, the current stable release will be retrieved.
If the distribution cannot be found, undef
will be returned. For any other errors, an exception will be thrown.
get_extension
my $extension = $pgxn->get_extension($extension_name);
Finds the data for the named extension. Returns a WWW::PGXN::Extension object. If the extension cannot be found, undef
will be returned. For any other errors, an exception will be thrown.
get_user
my $user = $pgxn->get_user($user_name);
Finds the data for the named user. Returns a WWW::PGXN::User object. If the user cannot be found, undef
will be returned. For any other errors, an exception will be thrown.
get_tag
my $tag = $pgxn->get_tag($tag_name);
Finds the data for the named tag. Returns a WWW::PGXN::Tag object. If the tag cannot be found, undef
will be returned. For any other errors, an exception will be thrown.
get_stats
my $stats = $pgxn->get_stats($stats_name);
Returns the contents of a stats file. The current stats names are:
summary
dist
extension
user
tag
get_userlist
my $userlist = $pgxn->get_userlist('t');
Returns a the contents of a user list, which contains data on all users whose nickname starts with the specified lowercase ASCII letter. If called against a mirror, this method always returns undef
. When called against an API, it will always return an array of users. If there is no user list file for the specified letter, the array will be empty. Otherwise, it will contain a list of hash references with two keys:
user
The user's nickname.
name
The user's full name.
mirrors
my @mirrors = $pgxn->mirrors;
Returns a list of WWW::PGXN::Mirror objects representing all of the mirrors in the network to which the PGXN API or mirror server belongs.
spec
my $spec = $pgxn->spec;
my $html = $pgxn->spec('html');
Returns the contents of the PGXN Meta Spec document. By default, this is a text document. But you can get an HTML version by passing HTML
as the argument. Pass txt
to be specific about wanting the text document.
search
my $results = $pgxn->search( query => 'tap' );
$results = $pgxn->search( query => 'wicked', index => 'dists' );
Sends a search query to the API server (not supported for mirrors). For an API server accessed via a file:
URL, PGXN::API::Searcher is required and used to fetch the results directly. Otherwise, an HTTP request is sent to the server as usual.
The supported parameters are:
- query
-
The search query. See Lucy::Search::QueryParser for the supported syntax of the query. Required.
- index
-
The name of the search index to query. The default is "docs". The possible values are:
- docs
- dists
- extensions
- users
- offset
-
How many hits to skip before showing results. Defaults to 0.
- limit
-
Maximum number of hits to return. Defaults to 50 and may not be greater than 1024.
Currently the return value is a hash composed directly from the JSON returned by the search request. See PGXN::API::Searcher for details on its structure.
meta_url_for
my $meta_url = $pgxn->meta_url_for($dist_name, $dist_version);
Returns the URL for a distribution meta file. This is the file fetched by get_distribution()
.
download_url_for
my $download_url = $pgxn->download_url_for($dist_name, $dist_version);
Returns the download URL for a distribution and version. This is the zipped archive file containing the distribution itself.
source_url_for
my $source_url = $pgxn->source_url_for($dist_name, $dist_version);
Returns the URL for a distribution source file. This URL is available only from an API server, not a mirror.
html_doc_url_for
my $doc_url = $pgxn->html_doc_url_for($dist_name, $dist_version, $doc_path);
Returns the URL for a distribution documentation file. This URL is available only from an API server, not a mirror.
extension_url_for
my $extension_url = $pgxn->extension_url_for($extension_name);
Returns the URL for an extension metadata file. This is the file fetched by get_extension()
.
user_url_for
my $user_url = $pgxn->user_url_for($nickname);
Returns the URL for an user metadata file. This is the file fetched by get_user()
.
tag_url_for
my $tag_url = $pgxn->tag_url_for($tag_name);
Returns the URL for an tag metadata file. This is the file fetched by get_tag()
.
meta_path_for
my $meta_path = $pgxn->meta_path_for($dist_name, $dist_version);
Returns the path for a distribution meta file.
download_path_for
my $download_path = $pgxn->download_path_for($dist_name, $dist_version);
Returns the download path for a distribution and version.
source_path_for
my $source_path = $pgxn->source_path_for($dist_name, $dist_version);
Returns the path for a distribution source file. This path is available only from an API server, not a mirror.
html_doc_path_for
my $doc_path = $pgxn->html_doc_path_for($dist_name, $dist_version, $doc_path);
Returns the PATH for a distribution documentation file. This PATH is available only from an API server, not a mirror.
extension_path_for
my $extension_path = $pgxn->extension_path_for($extension_name);
Returns the path for an extension metadata file.
user_path_for
my $user_path = $pgxn->user_path_for($nickname);
Returns the path for an user metadata file.
tag_path_for
my $tag_path = $pgxn->tag_path_for($tag_name);
Returns the path for an tag metadata file.
See Also
-
The PostgreSQL Extension Network, the reference implementation of the PGXN infrastructure.
-
Creates and serves a PGXN API implementation from a PGXN mirror.
-
Comprehensive documentation of the REST API provided by PGXN::API and consumed by WWW::PGXN.
-
Server for managing a master PGXN mirror and allowing users to upload distributions to it.
Support
This module is stored in a public GitHub repository. Feel free to fork and contribute! Please file bug reports via GitHub Issues
Author
David E. Wheeler <david@justatheory.com>
Copyright and License
Copyright (c) 2011-2024 David E. Wheeler. Some Rights Reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.