yaml_normalizer 0.2.2 → 0.3.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
- SHA1:
3
- metadata.gz: 2ed8e87937af1ed8f601b81c9fa4383f4f0fa45e
4
- data.tar.gz: a43566eda64515f35c83a873c9d401697c4f1d0f
2
+ SHA256:
3
+ metadata.gz: 68746aaf41b7c1ae80f702342d114f3a4f1afa3e466f7b030281784de961e36c
4
+ data.tar.gz: 82f5faddb4754c3394770e77eab642f0312850b439d80fe2b4de96d72c5ae592
5
5
  SHA512:
6
- metadata.gz: 78f8a348e94be5e4c248a2f4a4702888721b104388be9c73c1a8f7a2447f08e9aa873b2192f8fa170f566fb942502c3d9dad028d3b002138c35599d15f8fe5ae
7
- data.tar.gz: 31cb9153735178b8e40e3629707ae5d9bd721e2b86234801213bc26808b163226af5e795221549677d62d5f90d253ce6ad7efd14240e913ac15da9105780e5b4
6
+ metadata.gz: 887e0f0e3e1ca897f687b9143b1cf2bff78b4f6381431f9bdd5a3c8be27ae31f0cd272295fb4ab2c9402accdab31fc6c0264018ab3b49bf265cba461f5af606b
7
+ data.tar.gz: e31e407f5341e4daca457f42ff30fab0b633088485b72a1af16b47869c46b10a1bf02ebecfe74752a8a833332a273264621e4537102fb61e92f198cde6247e14
@@ -1,11 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module YamlNormalizer
4
- # Ext holds extensions to external dependencies
5
- # YamlNormalizer does not extend Ruby Core classes to avoid side effects
4
+ # *YamlNormalizer::Ext* contains multiple extensions to extend instances of
5
+ # *Hash* in several ways.
6
+ # *YamlNormalizer* goes without extending Ruby Core classes or refinements
7
+ # to provide no functionality without side effects and avoid unexpected
8
+ # behaviour when working with POROs, fmi see https://git.io/v5Q2E.
6
9
  module Ext
7
10
  end
8
11
  end
9
12
 
10
13
  require 'yaml_normalizer/ext/namespaced'
14
+ require 'yaml_normalizer/ext/nested'
11
15
  require 'yaml_normalizer/ext/sort_by_key'
@@ -2,20 +2,24 @@
2
2
 
3
3
  module YamlNormalizer
4
4
  module Ext
5
- # Extends an instance of Hash to add the method namespaced.
5
+ # *YamlNormalizer::Ext::Namespaced* extends instances of *Hash* to provide
6
+ # the additional public helper method *namespaced*.
6
7
  # The approach of extending Hash instances avoids monkey-patching a Ruby
7
8
  # Core class and using refinements.
8
9
  module Namespaced
9
- # Transforms a tree-shaped hash into a plain key-value pair Hash,
10
- # separating tree levels with a dot. namespaced does not modify the Hash
11
- # it's called on.
10
+ # Transforms a tree-shaped *Hash* into a flat key-value pair *Hash*,
11
+ # separating tree levels with a dot.
12
+ # *namespaced* does not modify the instance of *Hash* it's called on.
12
13
  # @example
13
- # {a: {b: {c: 1}}, b:{x: 2, y: {ok: true}, z: 4}}.namespaced
14
+ # hash = {a: {b: {c: 1}}, b:{x: 2, y: {ok: true}, z: 4}}
15
+ # hash.extend(YamlNormalizer::Ext::Namespaced)
16
+ # hash.namespaced
14
17
  # => {"a.b.c"=>1, "b.x"=>2, "b.y.ok"=>true, "b.z"=>4}
15
18
  # @param namespace [Array] the namespace cache for the current namespace,
