Initial Commit

This commit is contained in:
Riley Schneider
2025-12-03 16:38:10 +01:00
parent c5e26bf594
commit b732d8d4b5
17680 changed files with 5977495 additions and 2 deletions

View File

@@ -0,0 +1,94 @@
use 5.006; # pragmas
use strict;
use warnings;
package Test::File::ShareDir::Dist;
our $VERSION = '1.001002';
# ABSTRACT: Simplified dist oriented ShareDir tester
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
use File::ShareDir 1.00 qw();
use Test::File::ShareDir::Utils qw( extract_dashes );
sub import {
my ( undef, $arg ) = @_;
if ( not ref $arg or 'HASH' ne ref $arg ) {
require Carp;
return Carp::croak q[Must pass a hashref];
}
my %input_config = %{$arg};
require Test::File::ShareDir::Object::Dist;
my $dist_object = Test::File::ShareDir::Object::Dist->new(extract_dashes('dists', \%input_config ));
$dist_object->install_all_dists();
$dist_object->register();
return 1;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::Dist - Simplified dist oriented ShareDir tester
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
use Test::File::ShareDir::Dist {
'-root' => 'some/root/path',
'Dist-Zilla-Plugin-Foo' => 'share/DZPF',
};
C<-root> is optional, and defaults to C<cwd>
B<NOTE:> There's a bug prior to 5.18 with C<< use Foo { -key => } >>, so for backwards compatibility, make sure you either quote
the key: C<< use Foo { '-key' => } >>, or make it the non-first key.
=begin MetaPOD::JSON v1.1.0
{
"namespace":"Test::File::ShareDir::Dist",
"interface":"exporter"
}
=end MetaPOD::JSON
=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
the same terms as the Perl 5 programming language system itself.
=cut

View File

@@ -0,0 +1,94 @@
use 5.006; # pragmas
use strict;
use warnings;
package Test::File::ShareDir::Module;
our $VERSION = '1.001002';
# ABSTRACT: Simplified module oriented ShareDir tester
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
use File::ShareDir 1.00 qw();
use Test::File::ShareDir::Utils qw( extract_dashes );
sub import {
my ( undef, $arg ) = @_;
if ( not ref $arg or 'HASH' ne ref $arg ) {
require Carp;
return Carp::croak q[Must pass a hashref];
}
my %input_config = %{$arg};
require Test::File::ShareDir::Object::Module;
my $module_object = Test::File::ShareDir::Object::Module->new(extract_dashes('modules', \%input_config ));
$module_object->install_all_modules();
$module_object->register();
return 1;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::Module - Simplified module oriented ShareDir tester
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
use Test::File::ShareDir::Module {
'-root' => "some/root/path",
'Module::Foo' => "share/ModuleFoo",
};
C<-root> is optional, and defaults to C<cwd>
B<NOTE:> There's a bug prior to 5.18 with C<< use Foo { -key => } >>, so for backwards compatibility, make sure you either quote
the key: C<< use Foo { '-key' => } >>, or make it the non-first key.
=begin MetaPOD::JSON v1.1.0
{
"namespace":"Test::File::ShareDir::Module",
"interface":"exporter"
}
=end MetaPOD::JSON
=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
the same terms as the Perl 5 programming language system itself.
=cut

View File

@@ -0,0 +1,298 @@
use 5.006; # pragmas
use strict;
use warnings;
package Test::File::ShareDir::Object::Dist;
our $VERSION = '1.001002';
# ABSTRACT: Object Oriented ShareDir creation for distributions
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
use Class::Tiny {
inc => sub {
require Test::File::ShareDir::Object::Inc;
return Test::File::ShareDir::Object::Inc->new();
},
dists => sub {
return {};
},
root => sub {
require Path::Tiny;
return Path::Tiny::path(q[./])->absolute;
},
};
use Carp qw( carp );
sub __rcopy { require File::Copy::Recursive; goto \&File::Copy::Recursive::rcopy; }
sub dist_names {
my ($self) = @_;
return keys %{ $self->dists };
}
sub dist_share_target_dir {
my ( $self, $distname ) = @_;
return $self->inc->dist_tempdir->child($distname);
}
sub dist_share_source_dir {
my ( $self, $distname ) = @_;
require Path::Tiny;
return Path::Tiny::path( $self->dists->{$distname} )->absolute( $self->root );
}
sub install_dist {
my ( $self, $distname ) = @_;
my $source = $self->dist_share_source_dir($distname);
my $target = $self->dist_share_target_dir($distname);
return __rcopy( $source, $target );
}
sub install_all_dists {
my ($self) = @_;
for my $dist ( $self->dist_names ) {
$self->install_dist($dist);
}
return;
}
sub add_to_inc {
my ($self) = @_;
carp 'add_to_inc deprecated since 1.001000, use register';
return $self->register;
}
sub register {
my ($self) = @_;
$self->inc->register;
return;
}
sub clear {
my ($self) = @_;
$self->inc->clear;
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::Object::Dist - Object Oriented ShareDir creation for distributions
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
use Test::File::ShareDir::Object::Dist;
my $dir = Test::File::ShareDir::Object::Dist->new(
root => "some/path",
dists => {
"Hello-Nurse" => "share/HN"
},
);
$dir->install_all_dists;
$dir->add_to_inc;
=head1 METHODS
=head2 C<dist_names>
my @names = $instance->dist_names();
Returns the names of all distributions listed in the C<dists> set.
=head2 C<dist_share_target_dir>
my $dir = $instance->dist_share_target_dir("Dist-Name");
Returns the path where the C<ShareDir> will be created for C<Dist-Name>
=head2 C<dist_share_source_dir>
my $dir = $instance->dist_share_source_dir("Dist-Name");
Returns the path where the C<ShareDir> will be B<COPIED> I<FROM> for C<Dist-Name>
=head2 C<install_dist>
$instance->install_dist("Dist-Name");
Installs C<Dist-Name>'s C<ShareDir>
=head2 C<install_all_dists>
$instance->install_all_dists();
Installs all C<dist_names>
=head2 C<add_to_inc>
B<DEPRECATED:> Use C<register> instead.
=head2 C<register>
$instance->register();
Adds the C<Tempdir> C<ShareDir> ( C<inc> ) to the global C<@INC>
I<Since 1.001000>
=head2 C<clear>
$instance->clear();
Removes the C<Tempdir> C<ShareDir> ( C<inc> ) from the global C<@INC>
I<Since 1.001000>
=head1 ATTRIBUTES
=head2 C<inc>
A C<Test::File::ShareDir::Object::Inc> object.
=head2 C<dists>
A hash of :
Dist-Name => "relative/path"
=head2 C<root>
The origin all paths's are relative to.
( Defaults to C<cwd> )
=begin MetaPOD::JSON v1.1.0
{
"namespace":"Test::File::ShareDir::Object::Dist",
"interface":"class",
"inherits":"Class::Tiny::Object"
}
=end MetaPOD::JSON
=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
the same terms as the Perl 5 programming language system itself.
=cut

View File

@@ -0,0 +1,209 @@
use 5.006; # pragmas
use strict;
use warnings;
package Test::File::ShareDir::Object::Inc;
our $VERSION = '1.001002';
# ABSTRACT: Shared tempdir object code to inject into @INC
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
my @cache;
use Class::Tiny {
tempdir => sub {
require Path::Tiny;
my $dir = Path::Tiny::tempdir( CLEANUP => 1 );
push @cache, $dir; # explicit keepalive
return $dir;
},
module_tempdir => sub {
my ($self) = @_;
my $dir = $self->tempdir->child('auto/share/module');
$dir->mkpath();
return $dir->absolute;
},
dist_tempdir => sub {
my ($self) = @_;
my $dir = $self->tempdir->child('auto/share/dist');
$dir->mkpath();
return $dir->absolute;
},
};
use Carp qw( carp );
sub add_to_inc {
my ($self) = @_;
carp 'add_to_inc deprecated sice 1.001000, use register instead';
return $self->register;
}
sub register {
my ($self) = @_;
unshift @INC, $self->tempdir->stringify;
return;
}
sub clear {
my ($self) = @_;
## no critic (Variables::RequireLocalizedPunctuationVars)
@INC = grep { ref or $_ ne $self->tempdir->stringify } @INC;
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::Object::Inc - Shared tempdir object code to inject into @INC
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
use Test::File::ShareDir::Object::Inc;
my $inc = Test::File::ShareDir::Object::Inc->new();
$inc->tempdir() # add files to here
$inc->module_tempdir() # or here
$inc->dist_tempdir() # or here
$inc->add_to_inc;
=head1 DESCRIPTION
This class doesn't do very much on its own.
It simply exists to facilitate C<tempdir> creation,
and the injection of those C<tempdir>'s into C<@INC>
=head1 METHODS
=head2 C<add_to_inc>
B<DEPRECATED:> Use C<register> instead.
=head2 C<register>
$instance->register;
Allows this C<Inc> to be used.
Presently, this injects the associated C<tempdir> into C<@INC>
I<Since 1.001000>
=head2 C<clear>
$instance->clear();
Prevents this C<Inc> from being used.
Presently, this removes the C<tempdir> from C<@INC>
I<Since 1.001000>
=head1 ATTRIBUTES
=head2 C<tempdir>
A path to a C<tempdir> of some description.
=head2 C<module_tempdir>
The C<module> C<ShareDir> base directory within the C<tempdir>
=head2 C<dist_tempdir>
The C<dist> C<ShareDir> base directory within the C<tempdir>
=begin MetaPOD::JSON v1.1.0
{
"namespace":"Test::File::ShareDir::Object::Inc",
"interface":"class",
"inherits":"Class::Tiny::Object"
}
=end MetaPOD::JSON
=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
the same terms as the Perl 5 programming language system itself.
=cut

View File

@@ -0,0 +1,301 @@
use 5.006; # pragmas
use strict;
use warnings;
package Test::File::ShareDir::Object::Module;
our $VERSION = '1.001002';
# ABSTRACT: Object Oriented ShareDir creation for modules
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
use Class::Tiny {
inc => sub {
require Test::File::ShareDir::Object::Inc;
return Test::File::ShareDir::Object::Inc->new();
},
modules => sub {
return {};
},
root => sub {
require Path::Tiny;
return Path::Tiny::path(q[./])->absolute;
},
};
use Carp qw( carp );
sub __rcopy { require File::Copy::Recursive; goto \&File::Copy::Recursive::rcopy; }
sub module_names {
my ( $self, ) = @_;
return keys %{ $self->modules };
}
sub module_share_target_dir {
my ( $self, $module ) = @_;
$module =~ s/::/-/msxg;
return $self->inc->module_tempdir->child($module);
}
sub module_share_source_dir {
my ( $self, $module ) = @_;
require Path::Tiny;
return Path::Tiny::path( $self->modules->{$module} )->absolute( $self->root );
}
sub install_module {
my ( $self, $module ) = @_;
my $source = $self->module_share_source_dir($module);
my $target = $self->module_share_target_dir($module);
return __rcopy( $source, $target );
}
sub install_all_modules {
my ($self) = @_;
for my $module ( $self->module_names ) {
$self->install_module($module);
}
return;
}
sub add_to_inc {
my ($self) = @_;
carp 'add_to_inc deprecated since 1.001000, use register';
return $self->register;
}
sub register {
my ($self) = @_;
$self->inc->register;
return;
}
sub clear {
my ($self) = @_;
$self->inc->clear;
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::Object::Module - Object Oriented ShareDir creation for modules
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
use Test::File::ShareDir::Object::Module;
my $dir = Test::File::ShareDir::Object::Module->new(
root => "some/path",
modules => {
"Hello::Nurse" => "share/HN"
},
);
$dir->install_all_modules;
$dir->add_to_inc;
=head1 METHODS
=head2 C<module_names>
my @names = $instance->module_names();
Returns the names of all modules listed in the C<modules> set.
=head2 C<module_share_target_dir>
my $dir = $instance->module_share_target_dir("Module::Name");
Returns the path where the C<ShareDir> will be created for C<Module::Name>
=head2 C<module_share_source_dir>
my $dir = $instance->module_share_source_dir("Module::Name");
Returns the path where the C<ShareDir> will be B<COPIED> I<FROM> for C<Module::Name>
=head2 C<install_module>
$instance->install_module("Module::Name");
Installs C<Module::Name>'s C<ShareDir>
=head2 C<install_all_modules>
$instance->install_all_modules();
Installs all C<module_names>.
=head2 C<add_to_inc>
B<DEPRECATED:> Use C<register> instead.
=head2 C<register>
$instance->register();
Adds the C<Tempdir> C<ShareDir> ( C<inc> ) to the global C<@INC>
I<Since 1.001000>
=head2 C<clear>
$instance->clear();
Removes the C<Tempdir> C<ShareDir> ( C<inc> ) from the global C<@INC>
I<Since 1.001000>
=head1 ATTRIBUTES
=head2 C<inc>
A C<Test::File::ShareDir::Object::Inc> object.
=head2 C<modules>
A hash of :
Module::Name => "relative/path"
=head2 C<root>
The origin all paths's are relative to.
( Defaults to C<cwd> )
=begin MetaPOD::JSON v1.1.0
{
"namespace":"Test::File::ShareDir::Object::Module",
"interface":"class",
"inherits":"Class::Tiny::Object"
}
=end MetaPOD::JSON
=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
the same terms as the Perl 5 programming language system itself.
=cut

View File

@@ -0,0 +1,206 @@
use 5.006; # pragmas
use strict;
use warnings;
package Test::File::ShareDir::TempDirObject;
our $VERSION = '1.001002';
# ABSTRACT: Internal Object to make code simpler.
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
use Path::Tiny qw(path);
use Carp qw(confess);
## no critic (Subroutines::RequireArgUnpacking)
sub __rcopy { require File::Copy::Recursive; goto \&File::Copy::Recursive::rcopy; }
sub new {
my ( $class, $config ) = @_;
confess('Need -share => for Test::File::ShareDir') unless exists $config->{-share};
my $realconfig = {
root => path(q{./})->absolute, #->resolve->absolute,
modules => {},
dists => {},
};
$realconfig->{root} = path( delete $config->{-root} )->absolute if exists $config->{-root};
$realconfig->{modules} = delete $config->{-share}->{-module} if exists $config->{-share}->{-module};
$realconfig->{dists} = delete $config->{-share}->{-dist} if exists $config->{-share}->{-dist};
confess( 'Unsupported -share types : ' . join q{ }, keys %{ $config->{-share} } ) if keys %{ $config->{-share} };
delete $config->{-share};
confess( 'Unsupported parameter to import() : ' . join q{ }, keys %{$config} ) if keys %{$config};
return bless $realconfig, $class;
}
my @cache;
sub _tempdir {
my ($self) = shift;
return $self->{tempdir} if exists $self->{tempdir};
$self->{tempdir} = Path::Tiny::tempdir( CLEANUP => 1 );
# Explicit keepalive till GC
push @cache, $self->{tempdir};
return $self->{tempdir};
}
sub _module_tempdir {
my ($self) = shift;
return $self->{module_tempdir} if exists $self->{module_tempdir};
$self->{module_tempdir} = $self->_tempdir->child('auto/share/module');
$self->{module_tempdir}->mkpath();
return $self->{module_tempdir}->absolute;
}
sub _dist_tempdir {
my ($self) = shift;
return $self->{dist_tempdir} if exists $self->{dist_tempdir};
$self->{dist_tempdir} = $self->_tempdir->child('auto/share/dist');
$self->{dist_tempdir}->mkpath();
return $self->{dist_tempdir}->absolute;
}
sub _root {
my ($self) = shift;
return $self->{root};
}
sub _modules { return shift->{modules}; }
sub _dists { return shift->{dists} }
sub _module_names {
my ($self) = shift;
return keys %{ $self->_modules };
}
sub _dist_names {
my ($self) = shift;
return keys %{ $self->_dists };
}
sub _module_share_target_dir {
my ( $self, $modname ) = @_;
## no critic (RegularExpressions)
$modname =~ s/::/-/g;
return $self->_module_tempdir->child($modname);
}
sub _dist_share_target_dir {
my ( $self, $distname ) = @_;
return $self->_dist_tempdir->child($distname);
}
sub _module_share_source_dir {
my ( $self, $module ) = @_;
return path( $self->_modules->{$module} )->absolute( $self->_root );
}
sub _dist_share_source_dir {
my ( $self, $dist ) = @_;
return path( $self->_dists->{$dist} )->absolute( $self->_root );
}
sub _install_module {
my ( $self, $module ) = @_;
return __rcopy( $self->_module_share_source_dir($module), $self->_module_share_target_dir($module) );
}
sub _install_dist {
my ( $self, $dist ) = @_;
return __rcopy( $self->_dist_share_source_dir($dist), $self->_dist_share_target_dir($dist) );
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::TempDirObject - Internal Object to make code simpler.
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
my $object = $class->new({
-root => 'foo', # optional
-share => {
-module => {
'baz' => 'dir',
},
-dist => {
'Task-baz' => 'otherdir',
},
},
});
# installs a sharedir for 'baz' by copying 'foo/dir'
$object->_install_module('baz');
# installs a shardir for distribution 'Task-baz' by copying 'foo/otherdir'
$object->_install_dist('Task-baz');
# add to @INC
unshift @INC, $object->_tempdir->stringify;
=head1 METHODS
=head2 new
Creates a new instance of this object.
=begin MetaPOD::JSON v1.1.0
{
"namespace":"Test::File::ShareDir::TempDirObject",
"interface":"class"
}
=end MetaPOD::JSON
=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
the same terms as the Perl 5 programming language system itself.
=cut

View File

@@ -0,0 +1,115 @@
use 5.006;
use strict;
use warnings;
package Test::File::ShareDir::Utils;
our $VERSION = '1.001002';
our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
# ABSTRACT: Simple utilities for File::ShareDir testing
use Exporter 5.57 qw(import);
use Carp qw( croak );
our @EXPORT_OK = qw( extract_dashes );
sub extract_dashes {
my ( $undashed_to, $source ) = @_;
if ( not ref $source or 'HASH' ne ref $source ) {
return croak(q[Must pass a hashref]);
}
my %input_config = %{$source};
my $params = {};
for my $key ( keys %input_config ) {
next unless $key =~ /\A-(.*)\z/msx;
$params->{$1} = delete $input_config{$key};
}
$params->{$undashed_to} = {} if not exists $params->{$undashed_to};
for my $key ( keys %input_config ) {
$params->{$undashed_to}->{$key} = $input_config{$key};
}
return $params;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Test::File::ShareDir::Utils - Simple utilities for File::ShareDir testing
=head1 VERSION
version 1.001002
=head1 SYNOPSIS
use Test::File::ShareDir::Utils qw( extract_dashes );
my $hash = extract_dashes('dists', $oldhash );
=head1 EXPORTABLE FUNCTIONS
=head2 extract_dashes
A utility that helps transform:
-opt_a => bar
-opt_b => baz
NameA => NameAValue
NameB => NameBValue
Into
opt_a => bar
opt_b => baz
modules => {
NameA => NameAValue
NameB => NameBValue
}
This is a useful approach used all over import and functional style interfaces due to explicit configuration
being needed only on rare occasions.
=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
the same terms as the Perl 5 programming language system itself.
=cut