forest_liana 6.6.0 → 7.0.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/forest_liana/actions_controller.rb +44 -29
  3. data/app/controllers/forest_liana/application_controller.rb +2 -2
  4. data/app/controllers/forest_liana/associations_controller.rb +1 -1
  5. data/app/controllers/forest_liana/base_controller.rb +1 -1
  6. data/app/controllers/forest_liana/resources_controller.rb +7 -6
  7. data/app/serializers/forest_liana/intercom_attribute_serializer.rb +1 -1
  8. data/app/serializers/forest_liana/intercom_conversation_serializer.rb +1 -1
  9. data/app/serializers/forest_liana/mixpanel_event_serializer.rb +1 -1
  10. data/app/serializers/forest_liana/serializer_factory.rb +1 -1
  11. data/app/serializers/forest_liana/stat_serializer.rb +1 -1
  12. data/app/serializers/forest_liana/stripe_bank_account_serializer.rb +1 -1
  13. data/app/serializers/forest_liana/stripe_card_serializer.rb +1 -1
  14. data/app/serializers/forest_liana/stripe_invoice_serializer.rb +1 -1
  15. data/app/serializers/forest_liana/stripe_payment_serializer.rb +1 -1
  16. data/app/serializers/forest_liana/stripe_subscription_serializer.rb +1 -1
  17. data/app/services/forest_liana/apimap_sorter.rb +1 -0
  18. data/app/services/forest_liana/permissions_checker.rb +40 -34
  19. data/app/services/forest_liana/permissions_formatter.rb +1 -1
  20. data/app/services/forest_liana/permissions_getter.rb +1 -4
  21. data/app/services/forest_liana/smart_action_field_validator.rb +49 -0
  22. data/config/initializers/errors.rb +17 -0
  23. data/lib/forest_liana/bootstrapper.rb +2 -2
  24. data/lib/forest_liana/schema_file_updater.rb +8 -0
  25. data/lib/forest_liana/version.rb +1 -1
  26. data/spec/lib/forest_liana/schema_file_updater_spec.rb +94 -0
  27. data/spec/requests/actions_controller_spec.rb +22 -20
  28. data/spec/services/forest_liana/permissions_checker_acl_disabled_spec.rb +45 -69
  29. data/spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb +39 -63
  30. data/spec/services/forest_liana/permissions_checker_live_queries_spec.rb +3 -3
  31. data/spec/services/forest_liana/permissions_formatter_spec.rb +11 -11
  32. data/spec/services/forest_liana/smart_action_field_validator_spec.rb +70 -0
  33. metadata +119 -117
  34. data/app/helpers/forest_liana/is_same_data_structure_helper.rb +0 -44
  35. data/spec/helpers/forest_liana/is_same_data_structure_helper_spec.rb +0 -87
@@ -50,7 +50,8 @@ module ForestLiana
50
50
  })
51
51
  ]
52
52
  }
53
- let(:scope_permissions) { nil }
53
+ let(:default_rendering_id) { 1 }
54
+ let(:segments_permissions) { { default_rendering_id => { 'segments' => nil } } }
54
55
  let(:default_api_permissions) {
55
56
  {
56
57
  "data" => {
@@ -116,14 +117,16 @@ module ForestLiana
116
117
  }
117
118
  },
118
119
  },
119
- 'renderings' => scope_permissions
120
+ 'renderings' => segments_permissions
121
+ },
122
+ "stats" => {
123
+ "queries"=>[],
120
124
  },
121
125
  "meta" => {
122
126
  "rolesACLActivated" => true
123
127
  }
124
128
  }
125
129
  }
126
- let(:default_rendering_id) { 1 }
127
130
 
128
131
  before do
129
132
  allow(ForestLiana).to receive(:apimap).and_return(schema)
@@ -174,7 +177,7 @@ module ForestLiana
174
177
  end
175
178
 
176
179
  let(:collection_name) { 'custom' }
177
- let(:scope_permissions) { { default_rendering_id => { 'custom' => nil }, 2 => { 'custom' => nil } } }
180
+ let(:segments_permissions) { { default_rendering_id => { 'custom' => nil }, 2 => { 'custom' => nil } } }
178
181
  let(:api_permissions_rendering_1) {
179
182
  {
180
183
  "data" => {
@@ -191,7 +194,7 @@ module ForestLiana
191
194
  "actions" => { }
192
195
  },
193
196
  },
194
- 'renderings' => scope_permissions
197
+ 'renderings' => segments_permissions
195
198
  },
196
199
  "meta" => {
197
200
  "rolesACLActivated" => true
@@ -242,10 +245,10 @@ module ForestLiana
242
245
  end
243
246
  end
244
247
 
245
- context 'scopes cache' do
248
+ context 'renderings cache' do
246
249
  let(:rendering_id) { 1 }
247
250
  let(:collection_name) { 'custom' }
248
- let(:scope_permissions) { { rendering_id => { 'custom' => nil } } }
251
+ let(:segments_permissions) { { rendering_id => { 'custom' => nil } } }
249
252
  let(:api_permissions) {
250
253
  {
251
254
  "data" => {
@@ -262,18 +265,18 @@ module ForestLiana
262
265
  "actions" => { }
263
266
  },
264
267
  },
265
- 'renderings' => scope_permissions
268
+ 'renderings' => segments_permissions
266
269
  },
267
270
  "meta" => {
268
271
  "rolesACLActivated" => true
269
272
  }
270
273
  }
