App-GHGen

 view release on metacpan or  search on metacpan

lib/App/GHGen/PerlCustomizer.pm  view on Meta::CPAN


use Path::Tiny;

use Exporter 'import';
our @EXPORT_OK = qw(
	detect_perl_requirements
	generate_custom_perl_workflow
);

our $VERSION = '0.06';

=encoding utf-8

=head1 NAME

App::GHGen::PerlCustomizer - Customize Perl workflows based on project requirements

=head1 SYNOPSIS

	use App::GHGen::PerlCustomizer qw(detect_perl_requirements);

	my $requirements = detect_perl_requirements();
	# Returns: { min_version => '5.036', has_cpanfile => 1, ... }

=head1 FUNCTIONS

=head2 detect_perl_requirements()

Detect Perl version requirements and dependency-file presence in the current directory.

=head3 Purpose

Inspect the current working directory for common Perl distribution files
(C<cpanfile>, C<Makefile.PL>, C<dist.ini>, C<Build.PL>) and extract the
minimum Perl version declared in any of them.

=head3 Arguments

None.

=head3 Returns

A hash reference with the following keys, all of which are always present:

    {
        min_version    => Str | undef,  # e.g. '5.036'; undef when undetected
        has_cpanfile   => Bool,
        has_makefile_pl => Bool,
        has_dist_ini   => Bool,
        has_build_pl   => Bool,
    }

=head3 Side Effects

Reads files from the current working directory.

=head3 Usage Example

    use App::GHGen::PerlCustomizer qw(detect_perl_requirements);
    my $reqs = detect_perl_requirements();
    say $reqs->{min_version} // 'not specified';

=head3 API SPECIFICATION

=head4 Input

    # No parameters.

=head4 Output

    {
        type => 'hashref',
        keys => {
            min_version     => { type => 'scalar', optional => 1 },
            has_cpanfile    => { type => 'scalar' },
            has_makefile_pl => { type => 'scalar' },
            has_dist_ini    => { type => 'scalar' },
            has_build_pl    => { type => 'scalar' },
        },
    }

=head3 FORMAL SPECIFICATION

    detect_perl_requirements : → Requirements

    Requirements ≔ {
        min_version:     ℤ* ∪ { ⊥ },
        has_cpanfile:    𝔹,
        has_makefile_pl: 𝔹,
        has_dist_ini:    𝔹,
        has_build_pl:    𝔹,
    }

    min_version ≔
        cpanfile exists ∧ version parseable from cpanfile  → version
        Makefile.PL exists ∧ MIN_PERL_VERSION parseable   → version
        otherwise                                           → ⊥

=cut

sub detect_perl_requirements() {
	my %reqs = (
		min_version => undef,
		has_cpanfile => 0,
		has_makefile_pl => 0,
		has_dist_ini => 0,
		has_build_pl => 0,
	);

	# Check for dependency files
	$reqs{has_cpanfile} = path('cpanfile')->exists;
	$reqs{has_makefile_pl} = path('Makefile.PL')->exists;
	$reqs{has_dist_ini} = path('dist.ini')->exists;
	$reqs{has_build_pl} = path('Build.PL')->exists;

	# Try to detect minimum Perl version
	if ($reqs{has_cpanfile}) {
		my $content = path('cpanfile')->slurp_utf8;
		if ($content =~ /requires\s+['"]perl['"],?\s+['"]([0-9.]+)['"]/) {
			$reqs{min_version} = $1;
		}



( run in 1.404 second using v1.01-cache-2.11-cpan-9169edd2b0e )