yaml_extend 0.2.5 → 1.0.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
2
  SHA1:
3
- metadata.gz: bf470b2008a115bd29099864f2906f56f0c2a665
4
- data.tar.gz: 7fd428b80b59c950cfc9ea26db2db35af2653174
3
+ metadata.gz: 8de4a06253714132d952fcaebc2592ef5410fe38
4
+ data.tar.gz: 6fb4e757d42962afa2d85e4fe754a83e0584e204
5
5
  SHA512:
6
- metadata.gz: 2bf43ffb90add13d47f8fd37de9fee408175a3c292d8552fc050155490bb0355acaf8384818eb174a25d29d1967c311dbdc690c161b2ea337e0578342b4530ff
7
- data.tar.gz: 583ba753e530b4dd5de049448382f6413c7928e03474d295b51a5f20093e5df316192561257bc6ade629fb2fe80fe38e9661cad1c69452b440095d018de424e4
6
+ metadata.gz: db63a4f3749846aa07412dbc8f95738f9cd43c6aa19ef45dee3b6cd098da66afd16739f3a6e74e0d5cc6188030ec57bd78b874583a8a5ea158350757322a7b8a
7
+ data.tar.gz: 9c1a44b1075bab488ce5f02b40ba20cc9afac1d5da487f6dcddf5f7f48acabeb1d980865d5f36c2c1b80658feaffb281096f523a9e74811c234e981081aa2092
data/README.md CHANGED
@@ -48,9 +48,9 @@ That key can be customized if you prefer another one.
48
48
  See the examples below.
49
49
 
50
50
  ## Usage
51
- yaml_extend adds the method YAML#ext_load_file to YAML.
51
+ yaml_extend adds the method YAML.ext_load_file to YAML.
52
52
 
53
- This method works like the original YAML#load_file, by extending it with file inheritance.
53
+ This method works like the original YAML.load_file, by extending it with file inheritance.
54
54
 
55
55
  ### Examples
56
56
 
@@ -77,7 +77,7 @@ data:
77
77
  - 'Apples'
78
78
  ```
79
79
 
80
- When you then call #ext_load_file
80
+ When you then call `ext_load_file`
81
81
 
82
82
  ```ruby
83
83
  config = YAML.ext_load_file 'start.yml'
@@ -120,7 +120,7 @@ foo: 'bar'
120
120
  ...
121
121
  ```
122
122
  ##### 1. Specify by parameter
123
- You can specify the key by parameter, this is the way to go if you want to use the different key only once or you use the #ext_load_file method only once in your application.
123
+ You can specify the key by parameter, this is the way to go if you want to use the different key only once or you use the `ext_load_file` method only once in your application.
124
124
  ```ruby
125
125
  config = YAML.ext_load_file 'custom1.yml', 'inherit_from'
126
126
  ```
@@ -131,7 +131,7 @@ YAML.ext_load_key = 'inherit_from'
131
131
  config = YAML.ext_load_file 'custom1.yml'
132
132
  ```
133
133
  ##### Reset the global key
134
- To reset the global inheritance key, you can either set it to nil or call the #reset_load_key method.
134
+ To reset the global inheritance key, you can either set it to nil or call the `reset_load_key` method.
135
135
  ```ruby
136
136
  YAML.reset_load_key # more readable
137
137
  YAML.ext_load_key = nil # more explicit
@@ -151,12 +151,11 @@ config = YAML.ext_load_file 'custom2.yml', ['options','extend_file']
151
151
  ```
152
152
 
153
153
  ## Documentation
154
- YAML#ext_load_file(yaml_path, inheritance_key='extends', extend_existing_arrays=true, config = {})
154
+ YAML.ext_load_file(yaml_path, inheritance_key='extends', extend_existing_arrays=true)
155
155
 
156
156
  - *yaml_path* relative or absolute path to yaml file to inherit from
157
157
  - *inheritance_key* you can overwrite the default key, if you use the default 'extends' already as part of your configuration. The inheritance_key is NOT included, that means it will be deleted, in the final merged file. Default: 'extends'
158
158
  - *extend_existing_arrays* Extends existing arrays in yaml structure instead of replacing them. Default: true
159
- - *config* only intended to be used by the method itself due recursive algorithm
160
159
 
