taverna-t2flow 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use 1.8.7@taverna2-gem
data/CHANGES.rdoc CHANGED
@@ -1,5 +1,11 @@
1
1
  = Changes log for the T2Flow Ruby Gem
2
2
 
3
+ == Version 0.4.0
4
+
5
+ * Made parser more robust.
6
+ * Processor annotations are now extracted properly.
7
+ * Semantic annotations on ports, processors and dataflows are now extracted.
8
+
3
9
  == Version 0.3.0
4
10
 
5
11
  * Minor changes for ruby 1.9 compatibility.
data/Rakefile CHANGED
@@ -14,13 +14,13 @@ require 'jeweler'
14
14
 
15
15
  task :default => [:test]
16
16
 
17
- T2FLOW_GEM_VERSION = "0.3.0"
17
+ T2FLOW_GEM_VERSION = "0.4.0"
18
18
 
19
19
  Jeweler::Tasks.new do |s|
20
20
  s.name = "taverna-t2flow"
21
21
  s.version = T2FLOW_GEM_VERSION
22
- s.authors = ["Robert Haines", "David Withers", "Mannie Tagarira"]
23
- s.email = ["rhaines@manchester.ac.uk"]
22
+ s.authors = ["Finn Bacall", "Robert Haines", "David Withers", "Mannie Tagarira"]
23
+ s.email = ["finn.bacall@cs.man.ac.uk", "rhaines@manchester.ac.uk"]
24
24
  s.homepage = "http://www.taverna.org.uk/"
25
25
  s.platform = Gem::Platform::RUBY
26
26
  s.summary = "Support for interacting with Taverna 2 workflows."
data/lib/t2flow/model.rb CHANGED
@@ -231,7 +231,11 @@ module T2Flow # :nodoc:
231
231
 
232
232
  # A string containing the description of the processor if available.
233
233
  # Returns nil otherwise.
234
- attr_accessor :description
234
+ attr_accessor :descriptions
235
+
236
+ def description
237
+ @descriptions.first
238
+ end
235
239
 
236
240
  # A string for the type of processor, e.g. beanshell, workflow, webservice, etc...
237
241
  attr_accessor :type
@@ -273,6 +277,12 @@ module T2Flow # :nodoc:
273
277
  # Value for string constants
274
278
  attr_accessor :value
275
279
 
280
+ attr_accessor :semantic_annotation
281
+
282
+ def initialize
283
+ @descriptions = []
284
+ end
285
+
276
286
  end
277
287
 
278
288
 
@@ -308,9 +318,11 @@ module T2Flow # :nodoc:
308
318
 
309
319
  # A list of authors of the dataflow
310
320
  attr_accessor :authors
321
+
322
+ attr_accessor :semantic_annotation
311
323
 
312
324
  def initialize
313
- @authors, @descriptions, @titles = [], [], []
325
+ @authors, @descriptions, @titles = [], [], []
314
326
  end
315
327
  end
316
328
 
@@ -347,7 +359,7 @@ module T2Flow # :nodoc:
347
359
  # A string that does not contain a colon can often be returned, signifiying
348
360
  # a workflow source as opposed to that of a processor.
349
361
  class Source
350
- attr_accessor :name, :descriptions, :example_values
362
+ attr_accessor :name, :descriptions, :example_values, :semantic_annotation
351
363
  end
352
364
 
353
365
 
@@ -358,7 +370,27 @@ module T2Flow # :nodoc:
358
370
  # A string that does not contain a colon can often be returned, signifiying
359
371
  # a workflow sink as opposed to that of a processor.
360
372
  class Sink
361
- attr_accessor :name, :descriptions, :example_values
362
- end
373
+ attr_accessor :name, :descriptions, :example_values, :semantic_annotation
374
+ end
375
+
376
+
377
+ # A representation of a semantic annotation. It is linked to a +subject+,
378
+ # which can be a processor, port, or dataflow object. It has a +type+, which
379
+ # indicates the MIME type of it's +content+. By default, this will be text/rdf+n3.
380
+ # +Content+ is the content of the annotation, which in n3 form consists of one or more
381
+ # triples.
382
+ class SemanticAnnotation
383
+ attr_reader :subject, :type, :content
384
+
385
+ def initialize(subject, type, content)
386
+ @subject = subject
387
+ @type = type
388
+ @content = content
389
+ end
390
+
391
+ def to_s
392
+ @content
393
+ end
394
+ end
363
395
 
364
396
  end
data/lib/t2flow/parser.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "libxml"
2
+ require "cgi"
2
3
 
3
4
  module T2Flow
4
5
 
@@ -11,15 +12,17 @@ module T2Flow
11
12
  def parse(t2flow)
12
13
  case t2flow.class.to_s
13
14
  when /^string$/i
14
- document = LibXML::XML::Parser.string(t2flow).parse
15
+ document = LibXML::XML::Parser.string(t2flow, :options => LibXML::XML::Parser::Options::NOBLANKS).parse
15
16
  when /^stringio|file$/i
16
17
  t2flow.rewind
