radiant 0.8.0 → 0.8.1

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

Potentially problematic release.


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

Files changed (513) hide show
  1. data/CHANGELOG +33 -1
  2. data/CONTRIBUTORS +15 -2
  3. data/INSTALL +9 -7
  4. data/README +11 -7
  5. data/app/controllers/admin/layouts_controller.rb +5 -2
  6. data/app/controllers/admin/pages_controller.rb +8 -5
  7. data/app/controllers/admin/snippets_controller.rb +5 -2
  8. data/app/controllers/application_controller.rb +7 -0
  9. data/app/helpers/admin/node_helper.rb +2 -2
  10. data/app/helpers/application_helper.rb +2 -2
  11. data/app/models/radiant/config.rb +36 -4
  12. data/app/models/standard_tags.rb +1 -1
  13. data/app/views/admin/layouts/index.html.haml +15 -12
  14. data/app/views/admin/page_parts/_page_part.html.haml +2 -2
  15. data/app/views/admin/pages/index.html.haml +1 -1
  16. data/app/views/admin/snippets/_form.html.haml +1 -1
  17. data/app/views/admin/snippets/index.html.haml +14 -10
  18. data/config/database.db2.yml +20 -0
  19. data/config/environment.rb +4 -4
  20. data/config/environments/test.rb +1 -2
  21. data/features/support/env.rb +2 -1
  22. data/lib/generators/extension/extension_generator.rb +5 -0
  23. data/lib/generators/extension/templates/RSpecRakefile +11 -8
  24. data/lib/generators/extension/templates/cucumber.yml +1 -0
  25. data/lib/generators/extension/templates/cucumber_env.rb +16 -0
  26. data/lib/generators/extension/templates/cucumber_paths.rb +14 -0
  27. data/lib/generators/extension/templates/extension.rb +1 -1
  28. data/lib/generators/instance/instance_generator.rb +1 -1
  29. data/lib/generators/instance/templates/databases/db2.yml +40 -0
  30. data/lib/generators/instance/templates/instance_environment.rb +6 -6
  31. data/lib/local_time.rb +3 -9
  32. data/lib/radiant.rb +1 -1
  33. data/lib/radiant/cache.rb +10 -8
  34. data/lib/radiant/extension.rb +36 -0
  35. data/lib/radiant/extension/script.rb +1 -1
  36. data/lib/radiant/extension_loader.rb +5 -1
  37. data/lib/radiant/initializer.rb +52 -4
  38. data/lib/task_support.rb +33 -0
  39. data/lib/tasks/cucumber.rake +5 -1
  40. data/lib/tasks/radiant_config.rake +18 -0
  41. data/lib/tasks/release.rake +1 -0
  42. data/public/javascripts/admin/admin.js +1 -1
  43. data/spec/controllers/admin/layouts_controller_spec.rb +18 -12
  44. data/spec/controllers/admin/pages_controller_spec.rb +35 -29
  45. data/spec/controllers/admin/snippets_controller_spec.rb +11 -5
  46. data/spec/controllers/admin/welcome_controller_spec.rb +1 -1
  47. data/spec/controllers/application_controller_spec.rb +18 -0
  48. data/spec/fixtures/radiant_config.yml +10 -0
  49. data/spec/generators/extension_generator_spec.rb +12 -0
  50. data/spec/helpers/admin/node_helper_spec.rb +6 -0
  51. data/spec/helpers/application_helper_spec.rb +1 -1
  52. data/spec/lib/radiant/extension_loader_spec.rb +17 -0
  53. data/spec/lib/radiant/extension_spec.rb +28 -0
  54. data/spec/lib/radiant/initializer_spec.rb +34 -0
  55. data/spec/lib/task_support_spec.rb +42 -0
  56. data/spec/models/page_spec.rb +6 -2
  57. data/spec/models/radiant/config_spec.rb +42 -1
  58. data/spec/models/standard_tags_spec.rb +2 -2
  59. data/test/fixtures/extensions/01_basic/app/metal/basic_metal.rb +9 -0
  60. data/test/fixtures/extensions/02_overriding/app/metal/basic_metal.rb +9 -0
  61. data/vendor/extensions/textile_filter/textile.html +2 -2
  62. data/vendor/plugins/dataset/CHANGELOG +2 -1
  63. data/vendor/plugins/dataset/Rakefile +3 -0
  64. data/vendor/plugins/dataset/VERSION.yml +2 -2
  65. data/vendor/plugins/dataset/dataset.gemspec +9 -3
  66. data/vendor/plugins/dataset/lib/dataset.rb +3 -0
  67. data/vendor/radius/lib/radius.rb +5 -0
  68. data/vendor/radius/test/radius_test.rb +6 -0
  69. data/vendor/rails/actionmailer/CHANGELOG +8 -0
  70. data/vendor/rails/actionmailer/Rakefile +3 -2
  71. data/vendor/rails/actionmailer/lib/action_mailer/base.rb +2 -1
  72. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +1 -1
  73. data/vendor/rails/actionmailer/test/abstract_unit.rb +0 -3
  74. data/vendor/rails/actionmailer/test/mail_service_test.rb +3 -2
  75. data/vendor/rails/actionpack/CHANGELOG +16 -0
  76. data/vendor/rails/actionpack/Rakefile +5 -3
  77. data/vendor/rails/actionpack/lib/action_controller.rb +2 -7
  78. data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +13 -3
  79. data/vendor/rails/actionpack/lib/action_controller/base.rb +12 -3
  80. data/vendor/rails/actionpack/lib/action_controller/caching.rb +1 -1
  81. data/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +9 -1
  82. data/vendor/rails/actionpack/lib/action_controller/caching/sweeper.rb +45 -0
  83. data/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +0 -42
  84. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +1 -1
  85. data/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +21 -6
  86. data/vendor/rails/actionpack/lib/action_controller/failsafe.rb +40 -6
  87. data/vendor/rails/actionpack/lib/action_controller/flash.rb +11 -3
  88. data/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +7 -3
  89. data/vendor/rails/actionpack/lib/action_controller/integration.rb +5 -12
  90. data/vendor/rails/actionpack/lib/action_controller/middlewares.rb +0 -1
  91. data/vendor/rails/actionpack/lib/action_controller/params_parser.rb +6 -0
  92. data/vendor/rails/actionpack/lib/action_controller/reloader.rb +47 -7
  93. data/vendor/rails/actionpack/lib/action_controller/request.rb +6 -2
  94. data/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +2 -1
  95. data/vendor/rails/actionpack/lib/action_controller/resources.rb +17 -13
  96. data/vendor/rails/actionpack/lib/action_controller/response.rb +8 -2
  97. data/vendor/rails/actionpack/lib/action_controller/routing.rb +3 -0
  98. data/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +20 -6
  99. data/vendor/rails/actionpack/lib/action_controller/streaming.rb +4 -2
  100. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +9 -1
  101. data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +1 -1
  102. data/vendor/rails/actionpack/lib/action_pack/version.rb +1 -1
  103. data/vendor/rails/actionpack/lib/action_view/helpers.rb +1 -1
  104. data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +21 -9
  105. data/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +1 -1
  106. data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +2 -2
  107. data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +26 -12
  108. data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +71 -1
  109. data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +10 -4
  110. data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +1 -1
  111. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +7 -7
  112. data/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +5 -5
  113. data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +1 -1
  114. data/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +23 -14
  115. data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +2 -2
  116. data/vendor/rails/actionpack/lib/action_view/locale/en.yml +4 -0
  117. data/vendor/rails/actionpack/lib/action_view/paths.rb +1 -1
  118. data/vendor/rails/actionpack/lib/action_view/template.rb +22 -33
  119. data/vendor/rails/actionpack/test/abstract_unit.rb +17 -1
  120. data/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +3 -3
  121. data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +27 -0
  122. data/vendor/rails/actionpack/test/controller/caching_test.rb +40 -1
  123. data/vendor/rails/actionpack/test/controller/cookie_test.rb +16 -0
  124. data/vendor/rails/actionpack/test/controller/dispatcher_test.rb +59 -18
  125. data/vendor/rails/actionpack/test/controller/failsafe_test.rb +60 -0
  126. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +3 -1
  127. data/vendor/rails/actionpack/test/controller/flash_test.rb +6 -1
  128. data/vendor/rails/actionpack/test/controller/http_basic_authentication_test.rb +25 -0
  129. data/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +63 -9
  130. data/vendor/rails/actionpack/test/controller/integration_test.rb +31 -3
  131. data/vendor/rails/actionpack/test/controller/rack_test.rb +18 -1
  132. data/vendor/rails/actionpack/test/controller/redirect_test.rb +4 -1
  133. data/vendor/rails/actionpack/test/controller/reloader_test.rb +124 -0
  134. data/vendor/rails/actionpack/test/controller/render_test.rb +19 -9
  135. data/vendor/rails/actionpack/test/controller/request/json_params_parsing_test.rb +24 -4
  136. data/vendor/rails/actionpack/test/controller/request/multipart_params_parsing_test.rb +1 -62
  137. data/vendor/rails/actionpack/test/controller/request/test_request_test.rb +35 -0
  138. data/vendor/rails/actionpack/test/controller/request/url_encoded_params_parsing_test.rb +0 -38
  139. data/vendor/rails/actionpack/test/controller/request/xml_params_parsing_test.rb +15 -0
  140. data/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +6 -5
  141. data/vendor/rails/actionpack/test/controller/request_test.rb +218 -230
  142. data/vendor/rails/actionpack/test/controller/resources_test.rb +52 -0
  143. data/vendor/rails/actionpack/test/controller/routing_test.rb +28 -2
  144. data/vendor/rails/actionpack/test/controller/send_file_test.rb +12 -2
  145. data/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +9 -32
  146. data/vendor/rails/actionpack/test/controller/test_test.rb +8 -0
  147. data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +29 -3
  148. data/vendor/rails/actionpack/test/fixtures/failsafe/500.html +1 -0
  149. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.css +23 -0
  150. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.js +63 -0
  151. data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +1 -1
  152. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +46 -0
  153. data/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +29 -0
  154. data/vendor/rails/actionpack/test/template/form_helper_test.rb +143 -6
  155. data/vendor/rails/actionpack/test/template/form_options_helper_i18n_test.rb +27 -0
  156. data/vendor/rails/actionpack/test/template/form_options_helper_test.rb +56 -0
  157. data/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +23 -6
  158. data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +11 -11
  159. data/vendor/rails/actionpack/test/template/template_test.rb +32 -0
  160. data/vendor/rails/actionpack/test/template/text_helper_test.rb +23 -0
  161. data/vendor/rails/actionpack/test/template/url_helper_test.rb +8 -0
  162. data/vendor/rails/activerecord/CHANGELOG +18 -0
  163. data/vendor/rails/activerecord/Rakefile +26 -9
  164. data/vendor/rails/activerecord/examples/performance.rb +162 -0
  165. data/vendor/rails/activerecord/lib/active_record/associations.rb +104 -35
  166. data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +10 -5
  167. data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +2 -2
  168. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +22 -4
  169. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +5 -1
  170. data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +16 -0
  171. data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +1 -0
  172. data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +13 -3
  173. data/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +15 -9
  174. data/vendor/rails/activerecord/lib/active_record/autosave_association.rb +15 -9
  175. data/vendor/rails/activerecord/lib/active_record/base.rb +34 -31
  176. data/vendor/rails/activerecord/lib/active_record/batches.rb +23 -15
  177. data/vendor/rails/activerecord/lib/active_record/calculations.rb +7 -13
  178. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +16 -2
  179. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +2 -2
  180. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +7 -0
  181. data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +17 -8
  182. data/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +98 -35
  183. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +15 -0
  184. data/vendor/rails/activerecord/lib/active_record/dirty.rb +1 -1
  185. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +14 -11
  186. data/vendor/rails/activerecord/lib/active_record/i18n_interpolation_deprecation.rb +1 -1
  187. data/vendor/rails/activerecord/lib/active_record/locale/en.yml +4 -0
  188. data/vendor/rails/activerecord/lib/active_record/named_scope.rb +3 -8
  189. data/vendor/rails/activerecord/lib/active_record/reflection.rb +1 -1
  190. data/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +6 -3
  191. data/vendor/rails/activerecord/lib/active_record/serialization.rb +3 -2
  192. data/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +10 -18
  193. data/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +6 -2
  194. data/vendor/rails/activerecord/lib/active_record/session_store.rb +9 -1
  195. data/vendor/rails/activerecord/lib/active_record/timestamp.rb +39 -9
  196. data/vendor/rails/activerecord/lib/active_record/validations.rb +149 -80
  197. data/vendor/rails/activerecord/lib/active_record/version.rb +1 -1
  198. data/vendor/rails/activerecord/test/cases/adapter_test.rb +12 -0
  199. data/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +102 -22
  200. data/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +5 -5
  201. data/vendor/rails/activerecord/test/cases/associations/eager_test.rb +12 -0
  202. data/vendor/rails/activerecord/test/cases/associations/habtm_join_table_test.rb +56 -0
  203. data/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +62 -2
  204. data/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +46 -1
  205. data/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +18 -1
  206. data/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +5 -0
  207. data/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +4 -4
  208. data/vendor/rails/activerecord/test/cases/autosave_association_test.rb +22 -0
  209. data/vendor/rails/activerecord/test/cases/base_test.rb +51 -6
  210. data/vendor/rails/activerecord/test/cases/calculations_test.rb +14 -14
  211. data/vendor/rails/activerecord/test/cases/column_definition_test.rb +34 -0
  212. data/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +5 -5
  213. data/vendor/rails/activerecord/test/cases/dirty_test.rb +10 -0
  214. data/vendor/rails/activerecord/test/cases/finder_test.rb +21 -50
  215. data/vendor/rails/activerecord/test/cases/fixtures_test.rb +6 -1
  216. data/vendor/rails/activerecord/test/cases/helper.rb +1 -2
  217. data/vendor/rails/activerecord/test/cases/i18n_test.rb +5 -0
  218. data/vendor/rails/activerecord/test/cases/json_serialization_test.rb +57 -57
  219. data/vendor/rails/activerecord/test/cases/method_scoping_test.rb +14 -4
  220. data/vendor/rails/activerecord/test/cases/migration_test.rb +39 -11
  221. data/vendor/rails/activerecord/test/cases/modules_test.rb +42 -0
  222. data/vendor/rails/activerecord/test/cases/named_scope_test.rb +6 -4
  223. data/vendor/rails/activerecord/test/cases/pk_test.rb +18 -0
  224. data/vendor/rails/activerecord/test/cases/reflection_test.rb +7 -7
  225. data/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +35 -7
  226. data/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +76 -0
  227. data/vendor/rails/activerecord/test/cases/timestamp_test.rb +75 -0
  228. data/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +656 -624
  229. data/vendor/rails/activerecord/test/cases/validations_test.rb +12 -2
  230. data/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +20 -0
  231. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite +0 -0
  232. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  233. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite +0 -0
  234. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  235. data/vendor/rails/activerecord/test/fixtures/posts.yml +3 -0
  236. data/vendor/rails/activerecord/test/models/author.rb +5 -0
  237. data/vendor/rails/activerecord/test/models/comment.rb +5 -1
  238. data/vendor/rails/activerecord/test/models/company.rb +9 -7
  239. data/vendor/rails/activerecord/test/models/company_in_module.rb +1 -1
  240. data/vendor/rails/activerecord/test/models/contract.rb +5 -0
  241. data/vendor/rails/activerecord/test/models/developer.rb +10 -0
  242. data/vendor/rails/activerecord/test/models/essay.rb +3 -0
  243. data/vendor/rails/activerecord/test/models/organization.rb +2 -0
  244. data/vendor/rails/activerecord/test/models/pet.rb +1 -1
  245. data/vendor/rails/activerecord/test/models/project.rb +1 -1
  246. data/vendor/rails/activerecord/test/models/reply.rb +2 -1
  247. data/vendor/rails/activerecord/test/models/topic.rb +1 -2
  248. data/vendor/rails/activerecord/test/models/toy.rb +2 -0
  249. data/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +13 -2
  250. data/vendor/rails/activerecord/test/schema/schema.rb +19 -0
  251. data/vendor/rails/activeresource/CHANGELOG +16 -0
  252. data/vendor/rails/activeresource/Rakefile +3 -2
  253. data/vendor/rails/activeresource/lib/active_resource/base.rb +89 -9
  254. data/vendor/rails/activeresource/lib/active_resource/connection.rb +73 -8
  255. data/vendor/rails/activeresource/lib/active_resource/exceptions.rb +66 -0
  256. data/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +2 -2
  257. data/vendor/rails/activeresource/lib/active_resource/validations.rb +20 -4
  258. data/vendor/rails/activeresource/lib/active_resource/version.rb +1 -1
  259. data/vendor/rails/activeresource/test/abstract_unit.rb +1 -3
  260. data/vendor/rails/activeresource/test/base/load_test.rb +16 -1
  261. data/vendor/rails/activeresource/test/base_errors_test.rb +56 -19
  262. data/vendor/rails/activeresource/test/base_test.rb +147 -0
  263. data/vendor/rails/activeresource/test/connection_test.rb +42 -0
  264. data/vendor/rails/activeresource/test/debug.log +7974 -0
  265. data/vendor/rails/activeresource/test/fixtures/proxy.rb +4 -0
  266. data/vendor/rails/activesupport/CHANGELOG +13 -0
  267. data/vendor/rails/activesupport/lib/active_support/all.rb +8 -0
  268. data/vendor/rails/activesupport/lib/active_support/cache.rb +14 -1
  269. data/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +16 -10
  270. data/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +1 -1
  271. data/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +1 -0
  272. data/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +2 -1
  273. data/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +2 -4
  274. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +14 -4
  275. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +4 -2
  276. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
  277. data/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +19 -5
  278. data/vendor/rails/activesupport/lib/active_support/core_ext/module/model_naming.rb +8 -6
  279. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +15 -9
  280. data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +1 -0
  281. data/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +29 -5
  282. data/vendor/rails/activesupport/lib/active_support/core_ext/string/bytesize.rb +5 -0
  283. data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +7 -7
  284. data/vendor/rails/activesupport/lib/active_support/deprecation.rb +9 -9
  285. data/vendor/rails/activesupport/lib/active_support/duration.rb +4 -2
  286. data/vendor/rails/activesupport/lib/active_support/json.rb +1 -22
  287. data/vendor/rails/activesupport/lib/active_support/json/backends/jsongem.rb +38 -0
  288. data/vendor/rails/activesupport/lib/active_support/json/backends/yaml.rb +88 -0
  289. data/vendor/rails/activesupport/lib/active_support/json/decoding.rb +23 -72
  290. data/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +9 -8
  291. data/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +9 -8
  292. data/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +14 -9
  293. data/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +4 -2
  294. data/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +21 -11
  295. data/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +4 -2
  296. data/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +16 -0
  297. data/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +6 -2
  298. data/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +4 -0
  299. data/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +5 -32
  300. data/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +2 -2
  301. data/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +9 -8
  302. data/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +4 -2
  303. data/vendor/rails/activesupport/lib/active_support/json/encoding.rb +80 -9
  304. data/vendor/rails/activesupport/lib/active_support/memoizable.rb +1 -1
  305. data/vendor/rails/activesupport/lib/active_support/message_verifier.rb +16 -3
  306. data/vendor/rails/activesupport/lib/active_support/multibyte.rb +30 -6
  307. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +23 -17
  308. data/vendor/rails/activesupport/lib/active_support/multibyte/utils.rb +61 -0
  309. data/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +28 -0
  310. data/vendor/rails/activesupport/lib/active_support/test_case.rb +9 -8
  311. data/vendor/rails/activesupport/lib/active_support/testing/deprecation.rb +2 -0
  312. data/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +9 -8
  313. data/vendor/rails/activesupport/lib/active_support/vendor.rb +6 -7
  314. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -1
  315. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -1
  316. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -1
  317. data/vendor/rails/activesupport/lib/active_support/vendor/{memcache-client-1.6.5 → memcache-client-1.7.4}/memcache.rb +242 -70
  318. data/vendor/rails/activesupport/lib/active_support/version.rb +1 -1
  319. data/vendor/rails/activesupport/lib/active_support/xml_mini/jdom.rb +162 -0
  320. data/vendor/rails/railties/CHANGELOG +10 -0
  321. data/vendor/rails/railties/Rakefile +13 -9
  322. data/vendor/rails/railties/bin/about +2 -2
  323. data/vendor/rails/railties/bin/console +1 -1
  324. data/vendor/rails/railties/bin/dbconsole +1 -1
  325. data/vendor/rails/railties/bin/destroy +1 -1
  326. data/vendor/rails/railties/bin/generate +1 -1
  327. data/vendor/rails/railties/bin/performance/benchmarker +1 -1
  328. data/vendor/rails/railties/bin/performance/profiler +1 -1
  329. data/vendor/rails/railties/bin/plugin +1 -1
  330. data/vendor/rails/railties/bin/runner +1 -1
  331. data/vendor/rails/railties/bin/server +1 -1
  332. data/vendor/rails/railties/builtin/rails_info/rails/info.rb +4 -2
  333. data/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +2 -0
  334. data/vendor/rails/railties/configs/routes.rb +1 -1
  335. data/vendor/rails/railties/configs/seeds.rb +7 -0
  336. data/vendor/rails/railties/environments/boot.rb +1 -1
  337. data/vendor/rails/railties/guides/files/javascripts/code_highlighter.js +188 -0
  338. data/vendor/rails/railties/guides/files/javascripts/guides.js +8 -0
  339. data/vendor/rails/railties/guides/files/javascripts/highlighters.js +90 -0
  340. data/vendor/rails/railties/guides/files/stylesheets/main.css +441 -0
  341. data/vendor/rails/railties/guides/files/stylesheets/print.css +52 -0
  342. data/vendor/rails/railties/guides/files/stylesheets/reset.css +43 -0
  343. data/vendor/rails/railties/guides/files/stylesheets/style.css +13 -0
  344. data/vendor/rails/railties/guides/files/stylesheets/syntax.css +31 -0
  345. data/vendor/rails/railties/guides/images/belongs_to.png +0 -0
  346. data/vendor/rails/railties/guides/images/book_icon.gif +0 -0
  347. data/vendor/rails/railties/guides/images/bullet.gif +0 -0
  348. data/vendor/rails/railties/guides/images/chapters_icon.gif +0 -0
  349. data/vendor/rails/railties/guides/images/check_bullet.gif +0 -0
  350. data/vendor/rails/railties/guides/images/credits_pic_blank.gif +0 -0
  351. data/vendor/rails/railties/guides/images/csrf.png +0 -0
  352. data/vendor/rails/railties/guides/images/customized_error_messages.png +0 -0
  353. data/vendor/rails/railties/guides/images/error_messages.png +0 -0
  354. data/vendor/rails/railties/guides/images/feature_tile.gif +0 -0
  355. data/vendor/rails/railties/guides/images/footer_tile.gif +0 -0
  356. data/vendor/rails/railties/guides/images/fxn.jpg +0 -0
  357. data/vendor/rails/railties/guides/images/grey_bullet.gif +0 -0
  358. data/vendor/rails/railties/guides/images/habtm.png +0 -0
  359. data/vendor/rails/railties/guides/images/has_many.png +0 -0
  360. data/vendor/rails/railties/guides/images/has_many_through.png +0 -0
  361. data/vendor/rails/railties/guides/images/has_one.png +0 -0
  362. data/vendor/rails/railties/guides/images/has_one_through.png +0 -0
  363. data/vendor/rails/railties/guides/images/header_backdrop.png +0 -0
  364. data/vendor/rails/railties/guides/images/header_tile.gif +0 -0
  365. data/vendor/rails/railties/guides/images/i18n/demo_localized_pirate.png +0 -0
  366. data/vendor/rails/railties/guides/images/i18n/demo_translated_en.png +0 -0
  367. data/vendor/rails/railties/guides/images/i18n/demo_translated_pirate.png +0 -0
  368. data/vendor/rails/railties/guides/images/i18n/demo_translation_missing.png +0 -0
  369. data/vendor/rails/railties/guides/images/i18n/demo_untranslated.png +0 -0
  370. data/vendor/rails/railties/guides/images/icons/README +5 -0
  371. data/vendor/rails/railties/guides/images/icons/callouts/1.png +0 -0
  372. data/vendor/rails/railties/guides/images/icons/callouts/10.png +0 -0
  373. data/vendor/rails/railties/guides/images/icons/callouts/11.png +0 -0
  374. data/vendor/rails/railties/guides/images/icons/callouts/12.png +0 -0
  375. data/vendor/rails/railties/guides/images/icons/callouts/13.png +0 -0
  376. data/vendor/rails/railties/guides/images/icons/callouts/14.png +0 -0
  377. data/vendor/rails/railties/guides/images/icons/callouts/15.png +0 -0
  378. data/vendor/rails/railties/guides/images/icons/callouts/2.png +0 -0
  379. data/vendor/rails/railties/guides/images/icons/callouts/3.png +0 -0
  380. data/vendor/rails/railties/guides/images/icons/callouts/4.png +0 -0
  381. data/vendor/rails/railties/guides/images/icons/callouts/5.png +0 -0
  382. data/vendor/rails/railties/guides/images/icons/callouts/6.png +0 -0
  383. data/vendor/rails/railties/guides/images/icons/callouts/7.png +0 -0
  384. data/vendor/rails/railties/guides/images/icons/callouts/8.png +0 -0
  385. data/vendor/rails/railties/guides/images/icons/callouts/9.png +0 -0
  386. data/vendor/rails/railties/guides/images/icons/caution.png +0 -0
  387. data/vendor/rails/railties/guides/images/icons/example.png +0 -0
  388. data/vendor/rails/railties/guides/images/icons/home.png +0 -0
  389. data/vendor/rails/railties/guides/images/icons/important.png +0 -0
  390. data/vendor/rails/railties/guides/images/icons/next.png +0 -0
  391. data/vendor/rails/railties/guides/images/icons/note.png +0 -0
  392. data/vendor/rails/railties/guides/images/icons/prev.png +0 -0
  393. data/vendor/rails/railties/guides/images/icons/tip.png +0 -0
  394. data/vendor/rails/railties/guides/images/icons/up.png +0 -0
  395. data/vendor/rails/railties/guides/images/icons/warning.png +0 -0
  396. data/vendor/rails/railties/guides/images/nav_arrow.gif +0 -0
  397. data/vendor/rails/railties/guides/images/polymorphic.png +0 -0
  398. data/vendor/rails/railties/guides/images/posts_index.png +0 -0
  399. data/vendor/rails/railties/guides/images/rails_guides_logo.gif +0 -0
  400. data/vendor/rails/railties/guides/images/rails_logo_remix.gif +0 -0
  401. data/vendor/rails/railties/guides/images/rails_welcome.png +0 -0
  402. data/vendor/rails/railties/guides/images/session_fixation.png +0 -0
  403. data/vendor/rails/railties/guides/images/tab_grey.gif +0 -0
  404. data/vendor/rails/railties/guides/images/tab_info.gif +0 -0
  405. data/vendor/rails/railties/guides/images/tab_note.gif +0 -0
  406. data/vendor/rails/railties/guides/images/tab_red.gif +0 -0
  407. data/vendor/rails/railties/guides/images/tab_yellow.gif +0 -0
  408. data/vendor/rails/railties/guides/images/tab_yellow.png +0 -0
  409. data/vendor/rails/railties/guides/images/validation_error_messages.png +0 -0
  410. data/vendor/rails/railties/guides/rails_guides.rb +42 -0
  411. data/vendor/rails/railties/guides/rails_guides/generator.rb +138 -0
  412. data/vendor/rails/railties/guides/rails_guides/helpers.rb +34 -0
  413. data/vendor/rails/railties/guides/rails_guides/indexer.rb +55 -0
  414. data/vendor/rails/railties/guides/rails_guides/textile_extensions.rb +41 -0
  415. data/vendor/rails/railties/guides/source/2_2_release_notes.textile +422 -0
  416. data/vendor/rails/railties/guides/source/2_3_release_notes.textile +610 -0
  417. data/vendor/rails/railties/guides/source/action_controller_overview.textile +776 -0
  418. data/vendor/rails/railties/guides/source/action_mailer_basics.textile +424 -0
  419. data/vendor/rails/railties/guides/source/active_record_basics.textile +135 -0
  420. data/vendor/rails/railties/guides/source/active_record_querying.textile +969 -0
  421. data/vendor/rails/railties/guides/source/activerecord_validations_callbacks.textile +1086 -0
  422. data/vendor/rails/railties/guides/source/association_basics.textile +1781 -0
  423. data/vendor/rails/railties/guides/source/caching_with_rails.textile +524 -0
  424. data/vendor/rails/railties/guides/source/command_line.textile +589 -0
  425. data/vendor/rails/railties/guides/source/configuring.textile +234 -0
  426. data/vendor/rails/railties/guides/source/contribute.textile +71 -0
  427. data/vendor/rails/railties/guides/source/contributing_to_rails.textile +239 -0
  428. data/vendor/rails/railties/guides/source/credits.erb.textile +52 -0
  429. data/vendor/rails/railties/guides/source/debugging_rails_applications.textile +709 -0
  430. data/vendor/rails/railties/guides/source/form_helpers.textile +766 -0
  431. data/vendor/rails/railties/guides/source/getting_started.textile +1297 -0
  432. data/vendor/rails/railties/guides/source/i18n.textile +912 -0
  433. data/vendor/rails/railties/guides/source/index.erb.textile +124 -0
  434. data/vendor/rails/railties/guides/source/layout.html.erb +103 -0
  435. data/vendor/rails/railties/guides/source/layouts_and_rendering.textile +979 -0
  436. data/vendor/rails/railties/guides/source/migrations.textile +591 -0
  437. data/vendor/rails/railties/guides/source/nested_model_forms.textile +222 -0
  438. data/vendor/rails/railties/guides/source/performance_testing.textile +531 -0
  439. data/vendor/rails/railties/guides/source/plugins.textile +1512 -0
  440. data/vendor/rails/railties/guides/source/rails_on_rack.textile +309 -0
  441. data/vendor/rails/railties/guides/source/routing.textile +903 -0
  442. data/vendor/rails/railties/guides/source/security.textile +986 -0
  443. data/vendor/rails/railties/guides/source/testing.textile +951 -0
  444. data/vendor/rails/railties/lib/commands/dbconsole.rb +8 -4
  445. data/vendor/rails/railties/lib/commands/performance/profiler.rb +1 -1
  446. data/vendor/rails/railties/lib/initializer.rb +27 -4
  447. data/vendor/rails/railties/lib/rails/gem_dependency.rb +35 -6
  448. data/vendor/rails/railties/lib/rails/plugin.rb +12 -0
  449. data/vendor/rails/railties/lib/rails/plugin/loader.rb +7 -0
  450. data/vendor/rails/railties/lib/rails/rack/metal.rb +1 -1
  451. data/vendor/rails/railties/lib/rails/version.rb +1 -1
  452. data/vendor/rails/railties/lib/rails_generator/base.rb +1 -1
  453. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +5 -0
  454. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/template_runner.rb +1 -1
  455. data/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +9 -2
  456. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +1 -0
  457. data/vendor/rails/railties/lib/tasks/databases.rake +17 -4
  458. data/vendor/rails/railties/lib/tasks/gems.rake +19 -6
  459. data/vendor/rails/railties/lib/tasks/routes.rake +4 -3
  460. data/vendor/rails/railties/lib/test_help.rb +4 -1
  461. metadata +158 -58
  462. data/spec/lib/local_time_spec.rb +0 -40
  463. data/vendor/rails/actionpack/lib/action_controller/rewindable_input.rb +0 -28
  464. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack.rb +0 -89
  465. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/adapter/camping.rb +0 -22
  466. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/handler.rb +0 -37
  467. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/request.rb +0 -37
  468. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/basic.rb +0 -58
  469. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/md5.rb +0 -124
  470. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/nonce.rb +0 -51
  471. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/params.rb +0 -55
  472. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/request.rb +0 -40
  473. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/openid.rb +0 -480
  474. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/builder.rb +0 -63
  475. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/cascade.rb +0 -36
  476. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/chunked.rb +0 -49
  477. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/commonlogger.rb +0 -61
  478. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/conditionalget.rb +0 -45
  479. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_length.rb +0 -29
  480. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_type.rb +0 -23
  481. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/deflater.rb +0 -85
  482. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/directory.rb +0 -153
  483. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/file.rb +0 -88
  484. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler.rb +0 -48
  485. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/cgi.rb +0 -61
  486. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/evented_mongrel.rb +0 -8
  487. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/fastcgi.rb +0 -89
  488. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/lsws.rb +0 -55
  489. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb +0 -84
  490. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/scgi.rb +0 -59
  491. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/swiftiplied_mongrel.rb +0 -8
  492. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/thin.rb +0 -18
  493. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/webrick.rb +0 -67
  494. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/head.rb +0 -19
  495. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lint.rb +0 -462
  496. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lobster.rb +0 -65
  497. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lock.rb +0 -16
  498. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/methodoverride.rb +0 -27
  499. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mime.rb +0 -204
  500. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mock.rb +0 -160
  501. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/recursive.rb +0 -57
  502. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/reloader.rb +0 -64
  503. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/request.rb +0 -241
  504. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/response.rb +0 -179
  505. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/abstract/id.rb +0 -142
  506. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/cookie.rb +0 -91
  507. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/memcache.rb +0 -109
  508. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/pool.rb +0 -100
  509. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showexceptions.rb +0 -349
  510. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showstatus.rb +0 -106
  511. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/static.rb +0 -38
  512. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/urlmap.rb +0 -55
  513. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/utils.rb +0 -392
