hashie 4.0.0 → 4.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 +4 -4
- data/CHANGELOG.md +213 -187
- data/CONTRIBUTING.md +13 -6
- data/README.md +33 -9
- data/UPGRADING.md +5 -5
- data/hashie.gemspec +11 -6
- data/lib/hashie.rb +1 -0
- data/lib/hashie/extensions/dash/property_translation.rb +1 -1
- data/lib/hashie/extensions/deep_merge.rb +18 -1
- data/lib/hashie/extensions/mash/permissive_respond_to.rb +61 -0
- data/lib/hashie/extensions/parsers/yaml_erb_parser.rb +19 -2
- data/lib/hashie/extensions/ruby_version_check.rb +5 -1
- data/lib/hashie/mash.rb +31 -26
- data/lib/hashie/utils.rb +28 -0
- data/lib/hashie/version.rb +1 -1
- metadata +16 -131
- data/spec/hashie/array_spec.rb +0 -29
- data/spec/hashie/clash_spec.rb +0 -70
- data/spec/hashie/dash_spec.rb +0 -608
- data/spec/hashie/extensions/autoload_spec.rb +0 -24
- data/spec/hashie/extensions/coercion_spec.rb +0 -648
- data/spec/hashie/extensions/dash/coercion_spec.rb +0 -13
- data/spec/hashie/extensions/dash/indifferent_access_spec.rb +0 -84
- data/spec/hashie/extensions/deep_fetch_spec.rb +0 -97
- data/spec/hashie/extensions/deep_find_spec.rb +0 -144
- data/spec/hashie/extensions/deep_locate_spec.rb +0 -138
- data/spec/hashie/extensions/deep_merge_spec.rb +0 -74
- data/spec/hashie/extensions/ignore_undeclared_spec.rb +0 -48
- data/spec/hashie/extensions/indifferent_access_spec.rb +0 -295
- data/spec/hashie/extensions/indifferent_access_with_rails_hwia_spec.rb +0 -208
- data/spec/hashie/extensions/key_conversion_spec.rb +0 -12
- data/spec/hashie/extensions/mash/define_accessors_spec.rb +0 -90
- data/spec/hashie/extensions/mash/keep_original_keys_spec.rb +0 -46
- data/spec/hashie/extensions/mash/safe_assignment_spec.rb +0 -50
- data/spec/hashie/extensions/mash/symbolize_keys_spec.rb +0 -39
- data/spec/hashie/extensions/merge_initializer_spec.rb +0 -23
- data/spec/hashie/extensions/method_access_spec.rb +0 -233
- data/spec/hashie/extensions/strict_key_access_spec.rb +0 -109
- data/spec/hashie/extensions/stringify_keys_spec.rb +0 -124
- data/spec/hashie/extensions/symbolize_keys_spec.rb +0 -131
- data/spec/hashie/hash_spec.rb +0 -123
- data/spec/hashie/mash_spec.rb +0 -1077
- data/spec/hashie/parsers/yaml_erb_parser_spec.rb +0 -46
- data/spec/hashie/rash_spec.rb +0 -83
- data/spec/hashie/trash_spec.rb +0 -334
- data/spec/hashie/utils_spec.rb +0 -25
- data/spec/hashie/version_spec.rb +0 -7
- data/spec/hashie_spec.rb +0 -13
- data/spec/integration/elasticsearch/integration_spec.rb +0 -41
- data/spec/integration/omniauth-oauth2/app.rb +0 -52
- data/spec/integration/omniauth-oauth2/integration_spec.rb +0 -26
- data/spec/integration/omniauth-oauth2/some_site.rb +0 -38
- data/spec/integration/omniauth/app.rb +0 -11
- data/spec/integration/omniauth/integration_spec.rb +0 -38
- data/spec/integration/rails-without-dependency/integration_spec.rb +0 -15
- data/spec/integration/rails/app.rb +0 -40
- data/spec/integration/rails/integration_spec.rb +0 -47
- data/spec/spec_helper.rb +0 -23
- data/spec/support/integration_specs.rb +0 -36
- data/spec/support/logger.rb +0 -24
- data/spec/support/module_context.rb +0 -11
- data/spec/support/ruby_version_check.rb +0 -6
data/CONTRIBUTING.md
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
Contributing to Hashie
|
2
2
|
======================
|
3
3
|
|
4
|
-
Hashie is work of [many contributors](https://github.com/
|
4
|
+
Hashie is work of [many contributors](https://github.com/hashie/hashie/graphs/contributors). You're encouraged to submit [pull requests](https://github.com/hashie/hashie/pulls), [propose features and discuss issues](https://github.com/hashie/hashie/issues).
|
5
5
|
|
6
6
|
#### Fork the Project
|
7
7
|
|
8
|
-
Fork the [project on Github](https://github.com/
|
8
|
+
Fork the [project on Github](https://github.com/hashie/hashie) and check out your copy.
|
9
9
|
|
10
10
|
```
|
11
11
|
git clone https://github.com/contributor/hashie.git
|
12
12
|
cd hashie
|
13
|
-
git remote add upstream https://github.com/
|
13
|
+
git remote add upstream https://github.com/hashie/hashie.git
|
14
14
|
```
|
15
15
|
|
16
16
|
#### Create a Topic Branch
|
@@ -23,12 +23,19 @@ git pull upstream master
|
|
23
23
|
git checkout -b my-feature-branch
|
24
24
|
```
|
25
25
|
|
26
|
-
####
|
26
|
+
#### Install dependencies
|
27
|
+
|
28
|
+
You can use the setup script to install dependencies for the gem and its integration tests.
|
29
|
+
|
30
|
+
```
|
31
|
+
bin/setup
|
32
|
+
```
|
33
|
+
|
34
|
+
#### Test
|
27
35
|
|
28
36
|
Ensure that you can build the project and run tests.
|
29
37
|
|
30
38
|
```
|
31
|
-
bundle install
|
32
39
|
bundle exec rake
|
33
40
|
```
|
34
41
|
|
@@ -105,7 +112,7 @@ git push origin my-feature-branch -f
|
|
105
112
|
Update the [CHANGELOG](CHANGELOG.md) with the pull request number. A typical entry looks as follows.
|
106
113
|
|
107
114
|
```
|
108
|
-
* [#123](https://github.com/
|
115
|
+
* [#123](https://github.com/hashie/hashie/pull/123): Reticulated splines - [@contributor](https://github.com/contributor).
|
109
116
|
```
|
110
117
|
|
111
118
|
Amend your previous commit and force push the changes.
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# Hashie
|
2
2
|
|
3
|
-
[](https://gitter.im/hashie/hashie?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
4
|
[](http://badge.fury.io/rb/hashie)
|
5
|
-
[](https://codeclimate.com/github/
|
7
|
-
[](https://codeclimate.com/github/
|
5
|
+
[](https://travis-ci.org/hashie/hashie)
|
6
|
+
[](https://codeclimate.com/github/hashie/hashie/test_coverage)
|
7
|
+
[](https://codeclimate.com/github/hashie/hashie/maintainability)
|
8
8
|
|
9
9
|
Hashie is a growing collection of tools that extend Hashes and make them more useful.
|
10
10
|
|
@@ -16,9 +16,9 @@ Hashie is available as a RubyGem:
|
|
16
16
|
$ gem install hashie
|
17
17
|
```
|
18
18
|
|
19
|
-
##
|
19
|
+
## Stable Release
|
20
20
|
|
21
|
-
You're reading the documentation for the stable release of Hashie, 4.
|
21
|
+
You're reading the documentation for the stable release of Hashie, 4.1.0.(https://github.com/hashie/hashie/blob/v4.1.0/README.md).
|
22
22
|
|
23
23
|
## Hash Extensions
|
24
24
|
|
@@ -658,6 +658,30 @@ mash['string_key'] #=> 'string'
|
|
658
658
|
mash[:string_key] #=> 'string'
|
659
659
|
```
|
660
660
|
|
661
|
+
### Mash Extension: PermissiveRespondTo
|
662
|
+
|
663
|
+
By default, Mash only states that it responds to built-in methods, affixed methods (e.g. setters, underbangs, etc.), and keys that it currently contains. That means it won't state that it responds to a getter for an unset key, as in the following example:
|
664
|
+
|
665
|
+
```ruby
|
666
|
+
mash = Hashie::Mash.new(a: 1)
|
667
|
+
mash.respond_to? :b #=> false
|
668
|
+
```
|
669
|
+
|
670
|
+
This means that by default Mash is not a perfect match for use with a SimpleDelegator since the delegator will not forward messages for unset keys to the Mash even though it can handle them.
|
671
|
+
|
672
|
+
In order to have a SimpleDelegator-compatible Mash, you can use the `PermissiveRespondTo` extension to make Mash respond to anything.
|
673
|
+
|
674
|
+
```ruby
|
675
|
+
class PermissiveMash < Hashie::Mash
|
676
|
+
include Hashie::Extensions::Mash::PermissiveRespondTo
|
677
|
+
end
|
678
|
+
|
679
|
+
mash = PermissiveMash.new(a: 1)
|
680
|
+
mash.respond_to? :b #=> true
|
681
|
+
```
|
682
|
+
|
683
|
+
This comes at the cost of approximately 20% performance for initialization and setters and 19KB of permanent memory growth for each such class that you create.
|
684
|
+
|
661
685
|
### Mash Extension: SafeAssignment
|
662
686
|
|
663
687
|
This extension can be mixed into a Mash to guard the attempted overwriting of methods by property setters. When mixed in, the Mash will raise an `ArgumentError` if you attempt to write a property with the same name as an existing method.
|
@@ -873,7 +897,7 @@ class DataModelHash < Hashie::Dash
|
|
873
897
|
end
|
874
898
|
|
875
899
|
model = DataModelHash.new(id: '123', created: '2014-04-25 22:35:28')
|
876
|
-
model.id.class #=> Fixnum
|
900
|
+
model.id.class #=> Integer (Fixnum if you are using Ruby 2.3 or lower)
|
877
901
|
model.created_at.class #=> Time
|
878
902
|
```
|
879
903
|
|
@@ -942,7 +966,7 @@ this will produce the following
|
|
942
966
|
|
943
967
|
```ruby
|
944
968
|
result = Result.new(id: '123', creation_date: '2012-03-30 17:23:28')
|
945
|
-
result.id.class # => Fixnum
|
969
|
+
result.id.class # => Integer (Fixnum if you are using Ruby 2.3 or lower)
|
946
970
|
result.created_at.class # => Time
|
947
971
|
```
|
948
972
|
|
@@ -1009,6 +1033,6 @@ See [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
1009
1033
|
|
1010
1034
|
## Copyright
|
1011
1035
|
|
1012
|
-
Copyright (c) 2009-2014 Intridea, Inc. (http://intridea.com/) and [contributors](https://github.com/
|
1036
|
+
Copyright (c) 2009-2014 Intridea, Inc. (http://intridea.com/) and [contributors](https://github.com/hashie/hashie/graphs/contributors).
|
1013
1037
|
|
1014
1038
|
MIT License. See [LICENSE](LICENSE) for details.
|
data/UPGRADING.md
CHANGED
@@ -143,7 +143,7 @@ h.abb? # => false
|
|
143
143
|
|
144
144
|
#### Possible coercion changes
|
145
145
|
|
146
|
-
The improvements made to coercions in version 3.2.1 [issue #200](https://github.com/
|
146
|
+
The improvements made to coercions in version 3.2.1 [issue #200](https://github.com/hashie/hashie/pull/200) do not break the documented API, but are significant enough that changes may effect undocumented side-effects. Applications that depended on those side-effects will need to be updated.
|
147
147
|
|
148
148
|
**Change**: Type coercion no longer creates new objects if the input matches the target type. Previously coerced properties always resulted in the creation of a new object, even when it wasn't necessary. This had the effect of a `dup` or `clone` on coerced properties but not uncoerced ones.
|
149
149
|
|
@@ -159,7 +159,7 @@ Applications that were attempting to rescuing the internal errors should be upda
|
|
159
159
|
|
160
160
|
#### Compatibility with Rails 4 Strong Parameters
|
161
161
|
|
162
|
-
Version 2.1 introduced support to prevent default Rails 4 mass-assignment protection behavior. This was [issue #89](https://github.com/
|
162
|
+
Version 2.1 introduced support to prevent default Rails 4 mass-assignment protection behavior. This was [issue #89](https://github.com/hashie/hashie/issues/89), resolved in [#104](https://github.com/hashie/hashie/pull/104). In version 2.2 this behavior has been removed in [#147](https://github.com/hashie/hashie/pull/147) in favor of a mixin and finally extracted into a separate gem in Hashie 3.0.
|
163
163
|
|
164
164
|
To enable 2.1 compatible behavior with Rails 4, use the [hashie_rails](http://rubygems.org/gems/hashie_rails) gem.
|
165
165
|
|
@@ -167,7 +167,7 @@ To enable 2.1 compatible behavior with Rails 4, use the [hashie_rails](http://ru
|
|
167
167
|
gem 'hashie_rails'
|
168
168
|
```
|
169
169
|
|
170
|
-
See [#154](https://github.com/
|
170
|
+
See [#154](https://github.com/hashie/hashie/pull/154) and [Mash and Rails 4 Strong Parameters](README.md#mash-and-rails-4-strong-parameters) for more details.
|
171
171
|
|
172
172
|
#### Key Conversions in Hashie::Dash and Hashie::Trash
|
173
173
|
|
@@ -195,7 +195,7 @@ p.inspect # => { 'name' => 'dB.' }
|
|
195
195
|
p.to_hash # => { 'name' => 'dB.' }
|
196
196
|
```
|
197
197
|
|
198
|
-
It was not possible to achieve the behavior of preserving keys, as described in [issue #151](https://github.com/
|
198
|
+
It was not possible to achieve the behavior of preserving keys, as described in [issue #151](https://github.com/hashie/hashie/issues/151).
|
199
199
|
|
200
200
|
Version 2.2 does not perform this conversion by default.
|
201
201
|
|
@@ -242,4 +242,4 @@ instance.to_hash # => { :first => 'First', "last" => 'Last' }
|
|
242
242
|
|
243
243
|
The behavior with `symbolize_keys` and `stringify_keys` is unchanged.
|
244
244
|
|
245
|
-
See [#152](https://github.com/
|
245
|
+
See [#152](https://github.com/hashie/hashie/pull/152) for more information.
|
data/hashie.gemspec
CHANGED
@@ -7,17 +7,22 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.email = ['michael@intridea.com', 'jollyjerry@gmail.com']
|
8
8
|
gem.description = 'Hashie is a collection of classes and mixins that make hashes more powerful.'
|
9
9
|
gem.summary = 'Your friendly neighborhood hash library.'
|
10
|
-
gem.homepage = 'https://github.com/
|
10
|
+
gem.homepage = 'https://github.com/hashie/hashie'
|
11
11
|
gem.license = 'MIT'
|
12
12
|
|
13
13
|
gem.require_paths = ['lib']
|
14
14
|
gem.files = %w[.yardopts CHANGELOG.md CONTRIBUTING.md LICENSE README.md UPGRADING.md]
|
15
15
|
gem.files += %w[Rakefile hashie.gemspec]
|
16
16
|
gem.files += Dir['lib/**/*.rb']
|
17
|
-
gem.files += Dir['spec/**/*.rb']
|
18
|
-
gem.test_files = Dir['spec/**/*.rb']
|
19
17
|
|
20
|
-
gem.
|
21
|
-
|
22
|
-
|
18
|
+
if gem.respond_to?(:metadata)
|
19
|
+
gem.metadata = {
|
20
|
+
'bug_tracker_uri' => 'https://github.com/hashie/hashie/issues',
|
21
|
+
'changelog_uri' => 'https://github.com/hashie/hashie/blob/master/CHANGELOG.md',
|
22
|
+
'documentation_uri' => 'https://www.rubydoc.info/gems/hashie',
|
23
|
+
'source_code_uri' => 'https://github.com/hashie/hashie'
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
gem.add_development_dependency 'bundler'
|
23
28
|
end
|
data/lib/hashie.rb
CHANGED
@@ -45,6 +45,7 @@ module Hashie
|
|
45
45
|
|
46
46
|
module Mash
|
47
47
|
autoload :KeepOriginalKeys, 'hashie/extensions/mash/keep_original_keys'
|
48
|
+
autoload :PermissiveRespondTo, 'hashie/extensions/mash/permissive_respond_to'
|
48
49
|
autoload :SafeAssignment, 'hashie/extensions/mash/safe_assignment'
|
49
50
|
autoload :SymbolizeKeys, 'hashie/extensions/mash/symbolize_keys'
|
50
51
|
autoload :DefineAccessors, 'hashie/extensions/mash/define_accessors'
|
@@ -35,7 +35,7 @@ module Hashie
|
|
35
35
|
# end
|
36
36
|
#
|
37
37
|
# model = DataModelHash.new(id: '123', created: '2014-04-25 22:35:28')
|
38
|
-
# model.id.class #=> Fixnum
|
38
|
+
# model.id.class #=> Integer (Fixnum if you are using Ruby 2.3 or lower)
|
39
39
|
# model.created_at.class #=> Time
|
40
40
|
module PropertyTranslation
|
41
41
|
def self.included(base)
|
@@ -3,7 +3,7 @@ module Hashie
|
|
3
3
|
module DeepMerge
|
4
4
|
# Returns a new hash with +self+ and +other_hash+ merged recursively.
|
5
5
|
def deep_merge(other_hash, &block)
|
6
|
-
copy =
|
6
|
+
copy = _deep_dup(self)
|
7
7
|
copy.extend(Hashie::Extensions::DeepMerge) unless copy.respond_to?(:deep_merge!)
|
8
8
|
copy.deep_merge!(other_hash, &block)
|
9
9
|
end
|
@@ -18,11 +18,28 @@ module Hashie
|
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
+
def _deep_dup(hash)
|
22
|
+
copy = hash.dup
|
23
|
+
|
24
|
+
copy.each do |key, value|
|
25
|
+
copy[key] =
|
26
|
+
if value.is_a?(::Hash)
|
27
|
+
_deep_dup(value)
|
28
|
+
else
|
29
|
+
Hashie::Utils.safe_dup(value)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
copy
|
34
|
+
end
|
35
|
+
|
21
36
|
def _recursive_merge(hash, other_hash, &block)
|
22
37
|
other_hash.each do |k, v|
|
23
38
|
hash[k] =
|
24
39
|
if hash.key?(k) && hash[k].is_a?(::Hash) && v.is_a?(::Hash)
|
25
40
|
_recursive_merge(hash[k], v, &block)
|
41
|
+
elsif v.is_a?(::Hash)
|
42
|
+
_recursive_merge({}, v, &block)
|
26
43
|
elsif hash.key?(k) && block_given?
|
27
44
|
yield(k, hash[k], v)
|
28
45
|
else
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Hashie
|
2
|
+
module Extensions
|
3
|
+
module Mash
|
4
|
+
# Allow a Mash to properly respond to everything
|
5
|
+
#
|
6
|
+
# By default, Mashes only say they respond to methods for keys that exist
|
7
|
+
# in their key set or any of the affix methods (e.g. setter, underbang,
|
8
|
+
# etc.). This causes issues when you try to use them within a
|
9
|
+
# SimpleDelegator or bind to a method for a key that is unset.
|
10
|
+
#
|
11
|
+
# This extension allows a Mash to properly respond to `respond_to?` and
|
12
|
+
# `method` for keys that have not yet been set. This enables full
|
13
|
+
# compatibility with SimpleDelegator and thunk-oriented programming.
|
14
|
+
#
|
15
|
+
# There is a trade-off with this extension: it will run slower than a
|
16
|
+
# regular Mash; insertions and initializations with keys run approximately
|
17
|
+
# 20% slower and cost approximately 19KB of memory per class that you
|
18
|
+
# make permissive.
|
19
|
+
#
|
20
|
+
# @api public
|
21
|
+
# @example Make a new, permissively responding Mash subclass
|
22
|
+
# class PermissiveMash < Hashie::Mash
|
23
|
+
# include Hashie::Extensions::Mash::PermissiveRespondTo
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# mash = PermissiveMash.new(a: 1)
|
27
|
+
# mash.respond_to? :b #=> true
|
28
|
+
module PermissiveRespondTo
|
29
|
+
# The Ruby hook for behavior when including the module
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
# @private
|
33
|
+
# @return void
|
34
|
+
def self.included(base)
|
35
|
+
base.instance_variable_set :@_method_cache, base.instance_methods
|
36
|
+
base.define_singleton_method(:method_cache) { @_method_cache }
|
37
|
+
end
|
38
|
+
|
39
|
+
# The Ruby hook for determining what messages a class might respond to
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
# @private
|
43
|
+
def respond_to_missing?(_method_name, _include_private = false)
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
# Override the Mash logging behavior to account for permissiveness
|
50
|
+
#
|
51
|
+
# @api private
|
52
|
+
# @private
|
53
|
+
def log_collision?(method_key)
|
54
|
+
self.class.method_cache.include?(method_key) &&
|
55
|
+
!self.class.disable_warnings?(method_key) &&
|
56
|
+
!(regular_key?(method_key) || regular_key?(method_key.to_s))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -18,13 +18,30 @@ module Hashie
|
|
18
18
|
permitted_classes = @options.fetch(:permitted_classes) { [] }
|
19
19
|
permitted_symbols = @options.fetch(:permitted_symbols) { [] }
|
20
20
|
aliases = @options.fetch(:aliases) { true }
|
21
|
-
|
22
|
-
|
21
|
+
|
22
|
+
yaml_safe_load(template, permitted_classes, permitted_symbols, aliases)
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.perform(file_path, options = {})
|
26
26
|
new(file_path, options).perform
|
27
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0') # Ruby 2.6+
|
32
|
+
def yaml_safe_load(template, permitted_classes, permitted_symbols, aliases)
|
33
|
+
YAML.safe_load(
|
34
|
+
template.result,
|
35
|
+
permitted_classes: permitted_classes,
|
36
|
+
permitted_symbols: permitted_symbols,
|
37
|
+
aliases: aliases
|
38
|
+
)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
def yaml_safe_load(template, permitted_classes, permitted_symbols, aliases)
|
42
|
+
YAML.safe_load(template.result, permitted_classes, permitted_symbols, aliases)
|
43
|
+
end
|
44
|
+
end
|
28
45
|
end
|
29
46
|
end
|
30
47
|
end
|
@@ -9,7 +9,11 @@ module Hashie
|
|
9
9
|
|
10
10
|
module ClassMethods
|
11
11
|
def with_minimum_ruby(version)
|
12
|
-
yield if
|
12
|
+
yield if with_minimum_ruby?(version)
|
13
|
+
end
|
14
|
+
|
15
|
+
def with_minimum_ruby?(version)
|
16
|
+
RubyVersion.new(RUBY_VERSION) >= RubyVersion.new(version)
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
data/lib/hashie/mash.rb
CHANGED
@@ -16,7 +16,8 @@ module Hashie
|
|
16
16
|
#
|
17
17
|
# * No punctuation: Returns the value of the hash for that key, or nil if none exists.
|
18
18
|
# * Assignment (<tt>=</tt>): Sets the attribute of the given method name.
|
19
|
-
# *
|
19
|
+
# * Truthiness (<tt>?</tt>): Returns true or false depending on the truthiness of
|
20
|
+
# the attribute, or false if the key is not set.
|
20
21
|
# * Bang (<tt>!</tt>): Forces the existence of this key, used for deep Mashes. Think of it
|
21
22
|
# as "touch" for mashes.
|
22
23
|
# * Under Bang (<tt>_</tt>): Like Bang, but returns a new Mash rather than creating a key.
|
@@ -73,8 +74,9 @@ module Hashie
|
|
73
74
|
return @_mashes[path] if @_mashes.key?(path)
|
74
75
|
raise ArgumentError, "The following file doesn't exist: #{path}" unless File.file?(path)
|
75
76
|
|
76
|
-
|
77
|
-
|
77
|
+
options = options.dup
|
78
|
+
parser = options.delete(:parser) { Hashie::Extensions::Parsers::YamlErbParser }
|
79
|
+
@_mashes[path] = new(parser.perform(path, options)).freeze
|
78
80
|
end
|
79
81
|
|
80
82
|
def to_module(mash_method_name = :settings)
|
@@ -172,12 +174,6 @@ module Hashie
|
|
172
174
|
super(*keys.map { |key| convert_key(key) })
|
173
175
|
end
|
174
176
|
|
175
|
-
# Returns a new instance of the class it was called on, with nil values
|
176
|
-
# removed.
|
177
|
-
def compact
|
178
|
-
self.class.new(super)
|
179
|
-
end
|
180
|
-
|
181
177
|
# Returns a new instance of the class it was called on, using its keys as
|
182
178
|
# values, and its values as keys. The new values and keys will always be
|
183
179
|
# strings.
|
@@ -211,20 +207,7 @@ module Hashie
|
|
211
207
|
alias include? key?
|
212
208
|
alias member? key?
|
213
209
|
|
214
|
-
|
215
|
-
# current mash.
|
216
|
-
def deep_merge(other_hash, &blk)
|
217
|
-
dup.deep_update(other_hash, &blk)
|
218
|
-
end
|
219
|
-
|
220
|
-
# Recursively merges this mash with the passed
|
221
|
-
# in hash, merging each hash in the hierarchy.
|
222
|
-
def deep_update(other_hash, &blk)
|
223
|
-
_deep_update(other_hash, &blk)
|
224
|
-
self
|
225
|
-
end
|
226
|
-
|
227
|
-
with_minimum_ruby('2.6.0') do
|
210
|
+
if with_minimum_ruby?('2.6.0')
|
228
211
|
# Performs a deep_update on a duplicate of the
|
229
212
|
# current mash.
|
230
213
|
def deep_merge(*other_hashes, &blk)
|
@@ -239,6 +222,19 @@ module Hashie
|
|
239
222
|
end
|
240
223
|
self
|
241
224
|
end
|
225
|
+
else
|
226
|
+
# Performs a deep_update on a duplicate of the
|
227
|
+
# current mash.
|
228
|
+
def deep_merge(other_hash, &blk)
|
229
|
+
dup.deep_update(other_hash, &blk)
|
230
|
+
end
|
231
|
+
|
232
|
+
# Recursively merges this mash with the passed
|
233
|
+
# in hash, merging each hash in the hierarchy.
|
234
|
+
def deep_update(other_hash, &blk)
|
235
|
+
_deep_update(other_hash, &blk)
|
236
|
+
self
|
237
|
+
end
|
242
238
|
end
|
243
239
|
|
244
240
|
# Alias these lexically so they get the correctly defined
|
@@ -339,6 +335,12 @@ module Hashie
|
|
339
335
|
def transform_values(&blk)
|
340
336
|
self.class.new(super(&blk))
|
341
337
|
end
|
338
|
+
|
339
|
+
# Returns a new instance of the class it was called on, with nil values
|
340
|
+
# removed.
|
341
|
+
def compact
|
342
|
+
self.class.new(super)
|
343
|
+
end
|
342
344
|
end
|
343
345
|
|
344
346
|
with_minimum_ruby('2.5.0') do
|
@@ -381,8 +383,6 @@ module Hashie
|
|
381
383
|
when ::Hash
|
382
384
|
val = val.dup if duping
|
383
385
|
self.class.new(val)
|
384
|
-
when Array
|
385
|
-
val.map { |e| convert_value(e) }
|
386
386
|
when ::Array
|
387
387
|
Array.new(val.map { |e| convert_value(e) })
|
388
388
|
else
|
@@ -406,7 +406,12 @@ module Hashie
|
|
406
406
|
end
|
407
407
|
|
408
408
|
def log_collision?(method_key)
|
409
|
-
|
409
|
+
return unless respond_to?(method_key)
|
410
|
+
|
411
|
+
_, suffix = method_name_and_suffix(method_key)
|
412
|
+
|
413
|
+
(!suffix || suffix == '='.freeze) &&
|
414
|
+
!self.class.disable_warnings?(method_key) &&
|
410
415
|
!(regular_key?(method_key) || regular_key?(method_key.to_s))
|
411
416
|
end
|
412
417
|
end
|