diff options
| author | mo khan <mo.khan@gmail.com> | 2020-06-13 09:17:45 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-06-13 09:34:57 -0600 |
| commit | e7d7574c7d609e4d7899e772eed92b0bcd3eeefc (patch) | |
| tree | 48f7a05a6aa334000fd8dfa9f433f23cbe821392 | |
| parent | e5bfdb0dd3cf8d79bce3f8e400c2970e59c00a3b (diff) | |
Use scim-kit visitor
| -rw-r--r-- | app/models/scim/search.rb | 49 | ||||
| -rw-r--r-- | app/models/scim/visitor.rb | 26 | ||||
| -rw-r--r-- | spec/factories/scim.rb | 2 |
3 files changed, 6 insertions, 71 deletions
diff --git a/app/models/scim/search.rb b/app/models/scim/search.rb index a0a9b45..3008afc 100644 --- a/app/models/scim/search.rb +++ b/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 diff --git a/app/models/scim/visitor.rb b/app/models/scim/visitor.rb index 85898f3..af3981b 100644 --- a/app/models/scim/visitor.rb +++ b/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)) diff --git a/spec/factories/scim.rb b/spec/factories/scim.rb index 93f07f9..d19614a 100644 --- a/spec/factories/scim.rb +++ b/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 } |
