Commit 5c0720d

mokha <mokha@cisco.com>
2019-05-11 19:37:45
hacky implementation of the uri parser
1 parent 56a86ef
Changed files (2)
lib
scim
spec
scim
lib/scim/kit/v2/parser.rb
@@ -51,11 +51,13 @@ module Scim
 
         # attrPath = [URI ":"] ATTRNAME *1subAttr ; SCIM attribute name ; URI is SCIM "schema" URI
         rule(:attribute_path) do
-          (scim_schema_uri >> colon).repeat(0, 1) >> attribute_name >> sub_attribute.repeat(0, 1)
+          (uri >> colon).repeat(0, 1) >> attribute_name >> sub_attribute.repeat(0, 1)
         end
 
         # ATTRNAME  = ALPHA *(nameChar)
-        rule(:attribute_name) { alpha >> name_character.repeat(0, nil) }
+        rule(:attribute_name) do
+          alpha >> name_character.repeat(0, nil)
+        end
 
         # nameChar = "-" / "_" / DIGIT / ALPHA
         rule(:name_character) { hyphen | underscore | digit | alpha }
@@ -63,6 +65,24 @@ module Scim
         # subAttr = "." ATTRNAME ; a sub-attribute of a complex attribute
         rule(:sub_attribute) { dot >> attribute_name }
 
+        # uri = 1*ALPHA 1*(":" 1*ALPHA)
+        rule(:uri) do
+          # alpha.repeat(1, nil) >> (colon >> (alpha.repeat(1, nil) | version)).repeat(1, nil)
+          str('urn:ietf:params:scim:schemas:') >>
+          (
+            str('core:2.0:User') |
+            str('core:2.0:Group') |
+            (
+              str('extension') >>
+              colon >>
+              alpha.repeat(1) >>
+              colon >>
+              version >>
+              colon >>
+              alpha.repeat(1)
+            )
+          )
+        end
         rule(:presence) { str('pr') }
         rule(:and_op) { str('and') }
         rule(:or_op) { str('or') }
@@ -71,7 +91,6 @@ module Scim
         rule(:truthy) { str('true') }
         rule(:null) { str('null') }
         rule(:number) { digit.repeat(1) }
-        rule(:scim_schema_uri) { (alpha | digit | dot | colon).repeat(1) }
         rule(:equal) { str('eq') }
         rule(:not_equal) { str('ne') }
         rule(:contains) { str('co') }
@@ -97,6 +116,7 @@ module Scim
         rule(:colon) { str(':') }
         rule(:hyphen) { str('-') }
         rule(:underscore) { str('_') }
+        rule(:version) { digit >> dot >> digit }
       end
     end
   end
spec/scim/kit/v2/parser_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Scim::Kit::V2::Parser do
   [
     'userName',
     'name.familyName',
-    #'urn:ietf:params:scim:schemas:core:2.0:User:userName',
+    'urn:ietf:params:scim:schemas:core:2.0:User:userName',
     'meta.lastModified',
     'schemas'
   ].each do |attribute|
@@ -26,10 +26,9 @@ RSpec.describe Scim::Kit::V2::Parser do
         "O'Malley",
         'J',
         '2011-05-13T04:42:34Z',
-        #'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'
+        'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'
       ].each do |value|
         specify { expect(subject.parse_with_debug(%(#{attribute} #{operator} \"#{value}\"))).to be_truthy }
-        # specify { puts subject.parse(%Q(#{attribute} #{operator} \"#{value}\")).inspect }
       end
     end
   end
@@ -83,11 +82,11 @@ RSpec.describe Scim::Kit::V2::Parser do
     'user_name',
     'user-name',
     'username1',
-    'name.familyName',
-    #'urn:ietf:params:scim:schemas:core:2.0:User:userName',
-    #'urn:ietf:params:scim:schemas:core:2.0:User:name.familyName',
     'meta.lastModified',
-    'schemas'
+    'schemas',
+    'name.familyName',
+    'urn:ietf:params:scim:schemas:core:2.0:User:userName',
+    'urn:ietf:params:scim:schemas:core:2.0:User:name.familyName',
   ].each do |x|
     specify { expect(subject.attribute_path.parse_with_debug(x)).to be_truthy }
   end
@@ -116,10 +115,11 @@ RSpec.describe Scim::Kit::V2::Parser do
   1.upto(100).each { |n| specify { expect(subject.number).to parse(n.to_s) } }
 
   [
-    'urn:ietf:params:scim:schemas:core:2.0:User:userName',
-    'urn:ietf:params:scim:schemas:core:2.0:User:name.familyName'
+    'urn:ietf:params:scim:schemas:core:2.0:User',
+    'urn:ietf:params:scim:schemas:core:2.0:Group',
+    'urn:ietf:params:scim:schemas:extension:altean:2.0:User',
   ].each do |x|
-    specify { expect(subject.scim_schema_uri).to parse(x) }
+    specify { expect(subject.uri).to parse(x) }
   end
 
   [
@@ -143,4 +143,13 @@ RSpec.describe Scim::Kit::V2::Parser do
   ].each do |x|
     specify { expect(subject.string).to parse(x) }
   end
+
+  specify { expect(subject.hyphen).to parse("-") }
+  specify { expect(subject.underscore).to parse("_") }
+  (0..9).each { |x| specify { expect(subject.digit).to parse(x.to_s) } }
+  ('A'..'Z').each { |x| specify { expect(subject.alpha).to parse(x) } }
+  ('a'..'z').each { |x| specify { expect(subject.alpha).to parse(x) } }
+  specify { expect(subject.colon).to parse(":") }
+  specify { expect(subject.version).to parse("2.0") }
+  specify { expect(subject.version).to parse("1.0") }
 end