composite_primary_keys 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -17,10 +17,6 @@ RELEASE_NAME = "REL #{PKG_VERSION}"
17
17
  RUBY_FORGE_PROJECT = "compositekeys"
18
18
  RUBY_FORGE_USER = "nicwilliams"
19
19
 
20
- PKG_FILES = FileList[
21
- "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "scripts/**/*", "website/**/*", "[A-Z]*", "install.rb", "CHANGELOG", "README", "Rakefile"
22
- ].exclude(/\bCVS\b|~$/)
23
-
24
20
 
25
21
  desc "Default Task"
26
22
  task :default => [ :test_mysql ] # UNTESTED =, :test_sqlite, :test_postgresql ]
@@ -2,18 +2,18 @@ module CompositePrimaryKeys
2
2
  module ActiveRecord #:nodoc:
3
3
  class CompositeKeyError < StandardError #:nodoc:
4
4
  end
5
-
5
+
6
6
  module Base #:nodoc:
7
-
7
+
8
8
  INVALID_FOR_COMPOSITE_KEYS = 'Not appropriate for composite primary keys'
9
9
  NOT_IMPLEMENTED_YET = 'Not implemented for composite primary keys yet'
10
-
10
+
11
11
  def self.append_features(base)
12
12
  super
13
13
  base.send(:include, InstanceMethods)
14
14
  base.extend(ClassMethods)
15
15
  end
16
-
16
+
17
17
  module ClassMethods
18
18
  def set_primary_keys(*keys)
19
19
  keys = keys.first if keys.first.is_a?(Array)
@@ -35,7 +35,7 @@ module CompositePrimaryKeys
35
35
  module InstanceMethods
36
36
  def composite?; self.class.composite?; end
37
37
  end
38
-
38
+
39
39
  module CompositeInstanceMethods
40
40
 
41
41
  # A model instance's primary keys is always available as model.ids
@@ -43,7 +43,7 @@ module CompositePrimaryKeys
43
43
  def id
44
44
  attr_names = self.class.primary_keys
45
45
  CompositeIds.new(
46
- attr_names.map {|attr_name| read_attribute(attr_name)}
46
+ attr_names.map {|attr_name| read_attribute(attr_name)}
47
47
  )
48
48
  end
49
49
  alias_method :ids, :id
@@ -53,16 +53,16 @@ module CompositePrimaryKeys
53
53
  end
54
54
 
55
55
  def id_before_type_cast #:nodoc:
56
- raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::NOT_IMPLEMENTED_YET
56
+ raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::NOT_IMPLEMENTED_YET
57
57
  end
58
-
58
+
59
59
  def quoted_id #:nodoc:
60
60
  [self.class.primary_keys, ids].
61
- transpose.
62
- map {|attr_name,id| quote(id, column_for_attribute(attr_name))}.
63
- to_composite_ids
61
+ transpose.
62
+ map {|attr_name,id| quote(id, column_for_attribute(attr_name))}.
63
+ to_composite_ids
64
64
  end
65
-
65
+
66
66
  # Sets the primary ID.
67
67
  def id=(ids)
68
68
  ids = ids.split(ID_SEP) if ids.is_a?(String)
@@ -73,7 +73,7 @@ module CompositePrimaryKeys
73
73
  [primary_keys, ids].transpose.each {|key, an_id| write_attribute(key , an_id)}
74
74
  id
75
75
  end
76
-
76
+
77
77
  # Returns a clone of the record that hasn't been assigned an id yet and
78
78
  # is treated as a new record. Note that this is a "shallow" clone:
79
79
  # it copies the object's attributes only, not its associations.
@@ -86,7 +86,7 @@ module CompositePrimaryKeys
86
86
  record.send :instance_variable_set, '@attributes', attrs
87
87
  end
88
88
  end
89
-
89
+
90
90
  # Define an attribute reader method. Cope with nil column.
91
91
  def define_read_method(symbol, attr_name, column)
92
92
  cast_code = column.type_cast_code('v') if column
@@ -103,8 +103,8 @@ module CompositePrimaryKeys
103
103
  def method_missing(method_id, *args, &block)
104
104
  method_name = method_id.to_s
105
105
  if @attributes.include?(method_name) or
