hashie 3.5.7 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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