summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--lib/algorithm.rb77
-rw-r--r--lib/authorization.rb24
-rw-r--r--lib/dataset.rb11
-rw-r--r--lib/environment.rb16
-rw-r--r--lib/model.rb6
-rw-r--r--lib/opentox-ruby-api-wrapper.rb2
-rw-r--r--lib/task.rb44
-rw-r--r--lib/templates/users.yaml5
9 files changed, 133 insertions, 53 deletions
diff --git a/.gitignore b/.gitignore
index 00c0b86..fedf1b5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
coverage
rdoc
pkg
+*~
diff --git a/lib/algorithm.rb b/lib/algorithm.rb
index 25ae4cb..ed7b629 100644
--- a/lib/algorithm.rb
+++ b/lib/algorithm.rb
@@ -1,27 +1,28 @@
module OpenTox
- module Algorithm
+ module Algorithm
- class Fminer
- include Owl
+ class Fminer
+ include Owl
- def initialize
- super
- self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer')
- self.title = "fminer"
- self.source = "http://github.com/amaunz/libfminer"
- self.parameters = {
- "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" },
- "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" }
- }
- end
+ def initialize
+ super
+ self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer')
+ self.title = "fminer"
+ self.source = "http://github.com/amaunz/libfminer"
+ self.parameters = {
+ "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" },
+ "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" }
+ }
+ end
- def self.create_feature_dataset(params)
- RestClient.post params[:feature_generation_uri], :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri]
- end
- end
+ def self.create_feature_dataset(params)
+ resource = RestClient::Resource.new(params[:feature_generation_uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri]
+ end
+ end
- class Lazar
- include Owl
+ class Lazar
+ include Owl
def initialize
super
@@ -40,26 +41,28 @@ module OpenTox
def self.create_model(params)
LOGGER.debug params
- @uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")
+ #@uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")
+ resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")
end
- end
+ end
- class Similarity
- def self.weighted_tanimoto(fp_a,fp_b,p)
- common_features = fp_a & fp_b
- all_features = fp_a + fp_b
- common_p_sum = 0.0
- if common_features.size > 0
- common_features.each{|f| common_p_sum += p[f]}
- all_p_sum = 0.0
- all_features.each{|f| all_p_sum += p[f]}
- common_p_sum/all_p_sum
- else
- 0.0
- end
- end
- end
+ class Similarity
+ def self.weighted_tanimoto(fp_a,fp_b,p)
+ common_features = fp_a & fp_b
+ all_features = fp_a + fp_b
+ common_p_sum = 0.0
+ if common_features.size > 0
+ common_features.each{|f| common_p_sum += p[f]}
+ all_p_sum = 0.0
+ all_features.each{|f| all_p_sum += p[f]}
+ common_p_sum/all_p_sum
+ else
+ 0.0
+ end
+ end
+ end
- end
+ end
end
diff --git a/lib/authorization.rb b/lib/authorization.rb
new file mode 100644
index 0000000..7cb548e
--- /dev/null
+++ b/lib/authorization.rb
@@ -0,0 +1,24 @@
+helpers do
+
+ def protected!
+ response['WWW-Authenticate'] = %(Basic realm="Opentox Webservice Authentication") and \
+ throw(:halt, [401, "Not authorized\n"]) and \
+ return unless authorized?
+ end
+
+ def authorized?
+ @auth ||= Rack::Auth::Basic::Request.new(request.env)
+ @auth.provided? && @auth.basic? && @auth.credentials && valid_user?
+ end
+
+ def valid_user?
+ users = @@users[:users]
+ return @auth.credentials == [@auth.username, users.fetch(@auth.username)] if users.has_key?(@auth.username)
+ return false
+ end
+
+end
+
+before do
+ protected! unless env['REQUEST_METHOD'] == "GET"
+end \ No newline at end of file
diff --git a/lib/dataset.rb b/lib/dataset.rb
index e4e4e9d..d4e7082 100644
--- a/lib/dataset.rb
+++ b/lib/dataset.rb
@@ -82,7 +82,8 @@ module OpenTox
end
def self.create(data, content_type = 'application/rdf+xml')
- uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type
+ resource = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ uri = resource.post data, :content_type => content_type
dataset = Dataset.new
dataset.read uri.to_s
dataset
@@ -158,12 +159,14 @@ module OpenTox
# Delete a dataset
def delete
- RestClient.delete @uri
- end
+ resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.delete
+ end
def save
LOGGER.debug "Saving dataset"
- task_uri = RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s
+ #task_uri = RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s
+ task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.rdf, :content_type => "application/rdf+xml").to_s
task = OpenTox::Task.find(task_uri)
LOGGER.debug "Waiting for task #{task_uri}"
task.wait_for_completion
diff --git a/lib/environment.rb b/lib/environment.rb
index 814e5c0..9338ca5 100644
--- a/lib/environment.rb
+++ b/lib/environment.rb
@@ -6,6 +6,7 @@ ENV['RACK_ENV'] = 'test' unless ENV['RACK_ENV']
basedir = File.join(ENV['HOME'], ".opentox")
config_dir = File.join(basedir, "config")
config_file = File.join(config_dir, "#{ENV['RACK_ENV']}.yaml")
+user_file = File.join(config_dir, "users.yaml")
TMP_DIR = File.join(basedir, "tmp")
LOG_DIR = File.join(basedir, "log")
@@ -44,6 +45,21 @@ logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log"
LOGGER = Logger.new(logfile,'daily') # daily rotation
LOGGER.level = Logger::DEBUG
+if File.exist?(user_file)
+ @@users = YAML.load_file(user_file)
+else
+ FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/users.yaml'), user_file)
+ puts "Please edit #{user_file} and restart your application."
+ exit
+end
+
+begin
+ 0 < @@users[:users].keys.length
+rescue
+ puts "Please edit #{user_file} and restart your application. Create at least one user with password."
+ exit
+end
+
# RDF namespaces
RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#'
diff --git a/lib/model.rb b/lib/model.rb
index 976efac..8abd040 100644
--- a/lib/model.rb
+++ b/lib/model.rb
@@ -39,7 +39,8 @@ module OpenTox
# Predict a compound
def predict(compound)
- RestClient.post(@uri, :compound_uri => compound.uri)
+ resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.post(:compound_uri => compound.uri)
end
def self.base_uri
@@ -47,7 +48,8 @@ module OpenTox
end
def self.create(data)
- RestClient.post(@@config[:services]["opentox-model"], data, :content_type => "application/x-yaml").to_s
+ resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.post(data, :content_type => "application/x-yaml").to_s
end
# def self.create(task)
diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb
index ca57fc9..03838e8 100644
--- a/lib/opentox-ruby-api-wrapper.rb
+++ b/lib/opentox-ruby-api-wrapper.rb
@@ -8,6 +8,6 @@ rescue LoadError
puts "Please install Openbabel with 'rake openbabel:install' in the compound component"
end
-['owl', 'compound','dataset','algorithm','model','task','utils'].each do |lib|
+['owl', 'compound','dataset','algorithm','model','task','utils','authorization'].each do |lib|
require lib
end
diff --git a/lib/task.rb b/lib/task.rb
index 70d22bf..97b3c1d 100644
--- a/lib/task.rb
+++ b/lib/task.rb
@@ -10,7 +10,10 @@ module OpenTox
end
def self.create
- uri = RestClient.post @@config[:services]["opentox-task"], {}
+ #uri = RestClient.post @@config[:services]["opentox-task"], {}
+ resource = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ #uri = resource.post(nil)
+ uri = resource.post({})
Task.new(uri)
end
@@ -26,7 +29,7 @@ module OpenTox
task_uris = RestClient.get(@@config[:services]["opentox-task"]).split(/\n/)
task_uris.collect{|uri| Task.new(uri)}
end
-
+
def created_at
RestClient.get File.join(@uri, 'created_at')
end
@@ -42,7 +45,24 @@ module OpenTox
def resource
RestClient.get File.join(@uri, 'resource')
end
+
+ def started
+ LOGGER.info File.join(@uri,'started')
+ resource = RestClient::Resource.new(File.join(@uri,'started'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.put({})
+ end
+ def cancel
+ resource = RestClient::Resource.new(@File.join(@uri,'cancelled'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.put({})
+ end
+
+ def completed(uri)
+ resource = RestClient::Resource.new(File.join(@uri,'completed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.put :resource => uri
+ end
+
+=begin
def started
RestClient.put File.join(@uri,'started'), {}
end
@@ -51,20 +71,26 @@ module OpenTox
RestClient.put File.join(@uri,'cancelled'), {}
end
- def failed
- RestClient.put File.join(@uri,'failed'), {}
+ def completed(uri)
+ RestClient.put File.join(@uri,'completed'), :resource => uri
end
- def parent=(task)
- RestClient.put File.join(@uri,'parent'), {:uri => task.uri}
+=end
+ def failed
+ #RestClient.put File.join(@uri,'failed'), {}
+ resource = RestClient::Resource.new(@File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.put({})
end
- def completed(uri)
- RestClient.put File.join(@uri,'completed'), :resource => uri
+ def parent=(task)
+ #RestClient.put File.join(@uri,'parent'), {:uri => task.uri}
+ resource = RestClient::Resource.new(@File.join(@uri,'parent'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.put :uri => task.uri
end
def pid=(pid)
- RestClient.put File.join(@uri, 'pid'), :pid => pid
+ resource = RestClient::Resource.new(File.join(@uri,'pid'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.put :pid => pid
end
def completed?
diff --git a/lib/templates/users.yaml b/lib/templates/users.yaml
new file mode 100644
index 0000000..483fd7b
--- /dev/null
+++ b/lib/templates/users.yaml
@@ -0,0 +1,5 @@
+# please insert users and passwords here.
+# one user and password each line. uncomment the line.
+:users:
+# username: "secretpassword"
+# exampleuser: "ih9aiTog" \ No newline at end of file