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