PGXN-API
view release on metacpan or search on metacpan
lib/PGXN/API.pm view on Meta::CPAN
default to a directory named F<www> in the parent directory above the F<PGXN>
directory in which this module is installed. If you're running the API from a
Git checkout, that should be fine. Otherwise you should probably specify a
document root or you're you'll never be able to find it.
=item C<--errors-to>
An email address to which error emails should be sent. In the event of an
internal server error, the server will send an email to this address with
diagnostic information.
=item C<--errors-from>
An email address from which alert emails should be sent.
=back
=back
And that's it. If you're interested in the internals of PGXN::API or in
hacking on it, read on. Otherwise, just enjoy your own API server!
=head1 Interface
=head2 Constructor
=head3 C<instance>
my $app = PGXN::Manager->instance;
Returns the singleton instance of PGXN::Manager. This is the recommended way
to get the PGXN::API object.
=head2 Class Method
=head3 C<version_string>
say 'PGXN::API ', PGXN::API->version_string;
Returns a string representation of the PGXN::API version.
=cut
sub version_string {
sprintf 'v%vd', $VERSION;
}
=head2 Attributes
=head3 C<uri_templates>
my $templates = $pgxn->uri_templates;
Returns a hash reference of the URI templates for the various files stored in
the API document root. The keys are the names of the templates, and the values
are L<URI::Template> objects. Includes the additional URI templates added by
L<PGXN::API::Indexer/update_mirror_meta>.
=cut
has uri_templates => (is => 'ro', isa => 'HashRef', lazy => 1, default => sub {
my $self = shift;
my $tmpl = $self->read_json_from(
catfile $self->doc_root, 'index.json'
);
return { map { $_ => URI::Template->new($tmpl->{$_}) } keys %{ $tmpl } };
});
=head3 C<doc_root>
my $doc_root = $pgxn->doc_root;
Returns the document root for the API server. The default is the F<www>
directory in the root directory of this distribution.
=cut
my $trig = sub {
my ($self, $dir) = @_;
if (!-e $dir) {
require File::Path;
File::Path::make_path($dir);
# Copy over the index.html.
require File::Copy::Recursive;
(my $api_dir = __FILE__) =~ s{[.]pm$}{};
my $idx = catfile $api_dir, 'index.html';
File::Copy::Recursive::fcopy($idx, $dir)
or die "Cannot copy $idx to $dir: $!\n";
# Pre-generate the metadata directories.
File::Path::make_path(catdir $dir, $_)
for qw(user tag dist extension);
} elsif (!-d $dir) {
die qq{Location for document root "$dir" is not a directory\n};
}
};
has doc_root => (is => 'rw', isa => 'Str', lazy => 1, trigger => $trig, default => sub {
my $file = quotemeta catfile qw(lib PGXN API.pm);
my $blib = quotemeta catfile 'blib', '';
(my $dir = __FILE__) =~ s{(?:$blib)?$file$}{www};
$trig->(shift, $dir);
$dir;
});
=head3 C<source_dir>
my $source_dir = $pgxn->source_dir;
Returns the directory on the file system where sources should be unzipped,
which is just the F<src> subdirectory of C<doc_root>.
=cut
has source_dir => (is => 'ro', 'isa' => 'Str', lazy => 1, default => sub {
my $dir = catdir shift->doc_root, 'src';
if (!-e $dir) {
require File::Path;
File::Path::make_path($dir);
( run in 0.517 second using v1.01-cache-2.11-cpan-39bf76dae61 )