csv_to_object 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -24,9 +24,30 @@ Given a file person.csv with the contents
24
24
  `0,Lindsey,Austino`
25
25
  `1,Dodie,Egnor`
26
26
 
27
- `CsvToObject::CsvToObject.new('[path to person.csv]').to_objects` will return
27
+ ```ruby
28
+ csv_path = 'tmp/person.csv'
29
+ CsvToObject::CsvToObject.new(csv.path).to_objects
30
+ [#<Person:0x000001021a8148 @id=0, @first_name="Lindsey", @last_name="Austino">,
31
+ #<Person:0x000001021a8030 @id=1, @first_name="Dodie", @last_name="Egnor">]
32
+ ```
28
33
 
29
- `[#<Person:0x000001021a8148 @id=0, @first_name="Lindsey", @last_name="Austino">, #<Person:0x000001021a8030 @id=1, @first_name="Dodie", @last_name="Egnor">`]
34
+ ### Attribute Names
35
+
36
+ CSV_to_object does not use the default header converter options. When converting the first line of the csv file into attribute names, the following conversions are applied:
37
+
38
+ * Encoded using CSV::CharacterEncoding
39
+ * Downcased
40
+ * Spaces are replaced with underscores
41
+
42
+ When passed to the target object.new() method, attribute names are strings, not symbols. For example, the instantiation of the Person object above would be:
43
+
44
+ ```ruby
45
+ Person.new({"id" => 0, "first_name" => "Lindsey", "last_name" => "Austino"})
46
+ ```
47
+
48
+ So if you are looking for specific hash keys in `initialize()`, use strings not symbols.
49
+
50
+ If this behavior is not desired, you could overwrite the `header_converter` method of `CsvToObject`.
30
51
 
31
52
  ## Contributing
32
53
 
