yaml_extend 0.0.12 → 0.1.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
- SHA1:
3
- metadata.gz: 232d8e4032b96d3acbb88086dce380d23ebf2dca
4
- data.tar.gz: 7d5749a37cf8eec0f56f82a40ec44ee178c8906d
2
+ SHA256:
3
+ metadata.gz: 04f4c2478bcf2e8aba3680677eceab0842a7d9fc2e7365aa2f28d0d6dd63a117
4
+ data.tar.gz: 43e083063da5ef8ed5908e0f9468424b92ed3da4dd3c263a8771f264a4e5d81d
5
5
  SHA512:
6
- metadata.gz: b8078643bc9c5625f7e1c7666f69d14629eb6a11eaa7bac40f00df3ec878704a6ce019a648e01eb6ce1b39404285748739e2b7d234d54ce51421924872339300
7
- data.tar.gz: abbeaa2005e79a0d3487102c6f9a65914e593e1045fd4bc51c0ee0dfc4b6a81d6311e12e792271c7e94b768b3dd526f391e20b3e43cb4ae06e3016dcbe3eb8a1
6
+ metadata.gz: d34ec7a111411afa7422674d3de2a5b5703016ffae3e5ad20c98844dc1fcd9a80c18465e10cbb4421d2eae0a76f861cc21762ad063c556e22b048a096a8bb546
7
+ data.tar.gz: 2a5a773487b707570e3a615278594998003fbab324c86b486c3cef0f5bcd8748b62926271b121be8a3389ffdc1a4b830e5f5fbe53467de1d8f49b2f23668dfd0
data/.gitignore CHANGED
@@ -8,6 +8,7 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  /.vscode/
11
+ /.idea/
11
12
  *.gem
12
13
 
13
14
  # rspec failure tracking
data/README.md CHANGED
@@ -82,11 +82,37 @@ extends:
82
82
  ...
