yaml_extend 1.0.1 → 1.0.2
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/README.md +23 -8
- data/lib/yaml_extend.rb +64 -15
- data/lib/yaml_extend/version.rb +1 -1
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b056650bc04768e6d55177c1125ef048d7f02d4764e8cecdd851f75e07b816c5
         | 
| 4 | 
            +
              data.tar.gz: bc70a195072c63c7af2116b619f8ea5677b7fae0925128f9cfbedb8d216d7d9c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6f3588a3e5a0a07d4102e19ed7d0c87af68f0638037d141df85c4d24c7791743b3fd449fc77a6316d44f602e157297c6560dba9dabc304ee46c36f3ccb8d9155
         | 
| 7 | 
            +
              data.tar.gz: 7ff4beefad210bd1a503a8cfc4563042c53751099441beb04d2ad1680eebad697b87db82e10421c4ca958439bda4c850770729211db8f0f67e3e8a5b6feecc05
         | 
    
        data/README.md
    CHANGED
    
    | @@ -31,11 +31,11 @@ It is possible to build inheritance trees like: | |
| 31 31 | 
             
            ```
         | 
| 32 32 | 
             
            or like this:
         | 
| 33 33 | 
             
            ```
         | 
| 34 | 
            -
             | 
| 34 | 
            +
            fruits.yml   vegetables.yml          default.yml   extensions.yml       
         | 
| 35 35 | 
             
                     \    /                             \    /                
         | 
| 36 | 
            -
                       | 
| 36 | 
            +
                      food.yml                          merged.yml
         | 
| 37 37 | 
             
                                                          |
         | 
| 38 | 
            -
                                                         | 
| 38 | 
            +
                                                        another_extended.yml
         | 
| 39 39 | 
             
            ```
         | 
| 40 40 |  | 
| 41 41 | 
             
            A file can inherit from as many as you want. Trees can be nested as deep as you want.
         | 
| @@ -151,11 +151,26 @@ config = YAML.ext_load_file 'custom2.yml', ['options','extend_file'] | |
| 151 151 | 
             
            ```
         | 
| 152 152 |  | 
| 153 153 | 
             
            ## Documentation
         | 
| 154 | 
            -
             | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 157 | 
            -
            -  | 
| 158 | 
            -
            -  | 
| 154 | 
            +
            ```ruby
         | 
| 155 | 
            +
            YAML.ext_load_file(yaml_path, inheritance_key='extends', options = {})
         | 
| 156 | 
            +
            ```
         | 
| 157 | 
            +
            - `yaml_path` (String) relative or absolute path to yaml file to inherit from
         | 
| 158 | 
            +
            - `inheritance_key` (String) 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'`
         | 
| 159 | 
            +
            - `options` (Hash) collection of optional options, including all options of the based `deep_merge` gem
         | 
| 160 | 
            +
              - `:preserve_inheritance_key` (Boolean) Preserve inheritance key(s) from resulting yaml, does most time not make sense especially in multiple inheritance - DEFAULT: false
         | 
| 161 | 
            +
              - The following options are deep merge options that can be passed by - but the defaults differ from original
         | 
| 162 | 
            +
                https://github.com/danielsdeleo/deep_merge#options
         | 
| 163 | 
            +
              - `:preserve_unmergeables` (Boolean) Set to true to skip any unmergeable elements from source - DEFAULT: false
         | 
| 164 | 
            +
              - `:knockout_prefix` (String) Set to string value to signify prefix which deletes elements from existing element - DEFAULT: nil
         | 
| 165 | 
            +
              - `:overwrite_arrays` (Boolean) Set to true if you want to avoid merging arrays - DEFAULT: false
         | 
| 166 | 
            +
              - `:sort_merged_arrays` (Boolean) Set to true to sort all arrays that are merged together - DEFAULT: false
         | 
| 167 | 
            +
              - `:unpack_arrays` (String) Set to string value to run "Array::join" then "String::split" against all arrays - DEFAULT: nil
         | 
| 168 | 
            +
              - `:merge_hash_arrays` (Boolean) Set to true to merge hashes within arrays - DEFAULT: false
         | 
| 169 | 
            +
              - `:extend_existing_arrays` (Boolean) Set to true to extend existing arrays, instead of overwriting them - DEFAULT: true
         | 
