dhs 1.4.2 → 1.5.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: 8ef9be83e5148eedcda73523574e4d53684aecbf906e9034b12f52c9b8881a7b
4
- data.tar.gz: c8195c1668a305f9e9fcc723ba2464de9b87f17d2eaaa57ec3d4787ec36d8e45
3
+ metadata.gz: c02b8006074cd3482fac996fcf904ed9e904d6ab8f8b504afcd9c27318dd5724
4
+ data.tar.gz: 2ce157d1fd6f0333d9638516e650f2ef040b6f08145664e4f3e8b041f908ca66
5
5
  SHA512:
6
- metadata.gz: be55a13a577be249b76b1eaeb7baec3a307b94f4a7c2c4643ea1fcf66edb3f8df3927386886babe211b687821229180d33f0cf5e5af04f1af9534ccd67c20ffd
7
- data.tar.gz: 5ab39a51ac32085b8cb71e183c34edd64a7c5e78c86e6e08faabdd03d196a5aadbbfeba8e7b2ac8dc571d59b2ad7281cda2a20c5d8c131e3fbafdf061c6a0adc
6
+ metadata.gz: 8975d2399f0a7a63066fdf8e23b96dbf2b9809bd9e75efc73a85779b1a32e97eae997dce4573222ed5d7b1556ca9dc2276d12eee5dddfa911d71698ae26b10d0
7
+ data.tar.gz: 9d00278274df289db27965f24a6bc2a106d46e64ea09814b8129d5aeae15f6e0e2d7e7cde37a7f7b49447142ecc52a960ea458bef1cb9f46396ec9457c2acd97
data/README.md CHANGED
@@ -1431,6 +1431,50 @@ GET https://service.example.com/assets?offset=39
1431
1431
  }
