application_seeds 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ v0.2.0, 2013-12-27
2
+ ------------------
3
+
4
+ * Changed the seed data file format from a YAML Array to a YAML Hash
5
+ * Added support for seed data labels
6
+ * Added support for generated IDs
7
+ * Added support for integer or UUID ids
8
+
9
+
10
+ v0.1.1, 2013-12-18
11
+ ------------------
12
+
13
+ * No change. Redeployed to fix bad 0.1.0 rubygems push.
14
+
15
+
1
16
  v0.1.0, 2013-12-13
2
17
  ------------------
3
18
 
data/README.md CHANGED
@@ -15,7 +15,7 @@ in a non-production environment.
15
15
  #### Include the gem in your Gemfile
16
16
 
17
17
  group :development do
18
- gem 'application_seeds', :git => 'git@github.com:centro/application_seeds.git'
18
+ gem 'application_seeds'
19
19
  end
20
20
 
21
21
  You should add this gem to any environment group that would need access
@@ -160,6 +160,135 @@ Then, you can seed a remote database by running the following:
160
160
  bundle exec cap <environment> deploy:application_seeds -s dataset=your_data_set
161
161
 
162
162
 
163
+ ## The Seed Files
164
+
165
+ The seed files contain the data that the Rake task works with to
166
+ populate the database. The seed files look and work much like Rails
167
+ fixtures files.
168
+
169
+ Here is an example from the `people.yml` file in this library's test
170
+ suite:
171
+
172
+ ```
173
+ joe_smith:
174
+ first_name: Joe
175
+ last_name: Smith
176
+ company_id: mega_corp
177
+ start_date: <%= 2.months.ago.to_date %>
178
+
179
+ jane_doe:
180
+ first_name: Jane
181
+ last_name: Doe
182
+ company_id: mega_corp
183
+ start_date: <%= 10.months.ago.to_date %>
184
+ ```
185
+
186
+ Seed data must contain a label that is unique to the file.
187
+
188
+
189
+ ### ERB
190
+
191
+ Seed files may contain ERB snippets to support more dynamic data, or
192
+ data that may change over time.
193
+
194
+
195
+ ### Establishing relationships
196
+
197
+ Relationships can be established between seed data files using labels.
198
+ One piece of seed data can specify a `belongs_to` relationship with
199
+ another piece of seed data by specifying the other data's label in the
200
+ `_id` field.
201
+
202
+ In this example, `ApplicationSeeds` will look in the `companies.yml`
203
+ file for a seed data element with the label `mega_corp`.
204
+ ```ruby
205
+ company_id: mega_corp
206
+ ```
207
+
208
+ If the `_id` field does not share a name with the file that the
209
+ corresponding seed data can be found, you can specify the name of the
210
+ seed file, like so:
211
+
212
+ ```ruby
213
+ employer_id: mega_corp (companies)
214
+ ```
215
+
216
+
217
+ #### Many to Many
218
+
219
+ Many to many relationships can be specified using arrays. The name of
220
+ the field must end in `ids` or `uuids`.
221
+
222
+ ```ruby
223
+ company_ids: [mega_corp, ma_and_pa]
224
+ ```
225
+
226
+ If the `_ids` field does not share a name with the file that the
227
+ corresponding seed data can be found, you can specify the name of the
228
+ seed file, like so:
229
+
230
+ ```ruby
231
+ employer_ids: "[mega_corp, ma_and_pa] (companies)"
232
+ ```
233
+
234
+ Here, the array must be enclosed in a string, to prevent the YAML parser
235
+ from erroring out due to invalid YAML syntax.
236
+
237
+
238
+ ### Hard coding IDs
239
+
240
+ By default, `ApplicationSeeds` will generate a unique ID for each piece
241
+ of seed data based on the name of the file containing the data and the
242
+ data's label. The IDs will not change, as long as the name of the file
243
+ containing the seed data and the labels do not change.
244
+
245
+ If you need to specify a specific id for a piece of seed data, you can
246
+ specify the id in the list of attributes.
247
+
248
+ ```ruby
249
+ joe_smith:
250
+ id: 123
251
+ first_name: Joe
252
+ last_name: Smith
253
+ company_id: mega_corp
254
+ start_date: <%= 2.months.ago.to_date %>
255
+ ```
256
+
257
+ `ApplicationSeeds` will not generate an ID for you if one has been
258
+ specified.
259
+
260
+
261
+ ### Examples
262
+
263
+ See `spec/seed_data/test_data_set` for more examples of seed data files.
264
+
265
+
266
+ ## Configuration
267
+
268
+ The `ApplicationSeeds` module can generate integer or UUID ids. You can
269
+ use the `config` method to tell `ApplicationSeeds` which id type you would
270
+ like to use.
271
+
272
+ ID types can be specified at the global level (to be applied to all seed data types)...
273
+ ```ruby
274
+ ApplicationSeeds.config = { :id_type => :uuid }
275
+ ```
276
+
277
+ ...at the data type level (if some types have UUID primary keys and other have integer primary keys)...
278
+ ```ruby
279
+ ApplicationSeeds.config = { :people_id_type => :uuid, :companies_id_type => :integer }
280
+ ```
281
+
282
+ ...or a combination of both (if every type uses integer primary keys except for one, for example)
283
+ ```ruby
284
+ ApplicationSeeds.config = { :id_type => :uuid, :companies_id_type => :integer }
285
+ ```
286
+
287
+ `integer` is the default id type.
288
+
289
+ **`config` needs to be called before the dataset is specified using `dataset=`**
290
+
291
+
163
292
  ## The API
164
293
 
165
294
  The `ApplicationSeeds` module provides an API that enables the programmatic retrieval of seed data,
@@ -226,6 +355,16 @@ The IDs of the object are the keys, and a hash containing the object's attribute
226
355
  An exception is raised if no seed data could be with the given name.
227
356
 
228
357
 
358
+ ### Fetching seed data by label
359
+
360
+ ```ruby
361
+ ApplicationSeeds.campaigns(:some_campaign) # where "campaigns" is the name of the seed file, and :some_campaign is the label of the campaign
362
+ ```
363
+
364
+ This call returns a hash containing the object's attributes. An exception is raised if no
365
+ seed data could be found with the given label.
366
+
367
+
229
368
  ### Fetching seed data by ID
230
369
 
231
370
  ```ruby
@@ -1,3 +1,3 @@
1
1
  module ApplicationSeeds
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,3 +1,5 @@
1
+ require "securerandom"
2
+ require "zlib"
1
3
  require "yaml"
2
4
  require "erb"
3
5
  require "pg"
@@ -20,12 +22,19 @@ require "application_seeds/attributes"
20
22
  # The IDs of the object are the keys, and a hash containing the object's attributes are the values.
21
23
  # An exception is raised if no seed data could be with the given name.
22
24
  #
23
- # === Fetching seed data by ID
25
+ # === Fetching seed data by label
24
26
  #
25
- # ApplicationSeeds.campaigns(1) # where "campaigns" is the name of the seed file, and 1 is the ID of the campaign
27
+ # ApplicationSeeds.campaigns(:label) # where "campaigns" is the name of the seed file, and :label is the label of the campaign
26
28
  #
27
29
  # This call returns a hash containing the object's attributes. An exception is raised if no
28
- # seed data could be found with the given ID.
30
+ # seed data could be found with the given label.
31
+ #
32
+ # === Fetching seed data by id
33
+ #
34
+ # ApplicationSeeds.campaigns(12345) # where "campaigns" is the name of the seed file, and 12345 is the id of the campaign
35
+ #
36
+ # This call returns a hash containing the object's attributes. An exception is raised if no
37
+ # seed data could be found with the given id.
29
38
  #
30
39
  # === Fetching seed data by some other attribute
31
40
  #
@@ -73,6 +82,20 @@ require "application_seeds/attributes"
73
82
  module ApplicationSeeds
74
83
  class << self
75
84
 
85
+ #
86
+ # Specify any configuration, such as the type of ids to generate (:integer or :uuid).
87
+ #
88
+ def config=(config)
89
+ @_config = config
90
+ end
91
+
92
+ #
93
+ # Fetch the configuration.
94
+ #
95
+ def config
96
+ @_config ||= { :id_type => :integer }
97
+ end
98
+
76
99
  #
77
100
  # Specify the name of the gem that contains the application seed data.
78
101
  #
@@ -127,6 +150,8 @@ module ApplicationSeeds
127
150
  end
128
151
 
129
152
  store_dataset(dataset)
153
+ process_labels(dataset)
154
+ load_seed_data(dataset)
130
155
  @dataset = dataset
131
156
  end
132
157
 
@@ -196,28 +221,85 @@ module ApplicationSeeds
196
221
  end
197
222
 
198
223
  def seed_data(type, options)
199
- @seed_data ||= {}
200
- @seed_data[type] ||= load_seed_data(type)
224
+ type = type.to_s
201
225
  raise "No seed data could be found for '#{type}'" if @seed_data[type].nil?
202
226
 
203
227
  if options.nil?
204
228
  fetch(type)
205
229
  elsif options.is_a?(Fixnum) || options.is_a?(String)
206
230
  fetch_with_id(type, options)
231
+ elsif options.is_a?(Symbol)
232
+ fetch_with_label(type, options.to_s)
207
233
  elsif options.is_a? Hash
208
234
  fetch(type) do |attributes|
209
- (options.stringify_keys.to_a - attributes.to_a).empty?
235
+ options.stringify_keys!
236
+ options = replace_labels_with_ids(options)
237
+ (options.to_a - attributes.to_a).empty?
210
238
  end
211
239
  end
212
240
  end
213
241
 
214
- def load_seed_data(type)
215
- data_file = File.join(seed_data_path, @dataset, "#{type}.yml")
216
- if File.exist?(data_file)
217
- YAML.load(ERB.new(File.read(data_file)).result)
218
- else
219
- nil
242
+ def load_seed_data(dataset)
243
+ @seed_data = {}
244
+ seed_files(dataset).each do |seed_file|
245
+ basename = File.basename(seed_file, ".yml")
246
+ data = YAML.load(ERB.new(File.read(seed_file)).result)
247
+ if data
248
+ data.each do |label, attributes|
249
+ data[label] = replace_labels_with_ids(attributes)
250
+ end
251
+ @seed_data[basename] = data
252
+ end
253
+ end
254
+ end
255
+
256
+ def replace_labels_with_ids(attributes)
257
+ new_attributes = {}
258
+ attributes.each do |key, value|
259
+ new_attributes[key] = value
260
+ if key =~ /^(.*)_id$/ || key =~ /^(.*)_uuid$/
261
+ new_attributes[key] = replace_single_label($1.pluralize, value)
262
+ end
263
+
264
+ if key =~ /^(.*)_ids$/ || key =~ /^(.*)_uuids$/
265
+ new_attributes[key] = replace_array_of_labels($1.pluralize, value)
266
+ end
267
+ end
268
+ new_attributes
269
+ end
270
+
271
+ def replace_single_label(type, value)
272
+ # Handle the case where seed data type cannot be determined by the
273
+ # name of the attribute -- employer_id: ma_and_pa (companies)
274
+ if value =~ /\((.*)\)/
275
+ type = $1
276
+ value = value.sub(/\((.*)\)/, "").strip
277
+ end
278
+
279
+ if @seed_labels[type]
280
+ label_ids = @seed_labels[type][value.to_s]
281
+ value = label_ids[id_type(type)] if label_ids
220
282
  end
283
+ value
284
+ end
285
+
286
+ def replace_array_of_labels(type, value)
287
+ # Handle the case where seed data type cannot be determined by the
288
+ # name of the attribute -- employer_ids: [ma_and_pa, super_corp] (companies)
289
+ if value =~ /\((.*)\)/
290
+ type = $1
291
+ value = value.sub(/\((.*)\)/, "").strip
292
+ value =~ /^\[(.*)\]$/
293
+ value = $1.split(',').map(&:strip)
294
+ end
295
+
296
+ if @seed_labels[type]
297
+ value = value.map do |v|
298
+ label_ids = @seed_labels[type][v.to_s]
299
+ (label_ids && label_ids[id_type(type)]) || v
300
+ end
301
+ end
302
+ value
221
303
  end
222
304
 
223
305
  def seed_data_path
@@ -233,9 +315,9 @@ module ApplicationSeeds
233
315
 
234
316
  def fetch(type, &block)
235
317
  result = {}
236
- @seed_data[type].each do |d|
237
- attributes = d.clone
238
- id = attributes.delete('id')
318
+ @seed_data[type].each do |label, attrs|
319
+ attributes = attrs.clone
320
+ id = @seed_labels[type][label][id_type(type)]
239
321
  if !block_given? || (block_given? && yield(attributes) == true)
240
322
  result[id] = Attributes.new(attributes)
241
323
  end
@@ -244,15 +326,65 @@ module ApplicationSeeds
244
326
  end
245
327
 
246
328
  def fetch_with_id(type, id)
247
- data = @seed_data[type].find { |d| d['id'].to_s == id.to_s }
329
+ data = nil
330
+ @seed_labels[type].each do |label, ids|
331
+ if ids.values.map(&:to_s).include?(id.to_s)
332
+ data = @seed_data[type][label]
333
+ data['id'] = @seed_labels[type][label][id_type(type)]
334
+ break
335
+ end
336
+ end
248
337
  raise "No seed data could be found for '#{type}' with id #{id}" if data.nil?
249
338
  Attributes.new(data)
250
339
  end
251
340
 
341
+ def fetch_with_label(type, label)
342
+ data = @seed_data[type][label]
343
+ raise "No seed data could be found for '#{type}' with label #{label}" if data.nil?
344
+ data['id'] = @seed_labels[type][label][id_type(type)]
345
+ Attributes.new(data)
346
+ end
347
+
252
348
  def store_dataset(dataset)
253
349
  Database.create_metadata_table
254
350
  Database.connection.exec("INSERT INTO application_seeds (dataset) VALUES ('#{dataset}');")
255
351
  end
256
352
 
353
+ def process_labels(dataset)
354
+ return @seed_labels unless @seed_labels.nil?
355
+
356
+ @seed_labels = {}
357
+ seed_files(dataset).each do |seed_file|
358
+ seed_type = File.basename(seed_file, ".yml")
359
+ @seed_labels[seed_type] = {}
360
+
361
+ data = YAML.load(File.read(seed_file))
362
+ if data
363
+ data.each do |label, attributes|
364
+ specified_id = attributes['id']
365
+ ids = specified_id.nil? ? generate_unique_ids(seed_type, label) : generate_ids(specified_id)
366
+ @seed_labels[seed_type][label] = ids
367
+ end
368
+ end
369
+ end
370
+ end
371
+
372
+ MAX_ID = 2 ** 30 - 1
373
+ def generate_unique_ids(seed_type, label)
374
+ checksum = Zlib.crc32(seed_type + label) % MAX_ID
375
+ generate_ids(checksum)
376
+ end
377
+
378
+ def generate_ids(id)
379
+ { :integer => id, :uuid => "00000000-0000-0000-0000-%012d" % id }
380
+ end
381
+
382
+ def seed_files(dataset)
383
+ Dir[File.join(seed_data_path, dataset, "*.yml")]
384
+ end
385
+
386
+ def id_type(type)
387
+ self.config["#{type}_id_type".to_sym] || self.config[:id_type]
388
+ end
257
389
  end
258
390
  end
@@ -25,13 +25,13 @@ describe "ApplicationSeeds" do
25
25
 
26
26
  describe "#data_gem_name" do
27
27
  it "defaults to 'application_seed_data'" do
28
- ApplicationSeeds.data_gem_name.should == "application_seed_data"
28
+ expect(ApplicationSeeds.data_gem_name).to eql("application_seed_data")
29
29
  end
30
30
  end
31
31
 
32
32
  describe "#data_directory" do
33
33
  it "is able to set the data directory successfully" do
34
- ApplicationSeeds.data_directory.should == File.join(File.dirname(__FILE__), "seed_data")
34
+ expect(ApplicationSeeds.data_directory).to eql(File.join(File.dirname(__FILE__), "seed_data"))
35
35
  end
36
36
  it "raises an error if a non-existant directory specified" do
37
37
  expect { ApplicationSeeds.data_directory = "/foo/bar" }.to raise_error
@@ -63,7 +63,7 @@ describe "ApplicationSeeds" do
63
63
  ApplicationSeeds.dataset = "test_data_set"
64
64
  end
65
65
  it "sets the dataset" do
66
- ApplicationSeeds.instance_variable_get(:@dataset).should == "test_data_set"
66
+ expect(ApplicationSeeds.instance_variable_get(:@dataset)).to eql("test_data_set")
67
67
  end
68
68
  end
69
69
  end
@@ -76,16 +76,16 @@ describe "ApplicationSeeds" do
76
76
  ApplicationSeeds::Database.should_receive(:connection) { connection_dummy }
77
77
  end
78
78
  it "fetches the dataset name from the database" do
79
- ApplicationSeeds.dataset.should == "test_data_set"
79
+ expect(ApplicationSeeds.dataset).to eql("test_data_set")
80
80
  end
81
81
  end
82
82
 
83
83
  describe "#seed_data_exists?" do
84
84
  it "returns true if the specified seed data exists" do
85
- ApplicationSeeds.seed_data_exists?(:people).should be_true
85
+ expect(ApplicationSeeds.seed_data_exists?(:people)).to be_true
86
86
  end
87
87
  it "returns false if the specified seed data does not exist" do
88
- ApplicationSeeds.seed_data_exists?(:missing).should_not be_true
88
+ expect(ApplicationSeeds.seed_data_exists?(:missing)).to_not be_true
89
89
  end
90
90
  end
91
91
 
@@ -97,17 +97,17 @@ describe "ApplicationSeeds" do
97
97
 
98
98
  describe "#create_object" do
99
99
  before do
100
- @attributes = ApplicationSeeds.people(1)
100
+ @attributes = ApplicationSeeds.people(:joe_smith)
101
101
  @object = ApplicationSeeds.create_object!(Person, @attributes['id'], @attributes)
102
102
  end
103
103
  it "assigns the id" do
104
- @object.id.should == 1
104
+ expect(@object.id).to eql(636095969)
105
105
  end
106
106
  it "assigns the attributes" do
107
- @object.attributes.should == @attributes.reject { |k,v| k == "bogus_attribute" }
107
+ expect(@object.attributes).to eql(@attributes.reject { |k,v| k == "bogus_attribute" })
108
108
  end
109
109
  it "saves the object in the database" do
110
- @object.saved.should be_true
110
+ expect(@object.saved).to be_true
111
111
  end
112
112
  end
113
113
 
@@ -116,20 +116,38 @@ describe "ApplicationSeeds" do
116
116
  @people = ApplicationSeeds.people
117
117
  end
118
118
  it "returns all people" do
119
- @people.size.should == 3
119
+ expect(@people.size).to eql(5)
120
120
  end
121
121
  it "returns the attributes for each person" do
122
- person = @people[2]
123
- person['first_name'].should == "Jane"
124
- person['last_name'].should == "Doe"
122
+ person = @people.values.sort { |a,b| b['start_date'] <=> a['start_date'] }[1]
123
+ expect(person['first_name']).to eql("Jane")
124
+ expect(person['last_name']).to eql("Doe")
125
125
  end
126
126
  end
127
127
 
128
- describe "fetching seed data by id" do
128
+ describe "fetching seed data by label" do
129
129
  it "returns the attributes for each person" do
130
- @person = ApplicationSeeds.people(2)
131
- @person['first_name'].should == "Jane"
132
- @person['last_name'].should == "Doe"
130
+ person = ApplicationSeeds.people(:jane_doe)
131
+ expect(person['first_name']).to eql("Jane")
132
+ expect(person['last_name']).to eql("Doe")
133
+ end
134
+ it "raises an error if no data could be found with the specified label" do
135
+ expect { ApplicationSeeds.people(:bogus) }.to raise_error(RuntimeError)
136
+ end
137
+ end
138
+
139
+ describe "fetching seed data by id" do
140
+ it "can find the seed with an integer id" do
141
+ person = ApplicationSeeds.people(487117267)
142
+ expect(person['id']).to eql(487117267)
143
+ expect(person['first_name']).to eql("Jane")
144
+ expect(person['last_name']).to eql("Doe")
145
+ end
146
+ it "can find the seed with an string id" do
147
+ person = ApplicationSeeds.people("487117267")
148
+ expect(person['id']).to eql(487117267)
149
+ expect(person['first_name']).to eql("Jane")
150
+ expect(person['last_name']).to eql("Doe")
133
151
  end
134
152
  it "raises an error if no data could be found with the specified id" do
135
153
  expect { ApplicationSeeds.people(404) }.to raise_error(RuntimeError)
@@ -138,27 +156,101 @@ describe "ApplicationSeeds" do
138
156
 
139
157
  describe "fetching seed data by property values" do
140
158
  it "returns the found person" do
141
- @people = ApplicationSeeds.people(:last_name => 'Walsh', :company_id => 2)
142
- @people.size.should == 1
143
- @people.values.first['first_name'].should == "John"
144
- @people.values.first['last_name'].should == "Walsh"
159
+ people = ApplicationSeeds.people(:last_name => 'Walsh', :company_id => :ma_and_pa)
160
+ expect(people.size).to eql(1)
161
+ expect(people.values.first['first_name']).to eql("John")
162
+ expect(people.values.first['last_name']).to eql("Walsh")
145
163
  end
146
164
  it "returns multiple people if there are multiple matches" do
147
- @people = ApplicationSeeds.people(:company_id => 1)
148
- @people.size.should == 2
149
- @people.values.first['first_name'].should == "Joe"
150
- @people.values.last['first_name'].should == "Jane"
165
+ people = ApplicationSeeds.people(:company_id => :mega_corp)
166
+ expect(people.size).to eql(2)
167
+ expect(people.values.first['first_name']).to eql("Joe")
168
+ expect(people.values.last['first_name']).to eql("Jane")
169
+ end
170
+ it "can find elements using the id instead of the label" do
171
+ people = ApplicationSeeds.people(:last_name => 'Walsh', :company_id => 47393448)
172
+ expect(people.size).to eql(1)
173
+ expect(people.values.first['first_name']).to eql("John")
174
+ expect(people.values.first['last_name']).to eql("Walsh")
151
175
  end
152
176
  it "returns an empty hash if no matches could be found" do
153
- @people = ApplicationSeeds.people(:last_name => '404')
154
- @people.should == {}
177
+ people = ApplicationSeeds.people(:last_name => '404')
178
+ expect(people).to eql({})
179
+ end
180
+ end
181
+
182
+ describe "specifying ids" do
183
+ it "can fetch people by their specified id" do
184
+ person = ApplicationSeeds.people(456)
185
+ expect(person['id']).to eql(456)
186
+ expect(person['first_name']).to eql("Sam")
187
+ expect(person['last_name']).to eql("Jones")
188
+ expect(person['company_id']).to eql(123)
155
189
  end
156
190
  end
157
191
 
158
192
  describe "ERB" do
159
193
  it "processes ERB snippets in the fixtures" do
160
- @person = ApplicationSeeds.people(1)
161
- @person['start_date'].should == 2.months.ago.to_date
194
+ person = ApplicationSeeds.people(:joe_smith)
195
+ expect(person['start_date']).to eql(2.months.ago.to_date)
196
+ end
197
+ end
198
+
199
+ describe "when specifying the seed data type in the seed data file" do
200
+ it "should look for the seed data in the specified type file" do
201
+ person = ApplicationSeeds.people(:ken_adams)
202
+ expect(person['employer_id']).to eql(47393448)
203
+ end
204
+ end
205
+
206
+ describe "for attributes containing arrays of labels" do
207
+ describe "when the target data type matches the attribute name" do
208
+ it "builds the array of ids" do
209
+ department = ApplicationSeeds.departments(:engineering)
210
+ expect(department['people_ids']).to eql([636095969, 487117267, 10284664])
211
+ end
212
+ end
213
+ describe "when specifying the seed data type in the seed data file" do
214
+ it "should look for the seed data in the specified type file" do
215
+ department = ApplicationSeeds.departments(:sales)
216
+ expect(department['employee_ids']).to eql([456, 420015031])
217
+ end
218
+ end
219
+ end
220
+ end
221
+
222
+ describe "with UUIDs configured for all seed types" do
223
+ before do
224
+ ApplicationSeeds.stub(:store_dataset)
225
+ ApplicationSeeds.config = { :id_type => :uuid }
226
+ ApplicationSeeds.dataset = "test_data_set"
227
+ end
228
+
229
+ describe "when fetching seed data" do
230
+ before do
231
+ @person = ApplicationSeeds.people(:john_walsh)
232
+ end
233
+ it "uses UUIDs for the keys" do
234
+ expect(@person['id']).to eql("00000000-0000-0000-0000-000010284664")
235
+ expect(@person['company_id']).to eql("00000000-0000-0000-0000-000047393448")
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "with data type specific key types configured" do
241
+ before do
242
+ ApplicationSeeds.stub(:store_dataset)
243
+ ApplicationSeeds.config = { :id_type => :uuid, :companies_id_type => :integer }
244
+ ApplicationSeeds.dataset = "test_data_set"
245
+ end
246
+
247
+ describe "when fetching seed data" do
248
+ before do
249
+ @person = ApplicationSeeds.people(:john_walsh)
250
+ end
251
+ it "uses UUIDs for the keys" do
252
+ expect(@person['id']).to eql("00000000-0000-0000-0000-000010284664")
253
+ expect(@person['company_id']).to eql(47393448)
162
254
  end
163
255
  end
164
256
  end
@@ -12,10 +12,10 @@ describe "Attributes" do
12
12
  @selected_attributes = @attributes.select_attributes(:first_name, :occupation)
13
13
  end
14
14
  it "returns only the select attributes" do
15
- @selected_attributes.should == { "first_name" => "Billy", "occupation" => "Bus Driver" }
15
+ expect(@selected_attributes).to eql({ "first_name" => "Billy", "occupation" => "Bus Driver" })
16
16
  end
17
17
  it "returns a new instance of the Attributes class" do
18
- @selected_attributes.is_a?(ApplicationSeeds::Attributes).should be_true
18
+ expect(@selected_attributes).to be_a(ApplicationSeeds::Attributes)
19
19
  end
20
20
  end
21
21
 
@@ -24,10 +24,10 @@ describe "Attributes" do
24
24
  @rejected_attributes = @attributes.reject_attributes(:first_name, :last_name)
25
25
  end
26
26
  it "returns only the select attributes" do
27
- @rejected_attributes.should == { "occupation" => "Bus Driver" }
27
+ expect(@rejected_attributes).to eql({ "occupation" => "Bus Driver" })
28
28
  end
29
29
  it "returns a new instance of the Attributes class" do
30
- @rejected_attributes.is_a?(ApplicationSeeds::Attributes).should be_true
30
+ expect(@rejected_attributes).to be_a(ApplicationSeeds::Attributes)
31
31
  end
32
32
  end
33
33
 
@@ -36,10 +36,10 @@ describe "Attributes" do
36
36
  @mapped_attributes = @attributes.map_attributes(:first_name => :fname, :last_name => :lname)
37
37
  end
38
38
  it "returns only the select attributes" do
39
- @mapped_attributes.should == { "fname" => "Billy", "lname" => "Bob", "occupation" => "Bus Driver" }
39
+ expect(@mapped_attributes).to eql({ "fname" => "Billy", "lname" => "Bob", "occupation" => "Bus Driver" })
40
40
  end
41
41
  it "returns a new instance of the Attributes class" do
42
- @mapped_attributes.is_a?(ApplicationSeeds::Attributes).should be_true
42
+ expect(@mapped_attributes).to be_a(ApplicationSeeds::Attributes)
43
43
  end
44
44
  end
45
45
  end
@@ -0,0 +1,9 @@
1
+ mega_corp:
2
+ name: Megacorp
3
+
4
+ ma_and_pa:
5
+ name: Ma and Pa
6
+
7
+ global_corp:
8
+ id: 123
9
+ name: Global Corp
@@ -0,0 +1,5 @@
1
+ engineering:
2
+ people_ids: [joe_smith, jane_doe, john_walsh]
3
+
4
+ sales:
5
+ employee_ids: "[sam_jones, ken_adams] (people)"
@@ -1,21 +1,33 @@
1
- - id: 1
1
+ joe_smith:
2
2
  first_name: Joe
3
3
  last_name: Smith
4
- company_id: 1
4
+ company_id: mega_corp
5
5
  start_date: <%= 2.months.ago.to_date %>
6
6
  bogus_attribute: foo
7
7
 
8
- - id: 2
8
+ jane_doe:
9
9
  first_name: Jane
10
10
  last_name: Doe
11
- company_id: 1
11
+ company_id: mega_corp
12
12
  start_date: <%= 10.months.ago.to_date %>
13
13
  bogus_attribute: foo
14
14
 
15
- - id: 3
15
+ john_walsh:
16
16
  first_name: John
17
17
  last_name: Walsh
18
- company_id: 2
18
+ company_id: ma_and_pa
19
19
  start_date: <%= 10.years.ago.to_date %>
20
20
  bogus_attribute: foo
21
21
 
22
+ sam_jones:
23
+ id: 456
24
+ first_name: Sam
25
+ last_name: Jones
26
+ company_id: 123
27
+ start_date: <%= 10.years.ago.to_date %>
28
+
29
+ ken_adams:
30
+ first_name: Sam
31
+ last_name: Jones
32
+ employer_id: ma_and_pa (companies)
33
+ start_date: <%= 10.years.ago.to_date %>
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.1.1
4
+ version: 0.2.0
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-12-18 00:00:00.000000000 Z
12
+ date: 2013-12-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -96,6 +96,8 @@ files:
96
96
  - lib/application_seeds/version.rb
97
97
  - spec/application_seeds_spec.rb
98
98
  - spec/attributes_spec.rb
99
+ - spec/seed_data/test_data_set/companies.yml
100
+ - spec/seed_data/test_data_set/departments.yml
99
101
  - spec/seed_data/test_data_set/people.yml
100
102
  homepage: https://github.com/centro/application_seeds
101
103
  licenses:
@@ -112,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
114
  version: '0'
113
115
  segments:
114
116
  - 0
115
- hash: -2507870664277068952
117
+ hash: -987523196009034101
116
118
  required_rubygems_version: !ruby/object:Gem::Requirement
117
119
  none: false
118
120
  requirements:
@@ -121,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
123
  version: '0'
122
124
  segments:
123
125
  - 0
124
- hash: -2507870664277068952
126
+ hash: -987523196009034101
125
127
  requirements: []
126
128
  rubyforge_project:
127
129
  rubygems_version: 1.8.23
@@ -132,4 +134,6 @@ summary: A library for managing a standardized set of seed data for applications
132
134
  test_files:
133
135
  - spec/application_seeds_spec.rb
134
136
  - spec/attributes_spec.rb
137
+ - spec/seed_data/test_data_set/companies.yml
138
+ - spec/seed_data/test_data_set/departments.yml
135
139
  - spec/seed_data/test_data_set/people.yml