App-MechaCPAN
view release on metacpan or search on metacpan
lib/App/MechaCPAN.pm view on Meta::CPAN
}
$idx++;
# Don't bother with fancy line movements if we are verbose
if ($VERBOSE)
{
print STDERR "$color$line$RESET\n";
return;
}
# We use some ANSI escape codes, so they are:
# \e[.F - Move up from current line, which is always the end of the list
# \e[K - Clear the line
# $color - Colorize the text
# $line - Print the text
# $RESET - Reset the colorize
# \e[.E - Move down from the current line, back to the end of the list
print STDERR "\e[${idx}F";
print STDERR "\e[K";
print STDERR "$color$line$RESET\n";
print STDERR "\e[" . ( $idx - 1 ) . "E"
lib/App/MechaCPAN/Install.pm view on Meta::CPAN
(?: authors/id/ )?
(?: \w / \w\w /)?
( \w{2,} )
/
( .+ )
$
]xms;
sub _escape
{
my $str = shift;
$str =~ s/ ([^A-Za-z0-9\-\._~]) / sprintf("%%%02X", ord($1)) /xmsge;
return $str;
}
my $ident_re = qr/^ \p{ID_Start} (?: :: | \p{ID_Continue} )* $/xms;
sub _src_normalize
{
lib/App/MechaCPAN/Install.pm view on Meta::CPAN
{
my $src = shift;
my $constraint = shift;
state %seen;
return $seen{$src}->{$constraint}
if exists $seen{$src}->{$constraint};
# TODO mirrors
my $dnld = 'https://fastapi.metacpan.org/download_url/' . _escape($src);
if ( defined $constraint )
{
$dnld .= '?version=' . _escape($constraint);
}
my $json_info = '';
fetch_file( $dnld => \$json_info );
my $result = JSON::PP::decode_json($json_info);
$seen{$src}->{$constraint} = $result;
return $result;
}
( run in 0.378 second using v1.01-cache-2.11-cpan-c21f80fb71c )