application_seeds 0.4.2 → 0.4.3

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/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ v0.4.3, 2014-02-22
2
+ ------------------
3
+
4
+ * Only parse the seed data files once.
5
+
6
+
1
7
  v0.4.2, 2014-02-18
2
8
  ------------------
3
9
 
@@ -1,3 +1,3 @@
1
1
  module ApplicationSeeds
2
- VERSION = "0.4.2"
2
+ VERSION = "0.4.3"
3
3
  end
@@ -141,6 +141,9 @@ module ApplicationSeeds
141
141
  # the dataset could not be found.
142
142
  #
143
143
  def dataset=(dataset)
144
+ clear_cached_data
145
+ @dataset = dataset
146
+
144
147
  if dataset.nil? || dataset.strip.empty? || dataset_path(dataset).nil?
145
148
  datasets = Dir[File.join(seed_data_path, "**", "*")].select { |x| File.directory?(x) }.map { |x| File.basename(x) }.join(', ')
146
149
 
@@ -150,11 +153,7 @@ module ApplicationSeeds
150
153
  raise error_message
151
154
  end
152
155
 
153
- store_dataset(dataset)
154
- find_seed_data_files(dataset)
155
- process_labels(dataset)
156
- load_seed_data(dataset)
157
- @dataset = dataset
156
+ store_dataset
158
157
  end
159
158
 
160
159
  #
@@ -190,7 +189,7 @@ module ApplicationSeeds
190
189
  # ApplicationSeeds.seed_data_exists?(:campaigns)
191
190
  #
192
191
  def seed_data_exists?(type)
193
- !@seed_data[type.to_s].nil?
192
+ !processed_seed_data[type.to_s].nil?
194
193
  end
195
194
 
196
195
  #
@@ -218,46 +217,92 @@ module ApplicationSeeds
218
217
 
219
218
  private
220
219
 
221
- def method_missing(method, *args)
222
- self.send(:seed_data, method, args.shift)
220
+ def dataset_path(dataset)
221
+ Dir[File.join(seed_data_path, "**", "*")].select { |x| File.directory?(x) && File.basename(x) == dataset }.first
223
222
  end
224
223
 
225
- def seed_data(type, options)
226
- type = type.to_s
227
- raise "No seed data file could be found for '#{type}'" if @seed_data[type].nil?
224
+ def store_dataset
225
+ Database.create_metadata_table
226
+ Database.connection.exec("INSERT INTO application_seeds (dataset) VALUES ('#{@dataset}');")
227
+ end
228
228
 
229
- if options.nil?
230
- fetch(type)
231
- elsif options.is_a?(Fixnum) || options.is_a?(String)
232
- fetch_with_id(type, options)
233
- elsif options.is_a?(Symbol)
234
- fetch_with_label(type, options.to_s)
235
- elsif options.is_a? Hash
236
- fetch(type) do |attributes|
237
- options.stringify_keys!
238
- options = replace_labels_with_ids(options)
239
- (options.to_a - attributes.to_a).empty?
229
+ def seed_data_path
230
+ return @seed_data_path unless @seed_data_path.nil?
231
+
232
+ if data_directory
233
+ @seed_data_path = data_directory
234
+ else
235
+ spec = Gem::Specification.find_by_name(data_gem_name)
236
+ @seed_data_path = File.join(spec.gem_dir, "lib", "seeds")
237
+ end
238
+ @seed_data_path
239
+ end
240
+
241
+ def seed_data_files
242
+ return @seed_data_files unless @seed_data_files.nil?
243
+
244
+ @seed_data_files = []
245
+ path = dataset_path(@dataset)
246
+ while (seed_data_path != path) do
247
+ @seed_data_files.concat(Dir[File.join(path, "*.yml")])
248
+ path.sub!(/\/[^\/]+$/, "")
249
+ end
250
+ @seed_data_files
251
+ end
252
+
253
+ def raw_seed_data
254
+ return @raw_seed_data unless @raw_seed_data.nil?
255
+
256
+ @raw_seed_data = {}
257
+ seed_data_files.each do |seed_file|
258
+ data = YAML.load(ERB.new(File.read(seed_file)).result)
259
+ if data
260
+ @raw_seed_data[seed_file] = data
261
+ end
262
+ end
263
+ @raw_seed_data
264
+ end
265
+
266
+ def seed_labels
267
+ return @seed_labels unless @seed_labels.nil?
268
+
269
+ @seed_labels = {}
270
+ seed_data_files.each do |seed_file|
271
+ seed_type = File.basename(seed_file, ".yml")
272
+ @seed_labels[seed_type] ||= {}
273
+
274
+ data = raw_seed_data[seed_file]
275
+ if data
276
+ data.each do |label, attributes|
277
+ specified_id = attributes['id']
278
+ ids = specified_id.nil? ? generate_unique_ids(seed_type, label) : generate_ids(specified_id)
279
+ @seed_labels[seed_type][label] = ids
280
+ end
240
281
  end
241
282
  end
283
+ @seed_labels
242
284
  end
243
285
 
244
- def load_seed_data(dataset)
245
- @seed_data = {}
246
- @seed_data_files.each do |seed_file|
286
+ def processed_seed_data
287
+ return @processed_seed_data unless @processed_seed_data.nil?
288
+
289
+ @processed_seed_data = {}
290
+ seed_data_files.each do |seed_file|
247
291
  basename = File.basename(seed_file, ".yml")
248
- data = YAML.load(ERB.new(File.read(seed_file)).result)
292
+ data = raw_seed_data[seed_file]
249
293
  if data
250
294
  data.each do |label, attributes|
251
295
  data[label] = replace_labels_with_ids(attributes)
252
296
  end
253
297
 
254
- if @seed_data[basename].nil?
255
- @seed_data[basename] = data
298
+ if processed_seed_data[basename].nil?
299
+ processed_seed_data[basename] = data
256
300
  else
257
- @seed_data[basename] = data.merge(@seed_data[basename])
301
+ processed_seed_data[basename] = data.merge(processed_seed_data[basename])
258
302
  end
259
303
  end
260
304
  end
305
+ @processed_seed_data
261
306
  end
262
307
 
263
308
  def replace_labels_with_ids(attributes)
@@ -283,8 +328,8 @@ module ApplicationSeeds
283
328
  value = value.sub(/\((.*)\)/, "").strip
284
329
  end
285
330
 
286
- if @seed_labels[type]
287
- label_ids = @seed_labels[type][value.to_s]
331
+ if seed_labels[type]
332
+ label_ids = seed_labels[type][value.to_s]
288
333
  value = label_ids[id_type(type)] if label_ids
289
334
  end
290
335
  value
@@ -300,35 +345,43 @@ module ApplicationSeeds
300
345
  value = $1.split(',').map(&:strip)
301
346
  end
302
347
 
303
- if @seed_labels[type]
348
+ if seed_labels[type]
304
349
  value = value.map do |v|
305
- label_ids = @seed_labels[type][v.to_s]
350
+ label_ids = seed_labels[type][v.to_s]
306
351
  (label_ids && label_ids[id_type(type)]) || v
307
352
  end
308
353
  end
309
354
  value
310
355
  end
311
356
 
312
- def seed_data_path
313
- return @seed_data_path unless @seed_data_path.nil?
314
-
315
- if data_directory
316
- @seed_data_path = data_directory
317
- else
318
- spec = Gem::Specification.find_by_name(data_gem_name)
319
- @seed_data_path = File.join(spec.gem_dir, "lib", "seeds")
320
- end
357
+ def method_missing(method, *args)
358
+ self.send(:seed_data, method, args.shift)
321
359
  end
322
360
 
323
- def dataset_path(dataset)
324
- Dir[File.join(seed_data_path, "**", "*")].select { |x| File.directory?(x) && File.basename(x) == dataset }.first
361
+ def seed_data(type, options)
362
+ type = type.to_s
363
+ raise "No seed data file could be found for '#{type}'" if processed_seed_data[type].nil?
364
+
365
+ if options.nil?
366
+ fetch(type)
367
+ elsif options.is_a?(Fixnum) || options.is_a?(String)
368
+ fetch_with_id(type, options)
369
+ elsif options.is_a?(Symbol)
370
+ fetch_with_label(type, options.to_s)
371
+ elsif options.is_a? Hash
372
+ fetch(type) do |attributes|
373
+ options.stringify_keys!
374
+ options = replace_labels_with_ids(options)
375
+ (options.to_a - attributes.to_a).empty?
376
+ end
377
+ end
325
378
  end
326
379
 
327
380
  def fetch(type, &block)
328
381
  result = {}
329
- @seed_data[type].each do |label, attrs|
382
+ processed_seed_data[type].each do |label, attrs|
330
383
  attributes = attrs.clone
331
- id = @seed_labels[type][label][id_type(type)]
384
+ id = seed_labels[type][label][id_type(type)]
332
385
  if !block_given? || (block_given? && yield(attributes) == true)
333
386
  result[id] = Attributes.new(attributes)
334
387
  end
@@ -338,10 +391,10 @@ module ApplicationSeeds
338
391
 
339
392
  def fetch_with_id(type, id)
340
393
  data = nil
341
- @seed_labels[type].each do |label, ids|
394
+ seed_labels[type].each do |label, ids|
342
395
  if ids.values.map(&:to_s).include?(id.to_s)
343
- data = @seed_data[type][label]
344
- data['id'] = @seed_labels[type][label][id_type(type)]
396
+ data = processed_seed_data[type][label]
397
+ data['id'] = seed_labels[type][label][id_type(type)]
345
398
  break
346
399
  end
347
400
  end
@@ -350,45 +403,12 @@ module ApplicationSeeds
350
403
  end
351
404
 
352
405
  def fetch_with_label(type, label)
353
- data = @seed_data[type][label]
406
+ data = processed_seed_data[type][label]
354
407
  raise "No seed data could be found for '#{type}' with label #{label}" if data.nil?
355
- data['id'] = @seed_labels[type][label][id_type(type)]
408
+ data['id'] = seed_labels[type][label][id_type(type)]
356
409
  Attributes.new(data)
357
410
  end
358
411
 
359
- def store_dataset(dataset)
360
- Database.create_metadata_table
361
- Database.connection.exec("INSERT INTO application_seeds (dataset) VALUES ('#{dataset}');")
362
- end
363
-
364
- def find_seed_data_files(dataset)
365
- @seed_data_files = []
366
- path = dataset_path(dataset)
367
- while (seed_data_path != path) do
368
- @seed_data_files.concat(Dir[File.join(path, "*.yml")])
369
- path.sub!(/\/[^\/]+$/, "")
370
- end
371
- end
372
-
373
- def process_labels(dataset)
374
- return @seed_labels unless @seed_labels.nil?
375
-
376
- @seed_labels = {}
377
- @seed_data_files.each do |seed_file|
378
- seed_type = File.basename(seed_file, ".yml")
379
- @seed_labels[seed_type] = {}
380
-
381
- data = YAML.load(File.read(seed_file))
382
- if data
383
- data.each do |label, attributes|
384
- specified_id = attributes['id']
385
- ids = specified_id.nil? ? generate_unique_ids(seed_type, label) : generate_ids(specified_id)
386
- @seed_labels[seed_type][label] = ids
387
- end
388
- end
389
- end
390
- end
391
-
392
412
  MAX_ID = 2 ** 30 - 1
393
413
  def generate_unique_ids(seed_type, label)
394
414
  checksum = Zlib.crc32(seed_type + label) % MAX_ID
@@ -402,5 +422,12 @@ module ApplicationSeeds
402
422
  def id_type(type)
403
423
  self.config["#{type}_id_type".to_sym] || self.config[:id_type]
404
424
  end
425
+
426
+ def clear_cached_data
427
+ @seed_labels = nil
428
+ @processed_seed_data = nil
429
+ @raw_seed_data = nil
430
+ @seed_data_files = nil
431
+ end
405
432
  end
406
433
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: application_seeds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
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: 2014-02-18 00:00:00.000000000 Z
12
+ date: 2014-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -118,18 +118,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
118
  - - ! '>='
119
119
  - !ruby/object:Gem::Version
120
120
  version: '0'
121
- segments:
122
- - 0
123
- hash: -4329626618656842482
124
121
  required_rubygems_version: !ruby/object:Gem::Requirement
125
122
  none: false
126
123
  requirements:
127
124
  - - ! '>='
128
125
  - !ruby/object:Gem::Version
129
126
  version: '0'
130
- segments:
131
- - 0
132
- hash: -4329626618656842482
133
127
  requirements: []
134
128
  rubyforge_project:
135
129
  rubygems_version: 1.8.23
@@ -147,3 +141,4 @@ test_files:
147
141
  - spec/seed_data/test_inheritable_data_set/level_2/departments.yml
148
142
  - spec/seed_data/test_inheritable_data_set/level_2/level_3/people.yml
149
143
  - spec/seed_data/test_inheritable_data_set/level_2/people.yml
144
+ has_rdoc: