jgrep 1.3.3 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.markdown +10 -0
- data/COPYING +202 -0
- data/README.markdown +244 -0
- data/Rakefile +5 -0
- data/bin/jgrep +82 -39
- data/lib/jgrep.rb +11 -4
- data/lib/parser/scanner.rb +24 -19
- data/spec/Rakefile +11 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/jgrep_spec.rb +243 -0
- data/spec/unit/parser_spec.rb +132 -0
- data/spec/unit/scanner_spec.rb +91 -0
- metadata +53 -61
- data/jgrep.gemspec +0 -17
@@ -0,0 +1,132 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
4
|
+
|
5
|
+
module JGrep
|
6
|
+
describe Parser do
|
7
|
+
describe '#parse' do
|
8
|
+
it "should parse statements seperated by '='" do
|
9
|
+
parser = Parser.new("foo.bar=bar")
|
10
|
+
parser.execution_stack.should == [{"statement" => "foo.bar=bar"}]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should parse statements seperated by '<'" do
|
14
|
+
parser = Parser.new("foo.bar<1")
|
15
|
+
parser.execution_stack.should == [{"statement" => "foo.bar<1"}]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should parse statements seperated by '>'" do
|
19
|
+
parser = Parser.new("foo.bar>1")
|
20
|
+
parser.execution_stack.should == [{"statement" => "foo.bar>1"}]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should parse statements seperated by '<='" do
|
24
|
+
parser = Parser.new("foo.bar<=1")
|
25
|
+
parser.execution_stack.should == [{"statement" => "foo.bar<=1"}]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should parse statements seperated by '>='" do
|
29
|
+
parser = Parser.new("foo.bar>=1")
|
30
|
+
parser.execution_stack.should == [{"statement" => "foo.bar>=1"}]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should parse statement sperated by '!='" do
|
34
|
+
parser = Parser.new("foo.bar!=1")
|
35
|
+
parser.execution_stack.should == [{"not" => "not"}, {"statement" =>"foo.bar=1"}]
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should parse a + token" do
|
39
|
+
parser = Parser.new("+foo")
|
40
|
+
parser.execution_stack.should == [{"+" => "foo"}]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should parse a - token" do
|
44
|
+
parser = Parser.new("-foo")
|
45
|
+
parser.execution_stack.should == [{"-" => "foo"}]
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should parse a correct 'and' token" do
|
49
|
+
parser = Parser.new("foo.bar=123 and bar.foo=321")
|
50
|
+
parser.execution_stack.should == [{"statement" => "foo.bar=123"}, {"and" => "and"}, {"statement" => "bar.foo=321"}]
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not parse an incorrect and token" do
|
54
|
+
expect {
|
55
|
+
parser = Parser.new("and foo.bar=1")
|
56
|
+
}.to raise_error("Error at column 12. \n Expression cannot start with 'and'")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should parse a correct 'or' token" do
|
60
|
+
parser = Parser.new("foo.bar=1 or bar.foo=1")
|
61
|
+
parser.execution_stack.should == [{"statement" => "foo.bar=1"}, {"or" => "or"}, {"statement" => "bar.foo=1"}]
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should not parse an incorrect and token" do
|
65
|
+
expect {
|
66
|
+
parser = Parser.new("or foo.bar=1")
|
67
|
+
}.to raise_error("Error at column 11. \n Expression cannot start with 'or'")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should parse a correct 'not' token" do
|
71
|
+
parser = Parser.new("! bar.foo=1")
|
72
|
+
parser.execution_stack.should == [{"not" => "not"}, {"statement" => "bar.foo=1"}]
|
73
|
+
parser = Parser.new("not bar.foo=1")
|
74
|
+
parser.execution_stack.should == [{"not" => "not"}, {"statement" => "bar.foo=1"}]
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should not parse an incorrect 'not' token" do
|
78
|
+
expect {
|
79
|
+
parser = Parser.new("foo.bar=1 !")
|
80
|
+
}.to raise_error("Error at column 10. \nExpected 'and', 'or', ')'. Found 'not'")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should parse correct parentheses" do
|
84
|
+
parser = Parser.new("(foo.bar=1)")
|
85
|
+
parser.execution_stack.should == [{"(" => "("}, {"statement" => "foo.bar=1"}, {")" => ")"}]
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should fail on incorrect parentheses" do
|
89
|
+
expect {
|
90
|
+
parser = Parser.new(")foo.bar=1(")
|
91
|
+
}.to raise_error("Error. Missing parentheses '('.")
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should fail on missing parentheses" do
|
95
|
+
expect {
|
96
|
+
parser = Parser.new("(foo.bar=1")
|
97
|
+
}.to raise_error("Error. Missing parentheses ')'.")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should parse correctly formatted compound statements" do
|
101
|
+
parser = Parser.new("(foo.bar=1 or foo.rab=1) and (bar.foo=1)")
|
102
|
+
parser.execution_stack.should == [{"(" => "("}, {"statement"=>"foo.bar=1"}, {"or"=>"or"}, {"statement"=>"foo.rab=1"},
|
103
|
+
{")"=>")"}, {"and"=>"and"}, {"("=>"("}, {"statement"=>"bar.foo=1"},
|
104
|
+
{")"=>")"}]
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should parse complex array statements" do
|
108
|
+
parser = Parser.new("[foo.bar=1]")
|
109
|
+
parser.execution_stack.should == [{"statement" => [["statement","foo.bar=1"]]}]
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should not parse failed complex array statements" do
|
113
|
+
expect{
|
114
|
+
parser = Parser.new("[foo.bar=1 or]")
|
115
|
+
}.to raise_error("Class name cannot be 'and', 'or', 'not'. Found 'or'")
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should not allow nested complex array statements" do
|
120
|
+
expect{
|
121
|
+
parser = Parser.new("[foo.bar=1 and [foo.bar=1]]")
|
122
|
+
}.to raise_error("Error at column 27\nError, cannot define '[' in a '[...]' block.")
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should parse complex, compound array statements" do
|
127
|
+
parser = Parser.new("[foo.bar=1 and foo.rab=2] and !(foo=1)")
|
128
|
+
parser.execution_stack.should == [{"statement"=>[["statement", "foo.bar=1"], ["and", "and"], ["statement", "foo.rab=2"]]}, {"and"=>"and"}, {"not"=>"not"}, {"("=>"("}, {"statement"=>"foo=1"}, {")"=>")"}]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
4
|
+
|
5
|
+
|
6
|
+
module JGrep
|
7
|
+
describe Scanner do
|
8
|
+
describe '#get_token' do
|
9
|
+
it "should identify a '(' token" do
|
10
|
+
scanner = Scanner.new("(")
|
11
|
+
token = scanner.get_token
|
12
|
+
token.should == ["(", "("]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should identify a ')' token" do
|
16
|
+
scanner = Scanner.new(")")
|
17
|
+
token = scanner.get_token
|
18
|
+
token.should == [")", ")"]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should identify an 'and' token" do
|
22
|
+
scanner = Scanner.new("and ")
|
23
|
+
token = scanner.get_token
|
24
|
+
token.should == ["and", "and"]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should identify a '&&' token" do
|
28
|
+
scanner = Scanner.new("&& ")
|
29
|
+
token = scanner.get_token
|
30
|
+
token.should == ["and", "and"]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should identify an 'or' token" do
|
34
|
+
scanner = Scanner.new("or ")
|
35
|
+
token = scanner.get_token
|
36
|
+
token.should == ["or", "or"]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should identify a "||" token" do
|
40
|
+
scanner = Scanner.new("|| ")
|
41
|
+
token = scanner.get_token
|
42
|
+
token.should == ["or", "or"]
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should identify an 'not' token" do
|
47
|
+
scanner = Scanner.new("not ")
|
48
|
+
token = scanner.get_token
|
49
|
+
token.should == ["not", "not"]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should identify an '!' token" do
|
53
|
+
scanner = Scanner.new("!")
|
54
|
+
token = scanner.get_token
|
55
|
+
token.should == ["not", "not"]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should identify a statement token" do
|
59
|
+
scanner = Scanner.new("foo.bar=bar")
|
60
|
+
token = scanner.get_token
|
61
|
+
token.should == ["statement", "foo.bar=bar"]
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should identify a complex array statement" do
|
65
|
+
scanner = Scanner.new("[foo=bar and bar=foo]")
|
66
|
+
token = scanner.get_token
|
67
|
+
token.should == ["statement", [["statement", "foo=bar"], ["and", "and"], ["statement", "bar=foo"]]]
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should fail if expression terminates with 'and'" do
|
71
|
+
scanner = Scanner.new("and")
|
72
|
+
|
73
|
+
expect {
|
74
|
+
token = scanner.get_token
|
75
|
+
}.to raise_error("Class name cannot be 'and', 'or', 'not'. Found 'and'")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should identify a '+' token" do
|
79
|
+
scanner = Scanner.new("+foo")
|
80
|
+
token = scanner.get_token
|
81
|
+
token.should == ["+","foo"]
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should identify a '-' token" do
|
85
|
+
scanner = Scanner.new("-foo")
|
86
|
+
token = scanner.get_token
|
87
|
+
token.should == ["-", "foo"]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
metadata
CHANGED
@@ -1,85 +1,77 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: jgrep
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 3
|
9
|
-
- 3
|
10
|
-
version: 1.3.3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- P Loubser
|
8
|
+
- Dominic Cleal
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2015-11-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: json
|
23
|
-
|
24
|
-
|
25
|
-
none: false
|
26
|
-
requirements:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
27
18
|
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
33
21
|
type: :runtime
|
34
|
-
|
35
|
-
|
36
|
-
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
description: Compare a list of json documents to a simple logical language and returns
|
29
|
+
matches as output
|
30
|
+
email:
|
37
31
|
- ploubser@gmail.com
|
38
|
-
|
32
|
+
- dominic@cleal.org
|
33
|
+
executables:
|
39
34
|
- jgrep
|
40
35
|
extensions: []
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
files:
|
45
|
-
-
|
36
|
+
extra_rdoc_files:
|
37
|
+
- CHANGELOG.markdown
|
38
|
+
- README.markdown
|
39
|
+
files:
|
40
|
+
- CHANGELOG.markdown
|
41
|
+
- COPYING
|
42
|
+
- README.markdown
|
43
|
+
- Rakefile
|
46
44
|
- bin/jgrep
|
47
45
|
- lib/jgrep.rb
|
48
|
-
- lib/parser/scanner.rb
|
49
46
|
- lib/parser/parser.rb
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
47
|
+
- lib/parser/scanner.rb
|
48
|
+
- spec/Rakefile
|
49
|
+
- spec/spec_helper.rb
|
50
|
+
- spec/unit/jgrep_spec.rb
|
51
|
+
- spec/unit/parser_spec.rb
|
52
|
+
- spec/unit/scanner_spec.rb
|
53
|
+
homepage: https://github.com/ploubser/JSON-Grep
|
54
|
+
licenses:
|
55
|
+
- Apache-2.0
|
56
|
+
metadata: {}
|
54
57
|
post_install_message:
|
55
58
|
rdoc_options: []
|
56
|
-
|
57
|
-
require_paths:
|
59
|
+
require_paths:
|
58
60
|
- lib
|
59
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
|
61
|
-
requirements:
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
62
63
|
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
version: "0"
|
68
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
|
-
requirements:
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
71
68
|
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
version: "0"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
77
71
|
requirements: []
|
78
|
-
|
79
72
|
rubyforge_project:
|
80
|
-
rubygems_version:
|
73
|
+
rubygems_version: 2.2.1
|
81
74
|
signing_key:
|
82
|
-
specification_version:
|
83
|
-
summary:
|
75
|
+
specification_version: 4
|
76
|
+
summary: Filter JSON documents with a simple logical language
|
84
77
|
test_files: []
|
85
|
-
|
data/jgrep.gemspec
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
Gem::Specification.new do |s|
|
2
|
-
s.name = "jgrep"
|
3
|
-
s.version = "1.3.3"
|
4
|
-
|
5
|
-
s.authors = ["P Loubser"]
|
6
|
-
s.date = %q{2012-09-26}
|
7
|
-
s.default_executable = "jgrep"
|
8
|
-
s.add_dependency('json')
|
9
|
-
s.description = "Compare a list of json documents to a simple logical language and returns matches as output"
|
10
|
-
s.email = ["ploubser@gmail.com"]
|
11
|
-
s.executables = ["jgrep"]
|
12
|
-
s.files = ["jgrep.gemspec", "bin/jgrep", Dir.glob("lib/*"), Dir.glob("lib/parser/*")].flatten
|
13
|
-
s.has_rdoc = true
|
14
|
-
s.homepage = "https://github.com/psy1337/JSON-Grep"
|
15
|
-
s.require_paths = ["lib"]
|
16
|
-
s.summary = s.description
|
17
|
-
end
|