lhs 24.1.0.pre.2 → 25.0.1

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: 5a418b290339a24c8c2551c84facfe6ace4454dfb412d73ccd4bca16b89c5539
4
- data.tar.gz: 1f8c96a3b79392e4bdd3bfde8752b99ad37721bff564a23e2431db85469c02d8
3
+ metadata.gz: ca4c950dd6c2640b9bc05fc571ab0e54c06c2a796a1f004cd5fdb1898f186785
4
+ data.tar.gz: 0ce0b9625865a63398334af094e9aa13abe7659c1a973e46bd60256c4ae5e343
5
5
  SHA512:
6
- metadata.gz: 7cfc3e5008104bca9f6bea87c3cde06c774946c2c0d4ce56b8f9f2ab589c8d93dba506722e2ef389a48c2432c23d9353529b274930817a6204a0f7eea5d45594
7
- data.tar.gz: 49aa488ca17924ff4c4587c5aee20247417946d719ea29dde5f3f9a155c0f6f4099f5cdb53175e82b98ae984cf4b8b5614883cb8520fd224c9a660aa966d1a02
6
+ metadata.gz: a4333ef227de49a40508d2ae4a91ef25f3b4b40f94853b285099c8bd3e5a14104d2cd939aa058690a72bdd67c320bd6c21f93bb311ba001c5ec859d18a959d81
7
+ data.tar.gz: 0c0f9fb7860dd1787a0c206068f51ef757d49943b607395993d0b0f0547424c00722fb7fd35b3e3d234fae736e984e84749e5ed9d679a1dd7169715806d28a14
data/README.md CHANGED
@@ -126,6 +126,7 @@ record.review # "Lunch was great
126
126
  * [Include various levels of linked data](#include-various-levels-of-linked-data)
127
127
  * [Identify and cast known records when including records](#identify-and-cast-known-records-when-including-records)
128
128
  * [Apply options for requests performed to fetch included records](#apply-options-for-requests-performed-to-fetch-included-records)
129
+ * [compact: Remove included resources that didn't return any records](#compact-remove-included-resources-that-didnt-return-any-records)
129
130
  * [Record batch processing](#record-batch-processing)
130
131
  * [all](#all-1)
131
132
  * [Using all, when endpoint does not implement response pagination meta data](#using-all-when-endpoint-does-not-implement-response-pagination-meta-data)
@@ -149,12 +150,15 @@ record.review # "Lunch was great
149
150
  * [Test query chains](#test-query-chains)
150
151
  * [By explicitly resolving the chain: fetch](#by-explicitly-resolving-the-chain-fetch)
151
152
  * [Without resolving the chain: where_values_hash](#without-resolving-the-chain-where_values_hash)
153
+ * [Extended developer documentation](#extended-developer-documentation)
154
+ * [Accessing data in LHS](#accessing-data-in-lhs)
152
155
  * [License](#license)
153
156
 
154
157
 
155
158
 
156
159
 
157
160
 
161
+
158
162
  ## Installation/Startup checklist
159
163
 
160
164
  - [ ] Install LHS gem, preferably via `Gemfile`
@@ -1698,7 +1702,7 @@ record.partial_update(recommended: true)
1698
1702
 
1699
1703
  ```
1700
1704
  ```
1701
- POST https://service.example.com/records/1z-5r1fkaj { body: "{ 'name': 'Starbucks', 'recommended': true }" }
1705
+ POST https://service.example.com/records/1z-5r1fkaj { body: "{ 'recommended': true }" }
1702
1706
  ```
1703
1707
 
1704
1708
  -> See [record validation](#record-validation) for how to handle validation errors when updating records.
@@ -2878,6 +2882,12 @@ expect(
2878
2882
  ).to eq {color: 'red', available: true}
2879
2883
  ```
2880
2884
 
2885
+ ## Extended developer documentation
2886
+
2887
+ ### Accessing data in LHS
2888
+
2889
+ ![diagram](docs/accessing-data-in-lhs.png)
2890
+
2881
2891
  ## License
2882
2892
 
2883
2893
  [GNU General Public License Version 3.](https://www.gnu.org/licenses/gpl-3.0.en.html)
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.add_dependency 'activemodel'
26
26
  s.add_dependency 'activesupport', '>= 4.2.11'
27
- s.add_dependency 'lhc', '>= 12.1.1', '< 13'
27
+ s.add_dependency 'lhc', '>= 12.1.1', '< 14'
28
28
  s.add_dependency 'local_uri'
29
29
 
30
30
  s.add_development_dependency 'capybara'
@@ -41,7 +41,7 @@ module AutoloadRecords
41
41
 
42
42
  def self.require_inheriting_records(parents)
43
43
  model_files.each do |file|
44
- next if parents.none? { |parent| File.read(file).match(parent) }
44
+ next if parents.none? { |parent| File.read(file).match(/\b#{parent}\b/) }
45
45
  require_dependency file
46
46
  end
47
47
  end
@@ -47,7 +47,7 @@ class LHS::Collection < LHS::Proxy
47
47
  if item.is_a?(LHS::Data) && item._request && !item._request.response.success?
48
48
  nil
49
49
  else
50
- item
50
+ cast_item(item)
51
51
  end
52
52
  end.compact
53
53
  end
@@ -55,10 +55,18 @@ class LHS::Collection < LHS::Proxy
55
55
  private
56
56
 
57
57
  def cast_item(item)
58
- record_by_href = LHS::Record.for_url(item[:href]) if item[:href]
59
58
  data = LHS::Data.new(item, @parent, @record)
60
- return (record_by_href || @record).new(data) if record_by_href || @record
61
- data
59
+ (record_by_href(item) || @record)&.new(data) || data
60
+ end
61
+
62
+ def record_by_href(item)
63
+ return if plain_value?(item) || item[:href].blank?
64
+
65
+ LHS::Record.for_url(item[:href])
66
+ end
67
+
68
+ def plain_value?(item)
69
+ item.is_a?(String) || item.is_a?(Numeric) || item.is_a?(TrueClass) || item.is_a?(FalseClass)
62
70
  end
63
71
  end
64
72
  end
@@ -120,7 +120,7 @@ class LHS::Record
120
120
  options = extend_with_reference(options, reference)
121
121
  addition = load_include(options, data, sub_includes, reference)
122
122
  data.extend!(addition, included)
123
- expand_addition!(data, included, options) unless expanded_data?(addition)
123
+ expand_addition!(data, included, reference) unless expanded_data?(addition)
124
124
  end
125
125
  end
126
126
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LHS
4
- VERSION = '24.1.0.pre.2'
4
+ VERSION = '25.0.1'
5
5
  end
@@ -6,6 +6,11 @@ describe LHS::Record do
6
6
  before do
7
7
  class Place < LHS::Record
8
8
  endpoint 'http://datastore/places/{id}'
9
+ endpoint 'http://datastore/users/{user_id}/places/{id}'
10
+
11
+ def display_name
12
+ "*#{name}*"
13
+ end
9
14
  end
10
15
 
11
16
  class User < LHS::Record
@@ -24,14 +29,24 @@ describe LHS::Record do
24
29
  items: [
25
30
  {
26
31
  href: 'http://datastore/users/123/places/789'
32
+ }, {
33
+ href: 'http://datastore/users/123/places/790'
27
34
  }
28
35
  ],
29
- total: 4,
36
+ total: 2,
30
37
  offset: 0,
31
38
  limit: 10
32
39
  }.to_json)
33
40
 
34
- stub_request(:get, 'http://datastore/users/123/places/789?limit=100')
41
+ stub_request(:get, 'http://datastore/users/123/places/789')
42
+ .to_return(
43
+ body: {
44
+ href: 'http://datastore/users/123/places/789?limit=100',
45
+ name: 'Mc Donalds'
46
+ }.to_json
47
+ )
48
+
49
+ stub_request(:get, 'http://datastore/users/123/places/790')
35
50
  .to_return(
36
51
  status: 404,
37
52
  body: {
@@ -51,17 +66,25 @@ describe LHS::Record do
51
66
  end
52
67
 
53
68
  context '.compact' do
54
-
55
69
  it 'removes linked resouces which could not get fetched' do
56
- expect(places.compact.length).to eq 0
57
- expect(places.length).not_to eq 0 # leaves the original intact
70
+ expect(places.compact.length).to eq 1
71
+ expect(places.length).not_to eq 1 # leaves the original intact
72
+ end
73
+ end
74
+
75
+ context 'record casting' do
76
+ let(:expected_display_name) { '*Mc Donalds*' }
77
+
78
+ it 'finds the right record class' do
79
+ expect(places.first.display_name).to eq expected_display_name
80
+ expect(places.compact.map(&:display_name)).to eq [expected_display_name]
58
81
  end
59
82
  end
60
83
 
61
84
  context '.compact!' do
62
85
  it 'removes linked resouces which could not get fetched' do
63
- expect(places.compact!.length).to eq 0
64
- expect(places.length).to eq 0 # and changes the original intact
86
+ expect(places.compact!.length).to eq 1
87
+ expect(places.length).to eq 1 # and changes the original intact
65
88
  end
66
89
  end
67
90
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe LHS::Record do
6
+ context 'includes all (expanded)' do
7
+ before do
8
+ class Record < LHS::Record
9
+ endpoint 'http://records/{id}'
10
+ end
11
+
12
+ stub_request(:get, "http://records/1")
13
+ .to_return(
14
+ body: {
15
+ car: { href: 'http://records/1/car' }
16
+ }.to_json
17
+ )
18
+
19
+ stub_request(:get, "http://records/1/car?color=blue&limit=100")
20
+ .to_return(
21
+ body: { href: 'http://records/cars/1' }.to_json
22
+ )
23
+
24
+ stub_request(:get, "http://records/cars/1?color=blue&limit=100")
25
+ .to_return(
26
+ body: { name: 'wrum wrum' }.to_json
27
+ )
28
+ end
29
+
30
+ it 'expands linked resources and forwards proper reference' do
31
+ record = Record.includes(:car).references(car: { params: { color: :blue } }).find(1)
32
+ expect(
33
+ record.car.name
34
+ ).to eq 'wrum wrum'
35
+ end
36
+ end
37
+ end
@@ -8,6 +8,14 @@ describe LHS::Record do
8
8
  class Customer < LHS::Record
9
9
  endpoint 'http://datastore/customers/{id}'
10
10
  end
11
+
12
+ class User < LHS::Record
13
+ endpoint 'http://datastore/users/{id}'
14
+ endpoint 'http://datastore/customers/{customer_id}/users/{id}'
15
+ def reversed_name
16
+ name.split.reverse.join(' ')
17
+ end
18
+ end
11
19
  end
12
20
 
13
21
  let!(:customer_request) do
@@ -18,6 +26,9 @@ describe LHS::Record do
18
26
  },
19
27
  'contact_addresses' => {
20
28
  'href' => "http://datastore/contact_addresses"
29
+ },
30
+ 'users' => {
31
+ 'href' => 'http://datastore/customers/1/users'
21
32
  }
22
33
  }.to_json)
23
34
  end
@@ -49,5 +60,37 @@ describe LHS::Record do
49
60
  assert_requested(electronic_addresses_request)
50
61
  assert_requested(contact_addresses_request)
51
62
  end
63
+
64
+ describe 'mapping related classes correctly' do
65
+ before do
66
+ stub_request(:get, 'http://datastore/customers/1/users?limit=100').to_return(
67
+ status: 200,
68
+ body: {
69
+ href: 'http://datastore/customers/1/users?offset=0&limit=100',
70
+ items: [
71
+ { href: 'http://datastore/customers/1/users/1' }
72
+ ],
73
+ total: 1,
74
+ offset: 0,
75
+ limit: 10
76
+ }.to_json
77
+ )
78
+
79
+ stub_request(:get, 'http://datastore/customers/1/users/1')
80
+ .with(headers: { 'Authentication' => 'Bearer 123' })
81
+ .to_return(body: { href: 'http://datastore/users/1', name: 'Elizabeth Baker' }.to_json)
82
+ end
83
+
84
+ it 'maps correctly' do
85
+ users = Customer
86
+ .includes(:users)
87
+ .references(users: referencing_options)
88
+ .find(1)
89
+ .users
90
+
91
+ expect(users.first.reversed_name).to be_present
92
+ end
93
+ end
94
+
52
95
  end
53
96
  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: 24.1.0.pre.2
4
+ version: 25.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/local-ch/lhs/graphs/contributors
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-12 00:00:00.000000000 Z
11
+ date: 2020-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -47,7 +47,7 @@ dependencies:
47
47
  version: 12.1.1
48
48
  - - "<"
49
49
  - !ruby/object:Gem::Version
50
- version: '13'
50
+ version: '14'
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
@@ -57,7 +57,7 @@ dependencies:
57
57
  version: 12.1.1
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
- version: '13'
60
+ version: '14'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: local_uri
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -263,6 +263,7 @@ files:
263
263
  - cider-ci/task_components/rspec.yml
264
264
  - cider-ci/task_components/rubocop.yml
265
265
  - cider-ci/task_components/ruby.yml
266
+ - docs/accessing-data-in-lhs.png
266
267
  - friday.yml
267
268
  - lhs.gemspec
268
269
  - lib/lhs.rb
@@ -503,6 +504,7 @@ files:
503
504
  - spec/record/href_for_spec.rb
504
505
  - spec/record/ignore_errors_spec.rb
505
506
  - spec/record/immutable_chains_spec.rb
507
+ - spec/record/includes_expanded_spec.rb
506
508
  - spec/record/includes_first_page_spec.rb
507
509
  - spec/record/includes_spec.rb
508
510
  - spec/record/includes_warning_spec.rb
@@ -552,7 +554,7 @@ homepage: https://github.com/local-ch/lhs
552
554
  licenses:
553
555
  - GPL-3.0
554
556
  metadata: {}
555
- post_install_message:
557
+ post_install_message:
556
558
  rdoc_options: []
557
559
  require_paths:
558
560
  - lib
@@ -563,13 +565,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
563
565
  version: 2.3.0
564
566
  required_rubygems_version: !ruby/object:Gem::Requirement
565
567
  requirements:
566
- - - ">"
568
+ - - ">="
567
569
  - !ruby/object:Gem::Version
568
- version: 1.3.1
570
+ version: '0'
569
571
  requirements:
570
572
  - Ruby >= 2.3.0
571
573
  rubygems_version: 3.0.6
572
- signing_key:
574
+ signing_key:
573
575
  specification_version: 4
574
576
  summary: 'REST services accelerator: Rails gem providing an easy, active-record-like
575
577
  interface for http (hypermedia) json services'
@@ -732,6 +734,7 @@ test_files:
732
734
  - spec/record/href_for_spec.rb
733
735
  - spec/record/ignore_errors_spec.rb
734
736
  - spec/record/immutable_chains_spec.rb
737
+ - spec/record/includes_expanded_spec.rb
735
738
  - spec/record/includes_first_page_spec.rb
736
739
  - spec/record/includes_spec.rb
737
740
  - spec/record/includes_warning_spec.rb