rivet 2.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +4 -4
  4. data/.travis.yml +5 -5
  5. data/CHANGELOG.md +7 -0
  6. data/Gemfile +4 -2
  7. data/Gemfile.lock +42 -26
  8. data/README.md +61 -10
  9. data/bin/rivet +14 -9
  10. data/example/ec2/defaults.rb +6 -0
  11. data/example/ec2/example.rb +8 -0
  12. data/example/ec2/user_data.erb +2 -0
  13. data/lib/rivet/{autoscale.rb → as/autoscale.rb} +33 -4
  14. data/lib/rivet/{config.rb → as/autoscale_config.rb} +3 -33
  15. data/lib/rivet/{launch_config.rb → as/launch_config.rb} +8 -11
  16. data/lib/rivet/{aws_utils.rb → common/aws_utils.rb} +27 -29
  17. data/lib/rivet/common/base_aws_attributes.rb +15 -0
  18. data/lib/rivet/common/base_config.rb +40 -0
  19. data/lib/rivet/{client.rb → common/client.rb} +11 -10
  20. data/lib/rivet/ec2/ec2.rb +163 -0
  21. data/lib/rivet/ec2/ec2_config.rb +19 -0
  22. data/lib/rivet/utils.rb +4 -3
  23. data/lib/rivet/version.rb +1 -1
  24. data/lib/rivet.rb +16 -11
  25. data/rivet.gemspec +6 -5
  26. data/spec/as/autoscale_config_spec.rb +65 -0
  27. data/spec/{aws_autoscale_wrapper_spec.rb → as/aws_autoscale_wrapper_spec.rb} +1 -1
  28. data/spec/aws_utils_spec.rb +44 -0
  29. data/spec/base_config_spec.rb +31 -0
  30. data/spec/bootstrap_spec.rb +1 -1
  31. data/spec/ec2/ec2_config_spec.rb +29 -0
  32. data/spec/launch_config_spec.rb +1 -1
  33. data/spec/shared_examples/a_config.rb +98 -0
  34. data/spec/shared_examples/a_config_util.rb +33 -0
  35. data/spec/spec_setup.rb +63 -39
  36. data/spec/util_spec.rb +16 -23
  37. metadata +63 -43
  38. data/lib/rivet/deep_merge.rb +0 -29
  39. data/spec/config_spec.rb +0 -168
  40. /data/lib/rivet/{aws_autoscale_wrapper.rb → as/aws_autoscale_wrapper.rb} +0 -0
  41. /data/lib/rivet/{bootstrap.rb → common/bootstrap.rb} +0 -0
  42. /data/lib/rivet/{config_proxy.rb → common/config_proxy.rb} +0 -0
  43. /data/lib/rivet/{logger.rb → common/logger.rb} +0 -0
  44. /data/lib/rivet/{open_state.rb → common/open_state.rb} +0 -0