161
160
  ## Contributing
162
161
 
@@ -3,8 +3,6 @@ require 'yaml_extend/version'
3
3
  require 'yaml'
4
4
  require 'deep_merge/rails_compat'
5
5
 
6
- require_relative 'yaml_extend/yaml_extend_helper'
7
-
8
6
  require_relative 'custom_errors/invalid_key_type_error'
9
7
 
10
8
  #
@@ -34,50 +32,59 @@ module YAML
34
32
  def self.reset_load_key()
35
33
  @@ext_load_key = nil
36
34
  end
35
+
37
36
  #
38
- # Extended variant of the #load_file method by providing the
37
+ # Extended variant of the YAML.load_file method by providing the
39
38
  # ability to inherit from other YAML file(s)
40
39
  #
41
40
  # @param yaml_path [String] the path to the yaml file to be loaded
42
41
  # @param inheritance_key [String|Array] The key used in the yaml file to extend from another YAML file. Use an Array if you want to use a tree structure key like "options.extends" => ['options','extends']
43
42
  # @param extend_existing_arrays [Boolean] extend existing arrays instead of replacing them
44
- # @param config [Hash] a hash to be merged into the result, usually only recursivly called by the method itself
45
- #
46
43
  # @return [Hash] the resulting yaml config
47
44
  #
48
- def self.ext_load_file(yaml_path, inheritance_key=nil, extend_existing_arrays=true, config = {})
45
+ def self.ext_load_file(yaml_path, inheritance_key=nil, extend_existing_arrays=true)
46
+ YAML.ext_load_file_recursive(yaml_path, inheritance_key, extend_existing_arrays, {})
47
+ end
48
+
49
+ private
50
+
51
+ #
52
+ # @param config [Hash] a hash to be merged into the result, usually only recursivly called by the method itself
53
+ #
54
+ def self.ext_load_file_recursive(yaml_path, inheritance_key, extend_existing_arrays, config)
55
+ private_class_method
49
56
  if inheritance_key.nil?
50
57
  inheritance_key = @@ext_load_key || DEFAULT_INHERITANCE_KEY
51
58
  end
52
- total_config ||= {}
59
+ total_config = config.clone
60
+
53
61
  yaml_path = YAML.make_absolute_path yaml_path
54
- super_config = YamlExtendHelper.encode_booleans YAML.load_file(File.open(yaml_path))
62
+ super_config = YAML.load_file(File.open(yaml_path))
55
63
  super_inheritance_files = yaml_value_by_key inheritance_key, super_config
56
64
  delete_yaml_key inheritance_key, super_config # we don't merge the super inheritance keys into the base yaml
57
- merged_config = config.clone.deeper_merge(super_config, extend_existing_arrays: extend_existing_arrays)
65
+
58
66
  if super_inheritance_files && super_inheritance_files != ''
59
67
  super_inheritance_files = [super_inheritance_files] unless super_inheritance_files.is_a? Array # we support strings as well as arrays of type string to extend from
60
68
  super_inheritance_files.each_with_index do |super_inheritance_file, index|
61
69
  super_config_path = File.dirname(yaml_path) + '/' + super_inheritance_file
62
- total_config = YamlExtendHelper.encode_booleans YAML.ext_load_file(super_config_path, inheritance_key, extend_existing_arrays, total_config.deeper_merge(merged_config, extend_existing_arrays: extend_existing_arrays))
70
+ total_config = YAML.ext_load_file_recursive(super_config_path, inheritance_key, extend_existing_arrays, total_config)
63
71
  end
64
- YamlExtendHelper.decode_booleans total_config
65
- else
66
- delete_yaml_key inheritance_key, merged_config
67
- YamlExtendHelper.decode_booleans merged_config
68
72
  end
73
+ total_config.deeper_merge!(super_config, extend_existing_arrays: extend_existing_arrays)
69
74
  end
70
75
 
71
- private
72
-
73
76
  # some logic to ensure absolute file inheritance as well as
74
77
  # relative file inheritance in yaml files
75
78
  def self.make_absolute_path(file_path)
76
79
  private_class_method
77
80
  return file_path if YAML.absolute_path?(file_path) && File.exist?(file_path)
