aws_config 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 90a1710b76b6e09202d4bc95b4ea77801ee6a865
4
+ data.tar.gz: c6af0011cc599b646c641d1ad93d877cd14d8ceb
5
+ SHA512:
6
+ metadata.gz: 4e8e3e64cb3a746c0526f7db46ce3f79e5eedc079af10569ebe07fbc15f18137f1b056b0b4cf00c0153cc9f392b56b04dd64f364152d900125a0636ecd618b71
7
+ data.tar.gz: 5cd3f06e02c3115842a0729f16cc0bc0a2708614aa171e077cf9299a6c9f162299dc0831e4a7dea7adc06724bdbb5445092792ac77632d0299c14edae6a641d9
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development, :test do
6
+ gem "guard-rspec"
7
+ end
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard :rspec do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ end
5
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Masato Ikeda
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # AWSConfig
2
+
3
+ AWSConfig is a parser for AWS_CONFIG_FILE used in [aws-cli](https://github.com/aws/aws-cli).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'aws_config'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install aws_config
18
+
19
+ ## Usage
20
+
21
+ It parses `~/.aws/config` by default.
22
+
23
+ If you put a config file like:
24
+
25
+ [default]
26
+ aws_access_key_id=DefaultAccessKey01
27
+ aws_secret_access_key=Default/Secret/Access/Key/02
28
+ # Optional, to define default region for this profile.
29
+ region=us-west-1
30
+
31
+ [profile testing]
32
+ aws_access_key_id=TestingAccessKey03
33
+ aws_secret_access_key=Testing/Secret/Access/Key/04
34
+ region=us-west-2
35
+
36
+ you can access it like:
37
+
38
+ require "aws_config"
39
+
40
+ puts AWSConfig.default.aws_access_key_id #=> DefaultAccessKey01
41
+ puts AWSConfig.default.region #=> Default/Secret/Access/Key/02
42
+
43
+ also you can do like hashes:
44
+
45
+ puts AWSConfig["default"]["aws_access_key_id"] #=> DefaultAccessKey01
46
+ puts AWSConfig["default"]["region"] #=> Default/Secret/Access/Key/02
47
+
48
+ If you want to use with aws-sdk-ruby, you can configure like:
49
+
50
+ AWS.config(AWSConfig.default.config_hash)
51
+
52
+ ## Contributing
53
+
54
+ 1. Fork it
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core'
4
+ require 'rspec/core/rake_task'
5
+
6
+ task :default => :spec
7
+
8
+ desc "Run all specs in spec directory"
9
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'aws_config/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "aws_config"
8
+ spec.version = AWSConfig::VERSION
9
+ spec.authors = ["Masato Ikeda"]
10
+ spec.email = ["masato.ikeda@gmail.com"]
11
+ spec.description = %q{AWSConfig is a parser for AWS_CONFIG_FILE used in aws-cli.}
12
+ spec.summary = %q{AWSConfig is a parser for AWS_CONFIG_FILE used in aws-cli.}
13
+ spec.homepage = "https://github.com/a2ikm/aws_config"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ end
@@ -0,0 +1,71 @@
1
+ require "strscan"
2
+ require "aws_config/profile"
3
+
4
+ module AWSConfig
5
+ class Parser
6
+ def self.parse(string)
7
+ new.parse(string)
8
+ end
9
+
10
+ def parse(string)
11
+ wrap(build(tokenize(string)))
12
+ end
13
+
14
+ private
15
+
16
+ def tokenize(string)
17
+ s = StringScanner.new(string)
18
+ tokens = []
19
+
20
+ until s.eos?
21
+ if s.scan(/\[\s*([^\]]+)\s*\]/)
22
+ if s[1] == "default"
23
+ tokens << [:profile, "default"]
24
+ elsif m = s[1].match(/profile\s+([^\s]+)$/)
25
+ tokens << [:profile, m[1]]
26
+ else
27
+ raise "Invalid profile sectioning"
28
+ end
29
+ elsif s.scan(/([^\s=#]+)\s*=\s*([^\s#]+)/)
30
+ tokens << [:key_value, s[1], s[2]]
31
+ elsif s.scan(/#[^\n]*/)
32
+ elsif s.scan(/\s+/)
33
+ elsif s.scan(/\n+/)
34
+ else
35
+ s.scan(/./)
36
+ raise "Invalid token `#{s[0]}` as #{s.pos}"
37
+ end
38
+ end
39
+
40
+ tokens
41
+ end
42
+
43
+ def build(tokens)
44
+ tokens = tokens.dup
45
+ profiles = {}
46
+ profile = nil
47
+
48
+ while values = tokens.shift
49
+ head = values.shift
50
+
51
+ case head
52
+ when :profile
53
+ profile = profiles[values[0]] ||= {}
54
+ when :key_value
55
+ if profile
56
+ profile[values[0]] = values[1]
57
+ end
58
+ end
59
+ end
60
+
61
+ profiles
62
+ end
63
+
64
+ def wrap(profiles)
65
+ profiles.inject({}) do |s, (name, properties)|
66
+ s[name] = Profile.new(name, properties)
67
+ s
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,44 @@
1
+ module AWSConfig
2
+ class Profile
3
+ attr_reader :name, :entries
4
+
5
+ def initialize(name, entries)
6
+ @name = name.to_s
7
+ @entries = entries
8
+ end
9
+
10
+ def [](key)
11
+ key = key.to_s
12
+ if entries.has_key?(key)
13
+ entries[key]
14
+ else
15
+ nil
16
+ end
17
+ end
18
+
19
+ def has_key?(key)
20
+ key = key.to_s
21
+ entries.has_key?(key)
22
+ end
23
+
24
+ def respond_to?(id, include_all = false)
25
+ has_key?(id) || super
26
+ end
27
+
28
+ def method_missing(id, *args)
29
+ if has_key?(id)
30
+ self[id]
31
+ else
32
+ super
33
+ end
34
+ end
35
+
36
+ def config_hash
37
+ {
38
+ access_key_id: entries["aws_access_key_id"],
39
+ secret_access_key: entries["aws_secret_access_key"],
40
+ region: entries["region"]
41
+ }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,38 @@
1
+ module AWSConfig
2
+ module Store
3
+ def profiles
4
+ @profiles ||= begin
5
+ Parser.parse(File.read(config_file))
6
+ end
7
+ end
8
+
9
+ def config_file
10
+ @config_file || ENV["AWS_CONFIG_FILE"] || File.join(ENV["HOME"], ".aws/config")
11
+ end
12
+
13
+ def config_file=(path)
14
+ @config_file = path
15
+ @profiles = nil
16
+ end
17
+
18
+ def [](profile)
19
+ profiles[profile.to_s]
20
+ end
21
+
22
+ def has_profile?(profile)
23
+ profiles.has_key?(profile.to_s)
24
+ end
25
+
26
+ def respond_to?(id, include_all = false)
27
+ has_profile?(id) || super
28
+ end
29
+
30
+ def method_missing(id, *args)
31
+ if has_profile?(id)
32
+ self[id]
33
+ else
34
+ super
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module AWSConfig
2
+ VERSION = "0.0.1"
3
+ end
data/lib/aws_config.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "aws_config/version"
2
+ require "aws_config/parser"
3
+ require "aws_config/store"
4
+
5
+ module AWSConfig
6
+ extend Store
7
+ end
@@ -0,0 +1,135 @@
1
+ require "spec_helper"
2
+
3
+ describe AWSConfig::Parser do
4
+ describe "#tokenize" do
5
+ subject { described_class.new.send(:tokenize, string) }
6
+
7
+ context "only default profile" do
8
+ let(:string) { <<-EOC }
9
+ [default]
10
+ aws_access_key_id=DefaultAccessKey01
11
+ aws_secret_access_key=Default/Secret/Access/Key/02
12
+ region=us-west-1
13
+ EOC
14
+ it { should eq [
15
+ [:profile, "default"],
16
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"],
17
+ [:key_value, "aws_secret_access_key", "Default/Secret/Access/Key/02"],
18
+ [:key_value, "region", "us-west-1"]
19
+ ] }
20
+ end
21
+
22
+ context "default and named profiles" do
23
+ let(:string) { <<-EOC }
24
+ [default]
25
+ aws_access_key_id=DefaultAccessKey01
26
+
27
+ [profile testing]
28
+ aws_access_key_id=TestingAccessKey03
29
+ EOC
30
+ it { should eq [
31
+ [:profile, "default"],
32
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"],
33
+ [:profile, "testing"],
34
+ [:key_value, "aws_access_key_id", "TestingAccessKey03"],
35
+ ] }
36
+
37
+ context "Comment line" do
38
+ let(:string) { <<-EOC }
39
+ [default]
40
+ # THIS IS COMMENT #
41
+ aws_access_key_id=DefaultAccessKey01
42
+ EOC
43
+ it { should eq [
44
+ [:profile, "default"],
45
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"]
46
+ ] }
47
+ end
48
+
49
+ context "Blank line" do
50
+ let(:string) { <<-EOC }
51
+ [default]
52
+
53
+
54
+ aws_access_key_id=DefaultAccessKey01
55
+ EOC
56
+ it { should eq [
57
+ [:profile, "default"],
58
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"]
59
+ ] }
60
+ end
61
+ end
62
+ end
63
+
64
+ describe "#build" do
65
+ subject { described_class.new.send(:build, tokens) }
66
+
67
+ context "Single profile" do
68
+ let(:tokens) { [
69
+ [:profile, "default"],
70
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"],
71
+ [:key_value, "aws_secret_access_key", "Default/Secret/Access/Key/02"],
72
+ [:key_value, "region", "us-west-1"]
73
+ ] }
74
+ it { should eq({
75
+ "default" => {
76
+ "aws_access_key_id" => "DefaultAccessKey01",
77
+ "aws_secret_access_key" => "Default/Secret/Access/Key/02",
78
+ "region" => "us-west-1"
79
+ }
80
+ }) }
81
+ end
82
+
83
+ context "Multi profiles" do
84
+ let(:tokens) { [
85
+ [:profile, "default"],
86
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"],
87
+ [:profile, "testing"],
88
+ [:key_value, "aws_access_key_id", "TestingAccessKey02"],
89
+ ] }
90
+ it { should eq({
91
+ "default" => { "aws_access_key_id" => "DefaultAccessKey01" },
92
+ "testing" => { "aws_access_key_id" => "TestingAccessKey02" }
93
+ }) }
94
+ end
95
+
96
+ context "Twice-defined single profile" do
97
+ let(:tokens) { [
98
+ [:profile, "default"],
99
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01"],
100
+ [:key_value, "region", "us-west-1"],
101
+ [:profile, "default"],
102
+ [:key_value, "aws_access_key_id", "DefaultAccessKey01_ANOTHER"],
103
+ [:key_value, "aws_secret_access_key", "Default/Secret/Access/Key/01"],
104
+ ] }
105
+ it { should eq({
106
+ "default" => {
107
+ "aws_access_key_id" => "DefaultAccessKey01_ANOTHER",
108
+ "aws_secret_access_key" => "Default/Secret/Access/Key/01",
109
+ "region" => "us-west-1"
110
+ }
111
+ }) }
112
+ end
113
+ end
114
+
115
+ describe "#wrap" do
116
+ subject { described_class.new.send(:wrap, profiles) }
117
+
118
+ context "Single profile" do
119
+ let(:profiles) {
120
+ {
121
+ "default" => {
122
+ "aws_access_key_id" => "DefaultAccessKey01",
123
+ "aws_secret_access_key" => "Default/Secret/Access/Key/02",
124
+ "region" => "us-west-1"
125
+ }
126
+ }
127
+ }
128
+ it { should be_a Hash }
129
+ it { should have_key "default" }
130
+ it "should have AWSConfig::Profile as value" do
131
+ expect(subject["default"]).to be_a AWSConfig::Profile
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ describe AWSConfig::Profile do
4
+ subject {
5
+ AWSConfig::Profile.new(
6
+ "default",
7
+ "aws_access_key_id" => "DefaultAccessKey01",
8
+ "aws_secret_access_key" => "Default/Secret/Access/Key/02",
9
+ "region" => "us-west-1"
10
+ )
11
+ }
12
+
13
+ it "should return given name via method" do
14
+ expect(subject.name).to eq "default"
15
+ end
16
+
17
+ it "should respond to methods whose names are same as given entries" do
18
+ expect(subject).to respond_to :aws_access_key_id
19
+ expect(subject).to respond_to :aws_secret_access_key
20
+ expect(subject).to respond_to :region
21
+ end
22
+
23
+ it "should return given entries via methods" do
24
+ expect(subject.aws_access_key_id).to eq "DefaultAccessKey01"
25
+ expect(subject.aws_secret_access_key).to eq "Default/Secret/Access/Key/02"
26
+ expect(subject.region).to eq "us-west-1"
27
+ end
28
+
29
+ it "should return given entries via hash-like methods" do
30
+ expect(subject[:aws_access_key_id]).to eq "DefaultAccessKey01"
31
+ expect(subject[:aws_secret_access_key]).to eq "Default/Secret/Access/Key/02"
32
+ expect(subject[:region]).to eq "us-west-1"
33
+ end
34
+
35
+ it "should raise exceptions if unknown entry is called via methods" do
36
+ expect { subject.unknown_method }.to raise_error NoMethodError
37
+ end
38
+
39
+ it "should return a hash for aws-sdk-ruby's configuration format" do
40
+ expect(subject.config_hash).to eq({
41
+ access_key_id: "DefaultAccessKey01",
42
+ secret_access_key: "Default/Secret/Access/Key/02",
43
+ region: "us-west-1"
44
+ })
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe AWSConfig do
4
+ let(:sample_config_file) { File.expand_path("../../samples/config.txt", __FILE__) }
5
+ before { AWSConfig.config_file = sample_config_file }
6
+
7
+ it "should return an entry in a profile via method" do
8
+ expect(described_class.default.aws_access_key_id).to eq "DefaultAccessKey01"
9
+ expect(described_class.default.region).to eq "us-west-1"
10
+ end
11
+
12
+ it "should return an entry in a profile like hashes" do
13
+ expect(described_class["default"]["aws_access_key_id"]).to eq "DefaultAccessKey01"
14
+ expect(described_class["default"]["region"]).to eq "us-west-1"
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ [default]
2
+ aws_access_key_id=DefaultAccessKey01
3
+ aws_secret_access_key=Default/Secret/Access/Key/02
4
+ # Optional, to define default region for this profile.
5
+ region=us-west-1
6
+
7
+ [profile testing]
8
+ aws_access_key_id=TestingAccessKey03
9
+ aws_secret_access_key=Testing/Secret/Access/Key/04
10
+ region=us-west-2
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require "aws_config"
3
+
4
+ RSpec.configure do |config|
5
+ config.treat_symbols_as_metadata_keys_with_true_values = true
6
+ config.run_all_when_everything_filtered = true
7
+ config.filter_run :focus
8
+
9
+ # Run specs in random order to surface order dependencies. If you find an
10
+ # order dependency and want to debug it, you can fix the order by providing
11
+ # the seed, which is printed after each run.
12
+ # --seed 1234
13
+ config.order = 'random'
14
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aws_config
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Masato Ikeda
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: AWSConfig is a parser for AWS_CONFIG_FILE used in aws-cli.
56
+ email:
57
+ - masato.ikeda@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .rspec
64
+ - Gemfile
65
+ - Guardfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - aws_config.gemspec
70
+ - lib/aws_config.rb
71
+ - lib/aws_config/parser.rb
72
+ - lib/aws_config/profile.rb
73
+ - lib/aws_config/store.rb
74
+ - lib/aws_config/version.rb
75
+ - spec/lib/aws_config/parser_spec.rb
76
+ - spec/lib/aws_config/profile_spec.rb
77
+ - spec/lib/aws_config_spec.rb
78
+ - spec/samples/config.txt
79
+ - spec/spec_helper.rb
80
+ homepage: https://github.com/a2ikm/aws_config
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.1.11
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: AWSConfig is a parser for AWS_CONFIG_FILE used in aws-cli.
104
+ test_files:
105
+ - spec/lib/aws_config/parser_spec.rb
106
+ - spec/lib/aws_config/profile_spec.rb
107
+ - spec/lib/aws_config_spec.rb
108
+ - spec/samples/config.txt
109
+ - spec/spec_helper.rb