iab-Oil 0.1.2
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.
- data/lib/CollesceProductInterpreter.rb +48 -0
- data/lib/CoverageInterpreter.rb +161 -0
- data/lib/CoverageInterpreter2.rb +36 -0
- data/lib/DSLContext.rb +28 -0
- data/lib/DataModelInterpreter.rb +109 -0
- data/lib/Element.rb +12 -0
- data/lib/LayoutInterpreter.rb +166 -0
- data/lib/ProductInterpreter2.rb +51 -0
- data/lib/RailsProcessInterpreter.rb +60 -0
- data/lib/RatingEngineResolver.rb +87 -0
- data/lib/SiteProcessInterpreter.rb +65 -0
- data/lib/VPMSComponentSchemaInterpreter.rb +216 -0
- data/lib/VPMSPackageSchemaInterpreter.rb +102 -0
- data/lib/VPMSProductSchemaInterpreter.rb +155 -0
- data/lib/VPMSSchemaInterpreter.rb +175 -0
- data/lib/xslt/VPMSPackageSchemaInterpreter.xsl +15 -0
- data/lib/xslt/VPMSSchemaInterpreter.xsl +90 -0
- metadata +89 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'DSLContext')
|
2
|
+
|
3
|
+
#create class that fills in for the RAILS class when rails is not around, e.g. when testing
|
4
|
+
#when RAILS is around this will have no effect
|
5
|
+
class HashWithIndifferentAccess < Hash
|
6
|
+
end
|
7
|
+
|
8
|
+
class CollesceProductInterpreter < DslContext
|
9
|
+
|
10
|
+
bubble :than, :is, :list, :the, :to, :at, :it, :end
|
11
|
+
|
12
|
+
def getResult
|
13
|
+
result = Array.new
|
14
|
+
result[0] = @entities
|
15
|
+
result[1] = @coverages
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
def product(*args)
|
20
|
+
@entities = Hash.new
|
21
|
+
@coverages = Hash.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def endproduct
|
25
|
+
end
|
26
|
+
|
27
|
+
def entities(*args)
|
28
|
+
@libtype = "entities"
|
29
|
+
end
|
30
|
+
|
31
|
+
def endentities
|
32
|
+
end
|
33
|
+
|
34
|
+
def coverages(*args)
|
35
|
+
@libtype = "coverages"
|
36
|
+
end
|
37
|
+
|
38
|
+
def endcoverages
|
39
|
+
end
|
40
|
+
|
41
|
+
def has_one(*args)
|
42
|
+
@entities[args[0]] = "has_one" if @libtype == "entities"
|
43
|
+
@coverages[args[0]] = "has_one" if @libtype == "coverages"
|
44
|
+
end
|
45
|
+
|
46
|
+
def has_many(*args)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'set'
|
2
|
+
require File.join(File.dirname(__FILE__),'DSLContext')
|
3
|
+
|
4
|
+
#create class that fills in for the RAILS class when rails is not around, e.g. when testing
|
5
|
+
#when RAILS is around this will have no effect
|
6
|
+
class HashWithIndifferentAccess < Hash
|
7
|
+
end
|
8
|
+
|
9
|
+
class CoverageInterpreter < DslContext
|
10
|
+
|
11
|
+
bubble :than, :is, :list, :the, :to, :at, :it, :end
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
@columns = 1
|
15
|
+
@hidden_fields = Set.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def getResult
|
19
|
+
widgets = ""
|
20
|
+
@widgets.each { |k| widgets << ",'#{k}'" }
|
21
|
+
@erb = "<%= widgets(#{widgets[1..-1]}) %>\n" + @erb unless widgets.length == 0
|
22
|
+
@erb
|
23
|
+
end
|
24
|
+
|
25
|
+
def hideFields(*args)
|
26
|
+
args[0].split('&').each { |a| @hidden_fields << a.to_sym }
|
27
|
+
end
|
28
|
+
|
29
|
+
def columns(*args)
|
30
|
+
@columns = args[0].to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
def coverage(*args)
|
34
|
+
begin_erb(COVERAGE_DEF_ROOT, args)
|
35
|
+
end
|
36
|
+
|
37
|
+
def endcoverage(*args)
|
38
|
+
end_erb
|
39
|
+
end
|
40
|
+
|
41
|
+
def entity(*args)
|
42
|
+
begin_erb(ENTITY_DEF_ROOT, args)
|
43
|
+
end
|
44
|
+
|
45
|
+
def endentity(*args)
|
46
|
+
end_erb
|
47
|
+
end
|
48
|
+
|
49
|
+
def use(*args)
|
50
|
+
#the test on hidden_fields property is a bit too brutal in that it cuts out a whole part of the tree
|
51
|
+
#it serves to provide the same hiding capability as we had in the iteration earlier this day
|
52
|
+
#but more consideration especially around individual field level restriction needs to be considered
|
53
|
+
#i.e. we may want to keep part of the tree but loose some of the fields at that level
|
54
|
+
#so that we need considering in the code block below
|
55
|
+
args.each { |a| return if @hidden_fields.include?(a.to_sym) unless a.class.name == 'Hash' }
|
56
|
+
|
57
|
+
# If the last argument is a hash we assume it's a hash of overrides which we remove
|
58
|
+
# and merge in later.
|
59
|
+
args_hash = nil
|
60
|
+
args_hash = args.pop if args.last.class.name == 'Hash'
|
61
|
+
|
62
|
+
#now figure out whether the last arg above leads to an empty hash
|
63
|
+
#not strictly empty since every hash has an xpath property of the position in the class hierarchy
|
64
|
+
#if so backup a level and read the property whose name = the last arg value passed in
|
65
|
+
lastArg = ""
|
66
|
+
specificProperty = false
|
67
|
+
myHash = @prdhash["#{@argName}#{args}"]
|
68
|
+
raise "Failed to find [#{@argName}#{args}] in [#{@argName}PropertyHash]" if myHash == nil
|
69
|
+
|
70
|
+
# Have a look for meta data pertaining to the class which may specify a type.
|
71
|
+
class_meta_data = @prdhash["#{@argName}#{args}MD"]
|
72
|
+
specific_widget = class_meta_data[:type] unless class_meta_data == nil
|
73
|
+
|
74
|
+
if (myHash.length == 1)
|
75
|
+
specificProperty = true
|
76
|
+
lastArg = args.pop
|
77
|
+
myHash = @prdhash["#{@argName}#{args}"]
|
78
|
+
# Since we are delegating to our parent definition we look at that for a type
|
79
|
+
# specification if we haven' already found one.
|
80
|
+
#class_meta_data = @prdhash["#{@argName}#{args}MD"] if specific_widget == nil
|
81
|
+
#specific_widget = class_meta_data[:type] unless class_meta_data == nil
|
82
|
+
end
|
83
|
+
|
84
|
+
@widgets << specific_widget unless specific_widget == nil
|
85
|
+
@erb << "<% #{specific_widget} \"#\{widgetROOT}/#{specific_widget}\" do %>" unless specific_widget == nil
|
86
|
+
|
87
|
+
myHash.each do |property, value|
|
88
|
+
if (property != 'xpath' and (property =~ /MD$/) == nil) then
|
89
|
+
#properties of type HashWithIndifferentAccess hold metadata about the property
|
90
|
+
if (value == "" && (!specificProperty || (specificProperty && property == "#{lastArg}"))) then
|
91
|
+
|
92
|
+
if (@columns > 1)
|
93
|
+
@erb << '<tr>' if @col == 1
|
94
|
+
@erb << "<td width=\"#{100/@columns}%\">"
|
95
|
+
#@erb << "<div style=\"display: inline-block;float: left;width: #{(100/@columns)}%;\">"
|
96
|
+
end
|
97
|
+
|
98
|
+
metaData = myHash["#{property}MD"]
|
99
|
+
metaData = metaData.merge(args_hash) unless args_hash == nil
|
100
|
+
sMetaData = "{"
|
101
|
+
metaData.each { |n, v| sMetaData << "'#{n}' => '#{v}'," }
|
102
|
+
sMetaData << ":entityName => '#{@argName}#{args}',"
|
103
|
+
sMetaData << ":propertyName => '#{property}'"
|
104
|
+
sMetaData << "}"
|
105
|
+
#puts "METADATA:#{property}:#{metaData['mask']}_input:#{metaData['type']}_input"
|
106
|
+
@erb << "<% singleline_rowpanel \"#\{widgetROOT}/singleline_rowpanel\",\"#{sMetaData}\" do %>\n"
|
107
|
+
@widgets << "singleline_rowpanel"
|
108
|
+
|
109
|
+
if (metaData['type'] != nil) then
|
110
|
+
@widgets << "#{metaData['type']}_input"
|
111
|
+
@erb << "<% #{metaData['type']}_input \"#\{widgetROOT}/#{metaData['type']}_input\",\"#{sMetaData}\" do %>\n<% end %>"
|
112
|
+
elsif (metaData['mask'] != nil) then
|
113
|
+
@widgets << "#{metaData['mask']}_input"
|
114
|
+
@erb << "<% #{metaData['mask']}_input \"#\{widgetROOT}/#{metaData['mask']}_input\",\"#{sMetaData}\" do %>\n<% end %>"
|
115
|
+
else
|
116
|
+
@widgets << "text_input"
|
117
|
+
@erb << "<% text_input \"#\{widgetROOT}/text_input\",\"#{sMetaData}\" do %>\n<% end %>"
|
118
|
+
end
|
119
|
+
|
120
|
+
@erb << "\n<% end %>"
|
121
|
+
|
122
|
+
if (@columns > 1)
|
123
|
+
#@erb << '</div>'
|
124
|
+
@erb << '</td>'
|
125
|
+
@erb << '</tr>' if @col == @columns
|
126
|
+
@col = 0 if @col == @columns
|
127
|
+
@col += 1
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
@erb << '<% end %>' unless specific_widget == nil
|
133
|
+
end
|
134
|
+
|
135
|
+
private
|
136
|
+
def begin_erb(dsl_root, *args)
|
137
|
+
@widgets = Set.new
|
138
|
+
@col = 1
|
139
|
+
@argName = "#{args[0]}"
|
140
|
+
@prdhash = YAML::load(open(File.join(dsl_root,"/#{@argName}PropertyHash"),'r' ))
|
141
|
+
# Check to see if there's meta data specifying a type for this class.
|
142
|
+
class_meta_data = @prdhash["#{@argName}MD"]
|
143
|
+
specific_widget = class_meta_data[:type] unless class_meta_data == nil
|
144
|
+
@widgets << specific_widget unless specific_widget == nil
|
145
|
+
@erb = ''
|
146
|
+
@erb = "<% #{specific_widget} \"#\{widgetROOT}/#{specific_widget}\" do %>" unless specific_widget == nil
|
147
|
+
@erb << '<table width="100%">' if @columns > 1
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
def end_erb()
|
152
|
+
if(@columns > 1)
|
153
|
+
@erb << '</tr>' if @erb.match(/tr>$/) == nil
|
154
|
+
@erb << '</table>'
|
155
|
+
end
|
156
|
+
class_meta_data = @prdhash["#{@argName}MD"]
|
157
|
+
specific_widget = class_meta_data[:type] unless class_meta_data == nil
|
158
|
+
@erb << '<% end %>' unless specific_widget == nil
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'DSLContext'
|
2
|
+
|
3
|
+
class CoverageInterpreter2 < DslContext
|
4
|
+
def initialize
|
5
|
+
@name = ''
|
6
|
+
@entity = Array.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def getResult
|
10
|
+
@entity
|
11
|
+
end
|
12
|
+
|
13
|
+
def coverage(*args)
|
14
|
+
@name = args[0].to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def endcoverage(*args)
|
18
|
+
#nothing to do here at the mo
|
19
|
+
end
|
20
|
+
|
21
|
+
def entity(*args)
|
22
|
+
coverage(args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def endentity(*args)
|
26
|
+
endcoverage(args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def use(*args)
|
30
|
+
# remove the trailing defaults and stuff
|
31
|
+
if(args.last.class.name == 'Hash')
|
32
|
+
args.pop
|
33
|
+
end
|
34
|
+
@entity << args.collect{ |p| ':' + (p.to_s()) }.join(',')
|
35
|
+
end
|
36
|
+
end
|
data/lib/DSLContext.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class DslContext
|
2
|
+
def self.execute(*args)
|
3
|
+
rules = polish_text(args[0])
|
4
|
+
#significant change to allow class instance variables to be set on the initialize, ahead
|
5
|
+
#of the evaluation of the DSL - allows dynamic props to be sent to the class
|
6
|
+
#see VPMSProductSchemaInterpreter, which gets a param from the package interpreter
|
7
|
+
inst = (args.length > 1) ? self.new(args.slice(1,1)) : self.new
|
8
|
+
rules.each do |rule|
|
9
|
+
result = inst.instance_eval(rule)
|
10
|
+
#passes results as parm into code that was passed with call to execute (if any was)
|
11
|
+
yield result if block_given?
|
12
|
+
end
|
13
|
+
inst.getResult
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.polish_text(text)
|
17
|
+
rules = text.split("\n")
|
18
|
+
rules.collect do |rule|
|
19
|
+
rule << " "
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.bubble(*methods)
|
24
|
+
methods.each do |method|
|
25
|
+
define_method(method) {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'set'
|
2
|
+
require File.join(File.dirname(__FILE__),'DSLContext')
|
3
|
+
require 'Element'
|
4
|
+
|
5
|
+
class DataModelInterpreter < DslContext
|
6
|
+
def initialize
|
7
|
+
@elements = []
|
8
|
+
@elementTree = []
|
9
|
+
@depth=0
|
10
|
+
end
|
11
|
+
|
12
|
+
def getResult
|
13
|
+
#dumpParsedStructure
|
14
|
+
result = @elements
|
15
|
+
result
|
16
|
+
end
|
17
|
+
# --parse - implement the grammar
|
18
|
+
def datamodel(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def enddatamodel(*args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def createNewElement(name,coverage,parent,type)
|
25
|
+
e = ElementFactory(name,coverage,parent,type)
|
26
|
+
@elementTree.last.children.push e if @elementTree.last and @elementTree.length > 0
|
27
|
+
@elementTree.push e
|
28
|
+
end
|
29
|
+
|
30
|
+
def ElementFactory(name,coverage,parent,type)
|
31
|
+
@elements.each do |node|
|
32
|
+
if node.name == name
|
33
|
+
node.parent = parent
|
34
|
+
return node
|
35
|
+
end
|
36
|
+
end
|
37
|
+
e = Element.new(name,coverage,parent,type)
|
38
|
+
@elements.push e
|
39
|
+
return e
|
40
|
+
end
|
41
|
+
|
42
|
+
def element(*args)
|
43
|
+
createNewElement(args[0],false,@elementTree.last,nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
def endelement(*args)
|
47
|
+
@elementTree.pop
|
48
|
+
end
|
49
|
+
|
50
|
+
def coverage(*args)
|
51
|
+
createNewElement(args[0]+ "Coverage",true,@elementTree.last,"coverages")
|
52
|
+
end
|
53
|
+
|
54
|
+
def endcoverage(*args)
|
55
|
+
@elementTree.pop
|
56
|
+
end
|
57
|
+
|
58
|
+
def entity(*args)
|
59
|
+
createNewElement(args[0],true,@elementTree.last,"entities")
|
60
|
+
end
|
61
|
+
|
62
|
+
def endentity(*args)
|
63
|
+
@elementTree.pop
|
64
|
+
end
|
65
|
+
|
66
|
+
def field(*args)
|
67
|
+
if (args[0][:ctype] != nil)
|
68
|
+
if (@elementTree.last.coverage)
|
69
|
+
parent = nil
|
70
|
+
else
|
71
|
+
parent = @elementTree.last
|
72
|
+
end
|
73
|
+
createNewElement(args[0][:ctype],false,parent,nil) #the parent is nil here since a complex type may be used by many coverages or entities
|
74
|
+
@elementTree.pop
|
75
|
+
else
|
76
|
+
@elementTree.last.fields.push args[0]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
#----------- dump
|
81
|
+
|
82
|
+
def dumpParsedStructure
|
83
|
+
@dumpStructure = ""
|
84
|
+
@elements.each do |e|
|
85
|
+
if (e.coverage)
|
86
|
+
@dumpStructure << "#{e.name}:\n"
|
87
|
+
listChildren(e)
|
88
|
+
@dumpStructure << "\n"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
puts "#{@dumpStructure}"
|
92
|
+
end
|
93
|
+
|
94
|
+
def listChildren(e)
|
95
|
+
@depth = @depth + 1
|
96
|
+
e.children.each do |c|
|
97
|
+
str = ""
|
98
|
+
@depth.times { str << "\t"}
|
99
|
+
@dumpStructure << "#{str}#{c.name}\n"
|
100
|
+
c.fields.each do |f|
|
101
|
+
str = ""
|
102
|
+
@depth.times { str << "\t\t"}
|
103
|
+
@dumpStructure << "#{str}field:#{f}\n"
|
104
|
+
end
|
105
|
+
listChildren(c)
|
106
|
+
@depth = @depth - 1
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/lib/Element.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
class Element
|
2
|
+
attr_accessor :coverage,:name,:children,:parent,:fields,:type
|
3
|
+
|
4
|
+
def initialize(name,isaentityorcoverage,parent,type)
|
5
|
+
@coverage = isaentityorcoverage
|
6
|
+
@name = name
|
7
|
+
@children = []
|
8
|
+
@parent = parent
|
9
|
+
@fields = []
|
10
|
+
@type = type
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'DSLContext')
|
2
|
+
require File.join(File.dirname(__FILE__),'CoverageInterpreter')
|
3
|
+
|
4
|
+
class LayoutInterpreter < DslContext
|
5
|
+
|
6
|
+
bubble :than, :is, :list, :the, :to, :at, :it, :endheader, :endlayout, :endfooter
|
7
|
+
|
8
|
+
def getResult
|
9
|
+
widgets = ""
|
10
|
+
@widgets.each do |k,v|
|
11
|
+
widgets << ",'#{k}'"
|
12
|
+
end
|
13
|
+
@erb = "<%= widgets(#{widgets[1..-1]}) %>\n" + @erb unless widgets.length == 0
|
14
|
+
@erb
|
15
|
+
end
|
16
|
+
|
17
|
+
def product(*args)
|
18
|
+
@product = args[0]
|
19
|
+
end
|
20
|
+
|
21
|
+
def navigation(steps)
|
22
|
+
@navigationSteps = steps
|
23
|
+
end
|
24
|
+
|
25
|
+
def layout(*args)
|
26
|
+
@widgets = Hash.new
|
27
|
+
@erb = "<head>\n"
|
28
|
+
@erb << "<%= getCSS('#{args[0]}.css') %>\n"
|
29
|
+
@erb << "</head>\n"
|
30
|
+
@erb << "<body>\n"
|
31
|
+
@erb << "\t<div class=\"container\">\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
def endlayout(*args)
|
35
|
+
@erb << "\t</div>\n"
|
36
|
+
@erb << "</body>"
|
37
|
+
end
|
38
|
+
|
39
|
+
def header(*args)
|
40
|
+
@erb << "\t\t<div class=\"header\">\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
def endheader(*args)
|
44
|
+
@erb << "\t\t</div>\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
def miniheader(*args)
|
48
|
+
@erb << "\t\t<div class=\"mini-header\">#{args[0]}\n"
|
49
|
+
end
|
50
|
+
|
51
|
+
def endminiheader(*args)
|
52
|
+
@erb << "\t\t</div>\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
def column(*args)
|
56
|
+
@erb << "\t\t<td style=\"vertical-align: top;\">\n"
|
57
|
+
end
|
58
|
+
|
59
|
+
def endcolumn
|
60
|
+
@erb << "\t\t</td>\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
def columns
|
64
|
+
@erb << "\t\t<table class=\"columnWrapper\"><tr>\n"
|
65
|
+
end
|
66
|
+
|
67
|
+
def endcolumns
|
68
|
+
@erb << "\t\t</tr></table>\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
def footer(*args)
|
72
|
+
@erb << "\t\t<div class=\"footer\">\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
def endfooter(*args)
|
76
|
+
@erb << "\t\t</div>\n"
|
77
|
+
end
|
78
|
+
|
79
|
+
def panel(*args)
|
80
|
+
if args.length > 0
|
81
|
+
@erb << "\t\t\t<div class=\"#{args[0]}\">\n"
|
82
|
+
else
|
83
|
+
@erb << "\t\t\t<div>\n"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def endpanel
|
88
|
+
@erb << "\t\t\t</div>\n"
|
89
|
+
end
|
90
|
+
|
91
|
+
def product_menu(*args)
|
92
|
+
#TODO:slidingMenu needs implementing as a single item menu construct
|
93
|
+
#that is repeated for each of theargs
|
94
|
+
@erb << "\t\t\t"
|
95
|
+
@erb << '<%= render :partial => "#{widgetROOT}/sliding_menu/sliding_menu", :locals => { :menuitems => %w('
|
96
|
+
@erb << args.join(' ')
|
97
|
+
@erb << ') } %>'
|
98
|
+
@erb << "\n"
|
99
|
+
end
|
100
|
+
|
101
|
+
def teaser(*args)
|
102
|
+
@erb << "\t\t\t<%= render :partial => \"#\{teaserROOT}/#{args[0]}\" %>\n"
|
103
|
+
end
|
104
|
+
|
105
|
+
def widget(*args)
|
106
|
+
@widgets["#{args[0]}"] = 1
|
107
|
+
|
108
|
+
@erb << "\t\t\t<% #{args[0]} \"#\{widgetROOT}/#{args[0]}\""
|
109
|
+
|
110
|
+
widget_args_hash = args[1]
|
111
|
+
|
112
|
+
if (@navigationSteps.length > 0)
|
113
|
+
if (args[0].to_sym == :submit_panel)
|
114
|
+
widget_args_hash = {:nextLayout => @navigationSteps[0].to_sym}
|
115
|
+
elsif (args[0].to_sym == :button_panel)
|
116
|
+
str = "{:button1 => :#{@navigationSteps.first}"
|
117
|
+
i = 1
|
118
|
+
@navigationSteps.each do |step|
|
119
|
+
str << ",:button#{i += 1} => :#{step}" unless step == @navigationSteps.first
|
120
|
+
end
|
121
|
+
str << "}"
|
122
|
+
widget_args_hash = eval(str)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
if (widget_args_hash and widget_args_hash.class.name == "Hash")
|
128
|
+
sHash = "{"
|
129
|
+
comma = ""
|
130
|
+
widget_args_hash.each do |n,v|
|
131
|
+
sHash << "#{comma}:#{n} => '#{v}'"
|
132
|
+
comma = ","
|
133
|
+
end
|
134
|
+
sHash << "}"
|
135
|
+
|
136
|
+
@erb << ",\"#{sHash}\" do %>\n"
|
137
|
+
else
|
138
|
+
@erb << " do %>\n"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def endwidget
|
143
|
+
@erb << "\t\t\t <% end %>\n"
|
144
|
+
end
|
145
|
+
|
146
|
+
def entity(*args)
|
147
|
+
interpret(ENTITY_DSL_ROOT, *args)
|
148
|
+
end
|
149
|
+
|
150
|
+
def coverage(*args)
|
151
|
+
interpret(COVERAGE_DSL_ROOT, *args)
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
def interpret(dslroot, *args)
|
156
|
+
path = dslroot.gsub(/%product/,@product)
|
157
|
+
open(File.join(path,"/#{args[0]}.oil")) {|f| @contents = f.read }
|
158
|
+
dsl = ''
|
159
|
+
if (args[1])
|
160
|
+
dsl << "hideFields \"#{args[1][:hide]}\"\n" if args[1][:hide]
|
161
|
+
dsl << "columns \"#{args[1][:columns]}\"\n" if args[1][:columns]
|
162
|
+
end
|
163
|
+
dsl << @contents.to_s
|
164
|
+
@erb << CoverageInterpreter.execute(dsl, args[1])
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'DSLContext'
|
2
|
+
|
3
|
+
class ProductInterpreter2 < DslContext
|
4
|
+
|
5
|
+
attr_reader :entity
|
6
|
+
attr_reader :coverage
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@name = ''
|
10
|
+
@entity = Array.new
|
11
|
+
@coverage = Array.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def getResult
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def product(*args)
|
19
|
+
@name = args[0]
|
20
|
+
end
|
21
|
+
|
22
|
+
def endproduct(*args)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def coverages(*args)
|
27
|
+
@currentGroup = @coverage
|
28
|
+
end
|
29
|
+
|
30
|
+
def endcoverages(*args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def entities(*args)
|
34
|
+
@currentGroup = @entity
|
35
|
+
end
|
36
|
+
|
37
|
+
def endentities(*args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def has_one(*args)
|
41
|
+
@currentGroup.push([args[0].to_s(), 'has_one'])
|
42
|
+
end
|
43
|
+
|
44
|
+
def has_many(*args)
|
45
|
+
@currentGroup.push([args[0].to_s(), 'has_many'])
|
46
|
+
end
|
47
|
+
|
48
|
+
def has_between(*args)
|
49
|
+
@currentGroup.push([args[0].to_s(), 'has_many'])
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'DSLContext')
|
2
|
+
|
3
|
+
#create class that fills in for the RAILS class when rails is not around, e.g. when testing
|
4
|
+
#when RAILS is around this will have no effect
|
5
|
+
class HashWithIndifferentAccess < Hash
|
6
|
+
end
|
7
|
+
|
8
|
+
class RailsProcessInterpreter < DslContext
|
9
|
+
|
10
|
+
bubble :channels,:channel,:processes,:process,:to,:endprocess,:endprocesses,:endchannel,:endchannels
|
11
|
+
|
12
|
+
def getResult
|
13
|
+
@result
|
14
|
+
end
|
15
|
+
|
16
|
+
def workflow_steps
|
17
|
+
@result = ""
|
18
|
+
end
|
19
|
+
|
20
|
+
def endworkflow_steps
|
21
|
+
end
|
22
|
+
|
23
|
+
def flow(*args)
|
24
|
+
#serialize array
|
25
|
+
sarray ="["
|
26
|
+
args[1].each do |a|
|
27
|
+
if (a == args[1].first)
|
28
|
+
sarray << ":#{a}"
|
29
|
+
else
|
30
|
+
sarray << ",:#{a}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
sarray << "]"
|
34
|
+
@result << ":#{args[0]} => #{sarray},"
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid_flows(*args)
|
38
|
+
@result << "def wireProcess\n"
|
39
|
+
@result << "@processMap = {"
|
40
|
+
end
|
41
|
+
|
42
|
+
def endvalid_flows(*args)
|
43
|
+
@result << "}\n"
|
44
|
+
@result << "end"
|
45
|
+
end
|
46
|
+
|
47
|
+
def step(*args)
|
48
|
+
#there will be at least five parameters for an IAB app - rails controller, rails action, language, brand, product
|
49
|
+
controller_process_step = "if self.respond_to?(:#{args[1][:do].to_s.downcase})\nparams.merge!(#{args[1][:do].to_s.downcase})\nend" if (args[1][:do])
|
50
|
+
engine_call = ""
|
51
|
+
engine_call << "@results = Communicator.instance.handle(session,\"#{args[1][:do]}\",params)" if (args[1][:do])
|
52
|
+
marshalling = ""
|
53
|
+
marshalling << "possible_redirect = massage(@results) if @results\nif possible_redirect\nredirect_to possible_redirect\nreturn\nend" if (args[1][:do])
|
54
|
+
injectLayoutDict = "introduce_layout_dictionary(\"#{args[1][:template]}\")"
|
55
|
+
|
56
|
+
action = "def #{args[0]}\n@template.setParmsForViewUse({:currentstep => :#{args[0]}})\n#{controller_process_step}\n#{engine_call}\n#{marshalling}\n#{injectLayoutDict}\nrender :template => \"#{args[1][:template]}.oil\", :layout => \"#{args[1][:layout]}\"\nend\n"
|
57
|
+
#puts("introducing controller action\n#{action}")
|
58
|
+
@result << action
|
59
|
+
end
|
60
|
+
end
|