@@ -11,9 +11,13 @@ require 'models/author'
11
11
  require 'models/owner'
12
12
  require 'models/pet'
13
13
  require 'models/toy'
14
+ require 'models/contract'
15
+ require 'models/company'
16
+ require 'models/developer'
14
17
 
15
18
  class HasManyThroughAssociationsTest < ActiveRecord::TestCase
16
- fixtures :posts, :readers, :people, :comments, :authors, :owners, :pets, :toys
19
+ fixtures :posts, :readers, :people, :comments, :authors, :owners, :pets, :toys,
20
+ :companies
17
21
 
18
22
  def test_associate_existing
19
23
  assert_queries(2) { posts(:thinking);people(:david) }
@@ -157,6 +161,30 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
157
161
  assert_equal peeps + 1, posts(:thinking).people.count
158
162
  end
159
163
 
164
+ def test_associate_with_create_and_invalid_options
165
+ peeps = companies(:first_firm).developers.count
166
+ assert_nothing_raised { companies(:first_firm).developers.create(:name => '0') }
167
+ assert_equal peeps, companies(:first_firm).developers.count
168
+ end
169
+
170
+ def test_associate_with_create_and_valid_options
171
+ peeps = companies(:first_firm).developers.count
172
+ assert_nothing_raised { companies(:first_firm).developers.create(:name => 'developer') }
173
+ assert_equal peeps + 1, companies(:first_firm).developers.count
174
+ end
175
+
176
+ def test_associate_with_create_bang_and_invalid_options
177
+ peeps = companies(:first_firm).developers.count
178
+ assert_raises(ActiveRecord::RecordInvalid) { companies(:first_firm).developers.create!(:name => '0') }
179
+ assert_equal peeps, companies(:first_firm).developers.count
180
+ end
181
+
182
+ def test_associate_with_create_bang_and_valid_options
183
+ peeps = companies(:first_firm).developers.count
184
+ assert_nothing_raised { companies(:first_firm).developers.create!(:name => 'developer') }
185
+ assert_equal peeps + 1, companies(:first_firm).developers.count
186
+ end
187
+
160
188
  def test_clear_associations