@@ -0,0 +1,98 @@
1
+ # encoding: UTF-8
2
+
3
+ shared_examples_for "a config" do
4
+ context 'without DSL content' do
5
+ describe '#name' do
6
+ it 'returns the name' do
7
+ default_config.name.should == 'default_unit_test_config'
8
+ end
9
+ end
10
+
11
+ describe '#bootstrap' do
12
+ before do
13
+ default_config.bootstrap.unit_test 'goat simulator'
14
+ end
15
+
16
+ it 'should allow you to set an arbitrary bootstrap value' do
17
+ default_config.bootstrap.unit_test.should == 'goat simulator'
18
+ end
19
+ end
20
+
21
+ describe '#path' do
22
+ context 'with no arguments' do
23
+ it 'returns the default . path' do
24
+ default_config.path.should == '.'
25
+ end
26
+ end
27
+ context 'with an argument' do
28
+ it 'returns the set path joined with the argument' do
29
+ default_config.path('test').should == './test'
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '#normalize_security_groups' do
35
+ before do
36
+ default_config.security_groups %w(group2 group1 group3)
37
+ end
38
+
39
+ it 'should return a sorted array of security groups' do
40
+ default_config.normalize_security_groups.should == %w(group1 group2 group3)
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'with DSL content' do
46
+ describe '#name' do
47
+ it 'returns the name' do
48
+ config.name.should == 'unit_test_config'
49
+ end
50
+ end
51
+
52
+ describe 'generated attributes' do
53
+ it 'should contain all the attributes defined in the DSL CONTENT' do
54
+ dsl_values.each_pair do |k, v|
55
+ # bootstrap is an attribute of the BaseConfig class, not a generated one
56
+ unless k == :bootstrap
57
+ config.generated_attributes.should include(k)
58
+ end
59
+ end
60
+ end
61
+
62
+ it 'should have all values properly set according to the DSL CONTENT' do
63
+ dsl_values.each_pair do |k, v|
64
+ unless k == :bootstrap
65
+ config.send(k).should == eval(v)
66
+ end
67
+ end
68
+ if dsl_values.key? :bootstrap
69
+ dsl_values[:bootstrap].each_pair do |k, v|
70
+ config.bootstrap.send(k).should == eval(v)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ tempdir_context 'with DSL content inside of a file on disk' do
78
+ before do
79
+ File.open('unit_test.rb', 'w') { |f| f.write(config_content) }
80
+ end
81
+
82
+ describe '::from_file' do
83
+ it 'should have all values properly set according to the DSL CONTENT' do
84
+ dsl_values.each_pair do |k, v|
85
+ unless k == :bootstrap
86
+ config_from_file.send(k).should == eval(v)
87
+ end
88
+ end
89
+ if dsl_values.key? :bootstrap
90
+ dsl_values[:bootstrap].each_pair do |k, v|
91
+ config_from_file.bootstrap.send(k).should == eval(v)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+
3
+ shared_examples 'a config util' do
4
+ tempdir_context 'with an existing config directory' do
5
+
6
+ before do
7
+ FileUtils.mkdir_p config_dir
8
+ end
9
+
10
+ context 'without an existing configuration' do
11
+ describe '#get_config' do
12
+ it 'should return false' do
13
+ Rivet::Utils.get_config('autoscale','unit_test', config_dir).should be_false
14
+ end
15
+ end
16
+ end
17
+
18
+ context 'with a configuration file' do
19
+ before do
20
+ File.open(config_file, 'w') { |f| f.write(config_content) }
21
+ end
22
+
23
+ describe '#get_config' do
24
+ it 'should return a valid configuration' do
25
+ config = Rivet::Utils.get_config('autoscale', 'unit_test', config_dir)
26
+ valid_config?(config, dsl_values)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+
data/spec/spec_setup.rb CHANGED
@@ -9,62 +9,91 @@ require_relative '../lib/rivet'
9
9
  Rivet::Log.level(Logger::FATAL)
10
10
 
11
11
  module SpecHelpers
12
+
13
+ def self.generate_config_content(values)
14
+ values.inject(String.new) do |a, (k, v)|
15
+ if k == :bootstrap
16
+ v.each_pair do |bootstrap_attr, bootstrap_value|
17
+ a << "bootstrap.#{bootstrap_attr} #{bootstrap_value}\n"
18
+ end
19
+ else
20
+ a << "#{k} #{v}\n"
21
+ end
22
+ a
23
+ end
24
+ end
25
+
12
26
  AUTOSCALE_DIR = File.join('.', 'autoscale')
13
- CONFIG_FILE = File.join(AUTOSCALE_DIR, 'unit_test.rb')
27
+ ASG_CONFIG_FILE = File.join(AUTOSCALE_DIR, 'unit_test.rb')
28
+ EC2_DIR = File.join('.', 'ec2')
29
+ EC2_CONFIG_FILE = File.join(EC2_DIR, 'unit_test.rb')
30
+
14
31
  TEMPLATE_FILE = File.join(AUTOSCALE_DIR, 'default.erb')
15
32
  BOOTSTRAP_TEMPLATE = '<%= "bar" %>'\
16
33
 
