Description: |
Solution to a chatterbox FAQ: what modules required are shipped with Perl? Which are already on the system?
This cli script sits at the corner of my desk awaiting the next
time I am looking up Perl modules at search.cpan.org.
Finding the module I am interested in, I examine its directory
(like: http://search.cpan.org/~moconnor/YAML-AppConfig-0.16/ )
... there are a number of files listed, including Makefile.PL (or
Build.PL), MANIFEST, README, and ...META.yml.
I context-click on the META.yml file and click "Copy Link Location"
to put the URL pointing to the META.yml file on the system clipboard.
Then I run the snippet below to quickly get the overview of this
module's prerequisites. |
#!/usr/bin/env perl
# Last modified: 10 Oct 2006 at 12:02 PM EDT
# Author: Soren Andersen <intrepid -AT- perlmonk *dot* org>
# $Id$
use strict;
use warnings;
use YAML qw/ Load Dump LoadFile /;
use LWP::Simple;
use POSIX qw(isatty);
sub coremod { "" };
sub hr;
sub dimmer;
sub find_longest_keystring;
sub mtest;
sub testyml {
my $metayml_uri =
(shift(@_) || 'http://search.cpan.org/src/RUBYKAT/html2dbk-0.03/
+META.yml');
my $docu;
if( $docu = get $metayml_uri ) {
return $docu
}
die "Could not retrieve '$metayml_uri'. Network troubles? Bad URI?
+";
}
## And now a brief interlude of presentational trivia, not very intere
+sting
my $screenW = $ENV{COLUMNS} || 42;
my $unxterm = isatty(*STDOUT) && $^O !~/MSWin32/ ? 1 : 0;
if ($unxterm) {
require Term::ANSIColor and import Term::ANSIColor ('colored');
#print colored("Using Term::ANSIColor", 'dark white'), "\n";
} ## done with interlude, back to main show
my $metadoc = testyml (shift(@ARGV) || undef);
my $modmeta = Load( $metadoc );
if( $modmeta->{requires} ) {
my ($k,$v);
my $fmtlen;
my %reqrs = %{
my($mkl,@hash)
= find_longest_keystring($modmeta->{requires});
$fmtlen = $mkl || 28;
my $rh = {@hash};
};
if (eval "use Module::CoreList; 1" and not $@)
{
no warnings ('redefine','once');
sub coremod
{
my($pm) = @_;
my $presence_in_core = $Module::CoreList::version{$]}{$pm}
+;
return "\n" unless defined $presence_in_core;
my $pmv;
$pmv = $presence_in_core == 0 ? "without a VERSION number"
: "version $presence_in_core";
my $prn = Module::CoreList->first_release($pm);
my $note = <<" ELEPHANT";
CORE: $pm was first included in the core Perl distribution at Perl r
+elease $prn
The present Perl system shipped with $pm $pmv
ELEPHANT
return $note;
}
}
print hr;
printf <<" YODOWN"
%-${fmtlen}s %s
%s%s
YODOWN
=> ($k,($v eq '0'? 'any version':"at version $v") , mtest($k), coremo
+d($k))
while ($k,$v) = each %reqrs;
print hr;
} else # there are no prerequisite modules or pragmata listed
{ print "No requires for $modmeta->{name}\n"; }
sub mtest
{
my $installed_version;
my $wherep;
my $modname = shift();
my $modlibp = $modname;
$modlibp =~ s{ :: } {/}xg;
$modlibp .= '.pm';
my $can_req = eval "use $modname; 1;";
if ($can_req and not $@)
{
no strict 'refs';
$wherep = $INC{ $modlibp };
$installed_version = (${$modname.'::VERSION'}) || 0;
}
else
{
return colored(sprintf(
"%-32s is not installed"=> $modname) , 'cyan')
if ($unxterm);
return sprintf(
"%-32s is not installed"=> $modname)
}
if ($unxterm) {
colored(
sprintf('%-32s v%4s found as %s'
=> ($modname , $installed_version , $wherep))
, 'magenta' );
} else {
sprintf('%-32s v%-4s found as %s'
=> ($modname , $installed_version , $wherep))
}
}
sub find_longest_keystring
{
my %rethash = %{ shift() };
return () unless 1 * @{[ %rethash ]};
delete $rethash{'perl'};
my $l_maxed_at = 0;
for (keys(%rethash)) {
$l_maxed_at = length() > $l_maxed_at ? length() : $l_maxed_at
}
return ( $l_maxed_at, %rethash );
}
sub hr
{
my $decor = $unxterm
? dimmer("-" x $screenW)
: ("-" x $screenW);
$decor . "\n";
}
sub dimmer
{
colored( shift() , 'dark white' );
}
__END__
=head1 NAME
METAreqWeb
=head1 SYNOPSIS
./METAreqWeb [ <http://search.cpan.org/src/MOCONNOR/YAML-AppConfig-0
+.16/META.yml> ]
=cut
Re: METAreqWeb - overview of CPAN dist prerequisites
by grinder (Bishop) on Oct 10, 2006 at 17:29 UTC
|
Nice code, but, I hate to break it to you, but you're using the wrong web site. If you used Randy Kobes's site, you'd already have it on the page:
YAML-AppConfig @ kobes
Either that, or CPANTS lists the information as well
YAML-AppConfig @ cpants
Hmmm... you've given me an idea, some bookmarklets would come in handy for this stuff.
• another intruder with the mooring in the heart of the Perl
| [reply] |
|
On on Oct 10, 2006, grinder wrote:
Nice code, but, I hate to break it to you, but you're using the wrong web
site. If you used Randy Kobes's site, you'd already have it on the page:
YAML-AppConfig
@ kobes
Either that, or CPANTS lists the information as well
YAML-AppConfig @ cpants
Hmmm... you've given me an idea, some bookmarklets would come in handy for this stuff.
Glad I could provide some inspiration. I'd be very interested in seeing a
Bookmarklet, indeed, for CPAN module information! Very cool. ;-)
I do have to make a correction, however, for the benefit of those
that cannot read the code. Listing the modules required by a chosen CPAN
module is only 1/3 of the functionality of the solution shown above. The
other 2/3 are:
- print information on whether the prerequisite is part of the
core Perl distribution ("bundled with Perl"), and if so, when
(for what Perl release) that became true; and
- print information on the result of detecting the presence of
said modules on the user's system.
Changing websites to Kobe or CPANTS isn't going to accomplish the latter
2/3 of the functionality of the code above (nor answer the FAQ chatterbox
question, "How can I tell whether I have that module already?", that
prompted this contribution.
The latter 2 operations are fundamentally local in nature and nothing short
of a complex client-side scripting project is going to make that info
available in the http user agent (browser).
Boy, I did a good job of moderating my tone in this response and not
displaying my disappointment over receiving such a careless, clueless
comment / evaluation / feedback ... didn't I. grinder usually does
better.
Soren A / somian / perlspinr / Intrepid
--
Words can be slippery, so consider who speaks as well as
what is said;
know as much as you can about the total context of the speaker's
participation in a forum over time, before deciding that you fully
comprehend the intention behind those words. If in doubt, ask
for clarification before you 'flame'.
| [reply] |
Re: METAreqWeb - overview of CPAN dist prerequisites
by chanio (Priest) on Nov 12, 2006 at 20:13 UTC
|
Yep, very handy, Intrepid!
I was managing with a humbler self made version. This one is great!
I appreciate your putting of both versions (local and CPAN's) at the same column.
| [reply] |
|
|