lhs 21.2.2 → 21.3.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +208 -107
  3. data/lhs.gemspec +1 -1
  4. data/lib/lhs.rb +8 -0
  5. data/lib/lhs/concerns/autoload_records.rb +20 -3
  6. data/lib/lhs/concerns/o_auth.rb +25 -0
  7. data/lib/lhs/concerns/record/configuration.rb +28 -11
  8. data/lib/lhs/concerns/record/request.rb +29 -8
  9. data/lib/lhs/config.rb +1 -1
  10. data/lib/lhs/interceptors/auto_oauth/interceptor.rb +33 -0
  11. data/lib/lhs/interceptors/auto_oauth/thread_registry.rb +18 -0
  12. data/lib/lhs/version.rb +1 -1
  13. data/spec/auto_oauth_spec.rb +129 -0
  14. data/spec/autoloading_spec.rb +35 -8
  15. data/spec/dummy/app/controllers/application_controller.rb +15 -0
  16. data/spec/dummy/app/controllers/automatic_authentication_controller.rb +22 -0
  17. data/spec/dummy/app/controllers/error_handling_with_chains_controller.rb +2 -2
  18. data/spec/dummy/app/controllers/extended_rollbar_controller.rb +2 -2
  19. data/spec/dummy/app/controllers/option_blocks_controller.rb +2 -2
  20. data/spec/dummy/app/models/dummy_customer.rb +6 -0
  21. data/spec/dummy/app/models/{record.rb → dummy_record.rb} +1 -1
  22. data/spec/dummy/app/models/dummy_record_with_multiple_oauth_providers1.rb +7 -0
  23. data/spec/dummy/app/models/dummy_record_with_multiple_oauth_providers2.rb +7 -0
  24. data/spec/dummy/app/models/dummy_record_with_multiple_providers_per_endpoint.rb +6 -0
  25. data/spec/dummy/app/models/dummy_record_with_oauth.rb +7 -0
  26. data/spec/dummy/app/models/{user.rb → dummy_user.rb} +1 -1
  27. data/spec/dummy/app/models/providers/customer_system.rb +7 -0
  28. data/spec/dummy/config/routes.rb +4 -0
  29. data/spec/option_blocks/ensure_reset_between_requests_spec.rb +2 -1
  30. data/spec/record/error_handling_integration_spec.rb +1 -1
  31. data/spec/record/includes_spec.rb +41 -0
  32. data/spec/request_cycle_cache_spec.rb +3 -3
  33. data/spec/support/reset.rb +31 -9
  34. metadata +29 -10
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DummyRecordWithOauth < LHS::Record
4
+ oauth
5
+ endpoint 'http://datastore/v2/records_with_oauth'
6
+ endpoint 'http://datastore/v2/records_with_oauth/{id}'
7
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class User < LHS::Record
3
+ class DummyUser < LHS::Record
4
4
  endpoint 'http://datastore/v2/users'
5
5
  endpoint 'http://datastore/v2/users/{id}'
6
6
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Providers
4
+ class CustomerSystem < LHS::Record
5
+ provider(headers: { 'Authorization': 'token123' })
6
+ end
7
+ end
@@ -3,6 +3,10 @@
3
3
  Rails.application.routes.draw do
4
4
  root 'application#root'
5
5
 
6
+ # Automatic Authentication
7
+ get 'automatic_authentication/oauth' => 'automatic_authentication#o_auth'
8
+ get 'automatic_authentication/oauth_with_multiple_providers' => 'automatic_authentication#o_auth_with_multiple_providers'
9
+
6
10
  # Request Cycle Cache
7
11
  get 'request_cycle_cache/simple' => 'request_cycle_cache#simple'
8
12
  get 'request_cycle_cache/no_caching_interceptor' => 'request_cycle_cache#no_caching_interceptor'
@@ -13,7 +13,8 @@ describe 'Option Blocks', type: :request do
13
13
  .to_return(status: 200)
14
14
  end
15
15
 
16
- it 'always ensures option blocks are always reset for new requests', dummy_models: true do
16
+ it 'always ensures option blocks are always reset for new requests',
17
+ dummy_models: true, reset_before: true do
17
18
  get '/option_blocks/first'
18
19
  expect(first_request).to have_been_made.once
19
20
  get '/option_blocks/second'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails_helper'