271
274
  }
272
- let(:api_permissions_scope_only) {
275
+ let(:api_permissions_rendering_only) {
273
276
  {
274
277
  "data" => {
275
278
  'collections' => { },
276
- 'renderings' => scope_permissions
279
+ 'renderings' => segments_permissions
277
280
  },
278
281
  "meta" => {
279
282
  "rolesACLActivated" => true
@@ -283,13 +286,13 @@ module ForestLiana
283
286
 
284
287
  before do
285
288
  allow(ForestLiana::PermissionsGetter).to receive(:get_permissions_for_rendering).with(rendering_id).and_return(api_permissions)
286
- allow(ForestLiana::PermissionsGetter).to receive(:get_permissions_for_rendering).with(rendering_id, rendering_specific_only: true).and_return(api_permissions_scope_only)
289
+ allow(ForestLiana::PermissionsGetter).to receive(:get_permissions_for_rendering).with(rendering_id, rendering_specific_only: true).and_return(api_permissions_rendering_only)
287
290
  end
288
291
 
289
292
  context 'when checking once for authorization' do
290
293
  context 'when checking browseEnabled' do
291
294
  context 'when expiration value is set to its default' do
292
- it 'should not call the API to refresh the scopes cache' do
295
+ it 'should not call the API to refresh the renderings cache' do
293
296
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
294
297
 
295
298
  expect(ForestLiana::PermissionsGetter).to have_received(:get_permissions_for_rendering).with(rendering_id).once
@@ -304,7 +307,7 @@ module ForestLiana
304
307
  described_class.empty_cache
305
308
  end
306
309
 
307
- it 'should call the API to refresh the scopes cache' do
310
+ it 'should call the API to refresh the renderings cache' do
308
311
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
309
312
 
310
313
  expect(ForestLiana::PermissionsGetter).to have_received(:get_permissions_for_rendering).with(rendering_id).once
@@ -313,7 +316,7 @@ module ForestLiana
313
316
  end
314
317
  end
315
318
 
316
- # Only browse permission requires scopes
319
+ # Only browse permission requires segments
317
320
  context 'when checking exportEnabled' do
318
321
  context 'when expiration value is set in the past' do
319
322
  before do
@@ -323,7 +326,7 @@ module ForestLiana
323
326
  end
324
327
  end
325
328
 
326
- it 'should NOT call the API to refresh the scopes cache' do
329
+ it 'should NOT call the API to refresh the rendering cache' do
327
330
  described_class.new(fake_ressource, 'exportEnabled', rendering_id, user_id: user_id).is_authorized?
328
331
 
329
332
  expect(ForestLiana::PermissionsGetter).to have_received(:get_permissions_for_rendering).with(rendering_id).once
@@ -334,8 +337,8 @@ module ForestLiana
334
337
 
335
338
  context 'when checking twice for authorization' do
336
339
  context 'on the same rendering' do
337
- context 'when scopes permission has NOT expired' do
338
- it 'should NOT call the API to refresh the scopes permissions' do
340
+ context 'when rendering permission has NOT expired' do
341
+ it 'should NOT call the API to refresh the rendering permissions' do
339
342
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
340
343
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
341
344
 
@@ -344,14 +347,14 @@ module ForestLiana
344
347
  end
345
348
  end
346
349
 
347
- context 'when scopes permission has expired' do
350
+ context 'when renderings permission has expired' do
348
351
  before do
349
352
  allow(ENV).to receive(:[]).with('FOREST_PERMISSIONS_EXPIRATION_IN_SECONDS').and_return('-1')
350
353
  # Needed to enforce ENV stub
351
354
  described_class.empty_cache
352
355
  end
353
356
 
354
- it 'should call the API to refresh the scopes permissions' do
357
+ it 'should call the API to refresh the rendering permissions' do
355
358
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
356
359
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
357
360
 
@@ -363,14 +366,17 @@ module ForestLiana
363
366
 
364
367
  context 'on two different renderings' do
365
368
  let(:other_rendering_id) { 2 }
366
- let(:api_permissions_scope_only) {
369
+ let(:api_permissions_rendering_only) {
367
370
  {
368
371
  "data" => {
369
372
  'collections' => { },
370
373
  'renderings' => {
371
- '2' => { 'custom' => nil }
374
+ other_rendering_id => { 'custom' => nil }
372
375
  }
373
376
  },
377
+ "stats" => {
378
+ "somestats" => [],
379
+ },
374
380
  "meta" => {
375
381
  "rolesACLActivated" => true
376
382
  }
@@ -378,10 +384,10 @@ module ForestLiana
378
384
  }
379
385
 
380
386
  before do
381
- allow(ForestLiana::PermissionsGetter).to receive(:get_permissions_for_rendering).with(other_rendering_id, rendering_specific_only: true).and_return(api_permissions_scope_only)
387
+ allow(ForestLiana::PermissionsGetter).to receive(:get_permissions_for_rendering).with(other_rendering_id, rendering_specific_only: true).and_return(api_permissions_rendering_only)
382
388
  end
383
389
 
384
- it 'should call the API to refresh the scopes permissions' do
390
+ it 'should call the API to refresh the rendering permissions' do
385
391
  described_class.new(fake_ressource, 'browseEnabled', rendering_id, user_id: user_id).is_authorized?
386
392
  described_class.new(fake_ressource, 'browseEnabled', other_rendering_id, user_id: user_id).is_authorized?
387
393
 
@@ -452,58 +458,28 @@ module ForestLiana
452
458
  end
453
459
  end
454
460
 
455
- context 'when scopes are defined' do
461
+ context 'when segments are defined' do
456
462
  let(:default_rendering_id) { 1 }
457
- let(:scope_permissions) {
463
+ let(:segments_permissions) {
458
464
  {
459
465
  default_rendering_id => {
460
466
  collection_name => {
461
- 'scope' => {
462
- 'dynamicScopesValues' => {},
463
- 'filter' => { 'aggregator' => 'and', 'conditions' => [condition] }
464
- }
467
+ 'segments' => ['SELECT * FROM products;', 'SELECT * FROM sellers;']
465
468
  }
466
469
  }
467
470
  }
468
471
  }
469
- let(:collection_list_parameters) { { :user_id => "1", :filters => JSON.generate(condition) } }
472
+ let(:collection_list_parameters) { { :user_id => "1", :segmentQuery => segmentQuery } }
470
473
 
471
- context 'when scopes are passing validation' do
472
- context 'when scope value is a string' do
473
- let(:condition) { { 'field' => 'field_1', 'operator' => 'equal', 'value' => true } }
474
-
475
- it 'should return true' do
476
- expect(subject.is_authorized?).to be true
477
- end
478
- end
479
-
480
- context 'when scope value is a boolean' do
481
- let(:condition) { { 'field' => 'field_1', 'operator' => 'equal', 'value' => 'true' } }
482
-
483
- it 'should return true' do
484
- expect(subject.is_authorized?).to be true
485
- end
474
+ context 'when segments are passing validation' do
475
+ let(:segmentQuery) { 'SELECT * FROM products;' }
476
+ it 'should return true' do
477
+ expect(subject.is_authorized?).to be true
486
478
  end
487
479
  end
488
480
 
489
- context 'when scopes are NOT passing validation' do
490
- let(:condition) { { 'field' => 'field_1', 'operator' => 'equal', 'value' => true } }
491
- let(:other_condition) {
492
- {
493
- aggregator: 'and',
494
- conditions: [
495
- { field: 'name', value: 'john', operator: 'equal' },
496
- { field: 'price', value: '2500', operator: 'equal' }
497
- ]
498
- }
499
- }
500
- let(:collection_list_parameters) {
501
- {
502
- :user_id => "1",
503
- :filters => JSON.generate(other_condition)
504
- }
505
- }
506
-
481
+ context 'when segments are NOT passing validation' do
482
+ let(:segmentQuery) { 'SELECT * FROM rockets WHERE name = "Starship";' }
507
483
  it 'should return false' do
508
484
  expect(subject.is_authorized?).to be false
509
485
  end
@@ -20,7 +20,8 @@ module ForestLiana
20
20
  })
21
21
  ]
22
22
  }
23
- let(:scope_permissions) { nil }
23
+ let(:default_rendering_id) { 1 }
24
+ let(:segments_permissions) { { default_rendering_id => { 'segments' => nil } } }
24
25
  let(:default_api_permissions) {
25
26
  {
26
27
  "data" => {
@@ -41,7 +42,7 @@ module ForestLiana
41
42
  }
42
43
  },
43
44
  },
44
- 'renderings' => scope_permissions
45
+ 'renderings' => segments_permissions
45
46
  },
46
47
  "meta" => {
47
48
  "rolesACLActivated" => true
@@ -61,7 +62,6 @@ module ForestLiana
61
62
  },
62
63
  }
63
64
  }
64
- let(:default_rendering_id) { 1 }
65
65
 
66
66
  before do
67
67
  allow(ForestLiana).to receive(:apimap).and_return(schema)
@@ -14,7 +14,7 @@ module ForestLiana
14
14
  }
15
15
  }
16
16
  let(:old_format_action_permissions) { { 'allowed' => true, 'users' => nil } }
17
- let(:old_format_scope_permissions) { nil }
17
+ let(:old_format_segments_permissions) { nil }
18
18
  let(:old_format_permissions) {
19
19
  {
20
20
  'collection_1' => {
@@ -22,7 +22,7 @@ module ForestLiana
22
22
  'actions' => {
23
23
  'action_1' => old_format_action_permissions
24
24
  },
25
- 'scope' => old_format_scope_permissions
25
+ 'segments' => old_format_segments_permissions
26
26
  }
27
27
  }
28
28
  }
@@ -197,22 +197,22 @@ module ForestLiana
197
197
  end
198
198
  end
199
199
 
200
- describe 'scope permissions' do
201
- subject { converted_permission['renderings'][rendering_id]['collection_1']['scope'] }
202
- let(:expected_new_format_permissions) { old_format_scope_permissions }
200
+ describe 'segments permissions' do
201
+ subject { converted_permission['renderings'][rendering_id]['collection_1']['segments'] }
202
+ let(:expected_new_format_permissions) { old_format_segments_permissions }
203
203
 
204
- context 'when scope permissions are set' do
205
- let(:old_format_scope_permissions) { { 'dynamicScopesValues' => {}, 'filter' => { 'aggregator' => 'and', 'conditions' => [{ 'field' => 'field_1', 'operator' => 'equal', 'value' => true }] } } }
204
+ context 'when segments permissions are set' do
205
+ let(:old_format_segments_permissions) { ['segmentQuery1', 'segmentQuery2'] }
206
206
 
207
- it 'expected scope permissions should be set' do
207
+ it 'expected segments permissions should be set' do
208
208
  expect(subject).to eq expected_new_format_permissions
209
209
  end
210
210
  end
211
211
 
212
- context 'when scope permissions are nil' do
213
- let(:old_format_scope_permissions) { nil }
212
+ context 'when segments permissions are nil' do
213
+ let(:old_format_segments_permissions) { nil }
214
214
 
215
- it 'expected scope permissions should be nil' do
215
+ it 'expected segments permissions should be nil' do
216
216
  expect(subject).to eq expected_new_format_permissions
217
217
  end
218
218
  end
@@ -0,0 +1,70 @@
1
+ module ForestLiana
2
+ describe SmartActionFieldValidator do
3
+ describe "self.validate_field" do
4
+ it "should raise an SmartActionInvalidFieldError with nil field" do
5
+ expect { SmartActionFieldValidator.validate_field(nil, "actionName") }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldError, 'Error while parsing action "actionName": The field attribute must be defined')
6
+ end
7
+
8
+ it "should raise an SmartActionInvalidFieldError with a field that is not a string" do
9
+ expect { SmartActionFieldValidator.validate_field({
10
+ :field => 5
11
+ }, "actionName") }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldError, 'Error while parsing action "actionName": The field attribute must be a string.')
12
+ end
13
+
14
+ it "should raise an SmartActionInvalidFieldError with description that is not a string" do
15
+ expect { SmartActionFieldValidator.validate_field({
16
+ :field => "field",
17
+ :description => 5
18
+ }, "actionName") }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldError, 'Error while parsing action "actionName" on field "field": The description attribute must be a string.')
19
+ end
20
+
21
+ it "should raise an SmartActionInvalidFieldError with an enums that is not an array" do
22
+ expect { SmartActionFieldValidator.validate_field({
23
+ :field => "field",
24
+ :enums => "NotAnArray"
25
+ }, "actionName") }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldError, 'Error while parsing action "actionName" on field "field": The enums attribute must be an array.')
26
+ end
27
+
28
+ it "should raise an SmartActionInvalidFieldError with a reference that is not a string" do
29
+ expect { SmartActionFieldValidator.validate_field({
30
+ :field => "field",
31
+ :type => "String",
32
+ :reference => 5
33
+ }, "actionName") }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldError, 'Error while parsing action "actionName" on field "field": The reference attribute must be a string.')
34
+ end
35
+
36
+ it "should raise an SmartActionInvalidFieldError with an invalid type" do
37
+ expect { SmartActionFieldValidator.validate_field({
38
+ :field => "field",
39
+ :type => "AbsolutelyNotAValidType"
40
+ }, "actionName") }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldError, 'Error while parsing action "actionName" on field "field": The type attribute must be a valid type. See the documentation for more information. https://docs.forestadmin.com/documentation/reference-guide/fields/create-and-manage-smart-fields#available-field-options.')
41
+ end
42
+
43
+ it "should not raise any error when everything is configured correctly" do
44
+ expect { SmartActionFieldValidator.validate_field({
45
+ :field => "field",
46
+ :type => "String",
47
+ :description => "field description"
48
+ }, "actionName") }.not_to raise_error
49
+ end
50
+ end
51
+
52
+ describe "self.validate_field_change_hook" do
53
+ it "should raise an SmartActionInvalidFieldHookError with an invalid type" do
54
+ expect { SmartActionFieldValidator.validate_field_change_hook({
55
+ :field => "field",
56
+ :type => "AbsolutelyNotAValidType",
57
+ :hook => "hookThatDoesNotExist"
58
+ }, "actionName", []) }.to raise_error(ForestLiana::Errors::SmartActionInvalidFieldHookError)
59
+ end
60
+
61
+ it "should not raise any error when everything is configured correctly" do
62
+ expect { SmartActionFieldValidator.validate_field_change_hook({
63
+ :field => "field",
64
+ :type => "AbsolutelyNotAValidType",
65
+ :hook => "on_field_changed"
66
+ }, "actionName", ["on_field_changed"]) }.not_to raise_error
67
+ end
68
+ end
69
+ end
70
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_liana
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.6.0
4
+ version: 7.0.0.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-09 00:00:00.000000000 Z
11
+ date: 2021-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: jsonapi-serializers
28
+ name: forestadmin-jsonapi-serializers
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -225,7 +225,6 @@ files:
225
225
  - app/helpers/forest_liana/adapter_helper.rb
226
226
  - app/helpers/forest_liana/application_helper.rb
227
227
  - app/helpers/forest_liana/decoration_helper.rb
228
- - app/helpers/forest_liana/is_same_data_structure_helper.rb
229
228
  - app/helpers/forest_liana/query_helper.rb
230
229
  - app/helpers/forest_liana/schema_helper.rb
231
230
  - app/helpers/forest_liana/widgets_helper.rb
@@ -283,6 +282,7 @@ files:
283
282
  - app/services/forest_liana/schema_utils.rb
284
283
  - app/services/forest_liana/scope_validator.rb
285
284
  - app/services/forest_liana/search_query_builder.rb
285
+ - app/services/forest_liana/smart_action_field_validator.rb
286
286
  - app/services/forest_liana/stat_getter.rb
287
287
  - app/services/forest_liana/stripe_base_getter.rb
288
288
  - app/services/forest_liana/stripe_invoice_getter.rb
@@ -368,10 +368,10 @@ files:
368
368
  - spec/dummy/db/schema.rb
369
369
  - spec/dummy/lib/forest_liana/collections/location.rb
370
370
  - spec/dummy/lib/forest_liana/collections/user.rb
371
- - spec/helpers/forest_liana/is_same_data_structure_helper_spec.rb
372
371
  - spec/helpers/forest_liana/query_helper_spec.rb
373
372
  - spec/helpers/forest_liana/schema_helper_spec.rb
374
373
  - spec/lib/forest_liana/bootstrapper_spec.rb
374
+ - spec/lib/forest_liana/schema_file_updater_spec.rb
375
375
  - spec/rails_helper.rb
376
376
  - spec/requests/actions_controller_spec.rb
377
377
  - spec/requests/authentications_spec.rb
@@ -388,6 +388,7 @@ files:
388
388
  - spec/services/forest_liana/permissions_getter_spec.rb
389
389
  - spec/services/forest_liana/resources_getter_spec.rb
390
390
  - spec/services/forest_liana/schema_adapter_spec.rb
391
+ - spec/services/forest_liana/smart_action_field_validator_spec.rb
391
392
  - spec/spec_helper.rb
392
393
  - test/dummy/README.rdoc
393
394
  - test/dummy/Rakefile
@@ -496,177 +497,178 @@ required_ruby_version: !ruby/object:Gem::Requirement
496
497
  version: '0'
497
498
  required_rubygems_version: !ruby/object:Gem::Requirement
498
499
  requirements:
499
- - - ">="
500
+ - - ">"
500
501
  - !ruby/object:Gem::Version
501
- version: '0'
502
+ version: 1.3.1
502
503
  requirements: []
503
504
  rubygems_version: 3.1.2
504
505
  signing_key:
505
506
  specification_version: 4
506
507
  summary: Official Rails Liana for Forest
507
508
  test_files:
509
+ - test/routing/route_test.rb
508
510
  - test/forest_liana_test.rb
509
- - test/test_helper.rb
510
- - test/services/forest_liana/has_many_getter_test.rb
511
- - test/services/forest_liana/pie_stat_getter_test.rb
511
+ - test/services/forest_liana/schema_adapter_test.rb
512
512
  - test/services/forest_liana/resource_updater_test.rb
513
- - test/services/forest_liana/value_stat_getter_test.rb
514
513
  - test/services/forest_liana/scope_validator_test.rb
515
- - test/services/forest_liana/schema_adapter_test.rb
516
514
  - test/services/forest_liana/operator_date_interval_parser_test.rb
517
- - test/routing/route_test.rb
515
+ - test/services/forest_liana/value_stat_getter_test.rb
516
+ - test/services/forest_liana/has_many_getter_test.rb
517
+ - test/services/forest_liana/pie_stat_getter_test.rb
518
518
  - test/fixtures/string_field.yml
519
- - test/fixtures/serialize_field.yml
519
+ - test/fixtures/reference.yml
520
520
  - test/fixtures/has_one_field.yml
521
- - test/fixtures/has_many_through_field.yml
521
+ - test/fixtures/tree.yml
522
+ - test/fixtures/serialize_field.yml
522
523
  - test/fixtures/has_many_field.yml
523
- - test/fixtures/reference.yml
524
524
  - test/fixtures/owner.yml
525
525
  - test/fixtures/belongs_to_field.yml
526
- - test/fixtures/tree.yml
526
+ - test/fixtures/has_many_through_field.yml
527
+ - test/dummy/README.rdoc
528
+ - test/dummy/config.ru
529
+ - test/dummy/Rakefile
527
530
  - test/dummy/db/schema.rb
528
531
  - test/dummy/db/migrate/20150608131610_create_float_field.rb
529
- - test/dummy/db/migrate/20150608131430_create_integer_field.rb
532
+ - test/dummy/db/migrate/20150623115554_create_has_many_class_name_field.rb
533
+ - test/dummy/db/migrate/20181111162121_create_references_table.rb
530
534
  - test/dummy/db/migrate/20170614141921_create_serialize_field.rb
535
+ - test/dummy/db/migrate/20150608133044_create_has_one_field.rb
531
536
  - test/dummy/db/migrate/20150609114636_create_belongs_to_class_name_field.rb
537
+ - test/dummy/db/migrate/20160627172951_create_tree.rb
532
538
  - test/dummy/db/migrate/20150608130516_create_date_field.rb
539
+ - test/dummy/db/migrate/20150608131430_create_integer_field.rb
540
+ - test/dummy/db/migrate/20150608133038_create_belongs_to_field.rb
533
541
  - test/dummy/db/migrate/20150612112520_create_has_and_belongs_to_many_field.rb
534
- - test/dummy/db/migrate/20150608132621_create_string_field.rb
535
542
  - test/dummy/db/migrate/20150608132159_create_boolean_field.rb
536
- - test/dummy/db/migrate/20150608133038_create_belongs_to_field.rb
537
- - test/dummy/db/migrate/20150623115554_create_has_many_class_name_field.rb
538
- - test/dummy/db/migrate/20181111162121_create_references_table.rb
539
- - test/dummy/db/migrate/20150814081918_create_has_many_through_field.rb
540
543
  - test/dummy/db/migrate/20160627172810_create_owner.rb
541
- - test/dummy/db/migrate/20160627172951_create_tree.rb
544
+ - test/dummy/db/migrate/20150616150629_create_polymorphic_field.rb
545
+ - test/dummy/db/migrate/20150608132621_create_string_field.rb
546
+ - test/dummy/db/migrate/20160628173505_add_timestamps.rb
542
547
  - test/dummy/db/migrate/20150608150016_create_has_many_field.rb
548
+ - test/dummy/db/migrate/20150814081918_create_has_many_through_field.rb
543
549
  - test/dummy/db/migrate/20150608131603_create_decimal_field.rb
544
- - test/dummy/db/migrate/20150608133044_create_has_one_field.rb
545
- - test/dummy/db/migrate/20160628173505_add_timestamps.rb
546
- - test/dummy/db/migrate/20150616150629_create_polymorphic_field.rb
547
- - test/dummy/config.ru
548
- - test/dummy/bin/rake
549
- - test/dummy/bin/setup
550
- - test/dummy/bin/bundle
551
- - test/dummy/bin/rails
552
- - test/dummy/config/routes.rb
550
+ - test/dummy/config/environment.rb
551
+ - test/dummy/config/secrets.yml
552
+ - test/dummy/config/application.rb
553
+ - test/dummy/config/environments/test.rb
554
+ - test/dummy/config/environments/development.rb
555
+ - test/dummy/config/environments/production.rb
553
556
  - test/dummy/config/boot.rb
554
- - test/dummy/config/initializers/mime_types.rb
557
+ - test/dummy/config/locales/en.yml
558
+ - test/dummy/config/database.yml
559
+ - test/dummy/config/initializers/cookies_serializer.rb
555
560
  - test/dummy/config/initializers/assets.rb
561
+ - test/dummy/config/initializers/backtrace_silencers.rb
562
+ - test/dummy/config/initializers/mime_types.rb
556
563
  - test/dummy/config/initializers/session_store.rb
557
564
  - test/dummy/config/initializers/wrap_parameters.rb
558
565
  - test/dummy/config/initializers/filter_parameter_logging.rb
559
- - test/dummy/config/initializers/cookies_serializer.rb
560
- - test/dummy/config/initializers/backtrace_silencers.rb
561
566
  - test/dummy/config/initializers/inflections.rb
562
- - test/dummy/config/locales/en.yml
563
- - test/dummy/config/secrets.yml
564
- - test/dummy/config/environment.rb
565
- - test/dummy/config/environments/production.rb
566
- - test/dummy/config/environments/development.rb
567
- - test/dummy/config/environments/test.rb
568
- - test/dummy/config/database.yml
569
- - test/dummy/config/application.rb
570
- - test/dummy/README.rdoc
571
- - test/dummy/Rakefile
572
- - test/dummy/public/favicon.ico
567
+ - test/dummy/config/routes.rb
568
+ - test/dummy/public/500.html
573
569
  - test/dummy/public/404.html
574
570
  - test/dummy/public/422.html
575
- - test/dummy/public/500.html
576
- - test/dummy/app/controllers/application_controller.rb
577
- - test/dummy/app/views/layouts/application.html.erb
578
- - test/dummy/app/helpers/application_helper.rb
579
- - test/dummy/app/assets/stylesheets/application.css
580
- - test/dummy/app/assets/config/manifest.js
581
- - test/dummy/app/assets/javascripts/application.js
571
+ - test/dummy/public/favicon.ico
582
572
  - test/dummy/app/models/boolean_field.rb