17
- document = LibXML::XML::Parser.string(t2flow.read).parse
18
+ document = LibXML::XML::Parser.string(t2flow.read, :options => LibXML::XML::Parser::Options::NOBLANKS).parse
18
19
  else
19
20
  raise "Error parsing file."
20
21
  end
21
22
 
22
23
  root = document.root
24
+ root.namespaces.default_prefix = "t2"
25
+
23
26
  raise "Doesn't appear to be a workflow!" if root.name != "workflow"
24
27
  version = root["version"]
25
28
 
@@ -32,7 +35,7 @@ module T2Flow
32
35
  local_depends = element.find("//localDependencies")
33
36
  if local_depends
34
37
  local_depends.each do |dependency|
35
- dependency.each do |dep|
38
+ dependency.each do |dep|
36
39
  model.dependencies = [] if model.dependencies.nil?
37
40
  model.dependencies << dep.content unless dep.content =~ /^\s*$/
38
41
  end
@@ -40,29 +43,29 @@ module T2Flow
40
43
  model.dependencies.uniq! if model.dependencies
41
44
  end
42
45
 
43
- element.each do |dataflow|
46
+ element.each_element do |dataflow|
44
47
  next if dataflow["id"].nil? || dataflow["id"].chomp.strip.empty?
45
48
 
46
49
  dataflow_obj = Dataflow.new
47
50
  dataflow_obj.dataflow_id = dataflow["id"]
48
51
  dataflow_obj.role = dataflow["role"]
49
52
 
50
- dataflow.each do |elt|
53
+ dataflow.each_element do |elt|
51
54
  case elt.name
52
55
  when "name"
53
56
  dataflow_obj.annotations.name = elt.content
54
57
  when "inputPorts"
55
- elt.each { |port| add_source(dataflow_obj, port) }
58
+ elt.each_element { |port| add_source(dataflow_obj, port) }
56
59
  when "outputPorts"
57
- elt.each { |port| add_sink(dataflow_obj, port) }
60
+ elt.each_element { |port| add_sink(dataflow_obj, port) }
58
61
  when "processors"
59
- elt.each { |proc| add_processor(dataflow_obj, proc) }
62
+ elt.each_element { |proc| add_processor(dataflow_obj, proc) }
60
63
  when "datalinks"
61
- elt.each { |link| add_link(dataflow_obj, link) }
64
+ elt.each_element { |link| add_link(dataflow_obj, link) }
62
65
  when "conditions"
63
- elt.each { |coord| add_coordination(dataflow_obj, coord) }
66
+ elt.each_element { |coord| add_coordination(dataflow_obj, coord) }
64
67
  when "annotations"
65
- elt.each { |ann| add_annotation(dataflow_obj, ann) }
68
+ elt.each_element { |ann| add_annotation(dataflow_obj, ann) }
66
69
  end # case elt.name
67
70
  end # dataflow.each
68
71
 
@@ -82,89 +85,37 @@ module T2Flow
82
85
  return if port.nil? || port.content.chomp.strip.empty?
83
86
 
84
87
  source = Source.new
85
-
86
- port.each do |elt|
87
- case elt.name
88
- when "name"
89
- source.name = elt.content
90
- when "annotations"
91
- elt.each do |ann|
92
- next if ann.nil? || ann.content.chomp.strip.empty?
93
-
94
- node = LibXML::XML::Parser.string("#{ann}").parse
95
- content_node = node.find_first("//annotationBean")
96
- content = content_node.child.next.content
97
-
98
- case content_node["class"]
99
- when /freetextdescription/i
100
- source.descriptions = [] unless source.descriptions
101
- source.descriptions << content
102
- when /examplevalue/i
103
- source.example_values = [] unless source.example_values
104
- source.example_values << content
105
- end # case
106
- end # elt.each
107
- end # case
108
- end # port.each
109
-
88
+ extract_port_metadata(source, port)
110
89
  dataflow.sources << source
111
90
  end
112
91
 
113
92
  def add_sink(dataflow, port) # :nodoc:
114
93
  return if port.nil? || port.content.chomp.strip.empty?
115
94
 
116
- sink = Sink.new
117
-
118
- port.each do |elt|
119
- case elt.name
120
- when "name"
121
- sink.name = elt.content
122
- when "annotations"
123
- elt.each do |ann|
124
- next if ann.nil? || ann.content.chomp.strip.empty?
125
-
126
- node = LibXML::XML::Parser.string("#{ann}").parse
127
- content_node = node.find_first("//annotationBean")
128
- content = content_node.child.next.content
129
-
130
- case content_node["class"]
131
- when /freetextdescription/i
132
- sink.descriptions = [] unless sink.descriptions
133
- sink.descriptions << content
134
- when /examplevalue/i
135
- sink.example_values = [] unless sink.example_values
136
- sink.example_values << content
137
- end # case
138
- end # elt.each
139
- end # case
140
- end # port.each
141
-
95
+ sink = Sink.new
96
+ extract_port_metadata(sink, port)
142
97
  dataflow.sinks << sink
143
98
  end
144
99
 
145
100
  def add_processor(dataflow, element) # :nodoc:
146
- return if element.nil? || element.content.chomp.strip.empty?
147
-
148
101
  processor = Processor.new