106
- (md = /\?$/.match(method_name) and
107
- @attributes.include?(method_name = md.pre_match))
106
+ (md = /\?$/.match(method_name) and
107
+ @attributes.include?(method_name = md.pre_match))
108
108
  define_read_methods if self.class.read_methods.empty? && self.class.generate_read_methods
109
109
  md ? query_attribute(method_name) : read_attribute(method_name)
110
110
  elsif self.class.primary_keys.include? method_name.to_sym
@@ -113,10 +113,10 @@ module CompositePrimaryKeys
113
113
  attribute_name, method_type = md.pre_match, md.to_s
114
114
  if @attributes.include?(attribute_name)
115
115
  case method_type
116
- when '='
117
- write_attribute(attribute_name, args.first)
118
- when '_before_type_cast'
119
- read_attribute_before_type_cast(attribute_name)
116
+ when '='
117
+ write_attribute(attribute_name, args.first)
118
+ when '_before_type_cast'
119
+ read_attribute_before_type_cast(attribute_name)
120
120
  end
121
121
  else
122
122
  super
@@ -126,15 +126,15 @@ module CompositePrimaryKeys
126
126
  end
127
127
  end
128
128
 
129
- private
129
+ private
130
130
  # The xx_without_callbacks methods are overwritten as that is the end of the alias chain
131
-
131
+
132
132
  # Creates a new record with values matching those of the instance attributes.
133
133
  def create_without_callbacks
134
134
  unless self.id
135
135
  raise CompositeKeyError, "Composite keys do not generated ids from sequences, you must provide id values"
136
136
  end
137
-
137
+
138
138
  connection.insert(
139
139
  "INSERT INTO #{self.class.table_name} " +
140
140
  "(#{quoted_column_names.join(', ')}) " +
@@ -160,97 +160,100 @@ module CompositePrimaryKeys
160
160
  # Deletes the record in the database and freezes this instance to reflect that no changes should
161
161
  # be made (since they can't be persisted).
162
162
  def destroy_without_callbacks
163
- unless new_record?
164
- connection.delete <<-end_sql, "#{self.class.name} Destroy"
165
- DELETE FROM #{self.class.table_name}
166
- WHERE (#{self.class.primary_key}) = (#{quoted_id})
167
- end_sql
163
+ where_class = [self.class.primary_key, quoted_id].transpose.map do |pair|
164
+ "(#{pair[0]} = #{pair[1]})"
165
+ end.join(" AND ")
166
+ unless new_record?
167
+ connection.delete(
168
+ "DELETE FROM #{self.class.table_name} " +
169
+ "WHERE #{where_class}",
170
+ "#{self.class.name} Destroy"
171
+ )
172
+ end
173
+ freeze
168
174
  end
169
-
170
- freeze
175
+
171
176
  end
172
-
173
- end
174
-
175
- module CompositeClassMethods
176
- def primary_key; primary_keys; end
177
- def primary_key=(keys); primary_keys = keys; end
178
177
 
179
- def composite?
180
- true
181
- end
182
-
183
- #ids_to_s([[1,2],[7,3]]) -> "(1,2),(7,3)"
184
- #ids_to_s([[1,2],[7,3]], ',', ';') -> "1,2;7,3"
185
- def ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')')
186
- many_ids.map {|ids| "#{left_bracket}#{ids}#{right_bracket}"}.join(list_sep)
187
- end
188
-
189
- # Returns true if the given +ids+ represents the primary keys of a record in the database, false otherwise.
190
- # Example:
191
- # Person.exists?(5,7)
192
- def exists?(ids)
193
- obj = find(ids) rescue false
178
+ module CompositeClassMethods
179
+ def primary_key; primary_keys; end
180
+ def primary_key=(keys); primary_keys = keys; end
181
+
182
+ def composite?
183
+ true
184
+ end
185
+
186
+ #ids_to_s([[1,2],[7,3]]) -> "(1,2),(7,3)"
187
+ #ids_to_s([[1,2],[7,3]], ',', ';') -> "1,2;7,3"
188
+ def ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')')
189
+ many_ids.map {|ids| "#{left_bracket}#{ids}#{right_bracket}"}.join(list_sep)
190
+ end
191
+
192
+ # Returns true if the given +ids+ represents the primary keys of a record in the database, false otherwise.
193
+ # Example:
194
+ # Person.exists?(5,7)
195
+ def exists?(ids)
196
+ obj = find(ids) rescue false
194
197
  !obj.nil? and obj.is_a?(self)
