hashie 3.5.7 → 3.6.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.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +22 -0
  3. data/README.md +91 -22
  4. data/Rakefile +2 -2
  5. data/hashie.gemspec +1 -1
  6. data/lib/hashie/clash.rb +12 -1
  7. data/lib/hashie/dash.rb +41 -21
  8. data/lib/hashie/extensions/coercion.rb +5 -5
  9. data/lib/hashie/extensions/dash/property_translation.rb +49 -26
  10. data/lib/hashie/extensions/deep_fetch.rb +1 -1
  11. data/lib/hashie/extensions/deep_find.rb +2 -2
  12. data/lib/hashie/extensions/deep_locate.rb +4 -5
  13. data/lib/hashie/extensions/deep_merge.rb +8 -9
  14. data/lib/hashie/extensions/indifferent_access.rb +7 -5
  15. data/lib/hashie/extensions/mash/keep_original_keys.rb +3 -5
  16. data/lib/hashie/extensions/mash/safe_assignment.rb +1 -1
  17. data/lib/hashie/extensions/mash/symbolize_keys.rb +1 -1
  18. data/lib/hashie/extensions/method_access.rb +47 -17
  19. data/lib/hashie/extensions/parsers/yaml_erb_parser.rb +3 -1
  20. data/lib/hashie/extensions/strict_key_access.rb +8 -9
  21. data/lib/hashie/extensions/stringify_keys.rb +1 -1
  22. data/lib/hashie/extensions/symbolize_keys.rb +1 -1
  23. data/lib/hashie/hash.rb +4 -4
  24. data/lib/hashie/mash.rb +22 -22
  25. data/lib/hashie/rash.rb +5 -5
  26. data/lib/hashie/version.rb +1 -1
  27. data/spec/hashie/array_spec.rb +1 -1
  28. data/spec/hashie/dash_spec.rb +27 -2
  29. data/spec/hashie/extensions/coercion_spec.rb +20 -12
  30. data/spec/hashie/extensions/deep_locate_spec.rb +1 -1
  31. data/spec/hashie/extensions/deep_merge_spec.rb +1 -1
  32. data/spec/hashie/extensions/indifferent_access_spec.rb +20 -7
  33. data/spec/hashie/extensions/indifferent_access_with_rails_hwia_spec.rb +5 -5
  34. data/spec/hashie/extensions/method_access_spec.rb +42 -4
  35. data/spec/hashie/extensions/stringify_keys_spec.rb +4 -4
  36. data/spec/hashie/extensions/symbolize_keys_spec.rb +3 -3
  37. data/spec/hashie/mash_spec.rb +16 -8
  38. data/spec/hashie/parsers/yaml_erb_parser_spec.rb +3 -3
  39. data/spec/hashie/rash_spec.rb +2 -2
  40. data/spec/hashie/trash_spec.rb +61 -1
  41. data/spec/integration/elasticsearch/integration_spec.rb +40 -0
  42. data/spec/integration/omniauth-oauth2/app.rb +3 -4
  43. data/spec/integration/omniauth-oauth2/some_site.rb +2 -2
  44. data/spec/integration/rails/app.rb +3 -4
  45. metadata +5 -3
@@ -184,7 +184,8 @@ describe Hashie::Mash do
184
184
  details: {
185
185
  email: 'michael@asf.com',
186
186
  address: 'Nowhere road'
187
- })
187
+ }
188
+ )
188
189
  end
189
190
 
190
191
  describe '#deep_update' do
@@ -284,7 +285,7 @@ describe Hashie::Mash do
284
285
  end
285
286
 
286
287
  it 'leaves only specified keys' do
287
- expect(subject.keys.sort).to eq %w(details middle_name)
288
+ expect(subject.keys.sort).to eq %w[details middle_name]
288
289
  expect(subject.first_name?).to be_falsy
289
290
  expect(subject).not_to respond_to(:first_name)
290
291
  expect(subject.last_name?).to be_falsy
@@ -386,28 +387,28 @@ describe Hashie::Mash do
386
387
  end
387
388
 
388
389
  it 'responds to a set key with a suffix' do
