Koha/C4/Installer/PerlModules.pm
Marcel de Rooy 900aa4bf51
Bug 30731: Remove Readonly::XS::MAGIC_COOKIE
This variable does not make sense anymore, since the Readonly::XS
module is not listed in the cpanfile. So it will not be required
the versions_info loop.

Test plan:
Run t/Installer_PerlModules.t again.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2022-06-01 16:15:26 -03:00

205 lines
5.9 KiB
Perl

package C4::Installer::PerlModules;
use warnings;
use strict;
use File::Basename qw( dirname );
use Module::CPANfile;
sub new {
my $invocant = shift;
my $self = {
missing_pm => [],
upgrade_pm => [],
current_pm => [],
};
my $type = ref($invocant) || $invocant;
bless ($self, $type);
return $self;
}
sub prereqs {
my $self = shift;
unless (defined $self->{prereqs}) {
my $filename = $INC{'C4/Installer/PerlModules.pm'};
my $path = dirname(dirname(dirname($filename)));
$self->{prereqs} = Module::CPANfile->load("$path/cpanfile")->prereqs;
}
return $self->{prereqs};
}
sub prereq_pm {
my $self = shift;
my $prereq_pm = {};
my $reqs = $self->prereqs->merged_requirements;
foreach my $module ($reqs->required_modules) {
$prereq_pm->{$module} = $reqs->requirements_for_module($module);
}
return $prereq_pm;
}
sub versions_info {
my $self = shift;
# Reset these arrayref each pass through to ensure current information
$self->{'missing_pm'} = [];
$self->{'upgrade_pm'} = [];
$self->{'current_pm'} = [];
foreach my $phase ($self->prereqs->phases) {
foreach my $type ($self->prereqs->types_in($phase)) {
my $reqs = $self->prereqs->requirements_for($phase, $type);
foreach my $module (sort $reqs->required_modules) {
my $module_infos = {
cur_ver => 0,
required => $type eq 'requires',
};
my $vers = $reqs->structured_requirements_for_module($module);
for my $req (@$vers) {
if ( $req->[0] eq '>=' || $req->[0] eq '>' ) {
$module_infos->{min_ver} = $req->[1];
} elsif ( $req->[0] eq '<=' || $req->[0] eq '<' ) {
$module_infos->{max_ver} = $req->[1];
} else {
push @{$module_infos->{exc_ver}}, $req->[1];
}
}
my $attr;
{
# ignore warnings from noisy modules
local $SIG{__WARN__} = sub {};
eval "require $module";
}
if ($@) {
$attr = 'missing_pm';
} else {
my $pkg_version = $module->can("VERSION") ? $module->VERSION : 0;
$module_infos->{cur_ver} = $pkg_version;
if ($reqs->accepts_module($module => $pkg_version)) {
$attr = 'current_pm';
} else {
$attr = 'upgrade_pm';
}
}
push @{ $self->{$attr} }, { $module => $module_infos };
}
}
}
}
sub get_attr {
return $_[0]->{$_[1]};
}
1;
__END__
=head1 NAME
C4::Installer::PerlModules
=head1 ABSTRACT
A module for manipulating Koha Perl dependency list objects.
=head1 METHODS
=head2 new()
Creates a new PerlModules object
example:
C<my $perl_modules = C4::Installer::PerlModules->new;>
=head2 prereq_pm()
Returns a hashref of a hash of module information suitable for use in Makefile.PL
example:
C<my $perl_modules = C4::Installer::PerlModules->new;
...
PREREQ_PM => $perl_modules->prereq_pm,>
=head2 versions_info
C<$perl_modules->versions_info;>
This loads info of required modules into three accessors: missing_pm,
upgrade_pm, and current_pm. Each of these may be accessed by using the
C<get_attr> method. Each accessor returns an anonymous array who's
elements are anonymous hashes. They follow this format (NOTE: Upgrade
status is indicated by the accessor name.):
[
{
'Text::CSV::Encoded' => {
'required' => 1,
'cur_ver' => 0.09,
'min_ver' => '0.09'
}
},
{
'Biblio::EndnoteStyle' => {
'required' => 1,
'cur_ver' => 0,
'min_ver' => '0.05'
}
},
}
=head2 get_attr(attr_name)
Returns an anonymous array containing the contents of the passed in accessor. Valid accessors are:
missing_pm - Perl modules used by Koha but not currently installed.
upgrade_pm - Perl modules currently installed but below the minimum version required by Koha.
current_pm - Perl modules currently installed and up to date as required by Koha.
example:
C<my $missing_pm = $perl_modules->get_attr('missing_pm');>
=head1 AUTHOR
Chris Nighswonger <cnighswonger AT foundations DOT edu>
=head1 COPYRIGHT
Copyright 2010 Foundations Bible College.
=head1 LICENSE
This file is part of Koha.
Koha is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
Koha is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Koha; if not, see <http://www.gnu.org/licenses>.
=head1 DISCLAIMER OF WARRANTY
Koha is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
=cut