583
- - test/dummy/app/models/decimal_field.rb
584
- - test/dummy/app/models/date_field.rb
585
- - test/dummy/app/models/tree.rb
586
- - test/dummy/app/models/has_and_belongs_to_many_field.rb
587
- - test/dummy/app/models/owner.rb
588
- - test/dummy/app/models/belongs_to_class_name_field.rb
589
- - test/dummy/app/models/has_many_through_field.rb
590
573
  - test/dummy/app/models/float_field.rb
591
- - test/dummy/app/models/polymorphic_field.rb
592
- - test/dummy/app/models/has_one_field.rb
593
- - test/dummy/app/models/has_many_class_name_field.rb
594
- - test/dummy/app/models/belongs_to_field.rb
595
574
  - test/dummy/app/models/integer_field.rb
575
+ - test/dummy/app/models/reference.rb
576
+ - test/dummy/app/models/has_one_field.rb
577
+ - test/dummy/app/models/belongs_to_class_name_field.rb
578
+ - test/dummy/app/models/tree.rb
596
579
  - test/dummy/app/models/serialize_field.rb
580
+ - test/dummy/app/models/polymorphic_field.rb
581
+ - test/dummy/app/models/date_field.rb
597
582
  - test/dummy/app/models/string_field.rb
598
583
  - test/dummy/app/models/has_many_field.rb
599
- - test/dummy/app/models/reference.rb
600
- - spec/spec_helper.rb
601
- - spec/services/forest_liana/permissions_getter_spec.rb
602
- - spec/services/forest_liana/resources_getter_spec.rb
584
+ - test/dummy/app/models/has_and_belongs_to_many_field.rb
585
+ - test/dummy/app/models/has_many_class_name_field.rb
586
+ - test/dummy/app/models/decimal_field.rb
587
+ - test/dummy/app/models/owner.rb
588
+ - test/dummy/app/models/belongs_to_field.rb
589
+ - test/dummy/app/models/has_many_through_field.rb
590
+ - test/dummy/app/helpers/application_helper.rb
591
+ - test/dummy/app/views/layouts/application.html.erb
592
+ - test/dummy/app/assets/javascripts/application.js
593
+ - test/dummy/app/assets/stylesheets/application.css
594
+ - test/dummy/app/assets/config/manifest.js
595
+ - test/dummy/app/controllers/application_controller.rb
596
+ - test/dummy/bin/setup
597
+ - test/dummy/bin/bundle
598
+ - test/dummy/bin/rake
599
+ - test/dummy/bin/rails
600
+ - test/test_helper.rb
601
+ - spec/helpers/forest_liana/schema_helper_spec.rb
602
+ - spec/helpers/forest_liana/query_helper_spec.rb
603
+ - spec/services/forest_liana/permissions_checker_live_queries_spec.rb
603
604
  - spec/services/forest_liana/ip_whitelist_checker_spec.rb
604
- - spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb
605
- - spec/services/forest_liana/filters_parser_spec.rb
606
- - spec/services/forest_liana/schema_adapter_spec.rb
607
605
  - spec/services/forest_liana/line_stat_getter_spec.rb
608
- - spec/services/forest_liana/permissions_formatter_spec.rb
609
- - spec/services/forest_liana/permissions_checker_live_queries_spec.rb
606
+ - spec/services/forest_liana/schema_adapter_spec.rb
607
+ - spec/services/forest_liana/resources_getter_spec.rb
608
+ - spec/services/forest_liana/smart_action_field_validator_spec.rb
610
609
  - spec/services/forest_liana/apimap_sorter_spec.rb
610
+ - spec/services/forest_liana/filters_parser_spec.rb
611
+ - spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb
612
+ - spec/services/forest_liana/permissions_formatter_spec.rb
613
+ - spec/services/forest_liana/permissions_getter_spec.rb
611
614
  - spec/services/forest_liana/permissions_checker_acl_disabled_spec.rb
615
+ - spec/spec_helper.rb
612
616
  - spec/config/initializers/logger_spec.rb
613
- - spec/helpers/forest_liana/is_same_data_structure_helper_spec.rb
614
- - spec/helpers/forest_liana/schema_helper_spec.rb
615
- - spec/helpers/forest_liana/query_helper_spec.rb
617
+ - spec/lib/forest_liana/schema_file_updater_spec.rb
618
+ - spec/lib/forest_liana/bootstrapper_spec.rb
619
+ - spec/requests/stats_spec.rb
620
+ - spec/requests/actions_controller_spec.rb
621
+ - spec/requests/authentications_spec.rb
622
+ - spec/requests/resources_spec.rb
623
+ - spec/dummy/README.rdoc
624
+ - spec/dummy/config.ru
625
+ - spec/dummy/Rakefile
616
626
  - spec/dummy/db/schema.rb
617
- - spec/dummy/db/migrate/20190226172951_create_user.rb
618
- - spec/dummy/db/migrate/20190716135241_add_type_to_user.rb
619
627
  - spec/dummy/db/migrate/20190226173051_create_isle.rb
