msfl_visitors 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e8470b08c4ddad65f93e4390940322df02fd8ab
4
- data.tar.gz: e830bfd417c1f08f6d9e0debc700de26a7db5824
3
+ metadata.gz: daf42029b9bfc45fc7203e2c07543dbbc069b3d5
4
+ data.tar.gz: 361efbee8a9055be3acec9862b9723630a9d8da8
5
5
  SHA512:
6
- metadata.gz: 1312268041b0d2fd0544a39691269f3cf804c400d9fcf79bf02179db7233727213fa6b7de572363ad74804327d6241efcfaa834fe7f2bccb6d9adb119c8155ab
7
- data.tar.gz: 7aaa3e770f248415ec6d74bc791beccd8eb5b20c3cb6d8b5c72be56b46abb7955b22eaee9927507ab832018f9b3a9c22be018b86a42261f8501a67029b18fe65
6
+ metadata.gz: 01f65645a30000fba50046a1200339561ec8da9d645202db7cb3ec3e8887f072e62e079aad75dffaaa198e4f6aac8c13edc394766c7f3ffe68e2c8b3fc171f60
7
+ data.tar.gz: 68a70c23d76380d4ceb58db76672c1fe34bb9d0969a42205cfa8570a9f5f1c51325694dd9eb4861125940be008d5f8f05e49ba015f991381f14aa8df25050634
data/.gitignore CHANGED
@@ -17,4 +17,7 @@
17
17
 
18
18
  ## Gemfile for development
19
19
  #Gemfile
20
- #Gemfile.lock
20
+ #Gemfile.lock
21
+
22
+ ## Stupid OSX cruft
23
+ .DS_Store
data/lib/msfl_visitors.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  require_relative 'msfl_visitors/ast'
2
- require_relative 'msfl_visitors/visitors/base'
3
2
  require_relative 'msfl_visitors/nodes'
4
- require_relative 'msfl_visitors/visitors/chewy_term_filter'
3
+ require_relative 'msfl_visitors/visitor'
4
+ require_relative 'msfl_visitors/renderers/chewy/term_filter'
5
5
  require_relative 'msfl_visitors/parsers/msfl_parser'
6
+
6
7
  module MSFLVisitors
7
8
  end
@@ -4,7 +4,7 @@ module MSFLVisitors
4
4
  attr_accessor :root
5
5
 
6
6
  def initialize(msfl)
7
- self.root = MSFLVisitors::Parsers::MSFLParser.new.parse msfl
7
+ self.root = MSFLVisitors::Parsers::MSFLParser.parse msfl
8
8
  end
9
9
 
10
10
  # Use this method to walk the AST with a particular visitor
@@ -1,7 +1,7 @@
1
1
  require_relative 'range_value'
2
2
  module MSFLVisitors
3
3
  module Nodes
4
- class DateTime < RangeValue
4
+ class DateTime < Date
5
5
  end
6
6
  end
7
7
  end
@@ -39,7 +39,7 @@ module MSFLVisitors
39
39
  end
40
40
 
41
41
  def parse_Set(obj, lhs = false)
42
- fail NoMethodError, "#parse_Set is not yet implemented."
42
+
43
43
  end
44
44
 
45
45
  def hash_dispatch(key, value, lhs = false)
@@ -0,0 +1,42 @@
1
+ module MSFLVisitors
2
+ module Renderers
3
+ module Chewy
4
+ class TermFilter
5
+ BINARY_OPERATORS = {
6
+ Nodes::And => ' & ',
7
+ Nodes::GreaterThan => ' > ',
8
+ Nodes::LessThan => ' < ',
9
+ Nodes::GreaterThanEqual => ' >= ',
10
+ Nodes::LessThanEqual => ' <= ',
11
+ Nodes::Equal => ' == ',
12
+ }
13
+
14
+ def render(node)
15
+ case node
16
+
17
+ when Nodes::Comparison, Nodes::And
18
+ BINARY_OPERATORS[node.class]
19
+
20
+ when Nodes::Date, Nodes::Time
21
+ node.value.iso8601
22
+
23
+ when Nodes::Boolean, Nodes::Number
24
+ node.value
25
+
26
+ when Nodes::Word
27
+ node.value.to_s
28
+
29
+ when Nodes::Grouping::Close
30
+ ' )'
31
+
32
+ when Nodes::Grouping::Open
33
+ '( '
34
+
35
+ else
36
+ fail ArgumentError.new("Unrecognized node type: #{node.class}")
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ module MSFLVisitors
2
+ class Visitor
3
+ def initialize(collector, renderer)
4
+ @collector = collector
5
+ @renderer = renderer
6
+ end
7
+
8
+ def visit(obj)
9
+ collector << renderer.render(obj)
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :collector, :renderer
15
+ end
16
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'msfl_visitors'
3
- s.version = '0.0.2'
3
+ s.version = '0.0.3'
4
4
  s.date = '2015-05-01'
