App-ModuleFeaturesUtils
view release on metacpan or search on metacpan
lib/App/ModuleFeaturesUtils.pm view on Meta::CPAN
my %args = @_;
my $decl;
if (defined(my $mod = $args{module})) {
$decl = Module::FeaturesUtil::Get::get_features_decl($mod, 'load');
} else {
$decl = $args{features_decl_data};
}
Module::FeaturesUtil::Check::check_features_decl($decl);
}
$SPEC{check_module_features} = {
v => 1.1,
summary => 'Check %FEATURES in a module and return the value of specified feature',
args => {
%argspecreq0_module,
%argspec1_feature_name,
},
examples => [
{
summary => 'Check all features declared in a module',
args => {module=>'Text::Table::Sprintf'},
},
{
summary => 'Check a single feature declared in a module',
args => {module=>'Text::Table::Sprintf', feature_name=>'speed'},
},
],
};
sub check_module_features {
require Module::FeaturesUtil::Check;
require Module::FeaturesUtil::Get;
my %args = @_;
my $fname = $args{feature_name};
my $mod = $args{module};
my $features_decl = Module::FeaturesUtil::Get::get_features_decl($mod, 'load');;
my $res = Module::FeaturesUtil::Check::check_features_decl($features_decl);
return $res unless $res->[0] == 200;
return [200, "No features"] unless $features_decl->{features};
if (defined $fname) {
my @fsetnames = sort keys %{ $features_decl->{features} };
return [412, "There are no feature sets declared by $mod"]
unless @fsetnames;
my $fsetname;
if ($fname =~ m!(.+)(/|::)(.+)!) {
$fsetname = $1;
$fname = $3;
$fsetname =~ s!/!::!g;
} else {
return [400, "Please prefix feature name with feature set name (e.g. $fsetnames[0]/foo), there are more than one feature sets: ".join(", ", @fsetnames)]
unless @fsetnames == 1;
$fsetname = $fsetnames[0];
}
my $set_features = $features_decl->{features}{$fsetname}
or return [404, "No such feature set name declared: $fsetname"];
[200, "OK", $set_features->{$fname}];
} else {
[200, "OK", $features_decl->{features}];
}
}
$SPEC{compare_module_features} = {
v => 1.1,
summary => 'Return a table data comparing features from several modules',
args => {
modules => {
'x.name.is_plural' => 1,
'x.name.singular' => 'module',
schema => ['array*', of=>'perl::modname*'],
req => 1,
pos => 0,
slurpy => 1,
},
},
examples => [
{
summary => 'Compare features of two modules',
args => {modules=>[qw/Text::ANSITable Text::Table::More/]},
},
],
};
sub compare_module_features {
require Module::FeaturesUtil::Get;
my %args = @_;
my $modules = $args{modules};
my $fsetname = $args{feature_name};
my %features_decls; # key = module name
my %fsetspecs; # key = fsetname
my @modules;
my %fsetnames;
my %seen_modules;
for my $module (@$modules) {
if ($seen_modules{$module}++) {
log_error "Module $module is specified more than once, ignoring";
next;
} else {
log_trace "Loading module %s ...", $module;
}
push @modules, $module;
my $features_decl = Module::FeaturesUtil::Get::get_features_decl($module, 'load', 'fatal');
#use DD; dd $features_decl;
for my $fsetname (sort keys %{ $features_decl->{features} }) {
unless ($fsetnames{$fsetname}++) {
$fsetspecs{$fsetname} = Module::FeaturesUtil::Get::get_feature_set_spec($fsetname, 'load', 'fatal');
}
}
$features_decls{$module} = $features_decl;
}
my @fsetnames = sort keys %fsetnames;
log_trace "Feature set names: %s", \@fsetnames;
my @rows;
for my $fsetname (@fsetnames) {
( run in 1.405 second using v1.01-cache-2.11-cpan-39bf76dae61 )