Commit e7d7574
Changed files (3)
app
models
scim
spec
factories
app/models/scim/search.rb
@@ -2,50 +2,6 @@
module Scim
class Search
- class Node
- def initialize(hash)
- @hash = hash
- end
-
- def operator
- self[:operator].to_sym
- end
-
- def attribute
- self[:attribute].to_s
- end
-
- def value
- self[:value].to_s[1..-2]
- end
-
- def not?
- @hash.key?(:not)
- end
-
- def accept(visitor)
- visitor.visit(self)
- end
-
- def left
- self.class.new(self[:left])
- end
-
- def right
- self.class.new(self[:right])
- end
-
- def inspect
- @hash.inspect
- end
-
- private
-
- def [](key)
- @hash[key]
- end
- end
-
def initialize(clazz)
@clazz = clazz
end
@@ -53,8 +9,9 @@ module Scim
def for(filter)
return @clazz.all if filter.blank?
- node = Scim::Search::Node.new(::Scim::Kit::V2::Filter.new.parse(filter))
- node.accept(Scim::Visitor.new(@clazz, @clazz.scim_mapper))
+ ::Scim::Kit::V2::Filter
+ .parse(filter)
+ .accept(Scim::Visitor.new(@clazz, @clazz.scim_mapper))
end
end
end
app/models/scim/visitor.rb
@@ -1,37 +1,15 @@
# frozen_string_literal: true
module Scim
- class Visitor
+ class Visitor < Scim::Kit::V2::Filter::Visitor
include Varkon
- VISITORS = {
- and: :visit_and,
- co: :visit_contains,
- eq: :visit_equals,
- ew: :visit_ends_with,
- ge: :visit_greater_than_equals,
- gt: :visit_greater_than,
- le: :visit_less_than_equals,
- lt: :visit_less_than,
- ne: :visit_not_equals,
- or: :visit_or,
- pr: :visit_presence,
- sw: :visit_starts_with,
- }.freeze
def initialize(clazz, mapper = {})
@clazz = clazz
@mapper = mapper
end
- def visit(node)
- visitor_for(node).call(node)
- end
-
- private
-
- def visitor_for(node)
- method(VISITORS.fetch(node.operator, :visit_unknown))
- end
+ protected
def visit_and(node)
visit(node.left).merge(visit(node.right))
spec/factories/scim.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
FactoryBot.define do
- factory :scim_user, class: SCIM::User do
+ factory :scim_user, class: 'SCIM::User' do
schemas { ["urn:ietf:params:scim:schemas:core:2.0:User"] }
userName { FFaker::Internet.email }
locale { I18n.available_locales.sample.to_s }