161
189
  assert_queries(2) { posts(:welcome);posts(:welcome).people(true) }
162
190
 
@@ -276,4 +304,21 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
276
304
  def test_has_many_association_through_a_has_many_association_with_nonstandard_primary_keys
277
305
  assert_equal 1, owners(:blackbeard).toys.count
278
306
  end
307
+
308
+ def test_find_on_has_many_association_collection_with_include_and_conditions
309
+ post_with_no_comments = people(:michael).posts_with_no_comments.first
310
+ assert_equal post_with_no_comments, posts(:authorless)
311
+ end
312
+
313
+ def test_has_many_through_has_one_reflection
314
+ assert_equal [comments(:eager_sti_on_associations_vs_comment)], authors(:david).very_special_comments
315
+ end
316
+
317
+ def test_modifying_has_many_through_has_one_reflection_should_raise
318
+ [
319
+ lambda { authors(:david).very_special_comments = [VerySpecialComment.create!(:body => "Gorp!", :post_id => 1011), VerySpecialComment.create!(:body => "Eep!", :post_id => 1012)] },
320
+ lambda { authors(:david).very_special_comments << VerySpecialComment.create!(:body => "Hoohah!", :post_id => 1013) },
321
+ lambda { authors(:david).very_special_comments.delete(authors(:david).very_special_comments.first) },
322
+ ].each {|block| assert_raise(ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection, &block) }
323
+ end
279
324
  end
