hieracles 0.1.6 → 0.1.7

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: d9b3915635847cd54b684b61feca924b9d11df20
4
- data.tar.gz: 52c52b2b41f67079a635e8b092727c8478841ba7
3
+ metadata.gz: b1b98d278d79f3de929cb583ab33e77f895f4676
4
+ data.tar.gz: 888be4768415d47ecef87847114b290e0a813d07
5
5
  SHA512:
6
- metadata.gz: 5f84fcf5cf3c49774c8fb7f6b6a025674c6e2b11173b65e66e75fa2bf0994274f9a8c096d5a7b5d5a7f8741d90193dc0394ec9852392aae7362d0a2a7a9effd4
7
- data.tar.gz: 0ccd90fa9677651c2a75eb05eb427155321d18961594959d11eec87523353dfce36fafc697651dc3c0af18409e64c2ce3993f81676ab5d6c97ce3dd44770c6fe
6
+ metadata.gz: 842f1c0ed05b9c4b11663b04bdab2c09f34a9713a732a6e76fcf75e171cbf12fed644e72f9d8aca820466d6afe7b4b35ede87df59e4d5b8a79759723a0360b49
7
+ data.tar.gz: c0fa911cc8b01be9eaa6f1d1fb419ebf020721abb865210c4f7a0ac79061a43a03b1a45035ec061b6cb6e2412b0d1756cc2dcd86227385347f6a20e7515d3184
data/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
1
  Hieracles Changelog
2
2
  =======================
3
3
 
4
+ ### 0.1.7 - 2015-11-23
5
+ - various fixes on deep_merge behavior
6
+
4
7
  ### 0.1.6 - 2015-11-18
5
8
  - add dependency on `deep-merge` gem like hiera does
6
9
  - take in account the `merge_behavior` in hiera file
@@ -41,7 +41,7 @@ module Hieracles
41
41
  end
42
42
 
43
43
  def build_head(without_common)
44
- output = ''
44
+ output = "[-] (merged)\n"
45
45
  @node.files(without_common).each_with_index do |f, i|
46
46
  output << format("#{COLORS[i]}\n", "[#{i}] #{f}")
47
47
  @colors[f] = i
@@ -55,11 +55,24 @@ module Hieracles
55
55
  first = value.pop
56
56
  filecolor_index = @colors[first[:file]]
57
57
  filecolor = COLORS[filecolor_index]
58
- output << format("#{filecolor} #{COLORS[5]} %s\n",
59
- "[#{filecolor_index}]",
60
- key,
61
- first[:value].to_s.gsub('%', '%%')
62
- )
58
+ if first[:merged] != first[:value]
59
+ output << format("%s #{COLORS[5]} %s\n",
60
+ "[-]",
61
+ key,
62
+ first[:merged].to_s.gsub('%', '%%')
63
+ )
64
+ output << format(" #{COLORS[8]} #{COLORS[8]} #{COLORS[8]}\n",
65
+ "[#{filecolor_index}]",
66
+ key,
67
+ first[:value].to_s.gsub('%', '%%')
68
+ )
69
+ else
70
+ output << format("#{filecolor} #{COLORS[5]} %s\n",
71
+ "[#{filecolor_index}]",
72
+ key,
73
+ first[:value].to_s.gsub('%', '%%')
74
+ )
75
+ end
63
76
  while value.count > 0
64
77
  overriden = value.pop
65
78
  filecolor_index = @colors[overriden[:file]]
@@ -29,8 +29,15 @@ module Hieracles
29
29
  output = ''
30
30
  if !filter || Regexp.new(filter).match(key)
31
31
  first = value.pop
32
- output << make_csv(in_what_file(first[:file]) +
33
- [key, first[:value].to_s, '0'])
32
+ if first[:value] == first[:merged]
33
+ output << make_csv(in_what_file(first[:file]) +
34
+ [key, first[:value].to_s, '0'])
35
+ else
36
+ output << make_csv(in_what_file('-') +
37
+ [key, first[:merged].to_s, '0'])
38
+ output << make_csv(in_what_file(first[:file]) +
39
+ [key, first[:value].to_s, '1'])
40
+ end
34
41
  while value.count > 0
