super_stack 0.0.2 → 0.1.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: a294ebb0f063bbe92fa34ae949daa7600db5143d
4
- data.tar.gz: 138e2b64f4dcff40756b94ff72cd6fd2fbf70dcf
3
+ metadata.gz: 9a35826dd6aa1c436784d40750be42b5d903a9e8
4
+ data.tar.gz: 4036c864e855b5a9f420953ef0d99f4e83acbc36
5
5
  SHA512:
6
- metadata.gz: d459615c5cf1dc58f135cac32e4c39963c976d2ae62013391788b193be1c33b1b606745250b7dcab6edc7636d2aa64850fe07ce9a410b4d4f68d815a2126a948
7
- data.tar.gz: a68bf1915f90e400d95072b7d82078a77288698778e6fab033d89f12e6b52f72e2edca02bdacba6f6d399f9e08d510c06335614e870ef1e2cf6af84ffbe2d4e0
6
+ metadata.gz: 79a519c5e1a9f202ce7ff2d2be502f94adb204a6b6c9e52775e56d6d0c0dd679add921e772c250bafcbba89c925872bbd7d10dc74964231b1e4af91281968579
7
+ data.tar.gz: b0a89dffd813a711c242498bcda46882c1f3b5dd941fe79056aa423cf57c4bed0888e88946b151af11b312bce2430eceeaf6ca75a1ef21a95fb1f3f61ddf4143
data/README.md CHANGED
@@ -21,7 +21,96 @@ Or install it yourself as:
21
21
 
22
22
  ## Usage
23
23
 
24
- TODO: Write usage instructions here
24
+ ### Create a manager
25
+
26
+ The manager contains your different layers (hashes basically), allows you to set priorities among them, and provides
27
+ a policy to merge them.
28
+
29
+ To use the manager, you just need to:
30
+
31
+ ```ruby
32
+ require 'super_stack'
33
+
34
+ manager = SuperStack::Manager.new
35
+ ```
36
+
37
+ This is from the manager, that you will get the result of the merge of the different layers. Use `manager[]` to access
38
+ the result of the merge of all layers as a hash. It will be done according to the priority the layers have and the merge
39
+ policy chosen.
40
+
41
+ You can directly access to a particular key of the resulting merging by simply doing `manager[:your_key]` like you would
42
+ do with a hash. (`manager` itself has no `Hash` in its ancestors, whereas `manager[]` *is* actually a `Hash`).
43
+
44
+ **None of the layers is modified by the manager**.
45
+
46
+
47
+ ### Layers
48
+
49
+ Layers are actually simple hashes that include the `SuperStack::LayerWrapper` module. Therefore you can create a layer by
50
+ different means:
51
+
52
+ * by invoking `SuperStack::Layer.new`. You can use you all options you would use on a hash.
53
+ * by calling `SuperStack::LayerWrapper.from_hash(your_hash)`. That will just add the module `SuperStack::LayerWrapper`
54
+ to your hash.
55
+ * by adding manually adding the module to your hash (`your_hash.extend SuperStack::LayerWrapper`), which is strictly
56
+ equivalent to the previous method.
57
+
58
+ When you create a new layer from scratch or by extending your own hash, it has automatically a name assigned, and no
59
+ particular priority. but as soon as it is added to a manager by doing either `manager << your_hash_or_layer` or
60
+ `manager.add_layer(your_hash_or_layer)`, it will see its name automatically changed (numbers automatically added) **if
61
+ the name conflicts with another layer already handled by the manager**.
62
+
63
+ You can notice by the way that it gives a third way to create a layer from a hash, as when adding a hash to a manager,
64
+ it automatically adds the `SuperStack::LayerWrapper` module to the hash.
65
+
66
+ Layers can be populated from a file anytime using the `load` method:
67
+
68
+ ```ruby
69
+ layer = SuperStack::Layer.new.load 'a_file_somewhere'
70
+ # Once loaded you can get the file name used to load the layed anytime
71
+ puts layer.file_name
72
+ # And you can load or reload the layer
73
+ layer.has_file? # => true
74
+ layer.load
75
+ layer.reload
76
+ ```
77
+
78
+ On top of this you can reload all the layers which have an associated file at once using the manager. If a layer has
79
+ no associated `file_name`, it won't be altered.
80
+
81
+ ```ruby
82
+ layer1 = SuperStack::Layer.new.load 'a_file_somewhere'
83
+ layer1 = SuperStack::Layer.new.load 'another_file_somewhere'
84
+ manager = SuperStack::Manager.new
85
+
86
+ manager << layer1
87
+ manager << layer2
88
+
89
+ manager.reload_layers
90
+ ```
91
+
92
+
93
+ ### Merge policies
94
+
95
+ You can get the list of merge policies by doing `SuperStack::MergePolicies.list`, but basically, four types currently
96
+ exist:
97
+
98
+ * `SuperStack::MergePolicies::KeepPolicy`, that when merging two layers will keep the first one (the one you are merging
99
+ to).
100
+ * `SuperStack::MergePolicies::OverridePolicy`, that when merging two layers will keep the second one(the one you are
101
+ merging with).
102
+ * `SuperStack::MergePolicies::StandardMergePolicy`, that will perform the ruby standard `Hash#merge` method. There are
103
+ a lot of limitations with it (like not recursive, not merging arrays within hash etc... read ruby doc for more).
104
+ **This is the default merge method**
105
+ * `SuperStack::MergePolicies::FullMergePolicy` is actually using the [deep_merge gem][DMG] to merge two hashes. It is
106
+ fully merging two hashes including arrays etc... Only when two types are incompatible (like Array replacing a String),
107
+ the second one replaces the first. Much more complete implementation than the one in ActiveSupport. The way it is used
108
+ in the gem is compliant with both the plain Ruby and the Rails implementations (see [the documentation][DMGithub])
109
+
110
+ The manager has a `default_merge_policy`, but each layer can have its own `merge_policy`. By default the internal merge
111
+ process will use the `default_merge_policy` except if a layer specifies its own.
112
+
113
+ In most cases you will just have to set the merge policy at the manager level using `default_merge_policy=`.
25
114
 