@@ -28,6 +28,16 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
28
28
  assert_not_nil new_member.current_membership
29
29
  assert_not_nil new_member.club
30
30
  end
31
+
32
+ def test_creating_association_builds_through_record_for_new
33
+ new_member = Member.new(:name => "Jane")
34
+ new_member.club = clubs(:moustache_club)
35
+ assert new_member.current_membership
36
+ assert_equal clubs(:moustache_club), new_member.current_membership.club
37
+ assert_equal clubs(:moustache_club), new_member.club
38
+ assert new_member.save
39
+ assert_equal clubs(:moustache_club), new_member.club
40
+ end
31
41
 
32
42
  def test_replace_target_record
33
43
  new_club = Club.create(:name => "Marx Bros")
@@ -43,7 +53,14 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
43
53
  @member.reload
44
54
  end
45
55
  end
46
-
56
+
57
+ def test_set_record_to_nil_should_delete_association
58
+ @member.club = nil
59
+ @member.reload
60
+ assert_equal nil, @member.current_membership
61
+ assert_nil @member.club
62
+ end
63
+
47
64
  def test_has_one_through_polymorphic
48
65
  assert_equal clubs(:moustache_club), @member.sponsor_club
49
66
  end
@@ -29,6 +29,11 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
29
29
  assert_match /INNER JOIN .?categories.? ON.*AND.*.?General.?.*TERMINATING_MARKER/, sql
