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,87 @@
package Config::Any::Base;
use strict;
use warnings;
=head1 NAME
Config::Any::Base - Base class for loaders
=head1 DESCRIPTION
This is a base class for all loaders. It currently handles the specification
of dependencies in order to ensure the subclass can load the config file
format.
=head1 METHODS
=head2 is_supported( )
Allows us to determine if the file format can be loaded. The can be done via
one of two subclass methods:
=over 4
=item * C<requires_all_of()> - returns an array of items that must all be present in order to work
=item * C<requires_any_of()> - returns an array of items in which at least one must be present
=back
You can specify a module version by passing an array reference in the return.
sub requires_all_of { [ 'My::Module', '1.1' ], 'My::OtherModule' }
Lack of specifying these subs will assume you require no extra modules to function.
=cut
sub is_supported {
my ( $class ) = shift;
local $@;
if ( $class->can( 'requires_all_of' ) ) {
return eval {
_require($_) for $class->requires_all_of;
1;
} || 0;
}
if ( $class->can( 'requires_any_of' ) ) {
eval { _require( $_ ); 1 } and return 1
for $class->requires_any_of;
return 0;
}
# requires nothing!
return 1;
}
sub _require {
my ( $input ) = shift;
my ( $module, $version ) = ( ref $input ? @$input : $input );
(my $file = "$module.pm") =~ s{::}{/}g;
require $file;
$module->VERSION if $version;
}
=head1 AUTHOR
Brian Cassidy <bricas@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2008-2009 by Brian Cassidy
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Config::Any>
=back
=cut
1;

View File

@@ -0,0 +1,100 @@
package Config::Any::General;
use strict;
use warnings;
use base 'Config::Any::Base';
=head1 NAME
Config::Any::General - Load Config::General files
=head1 DESCRIPTION
Loads Config::General files. Example:
name = TestApp
<Component Controller::Foo>
foo bar
bar [ arrayref-value ]
</Component>
<Model Baz>
qux xyzzy
</Model>
=head1 METHODS
=head2 extensions( )
return an array of valid extensions (C<cnf>, C<conf>).
=cut
sub extensions {
return qw( cnf conf );
}
=head2 load( $file )
Attempts to load C<$file> via Config::General.
=cut
sub load {
my $class = shift;
my $file = shift;
my $args = shift || {};
$args->{ -ConfigFile } = $file;
require Config::General;
Config::General->VERSION( '2.47' );
$args->{ -ForceArray } = 1 unless exists $args->{ -ForceArray };
my $configfile = Config::General->new( %$args );
my $config = { $configfile->getall };
return $config;
}
=head2 requires_all_of( )
Specifies that this module requires L<Config::General> in order to work.
=cut
sub requires_all_of { [ 'Config::General' => '2.47' ] }
=head1 AUTHOR
Brian Cassidy <bricas@cpan.org>
=head1 CONTRIBUTORS
Joel Bernstein <rataxis@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2016 by Brian Cassidy
Portions Copyright 2006 Portugal Telecom
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Catalyst>
=item * L<Config::Any>
=item * L<Config::General>
=back
=cut
1;

View File

@@ -0,0 +1,125 @@
package Config::Any::INI;
use strict;
use warnings;
use base 'Config::Any::Base';
our $MAP_SECTION_SPACE_TO_NESTED_KEY = 1;
=head1 NAME
Config::Any::INI - Load INI config files
=head1 DESCRIPTION
Loads INI files. Example:
name=TestApp
[Controller::Foo]
foo=bar
[Model::Baz]
qux=xyzzy
=head1 METHODS
=head2 extensions( )
return an array of valid extensions (C<ini>).
=cut
sub extensions {
return qw( ini );
}
=head2 load( $file )
Attempts to load C<$file> as an INI file.
=cut
sub load {
my $class = shift;
my $file = shift;
require Config::Tiny;
my $config = Config::Tiny->read( $file );
die $Config::Tiny::errstr if not defined $config;
my $out = delete $config->{ _ } || {};
for my $k ( keys %$config ) {
my @keys = split /\s+/, $k;
my $ref = $config->{ $k };
if ( $MAP_SECTION_SPACE_TO_NESTED_KEY && @keys > 1 ) {
my ( $a, $b ) = @keys[ 0, 1 ];
$out->{ $a }->{ $b } = $ref;
}
else {
$out->{ $k } = { %{ $out->{ $k } || {} }, %$ref };
}
}
return $out;
}
=head2 requires_all_of( )
Specifies that this module requires L<Config::Tiny> in order to work.
=cut
sub requires_all_of { 'Config::Tiny' }
=head1 PACKAGE VARIABLES
=over 4
=item $MAP_SECTION_SPACE_TO_NESTED_KEY (boolean)
This variable controls whether spaces in INI section headings will be expanded into nested hash keys.
e.g. it controls whether [Full Power] maps to $config->{'Full Power'} or $config->{'Full'}->{'Power'}
By default it is set to 1 (i.e. true).
Set it to 0 to preserve literal spaces in section headings:
use Config::Any;
use Config::Any::INI;
$Config::Any::INI::MAP_SECTION_SPACE_TO_NESTED_KEY = 0;
=back
=head1 AUTHORS
Brian Cassidy <bricas@cpan.org>
Joel Bernstein <rataxis@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2016 by Brian Cassidy, portions copyright 2006, 2007 by Joel Bernstein
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Catalyst>
=item * L<Config::Any>
=item * L<Config::Tiny>
=back
=cut
1;

