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 )