yaml_normalizer 0.2.2 → 0.3.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
- 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: