diff options
Diffstat (limited to 'application.rb')
-rw-r--r-- | application.rb | 272 |
1 files changed, 105 insertions, 167 deletions
diff --git a/application.rb b/application.rb index 45fee4f..2742218 100644 --- a/application.rb +++ b/application.rb @@ -1,201 +1,139 @@ -## SETUP -[ 'rubygems', 'sinatra', 'sinatra/url_for', 'dm-core', 'dm-more', 'builder', 'opentox-ruby-api-wrapper' ].each do |lib| - require lib +# SETUP +[ 'rubygems', 'redis', 'opentox-ruby-api-wrapper' ].each do |lib| + require lib end -## MODELS - -class Dataset - include DataMapper::Resource - property :id, Serial - property :name, String - property :finished, Boolean, :default => false - has n, :associations +case ENV['RACK_ENV'] +when 'production' + @@redis = Redis.new :db => 0 +when 'development' + @@redis = Redis.new :db => 1 +when 'test' + @@redis = Redis.new :db => 2 + @@redis.flush_db end -class Association - include DataMapper::Resource - property :id, Serial - property :compound_uri, String, :size => 255 - property :feature_uri, String, :size => 255 - belongs_to :dataset -end +set :default_content, :yaml -sqlite = "#{File.expand_path(File.dirname(__FILE__))}/#{Sinatra::Base.environment}.sqlite3" -DataMapper.setup(:default, "sqlite3:///#{sqlite}") -DataMapper::Logger.new(STDOUT, 0) +helpers do -unless FileTest.exists?("#{sqlite}") - [Dataset, Association].each do |model| - model.auto_migrate! + def not_found? + halt 404, "Dataset \"#{params[:name]}\" not found." unless @@redis.set_member? "datasets", sanitize_key(params[:name]) end -end -## REST API + def sanitize_key(k) + k.gsub(/\s|\n/,'_') + end -get '/?' do - Dataset.all.collect{ |d| url_for("/", :full) + d.id.to_s }.join("\n") -end + def name(uri) + URI.decode File.basename(uri) + end -get '/:id' do - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - halt 202, dataset.to_yaml unless dataset.finished - dataset.to_yaml -=begin - builder do |xml| - xml.instruct! - xml.dataset do - xml.uri url_for("/", :full) + dataset.id.to_s - xml.name dataset.name - dataset.associations.each do |a| - xml.association do - xml.compound_uri a.compound_uri - xml.feature_uri a.feature_uri - end - end - end + def uri(name) + uri = url_for("/", :full) + URI.escape(URI.unescape(name)) # avoid escaping escaped names end -=end -end -get '/:id/name' do - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - dataset.name -end + def add_feature(name, record) + compound = record[0] + feature = record[1] + @@redis.set_add name + '::compounds', compound + @@redis.set_add name + '::features', name + '::' + feature + @@redis.set_add compound, name + '::' + feature + @@redis.set_add feature, compound + end -get '/:id/compounds' do - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - dataset.associations.collect{ |a| a.compound_uri }.uniq.join("\n") -end + def delete_dataset(name) + # stale features/compounds under compound and name::feature ?? + @@redis.delete name + '::compounds' + @@redis.delete name + '::features' + @@redis.set_delete "datasets", name + end -get '/:id/features' do - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - dataset.associations.collect{ |a| a.feature_uri }.uniq.join("\n") end -get '/:id/features/compounds' do - - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) +## REST API - features = {} - dataset.associations.each do |a| - if features[a.feature_uri] - features[a.feature_uri] << a.compound_uri - else - features[a.feature_uri] = [a.compound_uri] - end - end - features.to_yaml - -=begin - builder do |xml| - xml.instruct! - xml.dataset do - features.each do |feature,compounds| - xml.feature do - xml.uri feature - compounds.each do |c| - xml.compound_uri c - end - end - end - end - end -=end +get '/?' do + @@redis.set_members("datasets").collect{|d| uri(d)}.join("\n") end -get '/:id/compounds/features' do +get '/:name' do + not_found? + @dataset = {:uri => uri(params[:name]), :name => params[:name]} + respond_to do |format| + format.yaml { @dataset.to_yaml } + format.xml { builder :dataset } + end +end - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - compounds = {} - dataset.associations.each do |a| - if compounds[a.compound_uri] - compounds[a.compound_uri] << a.feature_uri - else - compounds[a.compound_uri] = [a.feature_uri] - end - end - compounds.to_yaml -=begin - builder do |xml| - xml.instruct! - xml.dataset do - compounds.each do |compound,features| - xml.compound do - xml.uri compound - features.each do |f| - xml.feature_uri f - end - end - end - end - end -=end +get '/:name/name' do + not_found? + URI.decode(params[:name]) end -get '/:id/compound/*/features' do - compound_uri = params[:splat].first - Association.all(:dataset_id => params[:id], :compound_uri => compound_uri).collect { |a| a.feature_uri }.uniq.join("\n") +get '/:name/compounds' do + not_found? + @@redis.set_members(URI.encode(params[:name]) + "::compounds").join("\n") end -get '/:id/feature/*/compounds' do - feature_uri = params[:splat].first - Association.all(:dataset_id => params[:id], :feature_uri => feature_uri).collect { |a| a.compound_uri }.uniq.join("\n") +get '/:name/features' do + not_found? + @@redis.set_members(URI.encode(params[:name]) + "::features").join("\n") end -post '/?' do - #protected! - dataset = Dataset.create :name => params[:name] - - if params[:file] - Spork.spork do - File.open(params[:file][:tempfile].path).each_line do |line| - record = line.chomp.split(/,\s*/) - compound = OpenTox::Compound.new :smiles => record[0] - feature = OpenTox::Feature.new :name => params[:name], :values => { 'classification' => record[1] } - Association.create(:compound_uri => compound.uri, :feature_uri => feature.uri, :dataset_id => dataset.id) - end - dataset.update_attributes(:finished => true) - end +get '/:name/:type/*/*/intersection' do + # CHECK/TEST + @@redis.set_intersect(params[:splat][0], params[:splat][1], URI.encode(params[:name]) + '/' + params[:type]).join("\n") +end -=begin - elsif params[:data] - puts params[:data] - dataset = Dataset.create :name => params[:name] - #Spork.spork do - YAML.load(params[:data]).each do |record| - compound = OpenTox::Compound.new :uri => record[0] - feature = OpenTox::Feature.new :uri => record[1] - puts compound + "\t" , feature - Association.create(:compound_uri => compound.uri, :feature_uri => feature.uri, :dataset_id => dataset.id) - end - dataset.update_attributes(:finished => true) - #end -=end - end - url_for("/", :full) + dataset.id.to_s +get '/:name/:type/*/*/union' do + # CHECK/TEST + @@redis.set_union(params[:splat][0], params[:splat][1], URI.encode(params[:name]) + '/' + params[:type]).join("\n") end -put '/:id/?' do - #protected! - pass if params[:finished] - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - compound_uri = params[:compound_uri] - feature_uri = params[:feature_uri] - Association.create(:compound_uri => compound_uri.to_s, :feature_uri => feature_uri.to_s, :dataset_id => dataset.id) - url_for("/", :full) + dataset.id.to_s +get '/:name/*/features' do + compound = URI.encode(params[:splat].first, /[^#{URI::PATTERN::UNRESERVED}]/) + @@redis.set_intersect(params[:name] + '::features', compound ).join("\n") + @@redis.set_intersect(params[:name] + '::features', compound ).join("\n") end -put '/:id/?' do - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - dataset.update_attributes(:finished => true) if params[:finished] == 'true' +get '/:name/*/compounds' do + feature = params[:splat].first + @@redis.set_intersect(feature, params[:name] + '::compounds').join("\n") end -delete '/:id/?' do - # dangerous, because other datasets might refer to it - #protected! - halt 404, "Dataset #{params[:id]} not found." unless dataset = Dataset.get(params[:id]) - dataset.associations.each { |a| a.destroy } - dataset.destroy - "Successfully deleted dataset #{params[:id]}." +post '/?' do + #protected! + name = sanitize_key params[:name] + halt 403, "Dataset \"#{name}\" exists - please choose another name." if @@redis.set_member?("datasets", name) + + @@redis.set_add "datasets", name + + if params[:file] + File.open(params[:file][:tempfile].path).each_line do |line| + record = line.chomp.split(/,\s*/) + add_feature(name, record) + end + end + uri name +end + +put '/:name/?' do + #protected! + pass if params[:finished] + not_found? + name = sanitize_key params[:name] + compound = params[:compound] + feature = sanitize_key params[:feature] + add_feature(name, [compound,feature]) + name + " sucessfully updated." +end + +delete '/:name/?' do + # dangerous, because other datasets might refer to it + #protected! + not_found? + name = sanitize_key params[:name] + delete_dataset(name) + "Successfully deleted dataset \"#{name}\"." end |