lhs 19.10.0 → 21.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57094afc8763a8fe1aab390ad385ac4ddee8c2abd59dd8b8651cd83c07826fef
4
- data.tar.gz: 2b06402e0aceb84e5d21aefeb15321610a6b13ada2959b6286434d8725578b13
3
+ metadata.gz: 80228cca0e4b14a7a21cf408db24114f85648afccc58fbc658fbe7ef579b69a9
4
+ data.tar.gz: 774070abf3a426ef7f68c9ee707c540f53c91499f8576220fcae2e610baca1bd
5
5
  SHA512:
6
- metadata.gz: ae00456701d8fa85fdf0e3f8d3d14eb58d87f1c87719b5ac2916959ebd449853f7a061a239fda5debc45faa0d34bb265f3cf429b584eba63cf2969a38b3c3ebe
7
- data.tar.gz: 0b142fc761ccda98c5524bd0810ca0147fd9a5d4ec923b4986cdc3698bce8f1881b240c8c3113d9f09d1c57ca92925848d29690d0da5fde0a099a7757b3e81a0
6
+ metadata.gz: 33f14c2fe5cd5e6cc9a8bdbee060d247bc3f62fe9a3dfde38ff87aadb4370de371996455a4ea55865c2ee13aa7b3728e405c73ad7185e29ec48a8f2a657b750d
7
+ data.tar.gz: 8aebc91f90fe095c4dc7d0d10dd8c389c0b1935928299421fce9df6c6245caa69a4991ce9f9a73758b5e316ea871a4437b7128243413634e4e7949ce96ac9405
data/Gemfile CHANGED
@@ -1,13 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  source 'https://rubygems.org/'
4
-
5
- # Declare your gem's dependencies in lhs.gemspec.
6
- # Bundler will treat runtime dependencies like base dependencies, and
7
- # development dependencies will be added by default to the :development group.
8
4
  gemspec
