hq-engine 0.0.13 → 0.1.0
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 +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
|