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 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