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:
* check-feature-set-spec
* check-features-decl
* check-module-features
* compare-module-features
* get-feature-set-spec
* get-features-decl
* list-feature-set-features
* list-feature-sets
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
SOURCE
Source repository is at
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
ls>
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.