149
102
 
150
103
  temp_inputs = []
151
104
  temp_outputs = []
152
105
 
153
- element.each do |elt|
106
+ element.each_element do |elt|
154
107
  case elt.name
155
108
  when "name"
156
109
  processor.name = elt.content
157
110
  when /inputports/i # ports from services
158
- elt.each { |port|
159
- port.each { |x| temp_inputs << x.content if x.name=="name" }
160
- }
111
+ elt.each_element { |port| port.each_element { |x| temp_inputs << x.content if x.name=="name" }}
161
112
  when /outputports/i # ports from services
162
- elt.each { |port|
163
- port.each { |x| temp_outputs << x.content if x.name=="name" }
164
- }
113
+ elt.each_element { |port| port.each_element { |x| temp_outputs << x.content if x.name=="name" }}
114
+ when "annotations"
115
+ extract_annotations(processor, elt)
165
116
  when "activities" # a processor can only have one kind of activity
166
- activity = elt.child
167
- activity.each do |node|
117
+ activity = elt.find_first('./t2:activity')
118
+ activity.each_element do |node|
168
119
  if node.name == "configBean"
169
120
  activity_node = node.child
170
121
 
@@ -175,7 +126,7 @@ module T2Flow
175
126
  processor.type = (activity_node.name =~ /martquery/i ?
176
127
  "biomart" : activity_node.name.split(".")[-2])
177
128
 
178
- activity_node.each do |value_node|
129
+ activity_node.each_element do |value_node|
179
130
  case value_node.name
180
131
  when "wsdl"
181
132
  processor.wsdl = value_node.content
@@ -194,19 +145,19 @@ module T2Flow
194
145
  when "value"
195
146
  processor.value = value_node.content
196
147
  when "inputs" # ALL ports present in beanshell
197
- value_node.each { |input|
198
- input.each { |x|
148
+ value_node.each_element do |input|
149
+ input.each_element do |x|
199
150
  processor.inputs = [] if processor.inputs.nil?
200
151
  processor.inputs << x.content if x.name == "name"
201
- }
202
- }
152
+ end
153
+ end
203
154
  when "outputs" # ALL ports present in beanshell
204
- value_node.each { |output|
205
- output.each { |x|
155
+ value_node.each_element do |output|
156
+ output.each_element do |x|
206
157
  processor.outputs = [] if processor.outputs.nil?
207
158
  processor.outputs << x.content if x.name == "name"
208
- }
209
- }
159
+ end
160
+ end
210
161
  end # case value_node.name
211
162
  end # activity_node.each
212
163
  end # if else node["encoding"] == "dataflow"
@@ -221,27 +172,22 @@ module T2Flow
221
172
  end
222
173
 
223
174
  def add_link(dataflow, link) # :nodoc:
224
- return if link.nil? || link.content.chomp.strip.empty?
225
-
226
175
  datalink = Datalink.new
227
176
 
228
- link.each do |sink_source|
229
- case sink_source.name
230
- when "sink"
231
- datalink.sink = sink_source.child.content
232
- datalink.sink += ":" + sink_source.last.content if sink_source["type"] == "processor"
233
- when "source"
234
- datalink.source = sink_source.child.content
235
- datalink.source += ":" + sink_source.last.content if sink_source["type"] == "processor"
236
- end
177
+ if sink = link.find_first('./t2:sink')
178
+ datalink.sink = (sink["type"] == "processor" ? "#{sink.find_first('./t2:processor').content}:" : "") +
179
+ "#{sink.find_first('./t2:port').content}"
237
180
  end
238
-
181
+
182
+ if source = link.find_first('./t2:source')
183
+ datalink.source = (source["type"] == "processor" ? "#{source.find_first('./t2:processor').content}:" : "") +
184
+ "#{source.find_first('./t2:port').content}"
185
+ end
186
+
239
187
  dataflow.datalinks << datalink
240
188
  end
241
189
 
242
190
  def add_coordination(dataflow, condition) # :nodoc:
243
- return if condition.nil?
244
-
245
191
  coordination = Coordination.new
246
192
 
247
193
  coordination.control = condition["control"]
@@ -251,22 +197,60 @@ module T2Flow
251
197
  end
252
198
 
253
199
  def add_annotation(dataflow, annotation) # :nodoc:
254
- return if annotation.nil? || annotation.empty?
255
-
256
200
  node = LibXML::XML::Parser.string("#{annotation}").parse
257
201
  content_node = node.find_first("//annotationBean")
258
- content = content_node.child.next.content if content_node.child.next
259
202
 
260
203
  case content_node["class"]
261
204
  when /freetextdescription/i
262
- dataflow.annotations.descriptions << content
205
+ dataflow.annotations.descriptions << content_node.find_first('./text').content
263
206
  when /descriptivetitle/i
264
- dataflow.annotations.titles << content
207
+ dataflow.annotations.titles << content_node.find_first('./text').content
265
208
  when /author/i
266
- dataflow.annotations.authors << content
209
+ dataflow.annotations.authors << content_node.find_first('./text').content
210
+ when /semanticannotation/i
211
+ dataflow.annotations.semantic_annotation = parse_semantic_annotation(dataflow, content_node)
267
212
  end # case
