scim2-filter 0.2.0 → 1.1.0
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/README.md +3 -1
- data/lib/scim2/filter/arel_handler.rb +90 -32
- data/lib/scim2/filter/parser.racc +10 -2
- data/lib/scim2/filter/parser.tab.rb +60 -48
- metadata +78 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a06f08d89647446182b280a6b6020b14f6d2507fc808aa3f60afa9d49882ebf
|
4
|
+
data.tar.gz: 01f68d9673c9bc6f938fe2fd7331a869efc90f64a810bb454e9388bcd10d9e74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94282e498fe69171d77a26e73c193c9e96383bb3175d1b1a648d2bc600348c7b36538eae341c35fcf160fa85a461ac14887ecdd6012f17d1c83ec17c9bcb0a57
|
7
|
+
data.tar.gz: 24b8bc2752a9c4d3d42561660fe8364f139bff8cc4767515c839b0e3f545f2b6058d420bed235a3b08af1f30ee036515b6bf4bfde6cd4da245a481ad1497450e
|
data/README.md
CHANGED
@@ -8,8 +8,10 @@
|
|
8
8
|
## Status
|
9
9
|
|
10
10
|
[](https://badge.fury.io/rb/scim2-filter)
|
11
|
-
[](https://github.com/david-mccullars/scim2-filter/actions?workflow=CI)
|
12
12
|
[](https://codeclimate.com/github/david-mccullars/scim2-filter)
|
13
|
+
[](https://codeclimate.com/github/david-mccullars/scim2-filter/coverage)
|
14
|
+
[](LICENSE)
|
13
15
|
|
14
16
|
|
15
17
|
## Description
|
@@ -15,19 +15,32 @@ module Scim2
|
|
15
15
|
# # "users"."name" LIKE 'J%'
|
16
16
|
#
|
17
17
|
# @example
|
18
|
-
# # urn:ietf:params:scim:schemas:core:2.0:User:userType ne "Employee" and not (
|
18
|
+
# # urn:ietf:params:scim:schemas:core:2.0:User:userType ne "Employee" and not (name.familyName.value co "ab" or name.familyName.value co "xy")
|
19
19
|
#
|
20
20
|
# mapping = {
|
21
21
|
# userType: User.arel_table[:type],
|
22
|
-
#
|
23
|
-
#
|
22
|
+
# name: {
|
23
|
+
# familyName: User.arel_table[:family_name],
|
24
24
|
# },
|
25
25
|
# }
|
26
26
|
#
|
27
|
-
# # "users"."type" != 'Employee' AND NOT ("users"."
|
27
|
+
# # "users"."type" != 'Employee' AND NOT ("users"."family_name" LIKE '%ab%' OR "users"."family_name" LIKE '%xy%')
|
28
28
|
#
|
29
|
-
# @
|
30
|
-
#
|
29
|
+
# @example
|
30
|
+
# # emails[type eq "work" and value ew "example.com"]
|
31
|
+
#
|
32
|
+
# mapping = {
|
33
|
+
# emails: ->(path, op, value) {
|
34
|
+
# case path
|
35
|
+
# when [:type]
|
36
|
+
# User.arel_table[:email_type]
|
37
|
+
# when [:value]
|
38
|
+
# User.arel_table[:email]
|
39
|
+
# end
|
40
|
+
# },
|
41
|
+
# }
|
42
|
+
#
|
43
|
+
# # "users"."email_type" = 'work' AND "users"."email" LIKE '%example.com'
|
31
44
|
##
|
32
45
|
class ArelHandler
|
33
46
|
|
@@ -52,30 +65,8 @@ module Scim2
|
|
52
65
|
# @return [Hash<Symbol, Object>]
|
53
66
|
def on_attribute_filter(attribute_path, value, context:, op:, schema: nil)
|
54
67
|
arel = lookup_arel(attribute_path)
|
55
|
-
|
56
|
-
|
57
|
-
arel.eq(value)
|
58
|
-
when :ne
|
59
|
-
arel.not_eq(value)
|
60
|
-
when :co
|
61
|
-
arel.matches("%#{value}%")
|
62
|
-
when :sw
|
63
|
-
arel.matches("#{value}%")
|
64
|
-
when :ew
|
65
|
-
arel.matches("%#{value}")
|
66
|
-
when :gt
|
67
|
-
arel.gt(value)
|
68
|
-
when :ge
|
69
|
-
arel.gteq(value)
|
70
|
-
when :lt
|
71
|
-
arel.lt(value)
|
72
|
-
when :le
|
73
|
-
arel.lteq(value)
|
74
|
-
when :pr
|
75
|
-
arel.not_eq(nil)
|
76
|
-
else
|
77
|
-
raise Racc::ParseError, "invalid attribute operand #{op.inspect} with argument #{value.inspect}"
|
78
|
-
end
|
68
|
+
arel = arel.call(attribute_path, op, value) if arel.is_a?(Proc)
|
69
|
+
apply_arel_operation(arel, op, value) or raise Racc::ParseError, "invalid attribute operand #{op.inspect} with argument #{value.inspect}"
|
79
70
|
end
|
80
71
|
|
81
72
|
# Handle logical filters (e.g. `name.givenName sw "D" AND title co "VP"`)
|
@@ -94,32 +85,99 @@ module Scim2
|
|
94
85
|
end
|
95
86
|
end
|
96
87
|
|
88
|
+
# Begins capturing nested filter conditions inside a SimpleHandler
|
89
|
+
# @return nil
|
90
|
+
def before_nested_filter(*_ignored)
|
91
|
+
@nested_filter_handler = SimpleHandler.new
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
|
97
95
|
# Handle nested filters (e.g. `emails[type eq "work"]`)
|
98
96
|
# @param attribute_path [Array<Symbol>] the attribute name(s) being filtered on, split by `.`
|
99
97
|
# @param filter [Hash<Symbol, Object>] the nested filter inside the backets
|
100
98
|
# @param schema [String] schema namespace of the attribute
|
101
99
|
# @return [Hash<Symbol, Object>]
|
102
100
|
def on_nested_filter(attribute_path, filter, context:, schema: nil)
|
103
|
-
|
101
|
+
@nested_filter_handler = nil
|
102
|
+
arel = lookup_arel(attribute_path)
|
103
|
+
recursively_handle_nested_filter(arel, *filter.first)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Wrap the following methods with logic that delegates to nested_filter_handler
|
107
|
+
# if it responds to the method.
|
108
|
+
%i[on_not_filter on_attribute_filter on_logical_filter].each do |name|
|
109
|
+
orig = "___#{name}".to_sym
|
110
|
+
define_method(orig, instance_method(name))
|
111
|
+
send(:private, orig)
|
112
|
+
|
113
|
+
define_method(name) do |*args, **opts|
|
114
|
+
if @nested_filter_handler.respond_to?(name)
|
115
|
+
@nested_filter_handler.send(name, *args, **opts)
|
116
|
+
else
|
117
|
+
send(orig, *args, **opts)
|
118
|
+
end
|
119
|
+
end
|
104
120
|
end
|
105
121
|
|
106
122
|
protected
|
107
123
|
|
124
|
+
def apply_arel_operation(arel, op, value)
|
125
|
+
case op
|
126
|
+
when :eq
|
127
|
+
arel.eq(value)
|
128
|
+
when :ne
|
129
|
+
arel.not_eq(value)
|
130
|
+
when :co
|
131
|
+
arel.matches("%#{value}%")
|
132
|
+
when :sw
|
133
|
+
arel.matches("#{value}%")
|
134
|
+
when :ew
|
135
|
+
arel.matches("%#{value}")
|
136
|
+
when :gt
|
137
|
+
arel.gt(value)
|
138
|
+
when :ge
|
139
|
+
arel.gteq(value)
|
140
|
+
when :lt
|
141
|
+
arel.lt(value)
|
142
|
+
when :le
|
143
|
+
arel.lteq(value)
|
144
|
+
when :pr
|
145
|
+
arel.not_eq(nil)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
108
149
|
# Looks up the arel object from the mapping according to the given attribute path
|
109
150
|
# @param attribute_path [Array<Symbol>] the attribute name(s) being filtered on, split by `.`
|
110
151
|
# @return [Object] the object returned by the mapping
|
111
152
|
def lookup_arel(attribute_path)
|
112
153
|
arel = arel_mapping.dig(*attribute_path)
|
154
|
+
|
113
155
|
case arel
|
114
156
|
when NilClass
|
115
157
|
raise ArgumentError, "Attribute #{attribute_path.join(',').inspect} not found in mapping"
|
116
|
-
when Arel::Predications
|
158
|
+
when Arel::Predications, Proc
|
117
159
|
arel
|
118
160
|
else
|
119
161
|
raise ArgumentError, "Mapping for attribute #{attribute_path.join(',').inspect} is not a valid arel object"
|
120
162
|
end
|
121
163
|
end
|
122
164
|
|
165
|
+
def recursively_handle_nested_filter(arel, op, condition)
|
166
|
+
case op
|
167
|
+
when :not
|
168
|
+
recursively_handle_nested_filter(arel, *condition.first).not
|
169
|
+
when :and, :or
|
170
|
+
condition.map do |c|
|
171
|
+
recursively_handle_nested_filter(arel, *c.first)
|
172
|
+
end.reduce(op)
|
173
|
+
else
|
174
|
+
path, value = condition.values_at(:path, :value)
|
175
|
+
arel = arel.call(path, op, value) if arel.is_a?(Proc)
|
176
|
+
arel = apply_arel_operation(arel, op, value) if arel && !arel.is_a?(Arel::Nodes::Node)
|
177
|
+
arel || Arel::Nodes::False.new
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
123
181
|
end
|
124
182
|
end
|
125
183
|
end
|
@@ -49,12 +49,20 @@ rule
|
|
49
49
|
}
|
50
50
|
|
51
51
|
nested_filter
|
52
|
-
:
|
52
|
+
: nested_filter_start filter RBRACKET
|
53
53
|
{
|
54
|
-
attr,
|
54
|
+
attr, filter, _ = val
|
55
55
|
result = handler.on_nested_filter(attr[:path], filter, schema: attr[:schema], context: result)
|
56
56
|
}
|
57
57
|
|
58
|
+
nested_filter_start
|
59
|
+
: attr_path LBRACKET
|
60
|
+
{
|
61
|
+
attr, _ = val
|
62
|
+
handler.before_nested_filter(attr[:path], schema: attr[:schema], context: result) if handler.respond_to?(:before_nested_filter)
|
63
|
+
result = attr
|
64
|
+
}
|
65
|
+
|
58
66
|
grouped_filter
|
59
67
|
: LPAREN filter RPAREN
|
60
68
|
{
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.
|
3
|
+
# This file is automatically generated by Racc 1.6.0
|
4
4
|
# from Racc grammar file "".
|
5
5
|
#
|
6
6
|
|
@@ -11,48 +11,48 @@ module Scim2
|
|
11
11
|
##### State transition tables begin ###
|
12
12
|
|
13
13
|
racc_action_table = [
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
21, 22, 23, 24, 25, 26, 27, 28, 29, 18,
|
15
|
+
15, 11, 10, 17, 10, 20, 11, 10, 11, 10,
|
16
|
+
14, 12, 14, 16, 34, 14, 12, 14, 12, 11,
|
17
|
+
10, 11, 10, 40, 39, 41, 42, 16, 14, 12,
|
18
|
+
14, 12, 43, 16, 35, 34, 44, 45, 17 ]
|
19
19
|
|
20
20
|
racc_action_check = [
|
21
21
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
22
|
-
1, 0, 0, 2,
|
23
|
-
0, 0,
|
24
|
-
16,
|
25
|
-
|
22
|
+
1, 0, 0, 2, 11, 8, 9, 9, 10, 10,
|
23
|
+
0, 0, 12, 1, 13, 9, 9, 10, 10, 16,
|
24
|
+
16, 17, 17, 19, 19, 19, 19, 30, 16, 16,
|
25
|
+
17, 17, 30, 31, 15, 33, 31, 34, 36 ]
|
26
26
|
|
27
27
|
racc_action_pointer = [
|
28
28
|
-3, 10, 1, nil, nil, nil, nil, nil, -2, 2,
|
29
|
-
-1, -1, -1, nil, 44,
|
30
|
-
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
31
|
-
nil, 20, 24, nil, 36, nil, nil, nil,
|
32
|
-
nil,
|
29
|
+
4, -1, -1, -1, nil, 44, 15, 17, nil, 14,
|
30
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
31
|
+
24, 30, nil, 20, 24, nil, 36, nil, nil, nil,
|
32
|
+
nil, nil, nil, nil, nil, nil ]
|
33
33
|
|
34
34
|
racc_action_default = [
|
35
|
-
-
|
36
|
-
-
|
37
|
-
-
|
38
|
-
-
|
39
|
-
-30, -31, -
|
35
|
+
-32, -32, -1, -3, -5, -6, -7, -8, -32, -32,
|
36
|
+
-32, -32, -32, -16, -18, -32, -32, -32, -9, -32,
|
37
|
+
-12, -19, -20, -21, -22, -23, -24, -25, -26, -27,
|
38
|
+
-32, -32, -14, -15, -32, 46, -2, -4, -10, -28,
|
39
|
+
-29, -30, -31, -11, -13, -17 ]
|
40
40
|
|
41
41
|
racc_goto_table = [
|
42
|
-
1,
|
43
|
-
|
42
|
+
1, 36, 37, 32, 19, 38, 33, nil, nil, 30,
|
43
|
+
31 ]
|
44
44
|
|
45
45
|
racc_goto_check = [
|
46
|
-
1, 2, 3, 6, 9, 10,
|
47
|
-
|
46
|
+
1, 2, 3, 6, 9, 10, 12, nil, nil, 1,
|
47
|
+
1 ]
|
48
48
|
|
49
49
|
racc_goto_pointer = [
|
50
|
-
nil, 0, -
|
51
|
-
-
|
50
|
+
nil, 0, -15, -15, nil, nil, -8, nil, nil, -4,
|
51
|
+
-14, nil, -6 ]
|
52
52
|
|
53
53
|
racc_goto_default = [
|
54
54
|
nil, nil, 2, 3, 4, 5, 6, 7, 8, nil,
|
55
|
-
nil,
|
55
|
+
nil, 9, 13 ]
|
56
56
|
|
57
57
|
racc_reduce_table = [
|
58
58
|
0, 0, :racc_error,
|
@@ -66,13 +66,14 @@ racc_reduce_table = [
|
|
66
66
|
1, 29, :_reduce_none,
|
67
67
|
2, 30, :_reduce_9,
|
68
68
|
3, 30, :_reduce_10,
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
2,
|
73
|
-
|
74
|
-
|
75
|
-
|
69
|
+
3, 31, :_reduce_11,
|
70
|
+
2, 37, :_reduce_12,
|
71
|
+
3, 32, :_reduce_13,
|
72
|
+
2, 33, :_reduce_14,
|
73
|
+
2, 34, :_reduce_15,
|
74
|
+
1, 34, :_reduce_16,
|
75
|
+
3, 38, :_reduce_17,
|
76
|
+
1, 38, :_reduce_18,
|
76
77
|
1, 35, :_reduce_none,
|
77
78
|
1, 35, :_reduce_none,
|
78
79
|
1, 35, :_reduce_none,
|
@@ -87,9 +88,9 @@ racc_reduce_table = [
|
|
87
88
|
1, 36, :_reduce_none,
|
88
89
|
1, 36, :_reduce_none ]
|
89
90
|
|
90
|
-
racc_reduce_n =
|
91
|
+
racc_reduce_n = 32
|
91
92
|
|
92
|
-
racc_shift_n =
|
93
|
+
racc_shift_n = 46
|
93
94
|
|
94
95
|
racc_token_table = {
|
95
96
|
false => 0,
|
@@ -177,6 +178,7 @@ Racc_token_to_s_table = [
|
|
177
178
|
"attr_path",
|
178
179
|
"comp_op",
|
179
180
|
"comp_value",
|
181
|
+
"nested_filter_start",
|
180
182
|
"attr_path_elements" ]
|
181
183
|
|
182
184
|
Racc_debug_parser = false
|
@@ -235,7 +237,7 @@ module_eval(<<'.,.,', 'parser.racc', 46)
|
|
235
237
|
|
236
238
|
module_eval(<<'.,.,', 'parser.racc', 53)
|
237
239
|
def _reduce_11(val, _values, result)
|
238
|
-
attr,
|
240
|
+
attr, filter, _ = val
|
239
241
|
result = handler.on_nested_filter(attr[:path], filter, schema: attr[:schema], context: result)
|
240
242
|
|
241
243
|
result
|
@@ -244,14 +246,24 @@ module_eval(<<'.,.,', 'parser.racc', 53)
|
|
244
246
|
|
245
247
|
module_eval(<<'.,.,', 'parser.racc', 60)
|
246
248
|
def _reduce_12(val, _values, result)
|
247
|
-
|
249
|
+
attr, _ = val
|
250
|
+
handler.before_nested_filter(attr[:path], schema: attr[:schema], context: result) if handler.respond_to?(:before_nested_filter)
|
251
|
+
result = attr
|
248
252
|
|
249
253
|
result
|
250
254
|
end
|
251
255
|
.,.,
|
252
256
|
|
253
|
-
module_eval(<<'.,.,', 'parser.racc',
|
257
|
+
module_eval(<<'.,.,', 'parser.racc', 68)
|
254
258
|
def _reduce_13(val, _values, result)
|
259
|
+
result = val[1]
|
260
|
+
|
261
|
+
result
|
262
|
+
end
|
263
|
+
.,.,
|
264
|
+
|
265
|
+
module_eval(<<'.,.,', 'parser.racc', 74)
|
266
|
+
def _reduce_14(val, _values, result)
|
255
267
|
_, filter = val
|
256
268
|
result = handler.on_not_filter(filter, context: result)
|
257
269
|
|
@@ -259,8 +271,8 @@ module_eval(<<'.,.,', 'parser.racc', 66)
|
|
259
271
|
end
|
260
272
|
.,.,
|
261
273
|
|
262
|
-
module_eval(<<'.,.,', 'parser.racc',
|
263
|
-
def
|
274
|
+
module_eval(<<'.,.,', 'parser.racc', 81)
|
275
|
+
def _reduce_15(val, _values, result)
|
264
276
|
schema, path = val
|
265
277
|
result = { schema: schema, path: path }
|
266
278
|
|
@@ -268,32 +280,30 @@ module_eval(<<'.,.,', 'parser.racc', 73)
|
|
268
280
|
end
|
269
281
|
.,.,
|
270
282
|
|
271
|
-
module_eval(<<'.,.,', 'parser.racc',
|
272
|
-
def
|
283
|
+
module_eval(<<'.,.,', 'parser.racc', 86)
|
284
|
+
def _reduce_16(val, _values, result)
|
273
285
|
result = { path: val.last }
|
274
286
|
|
275
287
|
result
|
276
288
|
end
|
277
289
|
.,.,
|
278
290
|
|
279
|
-
module_eval(<<'.,.,', 'parser.racc',
|
280
|
-
def
|
291
|
+
module_eval(<<'.,.,', 'parser.racc', 92)
|
292
|
+
def _reduce_17(val, _values, result)
|
281
293
|
result = [*val.first, val.last]
|
282
294
|
|
283
295
|
result
|
284
296
|
end
|
285
297
|
.,.,
|
286
298
|
|
287
|
-
module_eval(<<'.,.,', 'parser.racc',
|
288
|
-
def
|
299
|
+
module_eval(<<'.,.,', 'parser.racc', 96)
|
300
|
+
def _reduce_18(val, _values, result)
|
289
301
|
result = [val.last]
|
290
302
|
|
291
303
|
result
|
292
304
|
end
|
293
305
|
.,.,
|
294
306
|
|
295
|
-
# reduce 18 omitted
|
296
|
-
|
297
307
|
# reduce 19 omitted
|
298
308
|
|
299
309
|
# reduce 20 omitted
|
@@ -318,6 +328,8 @@ module_eval(<<'.,.,', 'parser.racc', 88)
|
|
318
328
|
|
319
329
|
# reduce 30 omitted
|
320
330
|
|
331
|
+
# reduce 31 omitted
|
332
|
+
|
321
333
|
def _reduce_none(val, _values, result)
|
322
334
|
val[0]
|
323
335
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scim2-filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David McCullars
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: racc
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '6.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: github-markup
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +114,14 @@ dependencies:
|
|
86
114
|
requirements:
|
87
115
|
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
117
|
+
version: '0'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
122
|
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
124
|
+
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: rubocop
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +136,48 @@ dependencies:
|
|
108
136
|
- - ">="
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-rake
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rubocop-rspec
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.17.0
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.17.0
|
111
181
|
- !ruby/object:Gem::Dependency
|
112
182
|
name: sqlite3
|
113
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,7 +233,8 @@ files:
|
|
163
233
|
homepage: https://github.com/david-mccullars/scim2-filter
|
164
234
|
licenses:
|
165
235
|
- MIT
|
166
|
-
metadata:
|
236
|
+
metadata:
|
237
|
+
rubygems_mfa_required: 'true'
|
167
238
|
post_install_message:
|
168
239
|
rdoc_options: []
|
169
240
|
require_paths:
|
@@ -172,14 +243,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
243
|
requirements:
|
173
244
|
- - ">="
|
174
245
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
246
|
+
version: 3.0.0
|
176
247
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
248
|
requirements:
|
178
249
|
- - ">="
|
179
250
|
- !ruby/object:Gem::Version
|
180
251
|
version: '0'
|
181
252
|
requirements: []
|
182
|
-
rubygems_version: 3.2.
|
253
|
+
rubygems_version: 3.2.32
|
183
254
|
signing_key:
|
184
255
|
specification_version: 4
|
185
256
|
summary: Parser for SCIM query filters
|