4
- require 'lhc/test/cache_helper.rb'
4
+ require 'lhc/rspec'
5
5
 
6
6
  describe 'Error handling with chains', type: :request do
7
7
  let!(:request) do
@@ -664,6 +664,28 @@ describe LHS::Record do
664
664
  expect(nested_request).to have_been_requested
665
665
  expect(place.customer.salesforce.name).to eq 'Steve'
666
666
  end
667
+
668
+ context 'included data has a configured record endpoint option' do
669
+ before do
670
+ class SalesforceCustomer < LHS::Record
671
+ endpoint 'https://salesforce/customers/{id}', headers: { 'Authorization': 'Bearer 123' }
672
+ end
673
+ end
674
+
675
+ let!(:nested_request) do
676
+ stub_request(:get, "https://salesforce/customers/1")
677
+ .with(headers: { 'Authorization' => 'Bearer 123' })
678
+ .to_return(body: {
679
+ name: 'Steve'
680
+ }.to_json)
681
+ end
682
+
683
+ it 'includes data that has been nested in an additional structure' do
684
+ place = Place.includes(customer: :salesforce).find(1)
685
+ expect(nested_request).to have_been_requested
686
+ expect(place.customer.salesforce.name).to eq 'Steve'
687
+ end
688
+ end
667
689
  end
668
690
 
669
691
  context 'include empty structures' do
@@ -683,4 +705,23 @@ describe LHS::Record do
683
705
  }).not_to raise_exception
684
706
  end
685
707
  end
708
+
709
+ context 'include partially empty structures' do
710
+ before do
711
+ class Place < LHS::Record
712
+ endpoint 'https://places/{id}'
713
+ end
714
+ stub_request(:get, "https://places/1")
715
+ .to_return(body: {
716
+ id: '123',
717
+ customer: {}
718
+ }.to_json)
719
+ end
720
+
721
+ it 'skips includes when there is nothing and also does not raise an exception' do
722
+ expect(-> {
723
+ Place.includes(customer: :salesforce).find(1)
724
+ }).not_to raise_exception
725
+ end
726
+ end
686
727
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails_helper'
4
- require 'lhc/test/cache_helper.rb'
4
+ require 'lhc/rspec'
5
5
 
6
6
  describe 'Request Cycle Cache', type: :request do
7
7
  let!(:request) do