195
- end
196
-
197
- # Deletes the record with the given +ids+ without instantiating an object first, e.g. delete(1,2)
198
- # If an array of ids is provided (e.g. delete([1,2], [3,4]), all of them
199
- # are deleted.
200
- def delete(*ids)
201
- unless ids.is_a?(Array); raise "*ids must be an Array"; end
202
- ids = [ids.to_composite_ids] if not ids.first.is_a?(Array)
203
- delete_all([ "(#{primary_keys}) IN (#{ids_to_s(ids)})" ])
204
- end
205
-
206
- # Destroys the record with the given +ids+ by instantiating the object and calling #destroy (all the callbacks are the triggered).
207
- # If an array of ids is provided, all of them are destroyed.
208
- def destroy(*ids)
209
- unless ids.is_a?(Array); raise "*ids must be an Array"; end
210
- if ids.first.is_a?(Array)
211
- ids = ids.map{|compids| compids.to_composite_ids}
212
- else
213
- ids = ids.to_composite_ids
214
198
  end
215
- ids.first.is_a?(CompositeIds) ? ids.each { |id_set| find(id_set).destroy } : find(ids).destroy
216
- end
217
-
218
- # Returns an array of column objects for the table associated with this class.
219
- # Each column that matches to one of the primary keys has its
220
- # primary attribute set to true
221
- def columns
222
- unless @columns
223
- @columns = connection.columns(table_name, "#{name} Columns")
224
- @columns.each {|column| column.primary = primary_keys.include?(column.name.to_sym)}
199
+
200
+ # Deletes the record with the given +ids+ without instantiating an object first, e.g. delete(1,2)
201
+ # If an array of ids is provided (e.g. delete([1,2], [3,4]), all of them
202
+ # are deleted.
203
+ def delete(*ids)
204
+ unless ids.is_a?(Array); raise "*ids must be an Array"; end
205
+ ids = [ids.to_composite_ids] if not ids.first.is_a?(Array)
206
+ delete_all([ "(#{primary_keys}) IN (#{ids_to_s(ids)})" ])
207
+ end
208
+
209
+ # Destroys the record with the given +ids+ by instantiating the object and calling #destroy (all the callbacks are the triggered).
210
+ # If an array of ids is provided, all of them are destroyed.
211
+ def destroy(*ids)
212
+ unless ids.is_a?(Array); raise "*ids must be an Array"; end
213
+ if ids.first.is_a?(Array)
214
+ ids = ids.map{|compids| compids.to_composite_ids}
215
+ else
216
+ ids = ids.to_composite_ids
217
+ end
218
+ ids.first.is_a?(CompositeIds) ? ids.each { |id_set| find(id_set).destroy } : find(ids).destroy
225
219
  end
226
- @columns
227
- end
228
220
 
229
- ## DEACTIVATED METHODS ##
230
- public
231
- # Lazy-set the sequence name to the connection's default. This method
232
- # is only ever called once since set_sequence_name overrides it.
221
+ # Returns an array of column objects for the table associated with this class.
222
+ # Each column that matches to one of the primary keys has its
223
+ # primary attribute set to true
224
+ def columns
225
+ unless @columns
226
+ @columns = connection.columns(table_name, "#{name} Columns")
227
+ @columns.each {|column| column.primary = primary_keys.include?(column.name.to_sym)}
228
+ end
229
+ @columns
230
+ end
231
+
232
+ ## DEACTIVATED METHODS ##
233
+ public
234
+ # Lazy-set the sequence name to the connection's default. This method
235
+ # is only ever called once since set_sequence_name overrides it.
233
236
  def sequence_name #:nodoc:
234
237
  raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS
235
238
  end
236
-
239
+
237
240
  def reset_sequence_name #:nodoc:
238
241
  raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS
239
242
  end
240
-
243
+
241
244
  def set_primary_key(value = nil, &block)
242
245
  raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS
243
246
  end
244
-
245
- private
247
+
248
+ private
246
249
  def find_one(id, options)
247
250
  raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS
248
251
  end
249
-
252
+
250
253
  def find_some(ids, options)
251
254
  raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS
252
255
  end
253
-
256
+
254
257
  def find_from_ids(ids, options)
255
258
  conditions = " AND (#{sanitize_sql(options[:conditions])})" if options[:conditions]
