lhs 25.1.0 → 25.2.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 +4 -4
- data/.github/workflows/rubocop.yml +3 -14
- data/.github/workflows/test-active-support-5.yml +8 -15
- data/.github/workflows/test.yml +3 -14
- data/README.md +0 -36
- data/lib/lhs.rb +0 -2
- data/lib/lhs/concerns/item/save.rb +1 -1
- data/lib/lhs/concerns/record/pagination.rb +0 -2
- data/lib/lhs/version.rb +1 -1
- data/spec/dummy/app/controllers/request_cycle_cache_controller.rb +4 -4
- data/spec/dummy/config/initializers/lhs.rb +5 -0
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/record/create_spec.rb +53 -13
- data/spec/request_cycle_cache_spec.rb +1 -1
- metadata +4 -5
- data/lib/lhs/pagination/total_pages.rb +0 -9
- data/spec/pagination/total_pages_spec.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22ba3545c4f37d2becb37fbe7efb328a942af240d6a4d03e64fea4890e766969
|
4
|
+
data.tar.gz: 9cd64f9e1222e7f0f4cb041bdf967c257a2f0fd3ef1564618a65650e23a07ec1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9c87bfbc21370b89591c0b7a58bf30a24d8123ccbd41280f418afd69a5ebae47d05e0367fabdc7b7a0441a3cdf9729da8fee97b1c2fd5c39fbc757a7c1a0e6e
|
7
|
+
data.tar.gz: 4ef0c1857ba4983df1c567ea3ffee56ef5348e195e000beed34b4d91d7d372effc9c7fcbeb0d59419aebad7477926ece0e8938b9dfab936827603a8488f051a8
|
@@ -4,24 +4,13 @@ on: push
|
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
rubocop:
|
7
|
-
runs-on: ubuntu-
|
7
|
+
runs-on: ubuntu-18.04
|
8
8
|
|
9
9
|
steps:
|
10
10
|
- uses: actions/checkout@v2
|
11
|
-
- uses:
|
11
|
+
- uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
|
14
|
-
- name: Cache Ruby Gems
|
15
|
-
uses: actions/cache@v2
|
16
|
-
with:
|
17
|
-
path: /.tmp/vendor/bundle
|
18
|
-
key: ${{ runner.os }}-gems-latest-${{ hashFiles('**/Gemfile.lock') }}
|
19
|
-
restore-keys: |
|
20
|
-
${{ runner.os }}-gems-latest-
|
21
|
-
- name: Bundle Install
|
22
|
-
run: |
|
23
|
-
bundle config path /.tmp/vendor/bundle
|
24
|
-
bundle install --jobs 4 --retry 3
|
13
|
+
bundler-cache: true
|
25
14
|
- name: Run Rubocop
|
26
15
|
run: |
|
27
16
|
bundle exec rubocop
|
@@ -4,24 +4,17 @@ on: push
|
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
rspec:
|
7
|
-
runs-on: ubuntu-
|
7
|
+
runs-on: ubuntu-18.04
|
8
8
|
|
9
9
|
steps:
|
10
10
|
- uses: actions/checkout@v2
|
11
|
-
- uses:
|
11
|
+
- uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
with:
|
17
|
-
path: /.tmp/vendor/bundle
|
18
|
-
key: ${{ runner.os }}-gems-v5-${{ hashFiles('**/Gemfile.lock') }}
|
19
|
-
restore-keys: |
|
20
|
-
${{ runner.os }}-gems-v5-
|
21
|
-
- name: Bundle Install ActiveSupport v5
|
22
|
-
run: |
|
23
|
-
bundle config path /.tmp/vendor/bundle
|
24
|
-
BUNDLE_GEMFILE=Gemfile.activesupport5 bundle install --jobs 4 --retry 3
|
13
|
+
bundler-cache: true
|
14
|
+
env:
|
15
|
+
BUNDLE_GEMFILE: Gemfile.activesupport5
|
25
16
|
- name: Run Tests
|
17
|
+
env:
|
18
|
+
BUNDLE_GEMFILE: Gemfile.activesupport5
|
26
19
|
run: |
|
27
|
-
|
20
|
+
bundle exec rspec
|
data/.github/workflows/test.yml
CHANGED
@@ -4,24 +4,13 @@ on: push
|
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
rspec:
|
7
|
-
runs-on: ubuntu-
|
7
|
+
runs-on: ubuntu-18.04
|
8
8
|
|
9
9
|
steps:
|
10
10
|
- uses: actions/checkout@v2
|
11
|
-
- uses:
|
11
|
+
- uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
|
14
|
-
- name: Cache Ruby Gems
|
15
|
-
uses: actions/cache@v2
|
16
|
-
with:
|
17
|
-
path: /.tmp/vendor/bundle
|
18
|
-
key: ${{ runner.os }}-gems-latest-${{ hashFiles('**/Gemfile.lock') }}
|
19
|
-
restore-keys: |
|
20
|
-
${{ runner.os }}-gems-latest-
|
21
|
-
- name: Bundle Install
|
22
|
-
run: |
|
23
|
-
bundle config path /.tmp/vendor/bundle
|
24
|
-
bundle install --jobs 4 --retry 3
|
13
|
+
bundler-cache: true
|
25
14
|
- name: Run Tests
|
26
15
|
run: |
|
27
16
|
bundle exec rspec
|
data/README.md
CHANGED
@@ -80,7 +80,6 @@ record.review # "Lunch was great
|
|
80
80
|
* [Pagination strategy](#pagination-strategy)
|
81
81
|
* [Pagination strategy: offset (default)](#pagination-strategy-offset-default)
|
82
82
|
* [Pagination strategy: page](#pagination-strategy-page)
|
83
|
-
* [Pagination strategy: total_pages](#pagination-strategy-total-pages)
|
84
83
|
* [Pagination strategy: start](#pagination-strategy-start)
|
85
84
|
* [Pagination strategy: link](#pagination-strategy-link)
|
86
85
|
* [Pagination keys](#pagination-keys)
|
@@ -1254,41 +1253,6 @@ In parallel:
|
|
1254
1253
|
GET https://service.example.com/records?limit=100&page=3
|
1255
1254
|
```
|
1256
1255
|
|
1257
|
-
##### Pagination strategy: total_pages
|
1258
|
-
|
1259
|
-
The `total_pages` strategy is based on the `page` strategy with the only difference
|
1260
|
-
that the responding api provides `total_pages` over `total_items`.
|
1261
|
-
|
1262
|
-
```ruby
|
1263
|
-
# app/models/transaction.rb
|
1264
|
-
|
1265
|
-
class Transaction < LHS::Record
|
1266
|
-
configuration pagination_strategy: 'total_pages', pagination_key: 'page', total_key: 'total_pages'
|
1267
|
-
|
1268
|
-
endpoint '{+service}/transactions'
|
1269
|
-
end
|
1270
|
-
```
|
1271
|
-
|
1272
|
-
```ruby
|
1273
|
-
# app/controllers/some_controller.rb
|
1274
|
-
|
1275
|
-
Record.all
|
1276
|
-
|
1277
|
-
```
|
1278
|
-
```
|
1279
|
-
GET https://service.example.com/transactions?limit=100
|
1280
|
-
{
|
1281
|
-
items: [{...}, ...],
|
1282
|
-
total_pages: 3,
|
1283
|
-
limit: 100,
|
1284
|
-
page: 1
|
1285
|
-
}
|
1286
|
-
In parallel:
|
1287
|
-
GET https://service.example.com/records?limit=100&page=2
|
1288
|
-
GET https://service.example.com/records?limit=100&page=3
|
1289
|
-
```
|
1290
|
-
|
1291
|
-
|
1292
1256
|
##### Pagination strategy: start
|
1293
1257
|
|
1294
1258
|
In comparison to the `offset` strategy, the `start` strategy indicates with which item the current page starts.
|
data/lib/lhs.rb
CHANGED
@@ -45,7 +45,7 @@ class LHS::Item < LHS::Proxy
|
|
45
45
|
_data.merge_raw!(response_data.unwrap(:item_created_key))
|
46
46
|
response_headers = response_data._request.response.headers
|
47
47
|
end
|
48
|
-
if response_headers && response_headers['Location']
|
48
|
+
if options.fetch(:followlocation, true) && response_headers && response_headers['Location']
|
49
49
|
location_data = record.request(options.merge(url: response_headers['Location'], method: :get, body: nil))
|
50
50
|
_data.merge_raw!(location_data.unwrap(:item_created_key))
|
51
51
|
end
|
data/lib/lhs/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
class RequestCycleCacheController < ApplicationController
|
4
4
|
def simple
|
5
5
|
User.find(1) # first request
|
6
|
-
user = User.find(1) # second request that should be
|
6
|
+
user = User.find(1) # second request that should be served from request cycle cache
|
7
7
|
render json: user.to_json
|
8
8
|
end
|
9
9
|
|
@@ -15,13 +15,13 @@ class RequestCycleCacheController < ApplicationController
|
|
15
15
|
|
16
16
|
def parallel
|
17
17
|
User.find(1, 2) # first request
|
18
|
-
users = User.find(1, 2) # second request that should be
|
18
|
+
users = User.find(1, 2) # second request that should be served from request cycle cache
|
19
19
|
render json: users.to_json
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def different_headers
|
23
23
|
User.find(1) # first request
|
24
|
-
user = User.options(headers: { 'Authentication' => 'Bearer 123' }).find(1) # second request that should NOT be
|
24
|
+
user = User.options(headers: { 'Authentication' => 'Bearer 123' }).find(1) # second request that should NOT be served from request cycle cache as the headers are different
|
25
25
|
render json: user.to_json
|
26
26
|
end
|
27
27
|
end
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -12,7 +12,7 @@ Rails.application.routes.draw do
|
|
12
12
|
get 'request_cycle_cache/simple' => 'request_cycle_cache#simple'
|
13
13
|
get 'request_cycle_cache/no_caching_interceptor' => 'request_cycle_cache#no_caching_interceptor'
|
14
14
|
get 'request_cycle_cache/parallel' => 'request_cycle_cache#parallel'
|
15
|
-
get 'request_cycle_cache/
|
15
|
+
get 'request_cycle_cache/different_headers' => 'request_cycle_cache#different_headers'
|
16
16
|
|
17
17
|
# Error handling with chains
|
18
18
|
get 'error_handling_with_chains/fetch_in_controller' => 'error_handling_with_chains#fetch_in_controller'
|
data/spec/record/create_spec.rb
CHANGED
@@ -135,25 +135,65 @@ describe LHS::Record do
|
|
135
135
|
end
|
136
136
|
|
137
137
|
context 'location header' do
|
138
|
-
before do
|
139
|
-
class ContactPerson < LHS::Record
|
140
|
-
endpoint 'http://datastore/contact_persons'
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
let(:location) { 'http://datastore/contact_persons/1' }
|
145
138
|
let(:created_at) { '2017-12-21' }
|
139
|
+
let(:location) { 'http://datastore/contact_persons/1' }
|
146
140
|
let(:name) { 'Sebastian' }
|
147
|
-
|
148
|
-
it 'Loads the data from the "Location" header after creation' do
|
141
|
+
let!(:create_contact_person_request) do
|
149
142
|
stub_request(:post, "http://datastore/contact_persons")
|
150
143
|
.to_return(status: 204, headers: { Location: location })
|
144
|
+
end
|
145
|
+
let!(:fetch_contact_person_request) do
|
151
146
|
stub_request(:get, "http://datastore/contact_persons/1")
|
152
147
|
.to_return(body: { href: location, name: name, created_at: created_at }.to_json)
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'without `followlocation` option' do
|
151
|
+
before do
|
152
|
+
class ContactPerson < LHS::Record
|
153
|
+
endpoint 'http://datastore/contact_persons'
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'loads the data from the "Location" header after creation' do
|
158
|
+
contact_person = ContactPerson.create!(name: name)
|
159
|
+
expect(create_contact_person_request).to have_been_made.once
|
160
|
+
expect(fetch_contact_person_request).to have_been_made.once
|
161
|
+
expect(contact_person.href).to eq location
|
162
|
+
expect(contact_person.created_at).to eq Date.parse(created_at)
|
163
|
+
expect(contact_person.name).to eq name
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when `followlocation` is set to `true`' do
|
168
|
+
before do
|
169
|
+
class ContactPerson < LHS::Record
|
170
|
+
endpoint 'http://datastore/contact_persons', followlocation: true
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'loads the data from the "Location" header after creation' do
|
175
|
+
contact_person = ContactPerson.create!(name: name)
|
176
|
+
expect(create_contact_person_request).to have_been_made.once
|
177
|
+
expect(fetch_contact_person_request).to have_been_made.once
|
178
|
+
expect(contact_person.href).to eq location
|
179
|
+
expect(contact_person.created_at).to eq Date.parse(created_at)
|
180
|
+
expect(contact_person.name).to eq name
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'when `followlocation` is set to `false`' do
|
185
|
+
before do
|
186
|
+
class ContactPerson < LHS::Record
|
187
|
+
endpoint 'http://datastore/contact_persons', followlocation: false
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'does not load the data from the "Location" header after creation' do
|
192
|
+
contact_person = ContactPerson.create!(name: name)
|
193
|
+
expect(create_contact_person_request).to have_been_made.once
|
194
|
+
expect(fetch_contact_person_request).not_to have_been_made
|
195
|
+
expect(contact_person.name).to eq name
|
196
|
+
end
|
157
197
|
end
|
158
198
|
end
|
159
199
|
end
|
@@ -85,7 +85,7 @@ describe 'Request Cycle Cache', type: :request do
|
|
85
85
|
context 'headers' do
|
86
86
|
it 'considers the request headers when setting the cache key',
|
87
87
|
dummy_models: true, request_cycle_cache: true do
|
88
|
-
get '/request_cycle_cache/
|
88
|
+
get '/request_cycle_cache/different_headers'
|
89
89
|
expect(request).to have_been_made.times(2)
|
90
90
|
end
|
91
91
|
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: 25.
|
4
|
+
version: 25.2.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: 2021-
|
11
|
+
date: 2021-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -321,7 +321,6 @@ files:
|
|
321
321
|
- lib/lhs/pagination/offset.rb
|
322
322
|
- lib/lhs/pagination/page.rb
|
323
323
|
- lib/lhs/pagination/start.rb
|
324
|
-
- lib/lhs/pagination/total_pages.rb
|
325
324
|
- lib/lhs/problems/base.rb
|
326
325
|
- lib/lhs/problems/errors.rb
|
327
326
|
- lib/lhs/problems/nested/base.rb
|
@@ -410,6 +409,7 @@ files:
|
|
410
409
|
- spec/dummy/config/initializers/cookies_serializer.rb
|
411
410
|
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
412
411
|
- spec/dummy/config/initializers/inflections.rb
|
412
|
+
- spec/dummy/config/initializers/lhs.rb
|
413
413
|
- spec/dummy/config/initializers/mime_types.rb
|
414
414
|
- spec/dummy/config/initializers/rollbar.rb
|
415
415
|
- spec/dummy/config/initializers/session_store.rb
|
@@ -457,7 +457,6 @@ files:
|
|
457
457
|
- spec/pagination/link/total_spec.rb
|
458
458
|
- spec/pagination/offset/pages_left_spec.rb
|
459
459
|
- spec/pagination/parameters_spec.rb
|
460
|
-
- spec/pagination/total_pages_spec.rb
|
461
460
|
- spec/proxy/create_sub_resource_spec.rb
|
462
461
|
- spec/proxy/load_spec.rb
|
463
462
|
- spec/proxy/record_identification_spec.rb
|
@@ -644,6 +643,7 @@ test_files:
|
|
644
643
|
- spec/dummy/config/initializers/cookies_serializer.rb
|
645
644
|
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
646
645
|
- spec/dummy/config/initializers/inflections.rb
|
646
|
+
- spec/dummy/config/initializers/lhs.rb
|
647
647
|
- spec/dummy/config/initializers/mime_types.rb
|
648
648
|
- spec/dummy/config/initializers/rollbar.rb
|
649
649
|
- spec/dummy/config/initializers/session_store.rb
|
@@ -691,7 +691,6 @@ test_files:
|
|
691
691
|
- spec/pagination/link/total_spec.rb
|
692
692
|
- spec/pagination/offset/pages_left_spec.rb
|
693
693
|
- spec/pagination/parameters_spec.rb
|
694
|
-
- spec/pagination/total_pages_spec.rb
|
695
694
|
- spec/proxy/create_sub_resource_spec.rb
|
696
695
|
- spec/proxy/load_spec.rb
|
697
696
|
- spec/proxy/record_identification_spec.rb
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rails_helper'
|
4
|
-
|
5
|
-
describe LHS::Record do
|
6
|
-
context 'pagination' do
|
7
|
-
|
8
|
-
let(:page_1_json) do
|
9
|
-
{
|
10
|
-
items: [1, 2],
|
11
|
-
total_pages: 3,
|
12
|
-
page: 1,
|
13
|
-
limit: 2
|
14
|
-
}.to_json
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:page_2_json) do
|
18
|
-
{
|
19
|
-
items: [3, 4],
|
20
|
-
total_pages: 3,
|
21
|
-
page: 2,
|
22
|
-
limit: 2
|
23
|
-
}.to_json
|
24
|
-
end
|
25
|
-
|
26
|
-
let(:page_3_json) do
|
27
|
-
{
|
28
|
-
items: [5, 6],
|
29
|
-
total_pages: 3,
|
30
|
-
page: 3,
|
31
|
-
limit: 2
|
32
|
-
}.to_json
|
33
|
-
end
|
34
|
-
|
35
|
-
before do
|
36
|
-
class Feedback < LHS::Record
|
37
|
-
configuration pagination_strategy: :total_pages, total_key: :total_pages, pagination_key: :page
|
38
|
-
endpoint 'http://local.ch/v2/feedbacks'
|
39
|
-
end
|
40
|
-
stub_request(:get, 'http://local.ch/v2/feedbacks?limit=100').to_return(body: page_1_json)
|
41
|
-
stub_request(:get, 'http://local.ch/v2/feedbacks?limit=2&page=2').to_return(body: page_2_json)
|
42
|
-
stub_request(:get, 'http://local.ch/v2/feedbacks?limit=2&page=3').to_return(body: page_3_json)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'responds to limit_value' do
|
46
|
-
feedbacks = Feedback.all.fetch
|
47
|
-
expect(feedbacks.length).to eq 6
|
48
|
-
expect(feedbacks.count).to eq 6
|
49
|
-
expect(feedbacks.items.as_json).to eq [1, 2, 3, 4, 5, 6]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|