Commit 9443973

mo <mo.khan@gmail.com>
2019-06-02 05:20:51
rename classes and methods
1 parent fffcefe
Changed files (6)
app/controllers/scim/v2/users_controller.rb
@@ -12,7 +12,7 @@ module Scim
       def index
         @users =
           if params[:filter].present?
-            User.order(:created_at).scim_filter_for(params[:filter])
+            User.order(:created_at).scim_search(params[:filter])
           else
             User.order(:created_at)
           end
app/models/scim/search.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Scim
+  class Search
+    class Node
+      def initialize(node)
+        @node = node
+      end
+
+      def operator
+        @node[:operator].to_sym
+      end
+
+      def attribute
+        @node[:attribute].to_s
+      end
+
+      def value
+        @node[:value].to_s[1..-2]
+      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 self.parse(query)
+        new(::Scim::Kit::V2::Filter.new.parse(query))
+      end
+
+      private
+
+      def [](key)
+        @node[key]
+      end
+    end
+
+    def self.results_for(filter, clazz, mapper)
+      node = Scim::Search::Node.parse(filter)
+      node.accept(Scim::Visitor.new(clazz, mapper))
+    end
+  end
+end
app/models/scim/visitor.rb
@@ -1,46 +1,6 @@
 # frozen_string_literal: true
 
 module Scim
-  class Node
-    def initialize(node)
-      @node = node
-    end
-
-    def operator
-      @node[:operator].to_sym
-    end
-
-    def attribute
-      @node[:attribute].to_s
-    end
-
-    def value
-      @node[:value].to_s[1..-2]
-    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 self.parse(query)
-      new(Scim::Kit::V2::Filter.new.parse(query))
-    end
-
-    private
-
-    def [](key)
-      @node[key]
-    end
-  end
-
   class Visitor
     def initialize(clazz, mapper = {})
       @clazz = clazz
@@ -78,11 +38,6 @@ module Scim
       end
     end
 
-    def self.result_for(filter)
-      node = Scim::Node.parse(filter)
-      node.accept(new(User, SCIM::User::ATTRIBUTES))
-    end
-
     private
 
     def value_from(node)
app/models/user.rb
@@ -13,7 +13,7 @@ class User < ApplicationRecord
   validates :timezone, inclusion: VALID_TIMEZONES
   validates :locale, inclusion: VALID_LOCALES
 
-  scope :scim_filter_for, ->(filter) { Scim::Visitor.result_for(filter) }
+  scope :scim_search, ->(filter) { Scim::Search.results_for(filter, User, SCIM::User::ATTRIBUTES) }
 
   def name_id_for(name_id_format)
     Saml::Kit::Namespaces::PERSISTENT == name_id_format ? id : email
spec/models/scim/visitor_spec.rb
@@ -8,45 +8,40 @@ RSpec.describe ::Scim::Visitor do
   describe "#visit" do
     let!(:users) { create_list(:user, 10) }
     let(:random_user) { users.sample }
-    let(:parser) { Scim::Kit::V2::Filter.new }
-
-    def tree_for(filter)
-      parser.parse(filter)
-    end
 
     specify do
-      results = described_class.result_for("userName pr")
+      results = Scim::Search::Node.parse("userName pr").accept(subject)
       expect(results.to_sql).to eql(User.where.not(email: nil).to_sql)
       expect(results).to match_array(users)
     end
 
     pending do
-      results = Scim::Node.parse("userName pr and not (userName eq \"#{random_user.email}\")").accept(subject)
+      results = Scim::Search::Node.parse("userName pr and not (userName eq \"#{random_user.email}\")").accept(subject)
       expect(results).to match_array(users - [random_user])
     end
 
     specify do
-      results = Scim::Node.parse("userName eq \"#{random_user.email}\"").accept(subject)
+      results = Scim::Search::Node.parse("userName eq \"#{random_user.email}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = Scim::Node.parse("userName ne \"#{random_user.email}\"").accept(subject)
+      results = Scim::Search::Node.parse("userName ne \"#{random_user.email}\"").accept(subject)
       expect(results.pluck(:email)).not_to include(random_user.email)
     end
 
     specify do
