Gentoo-Overlay-Group
view release on metacpan or search on metacpan
.mailmap
.perltidyrc
.travis.yml
Changes
LICENSE
MANIFEST
META.json
META.yml
Makefile.PL
README
corpus/overlay_2/fake-category/keepdir
corpus/overlay_2/metadata/keepdir
corpus/overlay_2/profiles/repo_name
corpus/overlay_4/fake-category-2/keepdir
corpus/overlay_4/fake-category/keepdir
corpus/overlay_4/metadata/keepdir
corpus/overlay_4/profiles/categories
corpus/overlay_4/profiles/repo_name
corpus/overlay_5/fake-category-2/keepdir
corpus/overlay_5/fake-category/keepdir
corpus/overlay_5/metadata/keepdir
corpus/overlay_5/profiles/categories
corpus/overlay_5/profiles/repo_name
dist.ini
dist.ini.meta
lib/Gentoo/Overlay/Group.pm
maint/perlcritic.rc.gen.pl
misc/Changes.deps
misc/Changes.deps.all
misc/Changes.deps.dev
misc/Changes.deps.opt
misc/built_with.json
misc/perlcritic.deps
corpus/overlay_2/profiles/repo_name view on Meta::CPAN
overlay_2
corpus/overlay_4/profiles/repo_name view on Meta::CPAN
overlay_4
corpus/overlay_5/profiles/repo_name view on Meta::CPAN
overlay_5
lib/Gentoo/Overlay/Group.pm view on Meta::CPAN
has '_overlays' => (
ro, lazy,
isa => HashRef [Gentoo__Overlay_Overlay],
default => sub { return {} },
handles_via => 'Hash',
handles => {
_has_overlay => exists =>,
overlay_names => keys =>,
overlays => elements =>,
get_overlay => get =>,
_set_overlay => set =>,
},
);
my $_str = Str();
lib/Gentoo/Overlay/Group.pm view on Meta::CPAN
}
sub add_overlay {
my ( $self, @args ) = @_;
if ( 1 == @args and blessed $args[0] ) {
goto $self->can('_add_overlay_object');
}
if ( $_str->check( $args[0] ) ) {
goto $self->can('_add_overlay_string_path');
}
return exception(
ident => 'bad overlay type',
message => <<'EOF',
Unrecognised parameter types passed to add_overlay.
Expected: \n%{signatures}s.
Got: [%{type}s]}.
EOF
payload => {
signatures => ( join q{}, map { qq{ \$group->add_overlay( $_ );\n} } qw( Str Path::Tiny Gentoo::Overlay ) ),
type => ( join q{,}, map { _type_print } @args ),
},
);
}
sub iterate {
my ( $self, $what, $callback ) = @_; ## no critic (Variables::ProhibitUnusedVarsStricter)
my %method_map = (
ebuilds => _iterate_ebuilds =>,
categories => _iterate_categories =>,
packages => _iterate_packages =>,
overlays => _iterate_overlays =>,
);
if ( exists $method_map{$what} ) {
goto $self->can( $method_map{$what} );
}
return exception(
ident => 'bad iteration method',
message => 'The iteration method %{what_method}s is not a known way to iterate.',
payload => { what_method => $what, },
);
}
lib/Gentoo/Overlay/Group.pm view on Meta::CPAN
$self->_iterate_packages( packages => $real_callback );
return;
}
# categories = { /overlays/categories
sub _iterate_categories {
my ( $self, undef, $callback ) = @_;
my $real_callback = sub {
my (%overlay_config) = %{ $_[1] };
my $inner_callback = sub {
my (%category_config) = %{ $_[1] };
$self->$callback( { ( %overlay_config, %category_config ) } );
};
$overlay_config{overlay}->_iterate_categories( categories => $inner_callback );
};
$self->_iterate_overlays( overlays => $real_callback );
return;
}
sub _iterate_packages {
lib/Gentoo/Overlay/Group.pm view on Meta::CPAN
$self->_iterate_categories( categories => $real_callback );
return;
}
# overlays = { /overlays }
sub _iterate_overlays {
my ( $self, undef, $callback ) = @_;
my %overlays = $self->overlays;
my $num_overlays = scalar keys %overlays;
my $last_overlay = $num_overlays - 1;
my $offset = 0;
for my $overlay_name ( sort keys %overlays ) {
local $_ = $overlays{$overlay_name};
$self->$callback(
{
overlay_name => $overlay_name,
overlay => $overlays{$overlay_name},
num_overlays => $num_overlays,
last_overlay => $last_overlay,
overlay_num => $offset,
}
);
$offset++;
}
return;
}
my $_gentoo_overlay = Gentoo__Overlay_Overlay();
my $_path_class_dir = Dir();
# This would be better in M:M:TypeCoercion
sub _add_overlay_object {
my ( $self, $overlay, @rest ) = @_;
if ( $_gentoo_overlay->check($overlay) ) {
goto $self->can('_add_overlay_gentoo_object');
}
if ( $_path_class_dir->check($overlay) ) {
goto $self->can('_add_overlay_path_class');
}
return exception(
ident => 'bad overlay object type',
message => <<'EOF',
Unrecognised parameter object types passed to add_overlay.
Expected: \n%{signatures}s.
Got: [%{type}s]}.
EOF
payload => {
signatures => ( join q{}, map { qq{ \$group->add_overlay( $_ );\n} } qw( Str Path::Tiny Gentoo::Overlay ) ),
type => ( join q{,}, blessed $overlay, map { _type_print } @rest ),
},
);
}
sub _add_overlay_gentoo_object {
my ( $self, $overlay, ) = @_;
$_gentoo_overlay->assert_valid($overlay);
if ( $self->_has_overlay( $overlay->name ) ) {
return exception(
ident => 'overlay exists',
message => 'The overlay named %{overlay_name}s is already added to this group.',
payload => { overlay_name => $overlay->name },
);
}
$self->_set_overlay( $overlay->name, $overlay );
return;
}
sub _add_overlay_path_class { ## no critic ( RequireArgUnpacking )
my ( $self, $path, ) = @_;
$_path_class_dir->assert_valid($path);
my $go = Gentoo::Overlay->new( path => $path, );
@_ = ( $self, $go );
goto $self->can('_add_overlay_gentoo_object');
}
sub _add_overlay_string_path { ## no critic ( RequireArgUnpacking )
my ( $self, $path_str, ) = @_;
$_str->assert_valid($path_str);
my $path = $_path_class_dir->coerce($path_str);
@_ = ( $self, $path );
goto $self->can('_add_overlay_path_class');
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Gentoo::Overlay::Group - A collection of Gentoo::Overlay objects.
=head1 VERSION
version 1.000001
=head1 SYNOPSIS
This is a wrapper around L<< C<Gentoo::Overlay>|Gentoo::Overlay >> that makes it easier to perform actions on a group of overlays.
my $group = Gentoo::Overlay::Group->new();
$group->add_overlay('/usr/portage');
$group->add_overlay('/usr/local/portage/');
$group->iterate( packages => sub {
my ( $self, $context ) = @_;
# Traverse-Order:
# ::gentoo
# category_a
# package_a
# package_b
# category_b
# package_a
# package_b
lib/Gentoo/Overlay/Group.pm view on Meta::CPAN
# category_a
# package_a
# package_b
# category_b
# package_a
# package_b
});
=head1 METHODS
=head2 add_overlay
$object->add_overlay( '/path/to/overlay' );
$object->add_overlay( Path::Tiny::path( '/path/to/overlay' ) );
$object->add_overlay( Gentoo::Overlay->new( path => '/path/to/overlay' ) );
=head2 iterate
$object->iterate( ebuilds => sub {
});
=head1 ATTRIBUTE ACCESSORS
=head2 overlay_names
my @names = $object->overlay_names
=head2 overlays
my @overlays = $object->overlays;
=head2 get_overlay
my $overlay = $object->get_overlay('gentoo');
=head1 PRIVATE ATTRIBUTES
=head2 _overlays
isa => HashRef[ Gentoo__Overlay_Overlay ], ro, lazy
=head1 PRIVATE ATTRIBUTE ACCESSORS
=head2 _has_overlay
if( $object->_has_overlay('gentoo') ){
Carp::croak('waah');
}
=head2 _set_overlay
$object->_set_overlay( 'gentoo' => $overlay_object );
=head1 PRIVATE FUNCTIONS
=head2 _type_print
Lightweight flat dumper optimized for displaying user parameters in a format similar to a method signature.
printf '[%s]', join q{,} , map { _type_print } @array
=head1 PRIVATE METHODS
lib/Gentoo/Overlay/Group.pm view on Meta::CPAN
$object->_iterate_ebuilds( ignored => sub { } );
=head2 _iterate_categories
$object->_iterate_categories( ignored => sub { } );
=head2 _iterate_packages
$object->_iterate_packages( ignored => sub { } );
=head2 _iterate_overlays
$object->_iterate_overlays( ignored => sub { } );
=head2 _add_overlay_object
$groupobject->_add_overlay_object( $object );
=head2 _add_overlay_gentoo_object
$groupobject->_add_overlay_gentoo_object( $gentoo_object );
=head2 _add_overlay_path_class
$groupobject->_add_overlay_path_class( $path_class_object );
=head2 _add_overlay_string_path
$groupobject->_add_overlay_string_path( $path_string );
=head1 AUTHOR
Kent Fredric <kentnl@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2017 by Kent Fredric <kentnl@cpan.org>.
This is free software; you can redistribute it and/or modify it under
exception {
$g = Gentoo::Overlay::Group->new();
},
undef,
'Can initialize a group empty'
);
is(
exception {
$g = Gentoo::Overlay::Group->new();
$g->add_overlay("$base/overlay_2");
},
undef,
"Loading an overlay from a string path should work"
);
is(
exception {
$g = Gentoo::Overlay::Group->new();
require Path::Tiny;
$g->add_overlay( Path::Tiny::path("$base/overlay_2") );
},
undef,
"Loading an overlay from a Path::Tiny path should work"
);
is(
exception {
$g = Gentoo::Overlay::Group->new();
my $i = Gentoo::Overlay->new( path => "$base/overlay_2" );
$g->add_overlay($i);
},
undef,
"Loading an overlay from a Gentoo::Overlay should work"
);
need_fail_ident(
exception {
$g = Gentoo::Overlay::Group->new();
my $i = Gentoo::Overlay->new( path => "$base/overlay_2" );
$g->add_overlay($i);
$g->add_overlay($i);
},
'Shouldn\'t be able to add the same overlay multiple times',
'overlay exists',
);
is(
exception {
$g = Gentoo::Overlay::Group->new();
my $i = Gentoo::Overlay->new( path => "$base/overlay_2" );
$g->add_overlay($i);
$g->add_overlay("$base/overlay_4");
$g->add_overlay("$base/overlay_5");
},
undef,
'Should be able to add multiple overlays',
);
need_fail_ident(
exception {
$g = Gentoo::Overlay::Group->new();
$g->add_overlay(undef);
},
'Unrecognised input types should be rejected',
'bad overlay type',
);
need_fail_ident(
exception {
$g = Gentoo::Overlay::Group->new();
$g->add_overlay( Gentoo::Overlay::Group->new() );
},
'Unrecognised input types should be rejected',
'bad overlay object type',
);
need_fail_ident(
exception {
$g = Gentoo::Overlay::Group->new();
my $i = Gentoo::Overlay->new( path => "$base/overlay_2" );
$g->add_overlay($i);
$g->iterate( foo => sub { } );
},
'Bad iteration types should bail',
'bad iteration method'
);
done_testing;
t/iterate.t view on Meta::CPAN
use FindBin;
my $base = "$FindBin::Bin/../corpus";
use Gentoo::Overlay::Group;
my $its = 0;
sub fast_group {
my $x = Gentoo::Overlay::Group->new();
$x->add_overlay("$base/overlay_4");
$x->add_overlay("$base/overlay_5");
return $x;
}
fast_group()->iterate(
'categories' => sub {
my ( $self, $config ) = @_;
$its++;
}
);
is( $its, 4, 'Iterator iterates twice per overlay' );
my $pits = 0;
fast_group()->iterate(
'packages' => sub {
my ( $self, $config ) = @_;
$pits++;
}
);
( run in 0.327 second using v1.01-cache-2.11-cpan-49f99fa48dc )