The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

NAME

App::ModuleFeaturesUtils - CLI Utilities related to Module::Features

VERSION

This document describes version 0.006 of App::ModuleFeaturesUtils (from Perl distribution App-ModuleFeaturesUtils), released on 2021-08-31.

DESCRIPTION

This distribution includes the following utilities:

FUNCTIONS

check_feature_set_spec

Usage:

check_feature_set_spec(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check specification in %FEATURES_DEF in Modules::Features::* module.

Examples:

  • Check %FEATURES_DEF in Module::Features::TextTable:

    check_feature_set_spec(feature_set_name => "TextTable"); # -> [200, "OK", undef, { "func.warnings" => [] }]

This function is not exported.

Arguments ('*' denotes required arguments):

  • feature_set_data => hash

  • feature_set_name => perl::modulefeatures::modname

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

check_features_decl

Usage:

check_features_decl(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check %FEATURES in a module (or given in argument).

Examples:

  • Check feature declaration (%FEATURES) in a module:

    check_features_decl(module => "Text::Table::Sprintf"); # -> [200, undef, undef, {}]

This function is not exported.

Arguments ('*' denotes required arguments):

  • features_decl_data => hash

  • module => perl::modname

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

check_module_features

Usage:

check_module_features(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check %FEATURES in a module and return the value of specified feature.

Examples:

  • Check all features declared in a module:

    check_module_features(module => "Text::Table::Sprintf");

    Result:

    [
    200,
    "OK",
    {
    TextTable => {
    can_align_cell_containing_color_code => 0,
    can_align_cell_containing_newline => 0,
    can_align_cell_containing_wide_character => 0,
    can_color => 0,
    can_color_theme => 0,
    can_colspan => 0,
    can_customize_border => 0,
    can_halign => 0,
    can_halign_individual_cell => 0,
    can_halign_individual_column => 0,
    can_halign_individual_row => 0,
    can_hpad => 0,
    can_hpad_individual_cell => 0,
    can_hpad_individual_column => 0,
    can_hpad_individual_row => 0,
    can_rowspan => 0,
    can_set_cell_height => 0,
    can_set_cell_height_of_individual_row => 0,
    can_set_cell_width => 0,
    can_set_cell_width_of_individual_column => 0,
    can_use_box_character => 0,
    can_valign => 0,
    can_valign_individual_cell => 0,
    can_valign_individual_column => 0,
    can_valign_individual_row => 0,
    can_vpad => 0,
    can_vpad_individual_cell => 0,
    can_vpad_individual_column => 0,
    can_vpad_individual_row => 0,
    speed => "fast",
    },
    },
    {},
    ]
  • Check a single feature declared in a module:

    check_module_features(module => "Text::Table::Sprintf", feature_name => "speed");

    Result:

    [200, "OK", "fast", {}]

This function is not exported.

Arguments ('*' denotes required arguments):

  • feature_name => str

    Can be unqualified:

    feature_name

    or qualified with feature set name using the :: or / separator:

    Feature::SetName::feature_name
    Feature/SetName/feature_name
  • module* => perl::modname

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

compare_module_features

Usage:

compare_module_features(%args) -> [$status_code, $reason, $payload, \%result_meta]

Return a table data comparing features from several modules.

Examples:

  • Compare features of two modules:

    compare_module_features(modules => ["Text::ANSITable", "Text::Table::More"]);

    Result:

    [
    200,
    "OK",
    [
    {
    "feature_set" => "PerlTrove",
    "feature" => "Development Status",
    "Text::ANSITable" => "5 - Production/Stable",
    "Text::Table::More" => "4 - Beta",
    },
    {
    "feature_set" => "PerlTrove",
    "feature" => "Environment",
    "Text::ANSITable" => "Console",
    "Text::Table::More" => "Console",
    },
    {
    "feature_set" => "PerlTrove",
    "feature" => "Intended Audience",
    "Text::ANSITable" => ["Developers"],
    "Text::Table::More" => ["Developers"],
    },
    {
    "feature_set" => "PerlTrove",
    "feature" => "License",
    "Text::ANSITable" => "OSI Approved :: Artistic License",
    "Text::Table::More" => "OSI Approved :: Artistic License",
    },
    {
    "feature_set" => "PerlTrove",
    "feature" => "Programming Language",
    "Text::ANSITable" => "Perl",
    "Text::Table::More" => "Perl",
    },
    {
    "feature_set" => "PerlTrove",
    "feature" => "Topic",
    "Text::ANSITable" => [
    "Software Development :: Libraries :: Perl Modules",
    "Utilities",
    ],
    "Text::Table::More" => [
    "Software Development :: Libraries :: Perl Modules",
    "Utilities",
    ],
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_align_cell_containing_color_code",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_align_cell_containing_newline",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_align_cell_containing_wide_character",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_color",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_color_theme",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_colspan",
    "Text::ANSITable" => 0,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_customize_border",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_halign",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_halign_individual_cell",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_halign_individual_column",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_halign_individual_row",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_hpad",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_hpad_individual_cell",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_hpad_individual_column",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_hpad_individual_row",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_rowspan",
    "Text::ANSITable" => 0,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_set_cell_height",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_set_cell_height_of_individual_row",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_set_cell_width",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_set_cell_width_of_individual_column",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_use_box_character",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_valign",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_valign_individual_cell",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_valign_individual_column",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_valign_individual_row",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 1,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_vpad",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_vpad_individual_cell",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_vpad_individual_column",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "can_vpad_individual_row",
    "Text::ANSITable" => 1,
    "Text::Table::More" => 0,
    },
    {
    "feature_set" => "TextTable",
    "feature" => "speed",
    "Text::ANSITable" => "slow",
    "Text::Table::More" => "slow",
    },
    ],
    {
    "table.fields" => [
    "feature_set",
    "feature",
    "Text::ANSITable",
    "Text::Table::More",
    ],
    },
    ]

This function is not exported.

Arguments ('*' denotes required arguments):

  • modules* => array[perl::modname]

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

get_feature_set_spec

Usage:

get_feature_set_spec(%args) -> [$status_code, $reason, $payload, \%result_meta]

Get feature set specification.

Examples:

  • Example #1:

    get_feature_set_spec(feature_set_name => "TextTable"); # -> [200, "OK", {}, {}]

This function is not exported.

Arguments ('*' denotes required arguments):

  • feature_set_name* => perl::modulefeatures::modname

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

get_features_decl

Usage:

get_features_decl(%args) -> [$status_code, $reason, $payload, \%result_meta]

Get features declaration.

Examples:

  • Example #1:

    get_features_decl(module => "Text::Table::Tiny");

    Result:

    [
    200,
    "OK",
    {
    "features" => {
    TextTable => {
    can_align_cell_containing_color_code => 1,
    can_align_cell_containing_newline => 0,
    can_align_cell_containing_wide_character => 0,
    can_color => 0,
    can_color_theme => 0,
    can_colspan => 0,
    can_customize_border => 1,
    can_halign => 1,
    can_halign_individual_cell => 0,
    can_halign_individual_column => 1,
    can_halign_individual_row => 0,
    can_hpad => 0,
    can_hpad_individual_cell => 0,
    can_hpad_individual_column => 0,
    can_hpad_individual_row => 0,
    can_rowspan => 0,
    can_set_cell_height => 0,
    can_set_cell_height_of_individual_row => 0,
    can_set_cell_width => 0,
    can_set_cell_width_of_individual_column => 0,
    can_use_box_character => 0,
    can_valign => 0,
    can_valign_individual_cell => 0,
    can_valign_individual_column => 0,
    can_valign_individual_row => 0,
    can_vpad => 0,
    can_vpad_individual_cell => 0,
    can_vpad_individual_column => 0,
    can_vpad_individual_row => 0,
    speed => "medium",
    },
    },
    "module_v" => 1.02,
    "x.source" => "pm:Text::Table::Tiny::_ModuleFeatures",
    },
    {},
    ]

This function is not exported.

Arguments ('*' denotes required arguments):

  • module* => perl::modname

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

list_feature_set_features

Usage:

list_feature_set_features(%args) -> [$status_code, $reason, $payload, \%result_meta]

List features in a feature set.

This function is not exported.

Arguments ('*' denotes required arguments):

  • detail => bool

    Return detailed record for each result item.

  • feature_set_name* => perl::modulefeatures::modname

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

list_feature_sets

Usage:

list_feature_sets(%args) -> [$status_code, $reason, $payload, \%result_meta]

List feature sets (in modules under Module::Features:: namespace).

Examples:

  • Example #1:

    list_feature_sets();

    Result:

    [
    200,
    "OK",
    ["Dummy", "PerlTrove", "PythonTrove", "TextTable"],
    {},
    ]
  • Show detail:

    list_feature_sets();

    Result:

    [
    200,
    "OK",
    ["Dummy", "PerlTrove", "PythonTrove", "TextTable"],
    {},
    ]

This function is not exported.

Arguments ('*' denotes required arguments):

  • detail => bool

    Return detailed record for each result item.

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/App-ModuleFeaturesUtils.

SOURCE

Source repository is at https://github.com/perlancar/perl-App-ModuleFeaturesUtils.

SEE ALSO

Module::Features

AUTHOR

perlancar <perlancar@cpan.org>

CONTRIBUTING

To contribute, you can send patches by email/via RT, or send pull requests on GitHub.

Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:

% prove -l

If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla plugin and/or Pod::Weaver::Plugin. Any additional steps required beyond that are considered a bug and can be reported to me.

COPYRIGHT AND LICENSE

This software is copyright (c) 2021 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-ModuleFeaturesUtils

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.