@@ -37,7 +37,7 @@ describe 'Request Cycle Cache', type: :request do
37
37
  expect(lambda do
38
38
  get '/request_cycle_cache/no_caching_interceptor'
39
39
  end).to output(
40
- %r{\[WARNING\] Can't enable request cycle cache as LHC::Caching interceptor is not enabled/configured \(see https://github.com/local-ch/lhc/blob/master/docs/interceptors/caching.md#caching-interceptor\)!}
40
+ %r{\[WARNING\] Can't enable request cycle cache as LHC::Caching interceptor is not enabled/configured \(see https://github.com/local-ch/lhc/blob/master/README.md#caching-interceptor\)!}
41
41
  ).to_stderr
42
42
  expect(request).to have_been_made.times(2)
43
43
  end
@@ -70,7 +70,7 @@ describe 'Request Cycle Cache', type: :request do
70
70
  expect(lambda do
71
71
  get '/request_cycle_cache/no_caching_interceptor'
72
72
  end).not_to output(
73
- %r{\[WARNING\] Can't enable request cycle cache as LHC::Caching interceptor is not enabled/configured \(see https://github.com/local-ch/lhc/blob/master/docs/interceptors/caching.md#caching-interceptor\)!}
73
+ %r{\[WARNING\] Can't enable request cycle cache as LHC::Caching interceptor is not enabled/configured \(see https://github.com/local-ch/lhc/blob/master/README.md#caching-interceptor\)!}
74
74
  ).to_stderr
75
75
  expect(request).to have_been_made.times(2)
76
76
  end
@@ -12,10 +12,15 @@ end
12
12
 
13
13
  class LHS::Record
14
14
 
15
- CHILDREN = []
15
+ DESCENDANTS = []
16
16
 
17
17
  def self.inherited(child)
18
- CHILDREN.push(child)
18
+ DESCENDANTS.push(child)
19
+ child.singleton_class.class_eval do
20
+ define_method(:inherited) do |grand_child|
21
+ DESCENDANTS.push(grand_child)
22
+ end
23
+ end
19
24
  super
20
25
  end
21
26
 
@@ -27,9 +32,28 @@ end
27
32
 
28
33
  def reset_lhs
29
34
  LHS::Record::Endpoints.all = {}
30
- LHS::Record::CHILDREN.each do |child|
31
- child.endpoints = [] if !child.name['LHS'] && defined?(child.endpoints)
32
- child.configuration({}) if !child.name['LHS']
35
+ LHS::Record::DESCENDANTS.each do |decendant|
36
+ decendant.endpoints = [] if !decendant.name['LHS'] && defined?(decendant.endpoints)
37
+ decendant.configuration({}) if !decendant.name['LHS']
38
+ end
39
+ end
40
+
41
+ def model_files_to_reload
42
+ Dir.glob(Rails.root.join('app', 'models', '**', '*.rb'))
43
+ end
44
+
45
+ def reload_direct_inheritance
46
+ model_files_to_reload.map do |file|
47
+ next unless File.read(file).match('LHS::Record')
48
+ load file
49
+ file.split('models/').last.gsub('.rb', '').classify
50
+ end.compact
51
+ end
52
+
53
+ def reload_inheriting_records(parents)
54
+ model_files_to_reload.each do |file|
55
+ next if parents.none? { |parent| File.read(file).match(parent) }
56
+ load file
33
57
  end
34
58
  end
35
59
 
@@ -37,9 +61,7 @@ RSpec.configure do |config|
37
61
  config.before do |spec|
38
62
  reset_lhc unless spec.metadata.key?(:reset_before) && spec.metadata[:reset_before] == false
39
63
  reset_lhs unless spec.metadata.key?(:reset_before) && spec.metadata[:reset_before] == false
40
- next unless spec.metadata.key?(:dummy_models) && spec.metadata[:dummy_models] == true
41
- Dir.glob(Rails.root.join('app', 'models', '**', '*.rb')).each do |file|
42
- load file if File.read(file).match('LHS::Record')
43
- end
64
+ next if !spec.metadata.key?(:dummy_models) || spec.metadata[:dummy_models] != true
65
+ reload_inheriting_records(reload_direct_inheritance)
44
66
  end
45
67
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhs
3
3
  version: !ruby/object:Gem::Version
4
- version: 21.2.2
4
+ version: 21.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/local-ch/lhs/graphs/contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-23 00:00:00.000000000 Z
11
+ date: 2020-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -146,16 +146,16 @@ dependencies:
146
146
  name: rollbar
147
147
  requirement: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - ">="
149
+ - - "<="
150
150
  - !ruby/object:Gem::Version
151
- version: '0'
151
+ version: 2.24.0
152
152
  type: :development
153
153
  prerelease: false
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
- - - ">="
156
+ - - "<="
157
157
  - !ruby/object:Gem::Version
158
- version: '0'
158
+ version: 2.24.0
159
159
  - !ruby/object:Gem::Dependency
160
160
  name: rspec-rails
161
161
  requirement: !ruby/object:Gem::Requirement
@@ -283,6 +283,7 @@ files:
283
283
  - lib/lhs/concerns/item/save.rb
284
284
  - lib/lhs/concerns/item/update.rb
285
285
  - lib/lhs/concerns/item/validation.rb
286
+ - lib/lhs/concerns/o_auth.rb
286
287
  - lib/lhs/concerns/option_blocks.rb
287
288
  - lib/lhs/concerns/proxy/accessors.rb
288
289
  - lib/lhs/concerns/proxy/create.rb
@@ -314,6 +315,8 @@ files:
314
315
  - lib/lhs/config.rb
315
316
  - lib/lhs/data.rb
316
317
  - lib/lhs/endpoint.rb
318
+ - lib/lhs/interceptors/auto_oauth/interceptor.rb
319
+ - lib/lhs/interceptors/auto_oauth/thread_registry.rb
317
320
  - lib/lhs/interceptors/extended_rollbar/handler.rb
318
321
  - lib/lhs/interceptors/extended_rollbar/interceptor.rb
319
322
  - lib/lhs/interceptors/extended_rollbar/thread_registry.rb
@@ -340,6 +343,7 @@ files:
340
343
  - lib/lhs/version.rb
341
344
  - script/ci/build.sh
342
345
  - spec/.DS_Store
346
+ - spec/auto_oauth_spec.rb
343
347
  - spec/autoloading_spec.rb
344
348
  - spec/collection/accessors_spec.rb
345
349
  - spec/collection/collection_items_spec.rb
@@ -372,6 +376,7 @@ files:
372
376
  - spec/dummy/app/assets/javascripts/application.js
373
377
  - spec/dummy/app/assets/stylesheets/application.css
374
378
  - spec/dummy/app/controllers/application_controller.rb
379
+ - spec/dummy/app/controllers/automatic_authentication_controller.rb
375
380
  - spec/dummy/app/controllers/concerns/.keep
376
381
  - spec/dummy/app/controllers/error_handling_with_chains_controller.rb
377
382
  - spec/dummy/app/controllers/extended_rollbar_controller.rb
@@ -381,8 +386,14 @@ files:
381
386
  - spec/dummy/app/mailers/.keep
382
387
  - spec/dummy/app/models/.keep
383
388
  - spec/dummy/app/models/concerns/.keep
384
- - spec/dummy/app/models/record.rb
385
- - spec/dummy/app/models/user.rb
389
+ - spec/dummy/app/models/dummy_customer.rb
390
+ - spec/dummy/app/models/dummy_record.rb
391
+ - spec/dummy/app/models/dummy_record_with_multiple_oauth_providers1.rb
392
+ - spec/dummy/app/models/dummy_record_with_multiple_oauth_providers2.rb
393
+ - spec/dummy/app/models/dummy_record_with_multiple_providers_per_endpoint.rb
394
+ - spec/dummy/app/models/dummy_record_with_oauth.rb
395
+ - spec/dummy/app/models/dummy_user.rb
396
+ - spec/dummy/app/models/providers/customer_system.rb
386
397
  - spec/dummy/app/views/error_handling_with_chains/error.html.erb
387
398
  - spec/dummy/app/views/error_handling_with_chains/show.html.erb
388
399
  - spec/dummy/app/views/form_for.html.erb
@@ -557,6 +568,7 @@ specification_version: 4
557
568
  summary: 'REST services accelerator: Rails gem providing an easy, active-record-like
558
569
  interface for http (hypermedia) json services'
559
570
  test_files:
571
+ - spec/auto_oauth_spec.rb
560
572
  - spec/autoloading_spec.rb
561
573
  - spec/collection/accessors_spec.rb
562
574
  - spec/collection/collection_items_spec.rb
@@ -589,6 +601,7 @@ test_files:
589
601
  - spec/dummy/app/assets/javascripts/application.js
590
602
  - spec/dummy/app/assets/stylesheets/application.css
591
603
  - spec/dummy/app/controllers/application_controller.rb
604
+ - spec/dummy/app/controllers/automatic_authentication_controller.rb
592
605
  - spec/dummy/app/controllers/concerns/.keep
593
606
  - spec/dummy/app/controllers/error_handling_with_chains_controller.rb
594
607
  - spec/dummy/app/controllers/extended_rollbar_controller.rb
@@ -598,8 +611,14 @@ test_files:
598
611
  - spec/dummy/app/mailers/.keep
599
612
  - spec/dummy/app/models/.keep
600
613
  - spec/dummy/app/models/concerns/.keep
601
- - spec/dummy/app/models/record.rb
602
- - spec/dummy/app/models/user.rb
614
+ - spec/dummy/app/models/dummy_customer.rb
615
+ - spec/dummy/app/models/dummy_record.rb
616
+ - spec/dummy/app/models/dummy_record_with_multiple_oauth_providers1.rb
617
+ - spec/dummy/app/models/dummy_record_with_multiple_oauth_providers2.rb
618
+ - spec/dummy/app/models/dummy_record_with_multiple_providers_per_endpoint.rb
619
+ - spec/dummy/app/models/dummy_record_with_oauth.rb
620
+ - spec/dummy/app/models/dummy_user.rb
621
+ - spec/dummy/app/models/providers/customer_system.rb
603
622
  - spec/dummy/app/views/error_handling_with_chains/error.html.erb
604
623
  - spec/dummy/app/views/error_handling_with_chains/show.html.erb
605
624
  - spec/dummy/app/views/form_for.html.erb