fixture_dependencies 1.2.6 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007-2010 Jeremy Evans
1
+ Copyright (c) 2007-2011 Jeremy Evans
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README CHANGED
@@ -7,7 +7,7 @@ the following features:
7
7
  - Fixtures specify association names instead of foreign keys
8
8
  - Support both Sequel and ActiveRecord
9
9
  - Supports many_to_one/belongs_to, one_to_many/has_many,
10
- many_to_many/has_and_belongs_to_many, and has_one associations
10
+ many_to_many/has_and_belongs_to_many, and has_one/one_to_one associations
11
11
  - Loads a fixture's dependency graph in such a manner that foreign key
12
12
  constraints aren't violated
13
13
  - Has a very simple API (FixtureDependencies.load(:model__fixture))
@@ -128,7 +128,7 @@ using the following syntax:
128
128
 
129
129
  This would load just the jeremy fixture and its dependencies. I find this is
130
130
  much better than loading all fixtures in most of my test suites. Even better
131
- is loading just the fixtures you want instead every test method (see below).
131
+ is loading just the fixtures you want inside every test method (see below).
132
132
  This leads to the most robust testing.
133
133
 
134
134
  == Loading fixtures inside test methods
@@ -244,6 +244,13 @@ test/test_helper.rb:
244
244
  This will give a verbose description of the loading and saving of fixtures for
245
245
  every test, including the recursive loading of the dependency graph.
246
246
 
247
+ == Specs
248
+
249
+ The specs for fixture dependencies and be run with Rake. They require
250
+ the sequel, activerecord, and sqlite3 gems installed. The default rake task
251
+ runs the specs. You should run the spec_migrate task first to create the
252
+ spec database.
253
+
247
254
  == Similar Ideas
248
255
 
249
256
  Rails now supports something similar by default. Honestly, I'm not sure what
@@ -255,8 +262,8 @@ it doesn't support has_* associations.
255
262
 
256
263
  == License
257
264
 
258
- fixture_dependencies is released under the MIT License. See the LICENSE file
259
- for details.
265
+ fixture_dependencies is released under the MIT License. See the MIT-LICENSE
266
+ file for details.
260
267
 
261
268
  == Author
262
269
 
@@ -76,7 +76,7 @@ class << FixtureDependencies
76
76
  def get(record)
77
77
  model_name, name = split_name(record)
78
78
  model = model_name.camelize.constantize
79
- model_method(:model_find, model_type(model), model, fixtures[model_name.to_sym][name.to_sym][model.primary_key.to_sym])
79
+ model_method(:model_find, model_type(model), model, fixtures[model_name.to_sym][name.to_sym][fixture_pk(model)])
80
80
  end
81
81
 
82
82
  # Adds all fixtures in the yaml fixture file for the model to the fixtures
@@ -145,16 +145,19 @@ class << FixtureDependencies
145
145
  end
146
146
  mtype = model_type(model)
147
147
  model_method(:raise_model_error, mtype, "Couldn't use fixture #{record.inspect}") unless attributes = fixtures[model_name.to_sym][name.to_sym]
148
+ fpk = fixture_pk(model)
149
+ cpk = fpk.is_a?(Array)
148
150
  # return if object has already been loaded into the database
149
- if existing_obj = model_method(:model_find_by_pk, mtype, model, attributes[model.primary_key.to_sym])
150
- puts "#{spaces}using #{record}: already in database" if verbose > 2
151
+ if existing_obj = model_method(:model_find_by_pk, mtype, model, fixture_pkv(attributes,fpk))
152
+ puts "#{spaces}using #{record}: already in database (pk: #{fixture_pkv(attributes,fpk).inspect})" if verbose > 2
151
153
  loading.pop
152
154
  return existing_obj
153
155
  end
154
156
  obj = model.respond_to?(:sti_key) ? attributes[model.sti_key].to_s.camelize.constantize.new : model.new
155
- puts "#{spaces}#{model} STI plugin detected, initializing instance of #{obj}" if (verbose > 1 && model.sti_dataset)
157
+ puts "#{spaces}#{model} STI plugin detected, initializing instance of #{obj}" if (verbose > 1 && model.respond_to?(:sti_dataset))
156
158
  many_associations = []
