myexperiment-rest 0.2.8 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +13 -0
- data/README +3 -3
- data/Rakefile +4 -9
- data/bin/get_workflow_data.rb +27 -9
- data/doc/rdoc/CHANGES.html +30 -4
- data/doc/rdoc/LICENSE.html +8 -4
- data/doc/rdoc/MyExperimentREST.html +101 -10
- data/doc/rdoc/MyExperimentREST/{TavernaIOData.html → MyExperimentIOData.html} +76 -14
- data/doc/rdoc/MyExperimentREST/{TavernaUser.html → MyExperimentUser.html} +122 -22
- data/doc/rdoc/MyExperimentREST/{TavernaWorkflow.html → MyExperimentWorkflow.html} +87 -62
- data/doc/rdoc/MyExperimentREST/Urls.html +168 -0
- data/doc/rdoc/MyExperimentREST/User.html +260 -0
- data/doc/rdoc/MyExperimentREST/{Workflows.html → Workflow.html} +72 -61
- data/doc/rdoc/README.html +12 -7
- data/doc/rdoc/created.rid +7 -5
- data/doc/rdoc/index.html +30 -11
- data/doc/rdoc/lib/myexperiment-rest/constants_rb.html +52 -0
- data/doc/rdoc/lib/myexperiment-rest/{myexperiment_rest_rb.html → user_rb.html} +2 -8
- data/doc/rdoc/lib/myexperiment-rest/workflow_rb.html +54 -0
- data/doc/rdoc/lib/myexperiment-rest_rb.html +10 -2
- data/lib/myexperiment-rest.rb +42 -1
- data/lib/myexperiment-rest/constants.rb +11 -0
- data/lib/myexperiment-rest/user.rb +83 -0
- data/lib/myexperiment-rest/workflow.rb +145 -0
- metadata +21 -15
- data/lib/myexperiment-rest/myexperiment_rest.rb +0 -190
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'libxml'
|
2
|
+
|
3
|
+
module MyExperimentREST
|
4
|
+
|
5
|
+
#
|
6
|
+
# Connects to myExperiment REST API and creates a _MyExperimentWorkflow_ object.
|
7
|
+
#
|
8
|
+
class Workflow
|
9
|
+
|
10
|
+
# Returns a _MyExperimentWorkflow_ object given a URI of the workflow in the repository as a String.
|
11
|
+
def self.from_uri(uri)
|
12
|
+
|
13
|
+
workflow_id = ''
|
14
|
+
workflow_version = ''
|
15
|
+
|
16
|
+
# Get workflow id - will match both workflow/74 and workflows.xml?id=74
|
17
|
+
uri_id = uri.match(/workflow.*[\/?](id=)?(\d+)/)
|
18
|
+
if uri_id != nil
|
19
|
+
workflow_id = uri_id[2]
|
20
|
+
else
|
21
|
+
raise "Could not match workflow id."
|
22
|
+
end
|
23
|
+
|
24
|
+
# Get workflow version if it exists
|
25
|
+
uri_version = uri.match(/version=(\d+)/)
|
26
|
+
if uri_version != nil
|
27
|
+
workflow_version = uri_version[1]
|
28
|
+
end
|
29
|
+
|
30
|
+
# Get workflow resource information
|
31
|
+
xml = MyExperimentREST.get_myexperiment_data(Urls::WORKFLOW_URL, :id => workflow_id, :version => workflow_version)
|
32
|
+
|
33
|
+
MyExperimentWorkflow.parse(xml)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Returns a _MyExperimentWorkflow_ object given a myExperiment id and version for that workflow.
|
38
|
+
def self.from_id_and_version(id, version='')
|
39
|
+
|
40
|
+
# Get workflow resource information
|
41
|
+
xml = MyExperimentREST.get_myexperiment_data(Urls::WORKFLOW_URL, :id => id, :version => version)
|
42
|
+
|
43
|
+
MyExperimentWorkflow.parse(xml)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
end # class Workflow
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
#
|
52
|
+
# Contains all available information about a workflow: _xml_uri_,
|
53
|
+
# _title_, _description_,_inputs_, _outputs_ and _uploader_uri_. The _xml_uri_
|
54
|
+
# specifies the XML description on myExperiment and not the XML of the workflow
|
55
|
+
# itself.
|
56
|
+
#
|
57
|
+
class MyExperimentWorkflow
|
58
|
+
|
59
|
+
attr_reader(:xml_uri, :title, :description, :inputs, :outputs, :uploader_uri)
|
60
|
+
|
61
|
+
def initialize(attributes)
|
62
|
+
@xml_uri = attributes[:xml_uri]
|
63
|
+
@title = attributes[:title]
|
64
|
+
@description = attributes[:description]
|
65
|
+
@inputs = attributes[:inputs]
|
66
|
+
@outputs = attributes[:outputs]
|
67
|
+
@uploader_uri = attributes[:uploader_uri]
|
68
|
+
end
|
69
|
+
|
70
|
+
# Parse workflow information XML and instantiate a _MyExperimentWorkflow_ object
|
71
|
+
def self.parse(xml)
|
72
|
+
|
73
|
+
wkf_inputs = []
|
74
|
+
wkf_outputs = []
|
75
|
+
|
76
|
+
doc = LibXML::XML::Document.string(xml)
|
77
|
+
|
78
|
+
doc.find("//workflow/components/dataflows/dataflow[@role='top']/sources/source").each do |element|
|
79
|
+
wkf_inputs << MyExperimentIOData.from_xml(element)
|
80
|
+
end
|
81
|
+
|
82
|
+
doc.find("//workflow/components/dataflows/dataflow[@role='top']/sinks/sink").each do |element|
|
83
|
+
wkf_outputs << MyExperimentIOData.from_xml(element)
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
new(:xml_uri => doc.find_first("/workflow/content-uri").content,
|
88
|
+
:title => doc.find_first("/workflow/title").content,
|
89
|
+
:description => doc.find_first("/workflow/description").content,
|
90
|
+
:inputs => wkf_inputs,
|
91
|
+
:outputs => wkf_outputs,
|
92
|
+
:uploader_uri => doc.find_first("/workflow/uploader").attributes['uri'])
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
#
|
100
|
+
# Contains all available information about an input or output: name, descriptions
|
101
|
+
# and examples. The last two are lists.
|
102
|
+
#--
|
103
|
+
# Currently both inputs and outputs contain the same information. If that
|
104
|
+
# changes we can subclass this one.
|
105
|
+
#
|
106
|
+
class MyExperimentIOData
|
107
|
+
attr_reader(:name, :descriptions, :examples)
|
108
|
+
|
109
|
+
def initialize(attributes)
|
110
|
+
@name = attributes[:name]
|
111
|
+
@descriptions = attributes[:descriptions]
|
112
|
+
@examples = attributes[:examples]
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.from_xml(xml_node)
|
116
|
+
name = ''
|
117
|
+
descriptions = []
|
118
|
+
examples = []
|
119
|
+
|
120
|
+
xml_node.each_element do |n|
|
121
|
+
if n.name.eql? "name"
|
122
|
+
name = n.children[0].to_s
|
123
|
+
elsif n.name.eql? "descriptions"
|
124
|
+
n.each_element do |d|
|
125
|
+
descriptions << d.children[0].to_s
|
126
|
+
end if n.children?
|
127
|
+
elsif n.name.eql? "examples"
|
128
|
+
n.each_element do |e|
|
129
|
+
examples << e.children[0].to_s
|
130
|
+
end if n.children?
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
new(
|
136
|
+
:name => name,
|
137
|
+
:descriptions => descriptions,
|
138
|
+
:examples => examples)
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
end # class MyExperimentIOData
|
143
|
+
|
144
|
+
end # module
|
145
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: myexperiment-rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Konstantinos Karasavvas
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-28 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rest-client
|
@@ -41,12 +41,12 @@ dependencies:
|
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
hash:
|
44
|
+
hash: 29
|
45
45
|
segments:
|
46
46
|
- 2
|
47
47
|
- 0
|
48
|
-
-
|
49
|
-
version: 2.0.
|
48
|
+
- 9
|
49
|
+
version: 2.0.9
|
50
50
|
type: :runtime
|
51
51
|
version_requirements: *id002
|
52
52
|
description: This is a simple library to access data on myExperiment via its REST API. Currently supports a subset of the workflow information available.
|
@@ -66,7 +66,9 @@ files:
|
|
66
66
|
- Rakefile
|
67
67
|
- bin/get_workflow_data.rb
|
68
68
|
- lib/myexperiment-rest.rb
|
69
|
-
- lib/myexperiment-rest/
|
69
|
+
- lib/myexperiment-rest/workflow.rb
|
70
|
+
- lib/myexperiment-rest/user.rb
|
71
|
+
- lib/myexperiment-rest/constants.rb
|
70
72
|
- doc/rdoc/rdoc.css
|
71
73
|
- doc/rdoc/LICENSE.html
|
72
74
|
- doc/rdoc/index.html
|
@@ -76,7 +78,9 @@ files:
|
|
76
78
|
- doc/rdoc/js/quicksearch.js
|
77
79
|
- doc/rdoc/MyExperimentREST.html
|
78
80
|
- doc/rdoc/README.html
|
79
|
-
- doc/rdoc/lib/myexperiment-rest/
|
81
|
+
- doc/rdoc/lib/myexperiment-rest/constants_rb.html
|
82
|
+
- doc/rdoc/lib/myexperiment-rest/user_rb.html
|
83
|
+
- doc/rdoc/lib/myexperiment-rest/workflow_rb.html
|
80
84
|
- doc/rdoc/lib/myexperiment-rest_rb.html
|
81
85
|
- doc/rdoc/created.rid
|
82
86
|
- doc/rdoc/CHANGES.html
|
@@ -100,10 +104,12 @@ files:
|
|
100
104
|
- doc/rdoc/images/page_white_width.png
|
101
105
|
- doc/rdoc/images/package.png
|
102
106
|
- doc/rdoc/images/plugin.png
|
103
|
-
- doc/rdoc/MyExperimentREST/
|
104
|
-
- doc/rdoc/MyExperimentREST/
|
105
|
-
- doc/rdoc/MyExperimentREST/
|
106
|
-
- doc/rdoc/MyExperimentREST/
|
107
|
+
- doc/rdoc/MyExperimentREST/User.html
|
108
|
+
- doc/rdoc/MyExperimentREST/Urls.html
|
109
|
+
- doc/rdoc/MyExperimentREST/MyExperimentWorkflow.html
|
110
|
+
- doc/rdoc/MyExperimentREST/MyExperimentUser.html
|
111
|
+
- doc/rdoc/MyExperimentREST/MyExperimentIOData.html
|
112
|
+
- doc/rdoc/MyExperimentREST/Workflow.html
|
107
113
|
homepage:
|
108
114
|
licenses: []
|
109
115
|
|
@@ -136,6 +142,6 @@ rubyforge_project:
|
|
136
142
|
rubygems_version: 1.7.2
|
137
143
|
signing_key:
|
138
144
|
specification_version: 3
|
139
|
-
summary: This is a simple library to access data on myExperiment via its REST API.
|
145
|
+
summary: This is a simple library to access data on myExperiment via its REST API.
|
140
146
|
test_files: []
|
141
147
|
|
@@ -1,190 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rest_client'
|
3
|
-
require 'open-uri'
|
4
|
-
require 'libxml'
|
5
|
-
|
6
|
-
module MyExperimentREST
|
7
|
-
|
8
|
-
#
|
9
|
-
# Connects to myExperiment REST API and creates a _TavernaWorkflow_ object.
|
10
|
-
#
|
11
|
-
class Workflows
|
12
|
-
include LibXML
|
13
|
-
|
14
|
-
attr_reader(:uri)
|
15
|
-
|
16
|
-
#def initialize
|
17
|
-
#end
|
18
|
-
|
19
|
-
# Requires the URI of the workflow in the repository as a String.
|
20
|
-
def read(uri)
|
21
|
-
|
22
|
-
workflow_id = ''
|
23
|
-
workflow_version = ''
|
24
|
-
|
25
|
-
# Get workflow id
|
26
|
-
uri_id = uri.match(/workflows\/(\d+)/)
|
27
|
-
if uri_id != nil
|
28
|
-
workflow_id = uri_id[1]
|
29
|
-
else
|
30
|
-
raise "Could not match workflow id."
|
31
|
-
end
|
32
|
-
|
33
|
-
# Get workflow version if it exists
|
34
|
-
uri_version = uri.match(/version=(\d+)/)
|
35
|
-
if uri_version != nil
|
36
|
-
workflow_version = uri_version[1]
|
37
|
-
end
|
38
|
-
|
39
|
-
# Get workflow resource information -- if version is empty it returns the current version
|
40
|
-
response = RestClient.get('http://www.myexperiment.org/workflow.xml', {:params => {'id' => "#{workflow_id}",
|
41
|
-
'version' => "#{workflow_version}",
|
42
|
-
'elements' => 'title,description,content-uri,components,uploader'} } )
|
43
|
-
|
44
|
-
populate_workflow(response)
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
# Acquire data from XML response and instantiate a _Taverna_Workflow_ object
|
51
|
-
#--
|
52
|
-
# TODO: refactor so that each (logical) workflow element is an object with
|
53
|
-
# its own read from_xml method...
|
54
|
-
def populate_workflow(response)
|
55
|
-
doc = XML::Document.string(response)
|
56
|
-
wkf_xml_uri = doc.find_first("/workflow/content-uri").content
|
57
|
-
wkf_title = doc.find_first("/workflow/title").content
|
58
|
-
wkf_descr = doc.find_first("/workflow/description").content
|
59
|
-
wkf_inputs = get_IOData(doc, "source")
|
60
|
-
wkf_outputs = get_IOData(doc, "sink")
|
61
|
-
wkf_user = get_user(doc.find_first("/workflow/uploader").attributes['uri'])
|
62
|
-
|
63
|
-
TavernaWorkflow.new(TavernaWorkflow::MY_EXPERIMENT, wkf_xml_uri, wkf_title, wkf_descr, wkf_inputs, wkf_outputs, wkf_user)
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
#
|
69
|
-
# Populate _TavernaIOData_ objects for specified type: value +source+'+ is for inputs
|
70
|
-
# and +sink+ for outputs
|
71
|
-
#
|
72
|
-
def get_IOData(doc, type)
|
73
|
-
io_data = []
|
74
|
-
|
75
|
-
# Get all sources or sinks and create appropriate objects
|
76
|
-
doc.find("//workflow/components/dataflows/dataflow[@role='top']/#{type}s/#{type}").each do |node|
|
77
|
-
name = ''
|
78
|
-
descriptions = []
|
79
|
-
examples = []
|
80
|
-
|
81
|
-
node.each_element do |n|
|
82
|
-
if n.name.eql? "name"
|
83
|
-
name = n.children[0].to_s
|
84
|
-
elsif n.name.eql? "descriptions"
|
85
|
-
n.each_element do |d|
|
86
|
-
descriptions << d.children[0].to_s
|
87
|
-
end if n.children?
|
88
|
-
elsif n.name.eql? "examples"
|
89
|
-
n.each_element do |e|
|
90
|
-
examples << e.children[0].to_s
|
91
|
-
end if n.children?
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
io_data << TavernaIOData.new(name, descriptions, examples)
|
96
|
-
end
|
97
|
-
|
98
|
-
io_data
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
#
|
103
|
-
# Populate _TavernaUser_ object for specified user resource
|
104
|
-
#
|
105
|
-
def get_user(user_uri)
|
106
|
-
doc = XML::Document.file(user_uri)
|
107
|
-
user = TavernaUser.new(doc.find_first("/user/name").content,
|
108
|
-
doc.find_first("/user/description").content,
|
109
|
-
doc.find_first("/user/email").content,
|
110
|
-
doc.find_first("/user/avatar").attributes['uri'],
|
111
|
-
doc.find_first("/user/website").content,
|
112
|
-
doc.find_first("/user/created-at").content)
|
113
|
-
user
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
#
|
123
|
-
# Contains all available information about a workflow: _input_type_, _xml_uri_,
|
124
|
-
# _title_, _description_,_inputs_, _outputs_ and _user_. The _xml_uri_ specifies
|
125
|
-
# the XML description on myExperiment and not the XML of the workflow itself.
|
126
|
-
# _input_type_ specifies the kind of input. Currently, either "myexperiment"
|
127
|
-
# (myExperiment's xml uri) or "t2flow" (filename)
|
128
|
-
#
|
129
|
-
class TavernaWorkflow
|
130
|
-
|
131
|
-
# possible input types
|
132
|
-
MY_EXPERIMENT = 'myexperiment'
|
133
|
-
T2_FLOW = 't2flow'
|
134
|
-
|
135
|
-
attr_reader(:input_type, :xml_uri, :title, :description, :inputs, :outputs, :user)
|
136
|
-
|
137
|
-
def initialize(input_type, xml_uri, title, description, inputs, outputs, user)
|
138
|
-
@input_type = input_type
|
139
|
-
@xml_uri = xml_uri
|
140
|
-
@title = title
|
141
|
-
@description = description
|
142
|
-
@inputs = inputs
|
143
|
-
@outputs = outputs
|
144
|
-
@user = user
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
|
150
|
-
#
|
151
|
-
# Contains all available information about an input or output: name, descriptions
|
152
|
-
# and examples. The last two are lists.
|
153
|
-
#--
|
154
|
-
# Currently both inputs and outputs contain the same information. If that
|
155
|
-
# changes we can subclass this one.
|
156
|
-
#
|
157
|
-
class TavernaIOData
|
158
|
-
attr_reader(:name, :descriptions, :examples)
|
159
|
-
|
160
|
-
def initialize(name, descriptions, examples)
|
161
|
-
@name = name
|
162
|
-
@descriptions = descriptions
|
163
|
-
@examples = examples
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
#
|
170
|
-
# Contains all available information about an input or output: name, descriptions
|
171
|
-
# and examples. The last two are lists.
|
172
|
-
#
|
173
|
-
class TavernaUser
|
174
|
-
attr_reader(:name, :description, :email, :avatar, :website, :created_at)
|
175
|
-
|
176
|
-
def initialize(name, description, email, avatar, website, created_at)
|
177
|
-
@name = name
|
178
|
-
@description = description
|
179
|
-
@email = email
|
180
|
-
@avatar = avatar
|
181
|
-
@website = website
|
182
|
-
@created_at = created_at
|
183
|
-
end
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
end
|
190
|
-
|