opentox-ruby-api-wrapper 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +674 -0
- data/README.rdoc +23 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/lib/algorithm.rb +37 -0
- data/lib/compound.rb +67 -0
- data/lib/dataset.rb +94 -0
- data/lib/environment.rb +33 -0
- data/lib/feature.rb +48 -0
- data/lib/helper.rb +26 -0
- data/lib/model.rb +71 -0
- data/lib/opentox-ruby-api-wrapper.rb +13 -0
- data/lib/opentox.rb +27 -0
- data/lib/spork.rb +81 -0
- data/lib/task.rb +55 -0
- data/lib/tasks/opentox.rb +135 -0
- data/lib/tasks/redis.rb +125 -0
- data/lib/templates/config.ru +23 -0
- data/lib/templates/config.yaml +10 -0
- data/lib/utils.rb +9 -0
- metadata +84 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib|
|
2
|
+
require lib
|
3
|
+
end
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'openbabel'
|
7
|
+
rescue LoadError
|
8
|
+
puts "Please install Openbabel with 'rake openbabel:install' in the compound component"
|
9
|
+
end
|
10
|
+
|
11
|
+
['opentox', 'compound','feature','dataset','algorithm','model','task','utils'].each do |lib|
|
12
|
+
require lib
|
13
|
+
end
|
data/lib/opentox.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module OpenTox
|
2
|
+
|
3
|
+
class OpenTox
|
4
|
+
attr_accessor :uri
|
5
|
+
|
6
|
+
def initialize(uri)
|
7
|
+
@uri = uri
|
8
|
+
end
|
9
|
+
|
10
|
+
# Get the object name
|
11
|
+
def name
|
12
|
+
RestClient.get @uri + '/name'
|
13
|
+
end
|
14
|
+
|
15
|
+
# Deletes an object
|
16
|
+
def destroy
|
17
|
+
RestClient.delete @uri
|
18
|
+
end
|
19
|
+
|
20
|
+
# Object path without hostname
|
21
|
+
def path
|
22
|
+
URI.split(@uri)[5]
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/lib/spork.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# A way to cleanly handle process forking in Sinatra when using Passenger, aka "sporking some code".
|
2
|
+
# This will allow you to properly execute some code asynchronously, which otherwise does not work correctly.
|
3
|
+
#
|
4
|
+
# Written by Ron Evans
|
5
|
+
# More info at http://deadprogrammersociety.com
|
6
|
+
#
|
7
|
+
# Mostly lifted from the Spawn plugin for Rails (http://github.com/tra/spawn)
|
8
|
+
# but with all of the Rails stuff removed.... cause you are using Sinatra. If you are using Rails, Spawn is
|
9
|
+
# what you need. If you are using something else besides Sinatra that is Rack-based under Passenger, and you are having trouble with
|
10
|
+
# asynch processing, let me know if spork helped you.
|
11
|
+
#
|
12
|
+
module Spork
|
13
|
+
# things to close in child process
|
14
|
+
@@resources = []
|
15
|
+
def self.resources
|
16
|
+
@@resources
|
17
|
+
end
|
18
|
+
|
19
|
+
# set the resource to disconnect from in the child process (when forking)
|
20
|
+
def self.resource_to_close(resource)
|
21
|
+
@@resources << resource
|
22
|
+
end
|
23
|
+
|
24
|
+
# close all the resources added by calls to resource_to_close
|
25
|
+
def self.close_resources
|
26
|
+
@@resources.each do |resource|
|
27
|
+
resource.close if resource && resource.respond_to?(:close) && !resource.closed?
|
28
|
+
end
|
29
|
+
@@resources = []
|
30
|
+
end
|
31
|
+
|
32
|
+
# actually perform the fork... er, spork
|
33
|
+
# valid options are:
|
34
|
+
# :priority => to set the process priority of the child
|
35
|
+
# :logger => a logger object to use from the child
|
36
|
+
# :no_detach => true if you want to keep the child process under the parent control. usually you do NOT want this
|
37
|
+
def self.spork(options={})
|
38
|
+
logger = options[:logger]
|
39
|
+
logger.debug "spork> parent PID = #{Process.pid}" if logger
|
40
|
+
child = fork do
|
41
|
+
begin
|
42
|
+
start = Time.now
|
43
|
+
logger.debug "spork> child PID = #{Process.pid}" if logger
|
44
|
+
|
45
|
+
# set the nice priority if needed
|
46
|
+
Process.setpriority(Process::PRIO_PROCESS, 0, options[:priority]) if options[:priority]
|
47
|
+
|
48
|
+
# disconnect from the rack
|
49
|
+
Spork.close_resources
|
50
|
+
|
51
|
+
# run the block of code that takes so long
|
52
|
+
yield
|
53
|
+
|
54
|
+
rescue => ex
|
55
|
+
logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger
|
56
|
+
ensure
|
57
|
+
logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger
|
58
|
+
# this form of exit doesn't call at_exit handlers
|
59
|
+
exit!(0)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# detach from child process (parent may still wait for detached process if they wish)
|
64
|
+
Process.detach(child) unless options[:no_detach]
|
65
|
+
|
66
|
+
return child
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
# Patch to work with passenger
|
72
|
+
if defined? Passenger::Rack::RequestHandler
|
73
|
+
class Passenger::Rack::RequestHandler
|
74
|
+
alias_method :orig_process_request, :process_request
|
75
|
+
def process_request(env, input, output)
|
76
|
+
Spork.resource_to_close(input)
|
77
|
+
Spork.resource_to_close(output)
|
78
|
+
orig_process_request(env, input, output)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/task.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module OpenTox
|
2
|
+
|
3
|
+
class Task < OpenTox
|
4
|
+
#private :new
|
5
|
+
|
6
|
+
def initialize(uri)
|
7
|
+
super(uri)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.create(params)
|
11
|
+
uri = RestClient.post @@config[:services]["opentox-task"], :resource_uri => params[:resource_uri]
|
12
|
+
Task.new uri
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find(params)
|
16
|
+
Task.new(params[:uri])
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.base_uri
|
20
|
+
@@config[:services]["opentox-task"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def start
|
24
|
+
RestClient.put @uri, :status => 'started'
|
25
|
+
end
|
26
|
+
|
27
|
+
def stop
|
28
|
+
RestClient.put @uri, :status => 'stopped'
|
29
|
+
end
|
30
|
+
|
31
|
+
def completed
|
32
|
+
RestClient.put @uri, :status => 'completed'
|
33
|
+
end
|
34
|
+
|
35
|
+
def status
|
36
|
+
RestClient.get File.join(@uri, 'status')
|
37
|
+
end
|
38
|
+
|
39
|
+
def completed?
|
40
|
+
self.status == 'completed'
|
41
|
+
end
|
42
|
+
|
43
|
+
def resource
|
44
|
+
RestClient.get @uri
|
45
|
+
end
|
46
|
+
|
47
|
+
def wait_for_completion
|
48
|
+
until self.completed?
|
49
|
+
sleep 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'opentox-ruby-api-wrapper.rb')
|
2
|
+
require File.join(File.dirname(__FILE__), 'redis.rb')
|
3
|
+
|
4
|
+
namespace :redis do
|
5
|
+
|
6
|
+
desc "Flush Redis testing database"
|
7
|
+
task :flush do
|
8
|
+
require 'redis'
|
9
|
+
r = Redis.new :db => 2
|
10
|
+
r.flush_db
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Flush all Redis databases"
|
14
|
+
task :flushall do
|
15
|
+
require 'redis'
|
16
|
+
r = Redis.new
|
17
|
+
r.flush_all
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
namespace :opentox do
|
24
|
+
|
25
|
+
desc "Install required gems"
|
26
|
+
task :install do
|
27
|
+
puts `sudo gem install #{@gems}`
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Update gems"
|
31
|
+
task :update do
|
32
|
+
puts `sudo gem update #{@gems}`
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace :services do
|
36
|
+
|
37
|
+
desc "Run opentox services"
|
38
|
+
task :start do
|
39
|
+
@@config[:services].each do |service,uri|
|
40
|
+
dir = File.join(@@config[:base_dir], service)
|
41
|
+
server = @@config[:webserver]
|
42
|
+
case server
|
43
|
+
when /thin|mongrel|webrick/
|
44
|
+
port = uri.sub(/^.*:/,'').sub(/\/$/,'')
|
45
|
+
Dir.chdir dir
|
46
|
+
pid_file = File.join(@@tmp_dir,"#{service}.pid")
|
47
|
+
begin
|
48
|
+
`#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &`
|
49
|
+
puts "#{service} started on localhost:#{port} in #{ENV['RACK_ENV']} environment with PID file #{pid_file}."
|
50
|
+
rescue
|
51
|
+
puts "Cannot start #{service} on port #{port}."
|
52
|
+
end
|
53
|
+
when 'passenger'
|
54
|
+
`touch #{File.join(dir, 'tmp/restart.txt')}`
|
55
|
+
puts "#{service} restarted."
|
56
|
+
else
|
57
|
+
puts "not yet implemented"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
desc "Stop opentox services"
|
63
|
+
task :stop do
|
64
|
+
server = @@config[:webserver]
|
65
|
+
if server =~ /thin|mongrel|webrick/
|
66
|
+
@@config[:services].each do |service,uri|
|
67
|
+
port = uri.sub(/^.*:/,'').sub(/\/$/,'')
|
68
|
+
pid_file = File.join(@@tmp_dir,"#{service}.pid")
|
69
|
+
begin
|
70
|
+
puts `#{server} stop -P #{pid_file}`
|
71
|
+
puts "#{service} stopped on localhost:#{port}"
|
72
|
+
rescue
|
73
|
+
puts "Cannot stop #{service} on port #{port}."
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
desc "Restart opentox services"
|
80
|
+
task :restart => [:stop, :start]
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
desc "Run all OpenTox tests"
|
85
|
+
task :test do
|
86
|
+
@@config[:services].each do |service,uri|
|
87
|
+
dir = File.join(@@config[:base_dir], service)
|
88
|
+
Dir.chdir dir
|
89
|
+
puts "Running tests in #{dir}"
|
90
|
+
`rake test -t 1>&2`
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
desc "Start service in current directory"
|
97
|
+
task :start do
|
98
|
+
service = File.basename(Dir.pwd).intern
|
99
|
+
server = @@config[:webserver]
|
100
|
+
case server
|
101
|
+
when /thin|mongrel|webrick/
|
102
|
+
port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'')
|
103
|
+
pid_file = File.join(@@tmp_dir,"#{service}.pid")
|
104
|
+
begin
|
105
|
+
`#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &`
|
106
|
+
puts "#{service} started on localhost:#{port} in #{ENV['RACK_ENV']} environment with PID file #{pid_file}."
|
107
|
+
rescue
|
108
|
+
puts "Cannot start #{service} on port #{port}."
|
109
|
+
end
|
110
|
+
when 'passenger'
|
111
|
+
`touch tmp/restart.txt`
|
112
|
+
puts "#{service} restarted."
|
113
|
+
else
|
114
|
+
puts "not yet implemented"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
desc "Stop service in current directory"
|
119
|
+
task :stop do
|
120
|
+
service = File.basename(Dir.pwd).intern
|
121
|
+
server = @@config[:webserver]
|
122
|
+
if server =~ /thin|mongrel|webrick/
|
123
|
+
port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'')
|
124
|
+
pid_file = File.join(@@tmp_dir,"#{service}.pid")
|
125
|
+
begin
|
126
|
+
puts `thin stop -P #{pid_file}`
|
127
|
+
puts "#{service} stopped on localhost:#{port}"
|
128
|
+
rescue
|
129
|
+
puts "Cannot stop #{service} on port #{port}."
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
desc "Restart service in current directory"
|
135
|
+
task :restart => [:stop, :start]
|
data/lib/tasks/redis.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
# Inspired by rabbitmq.rake the Redbox project at http://github.com/rick/redbox/tree/master
|
2
|
+
require 'fileutils'
|
3
|
+
require 'open-uri'
|
4
|
+
|
5
|
+
class RedisRunner
|
6
|
+
|
7
|
+
def self.redisdir
|
8
|
+
"/tmp/redis/"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.redisconfdir
|
12
|
+
'/etc/redis.conf'
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.dtach_socket
|
16
|
+
'/tmp/redis.dtach'
|
17
|
+
end
|
18
|
+
|
19
|
+
# Just check for existance of dtach socket
|
20
|
+
def self.running?
|
21
|
+
File.exists? dtach_socket
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.start
|
25
|
+
puts 'Detach with Ctrl+\ Re-attach with rake redis:attach'
|
26
|
+
sleep 3
|
27
|
+
exec "dtach -A #{dtach_socket} redis-server #{redisconfdir}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.attach
|
31
|
+
exec "dtach -a #{dtach_socket}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.stop
|
35
|
+
sh 'echo "SHUTDOWN" | nc localhost 6379'
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
namespace :redis do
|
41
|
+
|
42
|
+
desc 'About redis'
|
43
|
+
task :about do
|
44
|
+
puts "\nSee http://code.google.com/p/redis/ for information about redis.\n\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'Start redis'
|
48
|
+
task :start do
|
49
|
+
RedisRunner.start
|
50
|
+
end
|
51
|
+
|
52
|
+
desc 'Stop redis'
|
53
|
+
task :stop do
|
54
|
+
RedisRunner.stop
|
55
|
+
end
|
56
|
+
|
57
|
+
desc 'Restart redis'
|
58
|
+
task :restart do
|
59
|
+
RedisRunner.stop
|
60
|
+
RedisRunner.start
|
61
|
+
end
|
62
|
+
|
63
|
+
desc 'Attach to redis dtach socket'
|
64
|
+
task :attach do
|
65
|
+
RedisRunner.attach
|
66
|
+
end
|
67
|
+
|
68
|
+
desc 'Install the lastest verison of Redis from Github (requires git, duh)'
|
69
|
+
task :install => [:about, :download, :make] do
|
70
|
+
%w(redis-benchmark redis-cli redis-server).each do |bin|
|
71
|
+
sh "sudo cp /tmp/redis/#{bin} /usr/bin/"
|
72
|
+
end
|
73
|
+
|
74
|
+
puts "Installed redis-benchmark, redis-cli and redis-server to /usr/bin/"
|
75
|
+
|
76
|
+
unless File.exists?('/etc/redis.conf')
|
77
|
+
sh 'sudo cp /tmp/redis/redis.conf /etc/'
|
78
|
+
puts "Installed redis.conf to /etc/ \n You should look at this file!"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
task :make do
|
83
|
+
sh "cd #{RedisRunner.redisdir} && make clean"
|
84
|
+
sh "cd #{RedisRunner.redisdir} && make"
|
85
|
+
end
|
86
|
+
|
87
|
+
desc "Download package"
|
88
|
+
task :download do
|
89
|
+
sh 'rm -rf /tmp/redis/' if File.exists?("#{RedisRunner.redisdir}/.svn")
|
90
|
+
sh 'git clone git://github.com/antirez/redis.git /tmp/redis' unless File.exists?(RedisRunner.redisdir)
|
91
|
+
sh "cd #{RedisRunner.redisdir} && git pull" if File.exists?("#{RedisRunner.redisdir}/.git")
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
namespace :dtach do
|
97
|
+
|
98
|
+
desc 'About dtach'
|
99
|
+
task :about do
|
100
|
+
puts "\nSee http://dtach.sourceforge.net/ for information about dtach.\n\n"
|
101
|
+
end
|
102
|
+
|
103
|
+
desc 'Install dtach 0.8 from source'
|
104
|
+
task :install => [:about] do
|
105
|
+
|
106
|
+
Dir.chdir('/tmp/')
|
107
|
+
unless File.exists?('/tmp/dtach-0.8.tar.gz')
|
108
|
+
require 'net/http'
|
109
|
+
|
110
|
+
url = 'http://downloads.sourceforge.net/project/dtach/dtach/0.8/dtach-0.8.tar.gz'
|
111
|
+
open('/tmp/dtach-0.8.tar.gz', 'wb') do |file| file.write(open(url).read) end
|
112
|
+
end
|
113
|
+
|
114
|
+
unless File.directory?('/tmp/dtach-0.8')
|
115
|
+
system('tar xzf dtach-0.8.tar.gz')
|
116
|
+
end
|
117
|
+
|
118
|
+
Dir.chdir('/tmp/dtach-0.8/')
|
119
|
+
sh 'cd /tmp/dtach-0.8/ && ./configure && make'
|
120
|
+
sh 'sudo cp /tmp/dtach-0.8/dtach /usr/bin/'
|
121
|
+
|
122
|
+
puts 'Dtach successfully installed to /usr/bin.'
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
require 'application.rb'
|
4
|
+
require 'rack'
|
5
|
+
require 'rack/contrib'
|
6
|
+
|
7
|
+
FileUtils.mkdir_p 'log' unless File.exists?('log')
|
8
|
+
log = File.new("log/#{ENV["RACK_ENV"]}.log", "a")
|
9
|
+
$stdout.reopen(log)
|
10
|
+
$stderr.reopen(log)
|
11
|
+
|
12
|
+
if ENV['RACK_ENV'] == 'production'
|
13
|
+
use Rack::MailExceptions do |mail|
|
14
|
+
mail.to 'helma@in-silico.ch'
|
15
|
+
mail.subject '[ERROR] %s'
|
16
|
+
end
|
17
|
+
elsif ENV['RACK_ENV'] == 'development'
|
18
|
+
use Rack::Reloader
|
19
|
+
use Rack::ShowExceptions
|
20
|
+
end
|
21
|
+
|
22
|
+
run Sinatra::Application
|
23
|
+
|