16
- # used on recursive tree traversal
17
- # @param tree [Hash] the accumulator object beeing build while recursive
18
- # traversing the original tree-like Hash
19
+ # used on recursive tree traversal1
20
+ # @param tree [Hash] the accumulator object being build while recursive
21
+ # traversing the original tree-shaped Hash
22
+ # @return [Hash] flat key-value pair Hash
19
23
  def namespaced(namespace = [], tree = {})
20
24
  each do |key, value|
21
25
  child_ns = namespace.dup << key
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module YamlNormalizer
4
+ module Ext
5
+ # *YamlNormalizer::Ext::Nested* extends instances of *Hash* to provide the
6
+ # additional public helper method *nested*.
7
+ # The approach of extending Hash instances avoids monkey-patching a Ruby
8
+ # Core class and using refinements.
9
+ module Nested
10
+ # Transforms a flat key-value pair *Hash* into a tree-shaped *Hash*,
11
+ # assuming tree levels are separated by a dot.
12
+ # *nested* does not modify the instance of *Hash* it's called on.
13
+ # @example
14
+ # hash = {'a.b.c' => 1, 'b.x' => 2, 'b.y.ok' => true, 'b.z' => 4}
15
+ # hash.extend(YamlNormalizer::Ext::Nested)
16
+ # hash.nested
17
+ # => {"a"=>{"b"=>{"c"=>1}}, "b"=>{"x"=>2, "y"=>{"ok"=>true}, "z"=>4}}
18
+ # @return [Hash] tree-shaped Hash
19
+ def nested
20
+ tree = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
21
+ each { |key, val| nest_key(tree, key.to_s, val) }
22
+ tree.default_proc = nil
23
+ tree
24
+ end
25
+
26
+ private
27
+
28
+ def nest_key(hash, key, val)
29
+ if key.include?('.')
30
+ keys = key.split('.')
31
+ hash.dig(*keys[0..-2])[keys.fetch(-1)] = val
32
+ else
33
+ hash[key] = val
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -2,12 +2,13 @@
2
2
 
3
3
  module YamlNormalizer
4
4
  module Ext
5
- # Extends an instance of Hash to add the method sort_by_key.
5
+ # *YamlNormalizer::Ext::SortByKey* extends an instance of *Hash* to provide
6
+ # the additional public helper methods *sort_by_key*.
6
7
  # The approach of extending Hash instances avoids monkey-patching a Ruby
7
8
  # Core class and using refinements.
8
9
  module SortByKey
9
- # Sorts entries alphabetically by key and returns a new Hash
10
- # sort_by_key does not modify the Hash it's called on.
10
+ # Sorts entries alphabetically by key and returns a new *Hash*.
11
+ # *sort_by_key* does not modify the instance of *Hash* it's called on.
11
12
  # @example
12
13
  # hash = { { b: { z: 20, x: 10, y: { b: 1, a: 2 } }, a: nil } }
13
14
  # hash.extend(YamlNormalizer::Ext::SortByKey)
@@ -16,7 +17,7 @@ module YamlNormalizer
16
17
  # @param recursive [Boolean] defines if sort_by_key is called on child
17
18
  # nodes, defaults to true
18
19
  def sort_by_key(recursive = true)
19
- keys.sort.each_with_object({}) do |key, seed|
20
+ keys.sort_by(&:to_s).each_with_object({}) do |key, seed|
20
21
  value = seed[key] = fetch(key)
21
22
  if recursive && value.instance_of?(Hash)
22
23
  seed[key] = value.extend(SortByKey).sort_by_key
@@ -20,10 +20,20 @@ module YamlNormalizer
20
20
  # @param [String] valid YAML string
21
21
  # @return [String] normalized YAML string
22
22
  def normalize_yaml(yaml)
23
- hashes = Psych.parse_stream(yaml).transform
23
+ hashes = parse(yaml).transform
24
24
  hashes.each { |hash| hash.extend(Ext::SortByKey) }
25
25
  hashes.map(&:sort_by_key).map(&:to_yaml).join