620
- - spec/dummy/db/migrate/20210511141752_create_owners.rb
621
628
  - spec/dummy/db/migrate/20190716130830_add_age_to_tree.rb
622
629
  - spec/dummy/db/migrate/20210326140855_create_locations.rb
623
630
  - spec/dummy/db/migrate/20190226174951_create_tree.rb
624
- - spec/dummy/db/migrate/20210526084712_create_products.rb
625
631
  - spec/dummy/db/migrate/20210326110524_create_references.rb
626
- - spec/dummy/config.ru
627
- - spec/dummy/bin/rake
628
- - spec/dummy/bin/setup
629
- - spec/dummy/bin/bundle
630
- - spec/dummy/bin/rails
631
- - spec/dummy/config/routes.rb
632
+ - spec/dummy/db/migrate/20210511141752_create_owners.rb
633
+ - spec/dummy/db/migrate/20190716135241_add_type_to_user.rb
634
+ - spec/dummy/db/migrate/20190226172951_create_user.rb
635
+ - spec/dummy/db/migrate/20210526084712_create_products.rb
636
+ - spec/dummy/config/environment.rb
637
+ - spec/dummy/config/secrets.yml
638
+ - spec/dummy/config/application.rb
639
+ - spec/dummy/config/environments/test.rb
640
+ - spec/dummy/config/environments/development.rb
641
+ - spec/dummy/config/environments/production.rb
632
642
  - spec/dummy/config/boot.rb
633
- - spec/dummy/config/initializers/forest_liana.rb
634
- - spec/dummy/config/initializers/mime_types.rb
643
+ - spec/dummy/config/database.yml
644
+ - spec/dummy/config/initializers/cookies_serializer.rb
635
645
  - spec/dummy/config/initializers/assets.rb
646
+ - spec/dummy/config/initializers/backtrace_silencers.rb
647
+ - spec/dummy/config/initializers/mime_types.rb
636
648
  - spec/dummy/config/initializers/session_store.rb
637
649
  - spec/dummy/config/initializers/wrap_parameters.rb
638
650
  - spec/dummy/config/initializers/filter_parameter_logging.rb
639
- - spec/dummy/config/initializers/cookies_serializer.rb
640
- - spec/dummy/config/initializers/backtrace_silencers.rb
641
651
  - spec/dummy/config/initializers/inflections.rb
642
- - spec/dummy/config/secrets.yml
643
- - spec/dummy/config/environment.rb
644
- - spec/dummy/config/environments/production.rb
645
- - spec/dummy/config/environments/development.rb
646
- - spec/dummy/config/environments/test.rb
647
- - spec/dummy/config/database.yml
648
- - spec/dummy/config/application.rb
649
- - spec/dummy/lib/forest_liana/collections/user.rb
652
+ - spec/dummy/config/initializers/forest_liana.rb
653
+ - spec/dummy/config/routes.rb
650
654
  - spec/dummy/lib/forest_liana/collections/location.rb
651
- - spec/dummy/README.rdoc
652
- - spec/dummy/Rakefile
653
- - spec/dummy/app/controllers/application_controller.rb
654
- - spec/dummy/app/views/layouts/application.html.erb
655
- - spec/dummy/app/config/routes.rb
656
- - spec/dummy/app/helpers/application_helper.rb
657
- - spec/dummy/app/assets/stylesheets/application.css
658
- - spec/dummy/app/assets/config/manifest.js
659
- - spec/dummy/app/assets/javascripts/application.js
660
- - spec/dummy/app/models/tree.rb
661
- - spec/dummy/app/models/owner.rb
662
- - spec/dummy/app/models/user.rb
663
- - spec/dummy/app/models/product.rb
655
+ - spec/dummy/lib/forest_liana/collections/user.rb
664
656
  - spec/dummy/app/models/location.rb
665
657
  - spec/dummy/app/models/island.rb
666
658
  - spec/dummy/app/models/reference.rb
667
- - spec/lib/forest_liana/bootstrapper_spec.rb
659
+ - spec/dummy/app/models/tree.rb
660
+ - spec/dummy/app/models/user.rb
661
+ - spec/dummy/app/models/product.rb
662
+ - spec/dummy/app/models/owner.rb
663
+ - spec/dummy/app/helpers/application_helper.rb
664
+ - spec/dummy/app/config/routes.rb
665
+ - spec/dummy/app/views/layouts/application.html.erb
666
+ - spec/dummy/app/assets/javascripts/application.js
667
+ - spec/dummy/app/assets/stylesheets/application.css
668
+ - spec/dummy/app/assets/config/manifest.js
669
+ - spec/dummy/app/controllers/application_controller.rb
670
+ - spec/dummy/bin/setup
671
+ - spec/dummy/bin/bundle
672
+ - spec/dummy/bin/rake
673
+ - spec/dummy/bin/rails
668
674
  - spec/rails_helper.rb
669
- - spec/requests/stats_spec.rb
670
- - spec/requests/resources_spec.rb
671
- - spec/requests/actions_controller_spec.rb
672
- - spec/requests/authentications_spec.rb