config-hash 0.5.0 → 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 +4 -4
 - data/.ruby-version +1 -1
 - data/config-hash.gemspec +1 -1
 - data/lib/config-hash.rb +56 -69
 - metadata +6 -7
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 18cc65d997214d22026cd64bd4a4a648e943d0f5aabe62e25633d583e8c1426c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9b8de42e1c7428a97aae9e82338dd0e6dd00c23995d0078ca5be05d6d4d87213
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: fc9e93f97ad627f5ba663d444c35cf3266e0351d1fb5dedf01fe26912e26d0773368d80f6677f474e69905930f1f6d65fe978579840b2f0dbb20f566ada7157f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: d612503adbdc102de8a4a81e2d60c45dca4ab8f21c997384b65263f0dee9cd7e4894d93f3dcbe9feb2f0ae5c6116c0906e44e962e42391cee364c112a3721245
         
     | 
    
        data/.ruby-version
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            2.5 
     | 
| 
      
 1 
     | 
    
         
            +
            2.6.5
         
     | 
    
        data/config-hash.gemspec
    CHANGED
    
    
    
        data/lib/config-hash.rb
    CHANGED
    
    | 
         @@ -1,61 +1,65 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            Encoding.default_external = "UTF-8"
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
1 
     | 
    
         
             
            class Hash
         
     | 
| 
       4 
     | 
    
         
            -
              def  
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
              end
         
     | 
| 
       7 
     | 
    
         
            -
              def +@
         
     | 
| 
       8 
     | 
    
         
            -
                ConfigHash.new(self)
         
     | 
| 
       9 
     | 
    
         
            -
              end
         
     | 
| 
      
 2 
     | 
    
         
            +
              def -@; NormalHash[self]; end
         
     | 
| 
      
 3 
     | 
    
         
            +
              def +@; ConfigHash[self]; end
         
     | 
| 
       10 
4 
     | 
    
         
             
            end
         
     | 
| 
       11 
5 
     | 
    
         | 
| 
       12 
6 
     | 
    
         
             
            class NormalHash < Hash
         
     | 
| 
       13 
7 
     | 
    
         
             
            end
         
     | 
| 
       14 
8 
     | 
    
         | 
| 
       15 
9 
     | 
    
         
             
            class ConfigHash < Hash
         
     | 
| 
       16 
     | 
    
         
            -
              SEPARATORS  
     | 
| 
      
 10 
     | 
    
         
            +
              SEPARATORS ||= %r|[./]|
         
     | 
| 
       17 
11 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
              def self. 
     | 
| 
      
 12 
     | 
    
         
            +
              def self.[](hash=nil)
         
     | 
| 
      
 13 
     | 
    
         
            +
                new(hash)
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              def self.load(path="config.rb", list=nil, name: "config")
         
     | 
| 
       19 
17 
     | 
    
         
             
                path = File.expand_path(path)
         
     | 
| 
       20 
     | 
    
         
            -
                eval  
     | 
| 
       21 
     | 
    
         
            -
                  #{ 
     | 
| 
       22 
     | 
    
         
            -
                  #{IO.read(path, encoding: 'utf-8') if File. 
     | 
| 
       23 
     | 
    
         
            -
                  #{ 
     | 
| 
      
 18 
     | 
    
         
            +
                data = eval <<~"end", binding, path, 0
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #{name} ||= new
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #{IO.read(path, encoding: 'utf-8') if File.readable?(path)}
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #{name}
         
     | 
| 
       24 
22 
     | 
    
         
             
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
                data.load(*list) if list && !list.empty?
         
     | 
| 
      
 24 
     | 
    
         
            +
                data
         
     | 
| 
       25 
25 
     | 
    
         
             
              end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
              def initialize(hash=nil)
         
     | 
| 
       28 
28 
     | 
    
         
             
                super()
         
     | 
| 
       29 
     | 
    
         
            -
                 
     | 
| 
      
 29 
     | 
    
         
            +
                update(hash) if hash
         
     | 
| 
       30 
30 
     | 
    
         
             
              end
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
              def  
     | 
| 
       33 
     | 
    
         
            -
                 
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                   
     | 
| 
       37 
     | 
    
         
            -
                   
     | 
| 
       38 
     | 
    
         
            -
                   
     | 
| 
      
 32 
     | 
    
         
            +
              def load(*list)
         
     | 
| 
      
 33 
     | 
    
         
            +
                [list].each do |root, glob|
         
     | 
| 
      
 34 
     | 
    
         
            +
                  root = File.expand_path(root)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  pref = root.size + 1
         
     | 