30
30
  end
31
31
 
32
+ def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
33
+ result = Author.find(:all, :joins => [:thinking_posts, :welcome_posts])
34
+ assert_equal authors(:david), result.first
35
+ end
36
+
32
37
  def test_construct_finder_sql_unpacks_nested_joins
33
38
  sql = Author.send(:construct_finder_sql, :joins => {:posts => [[:comments]]})
34
39
  assert_no_match /inner join.*inner join.*inner join/i, sql, "only two join clauses should be present"
@@ -317,11 +317,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
317
317
  end
318
318
 
319
319
  def test_belongs_to_polymorphic_with_counter_cache
320
- assert_equal 0, posts(:welcome)[:taggings_count]
320
+ assert_equal 1, posts(:welcome)[:taggings_count]
321
321
  tagging = posts(:welcome).taggings.create(:tag => tags(:general))
322
- assert_equal 1, posts(:welcome, :reload)[:taggings_count]
322
+ assert_equal 2, posts(:welcome, :reload)[:taggings_count]
323
323
  tagging.destroy
324
- assert posts(:welcome, :reload)[:taggings_count].zero?
324
+ assert_equal 1, posts(:welcome, :reload)[:taggings_count]
325
325
  end
326
326
 
327
327
  def test_unavailable_through_reflection