157
159
  attributes.each do |attr, value|
160
+ next if attr.is_a?(Array)
158
161
  if reflection = model_method(:reflection, mtype, model, attr.to_sym)
159
162
  if [:belongs_to, :many_to_one].include?(model_method(:reflection_type, mtype, reflection))
160
163
  dep_name = "#{model_method(:reflection_class, mtype, reflection).name.underscore}__#{value}".to_sym
@@ -162,13 +165,20 @@ class << FixtureDependencies
162
165
  # Self referential record, use primary key
163
166
  puts "#{spaces}#{record}.#{attr}: belongs_to self-referential" if verbose > 1
164
167
  attr = model_method(:reflection_key, mtype, reflection)
165
- value = attributes[model.primary_key.to_sym]
168
+ value = fixture_pkv(attributes,fpk)
169
+ if cpk
170
+ attr.zip(value).each do |k, v|
171
+ puts "#{spaces}#{record}.#{k} = #{v.inspect}" if verbose > 2
172
+ obj.send("#{k}=", v)
173
+ end
174
+ next
175
+ end
166
176
  elsif loading.include?(dep_name)
167
177
  # Association cycle detected, set foreign key for this model afterward using procs
168
178
  # This is will fail if the column is set to not null or validates_presence_of
169
179
  puts "#{spaces}#{record}.#{attr}: belongs-to cycle detected:#{dep_name}" if verbose > 1
170
180
  (procs[dep_name] ||= []) << Proc.new do |assoc|
171
- m = model_method(:model_find, mtype, model, attributes[model.primary_key.to_sym])
181
+ m = model_method(:model_find, mtype, model, fixture_pkv(attributes,fpk))
172
182
  m.send("#{attr}=", assoc)
173
183
  model_method(:model_save, mtype, m)
174
184
  end
@@ -192,7 +202,7 @@ class << FixtureDependencies
192
202
 
193
203
  model_method(:model_save, mtype, obj)
194
204
  # after saving the model, we set the primary key within the fixture hash, in case it was not explicitly specified in the fixture and was generated by an auto_increment / serial field
195
- fixtures[model_name.to_sym][name.to_sym][model.primary_key.to_sym] ||= obj[model.primary_key.to_sym]
205
+ fixtures[model_name.to_sym][name.to_sym][fpk] ||= fixture_pkv(obj,fpk)
196
206
 
197
207
  loading.pop
198
208
  # Update the circular references
@@ -224,4 +234,22 @@ class << FixtureDependencies
224
234
  end
225
235
  obj
226
236
  end
237
+
238
+ def fixture_pk(model)
239
+ case pk = model.primary_key
240
+ when Symbol, Array
241
+ pk
242
+ else
243
+ pk.to_sym
244
+ end
245
+ end
246
+
247
+ def fixture_pkv(attributes, fpk)
248
+ case fpk
249
+ when Symbol
250
+ attributes[fpk]
251
+ else
252
+ fpk.map{|v| attributes[v]}
253
+ end
254
+ end
227
255
  end
@@ -22,7 +22,7 @@ class << FixtureDependencies
22
22
  end
23
23
 
24
24
  def raise_model_error_AR(message)
25
- ActiveRecord::RecordNotFound
25
+ raise ActiveRecord::RecordNotFound, message
26
26
  end
27
27
 
28
28
  def reflection_AR(model, attr)
@@ -23,7 +23,7 @@ class << FixtureDependencies
23
23
  end
24
24
 
25
25
  def raise_model_error_S(message)
26
- Sequel::Error
26
+ raise Sequel::Error, message
27
27
  end
28
28
 
29
29
  def reflection_S(model, attr)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixture_dependencies
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 2
9
- - 6
10
- version: 1.2.6
8
+ - 3
9
+ - 0
10
+ version: 1.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jeremy Evans
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-03 00:00:00 -08:00
18
+ date: 2011-04-13 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21