256
259
  # if ids is just a flat list, then its size must = primary_key.length (one id per primary key, in order)
@@ -279,58 +282,58 @@ module CompositePrimaryKeys
279
282
  conditions = ids.map do |id_set|
280
283
  [primary_keys, id_set].transpose.map do |key, id|
281
284
  "#{table_name}.#{key.to_s}=#{sanitize(id)}"
282
- end.join(" AND ")
283
- end.join(") OR (")
284
- options.update :conditions => "(#{conditions})"
285
-
286
- result = find_every(options)
287
-
288
- if result.size == ids.size
289
- ids.size == 1 ? result[0] : result
290
- else
291
- raise RecordNotFound, "Couldn't find all #{name.pluralize} with IDs (#{ids_list})#{conditions}"
285
+ end.join(" AND ")
286
+ end.join(") OR (")
287
+ options.update :conditions => "(#{conditions})"
288
+
289
+ result = find_every(options)
290
+
291
+ if result.size == ids.size
292
+ ids.size == 1 ? result[0] : result
293
+ else
294
+ raise RecordNotFound, "Couldn't find all #{name.pluralize} with IDs (#{ids_list})#{conditions}"
295
+ end
296
+ end
297
+
292
298
  end
293
299
  end
294
-
295
- end
296
- end
297
- end
298
- end
299
-
300
- module ActiveRecord
301
- ID_SEP = ','
302
- ID_SET_SEP = ';'
303
-
304
- class Base
305
- # Allows +attr_name+ to be the list of primary_keys, and returns the id
306
- # of the object
307
- # e.g. @object[@object.class.primary_key] => [1,1]
308
- def [](attr_name)
309
- if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first
310
- attr_name = attr_name.split(ID_SEP)
311
- end
312
- attr_name.is_a?(Array) ?
313
- attr_name.map {|name| read_attribute(name)} :
314
- read_attribute(attr_name)
315
- end
316
-
317
- # Updates the attribute identified by <tt>attr_name</tt> with the specified +value+.
318
- # (Alias for the protected write_attribute method).
319
- def []=(attr_name, value)
320
- if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first
321
- attr_name = attr_name.split(ID_SEP)
300
+ end
322
301
  end
323
- if attr_name.is_a? Array
324
- value = value.split(ID_SEP) if value.is_a? String
325
- unless value.length == attr_name.length
326
- raise "Number of attr_names and values do not match"
302
+
303
+ module ActiveRecord
304
+ ID_SEP = ','
305
+ ID_SET_SEP = ';'
306
+
307
+ class Base
308
+ # Allows +attr_name+ to be the list of primary_keys, and returns the id
309
+ # of the object
310
+ # e.g. @object[@object.class.primary_key] => [1,1]
311
+ def [](attr_name)
312
+ if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first
313
+ attr_name = attr_name.split(ID_SEP)
314
+ end
315
+ attr_name.is_a?(Array) ?
316
+ attr_name.map {|name| read_attribute(name)} :
317
+ read_attribute(attr_name)
318
+ end
319
+
320
+ # Updates the attribute identified by <tt>attr_name</tt> with the specified +value+.
321
+ # (Alias for the protected write_attribute method).
322
+ def []=(attr_name, value)
323
+ if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first
324
+ attr_name = attr_name.split(ID_SEP)
325
+ end
326
+ if attr_name.is_a? Array
327
+ value = value.split(ID_SEP) if value.is_a? String
328
+ unless value.length == attr_name.length
329
+ raise "Number of attr_names and values do not match"
330
+ end
331
+ #breakpoint
332
+ [attr_name, value].transpose.map {|name,val| write_attribute(name.to_s, val)}
333
+ else
334
+ write_attribute(attr_name, value)
335
+ end
336
+ end
337
+
327
338
  end
328
- #breakpoint
329
- [attr_name, value].transpose.map {|name,val| write_attribute(name.to_s, val)}
330
- else
331
- write_attribute(attr_name, value)
332
339
  end
333
- end
334
-
335
- end
336
- end
@@ -2,7 +2,7 @@ module CompositePrimaryKeys
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 7
5
- TINY = 2
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>Composite Primary Keys for Ruby on Rails/ActiveRecords</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/compositekeys"; return false'>
35
35
  Get Version
