rconfig 0.3.3 → 0.4.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.
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/ChangeLog +50 -0
- data/Credits +13 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +30 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +0 -0
- data/Rakefile +11 -0
- data/demo/application.conf +3 -0
- data/demo/demo.conf +13 -0
- data/demo/demo.rb +14 -0
- data/demo/demo.xml +13 -0
- data/demo/demo.yml +12 -0
- data/doc/classes/ClassVariables.html +111 -0
- data/doc/classes/ConfigError.html +120 -0
- data/doc/classes/ConfigHash.html +354 -0
- data/doc/classes/Constants.html +226 -0
- data/doc/classes/Hash.html +269 -0
- data/doc/classes/InvalidConfigPathError.html +119 -0
- data/doc/classes/Object.html +220 -0
- data/doc/classes/PropertiesFileParser.html +282 -0
- data/doc/classes/RConfig.html +1745 -0
- data/doc/created.rid +1 -0
- data/doc/files/README_rdoc.html +271 -0
- data/doc/files/lib/rconfig/class_variables_rb.html +107 -0
- data/doc/files/lib/rconfig/config_hash_rb.html +114 -0
- data/doc/files/lib/rconfig/constants_rb.html +101 -0
- data/doc/files/lib/rconfig/core_ext/hash_rb.html +114 -0
- data/doc/files/lib/rconfig/core_ext/object_rb.html +101 -0
- data/doc/files/lib/rconfig/core_ext_rb.html +114 -0
- data/doc/files/lib/rconfig/exceptions_rb.html +110 -0
- data/doc/files/lib/rconfig/properties_file_parser_rb.html +146 -0
- data/doc/files/lib/rconfig/rconfig_rb.html +186 -0
- data/doc/files/lib/rconfig_rb.html +117 -0
- data/doc/fr_class_index.html +35 -0
- data/doc/fr_file_index.html +37 -0
- data/doc/fr_method_index.html +75 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/generators/rconfig/install_generator.rb +13 -0
- data/lib/generators/rconfig/templates/rconfig.rb +82 -0
- data/lib/rconfig.rb +98 -32
- data/lib/rconfig/callbacks.rb +46 -0
- data/lib/rconfig/cascade.rb +56 -0
- data/lib/rconfig/config.rb +78 -0
- data/lib/rconfig/constants.rb +58 -0
- data/lib/rconfig/core_ext/array.rb +3 -0
- data/lib/rconfig/core_ext/hash.rb +56 -57
- data/lib/rconfig/core_ext/nil.rb +5 -0
- data/lib/rconfig/core_ext/string.rb +3 -0
- data/lib/rconfig/core_methods.rb +276 -0
- data/lib/rconfig/exceptions.rb +21 -8
- data/lib/rconfig/load_paths.rb +55 -0
- data/lib/rconfig/logger.rb +86 -0
- data/lib/rconfig/properties_file.rb +138 -0
- data/lib/rconfig/reload.rb +75 -0
- data/lib/rconfig/settings.rb +93 -0
- data/lib/rconfig/utils.rb +175 -0
- data/lib/tasks/gem.rake +14 -0
- data/lib/tasks/rdoc.rake +11 -0
- data/lib/tasks/spec.rake +25 -0
- data/rconfig.gemspec +33 -0
- data/spec/core_ext/object_spec.rb +44 -0
- data/spec/rconfig_spec.rb +7 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +16 -0
- metadata +128 -32
- data/lib/rconfig/config_hash.rb +0 -105
- data/lib/rconfig/core_ext.rb +0 -6
- data/lib/rconfig/properties_file_parser.rb +0 -80
- data/lib/rconfig/rconfig.rb +0 -871
- data/test/rconfig_test.rb +0 -381
data/lib/tasks/gem.rake
ADDED
data/lib/tasks/rdoc.rake
ADDED
data/lib/tasks/spec.rake
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc "Run all specifications"
|
5
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
6
|
+
t.libs << "lib"
|
7
|
+
t.spec_opts = ["--color", "--require", "spec/spec_helper.rb"]
|
8
|
+
end
|
9
|
+
|
10
|
+
namespace :spec do
|
11
|
+
|
12
|
+
desc "Run all specifications verbosely"
|
13
|
+
Spec::Rake::SpecTask.new(:verbose) do |t|
|
14
|
+
t.libs << "lib"
|
15
|
+
t.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Run specific specification verbosely (specify SPEC)"
|
19
|
+
Spec::Rake::SpecTask.new(:select) do |t|
|
20
|
+
t.libs << "lib"
|
21
|
+
t.spec_files = [ENV["SPEC"]]
|
22
|
+
t.spec_opts = ["--color", "--format", "specdoc", "--require", "spec/spec_helper.rb"]
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/rconfig.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
$:.push File.expand_path("../lib", __FILE__)
|
6
|
+
require "rconfig"
|
7
|
+
|
8
|
+
Gem::Specification.new do |s|
|
9
|
+
|
10
|
+
# Metadata
|
11
|
+
s.name = 'rconfig'
|
12
|
+
s.version = RConfig::VERSION
|
13
|
+
s.authors = ['Rahmal Conda']
|
14
|
+
s.email = ['rahmal@gmail.com']
|
15
|
+
s.homepage = 'http://www.rahmalconda.com'
|
16
|
+
s.description = %q{Configuration management library for Ruby applications.}
|
17
|
+
s.summary = %q{The complete solution for Ruby Configuration Management. RConfig is a Ruby library that manages configuration within Ruby applications. It bridges the gap between yaml, xml, and key/value based properties files, by providing a centralized solution to handle application configuration from one location. It provides the simplicity of hash-based access, that Rubyists have come to know and love, supporting your configuration style of choice, while providing many new features, and an elegant API.}
|
18
|
+
s.licenses = ['MIT']
|
19
|
+
|
20
|
+
# Manifest
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
|
26
|
+
# Dependencies
|
27
|
+
s.add_dependency 'activesupport', '~> 3.0'
|
28
|
+
|
29
|
+
s.add_development_dependency 'rspec', '~> 2.3.0'
|
30
|
+
s.add_development_dependency 'bundler', '~> 1.0.0'
|
31
|
+
s.add_development_dependency 'jeweler', '~> 1.6.4'
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
3
|
+
|
4
|
+
describe Object do
|
5
|
+
|
6
|
+
describe "#try" do
|
7
|
+
|
8
|
+
it "should return nil if method doesn't exist" do
|
9
|
+
obj = Object.new
|
10
|
+
lambda {obj.try(:bad_method)}.should_not raise_error
|
11
|
+
obj.try(:bad_method).should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return the value from calling the method it exists" do
|
15
|
+
obj = Object.new
|
16
|
+
lambda {obj.try(:class)}.should_not raise_error
|
17
|
+
obj.try(:class).should_not be_nil
|
18
|
+
obj.try(:class).should equal Object
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#config" do
|
24
|
+
|
25
|
+
it "should return root config instance if no matching config file exists" do
|
26
|
+
class ObjectWithNoConfig; end
|
27
|
+
obj = ObjectWithNoConfig.new
|
28
|
+
lambda {obj.config}.should_not raise_error
|
29
|
+
obj.config.should_not be_nil
|
30
|
+
obj.config.should equal RConfig.instance
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should class-specific config when matching config file exists" do
|
34
|
+
class MyClass; end
|
35
|
+
my_class = MyClass.new
|
36
|
+
lambda {my_class.config}.should_not raise_error
|
37
|
+
my_class.config.should_not be_nil
|
38
|
+
my_class.config.should equal $config.my_class
|
39
|
+
my_class.config.my_class_flag.should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
ROOT_DIR = File.expand_path(File.dirname(__FILE__))
|
2
|
+
CONF_DIR = File.join(ROOT_DIR, '..', 'test', 'config_files')
|
3
|
+
|
4
|
+
STDOUT.puts "ROOT_DIR: #{ROOT_DIR}"
|
5
|
+
STDOUT.puts "CONF_DIR: #{CONF_DIR}"
|
6
|
+
|
7
|
+
# Loads the rconfig library
|
8
|
+
$LOAD_PATH << File.join(ROOT_DIR, '..', 'lib')
|
9
|
+
|
10
|
+
require 'rconfig'
|
11
|
+
|
12
|
+
RConfig.initialize CONF_DIR, nil, true, true
|
13
|
+
|
14
|
+
# Requires supporting files in ./support/ and its subdirectories.
|
15
|
+
#Dir["#{ROOT_DIR}/support/**/*.rb"].each {|f| require f}
|
16
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rconfig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,54 +9,143 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-04-16 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70096588990020 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
|
26
|
-
|
24
|
+
version_requirements: *70096588990020
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70096588989460 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.3.0
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70096588989460
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: bundler
|
38
|
+
requirement: &70096588989000 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.0.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70096588989000
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: jeweler
|
49
|
+
requirement: &70096588988520 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.6.4
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70096588988520
|
58
|
+
description: Configuration management library for Ruby applications.
|
59
|
+
email:
|
60
|
+
- rahmal@gmail.com
|
27
61
|
executables: []
|
28
62
|
extensions: []
|
29
|
-
extra_rdoc_files:
|
30
|
-
- README.rdoc
|
63
|
+
extra_rdoc_files: []
|
31
64
|
files:
|
32
|
-
-
|
65
|
+
- .gitignore
|
66
|
+
- .rspec
|
67
|
+
- .rvmrc
|
68
|
+
- ChangeLog
|
69
|
+
- Credits
|
70
|
+
- Gemfile
|
71
|
+
- Gemfile.lock
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.rdoc
|
74
|
+
- Rakefile
|
75
|
+
- demo/application.conf
|
76
|
+
- demo/demo.conf
|
77
|
+
- demo/demo.rb
|
78
|
+
- demo/demo.xml
|
79
|
+
- demo/demo.yml
|
80
|
+
- doc/classes/ClassVariables.html
|
81
|
+
- doc/classes/ConfigError.html
|
82
|
+
- doc/classes/ConfigHash.html
|
83
|
+
- doc/classes/Constants.html
|
84
|
+
- doc/classes/Hash.html
|
85
|
+
- doc/classes/InvalidConfigPathError.html
|
86
|
+
- doc/classes/Object.html
|
87
|
+
- doc/classes/PropertiesFileParser.html
|
88
|
+
- doc/classes/RConfig.html
|
89
|
+
- doc/created.rid
|
90
|
+
- doc/files/README_rdoc.html
|
91
|
+
- doc/files/lib/rconfig/class_variables_rb.html
|
92
|
+
- doc/files/lib/rconfig/config_hash_rb.html
|
93
|
+
- doc/files/lib/rconfig/constants_rb.html
|
94
|
+
- doc/files/lib/rconfig/core_ext/hash_rb.html
|
95
|
+
- doc/files/lib/rconfig/core_ext/object_rb.html
|
96
|
+
- doc/files/lib/rconfig/core_ext_rb.html
|
97
|
+
- doc/files/lib/rconfig/exceptions_rb.html
|
98
|
+
- doc/files/lib/rconfig/properties_file_parser_rb.html
|
99
|
+
- doc/files/lib/rconfig/rconfig_rb.html
|
100
|
+
- doc/files/lib/rconfig_rb.html
|
101
|
+
- doc/fr_class_index.html
|
102
|
+
- doc/fr_file_index.html
|
103
|
+
- doc/fr_method_index.html
|
104
|
+
- doc/index.html
|
105
|
+
- doc/rdoc-style.css
|
106
|
+
- lib/generators/rconfig/install_generator.rb
|
107
|
+
- lib/generators/rconfig/templates/rconfig.rb
|
108
|
+
- lib/rconfig.rb
|
109
|
+
- lib/rconfig/callbacks.rb
|
110
|
+
- lib/rconfig/cascade.rb
|
111
|
+
- lib/rconfig/config.rb
|
112
|
+
- lib/rconfig/constants.rb
|
113
|
+
- lib/rconfig/core_ext/array.rb
|
33
114
|
- lib/rconfig/core_ext/hash.rb
|
34
|
-
- lib/rconfig/core_ext.rb
|
115
|
+
- lib/rconfig/core_ext/nil.rb
|
116
|
+
- lib/rconfig/core_ext/string.rb
|
117
|
+
- lib/rconfig/core_methods.rb
|
35
118
|
- lib/rconfig/exceptions.rb
|
36
|
-
- lib/rconfig/
|
37
|
-
- lib/rconfig/
|
38
|
-
- lib/rconfig.rb
|
39
|
-
-
|
40
|
-
-
|
119
|
+
- lib/rconfig/load_paths.rb
|
120
|
+
- lib/rconfig/logger.rb
|
121
|
+
- lib/rconfig/properties_file.rb
|
122
|
+
- lib/rconfig/reload.rb
|
123
|
+
- lib/rconfig/settings.rb
|
124
|
+
- lib/rconfig/utils.rb
|
125
|
+
- lib/tasks/gem.rake
|
126
|
+
- lib/tasks/rdoc.rake
|
127
|
+
- lib/tasks/spec.rake
|
128
|
+
- rconfig.gemspec
|
129
|
+
- spec/core_ext/object_spec.rb
|
130
|
+
- spec/rconfig_spec.rb
|
131
|
+
- spec/spec.opts
|
132
|
+
- spec/spec_helper.rb
|
41
133
|
homepage: http://www.rahmalconda.com
|
42
|
-
licenses:
|
134
|
+
licenses:
|
135
|
+
- MIT
|
43
136
|
post_install_message:
|
44
|
-
rdoc_options:
|
45
|
-
- --line-numbers
|
46
|
-
- --inline-source
|
47
|
-
- --title
|
48
|
-
- RConfig
|
49
|
-
- --main
|
50
|
-
- README.rdoc
|
137
|
+
rdoc_options: []
|
51
138
|
require_paths:
|
52
139
|
- lib
|
53
|
-
- tasks
|
54
140
|
required_ruby_version: !ruby/object:Gem::Requirement
|
55
141
|
none: false
|
56
142
|
requirements:
|
57
143
|
- - ! '>='
|
58
144
|
- !ruby/object:Gem::Version
|
59
145
|
version: '0'
|
146
|
+
segments:
|
147
|
+
- 0
|
148
|
+
hash: -4346478752822958469
|
60
149
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
150
|
none: false
|
62
151
|
requirements:
|
@@ -64,12 +153,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
153
|
- !ruby/object:Gem::Version
|
65
154
|
version: '0'
|
66
155
|
requirements: []
|
67
|
-
rubyforge_project:
|
68
|
-
rubygems_version: 1.8.
|
156
|
+
rubyforge_project:
|
157
|
+
rubygems_version: 1.8.15
|
69
158
|
signing_key:
|
70
159
|
specification_version: 3
|
71
|
-
summary:
|
72
|
-
|
73
|
-
|
160
|
+
summary: The complete solution for Ruby Configuration Management. RConfig is a Ruby
|
161
|
+
library that manages configuration within Ruby applications. It bridges the gap
|
162
|
+
between yaml, xml, and key/value based properties files, by providing a centralized
|
163
|
+
solution to handle application configuration from one location. It provides the
|
164
|
+
simplicity of hash-based access, that Rubyists have come to know and love, supporting
|
165
|
+
your configuration style of choice, while providing many new features, and an elegant
|
166
|
+
API.
|
74
167
|
test_files:
|
75
|
-
-
|
168
|
+
- spec/core_ext/object_spec.rb
|
169
|
+
- spec/rconfig_spec.rb
|
170
|
+
- spec/spec.opts
|
171
|
+
- spec/spec_helper.rb
|
data/lib/rconfig/config_hash.rb
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
#++
|
2
|
-
# Copyright (c) 2009 Rahmal Conda <rahmal@gmail.com>
|
3
|
-
#
|
4
|
-
# ConfigHash is a special class, derived from HashWithIndifferentAccess.
|
5
|
-
# It was specifically created for handling config data or creating mock
|
6
|
-
# objects from yaml files. It provides a dotted notation for accessing
|
7
|
-
# embedded hash values, similar to the way one might traverse a object tree.
|
8
|
-
#--
|
9
|
-
class ConfigHash < HashWithIndifferentAccess
|
10
|
-
|
11
|
-
# HashWithIndifferentAccess#dup always returns HashWithIndifferentAccess!
|
12
|
-
def dup
|
13
|
-
self.class.new(self)
|
14
|
-
end
|
15
|
-
|
16
|
-
##
|
17
|
-
# Dotted notation can be used with arguments (useful for creating mock objects)
|
18
|
-
# in the YAML file the method name is a key, argument(s) form a nested key,
|
19
|
-
# so that the correct value is retrieved and returned.
|
20
|
-
#
|
21
|
-
# For example loading to variable foo a yaml file that looks like:
|
22
|
-
# customer:
|
23
|
-
# id: 12345678
|
24
|
-
# verified:
|
25
|
-
# phone: verified
|
26
|
-
# :address: info_not_available
|
27
|
-
# ? [name, employer]
|
28
|
-
# : not_verified
|
29
|
-
#
|
30
|
-
# Allows the following calls:
|
31
|
-
# foo.customer.id => 12345678
|
32
|
-
# foo.customer.verified.phone => verified
|
33
|
-
# foo.customer.verified("phone") => verified
|
34
|
-
# foo.customer.verified(:address) => info_not_available
|
35
|
-
# foo.customer.verified("name", "employer") => not_verified
|
36
|
-
#
|
37
|
-
# Note that :address is specified as a symbol, where phone is just a string.
|
38
|
-
# Depending on what kind of parameter the method being mocked out is going
|
39
|
-
# to be called with, define in the YAML file either a string or a symbol.
|
40
|
-
# This also works inside the composite array keys.
|
41
|
-
def method_missing(method, *args)
|
42
|
-
method = method.to_s
|
43
|
-
# STDERR.puts "CHF#method_missing(#{method.inspect}, #{args.inspect}) on #{self.inspect}:#{self.class}" if method == 'dup'
|
44
|
-
value = self[method]
|
45
|
-
case args.size
|
46
|
-
when 0
|
47
|
-
# e.g.: RConfig.application.method
|
48
|
-
;
|
49
|
-
when 1
|
50
|
-
# e.g.: RConfig.application.method(one_arg)
|
51
|
-
value = value.send(args[0])
|
52
|
-
else
|
53
|
-
# e.g.: RConfig.application.method(arg_one, args_two, ...)
|
54
|
-
value = value[args]
|
55
|
-
end
|
56
|
-
# value = convert_value(value)
|
57
|
-
value
|
58
|
-
end
|
59
|
-
|
60
|
-
##
|
61
|
-
# Why the &*#^@*^&$ isn't HashWithIndifferentAccess actually doing this?
|
62
|
-
def [](key)
|
63
|
-
key = key.to_s if key.kind_of?(Symbol)
|
64
|
-
super(key)
|
65
|
-
end
|
66
|
-
|
67
|
-
# HashWithIndifferentAccess#default is broken!
|
68
|
-
define_method(:default_Hash, Hash.instance_method(:default))
|
69
|
-
|
70
|
-
##
|
71
|
-
# Allow hash.default => hash['default']
|
72
|
-
# without breaking Hash's usage of default(key)
|
73
|
-
@@no_key = [ :no_key ] # magically unique value.
|
74
|
-
def default(key = @@no_key)
|
75
|
-
key = key.to_s if key.is_a?(Symbol)
|
76
|
-
key == @@no_key ? self['default'] : default_Hash(key == @@no_key ? nil : key)
|
77
|
-
end
|
78
|
-
|
79
|
-
##
|
80
|
-
# HashWithIndifferentAccess#update is broken!
|
81
|
-
# Hash#update returns self,
|
82
|
-
# BUT,
|
83
|
-
# HashWithIndifferentAccess#update does not!
|
84
|
-
#
|
85
|
-
# { :a => 1 }.update({ :b => 2, :c => 3 })
|
86
|
-
# => { :a => 1, :b => 2, :c => 3 }
|
87
|
-
#
|
88
|
-
# HashWithIndifferentAccess.new({ :a => 1 }).update({ :b => 2, :c => 3 })
|
89
|
-
# => { :b => 2, :c => 3 } # WTF?
|
90
|
-
#
|
91
|
-
# Subclasses should *never* override methods and break their protocols!!!!
|
92
|
-
def update(hash)
|
93
|
-
super(hash)
|
94
|
-
self
|
95
|
-
end
|
96
|
-
|
97
|
-
##
|
98
|
-
# Override WithIndifferentAccess#convert_value
|
99
|
-
# return instances of this class for Hash values.
|
100
|
-
def convert_value(value)
|
101
|
-
# STDERR.puts "convert_value(#{value.inspect}:#{value.class})"
|
102
|
-
value.class == Hash ? self.class.new(value).freeze : value
|
103
|
-
end
|
104
|
-
|
105
|
-
end # class ConfigHash
|