activerecord 1.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (178) hide show
  1. data/CHANGELOG +5518 -76
  2. data/README.rdoc +222 -0
  3. data/examples/performance.rb +162 -0
  4. data/examples/simple.rb +14 -0
  5. data/lib/active_record/aggregations.rb +192 -80
  6. data/lib/active_record/association_preload.rb +403 -0
  7. data/lib/active_record/associations/association_collection.rb +545 -53
  8. data/lib/active_record/associations/association_proxy.rb +295 -0
  9. data/lib/active_record/associations/belongs_to_association.rb +91 -0
  10. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +78 -0
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +127 -36
  12. data/lib/active_record/associations/has_many_association.rb +108 -84
  13. data/lib/active_record/associations/has_many_through_association.rb +116 -0
  14. data/lib/active_record/associations/has_one_association.rb +143 -0
  15. data/lib/active_record/associations/has_one_through_association.rb +40 -0
  16. data/lib/active_record/associations/through_association_scope.rb +154 -0
  17. data/lib/active_record/associations.rb +2086 -368
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +95 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +50 -0
  21. data/lib/active_record/attribute_methods/query.rb +39 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/attribute_methods.rb +60 -0
  26. data/lib/active_record/autosave_association.rb +369 -0
  27. data/lib/active_record/base.rb +1603 -721
  28. data/lib/active_record/callbacks.rb +176 -225
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +365 -0
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +113 -0
  31. data/lib/active_record/connection_adapters/abstract/database_limits.rb +57 -0
  32. data/lib/active_record/connection_adapters/abstract/database_statements.rb +329 -0
  33. data/lib/active_record/connection_adapters/abstract/query_cache.rb +81 -0
  34. data/lib/active_record/connection_adapters/abstract/quoting.rb +72 -0
  35. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +739 -0
  36. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +543 -0
  37. data/lib/active_record/connection_adapters/abstract_adapter.rb +165 -279
  38. data/lib/active_record/connection_adapters/mysql_adapter.rb +594 -82
  39. data/lib/active_record/connection_adapters/postgresql_adapter.rb +988 -135
  40. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +53 -0
  41. data/lib/active_record/connection_adapters/sqlite_adapter.rb +365 -71
  42. data/lib/active_record/counter_cache.rb +115 -0
  43. data/lib/active_record/dynamic_finder_match.rb +53 -0
  44. data/lib/active_record/dynamic_scope_match.rb +32 -0
  45. data/lib/active_record/errors.rb +172 -0
  46. data/lib/active_record/fixtures.rb +941 -105
  47. data/lib/active_record/locale/en.yml +40 -0
  48. data/lib/active_record/locking/optimistic.rb +172 -0
  49. data/lib/active_record/locking/pessimistic.rb +55 -0
  50. data/lib/active_record/log_subscriber.rb +48 -0
  51. data/lib/active_record/migration.rb +617 -0
  52. data/lib/active_record/named_scope.rb +138 -0
  53. data/lib/active_record/nested_attributes.rb +417 -0
  54. data/lib/active_record/observer.rb +105 -36
  55. data/lib/active_record/persistence.rb +291 -0
  56. data/lib/active_record/query_cache.rb +36 -0
  57. data/lib/active_record/railtie.rb +91 -0
  58. data/lib/active_record/railties/controller_runtime.rb +38 -0
  59. data/lib/active_record/railties/databases.rake +512 -0
  60. data/lib/active_record/reflection.rb +364 -87
  61. data/lib/active_record/relation/batches.rb +89 -0
  62. data/lib/active_record/relation/calculations.rb +286 -0
  63. data/lib/active_record/relation/finder_methods.rb +355 -0
  64. data/lib/active_record/relation/predicate_builder.rb +41 -0
  65. data/lib/active_record/relation/query_methods.rb +261 -0
  66. data/lib/active_record/relation/spawn_methods.rb +112 -0
  67. data/lib/active_record/relation.rb +393 -0
  68. data/lib/active_record/schema.rb +59 -0
  69. data/lib/active_record/schema_dumper.rb +195 -0
  70. data/lib/active_record/serialization.rb +60 -0
  71. data/lib/active_record/serializers/xml_serializer.rb +244 -0
  72. data/lib/active_record/session_store.rb +340 -0
  73. data/lib/active_record/test_case.rb +67 -0
  74. data/lib/active_record/timestamp.rb +88 -0
  75. data/lib/active_record/transactions.rb +329 -75
  76. data/lib/active_record/validations/associated.rb +48 -0
  77. data/lib/active_record/validations/uniqueness.rb +185 -0
  78. data/lib/active_record/validations.rb +58 -179
  79. data/lib/active_record/version.rb +9 -0
  80. data/lib/active_record.rb +100 -24
  81. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  82. data/lib/rails/generators/active_record/migration/templates/migration.rb +17 -0
  83. data/lib/rails/generators/active_record/model/model_generator.rb +38 -0
  84. data/lib/rails/generators/active_record/model/templates/migration.rb +16 -0
  85. data/lib/rails/generators/active_record/model/templates/model.rb +5 -0
  86. data/lib/rails/generators/active_record/model/templates/module.rb +5 -0
  87. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  88. data/lib/rails/generators/active_record/observer/templates/observer.rb +2 -0
  89. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  90. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +16 -0
  91. data/lib/rails/generators/active_record.rb +27 -0
  92. metadata +216 -158
  93. data/README +0 -361
  94. data/RUNNING_UNIT_TESTS +0 -36
  95. data/dev-utils/eval_debugger.rb +0 -9
  96. data/examples/associations.rb +0 -87
  97. data/examples/shared_setup.rb +0 -15
  98. data/examples/validation.rb +0 -88
  99. data/install.rb +0 -60
  100. data/lib/active_record/deprecated_associations.rb +0 -70
  101. data/lib/active_record/support/class_attribute_accessors.rb +0 -43
  102. data/lib/active_record/support/class_inheritable_attributes.rb +0 -37
  103. data/lib/active_record/support/clean_logger.rb +0 -10
  104. data/lib/active_record/support/inflector.rb +0 -70
  105. data/lib/active_record/vendor/mysql.rb +0 -1117
  106. data/lib/active_record/vendor/simple.rb +0 -702
  107. data/lib/active_record/wrappers/yaml_wrapper.rb +0 -15
  108. data/lib/active_record/wrappings.rb +0 -59
  109. data/rakefile +0 -122
  110. data/test/abstract_unit.rb +0 -16
  111. data/test/aggregations_test.rb +0 -34
  112. data/test/all.sh +0 -8
  113. data/test/associations_test.rb +0 -477
  114. data/test/base_test.rb +0 -513
  115. data/test/class_inheritable_attributes_test.rb +0 -33
  116. data/test/connections/native_mysql/connection.rb +0 -24
  117. data/test/connections/native_postgresql/connection.rb +0 -24
  118. data/test/connections/native_sqlite/connection.rb +0 -24
  119. data/test/deprecated_associations_test.rb +0 -336
  120. data/test/finder_test.rb +0 -67
  121. data/test/fixtures/accounts/signals37 +0 -3
  122. data/test/fixtures/accounts/unknown +0 -2
  123. data/test/fixtures/auto_id.rb +0 -4
  124. data/test/fixtures/column_name.rb +0 -3
  125. data/test/fixtures/companies/first_client +0 -6
  126. data/test/fixtures/companies/first_firm +0 -4
  127. data/test/fixtures/companies/second_client +0 -6
  128. data/test/fixtures/company.rb +0 -37
  129. data/test/fixtures/company_in_module.rb +0 -33
  130. data/test/fixtures/course.rb +0 -3
  131. data/test/fixtures/courses/java +0 -2
  132. data/test/fixtures/courses/ruby +0 -2
  133. data/test/fixtures/customer.rb +0 -30
  134. data/test/fixtures/customers/david +0 -6
  135. data/test/fixtures/db_definitions/mysql.sql +0 -96
  136. data/test/fixtures/db_definitions/mysql2.sql +0 -4
  137. data/test/fixtures/db_definitions/postgresql.sql +0 -113
  138. data/test/fixtures/db_definitions/postgresql2.sql +0 -4
  139. data/test/fixtures/db_definitions/sqlite.sql +0 -85
  140. data/test/fixtures/db_definitions/sqlite2.sql +0 -4
  141. data/test/fixtures/default.rb +0 -2
  142. data/test/fixtures/developer.rb +0 -8
  143. data/test/fixtures/developers/david +0 -2
  144. data/test/fixtures/developers/jamis +0 -2
  145. data/test/fixtures/developers_projects/david_action_controller +0 -2
  146. data/test/fixtures/developers_projects/david_active_record +0 -2
  147. data/test/fixtures/developers_projects/jamis_active_record +0 -2
  148. data/test/fixtures/entrant.rb +0 -3
  149. data/test/fixtures/entrants/first +0 -3
  150. data/test/fixtures/entrants/second +0 -3
  151. data/test/fixtures/entrants/third +0 -3
  152. data/test/fixtures/fixture_database.sqlite +0 -0
  153. data/test/fixtures/fixture_database_2.sqlite +0 -0
  154. data/test/fixtures/movie.rb +0 -5
  155. data/test/fixtures/movies/first +0 -2
  156. data/test/fixtures/movies/second +0 -2
  157. data/test/fixtures/project.rb +0 -3
  158. data/test/fixtures/projects/action_controller +0 -2
  159. data/test/fixtures/projects/active_record +0 -2
  160. data/test/fixtures/reply.rb +0 -21
  161. data/test/fixtures/subscriber.rb +0 -5
  162. data/test/fixtures/subscribers/first +0 -2
  163. data/test/fixtures/subscribers/second +0 -2
  164. data/test/fixtures/topic.rb +0 -20
  165. data/test/fixtures/topics/first +0 -9
  166. data/test/fixtures/topics/second +0 -8
  167. data/test/fixtures_test.rb +0 -20
  168. data/test/inflector_test.rb +0 -104
  169. data/test/inheritance_test.rb +0 -125
  170. data/test/lifecycle_test.rb +0 -110
  171. data/test/modules_test.rb +0 -21
  172. data/test/multiple_db_test.rb +0 -46
  173. data/test/pk_test.rb +0 -57
  174. data/test/reflection_test.rb +0 -78
  175. data/test/thread_safety_test.rb +0 -33
  176. data/test/transactions_test.rb +0 -83
  177. data/test/unconnected_test.rb +0 -24
  178. data/test/validations_test.rb +0 -126
