forest_liana 5.1.0 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab9646c698402ca2481f07ae86b409d8704a696f37a66b1480214bb99c2e69b1
4
- data.tar.gz: f19e6491e2833148464bd8b24cbf3f390e5223981aa3fbcfe92f6b755da23b90
3
+ metadata.gz: 8c78dcd3b69f75932cb2e52b0448b8155088347c1e434438d5d12fbfb5380eed
4
+ data.tar.gz: 2b84707467c2d775aed3a775879db4db24c5c2e28290a0b480fd25763b43e80a
5
5
  SHA512:
6
- metadata.gz: 3a4885397e50426324c4d6f93fd08539fcc5c440fa2292441d68310ce59e5d87c0bde5d6f8742e8bebce29dc9cf48fbd55962854f74a4e74bf5b2eced6032e29
7
- data.tar.gz: 2cd513683040ca3092d7078a7f99b88a5174d5cd91711fc9c1b06abfca0a55e0f1ddd9f2c973c135e04b8eca3310f1c59c1dbb4e4551ecdc0e9ae577206da896
6
+ metadata.gz: da235c4e9ef1c433654138de93dbb3925521b381f9abc9553d6ed91a3ddfae61189804d52b423cb2022284e0425e05687e3559e131527cacda251289cfb5e69c
7
+ data.tar.gz: dc4716b15fe417e2c073c5736a1b990664ed8bfdf83ed47f559e8980a7744f30aa6e013abac6d65a04d5ed650cae962f964f5a2a43f380be1f43fab01a8f9c09
@@ -22,7 +22,13 @@ module ForestLiana
22
22
  checker = ForestLiana::PermissionsChecker.new(@resource, 'searchToEdit', @rendering_id)
23
23
  return head :forbidden unless checker.is_authorized?
24
24
  else
25
- checker = ForestLiana::PermissionsChecker.new(@resource, 'list', @rendering_id)
25
+ checker = ForestLiana::PermissionsChecker.new(
26
+ @resource,
27
+ 'list',
28
+ @rendering_id,
29
+ nil,
30
+ get_collection_list_permission_info(forest_user, request)
31
+ )
26
32
  return head :forbidden unless checker.is_authorized?
27
33
  end
28
34
 
@@ -51,7 +57,13 @@ module ForestLiana
51
57
 
52
58
  def count
53
59
  begin
54
- checker = ForestLiana::PermissionsChecker.new(@resource, 'list', @rendering_id)
60
+ checker = ForestLiana::PermissionsChecker.new(
61
+ @resource,
62
+ 'list',
63
+ @rendering_id,
64
+ nil,
65
+ get_collection_list_permission_info(forest_user, request)
66
+ )
55
67
  return head :forbidden unless checker.is_authorized?
56
68
 
57
69
  getter = ForestLiana::ResourcesGetter.new(@resource, params)
@@ -232,5 +244,15 @@ module ForestLiana
232
244
  collection_name = ForestLiana.name_for(@resource)
233
245
  @collection ||= ForestLiana.apimap.find { |collection| collection.name.to_s == collection_name }
234
246
  end
247
+
248
+ # NOTICE: Return a formatted object containing the request condition filters and
249
+ # the user id used by the scope validator class to validate if scope is
250
+ # in request
251
+ def get_collection_list_permission_info(user, collection_list_request)
252
+ {
253
+ user_id: user['id'],
254
+ filters: collection_list_request[:filters],
255
+ }
256
+ end
235
257
  end
236
258
  end
@@ -3,11 +3,12 @@ module ForestLiana
3
3
  @@permissions_per_rendering = Hash.new
4
4
  @@expiration_in_seconds = (ENV['FOREST_PERMISSIONS_EXPIRATION_IN_SECONDS'] || 3600).to_i
5
5
 
6
- def initialize(resource, permission_name, rendering_id, smart_action_parameters = nil)
6
+ def initialize(resource, permission_name, rendering_id, smart_action_parameters = nil, collection_list_parameters = nil)
7
7
  @collection_name = ForestLiana.name_for(resource)
8
8
  @permission_name = permission_name
9
9
  @rendering_id = rendering_id
10
10
  @smart_action_parameters = smart_action_parameters
11
+ @collection_list_parameters = collection_list_parameters
11
12
  end