389
- %w(= ? ! _).each do |suffix|
390
+ %w[= ? ! _].each do |suffix|
390
391
  expect(subject).to be_respond_to(:"abc#{suffix}")
391
392
  end
392
393
  end
393
394
 
394
395
  it 'is able to access the suffixed key as a method' do
395
- %w(= ? ! _).each do |suffix|
396
+ %w[= ? ! _].each do |suffix|
396
397
  expect(subject.method(:"abc#{suffix}")).to_not be_nil
397
398
  end
398
399
  end
399
400
 
400
401
  it 'responds to an unknown key with a suffix' do
401
- %w(= ? ! _).each do |suffix|
402
+ %w[= ? ! _].each do |suffix|
402
403
  expect(subject).to be_respond_to(:"xyz#{suffix}")
403
404
  end
404
405
  end
405
406
 
406
407
  it 'is able to access an unknown suffixed key as a method' do
407
408
  # See https://github.com/intridea/hashie/pull/285 for more information
408
- pending_for(engine: 'ruby', versions: %w(2.2.0 2.2.1 2.2.2))
409
+ pending_for(engine: 'ruby', versions: %w[2.2.0 2.2.1 2.2.2])
409
410
 
410
- %w(= ? ! _).each do |suffix|
411
+ %w[= ? ! _].each do |suffix|
411
412
  expect(subject.method(:"xyz#{suffix}")).to_not be_nil
412
413
  end
413
414
  end
@@ -457,6 +458,13 @@ describe Hashie::Mash do
457
458
  expect(initial.test?).to be_truthy
458
459
  end
459
460
 
461
+ it 'allows propagation of a default block' do
462
+ h = Hashie::Mash.new { |mash, key| mash[key] = mash.class.new(&mash.default_proc) }
463
+ expect { h[:x][:y][:z] = :xyz }.not_to raise_error
464
+ expect(h.x.y.z).to eq(:xyz)
465
+ expect(h[:x][:y][:z]).to eq(:xyz)
466
+ end
467
+
460
468
  it 'allows assignment of an empty array in a default block' do
461
469
  initial = Hashie::Mash.new { |h, k| h[k] = [] }
462
470
  initial.hello << 100
@@ -553,7 +561,7 @@ describe Hashie::Mash do
553
561
  end
554
562
 
555
563
  it 'includes all keys' do
556
- expect(mash.to_hash.keys).to eql(%w(outer testing))
564
+ expect(mash.to_hash.keys).to eql(%w[outer testing])
557
565
  end
558
566
 
559
567
  it 'converts keys to symbols when symbolize_keys option is true' do
@@ -4,12 +4,12 @@ describe Hashie::Extensions::Parsers::YamlErbParser do
4
4
  describe '.perform' do
5
5
  context 'a file' do
6
6
  let(:config) do
7
- <<-EOF
7
+ <<-CONFIG
8
8
  ---
9
9
  foo: verbatim
10
10
  bar: <%= "erb" %>
11
11
  baz: "<%= __FILE__ %>"
12
- EOF
12
+ CONFIG
13
13
  end
14
14
  let(:path) { 'template.yml' }
15
15
 
@@ -36,7 +36,7 @@ baz: "<%= __FILE__ %>"
36
36
  file
37
37
  end
38
38
 
39
- subject { described_class.new(Pathname tempfile.path) }
39
+ subject { described_class.new(Pathname(tempfile.path)) }
40
40
 
41
41
  it '"#perform" can be done in case of path is a Pathname object.' do
42
42
  expect(subject.perform).to eq 'foo' => 'hello'
@@ -10,7 +10,7 @@ describe Hashie::Rash do
10
10
  1 => 'awesome',
11
11
  1..1000 => 'rangey',
12
12
  /(bcd)/ => proc { |m| m[1] }
13
- # /.+/ => "EVERYTHING"
13
+ # /.+/ => "EVERYTHING"
14
14
  )
15
15
  end
16
16
 
@@ -18,7 +18,7 @@ describe Hashie::Rash do
18
18
  expect(subject['other']).to eq 'whee'
19
19
  expect(subject['well hello there']).to eq 'hello'