26
115
  ## Contributing
27
116
 
@@ -30,3 +119,8 @@ TODO: Write usage instructions here
30
119
  3. Commit your changes (`git commit -am 'Add some feature'`)
31
120
  4. Push to the branch (`git push origin my-new-feature`)
32
121
  5. Create new Pull Request
122
+
123
+
124
+ [DMG]: https://rubygems.org/gems/deep_merge "Deep Merge gem"
125
+ [DMGithub]: https://github.com/danielsdeleo/deep_merge "Deep Merge Github project"
126
+
@@ -4,6 +4,7 @@ module SuperStack
4
4
  module LayerWrapper
5
5
 
6
6
  include Comparable
7
+ include SuperStack::MergePolicies::PolicyHandler
7
8
 
8
9
  DEFAULT_LAYER_NAME = 'Unknown layer'
9
10
 
@@ -22,9 +23,14 @@ module SuperStack
22
23
  @name || DEFAULT_LAYER_NAME
23
24
  end
24
25
 
25
- def load(file_name, type = :yaml)
26
- raise 'Invalid file' unless File.readable? file_name
26
+ def load(file_name=self.file_name, type = :yaml)
27
+ raise "Cannot read file '#{file_name}'" unless File.readable? file_name
27
28
  load_from_yaml file_name if type == :yaml
29
+ self
30
+ end
31
+
32
+ def reload
33
+ self.load if has_file?
28
34
  end
29
35
 
30
36
  def has_file?
@@ -37,7 +43,17 @@ module SuperStack
37
43
  end
38
44
 
39
45
  def inspect
40
- "name: #{name}, priority: #{priority}, #{super}"
46
+ file_add_on = has_file? ? "file: '#{file_name}', " : ''
47
+ priority_add_on = priority.nil? ? '' : "priority: #{priority}, "
48
+ "{name: '#{name}', #{priority_add_on}#{file_add_on}#{super}}"
49
+ end
50
+
51
+ def to_s
52
+ inspect
53
+ end
54
+
55
+ def self.from_hash(hash)
56
+ hash.extend self
41
57
  end
42
58
 
43
59
  private
@@ -46,8 +62,9 @@ module SuperStack
46
62
  begin
47
63
  self.replace Hash[YAML::load(File.open(file_name)).map { |k, v| [k.to_sym, v] }]
48
64
 
49
- rescue NoMethodError
65
+ rescue NoMethodError => e
50
66
  # Empty file...