36
- <a href="http://rubyforge.org/projects/compositekeys" class="numbers">0.7.2</a>
36
+ <a href="http://rubyforge.org/projects/compositekeys" class="numbers">0.7.3</a>
37
37
  </div>
38
38
  <h2>What</h2>
39
39
 
@@ -120,11 +120,11 @@ associations allow for composite foreign keys.</p>
120
120
  <span class="keyword">class </span><span class="class">ProductTariff</span> <span class="punct">&lt;</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
121
121
  <span class="ident">set_primary_keys</span> <span class="symbol">:product_id</span><span class="punct">,</span> <span class="symbol">:tariff_id</span><span class="punct">,</span> <span class="symbol">:tariff_start_date</span>
122
122
  <span class="ident">belongs_to</span> <span class="symbol">:products</span><span class="punct">,</span> <span class="symbol">:foreign_key</span> <span class="punct">=&gt;</span> <span class="symbol">:product_id</span>
123
- <span class="ident">belongs_to</span> <span class="symbol">:tariffs</span><span class="punct">,</span> <span class="symbol">:foreign_keys</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:tariff_id</span><span class="punct">,</span> <span class="symbol">:tariff_start_date</span><span class="punct">]</span>
123
+ <span class="ident">belongs_to</span> <span class="symbol">:tariffs</span><span class="punct">,</span> <span class="symbol">:foreign_key</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:tariff_id</span><span class="punct">,</span> <span class="symbol">:tariff_start_date</span><span class="punct">]</span>
124
124
  <span class="keyword">end</span>
125
125
  <span class="keyword">class </span><span class="class">Tariff</span> <span class="punct">&lt;</span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
126
126
  <span class="ident">set_primary_keys</span> <span class="punct">[</span><span class="symbol">:tariff_id</span><span class="punct">,</span> <span class="symbol">:start_date</span><span class="punct">]</span>
127
- <span class="ident">has_many</span> <span class="symbol">:product_tariffs</span><span class="punct">,</span> <span class="symbol">:foreign_keys</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:tariff_id</span><span class="punct">,</span> <span class="symbol">:tariff_start_date</span><span class="punct">]</span>
127
+ <span class="ident">has_many</span> <span class="symbol">:product_tariffs</span><span class="punct">,</span> <span class="symbol">:foreign_key</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:tariff_id</span><span class="punct">,</span> <span class="symbol">:tariff_start_date</span><span class="punct">]</span>
128
128
  <span class="keyword">end</span>
129
129
  </pre></p>
130
130
 
@@ -134,9 +134,9 @@ associations allow for composite foreign keys.</p>
134
134
  (called :tariffs) must use a composite foreign key.</p>
135
135
 
136
136
 
137
- <p>The expression can use either the
138
- :foreign_key or :foreign_keys option to specific the ordered list of table
139
- columns. If the column names in both tables match, then the :foreign_key(s)
137
+ <p>The expression must use the :foreign_key option (NOTE, <code>:foreign_keys</code> is not currently supported)
138
+ to specific the ordered list of table
139
+ columns. If the column names in both tables match, then the :foreign_key
140
140
  option can be omitted.</p>
141
141
 
142
142
 
@@ -185,7 +185,7 @@ other stories and things.</p>
185
185
 
186
186
  <p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a>.</p>
187
187
  <p class="coda">
188
- <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 1st September 2006<br>
188
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 24th October 2006<br>
189
189
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
190
190
  </p>
191
191
  </div>
data/website/index.txt CHANGED
@@ -71,11 +71,11 @@ end
71
71
  class ProductTariff < ActiveRecord::Base
72
72
  set_primary_keys :product_id, :tariff_id, :tariff_start_date
73
73
  belongs_to :products, :foreign_key => :product_id
74
- belongs_to :tariffs, :foreign_keys => [:tariff_id, :tariff_start_date]
74
+ belongs_to :tariffs, :foreign_key => [:tariff_id, :tariff_start_date]
75
75
  end
76
76
  class Tariff < ActiveRecord::Base
77
77
  set_primary_keys [:tariff_id, :start_date]
78
- has_many :product_tariffs, :foreign_keys => [:tariff_id, :tariff_start_date]
78
+ has_many :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date]
79
79
  end
80
80
  </pre>
81
81
 