78
- base_path = File.dirname(caller_locations[1].path)
81
+ # caller_locations returns the current execution stack
82
+ # [0] is the call from ext_load_file_recursive,
83
+ # [1] is inside ext_load_file,
84
+ # [2] is the exteranl caller of YAML.ext_load_file
85
+ base_path = File.dirname(caller_locations[2].path)
79
86
  return base_path + '/' + file_path if File.exist? base_path + '/' + file_path # relative path from yaml file
80
- return Dir.pwd + '/' + file_path if File.exist? Dir.pwd + '/' + file_path # relative path from project
87
+ return Dir.pwd + '/' + file_path if File.exist? Dir.pwd + '/' + file_path # relative path from project
81
88
  error_message = "Can not find absolute path of '#{file_path}'"
82
89
  unless YAML.absolute_path? file_path
83
90
  error_message += "\nAlso tried:\n- #{base_path + '/' + file_path}\n"\
@@ -1,3 +1,3 @@
1
1
  module YamlExtend
2
- VERSION = '0.2.5'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaml_extend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthäus Beyrle
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-26 00:00:00.000000000 Z
11
+ date: 2019-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -86,7 +86,6 @@ files:
86
86
  - lib/custom_errors/invalid_key_type_error.rb
87
87
  - lib/yaml_extend.rb
88
88
  - lib/yaml_extend/version.rb
89
- - lib/yaml_extend/yaml_extend_helper.rb
90
89
  - yaml_extend.gemspec
91
90
  homepage: https://github.com/magynhard/yaml_extend
92
91
  licenses:
@@ -109,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
108
  version: '0'
110
109
  requirements: []
111
110
  rubyforge_project:
112
- rubygems_version: 2.6.14.3
111
+ rubygems_version: 2.5.2
113
112
  signing_key:
114
113
  specification_version: 4
115
114
  summary: Extends YAML to support file based inheritance
@@ -1,68 +0,0 @@
1
-
2
- #
3
- # This class includes a workaround patch, providing a solution of the unaccepted pull request
4
- # 'false is not overriden by true if preserve_unmergeables'
5
- # https://github.com/danielsdeleo/deep_merge/pull/28
6
- #
7
- # It ensures, that booleans can be merged correctly, by en- and decoding them to strings, before and after merging
8
- # see #encode_boolens and #decode_booleans
9
- #
10
-
11
- class YamlExtendHelper
12
-
13
- TRUE_CLASS_ENCODED = '#={TrueClass}=#'
14
- FALSE_CLASS_ENCODED = '#={FalseClass}=#'
15
-
16
- def self.encode_booleans(hash)
17
- hash.each_with_object({}) do |(k,v),g|
18
- g[k] = if v.is_a? Hash
19
- YamlExtendHelper.encode_booleans(v)
20
- elsif v.is_a? Array
21
- v.each_with_index do |av, ai|
22
- v[ai] = if av.is_a? Hash
23
- YamlExtendHelper.encode_booleans(av)
24
- elsif av.is_a? TrueClass
25
- TRUE_CLASS_ENCODED
26
- elsif av.is_a? FalseClass
27
- FALSE_CLASS_ENCODED
28
- else
29
- av
30
- end
31
- end
32
- elsif v.is_a? TrueClass
33
- TRUE_CLASS_ENCODED
34
- elsif v.is_a? FalseClass
35
- FALSE_CLASS_ENCODED
36
- else
37
- v
38
- end
39
- end
40
- end
41
-
42
- def self.decode_booleans(hash)
43
- hash.each_with_object({}) do |(k,v),g|
44
- g[k] = if v.is_a? Hash
45
- YamlExtendHelper.decode_booleans(v)
46
- elsif v.is_a? Array
47
- v.each_with_index do |av, ai|
48
- v[ai] = if av.is_a? Hash
49
- YamlExtendHelper.decode_booleans(av)
50
- elsif av === TRUE_CLASS_ENCODED
51
- true
52
- elsif av === FALSE_CLASS_ENCODED
53
- false
54
- else
55
- av
56
- end
57
- end
58
- elsif v === TRUE_CLASS_ENCODED
59
- true
60
- elsif v === FALSE_CLASS_ENCODED
61
- false
62
- else
63
- v
64
- end
65
- end
66
- end
67
-
68
- end