scim-query-filter-parser 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  GemSpec ||= Gem::Specification.new do |gem|
4
4
  gem.name = 'scim-query-filter-parser'
5
- gem.version = '0.0.3'
5
+ gem.version = '0.0.4'
6
6
  gem.license = 'MIT'
7
7
  gem.required_ruby_version = '>= 1.9.1'
8
8
 
@@ -42,11 +42,19 @@ class SCIM::Query::Filter::Parser
42
42
 
43
43
  def parse_expr
44
44
  ast = []
45
- expect_op = false
46
- while not eos and peek != ')'
47
- expect_op && assert_op || assert_not_op
48
- ast.push(start_group ? parse_group : pop)
49
- expect_op ^= true unless Unary[ast.last]
45
+ until eos or peek == ')'
46
+ assert_not_op
47
+ ast.push(start_group ? parse_group : pop.downcase)
48
+ break if (eos or peek == ')')
49
+ assert_op
50
+ ast.push pop.downcase
51
+ if !Unary[ast.last]
52
+ assert_not_op
53
+ ast.push(start_group ? parse_group : pop)
54
+ end
55
+ break if eos or peek == ')'
56
+ assert_op
57
+ ast.push pop.downcase
50
58
  end
51
59
  to_rpn ast
52
60
  end
@@ -77,10 +85,10 @@ class SCIM::Query::Filter::Parser
77
85
  out.push ast.shift if not ast.empty?
78
86
  while not ast.empty? do
79
87
  op = ast.shift
80
- p = Ops[op] \
88
+ precedence = Ops[op] \
81
89
  or fail "Unknown operator '#{op}'"
82
90
  while not ops.empty? do
83
- break if p > Ops[ops.first]
91
+ break if precedence > Ops[ops.first]
84
92
  out.push ops.shift
85
93
  end
86
94
  ops.unshift op
@@ -114,7 +122,7 @@ class SCIM::Query::Filter::Parser
114
122
  def eos; @tokens.empty? end
115
123
  def start_group; peek == '(' end
116
124
  def peek_operator
117
- not(eos) and peek.match IsOperator
125
+ not(eos) and peek.downcase.match IsOperator
118
126
  end
119
127
 
120
128
 