20
20
  expect(subject['the world is round']).to eq 'world'
21
- expect(subject.all('hello world').sort).to eq %w(hello world)
21
+ expect(subject.all('hello world').sort).to eq %w[hello world]
22
22
  end
23
23
 
24
24
  it 'finds regexps' do
@@ -153,7 +153,7 @@ describe Hashie::Trash do
153
153
  end
154
154
 
155
155
  it 'maintains translations hash mapping from the original to the translated name' do
156
- expect(SomeDataModel.translations).to eq(config: [:value_a, :value_b])
156
+ expect(SomeDataModel.translations).to eq(config: %i[value_a value_b])
157
157
  end
158
158
  end
159
159
 
@@ -265,4 +265,64 @@ describe Hashie::Trash do
265
265
  expect(subject.first_name).to eq('Frodo')
266
266
  end
267
267
  end
268
+
269
+ context 'when copying properties from other properties' do
270
+ it 'retains the original and also sets the copy' do
271
+ simple = Class.new(Hashie::Trash) do
272
+ property :id
273
+ property :copy_of_id, from: :id
274
+ end
275
+
276
+ subject = simple.new(id: 1)
277
+
278
+ expect(subject.id).to eq(1)
279
+ expect(subject.copy_of_id).to eq(1)
280
+ end
281
+
282
+ it 'grabs the default for the original if it is not set' do
283
+ with_default = Class.new(Hashie::Trash) do
284
+ property :id, default: 0
285
+ property :copy_of_id, from: :id
286
+ end
287
+
288
+ subject = with_default.new
289
+
290
+ expect(subject.id).to eq(0)
291
+ expect(subject.copy_of_id).to eq(0)
292
+ end
293
+
294
+ it 'can be a required value' do
295
+ with_required = Class.new(Hashie::Trash) do
296
+ property :id
297
+ property :copy_of_id, from: :id, required: true, message: 'must be set'
298
+ end
299
+
300
+ expect { with_required.new }.to raise_error(ArgumentError, "The property 'copy_of_id' must be set")
301
+ end
302
+
303
+ it 'does not set properties that do not exist' do
304
+ from_non_property = Class.new(Hashie::Trash) do
305
+ property :copy_of_value, from: :value
306
+ end
307
+
308
+ subject = from_non_property.new(value: 0)
309
+
310
+ expect(subject).not_to respond_to(:value)
311
+ expect { subject[:value] }.to raise_error(NoMethodError, "The property 'value' is not defined for .")
312
+ expect(subject.to_h[:value]).to eq(nil)
313
+ expect(subject.copy_of_value).to eq(0)
314
+ end
315
+
316
+ it 'is not order-dependent in definition' do
317
+ simple = Class.new(Hashie::Trash) do
318
+ property :copy_of_id, from: :id
319
+ property :id
320
+ end
321
+
322
+ subject = simple.new(id: 1)
323
+
324
+ expect(subject.id).to eq(1)
325
+ expect(subject.copy_of_id).to eq(1)
326
+ end
327
+ end
268
328
  end
@@ -0,0 +1,40 @@
1
+ require 'elasticsearch/model'
2
+ require 'hashie'
3
+
4
+ RSpec.configure do |config|
5
+ config.expect_with :rspec do |expect|
6
+ expect.syntax = :expect
7
+ end
8
+ end
9
+
10
+ class MyModel < Hashie::Mash
11
+ include Elasticsearch::Model
12
+
13
+ disable_warnings
14
+
15
+ index_name 'model'
16
+ document_type 'model'
17
+ end
18
+
19
+ RSpec.describe 'elaasticsearch-model' do
20
+ # See https://github.com/intridea/hashie/issues/354#issuecomment-363306114
21
+ # for the reason why this doesn't work as you would expect
22
+ it 'raises an error when the model does has an id' do
23
+ object = MyModel.new
24
+ stub_elasticsearch_client
25
+
26
+ expect { object.__elasticsearch__.index_document }.to raise_error(NoMethodError)
27
+ end
28
+
29
+ it 'does not raise an error when the model has an id' do
30
+ object = MyModel.new(id: 123)
31
+ stub_elasticsearch_client
32
+
33
+ expect { object.__elasticsearch__.index_document }.not_to raise_error
34
+ end
35
+
36
+ def stub_elasticsearch_client
37
+ response = double('Response', body: '{}')
38
+ allow_any_instance_of(Elasticsearch::Transport::Client).to receive(:perform_request) { response }
39
+ end
40
+ end
@@ -19,7 +19,7 @@ module RailsApp
19
19
  end
