super_stack 0.5.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9880291db9eb16d90d3e7c467b972007cb7dbc0
4
- data.tar.gz: 8c67ffc30d8061f2234900b779ba491a1c63d6e0
3
+ metadata.gz: 2ee62f30bb0b8ce359573f8d0c8de39392a866c3
4
+ data.tar.gz: 186733047be8988e51c76c09801d6ac93844b634
5
5
  SHA512:
6
- metadata.gz: 94c027bd7b9bbfcb596463709789860375ade141ba2e04448facd9132c35aaab746cc991449caed3e4cb7c1b9891341ecb1bddd339286610089e84ed4b1b78de
7
- data.tar.gz: 18b3971285ce46187050b100d102a4783f9bd72a3e02b7e78e677d54a41118b53ab882e86f9a0ef257ee17a2af725e3edce728ee760a42bfaa7ae3349af4b5f6
6
+ metadata.gz: 43db4607abd8d83241a3fb2645ec2969d3ba2e067016e31046d0ef339081fc564d99df14354d6fba6191f294d91dc45f5b4b9e2388b426086ea53dc1fe80728f
7
+ data.tar.gz: 67c73bd1935eccaa33ff4dbe0c634ae2339eeb0cfc9a7798330bfd541974f71419be0dd1b518d9e9dc59bfd31549bbd26f83b96c0eeea9806dca2fadb1b80040
data/README.md CHANGED
@@ -54,6 +54,26 @@ puts manager[].class # => Hash
54
54
  puts manager.layers.class # => Hash
55
55
  ```
56
56
 
57
+ :warning: Versions prior to `1.0.0` were trying to give an indifferent access to the merged hash for strings
58
+ and symbols, ie `manager[:an_entry]` was giving the same result as `manager['an_entry']`.
59
+
60
+ This is clearly wrong and not consistent everywhere.
61
+ __Starting with version `1.0.0` this is no more the case__. Nevertheless a compatibility mode is provided for
62
+ applications relying on the legacy mechanism, you just need to do:
63
+
64
+ ```ruby
65
+ require 'super_stack'
66
+ SuperStack.set_compatibility_mode
67
+ ```
68
+ or alternatively, you can do:
69
+
70
+ ```ruby
71
+ require 'super_stack/old'
72
+ ```
73
+ which is equivalent.
74
+
75
+
76
+
57
77
  ### Layers
58
78
 
59
79
  Layers are actually simple hashes that include the `SuperStack::LayerWrapper` module. Therefore you can create a layer by
@@ -142,4 +162,3 @@ The alternative is to set the policy at the layer level using `merge_policy=`
142
162
 
143
163
  [DMG]: https://rubygems.org/gems/deep_merge "Deep Merge gem"
144
164
  [DMGithub]: https://github.com/danielsdeleo/deep_merge "Deep Merge Github project"
145
-
@@ -0,0 +1,23 @@
1
+ module SuperStack
2
+ module Compatibility
3
+
4
+ module LayerWrapper
5
+
6
+ private
7
+
8
+ def load_from_yaml(file_name)
9
+ begin
10
+ self.replace Hash[YAML::load(File.open(file_name)).map { |k, v| [k.to_s, v] }]
11
+ rescue NoMethodError => e
12
+ # Empty file...
13
+ raise "Invalid file '#{file_name}'" unless e.message =~ /false:FalseClass/
14
+ end
15
+ @file_name = file_name
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
@@ -0,0 +1,46 @@
1
+ module SuperStack
2
+ module Compatibility
3
+
4
+ module Manager
5
+
6
+ def []=(key,value)
7
+ raise 'No write layer specified' if write_layer.nil?
8
+ write_layer[key.to_s] = value
9
+ end
10
+
11
+ def [](filter=nil)
12
+ layers = to_a
13
+ return [] if layers.empty?
14
+ layers.each { |layer| layer.reload if layer.source_auto_reload?}
15
+ first_layer = layers.shift
16
+ first_layer = first_layer.disabled? ? SuperStack::Layer.new : first_layer
17
+ res = layers.inject(first_layer) do |stack, layer|
18
+ if layer.disabled?
19
+ stack
20
+ else
21
+ policy_to_apply = layer.merge_policy.nil? ? default_merge_policy : layer.merge_policy
22
+ policy_to_apply.merge stack, stringify_keys(layer)
23
+ end
24
+ end
25
+ if filter.nil?
26
+ res.to_hash
27
+ else
28
+ res[filter]
29
+ end
30
+ end
31
+
32
+
33
+
34
+ private
35
+
36
+ def stringify_keys(hash)
37
+ hash.inject({}){|stringified_hash, (key, value)|
38
+ stringified_hash[key.to_s] = value
39
+ stringified_hash
40
+ }
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+ end
@@ -74,15 +74,22 @@ module SuperStack
74
74
  hash.extend self
75
75
  end
76
76
 
77
+ def to_hash
78
+ # Trick to return a bare hash
79
+ {}.merge self
80
+ end
81
+
77
82
  private
78
83
 
79
- def load_from_yaml(file_name)
80
- begin
81
- self.replace Hash[YAML::load(File.open(file_name)).map { |k, v| [k.to_s, v] }]
82
84
 
83
- rescue NoMethodError => e
84
- # Empty file...
85
- raise "Invalid file '#{file_name}'" unless e.message =~ /false:FalseClass/
85
+ def load_from_yaml(file_name)
86
+ raw_content = File.read file_name
87
+ res = YAML.load raw_content
88
+ if res
89
+ self.replace Hash[res.map { |k, v| [k, v] }]
90
+ else
91
+ raise "Invalid file content for '#{file_name}'" unless raw_content.empty?
92
+ clear
86
93
  end
87
94
  @file_name = file_name
88
95
  end
@@ -24,7 +24,7 @@ module SuperStack
24
24
 
25
25
  def []=(key,value)
26
26
  raise 'No write layer specified' if write_layer.nil?
27
- write_layer[key.to_s] = value
27
+ write_layer[key] = value
28
28
  end
29
29
 
30
30
  def [](filter=nil)
@@ -38,14 +38,13 @@ module SuperStack
38
38
  stack
39
39
  else
40
40
  policy_to_apply = layer.merge_policy.nil? ? default_merge_policy : layer.merge_policy
41
- policy_to_apply.merge stack, stringify_keys(layer)
41
+ policy_to_apply.merge stack, layer
42
42
  end
43
43
  end
44
44
  if filter.nil?
45
- # Trick to return a bare hash
46
- {}.merge res
45
+ res.to_hash
47
46
  else
48
- res[filter.to_s]
47
+ res[filter]
49
48
  end
50
49
  end
51
50
 
@@ -102,13 +101,6 @@ module SuperStack
102
101
 
103
102
  private
104
103
 
105
- def stringify_keys(hash)
106
- hash.inject({}){|stringified_hash, (key, value)|
107
- stringified_hash[key.to_s] = value
108
- stringified_hash
109
- }
110
- end
111
-
112
104
 
113
105
  def get_existing_layer(layer_or_layer_name, error_message)
114
106
  layer_name = layer_or_layer_name.to_s if layer_or_layer_name.is_a? Symbol
@@ -0,0 +1,3 @@
1
+ require 'super_stack'
2
+
3
+ SuperStack.set_compatibility_mode
@@ -1,3 +1,3 @@
1
1
  module SuperStack
2
- VERSION = '0.5.3'
2
+ VERSION = '1.0.0'
3
3
  end
data/lib/super_stack.rb CHANGED
@@ -4,3 +4,19 @@ require 'super_stack/layer_wrapper'
4
4
  require 'super_stack/layer'
5
5
  require 'super_stack/manager'
6
6
 
7
+ module SuperStack
8
+
9
+ def self.set_compatibility_mode
10
+ require 'super_stack/compatibility/layer_wrapper'
11
+ require 'super_stack/compatibility/manager'
12
+
13
+ SuperStack::Manager.class_eval do
14
+ include SuperStack::Compatibility::Manager
15
+ end
16
+
17
+ SuperStack::LayerWrapper.module_eval do
18
+ include SuperStack::Compatibility::LayerWrapper
19
+ end
20
+ end
21
+
22
+ end
data/spec/manager_spec.rb CHANGED
@@ -5,19 +5,20 @@ describe SuperStack::Manager do
5
5
  subject {described_class.new}
6
6
 
7
7
  (1..4).each do |layer_number|
8
- let("layer#{layer_number}".to_sym) {
8
+ let("layer#{layer_number}".to_sym) do
9
9
  file_name = file_from_layer layer_number
10
10
  layer = SuperStack::Layer.new
11
11
  layer.load file_name
12
12
  layer.name = "layer#{layer_number}"
13
13
  layer
14
- }
14
+ end
15
15
  end
16
- let(:override) {
16
+
17
+ let(:override) do
17
18
  override = SuperStack::Layer.new
18
19
  override.name = :override
19
20
  override
20
- }
21
+ end
21
22
 
22
23
 
23
24
  it 'should contain layers' do
@@ -76,13 +77,13 @@ describe SuperStack::Manager do
76
77
  expect(subject.layers.keys[1] == "#{SuperStack::Layer::DEFAULT_LAYER_NAME} #2").to be_truthy
77
78
  end
78
79
 
79
- it 'should allow to reload all layers at once' do
80
+ it 'should provide a dynamic merge' do
80
81
  subject.add_layer layer1
81
82
  subject << {bar: :foo}
82
83
  subject.add_layer layer3
83
84
  subject.add_layer layer4
84
85
  expect(subject[:foo]).not_to eq :bar
85
- subject.layers['layer3']['foo'] = :bar
86
+ subject.layers['layer3'][:foo] = :bar
86
87
  expect(subject[:foo]).to eq :bar
87
88
  expect(subject[:bar]).to eq :foo
88
89
  expect {subject.reload_layers}.not_to raise_error
@@ -111,9 +112,9 @@ describe SuperStack::Manager do
111
112
  subject << layer1
112
113
  subject.write_layer = override
113
114
  expect {subject[:foo] = :bar}.not_to raise_error
114
- expect(subject.layers['override']['foo']).to eq :bar
115
+ expect(subject.layers['override'][:foo]).to eq :bar
115
116
  expect(subject[:foo]).to eq :bar
116
- expect(subject['foo']).to eq :bar
117
+ expect(subject['foo']).not_to eq :bar
117
118
  end
118
119
 
119
120
 
@@ -147,7 +148,7 @@ describe SuperStack::Manager do
147
148
  subject.default_merge_policy = policy
148
149
  expect(subject[].is_a? Hash).to be_truthy
149
150
  policy == SuperStack::MergePolicies::KeepPolicy ?
150
- expect(subject[:layer] == 'one').to(be_truthy) : expect(subject[:layer] == 'four').to(be_truthy)
151
+ expect(subject[:layer]).to(eq 'one') : expect(subject[:layer]).to(eq 'four')
151
152
  end
152
153
  end
153
154
 
@@ -209,10 +210,9 @@ describe SuperStack::Manager do
209
210
  subject.write_layer = :layer3
210
211
  expect(subject.write_layer).to eq layer3
211
212
  subject[:foo] = :bar
212
- expect(layer3['foo']).to eq :bar
213
+ expect(layer3[:foo]).to eq :bar
213
214
  subject.remove_layer :layer3
214
215
  expect(subject[:foo]).not_to eq :bar
215
- expect(subject['foo']).not_to eq :bar
216
216
  expect(subject.write_layer).to be_nil
217
217
  end
218
218
 
@@ -229,7 +229,7 @@ describe SuperStack::Manager do
229
229
  s
230
230
  }
231
231
 
232
- it 'should not been taken in account in the merge' do
232
+ it 'should not be taken in account in the merge' do
233
233
  subject.disable_layer :layer3
234
234
  expect(subject[:from_layer_3]).to be_nil
235
235
  expect(subject[:from_layer_1]).not_to be_nil
@@ -297,7 +297,7 @@ describe SuperStack::Manager do
297
297
  it 'should reflect any change applied to the source' do
298
298
  subject << synced_layer
299
299
  File.open(source_file, 'a') do |f|
300
- f.puts 'extra_foo: extra_bar'
300
+ f.puts ':extra_foo: extra_bar'
301
301
  end
302
302
  expect(subject[:extra_foo]).to eq 'extra_bar'
303
303
  end
data/spec/spec_helper.rb CHANGED
@@ -16,6 +16,7 @@
16
16
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
17
17
 
18
18
  require 'super_stack'
19
+ SuperStack.set_compatibility_mode
19
20
 
20
21
 
21
22
  def file_from_layer(layer_number)
@@ -1,3 +1,4 @@
1
1
  - One
2
2
  - two
3
- - three
3
+ - three
4
+ - :four
@@ -1,9 +1,9 @@
1
- layer: one
1
+ :layer: one
2
2
 
3
- from_layer_1:
3
+ :from_layer_1:
4
4
  stupid-data: stupid in one
5
5
 
6
- to-be-merged:
6
+ :to-be-merged:
7
7
  name: from layer 1
8
8
  my-prop: property one
9
9
  my-array:
@@ -1,9 +1,9 @@
1
- layer: two
1
+ :layer: two
2
2
 
3
- from_layer_2:
3
+ :from_layer_2:
4
4
  stupid-data: stupid in two
5
5
 
6
- to-be-merged:
6
+ :to-be-merged:
7
7
  name: from layer 2
8
8
  my-prop: property two
9
9
  my-array:
@@ -1,9 +1,9 @@
1
- layer: three
1
+ :layer: three
2
2
 
3
- from_layer_3:
3
+ :from_layer_3:
4
4
  stupid-data: stupid in three
5
5
 
6
- to-be-merged:
6
+ :to-be-merged:
7
7
  name: from layer 3
8
8
  my-prop: property three
9
9
  my-array:
@@ -1,9 +1,9 @@
1
- layer: four
1
+ :layer: four
2
2
 
3
- from_layer_4:
3
+ :from_layer_4:
4
4
  stupid-data: stupid in four
5
5
 
6
- to-be-merged:
6
+ :to-be-merged:
7
7
  name: from layer 4
8
8
  my-prop: property four
9
9
  my-array:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: super_stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent B.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-09 00:00:00.000000000 Z
11
+ date: 2016-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -110,6 +110,8 @@ files:
110
110
  - README.md
111
111
  - Rakefile
112
112
  - lib/super_stack.rb
113
+ - lib/super_stack/compatibility/layer_wrapper.rb
114
+ - lib/super_stack/compatibility/manager.rb
113
115
  - lib/super_stack/layer.rb
114
116
  - lib/super_stack/layer_wrapper.rb
115
117
  - lib/super_stack/manager.rb
@@ -118,6 +120,7 @@ files:
118
120
  - lib/super_stack/merge_policies/keep_policy.rb
119
121
  - lib/super_stack/merge_policies/override_policy.rb
120
122
  - lib/super_stack/merge_policies/standard_merge_policy.rb
123
+ - lib/super_stack/old.rb
121
124
  - lib/super_stack/version.rb
122
125
  - spec/layer_spec.rb
123
126
  - spec/manager_spec.rb