@@ -0,0 +1,32 @@
1
+ require 'scim/query/filter/parser'
2
+ require 'test/unit'
3
+ require 'yaml'
4
+ require 'json'
5
+
6
+ class TestCase < Test::Unit::TestCase
7
+ def test_case
8
+ data = YAML.load $test_case_data
9
+ parser = SCIM::Query::Filter::Parser.new
10
+ data.each do |test_case|
11
+ query = test_case['query']
12
+ parser.parse query
13
+
14
+ got_rpn_json = parser.rpn.to_json
15
+ want_rpn_json = test_case['rpn'].to_json
16
+ assert_equal want_rpn_json, got_rpn_json,
17
+ "Test parse to RPN: '#{query}'"
18
+
19
+ got_tree_json = parser.tree.to_json
20
+ want_tree_json = test_case['tree'].to_json
21
+ assert_equal want_tree_json, got_tree_json,
22
+ "Test parse to tree: '#{query}'"
23
+ end
24
+ end
25
+ end
26
+
27
+ # See http://www.simplecloud.info/specs/draft-scim-api-01.html#query-resources
28
+ $test_case_data = <<'...'
29
+ - query: USERName eQ "Ingy döt Net"
30
+ rpn: [username,'"Ingy döt Net"',eq]
31
+ tree: [eq, username,'"Ingy döt Net"']
32
+ ...
@@ -0,0 +1,76 @@
1
+ require 'scim/query/filter/parser'
2
+ require 'test/unit'
3
+ require 'yaml'
4
+ require 'json'
5
+
6
+ class TestSpec < Test::Unit::TestCase
7
+ def test_spec
8
+ data = YAML.load $test_spec_data
9
+ parser = SCIM::Query::Filter::Parser.new
10
+ data.each do |test_case|
11
+ query = test_case['query']
12
+ parser.parse query
13
+
14
+ got_rpn_json = parser.rpn.to_json
15
+ want_rpn_json = test_case['rpn'].to_json
16
+ assert_equal want_rpn_json, got_rpn_json,
17
+ "Test parse to RPN: '#{query}'"
18
+
19
+ got_tree_json = parser.tree.to_json
20
+ want_tree_json = test_case['tree'].to_json
21
+ assert_equal want_tree_json, got_tree_json,
22
+ "Test parse to tree: '#{query}'"
23
+ end
24
+ end
25
+ end
26
+
27
+ # See http://www.simplecloud.info/specs/draft-scim-api-01.html#query-resources
28
+ $test_spec_data = <<'...'
29
+ - query: ''
30
+ rpn: []
31
+ tree: []
32
+
33
+ - query: userName eq "bjensen"
34
+ rpn: [username,'"bjensen"',eq]
35
+ tree: [eq, username,'"bjensen"']
36
+
37
+ - query: name.familyName co "O'Malley"
38
+ rpn: [name.familyname, '"O''Malley"', co]
39
+ tree: [co, name.familyname, '"O''Malley"']
40
+
41
+ - query: userName sw "J"
42
+ rpn: [username, '"J"', sw]
43
+ tree: [sw, username, '"J"']
44
+
45
+ - query: title pr
46
+ rpn: [title, pr]
47
+ tree: [pr, title]
48
+
49
+ - query: meta.lastModified gt "2011-05-13T04:42:34Z"
50
+ rpn: [meta.lastmodified, '"2011-05-13T04:42:34Z"', gt]
51
+ tree: [gt, meta.lastmodified, '"2011-05-13T04:42:34Z"']
52
+
53
+ - query: meta.lastModified ge "2011-05-13T04:42:34Z"
54
+ rpn: [meta.lastmodified, '"2011-05-13T04:42:34Z"', ge]
55
+ tree: [ge, meta.lastmodified, '"2011-05-13T04:42:34Z"']
56
+
57
+ - query: meta.lastModified lt "2011-05-13T04:42:34Z"
58
+ rpn: [meta.lastmodified, '"2011-05-13T04:42:34Z"', lt]
59
+ tree: [lt, meta.lastmodified, '"2011-05-13T04:42:34Z"']
60
+
61
+ - query: meta.lastModified le "2011-05-13T04:42:34Z"
62
+ rpn: [meta.lastmodified, '"2011-05-13T04:42:34Z"', le]
63
+ tree: [le, meta.lastmodified, '"2011-05-13T04:42:34Z"']
64
+
65
+ - query: title pr and userType eq "Employee"
66
+ rpn: [title, pr, usertype, '"Employee"', eq, and]
67
+ tree: [and, [pr, title], [eq, usertype, '"Employee"']]
68
+
69
+ - query: title pr or userType eq "Intern"
70
+ rpn: [title, pr, usertype, '"Intern"', eq, or]
71
+ tree: [or, [pr, title], [eq, usertype, '"Intern"']]
72
+
73
+ - query: userType eq "Employee" and (emails co "example.com" or emails co "example.org")
74
+ rpn: [usertype, '"Employee"', eq, emails, '"example.com"', co, emails, '"example.org"', co, or ,and]
75
+ tree: [and, [eq, usertype, '"Employee"'], [or, [co, emails, '"example.com"'], [co, emails, '"example.org"']]]
76
+ ...
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scim-query-filter-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-24 00:00:00.000000000 Z
12
+ date: 2013-09-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -45,7 +45,8 @@ files:
45
45
  - README.rdoc
46
46
  - Rakefile
47
47
  - lib/scim/query/filter/parser.rb