26
26
  end
27
+
28
+ private
29
+
30
+ def parse(yaml)
31
+ Psych.parse_stream(yaml)
32
+ end
33
+
34
+ def read(file)
35
+ File.read(file, mode: 'r:bom|utf-8')
36
+ end
27
37
  end
28
38
  end
29
39
  end
@@ -39,7 +39,7 @@ module YamlNormalizer
39
39
  def initialize(name = 'yaml', &block)
40
40
  yield(self) if block
41
41
 
42
- desc 'Check if configured YAML are normalized'
42
+ desc 'Check if configured YAML files are normalized'
43
43
  task("#{name}:check") { abort(check_failed(name)) unless check }
44
44
 
45
45
  desc 'Normalize configured YAML files'
@@ -33,7 +33,7 @@ module YamlNormalizer
33
33
  normalized << normalized?(file)
34
34
  else
35
35
  normalized << nil
36
- $stderr.puts "#{file} not a YAML file"
36
+ warn "#{file} not a YAML file"
37
37
  end
38
38
  end
39
39
 
@@ -44,7 +44,7 @@ module YamlNormalizer
44
44
 
45
45
  def normalized?(file)
46
46
  file = Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd))
47
- input = File.read(file, mode: 'r:bom|utf-8')
47
+ input = read(file)
48
48
  norm = normalize_yaml(input)
49
49
  check = input.eql?(norm)
50
50
 
@@ -10,6 +10,8 @@ module YamlNormalizer
10
10
  # is_yaml = YamlNormalizer::Services::IsYaml.new('path/to/file.yml')
11
11
  # result = is_yaml.call
12
12
  class IsYaml < Base
13
+ include Helpers::Normalize
14
+
13
15
  # file is the file path String to be regarded
14
16
  attr_reader :file
15
17
 
@@ -31,10 +33,10 @@ module YamlNormalizer
31
33
  File.file? file
32
34
  end
33
35
 
34
- # The current implementation does not require parsable? to return a
36
+ # The current implementation does not require parseable? to return a
35
37
  # boolean value
36
38
  def parseable?
37
- Psych.load_file(file)
39
+ parse(read(file))
38
40
  rescue Psych::SyntaxError
39
41
  false
40
42
  end
@@ -29,7 +29,7 @@ module YamlNormalizer
29
29
  if IsYaml.call(file)
30
30
  normalize!(file)
31
31
  else
32
- $stderr.puts "#{file} not a YAML file"
32
+ warn "#{file} not a YAML file"
33
33
  end
34
34
  end
35
35
  end
@@ -37,23 +37,23 @@ module YamlNormalizer
37
37
  private
38
38
 
39
39
  def normalize!(file)
40
- file = Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd))
41
- if stable?(input = File.read(file, mode: 'r:bom|utf-8'),
42
- norm = normalize_yaml(input))
40
+ file_abs = Pathname.new(file).realpath
41
+ file = file_abs.relative_path_from(Pathname.new(Dir.pwd))
42
+ if stable?(input = read(file), norm = normalize_yaml(input))
43
43
  File.open(file, 'w') { |f| f.write(norm) }
44
- $stderr.puts "[NORMALIZED] #{file}"
44
+ warn "[NORMALIZED] #{file}"
45
45
  else
46
- $stderr.puts "[ERROR] Could not normalize #{file}"
46
+ warn "[ERROR] Could not normalize #{file}"
47
47
  end
48
48
  end
49
49
 
50
50
  def stable?(yaml_a, yaml_b)
51
- parse(yaml_a).each_with_index.all? do |a, i|
52
- a.namespaced.eql?(parse(yaml_b).fetch(i).namespaced)
51
+ convert(yaml_a).each_with_index.all? do |a, i|
52
+ a.namespaced.eql?(convert(yaml_b).fetch(i).namespaced)
53
53
  end
54
54
  end
55
55
 