9
-
10
- # Declare any dependencies that are still in development here instead of in
11
- # your gemspec. These might include edge Rails or gems from your path or
12
- # Git. Remember to move these dependencies to your gemspec before releasing
13
- # your gem to rubygems.org.
data/README.md CHANGED
@@ -139,7 +139,9 @@ record.review # "Lunch was great
139
139
  * [Request tracing](#request-tracing)
140
140
  * [Extended Rollbar Logging](#extended-rollbar-logging)
141
141
  * [Testing with LHS](#testing-with-lhs)
142
- * [Test helper for request cycle cache](#test-helper-for-request-cycle-cache)
142
+ * [Test helper](#test-helper)
143
+ * [Stub](#stub)
144
+ * [Stub All](#stub-all)
143
145
  * [Test query chains](#test-query-chains)
144
146
  * [By explicitly resolving the chain: fetch](#by-explicitly-resolving-the-chain-fetch)
145
147
  * [Without resolving the chain: where_values_hash](#without-resolving-the-chain-where_values_hash)
@@ -1629,6 +1631,15 @@ POST https://service.example.com/records/1z-5r1fkaj { body: "{ 'name': 'Starbuck
1629
1631
 
1630
1632
  -> See [record validation](#record-validation) for how to handle validation errors when updating records.
1631
1633
 
1634
+ You can also pass explicit request options to `update`, by passing two explicit hashes:
1635
+
1636
+ ```ruby
1637
+ # app/controllers/some_controller.rb
1638
+
1639
+ record.update({ recommended: true }, { method: 'put' })
1640
+
1641
+ ```
1642
+
1632
1643
  ##### partial_update
1633
1644
 
1634
1645
  `partial_update` updates just the provided parameters.
@@ -1660,6 +1671,15 @@ POST https://service.example.com/records/1z-5r1fkaj { body: "{ 'name': 'Starbuck
1660
1671
 
1661
1672
  -> See [record validation](#record-validation) for how to handle validation errors when updating records.
1662
1673
 
1674
+ You can also pass explicit request options to `partial_update`, by passing two explicit hashes:
1675
+
1676
+ ```ruby
1677
+ # app/controllers/some_controller.rb
1678
+
1679
+ record.partial_update({ recommended: true }, { method: 'put' })
1680
+
1681
+ ```
1682
+
1663
1683
  #### Endpoint url parameter injection during record creation/change
1664
1684
 
1665
1685
  LHS injects parameters provided to `create`, `update`, `partial_update`, `save` etc. into an endpoint's URL when matching:
@@ -2502,17 +2522,70 @@ it 'displays contracts' do
2502
2522
  end
2503
2523
  ```
2504
2524
 
2505
- ### Test helper for request cycle cache
2525
+ ### Test helper
2506
2526
 
2507
- In order to not run into caching issues during your tests, when (request cycle cache)[#request-cycle-cache] is enabled, simply require the following helper in your tests:
2527
+ In order to load LHS test helpers into your tests, add the following to your spec helper:
2508
2528
 
2509
2529
  ```ruby
2510
2530
  # spec/spec_helper.rb
2511
2531
 
2512
- require 'lhs/test/request_cycle_cache_helper'
2532
+ require 'lhs/rspec'
2533
+ ```
2534
+
2535
+ This e.g. will prevent running into caching issues during your tests, when (request cycle cache)[#request-cycle-cache] is enabled.
2536
+ It will initialize a MemoryStore cache for LHC::Caching interceptor and resets the cache before every test.
2537
+
2538
+ #### Stub
2539
+
2540
+ LHS offers stub helpers that simplify stubbing https request to your apis through your defined Records.
2541
+
2542
+ ##### stub_all
2543
+
2544
+ `Record.stub_all(url, items, additional_options)`
2545
+
2546
+ ```ruby
2547
+ # your_spec.rb
2548
+
2549
+ before do
2550
+ class Record < LHS::Record
2551
+ endpoint 'https://records'
2552
+ end
2553
+
2554
+ Record.stub_all(
2555
+ 'https://records',
2556
+ 200.times.map{ |index| { name: "Item #{index}" } },
2557
+ headers: {
2558
+ 'Authorization' => 'Bearer 123'
2559
+ }
2560
+ )
2561
+ end
2562
+ ```
2563
+ ```
2564
+ GET https://records?limit=100
2565
+ GET https://records?limit=100&offset=100
2513
2566
  ```
2514
2567
 
2515
- This will initialize a MemoryStore cache for LHC::Caching interceptor and resets the cache before every test.
2568
+ LHS also uses Record configuration when stubbing all.
2569
+ ```ruby
2570
+ # your_spec.rb
2571
+
2572
+ before do
2573
+ class Record < LHS::Record
2574
+ configuration limit_key: :per_page, pagination_strategy: :page, pagination_key: :page
2575
+
2576
+ endpoint 'https://records'
2577
+ end
2578
+
2579
+ Record.stub_all(
2580
+ 'https://records',
2581
+ 200.times.map{ |index| { name: "Item #{index}" } }
2582
+ )
2583
+ end
2584
+ ```
2585
+ ```
2586
+ GET https://records?per_page=100
2587
+ GET https://records?per_page=100&page=2
2588
+ ```
2516
2589
 
2517
2590
  ### Test query chains
2518
2591
 
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
25
25
  s.add_dependency 'activemodel'
26
26
  s.add_dependency 'activesupport', '>= 4.2.11'
27
27
  s.add_dependency 'lhc', '~> 10.2'
28
+ s.add_dependency 'local_uri'
28
29
 
29
30
  s.add_development_dependency 'capybara'
30
31
  s.add_development_dependency 'json', '>= 1.8.2'
@@ -35,6 +36,7 @@ Gem::Specification.new do |s|
35
36
  s.add_development_dependency 'rspec-rails', '>= 3.7.0'
36
37
  s.add_development_dependency 'rubocop', '~> 0.57.1'
37
38
  s.add_development_dependency 'rubocop-rspec', '~> 1.26.0'
39
+ s.add_development_dependency 'sprockets', '< 4'
38
40
  s.add_development_dependency 'webmock'
39
41
 
40
42
  s.license = 'GPL-3'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support'
4
+ require 'active_support/per_thread_registry'
4
5
 
5
6
  module LHS
6
7
  module OptionBlocks
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support'
4
+ require 'active_support/per_thread_registry'
4
5
 
5
6
  module LHS
6
7
  module Interceptors
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support'
4
+ require 'active_support/per_thread_registry'
4
5
 
5
6
  module LHS
6
7
  module Interceptors
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'lhs'
4
+ require 'lhs/test/stubbable_records'
5
+
3
6
  RSpec.configure do |config|
4
7
  config.before(:each) do
5
8
  LHS.config.request_cycle_cache.clear
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'local_uri'
4
+ require 'webmock'
5
+
6
+ class LHS::Record
7
+ DEFAULT_LIMIT = LHS::Pagination::Base::DEFAULT_LIMIT
8
+
9
+ def self.stub_all(url, items, options = {})
10
+ extend WebMock::API
11
+
12
+ items.each_slice(DEFAULT_LIMIT).with_index do |(*batch), index|
13
+ uri = LocalUri::URI.new(url)
14
+ uri.query.merge!(
15
+ limit_key(:parameter) => DEFAULT_LIMIT
16
+ )
17
+ offset = pagination_class.page_to_offset(index + 1, DEFAULT_LIMIT)
18
+ unless index.zero?
19
+ uri.query.merge!(
20
+ pagination_key(:parameter) => offset
21
+ )
22
+ end
23
+ request_stub = stub_request(:get, uri.to_s)
24
+ request_stub.with(options) if options.present?
25
+ request_stub.to_return(
26
+ body: {
27
+ items: batch,
28
+ offset: index.zero? ? 0 : offset,
29
+ total: items.length
30
+ }.to_json
31
+ )
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LHS
4
- VERSION = '19.10.0'
4
+ VERSION = '21.0.0'
5
5
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+ require 'lhs/rspec'
5
+
6
+ describe LHS do
7
+
8
+ before do
9
+ class Record < LHS::Record
10
+ endpoint 'https://records'
11
+ end
12
+
13
+ Record.stub_all(
14
+ 'https://records',
15
+ 200.times.map { |index| { name: "Item #{index}" } },
16
+ headers: {
17
+ 'Authorization' => 'Bearer 123'
18
+ }
19
+ )
20
+ end
21
+
22
+ it 'stubs all requests' do
23
+ records = Record.options(headers: { 'Authorization' => 'Bearer 123' }).all.fetch
24
+ expect(records.count).to eq 200
25
+ expect(records.length).to eq 200
26
+ expect(records.first.name).to eq 'Item 0'
27
+ end
28
+
29
+ context 'without conditions' do
30
+
31
+ before do
32
+ class Record < LHS::Record
33
+ endpoint 'https://records'
34
+ end
35
+
36
+ Record.stub_all(
37
+ 'https://records',
38
+ 200.times.map { |index| { name: "Item #{index}" } }
39
+ )
40
+ end
41
+
42
+ it 'stubs all requests without a webmock "with"' do
43
+ records = Record.all.fetch
44
+ expect(records.count).to eq 200
45
+ expect(records.length).to eq 200
46
+ expect(records.first.name).to eq 'Item 0'
47
+ end
48
+ end
49
+
50
+ context 'with configured record' do
51
+
52
+ before do
53
+ class Record < LHS::Record
54
+ configuration limit_key: :per_page, pagination_strategy: :page, pagination_key: :page
55
+
56
+ endpoint 'https://records'
57
+ end
58
+
59
+ Record.stub_all(
60
+ 'https://records',
61
+ 200.times.map { |index| { name: "Item #{index}" } }
62
+ )
63
+ end
64
+
65
+ it 'stubs all requests with record configurations for pagination' do
66
+ records = Record.all.fetch
67
+ expect(records.count).to eq 200
68
+ expect(records.length).to eq 200
69
+ expect(records.first.name).to eq 'Item 0'
70
+ end
71
+ end
72
+ 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: 19.10.0
4
+ version: 21.0.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: 2019-08-12 00:00:00.000000000 Z
11
+ date: 2019-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: local_uri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: capybara
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +192,20 @@ dependencies:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
194
  version: 1.26.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: sprockets
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "<"
200
+ - !ruby/object:Gem::Version
201
+ version: '4'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "<"
207
+ - !ruby/object:Gem::Version
208
+ version: '4'
181
209
  - !ruby/object:Gem::Dependency
182
210
  name: webmock
183
211
  requirement: !ruby/object:Gem::Requirement
@@ -300,7 +328,8 @@ files:
300
328
  - lib/lhs/proxy.rb
301
329
  - lib/lhs/railtie.rb
302
330
  - lib/lhs/record.rb
303
- - lib/lhs/test/request_cycle_cache_helper.rb
331
+ - lib/lhs/rspec.rb
332
+ - lib/lhs/test/stubbable_records.rb
304
333
  - lib/lhs/unprocessable.rb
305
334
  - lib/lhs/version.rb
306
335
  - script/ci/build.sh
@@ -487,6 +516,7 @@ files:
487
516
  - spec/request_cycle_cache_spec.rb
488
517
  - spec/require_lhs_spec.rb
489
518
  - spec/spec_helper.rb
519
+ - spec/stubs/all_spec.rb
490
520
  - spec/support/fixtures/json/feedback.json
491
521
  - spec/support/fixtures/json/feedbacks.json
492
522
  - spec/support/fixtures/json/localina_content_ad.json
@@ -514,8 +544,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
514
544
  version: '0'
515
545
  requirements:
516
546
  - Ruby >= 2.3.0
517
- rubyforge_project:
518
- rubygems_version: 2.7.8
547
+ rubygems_version: 3.0.6
519
548
  signing_key:
520
549
  specification_version: 4
521
550
  summary: 'REST services accelerator: Rails gem providing an easy, active-record-like
@@ -703,6 +732,7 @@ test_files:
703
732
  - spec/request_cycle_cache_spec.rb
704
733
  - spec/require_lhs_spec.rb
705
734
  - spec/spec_helper.rb
735
+ - spec/stubs/all_spec.rb
706
736
  - spec/support/fixtures/json/feedback.json
707
737
  - spec/support/fixtures/json/feedbacks.json
708
738
  - spec/support/fixtures/json/localina_content_ad.json