12
13
 
13
14
  def is_authorized?
@@ -46,12 +47,23 @@ module ForestLiana
46
47
  return @allowed && (@users.nil?|| @users.include?(@user_id.to_i));
47
48
  end
48
49
 
50
+ def collection_list_allowed?(scope_permissions)
51
+ return ForestLiana::ScopeValidator.new(
52
+ scope_permissions['filter'],
53
+ scope_permissions['dynamicScopesValues']['users']
54
+ ).is_scope_in_request?(@collection_list_parameters)
55
+ end
56
+
49
57
  def is_allowed?
50
58
  permissions = get_permissions
51
59
  if permissions && permissions[@collection_name] &&
52
60
  permissions[@collection_name]['collection']
53
61
  if @permission_name === 'actions'
54
62
  return smart_action_allowed?(permissions[@collection_name]['actions'])
63
+ # NOTICE: Permissions[@collection_name]['scope'] will either contains conditions filter and
64
+ # dynamic user values definition, or null for collection that does not use scopes
65
+ elsif @permission_name === 'list' and permissions[@collection_name]['scope']
66
+ return collection_list_allowed?(permissions[@collection_name]['scope'])
55
67
  else
56
68
  return permissions[@collection_name]['collection'][@permission_name]
57
69
  end
@@ -0,0 +1,97 @@
1
+ module ForestLiana
2
+ class ScopeValidator
3
+ def initialize(scope_permissions, users_variable_values)
4
+ @scope_filters = scope_permissions
5
+ @users_variable_values = users_variable_values
6
+ end
7
+
8
+ def is_scope_in_request?(scope_request)
9
+ begin
10
+ filters = JSON.parse(scope_request[:filters])
11
+ rescue JSON::ParserError
12
+ raise ForestLiana::Errors::HTTP422Error.new('Invalid filters JSON format')
13
+ end
14
+ @computed_scope = compute_condition_filters_from_scope(scope_request[:user_id])
15
+
16
+ # NOTICE: Perfom a travel in the request condition filters tree to find the scope
17
+ tagged_scope_filters = get_scope_found_in_request(filters)
18
+
19
+ # NOTICE: Permission system always send an aggregator even if there is only one condition
20
+ # In that case, if the condition is valid, then request was not edited
21
+ return !tagged_scope_filters.nil? if @scope_filters['conditions'].length == 1
22
+
23
+ # NOTICE: If there is more than one condition, do a final validation on the condition filters
24
+ return tagged_scope_filters != nil &&
25
+ tagged_scope_filters[:aggregator] == @scope_filters['aggregator'] &&
26
+ tagged_scope_filters[:conditions] &&
27
+ tagged_scope_filters[:conditions].length == @scope_filters['conditions'].length
28
+ end
29
+
30
+ private
31
+
32
+ def compute_condition_filters_from_scope(user_id)
33
+ computed_condition_filters = @scope_filters.clone
34
+ computed_condition_filters['conditions'].each do |condition|
35
+ if condition.include?('value') &&
36
+ !condition['value'].nil? &&
37
+ condition['value'].start_with?('$') &&
38
+ @users_variable_values.include?(user_id)
39
+ condition['value'] = @users_variable_values[user_id][condition['value']]
40
+ end
41
+ end
42
+ return computed_condition_filters
43
+ end
44
+
45
+ def get_scope_found_in_request(filters)
46
+ return nil unless filters
47
+ return search_scope_aggregation(filters)
48
+ end
49
+
50
+ def search_scope_aggregation(node)
51
+ ensure_valid_aggregation(node)
52
+
53
+ return is_scope_condition?(node) unless node['aggregator']
54
+
55
+ # NOTICE: Remove conditions that are not from the scope
56
+ filtered_conditions = node['conditions'].map { |condition|
57
+ search_scope_aggregation(condition)
58
+ }.select { |condition|
59
+ condition
60
+ }
61
+
62
+ # NOTICE: If there is only one condition filter left and its current aggregator is
63
+ # an "and", this condition filter is the searched scope
64
+ if (filtered_conditions.length == 1 &&
65
+ filtered_conditions.first.is_a?(Hash) &&
66
+ filtered_conditions.first.include?(:aggregator) &&
67
+ node['aggregator'] == 'and')
68
+ return filtered_conditions.first
69
+ end
70
+
71
+ # NOTICE: Otherwise, validate if the current node is the scope and return nil
72
+ # if it's not
73
+ return (filtered_conditions.length == @scope_filters['conditions'].length &&
74
+ node['aggregator'] == @scope_filters['aggregator']) ?
75
+ { aggregator: node['aggregator'], conditions: filtered_conditions } :
76
+ nil
77
+ end
78
+
79
+ def is_scope_condition?(condition)
80
+ ensure_valid_condition(condition)
81
+ return @computed_scope['conditions'].include?(condition)
82
+ end
83
+
84
+ def ensure_valid_aggregation(node)
85
+ raise ForestLiana::Errors::HTTP422Error.new('Filters cannot be a raw value') unless node.is_a?(Hash)
86
+ raise_empty_condition_in_filter_error if node.empty?
87
+ end
88
+
89
+ def ensure_valid_condition(condition)
90
+ raise_empty_condition_in_filter_error if condition.empty?
91
+ raise ForestLiana::Errors::HTTP422Error.new('Condition cannot be a raw value') unless condition.is_a?(Hash)
92
+ unless condition['field'].is_a?(String) and condition['operator'].is_a?(String)
93
+ raise ForestLiana::Errors::HTTP422Error.new('Invalid condition format')
94
+ end
95
+ end
96
+ end
97
+ end
@@ -1,3 +1,3 @@
1
1
  module ForestLiana
2
- VERSION = "5.1.0"
2
+ VERSION = "5.2.1"
3
3
  end
@@ -0,0 +1,185 @@
1
+ module ForestLiana
2
+ class ScopeValidatorTest < ActiveSupport::TestCase
3
+ test 'Request with aggregated condition filters should be allowed if it matches the scope exactly' do
4
+ scope_validator = ForestLiana::ScopeValidator.new({
5
+ 'aggregator' => 'and',
6
+ 'conditions' => [
7
+ { 'field' => 'name', 'value' => 'john', 'operator' => 'equal' },
8
+ { 'field' => 'price', 'value' => '2500', 'operator' => 'equal' }
9
+ ]
10
+ }, [])
11
+
12
+ allowed = scope_validator.is_scope_in_request?({
13
+ user_id: '1',
14
+ filters: JSON.generate({
15
+ aggregator: 'and',
16
+ conditions: [
17
+ { field: 'name', value: 'john', operator: 'equal' },
18
+ { field: 'price', value: '2500', operator: 'equal' }
19
+ ]
20
+ })
21
+ })
22
+ assert allowed == true
23
+ end
24
+
25
+ test 'Request with simple condition filter should be allowed if it matches the scope exactly' do
26
+ scope_validator = ForestLiana::ScopeValidator.new({
27
+ 'aggregator' => 'and',
28
+ 'conditions' => [
29
+ { 'field' => 'field', 'value' => 'value', 'operator' => 'equal' }
30
+ ]
31
+ }, [])
32
+ allowed = scope_validator.is_scope_in_request?({
33
+ user_id: '1',
34
+ filters: JSON.generate({
35
+ field: 'field', value: 'value', operator: 'equal'
36
+ })
37
+ })
38
+ assert allowed == true
39
+ end
40
+
41
+ test 'Request with multiples condition filters should be allowed if it contains the scope ' do
42
+ scope_validator = ForestLiana::ScopeValidator.new({
43
+ 'aggregator' => 'and',
44
+ 'conditions' => [
45
+ { 'field' => 'name', 'value' => 'doe', 'operator' => 'equal' }
46
+ ]
47
+ }, []
48
+ )
49
+
50
+ allowed = scope_validator.is_scope_in_request?({
51
+ user_id: '1',
52
+ filters: JSON.generate({
53
+ aggregator: 'and',
54
+ conditions: [
55
+ { field: 'name', value: 'doe', operator: 'equal' },
56
+ { field: 'field2', value: 'value2', operator: 'equal' }
57
+ ]
58
+ })
59
+ })
60
+ assert allowed == true
61
+ end
62
+
63
+ test 'Request with dynamic user values should be allowed if it matches the scope exactly' do
64
+ scope_validator = ForestLiana::ScopeValidator.new({
65
+ 'aggregator' => 'and',
66
+ 'conditions' => [
67
+ { 'field' => 'name', 'value' => '$currentUser.lastname', 'operator' => 'equal' }
68
+ ],
69
+ }, {
70
+ '1' => { '$currentUser.lastname' => 'john' }
71
+ })
72
+
73
+ allowed = scope_validator.is_scope_in_request?({
74
+ user_id: '1',
75
+ filters: JSON.generate({
76
+ 'field' => 'name', 'value' => 'john', 'operator' => 'equal'
77
+ })
78
+ })
79
+ assert allowed == true
80
+ end
81
+
82
+ test 'Request with multiples aggregation and dynamic values should be allowed if it contains the scope' do
83
+ scope_validator = ForestLiana::ScopeValidator.new({
84
+ 'aggregator' => 'or',
85
+ 'conditions' => [
86
+ { 'field' => 'price', 'value' => '2500', 'operator' => 'equal' },
87
+ { 'field' => 'name', 'value' => '$currentUser.lastname', 'operator' => 'equal' }
88
+ ]
89
+ }, {
90
+ '1' => { '$currentUser.lastname' => 'john' }
91
+ })
92
+
93
+ allowed = scope_validator.is_scope_in_request?({
94
+ user_id: '1',
95
+ filters: JSON.generate({
96
+ aggregator: 'and',
97
+ conditions: [
98
+ { field: 'field', value: 'value', operator: 'equal' },
99
+ {
100
+ aggregator: 'or',
101
+ conditions: [
102
+ { field: 'price', value: '2500', operator: 'equal' },
103
+ { field: 'name', value: 'john', operator: 'equal' }
104
+ ]
105
+ }
106
+ ]
107
+ })
108
+ })
109
+ assert allowed == true
110
+ end
111
+
112
+ test 'Request that does not match the expect scope should not be allowed' do
113
+ scope_validator = ForestLiana::ScopeValidator.new({
114
+ 'aggregator' => 'and',
115
+ 'conditions' => [
116
+ { 'field' => 'name', 'value' => 'john', 'operator' => 'equal' },
117
+ { 'field' => 'price', 'value' => '2500', 'operator' => 'equal' }
118
+ ]
119
+ }, [])
120
+
121
+ allowed = scope_validator.is_scope_in_request?({
122
+ user_id: '1',
123
+ filters: JSON.generate({
124
+ aggregator: 'and',
125
+ conditions: [
126
+ { field: 'name', value: 'definitely_not_john', operator: 'equal' },
127
+ { field: 'price', value: '0', operator: 'equal' }
128
+ ]
129
+ })
130
+ })
131
+ assert allowed == false
132
+ end
133
+
134
+ test 'Request that are missing part of the scope should not be allowed' do
135
+ scope_validator = ForestLiana::ScopeValidator.new({
136
+ 'aggregator' => 'and',
137
+ 'conditions' => [
138
+ { 'field' => 'name', 'value' => 'john', 'operator' => 'equal' },
139
+ { 'field' => 'price', 'value' => '2500', 'operator' => 'equal' }
140
+ ]
141
+ }, [])
142
+
143
+ allowed = scope_validator.is_scope_in_request?({
144
+ user_id: '1',
145
+ filters: JSON.generate({
146
+ aggregator: 'and',
147
+ conditions: [
148
+ { field: 'name', value: 'john', operator: 'equal' },
149
+ ]
150
+ })
151
+ })
152
+ assert allowed == false
153
+ end
154
+
155
+ test 'Request that does not have a top aggregator being "and" should not be allowed' do
156
+ scope_validator = ForestLiana::ScopeValidator.new({
157
+ 'aggregator' => 'and',
158
+ 'conditions' => [
159
+ { 'field' => 'price', 'value' => '2500', 'operator' => 'equal' },
160
+ { 'field' => 'name', 'value' => '$currentUser.lastname', 'operator' => 'equal' }
161
+ ]
162
+ }, {
163
+ '1' => { '$currentUser.lastname' => 'john' }
164
+ })
165
+
166
+ allowed = scope_validator.is_scope_in_request?({
167
+ user_id: '1',
168
+ filters: JSON.generate({
169
+ aggregator: 'or',
170
+ conditions: [
171
+ { field: 'field', value: 'value', operator: 'equal' },
172
+ {
173
+ aggregator: 'and',
174
+ conditions: [
175
+ { field: 'price', value: '2500', operator: 'equal' },
176
+ { field: 'name', value: 'john', operator: 'equal' }
177
+ ]
178
+ }
179
+ ]
180
+ })
181
+ })
182
+ assert allowed == false
183
+ end
184
+ end
185
+ 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: 5.1.0
4
+ version: 5.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-17 00:00:00.000000000 Z
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: groupdate
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 2.5.2
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 2.5.2
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: useragent
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +262,7 @@ files:
262
262
  - app/services/forest_liana/resources_getter.rb
263
263
  - app/services/forest_liana/schema_adapter.rb
264
264
  - app/services/forest_liana/schema_utils.rb
265
+ - app/services/forest_liana/scope_validator.rb
265
266
  - app/services/forest_liana/search_query_builder.rb
266
267
  - app/services/forest_liana/stat_getter.rb
267
268
  - app/services/forest_liana/stripe_base_getter.rb
@@ -432,6 +433,7 @@ files:
432
433
  - test/services/forest_liana/resource_updater_test.rb
433
434
  - test/services/forest_liana/resources_getter_test.rb
434
435
  - test/services/forest_liana/schema_adapter_test.rb
436
+ - test/services/forest_liana/scope_validator_test.rb
435
437
  - test/services/forest_liana/value_stat_getter_test.rb
436
438
  - test/test_helper.rb
437
439
  homepage: https://github.com/ForestAdmin/forest-rails
@@ -453,147 +455,149 @@ required_rubygems_version: !ruby/object:Gem::Requirement
453
455
  - !ruby/object:Gem::Version
454
456
  version: '0'
455
457
  requirements: []
456
- rubygems_version: 3.0.8
458
+ rubyforge_project:
459
+ rubygems_version: 2.7.7
457
460
  signing_key:
458
461
  specification_version: 4
459
462
  summary: Official Rails Liana for Forest
