lib/csv2hash.rb in csv2hash-0.0.1 vs lib/csv2hash.rb in csv2hash-0.0.2

- old
+ new

@@ -1,24 +1,73 @@ require 'csv2hash/version' require 'csv2hash/definition' -require 'csv2hash/definition/mapping' require 'csv2hash/validator' +require 'csv2hash/validator/mapping' +require 'csv2hash/validator/collection' require 'csv2hash/parser' +require 'csv2hash/parser/mapping' +require 'csv2hash/parser/collection' +require 'csv2hash/csv_array' +require 'csv' class Csv2hash - include Validator - include Parser - attr_accessor :definition, :data_source, :data + attr_accessor :definition, :file_path, :data, :data_source - def initialize definition, data_source - @definition, @data_source = definition, data_source + def initialize definition, file_path, exception=true + @definition, @file_path = definition, file_path + dynamic_parser_loading + @exception, @errors = exception, [] + dynamic_validator_loading end def parse + load_data_source definition.validate! definition.default! validate_data! - fill! + if valid? + fill! + data + else + csv_with_errors + end + end + + def csv_with_errors + @csv_with_errors ||= begin + CsvArray.new.tap do |rows| + errors.each do |error| + rows << (([data_source[error[:x]][error[:y]]]||[nil]) + [error[:message]]) + end + end.to_csv + end + end + + # protected + + def data_source + @data_source ||= CSV.read @file_path + end + alias_method :load_data_source, :data_source + + private + + def dynamic_validator_loading + case definition.type + when Definition::MAPPING + self.extend Validator::Mapping + when Definition::COLLECTION + self.extend Validator::Collection + end + end + + def dynamic_parser_loading + case definition.type + when Definition::MAPPING + self.extend Parser::Mapping + when Definition::COLLECTION + self.extend Parser::Collection + end end end \ No newline at end of file