hq-engine 0.0.13 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/engine/engine.feature +128 -0
- data/features/support/env.rb +10 -0
- data/features/support/steps.rb +0 -0
- data/features/transform/transform.feature +111 -0
- data/lib/hq/engine/engine-script.rb +66 -0
- data/lib/hq/engine/engine.rb +19 -70
- data/lib/hq/transform/ruby-backend.rb +85 -0
- data/lib/hq/transform/transform-script.rb +81 -0
- data/lib/hq/{engine → transform}/transformer.rb +18 -10
- data/spec/hq/{engine → transform}/transformer-spec.rb +1 -1
- metadata +82 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3dfe1ba890c382485213a074683030ee06736e54
|
4
|
+
data.tar.gz: c75fa82d77e182ab2b243efcf9aebaa3799e4adb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d39b500ce568c06e775d08e0714f580a183febb3421916571f8042220e2ab8bbf2aa1c1187ecfd58f017b8b684ca17f79518ffcc1e764170c90513e4636bcb2
|
7
|
+
data.tar.gz: abff7975df830b6ecd77c33776d95a76e2fa6e3b1f12aa0f06708fcb0f1a9331f8bffaae4e1545e7e91aeb082b945a796a37c4c4a3a5f2a753b7883685c35daa
|
@@ -0,0 +1,128 @@
|
|
1
|
+
Feature: Engine
|
2
|
+
|
3
|
+
Background:
|
4
|
+
|
5
|
+
Given a file "config/rules/input-schema.rb":
|
6
|
+
"""
|
7
|
+
# (: out schema :)
|
8
|
+
require "xml"
|
9
|
+
proc do |hq|
|
10
|
+
doc = XML::Document.string '
|
11
|
+
<schema name="input">
|
12
|
+
<id><text name="name"/></id>
|
13
|
+
<fields><text name="value"/></fields>
|
14
|
+
</schema>
|
15
|
+
'
|
16
|
+
hq.write doc.root
|
17
|
+
end
|
18
|
+
"""
|
19
|
+
|
20
|
+
And a file "config/rules/schema-schema.rb":
|
21
|
+
"""
|
22
|
+
# (: out schema :)
|
23
|
+
require "xml"
|
24
|
+
proc do |hq|
|
25
|
+
doc = XML::Document.string '
|
26
|
+
<schema name="schema">
|
27
|
+
<id><text name="name"/></id>
|
28
|
+
<fields/>
|
29
|
+
</schema>
|
30
|
+
'
|
31
|
+
hq.write doc.root
|
32
|
+
end
|
33
|
+
"""
|
34
|
+
|
35
|
+
And a file "config/rules/output-schema.rb":
|
36
|
+
"""
|
37
|
+
# (: out schema :)
|
38
|
+
require "xml"
|
39
|
+
proc do |hq|
|
40
|
+
doc = XML::Document.string '
|
41
|
+
<schema name="output">
|
42
|
+
<id><text name="name"/></id>
|
43
|
+
<fields><text name="value"/></fields>
|
44
|
+
</schema>
|
45
|
+
'
|
46
|
+
hq.write doc.root
|
47
|
+
end
|
48
|
+
"""
|
49
|
+
|
50
|
+
And a file "config/rules/input-to-output.rb":
|
51
|
+
"""
|
52
|
+
# (: in input :)
|
53
|
+
# (: out output :)
|
54
|
+
require "xml"
|
55
|
+
proc do |hq|
|
56
|
+
hq.find("input").each do
|
57
|
+
|input|
|
58
|
+
output = XML::Node.new "output"
|
59
|
+
output["name"] = input["name"]
|
60
|
+
output["value"] = input["value"].upcase
|
61
|
+
hq.write output
|
62
|
+
end
|
63
|
+
end
|
64
|
+
"""
|
65
|
+
|
66
|
+
And a file "work/input.yaml":
|
67
|
+
"""
|
68
|
+
- id: input/name
|
69
|
+
type: input
|
70
|
+
value:
|
71
|
+
name: name
|
72
|
+
value: value
|
73
|
+
"""
|
74
|
+
|
75
|
+
And a file "default.args":
|
76
|
+
"""
|
77
|
+
--config config
|
78
|
+
--work work
|
79
|
+
"""
|
80
|
+
|
81
|
+
Scenario: Success
|
82
|
+
|
83
|
+
When I invoke engine with "default.args"
|
84
|
+
|
85
|
+
Then there should be a file "work/output/data/output/name.xml":
|
86
|
+
"""
|
87
|
+
<output name="name" value="VALUE"/>
|
88
|
+
"""
|
89
|
+
|
90
|
+
Then there should be a file "work/output/data/schema/schema.xml":
|
91
|
+
"""
|
92
|
+
<schema name="schema">
|
93
|
+
<id>
|
94
|
+
<text name="name"/>
|
95
|
+
</id>
|
96
|
+
<fields/>
|
97
|
+
</schema>
|
98
|
+
"""
|
99
|
+
|
100
|
+
Then there should be a file "work/output/data/schema/output.xml":
|
101
|
+
"""
|
102
|
+
<schema name="output">
|
103
|
+
<id>
|
104
|
+
<text name="name"/>
|
105
|
+
</id>
|
106
|
+
<fields>
|
107
|
+
<text name="value"/>
|
108
|
+
</fields>
|
109
|
+
</schema>
|
110
|
+
"""
|
111
|
+
|
112
|
+
Then there should be a file "work/output/data/schema/input.xml":
|
113
|
+
"""
|
114
|
+
<schema name="input">
|
115
|
+
<id>
|
116
|
+
<text name="name"/>
|
117
|
+
</id>
|
118
|
+
<fields>
|
119
|
+
<text name="value"/>
|
120
|
+
</fields>
|
121
|
+
</schema>
|
122
|
+
"""
|
123
|
+
|
124
|
+
Then there should be a file "work/output/data/input/name.xml":
|
125
|
+
"""
|
126
|
+
<input name="name" value="value"/>
|
127
|
+
"""
|
128
|
+
|
File without changes
|
@@ -0,0 +1,111 @@
|
|
1
|
+
Feature: Transformer
|
2
|
+
|
3
|
+
The transformer takes a schema, a set of data files, and a list of rules, and
|
4
|
+
it produces a structured data tree as output. It depends on a backend which
|
5
|
+
must be provided externally.
|
6
|
+
|
7
|
+
Background:
|
8
|
+
|
9
|
+
Given a file "schema.xml":
|
10
|
+
"""
|
11
|
+
<data>
|
12
|
+
<schema name="input">
|
13
|
+
<id>
|
14
|
+
<text name="name"/>
|
15
|
+
</id>
|
16
|
+
<fields>
|
17
|
+
<text name="value"/>
|
18
|
+
</fields>
|
19
|
+
</schema>
|
20
|
+
<schema name="internal">
|
21
|
+
<id>
|
22
|
+
<text name="name"/>
|
23
|
+
</id>
|
24
|
+
<fields>
|
25
|
+
<text name="value"/>
|
26
|
+
</fields>
|
27
|
+
</schema>
|
28
|
+
<schema name="output">
|
29
|
+
<id>
|
30
|
+
<text name="name"/>
|
31
|
+
</id>
|
32
|
+
<fields>
|
33
|
+
<text name="value"/>
|
34
|
+
</fields>
|
35
|
+
</schema>
|
36
|
+
</data>
|
37
|
+
"""
|
38
|
+
|
39
|
+
And a file "input/data.xml":
|
40
|
+
"""
|
41
|
+
<data>
|
42
|
+
<input name="name" value="value"/>
|
43
|
+
</data>
|
44
|
+
"""
|
45
|
+
|
46
|
+
And a file "rules/input-to-internal.rb":
|
47
|
+
"""
|
48
|
+
# (: in input :)
|
49
|
+
# (: out internal :)
|
50
|
+
require "xml"
|
51
|
+
include XML
|
52
|
+
proc do
|
53
|
+
|hq|
|
54
|
+
hq.find("input").each do
|
55
|
+
|input|
|
56
|
+
internal = Node.new "internal"
|
57
|
+
internal["name"] = input["name"]
|
58
|
+
internal["value"] = input["value"].upcase
|
59
|
+
hq.write internal
|
60
|
+
end
|
61
|
+
end
|
62
|
+
"""
|
63
|
+
|
64
|
+
And a file "rules/internal-to-output.rb":
|
65
|
+
"""
|
66
|
+
# (: in internal :)
|
67
|
+
# (: out output :)
|
68
|
+
require "xml"
|
69
|
+
include XML
|
70
|
+
proc do
|
71
|
+
|hq|
|
72
|
+
hq.find("internal").each do
|
73
|
+
|internal|
|
74
|
+
2.times do
|
75
|
+
|time|
|
76
|
+
output = Node.new "output"
|
77
|
+
output["name"] = "#{internal["name"]}-#{time}"
|
78
|
+
output["value"] = internal["value"]
|
79
|
+
hq.write output
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
"""
|
84
|
+
|
85
|
+
And a file "default.args":
|
86
|
+
"""
|
87
|
+
--schema schema.xml
|
88
|
+
--input input
|
89
|
+
--rules rules
|
90
|
+
--include include
|
91
|
+
--output output
|
92
|
+
"""
|
93
|
+
|
94
|
+
Scenario: Success
|
95
|
+
|
96
|
+
When I invoke transform with "default.args"
|
97
|
+
|
98
|
+
Then there should be a file "output/data/input/name.xml":
|
99
|
+
"""
|
100
|
+
<input name="name" value="value"/>
|
101
|
+
"""
|
102
|
+
|
103
|
+
And there should be a file "output/data/internal/name.xml":
|
104
|
+
"""
|
105
|
+
<internal name="name" value="VALUE"/>
|
106
|
+
"""
|
107
|
+
|
108
|
+
And there should be a file "output/data/output/name-1.xml":
|
109
|
+
"""
|
110
|
+
<output name="name-1" value="VALUE"/>
|
111
|
+
"""
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "hq/logger"
|
2
|
+
require "hq/tools/base-script"
|
3
|
+
require "hq/tools/getopt"
|
4
|
+
require "hq/engine/engine"
|
5
|
+
require "hq/transform/ruby-backend"
|
6
|
+
|
7
|
+
module HQ
|
8
|
+
module Engine
|
9
|
+
|
10
|
+
class EngineScript < Tools::BaseScript
|
11
|
+
|
12
|
+
attr_accessor :logger
|
13
|
+
attr_accessor :transform_backend
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
|
17
|
+
@logger = Logger.new
|
18
|
+
@logger.hostname = "local"
|
19
|
+
@logger.add_auto "debug"
|
20
|
+
|
21
|
+
@transform_backend = Transform::RubyBackend.new
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def main
|
26
|
+
process_args
|
27
|
+
run_engine
|
28
|
+
end
|
29
|
+
|
30
|
+
def process_args
|
31
|
+
|
32
|
+
@opts, @args =
|
33
|
+
Tools::Getopt.process @args, [
|
34
|
+
|
35
|
+
{ :name => :config,
|
36
|
+
:required => true },
|
37
|
+
|
38
|
+
{ :name => :work,
|
39
|
+
:required => true },
|
40
|
+
|
41
|
+
]
|
42
|
+
|
43
|
+
@args.empty? \
|
44
|
+
or raise "Extra args on command line"
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
def run_engine
|
49
|
+
|
50
|
+
engine =
|
51
|
+
Engine.new
|
52
|
+
|
53
|
+
engine.logger = logger
|
54
|
+
engine.transform_backend = transform_backend
|
55
|
+
|
56
|
+
engine.config_dir = @opts[:config]
|
57
|
+
engine.work_dir = @opts[:work]
|
58
|
+
|
59
|
+
engine.transform
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
data/lib/hq/engine/engine.rb
CHANGED
@@ -1,20 +1,22 @@
|
|
1
|
+
require "xml"
|
2
|
+
|
1
3
|
require "hq/engine/libxmlruby-mixin"
|
4
|
+
require "hq/transform/transformer"
|
2
5
|
|
3
6
|
module HQ
|
4
7
|
module Engine
|
8
|
+
|
5
9
|
class Engine
|
6
10
|
|
7
11
|
include LibXmlRubyMixin
|
8
12
|
|
9
|
-
attr_accessor :
|
13
|
+
attr_accessor :logger
|
14
|
+
attr_accessor :transform_backend
|
10
15
|
|
11
|
-
attr_accessor :
|
16
|
+
attr_accessor :config_dir
|
17
|
+
attr_accessor :work_dir
|
12
18
|
|
13
|
-
|
14
|
-
def couch() main.couch end
|
15
|
-
def logger() main.logger end
|
16
|
-
def work_dir() main.work_dir end
|
17
|
-
def rule_provider() main.rule_provider end
|
19
|
+
attr_accessor :results
|
18
20
|
|
19
21
|
def schema_file() "#{work_dir}/schema.xml" end
|
20
22
|
|
@@ -87,8 +89,6 @@ class Engine
|
|
87
89
|
|
88
90
|
# process abstract config
|
89
91
|
|
90
|
-
require "hq/engine/transformer"
|
91
|
-
|
92
92
|
transformer = HQ::Engine::Transformer.new
|
93
93
|
transformer.parent = self
|
94
94
|
|
@@ -118,7 +118,6 @@ class Engine
|
|
118
118
|
item_doc.root
|
119
119
|
}
|
120
120
|
|
121
|
-
|
122
121
|
write_data_file schema_file, new_schemas
|
123
122
|
|
124
123
|
# restart if schema changed
|
@@ -185,9 +184,7 @@ class Engine
|
|
185
184
|
|
186
185
|
logger.notice "loading input from database"
|
187
186
|
|
188
|
-
|
189
|
-
|
190
|
-
logger.time "loading input from database" do
|
187
|
+
logger.time "converting input" do
|
191
188
|
|
192
189
|
@input_docs = {}
|
193
190
|
@input_strs = {}
|
@@ -197,38 +194,24 @@ class Engine
|
|
197
194
|
|
198
195
|
FileUtils.mkdir_p "#{work_dir}/input", :mode => 0700
|
199
196
|
|
200
|
-
rows = couch.view("root", "by_type")["rows"]
|
201
197
|
values_by_type = Hash.new
|
202
198
|
|
203
|
-
|
199
|
+
inputs = YAML.load File.read "#{work_dir}/input.yaml"
|
204
200
|
|
205
|
-
|
201
|
+
inputs.each do
|
202
|
+
|input|
|
206
203
|
|
207
|
-
|
204
|
+
id = input["id"]
|
205
|
+
type = input["type"]
|
206
|
+
value = input["value"]
|
208
207
|
|
209
|
-
|
210
|
-
value = row["value"]
|
211
|
-
|
212
|
-
else
|
213
|
-
|
214
|
-
type = row["value"]["type"]
|
215
|
-
value = row["value"]["value"]
|
216
|
-
|
217
|
-
row["id"] =~ /^current\/(.+)$/
|
218
|
-
value["_id"] = $1
|
219
|
-
|
220
|
-
end
|
208
|
+
value["_id"] = id
|
221
209
|
|
222
210
|
values_by_type[type] ||= Hash.new
|
223
|
-
values_by_type[type][
|
224
|
-
|
225
|
-
main.continue
|
211
|
+
values_by_type[type][id] = value
|
226
212
|
|
227
213
|
end
|
228
214
|
|
229
|
-
change =
|
230
|
-
staged_change
|
231
|
-
|
232
215
|
schema =
|
233
216
|
load_schema_file "#{work_dir}/schema.xml"
|
234
217
|
|
@@ -251,20 +234,6 @@ class Engine
|
|
251
234
|
input_doc = XML::Document.new
|
252
235
|
input_doc.root = XML::Node.new "data"
|
253
236
|
|
254
|
-
if change
|
255
|
-
change["items"].each do |key, item|
|
256
|
-
case item["action"]
|
257
|
-
when "create", "update"
|
258
|
-
next unless key =~ /^#{Regexp.quote type}\//
|
259
|
-
values[key] = item["record"]
|
260
|
-
when "delete"
|
261
|
-
values.delete key
|
262
|
-
else
|
263
|
-
raise "Error"
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
237
|
sorted_values =
|
269
238
|
values.values.sort {
|
270
239
|
|a,b|
|
@@ -287,27 +256,6 @@ class Engine
|
|
287
256
|
|
288
257
|
end
|
289
258
|
|
290
|
-
def staged_change
|
291
|
-
|
292
|
-
return nil \
|
293
|
-
unless $deploy_mode == :staged
|
294
|
-
|
295
|
-
locks =
|
296
|
-
couch.get "mandar-locks"
|
297
|
-
|
298
|
-
return nil \
|
299
|
-
unless locks
|
300
|
-
|
301
|
-
change =
|
302
|
-
locks["changes"][$deploy_role]
|
303
|
-
|
304
|
-
return nil \
|
305
|
-
unless change
|
306
|
-
|
307
|
-
return change
|
308
|
-
|
309
|
-
end
|
310
|
-
|
311
259
|
def load_results
|
312
260
|
|
313
261
|
@results = {}
|
@@ -351,5 +299,6 @@ class Engine
|
|
351
299
|
|
352
300
|
|
353
301
|
end
|
302
|
+
|
354
303
|
end
|
355
304
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module HQ
|
2
|
+
module Transform
|
3
|
+
|
4
|
+
class RubyBackend
|
5
|
+
|
6
|
+
def session
|
7
|
+
return Session.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def extensions
|
11
|
+
[ "rb" ]
|
12
|
+
end
|
13
|
+
|
14
|
+
class Session
|
15
|
+
|
16
|
+
def set_library_module name, content
|
17
|
+
end
|
18
|
+
|
19
|
+
def compile_xquery source, filename
|
20
|
+
|
21
|
+
@source = source
|
22
|
+
@filename = filename
|
23
|
+
|
24
|
+
@proc = Object.instance_eval source, filename
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def run_xquery input, &callback
|
29
|
+
|
30
|
+
context = Context.new
|
31
|
+
context.callback = callback
|
32
|
+
|
33
|
+
@proc.call context
|
34
|
+
|
35
|
+
ret = XML::Document.new
|
36
|
+
ret.root = XML::Node.new "data"
|
37
|
+
|
38
|
+
context.results.each do
|
39
|
+
|node| ret.root << ret.import(node)
|
40
|
+
end
|
41
|
+
|
42
|
+
return ret.to_s
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
class Context
|
47
|
+
|
48
|
+
attr_accessor :callback
|
49
|
+
attr_accessor :results
|
50
|
+
|
51
|
+
def initialize
|
52
|
+
@results = []
|
53
|
+
end
|
54
|
+
|
55
|
+
def find type
|
56
|
+
|
57
|
+
strings =
|
58
|
+
@callback.call \
|
59
|
+
"search records",
|
60
|
+
{
|
61
|
+
"type" => type,
|
62
|
+
}
|
63
|
+
|
64
|
+
nodes =
|
65
|
+
strings.map {
|
66
|
+
|string|
|
67
|
+
XML::Document.string(string).root
|
68
|
+
}
|
69
|
+
|
70
|
+
return nodes
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def write node
|
75
|
+
@results << node
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "hq/logger"
|
2
|
+
require "hq/tools/base-script"
|
3
|
+
require "hq/tools/getopt"
|
4
|
+
require "hq/transform/ruby-backend"
|
5
|
+
require "hq/transform/transformer"
|
6
|
+
|
7
|
+
module HQ
|
8
|
+
module Transform
|
9
|
+
|
10
|
+
class TransformScript < Tools::BaseScript
|
11
|
+
|
12
|
+
attr_accessor :logger
|
13
|
+
attr_accessor :transform_backend
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
|
17
|
+
@logger = Logger.new
|
18
|
+
@logger.hostname = "local"
|
19
|
+
@logger.add_auto "debug"
|
20
|
+
|
21
|
+
@transform_backend = RubyBackend.new
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def main
|
26
|
+
process_args
|
27
|
+
perform_transform
|
28
|
+
end
|
29
|
+
|
30
|
+
def process_args
|
31
|
+
|
32
|
+
@opts, @args =
|
33
|
+
Tools::Getopt.process @args, [
|
34
|
+
|
35
|
+
{ :name => :input,
|
36
|
+
:required => true },
|
37
|
+
|
38
|
+
{ :name => :rules,
|
39
|
+
:required => true },
|
40
|
+
|
41
|
+
{ :name => :include,
|
42
|
+
:required => true },
|
43
|
+
|
44
|
+
{ :name => :schema,
|
45
|
+
:required => true },
|
46
|
+
|
47
|
+
{ :name => :output,
|
48
|
+
:required => true }
|
49
|
+
|
50
|
+
]
|
51
|
+
|
52
|
+
@args.empty? \
|
53
|
+
or raise "Extra args on command line"
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def perform_transform
|
58
|
+
|
59
|
+
transformer =
|
60
|
+
Engine::Transformer.new
|
61
|
+
|
62
|
+
transformer.parent = self
|
63
|
+
|
64
|
+
transformer.schema_file = @opts[:schema]
|
65
|
+
transformer.rules_dir = @opts[:rules]
|
66
|
+
transformer.include_dir = @opts[:include]
|
67
|
+
transformer.input_dir = @opts[:input]
|
68
|
+
transformer.output_dir = @opts[:output]
|
69
|
+
|
70
|
+
result =
|
71
|
+
transformer.rebuild
|
72
|
+
|
73
|
+
raise "Error" \
|
74
|
+
unless result[:success]
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "hq/engine/libxmlruby-mixin"
|
2
|
+
require "hq/engine/rule-error"
|
2
3
|
|
3
4
|
module HQ
|
4
5
|
module Engine
|
@@ -9,7 +10,7 @@ class Transformer
|
|
9
10
|
attr_accessor :parent
|
10
11
|
|
11
12
|
def logger() parent.logger end
|
12
|
-
def
|
13
|
+
def transform_backend() parent.transform_backend end
|
13
14
|
|
14
15
|
attr_accessor :schema_file
|
15
16
|
attr_accessor :rules_dir
|
@@ -35,11 +36,18 @@ class Transformer
|
|
35
36
|
Dir.glob("#{rules_dir}/**/*").each do
|
36
37
|
|filename|
|
37
38
|
|
39
|
+
extensions_re =
|
40
|
+
"(?:%s)" % [
|
41
|
+
transform_backend.extensions
|
42
|
+
.map { |ext| Regexp.quote ext }
|
43
|
+
.join("|")
|
44
|
+
]
|
45
|
+
|
38
46
|
next unless filename =~ /^
|
39
47
|
#{Regexp.quote "#{rules_dir}/"}
|
40
48
|
(
|
41
49
|
(.+)
|
42
|
-
\. (
|
50
|
+
\. (#{extensions_re})
|
43
51
|
)
|
44
52
|
$/x
|
45
53
|
|
@@ -65,15 +73,15 @@ class Transformer
|
|
65
73
|
|
66
74
|
end
|
67
75
|
|
68
|
-
def
|
76
|
+
def init_backend_session
|
69
77
|
|
70
|
-
@
|
71
|
-
|
78
|
+
@backend_session =
|
79
|
+
transform_backend.session
|
72
80
|
|
73
81
|
# add hq module
|
74
82
|
# TODO move this somewhere
|
75
83
|
|
76
|
-
@
|
84
|
+
@backend_session.set_library_module \
|
77
85
|
"hq",
|
78
86
|
"
|
79
87
|
module namespace hq = \"hq\";
|
@@ -105,7 +113,7 @@ class Transformer
|
|
105
113
|
|
106
114
|
remove_output
|
107
115
|
|
108
|
-
|
116
|
+
init_backend_session
|
109
117
|
|
110
118
|
@data = {}
|
111
119
|
|
@@ -186,7 +194,7 @@ class Transformer
|
|
186
194
|
path =~ /^ #{Regexp.quote include_dir} \/ (.+) $/x
|
187
195
|
name = $1
|
188
196
|
|
189
|
-
@
|
197
|
+
@backend_session.set_library_module \
|
190
198
|
name,
|
191
199
|
File.read(path)
|
192
200
|
|
@@ -318,12 +326,12 @@ class Transformer
|
|
318
326
|
|
319
327
|
begin
|
320
328
|
|
321
|
-
@
|
329
|
+
@backend_session.compile_xquery \
|
322
330
|
rule[:source],
|
323
331
|
rule[:filename]
|
324
332
|
|
325
333
|
result_str =
|
326
|
-
@
|
334
|
+
@backend_session.run_xquery \
|
327
335
|
"<xml/>" \
|
328
336
|
do
|
329
337
|
|name, args|
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hq-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Pharaoh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hq-logger
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hq-tools
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.1
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: multi_json
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -30,14 +58,42 @@ dependencies:
|
|
30
58
|
requirements:
|
31
59
|
- - '>='
|
32
60
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
61
|
+
version: 1.3.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: hq-dev
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.0.18
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.0.18
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: json
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.7.7
|
34
90
|
type: :development
|
35
91
|
prerelease: false
|
36
92
|
version_requirements: !ruby/object:Gem::Requirement
|
37
93
|
requirements:
|
38
94
|
- - '>='
|
39
95
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
96
|
+
version: 1.7.7
|
41
97
|
- !ruby/object:Gem::Dependency
|
42
98
|
name: libxml-ruby
|
43
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,56 +114,56 @@ dependencies:
|
|
58
114
|
requirements:
|
59
115
|
- - '>='
|
60
116
|
- !ruby/object:Gem::Version
|
61
|
-
version: 10.0.
|
117
|
+
version: 10.0.4
|
62
118
|
type: :development
|
63
119
|
prerelease: false
|
64
120
|
version_requirements: !ruby/object:Gem::Requirement
|
65
121
|
requirements:
|
66
122
|
- - '>='
|
67
123
|
- !ruby/object:Gem::Version
|
68
|
-
version: 10.0.
|
124
|
+
version: 10.0.4
|
69
125
|
- !ruby/object:Gem::Dependency
|
70
126
|
name: rspec
|
71
127
|
requirement: !ruby/object:Gem::Requirement
|
72
128
|
requirements:
|
73
129
|
- - '>='
|
74
130
|
- !ruby/object:Gem::Version
|
75
|
-
version: 2.
|
131
|
+
version: 2.13.0
|
76
132
|
type: :development
|
77
133
|
prerelease: false
|
78
134
|
version_requirements: !ruby/object:Gem::Requirement
|
79
135
|
requirements:
|
80
136
|
- - '>='
|
81
137
|
- !ruby/object:Gem::Version
|
82
|
-
version: 2.
|
138
|
+
version: 2.13.0
|
83
139
|
- !ruby/object:Gem::Dependency
|
84
140
|
name: rspec_junit_formatter
|
85
141
|
requirement: !ruby/object:Gem::Requirement
|
86
142
|
requirements:
|
87
143
|
- - '>='
|
88
144
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
145
|
+
version: 0.1.6
|
90
146
|
type: :development
|
91
147
|
prerelease: false
|
92
148
|
version_requirements: !ruby/object:Gem::Requirement
|
93
149
|
requirements:
|
94
150
|
- - '>='
|
95
151
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
152
|
+
version: 0.1.6
|
97
153
|
- !ruby/object:Gem::Dependency
|
98
154
|
name: simplecov
|
99
155
|
requirement: !ruby/object:Gem::Requirement
|
100
156
|
requirements:
|
101
157
|
- - '>='
|
102
158
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
159
|
+
version: 0.7.1
|
104
160
|
type: :development
|
105
161
|
prerelease: false
|
106
162
|
version_requirements: !ruby/object:Gem::Requirement
|
107
163
|
requirements:
|
108
164
|
- - '>='
|
109
165
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
166
|
+
version: 0.7.1
|
111
167
|
description: HQ transformation engine
|
112
168
|
email:
|
113
169
|
- james@phsys.co.uk
|
@@ -115,6 +171,7 @@ executables: []
|
|
115
171
|
extensions: []
|
116
172
|
extra_rdoc_files: []
|
117
173
|
files:
|
174
|
+
- lib/hq/engine/engine-script.rb
|
118
175
|
- lib/hq/engine/engine.rb
|
119
176
|
- lib/hq/engine/register-engine-commands.rb
|
120
177
|
- lib/hq/engine/subprocess-rule-provider/self.rb
|
@@ -122,12 +179,18 @@ files:
|
|
122
179
|
- lib/hq/engine/subprocess-rule-provider/start.rb
|
123
180
|
- lib/hq/engine/libxmlruby-mixin.rb
|
124
181
|
- lib/hq/engine/unlock-command.rb
|
125
|
-
- lib/hq/engine/transformer.rb
|
126
182
|
- lib/hq/engine/rule-error.rb
|
183
|
+
- lib/hq/transform/ruby-backend.rb
|
184
|
+
- lib/hq/transform/transform-script.rb
|
185
|
+
- lib/hq/transform/transformer.rb
|
186
|
+
- features/engine/engine.feature
|
187
|
+
- features/transform/transform.feature
|
188
|
+
- features/support/steps.rb
|
189
|
+
- features/support/env.rb
|
127
190
|
- spec/hq/engine/libxmlruby-mixin-spec.rb
|
128
191
|
- spec/hq/engine/subprocess-rule-provider/self-spec.rb
|
129
192
|
- spec/hq/engine/subprocess-rule-provider/session-spec.rb
|
130
|
-
- spec/hq/
|
193
|
+
- spec/hq/transform/transformer-spec.rb
|
131
194
|
homepage: https://github.com/jamespharaoh/hq-engine
|
132
195
|
licenses: []
|
133
196
|
metadata: {}
|
@@ -152,7 +215,11 @@ signing_key:
|
|
152
215
|
specification_version: 4
|
153
216
|
summary: HQ engine
|
154
217
|
test_files:
|
218
|
+
- features/engine/engine.feature
|
219
|
+
- features/transform/transform.feature
|
220
|
+
- features/support/steps.rb
|
221
|
+
- features/support/env.rb
|
155
222
|
- spec/hq/engine/libxmlruby-mixin-spec.rb
|
156
223
|
- spec/hq/engine/subprocess-rule-provider/self-spec.rb
|
157
224
|
- spec/hq/engine/subprocess-rule-provider/session-spec.rb
|
158
|
-
- spec/hq/
|
225
|
+
- spec/hq/transform/transformer-spec.rb
|