lhs 15.2.0 → 15.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +56 -4
- data/lhs.gemspec +1 -1
- data/lib/lhs/concerns/record/chainable.rb +4 -0
- data/lib/lhs/concerns/record/request.rb +2 -2
- data/lib/lhs/version.rb +1 -1
- data/spec/record/handle_includes_errors_spec.rb +30 -0
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b22ab9cad00592e285064f9e5423a0068cf0924c
|
4
|
+
data.tar.gz: '079d61d3f7a12423f689e64de210bb67243ec239'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94b77bb8a7a211acdf05d62f21138442a8d0a68e75fe6bde7190f939595287f7495a51c754f8cc50013ef019ac6a996e8a838a5bd318c62bdbec70530e424458
|
7
|
+
data.tar.gz: 5dc21e72c816d3437677965059f0ac9ae009e3b41f355aec95927b95b8885ba1a42b086ba685b113279bcf25a4cc75f45e12a7ee39d39e1590b3cf4d494a6e01
|
data/README.md
CHANGED
@@ -401,7 +401,29 @@ end
|
|
401
401
|
|
402
402
|
See [Validation](#Validation) for handling validation errors when creating records.
|
403
403
|
|
404
|
-
|
404
|
+
### Endpoint paramters and paramter injection during creation
|
405
|
+
|
406
|
+
LHS injects body parameters to generate target urls, used for creation requests:
|
407
|
+
|
408
|
+
```ruby
|
409
|
+
class Favorite << LHS::Record
|
410
|
+
endpoint '{+datastore}/content-ads/{content_ad_id}/feedbacks'
|
411
|
+
end
|
412
|
+
|
413
|
+
Favorite.create(content_ad_id: 51232, text: 'Great Restaurant!')
|
414
|
+
# POST http://datastore/content_ads/51232
|
415
|
+
# body: '{ "text" : "Great Restaurant!" }'
|
416
|
+
```
|
417
|
+
|
418
|
+
Because API's usually reject body paramters for foreign key attributes:
|
419
|
+
|
420
|
+
```
|
421
|
+
Not allowed to set or change foreign key: content_ad_id!
|
422
|
+
```
|
423
|
+
|
424
|
+
We remove it from the body, if the information was instead transported through the URL.
|
425
|
+
|
426
|
+
### Create records through associations (nested resources)
|
405
427
|
|
406
428
|
```ruby
|
407
429
|
class Review < LHS::Record
|
@@ -413,7 +435,7 @@ See [Validation](#Validation) for handling validation errors when creating recor
|
|
413
435
|
end
|
414
436
|
```
|
415
437
|
|
416
|
-
|
438
|
+
#### Item
|
417
439
|
```ruby
|
418
440
|
review = Review.find(1)
|
419
441
|
# Review#1
|
@@ -435,7 +457,7 @@ See [Validation](#Validation) for handling validation errors when creating recor
|
|
435
457
|
|
436
458
|
If the item already exists `ArgumentError` is raised.
|
437
459
|
|
438
|
-
|
460
|
+
#### Expanded collection
|
439
461
|
```ruby
|
440
462
|
review = Review.includes(:comments).find(1)
|
441
463
|
# Review#1
|
@@ -455,7 +477,7 @@ If the item already exists `ArgumentError` is raised.
|
|
455
477
|
# :comments => { :href => '{+service}/reviews/1/comments, :items => [{ :href => '{+service}/reviews/1/comments/1', :text => 'Thank you!' }] }
|
456
478
|
```
|
457
479
|
|
458
|
-
|
480
|
+
#### Not expanded collection
|
459
481
|
```ruby
|
460
482
|
review = Review.find(1)
|
461
483
|
# Review#1
|
@@ -484,6 +506,10 @@ Build and persist new items from scratch are done either with `new` or it's alia
|
|
484
506
|
record.save
|
485
507
|
```
|
486
508
|
|
509
|
+
### Endpoint parameters and paramter injection for saving records
|
510
|
+
|
511
|
+
See: [Endpoint paramters and paramter injection during creation](#endpoint-paramters-and-paramter-injection-during-creation)
|
512
|
+
|
487
513
|
## Custom setters and getters
|
488
514
|
|
489
515
|
Sometimes it is the case that you want to have your custom getters and setters and convert the data to a processable format behind the scenes.
|
@@ -726,6 +752,32 @@ record = Record.find('1z-5r1fkaj')
|
|
726
752
|
record.update(recommended: false)
|
727
753
|
```
|
728
754
|
|
755
|
+
### Endpoint paramters and paramter injection during updates
|
756
|
+
|
757
|
+
LHS injects body parameters to generate target urls, used for update requests:
|
758
|
+
|
759
|
+
```ruby
|
760
|
+
class Customer << LHS::Record
|
761
|
+
endpoint '{+customers}/{id}'
|
762
|
+
end
|
763
|
+
|
764
|
+
customer = Customer.find(123)
|
765
|
+
# GET http://customers/123
|
766
|
+
# { id: '123', name: 'My old company name' }
|
767
|
+
|
768
|
+
customer.update(name: 'My new company name')
|
769
|
+
# POST http://customers/123
|
770
|
+
# body: { "name": 'My new company name' }
|
771
|
+
```
|
772
|
+
|
773
|
+
Because API's usually reject body paramters for primary identifiers:
|
774
|
+
|
775
|
+
```
|
776
|
+
Not allowed to change primary id!
|
777
|
+
```
|
778
|
+
|
779
|
+
We remove it from the body, if the information was instead transported through the URL.
|
780
|
+
|
729
781
|
## Partial Update
|
730
782
|
|
731
783
|
Often you just want to update a single attribute on an existing record. As ActiveRecord's `update_attribute` skips validation, which is unlikely with api services, and `update_attributes` is just an alias for `update`, LHS introduces `partial_update` for that matter.
|
data/lhs.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.requirements << 'Ruby >= 2.3.0'
|
21
21
|
s.required_ruby_version = '>= 2.3.0'
|
22
22
|
|
23
|
-
s.add_dependency 'lhc', '~> 9.1.
|
23
|
+
s.add_dependency 'lhc', '~> 9.1.2'
|
24
24
|
s.add_dependency 'activesupport', '> 4.2'
|
25
25
|
s.add_dependency 'activemodel'
|
26
26
|
|
@@ -474,9 +474,9 @@ class LHS::Record
|
|
474
474
|
return_data = nil
|
475
475
|
error_class = LHC::Error.find(response)
|
476
476
|
error = error_class.new(error_class, response)
|
477
|
-
handlers = handlers.to_a.select { |
|
477
|
+
handlers = handlers.map(&:to_a).to_a.select { |handler_error_class, _| error.is_a? handler_error_class }
|
478
478
|
raise(error) unless handlers.any?
|
479
|
-
handlers.each do |handler|
|
479
|
+
handlers.each do |_, handler|
|
480
480
|
handlers_return = handler.call(response)
|
481
481
|
return_data = handlers_return if handlers_return.present?
|
482
482
|
end
|
data/lib/lhs/version.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe LHS::Record do
|
4
|
+
let(:handler) { spy('handler') }
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
class Record < LHS::Record
|
8
|
+
endpoint 'http://local.ch/v2/records/{id}'
|
9
|
+
end
|
10
|
+
class NestedRecord < LHS::Record
|
11
|
+
endpoint 'http://local.ch/v2/other_records/{id}'
|
12
|
+
end
|
13
|
+
stub_request(:get, "http://local.ch/v2/records/1")
|
14
|
+
.to_return(body: {
|
15
|
+
href: 'http://local.ch/v2/records/1',
|
16
|
+
other: {
|
17
|
+
href: 'http://local.ch/v2/other_records/2'
|
18
|
+
}
|
19
|
+
}.to_json)
|
20
|
+
stub_request(:get, "http://local.ch/v2/other_records/2")
|
21
|
+
.to_return(status: 404)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'allows to pass error_handling for includes to LHC' do
|
25
|
+
handler = ->(_) { return { deleted: true } }
|
26
|
+
record = Record.includes(:other).references(other: { error_handler: { LHC::NotFound => handler } }).find(id: 1)
|
27
|
+
|
28
|
+
expect(record.other.deleted).to be(true)
|
29
|
+
end
|
30
|
+
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: 15.2.
|
4
|
+
version: 15.2.1
|
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: 2018-03-
|
11
|
+
date: 2018-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lhc
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 9.1.
|
19
|
+
version: 9.1.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 9.1.
|
26
|
+
version: 9.1.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -375,6 +375,7 @@ files:
|
|
375
375
|
- spec/record/find_in_parallel_spec.rb
|
376
376
|
- spec/record/find_spec.rb
|
377
377
|
- spec/record/first_spec.rb
|
378
|
+
- spec/record/handle_includes_errors_spec.rb
|
378
379
|
- spec/record/has_many_spec.rb
|
379
380
|
- spec/record/ignore_errors_spec.rb
|
380
381
|
- spec/record/immutable_chains_spec.rb
|
@@ -436,7 +437,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
436
437
|
requirements:
|
437
438
|
- Ruby >= 2.3.0
|
438
439
|
rubyforge_project:
|
439
|
-
rubygems_version: 2.6.
|
440
|
+
rubygems_version: 2.6.14
|
440
441
|
signing_key:
|
441
442
|
specification_version: 4
|
442
443
|
summary: Rails gem providing an easy, active-record-like interface for http json services
|
@@ -562,6 +563,7 @@ test_files:
|
|
562
563
|
- spec/record/find_in_parallel_spec.rb
|
563
564
|
- spec/record/find_spec.rb
|
564
565
|
- spec/record/first_spec.rb
|
566
|
+
- spec/record/handle_includes_errors_spec.rb
|
565
567
|
- spec/record/has_many_spec.rb
|
566
568
|
- spec/record/ignore_errors_spec.rb
|
567
569
|
- spec/record/immutable_chains_spec.rb
|