35
42
  overriden = value.pop
36
43
  output << make_csv(in_what_file(overriden[:file]) +
@@ -28,7 +28,7 @@ module Hieracles
28
28
  end
29
29
 
30
30
  def build_head(without_common)
31
- output = ''
31
+ output = "[-] (merged)\n"
32
32
  @node.files(without_common).each_with_index do |f, i|
33
33
  output << "[#{i}] #{f}\n"
34
34
  @index[f] = i
@@ -41,7 +41,12 @@ module Hieracles
41
41
  if !filter || Regexp.new(filter).match(key)
42
42
  first = value.pop
43
43
  filecolor_index = @index[first[:file]]
44
- output << "[#{filecolor_index}] #{key} #{first[:value]}\n"
44
+ if first[:merged] != first[:value]
45
+ output << "[-] #{key} #{first[:merged]}\n"
46
+ output << " [#{filecolor_index}] #{key} #{first[:value]}\n"
47
+ else
48
+ output << "[#{filecolor_index}] #{key} #{first[:value]}\n"
49
+ end
45
50
  while value.count > 0
46
51
  overriden = value.pop
47
52
  filecolor_index = @index[overriden[:file]]
@@ -57,7 +57,14 @@ module Hieracles
57
57
  aryaml = yaml.each_line.map do |l|
58
58
  indent + l
59
59
  end
60
- output += "\n" + indent + "# " + params[key.join('.')][0][:file]
60
+ if @node.hiera.merge_behavior == :deep ||
61
+ @node.hiera.merge_behavior == :deeper
62
+ params[key.join('.')].each do |f|
63
+ output += "\n" + indent + "# " + f[:file]
64
+ end
65
+ else
66
+ output += "\n" + indent + "# " + params[key.join('.')].last[:file]
67
+ end
61
68
  output += "\n" + aryaml.join().chomp
62
69
  output
63
70
  end
@@ -55,7 +55,7 @@ module Hieracles
55
55
  s.each do |k,v|
56
56
  params[k] ||= []
57
57
  # f needs interpolation
58
- params[k] << { value: v, file: f}
58
+ params[k] << { value: v, file: f, merged: merge_value(params[k], v) }
59
59
  end
60
60
  end
61
61
  end
@@ -120,10 +120,31 @@ module Hieracles
120
120
  left.deep_merge!(right)
121
121
  when :deep
122
122
  left.deep_merge(right)
123
- else # Native and undefined
123
+ else
124
124
  local_merge!(left, right)
125
125
  end
126
126
  end
127
127
 
128
+ def merge_value(previous, value)
129
+ if value.is_a? Array
130
+ if previous == []
131
+ deep_sort(value)
132
+ else
133
+ left = previous.last[:merged]
134
+ case @hiera.merge_behavior
135
+ # TODO: handle the case where right is not an array
136
+ when :deeper
137
+ deep_sort(left | value)
138
+ when :deep
139
+ deep_sort(left | value)
140
+ else
141
+ deep_sort(value)
142
+ end
143
+ end
144
+ else
145
+ value
146
+ end
147
+ end
148
+
128
149
  end
129
150
  end
@@ -1,3 +1,5 @@
1
+ common_param:
2
+ subparam: override-me
1
3
  somefarmparam: false
2
4
  another:
3
5
  more_sublevel: something
@@ -43,7 +43,7 @@ describe Hieracles::Formats::Console do
43
43
  end
44
44
 
45
45
  describe ".build_head" do
46
- let(:expected) { "\e[31m[0] path1\e[0m\n\e[32m[1] path2\e[0m\n\n" }
46
+ let(:expected) { "[-] (merged)\n\e[31m[0] path1\e[0m\n\e[32m[1] path2\e[0m\n\n" }
47
47
  before {
48
48
  allow(node).to receive(:files).and_return(['path1', 'path2'])
49
49
  }
@@ -59,8 +59,8 @@ describe Hieracles::Formats::Console do
59
59
  }