268
213
  end
269
214
 
215
+ private
216
+
217
+ def extract_port_metadata(port, element)
218
+ element.each_element do |elt|
219
+ case elt.name
220
+ when "name"
221
+ port.name = elt.content
222
+ when "annotations"
223
+ extract_annotations(port, elt)
224
+ end # case
225
+ end # port.each
226
+ end
227
+
228
+ def extract_annotations(object, element)
229
+ element.each_element do |ann|
230
+ next if ann.nil? || ann.content.chomp.strip.empty?
231
+
232
+ node = LibXML::XML::Parser.string("#{ann}").parse
233
+ content_node = node.find_first("//annotationBean")
234
+
235
+ case content_node["class"]
236
+ when /freetextdescription/i
237
+ object.descriptions ||= []
238
+ object.descriptions << content_node.find_first('./text').content
239
+ when /examplevalue/i
240
+ object.example_values ||= []
241
+ object.example_values << content_node.find_first('./text').content
242
+ when /semanticannotation/i
243
+ object.semantic_annotation = parse_semantic_annotation(object, content_node)
244
+ end # case
245
+ end # element.each
246
+ end
247
+
248
+ def parse_semantic_annotation(object, content_node)
249
+ type = content_node.find_first('./mimeType').content
250
+ content = CGI.unescapeHTML(content_node.find_first('./content').content)
251
+ SemanticAnnotation.new(object, type, content)
252
+ end
253
+
270
254
  end
271
255
 
272
256
  end
@@ -5,19 +5,20 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "taverna-t2flow"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Robert Haines", "David Withers", "Mannie Tagarira"]
12
- s.date = "2012-05-02"
11
+ s.authors = ["Finn Bacall", "Robert Haines", "David Withers", "Mannie Tagarira"]
12
+ s.date = "2012-12-03"
13
13
  s.description = "This a gem developed by myGrid for the purpose of interacting with Taverna 2 workflows. An example use would be the image genaration for the model representing Taverna 2 workflows as used in myExperiment."
14
- s.email = ["rhaines@manchester.ac.uk"]
14
+ s.email = ["finn.bacall@cs.man.ac.uk", "rhaines@manchester.ac.uk"]
15
15
  s.extra_rdoc_files = [
16
16
  "CHANGES.rdoc",
17
17
  "LICENCE",
18
18
  "README.rdoc"
19
19
  ]
20
20
  s.files = [
21
+ ".rvmrc",
21
22
  "CHANGES.rdoc",
22
23
  "LICENCE",
23
24
  "README.rdoc",
@@ -37,18 +38,20 @@ Gem::Specification.new do |s|
37
38
  "test/fixtures/999.t2flow",
38
39
  "test/fixtures/basic.t2flow",
39
40
  "test/fixtures/coordinated.t2flow",
41
+ "test/fixtures/image_to_tiff_migration_action.t2flow",
40
42
  "test/fixtures/linked.t2flow",
41
43
  "test/fixtures/nested.t2flow",
42
44
  "test/fixtures/processors.t2flow",
43
45
  "test/run_tests.rb",
44
46
  "test/test_bogus_workflows.rb",
47
+ "test/test_component_workflows.rb",
45
48
  "test/test_helper.rb",
46
49
  "test/test_starter_pack_workflows.rb"
47
50
  ]
48
51
  s.homepage = "http://www.taverna.org.uk/"
49
52
  s.rdoc_options = ["-N", "--tab-width=2", "--main=README.rdoc"]
50
53
  s.require_paths = ["lib"]
51
- s.rubygems_version = "1.8.10"
54
+ s.rubygems_version = "1.8.24"
52
55
  s.summary = "Support for interacting with Taverna 2 workflows."
53
56
  s.test_files = ["test/run_tests.rb"]
54
57
 
