Fedora-App-MaintainerTools

 view release on metacpan or  search on metacpan

lib/Fedora/App/MaintainerTools/SpecData.pm  view on Meta::CPAN

# CPAN bits, etc

has conf        => (is => 'rw', isa => 'HashRef', lazy_build => 1);
has mm          => (is => 'ro', isa => 'CPAN::MetaMuncher', lazy_build => 1);
has cpanp       => (is => 'ro', isa => CPBackend, lazy_build => 1);
has module      => (is => 'ro', isa => CPModule,  lazy_build => 1);
has tarball     => (is => 'ro', lazy_build => 1, isa => File, coerce => 1);
has extract_dir => (is => 'ro', lazy_build => 1, isa => Dir, coerce => 1);

sub _build_mm      { CPAN::MetaMuncher->new(module => shift->module)     }
sub _build_cpanp   { require CPANPLUS::Backend; CPANPLUS::Backend->new   }
sub _build_module  { my $s = shift; $s->cpanp->parse_module(module => $s->dist) }
sub _build_tarball { my $s = shift; $s->module->status->fetch || $s->module->fetch }
sub _build_extract_dir
    { my $m = shift->module; $m->status->extract || $m->extract }

sub _build_conf    {

    #Config::Tiny->read('auto.ini') || Config::Tiny->new
    tie my %ini, 'Config::IniFiles', (-file=>'auto.ini');
    return \%ini;
}

#############################################################################
# generated spec data, etc

has packager  => (is => 'rw', lazy_build => 1, isa => Str);
has name      => (is => 'rw', lazy_build => 1, isa => Str);
has version   => (is => 'rw', lazy_build => 1, isa => Str);
has release   => (is => 'rw', lazy_build => 1, isa => Int);
has summary   => (is => 'rw', lazy_build => 1, isa => Str);
has source0   => (is => 'rw', lazy_build => 1, isa => Str);
has epoch     => (is => 'rw', lazy_build => 1, isa => 'Maybe[Int]');
has is_noarch => (is => 'rw', lazy_build => 1, isa => Bool);
has url       => (is => 'rw', lazy_build => 1, isa => Uri, coerce => 1);
has license   => (is => 'rw', lazy_build => 1, isa => Str);

has description => (is => 'rw', isa => Str, lazy_build => 1);

for (qw{ prep build install check clean files }) {

    has "_$_" => (
        traits => ['Array'],
        is => 'rw', isa => 'ArrayRef[Str]', lazy_build => 1,
        handles => { $_ => 'elements', "has_$_" => 'count' },
    );
}

has _docfiles => (
    traits => ['Array'], is => 'rw', lazy_build => 1, isa => 'ArrayRef[Str]',
    handles => {
        docfiles           => 'elements',
        has_docfiles       => 'count',
        no_docfiles        => 'is_empty',
        docfiles_as_string => [ join => "\n" ],
    },
);

has _changelog => (
    traits => [ 'MooseX::AttributeHelpers::Trait::Collection::Array' ],
    is => 'ro', isa => 'ArrayRef[Str]', lazy_build => 1,

    provides => {
        empty    => 'has_changelog',
        push     => 'add_changelog',
        unshift  => 'prepend_changelog',
        elements => 'changelog',
    },
);

has _build_requires => (
    traits => [ 'MooseX::AttributeHelpers::Trait::Collection::Hash' ],
    is => 'ro', isa => 'HashRef', lazy_build => 1,

    provides => {
        'empty'  => 'has_build_requires',
        'exists' => 'has_build_require',
        'get'    => 'build_require_version',
        'set'    => 'build_require_this',
        'count'  => 'num_build_requires',
        'keys'   => 'build_requires',
        'delete' => 'remove_build_require_on',
        'kv'     => 'build_require_pairs',
    },
);

has _requires => (
    traits => [ 'MooseX::AttributeHelpers::Trait::Collection::Hash' ],
    is => 'ro', isa => 'HashRef', lazy_build => 1,

    provides => {
        'empty'  => 'has_requires',
        'exists' => 'has_require',
        'get'    => 'require_version',
        'count'  => 'num_requires',
        'keys'   => 'requires',
        'set'    => 'require_this',
        'kv'     => 'require_pairs',
    },
);

has _additional_deps => (
    traits => [ 'Array' ],
    is => 'ro', isa => 'ArrayRef[Str]', lazy_build => 1,

    handles => {
        has_additional_deps => 'count',
        no_additional_deps  => 'is_empty',
        additional_deps     => 'elements',

        additional_deps_as_string => [ join => "\n" ],
    },
);

#############################################################################
# attribute builder methods