| 
      
 36 
     | 
    
         
            +
                  full = File.join([root, glob].compact)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  list = Dir[full].sort {|a,b| [a.count('/'), a] <=> [b.count('/'), b]}
         
     | 
| 
      
 38 
     | 
    
         
            +
                  list.each do |path|
         
     | 
| 
      
 39 
     | 
    
         
            +
                    info = File.dirname(path[pref...] || '')
         
     | 
| 
      
 40 
     | 
    
         
            +
                    data = ConfigHash.load(path)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    info == '.' ? update(data) : (self[info] = data)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
       39 
43 
     | 
    
         
             
                end
         
     | 
| 
       40 
44 
     | 
    
         
             
                self
         
     | 
| 
       41 
45 
     | 
    
         
             
              end
         
     | 
| 
       42 
46 
     | 
    
         | 
| 
      
 47 
     | 
    
         
            +
              def key?(key)
         
     | 
| 
      
 48 
     | 
    
         
            +
                super(key.to_s)
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       43 
51 
     | 
    
         
             
              def [](key)
         
     | 
| 
      
 52 
     | 
    
         
            +
                our = self.class
         
     | 
| 
       44 
53 
     | 
    
         
             
                key = key.to_s
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                   
     | 
| 
       48 
     | 
    
         
            -
                    if  
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                    elsif  
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                    elsif tag == "*" && val.size == 1
         
     | 
| 
       53 
     | 
    
         
            -
                      val = val[val.keys.first]
         
     | 
| 
       54 
     | 
    
         
            -
                    else
         
     | 
| 
       55 
     | 
    
         
            -
                      return super(key)
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                if !key?(key) && key =~ SEPARATORS && (ary = key.split SEPARATORS)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  val = ary.inject(self) do |obj, sub|
         
     | 
| 
      
 57 
     | 
    
         
            +
                    if not our === obj  then return super(key)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    elsif obj.key?(sub) then obj[sub]
         
     | 
| 
      
 59 
     | 
    
         
            +
                    elsif sub == "*"    then obj[obj.keys.first]
         
     | 
| 
      
 60 
     | 
    
         
            +
                    else                     return super(key)
         
     | 
| 
       56 
61 
     | 
    
         
             
                    end
         
     | 
| 
       57 
62 
     | 
    
         
             
                  end
         
     | 
| 
       58 
     | 
    
         
            -
                  val
         
     | 
| 
       59 
63 
     | 
    
         
             
                else
         
     | 
| 
       60 
64 
     | 
    
         
             
                  super(key)
         
     | 
| 
       61 
65 
     | 
    
         
             
                end
         
     | 
| 
         @@ -65,55 +69,38 @@ class ConfigHash < Hash 
     | 
|
| 
       65 
69 
     | 
    
         
             
                our = self.class
         
     | 
| 
       66 
70 
     | 
    
         
             
                key = key.to_s
         
     | 
| 
       67 
71 
     | 
    
         
             
                val = our.new(val) if val.instance_of?(Hash)
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
                   
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
                  top = all.inject(self) do |top, tag|
         
     | 
| 
       74 
     | 
    
         
            -
                    if top.key?(tag) && (try = top[tag]).instance_of?(our)
         
     | 
| 
       75 
     | 
    
         
            -
                      top = try
         
     | 
| 
       76 
     | 
    
         
            -
                    else
         
     | 
| 
       77 
     | 
    
         
            -
                      top = top[tag] = our.new
         
     | 
| 
       78 
     | 
    
         
            -
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                if !key?(key) && key =~ SEPARATORS && (ary = key.split SEPARATORS)
         
     | 
| 
      
 74 
     | 
    
         
            +
                  key = ary.pop
         
     | 
| 
      
 75 
     | 
    
         
            +
                  obj = ary.inject(self) do |obj, sub|
         
     | 
| 
      
 76 
     | 
    
         
            +
                    obj.key?(sub) && our === (try = obj[sub]) ? try : (obj[sub] = our.new)
         
     | 
| 
       79 
77 
     | 
    
         
             
                  end
         
     | 
| 
       80 
     | 
    
         
            -
                   
     | 
| 
      
 78 
     | 
    
         
            +
                  obj[key] = val
         
     | 
| 
       81 
79 
     | 
    
         
             
                else
         
     | 
| 
       82 
80 
     | 
    
         
             
                  super(key, val)
         
     | 
| 
       83 
81 
     | 
    
         
             
                end
         
     | 
| 
       84 
