hashie 3.5.3 → 3.5.4

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
2
  SHA1:
3
- metadata.gz: f4946d0568ab6be36877e25d748fdb8f04f50ed5
4
- data.tar.gz: f9cdd8a276939236ceb84633d88d5325486d5d86
3
+ metadata.gz: b244f4fdc55d9650174134efecbb99d32e75ef14
4
+ data.tar.gz: 5a00da5d9da33a9a7bdc3f821d16e83dfca65ced
5
5
  SHA512:
6
- metadata.gz: 7c4748d9c7c2d79fa5a362fe10497994ea1f7fc27e75dc476b17422cd32fb9d32d9923c42662a7bfb64c19413b1391124cf91cfd463b0c4adcdc7b463d611981
7
- data.tar.gz: ded15b7bd812ffe4792cf7e56f894e040d9041af56e1816f2c3d82ef62ee7bd5193fcf2cdac4086b11372dc6689fc0ee0a1b150f84cb17462e93bc4a5f860878
6
+ metadata.gz: f948ef11d034b29d9b6a6d9473be7528ba2e3b2e79e9a164fd622194ed39ab29a7b6d37ea1a4f4eeb0232a28fb3ff8d6b19cba3b059a13b33e5894180d76c7c7
7
+ data.tar.gz: e3ac5f5715323c230b2beedd38a4e47a9a2d199f17a4535072d75c645364ac14b2b4f95e4985de39db270b17f10b92989266eb5d4bb2c4a834a386a7807a04dd
@@ -6,6 +6,19 @@ scheme are considered to be bugs.
6
6
 
7
7
  [semver]: http://semver.org/spec/v2.0.0.html
8
8
 
