taverna-t2flow 0.3.0 → 0.4.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.
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