opentox-ruby-api-wrapper 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/opentox-install-ubuntu.sh +2 -2
- data/bin/yaml2owl.rb +1 -1
- data/lib/algorithm.rb +4 -1
- data/lib/compound.rb +4 -4
- data/lib/config/config_ru.rb +8 -0
- data/lib/dataset.rb +162 -158
- data/lib/environment.rb +77 -6
- data/lib/features.rb +15 -0
- data/lib/model.rb +88 -103
- data/lib/opentox-ruby-api-wrapper.rb +1 -1
- data/lib/owl.rb +386 -149
- data/lib/rest_client_wrapper.rb +170 -0
- data/lib/spork.rb +2 -0
- data/lib/task.rb +148 -75
- data/lib/templates/config.yaml +53 -5
- data/lib/utils.rb +34 -2
- data/lib/validation.rb +10 -2
- metadata +97 -62
@@ -0,0 +1,170 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module OpenTox
|
4
|
+
|
5
|
+
#PENDING: implement ot error api, move to own file
|
6
|
+
class Error
|
7
|
+
|
8
|
+
attr_accessor :code, :body, :uri, :payload, :headers
|
9
|
+
|
10
|
+
def initialize(code, body, uri, payload, headers)
|
11
|
+
self.code = code
|
12
|
+
self.body = body
|
13
|
+
self.uri = uri
|
14
|
+
self.payload = payload
|
15
|
+
self.headers = headers
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parse(error_array_string)
|
19
|
+
begin
|
20
|
+
err = YAML.load(error_array_string)
|
21
|
+
if err and err.is_a?(Array) and err.size>0 and err[0].is_a?(Error)
|
22
|
+
return err
|
23
|
+
else
|
24
|
+
return nil
|
25
|
+
end
|
26
|
+
rescue
|
27
|
+
return nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class WrapperResult < String
|
34
|
+
attr_accessor :content_type, :code
|
35
|
+
end
|
36
|
+
|
37
|
+
class RestClientWrapper
|
38
|
+
|
39
|
+
def self.get(uri, headers=nil, wait=true)
|
40
|
+
execute( "get", uri, headers, nil, wait)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.post(uri, headers, payload=nil, wait=true)
|
44
|
+
execute( "post", uri, headers, payload, wait )
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.put(uri, headers, payload=nil )
|
48
|
+
execute( "put", uri, headers, payload )
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.delete(uri, headers=nil)
|
52
|
+
execute( "delete", uri, headers, nil)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.raise_uri_error(error_msg, uri, headers=nil, payload=nil)
|
56
|
+
do_halt( "-", error_msg, uri, headers, payload )
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def self.execute( rest_call, uri, headers, payload=nil, wait=true )
|
61
|
+
|
62
|
+
do_halt 400,"uri is null",uri,headers,payload unless uri
|
63
|
+
do_halt 400,"not a uri",uri,headers,payload unless Utils.is_uri?(uri)
|
64
|
+
do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash)
|
65
|
+
do_halt 400,"nil headers for post not allowed, use {}",uri,headers,payload if rest_call=="post" and headers==nil
|
66
|
+
headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems
|
67
|
+
|
68
|
+
begin
|
69
|
+
#LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect
|
70
|
+
resource = RestClient::Resource.new(uri,{:timeout => 60}) #, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]})
|
71
|
+
if payload
|
72
|
+
result = resource.send(rest_call, payload, headers)
|
73
|
+
elsif headers
|
74
|
+
result = resource.send(rest_call, headers)
|
75
|
+
else
|
76
|
+
result = resource.send(rest_call)
|
77
|
+
end
|
78
|
+
|
79
|
+
# result is a string, with the additional fields content_type and code
|
80
|
+
res = WrapperResult.new(result.body)
|
81
|
+
res.content_type = result.headers[:content_type]
|
82
|
+
raise "content-type not set" unless res.content_type
|
83
|
+
res.code = result.code
|
84
|
+
|
85
|
+
return res if res.code==200 || !wait
|
86
|
+
|
87
|
+
while (res.code==201 || res.code==202)
|
88
|
+
res = wait_for_task(res, uri)
|
89
|
+
end
|
90
|
+
raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200
|
91
|
+
return res
|
92
|
+
|
93
|
+
rescue RestClient::RequestFailed => ex
|
94
|
+
do_halt ex.http_code,ex.http_body,uri,headers,payload
|
95
|
+
rescue RestClient::RequestTimeout => ex
|
96
|
+
do_halt 408,ex.message,uri,headers,payload
|
97
|
+
rescue => ex
|
98
|
+
#raise ex
|
99
|
+
#raise "'"+ex.message+"' uri: "+uri.to_s
|
100
|
+
begin
|
101
|
+
code = ex.http_code
|
102
|
+
msg = ex.http_body
|
103
|
+
rescue
|
104
|
+
code = 500
|
105
|
+
msg = ex.to_s
|
106
|
+
end
|
107
|
+
do_halt code,msg,uri,headers,payload
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.wait_for_task( res, base_uri )
|
112
|
+
|
113
|
+
task = nil
|
114
|
+
case res.content_type
|
115
|
+
when /application\/rdf\+xml|text\/x-yaml/
|
116
|
+
task = OpenTox::Task.from_data(res, res.content_type, res.code, base_uri)
|
117
|
+
when /text\//
|
118
|
+
raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and
|
119
|
+
res.split("\n").size > 1 #if uri list contains more then one uri, its not a task
|
120
|
+
task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res)
|
121
|
+
else
|
122
|
+
raise "unknown content-type for task: '"+res.content_type.to_s+"'" #+"' content: "+res[0..200].to_s
|
123
|
+
end
|
124
|
+
|
125
|
+
LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion"
|
126
|
+
task.wait_for_completion
|
127
|
+
raise task.description unless task.completed? # maybe task was cancelled / error
|
128
|
+
|
129
|
+
res = WrapperResult.new task.resultURI
|
130
|
+
res.code = task.http_code
|
131
|
+
res.content_type = "text/uri-list"
|
132
|
+
return res
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.do_halt( code, body, uri, headers, payload=nil )
|
136
|
+
|
137
|
+
#build error
|
138
|
+
causing_errors = Error.parse(body)
|
139
|
+
if causing_errors
|
140
|
+
error = causing_errors + [Error.new(code, "subsequent error", uri, payload, headers)]
|
141
|
+
else
|
142
|
+
error = [Error.new(code, body, uri, payload, headers)]
|
143
|
+
end
|
144
|
+
|
145
|
+
# #debug utility: write error to file
|
146
|
+
# error_dir = "/tmp/ot_errors"
|
147
|
+
# FileUtils.mkdir(error_dir) unless File.exist?(error_dir)
|
148
|
+
# raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir)
|
149
|
+
# file_name = "error"
|
150
|
+
# time=Time.now.strftime("%m.%d.%Y-%H:%M:%S")
|
151
|
+
# count = 1
|
152
|
+
# count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s))
|
153
|
+
# File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body)
|
154
|
+
|
155
|
+
# handle error
|
156
|
+
# we are either in a task, or in sinatra
|
157
|
+
# PENDING: always return yaml for now
|
158
|
+
|
159
|
+
if $self_task #this global var in Task.as_task to mark that the current process is running in a task
|
160
|
+
raise error.to_yaml # the error is caught, logged, and task state is set to error in Task.as_task
|
161
|
+
#elsif $sinatra #else halt sinatra
|
162
|
+
#$sinatra.halt(502,error.to_yaml)
|
163
|
+
elsif defined?(halt)
|
164
|
+
halt(502,error.to_yaml)
|
165
|
+
else #for testing purposes (if classes used directly)
|
166
|
+
raise error.to_yaml
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
data/lib/spork.rb
CHANGED
@@ -37,6 +37,7 @@ module Spork
|
|
37
37
|
def self.spork(options={})
|
38
38
|
logger = options[:logger]
|
39
39
|
logger.debug "spork> parent PID = #{Process.pid}" if logger
|
40
|
+
|
40
41
|
child = fork do
|
41
42
|
begin
|
42
43
|
start = Time.now
|
@@ -52,6 +53,7 @@ module Spork
|
|
52
53
|
yield
|
53
54
|
|
54
55
|
rescue => ex
|
56
|
+
#raise ex
|
55
57
|
logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger
|
56
58
|
ensure
|
57
59
|
logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger
|
data/lib/task.rb
CHANGED
@@ -1,97 +1,170 @@
|
|
1
1
|
LOGGER.progname = File.expand_path(__FILE__)
|
2
2
|
|
3
|
+
$self_task=nil
|
4
|
+
|
3
5
|
module OpenTox
|
4
6
|
|
5
7
|
class Task
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
# due_to_time is only set in local tasks
|
10
|
+
TASK_ATTRIBS = [ :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ]
|
11
|
+
TASK_ATTRIBS.each{ |a| attr_accessor(a) }
|
12
|
+
attr_accessor :http_code
|
13
|
+
|
14
|
+
private
|
15
|
+
def initialize(uri)
|
16
|
+
@uri = uri.to_s.strip
|
17
|
+
end
|
18
|
+
|
19
|
+
# create is private now, use OpenTox::Task.as_task
|
20
|
+
def self.create(max_duration)
|
21
|
+
task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s
|
22
|
+
Task.find(task_uri.chomp)
|
23
|
+
end
|
24
|
+
|
25
|
+
public
|
19
26
|
def self.find(uri)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
27
|
+
task = Task.new(uri)
|
28
|
+
task.reload
|
29
|
+
return task
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.from_data(data, content_type, code, base_uri)
|
33
|
+
task = Task.new(nil)
|
34
|
+
task.http_code = code
|
35
|
+
task.reload_from_data(data, content_type, base_uri)
|
36
|
+
return task
|
37
|
+
end
|
38
|
+
|
39
|
+
def reload
|
40
|
+
result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false)#'application/x-yaml'})
|
41
|
+
@http_code = result.code
|
42
|
+
reload_from_data(result, result.content_type, uri)
|
43
|
+
end
|
44
|
+
|
45
|
+
def reload_from_data( data, content_type, base_uri )
|
46
|
+
case content_type
|
47
|
+
when /yaml/
|
48
|
+
task = YAML.load data
|
49
|
+
TASK_ATTRIBS.each do |a|
|
50
|
+
raise "task yaml data invalid, key missing: "+a.to_s unless task.has_key?(a)
|
51
|
+
send("#{a.to_s}=".to_sym,task[a])
|
52
|
+
end
|
53
|
+
when /application\/rdf\+xml/
|
54
|
+
owl = OpenTox::Owl.from_data(data,base_uri,"Task")
|
55
|
+
self.uri = owl.uri
|
56
|
+
(TASK_ATTRIBS-[:uri]).each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))}
|
57
|
+
else
|
58
|
+
raise "content type for tasks not supported: "+content_type.to_s
|
59
|
+
end
|
60
|
+
raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0
|
61
|
+
end
|
62
|
+
|
54
63
|
def cancel
|
55
|
-
|
56
|
-
|
64
|
+
RestClientWrapper.put(File.join(@uri,'Cancelled'))
|
65
|
+
reload
|
57
66
|
end
|
58
67
|
|
59
68
|
def completed(uri)
|
60
|
-
|
61
|
-
|
69
|
+
RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri})
|
70
|
+
reload
|
62
71
|
end
|
63
72
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
73
|
+
def error(description)
|
74
|
+
RestClientWrapper.put(File.join(@uri,'Error'),{:description => description})
|
75
|
+
reload
|
67
76
|
end
|
77
|
+
|
78
|
+
def pid=(pid)
|
79
|
+
RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid})
|
80
|
+
end
|
68
81
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
LOGGER.debug "task.rb: #{resource}"
|
73
|
-
resource.put :uri => task.uri
|
74
|
-
end
|
75
|
-
|
76
|
-
def pid=(pid)
|
77
|
-
resource = RestClient::Resource.new(File.join(@uri,'pid'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
|
78
|
-
resource.put :pid => pid
|
79
|
-
end
|
82
|
+
def running?
|
83
|
+
@hasStatus.to_s == 'Running'
|
84
|
+
end
|
80
85
|
|
81
86
|
def completed?
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
def
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
|
90
|
-
|
87
|
+
@hasStatus.to_s == 'Completed'
|
88
|
+
end
|
89
|
+
|
90
|
+
def error?
|
91
|
+
@hasStatus.to_s == 'Error'
|
92
|
+
end
|
93
|
+
|
94
|
+
# waits for a task, unless time exceeds or state is no longer running
|
95
|
+
def wait_for_completion(dur=0.3)
|
96
|
+
|
97
|
+
if (@uri.match(@@config[:services]["opentox-task"]))
|
98
|
+
due_to_time = Time.parse(@due_to_time)
|
99
|
+
running_time = due_to_time - Time.parse(@date)
|
100
|
+
else
|
101
|
+
# the date of the external task cannot be trusted, offest to local time might be to big
|
102
|
+
due_to_time = Time.new + EXTERNAL_TASK_MAX_DURATION
|
103
|
+
running_time = EXTERNAL_TASK_MAX_DURATION
|
104
|
+
end
|
105
|
+
LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s
|
106
|
+
|
107
|
+
while self.running?
|
91
108
|
sleep dur
|
109
|
+
reload
|
110
|
+
check_state
|
111
|
+
if (Time.new > due_to_time)
|
112
|
+
raise "max wait time exceeded ("+running_time.to_s+"sec), task: '"+@uri.to_s+"'"
|
113
|
+
end
|
92
114
|
end
|
93
|
-
|
94
|
-
|
115
|
+
|
116
|
+
LOGGER.debug "task no longer running: "+@uri.to_s+", result: "+@resultURI.to_s
|
117
|
+
end
|
118
|
+
|
119
|
+
def check_state
|
120
|
+
begin
|
121
|
+
raise "illegal task state, task is completed, resultURI is no URI: '"+@resultURI.to_s+
|
122
|
+
"'" unless @resultURI and Utils.is_uri?(@resultURI) if completed?
|
123
|
+
|
124
|
+
if @http_code == 202
|
125
|
+
raise "illegal task state, code is 202, but hasStatus is not Running: '"+@hasStatus+"'" unless running?
|
126
|
+
elsif @http_code == 201
|
127
|
+
raise "illegal task state, code is 201, but hasStatus is not Completed: '"+@hasStatus+"'" unless completed?
|
128
|
+
raise "illegal task state, code is 201, resultURI is no task-URI: '"+@resultURI.to_s+
|
129
|
+
"'" unless @resultURI and Utils.task_uri?(@resultURI)
|
130
|
+
end
|
131
|
+
rescue => ex
|
132
|
+
RestClientWrapper.raise_uri_error(ex.message, @uri)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# returns the task uri
|
137
|
+
# catches halts and exceptions, task state is set to error then
|
138
|
+
def self.as_task(max_duration=DEFAULT_TASK_MAX_DURATION)
|
139
|
+
#return yield nil
|
140
|
+
|
141
|
+
task = OpenTox::Task.create(max_duration)
|
142
|
+
task_pid = Spork.spork(:logger => LOGGER) do
|
143
|
+
LOGGER.debug "Task #{task.uri} started #{Time.now}"
|
144
|
+
$self_task = task
|
145
|
+
|
146
|
+
begin
|
147
|
+
result = catch(:halt) do
|
148
|
+
yield task
|
149
|
+
end
|
150
|
+
# catching halt, set task state to error
|
151
|
+
if result && result.is_a?(Array) && result.size==2 && result[0]>202
|
152
|
+
LOGGER.error "task was halted: "+result.inspect
|
153
|
+
task.error(result[1])
|
154
|
+
return
|
155
|
+
end
|
156
|
+
LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s
|
157
|
+
task.completed(result)
|
158
|
+
rescue => ex
|
159
|
+
LOGGER.error "task failed: "+ex.message
|
160
|
+
LOGGER.error ": "+ex.backtrace.join("\n")
|
161
|
+
task.error(ex.message)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
task.pid = task_pid
|
165
|
+
LOGGER.debug "Started task: "+task.uri.to_s
|
166
|
+
task.uri
|
167
|
+
end
|
95
168
|
end
|
96
169
|
|
97
170
|
end
|
data/lib/templates/config.yaml
CHANGED
@@ -1,13 +1,25 @@
|
|
1
1
|
# Example configuration for OpenTox, please adjust to your settings
|
2
2
|
#
|
3
|
+
# Database setup:
|
4
|
+
#
|
5
|
+
# Example MySql:
|
6
|
+
#
|
7
|
+
# :database:
|
8
|
+
# :adapter: mysql
|
9
|
+
# :database: production
|
10
|
+
# :username: production
|
11
|
+
# :password: your_password
|
12
|
+
# :host: localhost
|
13
|
+
#
|
3
14
|
# Example 1: Using external test services
|
4
15
|
#
|
5
16
|
# :services:
|
6
|
-
# opentox-compound: "http://webservices.in-silico.ch/
|
7
|
-
# opentox-dataset: "http://webservices.in-silico.ch/
|
8
|
-
# opentox-algorithm: "http://webservices.in-silico.ch/
|
9
|
-
# opentox-model: "http://webservices.in-silico.ch/
|
10
|
-
# opentox-task:
|
17
|
+
# opentox-compound: "http://webservices.in-silico.ch/compound/"
|
18
|
+
# opentox-dataset: "http://webservices.in-silico.ch/dataset/"
|
19
|
+
# opentox-algorithm: "http://webservices.in-silico.ch/algorithm/"
|
20
|
+
# opentox-model: "http://webservices.in-silico.ch/model/"
|
21
|
+
# opentox-task: "http://webservices.in-silico.ch/task/"
|
22
|
+
# opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/"
|
11
23
|
#
|
12
24
|
# Example 2: Using local services
|
13
25
|
# :base_dir: /home/ch/webservices
|
@@ -18,3 +30,39 @@
|
|
18
30
|
# opentox-algorithm: "http://localhost:4002/"
|
19
31
|
# opentox-model: "http://localhost:4003/"
|
20
32
|
# opentox-task: "http://localhost:4004/"
|
33
|
+
# opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/"
|
34
|
+
#
|
35
|
+
# Accept headers:
|
36
|
+
#
|
37
|
+
# :accept_headers:
|
38
|
+
# opentox-compound:
|
39
|
+
# - "chemical/x-daylight-smiles"
|
40
|
+
# - "chemical/x-inchi"
|
41
|
+
# - "chemical/x-mdl-sdfile"
|
42
|
+
# - "image/gif"
|
43
|
+
# - "text/plain"
|
44
|
+
# opentox-dataset:
|
45
|
+
# - "application/x-yaml"
|
46
|
+
# - "text/x-yaml"
|
47
|
+
# - "application/rdf+xml"
|
48
|
+
# opentox-algorithm:
|
49
|
+
# - "application/x-yaml"
|
50
|
+
# - "text/x-yaml"
|
51
|
+
# - "application/rdf+xml"
|
52
|
+
# opentox-model:
|
53
|
+
# - "application/x-yaml"
|
54
|
+
# - "text/x-yaml"
|
55
|
+
# - "application/rdf+xml"
|
56
|
+
# opentox-task:
|
57
|
+
# - "application/x-yaml"
|
58
|
+
# - "text/x-yaml"
|
59
|
+
# - "application/rdf+xml"
|
60
|
+
# opentox-validation:
|
61
|
+
# - "application/x-yaml"
|
62
|
+
# - "text/x-yaml"
|
63
|
+
# - "application/rdf+xml"
|
64
|
+
|
65
|
+
# Timeouts:
|
66
|
+
#
|
67
|
+
# :default_task_max_duration: 3600
|
68
|
+
# :external_task_max_duration: 3600
|
data/lib/utils.rb
CHANGED
@@ -4,6 +4,38 @@ module OpenTox
|
|
4
4
|
def self.gauss(sim, sigma = 0.3)
|
5
5
|
x = 1.0 - sim
|
6
6
|
Math.exp(-(x*x)/(2*sigma*sigma))
|
7
|
-
|
8
|
-
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.task_uri?(uri)
|
10
|
+
is_uri?(uri) && uri.to_s =~ /task/
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.dataset_uri?(uri)
|
14
|
+
is_uri?(uri) && uri.to_s =~ /dataset/
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.model_uri?(uri)
|
18
|
+
is_uri?(uri) && uri.to_s =~ /model/
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def self.is_uri?(uri)
|
23
|
+
return false if uri==nil || uri.to_s.size==0
|
24
|
+
begin
|
25
|
+
u = URI::parse(uri)
|
26
|
+
return (u.scheme!=nil and u.host!=nil)
|
27
|
+
rescue URI::InvalidURIError
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# ['rubygems', 'rest_client'].each do |r|
|
34
|
+
# require r
|
35
|
+
# end
|
36
|
+
# ["bla", "google.de", "http://google.de"].each do |u|
|
37
|
+
# puts u+"? "+Utils.is_uri?(u).to_s
|
38
|
+
# end
|
39
|
+
|
9
40
|
end
|
41
|
+
|
data/lib/validation.rb
CHANGED
@@ -4,8 +4,16 @@ module OpenTox
|
|
4
4
|
attr_accessor :uri
|
5
5
|
|
6
6
|
def initialize(params)
|
7
|
-
resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
|
8
|
-
|
7
|
+
#resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
|
8
|
+
#@uri = resource.post(params).body
|
9
|
+
#LOGGER.debug "VALIDATION URI: " + @uri.to_s
|
10
|
+
call = "curl -X POST "
|
11
|
+
params.each do |k,v|
|
12
|
+
call += " -d "+k.to_s+"=\""+URI.encode(v.to_s)+"\"" unless k == :uri
|
13
|
+
end
|
14
|
+
call += " "+params[:uri]
|
15
|
+
LOGGER.debug call
|
16
|
+
@uri = `#{call}`
|
9
17
|
end
|
10
18
|
|
11
19
|
def self.crossvalidation(params)
|