@@ -377,7 +377,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
377
377
  end
378
378
 
379
379
  def test_has_many_through_polymorphic_has_one
380
- assert_raise(ActiveRecord::HasManyThroughSourceAssociationMacroError) { authors(:david).tagging }
380
+ assert_equal Tagging.find(1,2).sort_by { |t| t.id }, authors(:david).tagging
381
381
  end
382
382
 
383
383
  def test_has_many_through_polymorphic_has_many
@@ -38,6 +38,17 @@ class TestAutosaveAssociationsInGeneral < ActiveRecord::TestCase
38
38
  end
39
39
 
40
40
  class TestDefaultAutosaveAssociationOnAHasOneAssociation < ActiveRecord::TestCase
41
+ def test_should_save_parent_but_not_invalid_child
42
+ firm = Firm.new(:name => 'GlobalMegaCorp')
43
+ assert firm.valid?
44
+
45
+ firm.build_account_using_primary_key
46
+ assert !firm.build_account_using_primary_key.valid?
47
+
48
+ assert firm.save
49
+ assert firm.account_using_primary_key.new_record?
50
+ end
51
+
41
52
  def test_save_fails_for_invalid_has_one
42
53
  firm = Firm.find(:first)
43
54
  assert firm.valid?
@@ -126,6 +137,17 @@ class TestDefaultAutosaveAssociationOnAHasOneAssociation < ActiveRecord::TestCas
126
137
  end
127
138
 
128
139
  class TestDefaultAutosaveAssociationOnABelongsToAssociation < ActiveRecord::TestCase
140
+ def test_should_save_parent_but_not_invalid_child
141
+ client = Client.new(:name => 'Joe (the Plumber)')
142
+ assert client.valid?
143
+
144
+ client.build_firm
145
+ assert !client.firm.valid?
146
+
147
+ assert client.save
148
+ assert client.firm.new_record?
149
+ end
150
+
129
151
  def test_save_fails_for_invalid_belongs_to
130
152
  assert log = AuditLog.create(:developer_id => 0, :message => "")
131
153
 
@@ -1,4 +1,5 @@
1
1
  require "cases/helper"
2
+ require 'models/post'
2
3
  require 'models/author'
3
4
  require 'models/topic'
4
5
  require 'models/reply'
@@ -12,7 +13,6 @@ require 'models/auto_id'
12
13
  require 'models/column_name'
13
14
  require 'models/subscriber'
14
15
  require 'models/keyboard'
15
- require 'models/post'
16
16
  require 'models/comment'
17
17
  require 'models/minimalistic'
18
18
  require 'models/warehouse_thing'
@@ -1012,7 +1012,25 @@ class BasicsTest < ActiveRecord::TestCase
1012
1012
  assert_date_from_db Date.new(2004, 6, 24), topic.last_read.to_date
1013
1013
  end
1014
1014
 
1015
- def test_multiparameter_attributes_on_date_with_empty_date
1015
+ def test_multiparameter_attributes_on_date_with_empty_year
1016
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "6", "last_read(3i)" => "24" }
1017
+ topic = Topic.find(1)
1018
+ topic.attributes = attributes
1019
+ # note that extra #to_date call allows test to pass for Oracle, which
1020
+ # treats dates/times the same
1021
+ assert_date_from_db Date.new(1, 6, 24), topic.last_read.to_date
1022
+ end
1023
+
1024
+ def test_multiparameter_attributes_on_date_with_empty_month
1025
+ attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "", "last_read(3i)" => "24" }
1026
+ topic = Topic.find(1)
1027
+ topic.attributes = attributes
1028
+ # note that extra #to_date call allows test to pass for Oracle, which
1029
+ # treats dates/times the same
1030
+ assert_date_from_db Date.new(2004, 1, 24), topic.last_read.to_date
1031
+ end
1032
+
1033
+ def test_multiparameter_attributes_on_date_with_empty_day
1016
1034
  attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "6", "last_read(3i)" => "" }
1017
1035
  topic = Topic.find(1)
1018
1036
  topic.attributes = attributes
@@ -1021,6 +1039,33 @@ class BasicsTest < ActiveRecord::TestCase
1021
1039
  assert_date_from_db Date.new(2004, 6, 1), topic.last_read.to_date
1022
1040
  end
1023
1041
 
1042
+ def test_multiparameter_attributes_on_date_with_empty_day_and_year
1043
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "6", "last_read(3i)" => "" }
1044
+ topic = Topic.find(1)
1045
+ topic.attributes = attributes
1046
+ # note that extra #to_date call allows test to pass for Oracle, which
1047
+ # treats dates/times the same
1048
+ assert_date_from_db Date.new(1, 6, 1), topic.last_read.to_date
1049
+ end
1050
+
1051
+ def test_multiparameter_attributes_on_date_with_empty_day_and_month
1052
+ attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "", "last_read(3i)" => "" }
1053
+ topic = Topic.find(1)
1054
+ topic.attributes = attributes
1055
+ # note that extra #to_date call allows test to pass for Oracle, which
1056
+ # treats dates/times the same
1057
+ assert_date_from_db Date.new(2004, 1, 1), topic.last_read.to_date
1058
+ end
1059
+
1060
+ def test_multiparameter_attributes_on_date_with_empty_year_and_month
1061
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "", "last_read(3i)" => "24" }
1062
+ topic = Topic.find(1)
1063
+ topic.attributes = attributes
1064
+ # note that extra #to_date call allows test to pass for Oracle, which
1065
+ # treats dates/times the same
1066
+ assert_date_from_db Date.new(1, 1, 24), topic.last_read.to_date
1067
+ end
1068
+
1024
1069
  def test_multiparameter_attributes_on_date_with_all_empty
1025
1070
  attributes = { "last_read(1i)" => "", "last_read(2i)" => "", "last_read(3i)" => "" }
1026
1071
  topic = Topic.find(1)
@@ -1115,7 +1160,7 @@ class BasicsTest < ActiveRecord::TestCase
1115
1160
  Time.zone = nil
1116
1161
  Topic.skip_time_zone_conversion_for_attributes = []
1117
1162
  end
1118
-
1163
+
1119
1164
  def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
1120
1165
  ActiveRecord::Base.time_zone_aware_attributes = true
1121
1166
  ActiveRecord::Base.default_timezone = :utc
@@ -1439,7 +1484,7 @@ class BasicsTest < ActiveRecord::TestCase
1439
1484
  topic = Topic.create("content" => myobj).reload
1440
1485
  assert_equal(myobj, topic.content)
1441
1486
  end
1442
-
1487
+
1443
1488
  def test_serialized_string_attribute
1444
1489
  myobj = "Yes"
1445
1490
  topic = Topic.create("content" => myobj).reload
@@ -1756,7 +1801,7 @@ class BasicsTest < ActiveRecord::TestCase
1756
1801
  end
1757
1802
 
1758
1803
  def test_scoped_find_with_group_and_having
1759
- developers = Developer.with_scope(:find => { :group => 'salary', :having => "SUM(salary) > 10000", :select => "SUM(salary) as salary" }) do
1804
+ developers = Developer.with_scope(:find => { :group => 'developers.salary', :having => "SUM(salary) > 10000", :select => "SUM(salary) as salary" }) do
1760
1805
  Developer.find(:all)
1761
1806
  end
1762
1807
  assert_equal 3, developers.size
@@ -2014,7 +2059,7 @@ class BasicsTest < ActiveRecord::TestCase
2014
2059
 
2015
2060
  def test_inspect_instance
2016
2061
  topic = topics(:first)
2017
- assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", approved: false, replies_count: 1, parent_id: nil, type: nil>), topic.inspect
2062
+ assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", approved: false, replies_count: 1, parent_id: nil, parent_title: nil, type: nil>), topic.inspect
2018
2063
  end
2019
2064
 
2020
2065
  def test_inspect_new_instance
@@ -2,6 +2,11 @@ require "cases/helper"
2
2
  require 'models/company'
3
3
  require 'models/topic'
4
4
  require 'models/edge'
5
+ require 'models/owner'
6
+ require 'models/pet'
7
+ require 'models/toy'
8
+ require 'models/club'
9
+ require 'models/organization'
5
10
 
6
11
  Company.has_many :accounts
7
12
 
@@ -10,7 +15,7 @@ class NumericData < ActiveRecord::Base
10
15
  end
11
16
 
12
17
  class CalculationsTest < ActiveRecord::TestCase
13
- fixtures :companies, :accounts, :topics
18
+ fixtures :companies, :accounts, :topics, :owners, :pets, :toys
14
19
 
15
20
  def test_should_sum_field
16
21
  assert_equal 318, Account.sum(:credit_limit)
@@ -223,6 +228,10 @@ class CalculationsTest < ActiveRecord::TestCase
223
228
  assert_equal 15, companies(:rails_core).companies.sum(:id)
224
229
  end
225
230
 
231
+ def test_should_sum_scoped_field_with_from
232
+ assert_equal Club.count, Organization.clubs.count
233
+ end
234
+
226
235
  def test_should_sum_scoped_field_with_conditions
227
236
  assert_equal 8, companies(:rails_core).companies.sum(:id, :conditions => 'id > 7')
228
237
  end
@@ -264,19 +273,6 @@ class CalculationsTest < ActiveRecord::TestCase
264
273
  assert_equal 4, Account.count(:distinct => true, :include => :firm, :select => :credit_limit)
265
274
  end
266
275
 
267
- def test_should_count_scoped_select
268
- Account.update_all("credit_limit = NULL")
269
- assert_equal 0, Account.scoped(:select => "credit_limit").count
270
- end
271
-
272
- def test_should_count_scoped_select_with_options
273
- Account.update_all("credit_limit = NULL")
274
- Account.last.update_attribute('credit_limit', 49)
275
- Account.first.update_attribute('credit_limit', 51)
276
-
277
- assert_equal 1, Account.scoped(:select => "credit_limit").count(:conditions => ['credit_limit >= 50'])
278
- end
279
-
280
276
  def test_should_count_manual_select_with_include
281
277
  assert_equal 6, Account.count(:select => "DISTINCT accounts.id", :include => :firm)
282
278
  end
@@ -297,6 +293,10 @@ class CalculationsTest < ActiveRecord::TestCase
297
293
  assert_raise(ArgumentError) { Account.count(1, 2, 3) }
298
294
  end
299
295
 
296
+ def test_count_with_scoped_has_many_through_association
297
+ assert_equal 1, owners(:blackbeard).toys.with_name('Bone').count
298
+ end
299
+
300
300
  def test_should_sum_expression
301
301
  assert_equal '636', Account.sum("2 * credit_limit")
302
302
  end
@@ -33,4 +33,38 @@ class ColumnDefinitionTest < ActiveRecord::TestCase
33
33
  column.limit, column.precision, column.scale, column.default, column.null)
34
34
  assert_equal %Q{title varchar(20) DEFAULT 'Hello' NOT NULL}, column_def.to_sql
35
35
  end
36
+
37
+ if current_adapter?(:MysqlAdapter)
38
+ def test_should_set_default_for_mysql_binary_data_types
39
+ binary_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "a", "binary(1)")
40
+ assert_equal "a", binary_column.default
41
+
42
+ varbinary_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "a", "varbinary(1)")
43
+ assert_equal "a", varbinary_column.default
44
+ end
45
+
46
+ def test_should_not_set_default_for_blob_and_text_data_types
47
+ assert_raise ArgumentError do
48
+ ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "a", "blob")
49
+ end
50
+
51
+ assert_raise ArgumentError do
52
+ ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", "Hello", "text")
53
+ end
54
+
55
+ text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "text")
56
+ assert_equal nil, text_column.default
57
+
58
+ not_null_text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "text", false)
59
+ assert_equal "", not_null_text_column.default
60
+ end
61
+
62
+ def test_has_default_should_return_false_for_blog_and_test_data_types
63
+ blob_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "blob")
64
+ assert !blob_column.has_default?
65
+
66
+ text_column = ActiveRecord::ConnectionAdapters::MysqlColumn.new("title", nil, "text")
67
+ assert !text_column.has_default?
68
+ end
69
+ end
36
70
  end
@@ -10,7 +10,7 @@ class CopyTableTest < ActiveRecord::TestCase
10
10
  end
11
11
  end
12
12
 
13
- def test_copy_table(from = 'companies', to = 'companies2', options = {})
13
+ def test_copy_table(from = 'customers', to = 'customers2', options = {})
14
14
  assert_nothing_raised {copy_table(from, to, options)}
15
15
  assert_equal row_count(from), row_count(to)
16
16
 
@@ -24,11 +24,11 @@ class CopyTableTest < ActiveRecord::TestCase
24
24
  end
25
25
 
26
26
  def test_copy_table_renaming_column
27
- test_copy_table('companies', 'companies2',
28
- :rename => {'client_of' => 'fan_of'}) do |from, to, options|
29
- expected = column_values(from, 'client_of')
27
+ test_copy_table('customers', 'customers2',
28
+ :rename => {'name' => 'person_name'}) do |from, to, options|
29
+ expected = column_values(from, 'name')
30
30
  assert expected.any?, 'only nils in resultset; real values are needed'
31
- assert_equal expected, column_values(to, 'fan_of')
31
+ assert_equal expected, column_values(to, 'person_name')
32
32
  end
33
33
  end
34
34
 
@@ -288,6 +288,16 @@ class DirtyTest < ActiveRecord::TestCase
288
288
  end
289
289
  end
290
290
 
291
+ def test_save_should_not_save_serialized_attribute_with_partial_updates_if_not_present
292
+ with_partial_updates(Topic) do
293
+ Topic.create!(:author_name => 'Bill', :content => {:a => "a"})
294
+ topic = Topic.first(:select => 'id, author_name')
295
+ topic.update_attribute :author_name, 'John'
296
+ topic = Topic.first
297
+ assert_not_nil topic.content
298
+ end
299
+ end
300
+
291
301
  private
292
302
  def with_partial_updates(klass, on = true)
293
303
  old = klass.partial_updates?
@@ -1,4 +1,5 @@
1
1
  require "cases/helper"
2
+ require 'models/post'
2
3
  require 'models/author'
3
4
  require 'models/categorization'
4
5
  require 'models/comment'
@@ -7,7 +8,6 @@ require 'models/topic'
7
8
  require 'models/reply'
8
9
  require 'models/entrant'
9
10
  require 'models/developer'
10
- require 'models/post'
11
11
  require 'models/customer'
12
12
  require 'models/job'
13
13
  require 'models/categorization'
@@ -94,16 +94,16 @@ class FinderTest < ActiveRecord::TestCase
94
94
 
95
95
  assert_raise(NoMethodError) { Topic.exists?([1,2]) }
96
96
  end
97
-
97
+
98
98
  def test_exists_returns_true_with_one_record_and_no_args
99
99
  assert Topic.exists?
100
100
  end
101
-
101
+
102
102
  def test_does_not_exist_with_empty_table_and_no_args_given
103
103
  Topic.delete_all
104
104
  assert !Topic.exists?
105
105
  end
106
-
106
+
107
107
  def test_exists_with_aggregate_having_three_mappings
108
108
  existing_address = customers(:david).address
109
109
  assert Customer.exists?(:address => existing_address)
@@ -119,6 +119,12 @@ class FinderTest < ActiveRecord::TestCase
119
119
  Address.new(existing_address.street + "1", existing_address.city, existing_address.country))
120
120
  end
121
121
 
122
+ def test_exists_with_scoped_include
123
+ Developer.with_scope(:find => { :include => :projects, :order => "projects.name" }) do
124
+ assert Developer.exists?
125
+ end
126
+ end
127
+
122
128
  def test_find_by_array_of_one_id
123
129
  assert_kind_of(Array, Topic.find([ 1 ]))
124
130
  assert_equal(1, Topic.find([ 1 ]).length)
@@ -150,10 +156,8 @@ class FinderTest < ActiveRecord::TestCase
150
156
  end
151
157
 
152
158
  def test_find_all_with_limit
153
- entrants = Entrant.find(:all, :order => "id ASC", :limit => 2)
154
-
155
- assert_equal(2, entrants.size)
156
- assert_equal(entrants(:first).name, entrants.first.name)
159
+ assert_equal(2, Entrant.find(:all, :limit => 2).size)
160
+ assert_equal(0, Entrant.find(:all, :limit => 0).size)
157
161
  end
158
162
 
159
163
  def test_find_all_with_prepared_limit_and_offset
@@ -162,22 +166,23 @@ class FinderTest < ActiveRecord::TestCase
162
166
  assert_equal(2, entrants.size)
163
167
  assert_equal(entrants(:second).name, entrants.first.name)
164
168
 
169
+ assert_equal 3, Entrant.count
165
170
  entrants = Entrant.find(:all, :order => "id ASC", :limit => 2, :offset => 2)
166
171
  assert_equal(1, entrants.size)
167
172
  assert_equal(entrants(:third).name, entrants.first.name)
168
173
  end
169
174
 
170
- def test_find_all_with_limit_and_offset_and_multiple_orderings
171
- developers = Developer.find(:all, :order => "salary ASC, id DESC", :limit => 3, :offset => 1)
172
- assert_equal ["David", "fixture_10", "fixture_9"], developers.collect {|d| d.name}
173
- end
175
+ def test_find_all_with_limit_and_offset_and_multiple_order_clauses
176
+ first_three_posts = Post.find :all, :order => 'author_id, id', :limit => 3, :offset => 0
177
+ second_three_posts = Post.find :all, :order => ' author_id,id ', :limit => 3, :offset => 3
178
+ last_posts = Post.find :all, :order => ' author_id, id ', :limit => 3, :offset => 6
174
179
 
175
- def test_find_with_limit_and_condition
176
- developers = Developer.find(:all, :order => "id DESC", :conditions => "salary = 100000", :limit => 3, :offset =>7)
177
- assert_equal(1, developers.size)
178
- assert_equal("fixture_3", developers.first.name)
180
+ assert_equal [[0,3],[1,1],[1,2]], first_three_posts.map { |p| [p.author_id, p.id] }
181
+ assert_equal [[1,4],[1,5],[1,6]], second_three_posts.map { |p| [p.author_id, p.id] }
182
+ assert_equal [[2,7]], last_posts.map { |p| [p.author_id, p.id] }
179
183
  end
180
184
 
185
+
181
186
  def test_find_with_group
182
187
  developers = Developer.find(:all, :group => "salary", :select => "salary")
183
188
  assert_equal 4, developers.size
@@ -935,40 +940,6 @@ class FinderTest < ActiveRecord::TestCase
935
940
  assert_raise(ArgumentError) { Topic.find_by_title 'No Title', :join => "It should be `joins'" }
936
941
  end
937
942
 
938
- def test_find_all_with_limit
939
- first_five_developers = Developer.find :all, :order => 'id ASC', :limit => 5
940
- assert_equal 5, first_five_developers.length
941
- assert_equal 'David', first_five_developers.first.name
942
- assert_equal 'fixture_5', first_five_developers.last.name
943
-
944
- no_developers = Developer.find :all, :order => 'id ASC', :limit => 0
945
- assert_equal 0, no_developers.length
946
- end
947
-
948
- def test_find_all_with_limit_and_offset
949
- first_three_developers = Developer.find :all, :order => 'id ASC', :limit => 3, :offset => 0
950
- second_three_developers = Developer.find :all, :order => 'id ASC', :limit => 3, :offset => 3
951
- last_two_developers = Developer.find :all, :order => 'id ASC', :limit => 2, :offset => 8
952
-
953
- assert_equal 3, first_three_developers.length
954
- assert_equal 3, second_three_developers.length
955
- assert_equal 2, last_two_developers.length
956
-
957
- assert_equal 'David', first_three_developers.first.name
958
- assert_equal 'fixture_4', second_three_developers.first.name
959
- assert_equal 'fixture_9', last_two_developers.first.name
960
- end
961
-
962
- def test_find_all_with_limit_and_offset_and_multiple_order_clauses
963
- first_three_posts = Post.find :all, :order => 'author_id, id', :limit => 3, :offset => 0
964
- second_three_posts = Post.find :all, :order => ' author_id,id ', :limit => 3, :offset => 3
965
- last_posts = Post.find :all, :order => ' author_id, id ', :limit => 3, :offset => 6
966
-
967
- assert_equal [[0,3],[1,1],[1,2]], first_three_posts.map { |p| [p.author_id, p.id] }
968
- assert_equal [[1,4],[1,5],[1,6]], second_three_posts.map { |p| [p.author_id, p.id] }
969
- assert_equal [[2,7]], last_posts.map { |p| [p.author_id, p.id] }
970
- end
971
-
972
943
  def test_find_all_with_join
973
944
  developers_on_project_one = Developer.find(
974
945
  :all,