View File

@@ -0,0 +1,141 @@
package Config::Any::JSON;
use strict;
use warnings;
use base 'Config::Any::Base';
=head1 NAME
Config::Any::JSON - Load JSON config files
=head1 DESCRIPTION
Loads JSON files. Example:
{
"name": "TestApp",
"Controller::Foo": {
"foo": "bar"
},
"Model::Baz": {
"qux": "xyzzy"
}
}
=head1 METHODS
=head2 extensions( )
return an array of valid extensions (C<json>, C<jsn>).
=cut
sub extensions {
return qw( json jsn );
}
=head2 load( $file )
Attempts to load C<$file> as a JSON file.
=cut
sub load {
my $class = shift;
my $file = shift;
open( my $fh, '<', $file ) or die $!;
binmode $fh;
my $content = do { local $/; <$fh> };
close $fh;
if ( eval { require Cpanel::JSON::XS } ) {
my $decoder = Cpanel::JSON::XS->new->utf8->relaxed;
return $decoder->decode( $content );
}
elsif ( eval { require JSON::MaybeXS } ) {
my $decoder = JSON::MaybeXS::JSON()->new->utf8->relaxed;
return $decoder->decode( $content );
}
elsif ( eval { require JSON::DWIW } ) {
my $decoder = JSON::DWIW->new;
my ( $data, $error ) = $decoder->from_json( $content );
die $error if $error;
return $data;
}
elsif ( eval { require JSON::XS } ) {
my $decoder = JSON::XS->new->utf8->relaxed;
return $decoder->decode( $content );
}
elsif ( eval { require JSON::Syck } ) {
require Encode;
return JSON::Syck::Load( Encode::decode('UTF-8', $content ) );
}
elsif ( eval { require JSON::PP; JSON::PP->VERSION( 2 ); } ) {
my $decoder = JSON::PP->new->utf8->relaxed;
return $decoder->decode( $content );
}
require JSON;
if ( eval { JSON->VERSION( 2 ) } ) {
return JSON::decode_json( $content );
}
else {
return JSON::jsonToObj( $content );
}
}
=head2 requires_any_of( )
Specifies that this modules requires one of, L<Cpanel::JSON::XS>,
L<JSON::MaybeXS>, L<JSON::DWIW>, L<JSON::XS>, L<JSON::Syck>, L<JSON::PP> or
L<JSON> in order to work.
=cut
sub requires_any_of { qw(
Cpanel::JSON::XS
JSON::MaybeXS
JSON::DWIW
JSON::XS
JSON::Syck
JSON::PP
JSON
) }
=head1 AUTHOR
Brian Cassidy <bricas@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2016 by Brian Cassidy
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Catalyst>
=item * L<Config::Any>
=item * L<Cpanel::JSON::XS>
=item * L<JSON::MaybeXS>
=item * L<JSON::DWIW>
=item * L<JSON::XS>
=item * L<JSON::Syck>
=item * L<JSON>
=back
=cut
1;

View File

@@ -0,0 +1,89 @@
package Config::Any::Perl;
use strict;
use warnings;
use base 'Config::Any::Base';
use File::Spec;
use Cwd ();
=head1 NAME
Config::Any::Perl - Load Perl config files
=head1 DESCRIPTION
Loads Perl files. Example:
{
name => 'TestApp',
'Controller::Foo' => {
foo => 'bar'
},
'Model::Baz' => {
qux => 'xyzzy'
}
}
=head1 METHODS
=head2 extensions( )
return an array of valid extensions (C<pl>, C<perl>).
=cut
sub extensions {
return qw( pl perl );
}
=head2 load( $file )
Attempts to load C<$file> as a Perl file.
=cut
sub load {
my $class = shift;
my $file = shift;
my( $exception, $content );
{
local $@;
# previously this would load based on . being in @INC, and wouldn't
# trigger taint errors even if '.' probably should have been considered
# tainted. untaint for backwards compatibility.
my ($cwd) = Cwd::cwd() =~ /\A(.*)\z/s;
$content = do File::Spec->rel2abs($file, $cwd);
$exception = $@ || $!
if !defined $content;
}
die $exception if $exception;
return $content;
}
=head1 AUTHOR
Brian Cassidy <bricas@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2016 by Brian Cassidy
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Catalyst>
=item * L<Config::Any>
=back
=cut
1;