17
- DSL_VALUES = {
34
+ COMMON_DSL_VALUES = {
35
+ :iam_instance_profile => "'ec2_unit_test_profile'",
36
+ :block_device_mappings => "[{:device_name => '/dev/sda1', :virtual_name => 'ephemeral0'}]",
37
+ :placement_group => "'unit test placement group'",
38
+ :image_id => "'ami-12345678'",
39
+ :key_name => "'UnitTests'",
40
+ :security_groups => '%w(unit_test3 unit_tests1 unit_tests2)',
41
+ :instance_type => "'m1.large'",
42
+ :kernel_id => "'aki-12345678'",
43
+ :ramdisk_id => "'ari-12345678'",
44
+ :associate_public_ip_address => 'false'
45
+ }
46
+
47
+ EC2_DSL_VALUES = {
48
+ :count => '1',
49
+ :monitoring_enabled => 'true',
50
+ :availability_zone => "'a'",
51
+ :placement_group => "'unit test placement group'",
52
+ :key_pair => "''",
53
+ :security_group_ids => '%w(sg-12345678 sg-01234567 sg-801234567)',
54
+ :user_data => "'ec2 user data'",
55
+ :disable_api_termination => 'false',
56
+ :instance_initiated_shutdown_behavior => "'Stop'",
57
+ :subnet => "'subnet-4292a736'",
58
+ :private_ip_address => "'10.129.64.2'",
59
+ :dedicated_tenancy => 'false',
60
+ :ebs_optimized => 'false',
61
+ }.merge(COMMON_DSL_VALUES)
62
+
63
+ ASG_DSL_VALUES = {
18
64
  :min_size => '1',
19
65
  :desired_capacity => '1',
20
66
  :max_size => '3',
21
67
  :region => "'us-west-2'",
22
68
  :availability_zones => '%w(b c a)',
23
- :key_name => "'UnitTests'",
24
- :instance_type => "'m1.large'",
25
- :security_groups => '%w(unit_test3 unit_tests1 unit_tests2)',
26
- :image_id => "'ami-12345678'",
27
- :iam_instance_profile => "'unit_test_profile'",
28
69
  :default_cooldown => '300',
29
- :placement_group => "'unit test placement group'",
30
70
  :health_check_type => ':ec2',
31
71
  :termination_policies => '%w(policy2 policy1)',
32
72
  :load_balancers => '%w(balancer2 balancer1)',
33
73
  :health_check_grace_period => '100',
34
- :associate_public_ip_address => 'true',
35
74
  :detailed_instance_monitoring => 'true',
36
- :block_device_mappings => "[{:device_name => '/dev/sda1', :virtual_name => 'ephemeral0'}]",
37
- :kernel_id => "'aki-12345678'",
38
- :ramdisk_id => "'ari-12345678'",
39
75
  :spot_price => "'0.01'",
40
76
  :bootstrap => {
41
77
  :template => "'#{TEMPLATE_FILE}'",
42
78
  :foo => "'bar'"
43
79
  }
44
- }
45
- DSL_CONFIG_CONTENT = DSL_VALUES.inject(String.new) do |a, (k, v)|
46
- if k == :bootstrap
47
- v.each_pair do |bootstrap_attr, bootstrap_value|
48
- a << "bootstrap.#{bootstrap_attr} #{bootstrap_value}\n"
49
- end
50
- else
51
- a << "#{k} #{v}\n"
52
- end
53
- a
54
- end
80
+ }.merge(COMMON_DSL_VALUES)
81
+
82
+ ASG_CONFIG_CONTENT = generate_config_content ASG_DSL_VALUES
83
+ EC2_CONFIG_CONTENT = generate_config_content EC2_DSL_VALUES
55
84
 
56
85
  AUTOSCALE_IDENTITY_STRING = "bootstrap#{Base64.encode64('unit_test_user_data')}"\