@@ -0,0 +1,278 @@
1
+ <workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.4.0"><dataflow id="16841f82-e1fe-4527-b7ef-411c4c59493b" role="top"><name>Image_to_tiff_migrat</name><inputPorts><port><name>from_uri</name><depth>0</depth><granularDepth>0</granularDepth><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
2
+ <annotationAssertions>
3
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
4
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">
5
+ <text>description</text>
6
+ </annotationBean>
7
+ <date>2012-11-16 16:22:56.977 UTC</date>
8
+ <creators />
9
+ <curationEventList />
10
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
11
+ </annotationAssertions>
12
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
13
+ <annotationAssertions>
14
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
15
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.ExampleValue">
16
+ <text>example</text>
17
+ </annotationBean>
18
+ <date>2012-11-16 16:22:43.712 UTC</date>
19
+ <creators />
20
+ <curationEventList />
21
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
22
+ </annotationAssertions>
23
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
24
+ <annotationAssertions>
25
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
26
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.SemanticAnnotation">
27
+ <mimeType>text/rdf+n3</mimeType>
28
+ <content>[] &lt;http://scape-project.eu/pc/vocab/profiles#hasPortType&gt;
29
+ &lt;http://scape-project.eu/pc/vocab/profiles#FromURIPort&gt; .
30
+ </content>
31
+ </annotationBean>
32
+ <date>2012-11-19 15:53:49.250 UTC</date>
33
+ <creators />
34
+ <curationEventList />
35
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
36
+ </annotationAssertions>
37
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></port><port><name>to_uri</name><depth>0</depth><granularDepth>0</granularDepth><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
38
+ <annotationAssertions>
39
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
40
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.SemanticAnnotation">
41
+ <mimeType>text/rdf+n3</mimeType>
42
+ <content>[] &lt;http://scape-project.eu/pc/vocab/profiles#hasPortType&gt;
43
+ &lt;http://scape-project.eu/pc/vocab/profiles#ToURIPort&gt; .
44
+ </content>
45
+ </annotationBean>
46
+ <date>2012-11-20 12:09:41.928 UTC</date>
47
+ <creators />
48
+ <curationEventList />
49
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
50
+ </annotationAssertions>
51
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></port></inputPorts><outputPorts /><processors><processor><name>Tool</name><inputPorts><port><name>to_uri</name><depth>0</depth></port><port><name>from_uri</name><depth>0</depth></port></inputPorts><outputPorts /><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
52
+ <annotationAssertions>
53
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
54
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.SemanticAnnotation">
55
+ <mimeType>text/rdf+n3</mimeType>
56
+ <content>[] &lt;http://scape-project.eu/pc/vocab/profiles#hasDependency&gt;
57
+ &lt;http://scape-project.eu/pc/vocab/profiles#imagemagick-image2tiff&gt; .
58
+ </content>
59
+ </annotationBean>
60
+ <date>2012-11-20 12:17:37.420 UTC</date>
61
+ <creators />
62
+ <curationEventList />
63
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
64
+ </annotationAssertions>
65
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>external-tool-activity</artifact><version>1.4</version></raven><class>net.sf.taverna.t2.activities.externaltool.ExternalToolActivity</class><inputMap><map from="to_uri" to="to_uri" /><map from="from_uri" to="from_uri" /></inputMap><outputMap /><configBean encoding="xstream"><net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean xmlns="">
66
+ <mechanismType>789663B8-DA91-428A-9F7D-B3F3DA185FD4</mechanismType>
67
+ <mechanismName>default local</mechanismName>
68
+ <mechanismXML>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#xD;
69
+ &lt;localInvocation&gt;&lt;shellPrefix&gt;/bin/sh -c&lt;/shellPrefix&gt;&lt;linkCommand&gt;/bin/ln -s %%PATH_TO_ORIGINAL%% %%TARGET_NAME%%&lt;/linkCommand&gt;&lt;/localInvocation&gt;&#xD;
70
+ </mechanismXML>
71
+ <externaltoolid>1c6b3cec-667d-4364-8a77-315a3b3c71f8</externaltoolid>
72
+ <useCaseDescription>
73
+ <usecaseid />
74
+ <description />
75
+ <command>convert %%from_uri%% tiff:%%to_uri%%</command>
76
+ <preparingTimeoutInSeconds>1200</preparingTimeoutInSeconds>
77
+ <executionTimeoutInSeconds>1800</executionTimeoutInSeconds>
78
+ <tags>
79
+ <string>from_uri</string>
80
+ <string>to_uri</string>
81
+ </tags>
82
+ <REs />
83
+ <queue__preferred />
84
+ <queue__deny />
85
+ <static__inputs />
86
+ <inputs>
87
+ <entry>
88
+ <string>to_uri</string>
89
+ <de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>
90
+ <tag>to_uri</tag>
91
+ <file>false</file>
92
+ <tempFile>false</tempFile>
93
+ <binary>false</binary>
94
+ <charsetName>MacRoman</charsetName>
95
+ <forceCopy>false</forceCopy>
96
+ <list>false</list>
97
+ <concatenate>false</concatenate>
98
+ <mime />
99
+ </de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>
100
+ </entry>
101
+ <entry>
102
+ <string>from_uri</string>
103
+ <de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>
104
+ <tag>from_uri</tag>
105
+ <file>false</file>
106
+ <tempFile>false</tempFile>
107
+ <binary>false</binary>
108
+ <charsetName>MacRoman</charsetName>
109
+ <forceCopy>false</forceCopy>
110
+ <list>false</list>
111
+ <concatenate>false</concatenate>
112
+ <mime />
113
+ </de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>
114
+ </entry>
115
+ </inputs>
116
+ <outputs />
117
+ <includeStdIn>false</includeStdIn>
118
+ <includeStdOut>true</includeStdOut>
119
+ <includeStdErr>true</includeStdErr>
120
+ <validReturnCodes>
121
+ <int>0</int>
122
+ </validReturnCodes>
123
+ </useCaseDescription>
124
+ <edited>false</edited>
125
+ </net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.4</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
126
+ <maxJobs>1</maxJobs>
127
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.4</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.4</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.4</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">
128
+ <backoffFactor>1.0</backoffFactor>
129
+ <initialDelay>1000</initialDelay>
130
+ <maxDelay>5000</maxDelay>
131
+ <maxRetries>0</maxRetries>
132
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.4</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="to_uri" depth="0" /><port name="from_uri" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Tool</processor><port>to_uri</port></sink><source type="dataflow"><port>to_uri</port></source></datalink><datalink><sink type="processor"><processor>Tool</processor><port>from_uri</port></sink><source type="dataflow"><port>from_uri</port></source></datalink></datalinks><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
133
+ <annotationAssertions>
134
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
135
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">
136
+ <text>SCAPE Migration Components that converts any ImageMagick supported image format to TIFF</text>
137
+ </annotationBean>
138
+ <date>2012-11-15 13:07:59.763 UTC</date>
139
+ <creators />
140
+ <curationEventList />
141
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
142
+ </annotationAssertions>
143
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
144
+ <annotationAssertions>
145
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
146
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
147
+ <identification>fd401dac-c521-4d94-8014-8efeba355d7a</identification>
148
+ </annotationBean>
149
+ <date>2012-11-19 15:55:14.145 UTC</date>
150
+ <creators />
151
+ <curationEventList />
152
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
153
+ </annotationAssertions>
154
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
155
+ <annotationAssertions>
156
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
157
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
158
+ <identification>22bc577f-9a74-4981-8725-c3b4ac28d88b</identification>
159
+ </annotationBean>
160
+ <date>2012-11-20 12:10:07.110 UTC</date>
161
+ <creators />
162
+ <curationEventList />
163
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
164
+ </annotationAssertions>
165
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
166
+ <annotationAssertions>
167
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
168
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
169
+ <identification>052219d1-09ed-4c6b-a5a4-2bad004a10ed</identification>
170
+ </annotationBean>
171
+ <date>2012-11-19 16:17:25.295 UTC</date>
172
+ <creators />
173
+ <curationEventList />
174
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
175
+ </annotationAssertions>
176
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
177
+ <annotationAssertions>
178
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
179
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
180
+ <identification>5abab48b-a3f0-4f14-9894-e824a2fa5966</identification>
181
+ </annotationBean>
182
+ <date>2012-11-16 16:39:00.691 UTC</date>
183
+ <creators />
184
+ <curationEventList />
185
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
186
+ </annotationAssertions>
187
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
188
+ <annotationAssertions>
189
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
190
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.Author">
191
+ <text>David Withers</text>
192
+ </annotationBean>
193
+ <date>2012-11-15 12:25:42.359 UTC</date>
194
+ <creators />
195
+ <curationEventList />
196
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
197
+ </annotationAssertions>
198
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
199
+ <annotationAssertions>
200
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
201
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
202
+ <identification>b5361a0e-6abd-4070-8655-5dd7b4237576</identification>
203
+ </annotationBean>
204
+ <date>2012-11-15 13:36:38.115 UTC</date>
205
+ <creators />
206
+ <curationEventList />
207
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
208
+ </annotationAssertions>
209
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
210
+ <annotationAssertions>
211
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
212
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
213
+ <identification>2bec9695-c132-4728-988c-c3a03ddcc78d</identification>
214
+ </annotationBean>
215
+ <date>2012-11-15 13:08:31.374 UTC</date>
216
+ <creators />
217
+ <curationEventList />
218
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
219
+ </annotationAssertions>
220
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
221
+ <annotationAssertions>
222
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
223
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
224
+ <identification>0d60174b-0d75-481d-8b4d-194c6109bc96</identification>
225
+ </annotationBean>
226
+ <date>2012-11-20 12:17:54.280 UTC</date>
227
+ <creators />
228
+ <curationEventList />
229
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
230
+ </annotationAssertions>
231
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
232
+ <annotationAssertions>
233
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
234
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.SemanticAnnotation">
235
+ <mimeType>text/rdf+n3</mimeType>
236
+ <content>[] &lt;http://scape-project.eu/pc/vocab/profiles#hasMigrationPath&gt;
237
+ &lt;http://scape-project.eu/pc/vocab/profiles#jpegToTiff&gt; .
238
+ </content>
239
+ </annotationBean>
240
+ <date>2012-11-20 12:17:49.904 UTC</date>
241
+ <creators />
242
+ <curationEventList />
243
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
244
+ </annotationAssertions>
245
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
246
+ <annotationAssertions>
247
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
248
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
249
+ <identification>16841f82-e1fe-4527-b7ef-411c4c59493b</identification>
250
+ </annotationBean>
251
+ <date>2012-11-21 11:00:56.248 UTC</date>
252
+ <creators />
253
+ <curationEventList />
254
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
255
+ </annotationAssertions>
256
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
257
+ <annotationAssertions>
258
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
259
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
260
+ <identification>a5aee4f0-01d8-4ae3-96f0-c992b8d40af2</identification>
261
+ </annotationBean>
262
+ <date>2012-11-15 13:14:14.243 UTC</date>
263
+ <creators />
264
+ <curationEventList />
265
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
266
+ </annotationAssertions>
267
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
268
+ <annotationAssertions>
269
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
270
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.DescriptiveTitle">
271
+ <text>Image to tiff migration action</text>
272
+ </annotationBean>
273
+ <date>2012-11-21 11:00:54.84 UTC</date>
274
+ <creators />
275
+ <curationEventList />
276
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
277
+ </annotationAssertions>
278
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations></dataflow></workflow>
data/test/run_tests.rb CHANGED
@@ -5,3 +5,4 @@ require File.expand_path(File.join(__FILE__, "..", "test_helper.rb"))
5
5
 
