diff options
author | Christoph Helma <helma@in-silico.de> | 2009-08-27 12:52:08 +0200 |
---|---|---|
committer | Christoph Helma <helma@in-silico.de> | 2009-08-27 12:52:08 +0200 |
commit | 1c8d5c73c0e322f4594c365014990bf5f003e00a (patch) | |
tree | 85d377db68be8969bab07d97b2e9e749a9523b05 | |
parent | 61646780607e3e43a581053038bb169efedd3e3d (diff) |
improved redis data store
-rw-r--r-- | application.rb | 89 | ||||
-rw-r--r-- | test/test.rb | 26 |
2 files changed, 65 insertions, 50 deletions
diff --git a/application.rb b/application.rb index 2742218..26bb3c3 100644 --- a/application.rb +++ b/application.rb @@ -17,36 +17,35 @@ set :default_content, :yaml helpers do - def not_found? - halt 404, "Dataset \"#{params[:name]}\" not found." unless @@redis.set_member? "datasets", sanitize_key(params[:name]) - end - - def sanitize_key(k) - k.gsub(/\s|\n/,'_') + def create_dataset(uri) + @@redis.set_add "datasets", uri end - def name(uri) - URI.decode File.basename(uri) + def add_feature(dataset_uri, compound_uri, feature_uri) + @@redis.set_add dataset_uri + '::compounds', compound_uri + @@redis.set_add dataset_uri + '::features', feature_uri + @@redis.set_add dataset_uri + '::' + compound_uri + '::features', feature_uri + @@redis.set_add dataset_uri + '::' + feature_uri + '::compounds', compound_uri end - def uri(name) - uri = url_for("/", :full) + URI.escape(URI.unescape(name)) # avoid escaping escaped names + def delete_dataset(uri) + @@redis.set_members(uri + '::compounds').each do |compound_uri| + @@redis.delete uri + '::' + compound_uri + end + @@redis.delete uri + '::compounds' + @@redis.set_members(uri + '::features').each do |feature_uri| + @@redis.delete uri + '::' + feature_uri + end + @@redis.delete uri + '::features' + @@redis.set_delete "datasets", uri 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 + def not_found? + halt 404, "Dataset \"#{params[:name]}\" not found." unless @@redis.set_member? "datasets", uri(params[:name]) 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 + def uri(name) + uri = url_for("/", :full) + name.gsub(/\s|\n/,'_') end end @@ -73,14 +72,15 @@ end get '/:name/compounds' do not_found? - @@redis.set_members(URI.encode(params[:name]) + "::compounds").join("\n") + @@redis.set_members(uri(params[:name]) + "::compounds").join("\n") end get '/:name/features' do not_found? - @@redis.set_members(URI.encode(params[:name]) + "::features").join("\n") + @@redis.set_members(uri(params[:name]) + "::features").join("\n") end +=begin get '/:name/:type/*/*/intersection' do # CHECK/TEST @@redis.set_intersect(params[:splat][0], params[:splat][1], URI.encode(params[:name]) + '/' + params[:type]).join("\n") @@ -90,50 +90,53 @@ 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 +=end 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") + not_found? + # re-escape smiles (Sinatra unescapes params and splats) + compound_uri = params[:splat].first.sub(%r{(http://[\w\.:]+/)(.*)$}) {|s| $1 + URI.escape($2, /[^#{URI::PATTERN::UNRESERVED}]/)} + + #puts compound_uri + @@redis.set_members(uri(params[:name]) + '::' + compound_uri + '::features').join("\n") end get '/:name/*/compounds' do - feature = params[:splat].first - @@redis.set_intersect(feature, params[:name] + '::compounds').join("\n") + not_found? + @@redis.set_members(uri(params[:name]) + '::' + params[:splat].first + '::compounds').join("\n") end post '/?' do #protected! - name = sanitize_key params[:name] - halt 403, "Dataset \"#{name}\" exists - please choose another name." if @@redis.set_member?("datasets", name) + uri = uri(params[:name]) + halt 403, "Dataset \"#{name}\" exists - please choose another name." if @@redis.set_member?("datasets", uri) - @@redis.set_add "datasets", name + @@redis.set_add "datasets", uri if params[:file] File.open(params[:file][:tempfile].path).each_line do |line| record = line.chomp.split(/,\s*/) - add_feature(name, record) + compound_uri = OpenTox::Compound.new(:smiles => record[0]).uri + feature_uri = OpenTox::Feature.new(:name => params[:name], :values => {:classification => record[1]}).uri + add_feature(uri, compound_uri, feature_uri) end end - uri name + uri 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." + uri = uri(params[:name]) + add_feature(uri, params[:compound_uri],params[:feature_uri]) + uri + " 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}\"." + uri = uri(params[:name]) + delete_dataset(uri) + "Successfully deleted dataset \"#{uri}\"." end diff --git a/test/test.rb b/test/test.rb index dacc9d5..5c4b2e7 100644 --- a/test/test.rb +++ b/test/test.rb @@ -31,27 +31,29 @@ class DatasetsTest < Test::Unit::TestCase end def test_create_dataset_and_insert_data - usmiles = OpenTox::Compound.new(:smiles => '[O-][N+](=O)C/C=C\C(=O)Cc1cc(C#N)ccc1').uid - puts usmiles name = "Test dataset" + smiles = '[O-][N+](=O)C/C=C\C(=O)Cc1cc(C#N)ccc1' + compound_uri = OpenTox::Compound.new(:smiles => smiles).uri + feature_uri = OpenTox::Feature.new(:name => name, :values => {:classification => "true"}).uri post '/', :name => name assert last_response.ok? uri = last_response.body.chomp get uri assert last_response.ok? assert last_response.body.include?("Test_dataset") - put uri, :compound => usmiles, :feature => "true" + put uri, :compound_uri => compound_uri, :feature_uri => feature_uri assert last_response.ok? get uri + '/compounds' assert last_response.ok? - assert last_response.body.include?(usmiles) + assert_equal compound_uri, last_response.body get uri + '/features' assert last_response.ok? assert last_response.body.include?("true") - get uri + '/' + usmiles + '/features' - puts last_response.body + assert_equal feature_uri, last_response.body + get uri + '/' + compound_uri + '/features' assert last_response.ok? assert last_response.body.include?("true") + assert_equal feature_uri, last_response.body delete uri assert last_response.ok? get "/Test_dataset" @@ -59,14 +61,25 @@ class DatasetsTest < Test::Unit::TestCase end def test_create_dataset_from_csv + smiles = 'CC(=O)Nc1scc(n1)c1ccc(o1)[N+](=O)[O-]' + compound_uri = OpenTox::Compound.new(:smiles => smiles).uri post '/', :name => "Hamster Carcinogenicity", :file => Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__), "hamster_carcinogenicity.csv")) uri = last_response.body get uri assert last_response.ok? get uri + '/compounds' assert last_response.ok? + assert last_response.body.include?(compound_uri) + get uri + '/' + compound_uri + '/features' + assert last_response.ok? + assert last_response.body.include?("Hamster%20Carcinogenicity/classification/true") + delete uri + assert last_response.ok? + get uri + assert !last_response.ok? end +=begin def test_create_large_dataset_from_csv post '/', :name => "Salmonella Mutagenicity", :file => Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__), "kazius.csv")) uri = last_response.body @@ -74,7 +87,6 @@ class DatasetsTest < Test::Unit::TestCase assert last_response.ok? end -=begin def test_unauthorized_create post '/', :name => "Test dataset" assert !last_response.ok? |