56
- def parse(yaml)
56
+ def convert(yaml)
57
57
  ary = Psych.parse_stream(yaml).transform
58
58
  ary.each { |hash| hash.extend(Ext::Namespaced) }
59
59
  ary
@@ -2,5 +2,5 @@
2
2
 
3
3
  module YamlNormalizer
4
4
  # The current Yaml Normalizer version
5
- VERSION = '0.2.2'
5
+ VERSION = '0.3.0'
6
6
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml_normalizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wolfgang Teuber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-21 00:00:00.000000000 Z
11
+ date: 2018-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: psych
14
+ name: peach
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.2'
19
+ version: '0.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.2'
26
+ version: '0.5'
27
27
  - !ruby/object:Gem::Dependency
28
- name: peach
28
+ name: psych
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.5'
33
+ version: '2.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.5'
40
+ version: '2.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '12.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: awesome_print
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: parallel_tests
84
+ name: flog
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: mutant-rspec
98
+ name: github-markup
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rubocop
112
+ name: guard
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: flog
126
+ name: guard-rspec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: inch
140
+ name: guard-rubocop
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
@@ -151,7 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: coveralls
154
+ name: inch
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ">="
@@ -165,7 +165,7 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: guard
168
+ name: mutant-rspec
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
@@ -179,7 +179,7 @@ dependencies:
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  - !ruby/object:Gem::Dependency
182
- name: guard-rubocop
182
+ name: parallel_tests
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - ">="
@@ -193,7 +193,7 @@ dependencies:
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  - !ruby/object:Gem::Dependency
196
- name: guard-rspec
196
+ name: pry
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - ">="
@@ -207,7 +207,7 @@ dependencies:
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
209
  - !ruby/object:Gem::Dependency
210
- name: yard
210
+ name: pry-byebug
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
213
  - - ">="
@@ -235,21 +235,7 @@ dependencies:
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
- name: github-markup
239
- requirement: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - ">="
242
- - !ruby/object:Gem::Version
243
- version: '0'
244
- type: :development
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - ">="
249
- - !ruby/object:Gem::Version
250
- version: '0'
251
- - !ruby/object:Gem::Dependency
252
- name: awesome_print
238
+ name: rspec
253
239
  requirement: !ruby/object:Gem::Requirement
254
240
  requirements:
255
241
  - - ">="
@@ -263,7 +249,7 @@ dependencies:
263
249
  - !ruby/object:Gem::Version
264
250
  version: '0'
265
251
  - !ruby/object:Gem::Dependency
266
- name: pry
252
+ name: rubocop
267
253
  requirement: !ruby/object:Gem::Requirement
268
254
  requirements:
269
255
  - - ">="
@@ -277,7 +263,7 @@ dependencies:
277
263
  - !ruby/object:Gem::Version
278
264
  version: '0'
279
265
  - !ruby/object:Gem::Dependency
280
- name: pry-byebug
266
+ name: yard
281
267
  requirement: !ruby/object:Gem::Requirement
282
268
  requirements:
283
269
  - - ">="
@@ -307,6 +293,7 @@ files:
307
293
  - lib/yaml_normalizer.rb
308
294
  - lib/yaml_normalizer/ext.rb
309
295
  - lib/yaml_normalizer/ext/namespaced.rb
296
+ - lib/yaml_normalizer/ext/nested.rb
310
297
  - lib/yaml_normalizer/ext/sort_by_key.rb
311
298
  - lib/yaml_normalizer/helpers.rb
312
299
  - lib/yaml_normalizer/helpers/normalize.rb
@@ -337,9 +324,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
337
324
  version: '0'
338
325
  requirements: []
339
326
  rubyforge_project:
340
- rubygems_version: 2.6.8
327
+ rubygems_version: 2.7.6
341
328
  signing_key:
342
329
  specification_version: 4
343
330
  summary: Yaml Normalizer normalizes YAML files
344
331
  test_files: []
345
- has_rdoc: