sequel-seed 0.2.1 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5a1af2b07c026c54b028ea8b4153e4523a44faa
4
- data.tar.gz: 1e1a6ed02f2cf6b09f9f7e30c54e8eb36e2004e3
3
+ metadata.gz: da09d9ce979c91b83d60523a679e5f284d47bead
4
+ data.tar.gz: 9cfc115fbe4e8cddc8a63cc07a8314201a391e80
5
5
  SHA512:
6
- metadata.gz: 5c10ccb47562c8bb4b6436a81220ebb9f8f88d6abca4388e6c6aa2350eb6f86a83feb97e20c7272817ca43479abf6c1086a7c2db476b8c02487ba5ccce85dcca
7
- data.tar.gz: ba11dee2ccb4b7ccb28b05a0e79897462764e5701a33adc7430e886fe9f664992ae7c6c031034d40fbea2cba9f1f8def3d11159fb4ad462190889e01ae46b62f
6
+ metadata.gz: 57c5c5e645c3407808d4b77d17877aa31940e21152370978583852d653385be8df9a6e248b29a20a2711e5851623c0cd33038a143c5b2ae1fc8092327abce23d
7
+ data.tar.gz: 671cf4fd7f61cb15aeb3588ed461b8f39ab5ebbb785ac0ba4569712b96df3d203c88fd24da4dae67ab39dafcc4717de8b48f0703187549e0f4a53156b1b08086
data/CHANGELOG CHANGED
@@ -1,5 +1,9 @@
1
1
  ## Changelog
2
2
 
3
+ ### 0.3.0
4
+ - Add support for YAML files
5
+ - Minor hotfixes
6
+
3
7
  ### 0.2.1
4
8
  - API changes to protect Sequel's namespace
5
9
  - `Sequel::Seed.environment = :env` is also `Sequel::Seed.setup(:env)`
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Usage
6
6
 
7
- Create a seed file (eg. `/path/to/seeds/20150928071637_currencies.rb`)
7
+ Create a seed file (eg. `/path/to/seeds/20150928000000_initial_seed.rb`)
8
8
 
9
9
  ```rb
10
10
  Sequel.seed(:development, :test) do # Applies only to "development" and "test" environments
@@ -45,11 +45,12 @@ For more information, please check the [project website](//github.com/earaujoass
45
45
 
46
46
  ## Limitations
47
47
 
48
- Only timestamped seeds files
48
+ - JSON and YAML files don't work with associations
49
+ - Only timestamped seed/fixture files
49
50
 
50
51
  ## What's next?
51
52
 
52
- JSON & YAML files as fixtures/seeds
53
+ Work with Model's associations inside JSON & YAML files
53
54
 
54
55
  ## Support
55
56
 
@@ -1,3 +1,6 @@
1
+ require 'yaml'
2
+ require 'json'
3
+
1
4
  ##
2
5
  # Extension based upon Sequel::Migration and Sequel::Migrator
3
6
  #
@@ -52,6 +55,9 @@ module Sequel
52
55
  end
53
56
 
54
57
  module Seed
58
+ class Error < Sequel::Error
59
+ end
60
+
55
61
  class << self
56
62
  attr_reader :environment
57
63
 
@@ -84,6 +90,76 @@ module Sequel
84
90
  end
85
91
  end
86
92
 
93
+ ##
94
+ # Helper methods for the Sequel::Seed project.
95
+
96
+ module Helpers
97
+ class << self
98
+ def camelize(term, uppercase_first_letter = true)
99
+ string = term.to_s
100
+ if uppercase_first_letter
101
+ string.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
102
+ else
103
+ string.first + camelize(string)[1..-1]
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ module SeedDescriptor
110
+ def apply_seed_descriptor(seed_descriptor)
111
+ case seed_descriptor
112
+ when Hash
113
+ apply_seed_hash(seed_descriptor)
114
+ when Array
115
+ seed_descriptor.each {|seed_hash| apply_seed_hash(seed_hash)}
116
+ end
117
+ end
118
+
119
+ private
120
+
121
+ def apply_seed_hash(seed_hash)
122
+ return unless seed_hash.class <= Hash
123
+ if seed_hash.has_key?('environment')
124
+ case seed_hash['environment']
125
+ when String, Symbol
126
+ return if seed_hash['environment'].to_sym != Seed.environment
127
+ when Array
128
+ return unless seed_hash_environment.map(&:to_sym).include?(Seed.environment)
129
+ end
130
+ end
131
+
132
+ keys = seed_hash.keys
133
+ keys.delete('environment')
134
+ keys.each do |key|
135
+ key_hash = seed_hash[key]
136
+ entries = nil
137
+ class_name = if key_hash.has_key?('class')
138
+ entries = key_hash['entries']
139
+ key_hash['class']
140
+ else
141
+ Helpers.camelize(key)
142
+ end
143
+ # It will raise an error if the class name is not defined
144
+ class_const = Kernel.const_get(class_name)
145
+ if entries
146
+ entries.each {|hash| create_model(class_const, hash)}
147
+ else
148
+ create_model(class_const, key_hash)
149
+ end
150
+ end
151
+ end
152
+
153
+ def create_model(class_const, hash)
154
+ object_instance = class_const.new
155
+ object_instance_attr = hash.each do |attr, value|
156
+ object_instance.set({attr.to_sym => value})
157
+ end
158
+ raise(Error, "Attempt to create invalid model instance of #{class_name}") unless object_instance.valid?
159
+ object_instance.save
160
+ end
161
+ end
162
+
87
163
  class Base
88
164
  class << self
89
165
  def apply
@@ -117,15 +193,14 @@ module Sequel
117
193
  end
118
194
 
119
195
  class Seeder
120
- SEED_FILE_PATTERN = /\A(\d+)_.+\.(rb|json|yml)\z/i.freeze
196
+ SEED_FILE_PATTERN = /\A(\d+)_.+\.(rb|json|yml|yaml)\z/i.freeze
197
+ RUBY_SEED_FILE_PATTERN = /\A(\d+)_.+\.(rb)\z/i.freeze
198
+ YAML_SEED_FILE_PATTERN = /\A(\d+)_.+\.(yml|yaml)\z/i.freeze
199
+ JSON_SEED_FILE_PATTERN = /\A(\d+)_.+\.(json)\z/i.freeze
121
200
  SEED_SPLITTER = '_'.freeze
122
201
  MINIMUM_TIMESTAMP = 20000101
123
202
 
124
- class Error < Sequel::Error
125
- end
126
-
127
- class NotCurrentError < Error
128
- end
203
+ Error = Seed::Error
129
204
 
130
205
  def self.apply(db, directory, opts = {})
131
206
  seeder_class(directory).new(db, directory, opts).run
@@ -212,7 +287,7 @@ module Sequel
212
287
  DEFAULT_SCHEMA_COLUMN = :filename
213
288
  DEFAULT_SCHEMA_TABLE = :schema_seeds
214
289
 
215
- Error = Seeder::Error
290
+ Error = Seed::Error
216
291
 
217
292
  attr_reader :applied_seeds
218
293
 
@@ -266,16 +341,57 @@ module Sequel
266
341
  f = File.basename(path)
267
342
  fi = f.downcase
268
343
  if !applied_seeds.include?(fi)
269
- load(path)
344
+ #begin
345
+ load(path) if RUBY_SEED_FILE_PATTERN.match(f)
346
+ create_yaml_seed(path) if YAML_SEED_FILE_PATTERN.match(f)
347
+ create_json_seed(path) if JSON_SEED_FILE_PATTERN.match(f)
348
+ #rescue Exception => e
349
+ #raise(Error, "error while processing seed file #{path}: #{e.inspect}")
350
+ #end
270
351
  el = [ms.last, f]
271
- if !ms.last.nil? && !seeds.include?(el)
272
- seeds << [ms.last, f]
352
+ next if ms.last.nil?
353
+ if ms.last < Seed::Base && !seeds.include?(el)
354
+ seeds << el
273
355
  end
274
356
  end
275
357
  end
276
358
  seeds
277
359
  end
278
360
 
361
+ def create_yaml_seed(path)
362
+ seed_descriptor = YAML::load(File.open(path))
363
+ seed = Class.new(Seed::Base)
364
+ seed.const_set "YAML_SEED", seed_descriptor
365
+ seed.class_eval do
366
+ include Seed::SeedDescriptor
367
+
368
+ def run
369
+ seed_descriptor = self.class.const_get "YAML_SEED"
370
+ raise(Error, "YAML seed improperly defined") if seed_descriptor.nil?
371
+ self.apply_seed_descriptor(seed_descriptor)
372
+ end
373
+ end
374
+ Seed::Base.inherited(seed) unless Seed::Base.descendants.include?(seed)
375
+ seed
376
+ end
377
+
378
+ def create_json_seed(path)
379
+ seed_descriptor = JSON.parse(File.read(path))
380
+ seed = Class.new(Seed::Base)
381
+ seed.const_set "JSON_SEED", seed_descriptor
382
+ seed.class_eval do
383
+ include Seed::SeedDescriptor
384
+
385
+ def run
386
+ seed_descriptor = self.class.const_get "JSON_SEED"
387
+ raise(Error, "JSON seed improperly defined") if seed_descriptor.nil?
388
+ self.apply_seed_descriptor(seed_descriptor)
389
+ end
390
+ end
391
+ Seed::Base.inherited(seed) unless Seed::Base.descendants.include?(seed)
392
+ seed
393
+ end
394
+
279
395
  def schema_dataset
280
396
  c = column
281
397
  ds = db.from(table)
@@ -5,12 +5,12 @@ describe Sequel.seed do
5
5
  Sequel::Seed.setup(:test)
6
6
  end
7
7
 
8
- it 'should create a Seed descendant according to the current environment' do
8
+ it 'should create a Seed descendant according to the given environment' do
9
9
  seed = Sequel.seed(:test) {}
10
10
  expect(Sequel::Seed::Base.descendants).to include seed
11
11
  end
12
12
 
13
- it 'should ignore a Seed not applicable to the current environment' do
13
+ it 'should ignore a Seed not applicable to the given environment' do
14
14
  seed = Sequel.seed(:development) {}
15
15
  expect(Sequel::Seed::Base.descendants).not_to include seed
16
16
  end
@@ -55,6 +55,7 @@ end
55
55
  describe Sequel::Seeder do
56
56
  let(:DB) {Sequel.sqlite}
57
57
  let!(:environment) {"#{Faker::Lorem.word}_#{Faker::Lorem.word}"}
58
+ let!(:random_word) {Faker::Lorem.word}
58
59
 
59
60
  it "should raise an error when there is not any seed file to apply" do
60
61
  Sequel::Seed.setup environment
@@ -64,36 +65,118 @@ describe Sequel::Seeder do
64
65
  expect(SpecModel.dataset.all.length).to be 0
65
66
  end
66
67
 
67
- describe 'environment references should be indistinguishable between Symbol and String' do
68
- context 'when the environment is defined using a String' do
69
- it 'should apply the Seed accordingly' do
70
- Sequel::Seed.setup environment
68
+ describe "Seeds defined using Ruby code (.rb extension)" do
69
+ describe 'environment references should be indistinguishable between Symbol and String' do
70
+ context 'when the environment is defined using a String' do
71
+ it 'should apply the Seed accordingly' do
72
+ Sequel::Seed.setup environment
73
+
74
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
75
+ f.puts "Sequel.seed(:#{environment}) do"
76
+ f.puts ' def run'
77
+ f.puts ' SpecModel.create :sentence => \'environment defined by String\''
78
+ f.puts ' end'
79
+ f.puts 'end'
80
+ end
81
+
82
+ expect(Sequel::Seed::Base.descendants.length).to be 0
83
+ expect(Sequel::Seeder.seeder_class(seed_test_dir)).to be Sequel::TimestampSeeder
84
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
85
+ expect(Sequel::Seed::Base.descendants.length).to be 1
86
+ expect(SpecModel.dataset.all.length).to be 1
87
+ expect(SpecModel.dataset.first.sentence).to eq 'environment defined by String'
88
+ end
89
+ end
71
90
 
72
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
73
- f.puts "Sequel.seed(:#{environment}) do"
74
- f.puts ' def run'
75
- f.puts ' SpecModel.create :sentence => \'environment defined by String\''
76
- f.puts ' end'
77
- f.puts 'end'
91
+ context 'when the Seed is defined using a String' do
92
+ it 'should apply the Seed accordingly' do
93
+ Sequel::Seed.setup environment.to_sym
94
+
95
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
96
+ f.puts "Sequel.seed(\"#{environment}\") do"
97
+ f.puts ' def run'
98
+ f.puts ' SpecModel.create :sentence => \'Seed defined by String\''
99
+ f.puts ' end'
100
+ f.puts 'end'
101
+ end
102
+
103
+ expect(Sequel::Seed::Base.descendants.length).to be 0
104
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
105
+ expect(Sequel::Seed::Base.descendants.length).to be 1
106
+ expect(SpecModel.dataset.all.length).to be 1
107
+ expect(SpecModel.dataset.first.sentence).to eq 'Seed defined by String'
78
108
  end
109
+ end
79
110
 
80
- expect(Sequel::Seed::Base.descendants.length).to be 0
81
- expect(Sequel::Seeder.seeder_class(seed_test_dir)).to be Sequel::TimestampSeeder
82
- expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
83
- expect(Sequel::Seed::Base.descendants.length).to be 1
84
- expect(SpecModel.dataset.all.length).to be 1
85
- expect(SpecModel.dataset.first.sentence).to eq 'environment defined by String'
111
+ context 'when both Seed and environment are defined using a String' do
112
+ it 'should apply the Seed accordingly' do
113
+ Sequel::Seed.setup environment
114
+
115
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
116
+ f.puts "Sequel.seed(\"#{environment}\") do"
117
+ f.puts ' def run'
118
+ f.puts ' SpecModel.create :sentence => \'Seed and environment defined by String\''
119
+ f.puts ' end'
120
+ f.puts 'end'
121
+ end
122
+
123
+ expect(Sequel::Seed::Base.descendants.length).to be 0
124
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
125
+ expect(Sequel::Seed::Base.descendants.length).to be 1
126
+ expect(SpecModel.dataset.all.length).to be 1
127
+ expect(SpecModel.dataset.first.sentence).to eq 'Seed and environment defined by String'
128
+ end
129
+ end
130
+
131
+ context 'when both Seed and environment are defined using a Symbol' do
132
+ it 'should apply the Seed accordingly' do
133
+ Sequel::Seed.setup environment.to_sym
134
+
135
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
136
+ f.puts "Sequel.seed(:#{environment}) do"
137
+ f.puts ' def run'
138
+ f.puts ' SpecModel.create :sentence => \'Seed and environment defined by Symbol\''
139
+ f.puts ' end'
140
+ f.puts 'end'
141
+ end
142
+
143
+ expect(Sequel::Seed::Base.descendants.length).to be 0
144
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
145
+ expect(Sequel::Seed::Base.descendants.length).to be 1
146
+ expect(SpecModel.dataset.all.length).to be 1
147
+ expect(SpecModel.dataset.first.sentence).to eq 'Seed and environment defined by Symbol'
148
+ end
149
+ end
150
+
151
+ context 'when the environment is defined using a String and we have a wildcard Seed' do
152
+ it 'should apply the Seed accordingly' do
153
+ Sequel::Seed.setup environment
154
+
155
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
156
+ f.puts 'Sequel.seed do'
157
+ f.puts ' def run'
158
+ f.puts ' SpecModel.create :sentence => \'Wildcard Seed and environment defined by String\''
159
+ f.puts ' end'
160
+ f.puts 'end'
161
+ end
162
+
163
+ expect(Sequel::Seed::Base.descendants.length).to be 0
164
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
165
+ expect(Sequel::Seed::Base.descendants.length).to be 1
166
+ expect(SpecModel.dataset.all.length).to be 1
167
+ expect(SpecModel.dataset.first.sentence).to eq 'Wildcard Seed and environment defined by String'
168
+ end
86
169
  end
87
170
  end
88
171
 
89
- context 'when the Seed is defined using a String' do
90
- it 'should apply the Seed accordingly' do
91
- Sequel::Seed.setup environment.to_sym
172
+ context 'when there\'s a Seed created' do
173
+ it 'should change the database accordingly only once' do
174
+ Sequel::Seed.setup environment
92
175
 
93
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
94
- f.puts "Sequel.seed(\"#{environment}\") do"
176
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
177
+ f.puts 'Sequel.seed do'
95
178
  f.puts ' def run'
96
- f.puts ' SpecModel.create :sentence => \'Seed defined by String\''
179
+ f.puts ' SpecModel.create :sentence => \'should have changed (from Ruby file)\''
97
180
  f.puts ' end'
98
181
  f.puts 'end'
99
182
  end
@@ -102,110 +185,214 @@ describe Sequel::Seeder do
102
185
  expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
103
186
  expect(Sequel::Seed::Base.descendants.length).to be 1
104
187
  expect(SpecModel.dataset.all.length).to be 1
105
- expect(SpecModel.dataset.first.sentence).to eq 'Seed defined by String'
188
+ expect(SpecModel.dataset.first.sentence).to eq 'should have changed (from Ruby file)'
189
+ # Once again
190
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
191
+ expect(Sequel::Seed::Base.descendants.length).to be 0
192
+ expect(SpecModel.dataset.all.length).to be 1
193
+ expect(SpecModel.dataset.first.sentence).to eq 'should have changed (from Ruby file)'
106
194
  end
107
195
  end
108
196
 
109
- context 'when both Seed and environment are defined using a String' do
110
- it 'should apply the Seed accordingly' do
197
+ context 'when the specified Seed is not applicable to the given environment' do
198
+ it 'should not make any change to the database' do
111
199
  Sequel::Seed.setup environment
112
200
 
113
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
114
- f.puts "Sequel.seed(\"#{environment}\") do"
201
+ File.open("#{seed_test_dir}/#{seed_file_name}.rb", 'w+') do |f|
202
+ f.puts "Sequel.seed(:another_#{Faker::Lorem.word}_word) do"
115
203
  f.puts ' def run'
116
- f.puts ' SpecModel.create :sentence => \'Seed and environment defined by String\''
204
+ f.puts ' SpecModel.create :sentence => \'should not have changed (from Ruby file)\''
117
205
  f.puts ' end'
118
206
  f.puts 'end'
119
207
  end
120
208
 
121
209
  expect(Sequel::Seed::Base.descendants.length).to be 0
122
210
  expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
123
- expect(Sequel::Seed::Base.descendants.length).to be 1
124
- expect(SpecModel.dataset.all.length).to be 1
125
- expect(SpecModel.dataset.first.sentence).to eq 'Seed and environment defined by String'
211
+ expect(SpecModel.dataset.all.length).to be 0
126
212
  end
127
213
  end
214
+ end
128
215
 
129
- context 'when both Seed and environment are defined using a Symbol' do
130
- it 'should apply the Seed accordingly' do
131
- Sequel::Seed.setup environment.to_sym
216
+ describe 'Seeds defined using YAML code (.{yaml,yml} extension)' do
217
+ it 'should apply a basic YAML Seed if it was specified for the given environment' do
218
+ Sequel::Seed.setup environment
132
219
 
133
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
134
- f.puts "Sequel.seed(:#{environment}) do"
135
- f.puts ' def run'
136
- f.puts ' SpecModel.create :sentence => \'Seed and environment defined by Symbol\''
137
- f.puts ' end'
138
- f.puts 'end'
139
- end
220
+ File.open("#{seed_test_dir}/#{seed_file_name}.yml", 'w+') do |f|
221
+ f.puts "environment: :#{environment}"
222
+ f.puts 'spec_model:'
223
+ f.puts " sentence: 'should have changed (from YAML file) #{random_word}'"
224
+ f.puts ''
225
+ end
140
226
 
141
- expect(Sequel::Seed::Base.descendants.length).to be 0
142
- expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
143
- expect(Sequel::Seed::Base.descendants.length).to be 1
144
- expect(SpecModel.dataset.all.length).to be 1
145
- expect(SpecModel.dataset.first.sentence).to eq 'Seed and environment defined by Symbol'
227
+ expect(Sequel::Seed::Base.descendants.length).to be 0
228
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
229
+ expect(Sequel::Seed::Base.descendants.length).to be 1
230
+ expect(SpecModel.dataset.all.length).to be 1
231
+ expect(SpecModel.dataset.first.sentence).to eq "should have changed (from YAML file) #{random_word}"
232
+ end
233
+
234
+ it 'should apply a YAML Seed if it was specified for the given environment' do
235
+ Sequel::Seed.setup environment
236
+
237
+ File.open("#{seed_test_dir}/#{seed_file_name}.yml", 'w+') do |f|
238
+ f.puts "environment: :#{environment}"
239
+ f.puts 'model:'
240
+ f.puts ' class: \'SpecModel\''
241
+ f.puts ' entries:'
242
+ f.puts ' -'
243
+ f.puts " sentence: 'should have changed (from YAML file) #{random_word}'"
244
+ f.puts ''
146
245
  end
246
+
247
+ expect(Sequel::Seed::Base.descendants.length).to be 0
248
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
249
+ expect(Sequel::Seed::Base.descendants.length).to be 1
250
+ expect(SpecModel.dataset.all.length).to be 1
251
+ expect(SpecModel.dataset.first.sentence).to eq "should have changed (from YAML file) #{random_word}"
147
252
  end
148
253
 
149
- context 'when the environment is defined using a String and we have a wildcard Seed' do
150
- it 'should apply the Seed accordingly' do
151
- Sequel::Seed.setup environment
254
+ it 'should apply a YAML file with multiple Seeds descriptors if they were specified for the given environment' do
255
+ Sequel::Seed.setup environment
152
256
 
153
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
154
- f.puts 'Sequel.seed do'
155
- f.puts ' def run'
156
- f.puts ' SpecModel.create :sentence => \'Wildcard Seed and environment defined by String\''
157
- f.puts ' end'
158
- f.puts 'end'
159
- end
257
+ File.open("#{seed_test_dir}/#{seed_file_name}.yml", 'w+') do |f|
258
+ f.puts '-'
259
+ f.puts " environment: :#{environment}"
260
+ f.puts ' model:'
261
+ f.puts ' class: \'SpecModel\''
262
+ f.puts ' entries:'
263
+ f.puts ' -'
264
+ f.puts " sentence: 'should have changed (from YAML file) #{random_word}'"
265
+ f.puts '-'
266
+ f.puts " environment: :another_#{environment}"
267
+ f.puts ' spec_model:'
268
+ f.puts " sentence: 'should not have changed (from YAML file) #{random_word}'"
269
+ f.puts ''
270
+ end
160
271
 
161
- expect(Sequel::Seed::Base.descendants.length).to be 0
162
- expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
163
- expect(Sequel::Seed::Base.descendants.length).to be 1
164
- expect(SpecModel.dataset.all.length).to be 1
165
- expect(SpecModel.dataset.first.sentence).to eq 'Wildcard Seed and environment defined by String'
272
+ expect(Sequel::Seed::Base.descendants.length).to be 0
273
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
274
+ expect(Sequel::Seed::Base.descendants.length).to be 1
275
+ expect(SpecModel.dataset.all.length).to be 1
276
+ expect(SpecModel.dataset.first.sentence).to eq "should have changed (from YAML file) #{random_word}"
277
+ end
278
+
279
+ it 'should not apply a basic Seed if it was not specified for the given environment' do
280
+ Sequel::Seed.setup environment
281
+
282
+ File.open("#{seed_test_dir}/#{seed_file_name}.yml", 'w+') do |f|
283
+ f.puts "environment: :another_environment_#{Faker::Lorem.word}"
284
+ f.puts 'spec_model:'
285
+ f.puts ' sentence: \'should not have changed (from YAML file)\''
286
+ f.puts ''
166
287
  end
288
+
289
+ expect(Sequel::Seed::Base.descendants.length).to be 0
290
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
291
+ expect(Sequel::Seed::Base.descendants.length).to be 1
292
+ expect(SpecModel.dataset.all.length).to be 0
167
293
  end
168
294
  end
169
295
 
170
- context 'when there\'s a Seed created' do
171
- it 'should change the database accordingly only once' do
296
+ describe 'Seeds defined using JSON code (.json extension)' do
297
+ it 'should apply a basic JSON Seed if it was specified for the given environment' do
172
298
  Sequel::Seed.setup environment
173
299
 
174
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
175
- f.puts 'Sequel.seed do'
176
- f.puts ' def run'
177
- f.puts ' SpecModel.create :sentence => \'should have changed\''
178
- f.puts ' end'
179
- f.puts 'end'
300
+ File.open("#{seed_test_dir}/#{seed_file_name}.json", 'w+') do |f|
301
+ f.puts '{'
302
+ f.puts " \"environment\": \"#{environment}\","
303
+ f.puts " \"spec_model\": {"
304
+ f.puts " \"sentence\": \"should have changed (from JSON file) #{random_word}\""
305
+ f.puts ' }'
306
+ f.puts '}'
307
+ f.puts ''
180
308
  end
181
309
 
182
310
  expect(Sequel::Seed::Base.descendants.length).to be 0
183
311
  expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
184
312
  expect(Sequel::Seed::Base.descendants.length).to be 1
185
313
  expect(SpecModel.dataset.all.length).to be 1
186
- expect(SpecModel.dataset.first.sentence).to eq 'should have changed'
187
- # Once again
314
+ expect(SpecModel.dataset.first.sentence).to eq "should have changed (from JSON file) #{random_word}"
315
+ end
316
+
317
+ it 'should apply a JSON Seed if it was specified for the given environment' do
318
+ Sequel::Seed.setup environment
319
+
320
+ File.open("#{seed_test_dir}/#{seed_file_name}.json", 'w+') do |f|
321
+ f.puts '{'
322
+ f.puts " \"environment\": \"#{environment}\","
323
+ f.puts " \"model\": {"
324
+ f.puts " \"class\": \"SpecModel\","
325
+ f.puts " \"entries\": ["
326
+ f.puts ' {'
327
+ f.puts " \"sentence\": \"should have changed (from JSON file) #{random_word}\""
328
+ f.puts ' }'
329
+ f.puts ' ]'
330
+ f.puts ' }'
331
+ f.puts '}'
332
+ f.puts ''
333
+ end
334
+
335
+ expect(Sequel::Seed::Base.descendants.length).to be 0
188
336
  expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
337
+ expect(Sequel::Seed::Base.descendants.length).to be 1
338
+ expect(SpecModel.dataset.all.length).to be 1
339
+ expect(SpecModel.dataset.first.sentence).to eq "should have changed (from JSON file) #{random_word}"
340
+ end
341
+
342
+ it 'should apply a JSON file with multiple Seeds descriptors if they were specified for the given environment' do
343
+ Sequel::Seed.setup environment
344
+
345
+ File.open("#{seed_test_dir}/#{seed_file_name}.json", 'w+') do |f|
346
+ f.puts '['
347
+ f.puts ' {'
348
+ f.puts " \"environment\": \"#{environment}\","
349
+ f.puts " \"model\": {"
350
+ f.puts " \"class\": \"SpecModel\","
351
+ f.puts " \"entries\": ["
352
+ f.puts ' {'
353
+ f.puts " \"sentence\": \"should have changed (from JSON file) #{random_word}\""
354
+ f.puts ' }'
355
+ f.puts ' ]'
356
+ f.puts ' }'
357
+ f.puts ' },'
358
+ f.puts ' {'
359
+ f.puts " \"environment\": \"another_#{environment}\","
360
+ f.puts " \"model\": {"
361
+ f.puts " \"class\": \"SpecModel\","
362
+ f.puts " \"entries\": ["
363
+ f.puts ' {'
364
+ f.puts " \"sentence\": \"should have changed (from JSON file) #{random_word}\""
365
+ f.puts ' }'
366
+ f.puts ' ]'
367
+ f.puts ' }'
368
+ f.puts ' }'
369
+ f.puts ']'
370
+ f.puts ''
371
+ end
372
+
189
373
  expect(Sequel::Seed::Base.descendants.length).to be 0
374
+ expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
375
+ expect(Sequel::Seed::Base.descendants.length).to be 1
190
376
  expect(SpecModel.dataset.all.length).to be 1
191
- expect(SpecModel.dataset.first.sentence).to eq 'should have changed'
377
+ expect(SpecModel.dataset.first.sentence).to eq "should have changed (from JSON file) #{random_word}"
192
378
  end
193
- end
194
379
 
195
- context 'when the specified Seed is not applicable to the current environment' do
196
- it 'should not make any change to the database' do
380
+ it 'should not apply a basic Seed if it was not specified for the given environment' do
197
381
  Sequel::Seed.setup environment
198
382
 
199
- File.open("#{seed_test_dir}/#{seed_file_name}", 'w+') do |f|
200
- f.puts "Sequel.seed(:another_#{Faker::Lorem.word}_word) do"
201
- f.puts ' def run'
202
- f.puts ' SpecModel.create :sentence => \'should have changed\''
203
- f.puts ' end'
204
- f.puts 'end'
383
+ File.open("#{seed_test_dir}/#{seed_file_name}.json", 'w+') do |f|
384
+ f.puts '{'
385
+ f.puts " \"environment\": \"another_#{environment}\","
386
+ f.puts " \"spec_model\": {"
387
+ f.puts " \"sentence\": \"should not changed (from JSON file) #{random_word}\""
388
+ f.puts ' }'
389
+ f.puts '}'
390
+ f.puts ''
205
391
  end
206
392
 
207
393
  expect(Sequel::Seed::Base.descendants.length).to be 0
208
394
  expect {Sequel::Seeder.apply(DB, seed_test_dir)}.not_to raise_error
395
+ expect(Sequel::Seed::Base.descendants.length).to be 1
209
396
  expect(SpecModel.dataset.all.length).to be 0
210
397
  end
211
398
  end
data/spec/spec_helper.rb CHANGED
@@ -16,7 +16,7 @@ module Sequel::Seed
16
16
  end
17
17
 
18
18
  def seed_file_name
19
- "#{Time.now.strftime('%Y%m%d%H%M%S')}_testing_#{Faker::Lorem.word}_#{Faker::Lorem.word}.rb"
19
+ "#{Time.now.strftime('%Y%m%d%H%M%S')}_testing_#{Faker::Lorem.word}_#{Faker::Lorem.word}"
20
20
  end
21
21
  end
22
22
  end
@@ -49,4 +49,5 @@ RSpec.configure do |config|
49
49
  end
50
50
  end
51
51
 
52
- class SpecModel < Sequel::Model; end
52
+ class SpecModel < Sequel::Model
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-seed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ewerton Assis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-30 00:00:00.000000000 Z
11
+ date: 2015-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel