summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMartin Gütlein <martin.guetlein@gmail.com>2010-02-26 09:54:04 +0100
committerMartin Gütlein <martin.guetlein@gmail.com>2010-02-26 09:54:04 +0100
commit420efdf93cc335c8adbdba38a71fa36b797188b0 (patch)
treef6bf677c065003a26a3380af166997287ed85c47 /lib
parent1a2116574c356241a55fb0bb7d922a042ffd4465 (diff)
parent7b59d1f07bf8cf0e23f3070f97f940af3bfad843 (diff)
Merge remote branch 'helma/test' into test
Diffstat (limited to 'lib')
-rw-r--r--lib/algorithm.rb79
-rw-r--r--lib/authorization.rb24
-rw-r--r--lib/compound.rb3
-rw-r--r--lib/dataset.rb19
-rw-r--r--lib/environment.rb17
-rw-r--r--lib/model.rb16
-rw-r--r--lib/opentox-ruby-api-wrapper.rb2
-rw-r--r--lib/owl.rb1
-rw-r--r--lib/task.rb45
-rw-r--r--lib/templates/users.yaml5
10 files changed, 153 insertions, 58 deletions
diff --git a/lib/algorithm.rb b/lib/algorithm.rb
index 25ae4cb..2a781d8 100644
--- a/lib/algorithm.rb
+++ b/lib/algorithm.rb
@@ -1,27 +1,29 @@
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)
+ LOGGER.debug File.basename(__FILE__) + ": creating feature dataset"
+ 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 +42,29 @@ 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")
+ LOGGER.debug File.basename(__FILE__) + ": creating model"
+ #@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..9a1760a
--- /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
diff --git a/lib/compound.rb b/lib/compound.rb
index 56646c0..0ee853d 100644
--- a/lib/compound.rb
+++ b/lib/compound.rb
@@ -17,7 +17,8 @@ module OpenTox
@inchi = sdf2inchi(params[:sdf])
@uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi))
elsif params[:name]
- @inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp
+ # paranoid URI encoding to keep SMILES charges and brackets
+ @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp
@uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi))
elsif params[:uri]
@uri = params[:uri]
diff --git a/lib/dataset.rb b/lib/dataset.rb
index 962a576..bbadd2d 100644
--- a/lib/dataset.rb
+++ b/lib/dataset.rb
@@ -14,6 +14,8 @@ module OpenTox
data_entry = @model.subject OT['compound'], compound
if data_entry.nil?
data_entry = @model.create_resource
+ dataset = @model.subject(RDF['type'],OT[self.owl_class])
+ @model.add dataset, OT['dataEntry'], data_entry
@model.add data_entry, RDF['type'], OT["DataEntry"]
@model.add data_entry, OT['compound'], compound
end
@@ -29,6 +31,8 @@ module OpenTox
data_entry = @model.subject OT['compound'], compound
if data_entry.nil?
data_entry = @model.create_resource
+ dataset = @model.subject(RDF['type'],OT[self.owl_class])
+ @model.add dataset, OT['dataEntry'], data_entry
@model.add data_entry, RDF['type'], OT["DataEntry"]
@model.add data_entry, OT['compound'], compound
end
@@ -57,7 +61,7 @@ module OpenTox
def find_or_create_compound(uri)
compound = @model.subject(DC["identifier"], uri)
if compound.nil?
- compound = @model.create_resource
+ compound = @model.create_resource(uri)
@model.add compound, RDF['type'], OT["Compound"]
@model.add compound, DC["identifier"], uri
end
@@ -68,7 +72,7 @@ module OpenTox
def find_or_create_feature(uri)
feature = @model.subject(DC["identifier"], uri)
if feature.nil?
- feature = @model.create_resource
+ feature = @model.create_resource(uri)
@model.add feature, RDF['type'], OT["Feature"]
@model.add feature, DC["identifier"], uri
@model.add feature, DC["title"], File.basename(uri).split(/#/)[1]
@@ -78,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
@@ -154,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 c4de0b5..27da072 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")
@@ -15,6 +16,7 @@ if File.exist?(config_file)
else
FileUtils.mkdir_p TMP_DIR
FileUtils.mkdir_p LOG_DIR
+ FileUtils.mkdir_p config_dir
FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file)
puts "Please edit #{config_file} and restart your application."
exit
@@ -100,6 +102,21 @@ LOGGER = MyLogger.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 a585b59..6c48734 100644
--- a/lib/model.rb
+++ b/lib/model.rb
@@ -24,7 +24,7 @@ module OpenTox
lazar.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar")
lazar.trainingDataset = yaml[:activity_dataset]
lazar.dependentVariables = yaml[:endpoint]
- lazar.predictedVariables = yaml[:endpoint] #+ " lazar prediction"
+ lazar.predictedVariables = yaml[:endpoint] + "_lazar_prediction"
lazar
end
@@ -39,7 +39,9 @@ module OpenTox
# Predict a compound
def predict(compound)
- RestClient.post(@uri, :compound_uri => compound.uri)
+ # nicht absichern??
+ 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 +49,15 @@ 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 delete
+ resource = RestClient::Resource.new(self.uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0])
+ resource.delete
+ #RestClient.delete @uri if @uri
+ #RestClient.delete model.task_uri if model.task_uri
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/owl.rb b/lib/owl.rb
index a843e59..82d6e0e 100644
--- a/lib/owl.rb
+++ b/lib/owl.rb
@@ -16,7 +16,6 @@ module OpenTox
# reate an anonymous resource for metadata
# this has to be rewritten with an URI as soon as the resource has been saved at an definitive location
tmp = @model.create_resource
- @model.add tmp, RDF['type'], OWL['Ontology']
@model.add tmp, RDF['type'], OT[self.owl_class]
end
diff --git a/lib/task.rb b/lib/task.rb
index 70d22bf..c5cddf7 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,27 @@ 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])
+ LOGGER.debug "task.rb: #{resource}"
+ 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