opentox-client 0.0.2pre → 1.0.0pre1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
+ Gemfile.lock
1
2
  *.gem
2
3
  .bundle
3
- Gemfile.lock
4
4
  pkg/*
5
+ *~
@@ -0,0 +1,2 @@
1
+ v0.0.3 2012-05-07
2
+ * switch from v0.0.2pre to v0.0.3
@@ -1,8 +1,23 @@
1
- opentox-ruby-minimal
1
+ opentox-client
2
2
  ====================
3
3
 
4
4
  Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API
5
5
 
6
+ Libraries:
7
+
8
+ * {OpenTox::Algorithm} Wrapper for OpenTox Algorithms
9
+ * {OpenTox::Authorization} Authorization and Authentication
10
+ * {OpenTox::Compound} Compound Library
11
+ * {OpenTox::Dataset} Dataset Library
12
+ * {OpenTox::Error} extends Exception class according the OpenTox API
13
+ * {OpenTox::Model} Model Library
14
+ * {OpenTox} OpenTox Library - general definition of OpenTox objects
15
+ * {OTLogger} OpenTox Logger Extensions
16
+ * {OpenTox::Policies} parse and serialize XML for the openSSO A&A server
17
+ * {OpenTox::RestClientWrapper} wrapper for the RestClient gem
18
+ * {OpenTox::Task} Task Library
19
+
20
+
6
21
  Dependencies
7
22
  ------------
8
23
 
data/Rakefile CHANGED
@@ -1,11 +1 @@
1
- require File.join(File.dirname(__FILE__),"lib","opentox-client.rb")
2
1
  require "bundler/gem_tasks"
3
- require 'rake/testtask'
4
-
5
- Rake::TestTask.new do |t|
6
- t.libs << 'lib'
7
- t.libs << 'test'
8
- t.test_files = FileList['test/*.rb']
9
- t.verbose = true
10
- end
11
-
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0pre1
@@ -0,0 +1,46 @@
1
+ #!/bin/sh
2
+
3
+ # Installs Opentox Webservice.
4
+ # Author: Christoph Helma, Andreas Maunz.
5
+
6
+ SELF=$(basename $0 -install)
7
+ [ "`id -u`" = "0" ] && echo "This script must be run as non-root." 1>&2 && exit 1
8
+
9
+ # Adjust ruby version here!
10
+ RUBY_NUM_VER="1.9.3-p194"
11
+
12
+ echo
13
+ echo "Welcome to service installation (<Return> to continue)."
14
+ read delete_me
15
+
16
+
17
+ # check wd is root of service
18
+ DIR=`pwd`
19
+ if echo $DIR | grep "$SELF/bin" >/dev/null 2>&1 ; then cd ..; fi
20
+
21
+ # # # Boot the script
22
+
23
+ # load base config, helper funs, environment
24
+ OT_CONFIG_DIR="$HOME/.opentox"
25
+ ! [ -f "$OT_CONFIG_DIR/config/install/config.sh" ] && echo "config.sh not found." 1>&2 && exit 1 || . $OT_CONFIG_DIR/config/install/config.sh
26
+ ! [ -f "$OT_PREFIX/install/utils.sh" ] && echo "utils.sh not found." 1>&2 && exit 1 || . $OT_PREFIX/install/utils.sh
27
+ [ -f $OT_CONFIG_DIR/opentox-ui.sh ] && . $OT_CONFIG_DIR/opentox-ui.sh # should have been done by user already
28
+ RUBY_DIR="$HOME/.rbenv/versions/$RUBY_NUM_VER"
29
+
30
+
31
+ # # # Install
32
+
33
+ check_utils "rbenv find"
34
+ check_log $SELF
35
+
36
+ # ruby
37
+ install_ruby
38
+
39
+ # self
40
+ echo
41
+ install_with_bundler
42
+
43
+ notify
44
+
45
+ # return to wd
46
+ cd "$DIR"
@@ -5,7 +5,7 @@ module OpenTox
5
5
  #@example Authentication
6
6
  # require "opentox-client"
7
7
  # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml
8
- # token = OpenTox::Authorization.authenticate("username", "password")
8
+ # subjectid = OpenTox::Authorization.authenticate("username", "password")
9
9
  #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification
10
10
 
11
11
  module Authorization
@@ -65,6 +65,7 @@ module OpenTox
65
65
  out = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw}).sub("token.id=","").sub("\n","")
66
66
  return out
67
67
  rescue
68
+ resource_not_found_error "#{out.inspect}"
68
69
  return nil
69
70
  end
70
71
  end
@@ -87,11 +88,12 @@ module OpenTox
87
88
  # @return [Boolean, nil] returns true, false or nil (if authorization-request fails).
88
89
  def self.authorize(uri, action, subjectid)
89
90
  return true if !AA
90
- begin
91
- return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n"
92
- rescue
93
- return nil
94
- end
91
+ #begin
92
+ return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n"
93
+ return false
94
+ #rescue
95
+ # return nil
96
+ #end
95
97
  end
96
98
 
97
99
  #Checks if a token is a valid token
@@ -101,7 +103,7 @@ module OpenTox
101
103
  return true if !AA
102
104
  begin
103
105
  return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n"
104
- rescue
106
+ rescue #do rescue because openSSO throws 401
105
107
  return false
106
108
  end
107
109
  return false
@@ -11,6 +11,7 @@ module OpenTox
11
11
  # @param [String] smiles Smiles string
12
12
  # @return [OpenTox::Compound] Compound
13
13
  def self.from_smiles service_uri, smiles, subjectid=nil
14
+ @smiles = smiles
14
15
  Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid})
15
16
  end
16
17
 
@@ -18,6 +19,7 @@ module OpenTox
18
19
  # @param [String] smiles InChI string
19
20
  # @return [OpenTox::Compound] Compound
20
21
  def self.from_inchi service_uri, inchi, subjectid=nil
22
+ @inchi = inchi
21
23
  Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid})
22
24
  end
23
25
 
@@ -33,60 +35,78 @@ module OpenTox
33
35
  # compound = OpenTox::Compound.from_name("Benzene")
34
36
  # @param [String] name name can be also an InChI/InChiKey, CAS number, etc
35
37
  # @return [OpenTox::Compound] Compound
38
+ #
36
39
  def self.from_name service_uri, name, subjectid=nil
37
- Compound.new RestClientWrapper.post(service_uri, name, {:content_type => 'text/plain', :subjectid => subjectid})
40
+ @inchi = RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi")
41
+ Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid})
38
42
  end
39
43
 
40
44
  # Get InChI
41
45
  # @return [String] InChI string
42
- def to_inchi
43
- get(:accept => 'chemical/x-inchi').to_s.chomp if @uri
46
+ def inchi
47
+ @inchi ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchi'}).chomp
48
+ end
49
+
50
+ # Get InChIKey
51
+ # @return [String] InChI string
52
+ def inchikey
53
+ @inchikey ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchikey'}).chomp
44
54
  end
45
55
 
46
56
  # Get (canonical) smiles
47
57
  # @return [String] Smiles string
48
- def to_smiles
49
- get(:accept => 'chemical/x-daylight-smiles').chomp
58
+ def smiles
59
+ @smiles ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-daylight-smiles'}).chomp
50
60
  end
51
61
 
52
62
  # Get sdf
53
63
  # @return [String] SDF string
54
- def to_sdf
55
- get(:accept => 'chemical/x-mdl-sdfile').chomp
64
+ def sdf
65
+ RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-mdl-sdfile'}).chomp
56
66
  end
57
67
 
58
68
  # Get gif image
59
69
  # @return [image/gif] Image data
60
- def to_gif
61
- get("#{CACTUS_URI}#{to_inchi}/image")
70
+ def gif
71
+ RestClientWrapper.get File.join(CACTUS_URI,inchi,"image")
62
72
  end
63
73
 
64
74
  # Get png image
65
75
  # @example
66
- # image = compound.to_png
76
+ # image = compound.png
67
77
  # @return [image/png] Image data
68
- def to_png
69
- get(File.join @uri, "image")
78
+ def png
79
+ RestClientWrapper.get(File.join @uri, "image")
70
80
  end
71
81
 
72
82
  # Get URI of compound image
73
83
  # @return [String] Compound image URI
74
- def to_image_uri
84
+ def image_uri
75
85
  File.join @uri, "image"
76
86
  end
77
87
 
78
88
  # Get all known compound names. Relies on an external service for name lookups.
79
89
  # @example
80
- # names = compound.to_names
90
+ # names = compound.names
81
91
  # @return [String] Compound names
82
- def to_names
83
- begin
84
- get("#{CACTUS_URI}#{to_inchi}/names").split("\n")
85
- rescue
86
- "not available"
87
- end
92
+ def names
93
+ RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n")
88
94
  end
89
95
 
96
+ def cid
97
+ pug_uri = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/"
98
+ @cid ||= RestClientWrapper.post(File.join(pug_uri, "compound", "inchi", "cids", "TXT"),{:inchi => inchi}).strip
99
+ end
100
+
101
+ def chebi
102
+ end
103
+
104
+ def chemblid
105
+ # https://www.ebi.ac.uk/chembldb/ws#individualCompoundByInChiKey
106
+ uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json"
107
+ @chemblid = JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"]
108
+ end
109
+
90
110
  =begin
91
111
  # Match a smarts string
92
112
  # @example
@@ -3,27 +3,137 @@ module OpenTox
3
3
  # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset).
4
4
  class Dataset
5
5
 
6
- def data_entries
7
- # TODO fix for api 1.2
8
- data_entries = []
9
- pull
10
- @reload = false
11
- metadata[RDF::OT1.dataEntry].collect{|data_entry|
12
- data_entries << @rdf.to_hash[data_entry]
13
- }
14
- @reload = true
15
- data_entries
6
+ attr_accessor :features, :compounds, :data_entries
7
+
8
+ def initialize uri=nil, subjectid=nil
9
+ super uri, subjectid
10
+ @features = []
11
+ @compounds = []
12
+ @data_entries = []
13
+ append RDF.type, RDF::OT.OrderedDataset
14
+ end
15
+
16
+ def upload filename, wait=true
17
+ uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid})
18
+ OpenTox::Task.new(uri).wait if URI.task?(uri) and wait
19
+ end
20
+
21
+ def to_csv
22
+ CSV.generate do |csv|
23
+ csv << ["SMILES"] + @features.collect{|f| f.title}
24
+ @compounds.each_with_index do |c,i|
25
+ csv << [c.smiles] + @data_entries[i]
26
+ end
27
+ end
16
28
  end
17
29
 
18
- def compounds
19
- uri = File.join(@uri,"compounds")
20
- RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").collect{|uri| OpenTox::Compound.new uri}
30
+ def get
31
+ super
32
+ @features = []
33
+ @compounds = []
34
+ @data_entries = []
35
+ query = RDF::Query.new do
36
+ pattern [:uri, RDF.type, RDF::OT.OrderedDataset]
37
+ end
38
+ if query.execute(@rdf).first # ordered dataset
39
+ query = RDF::Query.new do
40
+ pattern [:uri, RDF.type, RDF::OT.Compound]
41
+ pattern [:uri, RDF::OLO.index, :idx]
42
+ end
43
+ @compounds = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new s.uri.to_s}
44
+ query = RDF::Query.new do
45
+ pattern [:uri, RDF.type, RDF::OT.Feature]
46
+ pattern [:uri, RDF::OLO.index, :idx]
47
+ end
48
+ @features = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)}
49
+ numeric_features = @features.collect{|f| f.get; f[RDF.type].include? RDF::OT.NumericFeature}
50
+ @compounds.each_with_index do |compound,i|
51
+ query = RDF::Query.new do
52
+ pattern [:data_entry, RDF::OLO.index, i]
53
+ pattern [:data_entry, RDF::OT.values, :values]
54
+ pattern [:values, RDF::OT.feature, :feature]
55
+ pattern [:feature, RDF::OLO.index, :feature_idx]
56
+ pattern [:values, RDF::OT.value, :value]
57
+ end
58
+ values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s|
59
+ (numeric_features[s.feature_idx] and s.value.to_s != "") ? s.value.to_s.to_f : s.value.to_s
60
+ end
61
+ @data_entries << values.collect{|v| v == "" ? nil : v}
62
+ end
63
+ else
64
+ query = RDF::Query.new do
65
+ pattern [:uri, RDF.type, RDF::OT.Feature]
66
+ end
67
+ @features = query.execute(@rdf).collect{|s| OpenTox::Feature.new(s.uri.to_s)}
68
+ query = RDF::Query.new do
69
+ pattern [:data_entry, RDF::OT.compound, :compound]
70
+ end
71
+ @compounds = query.execute(@rdf).sort_by{|s| s.data_entry}.collect{|s| OpenTox::Compound.new s.compound.to_s}
72
+ numeric_features = @features.collect{|f| f.get; f[RDF.type].include? RDF::OT.NumericFeature}
73
+ @compounds.each do |compound|
74
+ values = []
75
+ @features.each_with_index do |feature,i|
76
+ query = RDF::Query.new do
77
+ pattern [:data_entry, RDF::OT.compound, RDF::URI.new(compound.uri)]
78
+ pattern [:data_entry, RDF::OT.values, :values]
79
+ pattern [:values, RDF::OT.feature, RDF::URI.new(feature.uri)]
80
+ pattern [:values, RDF::OT.value, :value]
81
+ end
82
+ value = query.execute(@rdf).first.value.to_s
83
+ value = value.to_f if numeric_features[i] and !value.nil?
84
+ values << value
85
+ end
86
+ @data_entries << values
87
+ end
88
+ end
21
89
  end
22
90
 
23
- def features
24
- uri = File.join(@uri,"features")
25
- RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").collect{|uri| OpenTox::Feature.new uri}
91
+ def get_metadata
92
+ uri = File.join(@uri,"metadata")
93
+ begin
94
+ parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain", :subjectid => @subjectid})
95
+ rescue # fall back to rdfxml
96
+ parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid})
97
+ end
98
+ metadata
26
99
  end
27
100
 
101
+ def << data_entry
102
+ compound = data_entry.shift
103
+ bad_request_error "Dataset features are empty." unless features
104
+ bad_request_error "data_entry size does not match features size." unless data_entry.size == features.size
105
+ bad_request_error "First data_entry is not a OpenTox::Compound" unless compound.class == OpenTox::Compound
106
+ @compounds << compound
107
+ @data_entries << data_entry
108
+ end
109
+
110
+ RDF_FORMATS.each do |format|
111
+
112
+ # redefine rdf serialization methods
113
+ send :define_method, "to_#{format}".to_sym do
114
+ # TODO: check, might affect appending to unordered datasets
115
+ features.each_with_index do |feature,i|
116
+ @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)]
117
+ @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)]
118
+ end
119
+ compounds.each_with_index do |compound,i|
120
+ @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Compound)]
121
+ @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)]
122
+ data_entry_node = RDF::Node.new
123
+ @rdf << [RDF::URI.new(@uri), RDF::URI.new(RDF::OT.dataEntry), data_entry_node]
124
+ @rdf << [data_entry_node, RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.DataEntry)]
125
+ @rdf << [data_entry_node, RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)]
126
+ @rdf << [data_entry_node, RDF::URI.new(RDF::OT.compound), RDF::URI.new(compound.uri)]
127
+ data_entries[i].each_with_index do |value,j|
128
+ value_node = RDF::Node.new
129
+ @rdf << [data_entry_node, RDF::URI.new(RDF::OT.values), value_node]
130
+ @rdf << [value_node, RDF::URI.new(RDF::OT.feature), RDF::URI.new(@features[j].uri)]
131
+ @rdf << [value_node, RDF::URI.new(RDF::OT.value), RDF::Literal.new(value)]
132
+ end
133
+ end
134
+ super()
135
+ end
136
+
137
+ end
28
138
  end
29
139
  end
@@ -5,20 +5,51 @@ class RuntimeError
5
5
  attr_accessor :http_code, :uri
6
6
  def initialize message, uri=nil
7
7
  super message
8
- @uri = uri
8
+ @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri
9
9
  @http_code ||= 500
10
- $logger.error "\n"+self.report.to_turtle
10
+ @rdf = RDF::Graph.new
11
+ subject = RDF::Node.new
12
+ @rdf << [subject, RDF.type, RDF::OT.ErrorReport]
13
+ @rdf << [subject, RDF::OT.actor, @uri]
14
+ @rdf << [subject, RDF::OT.message, message.to_s]
15
+ @rdf << [subject, RDF::OT.statusCode, @http_code]
16
+ @rdf << [subject, RDF::OT.errorCode, self.class.to_s]
17
+ @rdf << [subject, RDF::OT.errorCause, short_backtrace]
18
+ $logger.error("\n"+self.to_turtle)
11
19
  end
12
20
 
13
- def report
14
- # TODO: remove kludge for old task services
15
- OpenTox::ErrorReport.new(@http_code, self)
21
+ def short_backtrace
22
+ backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact
23
+ cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/}
24
+ cut_index ||= backtrace.size
25
+ cut_index -= 1
26
+ cut_index = backtrace.size-1 if cut_index < 0
27
+ backtrace[0..cut_index].join("\n")
16
28
  end
29
+
30
+ RDF_FORMATS.each do |format|
31
+ # rdf serialization methods for all formats e.g. to_rdfxml
32
+ send :define_method, "to_#{format}".to_sym do
33
+ RDF::Writer.for(format).buffer do |writer|
34
+ @rdf.each{|statement| writer << statement}
35
+ end
36
+ end
37
+ end
38
+
39
+ def to_turtle # redefine to use prefixes (not supported by RDF::Writer)
40
+ prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"}
41
+ ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") }
42
+ RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer|
43
+ @rdf.each{|statement| writer << statement}
44
+ end
45
+ end
46
+
17
47
  end
18
48
 
19
49
  module OpenTox
20
50
 
21
51
  class Error < RuntimeError
52
+
22
53
  def initialize code, message, uri=nil
23
54
  @http_code = code
24
55
  super message, uri
@@ -26,92 +57,19 @@ module OpenTox
26
57
  end
27
58
 
28
59
  # OpenTox errors
29
- {
30
- "BadRequestError" => 400,
31
- "NotAuthorizedError" => 401,
32
- "NotFoundError" => 404,
33
- "LockedError" => 423,
34
- "InternalServerError" => 500,
35
- "NotImplementedError" => 501,
36
- "ServiceUnavailableError" => 503,
37
- "TimeOutError" => 504,
38
- }.each do |klass,code|
60
+ RestClientWrapper.known_errors.each do |error|
39
61
  # create error classes
40
62
  c = Class.new Error do
41
63
  define_method :initialize do |message, uri=nil|
42
- super code, message, uri
64
+ super error[:code], message, uri
43
65
  end
44
66
  end
45
- OpenTox.const_set klass,c
67
+ OpenTox.const_set error[:class],c
46
68
 
47
69
  # define global methods for raising errors, eg. bad_request_error
48
- Object.send(:define_method, klass.underscore.to_sym) do |message,uri=nil|
49
- raise c, message, uri
70
+ Object.send(:define_method, error[:method]) do |message,uri=nil|
71
+ raise c.new(message, uri)
50
72
  end
51
73
  end
52
74
 
53
- # Errors received from RestClientWrapper calls
54
- class RestCallError < Error
55
- attr_accessor :request#, :response
56
- def initialize message, request, uri
57
- #def initialize request, response, message
58
- @request = request
59
- #@response = response
60
- super 502, message, uri
61
- end
62
- end
63
-
64
- # TODO: create reports directly from errors, requires modified task service
65
- class ErrorReport
66
- def initialize http_code, error
67
- @http_code = http_code
68
- @report = {}
69
- @report[RDF::OT.actor] = error.uri.to_s
70
- @report[RDF::OT.message] = error.message.to_s
71
- @report[RDF::OT.statusCode] = @http_code
72
- @report[RDF::OT.errorCode] = error.class.to_s
73
-
74
- # cut backtrace
75
- backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact
76
- cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/}
77
- cut_index ||= backtrace.size
78
- cut_index -= 1
79
- cut_index = backtrace.size-1 if cut_index < 0
80
- @report[RDF::OT.errorDetails] = backtrace[0..cut_index].join("\n")
81
- @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request
82
- #@report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response
83
- # TODO fix Error cause
84
- # should point to another errorReport, but errorReports do not have URIs
85
- # create a separate service?
86
- #report[RDF::OT.errorCause] = @report if defined?(@report)
87
- end
88
-
89
- # define to_ and self.from_ methods for various rdf formats
90
- RDF_FORMATS.each do |format|
91
-
92
- send :define_method, "to_#{format}".to_sym do
93
- rdf = RDF::Writer.for(format).buffer do |writer|
94
- # TODO: not used for turtle
95
- # http://rdf.rubyforge.org/RDF/Writer.html#
96
- writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#')
97
- writer.prefix :ot1_1, RDF::URI('http://www.opentox.org/api/1.1#')
98
- subject = RDF::Node.new
99
- @report.each do |predicate,object|
100
- writer << [subject, predicate, object] if object
101
- end
102
- end
103
- rdf
104
- end
105
-
106
- =begin
107
- define_singleton_method "from_#{format}".to_sym do |rdf|
108
- report = ErrorReport.new
109
- RDF::Reader.for(format).new(rdf) do |reader|
110
- reader.each_statement{ |statement| report.rdf << statement }
111
- end
112
- report
113
- end
114
- =end
115
- end
116
- end
117
75
  end