3mix-castronaut 0.5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (904) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +75 -0
  3. data/Rakefile +105 -0
  4. data/app/config.rb +15 -0
  5. data/app/config.ru +24 -0
  6. data/app/controllers/application.rb +47 -0
  7. data/app/public/javascripts/application.js +3 -0
  8. data/app/public/javascripts/jquery.js +32 -0
  9. data/app/public/stylesheets/screen.css +122 -0
  10. data/app/views/layout.erb +27 -0
  11. data/app/views/login.erb +31 -0
  12. data/app/views/logout.erb +13 -0
  13. data/app/views/proxy_validate.erb +25 -0
  14. data/app/views/service_validate.erb +18 -0
  15. data/bin/castronaut +48 -0
  16. data/castronaut.rb +7 -0
  17. data/config/castronaut.example.yml +47 -0
  18. data/config/nginx_vhost.conf +24 -0
  19. data/config/thin_config.yml +13 -0
  20. data/lib/castronaut/adapters/active_record_adapter.rb +20 -0
  21. data/lib/castronaut/adapters/development/adapter.rb +13 -0
  22. data/lib/castronaut/adapters/development/user.rb +25 -0
  23. data/lib/castronaut/adapters/ldap/adapter.rb +15 -0
  24. data/lib/castronaut/adapters/ldap/user.rb +40 -0
  25. data/lib/castronaut/adapters/restful_authentication/adapter.rb +21 -0
  26. data/lib/castronaut/adapters/restful_authentication/user.rb +50 -0
  27. data/lib/castronaut/adapters.rb +17 -0
  28. data/lib/castronaut/authentication_result.rb +27 -0
  29. data/lib/castronaut/configuration.rb +95 -0
  30. data/lib/castronaut/db/001_create_cas_database.rb +47 -0
  31. data/lib/castronaut/db/002_change_username_to_identifier.rb +11 -0
  32. data/lib/castronaut/db/003_add_extra_info.rb +11 -0
  33. data/lib/castronaut/models/consumeable.rb +18 -0
  34. data/lib/castronaut/models/dispenser.rb +14 -0
  35. data/lib/castronaut/models/login_ticket.rb +53 -0
  36. data/lib/castronaut/models/proxy_granting_ticket.rb +69 -0
  37. data/lib/castronaut/models/proxy_ticket.rb +43 -0
  38. data/lib/castronaut/models/service_ticket.rb +100 -0
  39. data/lib/castronaut/models/ticket_granting_ticket.rb +70 -0
  40. data/lib/castronaut/presenters/base.rb +32 -0
  41. data/lib/castronaut/presenters/login.rb +60 -0
  42. data/lib/castronaut/presenters/logout.rb +40 -0
  43. data/lib/castronaut/presenters/process_login.rb +127 -0
  44. data/lib/castronaut/presenters/proxy_validate.rb +49 -0
  45. data/lib/castronaut/presenters/service_validate.rb +43 -0
  46. data/lib/castronaut/ticket_result.rb +27 -0
  47. data/lib/castronaut/utilities/random_string.rb +24 -0
  48. data/lib/castronaut.rb +34 -0
  49. data/lib/version.rb +5 -0
  50. data/spec/app/controllers/application_spec.rb +89 -0
  51. data/spec/castronaut/adapters/development/adapter_spec.rb +14 -0
  52. data/spec/castronaut/adapters/development/user_spec.rb +55 -0
  53. data/spec/castronaut/adapters/ldap/adapter_spec.rb +14 -0
  54. data/spec/castronaut/adapters/ldap/user_spec.rb +25 -0
  55. data/spec/castronaut/adapters/restful_authentication/adapter_spec.rb +14 -0
  56. data/spec/castronaut/adapters/restful_authentication/user_spec.rb +108 -0
  57. data/spec/castronaut/adapters_spec.rb +13 -0
  58. data/spec/castronaut/authentication_result_spec.rb +20 -0
  59. data/spec/castronaut/configuration_spec.rb +172 -0
  60. data/spec/castronaut/models/consumeable_spec.rb +39 -0
  61. data/spec/castronaut/models/dispenser_spec.rb +30 -0
  62. data/spec/castronaut/models/login_ticket_spec.rb +107 -0
  63. data/spec/castronaut/models/proxy_granting_ticket_spec.rb +302 -0
  64. data/spec/castronaut/models/proxy_ticket_spec.rb +109 -0
  65. data/spec/castronaut/models/service_ticket_spec.rb +269 -0
  66. data/spec/castronaut/models/ticket_granting_ticket_spec.rb +89 -0
  67. data/spec/castronaut/presenters/login_spec.rb +152 -0
  68. data/spec/castronaut/presenters/logout_spec.rb +85 -0
  69. data/spec/castronaut/presenters/process_login_spec.rb +300 -0
  70. data/spec/castronaut/presenters/proxy_validate_spec.rb +103 -0
  71. data/spec/castronaut/presenters/service_validate_spec.rb +86 -0
  72. data/spec/castronaut/ticket_result_spec.rb +42 -0
  73. data/spec/castronaut/utilities/random_string_spec.rb +14 -0
  74. data/spec/castronaut_spec.rb +26 -0
  75. data/spec/spec.opts +2 -0
  76. data/spec/spec_controller_helper.rb +17 -0
  77. data/spec/spec_helper.rb +49 -0
  78. data/spec/spec_rails_mocks.rb +132 -0
  79. data/vendor/activerecord/CHANGELOG +5753 -0
  80. data/vendor/activerecord/README +351 -0
  81. data/vendor/activerecord/RUNNING_UNIT_TESTS +36 -0
  82. data/vendor/activerecord/Rakefile +248 -0
  83. data/vendor/activerecord/examples/associations.png +0 -0
  84. data/vendor/activerecord/install.rb +30 -0
  85. data/vendor/activerecord/lib/active_record/aggregations.rb +189 -0
  86. data/vendor/activerecord/lib/active_record/association_preload.rb +282 -0
  87. data/vendor/activerecord/lib/active_record/associations/association_collection.rb +368 -0
  88. data/vendor/activerecord/lib/active_record/associations/association_proxy.rb +220 -0
  89. data/vendor/activerecord/lib/active_record/associations/belongs_to_association.rb +58 -0
  90. data/vendor/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +49 -0
  91. data/vendor/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +111 -0
  92. data/vendor/activerecord/lib/active_record/associations/has_many_association.rb +121 -0
  93. data/vendor/activerecord/lib/active_record/associations/has_many_through_association.rb +254 -0
  94. data/vendor/activerecord/lib/active_record/associations/has_one_association.rb +98 -0
  95. data/vendor/activerecord/lib/active_record/associations/has_one_through_association.rb +32 -0
  96. data/vendor/activerecord/lib/active_record/associations.rb +2012 -0
  97. data/vendor/activerecord/lib/active_record/attribute_methods.rb +379 -0
  98. data/vendor/activerecord/lib/active_record/base.rb +2744 -0
  99. data/vendor/activerecord/lib/active_record/calculations.rb +288 -0
  100. data/vendor/activerecord/lib/active_record/callbacks.rb +312 -0
  101. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +309 -0
  102. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +176 -0
  103. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb +93 -0
  104. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
  105. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +664 -0
  106. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +428 -0
  107. data/vendor/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +169 -0
  108. data/vendor/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +559 -0
  109. data/vendor/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +994 -0
  110. data/vendor/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  111. data/vendor/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +418 -0
  112. data/vendor/activerecord/lib/active_record/dirty.rb +165 -0
  113. data/vendor/activerecord/lib/active_record/fixtures.rb +997 -0
  114. data/vendor/activerecord/lib/active_record/locking/optimistic.rb +148 -0
  115. data/vendor/activerecord/lib/active_record/locking/pessimistic.rb +77 -0
  116. data/vendor/activerecord/lib/active_record/migration.rb +523 -0
  117. data/vendor/activerecord/lib/active_record/named_scope.rb +168 -0
  118. data/vendor/activerecord/lib/active_record/observer.rb +197 -0
  119. data/vendor/activerecord/lib/active_record/query_cache.rb +21 -0
  120. data/vendor/activerecord/lib/active_record/reflection.rb +239 -0
  121. data/vendor/activerecord/lib/active_record/schema.rb +51 -0
  122. data/vendor/activerecord/lib/active_record/schema_dumper.rb +171 -0
  123. data/vendor/activerecord/lib/active_record/serialization.rb +98 -0
  124. data/vendor/activerecord/lib/active_record/serializers/json_serializer.rb +80 -0
  125. data/vendor/activerecord/lib/active_record/serializers/xml_serializer.rb +338 -0
  126. data/vendor/activerecord/lib/active_record/test_case.rb +47 -0
  127. data/vendor/activerecord/lib/active_record/timestamp.rb +41 -0
  128. data/vendor/activerecord/lib/active_record/transactions.rb +130 -0
  129. data/vendor/activerecord/lib/active_record/validations.rb +971 -0
  130. data/vendor/activerecord/lib/active_record/vendor/mysql.rb +1214 -0
  131. data/vendor/activerecord/lib/active_record/version.rb +9 -0
  132. data/vendor/activerecord/lib/active_record.rb +80 -0
  133. data/vendor/activerecord/lib/activerecord.rb +1 -0
  134. data/vendor/activerecord/test/assets/example.log +1 -0
  135. data/vendor/activerecord/test/assets/flowers.jpg +0 -0
  136. data/vendor/activerecord/test/cases/aaa_create_tables_test.rb +24 -0
  137. data/vendor/activerecord/test/cases/active_schema_test_mysql.rb +95 -0
  138. data/vendor/activerecord/test/cases/active_schema_test_postgresql.rb +24 -0
  139. data/vendor/activerecord/test/cases/adapter_test.rb +127 -0
  140. data/vendor/activerecord/test/cases/adapter_test_sqlserver.rb +95 -0
  141. data/vendor/activerecord/test/cases/aggregations_test.rb +128 -0
  142. data/vendor/activerecord/test/cases/ar_schema_test.rb +33 -0
  143. data/vendor/activerecord/test/cases/associations/belongs_to_associations_test.rb +431 -0
  144. data/vendor/activerecord/test/cases/associations/callbacks_test.rb +161 -0
  145. data/vendor/activerecord/test/cases/associations/cascaded_eager_loading_test.rb +123 -0
  146. data/vendor/activerecord/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  147. data/vendor/activerecord/test/cases/associations/eager_load_nested_include_test.rb +83 -0
  148. data/vendor/activerecord/test/cases/associations/eager_singularization_test.rb +145 -0
  149. data/vendor/activerecord/test/cases/associations/eager_test.rb +636 -0
  150. data/vendor/activerecord/test/cases/associations/extension_test.rb +47 -0
  151. data/vendor/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb +706 -0
  152. data/vendor/activerecord/test/cases/associations/has_many_associations_test.rb +1034 -0
  153. data/vendor/activerecord/test/cases/associations/has_many_through_associations_test.rb +200 -0
  154. data/vendor/activerecord/test/cases/associations/has_one_associations_test.rb +345 -0
  155. data/vendor/activerecord/test/cases/associations/has_one_through_associations_test.rb +113 -0
  156. data/vendor/activerecord/test/cases/associations/inner_join_association_test.rb +88 -0
  157. data/vendor/activerecord/test/cases/associations/join_model_test.rb +714 -0
  158. data/vendor/activerecord/test/cases/associations_test.rb +262 -0
  159. data/vendor/activerecord/test/cases/attribute_methods_test.rb +238 -0
  160. data/vendor/activerecord/test/cases/base_test.rb +1997 -0
  161. data/vendor/activerecord/test/cases/binary_test.rb +34 -0
  162. data/vendor/activerecord/test/cases/calculations_test.rb +323 -0
  163. data/vendor/activerecord/test/cases/callbacks_test.rb +400 -0
  164. data/vendor/activerecord/test/cases/class_inheritable_attributes_test.rb +32 -0
  165. data/vendor/activerecord/test/cases/column_alias_test.rb +17 -0
  166. data/vendor/activerecord/test/cases/column_definition_test.rb +36 -0
  167. data/vendor/activerecord/test/cases/connection_test_firebird.rb +8 -0
  168. data/vendor/activerecord/test/cases/connection_test_mysql.rb +30 -0
  169. data/vendor/activerecord/test/cases/copy_table_test_sqlite.rb +69 -0
  170. data/vendor/activerecord/test/cases/database_statements_test.rb +12 -0
  171. data/vendor/activerecord/test/cases/datatype_test_postgresql.rb +203 -0
  172. data/vendor/activerecord/test/cases/date_time_test.rb +37 -0
  173. data/vendor/activerecord/test/cases/default_test_firebird.rb +16 -0
  174. data/vendor/activerecord/test/cases/defaults_test.rb +69 -0
  175. data/vendor/activerecord/test/cases/deprecated_finder_test.rb +30 -0
  176. data/vendor/activerecord/test/cases/dirty_test.rb +257 -0
  177. data/vendor/activerecord/test/cases/finder_respond_to_test.rb +76 -0
  178. data/vendor/activerecord/test/cases/finder_test.rb +890 -0
  179. data/vendor/activerecord/test/cases/fixtures_test.rb +626 -0
  180. data/vendor/activerecord/test/cases/helper.rb +47 -0
  181. data/vendor/activerecord/test/cases/inheritance_test.rb +262 -0
  182. data/vendor/activerecord/test/cases/invalid_date_test.rb +24 -0
  183. data/vendor/activerecord/test/cases/json_serialization_test.rb +205 -0
  184. data/vendor/activerecord/test/cases/lifecycle_test.rb +193 -0
  185. data/vendor/activerecord/test/cases/locking_test.rb +309 -0
  186. data/vendor/activerecord/test/cases/method_scoping_test.rb +462 -0
  187. data/vendor/activerecord/test/cases/migration_test.rb +1444 -0
  188. data/vendor/activerecord/test/cases/migration_test_firebird.rb +124 -0
  189. data/vendor/activerecord/test/cases/mixin_test.rb +96 -0
  190. data/vendor/activerecord/test/cases/modules_test.rb +39 -0
  191. data/vendor/activerecord/test/cases/multiple_db_test.rb +60 -0
  192. data/vendor/activerecord/test/cases/named_scope_test.rb +206 -0
  193. data/vendor/activerecord/test/cases/pk_test.rb +101 -0
  194. data/vendor/activerecord/test/cases/query_cache_test.rb +127 -0
  195. data/vendor/activerecord/test/cases/readonly_test.rb +107 -0
  196. data/vendor/activerecord/test/cases/reflection_test.rb +176 -0
  197. data/vendor/activerecord/test/cases/reserved_word_test_mysql.rb +176 -0
  198. data/vendor/activerecord/test/cases/schema_authorization_test_postgresql.rb +75 -0
  199. data/vendor/activerecord/test/cases/schema_dumper_test.rb +184 -0
  200. data/vendor/activerecord/test/cases/schema_test_postgresql.rb +102 -0
  201. data/vendor/activerecord/test/cases/serialization_test.rb +47 -0
  202. data/vendor/activerecord/test/cases/synonym_test_oracle.rb +17 -0
  203. data/vendor/activerecord/test/cases/table_name_test_sqlserver.rb +23 -0
  204. data/vendor/activerecord/test/cases/threaded_connections_test.rb +48 -0
  205. data/vendor/activerecord/test/cases/transactions_test.rb +307 -0
  206. data/vendor/activerecord/test/cases/unconnected_test.rb +32 -0
  207. data/vendor/activerecord/test/cases/validations_test.rb +1534 -0
  208. data/vendor/activerecord/test/cases/xml_serialization_test.rb +202 -0
  209. data/vendor/activerecord/test/config.rb +5 -0
  210. data/vendor/activerecord/test/connections/native_db2/connection.rb +25 -0
  211. data/vendor/activerecord/test/connections/native_firebird/connection.rb +26 -0
  212. data/vendor/activerecord/test/connections/native_frontbase/connection.rb +27 -0
  213. data/vendor/activerecord/test/connections/native_mysql/connection.rb +27 -0
  214. data/vendor/activerecord/test/connections/native_openbase/connection.rb +21 -0
  215. data/vendor/activerecord/test/connections/native_oracle/connection.rb +27 -0
  216. data/vendor/activerecord/test/connections/native_postgresql/connection.rb +21 -0
  217. data/vendor/activerecord/test/connections/native_sqlite/connection.rb +25 -0
  218. data/vendor/activerecord/test/connections/native_sqlite3/connection.rb +25 -0
  219. data/vendor/activerecord/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  220. data/vendor/activerecord/test/connections/native_sybase/connection.rb +23 -0
  221. data/vendor/activerecord/test/debug.log +358 -0
  222. data/vendor/activerecord/test/fixtures/accounts.yml +28 -0
  223. data/vendor/activerecord/test/fixtures/all/developers.yml +0 -0
  224. data/vendor/activerecord/test/fixtures/all/people.csv +0 -0
  225. data/vendor/activerecord/test/fixtures/all/tasks.yml +0 -0
  226. data/vendor/activerecord/test/fixtures/author_addresses.yml +5 -0
  227. data/vendor/activerecord/test/fixtures/author_favorites.yml +4 -0
  228. data/vendor/activerecord/test/fixtures/authors.yml +9 -0
  229. data/vendor/activerecord/test/fixtures/binaries.yml +132 -0
  230. data/vendor/activerecord/test/fixtures/books.yml +7 -0
  231. data/vendor/activerecord/test/fixtures/categories/special_categories.yml +9 -0
  232. data/vendor/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  233. data/vendor/activerecord/test/fixtures/categories.yml +14 -0
  234. data/vendor/activerecord/test/fixtures/categories_ordered.yml +7 -0
  235. data/vendor/activerecord/test/fixtures/categories_posts.yml +23 -0
  236. data/vendor/activerecord/test/fixtures/categorizations.yml +17 -0
  237. data/vendor/activerecord/test/fixtures/clubs.yml +6 -0
  238. data/vendor/activerecord/test/fixtures/comments.yml +59 -0
  239. data/vendor/activerecord/test/fixtures/companies.yml +55 -0
  240. data/vendor/activerecord/test/fixtures/computers.yml +4 -0
  241. data/vendor/activerecord/test/fixtures/courses.yml +7 -0
  242. data/vendor/activerecord/test/fixtures/customers.yml +17 -0
  243. data/vendor/activerecord/test/fixtures/developers.yml +21 -0
  244. data/vendor/activerecord/test/fixtures/developers_projects.yml +17 -0
  245. data/vendor/activerecord/test/fixtures/edges.yml +6 -0
  246. data/vendor/activerecord/test/fixtures/entrants.yml +14 -0
  247. data/vendor/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  248. data/vendor/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  249. data/vendor/activerecord/test/fixtures/fk_test_has_fk.yml +3 -0
  250. data/vendor/activerecord/test/fixtures/fk_test_has_pk.yml +2 -0
  251. data/vendor/activerecord/test/fixtures/funny_jokes.yml +10 -0
  252. data/vendor/activerecord/test/fixtures/items.yml +4 -0
  253. data/vendor/activerecord/test/fixtures/jobs.yml +7 -0
  254. data/vendor/activerecord/test/fixtures/legacy_things.yml +3 -0
  255. data/vendor/activerecord/test/fixtures/mateys.yml +4 -0
  256. data/vendor/activerecord/test/fixtures/members.yml +4 -0
  257. data/vendor/activerecord/test/fixtures/memberships.yml +20 -0
  258. data/vendor/activerecord/test/fixtures/minimalistics.yml +2 -0
  259. data/vendor/activerecord/test/fixtures/mixed_case_monkeys.yml +6 -0
  260. data/vendor/activerecord/test/fixtures/mixins.yml +29 -0
  261. data/vendor/activerecord/test/fixtures/movies.yml +7 -0
  262. data/vendor/activerecord/test/fixtures/naked/csv/accounts.csv +1 -0
  263. data/vendor/activerecord/test/fixtures/naked/yml/accounts.yml +1 -0
  264. data/vendor/activerecord/test/fixtures/naked/yml/companies.yml +1 -0
  265. data/vendor/activerecord/test/fixtures/naked/yml/courses.yml +1 -0
  266. data/vendor/activerecord/test/fixtures/owners.yml +7 -0
  267. data/vendor/activerecord/test/fixtures/parrots.yml +27 -0
  268. data/vendor/activerecord/test/fixtures/parrots_pirates.yml +7 -0
  269. data/vendor/activerecord/test/fixtures/people.yml +6 -0
  270. data/vendor/activerecord/test/fixtures/pets.yml +14 -0
  271. data/vendor/activerecord/test/fixtures/pirates.yml +9 -0
  272. data/vendor/activerecord/test/fixtures/posts.yml +49 -0
  273. data/vendor/activerecord/test/fixtures/price_estimates.yml +7 -0
  274. data/vendor/activerecord/test/fixtures/projects.yml +7 -0
  275. data/vendor/activerecord/test/fixtures/readers.yml +9 -0
  276. data/vendor/activerecord/test/fixtures/references.yml +17 -0
  277. data/vendor/activerecord/test/fixtures/reserved_words/distinct.yml +5 -0
  278. data/vendor/activerecord/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  279. data/vendor/activerecord/test/fixtures/reserved_words/group.yml +14 -0
  280. data/vendor/activerecord/test/fixtures/reserved_words/select.yml +8 -0
  281. data/vendor/activerecord/test/fixtures/reserved_words/values.yml +7 -0
  282. data/vendor/activerecord/test/fixtures/ships.yml +5 -0
  283. data/vendor/activerecord/test/fixtures/sponsors.yml +9 -0
  284. data/vendor/activerecord/test/fixtures/subscribers.yml +7 -0
  285. data/vendor/activerecord/test/fixtures/subscriptions.yml +12 -0
  286. data/vendor/activerecord/test/fixtures/taggings.yml +28 -0
  287. data/vendor/activerecord/test/fixtures/tags.yml +7 -0
  288. data/vendor/activerecord/test/fixtures/tasks.yml +7 -0
  289. data/vendor/activerecord/test/fixtures/topics.yml +42 -0
  290. data/vendor/activerecord/test/fixtures/treasures.yml +10 -0
  291. data/vendor/activerecord/test/fixtures/vertices.yml +4 -0
  292. data/vendor/activerecord/test/fixtures/warehouse-things.yml +3 -0
  293. data/vendor/activerecord/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  294. data/vendor/activerecord/test/migrations/duplicate/1_people_have_last_names.rb +9 -0
  295. data/vendor/activerecord/test/migrations/duplicate/2_we_need_reminders.rb +12 -0
  296. data/vendor/activerecord/test/migrations/duplicate/3_foo.rb +7 -0
  297. data/vendor/activerecord/test/migrations/duplicate/3_innocent_jointable.rb +12 -0
  298. data/vendor/activerecord/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  299. data/vendor/activerecord/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  300. data/vendor/activerecord/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +12 -0
  301. data/vendor/activerecord/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +9 -0
  302. data/vendor/activerecord/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +12 -0
  303. data/vendor/activerecord/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +9 -0
  304. data/vendor/activerecord/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  305. data/vendor/activerecord/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  306. data/vendor/activerecord/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  307. data/vendor/activerecord/test/migrations/missing/1_people_have_last_names.rb +9 -0
  308. data/vendor/activerecord/test/migrations/missing/3_we_need_reminders.rb +12 -0
  309. data/vendor/activerecord/test/migrations/missing/4_innocent_jointable.rb +12 -0
  310. data/vendor/activerecord/test/migrations/valid/1_people_have_last_names.rb +9 -0
  311. data/vendor/activerecord/test/migrations/valid/2_we_need_reminders.rb +12 -0
  312. data/vendor/activerecord/test/migrations/valid/3_innocent_jointable.rb +12 -0
  313. data/vendor/activerecord/test/models/author.rb +137 -0
  314. data/vendor/activerecord/test/models/auto_id.rb +4 -0
  315. data/vendor/activerecord/test/models/binary.rb +2 -0
  316. data/vendor/activerecord/test/models/book.rb +4 -0
  317. data/vendor/activerecord/test/models/categorization.rb +5 -0
  318. data/vendor/activerecord/test/models/category.rb +30 -0
  319. data/vendor/activerecord/test/models/citation.rb +6 -0
  320. data/vendor/activerecord/test/models/club.rb +7 -0
  321. data/vendor/activerecord/test/models/column_name.rb +3 -0
  322. data/vendor/activerecord/test/models/comment.rb +25 -0
  323. data/vendor/activerecord/test/models/company.rb +132 -0
  324. data/vendor/activerecord/test/models/company_in_module.rb +61 -0
  325. data/vendor/activerecord/test/models/computer.rb +3 -0
  326. data/vendor/activerecord/test/models/contact.rb +16 -0
  327. data/vendor/activerecord/test/models/course.rb +3 -0
  328. data/vendor/activerecord/test/models/customer.rb +55 -0
  329. data/vendor/activerecord/test/models/default.rb +2 -0
  330. data/vendor/activerecord/test/models/developer.rb +79 -0
  331. data/vendor/activerecord/test/models/edge.rb +5 -0
  332. data/vendor/activerecord/test/models/entrant.rb +3 -0
  333. data/vendor/activerecord/test/models/guid.rb +2 -0
  334. data/vendor/activerecord/test/models/item.rb +7 -0
  335. data/vendor/activerecord/test/models/job.rb +5 -0
  336. data/vendor/activerecord/test/models/joke.rb +3 -0
  337. data/vendor/activerecord/test/models/keyboard.rb +3 -0
  338. data/vendor/activerecord/test/models/legacy_thing.rb +3 -0
  339. data/vendor/activerecord/test/models/matey.rb +4 -0
  340. data/vendor/activerecord/test/models/member.rb +9 -0
  341. data/vendor/activerecord/test/models/membership.rb +9 -0
  342. data/vendor/activerecord/test/models/minimalistic.rb +2 -0
  343. data/vendor/activerecord/test/models/mixed_case_monkey.rb +3 -0
  344. data/vendor/activerecord/test/models/movie.rb +5 -0
  345. data/vendor/activerecord/test/models/order.rb +4 -0
  346. data/vendor/activerecord/test/models/owner.rb +4 -0
  347. data/vendor/activerecord/test/models/parrot.rb +13 -0
  348. data/vendor/activerecord/test/models/person.rb +10 -0
  349. data/vendor/activerecord/test/models/pet.rb +4 -0
  350. data/vendor/activerecord/test/models/pirate.rb +9 -0
  351. data/vendor/activerecord/test/models/post.rb +85 -0
  352. data/vendor/activerecord/test/models/price_estimate.rb +3 -0
  353. data/vendor/activerecord/test/models/project.rb +29 -0
  354. data/vendor/activerecord/test/models/reader.rb +4 -0
  355. data/vendor/activerecord/test/models/reference.rb +4 -0
  356. data/vendor/activerecord/test/models/reply.rb +39 -0
  357. data/vendor/activerecord/test/models/ship.rb +3 -0
  358. data/vendor/activerecord/test/models/sponsor.rb +4 -0
  359. data/vendor/activerecord/test/models/subject.rb +4 -0
  360. data/vendor/activerecord/test/models/subscriber.rb +8 -0
  361. data/vendor/activerecord/test/models/subscription.rb +4 -0
  362. data/vendor/activerecord/test/models/tag.rb +7 -0
  363. data/vendor/activerecord/test/models/tagging.rb +10 -0
  364. data/vendor/activerecord/test/models/task.rb +3 -0
  365. data/vendor/activerecord/test/models/topic.rb +66 -0
  366. data/vendor/activerecord/test/models/treasure.rb +6 -0
  367. data/vendor/activerecord/test/models/vertex.rb +9 -0
  368. data/vendor/activerecord/test/models/warehouse_thing.rb +5 -0
  369. data/vendor/activerecord/test/schema/mysql_specific_schema.rb +12 -0
  370. data/vendor/activerecord/test/schema/postgresql_specific_schema.rb +103 -0
  371. data/vendor/activerecord/test/schema/schema.rb +429 -0
  372. data/vendor/activerecord/test/schema/schema2.rb +6 -0
  373. data/vendor/activerecord/test/schema/sqlite_specific_schema.rb +25 -0
  374. data/vendor/activerecord/test/schema/sqlserver_specific_schema.rb +5 -0
  375. data/vendor/activesupport/CHANGELOG +1193 -0
  376. data/vendor/activesupport/README +43 -0
  377. data/vendor/activesupport/lib/active_support/base64.rb +22 -0
  378. data/vendor/activesupport/lib/active_support/basic_object.rb +24 -0
  379. data/vendor/activesupport/lib/active_support/buffered_logger.rb +121 -0
  380. data/vendor/activesupport/lib/active_support/cache/compressed_mem_cache_store.rb +15 -0
  381. data/vendor/activesupport/lib/active_support/cache/drb_store.rb +15 -0
  382. data/vendor/activesupport/lib/active_support/cache/file_store.rb +70 -0
  383. data/vendor/activesupport/lib/active_support/cache/mem_cache_store.rb +100 -0
  384. data/vendor/activesupport/lib/active_support/cache/memory_store.rb +38 -0
  385. data/vendor/activesupport/lib/active_support/cache.rb +147 -0
  386. data/vendor/activesupport/lib/active_support/callbacks.rb +275 -0
  387. data/vendor/activesupport/lib/active_support/clean_logger.rb +127 -0
  388. data/vendor/activesupport/lib/active_support/core_ext/array/access.rb +26 -0
  389. data/vendor/activesupport/lib/active_support/core_ext/array/conversions.rb +178 -0
  390. data/vendor/activesupport/lib/active_support/core_ext/array/extract_options.rb +20 -0
  391. data/vendor/activesupport/lib/active_support/core_ext/array/grouping.rb +63 -0
  392. data/vendor/activesupport/lib/active_support/core_ext/array/random_access.rb +12 -0
  393. data/vendor/activesupport/lib/active_support/core_ext/array.rb +13 -0
  394. data/vendor/activesupport/lib/active_support/core_ext/base64/encoding.rb +13 -0
  395. data/vendor/activesupport/lib/active_support/core_ext/base64.rb +4 -0
  396. data/vendor/activesupport/lib/active_support/core_ext/benchmark.rb +12 -0
  397. data/vendor/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb +41 -0
  398. data/vendor/activesupport/lib/active_support/core_ext/bigdecimal.rb +6 -0
  399. data/vendor/activesupport/lib/active_support/core_ext/blank.rb +53 -0
  400. data/vendor/activesupport/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +14 -0
  401. data/vendor/activesupport/lib/active_support/core_ext/cgi.rb +5 -0
  402. data/vendor/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +54 -0
  403. data/vendor/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb +46 -0
  404. data/vendor/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  405. data/vendor/activesupport/lib/active_support/core_ext/class/removal.rb +50 -0
  406. data/vendor/activesupport/lib/active_support/core_ext/class.rb +4 -0
  407. data/vendor/activesupport/lib/active_support/core_ext/date/behavior.rb +39 -0
  408. data/vendor/activesupport/lib/active_support/core_ext/date/calculations.rb +215 -0
  409. data/vendor/activesupport/lib/active_support/core_ext/date/conversions.rb +107 -0
  410. data/vendor/activesupport/lib/active_support/core_ext/date.rb +10 -0
  411. data/vendor/activesupport/lib/active_support/core_ext/date_time/calculations.rb +112 -0
  412. data/vendor/activesupport/lib/active_support/core_ext/date_time/conversions.rb +96 -0
  413. data/vendor/activesupport/lib/active_support/core_ext/date_time.rb +12 -0
  414. data/vendor/activesupport/lib/active_support/core_ext/duplicable.rb +37 -0
  415. data/vendor/activesupport/lib/active_support/core_ext/enumerable.rb +69 -0
  416. data/vendor/activesupport/lib/active_support/core_ext/exception.rb +41 -0
  417. data/vendor/activesupport/lib/active_support/core_ext/file.rb +21 -0
  418. data/vendor/activesupport/lib/active_support/core_ext/float/rounding.rb +24 -0
  419. data/vendor/activesupport/lib/active_support/core_ext/float.rb +5 -0
  420. data/vendor/activesupport/lib/active_support/core_ext/hash/conversions.rb +259 -0
  421. data/vendor/activesupport/lib/active_support/core_ext/hash/diff.rb +19 -0
  422. data/vendor/activesupport/lib/active_support/core_ext/hash/except.rb +25 -0
  423. data/vendor/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +137 -0
  424. data/vendor/activesupport/lib/active_support/core_ext/hash/keys.rb +52 -0
  425. data/vendor/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb +28 -0
  426. data/vendor/activesupport/lib/active_support/core_ext/hash/slice.rb +30 -0
  427. data/vendor/activesupport/lib/active_support/core_ext/hash.rb +13 -0
  428. data/vendor/activesupport/lib/active_support/core_ext/integer/even_odd.rb +29 -0
  429. data/vendor/activesupport/lib/active_support/core_ext/integer/inflections.rb +20 -0
  430. data/vendor/activesupport/lib/active_support/core_ext/integer.rb +7 -0
  431. data/vendor/activesupport/lib/active_support/core_ext/kernel/agnostics.rb +11 -0
  432. data/vendor/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb +7 -0
  433. data/vendor/activesupport/lib/active_support/core_ext/kernel/debugger.rb +13 -0
  434. data/vendor/activesupport/lib/active_support/core_ext/kernel/reporting.rb +59 -0
  435. data/vendor/activesupport/lib/active_support/core_ext/kernel/requires.rb +24 -0
  436. data/vendor/activesupport/lib/active_support/core_ext/kernel.rb +5 -0
  437. data/vendor/activesupport/lib/active_support/core_ext/load_error.rb +38 -0
  438. data/vendor/activesupport/lib/active_support/core_ext/logger.rb +16 -0
  439. data/vendor/activesupport/lib/active_support/core_ext/module/aliasing.rb +70 -0
  440. data/vendor/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  441. data/vendor/activesupport/lib/active_support/core_ext/module/attr_internal.rb +32 -0
  442. data/vendor/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +58 -0
  443. data/vendor/activesupport/lib/active_support/core_ext/module/delegation.rb +64 -0
  444. data/vendor/activesupport/lib/active_support/core_ext/module/inclusion.rb +30 -0
  445. data/vendor/activesupport/lib/active_support/core_ext/module/introspection.rb +75 -0
  446. data/vendor/activesupport/lib/active_support/core_ext/module/loading.rb +23 -0
  447. data/vendor/activesupport/lib/active_support/core_ext/module/model_naming.rb +22 -0
  448. data/vendor/activesupport/lib/active_support/core_ext/module.rb +13 -0
  449. data/vendor/activesupport/lib/active_support/core_ext/name_error.rb +17 -0
  450. data/vendor/activesupport/lib/active_support/core_ext/numeric/bytes.rb +44 -0
  451. data/vendor/activesupport/lib/active_support/core_ext/numeric/conversions.rb +19 -0
  452. data/vendor/activesupport/lib/active_support/core_ext/numeric/time.rb +91 -0
  453. data/vendor/activesupport/lib/active_support/core_ext/numeric.rb +9 -0
  454. data/vendor/activesupport/lib/active_support/core_ext/object/conversions.rb +14 -0
  455. data/vendor/activesupport/lib/active_support/core_ext/object/extending.rb +59 -0
  456. data/vendor/activesupport/lib/active_support/core_ext/object/instance_variables.rb +74 -0
  457. data/vendor/activesupport/lib/active_support/core_ext/object/misc.rb +59 -0
  458. data/vendor/activesupport/lib/active_support/core_ext/object.rb +4 -0
  459. data/vendor/activesupport/lib/active_support/core_ext/pathname/clean_within.rb +14 -0
  460. data/vendor/activesupport/lib/active_support/core_ext/pathname.rb +7 -0
  461. data/vendor/activesupport/lib/active_support/core_ext/proc.rb +12 -0
  462. data/vendor/activesupport/lib/active_support/core_ext/process/daemon.rb +25 -0
  463. data/vendor/activesupport/lib/active_support/core_ext/process.rb +1 -0
  464. data/vendor/activesupport/lib/active_support/core_ext/range/blockless_step.rb +32 -0
  465. data/vendor/activesupport/lib/active_support/core_ext/range/conversions.rb +27 -0
  466. data/vendor/activesupport/lib/active_support/core_ext/range/include_range.rb +30 -0
  467. data/vendor/activesupport/lib/active_support/core_ext/range/overlaps.rb +15 -0
  468. data/vendor/activesupport/lib/active_support/core_ext/range.rb +11 -0
  469. data/vendor/activesupport/lib/active_support/core_ext/rexml.rb +35 -0
  470. data/vendor/activesupport/lib/active_support/core_ext/string/access.rb +82 -0
  471. data/vendor/activesupport/lib/active_support/core_ext/string/conversions.rb +28 -0
  472. data/vendor/activesupport/lib/active_support/core_ext/string/filters.rb +26 -0
  473. data/vendor/activesupport/lib/active_support/core_ext/string/inflections.rb +148 -0
  474. data/vendor/activesupport/lib/active_support/core_ext/string/iterators.rb +21 -0
  475. data/vendor/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb +35 -0
  476. data/vendor/activesupport/lib/active_support/core_ext/string/unicode.rb +66 -0
  477. data/vendor/activesupport/lib/active_support/core_ext/string/xchar.rb +11 -0
  478. data/vendor/activesupport/lib/active_support/core_ext/string.rb +18 -0
  479. data/vendor/activesupport/lib/active_support/core_ext/symbol.rb +14 -0
  480. data/vendor/activesupport/lib/active_support/core_ext/test/unit/assertions.rb +64 -0
  481. data/vendor/activesupport/lib/active_support/core_ext/test.rb +1 -0
  482. data/vendor/activesupport/lib/active_support/core_ext/time/behavior.rb +13 -0
  483. data/vendor/activesupport/lib/active_support/core_ext/time/calculations.rb +276 -0
  484. data/vendor/activesupport/lib/active_support/core_ext/time/conversions.rb +89 -0
  485. data/vendor/activesupport/lib/active_support/core_ext/time/zones.rb +86 -0
  486. data/vendor/activesupport/lib/active_support/core_ext/time.rb +42 -0
  487. data/vendor/activesupport/lib/active_support/core_ext.rb +4 -0
  488. data/vendor/activesupport/lib/active_support/dependencies.rb +553 -0
  489. data/vendor/activesupport/lib/active_support/deprecation.rb +223 -0
  490. data/vendor/activesupport/lib/active_support/duration.rb +96 -0
  491. data/vendor/activesupport/lib/active_support/gzip.rb +25 -0
  492. data/vendor/activesupport/lib/active_support/inflections.rb +55 -0
  493. data/vendor/activesupport/lib/active_support/inflector.rb +313 -0
  494. data/vendor/activesupport/lib/active_support/json/decoding.rb +63 -0
  495. data/vendor/activesupport/lib/active_support/json/encoders/date.rb +14 -0
  496. data/vendor/activesupport/lib/active_support/json/encoders/date_time.rb +14 -0
  497. data/vendor/activesupport/lib/active_support/json/encoders/enumerable.rb +12 -0
  498. data/vendor/activesupport/lib/active_support/json/encoders/false_class.rb +5 -0
  499. data/vendor/activesupport/lib/active_support/json/encoders/hash.rb +47 -0
  500. data/vendor/activesupport/lib/active_support/json/encoders/nil_class.rb +5 -0
  501. data/vendor/activesupport/lib/active_support/json/encoders/numeric.rb +5 -0
  502. data/vendor/activesupport/lib/active_support/json/encoders/object.rb +6 -0
  503. data/vendor/activesupport/lib/active_support/json/encoders/regexp.rb +5 -0
  504. data/vendor/activesupport/lib/active_support/json/encoders/string.rb +36 -0
  505. data/vendor/activesupport/lib/active_support/json/encoders/symbol.rb +5 -0
  506. data/vendor/activesupport/lib/active_support/json/encoders/time.rb +14 -0
  507. data/vendor/activesupport/lib/active_support/json/encoders/true_class.rb +5 -0
  508. data/vendor/activesupport/lib/active_support/json/encoding.rb +37 -0
  509. data/vendor/activesupport/lib/active_support/json/variable.rb +10 -0
  510. data/vendor/activesupport/lib/active_support/json.rb +23 -0
  511. data/vendor/activesupport/lib/active_support/multibyte/chars.rb +137 -0
  512. data/vendor/activesupport/lib/active_support/multibyte/generators/generate_tables.rb +149 -0
  513. data/vendor/activesupport/lib/active_support/multibyte/handlers/passthru_handler.rb +9 -0
  514. data/vendor/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb +564 -0
  515. data/vendor/activesupport/lib/active_support/multibyte/handlers/utf8_handler_proc.rb +43 -0
  516. data/vendor/activesupport/lib/active_support/multibyte.rb +9 -0
  517. data/vendor/activesupport/lib/active_support/option_merger.rb +25 -0
  518. data/vendor/activesupport/lib/active_support/ordered_hash.rb +43 -0
  519. data/vendor/activesupport/lib/active_support/ordered_options.rb +19 -0
  520. data/vendor/activesupport/lib/active_support/string_inquirer.rb +11 -0
  521. data/vendor/activesupport/lib/active_support/test_case.rb +13 -0
  522. data/vendor/activesupport/lib/active_support/testing/default.rb +9 -0
  523. data/vendor/activesupport/lib/active_support/testing/setup_and_teardown.rb +93 -0
  524. data/vendor/activesupport/lib/active_support/time_with_zone.rb +304 -0
  525. data/vendor/activesupport/lib/active_support/values/time_zone.rb +396 -0
  526. data/vendor/activesupport/lib/active_support/values/unicode_tables.dat +0 -0
  527. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb +113 -0
  528. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +20 -0
  529. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb +250 -0
  530. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +115 -0
  531. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +139 -0
  532. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +63 -0
  533. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +328 -0
  534. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb +13 -0
  535. data/vendor/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb +849 -0
  536. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/data_timezone.rb +47 -0
  537. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/data_timezone_info.rb +228 -0
  538. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Algiers.rb +55 -0
  539. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Cairo.rb +219 -0
  540. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Casablanca.rb +40 -0
  541. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Harare.rb +18 -0
  542. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
  543. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Monrovia.rb +22 -0
  544. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Nairobi.rb +23 -0
  545. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +166 -0
  546. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Argentina/San_Juan.rb +170 -0
  547. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Bogota.rb +23 -0
  548. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Caracas.rb +23 -0
  549. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Chicago.rb +283 -0
  550. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Chihuahua.rb +136 -0
  551. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Denver.rb +204 -0
  552. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Godthab.rb +161 -0
  553. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Guatemala.rb +27 -0
  554. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Halifax.rb +274 -0
  555. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
  556. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Juneau.rb +194 -0
  557. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/La_Paz.rb +22 -0
  558. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Lima.rb +35 -0
  559. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Los_Angeles.rb +232 -0
  560. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Mazatlan.rb +139 -0
  561. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Mexico_City.rb +144 -0
  562. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Monterrey.rb +131 -0
  563. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/New_York.rb +282 -0
  564. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Phoenix.rb +30 -0
  565. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Regina.rb +74 -0
  566. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Santiago.rb +205 -0
  567. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/St_Johns.rb +288 -0
  568. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Tijuana.rb +196 -0
  569. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Almaty.rb +67 -0
  570. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Baghdad.rb +73 -0
  571. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Baku.rb +161 -0
  572. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Bangkok.rb +20 -0
  573. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Chongqing.rb +33 -0
  574. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Dhaka.rb +27 -0
  575. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
  576. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
  577. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Jakarta.rb +30 -0
  578. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
  579. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kabul.rb +20 -0
  580. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
  581. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Karachi.rb +30 -0
  582. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Katmandu.rb +20 -0
  583. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kolkata.rb +25 -0
  584. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
  585. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
  586. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kuwait.rb +18 -0
  587. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Magadan.rb +163 -0
  588. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Muscat.rb +18 -0
  589. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
  590. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Rangoon.rb +24 -0
  591. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Riyadh.rb +18 -0
  592. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Seoul.rb +34 -0
  593. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Shanghai.rb +35 -0
  594. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Singapore.rb +33 -0
  595. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Taipei.rb +59 -0
  596. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tashkent.rb +47 -0
  597. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
  598. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tehran.rb +121 -0
  599. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tokyo.rb +30 -0
  600. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
  601. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Urumqi.rb +33 -0
  602. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
  603. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
  604. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
  605. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Yerevan.rb +165 -0
  606. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Atlantic/Azores.rb +270 -0
  607. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
  608. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
  609. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Adelaide.rb +187 -0
  610. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Brisbane.rb +35 -0
  611. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Darwin.rb +29 -0
  612. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Hobart.rb +193 -0
  613. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Melbourne.rb +185 -0
  614. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Perth.rb +37 -0
  615. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Sydney.rb +185 -0
  616. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Etc/UTC.rb +16 -0
  617. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
  618. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Athens.rb +185 -0
  619. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Belgrade.rb +163 -0
  620. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Berlin.rb +188 -0
  621. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Bratislava.rb +13 -0
  622. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Brussels.rb +232 -0
  623. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Bucharest.rb +181 -0
  624. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Budapest.rb +197 -0
  625. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
  626. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Dublin.rb +276 -0
  627. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Helsinki.rb +163 -0
  628. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Istanbul.rb +218 -0
  629. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Kiev.rb +168 -0
  630. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Lisbon.rb +268 -0
  631. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
  632. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/London.rb +288 -0
  633. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Madrid.rb +211 -0
  634. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Minsk.rb +170 -0
  635. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Moscow.rb +181 -0
  636. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Paris.rb +232 -0
  637. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Prague.rb +187 -0
  638. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Riga.rb +176 -0
  639. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Rome.rb +215 -0
  640. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
  641. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Skopje.rb +13 -0
  642. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Sofia.rb +173 -0
  643. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Stockholm.rb +165 -0
  644. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Tallinn.rb +172 -0
  645. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Vienna.rb +183 -0
  646. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Vilnius.rb +170 -0
  647. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Warsaw.rb +212 -0
  648. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Zagreb.rb +13 -0
  649. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Auckland.rb +202 -0
  650. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Fiji.rb +23 -0
  651. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Guam.rb +22 -0
  652. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
  653. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Majuro.rb +20 -0
  654. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Midway.rb +25 -0
  655. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Noumea.rb +25 -0
  656. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
  657. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
  658. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
  659. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/info_timezone.rb +52 -0
  660. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/linked_timezone.rb +51 -0
  661. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/linked_timezone_info.rb +44 -0
  662. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/offset_rationals.rb +95 -0
  663. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/time_or_datetime.rb +292 -0
  664. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone.rb +508 -0
  665. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_definition.rb +56 -0
  666. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_info.rb +40 -0
  667. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_offset_info.rb +94 -0
  668. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_period.rb +198 -0
  669. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_transition_info.rb +138 -0
  670. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo.rb +33 -0
  671. data/vendor/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb +1021 -0
  672. data/vendor/activesupport/lib/active_support/vendor.rb +26 -0
  673. data/vendor/activesupport/lib/active_support/version.rb +9 -0
  674. data/vendor/activesupport/lib/active_support/whiny_nil.rb +58 -0
  675. data/vendor/activesupport/lib/active_support.rb +61 -0
  676. data/vendor/activesupport/lib/activesupport.rb +1 -0
  677. data/vendor/isaac/LICENSE +26 -0
  678. data/vendor/isaac/README +78 -0
  679. data/vendor/isaac/TODO +3 -0
  680. data/vendor/isaac/VERSIONS +3 -0
  681. data/vendor/isaac/crypt/ISAAC.rb +171 -0
  682. data/vendor/isaac/isaac.gemspec +39 -0
  683. data/vendor/isaac/setup.rb +596 -0
  684. data/vendor/isaac/test/TC_ISAAC.rb +76 -0
  685. data/vendor/json/CHANGES +93 -0
  686. data/vendor/json/GPL +340 -0
  687. data/vendor/json/README +78 -0
  688. data/vendor/json/RUBY +58 -0
  689. data/vendor/json/Rakefile +309 -0
  690. data/vendor/json/TODO +1 -0
  691. data/vendor/json/VERSION +1 -0
  692. data/vendor/json/benchmarks/benchmark.txt +133 -0
  693. data/vendor/json/benchmarks/benchmark_generator.rb +48 -0
  694. data/vendor/json/benchmarks/benchmark_parser.rb +26 -0
  695. data/vendor/json/benchmarks/benchmark_rails.rb +26 -0
  696. data/vendor/json/bin/edit_json.rb +10 -0
  697. data/vendor/json/bin/prettify_json.rb +76 -0
  698. data/vendor/json/data/example.json +1 -0
  699. data/vendor/json/data/index.html +38 -0
  700. data/vendor/json/data/prototype.js +4184 -0
  701. data/vendor/json/ext/json/ext/generator/extconf.rb +9 -0
  702. data/vendor/json/ext/json/ext/generator/generator.c +875 -0
  703. data/vendor/json/ext/json/ext/generator/unicode.c +182 -0
  704. data/vendor/json/ext/json/ext/generator/unicode.h +53 -0
  705. data/vendor/json/ext/json/ext/parser/extconf.rb +9 -0
  706. data/vendor/json/ext/json/ext/parser/parser.c +1758 -0
  707. data/vendor/json/ext/json/ext/parser/parser.rl +638 -0
  708. data/vendor/json/ext/json/ext/parser/unicode.c +154 -0
  709. data/vendor/json/ext/json/ext/parser/unicode.h +58 -0
  710. data/vendor/json/install.rb +26 -0
  711. data/vendor/json/lib/json/Array.xpm +21 -0
  712. data/vendor/json/lib/json/FalseClass.xpm +21 -0
  713. data/vendor/json/lib/json/Hash.xpm +21 -0
  714. data/vendor/json/lib/json/Key.xpm +73 -0
  715. data/vendor/json/lib/json/NilClass.xpm +21 -0
  716. data/vendor/json/lib/json/Numeric.xpm +28 -0
  717. data/vendor/json/lib/json/String.xpm +96 -0
  718. data/vendor/json/lib/json/TrueClass.xpm +21 -0
  719. data/vendor/json/lib/json/add/core.rb +135 -0
  720. data/vendor/json/lib/json/add/rails.rb +58 -0
  721. data/vendor/json/lib/json/common.rb +354 -0
  722. data/vendor/json/lib/json/editor.rb +1362 -0
  723. data/vendor/json/lib/json/ext.rb +13 -0
  724. data/vendor/json/lib/json/json.xpm +1499 -0
  725. data/vendor/json/lib/json/pure/generator.rb +394 -0
  726. data/vendor/json/lib/json/pure/parser.rb +259 -0
  727. data/vendor/json/lib/json/pure.rb +75 -0
  728. data/vendor/json/lib/json/version.rb +9 -0
  729. data/vendor/json/lib/json.rb +235 -0
  730. data/vendor/json/tests/fixtures/fail1.json +1 -0
  731. data/vendor/json/tests/fixtures/fail10.json +1 -0
  732. data/vendor/json/tests/fixtures/fail11.json +1 -0
  733. data/vendor/json/tests/fixtures/fail12.json +1 -0
  734. data/vendor/json/tests/fixtures/fail13.json +1 -0
  735. data/vendor/json/tests/fixtures/fail14.json +1 -0
  736. data/vendor/json/tests/fixtures/fail18.json +1 -0
  737. data/vendor/json/tests/fixtures/fail19.json +1 -0
  738. data/vendor/json/tests/fixtures/fail2.json +1 -0
  739. data/vendor/json/tests/fixtures/fail20.json +1 -0
  740. data/vendor/json/tests/fixtures/fail21.json +1 -0
  741. data/vendor/json/tests/fixtures/fail22.json +1 -0
  742. data/vendor/json/tests/fixtures/fail23.json +1 -0
  743. data/vendor/json/tests/fixtures/fail24.json +1 -0
  744. data/vendor/json/tests/fixtures/fail25.json +1 -0
  745. data/vendor/json/tests/fixtures/fail27.json +2 -0
  746. data/vendor/json/tests/fixtures/fail28.json +2 -0
  747. data/vendor/json/tests/fixtures/fail3.json +1 -0
  748. data/vendor/json/tests/fixtures/fail4.json +1 -0
  749. data/vendor/json/tests/fixtures/fail5.json +1 -0
  750. data/vendor/json/tests/fixtures/fail6.json +1 -0
  751. data/vendor/json/tests/fixtures/fail7.json +1 -0
  752. data/vendor/json/tests/fixtures/fail8.json +1 -0
  753. data/vendor/json/tests/fixtures/fail9.json +1 -0
  754. data/vendor/json/tests/fixtures/pass1.json +56 -0
  755. data/vendor/json/tests/fixtures/pass15.json +1 -0
  756. data/vendor/json/tests/fixtures/pass16.json +1 -0
  757. data/vendor/json/tests/fixtures/pass17.json +1 -0
  758. data/vendor/json/tests/fixtures/pass2.json +1 -0
  759. data/vendor/json/tests/fixtures/pass26.json +1 -0
  760. data/vendor/json/tests/fixtures/pass3.json +6 -0
  761. data/vendor/json/tests/runner.rb +25 -0
  762. data/vendor/json/tests/test_json.rb +293 -0
  763. data/vendor/json/tests/test_json_addition.rb +161 -0
  764. data/vendor/json/tests/test_json_fixtures.rb +30 -0
  765. data/vendor/json/tests/test_json_generate.rb +100 -0
  766. data/vendor/json/tests/test_json_rails.rb +118 -0
  767. data/vendor/json/tests/test_json_unicode.rb +61 -0
  768. data/vendor/json/tools/fuzz.rb +140 -0
  769. data/vendor/json/tools/server.rb +62 -0
  770. data/vendor/rack/AUTHORS +8 -0
  771. data/vendor/rack/COPYING +18 -0
  772. data/vendor/rack/KNOWN-ISSUES +18 -0
  773. data/vendor/rack/RDOX +265 -0
  774. data/vendor/rack/README +287 -0
  775. data/vendor/rack/Rakefile +179 -0
  776. data/vendor/rack/SPEC +126 -0
  777. data/vendor/rack/bin/rackup +172 -0
  778. data/vendor/rack/contrib/rack_logo.svg +111 -0
  779. data/vendor/rack/example/lobster.ru +4 -0
  780. data/vendor/rack/example/protectedlobster.rb +14 -0
  781. data/vendor/rack/example/protectedlobster.ru +8 -0
  782. data/vendor/rack/lib/rack/adapter/camping.rb +22 -0
  783. data/vendor/rack/lib/rack/auth/abstract/handler.rb +28 -0
  784. data/vendor/rack/lib/rack/auth/abstract/request.rb +37 -0
  785. data/vendor/rack/lib/rack/auth/basic.rb +58 -0
  786. data/vendor/rack/lib/rack/auth/digest/md5.rb +124 -0
  787. data/vendor/rack/lib/rack/auth/digest/nonce.rb +51 -0
  788. data/vendor/rack/lib/rack/auth/digest/params.rb +55 -0
  789. data/vendor/rack/lib/rack/auth/digest/request.rb +40 -0
  790. data/vendor/rack/lib/rack/auth/openid.rb +437 -0
  791. data/vendor/rack/lib/rack/builder.rb +56 -0
  792. data/vendor/rack/lib/rack/cascade.rb +36 -0
  793. data/vendor/rack/lib/rack/commonlogger.rb +61 -0
  794. data/vendor/rack/lib/rack/deflater.rb +63 -0
  795. data/vendor/rack/lib/rack/directory.rb +158 -0
  796. data/vendor/rack/lib/rack/file.rb +116 -0
  797. data/vendor/rack/lib/rack/handler/cgi.rb +57 -0
  798. data/vendor/rack/lib/rack/handler/evented_mongrel.rb +8 -0
  799. data/vendor/rack/lib/rack/handler/fastcgi.rb +84 -0
  800. data/vendor/rack/lib/rack/handler/lsws.rb +52 -0
  801. data/vendor/rack/lib/rack/handler/mongrel.rb +78 -0
  802. data/vendor/rack/lib/rack/handler/scgi.rb +57 -0
  803. data/vendor/rack/lib/rack/handler/webrick.rb +57 -0
  804. data/vendor/rack/lib/rack/handler.rb +44 -0
  805. data/vendor/rack/lib/rack/lint.rb +401 -0
  806. data/vendor/rack/lib/rack/lobster.rb +65 -0
  807. data/vendor/rack/lib/rack/mock.rb +160 -0
  808. data/vendor/rack/lib/rack/recursive.rb +57 -0
  809. data/vendor/rack/lib/rack/reloader.rb +64 -0
  810. data/vendor/rack/lib/rack/request.rb +209 -0
  811. data/vendor/rack/lib/rack/response.rb +166 -0
  812. data/vendor/rack/lib/rack/session/abstract/id.rb +140 -0
  813. data/vendor/rack/lib/rack/session/cookie.rb +71 -0
  814. data/vendor/rack/lib/rack/session/memcache.rb +97 -0
  815. data/vendor/rack/lib/rack/session/pool.rb +73 -0
  816. data/vendor/rack/lib/rack/showexceptions.rb +344 -0
  817. data/vendor/rack/lib/rack/showstatus.rb +105 -0
  818. data/vendor/rack/lib/rack/static.rb +38 -0
  819. data/vendor/rack/lib/rack/urlmap.rb +48 -0
  820. data/vendor/rack/lib/rack/utils.rb +318 -0
  821. data/vendor/rack/lib/rack.rb +81 -0
  822. data/vendor/rack/test/cgi/lighttpd.conf +20 -0
  823. data/vendor/rack/test/cgi/test +9 -0
  824. data/vendor/rack/test/cgi/test.fcgi +8 -0
  825. data/vendor/rack/test/cgi/test.ru +7 -0
  826. data/vendor/rack/test/spec_rack_auth_basic.rb +69 -0
  827. data/vendor/rack/test/spec_rack_auth_digest.rb +169 -0
  828. data/vendor/rack/test/spec_rack_auth_openid.rb +137 -0
  829. data/vendor/rack/test/spec_rack_builder.rb +50 -0
  830. data/vendor/rack/test/spec_rack_camping.rb +51 -0
  831. data/vendor/rack/test/spec_rack_cascade.rb +50 -0
  832. data/vendor/rack/test/spec_rack_cgi.rb +89 -0
  833. data/vendor/rack/test/spec_rack_commonlogger.rb +32 -0
  834. data/vendor/rack/test/spec_rack_deflater.rb +70 -0
  835. data/vendor/rack/test/spec_rack_directory.rb +56 -0
  836. data/vendor/rack/test/spec_rack_fastcgi.rb +89 -0
  837. data/vendor/rack/test/spec_rack_file.rb +50 -0
  838. data/vendor/rack/test/spec_rack_handler.rb +24 -0
  839. data/vendor/rack/test/spec_rack_lint.rb +303 -0
  840. data/vendor/rack/test/spec_rack_lobster.rb +45 -0
  841. data/vendor/rack/test/spec_rack_mock.rb +152 -0
  842. data/vendor/rack/test/spec_rack_mongrel.rb +170 -0
  843. data/vendor/rack/test/spec_rack_recursive.rb +77 -0
  844. data/vendor/rack/test/spec_rack_request.rb +401 -0
  845. data/vendor/rack/test/spec_rack_response.rb +167 -0
  846. data/vendor/rack/test/spec_rack_session_cookie.rb +49 -0
  847. data/vendor/rack/test/spec_rack_session_memcache.rb +132 -0
  848. data/vendor/rack/test/spec_rack_session_pool.rb +84 -0
  849. data/vendor/rack/test/spec_rack_showexceptions.rb +21 -0
  850. data/vendor/rack/test/spec_rack_showstatus.rb +72 -0
  851. data/vendor/rack/test/spec_rack_static.rb +37 -0
  852. data/vendor/rack/test/spec_rack_urlmap.rb +175 -0
  853. data/vendor/rack/test/spec_rack_utils.rb +174 -0
  854. data/vendor/rack/test/spec_rack_webrick.rb +106 -0
  855. data/vendor/rack/test/testrequest.rb +45 -0
  856. data/vendor/sinatra/CHANGELOG +64 -0
  857. data/vendor/sinatra/LICENSE +22 -0
  858. data/vendor/sinatra/README.rdoc +533 -0
  859. data/vendor/sinatra/Rakefile +111 -0
  860. data/vendor/sinatra/images/404.png +0 -0
  861. data/vendor/sinatra/images/500.png +0 -0
  862. data/vendor/sinatra/lib/sinatra/rack/handler/mongrel.rb +85 -0
  863. data/vendor/sinatra/lib/sinatra/test/methods.rb +76 -0
  864. data/vendor/sinatra/lib/sinatra/test/rspec.rb +10 -0
  865. data/vendor/sinatra/lib/sinatra/test/spec.rb +10 -0
  866. data/vendor/sinatra/lib/sinatra/test/unit.rb +13 -0
  867. data/vendor/sinatra/lib/sinatra.rb +1477 -0
  868. data/vendor/sinatra/sinatra.gemspec +78 -0
  869. data/vendor/sinatra/test/app_test.rb +299 -0
  870. data/vendor/sinatra/test/application_test.rb +318 -0
  871. data/vendor/sinatra/test/builder_test.rb +101 -0
  872. data/vendor/sinatra/test/custom_error_test.rb +62 -0
  873. data/vendor/sinatra/test/erb_test.rb +136 -0
  874. data/vendor/sinatra/test/event_context_test.rb +15 -0
  875. data/vendor/sinatra/test/events_test.rb +47 -0
  876. data/vendor/sinatra/test/filter_test.rb +30 -0
  877. data/vendor/sinatra/test/haml_test.rb +233 -0
  878. data/vendor/sinatra/test/helper.rb +7 -0
  879. data/vendor/sinatra/test/mapped_error_test.rb +72 -0
  880. data/vendor/sinatra/test/pipeline_test.rb +66 -0
  881. data/vendor/sinatra/test/public/foo.xml +1 -0
  882. data/vendor/sinatra/test/sass_test.rb +57 -0
  883. data/vendor/sinatra/test/sessions_test.rb +39 -0
  884. data/vendor/sinatra/test/streaming_test.rb +118 -0
  885. data/vendor/sinatra/test/sym_params_test.rb +19 -0
  886. data/vendor/sinatra/test/template_test.rb +30 -0
  887. data/vendor/sinatra/test/use_in_file_templates_test.rb +47 -0
  888. data/vendor/sinatra/test/views/foo.builder +1 -0
  889. data/vendor/sinatra/test/views/foo.erb +1 -0
  890. data/vendor/sinatra/test/views/foo.haml +1 -0
  891. data/vendor/sinatra/test/views/foo.sass +2 -0
  892. data/vendor/sinatra/test/views/foo_layout.erb +2 -0
  893. data/vendor/sinatra/test/views/foo_layout.haml +2 -0
  894. data/vendor/sinatra/test/views/layout_test/foo.builder +1 -0
  895. data/vendor/sinatra/test/views/layout_test/foo.erb +1 -0
  896. data/vendor/sinatra/test/views/layout_test/foo.haml +1 -0
  897. data/vendor/sinatra/test/views/layout_test/foo.sass +2 -0
  898. data/vendor/sinatra/test/views/layout_test/layout.builder +3 -0
  899. data/vendor/sinatra/test/views/layout_test/layout.erb +1 -0
  900. data/vendor/sinatra/test/views/layout_test/layout.haml +1 -0
  901. data/vendor/sinatra/test/views/layout_test/layout.sass +2 -0
  902. data/vendor/sinatra/test/views/no_layout/no_layout.builder +1 -0
  903. data/vendor/sinatra/test/views/no_layout/no_layout.haml +1 -0
  904. metadata +1121 -0