67
+ raise "Invalid file '#{file_name}'" unless e.message =~ /false:FalseClass/
51
68
  end
52
69
  @file_name = file_name
53
70
  end
@@ -1,18 +1,28 @@
1
1
  module SuperStack
2
2
  class Manager
3
3
 
4
- DEFAULT_INTERVAL = 10
4
+ include SuperStack::MergePolicies::PolicyHandler
5
+ alias_method :default_merge_policy, :merge_policy
6
+ alias_method :'default_merge_policy=', :'merge_policy='
5
7
 
6
- attr_reader :layers, :merge_policy
8
+ DEFAULT_PRIORITY_INTERVAL = 10
9
+ DEFAULT_MERGE_POLICY = SuperStack::MergePolicies::StandardMergePolicy
10
+
11
+ attr_reader :layers
12
+
13
+ def initialize
14
+ @layers = {}
15
+ self.default_merge_policy = DEFAULT_MERGE_POLICY
16
+ end
7
17
 
8
18
  def [](filter=nil)
9
- raise 'Manager not ready (no merge policy specified)' unless ready?
10
19
  layers = to_a
11
20
  return [] if layers.empty?
12
21
  return layers[0] if layers.count == 1
13
22
  first_layer = layers.shift
14
23
  res = layers.inject(first_layer) do |stack, layer|
15
- merge_policy.merge stack, layer
24
+ policy_to_apply = layer.merge_policy.nil? ? default_merge_policy : layer.merge_policy
25
+ policy_to_apply.merge stack, layer
16
26
  end
17
27
  if filter.nil?
18
28
  res
@@ -21,36 +31,45 @@ module SuperStack
21
31
  end
22
32
  end
23
33
 
24
- def initialize
25
- @layers = {}
26
- end
27
-
28
34
  def to_a
29
35
  layers.values.sort
30
36
  end
31
37
 
32
38
  def add_layer(layer)
33
- raise 'Layer should have a name' unless layer.respond_to? :name
34
- raise 'Layer already existing' if layers.keys.include? layer.name
39
+ if layer.is_a? Hash and not layer.class.included_modules.include? SuperStack::LayerWrapper
40
+ SuperStack::LayerWrapper.from_hash layer
41
+ end
42
+ set_valid_name_for layer if layers.keys.include? layer.name
35
43
  layer.priority = get_unused_priority if layer.priority.nil?
36
44
  layers[layer.name] = layer
37
45
  end
38
46
 
39
- def merge_policy=(policy)
40
- raise "Invalid merge policy #{policy}" unless SuperStack::MergePolicies.list.include? policy
41
- @merge_policy = policy
47
+ def <<(layer)
48
+ add_layer layer
42
49
  end
43
50
 
44
- def ready?
45
- !@merge_policy.nil?
51
+ def reload_layers
52
+ layers.values.each &:reload
46
53
  end
47
54
 
48
55
  private
49
56
 
50
57
  def get_unused_priority
51
58
  ordered = self.to_a
52
- return DEFAULT_INTERVAL if ordered.empty?
53
- ordered.last.priority + DEFAULT_INTERVAL
59
+ return DEFAULT_PRIORITY_INTERVAL if ordered.empty?
60
+ ordered.last.priority + DEFAULT_PRIORITY_INTERVAL
61
+ end
62
+
63
+ def set_valid_name_for(layer)
64
+ name_pattern = /^(?<layer_name>.+) #(?<number>\d+)\s*$/
65
+ while layers.keys.include? layer.name
66
+ layer.name = "#{layer.name} #1" unless layer.name =~ name_pattern
67
+ layer.name.match(name_pattern) do |md|
68
+ layer.name = "#{md[:layer_name]} ##{md[:number].to_i + 1}"
69
+ next
70
+ end
71
+ end
72
+ layer.name
54
73
  end
55
74
 
56
75
  end
@@ -1,3 +1,4 @@
1
+ require 'super_stack/merge_policies/keep_policy'
1
2
  require 'super_stack/merge_policies/override_policy'
2
3
  require 'super_stack/merge_policies/standard_merge_policy'
3
4
  require 'super_stack/merge_policies/full_merge_policy'
@@ -10,5 +11,16 @@ module SuperStack
10
11
  constants.map(&:to_s).grep(/Policy$/).map{|policy_name| const_get policy_name}
11
12
  end
12
13
 