60
60
  let(:params) {
61
61
  [
62
- { file: 'path1', value: 'value1'},
63
- { file: 'path2', value: 'value2'},
62
+ { file: 'path1', value: 'value1', merged: 'value1'},
63
+ { file: 'path2', value: 'value2', merged: 'value2'},
64
64
  ]
65
65
  }
66
66
  before {
@@ -50,24 +50,48 @@ describe Hieracles::Formats::Csv do
50
50
  end
51
51
 
52
52
  describe ".build_params_line" do
53
- let(:expected) {
54
- "0;1;params.this.var;value2;0\n"+
55
- "1;0;params.this.var;value1;1\n"
56
- }
57
- let(:params) {
58
- [
59
- { file: 'path1', value: 'value1'},
60
- { file: 'path2', value: 'value2'},
61
- ]
62
- }
63
- before {
64
- allow(node).to receive(:files).and_return(['path1', 'path2'])
65
- }
66
- it "outputs proper text" do
67
- expect(csv_format.send :build_params_line,
68
- "params.this.var",
69
- params,
70
- nil).to eq expected
53
+ context "with array values" do
54
+ let(:expected) {
55
+ "0;0;params.this.var;[\"value1\", \"value2\"];0\n"+
56
+ "0;1;params.this.var;[\"value2\"];1\n"+
57
+ "1;0;params.this.var;[\"value1\"];1\n"
58
+ }
59
+ let(:params) {
60
+ [
61
+ { file: 'path1', value: ['value1'], merged: ['value1'] },
62
+ { file: 'path2', value: ['value2'], merged: ['value1','value2'] },
63
+ ]
64
+ }
65
+ before {
66
+ allow(node).to receive(:files).and_return(['path1', 'path2'])
67
+ }
68
+ it "outputs proper text" do
69
+ expect(csv_format.send :build_params_line,
70
+ "params.this.var",
71
+ params,
72
+ nil).to eq expected
73
+ end
74
+ end
75
+ context "with non-array values" do
76
+ let(:expected) {
77
+ "0;1;params.this.var;value2;0\n"+
78
+ "1;0;params.this.var;value1;1\n"
79
+ }
80
+ let(:params) {
81
+ [
82
+ { file: 'path1', value: 'value1', merged: 'value1' },
83
+ { file: 'path2', value: 'value2', merged: 'value2' },
84
+ ]
85
+ }
86
+ before {
87
+ allow(node).to receive(:files).and_return(['path1', 'path2'])
88
+ }
89
+ it "outputs proper text" do
90
+ expect(csv_format.send :build_params_line,
91
+ "params.this.var",
92
+ params,
93
+ nil).to eq expected
94
+ end
71
95
  end
72
96
  end
73
97
 
@@ -43,7 +43,7 @@ describe Hieracles::Formats::Plain do
43
43
  end
44
44
 
45
45
  describe ".build_head" do
46
- let(:expected) { "[0] path1\n[1] path2\n\n" }
46
+ let(:expected) { "[-] (merged)\n[0] path1\n[1] path2\n\n" }
47
47
  before {
48
48
  allow(node).to receive(:files).and_return(['path1', 'path2'])
49
49
  }
@@ -59,8 +59,8 @@ describe Hieracles::Formats::Plain do
59
59
  }
60
60
  let(:params) {
61
61
  [
62
- { file: 'path1', value: 'value1'},
63
- { file: 'path2', value: 'value2'},
62
+ { file: 'path1', value: 'value1', merged: 'value1'},
63
+ { file: 'path2', value: 'value2', merged: 'value2'},
64
64
  ]
65
65
  }
