AWS-CLI-Config
view release on metacpan or search on metacpan
requires 'perl', '5.008001';
on configure => sub {
requires 'Module::Build::Tiny', '0.035';
};
on test => sub {
requires 'File::Temp';
requires 'Test::More', '0.98';
};
lib/AWS/CLI/Config.pm view on Meta::CPAN
region => { env => 'AWS_DEFAULT_REGION' },
output => {},
);
while (my ($name, $opts) = each %attributes) {
no strict 'refs';
*{__PACKAGE__ . "::$name"} = _mk_accessor($name, %{$opts});
}
}
sub _mk_accessor {
my $attr = shift;
my %opt = @_;
my $env_var = $opt{env};
my $profile_key = $opt{key} || $attr;
return sub {
if ($env_var && exists $ENV{$env_var} && $ENV{$env_var}) {
return $ENV{$env_var};
}
my $profile = shift || _default_profile();
my $credentials = credentials($profile);
if ($credentials && $credentials->$profile_key) {
return $credentials->$profile_key;
}
my $config = config($profile);
if ($config && $config->$profile_key) {
return $config->$profile_key;
}
return undef;
};
}
sub credentials {
my $profile = shift || _default_profile();
$CREDENTIALS ||= _parse(
(exists $ENV{AWS_CONFIG_FILE} and $ENV{AWS_CONFIG_FILE})
? $ENV{AWS_CONFIG_FILE}
: File::Spec->catfile(_default_dir(), 'credentials')
);
return unless (exists $CREDENTIALS->{$profile});
$CREDENTIALS_PROFILE_OF{$profile} ||=
AWS::CLI::Config::Profile->new($CREDENTIALS->{$profile});
return $CREDENTIALS_PROFILE_OF{$profile};
}
sub config {
my $profile = shift || _default_profile();
$CONFIG ||= _parse(
(exists $ENV{AWS_CONFIG_FILE} and $ENV{AWS_CONFIG_FILE})
? $ENV{AWS_CONFIG_FILE}
: File::Spec->catfile(_default_dir(), 'config')
);
return unless (exists $CONFIG->{$profile});
$CONFIG_PROFILE_OF{$profile} ||=
AWS::CLI::Config::Profile->new($CONFIG->{$profile});
return $CONFIG_PROFILE_OF{$profile};
}
sub _base_dir {
($^O eq 'MSWin32') ? $ENV{USERPROFILE} : $ENV{HOME};
}
sub _default_dir {
File::Spec->catdir(_base_dir(), '.aws');
}
sub _default_profile {
(exists $ENV{AWS_DEFAULT_PROFILE} && $ENV{AWS_DEFAULT_PROFILE})
? $ENV{AWS_DEFAULT_PROFILE}
: $DEFAULT_PROFILE;
}
# This only supports one level of nesting, but it seems AWS config files
# themselves only have but one level
sub _parse {
my $file = shift;
my $profile = shift || _default_profile();
my $hash = {};
my $nested = {};
return +{} unless -r $file;
my $contents;
{
lib/AWS/CLI/Config.pm view on Meta::CPAN
return $hash;
}
PROFILE: {
package AWS::CLI::Config::Profile;
use 5.008001;
use strict;
use warnings;
sub new {
my $class = shift;
my $data = @_ ? @_ > 1 ? { @_ } : shift : {};
return bless $data, $class;
}
sub AUTOLOAD {
our $AUTOLOAD;
my $self = shift;
return if $AUTOLOAD =~ /DESTROY/;
my $method = $AUTOLOAD;
$method =~ s/.*:://;
no strict 'refs';
*{$AUTOLOAD} = sub {
return shift->{$method}
};
return $self->{$method};
}
}
1;
__END__
t/01__base_dir.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use AWS::CLI::Config;
subtest 'Windows' => sub {
local $^O = 'MSWin32';
local $ENV{USERPROFILE} = 'C:\Users\foo';
is(AWS::CLI::Config::_base_dir, $ENV{USERPROFILE}, 'same as USERPROFILE');
};
subtest 'Other OS' => sub {
local $^O = 'Other';
local $ENV{HOME} = '/home/foo';
is(AWS::CLI::Config::_base_dir, $ENV{HOME}, 'same as HOME');
};
done_testing;
__END__
# vi: set ts=4 sw=4 sts=0 et ft=perl fenc=utf-8 ff=unix :
t/02_access_key_id.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use AWS::CLI::Config;
subtest 'Environment Variable' => sub {
local $ENV{AWS_ACCESS_KEY_ID} = '__dummy__';
is(AWS::CLI::Config::access_key_id, $ENV{AWS_ACCESS_KEY_ID}, 'set by env');
};
subtest 'From credentials file' => sub {
my $access_key_id = q[It's me.];
undef local $ENV{AWS_ACCESS_KEY_ID};
no strict 'refs';
no warnings 'redefine';
*AWS::CLI::Config::credentials = sub {
return AWS::CLI::Config::Profile->new({
aws_access_key_id => $access_key_id,
});
};
is(AWS::CLI::Config::access_key_id, $access_key_id, 'set by credentials');
};
subtest 'From config file' => sub {
my $access_key_id = q[It's me.];
undef local $ENV{AWS_ACCESS_KEY_ID};
no strict 'refs';
no warnings 'redefine';
*AWS::CLI::Config::credentials = sub {
return undef;
};
*AWS::CLI::Config::config = sub {
return AWS::CLI::Config::Profile->new({
aws_access_key_id => $access_key_id,
});
};
is(AWS::CLI::Config::access_key_id, $access_key_id, 'set by config');
};
done_testing;
__END__
t/03_output.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use AWS::CLI::Config;
subtest 'From credentials file' => sub {
my $output = '__format__';
no strict 'refs';
no warnings 'redefine';
*AWS::CLI::Config::credentials = sub {
return AWS::CLI::Config::Profile->new({
output => $output,
});
};
is(AWS::CLI::Config::output, $output, 'set by credentials');
};
subtest 'From config file' => sub {
my $output = '__format__';
no strict 'refs';
no warnings 'redefine';
*AWS::CLI::Config::credentials = sub {
return undef;
};
*AWS::CLI::Config::config = sub {
return AWS::CLI::Config::Profile->new({
output => $output,
});
};
is(AWS::CLI::Config::output, $output, 'set by config');
};
done_testing;
__END__
t/04_config.t view on Meta::CPAN
aws_access_key_id = $tester_access_key_id
aws_secret_access_key = $tester_secret_access_key
s3 =
addressing_style = path
EOS
close $fh;
local $ENV{AWS_CONFIG_FILE} = $file;
subtest 'Default profile' => sub {
my $config = AWS::CLI::Config::config;
is($config->aws_access_key_id, $default_access_key_id, 'access_key_id');
is($config->aws_secret_access_key, $default_secret_access_key, 'secret_access_key');
};
subtest 'Specific profile' => sub {
my $config = AWS::CLI::Config::config('tester');
is($config->aws_access_key_id, $tester_access_key_id, 'access_key_id');
is($config->aws_secret_access_key, $tester_secret_access_key, 'secret_access_key');
is($config->s3->{addressing_style}, 'path', 'nested value');
};
subtest 'Undefined profile' => sub {
my $config = AWS::CLI::Config::config('no-such-profile');
ok(!$config, 'undefined');
};
done_testing;
__END__
# vi: set ts=4 sw=4 sts=0 et ft=perl fenc=utf-8 ff=unix :
( run in 0.271 second using v1.01-cache-2.11-cpan-4d50c553e7e )