14
+ module PolicyHandler
15
+
16
+ attr_reader :merge_policy
17
+
18
+ def merge_policy=(policy)
19
+ raise "Invalid merge policy #{policy}" unless SuperStack::MergePolicies.list.include? policy
20
+ @merge_policy = policy
21
+ end
22
+
23
+ end
24
+
13
25
  end
14
26
  end
@@ -0,0 +1,11 @@
1
+ module SuperStack
2
+ module MergePolicies
3
+ module KeepPolicy
4
+
5
+ def self.merge(h1, h2)
6
+ h1
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module SuperStack
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
data/spec/layer_spec.rb CHANGED
@@ -13,6 +13,11 @@ describe SuperStack::Layer do
13
13
  expect(subject.name == subject.class.const_get('DEFAULT_LAYER_NAME')).to be_truthy
14
14
  end
15
15
 
16
+ it 'could have its own merge policy' do
17
+ expect( subject.respond_to? :merge_policy).to be_truthy
18
+ expect( subject.respond_to? :'merge_policy=').to be_truthy
19
+ end
20
+
16
21
  it 'should allow to change the name' do
17
22
  subject.name = 'foo'
18
23
  expect(subject.name == 'foo').to be_truthy
@@ -31,15 +36,11 @@ describe SuperStack::Layer do
31
36
  end
32
37
 
33
38
  it 'can be created from any Hash' do
34
- expect {Hash.new.extend SuperStack::LayerWrapper }.not_to raise_error
39
+ expect {SuperStack::LayerWrapper.from_hash Hash.new}.not_to raise_error
35
40
  end
36
41
 
37
42
  context 'when loaded from a YAML file' do
38
43
 
39
- def file_from_type(file_type)
40
- File.expand_path("../../test/layer_content_type_#{file_type}.yml", __FILE__)
41
- end
42
-
43
44
  %w(empty standard containing_an_array well_formatted).each do |file_type|
44
45
  it "should allow #{file_type} content type" do