57
- "iam_instance_profile#{Base64.encode64(eval(DSL_VALUES[:iam_instance_profile]))}"\
58
- "image_id#{Base64.encode64(eval(DSL_VALUES[:image_id]))}"\
59
- "instance_type#{Base64.encode64(eval(DSL_VALUES[:instance_type]))}"\
60
- "key_name#{Base64.encode64(eval(DSL_VALUES[:key_name]))}"\
61
- "security_groups#{Base64.encode64(eval(DSL_VALUES[:security_groups]).join("\t"))}"\
62
- "associate_public_ip_address#{Base64.encode64(eval(DSL_VALUES[:associate_public_ip_address]).to_s)}"\
63
- "detailed_instance_monitoring#{Base64.encode64(eval(DSL_VALUES[:detailed_instance_monitoring]).to_s)}"\
64
- "block_device_mappings#{Base64.encode64(eval(DSL_VALUES[:block_device_mappings]).join("\t"))}"\
65
- "kernel_id#{Base64.encode64(eval(DSL_VALUES[:kernel_id]))}"\
66
- "ramdisk_id#{Base64.encode64(eval(DSL_VALUES[:ramdisk_id]))}"\
67
- "spot_price#{Base64.encode64(eval(DSL_VALUES[:spot_price]))}"
86
+ "detailed_instance_monitoring#{Base64.encode64(eval(ASG_DSL_VALUES[:detailed_instance_monitoring]).to_s)}"\
87
+ "spot_price#{Base64.encode64(eval(ASG_DSL_VALUES[:spot_price]))}" \
88
+ "iam_instance_profile#{Base64.encode64(eval(ASG_DSL_VALUES[:iam_instance_profile]))}"\
89
+ "block_device_mappings#{Base64.encode64(eval(ASG_DSL_VALUES[:block_device_mappings]).join("\t"))}"\
90
+ "image_id#{Base64.encode64(eval(ASG_DSL_VALUES[:image_id]))}"\
91
+ "key_name#{Base64.encode64(eval(ASG_DSL_VALUES[:key_name]))}"\
92
+ "security_groups#{Base64.encode64(eval(ASG_DSL_VALUES[:security_groups]).join("\t"))}"\
93
+ "instance_type#{Base64.encode64(eval(ASG_DSL_VALUES[:instance_type]))}"\
94
+ "kernel_id#{Base64.encode64(eval(ASG_DSL_VALUES[:kernel_id]))}"\
95
+ "ramdisk_id#{Base64.encode64(eval(ASG_DSL_VALUES[:ramdisk_id]))}"\
96
+ "associate_public_ip_address#{Base64.encode64(eval(ASG_DSL_VALUES[:associate_public_ip_address]).to_s)}"
68
97
 
69
98
  def tempdir_context(name, &block)
70
99
  context name do
@@ -83,11 +112,6 @@ module SpecHelpers
83
112
  end
84
113
  end
85
114
 
86
- def dsl_from_hash(hash)
87
-
88
-
89
- end
90
-
91
115
  def generate_config_mock(mock, attrs)
92
116
  attrs.each_pair do |a, v|
93
117
  if v.respond_to? :each_pair
data/spec/util_spec.rb CHANGED
@@ -1,34 +1,27 @@
1
1
  # encoding: UTF-8
2
2
  require_relative './spec_setup'
3
+ require_relative './shared_examples/a_config_util'
3
4
 
4
5
  include SpecHelpers
5
6
 
6
- describe 'rivet utils' do
7
- tempdir_context 'with an autoscale directory' do
8
- before do
9
- FileUtils.mkdir_p AUTOSCALE_DIR
10
- end
7
+ describe "rivet utils" do
8
+ context "with client_type set to autoscale" do
11
9
 
12
- context 'without an existing configuration' do
13
- describe '#get_config' do
14
- it 'should return false' do
15
- Rivet::Utils.get_config('unit_test', AUTOSCALE_DIR).should be_false
16
- end
17
- end
18
- end
10
+ let(:config_dir) { AUTOSCALE_DIR }
11
+ let(:config_content) { ASG_CONFIG_CONTENT }
12
+ let(:config_file) { ASG_CONFIG_FILE }
13
+ let(:dsl_values) { ASG_DSL_VALUES }
19
14
 
20
- context 'with a configuration file' do
21
- before do
22
- File.open(CONFIG_FILE, 'w') { |f| f.write(DSL_CONFIG_CONTENT) }
23
- end
15
+ it_behaves_like "a config util"
16
+ end
24
17
 