6
6
  require File.expand_path(File.join(__FILE__, "..", "test_bogus_workflows.rb"))
7
7
  require File.expand_path(File.join(__FILE__, "..", "test_starter_pack_workflows.rb"))
8
+ require File.expand_path(File.join(__FILE__, "..", "test_component_workflows.rb"))
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+
4
+ require File.expand_path(File.join(__FILE__, "..", "..", "lib", "t2flow", "model.rb"))
5
+ require File.expand_path(File.join(__FILE__, "..", "..", "lib", "t2flow", "parser.rb"))
6
+
7
+ require File.expand_path(File.join(__FILE__, "..", "test_helper.rb"))
8
+
9
+ class ComponentWorkflowTest < Test::Unit::TestCase
10
+
11
+ include TestHelper
12
+
13
+ def setup
14
+ path = File.expand_path(File.join(__FILE__, "..", "fixtures", "image_to_tiff_migration_action.t2flow"))
15
+ @image_migration_wf = T2Flow::Parser.new.parse(File.new(path))
16
+ end
17
+
18
+ def test_image_migration_workflow
19
+ generic_model_test(@image_migration_wf)
20
+
21
+ assert_count(@image_migration_wf.processors, 1, "@image_migration_wf.processors")
22
+ assert_count(@image_migration_wf.sources, 2, "@image_migration_wf.sources")
23
+ assert_count(@image_migration_wf.sinks, 0, "@image_migration_wf.sinks")
24
+ assert_count(@image_migration_wf.datalinks, 2, "@image_migration_wf.datalinks")
25
+ assert_count(@image_migration_wf.coordinations, 0, "@image_migration_wf.coordinations")
26
+ end
27
+
28
+ def test_semantic_annotations
29
+ assert_not_nil(@image_migration_wf.sources[0].semantic_annotation)
30
+ assert_equal(@image_migration_wf.sources[0], @image_migration_wf.sources[0].semantic_annotation.subject)
31
+ assert_equal("text/rdf+n3", @image_migration_wf.sources[0].semantic_annotation.type)
32
+ assert_equal("[]<http://scape-project.eu/pc/vocab/profiles#hasPortType><http://scape-project.eu/pc/vocab/profiles#FromURIPort>.",
33
+ @image_migration_wf.sources[0].semantic_annotation.content.gsub(/\s+/, ""),
34
+ "@image_migration_wf.sources[0].semantic_annotation")
35
+
36
+ assert_not_nil(@image_migration_wf.sources[1].semantic_annotation)
37
+ assert_equal(@image_migration_wf.sources[1], @image_migration_wf.sources[1].semantic_annotation.subject)
38
+ assert_equal("text/rdf+n3", @image_migration_wf.sources[1].semantic_annotation.type)
39
+ assert_equal("[]<http://scape-project.eu/pc/vocab/profiles#hasPortType><http://scape-project.eu/pc/vocab/profiles#ToURIPort>.",
40
+ @image_migration_wf.sources[1].semantic_annotation.content.gsub(/\s+/, ""),
41
+ "@image_migration_wf.sources[1].semantic_annotation")
42
+
43
+ assert_not_nil(@image_migration_wf.processors[0].semantic_annotation)
44
+ assert_equal(@image_migration_wf.processors[0], @image_migration_wf.processors[0].semantic_annotation.subject)
45
+ assert_equal("text/rdf+n3", @image_migration_wf.processors[0].semantic_annotation.type)
46
+ assert_equal("[]<http://scape-project.eu/pc/vocab/profiles#hasDependency><http://scape-project.eu/pc/vocab/profiles#imagemagick-image2tiff>.",
47
+ @image_migration_wf.processors[0].semantic_annotation.content.gsub(/\s+/, ""),
48
+ "@image_migration_wf.processors[0].semantic_annotation")
49
+ end
50
+ end
metadata CHANGED
@@ -1,94 +1,103 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: taverna-t2flow
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
13
+ - Finn Bacall
8
14
  - Robert Haines