460
463
  test_files:
461
- - test/dummy/app/models/has_many_class_name_field.rb
462
- - test/dummy/app/models/has_many_through_field.rb
464
+ - test/fixtures/owner.yml
465
+ - test/fixtures/belongs_to_field.yml
466
+ - test/fixtures/has_many_through_field.yml
467
+ - test/fixtures/tree.yml
468
+ - test/fixtures/has_one_field.yml
469
+ - test/fixtures/reference.yml
470
+ - test/fixtures/serialize_field.yml
471
+ - test/fixtures/has_many_field.yml
472
+ - test/fixtures/string_field.yml
473
+ - test/services/forest_liana/resources_getter_test.rb
474
+ - test/services/forest_liana/scope_validator_test.rb
475
+ - test/services/forest_liana/schema_adapter_test.rb
476
+ - test/services/forest_liana/has_many_getter_test.rb
477
+ - test/services/forest_liana/value_stat_getter_test.rb
478
+ - test/services/forest_liana/resource_updater_test.rb
479
+ - test/services/forest_liana/pie_stat_getter_test.rb
480
+ - test/test_helper.rb
481
+ - test/dummy/README.rdoc
482
+ - test/dummy/app/views/layouts/application.html.erb
463
483
  - test/dummy/app/models/has_many_field.rb
464
- - test/dummy/app/models/date_field.rb
484
+ - test/dummy/app/models/string_field.rb
465
485
  - test/dummy/app/models/has_and_belongs_to_many_field.rb
466
- - test/dummy/app/models/serialize_field.rb
467
- - test/dummy/app/models/reference.rb
468
- - test/dummy/app/models/float_field.rb
469
- - test/dummy/app/models/integer_field.rb
486
+ - test/dummy/app/models/has_many_through_field.rb
487
+ - test/dummy/app/models/has_many_class_name_field.rb
488
+ - test/dummy/app/models/has_one_field.rb
489
+ - test/dummy/app/models/date_field.rb
470
490
  - test/dummy/app/models/boolean_field.rb
471
- - test/dummy/app/models/belongs_to_field.rb
472
- - test/dummy/app/models/owner.rb
491
+ - test/dummy/app/models/float_field.rb
492
+ - test/dummy/app/models/reference.rb
473
493
  - test/dummy/app/models/belongs_to_class_name_field.rb
