From e84a1b439e63ae3ed3b4bc3bc78261f95daf9ab7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 11 Jan 2012 21:00:20 +0100 Subject: basic rest post get delete test working --- Rakefile | 34 ++------------------------ lib/opentox.rb | 59 +++++++++++++++++++++++++--------------------- lib/overwrite.rb | 1 + lib/parser.rb | 29 +++++++++++++++++++++++ lib/rest_client_wrapper.rb | 1 + test/rest.rb | 23 ++++++++++++++++++ 6 files changed, 88 insertions(+), 59 deletions(-) create mode 100644 test/rest.rb diff --git a/Rakefile b/Rakefile index 7e0bcf9..b670f39 100644 --- a/Rakefile +++ b/Rakefile @@ -11,37 +11,7 @@ begin gem.homepage = "http://github.com/opentox/opentox-ruby-minimal" gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] # dependencies with versions -# gem.add_dependency "sinatra", "=1.2.6" -# gem.add_dependency "emk-sinatra-url-for", "=0.2.1" -# gem.add_dependency "sinatra-respond_to", "=0.7.0" -# gem.add_dependency "sinatra-static-assets", "=0.5.0" - gem.add_dependency "rest-client", "=1.6.1" -# gem.add_dependency "rack", "=1.3.0" -# gem.add_dependency "rack-contrib", "=1.1.0" -# gem.add_dependency "rack-flash", "=0.1.1" - gem.add_dependency "nokogiri", "=1.4.4" -# gem.add_dependency "rubyzip", "=0.9.4" - gem.add_dependency "roo", "=1.9.3" - gem.add_dependency "spreadsheet", "=0.6.5.4" - gem.add_dependency "google-spreadsheet-ruby", "=0.1.5" - gem.add_dependency "yajl-ruby", "=0.8.2" - #gem.add_dependency "mail", "=2.3.0" -# gem.add_dependency "rinruby", "=2.0.2" -# gem.add_dependency "ohm", "=0.1.3" -# gem.add_dependency "ohm-contrib", "=0.1.1" -# gem.add_dependency "SystemTimer", "=1.2.3" -# gem.add_dependency "rjb", "=1.3.4" -# gem.add_dependency "haml", "=3.1.1" - #valiation-gems -# gem.add_dependency "dm-core", "=1.1.0" -# gem.add_dependency "dm-serializer", "=1.1.0" -# gem.add_dependency "dm-timestamps", "=1.1.0" -# gem.add_dependency "dm-types", "=1.1.0" -# gem.add_dependency "dm-migrations", "=1.1.0" -# gem.add_dependency "dm-validations", "=1.1.0" -# gem.add_dependency "dm-sqlite-adapter", "=1.1.0" -# gem.add_dependency "ruby-plot", "=0.5.0" - + gem.add_dependency "rest-client" gem.add_development_dependency 'jeweler' gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end @@ -74,7 +44,7 @@ task :test => :check_dependencies task :default => :test -require 'rake/rdoctask' +require 'rdoc/task' Rake::RDocTask.new do |rdoc| if File.exist?('VERSION') version = File.read('VERSION') diff --git a/lib/opentox.rb b/lib/opentox.rb index dbe2360..b0ffcb1 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,13 +1,18 @@ -require "./parser.rb" -require "./rest_client_wrapper.rb" -require "./error.rb" - +require 'rdf' +require 'rdf/raptor' +#require "parser.rb" +require "rest_client_wrapper.rb" +require "overwrite.rb" +require "error.rb" + +RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' +RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task"] module OpenTox - attr_accessor :subjectid, :uri - attr_writer :metadata + attr_accessor :subjectid, :uri #, :service_uri + #attr_writer :metadata # Initialize OpenTox object with optional subjectid # @param [optional, String] subjectid @@ -17,7 +22,13 @@ module OpenTox end def metadata - @metadata ||= Parser::Owl::Generic.from_rdf get(:accept => "application/rdf+xml") + metadata = {} + RDF::Reader.open(@uri) do |reader| + reader.each_statement do |statement| + metadata[statement.predicate] = statement.object if statement.subject == @uri + end + end + metadata end # REST API @@ -31,7 +42,7 @@ module OpenTox # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def get headers={}, wait=true headers[:subjectid] = @subjectid - RestClientWrapper.get(@uri, headers, nil, wait).chomp + RestClientWrapper.get(@uri.to_s, headers, nil, wait).chomp end # performs a POST REST call @@ -41,9 +52,9 @@ module OpenTox # @param [optional,Hash] headers contains params like accept-header # @param [wait,Boolean] wait set to false to NOT wait for task if result is task # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def post payload=nil, headers={}, wait=true + def post payload={}, headers={}, wait=true headers[:subjectid] = @subjectid - RestClientWrapper.post(@uri, payload, headers, nil, wait).chomp + RestClientWrapper.post(@uri.to_s, payload, headers, nil, wait).chomp end # performs a PUT REST call @@ -51,40 +62,33 @@ module OpenTox # @param [optional,String] payload data put to the service # @param [optional,Hash] headers contains params like accept-header # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def put payload=nil, headers={} + def put payload={}, headers={} headers[:subjectid] = @subjectid - RestClientWrapper.put(@uri, payload, headers).chomp + RestClientWrapper.put(@uri.to_s, payload, headers).chomp end # performs a DELETE REST call # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def delete - RestClientWrapper.delete(@uri,:subjectid => @subjectid) + RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) end - # Tools + # create default classes + SERVICES.each { |s| eval "class #{s}; include OpenTox; end" } - # Get OWL-DL representation in RDF/XML format - # @return [application/rdf+xml] RDF/XML representation - def to_rdfxml - s = Serializer::Owl.new - s.add_metadata(@uri,@metadata) - s.to_rdfxml - end +=begin + # Tools def uri_available? url = URI.parse(@uri) - #TODO: move subjectid to header - subjectidstr = @subjectid ? "?subjectid=#{CGI.escape @subjectid}" : "" - Net::HTTP.start(url.host, url.port) do |http| + req = Net::HTTP.new(url.host,url.port) + req['subjectid'] = @subjectid if @subjectid + req.start(url.host, url.port) do |http| return http.head("#{url.request_uri}#{subjectidstr}").code == "200" end end - # create default classes - SERVICES.each { |s| eval "class #{s}; include OpenTox; end" } - module Collection include OpenTox @@ -115,6 +119,7 @@ module OpenTox SERVICES.each { |s| eval "class #{s}; include Collection; end" } end +=end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index efc570d..d541b61 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,3 +1,4 @@ +require 'uri' =begin # class overwrites aka monkey patches # hack: store sinatra instance in global var $url_provider to make url_for and halt methods accessible diff --git a/lib/parser.rb b/lib/parser.rb index 580f6f7..7475d6d 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -1,6 +1,35 @@ #require 'spreadsheet' #require 'roo' +# OWL Namespaces +class OwlNamespace + + attr_accessor :uri + def initialize(uri) + @uri = uri + end + + def [](property) + @uri+property.to_s + end + + def type # for RDF.type + "#{@uri}type" + end + + def method_missing(property) + @uri+property.to_s + end + +end + +RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' +DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' +OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' +OTA = OwlNamespace.new 'http://www.opentox.org/algorithmTypes.owl#' +XSD = OwlNamespace.new 'http://www.w3.org/2001/XMLSchema#' + class String # Split RDF statement into triples diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 3dd3eff..30f04cc 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -1,3 +1,4 @@ +require 'rest-client' module OpenTox class WrapperResult < String diff --git a/test/rest.rb b/test/rest.rb new file mode 100644 index 0000000..576e712 --- /dev/null +++ b/test/rest.rb @@ -0,0 +1,23 @@ +$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) +require 'rubygems' +require 'opentox.rb' +require 'test/unit' + +class RestTest < Test::Unit::TestCase + + def test_post_get_delete + uristring = "http://ot-dev.in-silico.ch/dataset" + uri = uristring + dataset_service = OpenTox::Dataset.new uri + assert_match /#{uristring}/, dataset_service.get + dataset_uri = dataset_service.post + assert_match /#{uristring}/, dataset_uri.to_s + dataset = OpenTox::Dataset.new dataset_uri + assert_equal dataset_uri, dataset.uri + metadata = dataset.metadata + assert_equal RDF::OT.Dataset, metadata[RDF.type] + assert_equal dataset.uri, metadata[RDF::XSD.anyURI] + dataset.delete + end + +end -- cgit v1.2.3