25
- describe '#get_config' do
26
- it 'should return a valid configuration' do
27
- config = Rivet::Utils.get_config('unit_test', AUTOSCALE_DIR)
28
- valid_config?(config, DSL_VALUES)
29
- end
30
- end
31
- end
18
+ context "with client_type set to ec2" do
19
+ let(:config_dir) { EC2_DIR }
20
+ let(:config_content) { EC2_CONFIG_CONTENT }
21
+ let(:config_file) { EC2_CONFIG_FILE }
22
+ let(:dsl_values) { EC2_DSL_VALUES }
32
23
 
24
+ it_behaves_like "a config util"
33
25
  end
26
+
34
27
  end
metadata CHANGED
@@ -1,78 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rivet
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 3.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Brian Bianco
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-06-24 00:00:00.000000000 Z
11
+ date: 2014-12-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: aws-sdk
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.11.1
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 1.11.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: diff-lcs
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.5
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: pry
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ~>
45
+ - - "~>"
36
46
  - !ruby/object:Gem::Version
37
47
  version: 0.9.12
38
48
  type: :development
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ~>
52
+ - - "~>"
44
53
  - !ruby/object:Gem::Version
45
54
  version: 0.9.12
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: rake
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ! '>='
59
+ - - ">="
52
60
  - !ruby/object:Gem::Version
53
61
  version: 10.1.0
54
62
  type: :development
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
- - - ! '>='
66
+ - - ">="
60
67
  - !ruby/object:Gem::Version
61
68
  version: 10.1.0
62
69
  - !ruby/object:Gem::Dependency
63
70
  name: rspec
64
71
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
72
  requirements:
67
- - - ~>
73
+ - - "~>"
68
74
  - !ruby/object:Gem::Version
69
75
  version: 2.14.1
70
76
  type: :development
71
77
  prerelease: false
72
78
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
79
  requirements:
75
- - - ~>
80
+ - - "~>"
76
81
  - !ruby/object:Gem::Version
77
82
  version: 2.14.1
78
83
  description: Rivet allows you to define autoscaling groups and launch configurations
@@ -84,9 +89,9 @@ executables:
84
89
  extensions: []
85
90
  extra_rdoc_files: []
86
91
  files:
87
- - .gitignore
88
- - .rubocop.yml
89
- - .travis.yml
92
+ - ".gitignore"
93
+ - ".rubocop.yml"
94
+ - ".travis.yml"
90
95
  - CHANGELOG.md
91
96
  - Gemfile
92
97
  - Gemfile.lock
@@ -97,60 +102,75 @@ files:
97
102
  - bin/rivet
98
103
  - example/autoscale/defaults.rb
99
104
  - example/autoscale/example_group.rb
105
+ - example/ec2/defaults.rb
106
+ - example/ec2/example.rb
107
+ - example/ec2/user_data.erb
100
108
  - lib/rivet.rb
101
- - lib/rivet/autoscale.rb
102
- - lib/rivet/aws_autoscale_wrapper.rb
103
- - lib/rivet/aws_utils.rb
104
- - lib/rivet/bootstrap.rb
105
- - lib/rivet/client.rb
106
- - lib/rivet/config.rb
107
- - lib/rivet/config_proxy.rb
108
- - lib/rivet/deep_merge.rb
109
- - lib/rivet/launch_config.rb
110
- - lib/rivet/logger.rb
111
- - lib/rivet/open_state.rb
109
+ - lib/rivet/as/autoscale.rb
110
+ - lib/rivet/as/autoscale_config.rb
111
+ - lib/rivet/as/aws_autoscale_wrapper.rb
112
+ - lib/rivet/as/launch_config.rb
113
+ - lib/rivet/common/aws_utils.rb
114
+ - lib/rivet/common/base_aws_attributes.rb
115
+ - lib/rivet/common/base_config.rb
116
+ - lib/rivet/common/bootstrap.rb
117
+ - lib/rivet/common/client.rb
118
+ - lib/rivet/common/config_proxy.rb
119
+ - lib/rivet/common/logger.rb
120
+ - lib/rivet/common/open_state.rb
121
+ - lib/rivet/ec2/ec2.rb
122
+ - lib/rivet/ec2/ec2_config.rb
112
123
  - lib/rivet/utils.rb