474
- - test/dummy/app/models/decimal_field.rb
475
- - test/dummy/app/models/has_one_field.rb
476
- - test/dummy/app/models/string_field.rb
477
494
  - test/dummy/app/models/polymorphic_field.rb
478
495
  - test/dummy/app/models/tree.rb
479
- - test/dummy/app/controllers/application_controller.rb
480
- - test/dummy/app/views/layouts/application.html.erb
496
+ - test/dummy/app/models/decimal_field.rb
497
+ - test/dummy/app/models/serialize_field.rb
498
+ - test/dummy/app/models/integer_field.rb
499
+ - test/dummy/app/models/belongs_to_field.rb
500
+ - test/dummy/app/models/owner.rb
501
+ - test/dummy/app/helpers/application_helper.rb
481
502
  - test/dummy/app/assets/javascripts/application.js
482
503
  - test/dummy/app/assets/stylesheets/application.css
483
- - test/dummy/app/helpers/application_helper.rb
504
+ - test/dummy/app/controllers/application_controller.rb
505
+ - test/dummy/Rakefile
484
506
  - test/dummy/bin/rake
485
- - test/dummy/bin/setup
486
507
  - test/dummy/bin/bundle
487
508
  - test/dummy/bin/rails
488
- - test/dummy/config/secrets.yml
509
+ - test/dummy/bin/setup
510
+ - test/dummy/public/404.html
511
+ - test/dummy/public/500.html
512
+ - test/dummy/public/422.html
513
+ - test/dummy/public/favicon.ico
514
+ - test/dummy/config.ru
515
+ - test/dummy/db/migrate/20181111162121_create_references_table.rb
516
+ - test/dummy/db/migrate/20150608131430_create_integer_field.rb
517
+ - test/dummy/db/migrate/20160628173505_add_timestamps.rb
518
+ - test/dummy/db/migrate/20160627172810_create_owner.rb
519
+ - test/dummy/db/migrate/20150814081918_create_has_many_through_field.rb
520
+ - test/dummy/db/migrate/20150608132159_create_boolean_field.rb
521
+ - test/dummy/db/migrate/20150608131603_create_decimal_field.rb
522
+ - test/dummy/db/migrate/20150616150629_create_polymorphic_field.rb
523
+ - test/dummy/db/migrate/20150612112520_create_has_and_belongs_to_many_field.rb
524
+ - test/dummy/db/migrate/20150608131610_create_float_field.rb
525
+ - test/dummy/db/migrate/20150608133038_create_belongs_to_field.rb
526
+ - test/dummy/db/migrate/20150608150016_create_has_many_field.rb
527
+ - test/dummy/db/migrate/20150609114636_create_belongs_to_class_name_field.rb
528
+ - test/dummy/db/migrate/20170614141921_create_serialize_field.rb
529
+ - test/dummy/db/migrate/20150608132621_create_string_field.rb
530
+ - test/dummy/db/migrate/20150608133044_create_has_one_field.rb
531
+ - test/dummy/db/migrate/20150623115554_create_has_many_class_name_field.rb
532
+ - test/dummy/db/migrate/20150608130516_create_date_field.rb
533
+ - test/dummy/db/migrate/20160627172951_create_tree.rb
534
+ - test/dummy/db/schema.rb
489
535
  - test/dummy/config/routes.rb
490
- - test/dummy/config/locales/en.yml
491
- - test/dummy/config/environments/production.rb
492
- - test/dummy/config/environments/development.rb
493
- - test/dummy/config/environments/test.rb
494
536
  - test/dummy/config/environment.rb
537
+ - test/dummy/config/secrets.yml
495
538
  - test/dummy/config/application.rb
496
- - test/dummy/config/database.yml
497
539
  - test/dummy/config/boot.rb
498
- - test/dummy/config/initializers/backtrace_silencers.rb
540
+ - test/dummy/config/environments/test.rb
541
+ - test/dummy/config/environments/development.rb
542
+ - test/dummy/config/environments/production.rb
543
+ - test/dummy/config/locales/en.yml
544
+ - test/dummy/config/initializers/wrap_parameters.rb
499
545
  - test/dummy/config/initializers/mime_types.rb
500
546
  - test/dummy/config/initializers/filter_parameter_logging.rb
501
- - test/dummy/config/initializers/session_store.rb
502
- - test/dummy/config/initializers/wrap_parameters.rb
503
547
  - test/dummy/config/initializers/assets.rb
504
- - test/dummy/config/initializers/cookies_serializer.rb
548
+ - test/dummy/config/initializers/session_store.rb
505
549
  - test/dummy/config/initializers/inflections.rb
506
- - test/dummy/config.ru
507
- - test/dummy/Rakefile
508
- - test/dummy/public/favicon.ico
509
- - test/dummy/public/422.html
510
- - test/dummy/public/500.html
511
- - test/dummy/public/404.html
512
- - test/dummy/db/schema.rb
513
- - test/dummy/db/migrate/20150608133038_create_belongs_to_field.rb
514
- - test/dummy/db/migrate/20150608130516_create_date_field.rb
515
- - test/dummy/db/migrate/20160627172951_create_tree.rb
516
- - test/dummy/db/migrate/20150608132621_create_string_field.rb
517
- - test/dummy/db/migrate/20160627172810_create_owner.rb
518
- - test/dummy/db/migrate/20150612112520_create_has_and_belongs_to_many_field.rb
519
- - test/dummy/db/migrate/20150608132159_create_boolean_field.rb
520
- - test/dummy/db/migrate/20181111162121_create_references_table.rb
521
- - test/dummy/db/migrate/20160628173505_add_timestamps.rb
522
- - test/dummy/db/migrate/20150608133044_create_has_one_field.rb
523
- - test/dummy/db/migrate/20150814081918_create_has_many_through_field.rb
524
- - test/dummy/db/migrate/20150609114636_create_belongs_to_class_name_field.rb
525
- - test/dummy/db/migrate/20150608150016_create_has_many_field.rb
526
- - test/dummy/db/migrate/20150608131430_create_integer_field.rb
527
- - test/dummy/db/migrate/20170614141921_create_serialize_field.rb
528
- - test/dummy/db/migrate/20150608131610_create_float_field.rb
529
- - test/dummy/db/migrate/20150608131603_create_decimal_field.rb
530
- - test/dummy/db/migrate/20150623115554_create_has_many_class_name_field.rb
531
- - test/dummy/db/migrate/20150616150629_create_polymorphic_field.rb
532
- - test/dummy/README.rdoc
550
+ - test/dummy/config/initializers/cookies_serializer.rb
551
+ - test/dummy/config/initializers/backtrace_silencers.rb
552
+ - test/dummy/config/database.yml
533
553
  - test/forest_liana_test.rb
534
- - test/fixtures/has_many_through_field.yml
535
- - test/fixtures/string_field.yml
536
- - test/fixtures/belongs_to_field.yml
537
- - test/fixtures/tree.yml
538
- - test/fixtures/has_one_field.yml
539
- - test/fixtures/reference.yml
540
- - test/fixtures/owner.yml
541
- - test/fixtures/has_many_field.yml
542
- - test/fixtures/serialize_field.yml
543
- - test/test_helper.rb
544
554
  - test/routing/route_test.rb
545
- - test/services/forest_liana/schema_adapter_test.rb
546
- - test/services/forest_liana/resource_updater_test.rb
547
- - test/services/forest_liana/value_stat_getter_test.rb
548
- - test/services/forest_liana/has_many_getter_test.rb
549
- - test/services/forest_liana/pie_stat_getter_test.rb
550
- - test/services/forest_liana/resources_getter_test.rb
555
+ - spec/services/forest_liana/ip_whitelist_checker_spec.rb
556
+ - spec/services/forest_liana/schema_adapter_spec.rb
557
+ - spec/services/forest_liana/apimap_sorter_spec.rb
558
+ - spec/services/forest_liana/filters_parser_spec.rb
551
559
  - spec/spec_helper.rb
552
- - spec/dummy/app/config/routes.rb
560
+ - spec/requests/resources_spec.rb
561
+ - spec/dummy/README.rdoc
562
+ - spec/dummy/app/views/layouts/application.html.erb
553
563
  - spec/dummy/app/models/island.rb
554
564
  - spec/dummy/app/models/user.rb
555
565
  - spec/dummy/app/models/tree.rb
