yaml_normalizer 0.1.0 → 0.2.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 +4 -4
- data/lib/yaml_normalizer/ext/namespaced.rb +32 -0
- data/lib/yaml_normalizer/ext/sort_by_key.rb +28 -0
- data/lib/yaml_normalizer/ext.rb +11 -0
- data/lib/yaml_normalizer/helpers/normalize.rb +29 -0
- data/lib/yaml_normalizer/helpers.rb +9 -0
- data/lib/yaml_normalizer/rake_task.rb +41 -10
- data/lib/yaml_normalizer/services/base.rb +31 -0
- data/lib/yaml_normalizer/services/check.rb +53 -0
- data/lib/yaml_normalizer/services/is_yaml.rb +11 -3
- data/lib/yaml_normalizer/services/normalize.rb +15 -10
- data/lib/yaml_normalizer/services.rb +1 -0
- data/lib/yaml_normalizer/version.rb +1 -1
- data/lib/yaml_normalizer.rb +2 -1
- metadata +15 -40
- data/lib/yaml_normalizer/refinements/hash_namespaced.rb +0 -47
- data/lib/yaml_normalizer/refinements/hash_sort_by_key.rb +0 -35
- data/lib/yaml_normalizer/refinements.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7181101bce00079a445c20da53ef9c0378f5b77
|
4
|
+
data.tar.gz: 401cebab8d8d70ed70845e561078448804590214
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34ec7614ce553477f4420d964c59a6efe88315d5b55ccca272087f28a41b7e194e2ecc1fd31cd889a24e1712e3c2d11e9a1b6eae0f7ff8ac68fae48e3f4c0842
|
7
|
+
data.tar.gz: d05e84ec8b059c83eb4e86c463a7db4206ffc4ed8372b8caa08928077e6025ff3d702eb4398800132c3f6b0c363b7f8fd71e5257ab47778920f5b80dfbcfc8e8
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YamlNormalizer
|
4
|
+
module Ext
|
5
|
+
# Extends an instance of Hash to add the method namespaced.
|
6
|
+
# The approach of extending Hash instances avoids monkey-patching a Ruby
|
7
|
+
# Core class and using refinements.
|
8
|
+
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.
|
12
|
+
# @example
|
13
|
+
# {a: {b: {c: 1}}, b:{x: 2, y: {ok: true}, z: 4}}.namespaced
|
14
|
+
# => {"a.b.c"=>1, "b.x"=>2, "b.y.ok"=>true, "b.z"=>4}
|
15
|
+
# @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
|
+
def namespaced(namespace = [], tree = {})
|
20
|
+
each do |key, value|
|
21
|
+
child_ns = namespace.dup << key
|
22
|
+
if value.instance_of?(Hash)
|
23
|
+
value.extend(Namespaced).namespaced child_ns, tree
|
24
|
+
else
|
25
|
+
tree[child_ns.join('.')] = value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
tree
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YamlNormalizer
|
4
|
+
module Ext
|
5
|
+
# Extends an instance of Hash to add the method sort_by_key.
|
6
|
+
# The approach of extending Hash instances avoids monkey-patching a Ruby
|
7
|
+
# Core class and using refinements.
|
8
|
+
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.
|
11
|
+
# @example
|
12
|
+
# hash = { { b: { z: 20, x: 10, y: { b: 1, a: 2 } }, a: nil } }
|
13
|
+
# hash.extend(YamlNormalizer::Ext::SortByKey)
|
14
|
+
# hash.sort_by_key
|
15
|
+
# => {:a=>nil, :b=>{:x=>10, :y=>{:a=>2, :b=>1}, :z=>20}}
|
16
|
+
# @param recursive [Boolean] defines if sort_by_key is called on child
|
17
|
+
# nodes, defaults to true
|
18
|
+
def sort_by_key(recursive = true)
|
19
|
+
keys.sort.each_with_object({}) do |key, seed|
|
20
|
+
value = seed[key] = fetch(key)
|
21
|
+
if recursive && value.instance_of?(Hash)
|
22
|
+
seed[key] = value.extend(SortByKey).sort_by_key
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YamlNormalizer
|
4
|
+
# Ext holds extensions to external dependencies
|
5
|
+
# YamlNormalizer does not extend Ruby Core classes to avoid side effects
|
6
|
+
module Ext
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'yaml_normalizer/ext/namespaced'
|
11
|
+
require 'yaml_normalizer/ext/sort_by_key'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YamlNormalizer
|
4
|
+
module Helpers
|
5
|
+
# This helper holds shared functionality to normalize a YAML string.
|
6
|
+
module Normalize
|
7
|
+
# Transforms a given YAML string to a normalized format.
|
8
|
+
# @example
|
9
|
+
# class YamlWriter
|
10
|
+
# include YamlNormalizer::Helpers::Normalize
|
11
|
+
#
|
12
|
+
# def initialize(yaml)
|
13
|
+
# @yaml = normalize_yaml(yaml)
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# def write(file)
|
17
|
+
# File.open(file,'w') { |f| f.write(@yaml) }
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
# @param [String] valid YAML string
|
21
|
+
# @return [String] normalized YAML string
|
22
|
+
def normalize_yaml(yaml)
|
23
|
+
hashes = Psych.parse_stream(yaml).transform
|
24
|
+
hashes.each { |hash| hash.extend(Ext::SortByKey) }
|
25
|
+
hashes.map(&:sort_by_key).map(&:to_yaml).join
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,30 +1,61 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
lib = File.expand_path(File.join('..', '..', '..', 'lib'), __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'yaml_normalizer'
|
6
|
+
require 'rake/tasklib'
|
4
7
|
|
5
8
|
module YamlNormalizer
|
6
9
|
# Provides Rake task integration
|
7
10
|
class RakeTask < ::Rake::TaskLib
|
11
|
+
# The name of the task
|
8
12
|
# @return [String] name of the Rake task
|
9
13
|
attr_accessor :name
|
10
|
-
# @return [Array] arguments to be passed to Suggest.run
|
11
|
-
attr_accessor :args
|
12
14
|
|
15
|
+
# The YAML files to process.
|
16
|
+
# @example Task files assignment
|
17
|
+
# YamlNormalizer::RakeTask.new do |task|
|
18
|
+
# task.files = ['config/locale/*.yml', 'config/*.yml']
|
19
|
+
# end
|
20
|
+
# @return [Array<String>] a list of file globing Strings
|
21
|
+
attr_accessor :files
|
22
|
+
|
23
|
+
# Create a YamlNormalizer rake task object.
|
24
|
+
# Use this to
|
25
|
+
# @example
|
26
|
+
# In your Rakefile, add:
|
27
|
+
# YamlNormalizer::RakeTask.new
|
28
|
+
#
|
29
|
+
# To be more specific, configure YAML Normalizer's mode and files like so:
|
30
|
+
# YamlNormalizer::RakeTask.new do |config|
|
31
|
+
# config.files = Dir[File.join(File.dirname(__FILE__), 'include.yml')]
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# This gives you the following tasks (run rake -T)
|
35
|
+
# rake yaml:check # Check if given YAML are normalized
|
36
|
+
# rake yaml:normalize # Normalize given YAML files
|
13
37
|
# @param name [String] name of the Rake task
|
14
|
-
# @param *args [Array] arguments to be passed to Normalize.call
|
15
38
|
# @param &block [Proc] optional, evaluated inside the task definition
|
16
|
-
def initialize(name = '
|
17
|
-
@name = name
|
18
|
-
@args = args
|
39
|
+
def initialize(name = 'yaml', &block)
|
19
40
|
yield(self) if block
|
20
41
|
|
21
|
-
desc '
|
22
|
-
task(
|
42
|
+
desc 'Check if configured YAML are normalized'
|
43
|
+
task("#{name}:check") { check }
|
44
|
+
|
45
|
+
desc 'Normalize configured YAML files'
|
46
|
+
task("#{name}:normalize") { normalize }
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# Checks if configured YAML are normalized
|
52
|
+
def check
|
53
|
+
Services::Check.call(*files)
|
23
54
|
end
|
24
55
|
|
25
|
-
#
|
56
|
+
# Normalizes configured YAML files
|
26
57
|
def normalize
|
27
|
-
|
58
|
+
Services::Normalize.call(*files)
|
28
59
|
end
|
29
60
|
end
|
30
61
|
end
|
@@ -5,14 +5,45 @@ module YamlNormalizer
|
|
5
5
|
# The Base Service provides a convenience class method "call" to initialize
|
6
6
|
# the Service with the given arguments and call the method "call" on the
|
7
7
|
# instance.
|
8
|
+
# @example
|
9
|
+
# class ReverseService < Base
|
10
|
+
# def initialize(str)
|
11
|
+
# @str = str.to_s
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# def call
|
15
|
+
# @str.reverse
|
16
|
+
# end
|
17
|
+
# end
|
8
18
|
class Base
|
19
|
+
# Creates a service object.
|
20
|
+
# Inherit from Base and implement this method.
|
21
|
+
# @example
|
22
|
+
# class IsFile < Base
|
23
|
+
# attr_reader :file
|
24
|
+
# def initialize(file)
|
25
|
+
# @file = file.to_s
|
26
|
+
# end
|
27
|
+
# def call
|
28
|
+
# File.file? file
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# @param *args [Array<Object>] arguments
|
33
|
+
# @raise [NotImplementedError] if call is not implemented
|
34
|
+
def initialize(*args)
|
35
|
+
@args = args
|
36
|
+
end
|
37
|
+
|
9
38
|
# A convenience class method to initialize Normalize with the given
|
10
39
|
# arguments and call the method "call" on the instance.
|
40
|
+
# @param *args [Array] arguments to be passed to Base.new
|
11
41
|
def self.call(*args)
|
12
42
|
new(*args).call
|
13
43
|
end
|
14
44
|
|
15
45
|
# Inherit from Base and implement the call method
|
46
|
+
# @raise [NotImplementedError] if call is not implemented
|
16
47
|
def call
|
17
48
|
raise NotImplementedError
|
18
49
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'peach'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
module YamlNormalizer
|
7
|
+
module Services
|
8
|
+
# Check is a service class that provides functionality to check if giving
|
9
|
+
# YAML files are already standardized (normalized).
|
10
|
+
# @exmaple
|
11
|
+
# check = YamlNormalizer::Services::Call.new('path/to/*.yml')
|
12
|
+
# result = check.call
|
13
|
+
class Check < Base
|
14
|
+
include Helpers::Normalize
|
15
|
+
|
16
|
+
# files is a sorted array of file path Strings
|
17
|
+
attr_reader :files
|
18
|
+
|
19
|
+
# Create a Check service object by calling .new and passing one or
|
20
|
+
# more Strings that are interpreted as file glob pattern.
|
21
|
+
# @param *args [Array<String>] a list of file glob patterns
|
22
|
+
def initialize(*args)
|
23
|
+
files = args.each_with_object([]) { |a, o| o << Dir[a.to_s] }
|
24
|
+
@files = files.flatten.sort.uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
# Normalizes all YAML files defined on instantiation.
|
28
|
+
def call
|
29
|
+
files.peach do |file|
|
30
|
+
if IsYaml.call(file)
|
31
|
+
normalized?(file)
|
32
|
+
else
|
33
|
+
$stderr.puts "#{file} not a YAML file"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def normalized?(file)
|
41
|
+
file = Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd))
|
42
|
+
input = File.read(file)
|
43
|
+
norm = normalize_yaml(input)
|
44
|
+
|
45
|
+
if input.eql?(norm)
|
46
|
+
$stdout.puts "[PASSED] already normalized #{file}"
|
47
|
+
else
|
48
|
+
$stdout.puts "[FAILED] normalization suggested for #{file}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -4,17 +4,25 @@ require 'psych'
|
|
4
4
|
|
5
5
|
module YamlNormalizer
|
6
6
|
module Services
|
7
|
-
#
|
7
|
+
# IsYaml is a Service Class that provides functionality to check if a file
|
8
|
+
# is a parseable non-scalar YAML file.
|
9
|
+
# @exmaple
|
10
|
+
# is_yaml = YamlNormalizer::Services::IsYaml.new('path/to/file.yml')
|
11
|
+
# result = is_yaml.call
|
8
12
|
class IsYaml < Base
|
13
|
+
# file is the file path String to be regarded
|
9
14
|
attr_reader :file
|
10
15
|
|
16
|
+
# Create an IsYaml service object by calling .new and passing a file path
|
17
|
+
# String.
|
18
|
+
# @param file [String] file path to be regarded
|
11
19
|
def initialize(file)
|
12
20
|
@file = file.to_s
|
13
21
|
end
|
14
22
|
|
15
23
|
# Return true if given file is a valid YAML file
|
16
24
|
def call
|
17
|
-
file? &&
|
25
|
+
file? && parseable? && !scalar?
|
18
26
|
end
|
19
27
|
|
20
28
|
private
|
@@ -25,7 +33,7 @@ module YamlNormalizer
|
|
25
33
|
|
26
34
|
# The current implementation does not require parsable? to return a
|
27
35
|
# boolean value
|
28
|
-
def
|
36
|
+
def parseable?
|
29
37
|
Psych.load_file(file)
|
30
38
|
rescue Psych::SyntaxError
|
31
39
|
false
|
@@ -4,13 +4,20 @@ require 'peach'
|
|
4
4
|
|
5
5
|
module YamlNormalizer
|
6
6
|
module Services
|
7
|
-
# Normalize is a
|
7
|
+
# Normalize is a service class that provides functionality to update giving
|
8
|
+
# YAML files to a standardized (normalized) format.
|
9
|
+
# @exmaple
|
10
|
+
# normalize = YamlNormalizer::Services::Normalize.new('path/to/*.yml')
|
11
|
+
# result = normalize.call
|
8
12
|
class Normalize < Base
|
9
|
-
|
13
|
+
include Helpers::Normalize
|
10
14
|
|
11
|
-
|
12
|
-
|
15
|
+
# files is a sorted array of file path Strings
|
16
|
+
attr_reader :files
|
13
17
|
|
18
|
+
# Create a Normalize service object by calling .new and passing one or
|
19
|
+
# more String that are interpreted as file glob pattern.
|
20
|
+
# @param *args [Array<String>] a list of file glob patterns
|
14
21
|
def initialize(*args)
|
15
22
|
files = args.each_with_object([]) { |a, o| o << Dir[a.to_s] }
|
16
23
|
@files = files.flatten.sort.uniq
|
@@ -30,6 +37,7 @@ module YamlNormalizer
|
|
30
37
|
private
|
31
38
|
|
32
39
|
def normalize!(file)
|
40
|
+
file = Pathname.new(file).relative_path_from(Pathname.new(Dir.pwd))
|
33
41
|
if stable?(input = File.read(file), norm = normalize_yaml(input))
|
34
42
|
File.open(file, 'w') { |f| f.write(norm) }
|
35
43
|
$stderr.puts "[NORMALIZED] #{file}"
|
@@ -38,11 +46,6 @@ module YamlNormalizer
|
|
38
46
|
end
|
39
47
|
end
|
40
48
|
|
41
|
-
def normalize_yaml(yaml)
|
42
|
-
hashes = Psych.parse_stream(yaml).transform
|
43
|
-
hashes.map(&:sort_by_key).map(&:to_yaml).join
|
44
|
-
end
|
45
|
-
|
46
49
|
def stable?(yaml_a, yaml_b)
|
47
50
|
parse(yaml_a).each_with_index.all? do |a, i|
|
48
51
|
a.namespaced.eql?(parse(yaml_b).fetch(i).namespaced)
|
@@ -50,7 +53,9 @@ module YamlNormalizer
|
|
50
53
|
end
|
51
54
|
|
52
55
|
def parse(yaml)
|
53
|
-
Psych.parse_stream(yaml).transform
|
56
|
+
ary = Psych.parse_stream(yaml).transform
|
57
|
+
ary.each { |hash| hash.extend(Ext::Namespaced) }
|
58
|
+
ary
|
54
59
|
end
|
55
60
|
end
|
56
61
|
end
|
data/lib/yaml_normalizer.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaml_normalizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wolfgang Teuber
|
@@ -39,21 +39,21 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :
|
47
|
+
version: '12.0'
|
48
|
+
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '12.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -122,34 +122,6 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: cane
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: flay
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
125
|
- !ruby/object:Gem::Dependency
|
154
126
|
name: flog
|
155
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -333,18 +305,21 @@ extra_rdoc_files: []
|
|
333
305
|
files:
|
334
306
|
- bin/yaml_normalizer
|
335
307
|
- lib/yaml_normalizer.rb
|
308
|
+
- lib/yaml_normalizer/ext.rb
|
309
|
+
- lib/yaml_normalizer/ext/namespaced.rb
|
310
|
+
- lib/yaml_normalizer/ext/sort_by_key.rb
|
311
|
+
- lib/yaml_normalizer/helpers.rb
|
312
|
+
- lib/yaml_normalizer/helpers/normalize.rb
|
336
313
|
- lib/yaml_normalizer/rake_task.rb
|
337
|
-
- lib/yaml_normalizer/refinements.rb
|
338
|
-
- lib/yaml_normalizer/refinements/hash_namespaced.rb
|
339
|
-
- lib/yaml_normalizer/refinements/hash_sort_by_key.rb
|
340
314
|
- lib/yaml_normalizer/services.rb
|
341
315
|
- lib/yaml_normalizer/services/base.rb
|
316
|
+
- lib/yaml_normalizer/services/check.rb
|
342
317
|
- lib/yaml_normalizer/services/is_yaml.rb
|
343
318
|
- lib/yaml_normalizer/services/normalize.rb
|
344
319
|
- lib/yaml_normalizer/version.rb
|
345
320
|
homepage: https://github.com/Sage/yaml_normalizer
|
346
321
|
licenses:
|
347
|
-
-
|
322
|
+
- Apache-2.0
|
348
323
|
metadata: {}
|
349
324
|
post_install_message:
|
350
325
|
rdoc_options: []
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module YamlNormalizer
|
4
|
-
module Refinements
|
5
|
-
# Refine Hash to add method sort_by_key
|
6
|
-
module HashNamespaced
|
7
|
-
refine Hash do
|
8
|
-
# Transforms a tree-shaped hash into a plain key-value pair hash,
|
9
|
-
# separating tree levels with a dot.
|
10
|
-
# @examples
|
11
|
-
# {a: {b: {c: 1}}, b:{x: 2, y: {ok: true}, z: 4}}.namespaced
|
12
|
-
# => {"a.b.c"=>1, "b.x"=>2, "b.y.ok"=>true, "b.z"=>4}
|
13
|
-
def namespaced(namespace = [], tree = {})
|
14
|
-
each do |key, value|
|
15
|
-
child_ns = namespace.dup << key
|
16
|
-
if value.is_a?(Hash)
|
17
|
-
value.namespaced child_ns, tree
|
18
|
-
else
|
19
|
-
tree[child_ns.join('.')] = value
|
20
|
-
end
|
21
|
-
end
|
22
|
-
tree
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# mutant doen't support Refinements use monky-patch for mutation testing
|
30
|
-
# class Hash
|
31
|
-
# # Transforms a tree-shaped hash into a plain key-value pair hash,
|
32
|
-
# # separating tree levels with a dot.
|
33
|
-
# # @examples
|
34
|
-
# # {a: {b: {c: 1}}, b:{x: 2, y: {ok: true}, z: 4}}.namespaced
|
35
|
-
# # => {"a.b.c"=>1, "b.x"=>2, "b.y.ok"=>true, "b.z"=>4}
|
36
|
-
# def namespaced(namespace = [], tree = {})
|
37
|
-
# each do |key, value|
|
38
|
-
# child_ns = namespace.dup << key
|
39
|
-
# if value.is_a?(Hash)
|
40
|
-
# value.namespaced child_ns, tree
|
41
|
-
# else
|
42
|
-
# tree[child_ns.join('.')] = value
|
43
|
-
# end
|
44
|
-
# end
|
45
|
-
# tree
|
46
|
-
# end
|
47
|
-
# end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module YamlNormalizer
|
4
|
-
module Refinements
|
5
|
-
# Refine Hash to add method sort_by_key
|
6
|
-
module HashSortByKey
|
7
|
-
refine Hash do
|
8
|
-
# Sorts entries alphabetically by key and returns a new Hash
|
9
|
-
# sort_by_key does not modify the Hash it's called on.
|
10
|
-
def sort_by_key(recursive = true, &block)
|
11
|
-
keys.sort(&block).each_with_object({}) do |key, seed|
|
12
|
-
seed[key] = self[key]
|
13
|
-
if recursive && seed[key].is_a?(Hash)
|
14
|
-
seed[key] = seed[key].sort_by_key(true, &block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# mutant doen't support Refinements use monky-patch for mutation testing
|
24
|
-
# class Hash
|
25
|
-
# # Sorts entries alphabetically by key and returns a new Hash
|
26
|
-
# # sort_by_key does not modify the Hash it's called on.
|
27
|
-
# def sort_by_key(recursive = true, &block)
|
28
|
-
# keys.sort(&block).each_with_object({}) do |key, seed|
|
29
|
-
# seed[key] = self[key]
|
30
|
-
# if recursive && seed[key].is_a?(Hash)
|
31
|
-
# seed[key] = seed[key].sort_by_key(true, &block)
|
32
|
-
# end
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
# end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module YamlNormalizer
|
4
|
-
# Refinements holds all refinements used for Yaml Normalizer
|
5
|
-
module Refinements
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
require 'yaml_normalizer/refinements/hash_sort_by_key'
|
10
|
-
require 'yaml_normalizer/refinements/hash_namespaced'
|