113
124
  - lib/rivet/version.rb
114
125
  - rivet.gemspec
115
- - spec/aws_autoscale_wrapper_spec.rb
126
+ - spec/as/autoscale_config_spec.rb
127
+ - spec/as/aws_autoscale_wrapper_spec.rb
128
+ - spec/aws_utils_spec.rb
129
+ - spec/base_config_spec.rb
116
130
  - spec/bootstrap_spec.rb
117
131
  - spec/config_proxy_spec.rb
118
- - spec/config_spec.rb
132
+ - spec/ec2/ec2_config_spec.rb
119
133
  - spec/launch_config_spec.rb
120
134
  - spec/open_state_spec.rb
135
+ - spec/shared_examples/a_config.rb
136
+ - spec/shared_examples/a_config_util.rb
121
137
  - spec/spec_setup.rb
122
138
  - spec/util_spec.rb
123
139
  homepage: http://www.github.com/brianbianco/rivet
124
140
  licenses:
125
141
  - Apache2
142
+ metadata: {}
126
143
  post_install_message:
127
144
  rdoc_options: []
128
145
  require_paths:
129
146
  - lib
130
147
  required_ruby_version: !ruby/object:Gem::Requirement
131
- none: false
132
148
  requirements:
133
- - - ! '>='
149
+ - - ">="
134
150
  - !ruby/object:Gem::Version
135
151
  version: 1.9.1
136
152
  required_rubygems_version: !ruby/object:Gem::Requirement
137
- none: false
138
153
  requirements:
139
- - - ! '>='
154
+ - - ">="
140
155
  - !ruby/object:Gem::Version
141
156
  version: 1.3.6
142
157
  requirements: []
143
158
  rubyforge_project:
144
- rubygems_version: 1.8.23
159
+ rubygems_version: 2.4.2
145
160
  signing_key:
146
- specification_version: 3
161
+ specification_version: 4
147
162
  summary: A tool for managing autoscaling groups
148
163
  test_files:
149
- - spec/aws_autoscale_wrapper_spec.rb
164
+ - spec/as/autoscale_config_spec.rb
165
+ - spec/as/aws_autoscale_wrapper_spec.rb
166
+ - spec/aws_utils_spec.rb
167
+ - spec/base_config_spec.rb
150
168
  - spec/bootstrap_spec.rb
151
169
  - spec/config_proxy_spec.rb
152
- - spec/config_spec.rb
170
+ - spec/ec2/ec2_config_spec.rb
153
171
  - spec/launch_config_spec.rb
154
172
  - spec/open_state_spec.rb
173
+ - spec/shared_examples/a_config.rb
174
+ - spec/shared_examples/a_config_util.rb
155
175
  - spec/spec_setup.rb
156
176
  - spec/util_spec.rb
@@ -1,29 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- class Hash
4
- # Returns a new hash with +self+ and +other_hash+ merged recursively.
5
- #
6
- # h1 = { x: { y: [4,5,6] }, z: [7,8,9] }
7
- # h2 = { x: { y: [7,8,9] }, z: 'xyz' }
8
- #
9
- # h1.deep_merge(h2) #=> {x: {y: [7, 8, 9]}, z: "xyz"}
10
- # h2.deep_merge(h1) #=> {x: {y: [4, 5, 6]}, z: [7, 8, 9]}
11
- # h1.deep_merge(h2) { |key, old, new| Array.wrap(old) + Array.wrap(new) }
12
- # #=> {:x=>{:y=>[4, 5, 6, 7, 8, 9]}, :z=>[7, 8, 9, "xyz"]}
13
- def deep_merge(other_hash, &block)
14
- dup.deep_merge!(other_hash, &block)
15
- end
16
-
17
- # Same as +deep_merge+, but modifies +self+.
18
- def deep_merge!(other_hash, &block)
19
- other_hash.each_pair do |k, v|
20
- tv = self[k]
21
- if tv.is_a?(Hash) && v.is_a?(Hash)
22
- self[k] = tv.deep_merge(v, &block)
23
- else
24
- self[k] = block && tv ? block.call(k, tv, v) : v
25
- end
26
- end
27
- self
28
- end
29
- end