Commit 5c0720d
Changed files (2)
lib
scim
kit
v2
spec
scim
kit
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