9
15
  - David Withers
10
16
  - Mannie Tagarira
11
17
  autorequire:
12
18
  bindir: bin
13
19
  cert_chain: []
14
- date: 2012-05-02 00:00:00.000000000 Z
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: rake
18
- requirement: !ruby/object:Gem::Requirement
20
+
21
+ date: 2012-12-03 00:00:00 Z
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
19
26
  none: false
20
- requirements:
27
+ requirements:
21
28
  - - ~>
22
- - !ruby/object:Gem::Version
29
+ - !ruby/object:Gem::Version
30
+ hash: 63
31
+ segments:
32
+ - 0
33
+ - 9
34
+ - 2
23
35
  version: 0.9.2
24
36
  type: :development
37
+ name: rake
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
25
40
  prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
- requirements:
29
- - - ~>
30
- - !ruby/object:Gem::Version
31
- version: 0.9.2
32
- - !ruby/object:Gem::Dependency
33
- name: rdoc
34
- requirement: !ruby/object:Gem::Requirement
41
+ requirement: &id002 !ruby/object:Gem::Requirement
35
42
  none: false
36
- requirements:
37
- - - ! '>='
38
- - !ruby/object:Gem::Version
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 43
47
+ segments:
48
+ - 3
49
+ - 9
50
+ - 4
39
51
  version: 3.9.4