@@ -2,8 +2,8 @@
2
2
  require File.expand_path('../lib/csv_to_object/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Ian Whitney"]
6
- gem.email = ["ian@ianwhitney.com"]
5
+ gem.authors = ["Ian Whitney", "Davin Lagerroos"]
6
+ gem.email = ["iwhitney@ssa-i.org", "dlagerroos@ssa-i.org"]
7
7
  gem.description = %q{Takes a CSV file and returns a a collection of objects generated by that CSV file.}
8
8
  gem.summary = %q{Takes a CSV file and returns a a collection of objects generated by that CSV file.}
9
9
  gem.homepage = "https://github.com/SeniorServiceAmerica/csv_to_object"
@@ -1,3 +1,3 @@
1
1
  module CsvToObject
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/csv_to_object.rb CHANGED
@@ -6,30 +6,36 @@ module CsvToObject
6
6
 
7
7
  # Requires the path to the csv file.
8
8
  def initialize(input_path)
9
- @input = File.open(input_path)
9
+ @input_path = File.open(input_path)
10
10
  end
11
11
 
12
12
  # Converts the data lines of the csv file to objects.
13
13
  # Objects have the class of the name of the csv file.
14
14
  # The first line of the csv file defines the attribute names for the data lines.
15
- #
16
15
  # person.csv => [person objects]
16
+ # attribute names are downcased and have spaces replaced with _.
17
+ # attribute names are strings.
17
18
  def to_objects
18
19
  objects = []
19
- CSV.table(@input).each do |row|
20
+ file = File.open(@input_path)
21
+ CSV.table(file, {header_converters: header_converter}).each do |row|
20
22
  objects << new_object(row.to_hash)
21
23
  end
22
24
  objects
23
25
  end
24
26
 
25
27
  private
26
-
28
+
29
+ def header_converter
30
+ lambda { |h| h.encode(CSV::ConverterEncoding).downcase.gsub(/\s+/, "_") }
31
+ end
32
+
27
33
  def new_object(attrs)
28
34
  @object ? @object.new(attrs) : object_to_create().new(attrs)
29
35
  end
30
36
 
31
37
  def object_to_create()
32
- class_name = File.basename(@input.path).gsub('.csv','').capitalize
38
+ class_name = File.basename(@input_path).gsub('.csv','').capitalize
33
39
  @object = Object::const_get(class_name)
34
40
  end
35
41
  end
@@ -7,6 +7,10 @@ describe CsvToObject do
7
7
  @test_csv_path = 'test/csv/person.csv'
8
8
  @source_file = File.open(@test_csv_path)
9
9
  @c2o = CsvToObject::CsvToObject.new(@test_csv_path)
10
+ @number_of_data_lines = (@source_file.count - 1)
11
+ @source_file.rewind
12
+ @attribute_names = @source_file.first
13
+ @source_file.rewind
10
14
  end
11
15
 
12
16
  it "returns an array" do
@@ -18,11 +22,11 @@ describe CsvToObject do
18
22
  end
19
23
 
20
24
  it "returns as many objects as there are data lines in the csv file" do
21
- @c2o.to_objects.count.should == (@source_file.count - 1)
25
+ @c2o.to_objects.count.should == @number_of_data_lines
22
26
  end
23
27
 
24
28
  it "instantiate objects defined by its source file name, using the data line as parameters" do
25
- expected_paramaters = CSV.table(File.open(@test_csv_path))
29
+ expected_paramaters = CSV.table(File.open(@test_csv_path),{header_converters: lambda { |h| h.encode(CSV::ConverterEncoding).downcase.gsub(/\s+/, "_") }})
26
30
  expected_paramaters.each do |x|
27
31
  @c2o.should_receive(:new_object).with(x.to_hash)
28
32
  end
@@ -31,7 +35,20 @@ describe CsvToObject do
31
35
 
32
36
  it "should use the data line to populate attributes" do
33
37
  @c2o.to_objects.first.id.should == 0
34
- @c2o.to_objects.first.first_name.should == "Lindsey"
38
+ @c2o.to_objects.first.first_name.should == "Billie Lindsey"
35
39
  @c2o.to_objects.first.last_name.should == "Austino"
36
40
  end
41
+
42
+ it "replaces spaces in attribute names with underscores" do
43
+ @attribute_names.include?('last name').should == true
44
+ @c2o.should_receive(:new_object).with(include_key('last_name')).exactly(@number_of_data_lines).times
45
+ @c2o.to_objects
46
+ end
47
+
48
+ it "downcases attribute names and does not remove non-word characters" do
49
+ @attribute_names.include?('SCORE_[person_id|date]').should == true
50
+ @c2o.should_receive(:new_object).with(include_key('score_[person_id|date]')).exactly(@number_of_data_lines).times
51
+ @c2o.to_objects
52
+ end
53
+
37
54
  end
data/spec/spec_helper.rb CHANGED
@@ -17,3 +17,9 @@ RSpec.configure do |config|
17
17
  # --seed 1234
18
18
  config.order = 'random'
19
19
  end
20
+
21
+ RSpec::Matchers.define :include_key do |expected|
22
+ match do |actual|
23
+ actual.keys.include?(expected)
24
+ end
25
+ end
data/test/csv/person.csv CHANGED
@@ -1,11 +1,11 @@
1
- id,first_name,last_name
2
- 0,Lindsey,Austino
3
- 1,Dodie,Egnor
4
- 2,Tommie,Mclauglin
5
- 3,Aletha,Vettel
6
- 4,Matilda,Osornio
7
- 5,Robby,Kloke
8
- 6,Forest,Neall
9
- 7,Sherrie,Licon
10
- 8,Elroy,Bergren
11
- 9,Darlene,Guialdo
1
+ id,first_name,last name,SCORE_[person_id|date]
2
+ 0,Billie Lindsey,Austino,[0|2012-01-01]
3
+ 1,Dodie,Egnor,[0|2012-01-01]
4
+ 2,Tommie,Mclauglin,[0|2012-01-01]
5
+ 3,Aletha,Vettel,[0|2012-01-01]
6
+ 4,Matilda,Osornio,[0|2012-01-01]
7
+ 5,Robby,Kloke,[0|2012-01-01]
8
+ 6,Forest,Neall,[0|2012-01-01]
9
+ 7,Sherrie,Licon,[0|2012-01-01]
10
+ 8,Elroy,Bergren,[0|2012-01-01]
11
+ 9,Darlene,Guialdo,[0|2012-01-01]
data/test/lib/person.rb CHANGED
@@ -2,8 +2,8 @@ class Person
2
2
  attr_reader :id, :first_name, :last_name
3
3
 
4
4
  def initialize(args={})
5
- @id = args[:id]
6
- @first_name = args[:first_name]
7
- @last_name = args[:last_name]
5
+ @id = args["id"]
6
+ @first_name = args["first_name"]
7
+ @last_name = args["last_name"]
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,19 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_to_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ian Whitney
9
+ - Davin Lagerroos
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-08-27 00:00:00.000000000Z
13
+ date: 2012-08-31 00:00:00.000000000Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rspec
16
- requirement: &2168815940 !ruby/object:Gem::Requirement
17
+ requirement: &2164666320 !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ! '>='
@@ -21,11 +22,12 @@ dependencies:
21
22
  version: '0'
22
23
  type: :development
23
24
  prerelease: false
24
- version_requirements: *2168815940
25
+ version_requirements: *2164666320
25
26
  description: Takes a CSV file and returns a a collection of objects generated by that
26
27
  CSV file.
27
28
  email:
28
- - ian@ianwhitney.com
29
+ - iwhitney@ssa-i.org
30
+ - dlagerroos@ssa-i.org
29
31
  executables: []
30
32
  extensions: []
31
33
  extra_rdoc_files: []