@@ -0,0 +1,53 @@
1
+ module ActiveRecord
2
+
3
+ # = Active Record Dynamic Finder Match
4
+ #
5
+ # Refer to ActiveRecord::Base documentation for Dynamic attribute-based finders for detailed info
6
+ #
7
+ class DynamicFinderMatch
8
+ def self.match(method)
9
+ df_match = self.new(method)
10
+ df_match.finder ? df_match : nil
11
+ end
12
+
13
+ def initialize(method)
14
+ @finder = :first
15
+ @bang = false
16
+ @instantiator = nil
17
+
18
+ case method.to_s
19
+ when /^find_(all_by|last_by|by)_([_a-zA-Z]\w*)$/
20
+ @finder = :last if $1 == 'last_by'
21
+ @finder = :all if $1 == 'all_by'
22
+ names = $2
23
+ when /^find_by_([_a-zA-Z]\w*)\!$/
24
+ @bang = true
25
+ names = $1
26
+ when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
27
+ @instantiator = $1 == 'initialize' ? :new : :create
28
+ names = $2
29
+ else
30
+ @finder = nil
31
+ end
32
+ @attribute_names = names && names.split('_and_')
33
+ end
34
+
35
+ attr_reader :finder, :attribute_names, :instantiator
36
+
37
+ def finder?
38
+ !@finder.nil? && @instantiator.nil?
39
+ end
40
+
41
+ def instantiator?
42
+ @finder == :first && !@instantiator.nil?
43
+ end
44
+
45
+ def creator?
46
+ @finder == :first && @instantiator == :create
47
+ end
48
+
49
+ def bang?
50
+ @bang
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ module ActiveRecord
2
+
3
+ # = Active Record Dynamic Scope Match
4
+ #
5
+ # Provides dynamic attribute-based scopes such as <tt>scoped_by_price(4.99)</tt>
6
+ # if, for example, the <tt>Product</tt> has an attribute with that name. You can
7
+ # chain more <tt>scoped_by_* </tt> methods after the other. It acts like a named
8
+ # scope except that it's dynamic.
9
+ class DynamicScopeMatch
10
+ def self.match(method)
11
+ ds_match = self.new(method)
12
+ ds_match.scope ? ds_match : nil
13
+ end
14
+
15
+ def initialize(method)
16
+ @scope = true
17
+ case method.to_s
18
+ when /^scoped_by_([_a-zA-Z]\w*)$/
19
+ names = $1
20
+ else
21
+ @scope = nil
22
+ end
23
+ @attribute_names = names && names.split('_and_')
24
+ end
25
+
26
+ attr_reader :scope, :attribute_names
27
+
28
+ def scope?
29
+ !@scope.nil?
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,172 @@
1
+ module ActiveRecord
2
+
3
+ # = Active Record Errors
4
+ #
5
+ # Generic Active Record exception class.
6
+ class ActiveRecordError < StandardError
7
+ end
8
+
9
+ # Raised when the single-table inheritance mechanism fails to locate the subclass
10
+ # (for example due to improper usage of column that +inheritance_column+ points to).
11
+ class SubclassNotFound < ActiveRecordError #:nodoc:
12
+ end
13
+
14
+ # Raised when an object assigned to an association has an incorrect type.
15
+ #
16
+ # class Ticket < ActiveRecord::Base
17
+ # has_many :patches
18
+ # end
19
+ #
20
+ # class Patch < ActiveRecord::Base
21
+ # belongs_to :ticket
22
+ # end
23
+ #
24
+ # # Comments are not patches, this assignment raises AssociationTypeMismatch.
25
+ # @ticket.patches << Comment.new(:content => "Please attach tests to your patch.")
26
+ class AssociationTypeMismatch < ActiveRecordError
27
+ end
28
+
29
+ # Raised when unserialized object's type mismatches one specified for serializable field.
30
+ class SerializationTypeMismatch < ActiveRecordError
31
+ end
32
+
33
+ # Raised when adapter not specified on connection (or configuration file <tt>config/database.yml</tt>
34
+ # misses adapter field).
35
+ class AdapterNotSpecified < ActiveRecordError
36
+ end
37
+
38
+ # Raised when Active Record cannot find database adapter specified in <tt>config/database.yml</tt> or programmatically.
39
+ class AdapterNotFound < ActiveRecordError
40
+ end
41
+
42
+ # Raised when connection to the database could not been established (for example when <tt>connection=</tt>
43
+ # is given a nil object).
44
+ class ConnectionNotEstablished < ActiveRecordError
45
+ end
46
+
47
+ # Raised when Active Record cannot find record by given id or set of ids.
48
+ class RecordNotFound < ActiveRecordError
49
+ end
50
+
51
+ # Raised by ActiveRecord::Base.save! and ActiveRecord::Base.create! methods when record cannot be
52
+ # saved because record is invalid.
53
+ class RecordNotSaved < ActiveRecordError
54
+ end
55
+
56
+ # Raised when SQL statement cannot be executed by the database (for example, it's often the case for
57
+ # MySQL when Ruby driver used is too old).
58
+ class StatementInvalid < ActiveRecordError
59
+ end
60
+
61
+ # Raised when SQL statement is invalid and the application gets a blank result.
62
+ class ThrowResult < ActiveRecordError
63
+ end
64
+
65
+ # Parent class for all specific exceptions which wrap database driver exceptions
66
+ # provides access to the original exception also.
67
+ class WrappedDatabaseException < StatementInvalid
68
+ attr_reader :original_exception
69
+
70
+ def initialize(message, original_exception)
71
+ super(message)
72
+ @original_exception = original_exception
73
+ end
74
+ end
75
+
76
+ # Raised when a record cannot be inserted because it would violate a uniqueness constraint.
77
+ class RecordNotUnique < WrappedDatabaseException
78
+ end
79
+
80
+ # Raised when a record cannot be inserted or updated because it references a non-existent record.
81
+ class InvalidForeignKey < WrappedDatabaseException
82
+ end
83
+
84
+ # Raised when number of bind variables in statement given to <tt>:condition</tt> key (for example,
85
+ # when using +find+ method)
86
+ # does not match number of expected variables.
87
+ #
88
+ # For example, in
89
+ #
90
+ # Location.find :all, :conditions => ["lat = ? AND lng = ?", 53.7362]
91
+ #
92
+ # two placeholders are given but only one variable to fill them.
93
+ class PreparedStatementInvalid < ActiveRecordError
94
+ end
95
+
96
+ # Raised on attempt to save stale record. Record is stale when it's being saved in another query after
97
+ # instantiation, for example, when two users edit the same wiki page and one starts editing and saves
98
+ # the page before the other.
99
+ #
100
+ # Read more about optimistic locking in ActiveRecord::Locking module RDoc.
101
+ class StaleObjectError < ActiveRecordError
102
+ end
103
+
104
+ # Raised when association is being configured improperly or
105
+ # user tries to use offset and limit together with has_many or has_and_belongs_to_many associations.
106
+ class ConfigurationError < ActiveRecordError
107
+ end
108
+
109
+ # Raised on attempt to update record that is instantiated as read only.
110
+ class ReadOnlyRecord < ActiveRecordError
111
+ end
112
+
113
+ # ActiveRecord::Transactions::ClassMethods.transaction uses this exception
114
+ # to distinguish a deliberate rollback from other exceptional situations.
115
+ # Normally, raising an exception will cause the +transaction+ method to rollback
116
+ # the database transaction *and* pass on the exception. But if you raise an
117
+ # ActiveRecord::Rollback exception, then the database transaction will be rolled back,
118
+ # without passing on the exception.
119
+ #
120
+ # For example, you could do this in your controller to rollback a transaction:
121
+ #
122
+ # class BooksController < ActionController::Base
123
+ # def create
124
+ # Book.transaction do
125
+ # book = Book.new(params[:book])
126
+ # book.save!
127
+ # if today_is_friday?
128
+ # # The system must fail on Friday so that our support department
129
+ # # won't be out of job. We silently rollback this transaction
130
+ # # without telling the user.
131
+ # raise ActiveRecord::Rollback, "Call tech support!"
132
+ # end
133
+ # end
134
+ # # ActiveRecord::Rollback is the only exception that won't be passed on
135
+ # # by ActiveRecord::Base.transaction, so this line will still be reached
136
+ # # even on Friday.
137
+ # redirect_to root_url
138
+ # end
139
+ # end
140
+ class Rollback < ActiveRecordError
141
+ end
142
+
143
+ # Raised when attribute has a name reserved by Active Record (when attribute has name of one of Active Record instance methods).
144
+ class DangerousAttributeError < ActiveRecordError
145
+ end
146
+
147
+ # Raised when unknown attributes are supplied via mass assignment.
148
+ class UnknownAttributeError < NoMethodError
149
+ end
150
+
151
+ # Raised when an error occurred while doing a mass assignment to an attribute through the
152
+ # <tt>attributes=</tt> method. The exception has an +attribute+ property that is the name of the
153
+ # offending attribute.
154
+ class AttributeAssignmentError < ActiveRecordError
155
+ attr_reader :exception, :attribute
156
+ def initialize(message, exception, attribute)
157
+ @exception = exception
158
+ @attribute = attribute
159
+ @message = message
160
+ end
161
+ end
162
+
163
+ # Raised when there are multiple errors while doing a mass assignment through the +attributes+
164
+ # method. The exception has an +errors+ property that contains an array of AttributeAssignmentError
165
+ # objects, each corresponding to the error while assigning to an attribute.
166
+ class MultiparameterAssignmentErrors < ActiveRecordError
167
+ attr_reader :errors
168
+ def initialize(errors)
169
+ @errors = errors
170
+ end
171
+ end
172
+ end