lib/quandl/client/models/dataset/validations.rb in quandl_client-2.10.2 vs lib/quandl/client/models/dataset/validations.rb in quandl_client-2.11.0

- old
+ new

@@ -1,133 +1,133 @@ class Quandl::Client::Dataset -module Validations - - extend ActiveSupport::Concern - - included do - - validates :code, presence: true, format: { with: Quandl::Pattern.code, message: "is invalid. Expected format: #{Quandl::Pattern.code.to_example}" } - validates :display_url, allow_blank: true, url: true - validate :data_should_be_valid! - validate :dataset_data_should_be_valid! - validate :data_row_count_should_match_column_count! - validate :data_columns_should_not_exceed_column_names! - validate :data_rows_should_have_equal_columns! - validate :ambiguous_code_requires_source_code! - - validate :source_code_should_exist! - - before_save :enforce_required_formats - after_save :save_dataset_data - - end - - def data_should_be_valid! - if data? && !data.valid? - data.errors.each{|k,v| self.errors.add( k,v ) } - return false + module Validations + + extend ActiveSupport::Concern + + included do + + validates :code, presence: true, format: { with: Quandl::Pattern.code, message: "is invalid. Expected format: #{Quandl::Pattern.code.to_example}" } + validates :display_url, allow_blank: true, url: true + validate :data_should_be_valid! + validate :dataset_data_should_be_valid! + validate :data_row_count_should_match_column_count! + validate :data_columns_should_not_exceed_column_names! + validate :data_rows_should_have_equal_columns! + validate :ambiguous_code_requires_source_code! + + validate :source_code_should_exist! + + before_save :enforce_required_formats + after_save :save_dataset_data + end - true - end - - def dataset_data_should_be_valid! - if dataset_data? && !dataset_data.valid? - dataset_data.errors.each{|k,v| self.errors.add( k,v ) } - return false + + def data_should_be_valid! + if data? && !data.valid? + data.errors.each{|k,v| self.errors.add( k,v ) } + return false + end + true end - true - end - - def source_code_should_exist! - if source_code.present? - Quandl::Client::Source.cached[source_code] = Quandl::Client::Source.find(source_code) unless Quandl::Client::Source.cached.has_key?(source_code) - source = Quandl::Client::Source.cached[source_code] - self.errors.add( :source_code, "Could not find a source with the source_code '#{source_code}'" ) if source.blank? || source.code.blank? - return false + + def dataset_data_should_be_valid! + if dataset_data? && !dataset_data.valid? + dataset_data.errors.each{|k,v| self.errors.add( k,v ) } + return false + end + true end - true - end - - def ambiguous_code_requires_source_code! - if code.to_s.numeric? && source_code.blank? - message = %Q{Pure numerical codes like "#{code}" are not allowed unless you include a source code. Do this:\nsource_code: <USERNAME>\ncode: #{code}} - self.errors.add( :data, message ) - return false + + def source_code_should_exist! + if source_code.present? + Quandl::Client::Source.cached[source_code] = Quandl::Client::Source.find(source_code) unless Quandl::Client::Source.cached.has_key?(source_code) + source = Quandl::Client::Source.cached[source_code] + self.errors.add( :source_code, "Could not find a source with the source_code '#{source_code}'" ) if source.blank? || source.code.blank? + return false + end + true end - true - end - - def data_columns_should_not_exceed_column_names! - if errors.size == 0 && data? && data.present? && column_names.present? && data.first.count != column_names.count - self.errors.add( :data, "You may not change the number of columns in a dataset. This dataset has #{column_names.count} columns but you tried to send #{data.first.count} columns." ) - return false + + def ambiguous_code_requires_source_code! + if code.to_s.numeric? && source_code.blank? + message = %Q{Pure numerical codes like "#{code}" are not allowed unless you include a source code. Do this:\nsource_code: <USERNAME>\ncode: #{code}} + self.errors.add( :data, message ) + return false + end + true end - true - end - - def data_rows_should_have_equal_columns! - # skip validation unless data is present - return true unless data? && data.present? - # use first row as expected column count - column_count = data[0].count - # check each row - data.each_with_index do |row, index| - # the row is valid if it's count matches the first row's count - next if row.count == column_count - # the row is invalid if the count is mismatched - self.errors.add( :data, "Unexpected number of points in this row:\n#{row.join(',')}\nFound #{row.size-1} but expected #{data[0].size-1} based on precedent from the first row (#{data[0].join(',')})" ) - # return validation failure - return false + + def data_columns_should_not_exceed_column_names! + if errors.size == 0 && data? && data.present? && column_names.present? && data.first.count != column_names.count + self.errors.add( :data, "You may not change the number of columns in a dataset. This dataset has #{column_names.count} columns but you tried to send #{data.first.count} columns." ) + return false + end + true end - true - end - - def data_row_count_should_match_column_count! - # skip validation unless data and column_names present - return true unless data? && data.present? && column_names.present? - # count the number of expected columns - column_count = column_names.count - # check each row - data.each_with_index do |row, index| - # the row is valid if it's count matches the first row's count - next if row.count == column_count - # the row is invalid if the count is mismatched - self.errors.add( :data, "Unexpected number of points in this row:\n#{row.join(',')}\nFound #{row.size-1} but expected #{column_names.count-1} based on precedent from the header row (#{column_names.join(',')})" ) - # return validation failure - return false + + def data_rows_should_have_equal_columns! + # skip validation unless data is present + return true unless data? && data.present? + # use first row as expected column count + column_count = data[0].count + # check each row + data.each_with_index do |row, index| + # the row is valid if it's count matches the first row's count + next if row.count == column_count + # the row is invalid if the count is mismatched + self.errors.add( :data, "Unexpected number of points in this row:\n#{row.join(',')}\nFound #{row.size-1} but expected #{data[0].size-1} based on precedent from the first row (#{data[0].join(',')})" ) + # return validation failure + return false + end + true end - true - end - - def save_dataset_data - return if (!saved? && id.blank?) - return if !data? || data.blank? - dataset_data.id = id - dataset_data.data = benchmark('data.to_csv'){ data.to_csv } - benchmark('dataset_data.save'){ dataset_data.save } - # update dataset's attributes with dataset_data's attributes - attributes.each{|k,v| attributes[k] = dataset_data.attributes[k] if dataset_data.attributes.has_key?(k) } - # update dataset errors with dataset_data - @metadata[:status] = dataset_data.status unless dataset_data.saved? - # inherit_errors(dataset_data) unless dataset_data.saved? - end - - - def inherit_errors(object) - return unless object.respond_to?(:response_errors) && object.response_errors.respond_to?(:each) - object.response_errors.each do |key, messages| - if messages.respond_to?(:each) - messages.each{|message| errors.add(key, message) } + + def data_row_count_should_match_column_count! + # skip validation unless data and column_names present + return true unless data? && data.present? && column_names.present? + # count the number of expected columns + column_count = column_names.count + # check each row + data.each_with_index do |row, index| + # the row is valid if it's count matches the first row's count + next if row.count == column_count + # the row is invalid if the count is mismatched + self.errors.add( :data, "Unexpected number of points in this row:\n#{row.join(',')}\nFound #{row.size-1} but expected #{column_names.count-1} based on precedent from the header row (#{column_names.join(',')})" ) + # return validation failure + return false end + true end - @metadata[:status] = object.status - object + + def save_dataset_data + return if (!saved? && id.blank?) + return if !data? || data.blank? + dataset_data.id = id + dataset_data.data = benchmark('data.to_csv'){ data.to_csv } + benchmark('dataset_data.save'){ dataset_data.save } + # update dataset's attributes with dataset_data's attributes + attributes.each{|k,v| attributes[k] = dataset_data.attributes[k] if dataset_data.attributes.has_key?(k) } + # update dataset errors with dataset_data + @metadata[:status] = dataset_data.status unless dataset_data.saved? + # inherit_errors(dataset_data) unless dataset_data.saved? + end + + + def inherit_errors(object) + return unless object.respond_to?(:response_errors) && object.response_errors.respond_to?(:each) + object.response_errors.each do |key, messages| + if messages.respond_to?(:each) + messages.each{|message| errors.add(key, message) } + end + end + @metadata[:status] = object.status + object + end + + def enforce_required_formats + self.source_code = self.source_code.to_s.upcase + self.code = self.code.to_s.upcase + self.locations_attributes = locations_attributes.to_json if locations_attributes.respond_to?(:to_json) && !locations_attributes.kind_of?(String) + end + end - - def enforce_required_formats - self.source_code = self.source_code.to_s.upcase - self.code = self.code.to_s.upcase - self.locations_attributes = locations_attributes.to_json if locations_attributes.respond_to?(:to_json) && !locations_attributes.kind_of?(String) - end - end -end \ No newline at end of file