lhs 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.localch.yml +190 -0
  3. data/.rubocop.yml +7 -0
  4. data/cider-ci.yml +2 -1
  5. data/cider-ci/jobs/rspec.yml +48 -0
  6. data/cider-ci/jobs/rubocop.yml +55 -0
  7. data/cider-ci/scripts/bundle.yml +2 -0
  8. data/cider-ci/scripts/github_comment.yml +6 -0
  9. data/cider-ci/scripts/rspec.yml +4 -0
  10. data/cider-ci/scripts/rubocop.yml +5 -0
  11. data/cider-ci/scripts/ruby-version.yml +2 -0
  12. data/cider-ci/scripts/tmp-cache.yml +2 -0
  13. data/lhs.gemspec +1 -0
  14. data/lib/lhs/collection.rb +2 -6
  15. data/lib/lhs/concerns/data/json.rb +1 -1
  16. data/lib/lhs/concerns/item/save.rb +11 -10
  17. data/lib/lhs/concerns/item/update.rb +1 -1
  18. data/lib/lhs/concerns/item/validation.rb +2 -2
  19. data/lib/lhs/concerns/record/all.rb +1 -2
  20. data/lib/lhs/concerns/record/batch.rb +2 -3
  21. data/lib/lhs/concerns/record/create.rb +7 -8
  22. data/lib/lhs/concerns/record/endpoints.rb +2 -3
  23. data/lib/lhs/concerns/record/find.rb +6 -6
  24. data/lib/lhs/concerns/record/find_by.rb +8 -8
  25. data/lib/lhs/concerns/record/first.rb +0 -1
  26. data/lib/lhs/concerns/record/includes.rb +0 -1
  27. data/lib/lhs/concerns/record/mapping.rb +0 -1
  28. data/lib/lhs/concerns/record/model.rb +0 -1
  29. data/lib/lhs/concerns/record/request.rb +18 -14
  30. data/lib/lhs/concerns/record/where.rb +0 -1
  31. data/lib/lhs/data.rb +3 -4
  32. data/lib/lhs/endpoint.rb +1 -2
  33. data/lib/lhs/errors.rb +7 -13
  34. data/lib/lhs/item.rb +5 -9
  35. data/lib/lhs/record.rb +12 -8
  36. data/lib/lhs/version.rb +1 -1
  37. data/spec/collection/delegate_spec.rb +0 -2
  38. data/spec/collection/enumerable_spec.rb +2 -4
  39. data/spec/collection/meta_data_spec.rb +0 -1
  40. data/spec/collection/respond_to_spec.rb +0 -1
  41. data/spec/collection/without_object_items_spec.rb +0 -1
  42. data/spec/data/collection_spec.rb +4 -7
  43. data/spec/data/item_spec.rb +3 -5
  44. data/spec/data/merge_spec.rb +7 -9
  45. data/spec/data/raw_spec.rb +3 -5
  46. data/spec/data/respond_to_spec.rb +3 -5
  47. data/spec/data/root_spec.rb +3 -5
  48. data/spec/data/select_spec.rb +2 -4
  49. data/spec/data/to_json_spec.rb +5 -7
  50. data/spec/dummy/bin/rails +1 -1
  51. data/spec/dummy/config.ru +1 -1
  52. data/spec/dummy/config/initializers/cookies_serializer.rb +1 -1
  53. data/spec/endpoint/for_url_spec.rb +3 -5
  54. data/spec/item/delegate_spec.rb +0 -2
  55. data/spec/item/destroy_spec.rb +3 -5
  56. data/spec/item/errors_spec.rb +20 -23
  57. data/spec/item/getter_spec.rb +1 -3
  58. data/spec/item/internal_data_structure_spec.rb +2 -3
  59. data/spec/item/respond_to_spec.rb +1 -1
  60. data/spec/item/save_spec.rb +7 -10
  61. data/spec/item/setter_spec.rb +2 -4
  62. data/spec/item/update_spec.rb +4 -7
  63. data/spec/item/validation_spec.rb +7 -9
  64. data/spec/proxy/load_spec.rb +0 -2
  65. data/spec/record/all_spec.rb +10 -12
  66. data/spec/record/build_spec.rb +0 -2
  67. data/spec/record/create_spec.rb +8 -10
  68. data/spec/record/creation_failed_spec.rb +4 -6
  69. data/spec/record/definitions_spec.rb +1 -3
  70. data/spec/record/endpoint_misconfiguration_spec.rb +2 -4
  71. data/spec/record/endpoint_options_spec.rb +0 -2
  72. data/spec/record/endpoints_spec.rb +1 -6
  73. data/spec/record/find_each_spec.rb +2 -4
  74. data/spec/record/find_in_batches_spec.rb +4 -6
  75. data/spec/record/find_spec.rb +10 -13
  76. data/spec/record/first_spec.rb +0 -3
  77. data/spec/record/includes_spec.rb +15 -20
  78. data/spec/record/mapping_spec.rb +13 -15
  79. data/spec/record/model_name_spec.rb +0 -2
  80. data/spec/record/new_spec.rb +4 -2
  81. data/spec/record/request_spec.rb +1 -3
  82. data/spec/record/where_spec.rb +1 -3
  83. data/spec/spec_helper.rb +1 -1
  84. data/spec/support/cleanup_configuration.rb +0 -2
  85. data/spec/support/cleanup_endpoints.rb +0 -1
  86. data/spec/support/cleanup_records.rb +0 -2
  87. metadata +26 -4
  88. data/cider-ci/contexts/rspec.yml +0 -16
  89. data/cider-ci/jobs/tests.yml +0 -27
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
-
5
4
  before(:each) do
6
5
  class Record < LHS::Record
7
6
  endpoint ':datastore/v2/:campaign_id/feedbacks'
@@ -10,11 +9,10 @@ describe LHS::Item do
10
9
  end
11
10
 
12
11
  let(:data) do
13
- LHS::Data.new({addresses: [{business: {identities: [{name: 'Löwenzorn'}]}}]}, nil, Record)
12
+ LHS::Data.new({ addresses: [{ business: { identities: [{ name: 'Löwenzorn' }] } }] }, nil, Record)
14
13
  end
15
14
 
16
15
  context 'item getter' do
17
-
18
16
  it 'returns a collection if you access an array' do
19
17
  expect(data.addresses).to be_kind_of(LHS::Data)
20
18
  expect(data.addresses._proxy).to be_kind_of(LHS::Collection)
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
-
5
4
  before(:each) do
6
5
  class Feedback < LHS::Record
7
6
  endpoint ':datastore/v2/feedbacks'
@@ -10,7 +9,7 @@ describe LHS::Item do
10
9
  end
11
10
 
12
11
  let(:hash) do
13
- {'addresses' => [{'businesses' => {'identities' => [{'name' => 'Löwenzorn'}]}}]}
12
+ { 'addresses' => [{ 'businesses' => { 'identities' => [{ 'name' => 'Löwenzorn' }] } }] }
14
13
  end
15
14
 
16
15
  let(:data) do
@@ -32,7 +31,7 @@ describe LHS::Item do
32
31
  it 'deep symbolizes internal data when building new objects' do
33
32
  feedback = Feedback.build('name' => 'BB8')
34
33
  expect(feedback._data._raw.keys).to include(:name)
35
- end
34
+ end
36
35
 
37
36
  it 'can handle ActionController::Parameters' do
38
37
  params = ActionController::Parameters.new('name' => 'Han')
@@ -2,7 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
4
  let(:item){
5
- described_class.new({id: 1234})
5
+ described_class.new(id: 1234)
6
6
  }
7
7
 
8
8
  context '#respond_to?' do
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
-
5
4
  before(:each) do
6
5
  class Record < LHS::Record
7
6
  endpoint ':datastore/v2/:campaign_id/feedbacks'
@@ -22,7 +21,6 @@ describe LHS::Item do
22
21
  end
23
22
 
24
23
  context 'save' do
25
-
26
24
  it 'persists changes on the backend' do
27
25
  stub_request(:post, item.href).with(body: item._raw.merge(name: 'Steve').to_json)
28
26
  item.name = 'Steve'
@@ -31,27 +29,26 @@ describe LHS::Item do
31
29
 
32
30
  it 'returns false if persting goes wrong' do
33
31
  stub_request(:post, item.href)
34
- .with(body: item._raw.to_json)
35
- .to_return(status: 500)
32
+ .with(body: item._raw.to_json)
33
+ .to_return(status: 500)
36
34
  expect(item.save).to eq false
37
35
  end
38
36
 
39
37
  it 'merges reponse data with object' do
40
38
  stub_request(:post, item.href)
41
- .with(body: item._raw.to_json)
42
- .to_return(status: 200, body: item._raw.merge(name: 'Steve').to_json)
39
+ .with(body: item._raw.to_json)
40
+ .to_return(status: 200, body: item._raw.merge(name: 'Steve').to_json)
43
41
  item.save
44
42
  expect(item.name).to eq 'Steve'
45
43
  end
46
44
  end
47
45
 
48
46
  context 'save!' do
49
-
50
47
  it 'raises if something goes wrong' do
51
48
  stub_request(:post, item.href)
52
- .with(body: item._raw.to_json)
53
- .to_return(status: 500)
54
- expect(->{ item.save! }).to raise_error LHC::ServerError
49
+ .with(body: item._raw.to_json)
50
+ .to_return(status: 500)
51
+ expect(-> { item.save! }).to raise_error LHC::ServerError
55
52
  end
56
53
  end
57
54
  end
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
-
5
4
  before(:each) do
6
5
  class Record < LHS::Record
7
6
  endpoint ':datastore/v2/:campaign_id/feedbacks'
@@ -22,16 +21,15 @@ describe LHS::Item do
22
21
  end
23
22
 
24
23
  context 'item setter' do
25
-
26
24
  it 'sets the value for an existing attribute' do
27
- expect(item.name = 'Steve').to eq 'Steve'
25
+ expect((item.name = 'Steve')).to eq 'Steve'
28
26
  expect(item.name).to eq 'Steve'
29
27
  expect(item._raw[:name]).to eq 'Steve'
30
28
  end
31
29
 
32
30
  it 'sets things to nil' do
33
31
  item.name = 'Steve'
34
- expect(item.name = nil).to eq nil
32
+ expect((item.name = nil)).to eq nil
35
33
  expect(item.name).to eq nil
36
34
  end
37
35
  end
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
-
5
4
  before(:each) do
6
5
  class Record < LHS::Record
7
6
  endpoint ':datastore/v2/:campaign_id/feedbacks'
@@ -22,10 +21,9 @@ describe LHS::Item do
22
21
  end
23
22
 
24
23
  context 'update' do
25
-
26
24
  it 'persists changes on the backend' do
27
25
  stub_request(:post, item.href)
28
- .with(body: item._raw.merge(name: 'Steve').to_json)
26
+ .with(body: item._raw.merge(name: 'Steve').to_json)
29
27
  result = item.update(name: 'Steve')
30
28
  expect(result).to eq true
31
29
  end
@@ -53,12 +51,11 @@ describe LHS::Item do
53
51
  end
54
52
 
55
53
  context 'update!' do
56
-
57
54
  it 'raises if something goes wrong' do
58
55
  stub_request(:post, item.href)
59
- .with(body: item._raw.merge(name: 'Steve').to_json)
60
- .to_return(status: 500)
61
- expect(->{ item.update!(name: 'Steve') }).to raise_error LHC::ServerError
56
+ .with(body: item._raw.merge(name: 'Steve').to_json)
57
+ .to_return(status: 500)
58
+ expect(-> { item.update!(name: 'Steve') }).to raise_error LHC::ServerError
62
59
  end
63
60
  end
64
61
  end
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Item do
4
-
5
4
  let(:datastore) { 'http://local.ch' }
6
5
 
7
6
  before(:each) do
@@ -13,8 +12,8 @@ describe LHS::Item do
13
12
  end
14
13
 
15
14
  let(:mock_validation) do
16
- successful_validation
17
- end
15
+ successful_validation
16
+ end
18
17
 
19
18
  let(:successful_validation) do
20
19
  stub_request(:post, "#{datastore}/v2/users?persist=false").to_return(body: '{}')
@@ -23,10 +22,10 @@ describe LHS::Item do
23
22
  let(:failing_validation) do
24
23
  stub_request(:post, "#{datastore}/v2/users?persist=false")
25
24
  .to_return(status: 400,
26
- body: {
27
- field_errors: [{code: "UNSUPPORTED_PROPERTY_VALUE", "path" => [ "email" ]}]
28
- }.to_json
29
- )
25
+ body: {
26
+ field_errors: [{ code: "UNSUPPORTED_PROPERTY_VALUE", "path" => ["email"] }]
27
+ }.to_json
28
+ )
30
29
  end
31
30
 
32
31
  context 'valid data' do
@@ -48,7 +47,6 @@ describe LHS::Item do
48
47
  end
49
48
 
50
49
  context 'invalid data' do
51
-
52
50
  let(:user) do
53
51
  User.build(email: 'im not an email address')
54
52
  end
@@ -79,7 +77,7 @@ describe LHS::Item do
79
77
  end
80
78
 
81
79
  it 'fails when trying to use an endpoint for validations that does not support it' do
82
- expect(->{
80
+ expect(lambda {
83
81
  Favorite.build.valid?
84
82
  }).to raise_error('Endpoint does not support validations!')
85
83
  end
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Proxy do
4
-
5
4
  before(:each) do
6
5
  class Record < LHS::Record
7
6
  endpoint ':datastore/v2/feedbacks'
@@ -30,7 +29,6 @@ describe LHS::Proxy do
30
29
  end
31
30
 
32
31
  context 'load' do
33
-
34
32
  it 'is loading data remotely when not present yet' do
35
33
  expect(link.load!.id).to be
36
34
  expect(link.id).to be
@@ -1,7 +1,6 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Collection do
4
-
5
4
  let(:datastore) { 'http://local.ch/v2' }
6
5
 
7
6
  before(:each) do
@@ -13,41 +12,40 @@ describe LHS::Collection do
13
12
  end
14
13
 
15
14
  context 'all' do
16
-
17
15
  it 'fetches all records from the backend' do
18
16
  stub_request(:get, "#{datastore}/feedbacks?limit=100")
19
- .to_return(status: 200, body: {items: (1..100).to_a, total: 300, limit: 100, offset: 0}.to_json)
17
+ .to_return(status: 200, body: { items: (1..100).to_a, total: 300, limit: 100, offset: 0 }.to_json)
20
18
  stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=101")
21
- .to_return(status: 200, body: {items: (101..200).to_a, total: 300, limit: 100, offset: 101}.to_json)
19
+ .to_return(status: 200, body: { items: (101..200).to_a, total: 300, limit: 100, offset: 101 }.to_json)
22
20
  stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=201")
23
- .to_return(status: 200, body: {items: (201..300).to_a, total: 300, limit: 100, offset: 201}.to_json)
21
+ .to_return(status: 200, body: { items: (201..300).to_a, total: 300, limit: 100, offset: 201 }.to_json)
24
22
  all = Record.all
25
23
  expect(all).to be_kind_of Record
26
- expect(all._proxy).to be_kind_of LHS::Collection
24
+ expect(all._proxy).to be_kind_of described_class
27
25
  expect(all.count).to eq 300
28
26
  expect(all.last).to eq 300
29
27
  end
30
28
 
31
29
  it 'also fetches all when there is not meta information for limit' do
32
30
  stub_request(:get, "#{datastore}/feedbacks?limit=100")
33
- .to_return(status: 200, body: {items: (1..100).to_a, total: 300, offset: 0}.to_json)
31
+ .to_return(status: 200, body: { items: (1..100).to_a, total: 300, offset: 0 }.to_json)
34
32
  stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=101")
35
- .to_return(status: 200, body: {items: (101..200).to_a, total: 300, offset: 101}.to_json)
33
+ .to_return(status: 200, body: { items: (101..200).to_a, total: 300, offset: 101 }.to_json)
36
34
  stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=201")
37
- .to_return(status: 200, body: {items: (201..300).to_a, total: 300, offset: 201}.to_json)
35
+ .to_return(status: 200, body: { items: (201..300).to_a, total: 300, offset: 201 }.to_json)
38
36
  all = Record.all
39
37
  expect(all).to be_kind_of Record
40
- expect(all._proxy).to be_kind_of LHS::Collection
38
+ expect(all._proxy).to be_kind_of described_class
41
39
  expect(all.count).to eq 300
42
40
  expect(all.last).to eq 300
43
41
  end
44
42
 
45
43
  it 'also works when there is no item in the first response' do
46
44
  stub_request(:get, "#{datastore}/feedbacks?limit=100")
47
- .to_return(status: 200, body: {items: [], total: 300, offset: 0}.to_json)
45
+ .to_return(status: 200, body: { items: [], total: 300, offset: 0 }.to_json)
48
46
  all = Record.all
49
47
  expect(all).to be_kind_of Record
50
- expect(all._proxy).to be_kind_of LHS::Collection
48
+ expect(all._proxy).to be_kind_of described_class
51
49
  expect(all.count).to eq 0
52
50
  end
53
51
  end
@@ -1,9 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Record do
4
-
5
4
  context 'build' do
6
-
7
5
  let(:datastore) { 'http://local.ch/v2' }
8
6
 
9
7
  before(:each) do
@@ -1,9 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Record do
4
-
5
4
  context 'create' do
6
-
7
5
  let(:datastore) { 'http://local.ch/v2' }
8
6
 
9
7
  before(:each) do
@@ -33,16 +31,16 @@ describe LHS::Record do
33
31
 
34
32
  it 'uses proper endpoint when creating data' do
35
33
  stub_request(:post, "#{datastore}/content-ads/12345/feedbacks")
36
- .with(body: object.to_json)
37
- .to_return(status: 200, body: object.to_json)
34
+ .with(body: object.to_json)
35
+ .to_return(status: 200, body: object.to_json)
38
36
  Feedback.create(object.merge(campaign_id: '12345'))
39
37
  end
40
38
 
41
39
  it 'merges backend response object with object' do
42
40
  body = object.merge(additional_key: 1)
43
41
  stub_request(:post, "#{datastore}/content-ads/12345/feedbacks")
44
- .with(body: object.to_json)
45
- .to_return(status: 200, body: body.to_json)
42
+ .with(body: object.to_json)
43
+ .to_return(status: 200, body: body.to_json)
46
44
  data = Feedback.create(object.merge(campaign_id: '12345'))
47
45
  expect(data.additional_key).to eq 1
48
46
  end
@@ -55,9 +53,9 @@ describe LHS::Record do
55
53
  {
56
54
  "name" => "ratings",
57
55
  "details" => [{ "code" => "REQUIRED_PROPERTY_VALUE" }]
58
- },{
56
+ }, {
59
57
  "name" => "recommended",
60
- "details" => [{"code" => "REQUIRED_PROPERTY_VALUE"}]
58
+ "details" => [{ "code" => "REQUIRED_PROPERTY_VALUE" }]
61
59
  }
62
60
  ]
63
61
  }
@@ -72,8 +70,8 @@ describe LHS::Record do
72
70
 
73
71
  it 'raises an exception when creation failed using create!' do
74
72
  stub_request(:post, "#{datastore}/content-ads/12345/feedbacks")
75
- .to_return(status: 400, body: creation_error.to_json)
76
- expect(->{
73
+ .to_return(status: 400, body: creation_error.to_json)
74
+ expect(lambda {
77
75
  Feedback.create!(object.merge(campaign_id: '12345'))
78
76
  }).to raise_error
79
77
  end
@@ -1,9 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Record do
4
-
5
4
  context 'creation failed' do
6
-
7
5
  let(:datastore) { 'http://local.ch/v2' }
8
6
 
9
7
  before(:each) do
@@ -24,9 +22,9 @@ describe LHS::Record do
24
22
  {
25
23
  "name" => "ratings",
26
24
  "details" => [{ "code" => "REQUIRED_PROPERTY_VALUE" }]
27
- },{
25
+ }, {
28
26
  "name" => "recommended",
29
- "details" => [{"code" => "REQUIRED_PROPERTY_VALUE"}]
27
+ "details" => [{ "code" => "REQUIRED_PROPERTY_VALUE" }]
30
28
  }
31
29
  ]
32
30
  }
@@ -42,13 +40,13 @@ describe LHS::Record do
42
40
  expect(record.errors.include?(:ratings)).to eq true
43
41
  expect(record.errors.include?(:recommended)).to eq true
44
42
  expect(record.errors[:ratings]).to eq ['REQUIRED_PROPERTY_VALUE']
45
- expect(record.errors.messages).to eq({:ratings=>["REQUIRED_PROPERTY_VALUE"], :recommended=>["REQUIRED_PROPERTY_VALUE"]})
43
+ expect(record.errors.messages).to eq(ratings: ["REQUIRED_PROPERTY_VALUE"], recommended: ["REQUIRED_PROPERTY_VALUE"])
46
44
  expect(record.errors.message).to eq error_message
47
45
  end
48
46
 
49
47
  it 'doesnt fail when no fields are provided by the backend' do
50
48
  stub_request(:post, "#{datastore}/feedbacks")
51
- .to_return(status: 400, body: {}.to_json)
49
+ .to_return(status: 400, body: {}.to_json)
52
50
  Record.create(name: 'Steve')
53
51
  end
54
52
  end
@@ -1,9 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Record do
4
-
5
4
  context 'definitions' do
6
-
7
5
  let(:datastore) { 'http://local.ch/v2' }
8
6
 
9
7
  before(:each) do
@@ -21,7 +19,7 @@ describe LHS::Record do
21
19
  end
22
20
  end
23
21
  stub_request(:get, "#{datastore}/local-entries/1")
24
- .to_return(status: 200, body: {addresses: [{business: {identities: [{name: 'Löwenzorn'}]}}]}.to_json)
22
+ .to_return(status: 200, body: { addresses: [{ business: { identities: [{ name: 'Löwenzorn' }] } }] }.to_json)
25
23
  entry = LocalEntry.find(1)
26
24
  expect(entry.name).to eq 'Löwenzorn'
27
25
  end
@@ -1,12 +1,10 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Record do
4
-
5
4
  context 'misconfiguration of endpoints' do
6
-
7
5
  it 'fails trying to add clashing endpoints' do
8
6
  expect(
9
- ->{
7
+ lambda {
10
8
  class Record < LHS::Record
11
9
  endpoint ':datastore/v2/feedbacks'
12
10
  endpoint ':datastore/v2/reviews'
@@ -14,7 +12,7 @@ describe LHS::Record do
14
12
  }
15
13
  ).to raise_error('Clashing endpoints.')
16
14
  expect(
17
- ->{
15
+ lambda {
18
16
  class Record < LHS::Record
19
17
  endpoint ':datastore/v2/:campaign_id/feedbacks'
20
18
  endpoint ':datastore/v2/:campaign_id/reviews'
@@ -1,9 +1,7 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe LHS::Record do
4
-
5
4
  context 'set options for an endpoint' do
6
-
7
5
  before(:each) do
8
6
  class Record < LHS::Record
9
7
  endpoint 'backend/v2/feedbacks/:id', cache_expires_in: 1.day, retry: 2, cache: true