-      results = Scim::Node.parse("userName co \"#{random_user.email[1..-2]}\"").accept(subject)
+      results = Scim::Search::Node.parse("userName co \"#{random_user.email[1..-2]}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = Scim::Node.parse("userName sw \"#{random_user.email[0..3]}\"").accept(subject)
+      results = Scim::Search::Node.parse("userName sw \"#{random_user.email[0..3]}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = Scim::Node.parse("userName ew \"#{random_user.email[-8..-1]}\"").accept(subject)
+      results = Scim::Search::Node.parse("userName ew \"#{random_user.email[-8..-1]}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
@@ -54,7 +49,7 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = Scim::Node.parse("meta.lastModified gt \"#{Time.now.iso8601}\"").accept(subject)
+      results = Scim::Search::Node.parse("meta.lastModified gt \"#{Time.now.iso8601}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
@@ -62,7 +57,7 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = Scim::Node.parse("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"").accept(subject)
+      results = Scim::Search::Node.parse("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
@@ -70,7 +65,7 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = Scim::Node.parse("meta.lastModified lt \"#{Time.now.iso8601}\"").accept(subject)
+      results = Scim::Search::Node.parse("meta.lastModified lt \"#{Time.now.iso8601}\"").accept(subject)
       expect(results).to match_array(users - [random_user])
     end
 
@@ -78,14 +73,14 @@ RSpec.describe ::Scim::Visitor do
       freeze_time
       random_user.update!(updated_at: 10.minutes.ago)
 
-      results = Scim::Node.parse("meta.lastModified le \"#{random_user.updated_at.iso8601}\"").accept(subject)
+      results = Scim::Search::Node.parse("meta.lastModified le \"#{random_user.updated_at.iso8601}\"").accept(subject)
       expect(results).to match_array([random_user])
     end
 
     context "when searching for condition a OR condition b" do
       let(:first_user) { users.sample }
       let(:second_user) { users.sample }
-      let(:results) { Scim::Node.parse(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")).accept(subject) }
+      let(:results) { Scim::Search::Node.parse(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")).accept(subject) }
 
       specify { expect(results.pluck(:email)).to match_array([first_user.email, second_user.email]) }
     end
@@ -93,7 +88,7 @@ RSpec.describe ::Scim::Visitor do
     context "when searching for condition a AND condition b" do
       let(:first_user) { users.sample }
       let(:second_user) { users.sample }
-      let(:results) { Scim::Node.parse(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")).accept(subject) }
+      let(:results) { Scim::Search::Node.parse(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")).accept(subject) }
 
       before do
         freeze_time
spec/models/user_spec.rb
@@ -11,40 +11,40 @@ RSpec.describe User do
     specify { expect(subject.sessions).to match_array([user_session]) }
   end
 
-  describe ".scim_filter_for" do
+  describe ".scim_search" do
     subject { described_class }
 
     let!(:users) { create_list(:user, 10) }
     let(:random_user) { users.sample }
 
     specify do
-      results = subject.scim_filter_for("userName pr")
+      results = subject.scim_search("userName pr")
       expect(results.to_sql).to eql(subject.where.not(email: nil).to_sql)
       expect(results).to match_array(users)
     end
 
     specify do
-      results = subject.scim_filter_for("userName eq \"#{random_user.email}\"")
+      results = subject.scim_search("userName eq \"#{random_user.email}\"")
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = subject.scim_filter_for("userName ne \"#{random_user.email}\"")
+      results = subject.scim_search("userName ne \"#{random_user.email}\"")
       expect(results.pluck(:email)).not_to include(random_user.email)
     end
 
     specify do
-      results = subject.scim_filter_for("userName co \"#{random_user.email[1..-2]}\"")
+      results = subject.scim_search("userName co \"#{random_user.email[1..-2]}\"")
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = subject.scim_filter_for("userName sw \"#{random_user.email[0..3]}\"")
+      results = subject.scim_search("userName sw \"#{random_user.email[0..3]}\"")
       expect(results).to match_array([random_user])
     end
 
     specify do
-      results = subject.scim_filter_for("userName ew \"#{random_user.email[-8..-1]}\"")
+      results = subject.scim_search("userName ew \"#{random_user.email[-8..-1]}\"")
       expect(results).to match_array([random_user])
     end
 
@@ -52,7 +52,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = subject.scim_filter_for("meta.lastModified gt \"#{Time.now.iso8601}\"")
+      results = subject.scim_search("meta.lastModified gt \"#{Time.now.iso8601}\"")
       expect(results).to match_array([random_user])
     end
 
@@ -60,7 +60,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = subject.scim_filter_for("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"")
+      results = subject.scim_search("meta.lastModified ge \"#{random_user.updated_at.iso8601}\"")
       expect(results).to match_array([random_user])
     end
 
@@ -68,7 +68,7 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.from_now)
 
-      results = subject.scim_filter_for("meta.lastModified lt \"#{Time.now.iso8601}\"")
+      results = subject.scim_search("meta.lastModified lt \"#{Time.now.iso8601}\"")
       expect(results).to match_array(users - [random_user])
     end
 
@@ -76,14 +76,14 @@ RSpec.describe User do
       freeze_time
       random_user.update!(updated_at: 10.minutes.ago)
 
-      results = subject.scim_filter_for("meta.lastModified le \"#{random_user.updated_at.iso8601}\"")
+      results = subject.scim_search("meta.lastModified le \"#{random_user.updated_at.iso8601}\"")
       expect(results).to match_array([random_user])
     end
 
     context "when searching for condition a OR condition b" do
       let(:first_user) { users.sample }
       let(:second_user) { users.sample }
-      let(:results) { described_class.scim_filter_for(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")) }
+      let(:results) { described_class.scim_search(%(userName eq "#{first_user.email}" or userName eq "#{second_user.email}")) }
 
       specify { expect(results.pluck(:email)).to match_array([first_user.email, second_user.email]) }
     end
@@ -91,7 +91,7 @@ RSpec.describe User do
     context "when searching for condition a AND condition b" do
       let(:first_user) { users.sample }
       let(:second_user) { users.sample }
-      let(:results) { described_class.scim_filter_for(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")) }
+      let(:results) { described_class.scim_search(%(meta.lastModified gt "#{10.minutes.from_now.iso8601}" and meta.lastModified lt "#{15.minutes.from_now.iso8601}")) }
 
       before do
         freeze_time