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 +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:
|