scim2-filter 0.2.0 → 1.1.0

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: 8e97f1535209f959f102bff6a8d05ab2b0be5284f99482a34bcdfe36030c949b
4
- data.tar.gz: b69d559219489bfdd64a90af1c6cbc8bbb86576514d83ab985da04ddb0250dee
3
+ metadata.gz: 1a06f08d89647446182b280a6b6020b14f6d2507fc808aa3f60afa9d49882ebf
4
+ data.tar.gz: 01f68d9673c9bc6f938fe2fd7331a869efc90f64a810bb454e9388bcd10d9e74
5
5
  SHA512:
6
- metadata.gz: 4aee232a4ffb1bc1a6138d96702d10c7d53face887c05522671d2079fef7e87846b1db9cbc184e976100094de729b0d38cb7db9d5b473db94811c96f4d51fe9e
7
- data.tar.gz: 1f1af70c8fbb720e9b8b38ecc95b9d4e33cc5d7565393852598c661ca6770e35dd17a34b0fec24dc4f2ea9474fea74adddf5091e04bf5d8e021f937c5077200f
6
+ metadata.gz: 94282e498fe69171d77a26e73c193c9e96383bb3175d1b1a648d2bc600348c7b36538eae341c35fcf160fa85a461ac14887ecdd6012f17d1c83ec17c9bcb0a57
7
+ data.tar.gz: 24b8bc2752a9c4d3d42561660fe8364f139bff8cc4767515c839b0e3f545f2b6058d420bed235a3b08af1f30ee036515b6bf4bfde6cd4da245a481ad1497450e
data/README.md CHANGED
@@ -8,8 +8,10 @@
8
8
  ## Status
9
9
 
10
10
  [![Gem Version](https://badge.fury.io/rb/scim2-filter.svg)](https://badge.fury.io/rb/scim2-filter)
11
- [![Travis Build Status](https://travis-ci.org/david-mccullars/scim2-filter.svg?branch=master)](https://travis-ci.org/david-mccullars/scim2-filter)
11
+ [![Build Status](https://github.com/david-mccullars/scim2-filter/workflows/CI/badge.svg)](https://github.com/david-mccullars/scim2-filter/actions?workflow=CI)
12
12
  [![Code Climate](https://codeclimate.com/github/david-mccullars/scim2-filter/badges/gpa.svg)](https://codeclimate.com/github/david-mccullars/scim2-filter)
13
+ [![Test Coverage](https://codeclimate.com/github/david-mccullars/scim2-filter/badges/coverage.svg)](https://codeclimate.com/github/david-mccullars/scim2-filter/coverage)
14
+ [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](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 (emails.value co "example.com" or emails.value co "example.org")
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
- # emails: {
23
- # value: User.arel_table[:email],
22
+ # name: {
23
+ # familyName: User.arel_table[:family_name],
24
24
  # },
25
25
  # }
26
26
  #
27
- # # "users"."type" != 'Employee' AND NOT ("users"."email" LIKE '%example.com' OR "users"."email" LIKE '%example.org%')
27
+ # # "users"."type" != 'Employee' AND NOT ("users"."family_name" LIKE '%ab%' OR "users"."family_name" LIKE '%xy%')
28
28
  #
29
- # @note Nested filters (e.g. `emails[type eq "work"]` are not supported at this
30
- # time and will result in an `ArgumentError`
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
- case op
56
- when :eq
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
- raise ArgumentError, 'Nested attributes are not currently supported for AREL'
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
- : attr_path LBRACKET filter RBRACKET
52
+ : nested_filter_start filter RBRACKET
53
53
  {
54
- attr, _, filter, _ = val
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.5.2
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
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 17,
15
- 14, 10, 9, 16, 9, 19, 10, 9, 10, 9,
16
- 13, 11, 13, 15, 32, 13, 11, 13, 11, 10,
17
- 9, 10, 9, 38, 37, 39, 40, 15, 13, 11,
18
- 13, 11, 44, 15, 33, 32, 42, 43, 16 ]
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, 10, 8, 9, 9, 15, 15,
23
- 0, 0, 11, 1, 12, 9, 9, 15, 15, 16,
24
- 16, 19, 19, 18, 18, 18, 18, 41, 16, 16,
25
- 19, 19, 41, 29, 14, 31, 29, 32, 34 ]
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, 4, 15, nil, 14, 17,
30
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 30,
31
- nil, 20, 24, nil, 36, nil, nil, nil, nil, nil,
32
- nil, 24, nil, nil, 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
- -31, -31, -1, -3, -5, -6, -7, -8, -31, -31,
36
- -31, -31, -15, -17, -31, -31, -31, -9, -31, -31,
37
- -18, -19, -20, -21, -22, -23, -24, -25, -26, -31,
38
- -13, -14, -31, 45, -2, -4, -10, -27, -28, -29,
39
- -30, -31, -12, -16, -11 ]
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, 34, 35, 30, 18, 36, 31, nil, nil, 29,
43
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 41 ]
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, 11, nil, nil, 1,
47
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 1 ]
46
+ 1, 2, 3, 6, 9, 10, 12, nil, nil, 1,
47
+ 1 ]
48
48
 
49
49
  racc_goto_pointer = [
50
- nil, 0, -14, -14, nil, nil, -7, nil, nil, -4,
51
- -13, -5 ]
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, 12 ]
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
- 4, 31, :_reduce_11,
70
- 3, 32, :_reduce_12,
71
- 2, 33, :_reduce_13,
72
- 2, 34, :_reduce_14,
73
- 1, 34, :_reduce_15,
74
- 3, 37, :_reduce_16,
75
- 1, 37, :_reduce_17,
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 = 31
91
+ racc_reduce_n = 32
91
92
 
92
- racc_shift_n = 45
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, _, filter, _ = val
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
- result = val[1]
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', 66)
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', 73)
263
- def _reduce_14(val, _values, result)
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', 78)
272
- def _reduce_15(val, _values, result)
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', 84)
280
- def _reduce_16(val, _values, result)
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', 88)
288
- def _reduce_17(val, _values, result)
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: 0.2.0
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: 2021-05-14 00:00:00.000000000 Z
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: '3.0'
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: '3.0'
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: '0'
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.3
253
+ rubygems_version: 3.2.32
183
254
  signing_key:
184
255
  specification_version: 4
185
256
  summary: Parser for SCIM query filters