82 
     | 
    
         
             
              end
         
     | 
| 
       85 
83 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
               
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                 
     | 
| 
       90 
     | 
    
         
            -
              end
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
              def merge!(other_hash)
         
     | 
| 
       93 
     | 
    
         
            -
                raise ArgumentError unless Hash === other_hash
         
     | 
| 
       94 
     | 
    
         
            -
                other_hash.each do |k, v|
         
     | 
| 
       95 
     | 
    
         
            -
                  if block_given? && key?(k)
         
     | 
| 
       96 
     | 
    
         
            -
                    self[k] = yield(k, self[k], v)
         
     | 
| 
       97 
     | 
    
         
            -
                  else
         
     | 
| 
       98 
     | 
    
         
            -
                    self[k] = v
         
     | 
| 
       99 
     | 
    
         
            -
                  end
         
     | 
| 
       100 
     | 
    
         
            -
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
              def update(hash, nuke=false)
         
     | 
| 
      
 85 
     | 
    
         
            +
                raise ArgumentError unless Hash === hash
         
     | 
| 
      
 86 
     | 
    
         
            +
                clear if nuke
         
     | 
| 
      
 87 
     | 
    
         
            +
                hash.each {|key, val| self[key] = val}
         
     | 
| 
       101 
88 
     | 
    
         
             
                self
         
     | 
| 
       102 
89 
     | 
    
         
             
              end
         
     | 
| 
       103 
90 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
               
     | 
| 
      
 91 
     | 
    
         
            +
              def update!(hash)
         
     | 
| 
      
 92 
     | 
    
         
            +
                update(hash, true)
         
     | 
| 
      
 93 
     | 
    
         
            +
              end
         
     | 
| 
       105 
94 
     | 
    
         | 
| 
       106 
95 
     | 
    
         
             
              def to_hash
         
     | 
| 
       107 
96 
     | 
    
         
             
                Hash[self]
         
     | 
| 
       108 
97 
     | 
    
         
             
              end
         
     | 
| 
       109 
98 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
              def method_missing( 
     | 
| 
       111 
     | 
    
         
            -
                 
     | 
| 
       112 
     | 
    
         
            -
                  self[$`] = args.first
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
                   
     | 
| 
       115 
     | 
    
         
            -
                else
         
     | 
| 
       116 
     | 
    
         
            -
                  super
         
     | 
| 
      
 99 
     | 
    
         
            +
              def method_missing(name, *args, &code)
         
     | 
| 
      
 100 
     | 
    
         
            +
                case
         
     | 
| 
      
 101 
     | 
    
         
            +
                  when name =~ /=$/ then self[$`] = args.first
         
     | 
| 
      
 102 
     | 
    
         
            +
                  when args.empty?  then self[name]
         
     | 
| 
      
 103 
     | 
    
         
            +
                  else super
         
     | 
| 
       117 
104 
     | 
    
         
             
                end
         
     | 
| 
       118 
105 
     | 
    
         
             
              end
         
     | 
| 
       119 
106 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: config-hash
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.0.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Steve Shreeve
         
     | 
| 
       8 
     | 
    
         
            -
            autorequire: 
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2021-04-22 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       13 
13 
     | 
    
         
             
            description: This gem makes it easy to work with configuration data.
         
     | 
| 
       14 
14 
     | 
    
         
             
            email: steve.shreeve@gmail.com
         
     | 
| 
         @@ -26,7 +26,7 @@ homepage: https://github.com/shreeve/config-hash 
     | 
|
| 
       26 
26 
     | 
    
         
             
            licenses:
         
     | 
| 
       27 
27 
     | 
    
         
             
            - MIT
         
     | 
| 
       28 
28 
     | 
    
         
             
            metadata: {}
         
     | 
| 
       29 
     | 
    
         
            -
            post_install_message: 
     | 
| 
      
 29 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
       30 
30 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       31 
31 
     | 
    
         
             
            require_paths:
         
     | 
| 
       32 
32 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -41,9 +41,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       41 
41 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       42 
42 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       43 
43 
     | 
    
         
             
            requirements: []
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
            signing_key: 
         
     | 
| 
      
 44 
     | 
    
         
            +
            rubygems_version: 3.2.16
         
     | 
| 
      
 45 
     | 
    
         
            +
            signing_key:
         
     | 
| 
       47 
46 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       48 
47 
     | 
    
         
             
            summary: A safe, homoiconic, Ruby hash supporting dot notation
         
     | 
| 
       49 
48 
     | 
    
         
             
            test_files: []
         
     |