5
5
  s.summary = "Convert MSFL to other forms"
6
6
  s.description = "Visitor pattern approach to converting MSFL to other forms."
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ describe MSFLVisitors::Visitor do
4
+
5
+ let(:node) { fail ArgumentError, "You must define the node variable in each scope." }
6
+
7
+ let(:collector) { String.new }
8
+
9
+ let(:renderer) { MSFLVisitors::Renderers::Chewy::TermFilter.new }
10
+
11
+ let(:visitor) { described_class.new collector, renderer }
12
+
13
+ let(:left) { MSFLVisitors::Nodes::Word.new "lhs" }
14
+
15
+ let(:right) { MSFLVisitors::Nodes::Word.new "rhs" }
16
+
17
+ subject(:result) { node.accept visitor }
18
+
19
+ context "when visiting" do
20
+
21
+ describe "an Equal node" do
22
+
23
+ let(:node) { MSFLVisitors::Nodes::Equal.new left, right }
24
+
25
+ it "results in: 'left == right'" do
26
+ expect(result).to eq "lhs == rhs"
27
+ end
28
+ end
29
+
30
+ describe "a GreaterThan node" do
31
+
32
+ let(:node) { MSFLVisitors::Nodes::GreaterThan.new left, right }
33
+
34
+ it "returns: 'left > right'" do
35
+ expect(result).to eq "lhs > rhs"
36
+ end
37
+ end
38
+
39
+ describe "a GreaterThanEqual node" do
40
+
41
+ let(:node) { MSFLVisitors::Nodes::GreaterThanEqual.new left, right }
42
+
43
+ it "returns: 'left >= right'" do
44
+ expect(result).to eq "lhs >= rhs"
45
+ end
46
+ end
47
+
48
+ describe "a LessThan node" do
49
+
50
+ let(:node) { MSFLVisitors::Nodes::LessThan.new left, right }
51
+
52
+ it "returns: 'left < right'" do
53
+ expect(result).to eq "lhs < rhs"
54
+ end
55
+ end
56
+
57
+ describe "a LessThanEqual node" do
58
+
59
+ let(:node) { MSFLVisitors::Nodes::LessThanEqual.new left, right }
60
+
61
+ it "returns: 'left <= right'" do
62
+ expect(result).to eq "lhs <= rhs"
63
+ end
64
+ end
65
+
66
+ describe "an And node" do
67
+
68
+ let(:node) { MSFLVisitors::Nodes::And.new left, right }
69
+
70
+ it "returns: '( left ) & ( right )'" do
71
+ expect(result).to eq "( lhs ) & ( rhs )"
72
+ end
73
+ end
74
+
75
+ describe "value nodes" do
76
+ describe "a Boolean node" do
77
+
78
+ let(:collector) { Array.new }
79
+
80
+ let(:node) { MSFLVisitors::Nodes::Boolean.new value }
81
+
82
+ subject(:result) { node.accept(visitor).first }
83
+
84
+ context "with a value of true" do
85
+
86
+ let(:value) { true }
87
+
88
+ it "returns: true" do
89
+ expect(result).to be true
90
+ end
91
+ end
92
+
93
+ context "with a value of false" do
94
+
95
+ let(:value) { false }
96
+
97
+ it "returns: false" do
98
+ expect(result).to be false
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "a Word node" do
104
+
105
+ let(:word) { "node_content" }
106
+
107
+ let(:node) { MSFLVisitors::Nodes::Word.new word }
108
+
109
+ it "is a literal string" do
110
+ expect(result).to eq word
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "range value nodes" do
116
+
117
+ let(:collector) { Array.new }
118
+
119
+ subject(:result) { node.accept(visitor).first }
120
+
121
+ describe "a Date node" do
122
+
123
+ let(:today) { Date.today }
124
+
125
+ let(:node) { MSFLVisitors::Nodes::Date.new today }
126
+
127
+ it "returns: the date using iso8601 formatting" do
128
+ expect(result).to eq today.iso8601
129
+ end
130
+ end
131
+
132
+ describe "a Time node" do
133
+
134
+ let(:now) { Time.now }
135
+
136
+ let(:node) { MSFLVisitors::Nodes::Time.new now }
137
+
138
+ it "returns: the time using iso8601 formatting" do
139
+ expect(result).to eq now.iso8601
140
+ end
141
+ end
142
+
143
+ describe "a DateTime node" do
144
+
145
+ let(:now) { DateTime.now }
146
+
147
+ let(:node) { MSFLVisitors::Nodes::DateTime.new now }
148
+
149
+ it "returns: the date and time using iso8601 formatting" do
150
+ expect(result).to eq now.iso8601
151
+ end
152
+ end
153
+
154
+ describe "a Number node" do
155
+
156
+ let(:number) { 123 }
157
+
158
+ let(:node) { MSFLVisitors::Nodes::Number.new number }
159
+
160
+ it "returns: the number" do
161
+ expect(result).to eq number
162
+ end
163
+
164
+ context "when the number is a float" do
165
+
166
+ let(:number) { 123.456 }
167
+
168
+ it "returns: the number with the same precision" do
169
+ expect(result).to eq number
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msfl_visitors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Courtland Caldwell
@@ -139,16 +139,13 @@ files:
139
139
  - lib/msfl_visitors/nodes/value.rb