9
+ ## [3.5.4] - 2017-02-22
10
+
11
+ [3.5.4]: https://github.com/intridea/hashie/compare/v3.5.3...v3.5.4
12
+
13
+ ### Added
14
+
15
+ * [#412](https://github.com/intridea/hashie/pull/412): Added a Hashie::Extensions::Mash::SymbolizeKeys extension that overrides the default stringification behavior for keys - [@michaelherold](https://github.com/michaelherold).
16
+
17
+ ### Fixed
18
+
19
+ * [#409](https://github.com/intridea/hashie/pull/409): Fixed Railtie detection for projects where Rails is defined but Railties are not availble - [@CallumD](https://github.com/callumd).
20
+ * [#411](https://github.com/intridea/hashie/pull/411): Fixed a performance regression from 3.4.3 that caused a 10x slowdown in OmniAuth - [@michaelherold](https://github.com/michaelherold).
21
+
9
22
  ## [3.5.3] - 2017-02-11
10
23
 
11
24
  [3.5.3]: https://github.com/intridea/hashie/compare/v3.5.2...v3.5.3
data/README.md CHANGED
@@ -20,7 +20,7 @@ $ gem install hashie
20
20
 
21
21
  ## Upgrading
22
22
 
23
- You're reading the documentation for the stable release of Hashie, 3.5.3. Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
23
+ You're reading the documentation for the stable release of Hashie, 3.5.4. Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
24
24
 
25
25
  ## Hash Extensions
26
26
 
@@ -561,6 +561,33 @@ safe_mash.zip = 'Test' # => ArgumentError
561
561
  safe_mash[:zip] = 'test' # => still ArgumentError
562
562
  ```
563
563
 
564
+ ### Mash Extension:: SymbolizeKeys
565
+
566
+ This extension can be mixed into a Mash to change the default behavior of converting keys to strings. After mixing this extension into a Mash, the Mash will convert all keys to symbols.
567
+
568
+ ```ruby
569
+ class SymbolizedMash < ::Hashie::Mash
570
+ include Hashie::Extensions::Mash::SymbolizeKeys
571
+ end
572
+
573
+ symbol_mash = SymbolizedMash.new
574
+ symbol_mash['test'] = 'value'
575
+ symbol_mash.test #=> 'value'
576
+ symbol_mash.to_h #=> {test: 'value'}
577
+ ```
578
+
579
+ There is a major benefit and coupled with a major trade-off to this decision (at least on older Rubies). As a benefit, by using symbols as keys, you will be able to use the implicit conversion of a Mash via the `#to_hash` method to destructure (or splat) the contents of a Mash out to a block. This can be handy for doing iterations through the Mash's keys and values, as follows:
580
+
581
+ ```ruby
582
+ symbol_mash = SymbolizedMash.new(id: 123, name: 'Rey')
583
+ symbol_mash.each do |key, value|
584
+ # key is :id, then :name
585
+ # value is 123, then 'Rey'
586
+ end
587
+ ```
588
+
589
+ However, on Rubies less than 2.0, this means that every key you send to the Mash will generate a symbol. Since symbols are not garbage-collected on older versions of Ruby, this can cause a slow memory leak when using a symbolized Mash with data generated from user input.
590
+
564
591
  ## Dash
565
592
 
566
593
  Dash is an extended Hash that has a discrete set of defined properties and only those properties may be set on the hash. Additionally, you can set defaults for each property. You can also flag a property as required. Required properties will raise an exception if unset. Another option is message for required properties, which allow you to add custom messages for required property.
@@ -45,6 +45,7 @@ module Hashie
45
45
 
46
46
  module Mash
47
47
  autoload :SafeAssignment, 'hashie/extensions/mash/safe_assignment'
48
+ autoload :SymbolizeKeys, 'hashie/extensions/mash/symbolize_keys'
48
49
  end
49
50
 
50
51
  module Array
@@ -0,0 +1,38 @@
1
+ module Hashie
2
+ module Extensions
3
+ module Mash
4
+ # Overrides Mash's default behavior of converting keys to strings
5
+ #
6
+ # @example
7
+ # class LazyResponse < Hashie::Mash
8
+ # include Hashie::Extensions::Mash::SymbolizedKeys
9
+ # end
10
+ #
11
+ # response = LazyResponse.new("id" => 123, "name" => "Rey").to_h
12
+ # #=> {id: 123, name: "Rey"}
13
+ #
14
+ # @api public
15
+ module SymbolizeKeys
16
+ # Hook for being included in a class
17
+ #
18
+ # @api private
19
+ # @return [void]
20
+ # @raise [ArgumentError] when the base class isn't a Mash
21
+ def self.included(base)
22
+ fail ArgumentError, "#{base} must descent from Hashie::Mash" unless base <= Hashie::Mash
23
+ end
24
+
25
+ private
26
+
27
+ # Converts a key to a symbol
28
+ #
29
+ # @api private
30
+ # @param [String, Symbol] key the key to convert to a symbol
31
+ # @return [void]
32
+ def convert_key(key)
33
+ key.to_sym
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -145,7 +145,7 @@ module Hashie
145
145
  def custom_writer(key, value, convert = true) #:nodoc:
146
146
  key_as_symbol = (key = convert_key(key)).to_sym
147
147
 
148
- log_built_in_message(key_as_symbol) if methods.include?(key_as_symbol)
148
+ log_built_in_message(key_as_symbol) if respond_to?(key_as_symbol)
149
149
  regular_writer(key, convert ? convert_value(value) : value)
150
150
  end
151
151
 
@@ -1,10 +1,14 @@
1
- require 'rails/railtie'
1
+ begin
2
+ require 'rails/railtie'
2
3
 
3
- module Hashie
4
- class Railtie < Rails::Railtie
5
- # Set the Hashie.logger to use Rails.logger when used with rails.
6
- initializer 'hashie.configure_logger', after: 'initialize_logger' do
7
- Hashie.logger = Rails.logger
4
+ module Hashie
5
+ class Railtie < Rails::Railtie
6
+ # Set the Hashie.logger to use Rails.logger when used with rails.
7
+ initializer 'hashie.configure_logger', after: 'initialize_logger' do
8
+ Hashie.logger = Rails.logger
9
+ end
8
10
  end
9
11
  end
12
+ rescue LoadError => e
13
+ Hashie.logger.info("Hashie skipping railtie as #{e.message}")
10
14
  end
@@ -1,3 +1,3 @@
1
1
  module Hashie
2
- VERSION = '3.5.3'
2
+ VERSION = '3.5.4'
3
3
  end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Hashie::Extensions::Mash::SymbolizeKeys do
4
+ it 'raises an error when included in a class that is not a Mash' do
5
+ expect do
6
+ Class.new do
7
+ include Hashie::Extensions::Mash::SymbolizeKeys
8
+ end
9
+ end.to raise_error(ArgumentError)
10
+ end
11
+
12
+ it 'symbolizes all keys in the Mash' do
13
+ my_mash = Class.new(Hashie::Mash) do
14
+ include Hashie::Extensions::Mash::SymbolizeKeys
15
+ end
16
+
17
+ expect(my_mash.new('test' => 'value').to_h).to eq(test: 'value')
18
+ end
19
+
20
+ context 'implicit to_hash on double splat' do
21
+ let(:destructure) { ->(**opts) { opts } }
22
+ let(:my_mash) do
23
+ Class.new(Hashie::Mash) do
24
+ include Hashie::Extensions::Mash::SymbolizeKeys
25
+ end
26
+ end
27
+ let(:instance) { my_mash.new('outer' => { 'inner' => 42 }, 'testing' => [1, 2, 3]) }
28
+
29
+ subject { destructure.call(instance) }
30
+
31
+ it 'is converted on method calls' do
32
+ expect(subject).to eq(outer: { inner: 42 }, testing: [1, 2, 3])
33
+ end
34
+
35
+ it 'is converted on explicit operator call' do
36
+ expect(**instance).to eq(outer: { inner: 42 }, testing: [1, 2, 3])
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,15 @@
1
+ require 'rspec/core'
2
+
3
+ RSpec.describe 'partial-rails' do
4
+ context 'when Rails constant is present but the railties are not' do
5
+ before(:all) do
6
+ class Rails
7
+ # A class about railways
8
+ end
9
+ end
10
+
11
+ it 'does not raise an exception when we require hashie' do
12
+ expect { require 'hashie' }.not_to raise_error
13
+ end
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashie
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.3
4
+ version: 3.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-02-11 00:00:00.000000000 Z
12
+ date: 2017-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -86,6 +86,7 @@ files:
86
86
  - lib/hashie/extensions/indifferent_access.rb
87
87
  - lib/hashie/extensions/key_conversion.rb
88
88
  - lib/hashie/extensions/mash/safe_assignment.rb
89
+ - lib/hashie/extensions/mash/symbolize_keys.rb
89
90
  - lib/hashie/extensions/merge_initializer.rb
90
91
  - lib/hashie/extensions/method_access.rb
91
92
  - lib/hashie/extensions/parsers/yaml_erb_parser.rb
@@ -119,6 +120,7 @@ files:
119
120
  - spec/hashie/extensions/indifferent_access_with_rails_hwia_spec.rb
120
121
  - spec/hashie/extensions/key_conversion_spec.rb
121
122
  - spec/hashie/extensions/mash/safe_assignment_spec.rb
123
+ - spec/hashie/extensions/mash/symbolize_keys_spec.rb
122
124
  - spec/hashie/extensions/merge_initializer_spec.rb
123
125
  - spec/hashie/extensions/method_access_spec.rb
124
126
  - spec/hashie/extensions/strict_key_access_spec.rb
@@ -137,6 +139,7 @@ files:
137
139
  - spec/integration/omniauth-oauth2/some_site.rb
138
140
  - spec/integration/omniauth/app.rb
139
141
  - spec/integration/omniauth/integration_spec.rb
142
+ - spec/integration/rails-without-dependency/integration_spec.rb
140
143
  - spec/integration/rails/app.rb
141
144
  - spec/integration/rails/integration_spec.rb
142
145
  - spec/spec_helper.rb
@@ -164,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
167
  version: '0'
165
168
  requirements: []
166
169
  rubyforge_project:
167
- rubygems_version: 2.6.7
170
+ rubygems_version: 2.6.10
168
171
  signing_key:
169
172
  specification_version: 4
170
173
  summary: Your friendly neighborhood hash library.
@@ -185,6 +188,7 @@ test_files:
185
188
  - spec/hashie/extensions/indifferent_access_with_rails_hwia_spec.rb
186
189
  - spec/hashie/extensions/key_conversion_spec.rb
187
190
  - spec/hashie/extensions/mash/safe_assignment_spec.rb
191
+ - spec/hashie/extensions/mash/symbolize_keys_spec.rb
188
192
  - spec/hashie/extensions/merge_initializer_spec.rb
189
193
  - spec/hashie/extensions/method_access_spec.rb
190
194
  - spec/hashie/extensions/strict_key_access_spec.rb
@@ -205,6 +209,7 @@ test_files:
205
209
  - spec/integration/omniauth-oauth2/some_site.rb
206
210
  - spec/integration/rails/app.rb
207
211
  - spec/integration/rails/integration_spec.rb
212
+ - spec/integration/rails-without-dependency/integration_spec.rb
208
213
  - spec/spec_helper.rb
209
214
  - spec/support/integration_specs.rb
210
215
  - spec/support/logger.rb