act_as_importable 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ActAsImportable
2
2
 
3
- Helps you easily import records from a CSV file.
3
+ Helps you easily import records from a CSV file or an array of hashes.
4
4
 
5
5
  ## Installation
6
6
 
@@ -22,7 +22,38 @@ Or install it yourself as:
22
22
  class User < ActiveRecord::Base
23
23
  act_as_importable
24
24
  end
25
+
26
+ User.import_csv_file('/path/to/file.csv')
27
+ # or
28
+ User.import_csv_text(csv_text)
29
+ # or
30
+ User.import_data(array_of_hashes)
31
+ ```
32
+
33
+ ## CSV File Format
34
+
35
+ The importer will automatically map the column headers to the attributes of the model.
36
+
37
+ ###Example:
38
+ ```
39
+ first_name,last_name,email
40
+ John,Smith,j.smith@gmail.com
41
+ ```
42
+
43
+ This will create a new User called John Smith with the email address j.smith@gmail.com.
44
+
45
+ ## Updating existing records
46
+
47
+ You can specify a unique field that will be used to find existing records.
48
+
49
+ ###Example:
25
50
  ```
51
+ User.import_csv_file('/path/to/file.csv', :uid => :email)
52
+ ```
53
+
54
+ This will find an existing record with a matching email address and update their name.
55
+ If no record exists it will create a new one.
56
+
26
57
 
27
58
  ## Test
28
59
 
@@ -8,7 +8,7 @@ module ActAsImportable
8
8
  module ClassMethods
9
9
 
10
10
  def import_csv_file(file, options = {})
11
- import_csv_text(File.read(file), options)
11
+ import_csv_text(read_file(file, options), options)
12
12
  end
13
13
 
14
14
  def import_csv_text(text, options = {})
@@ -18,6 +18,12 @@ module ActAsImportable
18
18
  end
19
19
  end
20
20
 
21
+ def import_data(data, options = {})
22
+ data.map do |row|
23
+ import_record(row, options)
24
+ end
25
+ end
26
+
21
27
  # Creates or updates a model record
22
28
  # Existing records are found by the column(s) specified by the :uid option (default 'id').
23
29
  # If the values for the uid columns are not provided the row will be ignored.
@@ -31,7 +37,9 @@ module ActAsImportable
31
37
  record = find_or_create_by_uids(uid_values(row, options))
32
38
  remove_uid_values_from_row(row, options)
33
39
  record.update_attributes(row)
34
- record.save
40
+ unless record.save
41
+ Rails.logger.error(record.errors.full_messages)
42
+ end
35
43
  record
36
44
  end
37
45
 
@@ -87,6 +95,14 @@ module ActAsImportable
87
95
  end
88
96
  end
89
97
 
98
+ def read_file(file, options = {})
99
+ if options[:encoding]
100
+ File.read(file, :encoding => options[:encoding])
101
+ else
102
+ File.read(file)
103
+ end
104
+ end
105
+
90
106
  end
91
107
  end
92
108
  end
@@ -1,3 +1,3 @@
1
1
  module ActAsImportable
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -74,7 +74,22 @@ describe "an act_as_importable model" do
74
74
  it "should return an array of imported records" do
75
75
  Item.import_csv_text(text).should == Item.all.to_a
76
76
  end
77
+ end
78
+
79
+ describe "import data" do
80
+ let(:beer) { { :name => 'Beer', :price => 2.5 } }
81
+ let(:apple) { {:name => 'Apple', :price => 0.5} }
82
+ let(:data) { [beer, apple] }
77
83
 
84
+ it 'should call import_record with row hashes' do
85
+ Item.should_receive(:import_record).with(beer, {}).once
86
+ Item.should_receive(:import_record).with(apple, {}).once
87
+ Item.import_data(data)
88
+ end
89
+
90
+ it "should return an array of imported records" do
91
+ Item.import_data(data).should == Item.all.to_a
92
+ end
78
93
  end
79
94
 
80
95
  describe "import record" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: act_as_importable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-09 00:00:00.000000000 Z
12
+ date: 2013-03-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport