super_stack 0.5.3 → 1.0.0

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 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