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 +5 -5
- data/lib/yaml_normalizer/ext.rb +6 -2
- data/lib/yaml_normalizer/ext/namespaced.rb +12 -8
- data/lib/yaml_normalizer/ext/nested.rb +38 -0
- data/lib/yaml_normalizer/ext/sort_by_key.rb +5 -4
- data/lib/yaml_normalizer/helpers/normalize.rb +11 -1
- data/lib/yaml_normalizer/rake_task.rb +1 -1
- data/lib/yaml_normalizer/services/check.rb +2 -2
- data/lib/yaml_normalizer/services/is_yaml.rb +4 -2
- data/lib/yaml_normalizer/services/normalize.rb +9 -9
- data/lib/yaml_normalizer/version.rb +1 -1
- metadata +25 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 68746aaf41b7c1ae80f702342d114f3a4f1afa3e466f7b030281784de961e36c
|
4
|
+
data.tar.gz: 82f5faddb4754c3394770e77eab642f0312850b439d80fe2b4de96d72c5ae592
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 887e0f0e3e1ca897f687b9143b1cf2bff78b4f6381431f9bdd5a3c8be27ae31f0cd272295fb4ab2c9402accdab31fc6c0264018ab3b49bf265cba461f5af606b
|
7
|
+
data.tar.gz: e31e407f5341e4daca457f42ff30fab0b633088485b72a1af16b47869c46b10a1bf02ebecfe74752a8a833332a273264621e4537102fb61e92f198cde6247e14
|
data/lib/yaml_normalizer/ext.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module YamlNormalizer
|
4
|
-
# Ext
|
5
|
-
#
|
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
|
-
#
|
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
|
10
|
-
# separating tree levels with a dot.
|
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}}
|
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
|
17
|
-
# @param tree [Hash] the accumulator object
|
18
|
-
# traversing the original tree-
|
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
|
-
#
|
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.
|
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 =
|
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
|
-
|
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 =
|
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
|
36
|
+
# The current implementation does not require parseable? to return a
|
35
37
|
# boolean value
|
36
38
|
def parseable?
|
37
|
-
|
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
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
44
|
+
warn "[NORMALIZED] #{file}"
|
45
45
|
else
|
46
|
-
|
46
|
+
warn "[ERROR] Could not normalize #{file}"
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
def stable?(yaml_a, yaml_b)
|
51
|
-
|
52
|
-
a.namespaced.eql?(
|
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
|
56
|
+
def convert(yaml)
|
57
57
|
ary = Psych.parse_stream(yaml).transform
|
58
58
|
ary.each { |hash| hash.extend(Ext::Namespaced) }
|
59
59
|
ary
|
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.
|
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-
|
11
|
+
date: 2018-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: peach
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
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: '
|
26
|
+
version: '0.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: psych
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
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: '
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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
|
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:
|