1432
1432
  ```
1433
1433
 
1434
+ ##### Pagination strategy: next_parameter
1435
+
1436
+ The `next_parameter` strategy continuously follows in-response offset parameter information to following pages until the last page is reached (indicated by next parameter being empty or unset).
1437
+
1438
+ *WARNING*
1439
+
1440
+ Loading all pages from a resource paginated with next_parameter only can result in very poor performance, as pages can only be loaded sequentially!
1441
+
1442
+ ```ruby
1443
+ # app/models/record.rb
1444
+
1445
+ class Search < DHS::Record
1446
+ configuration pagination_strategy: 'next_parameter'
1447
+
1448
+ endpoint '{+service}/assets'
1449
+ end
1450
+ ```
1451
+
1452
+ ```ruby
1453
+ # app/controllers/some_controller.rb
1454
+
1455
+ Record.all
1456
+
1457
+ ```
1458
+ ```
1459
+ GET https://service.example.com/assets?limit=100
1460
+ {
1461
+ items: [{...}, ...],
1462
+ limit: 10,
1463
+ next: "LXBrPTIzMzE4NDE0"
1464
+ }
1465
+ GET https://service.example.com/assets?next=LXBrPTIzMzE4NDE0
1466
+ {
1467
+ items: [{...}, ...],
1468
+ limit: 10,
1469
+ next: "ASDASdads9123"
1470
+ }
1471
+ GET https://service.example.com/assets?next=ASDASdads9123
1472
+ {
1473
+ items: [{...}, ...],
1474
+ limit: 10
1475
+ }
1476
+ ```
1477
+
1434
1478
  #### Pagination keys
1435
1479
 
1436
1480
  ##### limit_key
@@ -32,6 +32,8 @@ class DHS::Record
32
32
  DHS::Pagination::Link
33
33
  when :next_offset
34
34
  DHS::Pagination::NextOffset
35
+ when :next_parameter
36
+ DHS::Pagination::NextParameter
35
37
  else
36
38
  DHS::Pagination::Offset
37
39
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DHS::Pagination::NextParameter < DHS::Pagination::Base
4
+
5
+ DEFAULT_OFFSET = nil
6
+
7
+ def total
8
+ data._raw.dig(*_record.items_key).count || 0
9
+ end
10
+ alias count total
11
+
12
+ def self.next_offset(offset, limit)
13
+ nil
14
+ end
15
+
16
+ def parallel?
17
+ false
18
+ end
19
+
20
+ def pages_left?
21
+ next_offset = data._raw.dig(*_record.pagination_key(:body))
22
+ next_offset.present? && !next_offset.blank?
23
+ end
24
+
25
+ def next(current)
26
+ next_value = current.dig(*_record.pagination_key(:body))
27
+ return if next_value.blank? || next_value.blank?
28
+ {
29
+ _record.pagination_key(:parameter) => current.dig(*_record.pagination_key(:body))
30
+ }
31
+ end
32
+ end
data/lib/dhs/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DHS
4
- VERSION = '1.4.2'
4
+ VERSION = '1.5.0'
5
5
  end
data/lib/dhs.rb CHANGED
@@ -40,6 +40,7 @@ module DHS
40
40
  autoload :TotalPages, 'dhs/pagination/total_pages'
41
41
  autoload :OffsetPage, 'dhs/pagination/offset_page'
42
42
  autoload :NextOffset, 'dhs/pagination/next_offset'
43
+ autoload :NextParameter, 'dhs/pagination/next_parameter'
43
44
  autoload :Start, 'dhs/pagination/start'
44
45
  autoload :Link, 'dhs/pagination/link'
45
46
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Record do
6
+ context 'next parameter pagination' do
7
+
8
+ def stub_api_request(this_parameter:, next_parameter:, items: [])
9
+ stub_request(:get, ["http://depay.fi/v2/transactions?limit=100", this_parameter ? "next=#{this_parameter}" : nil].compact.join('&'))
10
+ .to_return(body: { items: items, next: next_parameter }.to_json)
11
+ end
12
+
13
+ let!(:requests) do
14
+ stub_api_request(items: (0...100).to_a, this_parameter: nil, next_parameter: 'NEXT1')
15
+ stub_api_request(items: (100...200).to_a, this_parameter: 'NEXT1', next_parameter: 'NEXT2')
16
+ stub_api_request(items: nil, this_parameter: 'NEXT2', next_parameter: nil)
17
+ end
18
+
19
+ before do
20
+ class Transaction < DHS::Record
21
+ configuration pagination_strategy: :next_parameter, pagination_key: { body: :next, parameter: :next }
22
+
23
+ endpoint 'http://depay.fi/v2/transactions'
24
+ end
25
+ end
26
+
27
+ it 'fetches all the pages' do
28
+ transactions = Transaction.all.fetch
29
+ expect(transactions.to_a).to eq (0...200).to_a
30
+ end
31
+ end
32
+
33
+ context 'next parameter pagination with items configuration and nil response' do
34
+
35
+ def stub_api_request(this_parameter:, next_parameter:, items: [])
36
+ stub_request(:get, ["http://depay.fi/v2/transactions?limit=100", this_parameter ? "next=#{this_parameter}" : nil].compact.join('&'))
37
+ .to_return(body: { assets: items, next: next_parameter }.to_json)
38
+ end
39
+
40
+ let!(:requests) do
41
+ stub_api_request(items: (0...100).to_a, this_parameter: nil, next_parameter: 'NEXT1')
42
+ stub_api_request(items: (100...200).to_a, this_parameter: 'NEXT1', next_parameter: 'NEXT2')
43
+ stub_api_request(items: nil, this_parameter: 'NEXT2', next_parameter: nil)
44
+ end
45
+
46
+ before do
47
+ class Transaction < DHS::Record
48
+ configuration items_key: :assets, pagination_strategy: :next_parameter, pagination_key: { body: :next, parameter: :next }
49
+
50
+ endpoint 'http://depay.fi/v2/transactions'
51
+ end
52
+ end
53
+
54
+ it 'fetches and merges all the assets/items' do
55
+ transactions = Transaction.all.fetch
56
+ expect(transactions.to_a).to eq (0...200).to_a
57
+ end
58
+ end
59
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dhs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/DePayFi/dhs/graphs/contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-28 00:00:00.000000000 Z
11
+ date: 2023-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -328,6 +328,7 @@ files:
328
328
  - lib/dhs/pagination/base.rb
329
329
  - lib/dhs/pagination/link.rb
330
330
  - lib/dhs/pagination/next_offset.rb
331
+ - lib/dhs/pagination/next_parameter.rb
331
332
  - lib/dhs/pagination/offset.rb
332
333
  - lib/dhs/pagination/offset_page.rb
333
334
  - lib/dhs/pagination/page.rb
@@ -468,6 +469,7 @@ files:
468
469
  - spec/pagination/link/parallel_spec.rb
469
470
  - spec/pagination/link/total_spec.rb
470
471
  - spec/pagination/next_offset_spec.rb
472
+ - spec/pagination/next_parameter_spec.rb
471
473
  - spec/pagination/offset/pages_left_spec.rb
472
474
  - spec/pagination/offset_page_spec.rb
473
475
  - spec/pagination/parameters_spec.rb
@@ -706,6 +708,7 @@ test_files:
706
708
  - spec/pagination/link/parallel_spec.rb
707
709
  - spec/pagination/link/total_spec.rb
708
710
  - spec/pagination/next_offset_spec.rb
711
+ - spec/pagination/next_parameter_spec.rb
709
712
  - spec/pagination/offset/pages_left_spec.rb
710
713
  - spec/pagination/offset_page_spec.rb
711
714
  - spec/pagination/parameters_spec.rb