bad_request_error substituted with ArgumentError
authorhelma@in-silico.ch <helma@in-silico.ch>
Wed, 14 Nov 2018 16:33:44 +0000 (17:33 +0100)
committerhelma@in-silico.ch <helma@in-silico.ch>
Wed, 14 Nov 2018 16:33:44 +0000 (17:33 +0100)
12 files changed:
lib/crossvalidation.rb
lib/dataset.rb
lib/enm-import.rb [moved from lib/import.rb~ with 100% similarity]
lib/error.rb [deleted file]
lib/lazar.rb
lib/leave-one-out-validation.rb
lib/model.rb
lib/overwrite.rb
lib/rest-client-wrapper.rb
lib/validation-statistics.rb
test/error.rb
test/regression-validation.rb

index c866ebc..8719dca 100644 (file)
@@ -15,7 +15,7 @@ module OpenTox
         $logger.debug model.algorithms
         klass = ClassificationCrossValidation if model.is_a? Model::LazarClassification
         klass = RegressionCrossValidation if model.is_a? Model::LazarRegression
-        bad_request_error "Unknown model class #{model.class}." unless klass
+        raise ArgumentError, "Unknown model class #{model.class}." unless klass
 
         cv = klass.new(
           name: model.name,
index 90b4993..3979105 100644 (file)
@@ -142,7 +142,7 @@ module OpenTox
           dataset = self.new(:source => file, :name => File.basename(file,".*"), :md5 => md5)
           dataset.parse_table table
         else
-          bad_request_error "#{file} is not a valid CSV/TSV file. Could not find "," ";" or TAB as column separator."
+          raise ArgumentError, "#{file} is not a valid CSV/TSV file. Could not find "," ";" or TAB as column separator."
         end
       end
       dataset
@@ -251,7 +251,7 @@ module OpenTox
 
       # features
       feature_names = table.shift.collect{|f| f.strip}
-      bad_request_error "Duplicated features in table header." unless feature_names.size == feature_names.uniq.size
+      raise ArgumentError, "Duplicated features in table header." unless feature_names.size == feature_names.uniq.size
 
       if feature_names[0] =~ /ID/i # check ID column
         original_id = OriginalId.find_or_create_by(:dataset_id => self.id,:name => feature_names.shift)
@@ -260,7 +260,7 @@ module OpenTox
       end
 
       compound_format = feature_names.shift
-      bad_request_error "#{compound_format} is not a supported compound format. Accepted formats: SMILES, InChI." unless compound_format =~ /SMILES|InChI/i
+      raise ArgumentError, "#{compound_format} is not a supported compound format. Accepted formats: SMILES, InChI." unless compound_format =~ /SMILES|InChI/i
       original_smiles = OriginalSmiles.find_or_create_by(:dataset_id => self.id) if compound_format.match(/SMILES/i)
 
       numeric = []
@@ -473,7 +473,7 @@ module OpenTox
           merged_feature = MergedNumericBioActivity.find_or_create_by(:name => features.collect{|f| f.name} + " merged", :original_feature_ids => features.collect{|f| f.id}) # TODO: regression transformations 
         end
       else
-        bad_request_error "Cannot merge features of different types (#{feature_classes})."
+        raise ArgumentError, "Cannot merge features of different types (#{feature_classes})."
       end
 
       accept_values = []
similarity index 100%
rename from lib/import.rb~
rename to lib/enm-import.rb
diff --git a/lib/error.rb b/lib/error.rb
deleted file mode 100644 (file)
index 39b3c76..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-module OpenToxError
-  attr_accessor :http_code, :message, :cause
-  def initialize message=nil
-    message = message.to_s.gsub(/\A"|"\Z/, '') if message # remove quotes
-    super message
-    @http_code ||= 500
-    @message = message.to_s
-    @cause = cut_backtrace(caller)
-    $logger.error("\n"+JSON.pretty_generate({
-      :http_code => @http_code,
-      :message => @message,
-      :cause => @cause
-    })) 
-  end
-  
-  def cut_backtrace(trace)
-    if trace.is_a?(Array)
-      cut_index = trace.find_index{|line| line.match(/sinatra|minitest/)}
-      cut_index ||= trace.size
-      cut_index -= 1
-      cut_index = trace.size-1 if cut_index < 0
-      trace[0..cut_index]
-    else
-      trace
-    end
-  end
-
-end
-
-class RuntimeError
-  include OpenToxError
-end
-
-# clutters log file with library errors 
-#class NoMethodError
-  #include OpenToxError
-#end
-
-module OpenTox
-
-  class Error < RuntimeError
-    include OpenToxError
-    
-    def initialize(code, message=nil)
-      @http_code = code
-      super message
-    end
-  end
-
-  # OpenTox errors
-  RestClientWrapper.known_errors.each do |error|
-    # create error classes 
-    c = Class.new Error do
-      define_method :initialize do |message=nil|
-        super error[:code], message
-      end
-    end
-    OpenTox.const_set error[:class],c
-    
-    # define global methods for raising errors, eg. bad_request_error
-    Object.send(:define_method, error[:method]) do |message|
-      raise c.new(message)
-    end
-  end
-  
-end
index c3bbbf3..a077626 100644 (file)
@@ -77,7 +77,7 @@ CLASSES = ["Feature","Substance","Dataset","CrossValidation","LeaveOneOutValidat
 [ # be aware of the require sequence as it affects class/method overwrites
   "overwrite.rb",
   "rest-client-wrapper.rb", 
-  "error.rb",
+  #"error.rb",
   "opentox.rb",
   "feature.rb",
   "physchem.rb",
index d37b6ce..7d73b89 100644 (file)
@@ -9,7 +9,7 @@ module OpenTox
       # @param [OpenTox::Model::Lazar]
       # @return [OpenTox::Validation::LeaveOneOut]
       def self.create model
-        bad_request_error "Cannot create leave one out validation for models with supervised feature selection. Please use crossvalidation instead." if model.algorithms[:feature_selection]
+        raise ArgumentError, "Cannot create leave one out validation for models with supervised feature selection. Please use crossvalidation instead." if model.algorithms[:feature_selection]
         $logger.debug "#{model.name}: LOO validation started"
         t = Time.now
         model.training_dataset.features.collect{|f| f.class}.include?(NominalBioActivity) ? klass = ClassificationLeaveOneOut : klass = RegressionLeaveOneOut
index db69120..caf8a6e 100644 (file)
@@ -36,7 +36,7 @@ module OpenTox
       #
       # @return [OpenTox::Model::Lazar]
       def self.create prediction_feature:nil, training_dataset:, algorithms:{}
-        bad_request_error "Please provide a training_dataset and a optional prediction_feature." unless prediction_feature or training_dataset
+        raise ArgumentError, "Please provide a training_dataset and a optional prediction_feature." unless prediction_feature or training_dataset
         prediction_feature ||= training_dataset.features.select{|f| f.is_a? NumericBioActivity or f.is_a? NominalBioActivity}.first unless prediction_feature
 
         # guess model type
@@ -62,7 +62,7 @@ module OpenTox
 
         # set defaults#
         substance_classes = training_dataset.substances.collect{|s| s.class.to_s}.uniq
-        bad_request_error "Cannot create models for mixed substance classes '#{substance_classes.join ', '}'." unless substance_classes.size == 1
+        raise ArgumentError, "Cannot create models for mixed substance classes '#{substance_classes.join ', '}'." unless substance_classes.size == 1
 
         if substance_classes.first == "OpenTox::Compound"
 
@@ -110,7 +110,7 @@ module OpenTox
             },
           }
         else
-          bad_request_error "Cannot create models for #{substance_classes.first}."
+          raise ArgumentError, "Cannot create models for #{substance_classes.first}."
         end
         
         # overwrite defaults with explicit parameters
@@ -175,7 +175,7 @@ module OpenTox
           model.descriptor_ids = feature_ids & property_ids
           model.independent_variables = model.descriptor_ids.collect{|i| properties.collect{|p| p[i] ? p[i].median : nil}}
         else
-          bad_request_error "Descriptor method '#{descriptor_method}' not implemented."
+          raise ArgumentError, "Descriptor method '#{descriptor_method}' not implemented."
         end
         
         if model.algorithms[:feature_selection] and model.algorithms[:feature_selection][:method]
@@ -224,7 +224,7 @@ module OpenTox
             end
           end
         else
-          bad_request_error "Unknown descriptor type '#{descriptors}' for similarity method '#{similarity[:method]}'."
+          raise ArgumentError, "Unknown descriptor type '#{descriptors}' for similarity method '#{similarity[:method]}'."
         end
         
         prediction ||= {:warnings => [], :measurements => []}
@@ -300,7 +300,7 @@ module OpenTox
         elsif object.is_a? Dataset
           substances = object.substances
         else 
-          bad_request_error "Please provide a OpenTox::Compound an Array of OpenTox::Substances or an OpenTox::Dataset as parameter."
+          raise ArgumentError, "Please provide a OpenTox::Compound an Array of OpenTox::Substances or an OpenTox::Dataset as parameter."
         end
 
         # make predictions
@@ -486,7 +486,7 @@ module OpenTox
       # @return [OpenTox::Model::Validation] lazar model with five independent 10-fold crossvalidations
       def self.from_csv_file file
         metadata_file = file.sub(/csv$/,"json")
-        bad_request_error "No metadata file #{metadata_file}" unless File.exist? metadata_file
+        raise ArgumentError, "No metadata file #{metadata_file}" unless File.exist? metadata_file
         model_validation = self.new JSON.parse(File.read(metadata_file))
         training_dataset = Dataset.from_csv_file file
         model = Lazar.create training_dataset: training_dataset
@@ -510,7 +510,7 @@ module OpenTox
         unless training_dataset # try to import 
           Import::Enanomapper.import
           training_dataset = Dataset.where(name: "Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles").first
-          bad_request_error "Cannot import 'Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles' dataset" unless training_dataset
+          raise ArgumentError, "Cannot import 'Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles' dataset" unless training_dataset
         end
         prediction_feature ||= Feature.where(name: "log2(Net cell association)", category: "TOX").first
 
index 0dd1c8a..d482902 100644 (file)
@@ -84,7 +84,7 @@ class String
   def to_boolean
     return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
     return false if self == false || self.nil? || self =~ (/(false|f|no|n|0)$/i)
-    bad_request_error "invalid value for Boolean: \"#{self}\""
+    raise ArgumentError, "invalid value for Boolean: \"#{self}\""
   end
 
 end
index c9fd40f..db23e66 100644 (file)
@@ -28,14 +28,14 @@ module OpenTox
 
         uri = Addressable::URI.encode(uri)
         # check input
-        bad_request_error "Headers are not a hash: #{headers.inspect} for #{uri}." unless headers==nil or headers.is_a?(Hash) 
+        raise ArgumentError, "Headers are not a hash: #{headers.inspect} for #{uri}." unless headers==nil or headers.is_a?(Hash) 
         headers[:subjectid] ||= @@subjectid
-        bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri
+        raise ArgumentError, "Invalid URI: '#{uri}'" unless URI.valid? uri
         # make sure that no header parameters are set in the payload
         [:accept,:content_type,:subjectid].each do |header|
           if defined? $aa || URI(uri).host == URI($aa[:uri]).host
           else
-            bad_request_error "#{header} should be submitted in the headers of URI: #{uri}" if payload and payload.is_a?(Hash) and payload[header]
+            raise ArgumentError, "#{header} should be submitted in the headers of URI: #{uri}" if payload and payload.is_a?(Hash) and payload[header]
           end
         end
       
@@ -56,6 +56,7 @@ module OpenTox
         @response = @request.execute do |response, request, result|
           if [301, 302, 307].include? response.code and request.method == :get
             response.follow_redirection(request, result)
+=begin
           elsif response.code >= 400 and !URI.task?(uri)
             error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first
             begin # errors are returned as error reports in json, try to parse
@@ -68,6 +69,7 @@ module OpenTox
               cause = nil
             end
             Object.method(error[:method]).call "#{msg}, #{uri}, #{cause}" # call error method
+=end
           else
             response
           end
@@ -75,6 +77,7 @@ module OpenTox
       end
     end
 
+=begin
     #@return [Array] of hashes with error code, method and class
     def self.known_errors
       errors = []
@@ -88,6 +91,7 @@ module OpenTox
       end
       errors
     end
+=end
 
   end
 end
index ad4c14d..f3e3af8 100644 (file)
@@ -242,7 +242,7 @@ module OpenTox
             title = "log2(Net cell association [mL/ug(Mg)])"
           else
             title = feature.name
-            title += " [#{feature.unit}]" if feature.unit and !feature.unit.blank?
+            title += "-log10(#{feature.unit})" if feature.unit and !feature.unit.blank?
           end
           R.eval "image = qplot(prediction,measurement,main='#{title}',xlab='Prediction',ylab='Measurement',asp=1,xlim=range, ylim=range)"
           R.eval "image = image + geom_abline(intercept=0, slope=1)"
index eeac735..428f63d 100644 (file)
@@ -7,12 +7,6 @@ class ErrorTest < MiniTest::Test
     assert_nil OpenTox::Feature.find(object.id)
   end
 
-  def test_error_methods
-    assert_raises OpenTox::NotFoundError do
-      not_found_error "This is a test"
-    end
-  end
-
   def test_exception
     assert_raises Exception do
       raise Exception.new "Basic Exception"
index 9418df4..afa4278 100644 (file)
@@ -71,7 +71,7 @@ class RegressionValidationTest < MiniTest::Test
       },
     }
     model = Model::Lazar.create training_dataset: dataset, algorithms: algorithms
-    assert_raises OpenTox::BadRequestError do
+    assert_raises ArgumentError do
       loo = RegressionLeaveOneOut.create model
     end
   end