@@ -83,9 +83,9 @@ The Tariff table has a composite primary key. Hence, the
83
83
  <code syntax="ruby">belongs_to</code> association from ProductTariff to Tariff
84
84
  (called :tariffs) must use a composite foreign key.
85
85
 
86
- The expression can use either the
87
- :foreign_key or :foreign_keys option to specific the ordered list of table
88
- columns. If the column names in both tables match, then the :foreign_key(s)
86
+ The expression must use the :foreign_key option (NOTE, <code>:foreign_keys</code> is not currently supported)
87
+ to specific the ordered list of table
88
+ columns. If the column names in both tables match, then the :foreign_key
89
89
  option can be omitted.
90
90
 
91
91
  Similarly, the <code syntax="ruby">has_many</code> and <code syntax="ruby">has_one</code>
@@ -1,3 +1,3 @@
1
1
  // Announcement JS file
2
- var version = "0.7.2";
2
+ var version = "0.7.3";
3
3
  MagicAnnouncement.show('compositekeys', version);
data/website/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // Version JS file
2
- var version = "0.7.2";
2
+ var version = "0.7.3";
3
3
 
4
4
  document.write(" - " + version);
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: composite_primary_keys
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.7.2
7
- date: 2006-09-27 00:00:00 +02:00
6
+ version: 0.7.3
7
+ date: 2006-11-09 00:00:00 +01:00
8
8
  summary: Support for composite primary keys in ActiveRecords
9
9
  require_paths:
10
10
  - lib
@@ -32,16 +32,14 @@ files:
32
32
  - install.rb
33
33
  - README
34
34
  - CHANGELOG
35
- - lib/composite_primary_keys
36
35
  - lib/composite_primary_keys.rb
36
+ - lib/composite_primary_keys
37
37
  - lib/composite_primary_keys/composite_arrays.rb
38
38
  - lib/composite_primary_keys/version.rb
39
39
  - lib/composite_primary_keys/base.rb
40
40
  - lib/composite_primary_keys/fixtures.rb
41
41
  - lib/composite_primary_keys/reflection.rb
42
42
  - lib/composite_primary_keys/associations.rb
43
- - test/connections
44
- - test/fixtures
45
43
  - test/composite_arrays_test.rb
46
44
  - test/hash_tricks.rb
47
45
  - test/delete_test.rb
@@ -57,15 +55,12 @@ files:
57
55
  - test/attributes_test.rb
58
56
  - test/create_test.rb
59
57
  - test/santiago_test.rb
60
- - test/connections/native_mysql
61
- - test/connections/native_oracle
62
- - test/connections/native_mysql/connection.rb
63
- - test/connections/native_oracle/connection.rb
58
+ - test/fixtures
59
+ - test/connections
64
60
  - test/fixtures/reference_type.rb
65
61
  - test/fixtures/reference_code.rb
66
62
  - test/fixtures/reference_types.yml
67
63
  - test/fixtures/reference_codes.yml
68
- - test/fixtures/db_definitions
69
64
  - test/fixtures/product.rb
70
65
  - test/fixtures/product_tariff.rb
71
66
  - test/fixtures/tariff.rb
@@ -82,20 +77,25 @@ files:
82
77
  - test/fixtures/articles.yml
83
78
  - test/fixtures/users.yml
84
79
  - test/fixtures/readings.yml
80
+ - test/fixtures/db_definitions
85
81
  - test/fixtures/db_definitions/mysql.drop.sql
86
82
  - test/fixtures/db_definitions/mysql.sql
83
+ - test/connections/native_oracle
84
+ - test/connections/native_mysql
85
+ - test/connections/native_oracle/connection.rb
86
+ - test/connections/native_mysql/connection.rb
87
87
  - website/index.txt
88
88
  - website/template.rhtml
89
- - website/stylesheets
90
- - website/javascripts
91
89
  - website/index.html
92
90
  - website/version.js
93
91
  - website/template.js
94
92
  - website/version.txt
95
93
  - website/version-raw.js
96
94
  - website/version-raw.txt
97
- - website/stylesheets/screen.css
95
+ - website/javascripts
96
+ - website/stylesheets
98
97
  - website/javascripts/rounded_corners_lite.inc.js
98
+ - website/stylesheets/screen.css
99
99
  - scripts/rubyforge-orig
100
100
  - scripts/rubyforge
101
101
  - scripts/http-access2-2.0.6.gem