140
140
  - lib/msfl_visitors/nodes/word.rb
141
141
  - lib/msfl_visitors/parsers/msfl_parser.rb
142
- - lib/msfl_visitors/visitors/base.rb
143
- - lib/msfl_visitors/visitors/chewy_term_filter.rb
142
+ - lib/msfl_visitors/renderers/chewy/term_filter.rb
143
+ - lib/msfl_visitors/visitor.rb
144
144
  - msfl_visitors.gemspec
145
145
  - simplecov_custom_profiles.rb
146
146
  - spec/parsers/parse_msfl_spec.rb
147
147
  - spec/spec_helper.rb
148
- - spec/visitors/chewy_term_filter/visit_binary_spec.rb
149
- - spec/visitors/chewy_term_filter/visit_comparison_spec.rb
150
- - spec/visitors/chewy_term_filter/visit_range_value_spec.rb
151
- - spec/visitors/chewy_term_filter/visit_value_spec.rb
148
+ - spec/visitors/chewy_term_filter_spec.rb
152
149
  homepage: https://github.com/Referly/msfl_visitors
153
150
  licenses:
154
151
  - MIT
@@ -176,8 +173,5 @@ summary: Convert MSFL to other forms
176
173
  test_files:
177
174
  - spec/parsers/parse_msfl_spec.rb
178
175
  - spec/spec_helper.rb
179
- - spec/visitors/chewy_term_filter/visit_binary_spec.rb
180
- - spec/visitors/chewy_term_filter/visit_comparison_spec.rb
181
- - spec/visitors/chewy_term_filter/visit_range_value_spec.rb
182
- - spec/visitors/chewy_term_filter/visit_value_spec.rb
176
+ - spec/visitors/chewy_term_filter_spec.rb
183
177
  has_rdoc:
@@ -1,15 +0,0 @@
1
- module MSFLVisitors
2
- module Visitors
3
- class Base
4
- attr_accessor :collector
5
-
6
- def visit(obj)
7
- send("visit_#{obj.class.to_s.gsub('::', '_')}", obj, collector)
8
- end
9
-
10
- def initialize(collector)
11
- self.collector = collector
12
- end
13
- end
14
- end
15
- end
@@ -1,70 +0,0 @@
1
- module MSFLVisitors
2
- module Visitors
3
- class ChewyTermFilter < Base
4
-
5
- # Instead of using string interpolation only supported operators are enabled
6
- BINARY_OPERATORS = { eq: "==", gt: ">", gte: ">=", lt: "<", lte: "<=", and: "&" }
7
-
8
- def visit_MSFLVisitors_Nodes_And(obj, collector)
9
- binary_helper :and, collector
10
- end
11
-
12
- def visit_MSFLVisitors_Nodes_Boolean(obj, collector)
13
- collector << obj.value
14
- end
15
-
16
- def visit_MSFLVisitors_Nodes_Date(obj, collector)
17
- collector << obj.value.iso8601
18
- end
19
-
20
- def visit_MSFLVisitors_Nodes_DateTime(obj, collector)
21
- collector << obj.value.iso8601
22
- end
23
-
24
- def visit_MSFLVisitors_Nodes_Equal(obj, collector)
25
- binary_helper :eq, collector
26
- end
27
-
28
- def visit_MSFLVisitors_Nodes_GreaterThan(obj, collector)
29
- binary_helper :gt, collector
30
- end
31
-
32
- def visit_MSFLVisitors_Nodes_GreaterThanEqual(obj, collector)
33
- binary_helper :gte, collector
34
- end
35
-
36
- def visit_MSFLVisitors_Nodes_Grouping_Close(obj, collector)
37
- collector << " )"
38
- end
39
-
40
- def visit_MSFLVisitors_Nodes_Grouping_Open(obj, collector)
41
- collector << "( "
42
- end
43
-
44
- def visit_MSFLVisitors_Nodes_LessThan(obj, collector)
45
- binary_helper :lt, collector
46
- end
47
-
48
- def visit_MSFLVisitors_Nodes_LessThanEqual(obj, collector)
49
- binary_helper :lte, collector
50
- end
51
-
52
- def visit_MSFLVisitors_Nodes_Number(obj, collector)
53
- collector << obj.value
54
- end
55
-
56
- def visit_MSFLVisitors_Nodes_Time(obj, collector)
57
- collector << obj.value.iso8601
58
- end
59
-
60
- def visit_MSFLVisitors_Nodes_Word(obj, collector)
61
- collector << "#{obj.value.to_s}"
62
- end
63
-
64
- private
65
- def binary_helper(operator, collector)
66
- collector << " #{BINARY_OPERATORS.fetch(operator.to_sym)} "
67
- end
68
- end
69
- end
70
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MSFLVisitors::Visitors::ChewyTermFilter do
4
-
5
- subject { node.accept visitor }
6
-
7
- let(:node) { fail ArgumentError, "You must define the node variable in each scope." }
8
-
9
- let(:visitor) { described_class.new collector }
10
-
11
- let(:collector) { String.new }
12
-
13
- let(:left) { MSFLVisitors::Nodes::Word.new "lhs" }
14
-
15
- let(:right) { MSFLVisitors::Nodes::Word.new "rhs" }
16
-
17
- describe "visiting an And node" do
18
-
19
- let(:node) { MSFLVisitors::Nodes::And.new left, right }
20
-
21
- it "matches ( left ) & ( right )" do
22
- expect(subject).to match "( lhs ) & ( rhs )"
23
- end
24
- end
25
-
26
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MSFLVisitors::Visitors::ChewyTermFilter do
4
-
5
- subject { node.accept visitor }
6
-
7
- let(:node) { fail ArgumentError, "You must define the node variable in each scope." }
8
-
9
- let(:visitor) { described_class.new collector }
10
-
11
- let(:collector) { String.new }
12
-
13
- let(:left) { MSFLVisitors::Nodes::Word.new "lhs" }
14
-
15
- let(:right) { MSFLVisitors::Nodes::Word.new "rhs" }
16
-
17
- describe "visiting an Equal node" do
18
-
19
- let(:node) { MSFLVisitors::Nodes::Equal.new left, right }
20
-
21
- it "matches left == right" do
22
- expect(subject).to match "lhs == rhs"
23
- end
24
- end
25
-
26
- describe "visiting a GreaterThan node" do
27
-
28
- let(:node) { MSFLVisitors::Nodes::GreaterThan.new left, right }
29
-
30
- it "matches left > right" do
31
- expect(subject).to match "lhs > rhs"
32
- end
33
- end
34
-
35
- describe "visiting a GreaterThanEqual node" do
36
-
37
- let(:node) { MSFLVisitors::Nodes::GreaterThanEqual.new left, right }
38
-
39
- it "matches left >= right" do
40
- expect(subject).to match "lhs >= rhs"
41
- end
42
- end
43
-
44
- describe "visiting a LessThan node" do
45
-
46
- let(:node) { MSFLVisitors::Nodes::LessThan.new left, right }
47
-
48
- it "matches left < right" do
49
- expect(subject).to match "lhs < rhs"
50
- end
51
- end
52
-
53
- describe "visiting a LessThanEqual node" do
54
-
55
- let(:node) { MSFLVisitors::Nodes::LessThanEqual.new left, right }
56
-
57
- it "matches left <= right" do
58
- expect(subject).to match "lhs <= rhs"
59
- end
60
- end
61
- end
@@ -1,63 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MSFLVisitors::Visitors::ChewyTermFilter do
4
-
5
- subject { node.accept visitor }
6
-
7
- let(:node) { fail ArgumentError, "You must define the node variable in each scope." }
8
-
9
- let(:visitor) { described_class.new collector }
10
-
11
- let(:collector) { Array.new }
12
-
13
- describe "visiting a Date node" do
14
-
15
- let(:node) { MSFLVisitors::Nodes::Date.new Date.today }
16
-
17
- it "is today's date using iso8601 formatting" do
18
- expect(subject.first).to eq Date.today.iso8601
19
- end
20
- end
21
-
22
- describe "visiting a DateTime node" do
23
-
24
- let(:now) { DateTime.now }
25
-
26
- let(:node) { MSFLVisitors::Nodes::DateTime.new now }
27
-
28
- it "is the current date and time using iso8601 formatting" do
29
- expect(subject.first).to eq now.iso8601
30
- end
31
- end
32
-
33
- describe "visiting a Number node" do
34
-
35
- let(:node) { MSFLVisitors::Nodes::Number.new number }
36
-
37
- let(:number) { 123 }
38
-
39
- it "is the number" do
40
- expect(subject.first).to eq number
41
- end
42
-
43
- context "when the number is a float" do
44
-
45
- let(:number) { 123.456 }
46
-
47
- it "is the number with the same precision" do
48
- expect(subject.first).to eq number
49
- end
50
- end
51
- end
52
-
53
- describe "visiting a Time node" do
54
-
55
- let(:node) { MSFLVisitors::Nodes::Time.new current_time }
56
-
57
- let(:current_time) { Time.now }
58
-
59
- it "is the current time using iso8601 formatting" do
60
- expect(subject.first).to eq current_time.iso8601
61
- end
62
- end
63
- end
@@ -1,44 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MSFLVisitors::Visitors::ChewyTermFilter do
4
-
5
- subject { node.accept visitor }
6
-
7
- let(:node) { fail ArgumentError, "You must define the node variable in each scope." }
8
-
9
- let(:visitor) { described_class.new collector }
10
-
11
- let(:collector) { Array.new }
12
-
13
- describe "visiting a Boolean node" do
14
-
15
- let(:node) { MSFLVisitors::Nodes::Boolean.new value }
16
-
17
- context "when the node has a value of true" do
18
-
19
- let(:value) { true }
20
-
21
- it "is true" do
22
- expect(subject.first).to be true
23
- end
24
- end
25
-
26
- context "when the node has a value of false" do
27
-
28
- let(:value) { false }
29
-
30
- it "is false" do
31
- expect(subject.first).to be false
32
- end
33
- end
34
- end
35
-
36
- describe "visiting a Word node" do
37
-
38
- let(:node) { MSFLVisitors::Nodes::Word.new "node_content" }
39
-
40
- it "is a literal string" do
41
- expect(subject.first).to match /node_content/
42
- end
43
- end
44
- end