@@ -0,0 +1,1534 @@
1
+ # encoding: utf-8
2
+ require "cases/helper"
3
+ require 'models/topic'
4
+ require 'models/reply'
5
+ require 'models/person'
6
+ require 'models/developer'
7
+ require 'models/warehouse_thing'
8
+ require 'models/guid'
9
+
10
+ # The following methods in Topic are used in test_conditional_validation_*
11
+ class Topic
12
+ has_many :unique_replies, :dependent => :destroy, :foreign_key => "parent_id"
13
+ has_many :silly_unique_replies, :dependent => :destroy, :foreign_key => "parent_id"
14
+
15
+ def condition_is_true
16
+ true
17
+ end
18
+
19
+ def condition_is_true_but_its_not
20
+ false
21
+ end
22
+ end
23
+
24
+ class ProtectedPerson < ActiveRecord::Base
25
+ set_table_name 'people'
26
+ attr_accessor :addon
27
+ attr_protected :first_name
28
+ end
29
+
30
+ class UniqueReply < Reply
31
+ validates_uniqueness_of :content, :scope => 'parent_id'
32
+ end
33
+
34
+ class PlagiarizedReply < Reply
35
+ validates_acceptance_of :author_name
36
+ end
37
+
38
+ class SillyUniqueReply < UniqueReply
39
+ end
40
+
41
+ class Wizard < ActiveRecord::Base
42
+ self.abstract_class = true
43
+
44
+ validates_uniqueness_of :name
45
+ end
46
+
47
+ class IneptWizard < Wizard
48
+ validates_uniqueness_of :city
49
+ end
50
+
51
+ class Conjurer < IneptWizard
52
+ end
53
+
54
+ class Thaumaturgist < IneptWizard
55
+ end
56
+
57
+
58
+ class ValidationsTest < ActiveRecord::TestCase
59
+ fixtures :topics, :developers, 'warehouse-things'
60
+
61
+ def setup
62
+ Topic.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
63
+ Topic.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
64
+ Topic.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
65
+ end
66
+
67
+ def test_single_field_validation
68
+ r = Reply.new
69
+ r.title = "There's no content!"
70
+ assert !r.valid?, "A reply without content shouldn't be saveable"
71
+
72
+ r.content = "Messa content!"
73
+ assert r.valid?, "A reply with content should be saveable"
74
+ end
75
+
76
+ def test_single_attr_validation_and_error_msg
77
+ r = Reply.new
78
+ r.title = "There's no content!"
79
+ assert !r.valid?
80
+ assert r.errors.invalid?("content"), "A reply without content should mark that attribute as invalid"
81
+ assert_equal "Empty", r.errors.on("content"), "A reply without content should contain an error"
82
+ assert_equal 1, r.errors.count
83
+ end
84
+
85
+ def test_double_attr_validation_and_error_msg
86
+ r = Reply.new
87
+ assert !r.valid?
88
+
89
+ assert r.errors.invalid?("title"), "A reply without title should mark that attribute as invalid"
90
+ assert_equal "Empty", r.errors.on("title"), "A reply without title should contain an error"
91
+
92
+ assert r.errors.invalid?("content"), "A reply without content should mark that attribute as invalid"
93
+ assert_equal "Empty", r.errors.on("content"), "A reply without content should contain an error"
94
+
95
+ assert_equal 2, r.errors.count
96
+ end
97
+
98
+ def test_error_on_create
99
+ r = Reply.new
100
+ r.title = "Wrong Create"
101
+ assert !r.valid?
102
+ assert r.errors.invalid?("title"), "A reply with a bad title should mark that attribute as invalid"
103
+ assert_equal "is Wrong Create", r.errors.on("title"), "A reply with a bad content should contain an error"
104
+ end
105
+
106
+ def test_error_on_update
107
+ r = Reply.new
108
+ r.title = "Bad"
109
+ r.content = "Good"
110
+ assert r.save, "First save should be successful"
111
+
112
+ r.title = "Wrong Update"
113
+ assert !r.save, "Second save should fail"
114
+
115
+ assert r.errors.invalid?("title"), "A reply with a bad title should mark that attribute as invalid"
116
+ assert_equal "is Wrong Update", r.errors.on("title"), "A reply with a bad content should contain an error"
117
+ end
118
+
119
+ def test_invalid_record_exception
120
+ assert_raises(ActiveRecord::RecordInvalid) { Reply.create! }
121
+ assert_raises(ActiveRecord::RecordInvalid) { Reply.new.save! }
122
+
123
+ begin
124
+ r = Reply.new
125
+ r.save!
126
+ flunk
127
+ rescue ActiveRecord::RecordInvalid => invalid
128
+ assert_equal r, invalid.record
129
+ end
130
+ end
131
+
132
+ def test_exception_on_create_bang_many
133
+ assert_raises(ActiveRecord::RecordInvalid) do
134
+ Reply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
135
+ end
136
+ end
137
+
138
+ def test_exception_on_create_bang_with_block
139
+ assert_raises(ActiveRecord::RecordInvalid) do
140
+ Reply.create!({ "title" => "OK" }) do |r|
141
+ r.content = nil
142
+ end
143
+ end
144
+ end
145
+
146
+ def test_exception_on_create_bang_many_with_block
147
+ assert_raises(ActiveRecord::RecordInvalid) do
148
+ Reply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
149
+ r.content = nil
150
+ end
151
+ end
152
+ end
153
+
154
+ def test_scoped_create_without_attributes
155
+ Reply.with_scope(:create => {}) do
156
+ assert_raises(ActiveRecord::RecordInvalid) { Reply.create! }
157
+ end
158
+ end
159
+
160
+ def test_create_with_exceptions_using_scope_for_protected_attributes
161
+ assert_nothing_raised do
162
+ ProtectedPerson.with_scope( :create => { :first_name => "Mary" } ) do
163
+ person = ProtectedPerson.create! :addon => "Addon"
164
+ assert_equal person.first_name, "Mary", "scope should ignore attr_protected"
165
+ end
166
+ end
167
+ end
168
+
169
+ def test_create_with_exceptions_using_scope_and_empty_attributes
170
+ assert_nothing_raised do
171
+ ProtectedPerson.with_scope( :create => { :first_name => "Mary" } ) do
172
+ person = ProtectedPerson.create!
173
+ assert_equal person.first_name, "Mary", "should be ok when no attributes are passed to create!"
174
+ end
175
+ end
176
+ end
177
+
178
+ def test_single_error_per_attr_iteration
179
+ r = Reply.new
180
+ r.save
181
+
182
+ errors = []
183
+ r.errors.each { |attr, msg| errors << [attr, msg] }
184
+
185
+ assert errors.include?(["title", "Empty"])
186
+ assert errors.include?(["content", "Empty"])
187
+ end
188
+
189
+ def test_multiple_errors_per_attr_iteration_with_full_error_composition
190
+ r = Reply.new
191
+ r.title = "Wrong Create"
192
+ r.content = "Mismatch"
193
+ r.save
194
+
195
+ errors = []
196
+ r.errors.each_full { |error| errors << error }
197
+
198
+ assert_equal "Title is Wrong Create", errors[0]
199
+ assert_equal "Title is Content Mismatch", errors[1]
200
+ assert_equal 2, r.errors.count
201
+ end
202
+
203
+ def test_errors_on_base
204
+ r = Reply.new
205
+ r.content = "Mismatch"
206
+ r.save
207
+ r.errors.add_to_base "Reply is not dignifying"
208
+
209
+ errors = []
210
+ r.errors.each_full { |error| errors << error }
211
+
212
+ assert_equal "Reply is not dignifying", r.errors.on_base
213
+
214
+ assert errors.include?("Title Empty")
215
+ assert errors.include?("Reply is not dignifying")
216
+ assert_equal 2, r.errors.count
217
+ end
218
+
219
+ def test_create_without_validation
220
+ reply = Reply.new
221
+ assert !reply.save
222
+ assert reply.save(false)
223
+ end
224
+
225
+ def test_create_without_validation_bang
226
+ count = Reply.count
227
+ assert_nothing_raised { Reply.new.save_without_validation! }
228
+ assert count+1, Reply.count
229
+ end
230
+
231
+ def test_validates_each
232
+ perform = true
233
+ hits = 0
234
+ Topic.validates_each(:title, :content, [:title, :content]) do |record, attr|
235
+ if perform
236
+ record.errors.add attr, 'gotcha'
237
+ hits += 1
238
+ end
239
+ end
240
+ t = Topic.new("title" => "valid", "content" => "whatever")
241
+ assert !t.save
242
+ assert_equal 4, hits
243
+ assert_equal %w(gotcha gotcha), t.errors.on(:title)
244
+ assert_equal %w(gotcha gotcha), t.errors.on(:content)
245
+ ensure
246
+ perform = false
247
+ end
248
+
249
+ def test_no_title_confirmation
250
+ Topic.validates_confirmation_of(:title)
251
+
252
+ t = Topic.new(:author_name => "Plutarch")
253
+ assert t.valid?
254
+
255
+ t.title_confirmation = "Parallel Lives"
256
+ assert !t.valid?
257
+
258
+ t.title_confirmation = nil
259
+ t.title = "Parallel Lives"
260
+ assert t.valid?
261
+
262
+ t.title_confirmation = "Parallel Lives"
263
+ assert t.valid?
264
+ end
265
+
266
+ def test_title_confirmation
267
+ Topic.validates_confirmation_of(:title)
268
+
269
+ t = Topic.create("title" => "We should be confirmed","title_confirmation" => "")
270
+ assert !t.save
271
+
272
+ t.title_confirmation = "We should be confirmed"
273
+ assert t.save
274
+ end
275
+
276
+ def test_terms_of_service_agreement_no_acceptance
277
+ Topic.validates_acceptance_of(:terms_of_service, :on => :create)
278
+
279
+ t = Topic.create("title" => "We should not be confirmed")
280
+ assert t.save
281
+ end
282
+
283
+ def test_terms_of_service_agreement
284
+ Topic.validates_acceptance_of(:terms_of_service, :on => :create)
285
+
286
+ t = Topic.create("title" => "We should be confirmed","terms_of_service" => "")
287
+ assert !t.save
288
+ assert_equal "must be accepted", t.errors.on(:terms_of_service)
289
+
290
+ t.terms_of_service = "1"
291
+ assert t.save
292
+ end
293
+
294
+
295
+ def test_eula
296
+ Topic.validates_acceptance_of(:eula, :message => "must be abided", :on => :create)
297
+
298
+ t = Topic.create("title" => "We should be confirmed","eula" => "")
299
+ assert !t.save
300
+ assert_equal "must be abided", t.errors.on(:eula)
301
+
302
+ t.eula = "1"
303
+ assert t.save
304
+ end
305
+
306
+ def test_terms_of_service_agreement_with_accept_value
307
+ Topic.validates_acceptance_of(:terms_of_service, :on => :create, :accept => "I agree.")
308
+
309
+ t = Topic.create("title" => "We should be confirmed", "terms_of_service" => "")
310
+ assert !t.save
311
+ assert_equal "must be accepted", t.errors.on(:terms_of_service)
312
+
313
+ t.terms_of_service = "I agree."
314
+ assert t.save
315
+ end
316
+
317
+ def test_validates_acceptance_of_as_database_column
318
+ reply = PlagiarizedReply.create("author_name" => "Dan Brown")
319
+ assert_equal "Dan Brown", reply["author_name"]
320
+ end
321
+
322
+ def test_validates_acceptance_of_with_non_existant_table
323
+ Object.const_set :IncorporealModel, Class.new(ActiveRecord::Base)
324
+
325
+ assert_nothing_raised ActiveRecord::StatementInvalid do
326
+ IncorporealModel.validates_acceptance_of(:incorporeal_column)
327
+ end
328
+ end
329
+
330
+ def test_validate_presences
331
+ Topic.validates_presence_of(:title, :content)
332
+
333
+ t = Topic.create
334
+ assert !t.save
335
+ assert_equal "can't be blank", t.errors.on(:title)
336
+ assert_equal "can't be blank", t.errors.on(:content)
337
+
338
+ t.title = "something"
339
+ t.content = " "
340
+
341
+ assert !t.save
342
+ assert_equal "can't be blank", t.errors.on(:content)
343
+
344
+ t.content = "like stuff"
345
+
346
+ assert t.save
347
+ end
348
+
349
+ def test_validate_uniqueness
350
+ Topic.validates_uniqueness_of(:title)
351
+
352
+ t = Topic.new("title" => "I'm unique!")
353
+ assert t.save, "Should save t as unique"
354
+
355
+ t.content = "Remaining unique"
356
+ assert t.save, "Should still save t as unique"
357
+
358
+ t2 = Topic.new("title" => "I'm unique!")
359
+ assert !t2.valid?, "Shouldn't be valid"
360
+ assert !t2.save, "Shouldn't save t2 as unique"
361
+ assert_equal "has already been taken", t2.errors.on(:title)
362
+
363
+ t2.title = "Now Im really also unique"
364
+ assert t2.save, "Should now save t2 as unique"
365
+ end
366
+
367
+ def test_validate_uniqueness_with_scope
368
+ Reply.validates_uniqueness_of(:content, :scope => "parent_id")
369
+
370
+ t = Topic.create("title" => "I'm unique!")
371
+
372
+ r1 = t.replies.create "title" => "r1", "content" => "hello world"
373
+ assert r1.valid?, "Saving r1"
374
+
375
+ r2 = t.replies.create "title" => "r2", "content" => "hello world"
376
+ assert !r2.valid?, "Saving r2 first time"
377
+
378
+ r2.content = "something else"
379
+ assert r2.save, "Saving r2 second time"
380
+
381
+ t2 = Topic.create("title" => "I'm unique too!")
382
+ r3 = t2.replies.create "title" => "r3", "content" => "hello world"
383
+ assert r3.valid?, "Saving r3"
384
+ end
385
+
386
+ def test_validate_uniqueness_scoped_to_defining_class
387
+ t = Topic.create("title" => "What, me worry?")
388
+
389
+ r1 = t.unique_replies.create "title" => "r1", "content" => "a barrel of fun"
390
+ assert r1.valid?, "Saving r1"
391
+
392
+ r2 = t.silly_unique_replies.create "title" => "r2", "content" => "a barrel of fun"
393
+ assert !r2.valid?, "Saving r2"
394
+
395
+ # Should succeed as validates_uniqueness_of only applies to
396
+ # UniqueReply and its subclasses
397
+ r3 = t.replies.create "title" => "r2", "content" => "a barrel of fun"
398
+ assert r3.valid?, "Saving r3"
399
+ end
400
+
401
+ def test_validate_uniqueness_with_scope_array
402
+ Reply.validates_uniqueness_of(:author_name, :scope => [:author_email_address, :parent_id])
403
+
404
+ t = Topic.create("title" => "The earth is actually flat!")
405
+
406
+ r1 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy@rubyonrails.com", "title" => "You're crazy!", "content" => "Crazy reply"
407
+ assert r1.valid?, "Saving r1"
408
+
409
+ r2 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy@rubyonrails.com", "title" => "You're crazy!", "content" => "Crazy reply again..."
410
+ assert !r2.valid?, "Saving r2. Double reply by same author."
411
+
412
+ r2.author_email_address = "jeremy_alt_email@rubyonrails.com"
413
+ assert r2.save, "Saving r2 the second time."
414
+
415
+ r3 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy_alt_email@rubyonrails.com", "title" => "You're wrong", "content" => "It's cubic"
416
+ assert !r3.valid?, "Saving r3"
417
+
418
+ r3.author_name = "jj"
419
+ assert r3.save, "Saving r3 the second time."
420
+
421
+ r3.author_name = "jeremy"
422
+ assert !r3.save, "Saving r3 the third time."
423
+ end
424
+
425
+ def test_validate_case_insensitive_uniqueness
426
+ Topic.validates_uniqueness_of(:title, :parent_id, :case_sensitive => false, :allow_nil => true)
427
+
428
+ t = Topic.new("title" => "I'm unique!", :parent_id => 2)
429
+ assert t.save, "Should save t as unique"
430
+
431
+ t.content = "Remaining unique"
432
+ assert t.save, "Should still save t as unique"
433
+
434
+ t2 = Topic.new("title" => "I'm UNIQUE!", :parent_id => 1)
435
+ assert !t2.valid?, "Shouldn't be valid"
436
+ assert !t2.save, "Shouldn't save t2 as unique"
437
+ assert t2.errors.on(:title)
438
+ assert t2.errors.on(:parent_id)
439
+ assert_equal "has already been taken", t2.errors.on(:title)
440
+
441
+ t2.title = "I'm truly UNIQUE!"
442
+ assert !t2.valid?, "Shouldn't be valid"
443
+ assert !t2.save, "Shouldn't save t2 as unique"
444
+ assert_nil t2.errors.on(:title)
445
+ assert t2.errors.on(:parent_id)
446
+
447
+ t2.parent_id = 4
448
+ assert t2.save, "Should now save t2 as unique"
449
+
450
+ t2.parent_id = nil
451
+ t2.title = nil
452
+ assert t2.valid?, "should validate with nil"
453
+ assert t2.save, "should save with nil"
454
+
455
+ with_kcode('UTF8') do
456
+ t_utf8 = Topic.new("title" => "Я тоже уникальный!")
457
+ assert t_utf8.save, "Should save t_utf8 as unique"
458
+
459
+ # If database hasn't UTF-8 character set, this test fails
460
+ if Topic.find(t_utf8, :select => 'LOWER(title) AS title').title == "я тоже уникальный!"
461
+ t2_utf8 = Topic.new("title" => "я тоже УНИКАЛЬНЫЙ!")
462
+ assert !t2_utf8.valid?, "Shouldn't be valid"
463
+ assert !t2_utf8.save, "Shouldn't save t2_utf8 as unique"
464
+ end
465
+ end
466
+ end
467
+
468
+ def test_validate_case_sensitive_uniqueness
469
+ Topic.validates_uniqueness_of(:title, :case_sensitive => true, :allow_nil => true)
470
+
471
+ t = Topic.new("title" => "I'm unique!")
472
+ assert t.save, "Should save t as unique"
473
+
474
+ t.content = "Remaining unique"
475
+ assert t.save, "Should still save t as unique"
476
+
477
+ t2 = Topic.new("title" => "I'M UNIQUE!")
478
+ assert t2.valid?, "Should be valid"
479
+ assert t2.save, "Should save t2 as unique"
480
+ assert !t2.errors.on(:title)
481
+ assert !t2.errors.on(:parent_id)
482
+ assert_not_equal "has already been taken", t2.errors.on(:title)
483
+
484
+ t3 = Topic.new("title" => "I'M uNiQUe!")
485
+ assert t3.valid?, "Should be valid"
486
+ assert t3.save, "Should save t2 as unique"
487
+ assert !t3.errors.on(:title)
488
+ assert !t3.errors.on(:parent_id)
489
+ assert_not_equal "has already been taken", t3.errors.on(:title)
490
+ end
491
+
492
+ def test_validate_uniqueness_with_non_standard_table_names
493
+ i1 = WarehouseThing.create(:value => 1000)
494
+ assert !i1.valid?, "i1 should not be valid"
495
+ assert i1.errors.on(:value), "Should not be empty"
496
+ end
497
+
498
+ def test_validates_uniqueness_inside_with_scope
499
+ Topic.validates_uniqueness_of(:title)
500
+
501
+ Topic.with_scope(:find => { :conditions => { :author_name => "David" } }) do
502
+ t1 = Topic.new("title" => "I'm unique!", "author_name" => "Mary")
503
+ assert t1.save
504
+ t2 = Topic.new("title" => "I'm unique!", "author_name" => "David")
505
+ assert !t2.valid?
506
+ end
507
+ end
508
+
509
+ def test_validate_uniqueness_with_columns_which_are_sql_keywords
510
+ Guid.validates_uniqueness_of :key
511
+ g = Guid.new
512
+ g.key = "foo"
513
+ assert_nothing_raised { !g.valid? }
514
+ end
515
+
516
+ def test_validate_straight_inheritance_uniqueness
517
+ w1 = IneptWizard.create(:name => "Rincewind", :city => "Ankh-Morpork")
518
+ assert w1.valid?, "Saving w1"
519
+
520
+ # Should use validation from base class (which is abstract)
521
+ w2 = IneptWizard.new(:name => "Rincewind", :city => "Quirm")
522
+ assert !w2.valid?, "w2 shouldn't be valid"
523
+ assert w2.errors.on(:name), "Should have errors for name"
524
+ assert_equal "has already been taken", w2.errors.on(:name), "Should have uniqueness message for name"
525
+
526
+ w3 = Conjurer.new(:name => "Rincewind", :city => "Quirm")
527
+ assert !w3.valid?, "w3 shouldn't be valid"
528
+ assert w3.errors.on(:name), "Should have errors for name"
529
+ assert_equal "has already been taken", w3.errors.on(:name), "Should have uniqueness message for name"
530
+
531
+ w4 = Conjurer.create(:name => "The Amazing Bonko", :city => "Quirm")
532
+ assert w4.valid?, "Saving w4"
533
+
534
+ w5 = Thaumaturgist.new(:name => "The Amazing Bonko", :city => "Lancre")
535
+ assert !w5.valid?, "w5 shouldn't be valid"
536
+ assert w5.errors.on(:name), "Should have errors for name"
537
+ assert_equal "has already been taken", w5.errors.on(:name), "Should have uniqueness message for name"
538
+
539
+ w6 = Thaumaturgist.new(:name => "Mustrum Ridcully", :city => "Quirm")
540
+ assert !w6.valid?, "w6 shouldn't be valid"
541
+ assert w6.errors.on(:city), "Should have errors for city"
542
+ assert_equal "has already been taken", w6.errors.on(:city), "Should have uniqueness message for city"
543
+ end
544
+
545
+ def test_validate_format
546
+ Topic.validates_format_of(:title, :content, :with => /^Validation\smacros \w+!$/, :message => "is bad data")
547
+
548
+ t = Topic.create("title" => "i'm incorrect", "content" => "Validation macros rule!")
549
+ assert !t.valid?, "Shouldn't be valid"
550
+ assert !t.save, "Shouldn't save because it's invalid"
551
+ assert_equal "is bad data", t.errors.on(:title)
552
+ assert_nil t.errors.on(:content)
553
+
554
+ t.title = "Validation macros rule!"
555
+
556
+ assert t.save
557
+ assert_nil t.errors.on(:title)
558
+
559
+ assert_raise(ArgumentError) { Topic.validates_format_of(:title, :content) }
560
+ end
561
+
562
+ def test_validate_format_with_allow_blank
563
+ Topic.validates_format_of(:title, :with => /^Validation\smacros \w+!$/, :allow_blank=>true)
564
+ assert !Topic.create("title" => "Shouldn't be valid").valid?
565
+ assert Topic.create("title" => "").valid?
566
+ assert Topic.create("title" => nil).valid?
567
+ assert Topic.create("title" => "Validation macros rule!").valid?
568
+ end
569
+
570
+ # testing ticket #3142
571
+ def test_validate_format_numeric
572
+ Topic.validates_format_of(:title, :content, :with => /^[1-9][0-9]*$/, :message => "is bad data")
573
+
574
+ t = Topic.create("title" => "72x", "content" => "6789")
575
+ assert !t.valid?, "Shouldn't be valid"
576
+ assert !t.save, "Shouldn't save because it's invalid"
577
+ assert_equal "is bad data", t.errors.on(:title)
578
+ assert_nil t.errors.on(:content)
579
+
580
+ t.title = "-11"
581
+ assert !t.valid?, "Shouldn't be valid"
582
+
583
+ t.title = "03"
584
+ assert !t.valid?, "Shouldn't be valid"
585
+
586
+ t.title = "z44"
587
+ assert !t.valid?, "Shouldn't be valid"
588
+
589
+ t.title = "5v7"
590
+ assert !t.valid?, "Shouldn't be valid"
591
+
592
+ t.title = "1"
593
+
594
+ assert t.save
595
+ assert_nil t.errors.on(:title)
596
+ end
597
+
598
+ def test_validate_format_with_formatted_message
599
+ Topic.validates_format_of(:title, :with => /^Valid Title$/, :message => "can't be %s")
600
+ t = Topic.create(:title => 'Invalid title')
601
+ assert_equal "can't be Invalid title", t.errors.on(:title)
602
+ end
603
+
604
+ def test_validates_inclusion_of
605
+ Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ) )
606
+
607
+ assert !Topic.create("title" => "a!", "content" => "abc").valid?
608
+ assert !Topic.create("title" => "a b", "content" => "abc").valid?
609
+ assert !Topic.create("title" => nil, "content" => "def").valid?
610
+
611
+ t = Topic.create("title" => "a", "content" => "I know you are but what am I?")
612
+ assert t.valid?
613
+ t.title = "uhoh"
614
+ assert !t.valid?
615
+ assert t.errors.on(:title)
616
+ assert_equal "is not included in the list", t.errors["title"]
617
+
618
+ assert_raise(ArgumentError) { Topic.validates_inclusion_of( :title, :in => nil ) }
619
+ assert_raise(ArgumentError) { Topic.validates_inclusion_of( :title, :in => 0) }
620
+
621
+ assert_nothing_raised(ArgumentError) { Topic.validates_inclusion_of( :title, :in => "hi!" ) }
622
+ assert_nothing_raised(ArgumentError) { Topic.validates_inclusion_of( :title, :in => {} ) }
623
+ assert_nothing_raised(ArgumentError) { Topic.validates_inclusion_of( :title, :in => [] ) }
624
+ end
625
+
626
+ def test_validates_inclusion_of_with_allow_nil
627
+ Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ), :allow_nil=>true )
628
+
629
+ assert !Topic.create("title" => "a!", "content" => "abc").valid?
630
+ assert !Topic.create("title" => "", "content" => "abc").valid?
631
+ assert Topic.create("title" => nil, "content" => "abc").valid?
632
+ end
633
+
634
+ def test_numericality_with_getter_method
635
+ Developer.validates_numericality_of( :salary )
636
+ developer = Developer.new("name" => "michael", "salary" => nil)
637
+ developer.instance_eval("def salary; read_attribute('salary') ? read_attribute('salary') : 100000; end")
638
+ assert developer.valid?
639
+ end
640
+
641
+ def test_validates_length_of_with_allow_nil
642
+ Topic.validates_length_of( :title, :is => 5, :allow_nil=>true )
643
+
644
+ assert !Topic.create("title" => "ab").valid?
645
+ assert !Topic.create("title" => "").valid?
646
+ assert Topic.create("title" => nil).valid?
647
+ assert Topic.create("title" => "abcde").valid?
648
+ end
649
+
650
+ def test_validates_length_of_with_allow_blank
651
+ Topic.validates_length_of( :title, :is => 5, :allow_blank=>true )
652
+
653
+ assert !Topic.create("title" => "ab").valid?
654
+ assert Topic.create("title" => "").valid?
655
+ assert Topic.create("title" => nil).valid?
656
+ assert Topic.create("title" => "abcde").valid?
657
+ end
658
+
659
+ def test_validates_inclusion_of_with_formatted_message
660
+ Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ), :message => "option %s is not in the list" )
661
+
662
+ assert Topic.create("title" => "a", "content" => "abc").valid?
663
+
664
+ t = Topic.create("title" => "uhoh", "content" => "abc")
665
+ assert !t.valid?
666
+ assert t.errors.on(:title)
667
+ assert_equal "option uhoh is not in the list", t.errors["title"]
668
+ end
669
+
670
+ def test_numericality_with_allow_nil_and_getter_method
671
+ Developer.validates_numericality_of( :salary, :allow_nil => true)
672
+ developer = Developer.new("name" => "michael", "salary" => nil)
673
+ developer.instance_eval("def salary; read_attribute('salary') ? read_attribute('salary') : 100000; end")
674
+ assert developer.valid?
675
+ end
676
+
677
+ def test_validates_exclusion_of
678
+ Topic.validates_exclusion_of( :title, :in => %w( abe monkey ) )
679
+
680
+ assert Topic.create("title" => "something", "content" => "abc").valid?
681
+ assert !Topic.create("title" => "monkey", "content" => "abc").valid?
682
+ end
683
+
684
+ def test_validates_exclusion_of_with_formatted_message
685
+ Topic.validates_exclusion_of( :title, :in => %w( abe monkey ), :message => "option %s is restricted" )
686
+
687
+ assert Topic.create("title" => "something", "content" => "abc")
688
+
689
+ t = Topic.create("title" => "monkey")
690
+ assert !t.valid?
691
+ assert t.errors.on(:title)
692
+ assert_equal "option monkey is restricted", t.errors["title"]
693
+ end
694
+
695
+ def test_validates_length_of_using_minimum
696
+ Topic.validates_length_of :title, :minimum => 5
697
+
698
+ t = Topic.create("title" => "valid", "content" => "whatever")
699
+ assert t.valid?
700
+
701
+ t.title = "not"
702
+ assert !t.valid?
703
+ assert t.errors.on(:title)
704
+ assert_equal "is too short (minimum is 5 characters)", t.errors["title"]
705
+
706
+ t.title = ""
707
+ assert !t.valid?
708
+ assert t.errors.on(:title)
709
+ assert_equal "is too short (minimum is 5 characters)", t.errors["title"]
710
+
711
+ t.title = nil
712
+ assert !t.valid?
713
+ assert t.errors.on(:title)
714
+ assert_equal "is too short (minimum is 5 characters)", t.errors["title"]
715
+ end
716
+
717
+ def test_optionally_validates_length_of_using_minimum
718
+ Topic.validates_length_of :title, :minimum => 5, :allow_nil => true
719
+
720
+ t = Topic.create("title" => "valid", "content" => "whatever")
721
+ assert t.valid?
722
+
723
+ t.title = nil
724
+ assert t.valid?
725
+ end
726
+
727
+ def test_validates_length_of_using_maximum
728
+ Topic.validates_length_of :title, :maximum => 5
729
+
730
+ t = Topic.create("title" => "valid", "content" => "whatever")
731
+ assert t.valid?
732
+
733
+ t.title = "notvalid"
734
+ assert !t.valid?
735
+ assert t.errors.on(:title)
736
+ assert_equal "is too long (maximum is 5 characters)", t.errors["title"]
737
+
738
+ t.title = ""
739
+ assert t.valid?
740
+
741
+ t.title = nil
742
+ assert !t.valid?
743
+ end
744
+
745
+ def test_optionally_validates_length_of_using_maximum
746
+ Topic.validates_length_of :title, :maximum => 5, :allow_nil => true
747
+
748
+ t = Topic.create("title" => "valid", "content" => "whatever")
749
+ assert t.valid?
750
+
751
+ t.title = nil
752
+ assert t.valid?
753
+ end
754
+
755
+ def test_validates_length_of_using_within
756
+ Topic.validates_length_of(:title, :content, :within => 3..5)
757
+
758
+ t = Topic.new("title" => "a!", "content" => "I'm ooooooooh so very long")
759
+ assert !t.valid?
760
+ assert_equal "is too short (minimum is 3 characters)", t.errors.on(:title)
761
+ assert_equal "is too long (maximum is 5 characters)", t.errors.on(:content)
762
+
763
+ t.title = nil
764
+ t.content = nil
765
+ assert !t.valid?
766
+ assert_equal "is too short (minimum is 3 characters)", t.errors.on(:title)
767
+ assert_equal "is too short (minimum is 3 characters)", t.errors.on(:content)
768
+
769
+ t.title = "abe"
770
+ t.content = "mad"
771
+ assert t.valid?
772
+ end
773
+
774
+ def test_optionally_validates_length_of_using_within
775
+ Topic.validates_length_of :title, :content, :within => 3..5, :allow_nil => true
776
+
777
+ t = Topic.create('title' => 'abc', 'content' => 'abcd')
778
+ assert t.valid?
779
+
780
+ t.title = nil
781
+ assert t.valid?
782
+ end
783
+
784
+ def test_optionally_validates_length_of_using_within_on_create
785
+ Topic.validates_length_of :title, :content, :within => 5..10, :on => :create, :too_long => "my string is too long: %d"
786
+
787
+ t = Topic.create("title" => "thisisnotvalid", "content" => "whatever")
788
+ assert !t.save
789
+ assert t.errors.on(:title)
790
+ assert_equal "my string is too long: 10", t.errors[:title]
791
+
792
+ t.title = "butthisis"
793
+ assert t.save
794
+
795
+ t.title = "few"
796
+ assert t.save
797
+
798
+ t.content = "andthisislong"
799
+ assert t.save
800
+
801
+ t.content = t.title = "iamfine"
802
+ assert t.save
803
+ end
804
+
805
+ def test_optionally_validates_length_of_using_within_on_update
806
+ Topic.validates_length_of :title, :content, :within => 5..10, :on => :update, :too_short => "my string is too short: %d"
807
+
808
+ t = Topic.create("title" => "vali", "content" => "whatever")
809
+ assert !t.save
810
+ assert t.errors.on(:title)
811
+
812
+ t.title = "not"
813
+ assert !t.save
814
+ assert t.errors.on(:title)
815
+ assert_equal "my string is too short: 5", t.errors[:title]
816
+
817
+ t.title = "valid"
818
+ t.content = "andthisistoolong"
819
+ assert !t.save
820
+ assert t.errors.on(:content)
821
+
822
+ t.content = "iamfine"
823
+ assert t.save
824
+ end
825
+
826
+ def test_validates_length_of_using_is
827
+ Topic.validates_length_of :title, :is => 5
828
+
829
+ t = Topic.create("title" => "valid", "content" => "whatever")
830
+ assert t.valid?
831
+
832
+ t.title = "notvalid"
833
+ assert !t.valid?
834
+ assert t.errors.on(:title)
835
+ assert_equal "is the wrong length (should be 5 characters)", t.errors["title"]
836
+
837
+ t.title = ""
838
+ assert !t.valid?
839
+
840
+ t.title = nil
841
+ assert !t.valid?
842
+ end
843
+
844
+ def test_optionally_validates_length_of_using_is
845
+ Topic.validates_length_of :title, :is => 5, :allow_nil => true
846
+
847
+ t = Topic.create("title" => "valid", "content" => "whatever")
848
+ assert t.valid?
849
+
850
+ t.title = nil
851
+ assert t.valid?
852
+ end
853
+
854
+ def test_validates_length_of_using_bignum
855
+ bigmin = 2 ** 30
856
+ bigmax = 2 ** 32
857
+ bigrange = bigmin...bigmax
858
+ assert_nothing_raised do
859
+ Topic.validates_length_of :title, :is => bigmin + 5
860
+ Topic.validates_length_of :title, :within => bigrange
861
+ Topic.validates_length_of :title, :in => bigrange
862
+ Topic.validates_length_of :title, :minimum => bigmin
863
+ Topic.validates_length_of :title, :maximum => bigmax
864
+ end
865
+ end
866
+
867
+ def test_validates_length_with_globally_modified_error_message
868
+ ActiveRecord::Errors.default_error_messages[:too_short] = 'tu est trops petit hombre %d'
869
+ Topic.validates_length_of :title, :minimum => 10
870
+ t = Topic.create(:title => 'too short')
871
+ assert !t.valid?
872
+
873
+ assert_equal 'tu est trops petit hombre 10', t.errors['title']
874
+ end
875
+
876
+ def test_validates_size_of_association
877
+ assert_nothing_raised { Topic.validates_size_of :replies, :minimum => 1 }
878
+ t = Topic.new('title' => 'noreplies', 'content' => 'whatever')
879
+ assert !t.save
880
+ assert t.errors.on(:replies)
881
+ reply = t.replies.build('title' => 'areply', 'content' => 'whateveragain')
882
+ assert t.valid?
883
+ end
884
+
885
+ def test_validates_size_of_association_using_within
886
+ assert_nothing_raised { Topic.validates_size_of :replies, :within => 1..2 }
887
+ t = Topic.new('title' => 'noreplies', 'content' => 'whatever')
888
+ assert !t.save
889
+ assert t.errors.on(:replies)
890
+
891
+ reply = t.replies.build('title' => 'areply', 'content' => 'whateveragain')
892
+ assert t.valid?
893
+
894
+ 2.times { t.replies.build('title' => 'areply', 'content' => 'whateveragain') }
895
+ assert !t.save
896
+ assert t.errors.on(:replies)
897
+ end
898
+
899
+ def test_validates_length_of_nasty_params
900
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :minimum=>6, :maximum=>9) }
901
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>6, :maximum=>9) }
902
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>6, :minimum=>9) }
903
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>6, :is=>9) }
904
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :minimum=>"a") }
905
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :maximum=>"a") }
906
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :within=>"a") }
907
+ assert_raise(ArgumentError) { Topic.validates_length_of(:title, :is=>"a") }
908
+ end
909
+
910
+ def test_validates_length_of_custom_errors_for_minimum_with_message
911
+ Topic.validates_length_of( :title, :minimum=>5, :message=>"boo %d" )
912
+ t = Topic.create("title" => "uhoh", "content" => "whatever")
913
+ assert !t.valid?
914
+ assert t.errors.on(:title)
915
+ assert_equal "boo 5", t.errors["title"]
916
+ end
917
+
918
+ def test_validates_length_of_custom_errors_for_minimum_with_too_short
919
+ Topic.validates_length_of( :title, :minimum=>5, :too_short=>"hoo %d" )
920
+ t = Topic.create("title" => "uhoh", "content" => "whatever")
921
+ assert !t.valid?
922
+ assert t.errors.on(:title)
923
+ assert_equal "hoo 5", t.errors["title"]
924
+ end
925
+
926
+ def test_validates_length_of_custom_errors_for_maximum_with_message
927
+ Topic.validates_length_of( :title, :maximum=>5, :message=>"boo %d" )
928
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
929
+ assert !t.valid?
930
+ assert t.errors.on(:title)
931
+ assert_equal "boo 5", t.errors["title"]
932
+ end
933
+
934
+ def test_validates_length_of_custom_errors_for_maximum_with_too_long
935
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d" )
936
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
937
+ assert !t.valid?
938
+ assert t.errors.on(:title)
939
+ assert_equal "hoo 5", t.errors["title"]
940
+ end
941
+
942
+ def test_validates_length_of_custom_errors_for_is_with_message
943
+ Topic.validates_length_of( :title, :is=>5, :message=>"boo %d" )
944
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
945
+ assert !t.valid?
946
+ assert t.errors.on(:title)
947
+ assert_equal "boo 5", t.errors["title"]
948
+ end
949
+
950
+ def test_validates_length_of_custom_errors_for_is_with_wrong_length
951
+ Topic.validates_length_of( :title, :is=>5, :wrong_length=>"hoo %d" )
952
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
953
+ assert !t.valid?
954
+ assert t.errors.on(:title)
955
+ assert_equal "hoo 5", t.errors["title"]
956
+ end
957
+
958
+ def test_validates_length_of_using_minimum_utf8
959
+ with_kcode('UTF8') do
960
+ Topic.validates_length_of :title, :minimum => 5
961
+
962
+ t = Topic.create("title" => "一二三四五", "content" => "whatever")
963
+ assert t.valid?
964
+
965
+ t.title = "一二三四"
966
+ assert !t.valid?
967
+ assert t.errors.on(:title)
968
+ assert_equal "is too short (minimum is 5 characters)", t.errors["title"]
969
+ end
970
+ end
971
+
972
+ def test_validates_length_of_using_maximum_utf8
973
+ with_kcode('UTF8') do
974
+ Topic.validates_length_of :title, :maximum => 5
975
+
976
+ t = Topic.create("title" => "一二三四五", "content" => "whatever")
977
+ assert t.valid?
978
+
979
+ t.title = "一二34五六"
980
+ assert !t.valid?
981
+ assert t.errors.on(:title)
982
+ assert_equal "is too long (maximum is 5 characters)", t.errors["title"]
983
+ end
984
+ end
985
+
986
+ def test_validates_length_of_using_within_utf8
987
+ with_kcode('UTF8') do
988
+ Topic.validates_length_of(:title, :content, :within => 3..5)
989
+
990
+ t = Topic.new("title" => "一二", "content" => "12三四五六七")
991
+ assert !t.valid?
992
+ assert_equal "is too short (minimum is 3 characters)", t.errors.on(:title)
993
+ assert_equal "is too long (maximum is 5 characters)", t.errors.on(:content)
994
+ t.title = "一二三"
995
+ t.content = "12三"
996
+ assert t.valid?
997
+ end
998
+ end
999
+
1000
+ def test_optionally_validates_length_of_using_within_utf8
1001
+ with_kcode('UTF8') do
1002
+ Topic.validates_length_of :title, :within => 3..5, :allow_nil => true
1003
+
1004
+ t = Topic.create(:title => "一二三四五")
1005
+ assert t.valid?, t.errors.inspect
1006
+
1007
+ t = Topic.create(:title => "一二三")
1008
+ assert t.valid?, t.errors.inspect
1009
+
1010
+ t.title = nil
1011
+ assert t.valid?, t.errors.inspect
1012
+ end
1013
+ end
1014
+
1015
+ def test_optionally_validates_length_of_using_within_on_create_utf8
1016
+ with_kcode('UTF8') do
1017
+ Topic.validates_length_of :title, :within => 5..10, :on => :create, :too_long => "長すぎます: %d"
1018
+
1019
+ t = Topic.create("title" => "一二三四五六七八九十A", "content" => "whatever")
1020
+ assert !t.save
1021
+ assert t.errors.on(:title)
1022
+ assert_equal "長すぎます: 10", t.errors[:title]
1023
+
1024
+ t.title = "一二三四五六七八九"
1025
+ assert t.save
1026
+
1027
+ t.title = "一二3"
1028
+ assert t.save
1029
+
1030
+ t.content = "一二三四五六七八九十"
1031
+ assert t.save
1032
+
1033
+ t.content = t.title = "一二三四五六"
1034
+ assert t.save
1035
+ end
1036
+ end
1037
+
1038
+ def test_optionally_validates_length_of_using_within_on_update_utf8
1039
+ with_kcode('UTF8') do
1040
+ Topic.validates_length_of :title, :within => 5..10, :on => :update, :too_short => "短すぎます: %d"
1041
+
1042
+ t = Topic.create("title" => "一二三4", "content" => "whatever")
1043
+ assert !t.save
1044
+ assert t.errors.on(:title)
1045
+
1046
+ t.title = "1二三4"
1047
+ assert !t.save
1048
+ assert t.errors.on(:title)
1049
+ assert_equal "短すぎます: 5", t.errors[:title]
1050
+
1051
+ t.title = "一二三四五六七八九十A"
1052
+ assert !t.save
1053
+ assert t.errors.on(:title)
1054
+
1055
+ t.title = "一二345"
1056
+ assert t.save
1057
+ end
1058
+ end
1059
+
1060
+ def test_validates_length_of_using_is_utf8
1061
+ with_kcode('UTF8') do
1062
+ Topic.validates_length_of :title, :is => 5
1063
+
1064
+ t = Topic.create("title" => "一二345", "content" => "whatever")
1065
+ assert t.valid?
1066
+
1067
+ t.title = "一二345六"
1068
+ assert !t.valid?
1069
+ assert t.errors.on(:title)
1070
+ assert_equal "is the wrong length (should be 5 characters)", t.errors["title"]
1071
+ end
1072
+ end
1073
+
1074
+ def test_validates_length_of_with_block
1075
+ Topic.validates_length_of :content, :minimum => 5, :too_short=>"Your essay must be at least %d words.",
1076
+ :tokenizer => lambda {|str| str.scan(/\w+/) }
1077
+ t = Topic.create!(:content => "this content should be long enough")
1078
+ assert t.valid?
1079
+
1080
+ t.content = "not long enough"
1081
+ assert !t.valid?
1082
+ assert t.errors.on(:content)
1083
+ assert_equal "Your essay must be at least 5 words.", t.errors[:content]
1084
+ end
1085
+
1086
+ def test_validates_size_of_association_utf8
1087
+ with_kcode('UTF8') do
1088
+ assert_nothing_raised { Topic.validates_size_of :replies, :minimum => 1 }
1089
+ t = Topic.new('title' => 'あいうえお', 'content' => 'かきくけこ')
1090
+ assert !t.save
1091
+ assert t.errors.on(:replies)
1092
+ t.replies.build('title' => 'あいうえお', 'content' => 'かきくけこ')
1093
+ assert t.valid?
1094
+ end
1095
+ end
1096
+
1097
+ def test_validates_associated_many
1098
+ Topic.validates_associated( :replies )
1099
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1100
+ t.replies << [r = Reply.new("title" => "A reply"), r2 = Reply.new("title" => "Another reply", "content" => "non-empty"), r3 = Reply.new("title" => "Yet another reply"), r4 = Reply.new("title" => "The last reply", "content" => "non-empty")]
1101
+ assert !t.valid?
1102
+ assert t.errors.on(:replies)
1103
+ assert_equal 1, r.errors.count # make sure all associated objects have been validated
1104
+ assert_equal 0, r2.errors.count
1105
+ assert_equal 1, r3.errors.count
1106
+ assert_equal 0, r4.errors.count
1107
+ r.content = r3.content = "non-empty"
1108
+ assert t.valid?
1109
+ end
1110
+
1111
+ def test_validates_associated_one
1112
+ Reply.validates_associated( :topic )
1113
+ Topic.validates_presence_of( :content )
1114
+ r = Reply.new("title" => "A reply", "content" => "with content!")
1115
+ r.topic = Topic.create("title" => "uhohuhoh")
1116
+ assert !r.valid?
1117
+ assert r.errors.on(:topic)
1118
+ r.topic.content = "non-empty"
1119
+ assert r.valid?
1120
+ end
1121
+
1122
+ def test_validate_block
1123
+ Topic.validate { |topic| topic.errors.add("title", "will never be valid") }
1124
+ t = Topic.create("title" => "Title", "content" => "whatever")
1125
+ assert !t.valid?
1126
+ assert t.errors.on(:title)
1127
+ assert_equal "will never be valid", t.errors["title"]
1128
+ end
1129
+
1130
+ def test_invalid_validator
1131
+ Topic.validate 3
1132
+ assert_raise(ArgumentError) { t = Topic.create }
1133
+ end
1134
+
1135
+ def test_throw_away_typing
1136
+ d = Developer.new("name" => "David", "salary" => "100,000")
1137
+ assert !d.valid?
1138
+ assert_equal 100, d.salary
1139
+ assert_equal "100,000", d.salary_before_type_cast
1140
+ end
1141
+
1142
+ def test_validates_acceptance_of_with_custom_error_using_quotes
1143
+ Developer.validates_acceptance_of :salary, :message=> "This string contains 'single' and \"double\" quotes"
1144
+ d = Developer.new
1145
+ d.salary = "0"
1146
+ assert !d.valid?
1147
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:salary).last
1148
+ end
1149
+
1150
+ def test_validates_confirmation_of_with_custom_error_using_quotes
1151
+ Developer.validates_confirmation_of :name, :message=> "confirm 'single' and \"double\" quotes"
1152
+ d = Developer.new
1153
+ d.name = "John"
1154
+ d.name_confirmation = "Johnny"
1155
+ assert !d.valid?
1156
+ assert_equal "confirm 'single' and \"double\" quotes", d.errors.on(:name)
1157
+ end
1158
+
1159
+ def test_validates_format_of_with_custom_error_using_quotes
1160
+ Developer.validates_format_of :name, :with => /^(A-Z*)$/, :message=> "format 'single' and \"double\" quotes"
1161
+ d = Developer.new
1162
+ d.name = d.name_confirmation = "John 32"
1163
+ assert !d.valid?
1164
+ assert_equal "format 'single' and \"double\" quotes", d.errors.on(:name)
1165
+ end
1166
+
1167
+ def test_validates_inclusion_of_with_custom_error_using_quotes
1168
+ Developer.validates_inclusion_of :salary, :in => 1000..80000, :message=> "This string contains 'single' and \"double\" quotes"
1169
+ d = Developer.new
1170
+ d.salary = "90,000"
1171
+ assert !d.valid?
1172
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:salary).last
1173
+ end
1174
+
1175
+ def test_validates_length_of_with_custom_too_long_using_quotes
1176
+ Developer.validates_length_of :name, :maximum => 4, :too_long=> "This string contains 'single' and \"double\" quotes"
1177
+ d = Developer.new
1178
+ d.name = "Jeffrey"
1179
+ assert !d.valid?
1180
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:name).last
1181
+ end
1182
+
1183
+ def test_validates_length_of_with_custom_too_short_using_quotes
1184
+ Developer.validates_length_of :name, :minimum => 4, :too_short=> "This string contains 'single' and \"double\" quotes"
1185
+ d = Developer.new
1186
+ d.name = "Joe"
1187
+ assert !d.valid?
1188
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:name).last
1189
+ end
1190
+
1191
+ def test_validates_length_of_with_custom_message_using_quotes
1192
+ Developer.validates_length_of :name, :minimum => 4, :message=> "This string contains 'single' and \"double\" quotes"
1193
+ d = Developer.new
1194
+ d.name = "Joe"
1195
+ assert !d.valid?
1196
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:name).last
1197
+ end
1198
+
1199
+ def test_validates_presence_of_with_custom_message_using_quotes
1200
+ Developer.validates_presence_of :non_existent, :message=> "This string contains 'single' and \"double\" quotes"
1201
+ d = Developer.new
1202
+ d.name = "Joe"
1203
+ assert !d.valid?
1204
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:non_existent)
1205
+ end
1206
+
1207
+ def test_validates_uniqueness_of_with_custom_message_using_quotes
1208
+ Developer.validates_uniqueness_of :name, :message=> "This string contains 'single' and \"double\" quotes"
1209
+ d = Developer.new
1210
+ d.name = "David"
1211
+ assert !d.valid?
1212
+ assert_equal "This string contains 'single' and \"double\" quotes", d.errors.on(:name).last
1213
+ end
1214
+
1215
+ def test_validates_associated_with_custom_message_using_quotes
1216
+ Reply.validates_associated :topic, :message=> "This string contains 'single' and \"double\" quotes"
1217
+ Topic.validates_presence_of :content
1218
+ r = Reply.create("title" => "A reply", "content" => "with content!")
1219
+ r.topic = Topic.create("title" => "uhohuhoh")
1220
+ assert !r.valid?
1221
+ assert_equal "This string contains 'single' and \"double\" quotes", r.errors.on(:topic).last
1222
+ end
1223
+
1224
+ def test_if_validation_using_method_true
1225
+ # When the method returns true
1226
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :if => :condition_is_true )
1227
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1228
+ assert !t.valid?
1229
+ assert t.errors.on(:title)
1230
+ assert_equal "hoo 5", t.errors["title"]
1231
+ end
1232
+
1233
+ def test_unless_validation_using_method_true
1234
+ # When the method returns true
1235
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :unless => :condition_is_true )
1236
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1237
+ assert t.valid?
1238
+ assert !t.errors.on(:title)
1239
+ end
1240
+
1241
+ def test_if_validation_using_method_false
1242
+ # When the method returns false
1243
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :if => :condition_is_true_but_its_not )
1244
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1245
+ assert t.valid?
1246
+ assert !t.errors.on(:title)
1247
+ end
1248
+
1249
+ def test_unless_validation_using_method_false
1250
+ # When the method returns false
1251
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :unless => :condition_is_true_but_its_not )
1252
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1253
+ assert !t.valid?
1254
+ assert t.errors.on(:title)
1255
+ assert_equal "hoo 5", t.errors["title"]
1256
+ end
1257
+
1258
+ def test_if_validation_using_string_true
1259
+ # When the evaluated string returns true
1260
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :if => "a = 1; a == 1" )
1261
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1262
+ assert !t.valid?
1263
+ assert t.errors.on(:title)
1264
+ assert_equal "hoo 5", t.errors["title"]
1265
+ end
1266
+
1267
+ def test_unless_validation_using_string_true
1268
+ # When the evaluated string returns true
1269
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :unless => "a = 1; a == 1" )
1270
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1271
+ assert t.valid?
1272
+ assert !t.errors.on(:title)
1273
+ end
1274
+
1275
+ def test_if_validation_using_string_false
1276
+ # When the evaluated string returns false
1277
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :if => "false")
1278
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1279
+ assert t.valid?
1280
+ assert !t.errors.on(:title)
1281
+ end
1282
+
1283
+ def test_unless_validation_using_string_false
1284
+ # When the evaluated string returns false
1285
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d", :unless => "false")
1286
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1287
+ assert !t.valid?
1288
+ assert t.errors.on(:title)
1289
+ assert_equal "hoo 5", t.errors["title"]
1290
+ end
1291
+
1292
+ def test_if_validation_using_block_true
1293
+ # When the block returns true
1294
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d",
1295
+ :if => Proc.new { |r| r.content.size > 4 } )
1296
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1297
+ assert !t.valid?
1298
+ assert t.errors.on(:title)
1299
+ assert_equal "hoo 5", t.errors["title"]
1300
+ end
1301
+
1302
+ def test_unless_validation_using_block_true
1303
+ # When the block returns true
1304
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d",
1305
+ :unless => Proc.new { |r| r.content.size > 4 } )
1306
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1307
+ assert t.valid?
1308
+ assert !t.errors.on(:title)
1309
+ end
1310
+
1311
+ def test_if_validation_using_block_false
1312
+ # When the block returns false
1313
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d",
1314
+ :if => Proc.new { |r| r.title != "uhohuhoh"} )
1315
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1316
+ assert t.valid?
1317
+ assert !t.errors.on(:title)
1318
+ end
1319
+
1320
+ def test_unless_validation_using_block_false
1321
+ # When the block returns false
1322
+ Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo %d",
1323
+ :unless => Proc.new { |r| r.title != "uhohuhoh"} )
1324
+ t = Topic.create("title" => "uhohuhoh", "content" => "whatever")
1325
+ assert !t.valid?
1326
+ assert t.errors.on(:title)
1327
+ assert_equal "hoo 5", t.errors["title"]
1328
+ end
1329
+
1330
+ def test_validates_associated_missing
1331
+ Reply.validates_presence_of(:topic)
1332
+ r = Reply.create("title" => "A reply", "content" => "with content!")
1333
+ assert !r.valid?
1334
+ assert r.errors.on(:topic)
1335
+
1336
+ r.topic = Topic.find :first
1337
+ assert r.valid?
1338
+ end
1339
+
1340
+ def test_errors_to_xml
1341
+ r = Reply.new :title => "Wrong Create"
1342
+ assert !r.valid?
1343
+ xml = r.errors.to_xml(:skip_instruct => true)
1344
+ assert_equal "<errors>", xml.first(8)
1345
+ assert xml.include?("<error>Title is Wrong Create</error>")
1346
+ assert xml.include?("<error>Content Empty</error>")
1347
+ end
1348
+
1349
+ def test_validation_order
1350
+ Topic.validates_presence_of :title
1351
+ Topic.validates_length_of :title, :minimum => 2
1352
+
1353
+ t = Topic.new("title" => "")
1354
+ assert !t.valid?
1355
+ assert_equal "can't be blank", t.errors.on("title").first
1356
+ end
1357
+
1358
+ # previous implementation of validates_presence_of eval'd the
1359
+ # string with the wrong binding, this regression test is to
1360
+ # ensure that it works correctly
1361
+ def test_validation_with_if_as_string
1362
+ Topic.validates_presence_of(:title)
1363
+ Topic.validates_presence_of(:author_name, :if => "title.to_s.match('important')")
1364
+
1365
+ t = Topic.new
1366
+ assert !t.valid?, "A topic without a title should not be valid"
1367
+ assert !t.errors.invalid?("author_name"), "A topic without an 'important' title should not require an author"
1368
+
1369
+ t.title = "Just a title"
1370
+ assert t.valid?, "A topic with a basic title should be valid"
1371
+
1372
+ t.title = "A very important title"
1373
+ assert !t.valid?, "A topic with an important title, but without an author, should not be valid"
1374
+ assert t.errors.invalid?("author_name"), "A topic with an 'important' title should require an author"
1375
+
1376
+ t.author_name = "Hubert J. Farnsworth"
1377
+ assert t.valid?, "A topic with an important title and author should be valid"
1378
+ end
1379
+
1380
+ private
1381
+ def with_kcode(kcode)
1382
+ if RUBY_VERSION < '1.9'
1383
+ orig_kcode, $KCODE = $KCODE, kcode
1384
+ begin
1385
+ yield
1386
+ ensure
1387
+ $KCODE = orig_kcode
1388
+ end
1389
+ else
1390
+ yield
1391
+ end
1392
+ end
1393
+ end
1394
+
1395
+
1396
+ class ValidatesNumericalityTest < ActiveRecord::TestCase
1397
+ NIL = [nil]
1398
+ BLANK = ["", " ", " \t \r \n"]
1399
+ BIGDECIMAL_STRINGS = %w(12345678901234567890.1234567890) # 30 significent digits
1400
+ FLOAT_STRINGS = %w(0.0 +0.0 -0.0 10.0 10.5 -10.5 -0.0001 -090.1 90.1e1 -90.1e5 -90.1e-5 90e-5)
1401
+ INTEGER_STRINGS = %w(0 +0 -0 10 +10 -10 0090 -090)
1402
+ FLOATS = [0.0, 10.0, 10.5, -10.5, -0.0001] + FLOAT_STRINGS
1403
+ INTEGERS = [0, 10, -10] + INTEGER_STRINGS
1404
+ BIGDECIMAL = BIGDECIMAL_STRINGS.collect! { |bd| BigDecimal.new(bd) }
1405
+ JUNK = ["not a number", "42 not a number", "0xdeadbeef", "00-1", "--3", "+-3", "+3-1", "-+019.0", "12.12.13.12", "123\nnot a number"]
1406
+ INFINITY = [1.0/0.0]
1407
+
1408
+ def setup
1409
+ Topic.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
1410
+ Topic.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
1411
+ Topic.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
1412
+ end
1413
+
1414
+ def test_default_validates_numericality_of
1415
+ Topic.validates_numericality_of :approved
1416
+
1417
+ invalid!(NIL + BLANK + JUNK)
1418
+ valid!(FLOATS + INTEGERS + BIGDECIMAL + INFINITY)
1419
+ end
1420
+
1421
+ def test_validates_numericality_of_with_nil_allowed
1422
+ Topic.validates_numericality_of :approved, :allow_nil => true
1423
+
1424
+ invalid!(BLANK + JUNK)
1425
+ valid!(NIL + FLOATS + INTEGERS + BIGDECIMAL + INFINITY)
1426
+ end
1427
+
1428
+ def test_validates_numericality_of_with_integer_only
1429
+ Topic.validates_numericality_of :approved, :only_integer => true
1430
+
1431
+ invalid!(NIL + BLANK + JUNK + FLOATS + BIGDECIMAL + INFINITY)
1432
+ valid!(INTEGERS)
1433
+ end
1434
+
1435
+ def test_validates_numericality_of_with_integer_only_and_nil_allowed
1436
+ Topic.validates_numericality_of :approved, :only_integer => true, :allow_nil => true
1437
+
1438
+ invalid!(BLANK + JUNK + FLOATS + BIGDECIMAL + INFINITY)
1439
+ valid!(NIL + INTEGERS)
1440
+ end
1441
+
1442
+ def test_validates_numericality_with_greater_than
1443
+ Topic.validates_numericality_of :approved, :greater_than => 10
1444
+
1445
+ invalid!([-10, 10], 'must be greater than 10')
1446
+ valid!([11])
1447
+ end
1448
+
1449
+ def test_validates_numericality_with_greater_than_or_equal
1450
+ Topic.validates_numericality_of :approved, :greater_than_or_equal_to => 10
1451
+
1452
+ invalid!([-9, 9], 'must be greater than or equal to 10')
1453
+ valid!([10])
1454
+ end
1455
+
1456
+ def test_validates_numericality_with_equal_to
1457
+ Topic.validates_numericality_of :approved, :equal_to => 10
1458
+
1459
+ invalid!([-10, 11] + INFINITY, 'must be equal to 10')
1460
+ valid!([10])
1461
+ end
1462
+
1463
+ def test_validates_numericality_with_less_than
1464
+ Topic.validates_numericality_of :approved, :less_than => 10
1465
+
1466
+ invalid!([10], 'must be less than 10')
1467
+ valid!([-9, 9])
1468
+ end
1469
+
1470
+ def test_validates_numericality_with_less_than_or_equal_to
1471
+ Topic.validates_numericality_of :approved, :less_than_or_equal_to => 10
1472
+
1473
+ invalid!([11], 'must be less than or equal to 10')
1474
+ valid!([-10, 10])
1475
+ end
1476
+
1477
+ def test_validates_numericality_with_odd
1478
+ Topic.validates_numericality_of :approved, :odd => true
1479
+
1480
+ invalid!([-2, 2], 'must be odd')
1481
+ valid!([-1, 1])
1482
+ end
1483
+
1484
+ def test_validates_numericality_with_even
1485
+ Topic.validates_numericality_of :approved, :even => true
1486
+
1487
+ invalid!([-1, 1], 'must be even')
1488
+ valid!([-2, 2])
1489
+ end
1490
+
1491
+ def test_validates_numericality_with_greater_than_less_than_and_even
1492
+ Topic.validates_numericality_of :approved, :greater_than => 1, :less_than => 4, :even => true
1493
+
1494
+ invalid!([1, 3, 4])
1495
+ valid!([2])
1496
+ end
1497
+
1498
+ def test_validates_numericality_with_numeric_message
1499
+ Topic.validates_numericality_of :approved, :less_than => 4, :message => "smaller than %d"
1500
+ topic = Topic.new("title" => "numeric test", "approved" => 10)
1501
+
1502
+ assert !topic.valid?
1503
+ assert_equal "smaller than 4", topic.errors.on(:approved)
1504
+
1505
+ Topic.validates_numericality_of :approved, :greater_than => 4, :message => "greater than %d"
1506
+ topic = Topic.new("title" => "numeric test", "approved" => 1)
1507
+
1508
+ assert !topic.valid?
1509
+ assert_equal "greater than 4", topic.errors.on(:approved)
1510
+ end
1511
+
1512
+ private
1513
+ def invalid!(values, error=nil)
1514
+ with_each_topic_approved_value(values) do |topic, value|
1515
+ assert !topic.valid?, "#{value.inspect} not rejected as a number"
1516
+ assert topic.errors.on(:approved)
1517
+ assert_equal error, topic.errors.on(:approved) if error
1518
+ end
1519
+ end
1520
+
1521
+ def valid!(values)
1522
+ with_each_topic_approved_value(values) do |topic, value|
1523
+ assert topic.valid?, "#{value.inspect} not accepted as a number"
1524
+ end
1525
+ end
1526
+
1527
+ def with_each_topic_approved_value(values)
1528
+ topic = Topic.new("title" => "numeric test", "content" => "whatever")
1529
+ values.each do |value|
1530
+ topic.approved = value
1531
+ yield topic, value
1532
+ end
1533
+ end
1534
+ end