sub _build_packager { chomp(my $p = `rpm --eval '%packager'`); $p }
sub _build_release  { 1 }
sub _build_epoch    { undef }
sub _build_url      { 'http://search.cpan.org/dist/' . shift->dist }

sub _build_source0  {
    my $self = shift @_;

    return 'http://search.cpan.org/CPAN/'
        . $self->module->path . q{/}
        . $self->dist . '-%{version}.'
        . $self->module->package_extension
        ;
}

sub _build_is_noarch {
    my $self = shift @_;

    my $files = $self->module->status->files;
    return do { first { /\.(c|xs)$/i } @$files } ? 0 : 1;
}

sub _build_license { warn 'not implemented!'; 'CHECK(GPL+ or Artistic)' }

sub _build_summary         { die 'not implemented' }
sub _build__changelog      { die 'not implemented' }
sub _build__build_requires { die 'not implemented!' }
sub _build__requires       { die 'not implemented!' }

# an empty arrayref, just so "has_foo" works properly.
sub _build__prep    { [] }
sub _build__build   { [] }
sub _build__install { [] }
sub _build__check   { [] }
sub _build__clean   { [] }
sub _build__files   { [] }

sub _build__docfiles {
    my $self = shift @_;

    #my $dir = $self->extract_dir;

    my @docfiles =
        grep { /(README|Change(s|log)|LICENSE|Copyright|ex|examples|doc(s))$/i }
        map { basename $_ }
        @{ $self->module->status->files }
        ;

    return \@docfiles;
}

sub _build__additional_deps {
    my $self = shift @_;

    # check for a helper script.  if it exists, and is executable, then run it
    # and store the output for later use.  Note we pass the directory where
    # things were exploded.

    my $script = 'find_optional_deps';

    if (-f $script && -x _) {

        my $dir = $self->extract_dir;
        my $count = my @lines = `./$script $dir`;

        $self->add_changelog("- additional deps script run; $count deps found");

        @lines = map { chomp; $_ } @lines;
        return \@lines;
    }

    return [];
}

#############################################################################
# Additional helper bits (not quite spec generation, etc)

# _suspect_requires is a list of requires that are often included as a
# "requires" (especially in older EU::MM based Makefile.PL's) but in reality
# are only needed during testing.

has _suspect_requires => (
    traits => [ 'Hash' ],
    is => 'ro', isa => 'HashRef', lazy_build => 1,

    handles => {
        suspect_requires     => 'elements',
        has_suspect_requires => 'count',
        no_suspect_requires  => 'is_empty',
        is_suspect_require   => 'exists',
    },
);

sub _build__suspect_requires {
    my $self = shift @_;

    return {
        # "build" modules
        'perl(ExtUtils::MakeMaker)' => 1,

        # testing modules
        'perl(Test::Exception)' => 1,
        'perl(Test::More)'      => 1,
        'perl(Test::Simple)'    => 1,
        'perl(Test::Pod)'       => 1,
        #'perl(Test::)' => 1,
    };
}

# A list of macros we should include before the initial %description

has _macros => (
    traits => [ 'Array' ],
    is => 'ro', isa => 'ArrayRef', lazy_build => 1,

    handles => {
        macros => 'elements',
        has_macros => 'count',
        no_macros => 'is_empty',
        macros_as_string => [ join => "\n" ],
    },
);

# FIXME TODO this entire section needs to be done in tt2
sub _build__macros {
    my $self = shift @_;

    # Bad! FIXME
    my $excludes = $self->mm->_meta->[0]->{no_index};

    my $default = [
        '%{?perl_default_filter}',
        '%{?perl_default_subpackage_tests}',
    ];

    return $default unless $excludes;

    my $libdir = $self->is_noarch ? '%{perl_vendorlib}' : '%{perl_vendorlib}';

    my @by_dir =
        map  { "%filter_provides_in $_" }
        map  { s!^lib/!!; "$libdir/$_"  }
        grep { /^lib/                   }
        @{$excludes->{directory}}
        ;
    my @by_pkg =
        map { "%filter_from_provides /^perl($_)/d" }
        @{$excludes->{package}}
        ;

    return $default unless @by_dir > 0 || @by_pkg > 0;

    my @lines = ('%{?perl_default_filter:');
    push @lines, @by_dir, @by_pkg,
        '%perl_default_filter',
        '}',
        '%{?perl_default_subpackage_tests}',
        ;

    return \@lines;
}

#############################################################################
# template bits

# aka, what we use to generate the spec files

has template => (is => 'rw', isa => File, coerce => 1, lazy_build => 1);
has output   => (is => 'ro', isa => Str, lazy_build => 1);

sub _build_template { 'perl/spec.tt2' }

sub _build_output {
    my $self = shift @_;



( run in 0.571 second using v1.01-cache-2.11-cpan-39bf76dae61 )