yaml_extend 0.2.2 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20c49d0c410649ca4b03ee48eb01bffe73657318ef58a445f5540e477050ae38
4
- data.tar.gz: b02a716589f2efcd3657f4fe887b8839f95252516ce4f26bc3a43ec16fe23dca
3
+ metadata.gz: 709ab41867197b612c61535154fe7e65bad1354c7605417d0fcad1601d45c134
4
+ data.tar.gz: 72f4e212f76e450b96420bb61eeff03aa2e7dc685c6600312ebc767b34987c80
5
5
  SHA512:
6
- metadata.gz: 1918b8ee81d0d1ba88ac69153ed4c84f857137d4c1115fcc902cefc5d1de021fe1a790158527b3878fbeda60f3e3c7a3a64a8ceb3e304646742d5a61687eb91a
7
- data.tar.gz: e5925aa2497aa1b03557fbfa2d1a8e0f0699aab664f4051b7565027e5beeee9ff2f0153c8a48790d1e2c87cb6433287e978dbca18d73e042a7ca42bdd655a1fd
6
+ metadata.gz: aebb3c47f6b90557ac6683ed673a036a3b05a469b543c7bf4b3eb07108ff721410a6a5e57b5fa3a643360fe27cf59f3eb99b724a98f8bd483c34159d1d40956e
7
+ data.tar.gz: e15f2449c5c4d93abb0ba1a56cde3928fd06a7219d2cedb6ee20290cabc8fe1c2a27ecd976a04558395b26e26ab42c60f080595ca458c337996861313b532494
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
55
55
  ## Enforcement
56
56
 
57
57
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at m.beyrle@walz.de. All
58
+ reported by contacting the project team at yaml_extend.gemspec@mail.magynhard.de. All
59
59
  complaints will be reviewed and investigated and will result in a response that
60
60
  is deemed necessary and appropriate to the circumstances. The project team is
61
61
  obligated to maintain confidentiality with regard to the reporter of an incident.
data/README.md CHANGED
@@ -22,11 +22,20 @@ Or install it yourself as:
22
22
 
23
23
  ## Common information
24
24
 
25
- It is possible to build inheritance trees like
25
+ It is possible to build inheritance trees like:
26
26
  ```
27
- default.yml english.yml default.yml german.yml de.yml
28
- \ / \ / |
29
- uk.yml de.yml at.yml
27
+ defaults.yml
28
+ ________\_________
29
+ \ \ \
30
+ dev.yml int.yml prod.yml
31
+ ```
32
+ or like this:
33
+ ```
34
+ default.yml english.yml default.yml german.yml
35
+ \ / \ /
36
+ uk.yml de.yml
37
+ |
38
+ at.yml
30
39
  ```
31
40
 
32
41
  A file can inherit from as many as you want. Trees can be nested as deep as you want.
@@ -39,9 +48,9 @@ That key can be customized if you prefer another one.
39
48
  See the examples below.
40
49
 
41
50
  ## Usage
42
- yaml_extend adds the method YAML#ext_load_file to YAML.
51
+ yaml_extend adds the method YAML.ext_load_file to YAML.
43
52
 
44
- 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.
45
54
 
46
55
  ### Examples
47
56
 
@@ -68,10 +77,10 @@ data:
68
77
  - 'Apples'
69
78
  ```
70
79
 
71
- When you then call #ext_load_file
80
+ When you then call `ext_load_file`
72
81
 
73
82
  ```ruby
74
- YAML.ext_load_file 'start.yml'
83
+ config = YAML.ext_load_file 'start.yml'
75
84
  ```
76
85
 
77
86
  the returned YAML value results in
@@ -111,19 +120,18 @@ foo: 'bar'
111
120
  ...
112
121
  ```
113
122
  ##### 1. Specify by parameter
114
- 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.
115
124
  ```ruby
116
- YAML.ext_load_file 'custom1.yml', 'inherit_from'
125
+ config = YAML.ext_load_file 'custom1.yml', 'inherit_from'
117
126
  ```
118
127
  ##### 2. Global configuration of the key
119
128
  You can specify the key by configuration globally. So you only need to set the key once and not as parameter anymore
120
129
  ```ruby
121
130
  YAML.ext_load_key = 'inherit_from'
122
- YAML.ext_load_file 'custom1.yml'
123
- YAML.ext_load_file 'custom2.yml'
131
+ config = YAML.ext_load_file 'custom1.yml'
124
132
  ```
125
133
  ##### Reset the global key
126
- 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.
127
135
  ```ruby
128
136
  YAML.reset_load_key # more readable
129
137
  YAML.ext_load_key = nil # more explicit
@@ -139,18 +147,17 @@ foo: 'bar'
139
147
  ```
140
148
 
141
149
  ```ruby
142
- YAML.ext_load_file 'custom2.yml', ['options','extend_file']
150
+ config = YAML.ext_load_file 'custom2.yml', ['options','extend_file']
143
151
  ```
144
152
 
145
153
  ## Documentation
146
- 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)
147
155
 