556
- - spec/dummy/app/controllers/application_controller.rb
557
- - spec/dummy/app/views/layouts/application.html.erb
566
+ - spec/dummy/app/helpers/application_helper.rb
558
567
  - spec/dummy/app/assets/javascripts/application.js
559
568
  - spec/dummy/app/assets/stylesheets/application.css
560
- - spec/dummy/app/helpers/application_helper.rb
569
+ - spec/dummy/app/config/routes.rb
570
+ - spec/dummy/app/controllers/application_controller.rb
571
+ - spec/dummy/Rakefile
561
572
  - spec/dummy/bin/rake
562
- - spec/dummy/bin/setup
563
573
  - spec/dummy/bin/bundle
564
574
  - spec/dummy/bin/rails
565
- - spec/dummy/config/secrets.yml
575
+ - spec/dummy/bin/setup
576
+ - spec/dummy/config.ru
577
+ - spec/dummy/db/migrate/20190226174951_create_tree.rb
578
+ - spec/dummy/db/migrate/20190716135241_add_type_to_user.rb
579
+ - spec/dummy/db/migrate/20190226173051_create_isle.rb
580
+ - spec/dummy/db/migrate/20190716130830_add_age_to_tree.rb
581
+ - spec/dummy/db/migrate/20190226172951_create_user.rb
582
+ - spec/dummy/db/schema.rb
566
583
  - spec/dummy/config/routes.rb
567
- - spec/dummy/config/environments/production.rb
568
- - spec/dummy/config/environments/development.rb
569
- - spec/dummy/config/environments/test.rb
570
584
  - spec/dummy/config/environment.rb
585
+ - spec/dummy/config/secrets.yml
571
586
  - spec/dummy/config/application.rb
572
- - spec/dummy/config/database.yml
573
587
  - spec/dummy/config/boot.rb
574
- - spec/dummy/config/initializers/backtrace_silencers.rb
588
+ - spec/dummy/config/environments/test.rb
589
+ - spec/dummy/config/environments/development.rb
590
+ - spec/dummy/config/environments/production.rb
591
+ - spec/dummy/config/initializers/wrap_parameters.rb
592
+ - spec/dummy/config/initializers/forest_liana.rb
575
593
  - spec/dummy/config/initializers/mime_types.rb
576
594
  - spec/dummy/config/initializers/filter_parameter_logging.rb
577
- - spec/dummy/config/initializers/session_store.rb
578
- - spec/dummy/config/initializers/wrap_parameters.rb
579
595
  - spec/dummy/config/initializers/assets.rb
580
- - spec/dummy/config/initializers/cookies_serializer.rb
581
- - spec/dummy/config/initializers/forest_liana.rb
596
+ - spec/dummy/config/initializers/session_store.rb
582
597
  - spec/dummy/config/initializers/inflections.rb
583
- - spec/dummy/config.ru
584
- - spec/dummy/Rakefile
585
- - spec/dummy/db/schema.rb
586
- - spec/dummy/db/migrate/20190716130830_add_age_to_tree.rb
587
- - spec/dummy/db/migrate/20190226173051_create_isle.rb
588
- - spec/dummy/db/migrate/20190226174951_create_tree.rb
589
- - spec/dummy/db/migrate/20190226172951_create_user.rb
590
- - spec/dummy/db/migrate/20190716135241_add_type_to_user.rb
591
- - spec/dummy/README.rdoc
592
- - spec/requests/resources_spec.rb
593
- - spec/rails_helper.rb
594
- - spec/helpers/forest_liana/query_helper_spec.rb
598
+ - spec/dummy/config/initializers/cookies_serializer.rb
599
+ - spec/dummy/config/initializers/backtrace_silencers.rb
600
+ - spec/dummy/config/database.yml
595
601
  - spec/helpers/forest_liana/schema_helper_spec.rb
596
- - spec/services/forest_liana/schema_adapter_spec.rb
597
- - spec/services/forest_liana/apimap_sorter_spec.rb
598
- - spec/services/forest_liana/filters_parser_spec.rb
599
- - spec/services/forest_liana/ip_whitelist_checker_spec.rb
602
+ - spec/helpers/forest_liana/query_helper_spec.rb
603
+ - spec/rails_helper.rb