dhs 1.4.2 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -0
- data/dhs.gemspec +1 -0
- data/lib/dhs/concerns/option_blocks.rb +2 -5
- data/lib/dhs/concerns/record/pagination.rb +2 -0
- data/lib/dhs/interceptors/auto_oauth/thread_registry.rb +2 -5
- data/lib/dhs/interceptors/extended_rollbar/thread_registry.rb +2 -5
- data/lib/dhs/interceptors/request_cycle_cache/thread_registry.rb +2 -6
- data/lib/dhs/pagination/next_parameter.rb +32 -0
- data/lib/dhs/version.rb +1 -1
- data/lib/dhs.rb +1 -0
- data/spec/pagination/next_parameter_spec.rb +57 -0
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79388bf9da2d5952b1df95513287bbd412dcb5196c99889ea91e28f302cbc64d
|
4
|
+
data.tar.gz: e18e9e03e4130cbc2e4dadddb63603170ffee5c2791eb2e64418f39b33f664c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ccb5289a230ea385574091368925d293106fae4fb5874ead856fb85a68bfa726a531a7adf9ad5b9499c82f24a8a355cf9ac5eb8741b1eb30c862762b3ed6b08
|
7
|
+
data.tar.gz: 42edbdaadbf8adc52e7a8a05a979d7b498aa0c8aa084718e29e0237282164482d37cb4b5d499e19633245f8a72e81a67f0fc167a9e8ce87bdf0efad20899932d
|
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
|
data/dhs.gemspec
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_support'
|
4
|
-
require 'active_support/
|
4
|
+
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
5
5
|
|
6
6
|
module DHS
|
7
7
|
module OptionBlocks
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
class CurrentOptionBlock
|
11
|
-
|
12
|
-
# Will switch to thread_mattr_accessor (which comes with Activesupport) when we dropping support for Active Support v4.
|
13
|
-
extend ActiveSupport::PerThreadRegistry
|
14
|
-
attr_accessor :options
|
11
|
+
thread_mattr_accessor :options
|
15
12
|
end
|
16
13
|
|
17
14
|
module ClassMethods
|
@@ -1,17 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_support'
|
4
|
-
require 'active_support/
|
4
|
+
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
5
5
|
|
6
6
|
module DHS
|
7
7
|
module Interceptors
|
8
8
|
module AutoOauth
|
9
9
|
extend ActiveSupport::Concern
|
10
10
|
class ThreadRegistry
|
11
|
-
|
12
|
-
# Will switch to thread_mattr_accessor (which comes with Activesupport) when we dropping support for Active Support v4.
|
13
|
-
extend ActiveSupport::PerThreadRegistry
|
14
|
-
attr_accessor :access_token
|
11
|
+
thread_mattr_accessor :access_token
|
15
12
|
end
|
16
13
|
end
|
17
14
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_support'
|
4
|
-
require 'active_support/
|
4
|
+
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
5
5
|
|
6
6
|
module DHS
|
7
7
|
module Interceptors
|
@@ -9,10 +9,7 @@ module DHS
|
|
9
9
|
extend ActiveSupport::Concern
|
10
10
|
|
11
11
|
class ThreadRegistry
|
12
|
-
|
13
|
-
# Will switch to thread_mattr_accessor (which comes with Activesupport) when we dropping support for Active Support v4.
|
14
|
-
extend ActiveSupport::PerThreadRegistry
|
15
|
-
attr_accessor :log
|
12
|
+
thread_mattr_accessor :log
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|
@@ -1,17 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_support'
|
4
|
-
require 'active_support/
|
5
|
-
|
4
|
+
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
6
5
|
module DHS
|
7
6
|
module Interceptors
|
8
7
|
module RequestCycleCache
|
9
8
|
extend ActiveSupport::Concern
|
10
9
|
class ThreadRegistry
|
11
|
-
|
12
|
-
# Will switch to thread_mattr_accessor (which comes with Activesupport) when we dropping support for Active Support v4.
|
13
|
-
extend ActiveSupport::PerThreadRegistry
|
14
|
-
attr_accessor :request_id
|
10
|
+
thread_mattr_accessor :request_id
|
15
11
|
end
|
16
12
|
end
|
17
13
|
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?
|
28
|
+
{
|
29
|
+
_record.pagination_key(:parameter) => current.dig(*_record.pagination_key(:body))
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
data/lib/dhs/version.rb
CHANGED
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,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
describe DHS::Record do
|
6
|
+
context 'next parameter pagination' do
|
7
|
+
def stub_api_request(this_parameter:, next_parameter:, items: [])
|
8
|
+
stub_request(:get, ['http://depay.fi/v2/transactions?limit=100', this_parameter ? "next=#{this_parameter}" : nil].compact.join('&'))
|
9
|
+
.to_return(body: { items: items, next: next_parameter }.to_json)
|
10
|
+
end
|
11
|
+
|
12
|
+
let!(:requests) do
|
13
|
+
stub_api_request(items: (0...100).to_a, this_parameter: nil, next_parameter: 'NEXT1')
|
14
|
+
stub_api_request(items: (100...200).to_a, this_parameter: 'NEXT1', next_parameter: 'NEXT2')
|
15
|
+
stub_api_request(items: nil, this_parameter: 'NEXT2', next_parameter: nil)
|
16
|
+
end
|
17
|
+
|
18
|
+
before do
|
19
|
+
class Transaction < DHS::Record
|
20
|
+
configuration pagination_strategy: :next_parameter, pagination_key: { body: :next, parameter: :next }
|
21
|
+
|
22
|
+
endpoint 'http://depay.fi/v2/transactions'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'fetches all the pages' do
|
27
|
+
transactions = Transaction.all.fetch
|
28
|
+
expect(transactions.to_a).to eq (0...200).to_a
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'next parameter pagination with items configuration and nil response' do
|
33
|
+
def stub_api_request(this_parameter:, next_parameter:, items: [])
|
34
|
+
stub_request(:get, ['http://depay.fi/v2/transactions?limit=100', this_parameter ? "next=#{this_parameter}" : nil].compact.join('&'))
|
35
|
+
.to_return(body: { assets: items, next: next_parameter }.to_json)
|
36
|
+
end
|
37
|
+
|
38
|
+
let!(:requests) do
|
39
|
+
stub_api_request(items: (0...100).to_a, this_parameter: nil, next_parameter: 'NEXT1')
|
40
|
+
stub_api_request(items: (100...200).to_a, this_parameter: 'NEXT1', next_parameter: 'NEXT2')
|
41
|
+
stub_api_request(items: nil, this_parameter: 'NEXT2', next_parameter: nil)
|
42
|
+
end
|
43
|
+
|
44
|
+
before do
|
45
|
+
class Transaction < DHS::Record
|
46
|
+
configuration items_key: :assets, pagination_strategy: :next_parameter, pagination_key: { body: :next, parameter: :next }
|
47
|
+
|
48
|
+
endpoint 'http://depay.fi/v2/transactions'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'fetches and merges all the assets/items' do
|
53
|
+
transactions = Transaction.all.fetch
|
54
|
+
expect(transactions.to_a).to eq (0...200).to_a
|
55
|
+
end
|
56
|
+
end
|
57
|
+
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
|
+
version: 1.6.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:
|
11
|
+
date: 2024-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nio4r
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.7.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.7.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: dhc
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -328,6 +342,7 @@ files:
|
|
328
342
|
- lib/dhs/pagination/base.rb
|
329
343
|
- lib/dhs/pagination/link.rb
|
330
344
|
- lib/dhs/pagination/next_offset.rb
|
345
|
+
- lib/dhs/pagination/next_parameter.rb
|
331
346
|
- lib/dhs/pagination/offset.rb
|
332
347
|
- lib/dhs/pagination/offset_page.rb
|
333
348
|
- lib/dhs/pagination/page.rb
|
@@ -468,6 +483,7 @@ files:
|
|
468
483
|
- spec/pagination/link/parallel_spec.rb
|
469
484
|
- spec/pagination/link/total_spec.rb
|
470
485
|
- spec/pagination/next_offset_spec.rb
|
486
|
+
- spec/pagination/next_parameter_spec.rb
|
471
487
|
- spec/pagination/offset/pages_left_spec.rb
|
472
488
|
- spec/pagination/offset_page_spec.rb
|
473
489
|
- spec/pagination/parameters_spec.rb
|
@@ -580,7 +596,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
580
596
|
version: '0'
|
581
597
|
requirements:
|
582
598
|
- Ruby >= 2.7.2
|
583
|
-
rubygems_version: 3.
|
599
|
+
rubygems_version: 3.3.26
|
584
600
|
signing_key:
|
585
601
|
specification_version: 4
|
586
602
|
summary: 'REST services accelerator: Rails gem providing an easy, active-record-like
|
@@ -706,6 +722,7 @@ test_files:
|
|
706
722
|
- spec/pagination/link/parallel_spec.rb
|
707
723
|
- spec/pagination/link/total_spec.rb
|
708
724
|
- spec/pagination/next_offset_spec.rb
|
725
|
+
- spec/pagination/next_parameter_spec.rb
|
709
726
|
- spec/pagination/offset/pages_left_spec.rb
|
710
727
|
- spec/pagination/offset_page_spec.rb
|
711
728
|
- spec/pagination/parameters_spec.rb
|