seedomatic 0.2.0 → 0.3.0
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/lib/seedomatic/seeder.rb +6 -3
- data/lib/seedomatic/version.rb +1 -1
- data/readme.markdown +10 -2
- data/seedomatic.gemspec +1 -0
- data/spec/lib/seeder_spec.rb +36 -1
- metadata +15 -4
data/lib/seedomatic/seeder.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module SeedOMatic
|
2
2
|
class Seeder
|
3
3
|
|
4
|
-
attr_accessor :model_name, :items, :match_on
|
4
|
+
attr_accessor :model_name, :items, :match_on, :seed_mode
|
5
5
|
|
6
6
|
def initialize(data)
|
7
7
|
@model_name = data[:model_name]
|
8
8
|
@items = data[:items]
|
9
9
|
@match_on = [*data[:match_on]]
|
10
|
+
@seed_mode = data[:seed_mode] || "always"
|
10
11
|
end
|
11
12
|
|
12
13
|
def import
|
@@ -22,8 +23,10 @@ module SeedOMatic
|
|
22
23
|
updated_records += 1
|
23
24
|
end
|
24
25
|
|
25
|
-
model.
|
26
|
-
|
26
|
+
if model.new_record? || seed_mode == 'always'
|
27
|
+
model.attributes = i
|
28
|
+
model.save!
|
29
|
+
end
|
27
30
|
end
|
28
31
|
|
29
32
|
{ :count => items.length, :new => new_records, :updated => updated_records}
|
data/lib/seedomatic/version.rb
CHANGED
data/readme.markdown
CHANGED
@@ -39,6 +39,16 @@ Running seeds is as easy as calling:
|
|
39
39
|
|
40
40
|
This will look through the directory `config/seeds`, and import every file in that directory.
|
41
41
|
|
42
|
+
### Seed Mode
|
43
|
+
|
44
|
+
You can set a *seed mode* to control how SeedOMatic handles entries that already exist (i.e. models that matched the match_on
|
45
|
+
fields). The following options are available:
|
46
|
+
|
47
|
+
* `once` - Create new models, but don't update any existing models.
|
48
|
+
* `always` - Always update, even if the model already exists.
|
49
|
+
|
50
|
+
The default seed mode is `always`.
|
51
|
+
|
42
52
|
### Importing specific directories, or specific files.
|
43
53
|
|
44
54
|
To load seed files from a specific directory, call:
|
@@ -59,7 +69,5 @@ You can load tags using the `tagged_with`, and `not_tagged_with` options:
|
|
59
69
|
|
60
70
|
## TODO
|
61
71
|
|
62
|
-
* Support for JSON formatted seed files
|
63
|
-
* Allowing multiple models defined per file
|
64
72
|
* Referencing lookups from other seed files
|
65
73
|
* Selective updating of data
|
data/seedomatic.gemspec
CHANGED
data/spec/lib/seeder_spec.rb
CHANGED
@@ -2,13 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe SeedOMatic::Seeder do
|
4
4
|
let!(:mock_model) { mock(MyModel).as_null_object }
|
5
|
+
let(:existing_mock) { MyModel.create(:name => 'Existing') }
|
6
|
+
let(:new_mock) { MyModel.new(:name => 'New') }
|
5
7
|
|
6
8
|
let(:seeder) { described_class.new(data) }
|
7
|
-
let(:data) { { :model_name => model_name, :items => items, :match_on => match_on } }
|
9
|
+
let(:data) { { :model_name => model_name, :items => items, :seed_mode => seed_mode, :match_on => match_on } }
|
8
10
|
let(:model_name) { "MyModel" }
|
9
11
|
let(:items) {
|
10
12
|
[{'name' => 'foo', 'code' => 'uniquecode', 'code_category' => 'more_unique'} ]
|
11
13
|
}
|
14
|
+
let(:seed_mode) { nil }
|
12
15
|
let(:match_on) { nil }
|
13
16
|
|
14
17
|
describe "import" do
|
@@ -76,6 +79,38 @@ describe SeedOMatic::Seeder do
|
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
82
|
+
describe "seed_mode" do
|
83
|
+
subject { seeder.import }
|
84
|
+
|
85
|
+
let(:items) {
|
86
|
+
[{'name' => 'foo', 'code' => 'existing'}, {'name' => 'bar', 'code' => 'new'} ]
|
87
|
+
}
|
88
|
+
let(:match_on) { 'code' }
|
89
|
+
before {
|
90
|
+
MyModel.stub(:find_or_initialize_by_code).with('existing').and_return(existing_mock)
|
91
|
+
MyModel.stub(:find_or_initialize_by_code).with('new').and_return(new_mock)
|
92
|
+
}
|
93
|
+
|
94
|
+
context "once" do
|
95
|
+
let(:seed_mode) { 'once' }
|
96
|
+
|
97
|
+
it "should only save new models" do
|
98
|
+
existing_mock.should_not_receive(:save!)
|
99
|
+
new_mock.should_receive(:save!)
|
100
|
+
subject
|
101
|
+
end
|
102
|
+
end
|
103
|
+
context "always" do
|
104
|
+
let(:seed_mode) { 'always' }
|
105
|
+
|
106
|
+
it "should save multiple models" do
|
107
|
+
existing_mock.should_receive(:save!)
|
108
|
+
new_mock.should_receive(:save!)
|
109
|
+
subject
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
79
114
|
describe "create_args" do
|
80
115
|
subject { seeder.send(:create_args, {'code' => 1, 'code_category' => 2}) }
|
81
116
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seedomatic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70123092620800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,18 @@ dependencies:
|
|
21
21
|
version: 2.9.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70123092620800
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
requirement: &70123096919180 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70123096919180
|
25
36
|
description: Create repeatable seed fixtures that you can continually use and deploy
|
26
37
|
to multiple environments and tenants.
|
27
38
|
email:
|