msfl_visitors 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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