40
52
  type: :development
53
+ name: rdoc
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
41
56
  prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
- requirements:
45
- - - ! '>='
46
- - !ruby/object:Gem::Version
47
- version: 3.9.4
48
- - !ruby/object:Gem::Dependency
49
- name: jeweler
50
- requirement: !ruby/object:Gem::Requirement
57
+ requirement: &id003 !ruby/object:Gem::Requirement
51
58
  none: false
52
- requirements:
59
+ requirements:
53
60
  - - ~>
54
- - !ruby/object:Gem::Version
61
+ - !ruby/object:Gem::Version
62
+ hash: 49
63
+ segments:
64
+ - 1
65
+ - 8
66
+ - 3
55
67
  version: 1.8.3
56
68
  type: :development
69
+ name: jeweler
70
+ version_requirements: *id003
71
+ - !ruby/object:Gem::Dependency
57
72
  prerelease: false
58
- version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
- requirements:
61
- - - ~>
62
- - !ruby/object:Gem::Version
63
- version: 1.8.3
64
- - !ruby/object:Gem::Dependency
65
- name: libxml-ruby
66
- requirement: !ruby/object:Gem::Requirement
73
+ requirement: &id004 !ruby/object:Gem::Requirement
67
74
  none: false
68
- requirements:
69
- - - ! '>='
70
- - !ruby/object:Gem::Version
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 27
79
+ segments:
80
+ - 1
81
+ - 1
82
+ - 4
71
83
  version: 1.1.4
72
84
  type: :runtime
73
- prerelease: false
74
- version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ! '>='
78
- - !ruby/object:Gem::Version
79
- version: 1.1.4
80
- description: This a gem developed by myGrid for the purpose of interacting with Taverna
81
- 2 workflows. An example use would be the image genaration for the model representing
82
- Taverna 2 workflows as used in myExperiment.
83
- email:
85
+ name: libxml-ruby
86
+ version_requirements: *id004
87
+ description: This a gem developed by myGrid for the purpose of interacting with Taverna 2 workflows. An example use would be the image genaration for the model representing Taverna 2 workflows as used in myExperiment.
88
+ email:
89
+ - finn.bacall@cs.man.ac.uk
84
90
  - rhaines@manchester.ac.uk
85
91
  executables: []
92
+
86
93
  extensions: []
87
- extra_rdoc_files:
94
+
95
+ extra_rdoc_files:
88
96
  - CHANGES.rdoc
89
97
  - LICENCE
90
98
  - README.rdoc
91
- files:
99
+ files:
100
+ - .rvmrc
92
101
  - CHANGES.rdoc
93
102
  - LICENCE
94
103
  - README.rdoc
@@ -108,39 +117,49 @@ files:
108
117
  - test/fixtures/999.t2flow
109
118
  - test/fixtures/basic.t2flow
110
119
  - test/fixtures/coordinated.t2flow
120
+ - test/fixtures/image_to_tiff_migration_action.t2flow
111
121
  - test/fixtures/linked.t2flow
112
122
  - test/fixtures/nested.t2flow
113
123
  - test/fixtures/processors.t2flow
114
124
  - test/run_tests.rb
115
125
  - test/test_bogus_workflows.rb
126
+ - test/test_component_workflows.rb
116
127
  - test/test_helper.rb
117
128
  - test/test_starter_pack_workflows.rb
118
129
  homepage: http://www.taverna.org.uk/
119
130
  licenses: []
131
+
120
132
  post_install_message:
121
- rdoc_options:
133
+ rdoc_options:
122
134
  - -N
123
135
  - --tab-width=2
124
136
  - --main=README.rdoc
125
- require_paths:
137
+ require_paths:
126
138
  - lib
127
- required_ruby_version: !ruby/object:Gem::Requirement
139
+ required_ruby_version: !ruby/object:Gem::Requirement
128
140
  none: false
129
- requirements:
130
- - - ! '>='
131
- - !ruby/object:Gem::Version
132
- version: '0'
133
- required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ hash: 3
145
+ segments:
146
+ - 0
147
+ version: "0"
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
149
  none: false
135
- requirements:
136
- - - ! '>='
137
- - !ruby/object:Gem::Version
138
- version: '0'
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ hash: 3
154
+ segments:
155
+ - 0
156
+ version: "0"
139
157
  requirements: []
158
+
140
159
  rubyforge_project:
141
- rubygems_version: 1.8.21
160
+ rubygems_version: 1.8.24
142
161
  signing_key:
143
162
  specification_version: 3
144
163
  summary: Support for interacting with Taverna 2 workflows.
145
- test_files:
164
+ test_files:
146
165
  - test/run_tests.rb