act_as_importable 0.0.8 → 0.0.10
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/.gitignore +1 -0
- data/README.md +11 -0
- data/lib/act_as_importable/importer.rb +18 -0
- data/lib/act_as_importable/version.rb +1 -1
- data/spec/act_as_importable/importer_spec.rb +63 -0
- data/spec/spec_helper.rb +4 -0
- metadata +3 -3
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -56,6 +56,17 @@ User.import_csv_file('/path/to/file.csv', :uid => :email)
|
|
56
56
|
This will find an existing record with a matching email address and update their name.
|
57
57
|
If no record exists it will create a new one.
|
58
58
|
|
59
|
+
## Other options
|
60
|
+
|
61
|
+
* uid (default: 'uid')
|
62
|
+
* except (default: nil)
|
63
|
+
* only (default: nil)
|
64
|
+
* default_values (default: nil)
|
65
|
+
* delete_missing_records (default: false)
|
66
|
+
* existing_record_scope (default: Model.all)
|
67
|
+
|
68
|
+
|
69
|
+
|
59
70
|
|
60
71
|
## Test
|
61
72
|
|
@@ -15,6 +15,24 @@ module ActAsImportable
|
|
15
15
|
data.map do |row|
|
16
16
|
import_record(row)
|
17
17
|
end
|
18
|
+
delete_missing_records if options[:delete_missing_records]
|
19
|
+
end
|
20
|
+
|
21
|
+
def existing_record_scope
|
22
|
+
options[:existing_record_scope] || model_class.all
|
23
|
+
end
|
24
|
+
|
25
|
+
def existing_record_ids
|
26
|
+
existing_record_scope.map(&:id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def record_ids_to_delete
|
30
|
+
imported_ids = successful_imports.map(&:id)
|
31
|
+
existing_record_ids.reject { |id| imported_ids.include? id }
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete_missing_records
|
35
|
+
model_class.delete(record_ids_to_delete)
|
18
36
|
end
|
19
37
|
|
20
38
|
def import_record(row)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
1
3
|
describe ActAsImportable::Importer do
|
2
4
|
|
3
5
|
before(:each) do
|
@@ -35,4 +37,65 @@ describe ActAsImportable::Importer do
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
40
|
+
describe "delete_missing_records option" do
|
41
|
+
let(:importer) { ActAsImportable::Importer.new(:uid => :name, :model_class => Item, :delete_missing_records => true) }
|
42
|
+
let(:beer_category) { Category.create!(:name => 'Beer') }
|
43
|
+
let(:wine_category) { Category.create!(:name => 'Wine') }
|
44
|
+
|
45
|
+
before :each do
|
46
|
+
@beer1 = Item.create!(:name => 'Beer 1', :price => 3.0, :category => beer_category)
|
47
|
+
@beer2 = Item.create!(:name => 'Beer 2', :price => 3.5, :category => beer_category)
|
48
|
+
@wine1 = Item.create!(:name => 'Wine 1', :price => 16.5, :category => wine_category)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should call delete_missing_records when the option is true" do
|
52
|
+
importer.options[:delete_missing_records] = true
|
53
|
+
importer.should_receive(:delete_missing_records).once
|
54
|
+
importer.import_data([{:name => 'Beer 1', :price => 3.0}])
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should not call delete_missing_records when the option is false" do
|
58
|
+
importer.options[:delete_missing_records] = false
|
59
|
+
importer.should_not_receive(:delete_missing_records)
|
60
|
+
importer.import_data([{:name => 'Beer 1', :price => 3.0}])
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should default the delete_missing_records option to false" do
|
64
|
+
importer.options.delete(:delete_missing_records)
|
65
|
+
importer.should_not_receive(:delete_missing_records)
|
66
|
+
importer.import_data([{:name => 'Beer 1', :price => 3.0}])
|
67
|
+
end
|
68
|
+
|
69
|
+
context "when no existing_record_scope option is provided" do
|
70
|
+
|
71
|
+
it "should delete all existing records that were not included in the import" do
|
72
|
+
expect {
|
73
|
+
importer.import_data([{:name => 'Beer 1', :price => 3.0}])
|
74
|
+
}.to change { Item.count }.from(3).to(1)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
context "when an existing_record_scope option is provided" do
|
80
|
+
|
81
|
+
before :each do
|
82
|
+
importer.options[:existing_record_scope] = Item.for_category(beer_category)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should not delete any records when all objects in the existing_records_scope are updated" do
|
86
|
+
expect {
|
87
|
+
importer.import_data([{:name => 'Beer 1', :price => 3.0}, {:name => 'Beer 2', :price => 3.0}])
|
88
|
+
}.to change { Item.count }.by(0)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should delete existing records, in the scope provided, that were not included in the import" do
|
92
|
+
expect {
|
93
|
+
importer.import_data([{:name => 'Beer 1', :price => 3.0}])
|
94
|
+
}.to change { Item.count }.from(3).to(2)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
38
101
|
end
|
data/spec/spec_helper.rb
CHANGED
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.
|
4
|
+
version: 0.0.10
|
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-04-
|
12
|
+
date: 2013-04-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -122,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
122
|
version: '0'
|
123
123
|
requirements: []
|
124
124
|
rubyforge_project:
|
125
|
-
rubygems_version: 1.8.
|
125
|
+
rubygems_version: 1.8.25
|
126
126
|
signing_key:
|
127
127
|
specification_version: 3
|
128
128
|
summary: Helps import records from CSV files.
|