83
83
  ```
84
84
 
85
+ #### Using custom extend key
86
+ ```
87
+ #custom1.yml
88
+ inherit_from:
89
+ - 'super_file.yml'
90
+ foo: 'bar'
91
+ ...
92
+ ```
93
+
94
+ ```
95
+ YAML.ext_load_file('custom1.yml','inherit_from')
96
+ ```
97
+ #### Using custom nested extend key
98
+ ```
99
+ #custom2.yml
100
+ options:
101
+ extend_file: 'super_file.yml'
102
+ database: false
103
+ foo: 'bar'
104
+ ...
105
+ ```
106
+
107
+ ```
108
+ YAML.ext_load_file('custom2.yml',['options','extend_file'])
109
+ ```
110
+
85
111
  ## Documentation
86
112
  YAML#ext_load_file(yaml_path, inheritance_key='extends', extend_existing_arrays=true, config = {})
87
113
 
88
114
  - *yaml_path* relative or absolute path to yaml file to inherit from
89
- - *inheritance_key* you can overwrite the default key, if you use it already as part of your configuration. The inheritance_key is NOT included in the final merged file. Default: 'extends'
115
+ - *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'
90
116
  - *extend_existing_arrays* Extends existing arrays in yaml structure instead of replacing them. Default: true
91
117
  - *config* only intended to be used by the method itself due recursive algorithm
92
118
 
@@ -0,0 +1,2 @@
1
+ class InvalidKeyTypeError < StandardError
2
+ end
@@ -1,3 +1,3 @@
1
1
  module YamlExtend
2
- VERSION = '0.0.12'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
data/lib/yaml_extend.rb CHANGED
@@ -1,8 +1,10 @@
1
- require "yaml_extend/version"
1
+ require 'yaml_extend/version'
2
2
 
3
3
  require 'yaml'
4
4
  require 'deep_merge/rails_compat'
5
5
 
6
+ require_relative 'custom_errors/invalid_key_type_error'
7
+
6
8
  #
7
9
  # Extending the YAML library to allow to inherit from another YAML file(s)
8
10
  #
@@ -13,7 +15,9 @@ module YAML
13
15
  # ability to inherit from other YAML file(s)
14
16
  #
15
17
  # @param yaml_path [String] the path to the yaml file to be loaded
16
- # @param inheritance_key [String] the key used in the yaml file to extend from another YAML file
18
+ # @param inheritance_key [String|Array]
19
+ # The key used in the yaml file to extend from another YAML file.
20
+ # Use an Array if you want to use a tree structure key like "options.extends" => ['options','extends']
17
21
  # @param extend_existing_arrays [Boolean] extend existing arrays instead of replacing them
18
22
  # @param config [Hash] a hash to be merged into the result, usually only recursivly called by the method itself
19
23
  #
@@ -23,8 +27,8 @@ module YAML
23
27
  total_config ||= {}
24
28
  yaml_path = YAML.make_absolute_path yaml_path
25
29
  super_config = YAML.load_file(File.open(yaml_path))
26
- super_inheritance_files = super_config[inheritance_key]
27
- super_config.delete inheritance_key # we don't merge the super inheritance keys into the base yaml
30
+ super_inheritance_files = yaml_value_by_key inheritance_key, super_config
31
+ delete_yaml_key inheritance_key, super_config # we don't merge the super inheritance keys into the base yaml
28
32
  merged_config = config.clone.deeper_merge(super_config, extend_existing_arrays: extend_existing_arrays)
29
33
  if super_inheritance_files && super_inheritance_files != ''
30
34
  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
@@ -34,7 +38,7 @@ module YAML
34
38
  end
35
39
  total_config
36
40
  else
37
- merged_config.delete(inheritance_key)
41
+ delete_yaml_key inheritance_key, merged_config
38
42
  merged_config
39
43
  end
40
44
  end
@@ -62,4 +66,40 @@ module YAML
62
66
  path.start_with?('/') || # unix like
63
67
  (path.length >= 3 && path[1] == ':') # ms windows
64
68
  end
69
+
70
+ # Return the value of the corresponding key
71
+ # @param key [String|Array]
72
+ def self.yaml_value_by_key(key, config)
73
+ return config[key] if key.is_a? String
74
+ if valid_key_type? key
75
+ cfg_copy = config.clone
76
+ key.each do |key|
77
+ if cfg_copy.nil?
78
+ return
79
+ elsif valid_key_type? key
80
+ cfg_copy = cfg_copy[key]
81
+ end
82
+ end
83
+ cfg_copy
84
+ end
85
+ end
86
+
87
+ def self.valid_key_type?(key)
88
+ key.is_a?(Array) || key.is_a?(String) ||
89
+ raise(InvalidKeyTypeError,"Invalid key of type '#{key.class.name}'. Valid types are String and Array.")
90
+ end
91
+
92
+ def self.delete_yaml_key(key, config)
93
+ return config.delete(key) if key.is_a? String
94
+ cfg_ref = config
95
+ last_ref = nil
96
+ key.each do |key|
97
+ if valid_key_type?(key) && !cfg_ref[key].nil?
98
+ last_ref = cfg_ref
99
+ cfg_ref = cfg_ref[key] unless cfg_ref.nil?
100
+ end
101
+ end
102
+ last_ref.delete key.last unless last_ref.nil?
103
+ end
104
+
65
105
  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.0.12
4
+ version: 0.1.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: 2017-09-14 00:00:00.000000000 Z
11
+ date: 2018-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -83,6 +83,7 @@ files:
83
83
  - Rakefile
84
84
  - bin/console
85
85
  - bin/setup
86
+ - lib/custom_errors/invalid_key_type_error.rb
86
87
  - lib/yaml_extend.rb
87
88
  - lib/yaml_extend/version.rb
88
89
  - yaml_extend.gemspec
@@ -107,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
108
  version: '0'
108
109
  requirements: []
109
110
  rubyforge_project:
110
- rubygems_version: 2.5.2
111
+ rubygems_version: 2.7.3
111
112
  signing_key:
112
113
  specification_version: 4
113
114
  summary: Extends YAML to support file based inheritance