Commit 1015040

mokha <mokha@cisco.com>
2019-05-10 17:58:12
parse uri
1 parent 2c92ca6
Changed files (2)
lib
scim
spec
scim
lib/scim/kit/v2/parser.rb
@@ -41,10 +41,15 @@ subAttr   = "." ATTRNAME
         rule(:rparen) { str(')') >> space? }
         rule(:digit) { match(/\d/) }
         rule(:quote) { str('"') }
-        rule(:space) { match('\s').repeat(1) }
+        rule(:space) { match('\s') }
         rule(:space?) { space.maybe }
+        rule(:alpha) { match('[a-zA-Z]') }
+        rule(:dot) { match('\.') }
+        rule(:colon) { match(':') }
 
-        rule(:attribute) { match['a-zA-Z\.'].repeat(1) }
+        rule(:attribute) { uri | attribute_name }
+        rule(:attribute_name) { alpha.repeat(1) | dot }
+        rule(:uri) { (alpha | digit | dot | colon).repeat(1) }
 
         rule(:operator) { equal | not_equal | contains | starts_with | ends_with | greater_than | less_than | less_than_equals | greater_than_equals }
         rule(:equal) { str("eq") }
@@ -64,6 +69,7 @@ subAttr   = "." ATTRNAME
         root :filter
 
         def pretty_parse(*args)
+          puts *args.inspect
           parse(*args)
         rescue Parslet::ParseFailed => error
           puts error.parse_failure_cause.ascii_tree
spec/scim/kit/v2/parser_spec.rb
@@ -3,35 +3,46 @@
 RSpec.describe Scim::Kit::V2::Parser do
   subject { described_class.new }
 
-  [ "eq", "ne", "co", "sw", "ew", "gt", "lt", "ge", "le" ].each do |operator|
-    context "simple expression #{operator}" do
-      let(:result) { subject.pretty_parse(%Q(userName #{operator} "bjensen")) }
-
-      specify { expect(result).to be_present }
-      specify { expect(result[:left].to_s).to eql('userName') }
-      specify { expect(result[:operator].to_s).to eql(operator) }
-      specify { expect(result[:right].to_s).to eql('bjensen') }
+  [
+    'userName',
+    'name.familyName',
+    'urn:ietf:params:scim:schemas:core:2.0:User:userName'
+  ].each do |attribute|
+    [
+      "eq",
+      "ne",
+      "co",
+      "sw",
+      "ew",
+      "gt",
+      "lt",
+      "ge",
+      "le"
+    ].each do |operator|
+      [
+        "bjensen",
+        "O'Malley",
+        "J",
+      ].each do |value|
+        context "#{attribute} #{operator} #{value}" do
+          let(:result) { subject.pretty_parse(%Q(#{attribute} #{operator} \"#{value}\")) }
+
+          specify { expect(result).to be_present }
+          specify { expect(result[:left].to_s).to eql(attribute) }
+          specify { expect(result[:operator].to_s).to eql(operator) }
+          specify { expect(result[:right].to_s).to eql(value) }
+        end
+      end
     end
+  end
 
-    context "nested attribute #{operator}" do
-      let(:result) { subject.pretty_parse(%Q(name.familyName #{operator} "O'Malley")) }
-
-      specify { expect(result).to be_present }
-      specify { expect(result[:left].to_s).to eql('name.familyName') }
-      specify { expect(result[:operator].to_s).to eql(operator) }
-      specify { expect(result[:right].to_s).to eql("O'Malley") }
-    end
+  context "match uri" do
+    specify { expect(subject.uri.parse("urn:ietf:params:scim:schemas:core:2.0:User:userName")).to be_present }
   end
 end
 
 
 =begin
-filter=userName eq "bjensen"
-
-filter=name.familyName co "O'Malley"
-
-filter=userName sw "J"
-
 filter=urn:ietf:params:scim:schemas:core:2.0:User:userName sw "J"
 
 filter=title pr