| 170 | 
            +
              - `:merge_nil_values` (Boolean) Set to true to merge nil hash values, overwriting a possibly non-nil value - DEFAULT: false
         | 
| 171 | 
            +
              - `:merge_debug` (Boolean) Set to true to get console output of merge process for debugging - DEFAULT: false
         | 
| 172 | 
            +
             | 
| 173 | 
            +
            See also rubydoc at [https://www.rubydoc.info/gems/yaml_extend](https://www.rubydoc.info/gems/yaml_extend)
         | 
| 159 174 |  | 
| 160 175 | 
             
            ## Contributing
         | 
| 161 176 |  | 
    
        data/lib/yaml_extend.rb
    CHANGED
    
    | @@ -13,6 +13,19 @@ module YAML | |
| 13 13 | 
             
              # default path in the yaml file where the files to inherit from are defined
         | 
| 14 14 | 
             
              DEFAULT_INHERITANCE_KEY = 'extends'
         | 
| 15 15 | 
             
              @@ext_load_key = nil
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              DEEP_MERGE_OPTIONS = [
         | 
| 18 | 
            +
                  :preserve_unmergeables,
         | 
| 19 | 
            +
                  :knockout_prefix,
         | 
| 20 | 
            +
                  :overwrite_arrays,
         | 
| 21 | 
            +
                  :sort_merged_arrays,
         | 
| 22 | 
            +
                  :unpack_arrays,
         | 
| 23 | 
            +
                  :merge_hash_arrays,
         | 
| 24 | 
            +
                  :extend_existing_arrays,
         | 
| 25 | 
            +
                  :merge_nil_values,
         | 
| 26 | 
            +
                  :merge_debug,
         | 
| 27 | 
            +
              ]
         | 
| 28 | 
            +
             | 
| 16 29 | 
             
              #
         | 
| 17 30 | 
             
              # Set a custom inheritance key globally once.
         | 
| 18 31 | 
             
              # So you don't need to specify it on every call of ext_load_file()
         | 
| @@ -37,13 +50,29 @@ module YAML | |
| 37 50 | 
             
              # Extended variant of the YAML.load_file method by providing the
         | 
| 38 51 | 
             
              # ability to inherit from other YAML file(s)
         | 
| 39 52 | 
             
              #
         | 
| 40 | 
            -
              # @param  | 
| 41 | 
            -
              # @param  | 
| 42 | 
            -
              # @param  | 
| 53 | 
            +
              # @param [String] yaml_path the path to the yaml file to be loaded
         | 
| 54 | 
            +
              # @param [String|Array] inheritance_key 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']
         | 
| 55 | 
            +
              # @param [Hash] options to pass, including deep_merge options as well as
         | 
| 56 | 
            +
              # @option options [Boolean] :preserve_inheritance_key Preserve inheritance key(s) from resulting yaml, does most time not make sense especially in multiple inheritance - DEFAULT: false
         | 
| 57 | 
            +
              #
         | 
| 58 | 
            +
              # deep merge options that can be passed by - but the defaults differ from original
         | 
| 59 | 
            +
              # https://github.com/danielsdeleo/deep_merge#options
         | 
| 60 | 
            +
              #
         | 
| 61 | 
            +
              # @option options [Boolean] :preserve_unmergeables Set to true to skip any unmergeable elements from source - DEFAULT: false
         | 
| 62 | 
            +
              # @option options [String] :knockout_prefix Set to string value to signify prefix which deletes elements from existing element - DEFAULT: nil
         | 
| 63 | 
            +
              # @option options [Boolean] :overwrite_arrays Set to true if you want to avoid merging arrays - DEFAULT: false
         | 
| 64 | 
            +
              # @option options [Boolean] :sort_merged_arrays Set to true to sort all arrays that are merged together - DEFAULT: false
         | 
| 65 | 
            +
              # @option options [String] :unpack_arrays Set to string value to run "Array::join" then "String::split" against all arrays - DEFAULT: nil
         | 
| 66 | 
            +
              # @option options [Boolean] :merge_hash_arrays Set to true to merge hashes within arrays - DEFAULT: false
         | 
| 67 | 
            +
              # @option options [Boolean] :extend_existing_arrays Set to true to extend existing arrays, instead of overwriting them - DEFAULT: true
         | 
| 68 | 
            +
              # @option options [Boolean] :merge_nil_values Set to true to merge nil hash values, overwriting a possibly non-nil value - DEFAULT: false
         | 
| 69 | 
            +
              # @option options [Boolean] :merge_debug Set to true to get console output of merge process for debugging - DEFAULT: false
         | 
| 70 | 
            +
              #
         | 
| 71 | 
            +
              # @param  [Boolean] options Fallback for backward compatiblity: extend existing arrays instead of replacing them (deep_merge)
         | 
| 43 72 | 
             
              # @return [Hash] the resulting yaml config 
         | 
| 44 73 | 
             
              #
         | 
| 45 | 
            -
              def self.ext_load_file(yaml_path, inheritance_key=nil,  | 
| 46 | 
            -
                YAML.ext_load_file_recursive(yaml_path, inheritance_key,  | 
| 74 | 
            +
              def self.ext_load_file(yaml_path, inheritance_key = nil, options = {})
         | 
| 75 | 
            +
                YAML.ext_load_file_recursive(yaml_path, inheritance_key, options, {})
         | 
| 47 76 | 
             
              end
         | 
| 48 77 |  | 
| 49 78 | 
             
              private
         | 
| @@ -51,32 +80,52 @@ module YAML | |
| 51 80 | 
             
              #
         | 
| 52 81 | 
             
              # @param config [Hash] a hash to be merged into the result, usually only recursivly called by the method itself
         | 
| 53 82 | 
             
              #
         | 
| 54 | 
            -
              def self.ext_load_file_recursive(yaml_path, inheritance_key,  | 
| 83 | 
            +
              def self.ext_load_file_recursive(yaml_path, inheritance_key, options = {}, config)
         | 
| 84 | 
            +
                # backward compatibility to 1.0.1
         | 
| 85 | 
            +
                if options == true || options == false
         | 
| 86 | 
            +
                  options = {extend_existing_arrays: options}
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
                default_options = {
         | 
| 89 | 
            +
                    preserve_inheritance_key: false,
         | 
| 90 | 
            +
                    preserve_unmergeables: false,
         | 
| 91 | 
            +
                    knockout_prefix: nil,
         | 
| 92 | 
            +
                    overwrite_arrays: false,
         | 
| 93 | 
            +
                    sort_merged_arrays: false,
         | 
| 94 | 
            +
                    unpack_arrays: nil,
         | 
| 95 | 
            +
                    merge_hash_arrays: false,
         | 
| 96 | 
            +
                    extend_existing_arrays: true,
         | 
| 97 | 
            +
                    merge_nil_values: false,
         | 
| 98 | 
            +
                    merge_debug: false,
         | 
| 99 | 
            +
                }
         | 
| 100 | 
            +
                options = default_options.merge options
         | 
| 55 101 | 
             
                private_class_method
         | 
| 56 102 | 
             
                if inheritance_key.nil?
         | 
| 57 103 | 
             
                  inheritance_key = @@ext_load_key || DEFAULT_INHERITANCE_KEY
         | 
| 58 104 | 
             
                end
         | 
| 59 105 | 
             
                total_config = config.clone
         | 
| 60 | 
            -
             | 
| 106 | 
            +
             | 
| 61 107 | 
             
                yaml_path = YAML.make_absolute_path yaml_path
         | 
| 62 108 | 
             
                super_config = YAML.load_file(File.open(yaml_path))
         | 
| 63 109 | 
             
                super_inheritance_files = yaml_value_by_key inheritance_key, super_config
         | 
| 64 | 
            -
                 | 
| 65 | 
            -
             | 
| 110 | 
            +
                unless options[:preserve_inheritance_key]
         | 
| 111 | 
            +
                  delete_yaml_key inheritance_key, super_config # we don't merge the super inheritance keys into the base yaml
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 66 114 | 
             
                if super_inheritance_files && super_inheritance_files != ''
         | 
| 67 115 | 
             
                  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
         | 
| 68 116 | 
             
                  super_inheritance_files.each_with_index do |super_inheritance_file, index|
         | 
| 69 117 | 
             
                    # Extend a YAML path in an absolute directory
         | 
| 70 118 | 
             
                    if YAML.absolute_path?(super_inheritance_file)
         | 
| 71 119 | 
             
                      super_config_path = YAML.make_absolute_path(super_inheritance_file)
         | 
| 72 | 
            -
             | 
| 120 | 
            +
                      # Extend a YAML path in a relative directory
         | 
| 73 121 | 
             
                    else
         | 
| 74 122 | 
             
                      super_config_path = File.dirname(yaml_path) + '/' + super_inheritance_file
         | 
| 75 123 | 
             
                    end
         | 
| 76 | 
            -
                    total_config = YAML.ext_load_file_recursive(super_config_path, inheritance_key,  | 
| 124 | 
            +
                    total_config = YAML.ext_load_file_recursive(super_config_path, inheritance_key, options, total_config)
         | 
| 77 125 | 
             
                  end
         | 
| 78 126 | 
             
                end
         | 
| 79 | 
            -
                 | 
| 127 | 
            +
                deep_merge_options = options.select { |k, v| DEEP_MERGE_OPTIONS.include? k }
         | 
| 128 | 
            +
                total_config.deeper_merge!(super_config, deep_merge_options)
         | 
| 80 129 | 
             
              end
         | 
| 81 130 |  | 
| 82 131 | 
             
              # some logic to ensure absolute file inheritance as well as 
         | 
| @@ -90,7 +139,7 @@ module YAML | |
| 90 139 | 
             
                #   [2] is the exteranl caller of YAML.ext_load_file
         | 
| 91 140 | 
             
                base_path = File.dirname(caller_locations[2].path)
         | 
| 92 141 | 
             
                return base_path + '/' + file_path if File.exist? base_path + '/' + file_path # relative path from yaml file
         | 
| 93 | 
            -
                return Dir.pwd + '/' + file_path if File.exist? Dir.pwd + '/' + file_path | 
| 142 | 
            +
                return Dir.pwd + '/' + file_path if File.exist? Dir.pwd + '/' + file_path # relative path from project
         | 
| 94 143 | 
             
                error_message = "Can not find absolute path of '#{file_path}'"
         | 
| 95 144 | 
             
                unless YAML.absolute_path? file_path
         | 
| 96 145 | 
             
                  error_message += "\nAlso tried:\n- #{base_path + '/' + file_path}\n"\
         | 
| @@ -102,7 +151,7 @@ module YAML | |
| 102 151 | 
             
              def self.absolute_path?(path)
         | 
| 103 152 | 
             
                private_class_method
         | 
| 104 153 | 
             
                path.start_with?('/') || # unix like
         | 
| 105 | 
            -
             | 
| 154 | 
            +
                    (path.length >= 3 && path[1] == ':') # ms windows
         | 
| 106 155 | 
             
              end
         | 
| 107 156 |  | 
| 108 157 | 
             
              # Return the value of the corresponding key
         | 
| @@ -124,7 +173,7 @@ module YAML | |
| 124 173 |  | 
| 125 174 | 
             
              def self.valid_key_type?(key)
         | 
| 126 175 | 
             
                key.is_a?(Array) || key.is_a?(String) ||
         | 
| 127 | 
            -
                    raise(InvalidKeyTypeError,"Invalid key of type '#{key.class.name}'. Valid types are String and Array.")
         | 
| 176 | 
            +
                    raise(InvalidKeyTypeError, "Invalid key of type '#{key.class.name}'. Valid types are String and Array.")
         | 
| 128 177 | 
             
              end
         | 
| 129 178 |  | 
| 130 179 | 
             
              def self.delete_yaml_key(key, config)
         | 
    
        data/lib/yaml_extend/version.rb
    CHANGED
    
    
    
        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: 1.0. | 
| 4 | 
            +
              version: 1.0.2
         | 
| 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: 2020- | 
| 11 | 
            +
            date: 2020-12-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: deep_merge
         | 
| @@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 107 107 | 
             
                - !ruby/object:Gem::Version
         | 
| 108 108 | 
             
                  version: '0'
         | 
| 109 109 | 
             
            requirements: []
         | 
| 110 | 
            -
            rubygems_version: 3. | 
| 110 | 
            +
            rubygems_version: 3.0.8
         | 
| 111 111 | 
             
            signing_key:
         | 
| 112 112 | 
             
            specification_version: 4
         | 
| 113 113 | 
             
            summary: Extends YAML to support file based inheritance
         |