View File

@@ -0,0 +1,124 @@
package Config::Any::XML;
use strict;
use warnings;
use base 'Config::Any::Base';
=head1 NAME
Config::Any::XML - Load XML config files
=head1 DESCRIPTION
Loads XML files. Example:
<config>
<name>TestApp</name>
<component name="Controller::Foo">
<foo>bar</foo>
</component>
<model name="Baz">
<qux>xyzzy</qux>
</model>
</config>
=head1 METHODS
=head2 extensions( )
return an array of valid extensions (C<xml>).
=cut
sub extensions {
return qw( xml );
}
=head2 load( $file )
Attempts to load C<$file> as an XML file.
=cut
sub load {
my $class = shift;
my $file = shift;
my $args = shift || {};
require XML::Simple;
my $config = XML::Simple::XMLin(
$file,
ForceArray => [ qw( component model view controller ) ],
%$args
);
return $class->_coerce( $config );
}
sub _coerce {
# coerce the XML-parsed config into the correct format
my $class = shift;
my $config = shift;
my $out;
for my $k ( keys %$config ) {
my $ref = $config->{ $k };
my $name = ref $ref eq 'HASH' ? delete $ref->{ name } : undef;
if ( defined $name ) {
$out->{ $k }->{ $name } = $ref;
}
else {
$out->{ $k } = $ref;
}
}
$out;
}
=head2 requires_all_of( )
Specifies that this module requires L<XML::Simple> and L<XML::NamespaceSupport>
in order to work.
=cut
sub requires_all_of { 'XML::Simple', 'XML::NamespaceSupport' }
=head1 CAVEATS
=head2 Strict Mode
If, by some chance, L<XML::Simple> has already been loaded with the strict
flag turned on, then you will likely get errors as warnings will become
fatal exceptions and certain arguments to XMLin() will no longer be optional.
See L<XML::Simple's strict mode documentation|XML::Simple/STRICT_MODE> for
more information.
=head1 AUTHORS
Brian Cassidy <bricas@cpan.org>
Joel Bernstein <rataxis@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2016 by Brian Cassidy
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Catalyst>
=item * L<Config::Any>
=item * L<XML::Simple>
=back
=cut
1;

View File

@@ -0,0 +1,101 @@
package Config::Any::YAML;
use strict;
use warnings;
use base 'Config::Any::Base';
use Carp ();
=head1 NAME
Config::Any::YAML - Load YAML config files
=head1 DESCRIPTION
Loads YAML files. Example:
---
name: TestApp
Controller::Foo:
foo: bar
Model::Baz:
qux: xyzzy
=head1 METHODS
=head2 extensions( )
return an array of valid extensions (C<yml>, C<yaml>).
=cut
sub extensions {
return qw( yml yaml );
}
=head2 load( $file )
Attempts to load C<$file> as a YAML file.
=cut
sub load {
my $class = shift;
my $file = shift;
if (eval { require YAML::XS; 1 }) {
return YAML::XS::LoadFile( $file );
}
elsif ($] > 5.008008 && eval { require YAML::Syck; YAML::Syck->VERSION(0.70) } ) {
open( my $fh, $file ) or die $!;
my $content = do { local $/; <$fh> };
close $fh;
return YAML::Syck::Load( $content );
}
require YAML;
return YAML::LoadFile( $file );
}
=head2 requires_any_of( )
Specifies that this modules requires one of L<YAML::XS>, L<YAML::Syck> (0.70) or
L<YAML> in order to work.
=cut
sub requires_any_of {
'YAML::XS', ( $] > 5.008008 ? [ 'YAML::Syck', '0.70' ] : ()), 'YAML';
}
=head1 AUTHOR
Brian Cassidy <bricas@cpan.org>
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2016 by Brian Cassidy
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
=over 4
=item * L<Catalyst>
=item * L<Config::Any>
=item * L<YAML::XS>
=item * L<YAML>
=item * L<YAML::Syck>
=back
=cut
1;