20
20
  end
21
21
 
22
- LAYOUT = <<-HTML
22
+ LAYOUT = <<-HTML.freeze
23
23
  <!DOCTYPE html>
24
24
  <html>
25
25
  <head>
@@ -32,7 +32,7 @@ LAYOUT = <<-HTML
32
32
  </html>
33
33
  HTML
34
34
 
35
- INDEX = '<h1>Hello, world!</h1>'
35
+ INDEX = '<h1>Hello, world!</h1>'.freeze
36
36
 
37
37
  class ApplicationController < ActionController::Base
38
38
  include Rails.application.routes.url_helpers
@@ -44,8 +44,7 @@ class ApplicationController < ActionController::Base
44
44
  'application/index.html.erb' => INDEX
45
45
  )]
46
46
 
47
- def index
48
- end
47
+ def index; end
49
48
  end
50
49
 
51
50
  Bundler.require(:default, Rails.env)
@@ -19,8 +19,8 @@ module OmniAuth
19
19
 
20
20
  info do
21
21
  {
22
- :name => raw_info['name'],
23
- :email => raw_info['email']
22
+ name: raw_info['name'],
23
+ email: raw_info['email']
24
24
  }
25
25
  end
26
26
 
@@ -14,7 +14,7 @@ module RailsApp
14
14
  end
15
15
  end
16
16
 
17
- LAYOUT = <<-HTML
17
+ LAYOUT = <<-HTML.freeze
18
18
  <!DOCTYPE html>
19
19
  <html>
20
20
  <head>
@@ -27,7 +27,7 @@ LAYOUT = <<-HTML
27
27
  </html>
28
28
  HTML
29
29
 
30
- INDEX = '<h1>Hello, world!</h1>'
30
+ INDEX = '<h1>Hello, world!</h1>'.freeze
31
31
 
32
32
  class ApplicationController < ActionController::Base
33
33
  include Rails.application.routes.url_helpers
@@ -39,8 +39,7 @@ class ApplicationController < ActionController::Base
39
39
  'application/index.html.erb' => INDEX
40
40
  )]
41
41
 
42
- def index
43
- end
42
+ def index; end
44
43
  end
45
44
 
46
45
  Bundler.require(:default, Rails.env)
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.7
4
+ version: 3.6.0
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-12-19 00:00:00.000000000 Z
12
+ date: 2018-08-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -136,6 +136,7 @@ files:
136
136
  - spec/hashie/utils_spec.rb
137
137
  - spec/hashie/version_spec.rb
138
138
  - spec/hashie_spec.rb
139
+ - spec/integration/elasticsearch/integration_spec.rb
139
140
  - spec/integration/omniauth-oauth2/app.rb
140
141
  - spec/integration/omniauth-oauth2/integration_spec.rb
141
142
  - spec/integration/omniauth-oauth2/some_site.rb
@@ -169,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
170
  version: '0'
170
171
  requirements: []
171
172
  rubyforge_project:
172
- rubygems_version: 2.6.13
173
+ rubygems_version: 2.7.6
173
174
  signing_key:
174
175
  specification_version: 4
175
176
  summary: Your friendly neighborhood hash library.
@@ -211,6 +212,7 @@ test_files:
211
212
  - spec/integration/omniauth-oauth2/some_site.rb
212
213
  - spec/integration/omniauth/integration_spec.rb
213
214
  - spec/integration/omniauth/app.rb
215
+ - spec/integration/elasticsearch/integration_spec.rb
214
216
  - spec/integration/rails/integration_spec.rb
215
217
  - spec/integration/rails/app.rb
216
218
  - spec/support/module_context.rb