sequel-seed 0.1.2 → 0.1.4
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.
- checksums.yaml +4 -4
- data/CHANGELOG +9 -0
- data/README.md +23 -12
- data/lib/sequel/extensions/seed.rb +65 -8
- data/spec/extensions/seed_spec.rb +99 -13
- data/spec/spec_helper.rb +2 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa4c96943080141c916b61f92f9c1a8757b1de76
|
4
|
+
data.tar.gz: 1286b7fb1157a44fb6ebaa0e0b6c008b410d370e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31a90821eaeba184b477f362163d1b6e9c4a6fb4e68833097c11d5dab9a3cec1a678f6f0aff776753ad7e2b86239ea4602251ae1bdb898da34e8fdb61f79709c
|
7
|
+
data.tar.gz: e27f4f75326aa710e6ff337f8d9d99fd0a21285c5f829c13c77a088d284ec32a35a64b1f0282284fdad3aaf5555bdb4c88303f4a76266e47d30b87a55ab9ff0e
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -1,22 +1,13 @@
|
|
1
|
-
# Sequel::Seed
|
1
|
+
# Sequel::Seed [](http://badge.fury.io/rb/sequel-seed)
|
2
2
|
|
3
3
|
> A Sequel extension to make seeds/fixtures manageable like migrations
|
4
4
|
|
5
5
|
## Usage
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
```rb
|
10
|
-
require 'sequel'
|
11
|
-
require 'sequel/extensions/seed'
|
12
|
-
|
13
|
-
Sequel.extension :seed
|
14
|
-
```
|
15
|
-
|
16
|
-
Create a seed file (eg. `/path/to/seeds/20150928071637_currencies`)
|
7
|
+
Create a seed file (eg. `/path/to/seeds/20150928071637_currencies.rb`)
|
17
8
|
|
18
9
|
```rb
|
19
|
-
Sequel.seed(:development, :test
|
10
|
+
Sequel.seed(:development, :test) do # Applies only to "development" and "test" environments
|
20
11
|
def run
|
21
12
|
[
|
22
13
|
['USD', 'United States dollar'],
|
@@ -34,6 +25,15 @@ Set the environment
|
|
34
25
|
Sequel::Seed.environment = :development
|
35
26
|
```
|
36
27
|
|
28
|
+
Load the extension
|
29
|
+
|
30
|
+
```rb
|
31
|
+
require 'sequel'
|
32
|
+
require 'sequel/extensions/seed'
|
33
|
+
|
34
|
+
Sequel.extension :seed
|
35
|
+
```
|
36
|
+
|
37
37
|
Apply the seeds/fixtures
|
38
38
|
|
39
39
|
```rb
|
@@ -41,10 +41,21 @@ DB = Sequel.connect(...)
|
|
41
41
|
Sequel::Seeder.apply(DB, "/path/to/seeds")
|
42
42
|
```
|
43
43
|
|
44
|
+
For more information, please check the [project website](//github.com/earaujoassis/sequel-seed/).
|
45
|
+
|
44
46
|
## Limitations
|
45
47
|
|
46
48
|
Only timestamped seeds files
|
47
49
|
|
50
|
+
## What's next?
|
51
|
+
|
52
|
+
JSON & YAML files as fixtures/seeds
|
53
|
+
|
54
|
+
## Support
|
55
|
+
|
56
|
+
If you need any help (or have found any bug 🐞), please post it on
|
57
|
+
[/issues](//github.com/earaujoassis/sequel-seed/issues). Thank you!
|
58
|
+
|
48
59
|
## License
|
49
60
|
|
50
61
|
[MIT License](http://earaujoassis.mit-license.org/) © Ewerton Assis
|
@@ -1,18 +1,22 @@
|
|
1
|
+
##
|
1
2
|
# Extension based upon Sequel::Migration and Sequel::Migrator
|
2
3
|
#
|
3
4
|
# Adds the Sequel::Seed and Sequel::Seeder classes, which allow
|
4
|
-
# the user to easily group entity changes and seed the database
|
5
|
-
# to a newer version only (migrations are directional
|
6
|
-
# seeds are always applied).
|
5
|
+
# the user to easily group entity changes and seed/fixture the database
|
6
|
+
# to a newer version only (unlike migrations, seeds are not directional).
|
7
7
|
#
|
8
8
|
# To load the extension:
|
9
9
|
#
|
10
10
|
# Sequel.extension :seed
|
11
|
+
#
|
12
|
+
# It is also important to set the environment:
|
13
|
+
#
|
14
|
+
# Sequel::Seed.environment = :development
|
11
15
|
|
12
16
|
module Sequel
|
13
17
|
class Seed
|
14
18
|
class << self
|
15
|
-
|
19
|
+
attr_reader :environment
|
16
20
|
end
|
17
21
|
|
18
22
|
def self.apply
|
@@ -27,21 +31,62 @@ module Sequel
|
|
27
31
|
descendants << base
|
28
32
|
end
|
29
33
|
|
34
|
+
def self.environment=(env)
|
35
|
+
@environment = env.to_sym
|
36
|
+
end
|
37
|
+
|
30
38
|
def run
|
31
39
|
end
|
32
40
|
end
|
33
41
|
|
42
|
+
##
|
43
|
+
# Creates a Seed subclass according to the given +block+.
|
44
|
+
#
|
45
|
+
# The +env_labels+ lists on which environments the seed should be applicable.
|
46
|
+
# If the current environment is not applicable, the seed is ignored. On the
|
47
|
+
# other hand, if it is applicable, it will be listed in Seed.descendants and
|
48
|
+
# subject to application (if it was not applied yet).
|
49
|
+
#
|
50
|
+
# Expected seed call:
|
51
|
+
#
|
52
|
+
# Sequel.seed(:test) do # seed is only applicable to the test environment
|
53
|
+
# def run
|
54
|
+
# Entity.create attribute: value
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# Wildcard seed:
|
59
|
+
#
|
60
|
+
# Sequel.seed do # seed is applicable to every environment, or no environment
|
61
|
+
# def run
|
62
|
+
# Entity.create attribute: value
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
|
34
67
|
def self.seed *env_labels, &block
|
35
|
-
return if env_labels.length > 0 && !env_labels.include?(Seed.environment)
|
68
|
+
return if env_labels.length > 0 && !env_labels.map(&:to_sym).include?(Seed.environment)
|
36
69
|
|
37
70
|
seed = Class.new(Seed)
|
38
71
|
seed.class_eval(&block) if block_given?
|
39
|
-
Seed.inherited(seed) unless Seed.descendants.include?
|
72
|
+
Seed.inherited(seed) unless Seed.descendants.include?(seed)
|
40
73
|
seed
|
41
74
|
end
|
42
75
|
|
76
|
+
##
|
77
|
+
# Class resposible for applying all the seeds related to the current environment,
|
78
|
+
# if and only if they were not previously applied.
|
79
|
+
#
|
80
|
+
# To apply the seeds/fixtures:
|
81
|
+
#
|
82
|
+
# Sequel::Seeder.apply(db, directory)
|
83
|
+
#
|
84
|
+
# +db+ holds the Sequel database connection
|
85
|
+
#
|
86
|
+
# +directory+ the path to the seeds/fixtures files
|
87
|
+
|
43
88
|
class Seeder
|
44
|
-
SEED_FILE_PATTERN = /\A(\d+)_.+\.rb\z/i.freeze
|
89
|
+
SEED_FILE_PATTERN = /\A(\d+)_.+\.(rb|json|yml)\z/i.freeze
|
45
90
|
SEED_SPLITTER = '_'.freeze
|
46
91
|
MINIMUM_TIMESTAMP = 20000101
|
47
92
|
|
@@ -61,7 +106,7 @@ module Sequel
|
|
61
106
|
next unless SEED_FILE_PATTERN.match(file)
|
62
107
|
return TimestampSeeder if file.split(SEED_SPLITTER, 2).first.to_i > MINIMUM_TIMESTAMP
|
63
108
|
end
|
64
|
-
raise(Error,
|
109
|
+
raise(Error, "seeder not available for files")
|
65
110
|
else
|
66
111
|
self
|
67
112
|
end
|
@@ -120,6 +165,18 @@ module Sequel
|
|
120
165
|
end
|
121
166
|
end
|
122
167
|
|
168
|
+
##
|
169
|
+
# A Seeder subclass to apply timestamped seeds/fixtures files.
|
170
|
+
# It follows the same syntax & semantics for the Seeder superclass.
|
171
|
+
#
|
172
|
+
# To apply the seeds/fixtures:
|
173
|
+
#
|
174
|
+
# Sequel::TimestampSeeder.apply(db, directory)
|
175
|
+
#
|
176
|
+
# +db+ holds the Sequel database connection
|
177
|
+
#
|
178
|
+
# +directory+ the path to the seeds/fixtures files
|
179
|
+
|
123
180
|
class TimestampSeeder < Seeder
|
124
181
|
DEFAULT_SCHEMA_COLUMN = :filename
|
125
182
|
DEFAULT_SCHEMA_TABLE = :schema_seeds
|
@@ -4,20 +4,17 @@ Sequel::Seed.environment = :test
|
|
4
4
|
|
5
5
|
describe Sequel.seed do
|
6
6
|
it 'should create a Seed descendant according to the current environment' do
|
7
|
-
seed = Sequel.seed(:test)
|
8
|
-
end
|
7
|
+
seed = Sequel.seed(:test) {}
|
9
8
|
expect(Sequel::Seed.descendants).to include seed
|
10
9
|
end
|
11
10
|
|
12
11
|
it 'should ignore a Seed not applicable to the current environment' do
|
13
|
-
seed = Sequel.seed(:development)
|
14
|
-
end
|
12
|
+
seed = Sequel.seed(:development) {}
|
15
13
|
expect(Sequel::Seed.descendants).not_to include seed
|
16
14
|
end
|
17
15
|
|
18
16
|
it 'should create a Seed applicable to every environment' do
|
19
|
-
seed = Sequel.seed
|
20
|
-
end
|
17
|
+
seed = Sequel.seed {}
|
21
18
|
expect(Sequel::Seed.descendants).to include seed
|
22
19
|
end
|
23
20
|
end
|
@@ -25,6 +22,98 @@ end
|
|
25
22
|
describe Sequel::Seeder do
|
26
23
|
let(:DB) {Sequel.sqlite}
|
27
24
|
|
25
|
+
describe 'environment references should be indistinguishable between Symbol and String' do
|
26
|
+
context 'when the environment is defined using a String' do
|
27
|
+
it 'should apply the Seed accordingly' do
|
28
|
+
Sequel::Seed.environment = "test"
|
29
|
+
|
30
|
+
Sequel.seed(:test) do
|
31
|
+
def run
|
32
|
+
SpecModel.create :name => 'environment defined by String'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
expect(Sequel::Seed.descendants.length).to be 1
|
37
|
+
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
38
|
+
expect(Sequel::Seed.descendants.length).to be 0
|
39
|
+
expect(SpecModel.dataset.all.length).to be 1
|
40
|
+
expect(SpecModel.dataset.first.name).to eq 'environment defined by String'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when the Seed is defined using a String' do
|
45
|
+
it 'should apply the Seed accordingly' do
|
46
|
+
Sequel::Seed.environment = :test
|
47
|
+
|
48
|
+
Sequel.seed("test") do
|
49
|
+
def run
|
50
|
+
SpecModel.create :name => 'Seed defined by String'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
expect(Sequel::Seed.descendants.length).to be 1
|
55
|
+
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
56
|
+
expect(Sequel::Seed.descendants.length).to be 0
|
57
|
+
expect(SpecModel.dataset.all.length).to be 1
|
58
|
+
expect(SpecModel.dataset.first.name).to eq 'Seed defined by String'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when both Seed and environment are defined using a String' do
|
63
|
+
it 'should apply the Seed accordingly' do
|
64
|
+
Sequel::Seed.environment = "test"
|
65
|
+
|
66
|
+
Sequel.seed("test") do
|
67
|
+
def run
|
68
|
+
SpecModel.create :name => 'Seed and environment defined by String'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
expect(Sequel::Seed.descendants.length).to be 1
|
73
|
+
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
74
|
+
expect(Sequel::Seed.descendants.length).to be 0
|
75
|
+
expect(SpecModel.dataset.all.length).to be 1
|
76
|
+
expect(SpecModel.dataset.first.name).to eq 'Seed and environment defined by String'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when both Seed and environment are defined using a Symbol' do
|
81
|
+
it 'should apply the Seed accordingly' do
|
82
|
+
Sequel::Seed.environment = :test
|
83
|
+
|
84
|
+
Sequel.seed(:test) do
|
85
|
+
def run
|
86
|
+
SpecModel.create :name => 'Seed and environment defined by Symbol'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
expect(Sequel::Seed.descendants.length).to be 1
|
91
|
+
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
92
|
+
expect(Sequel::Seed.descendants.length).to be 0
|
93
|
+
expect(SpecModel.dataset.all.length).to be 1
|
94
|
+
expect(SpecModel.dataset.first.name).to eq 'Seed and environment defined by Symbol'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'when the environment is defined using a String and we have a wildcard Seed' do
|
99
|
+
it 'should apply the Seed accordingly' do
|
100
|
+
Sequel::Seed.environment = "test"
|
101
|
+
|
102
|
+
Sequel.seed do
|
103
|
+
def run
|
104
|
+
SpecModel.create :name => 'Wildcard Seed and environment defined by String'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
expect(Sequel::Seed.descendants.length).to be 1
|
109
|
+
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
110
|
+
expect(Sequel::Seed.descendants.length).to be 0
|
111
|
+
expect(SpecModel.dataset.all.length).to be 1
|
112
|
+
expect(SpecModel.dataset.first.name).to eq 'Wildcard Seed and environment defined by String'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
28
117
|
context 'when there\'s no Seed created' do
|
29
118
|
it 'should not make any change to the database' do
|
30
119
|
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
@@ -36,7 +125,7 @@ describe Sequel::Seeder do
|
|
36
125
|
it 'should change the database accordingly only once' do
|
37
126
|
Sequel.seed do
|
38
127
|
def run
|
39
|
-
SpecModel.create name
|
128
|
+
SpecModel.create :name => 'should have changed'
|
40
129
|
end
|
41
130
|
end
|
42
131
|
|
@@ -44,21 +133,18 @@ describe Sequel::Seeder do
|
|
44
133
|
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
45
134
|
expect(Sequel::Seed.descendants.length).to be 0
|
46
135
|
expect(SpecModel.dataset.all.length).to be 1
|
47
|
-
expect(SpecModel.dataset.first.name).to eq '
|
136
|
+
expect(SpecModel.dataset.first.name).to eq 'should have changed'
|
48
137
|
end
|
49
138
|
end
|
50
139
|
|
51
140
|
context 'when the specified Seed is not applicable to the current environment' do
|
52
|
-
|
141
|
+
it 'should not make any change to the database' do
|
53
142
|
Sequel.seed(:hithere) do
|
54
143
|
def run
|
55
|
-
SpecModel.create name
|
144
|
+
SpecModel.create :name => 'should not have changed'
|
56
145
|
end
|
57
146
|
end
|
58
|
-
}
|
59
147
|
|
60
|
-
it 'should not make any change to the database' do
|
61
|
-
seed
|
62
148
|
expect(Sequel::Seed.descendants.length).to be 0
|
63
149
|
expect {Sequel::Seeder.apply(DB, '/')}.not_to raise_error
|
64
150
|
expect(SpecModel.dataset.all.length).to be 0
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@ require 'bundler/setup'
|
|
2
2
|
Bundler.setup(:default, :development)
|
3
3
|
|
4
4
|
require 'sequel'
|
5
|
+
require 'faker'
|
5
6
|
require File.expand_path(File.dirname(__FILE__) + '/../lib/sequel/extensions/seed.rb')
|
6
7
|
|
7
8
|
RSpec.configure do |config|
|
@@ -42,7 +43,7 @@ RSpec.configure do |config|
|
|
42
43
|
|
43
44
|
DB.create_table(:spec_models) do
|
44
45
|
primary_key :id, :auto_increment => true
|
45
|
-
String
|
46
|
+
String :name
|
46
47
|
end
|
47
48
|
|
48
49
|
config.before(:each) do
|