From 4bcbde55aa03aa3c2e1ae9a38b11954e89aeb2ef Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Sun, 19 Apr 2020 16:06:14 +0200 Subject: [PATCH] support csv backend --- lib/frozen_record/backends.rb | 1 + lib/frozen_record/backends/csv.rb | 21 +++++++++++++++++++++ spec/fixtures/employees.csv | 3 +++ spec/frozen_record_spec.rb | 6 +++++- spec/support/employee.rb | 3 +++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 lib/frozen_record/backends/csv.rb create mode 100644 spec/fixtures/employees.csv create mode 100644 spec/support/employee.rb diff --git a/lib/frozen_record/backends.rb b/lib/frozen_record/backends.rb index 7538598..a8ef5ba 100644 --- a/lib/frozen_record/backends.rb +++ b/lib/frozen_record/backends.rb @@ -4,5 +4,6 @@ module FrozenRecord module Backends autoload :Json, 'frozen_record/backends/json' autoload :Yaml, 'frozen_record/backends/yaml' + autoload :Csv, 'frozen_record/backends/csv' end end diff --git a/lib/frozen_record/backends/csv.rb b/lib/frozen_record/backends/csv.rb new file mode 100644 index 0000000..22d1fdd --- /dev/null +++ b/lib/frozen_record/backends/csv.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +require 'csv' + +module FrozenRecord + module Backends + module Csv + extend self + + def filename(model_name) + "#{model_name.underscore.pluralize}.csv" + end + + def load(file_path) + csv_data = File.read(file_path) + CSV.parse(csv_data, headers: true, nil_value: '').map.with_index do |row, index| + row.to_h.merge("position" => index) + end + end + end + end +end diff --git a/spec/fixtures/employees.csv b/spec/fixtures/employees.csv new file mode 100644 index 0000000..d62370b --- /dev/null +++ b/spec/fixtures/employees.csv @@ -0,0 +1,3 @@ +"name","title" +"john doe","Engineer" +"tom doe","Manager" diff --git a/spec/frozen_record_spec.rb b/spec/frozen_record_spec.rb index 6377384..24e6b7e 100644 --- a/spec/frozen_record_spec.rb +++ b/spec/frozen_record_spec.rb @@ -118,11 +118,15 @@ expect(country.capital).to be == 'Ottawa' end - it 'loads records with a custom backend' do + it 'loads records with a custom backend json' do animal = Animal.first expect(animal.name).to be == 'cat' end + it 'loads records with a custom backend csv' do + employee = Employee.first + expect(employee.name).to be == 'john doe' + end end describe '#==' do diff --git a/spec/support/employee.rb b/spec/support/employee.rb new file mode 100644 index 0000000..067c095 --- /dev/null +++ b/spec/support/employee.rb @@ -0,0 +1,3 @@ +class Employee < FrozenRecord::Base + self.backend = FrozenRecord::Backends::Csv +end