forest_admin_datasource_toolkit 1.0.0.pre.beta.24 → 1.0.0.pre.beta.26
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 +4 -4
- data/lib/forest_admin_datasource_toolkit/collection.rb +4 -3
- data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/condition_tree_equivalent.rb +1 -1
- data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/nodes/condition_tree_leaf.rb +10 -7
- data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/operators.rb +42 -53
- data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/transforms/comparisons.rb +11 -11
- data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/transforms/pattern.rb +12 -12
- data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/transforms/times.rb +21 -17
- data/lib/forest_admin_datasource_toolkit/decorators/collection_decorator.rb +2 -3
- data/lib/forest_admin_datasource_toolkit/decorators/schema/schema_collection_decorator.rb +21 -0
- data/lib/forest_admin_datasource_toolkit/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9749205ecd01ce84b131e59b25235bd4555bd5bb64ec5620d283bc46ab51ebb3
|
4
|
+
data.tar.gz: 474671b8aa198bd1a2cbb1b0c95e95bab9e2275572344990376aa37d1b3773ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7d84033214299dbcec6ce24d8d20a538de1895dca6349ef5b32c9cbf3744df3df3994a5cb10263055a4f8ac30c160756595a80c6b1088e100f25d389e3b4732
|
7
|
+
data.tar.gz: da6e1e8ead04fab78151c72117a73d89c0b4665df2c1c10c16b130fe9e492ab0ca5ec7b9b552343b8e5b90a99dbd5469a4da761d4d90ac24a753f42399e3ba2f
|
@@ -18,7 +18,8 @@ module ForestAdminDatasourceToolkit
|
|
18
18
|
@name = name
|
19
19
|
@native_driver = native_driver
|
20
20
|
@schema = {
|
21
|
-
fields: {}
|
21
|
+
fields: {},
|
22
|
+
countable: false
|
22
23
|
}
|
23
24
|
@actions = {}
|
24
25
|
@segments = {}
|
@@ -28,11 +29,11 @@ module ForestAdminDatasourceToolkit
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def enable_count
|
31
|
-
@countable = true
|
32
|
+
@schema[:countable] = true
|
32
33
|
end
|
33
34
|
|
34
35
|
def is_countable?
|
35
|
-
@countable
|
36
|
+
@schema[:countable]
|
36
37
|
end
|
37
38
|
|
38
39
|
def is_searchable?
|
@@ -49,7 +49,7 @@ module ForestAdminDatasourceToolkit
|
|
49
49
|
|
50
50
|
if depends_replacers.all? { |r| !r.nil? }
|
51
51
|
return lambda { |leaf, timezone|
|
52
|
-
replacer.call(leaf).replace_leafs do |sub_leaf|
|
52
|
+
replacer.call(leaf, timezone).replace_leafs do |sub_leaf|
|
53
53
|
depends_replacers[depends_on.index(sub_leaf.operator)].call(sub_leaf, timezone)
|
54
54
|
end
|
55
55
|
}
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/string'
|
3
|
+
|
1
4
|
module ForestAdminDatasourceToolkit
|
2
5
|
module Components
|
3
6
|
module Query
|
@@ -11,7 +14,7 @@ module ForestAdminDatasourceToolkit
|
|
11
14
|
|
12
15
|
def initialize(field, operator, value = nil)
|
13
16
|
@field = field
|
14
|
-
@operator = operator
|
17
|
+
@operator = operator.underscore
|
15
18
|
@value = value
|
16
19
|
valid_operator(@operator) if @operator
|
17
20
|
super()
|
@@ -32,14 +35,14 @@ module ForestAdminDatasourceToolkit
|
|
32
35
|
end
|
33
36
|
|
34
37
|
def inverse
|
35
|
-
return override(operator: "
|
36
|
-
return override(operator: @operator[4..]) if @operator.start_with?('
|
38
|
+
return override(operator: "not_#{@operator}") if Operators.exist?("not_#{@operator}")
|
39
|
+
return override(operator: @operator[4..]) if @operator.start_with?('not')
|
37
40
|
|
38
41
|
case @operator
|
39
|
-
when
|
40
|
-
override(operator:
|
41
|
-
when
|
42
|
-
override(operator:
|
42
|
+
when Operators::BLANK
|
43
|
+
override(operator: Operators::BLANK)
|
44
|
+
when Operators::PRESENT
|
45
|
+
override(operator: Operators::PRESENT)
|
43
46
|
else
|
44
47
|
raise ForestException, "Operator: #{@operator} cannot be inverted."
|
45
48
|
end
|
@@ -3,64 +3,53 @@ module ForestAdminDatasourceToolkit
|
|
3
3
|
module Query
|
4
4
|
module ConditionTree
|
5
5
|
class Operators
|
6
|
-
EQUAL = '
|
7
|
-
NOT_EQUAL = '
|
8
|
-
LESS_THAN = '
|
9
|
-
GREATER_THAN = '
|
10
|
-
MATCH = '
|
11
|
-
LIKE = '
|
12
|
-
I_LIKE = '
|
13
|
-
NOT_CONTAINS = '
|
14
|
-
CONTAINS = '
|
15
|
-
I_CONTAINS = '
|
16
|
-
LONGER_THAN = '
|
17
|
-
SHORTER_THAN = '
|
18
|
-
INCLUDES_ALL = '
|
19
|
-
PRESENT = '
|
20
|
-
BLANK = '
|
21
|
-
IN = '
|
22
|
-
NOT_IN = '
|
23
|
-
STARTS_WITH = '
|
24
|
-
I_STARTS_WITH = '
|
25
|
-
ENDS_WITH = '
|
26
|
-
I_ENDS_WITH = '
|
27
|
-
MISSING = '
|
28
|
-
BEFORE = '
|
29
|
-
AFTER = '
|
30
|
-
AFTER_X_HOURS_AGO = '
|
31
|
-
BEFORE_X_HOURS_AGO = '
|
32
|
-
FUTURE = '
|
33
|
-
PAST = '
|
34
|
-
TODAY = '
|
35
|
-
YESTERDAY = '
|
36
|
-
PREVIOUS_WEEK = '
|
37
|
-
PREVIOUS_MONTH = '
|
38
|
-
PREVIOUS_QUARTER = '
|
39
|
-
PREVIOUS_YEAR = '
|
40
|
-
PREVIOUS_WEEK_TO_DATE = '
|
41
|
-
PREVIOUS_MONTH_TO_DATE = '
|
42
|
-
PREVIOUS_QUARTER_TO_DATE = '
|
43
|
-
PREVIOUS_YEAR_TO_DATE = '
|
44
|
-
PREVIOUS_X_DAYS = '
|
45
|
-
PREVIOUS_X_DAYS_TO_DATE = '
|
6
|
+
EQUAL = 'equal'.freeze
|
7
|
+
NOT_EQUAL = 'not_equal'.freeze
|
8
|
+
LESS_THAN = 'less_than'.freeze
|
9
|
+
GREATER_THAN = 'greater_than'.freeze
|
10
|
+
MATCH = 'match'.freeze
|
11
|
+
LIKE = 'like'.freeze
|
12
|
+
I_LIKE = 'i_like'.freeze
|
13
|
+
NOT_CONTAINS = 'not_contains'.freeze
|
14
|
+
CONTAINS = 'contains'.freeze
|
15
|
+
I_CONTAINS = 'i_contains'.freeze
|
16
|
+
LONGER_THAN = 'longer_than'.freeze
|
17
|
+
SHORTER_THAN = 'shorter_than'.freeze
|
18
|
+
INCLUDES_ALL = 'includes_all'.freeze
|
19
|
+
PRESENT = 'present'.freeze
|
20
|
+
BLANK = 'blank'.freeze
|
21
|
+
IN = 'in'.freeze
|
22
|
+
NOT_IN = 'not_in'.freeze
|
23
|
+
STARTS_WITH = 'starts_with'.freeze
|
24
|
+
I_STARTS_WITH = 'i_starts_with'.freeze
|
25
|
+
ENDS_WITH = 'ends_with'.freeze
|
26
|
+
I_ENDS_WITH = 'i_ends_with'.freeze
|
27
|
+
MISSING = 'missing'.freeze
|
28
|
+
BEFORE = 'before'.freeze
|
29
|
+
AFTER = 'after'.freeze
|
30
|
+
AFTER_X_HOURS_AGO = 'after_x_hours_ago'.freeze
|
31
|
+
BEFORE_X_HOURS_AGO = 'before_x_hours_ago'.freeze
|
32
|
+
FUTURE = 'future'.freeze
|
33
|
+
PAST = 'past'.freeze
|
34
|
+
TODAY = 'today'.freeze
|
35
|
+
YESTERDAY = 'yesterday'.freeze
|
36
|
+
PREVIOUS_WEEK = 'previous_week'.freeze
|
37
|
+
PREVIOUS_MONTH = 'previous_month'.freeze
|
38
|
+
PREVIOUS_QUARTER = 'previous_quarter'.freeze
|
39
|
+
PREVIOUS_YEAR = 'previous_year'.freeze
|
40
|
+
PREVIOUS_WEEK_TO_DATE = 'previous_week_to_date'.freeze
|
41
|
+
PREVIOUS_MONTH_TO_DATE = 'previous_month_to_date'.freeze
|
42
|
+
PREVIOUS_QUARTER_TO_DATE = 'previous_quarter_to_date'.freeze
|
43
|
+
PREVIOUS_YEAR_TO_DATE = 'previous_year_to_date'.freeze
|
44
|
+
PREVIOUS_X_DAYS = 'previous_x_days'.freeze
|
45
|
+
PREVIOUS_X_DAYS_TO_DATE = 'previous_x_days_to_date'.freeze
|
46
46
|
|
47
47
|
def self.all
|
48
|
-
constants
|
48
|
+
constants.map { |constant| const_get(constant) }
|
49
49
|
end
|
50
50
|
|
51
51
|
def self.exist?(operator_value)
|
52
|
-
|
53
|
-
when 'ILike'
|
54
|
-
operator_value = 'I_LIKE'
|
55
|
-
when 'IContains'
|
56
|
-
operator_value = 'I_CONTAINS'
|
57
|
-
when 'IStarts_With'
|
58
|
-
operator_value = 'I_STARTS_WITH'
|
59
|
-
when 'IEnds_With'
|
60
|
-
operator_value = 'I_ENDS_WITH'
|
61
|
-
end
|
62
|
-
|
63
|
-
all.include?(operator_value.upcase.to_sym)
|
52
|
+
all.include?(operator_value)
|
64
53
|
end
|
65
54
|
|
66
55
|
def self.interval_operators
|
data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/transforms/comparisons.rb
CHANGED
@@ -12,41 +12,41 @@ module ForestAdminDatasourceToolkit
|
|
12
12
|
{
|
13
13
|
depends_on: [Operators::IN],
|
14
14
|
for_types: ['String'],
|
15
|
-
replacer:
|
15
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::IN, value: [nil, ''] }) }
|
16
16
|
},
|
17
17
|
{
|
18
18
|
depends_on: [Operators::MISSING],
|
19
|
-
replacer:
|
19
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::MISSING }) }
|
20
20
|
}
|
21
21
|
],
|
22
22
|
Operators::MISSING => [
|
23
23
|
{
|
24
24
|
depends_on: [Operators::EQUAL],
|
25
|
-
replacer:
|
25
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::EQUAL, value: nil }) }
|
26
26
|
}
|
27
27
|
],
|
28
28
|
Operators::PRESENT => [
|
29
29
|
{
|
30
30
|
depends_on: [Operators::NOT_IN],
|
31
31
|
for_types: ['String'],
|
32
|
-
replacer:
|
32
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::NOT_IN, value: [nil, ''] }) }
|
33
33
|
},
|
34
34
|
{
|
35
35
|
depends_on: [Operators::NOT_EQUAL],
|
36
|
-
replacer:
|
36
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::NOT_EQUAL, value: nil }) }
|
37
37
|
}
|
38
38
|
],
|
39
39
|
Operators::EQUAL => [
|
40
40
|
{
|
41
41
|
depends_on: [Operators::IN],
|
42
|
-
replacer:
|
42
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::IN, value: [leaf.value] }) }
|
43
43
|
}
|
44
44
|
],
|
45
45
|
Operators::IN => [
|
46
46
|
{
|
47
47
|
depends_on: [Operators::EQUAL, Operators::MATCH],
|
48
48
|
for_types: ['String'],
|
49
|
-
replacer:
|
49
|
+
replacer: proc { |leaf|
|
50
50
|
values = leaf.value
|
51
51
|
conditions = []
|
52
52
|
|
@@ -68,7 +68,7 @@ module ForestAdminDatasourceToolkit
|
|
68
68
|
},
|
69
69
|
{
|
70
70
|
depends_on: [Operators::EQUAL],
|
71
|
-
replacer:
|
71
|
+
replacer: proc { |leaf|
|
72
72
|
ConditionTreeFactory.union(
|
73
73
|
leaf.value.map { |item| leaf.override({ operator: Operators::EQUAL, value: item }) }
|
74
74
|
)
|
@@ -78,14 +78,14 @@ module ForestAdminDatasourceToolkit
|
|
78
78
|
Operators::NOT_EQUAL => [
|
79
79
|
{
|
80
80
|
depends_on: [Operators::NOT_IN],
|
81
|
-
replacer:
|
81
|
+
replacer: proc { |leaf| leaf.override({ operator: Operators::NOT_IN, value: [leaf.value] }) }
|
82
82
|
}
|
83
83
|
],
|
84
84
|
Operators::NOT_IN => [
|
85
85
|
{
|
86
86
|
depends_on: [Operators::NOT_EQUAL, Operators::MATCH],
|
87
87
|
for_types: ['String'],
|
88
|
-
replacer:
|
88
|
+
replacer: proc { |leaf|
|
89
89
|
values = leaf.value
|
90
90
|
conditions = []
|
91
91
|
|
@@ -106,7 +106,7 @@ module ForestAdminDatasourceToolkit
|
|
106
106
|
},
|
107
107
|
{
|
108
108
|
depends_on: [Operators::NOT_EQUAL],
|
109
|
-
replacer:
|
109
|
+
replacer: proc { |leaf|
|
110
110
|
ConditionTreeFactory.intersect(
|
111
111
|
leaf.value.map { |item| leaf.override({ operator: Operators::NOT_EQUAL, value: item }) }
|
112
112
|
)
|
data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/transforms/pattern.rb
CHANGED
@@ -8,17 +8,17 @@ module ForestAdminDatasourceToolkit
|
|
8
8
|
operator = case_sensitive ? Operators::LIKE : Operators::I_LIKE
|
9
9
|
|
10
10
|
{
|
11
|
-
|
12
|
-
|
13
|
-
replacer:
|
11
|
+
depends_on: [operator],
|
12
|
+
for_types: ['String'],
|
13
|
+
replacer: proc { |leaf| leaf.override(operator: operator, value: get_pattern.call(leaf.value)) }
|
14
14
|
}
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.match(case_sensitive)
|
18
18
|
{
|
19
|
-
|
20
|
-
|
21
|
-
replacer:
|
19
|
+
depends_on: [Operators::MATCH],
|
20
|
+
for_types: ['String'],
|
21
|
+
replacer: proc { |leaf|
|
22
22
|
regex = leaf.value.gsub(/([\.\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-])/, '\\\\\1')
|
23
23
|
regex.gsub!('%', '.*')
|
24
24
|
regex.tr!('_', '.')
|
@@ -30,12 +30,12 @@ module ForestAdminDatasourceToolkit
|
|
30
30
|
|
31
31
|
def self.transforms
|
32
32
|
{
|
33
|
-
Operators::CONTAINS => [likes(
|
34
|
-
Operators::STARTS_WITH => [likes(
|
35
|
-
Operators::ENDS_WITH => [likes(
|
36
|
-
Operators::I_CONTAINS => [likes(
|
37
|
-
Operators::I_STARTS_WITH => [likes(
|
38
|
-
Operators::I_ENDS_WITH => [likes(
|
33
|
+
Operators::CONTAINS => [likes(proc { |value| "%#{value}%" }, true)],
|
34
|
+
Operators::STARTS_WITH => [likes(proc { |value| "#{value}%" }, true)],
|
35
|
+
Operators::ENDS_WITH => [likes(proc { |value| "%#{value}" }, true)],
|
36
|
+
Operators::I_CONTAINS => [likes(proc { |value| "%#{value}%" }, false)],
|
37
|
+
Operators::I_STARTS_WITH => [likes(proc { |value| "#{value}%" }, false)],
|
38
|
+
Operators::I_ENDS_WITH => [likes(proc { |value| "%#{value}" }, false)],
|
39
39
|
Operators::I_LIKE => [match(false)],
|
40
40
|
Operators::LIKE => [match(true)]
|
41
41
|
}
|
data/lib/forest_admin_datasource_toolkit/components/query/condition_tree/transforms/times.rb
CHANGED
@@ -13,9 +13,9 @@ module ForestAdminDatasourceToolkit
|
|
13
13
|
|
14
14
|
def self.compare(operator)
|
15
15
|
{
|
16
|
-
|
17
|
-
|
18
|
-
replacer:
|
16
|
+
depends_on: [operator],
|
17
|
+
for_types: ['Date', 'Dateonly'],
|
18
|
+
replacer: proc { |leaf, tz|
|
19
19
|
leaf.override(operator: operator, value: format(yield(Time.now.in_time_zone(tz), leaf.value)))
|
20
20
|
}
|
21
21
|
}
|
@@ -23,9 +23,9 @@ module ForestAdminDatasourceToolkit
|
|
23
23
|
|
24
24
|
def self.interval(start_fn, end_fn)
|
25
25
|
{
|
26
|
-
|
27
|
-
|
28
|
-
replacer:
|
26
|
+
depends_on: [Operators::LESS_THAN, Operators::GREATER_THAN],
|
27
|
+
for_types: ['Date', 'Dateonly'],
|
28
|
+
replacer: proc do |leaf, tz|
|
29
29
|
value_greater_than = if leaf.value.nil?
|
30
30
|
format(start_fn.call(Time.now.in_time_zone(tz)))
|
31
31
|
else
|
@@ -53,17 +53,21 @@ module ForestAdminDatasourceToolkit
|
|
53
53
|
|
54
54
|
def self.previous_interval(duration)
|
55
55
|
interval(
|
56
|
-
|
57
|
-
duration == 'quarter'
|
56
|
+
proc { |now|
|
57
|
+
if duration == 'quarter'
|
58
|
+
now.prev_quarter.send(:"beginning_of_#{duration}")
|
59
|
+
else
|
60
|
+
(now - 1.send(duration)).send(:"beginning_of_#{duration}")
|
61
|
+
end
|
58
62
|
},
|
59
|
-
|
63
|
+
proc { |now| now.send(:"beginning_of_#{duration}") }
|
60
64
|
)
|
61
65
|
end
|
62
66
|
|
63
67
|
def self.previous_interval_to_date(duration)
|
64
68
|
interval(
|
65
|
-
|
66
|
-
|
69
|
+
proc { |now| now.send(:"beginning_of_#{duration}") },
|
70
|
+
proc { |now| now }
|
67
71
|
)
|
68
72
|
end
|
69
73
|
|
@@ -86,20 +90,20 @@ module ForestAdminDatasourceToolkit
|
|
86
90
|
Operators::PREVIOUS_YEAR => [previous_interval('year')],
|
87
91
|
Operators::PREVIOUS_X_DAYS_TO_DATE => [
|
88
92
|
interval(
|
89
|
-
|
90
|
-
|
93
|
+
proc { |now, value| (now - value.days).beginning_of_day },
|
94
|
+
proc { |now, _value| now }
|
91
95
|
)
|
92
96
|
],
|
93
97
|
Operators::PREVIOUS_X_DAYS => [
|
94
98
|
interval(
|
95
|
-
|
96
|
-
|
99
|
+
proc { |now, value| (now - value.days).beginning_of_day },
|
100
|
+
proc { |now, _value| now.beginning_of_day }
|
97
101
|
)
|
98
102
|
],
|
99
103
|
Operators::TODAY => [
|
100
104
|
interval(
|
101
|
-
|
102
|
-
|
105
|
+
proc { |now| now.beginning_of_day },
|
106
|
+
proc { |now| (now + 1.day).beginning_of_day }
|
103
107
|
)
|
104
108
|
]
|
105
109
|
}
|
@@ -13,14 +13,13 @@ module ForestAdminDatasourceToolkit
|
|
13
13
|
# a reference to parent collections from children.
|
14
14
|
return unless child_collection.is_a?(CollectionDecorator)
|
15
15
|
|
16
|
-
|
17
|
-
child_collection.mark_schema_as_dirty = lambda {
|
16
|
+
child_collection.define_singleton_method(:mark_schema_as_dirty) do
|
18
17
|
# Call the original method (the child)
|
19
18
|
original_child_mark_schema_as_dirty.call(child_collection)
|
20
19
|
|
21
20
|
# Invalidate our schema (the parent)
|
22
21
|
mark_schema_as_dirty
|
23
|
-
|
22
|
+
end
|
24
23
|
end
|
25
24
|
|
26
25
|
def native_driver
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ForestAdminDatasourceToolkit
|
2
|
+
module Decorators
|
3
|
+
module Schema
|
4
|
+
class SchemaCollectionDecorator < CollectionDecorator
|
5
|
+
def initialize(child_collection, datasource)
|
6
|
+
super
|
7
|
+
@schema_override = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def override_schema(value)
|
11
|
+
@schema_override.merge!(value)
|
12
|
+
mark_schema_as_dirty
|
13
|
+
end
|
14
|
+
|
15
|
+
def refine_schema(sub_schema)
|
16
|
+
sub_schema.merge(@schema_override)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forest_admin_datasource_toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre.beta.
|
4
|
+
version: 1.0.0.pre.beta.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthieu
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- lib/forest_admin_datasource_toolkit/datasource.rb
|
85
85
|
- lib/forest_admin_datasource_toolkit/decorators/collection_decorator.rb
|
86
86
|
- lib/forest_admin_datasource_toolkit/decorators/datasource_decorator.rb
|
87
|
+
- lib/forest_admin_datasource_toolkit/decorators/schema/schema_collection_decorator.rb
|
87
88
|
- lib/forest_admin_datasource_toolkit/exceptions/forest_exception.rb
|
88
89
|
- lib/forest_admin_datasource_toolkit/schema/column_schema.rb
|
89
90
|
- lib/forest_admin_datasource_toolkit/schema/primitive_type.rb
|