45
46
  expect {
@@ -49,6 +50,33 @@ describe SuperStack::Layer do
49
50
  end
50
51
  end
51
52
 
53
+ it 'should remain unchanged when trying to load an invalid file' do
54
+ subject[:foo] = :bar
55
+ expect {
56
+ subject.load file_from_type 'invalid'
57
+ }.to raise_error
58
+
59
+ expect(subject[:foo] == :bar).to be_truthy
60
+ end
61
+
62
+ it 'should override current values when loaded from a valid file' do
63
+ subject[:foo] = :bar
64
+ expect {
65
+ subject.load file_from_type 'well_formatted'
66
+ }.not_to raise_error
67
+
68
+ expect(subject[:foo] == :bar).to be_falsey
69
+ end
70
+
71
+ it 'reload should have no effect when no load has already been done' do
72
+ expect( subject.reload).to be_nil
73
+ end
74
+
75
+ it 'should allow to reload when a load has already been done' do
76
+ expect {subject.load file_from_type 'well_formatted'}.not_to raise_error
77
+ expect {subject.reload}.not_to raise_error
78
+ end
79
+
52
80
 
53
81
  end
54
82
 
data/spec/manager_spec.rb CHANGED
@@ -1,8 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
+
3
4
  describe SuperStack::Manager do
4
5
  subject {SuperStack::Manager.new}
5
6
 
7
+ (1..4).each do |layer_number|
8
+ let("layer#{layer_number}".to_sym) {
9
+ file_name = file_from_layer layer_number
10
+ layer = SuperStack::Layer.new
11
+ layer.load file_name
12
+ layer.name = "layer#{layer_number}"
13
+ layer
14
+ }
15
+ end
16
+
6
17
 
7
18
  it 'should contain layers' do
8
19
  expect( subject.respond_to? :layers).to be_truthy
@@ -19,54 +30,83 @@ describe SuperStack::Manager do
19
30
  subject.add_layer l2
20
31
  subject.add_layer l1
21
32
 
33
+ expect(subject.layers.count == 2).to be_truthy
34
+
22
35
  expect(subject.to_a[0] == l1).to be_truthy
23
36
  expect(subject.to_a[1] == l2).to be_truthy
24
37
  end
25
38
 
26
- it 'should have a policy' do
27
- expect( subject.respond_to? :merge_policy).to be_truthy
39
+ it 'should have a default policy' do
40
+ expect( subject.respond_to? :default_merge_policy).to be_truthy
41
+ expect( subject.respond_to? :'default_merge_policy=').to be_truthy
28
42
  end
29
43
 
30
- it 'should not be ready unless a merge policy is set' do
31
- expect( subject.ready?).to be_falsey
32
- subject.merge_policy = SuperStack::MergePolicies.list[0]
33
- expect( subject.ready?).to be_truthy
44
+ it 'should have a default merge policy' do
45
+ expect( subject.default_merge_policy == SuperStack::Manager::DEFAULT_MERGE_POLICY).to be_truthy
34
46
  end
35
47
 
36
48
  it 'should not accept stupid policies' do
37
- expect {subject.merge_policy = :foo}.to raise_error
49
+ expect {subject.default_merge_policy = :foo}.to raise_error
38
50
  end
39
51
 
40
- context 'when ready' do
52
+ it 'should support pure hashes as layers' do
53
+ expect {subject.add_layer({}) }.not_to raise_error
54
+ expect {subject.add_layer({}) }.not_to raise_error
55
+ expect(subject.layers.keys.count == 2).to be_truthy
56
+ expect(subject.layers.keys[0] == SuperStack::Layer::DEFAULT_LAYER_NAME).to be_truthy
57
+ expect(subject.layers.keys[1] == "#{SuperStack::Layer::DEFAULT_LAYER_NAME} #2").to be_truthy
58
+ end
41
59
 
42
- def file_from_layer(layer_number)
43
- File.expand_path("../../test/stacked_layer_#{layer_number}.yml", __FILE__)
44
- end
60
+ it 'should allow the same layer to be added multiple times, automatically changing names' do
61
+ expect {subject.add_layer(layer1) }.not_to raise_error
62
+ expect {subject.add_layer(layer1) }.not_to raise_error
63
+ expect {subject.add_layer(layer1) }.not_to raise_error
64
+ expect(subject.layers.keys.count == 3).to be_truthy
65
+ expect(subject.layers.keys[0] == 'layer1').to be_truthy
66
+ expect(subject.layers.keys[1] == 'layer1 #2').to be_truthy
67
+ expect(subject.layers.keys[2] == 'layer1 #3').to be_truthy
68
+ end
69
+
70
+ it 'should allow to reload all layers at once' do
71
+ subject.add_layer layer1
72
+ subject << {bar: :foo}
73
+ subject.add_layer layer3
74
+ subject.add_layer layer4
75
+ expect(subject[:foo] == :bar).to be_falsey
76
+ subject.layers['layer3'][:foo] = :bar
77
+ expect(subject[:foo] == :bar).to be_truthy
78
+ expect(subject[:bar] == :foo).to be_truthy
79
+ expect {subject.reload_layers}.not_to raise_error
80
+ expect(subject[:foo] == :bar).to be_falsey
81
+ expect(subject[:bar] == :foo).to be_truthy
82
+ end
45
83
 
46
- (1..4).each do |layer_number|
47
- let("layer#{layer_number}".to_sym) {
48
- file_name = file_from_layer layer_number
49
- layer = SuperStack::Layer.new
50
- layer.load file_name
51
- layer.name = "layer#{layer_number}"
52
- layer
53
- }
54
- end
55
84
 
56
- SuperStack::MergePolicies.list.each do |policy|
57
- it "should provide a merged view of the layers according to the merge policy: #{policy}" do
58
- subject.add_layer layer1
59
- subject.add_layer layer2
60
- subject.add_layer layer3
61
- subject.add_layer layer4
62
- subject.merge_policy = policy
63
- expect(subject[].is_a? Hash).to be_truthy
64
- expect(subject[:layer] == 'four').to be_truthy
65
- end
85
+ SuperStack::MergePolicies.list.each do |policy|
86
+ it "should provide a merged view of the layers according to the merge policy: #{policy}" do
87
+ subject.add_layer layer1
88
+ subject.add_layer layer2
89
+ subject.add_layer layer3
90
+ subject.add_layer layer4
91
+ subject.default_merge_policy = policy
92
+ expect(subject[].is_a? Hash).to be_truthy
93
+ policy == SuperStack::MergePolicies::KeepPolicy ?
94
+ expect(subject[:layer] == 'one').to(be_truthy) : expect(subject[:layer] == 'four').to(be_truthy)
66
95
  end
96
+ end
97
+
98
+ context 'when using policies at layer level' do
67
99
 
100
+ it 'should override the default manager policy' do
101
+ subject.add_layer layer1
102
+ subject.add_layer layer2
103
+ subject.default_merge_policy = SuperStack::MergePolicies::FullMergePolicy
104
+ layer2.merge_policy = SuperStack::MergePolicies::OverridePolicy
68
105
 
106
+ expect(subject[:from_layer_1]).to be_nil
107
+ expect(subject[:from_layer_2]).not_to be_nil
69
108
 
109
+ end
70
110
 
71
111
  end
72
112
 
@@ -4,10 +4,6 @@ describe SuperStack::MergePolicies do
4
4
 
5
5
  subject {SuperStack::MergePolicies}
6
6
 
7
- def file_from_layer(layer_number)
8
- File.expand_path("../../test/stacked_layer_#{layer_number}.yml", __FILE__)
9
- end
10
-
11
7
  (1..4).each do |layer_number|
12
8
  let("layer#{layer_number}".to_sym) {
13
9
  file_name = file_from_layer layer_number
@@ -19,7 +15,19 @@ describe SuperStack::MergePolicies do
19
15
  it 'should have merge policies' do
20
16
  policies = subject.list
21
17
  expect( policies.is_a? Array).to be_truthy
22
- expect( policies.count == 3).to be_truthy
18
+ expect( policies.count == 4).to be_truthy
19
+ end
20
+
21
+ context 'when dealing with keep policy' do
22
+
23
+ subject {SuperStack::MergePolicies::KeepPolicy}
24
+
25
+ it 'should retain only the first hash' do
26
+ merged_hashs = subject.merge(layer1, layer2)
27
+ expect( merged_hashs == layer1).to be_truthy
28
+ expect( merged_hashs[:layer] == 'one').to be_truthy
29
+ end
30
+
23
31
  end
24
32
 
25
33
  context 'when dealing with override policy' do
data/spec/spec_helper.rb CHANGED
@@ -17,6 +17,15 @@
17
17
 
18
18
  require 'super_stack'
19
19
 
20
+
21
+ def file_from_layer(layer_number)
22
+ File.expand_path("../../test/stacked_layer_#{layer_number}.yml", __FILE__)
23
+ end
24
+
25
+ def file_from_type(file_type)
26
+ File.expand_path("../../test/layer_content_type_#{file_type}.yml", __FILE__)
27
+ end
28
+
20
29
  RSpec.configure do |config|
21
30
  # rspec-expectations config goes here. You can use an alternate
22
31
  # assertion/expectation library such as wrong or the stdlib/minitest
@@ -0,0 +1,10 @@
1
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore
2
+ magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
3
+ nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie
4
+ consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit
5
+ praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis
6
+ eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem
7
+ insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius
8
+ quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum
9
+ est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula
10
+ quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: super_stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent B.
@@ -101,6 +101,7 @@ files:
101
101
  - lib/super_stack/manager.rb
102
102
  - lib/super_stack/merge_policies.rb
103
103
  - lib/super_stack/merge_policies/full_merge_policy.rb
104
+ - lib/super_stack/merge_policies/keep_policy.rb
104
105
  - lib/super_stack/merge_policies/override_policy.rb
105
106
  - lib/super_stack/merge_policies/standard_merge_policy.rb
106
107
  - lib/super_stack/version.rb
@@ -111,6 +112,7 @@ files:
111
112
  - super_stack.gemspec
112
113
  - test/layer_content_type_containing_an_array.yml
113
114
  - test/layer_content_type_empty.yml
115
+ - test/layer_content_type_invalid.yml
114
116
  - test/layer_content_type_standard.yml
115
117
  - test/layer_content_type_well_formatted.yml
116
118
  - test/stacked_layer_1.yml
@@ -149,6 +151,7 @@ test_files:
149
151
  - spec/spec_helper.rb
150
152
  - test/layer_content_type_containing_an_array.yml
151
153
  - test/layer_content_type_empty.yml
154
+ - test/layer_content_type_invalid.yml
152
155
  - test/layer_content_type_standard.yml
153
156
  - test/layer_content_type_well_formatted.yml
154
157
  - test/stacked_layer_1.yml