66
66
  before {
@@ -205,8 +205,61 @@ describe Hieracles::Formats::Yaml do
205
205
  let(:expected) {
206
206
  "\nkey: \n # what/file\n - value1\n - value2"
207
207
  }
208
+ let(:hiera) { Struct.new( :merge_behavior ) }
209
+ before {
210
+ allow(node).to receive(:hiera).and_return(
211
+ hiera.new('deeper')
212
+ )
213
+ }
208
214
  it { expect(yaml_format.mergetree('', [], input, params)).to eq expected }
209
215
  end
216
+ context "with a double array key-value" do
217
+ let(:params) {
218
+ {
219
+ 'key' => [
220
+ {
221
+ file: 'what/file',
222
+ value: ['value1', 'value2'],
223
+ merged: ['value1', 'value2']
224
+ },
225
+ {
226
+ file: 'what/other-file',
227
+ value: ['value3'],
228
+ merged: ['value1', 'value2', 'value3']
229
+ }
230
+ ]
231
+ }
232
+ }
233
+ let(:hiera) { Struct.new( :merge_behavior ) }
234
+ context "with native merge behavior" do
235
+ let(:input) {
236
+ { 'key' => ['value3'] }
237
+ }
238
+ let(:expected) {
239
+ "\nkey: \n # what/other-file\n - value3"
240
+ }
241
+ before {
242
+ allow(node).to receive(:hiera).and_return(
243
+ hiera.new(:native)
244
+ )
245
+ }
246
+ it { expect(yaml_format.mergetree('', [], input, params)).to eq expected }
247
+ end
248
+ context "with deep merge behavior" do
249
+ let(:input) {
250
+ { 'key' => ['value1', 'value2', 'value3'] }
251
+ }
252
+ let(:expected) {
253
+ "\nkey: \n # what/file\n # what/other-file\n - value1\n - value2\n - value3"
254
+ }
255
+ before {
256
+ allow(node).to receive(:hiera).and_return(
257
+ hiera.new(:deep)
258
+ )
259
+ }
260
+ it { expect(yaml_format.mergetree('', [], input, params)).to eq expected }
261
+ end
262
+ end
210
263
  context "with a 2-levels string key-value" do
211
264
  let(:params) {
212
265
  {
@@ -81,37 +81,50 @@ describe Hieracles::Node do
81
81
  [ "another.more_sublevel",
82
82
  [{
83
83
  value: "something",
84
- file: 'params/farm/dev.yaml'
84
+ file: 'params/farm/dev.yaml',
85
+ merged: 'something'
85
86
  }]
86
87
  ],
87
88
  [ "another.sublevel.array",
88
89
  [
89
90
  {
90
91
  value: ["one", "two", "three"],
91
- file: 'params/farm/dev.yaml'
92
+ file: 'params/farm/dev.yaml',
93
+ merged: ["one", "three", "two"]
92
94
  },
93
95
  {
94
96
  value: ["four", "five"],
95
- file: 'params/nodes/server.example.com.yaml'
97
+ file: 'params/nodes/server.example.com.yaml',
98
+ merged: ["five", "four"]
96
99
  }
97
100
  ]
98
101
  ],
99
102
  [ "another.sublevel.thing",
100
103
  [{
101
104
  value: "always",
102
- file: 'params/nodes/server.example.com.yaml'
105
+ file: 'params/nodes/server.example.com.yaml',
106
+ merged: "always"
103
107
  }]
104
108
  ],
105
109
  [ "common_param.subparam",
106
- [{
107
- value: "overriden",
108
- file: 'params/nodes/server.example.com.yaml'
109
- }]
110
+ [
111
+ {
112
+ value: "override-me",
113
+ file: 'params/farm/dev.yaml',
114
+ merged: "override-me"
115
+ },
116
+ {
117
+ value: "overriden",
118
+ file: 'params/nodes/server.example.com.yaml',
119
+ merged: "overriden"
120
+ }
121
+ ]
110
122
  ],
111
123
  [ "somefarmparam",
112
124
  [{
113
125
  value: false,
114
- file: 'params/farm/dev.yaml'
126
+ file: 'params/farm/dev.yaml',
127
+ merged: false
115
128
  }]
116
129
  ]
117
130
  ]
@@ -233,37 +246,50 @@ describe Hieracles::Node do
233
246
  [ "another.more_sublevel",
234
247
  [{
235
248
  value: "something",
236
- file: 'params/farm/dev.yaml'
249
+ file: 'params/farm/dev.yaml',
250
+ merged: "something"
237
251
  }]
238
252
  ],
239
253
  [ "another.sublevel.array",
240
254
  [
241
255
  {
242
256
  value: ["one", "two", "three"],
243
- file: 'params/farm/dev.yaml'
257
+ file: 'params/farm/dev.yaml',
258
+ merged: ["one", "three", "two"]
244
259
  },
245
260
  {
246
261
  value: ["four", "five"],
247
- file: 'params/nodes/server.example.com.yaml'
262
+ file: 'params/nodes/server.example.com.yaml',
263
+ merged: ["five", "four", "one", "three", "two"]
248
264
  }
249
265
  ]
250
266
  ],
251
267
  [ "another.sublevel.thing",
252
268
  [{
253
269
  value: "always",
254
- file: 'params/nodes/server.example.com.yaml'
270
+ file: 'params/nodes/server.example.com.yaml',
271
+ merged: "always"
255
272
  }]
256
273
  ],
257
274
  [ "common_param.subparam",
258
- [{
259
- value: "overriden",
260
- file: 'params/nodes/server.example.com.yaml'
261
- }]
275
+ [
276
+ {
277
+ value: "override-me",
278
+ file: 'params/farm/dev.yaml',
279
+ merged: "override-me"
280
+ },
281
+ {
282
+ value: "overriden",
283
+ file: 'params/nodes/server.example.com.yaml',
284
+ merged: "overriden"
285
+ }
286
+ ]
262
287
  ],
263
288
  [ "somefarmparam",
264
289
  [{
265
290
  value: false,
266
- file: 'params/farm/dev.yaml'
291
+ file: 'params/farm/dev.yaml',
292
+ merged: false
267
293
  }]
268
294
  ]
269
295
  ]
@@ -282,7 +308,7 @@ describe Hieracles::Node do
282
308
  }