48
- - test/parse.rb
48
+ - test/case.rb
49
+ - test/spec.rb
49
50
  homepage: https://github.com/ingydotnet/scim-query-filter-parser-rb
50
51
  licenses:
51
52
  - MIT
@@ -1,82 +0,0 @@
1
- require 'scim/query/filter/parser'
2
- require 'test/unit'
3
- require 'yaml'
4
- require 'json'
5
-
6
- class TestParser < Test::Unit::TestCase
7
- def test_spec
8
- data = $test_parse_data.lines.to_a
9
- parser = SCIM::Query::Filter::Parser.new
10
- while true do
11
- input = data.shift or break
12
- input.chomp!
13
- rpn_yaml = data.shift or break
14
- next if rpn_yaml == "\n"
15
- parser.parse(input)
16
- got_rpn_json = parser.rpn.to_json
17
- want_rpn_json = YAML.load(rpn_yaml).to_json
18
- assert_equal want_rpn_json, got_rpn_json,
19
- "Test parse to RPN: '#{input.chomp}'"
20
- tree_yaml = data.shift or break
21
- next if tree_yaml == "\n"
22
- got_tree_json = parser.tree.to_json
23
- want_tree_json = YAML.load(tree_yaml).to_json
24
- assert_equal want_tree_json, got_tree_json,
25
- "Test parse to tree: '#{input.chomp}'"
26
- blank_line = data.shift or break
27
- fail "Got '#{blank_line.chomp}', expected blank line" \
28
- unless blank_line == "\n"
29
- end
30
- end
31
- end
32
-
33
- # See http://www.simplecloud.info/specs/draft-scim-api-01.html#query-resources
34
- $test_parse_data = <<'...'
35
-
36
- []
37
- []
38
-
39
- userName eq "bjensen"
40
- [userName,'"bjensen"',eq]
41
- [eq, userName,'"bjensen"']
42
-
43
- name.familyName co "O'Malley"
44
- [name.familyName, '"O''Malley"', co]
45
- [co, name.familyName, '"O''Malley"']
46
-
47
- userName sw "J"
48
- [userName, '"J"', sw]
49
- [sw, userName, '"J"']
50
-
51
- title pr
52
- [title, pr]
53
- [pr, title]
54
-
55
- meta.lastModified gt "2011-05-13T04:42:34Z"
56
- [meta.lastModified, '"2011-05-13T04:42:34Z"', gt]
57
- [gt, meta.lastModified, '"2011-05-13T04:42:34Z"']
58
-
59
- meta.lastModified ge "2011-05-13T04:42:34Z"
60
- [meta.lastModified, '"2011-05-13T04:42:34Z"', ge]
61
- [ge, meta.lastModified, '"2011-05-13T04:42:34Z"']
62
-
63
- meta.lastModified lt "2011-05-13T04:42:34Z"
64
- [meta.lastModified, '"2011-05-13T04:42:34Z"', lt]
65
- [lt, meta.lastModified, '"2011-05-13T04:42:34Z"']
66
-
67
- meta.lastModified le "2011-05-13T04:42:34Z"
68
- [meta.lastModified, '"2011-05-13T04:42:34Z"', le]
69
- [le, meta.lastModified, '"2011-05-13T04:42:34Z"']
70
-
71
- title pr and userType eq "Employee"
72
- [title, pr, userType, '"Employee"', eq, and]
73
- [and, [pr, title], [eq, userType, '"Employee"']]
74
-
75
- title pr or userType eq "Intern"
76
- [title, pr, userType, '"Intern"', eq, or]
77
- [or, [pr, title], [eq, userType, '"Intern"']]
78
-
79
- userType eq "Employee" and (emails co "example.com" or emails co "example.org")
80
- [userType, '"Employee"', eq, emails, '"example.com"', co, emails, '"example.org"', co, or ,and]
81
- [and, [eq, userType, '"Employee"'], [or, [co, emails, '"example.com"'], [co, emails, '"example.org"']]]
82
- ...