148
156
  - *yaml_path* relative or absolute path to yaml file to inherit from
149
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'
150
158
  - *extend_existing_arrays* Extends existing arrays in yaml structure instead of replacing them. Default: true
151
- - *config* only intended to be used by the method itself due recursive algorithm
152
159
 
153
160
  ## Contributing
154
161
 
155
- Bug reports and pull requests are welcome on GitHub at https://github.com/entwanderer/yaml_extend. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
162
+ Bug reports and pull requests are welcome on GitHub at https://github.com/magynhard/yaml_extend. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
156
163
 
@@ -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,65 @@ 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
- 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))
69
+ # Extend a YAML path in an absolute directory
70
+ if YAML.absolute_path?(super_inheritance_file)
71
+ super_config_path = YAML.make_absolute_path(super_inheritance_file)
72
+ # Extend a YAML path in a relative directory
73
+ else
74
+ super_config_path = File.dirname(yaml_path) + '/' + super_inheritance_file
75
+ end
76
+ total_config = YAML.ext_load_file_recursive(super_config_path, inheritance_key, extend_existing_arrays, total_config)
63
77
  end
64
- YamlExtendHelper.decode_booleans total_config
65
- else
66
- delete_yaml_key inheritance_key, merged_config
67
- YamlExtendHelper.decode_booleans merged_config
68
78
  end
79
+ total_config.deeper_merge!(super_config, extend_existing_arrays: extend_existing_arrays)
69
80
  end
70
81
 
71
- private
72
-
73
82
  # some logic to ensure absolute file inheritance as well as
74
83
  # relative file inheritance in yaml files
75
84
  def self.make_absolute_path(file_path)
76
85
  private_class_method
77
86
  return file_path if YAML.absolute_path?(file_path) && File.exist?(file_path)
78
- base_path = File.dirname(caller_locations[1].path)
87
+ # caller_locations returns the current execution stack
88
+ # [0] is the call from ext_load_file_recursive,
89
+ # [1] is inside ext_load_file,
90
+ # [2] is the exteranl caller of YAML.ext_load_file
91
+ base_path = File.dirname(caller_locations[2].path)
79
92
  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
93
+ return Dir.pwd + '/' + file_path if File.exist? Dir.pwd + '/' + file_path # relative path from project
81
94
  error_message = "Can not find absolute path of '#{file_path}'"
82
95
  unless YAML.absolute_path? file_path
83
96
  error_message += "\nAlso tried:\n- #{base_path + '/' + file_path}\n"\
@@ -1,3 +1,3 @@
1
1
  module YamlExtend
2
- VERSION = '0.2.2'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
@@ -6,11 +6,11 @@ require 'yaml_extend/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "yaml_extend"
8
8
  spec.version = YamlExtend::VERSION
9
- spec.authors = ["Matth\xC3\xA4us Beyrle"]
10
- spec.email = ["post@entwanderer.de"]
9
+ spec.authors = ["Matthäus Beyrle"]
10
+ spec.email = ["yaml_extend.gemspec@mail.magynhard.de"]
11
11
 
12
12
  spec.summary = %q{Extends YAML to support file based inheritance}
13
- spec.homepage = "https://github.com/entwanderer/yaml_extend"
13
+ spec.homepage = "https://github.com/magynhard/yaml_extend"
14
14
  spec.license = "MIT"
15
15
 
16
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  spec.add_dependency 'deep_merge', '~> 1.1'
33
33
 
34
- spec.add_development_dependency 'bundler', '~> 1.14'
35
- spec.add_development_dependency 'rake', '~> 10.0'
36
- spec.add_development_dependency 'rspec', '~> 3.0'
34
+ spec.add_development_dependency 'bundler', '>= 1.14'
35
+ spec.add_development_dependency 'rake', '>= 10.0'
36
+ spec.add_development_dependency 'rspec', '>= 3.0'
37
37
  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.2
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthäus Beyrle
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-27 00:00:00.000000000 Z
11
+ date: 2020-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -28,47 +28,47 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.14'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.14'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
- description:
69
+ description:
70
70
  email:
71
- - post@entwanderer.de
71
+ - yaml_extend.gemspec@mail.magynhard.de
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
@@ -86,14 +86,13 @@ 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
- homepage: https://github.com/entwanderer/yaml_extend
90
+ homepage: https://github.com/magynhard/yaml_extend
92
91
  licenses:
93
92
  - MIT
94
93
  metadata:
95
94
  allowed_push_host: https://rubygems.org
96
- post_install_message:
95
+ post_install_message:
97
96
  rdoc_options: []
98
97
  require_paths:
99
98
  - lib
@@ -108,9 +107,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
107
  - !ruby/object:Gem::Version
109
108
  version: '0'
110
109
  requirements: []
111
- rubyforge_project:
112
- rubygems_version: 2.7.7
113
- signing_key:
110
+ rubygems_version: 3.1.3
111
+ signing_key:
114
112
  specification_version: 4
115
113
  summary: Extends YAML to support file based inheritance
116
114
  test_files: []
@@ -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