283
309
  },
284
310
  "common_param" => {
285
- "subparam" => "overriden"
311
+ "subparam" => "override-me"
286
312
  },
287
313
  "somefarmparam" => false
288
314
  }
@@ -310,37 +336,50 @@ describe Hieracles::Node do
310
336
  [ "another.more_sublevel",
311
337
  [{
312
338
  value: "something",
313
- file: 'params/farm/dev.yaml'
339
+ file: 'params/farm/dev.yaml',
340
+ merged: "something"
314
341
  }]
315
342
  ],
316
343
  [ "another.sublevel.array",
317
344
  [
318
345
  {
319
346
  value: ["one", "two", "three"],
320
- file: 'params/farm/dev.yaml'
347
+ file: 'params/farm/dev.yaml',
348
+ merged: ["one", "three", "two"]
321
349
  },
322
350
  {
323
351
  value: ["four", "five"],
324
- file: 'params/nodes/server.example.com.yaml'
352
+ file: 'params/nodes/server.example.com.yaml',
353
+ merged: ["five", "four", "one", "three", "two"]
325
354
  }
326
355
  ]
327
356
  ],
328
357
  [ "another.sublevel.thing",
329
358
  [{
330
359
  value: "always",
331
- file: 'params/nodes/server.example.com.yaml'
360
+ file: 'params/nodes/server.example.com.yaml',
361
+ merged: "always"
332
362
  }]
333
363
  ],
334
364
  [ "common_param.subparam",
335
- [{
336
- value: "overriden",
337
- file: 'params/nodes/server.example.com.yaml'
338
- }]
365
+ [
366
+ {
367
+ value: "override-me",
368
+ file: 'params/farm/dev.yaml',
369
+ merged: "override-me"
370
+ },
371
+ {
372
+ value: "overriden",
373
+ file: 'params/nodes/server.example.com.yaml',
374
+ merged: "overriden"
375
+ }
376
+ ]
339
377
  ],
340
378
  [ "somefarmparam",
341
379
  [{
342
380
  value: false,
343
- file: 'params/farm/dev.yaml'
381
+ file: 'params/farm/dev.yaml',
382
+ merged: false
344
383
  }]
345
384
  ]
346
385
  ]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hieracles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - mose
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-18 00:00:00.000000000 Z
11
+ date: 2015-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge