radiant 0.8.0 → 0.8.1

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

Potentially problematic release.


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

Files changed (513) hide show
  1. data/CHANGELOG +33 -1
  2. data/CONTRIBUTORS +15 -2
  3. data/INSTALL +9 -7
  4. data/README +11 -7
  5. data/app/controllers/admin/layouts_controller.rb +5 -2
  6. data/app/controllers/admin/pages_controller.rb +8 -5
  7. data/app/controllers/admin/snippets_controller.rb +5 -2
  8. data/app/controllers/application_controller.rb +7 -0
  9. data/app/helpers/admin/node_helper.rb +2 -2
  10. data/app/helpers/application_helper.rb +2 -2
  11. data/app/models/radiant/config.rb +36 -4
  12. data/app/models/standard_tags.rb +1 -1
  13. data/app/views/admin/layouts/index.html.haml +15 -12
  14. data/app/views/admin/page_parts/_page_part.html.haml +2 -2
  15. data/app/views/admin/pages/index.html.haml +1 -1
  16. data/app/views/admin/snippets/_form.html.haml +1 -1
  17. data/app/views/admin/snippets/index.html.haml +14 -10
  18. data/config/database.db2.yml +20 -0
  19. data/config/environment.rb +4 -4
  20. data/config/environments/test.rb +1 -2
  21. data/features/support/env.rb +2 -1
  22. data/lib/generators/extension/extension_generator.rb +5 -0
  23. data/lib/generators/extension/templates/RSpecRakefile +11 -8
  24. data/lib/generators/extension/templates/cucumber.yml +1 -0
  25. data/lib/generators/extension/templates/cucumber_env.rb +16 -0
  26. data/lib/generators/extension/templates/cucumber_paths.rb +14 -0
  27. data/lib/generators/extension/templates/extension.rb +1 -1
  28. data/lib/generators/instance/instance_generator.rb +1 -1
  29. data/lib/generators/instance/templates/databases/db2.yml +40 -0
  30. data/lib/generators/instance/templates/instance_environment.rb +6 -6
  31. data/lib/local_time.rb +3 -9
  32. data/lib/radiant.rb +1 -1
  33. data/lib/radiant/cache.rb +10 -8
  34. data/lib/radiant/extension.rb +36 -0
  35. data/lib/radiant/extension/script.rb +1 -1
  36. data/lib/radiant/extension_loader.rb +5 -1
  37. data/lib/radiant/initializer.rb +52 -4
  38. data/lib/task_support.rb +33 -0
  39. data/lib/tasks/cucumber.rake +5 -1
  40. data/lib/tasks/radiant_config.rake +18 -0
  41. data/lib/tasks/release.rake +1 -0
  42. data/public/javascripts/admin/admin.js +1 -1
  43. data/spec/controllers/admin/layouts_controller_spec.rb +18 -12
  44. data/spec/controllers/admin/pages_controller_spec.rb +35 -29
  45. data/spec/controllers/admin/snippets_controller_spec.rb +11 -5
  46. data/spec/controllers/admin/welcome_controller_spec.rb +1 -1
  47. data/spec/controllers/application_controller_spec.rb +18 -0
  48. data/spec/fixtures/radiant_config.yml +10 -0
  49. data/spec/generators/extension_generator_spec.rb +12 -0
  50. data/spec/helpers/admin/node_helper_spec.rb +6 -0
  51. data/spec/helpers/application_helper_spec.rb +1 -1
  52. data/spec/lib/radiant/extension_loader_spec.rb +17 -0
  53. data/spec/lib/radiant/extension_spec.rb +28 -0
  54. data/spec/lib/radiant/initializer_spec.rb +34 -0
  55. data/spec/lib/task_support_spec.rb +42 -0
  56. data/spec/models/page_spec.rb +6 -2
  57. data/spec/models/radiant/config_spec.rb +42 -1
  58. data/spec/models/standard_tags_spec.rb +2 -2
  59. data/test/fixtures/extensions/01_basic/app/metal/basic_metal.rb +9 -0
  60. data/test/fixtures/extensions/02_overriding/app/metal/basic_metal.rb +9 -0
  61. data/vendor/extensions/textile_filter/textile.html +2 -2
  62. data/vendor/plugins/dataset/CHANGELOG +2 -1
  63. data/vendor/plugins/dataset/Rakefile +3 -0
  64. data/vendor/plugins/dataset/VERSION.yml +2 -2
  65. data/vendor/plugins/dataset/dataset.gemspec +9 -3
  66. data/vendor/plugins/dataset/lib/dataset.rb +3 -0
  67. data/vendor/radius/lib/radius.rb +5 -0
  68. data/vendor/radius/test/radius_test.rb +6 -0
  69. data/vendor/rails/actionmailer/CHANGELOG +8 -0
  70. data/vendor/rails/actionmailer/Rakefile +3 -2
  71. data/vendor/rails/actionmailer/lib/action_mailer/base.rb +2 -1
  72. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +1 -1
  73. data/vendor/rails/actionmailer/test/abstract_unit.rb +0 -3
  74. data/vendor/rails/actionmailer/test/mail_service_test.rb +3 -2
  75. data/vendor/rails/actionpack/CHANGELOG +16 -0
  76. data/vendor/rails/actionpack/Rakefile +5 -3
  77. data/vendor/rails/actionpack/lib/action_controller.rb +2 -7
  78. data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +13 -3
  79. data/vendor/rails/actionpack/lib/action_controller/base.rb +12 -3
  80. data/vendor/rails/actionpack/lib/action_controller/caching.rb +1 -1
  81. data/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +9 -1
  82. data/vendor/rails/actionpack/lib/action_controller/caching/sweeper.rb +45 -0
  83. data/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +0 -42
  84. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +1 -1
  85. data/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +21 -6
  86. data/vendor/rails/actionpack/lib/action_controller/failsafe.rb +40 -6
  87. data/vendor/rails/actionpack/lib/action_controller/flash.rb +11 -3
  88. data/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +7 -3
  89. data/vendor/rails/actionpack/lib/action_controller/integration.rb +5 -12
  90. data/vendor/rails/actionpack/lib/action_controller/middlewares.rb +0 -1
  91. data/vendor/rails/actionpack/lib/action_controller/params_parser.rb +6 -0
  92. data/vendor/rails/actionpack/lib/action_controller/reloader.rb +47 -7
  93. data/vendor/rails/actionpack/lib/action_controller/request.rb +6 -2
  94. data/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +2 -1
  95. data/vendor/rails/actionpack/lib/action_controller/resources.rb +17 -13
  96. data/vendor/rails/actionpack/lib/action_controller/response.rb +8 -2
  97. data/vendor/rails/actionpack/lib/action_controller/routing.rb +3 -0
  98. data/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +20 -6
  99. data/vendor/rails/actionpack/lib/action_controller/streaming.rb +4 -2
  100. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +9 -1
  101. data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +1 -1
  102. data/vendor/rails/actionpack/lib/action_pack/version.rb +1 -1
  103. data/vendor/rails/actionpack/lib/action_view/helpers.rb +1 -1
  104. data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +21 -9
  105. data/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +1 -1
  106. data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +2 -2
  107. data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +26 -12
  108. data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +71 -1
  109. data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +10 -4
  110. data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +1 -1
  111. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +7 -7
  112. data/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +5 -5
  113. data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +1 -1
  114. data/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +23 -14
  115. data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +2 -2
  116. data/vendor/rails/actionpack/lib/action_view/locale/en.yml +4 -0
  117. data/vendor/rails/actionpack/lib/action_view/paths.rb +1 -1
  118. data/vendor/rails/actionpack/lib/action_view/template.rb +22 -33
  119. data/vendor/rails/actionpack/test/abstract_unit.rb +17 -1
  120. data/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +3 -3
  121. data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +27 -0
  122. data/vendor/rails/actionpack/test/controller/caching_test.rb +40 -1
  123. data/vendor/rails/actionpack/test/controller/cookie_test.rb +16 -0
  124. data/vendor/rails/actionpack/test/controller/dispatcher_test.rb +59 -18
  125. data/vendor/rails/actionpack/test/controller/failsafe_test.rb +60 -0
  126. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +3 -1
  127. data/vendor/rails/actionpack/test/controller/flash_test.rb +6 -1
  128. data/vendor/rails/actionpack/test/controller/http_basic_authentication_test.rb +25 -0
  129. data/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +63 -9
  130. data/vendor/rails/actionpack/test/controller/integration_test.rb +31 -3
  131. data/vendor/rails/actionpack/test/controller/rack_test.rb +18 -1
  132. data/vendor/rails/actionpack/test/controller/redirect_test.rb +4 -1
  133. data/vendor/rails/actionpack/test/controller/reloader_test.rb +124 -0
  134. data/vendor/rails/actionpack/test/controller/render_test.rb +19 -9
  135. data/vendor/rails/actionpack/test/controller/request/json_params_parsing_test.rb +24 -4
  136. data/vendor/rails/actionpack/test/controller/request/multipart_params_parsing_test.rb +1 -62
  137. data/vendor/rails/actionpack/test/controller/request/test_request_test.rb +35 -0
  138. data/vendor/rails/actionpack/test/controller/request/url_encoded_params_parsing_test.rb +0 -38
  139. data/vendor/rails/actionpack/test/controller/request/xml_params_parsing_test.rb +15 -0
  140. data/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +6 -5
  141. data/vendor/rails/actionpack/test/controller/request_test.rb +218 -230
  142. data/vendor/rails/actionpack/test/controller/resources_test.rb +52 -0
  143. data/vendor/rails/actionpack/test/controller/routing_test.rb +28 -2
  144. data/vendor/rails/actionpack/test/controller/send_file_test.rb +12 -2
  145. data/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +9 -32
  146. data/vendor/rails/actionpack/test/controller/test_test.rb +8 -0
  147. data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +29 -3
  148. data/vendor/rails/actionpack/test/fixtures/failsafe/500.html +1 -0
  149. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.css +23 -0
  150. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.js +63 -0
  151. data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +1 -1
  152. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +46 -0
  153. data/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +29 -0
  154. data/vendor/rails/actionpack/test/template/form_helper_test.rb +143 -6
  155. data/vendor/rails/actionpack/test/template/form_options_helper_i18n_test.rb +27 -0
  156. data/vendor/rails/actionpack/test/template/form_options_helper_test.rb +56 -0
  157. data/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +23 -6
  158. data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +11 -11
  159. data/vendor/rails/actionpack/test/template/template_test.rb +32 -0
  160. data/vendor/rails/actionpack/test/template/text_helper_test.rb +23 -0
  161. data/vendor/rails/actionpack/test/template/url_helper_test.rb +8 -0
  162. data/vendor/rails/activerecord/CHANGELOG +18 -0
  163. data/vendor/rails/activerecord/Rakefile +26 -9
  164. data/vendor/rails/activerecord/examples/performance.rb +162 -0
  165. data/vendor/rails/activerecord/lib/active_record/associations.rb +104 -35
  166. data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +10 -5
  167. data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +2 -2
  168. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +22 -4
  169. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +5 -1
  170. data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +16 -0
  171. data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +1 -0
  172. data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +13 -3
  173. data/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +15 -9
  174. data/vendor/rails/activerecord/lib/active_record/autosave_association.rb +15 -9
  175. data/vendor/rails/activerecord/lib/active_record/base.rb +34 -31
  176. data/vendor/rails/activerecord/lib/active_record/batches.rb +23 -15
  177. data/vendor/rails/activerecord/lib/active_record/calculations.rb +7 -13
  178. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +16 -2
  179. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +2 -2
  180. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +7 -0
  181. data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +17 -8
  182. data/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +98 -35
  183. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +15 -0
  184. data/vendor/rails/activerecord/lib/active_record/dirty.rb +1 -1
  185. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +14 -11
  186. data/vendor/rails/activerecord/lib/active_record/i18n_interpolation_deprecation.rb +1 -1
  187. data/vendor/rails/activerecord/lib/active_record/locale/en.yml +4 -0
  188. data/vendor/rails/activerecord/lib/active_record/named_scope.rb +3 -8
  189. data/vendor/rails/activerecord/lib/active_record/reflection.rb +1 -1
  190. data/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +6 -3
  191. data/vendor/rails/activerecord/lib/active_record/serialization.rb +3 -2
  192. data/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +10 -18
  193. data/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +6 -2
  194. data/vendor/rails/activerecord/lib/active_record/session_store.rb +9 -1
  195. data/vendor/rails/activerecord/lib/active_record/timestamp.rb +39 -9
  196. data/vendor/rails/activerecord/lib/active_record/validations.rb +149 -80
  197. data/vendor/rails/activerecord/lib/active_record/version.rb +1 -1
  198. data/vendor/rails/activerecord/test/cases/adapter_test.rb +12 -0
  199. data/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +102 -22
  200. data/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +5 -5
  201. data/vendor/rails/activerecord/test/cases/associations/eager_test.rb +12 -0
  202. data/vendor/rails/activerecord/test/cases/associations/habtm_join_table_test.rb +56 -0
  203. data/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +62 -2
  204. data/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +46 -1
  205. data/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +18 -1
  206. data/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +5 -0
  207. data/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +4 -4
  208. data/vendor/rails/activerecord/test/cases/autosave_association_test.rb +22 -0
  209. data/vendor/rails/activerecord/test/cases/base_test.rb +51 -6
  210. data/vendor/rails/activerecord/test/cases/calculations_test.rb +14 -14
  211. data/vendor/rails/activerecord/test/cases/column_definition_test.rb +34 -0
  212. data/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +5 -5
  213. data/vendor/rails/activerecord/test/cases/dirty_test.rb +10 -0
  214. data/vendor/rails/activerecord/test/cases/finder_test.rb +21 -50
  215. data/vendor/rails/activerecord/test/cases/fixtures_test.rb +6 -1
  216. data/vendor/rails/activerecord/test/cases/helper.rb +1 -2
  217. data/vendor/rails/activerecord/test/cases/i18n_test.rb +5 -0
  218. data/vendor/rails/activerecord/test/cases/json_serialization_test.rb +57 -57
  219. data/vendor/rails/activerecord/test/cases/method_scoping_test.rb +14 -4
  220. data/vendor/rails/activerecord/test/cases/migration_test.rb +39 -11
  221. data/vendor/rails/activerecord/test/cases/modules_test.rb +42 -0
  222. data/vendor/rails/activerecord/test/cases/named_scope_test.rb +6 -4
  223. data/vendor/rails/activerecord/test/cases/pk_test.rb +18 -0
  224. data/vendor/rails/activerecord/test/cases/reflection_test.rb +7 -7
  225. data/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +35 -7
  226. data/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +76 -0
  227. data/vendor/rails/activerecord/test/cases/timestamp_test.rb +75 -0
  228. data/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +656 -624
  229. data/vendor/rails/activerecord/test/cases/validations_test.rb +12 -2
  230. data/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +20 -0
  231. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite +0 -0
  232. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  233. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite +0 -0
  234. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  235. data/vendor/rails/activerecord/test/fixtures/posts.yml +3 -0
  236. data/vendor/rails/activerecord/test/models/author.rb +5 -0
  237. data/vendor/rails/activerecord/test/models/comment.rb +5 -1
  238. data/vendor/rails/activerecord/test/models/company.rb +9 -7
  239. data/vendor/rails/activerecord/test/models/company_in_module.rb +1 -1
  240. data/vendor/rails/activerecord/test/models/contract.rb +5 -0
  241. data/vendor/rails/activerecord/test/models/developer.rb +10 -0
  242. data/vendor/rails/activerecord/test/models/essay.rb +3 -0
  243. data/vendor/rails/activerecord/test/models/organization.rb +2 -0
  244. data/vendor/rails/activerecord/test/models/pet.rb +1 -1
  245. data/vendor/rails/activerecord/test/models/project.rb +1 -1
  246. data/vendor/rails/activerecord/test/models/reply.rb +2 -1
  247. data/vendor/rails/activerecord/test/models/topic.rb +1 -2
  248. data/vendor/rails/activerecord/test/models/toy.rb +2 -0
  249. data/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +13 -2
  250. data/vendor/rails/activerecord/test/schema/schema.rb +19 -0
  251. data/vendor/rails/activeresource/CHANGELOG +16 -0
  252. data/vendor/rails/activeresource/Rakefile +3 -2
  253. data/vendor/rails/activeresource/lib/active_resource/base.rb +89 -9
  254. data/vendor/rails/activeresource/lib/active_resource/connection.rb +73 -8
  255. data/vendor/rails/activeresource/lib/active_resource/exceptions.rb +66 -0
  256. data/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +2 -2
  257. data/vendor/rails/activeresource/lib/active_resource/validations.rb +20 -4
  258. data/vendor/rails/activeresource/lib/active_resource/version.rb +1 -1
  259. data/vendor/rails/activeresource/test/abstract_unit.rb +1 -3
  260. data/vendor/rails/activeresource/test/base/load_test.rb +16 -1
  261. data/vendor/rails/activeresource/test/base_errors_test.rb +56 -19
  262. data/vendor/rails/activeresource/test/base_test.rb +147 -0
  263. data/vendor/rails/activeresource/test/connection_test.rb +42 -0
  264. data/vendor/rails/activeresource/test/debug.log +7974 -0
  265. data/vendor/rails/activeresource/test/fixtures/proxy.rb +4 -0
  266. data/vendor/rails/activesupport/CHANGELOG +13 -0
  267. data/vendor/rails/activesupport/lib/active_support/all.rb +8 -0
  268. data/vendor/rails/activesupport/lib/active_support/cache.rb +14 -1
  269. data/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +16 -10
  270. data/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +1 -1
  271. data/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +1 -0
  272. data/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +2 -1
  273. data/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +2 -4
  274. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +14 -4
  275. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +4 -2
  276. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +2 -0
  277. data/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +19 -5
  278. data/vendor/rails/activesupport/lib/active_support/core_ext/module/model_naming.rb +8 -6
  279. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +15 -9
  280. data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +1 -0
  281. data/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +29 -5
  282. data/vendor/rails/activesupport/lib/active_support/core_ext/string/bytesize.rb +5 -0
  283. data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +7 -7
  284. data/vendor/rails/activesupport/lib/active_support/deprecation.rb +9 -9
  285. data/vendor/rails/activesupport/lib/active_support/duration.rb +4 -2
  286. data/vendor/rails/activesupport/lib/active_support/json.rb +1 -22
  287. data/vendor/rails/activesupport/lib/active_support/json/backends/jsongem.rb +38 -0
  288. data/vendor/rails/activesupport/lib/active_support/json/backends/yaml.rb +88 -0
  289. data/vendor/rails/activesupport/lib/active_support/json/decoding.rb +23 -72
  290. data/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +9 -8
  291. data/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +9 -8
  292. data/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +14 -9
  293. data/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +4 -2
  294. data/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +21 -11
  295. data/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +4 -2
  296. data/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +16 -0
  297. data/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +6 -2
  298. data/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +4 -0
  299. data/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +5 -32
  300. data/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +2 -2
  301. data/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +9 -8
  302. data/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +4 -2
  303. data/vendor/rails/activesupport/lib/active_support/json/encoding.rb +80 -9
  304. data/vendor/rails/activesupport/lib/active_support/memoizable.rb +1 -1
  305. data/vendor/rails/activesupport/lib/active_support/message_verifier.rb +16 -3
  306. data/vendor/rails/activesupport/lib/active_support/multibyte.rb +30 -6
  307. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +23 -17
  308. data/vendor/rails/activesupport/lib/active_support/multibyte/utils.rb +61 -0
  309. data/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +28 -0
  310. data/vendor/rails/activesupport/lib/active_support/test_case.rb +9 -8
  311. data/vendor/rails/activesupport/lib/active_support/testing/deprecation.rb +2 -0
  312. data/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +9 -8
  313. data/vendor/rails/activesupport/lib/active_support/vendor.rb +6 -7
  314. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -1
  315. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -1
  316. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -1
  317. data/vendor/rails/activesupport/lib/active_support/vendor/{memcache-client-1.6.5 → memcache-client-1.7.4}/memcache.rb +242 -70
  318. data/vendor/rails/activesupport/lib/active_support/version.rb +1 -1
  319. data/vendor/rails/activesupport/lib/active_support/xml_mini/jdom.rb +162 -0
  320. data/vendor/rails/railties/CHANGELOG +10 -0
  321. data/vendor/rails/railties/Rakefile +13 -9
  322. data/vendor/rails/railties/bin/about +2 -2
  323. data/vendor/rails/railties/bin/console +1 -1
  324. data/vendor/rails/railties/bin/dbconsole +1 -1
  325. data/vendor/rails/railties/bin/destroy +1 -1
  326. data/vendor/rails/railties/bin/generate +1 -1
  327. data/vendor/rails/railties/bin/performance/benchmarker +1 -1
  328. data/vendor/rails/railties/bin/performance/profiler +1 -1
  329. data/vendor/rails/railties/bin/plugin +1 -1
  330. data/vendor/rails/railties/bin/runner +1 -1
  331. data/vendor/rails/railties/bin/server +1 -1
  332. data/vendor/rails/railties/builtin/rails_info/rails/info.rb +4 -2
  333. data/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +2 -0
  334. data/vendor/rails/railties/configs/routes.rb +1 -1
  335. data/vendor/rails/railties/configs/seeds.rb +7 -0
  336. data/vendor/rails/railties/environments/boot.rb +1 -1
  337. data/vendor/rails/railties/guides/files/javascripts/code_highlighter.js +188 -0
  338. data/vendor/rails/railties/guides/files/javascripts/guides.js +8 -0
  339. data/vendor/rails/railties/guides/files/javascripts/highlighters.js +90 -0
  340. data/vendor/rails/railties/guides/files/stylesheets/main.css +441 -0
  341. data/vendor/rails/railties/guides/files/stylesheets/print.css +52 -0
  342. data/vendor/rails/railties/guides/files/stylesheets/reset.css +43 -0
  343. data/vendor/rails/railties/guides/files/stylesheets/style.css +13 -0
  344. data/vendor/rails/railties/guides/files/stylesheets/syntax.css +31 -0
  345. data/vendor/rails/railties/guides/images/belongs_to.png +0 -0
  346. data/vendor/rails/railties/guides/images/book_icon.gif +0 -0
  347. data/vendor/rails/railties/guides/images/bullet.gif +0 -0
  348. data/vendor/rails/railties/guides/images/chapters_icon.gif +0 -0
  349. data/vendor/rails/railties/guides/images/check_bullet.gif +0 -0
  350. data/vendor/rails/railties/guides/images/credits_pic_blank.gif +0 -0
  351. data/vendor/rails/railties/guides/images/csrf.png +0 -0
  352. data/vendor/rails/railties/guides/images/customized_error_messages.png +0 -0
  353. data/vendor/rails/railties/guides/images/error_messages.png +0 -0
  354. data/vendor/rails/railties/guides/images/feature_tile.gif +0 -0
  355. data/vendor/rails/railties/guides/images/footer_tile.gif +0 -0
  356. data/vendor/rails/railties/guides/images/fxn.jpg +0 -0
  357. data/vendor/rails/railties/guides/images/grey_bullet.gif +0 -0
  358. data/vendor/rails/railties/guides/images/habtm.png +0 -0
  359. data/vendor/rails/railties/guides/images/has_many.png +0 -0
  360. data/vendor/rails/railties/guides/images/has_many_through.png +0 -0
  361. data/vendor/rails/railties/guides/images/has_one.png +0 -0
  362. data/vendor/rails/railties/guides/images/has_one_through.png +0 -0
  363. data/vendor/rails/railties/guides/images/header_backdrop.png +0 -0
  364. data/vendor/rails/railties/guides/images/header_tile.gif +0 -0
  365. data/vendor/rails/railties/guides/images/i18n/demo_localized_pirate.png +0 -0
  366. data/vendor/rails/railties/guides/images/i18n/demo_translated_en.png +0 -0
  367. data/vendor/rails/railties/guides/images/i18n/demo_translated_pirate.png +0 -0
  368. data/vendor/rails/railties/guides/images/i18n/demo_translation_missing.png +0 -0
  369. data/vendor/rails/railties/guides/images/i18n/demo_untranslated.png +0 -0
  370. data/vendor/rails/railties/guides/images/icons/README +5 -0
  371. data/vendor/rails/railties/guides/images/icons/callouts/1.png +0 -0
  372. data/vendor/rails/railties/guides/images/icons/callouts/10.png +0 -0
  373. data/vendor/rails/railties/guides/images/icons/callouts/11.png +0 -0
  374. data/vendor/rails/railties/guides/images/icons/callouts/12.png +0 -0
  375. data/vendor/rails/railties/guides/images/icons/callouts/13.png +0 -0
  376. data/vendor/rails/railties/guides/images/icons/callouts/14.png +0 -0
  377. data/vendor/rails/railties/guides/images/icons/callouts/15.png +0 -0
  378. data/vendor/rails/railties/guides/images/icons/callouts/2.png +0 -0
  379. data/vendor/rails/railties/guides/images/icons/callouts/3.png +0 -0
  380. data/vendor/rails/railties/guides/images/icons/callouts/4.png +0 -0
  381. data/vendor/rails/railties/guides/images/icons/callouts/5.png +0 -0
  382. data/vendor/rails/railties/guides/images/icons/callouts/6.png +0 -0
  383. data/vendor/rails/railties/guides/images/icons/callouts/7.png +0 -0
  384. data/vendor/rails/railties/guides/images/icons/callouts/8.png +0 -0
  385. data/vendor/rails/railties/guides/images/icons/callouts/9.png +0 -0
  386. data/vendor/rails/railties/guides/images/icons/caution.png +0 -0
  387. data/vendor/rails/railties/guides/images/icons/example.png +0 -0
  388. data/vendor/rails/railties/guides/images/icons/home.png +0 -0
  389. data/vendor/rails/railties/guides/images/icons/important.png +0 -0
  390. data/vendor/rails/railties/guides/images/icons/next.png +0 -0
  391. data/vendor/rails/railties/guides/images/icons/note.png +0 -0
  392. data/vendor/rails/railties/guides/images/icons/prev.png +0 -0
  393. data/vendor/rails/railties/guides/images/icons/tip.png +0 -0
  394. data/vendor/rails/railties/guides/images/icons/up.png +0 -0
  395. data/vendor/rails/railties/guides/images/icons/warning.png +0 -0
  396. data/vendor/rails/railties/guides/images/nav_arrow.gif +0 -0
  397. data/vendor/rails/railties/guides/images/polymorphic.png +0 -0
  398. data/vendor/rails/railties/guides/images/posts_index.png +0 -0
  399. data/vendor/rails/railties/guides/images/rails_guides_logo.gif +0 -0
  400. data/vendor/rails/railties/guides/images/rails_logo_remix.gif +0 -0
  401. data/vendor/rails/railties/guides/images/rails_welcome.png +0 -0
  402. data/vendor/rails/railties/guides/images/session_fixation.png +0 -0
  403. data/vendor/rails/railties/guides/images/tab_grey.gif +0 -0
  404. data/vendor/rails/railties/guides/images/tab_info.gif +0 -0
  405. data/vendor/rails/railties/guides/images/tab_note.gif +0 -0
  406. data/vendor/rails/railties/guides/images/tab_red.gif +0 -0
  407. data/vendor/rails/railties/guides/images/tab_yellow.gif +0 -0
  408. data/vendor/rails/railties/guides/images/tab_yellow.png +0 -0
  409. data/vendor/rails/railties/guides/images/validation_error_messages.png +0 -0
  410. data/vendor/rails/railties/guides/rails_guides.rb +42 -0
  411. data/vendor/rails/railties/guides/rails_guides/generator.rb +138 -0
  412. data/vendor/rails/railties/guides/rails_guides/helpers.rb +34 -0
  413. data/vendor/rails/railties/guides/rails_guides/indexer.rb +55 -0
  414. data/vendor/rails/railties/guides/rails_guides/textile_extensions.rb +41 -0
  415. data/vendor/rails/railties/guides/source/2_2_release_notes.textile +422 -0
  416. data/vendor/rails/railties/guides/source/2_3_release_notes.textile +610 -0
  417. data/vendor/rails/railties/guides/source/action_controller_overview.textile +776 -0
  418. data/vendor/rails/railties/guides/source/action_mailer_basics.textile +424 -0
  419. data/vendor/rails/railties/guides/source/active_record_basics.textile +135 -0
  420. data/vendor/rails/railties/guides/source/active_record_querying.textile +969 -0
  421. data/vendor/rails/railties/guides/source/activerecord_validations_callbacks.textile +1086 -0
  422. data/vendor/rails/railties/guides/source/association_basics.textile +1781 -0
  423. data/vendor/rails/railties/guides/source/caching_with_rails.textile +524 -0
  424. data/vendor/rails/railties/guides/source/command_line.textile +589 -0
  425. data/vendor/rails/railties/guides/source/configuring.textile +234 -0
  426. data/vendor/rails/railties/guides/source/contribute.textile +71 -0
  427. data/vendor/rails/railties/guides/source/contributing_to_rails.textile +239 -0
  428. data/vendor/rails/railties/guides/source/credits.erb.textile +52 -0
  429. data/vendor/rails/railties/guides/source/debugging_rails_applications.textile +709 -0
  430. data/vendor/rails/railties/guides/source/form_helpers.textile +766 -0
  431. data/vendor/rails/railties/guides/source/getting_started.textile +1297 -0
  432. data/vendor/rails/railties/guides/source/i18n.textile +912 -0
  433. data/vendor/rails/railties/guides/source/index.erb.textile +124 -0
  434. data/vendor/rails/railties/guides/source/layout.html.erb +103 -0
  435. data/vendor/rails/railties/guides/source/layouts_and_rendering.textile +979 -0
  436. data/vendor/rails/railties/guides/source/migrations.textile +591 -0
  437. data/vendor/rails/railties/guides/source/nested_model_forms.textile +222 -0
  438. data/vendor/rails/railties/guides/source/performance_testing.textile +531 -0
  439. data/vendor/rails/railties/guides/source/plugins.textile +1512 -0
  440. data/vendor/rails/railties/guides/source/rails_on_rack.textile +309 -0
  441. data/vendor/rails/railties/guides/source/routing.textile +903 -0
  442. data/vendor/rails/railties/guides/source/security.textile +986 -0
  443. data/vendor/rails/railties/guides/source/testing.textile +951 -0
  444. data/vendor/rails/railties/lib/commands/dbconsole.rb +8 -4
  445. data/vendor/rails/railties/lib/commands/performance/profiler.rb +1 -1
  446. data/vendor/rails/railties/lib/initializer.rb +27 -4
  447. data/vendor/rails/railties/lib/rails/gem_dependency.rb +35 -6
  448. data/vendor/rails/railties/lib/rails/plugin.rb +12 -0
  449. data/vendor/rails/railties/lib/rails/plugin/loader.rb +7 -0
  450. data/vendor/rails/railties/lib/rails/rack/metal.rb +1 -1
  451. data/vendor/rails/railties/lib/rails/version.rb +1 -1
  452. data/vendor/rails/railties/lib/rails_generator/base.rb +1 -1
  453. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +5 -0
  454. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/template_runner.rb +1 -1
  455. data/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +9 -2
  456. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +1 -0
  457. data/vendor/rails/railties/lib/tasks/databases.rake +17 -4
  458. data/vendor/rails/railties/lib/tasks/gems.rake +19 -6
  459. data/vendor/rails/railties/lib/tasks/routes.rake +4 -3
  460. data/vendor/rails/railties/lib/test_help.rb +4 -1
  461. metadata +158 -58
  462. data/spec/lib/local_time_spec.rb +0 -40
  463. data/vendor/rails/actionpack/lib/action_controller/rewindable_input.rb +0 -28
  464. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack.rb +0 -89
  465. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/adapter/camping.rb +0 -22
  466. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/handler.rb +0 -37
  467. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/abstract/request.rb +0 -37
  468. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/basic.rb +0 -58
  469. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/md5.rb +0 -124
  470. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/nonce.rb +0 -51
  471. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/params.rb +0 -55
  472. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/digest/request.rb +0 -40
  473. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/auth/openid.rb +0 -480
  474. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/builder.rb +0 -63
  475. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/cascade.rb +0 -36
  476. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/chunked.rb +0 -49
  477. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/commonlogger.rb +0 -61
  478. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/conditionalget.rb +0 -45
  479. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_length.rb +0 -29
  480. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/content_type.rb +0 -23
  481. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/deflater.rb +0 -85
  482. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/directory.rb +0 -153
  483. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/file.rb +0 -88
  484. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler.rb +0 -48
  485. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/cgi.rb +0 -61
  486. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/evented_mongrel.rb +0 -8
  487. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/fastcgi.rb +0 -89
  488. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/lsws.rb +0 -55
  489. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb +0 -84
  490. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/scgi.rb +0 -59
  491. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/swiftiplied_mongrel.rb +0 -8
  492. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/thin.rb +0 -18
  493. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/handler/webrick.rb +0 -67
  494. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/head.rb +0 -19
  495. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lint.rb +0 -462
  496. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lobster.rb +0 -65
  497. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/lock.rb +0 -16
  498. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/methodoverride.rb +0 -27
  499. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mime.rb +0 -204
  500. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/mock.rb +0 -160
  501. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/recursive.rb +0 -57
  502. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/reloader.rb +0 -64
  503. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/request.rb +0 -241
  504. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/response.rb +0 -179
  505. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/abstract/id.rb +0 -142
  506. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/cookie.rb +0 -91
  507. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/memcache.rb +0 -109
  508. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/session/pool.rb +0 -100
  509. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showexceptions.rb +0 -349
  510. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/showstatus.rb +0 -106
  511. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/static.rb +0 -38
  512. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/urlmap.rb +0 -55
  513. data/vendor/rails/actionpack/lib/action_controller/vendor/rack-1.0/rack/utils.rb +0 -392
@@ -26,6 +26,14 @@ module ActiveResource
26
26
  def to_s; @message ;end
27
27
  end
28
28
 
29
+ # Raised when a OpenSSL::SSL::SSLError occurs.
30
+ class SSLError < ConnectionError
31
+ def initialize(message)
32
+ @message = message
33
+ end
34
+ def to_s; @message ;end
35
+ end
36
+
29
37
  # 3xx Redirection
30
38
  class Redirection < ConnectionError # :nodoc:
31
39
  def to_s; response['Location'] ? "#{super} => #{response['Location']}" : super; end
@@ -49,6 +57,9 @@ module ActiveResource
49
57
  # 409 Conflict
50
58
  class ResourceConflict < ClientError; end # :nodoc:
51
59
 
60
+ # 410 Gone
61
+ class ResourceGone < ClientError; end # :nodoc:
62
+
52
63
  # 5xx Server Error
53
64
  class ServerError < ConnectionError; end # :nodoc:
54
65
 
@@ -67,10 +78,11 @@ module ActiveResource
67
78
  HTTP_FORMAT_HEADER_NAMES = { :get => 'Accept',
68
79
  :put => 'Content-Type',
69
80
  :post => 'Content-Type',
70
- :delete => 'Accept'
81
+ :delete => 'Accept',
82
+ :head => 'Accept'
71
83
  }
72
84
 
73
- attr_reader :site, :user, :password, :timeout
85
+ attr_reader :site, :user, :password, :timeout, :proxy, :ssl_options
74
86
  attr_accessor :format
75
87
 
76
88
  class << self
@@ -95,7 +107,12 @@ module ActiveResource
95
107
  @password = URI.decode(@site.password) if @site.password
96
108
  end
97
109
 
98
- # Set user for remote service.
110
+ # Set the proxy for remote service.
111
+ def proxy=(proxy)
112
+ @proxy = proxy.is_a?(URI) ? proxy : URI.parse(proxy)
113
+ end
114
+
115
+ # Set the user for remote service.
99
116
  def user=(user)
100
117
  @user = user
101
118
  end
@@ -110,6 +127,11 @@ module ActiveResource
110
127
  @timeout = timeout
111
128
  end
112
129
 
130
+ # Hash of options applied to Net::HTTP instance when +site+ protocol is 'https'.
131
+ def ssl_options=(opts={})
132
+ @ssl_options = opts
133
+ end
134
+
113
135
  # Execute a GET request.
114
136
  # Used to get (find) resources.
115
137
  def get(path, headers = {})
@@ -137,7 +159,7 @@ module ActiveResource
137
159
  # Execute a HEAD request.
138
160
  # Used to obtain meta-information about resources, such as whether they exist and their size (via response headers).
139
161
  def head(path, headers = {})
140
- request(:head, path, build_request_headers(headers))
162
+ request(:head, path, build_request_headers(headers, :head))
141
163
  end
142
164
 
143
165
 
@@ -151,6 +173,8 @@ module ActiveResource
151
173
  handle_response(result)
152
174
  rescue Timeout::Error => e
153
175
  raise TimeoutError.new(e.message)
176
+ rescue OpenSSL::SSL::SSLError => e
177
+ raise SSLError.new(e.message)
154
178
  end
155
179
 
156
180
  # Handles response and error codes from remote service.
@@ -172,6 +196,8 @@ module ActiveResource
172
196
  raise(MethodNotAllowed.new(response))
173
197
  when 409
174
198
  raise(ResourceConflict.new(response))
199
+ when 410
200
+ raise(ResourceGone.new(response))
175
201
  when 422
176
202
  raise(ResourceInvalid.new(response))
177
203
  when 401...500
@@ -186,10 +212,49 @@ module ActiveResource
186
212
  # Creates new Net::HTTP instance for communication with
187
213
  # remote service and resources.
188
214
  def http
189
- http = Net::HTTP.new(@site.host, @site.port)
190
- http.use_ssl = @site.is_a?(URI::HTTPS)
191
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl
192
- http.read_timeout = @timeout if @timeout # If timeout is not set, the default Net::HTTP timeout (60s) is used.
215
+ configure_http(new_http)
216
+ end
217
+
218
+ def new_http
219
+ if @proxy
220
+ Net::HTTP.new(@site.host, @site.port, @proxy.host, @proxy.port, @proxy.user, @proxy.password)
221
+ else
222
+ Net::HTTP.new(@site.host, @site.port)
223
+ end
224
+ end
225
+
226
+ def configure_http(http)
227
+ http = apply_ssl_options(http)
228
+
229
+ # Net::HTTP timeouts default to 60 seconds.
230
+ if @timeout
231
+ http.open_timeout = @timeout
232
+ http.read_timeout = @timeout
233
+ end
234
+
235
+ http
236
+ end
237
+
238
+ def apply_ssl_options(http)
239
+ return http unless @site.is_a?(URI::HTTPS)
240
+
241
+ http.use_ssl = true
242
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
243
+ return http unless defined?(@ssl_options)
244
+
245
+ http.ca_path = @ssl_options[:ca_path] if @ssl_options[:ca_path]
246
+ http.ca_file = @ssl_options[:ca_file] if @ssl_options[:ca_file]
247
+
248
+ http.cert = @ssl_options[:cert] if @ssl_options[:cert]
249
+ http.key = @ssl_options[:key] if @ssl_options[:key]
250
+
251
+ http.cert_store = @ssl_options[:cert_store] if @ssl_options[:cert_store]
252
+ http.ssl_timeout = @ssl_options[:ssl_timeout] if @ssl_options[:ssl_timeout]
253
+
254
+ http.verify_mode = @ssl_options[:verify_mode] if @ssl_options[:verify_mode]
255
+ http.verify_callback = @ssl_options[:verify_callback] if @ssl_options[:verify_callback]
256
+ http.verify_depth = @ssl_options[:verify_depth] if @ssl_options[:verify_depth]
257
+
193
258
  http
194
259
  end
195
260
 
@@ -0,0 +1,66 @@
1
+ module ActiveResource
2
+ class ConnectionError < StandardError # :nodoc:
3
+ attr_reader :response
4
+
5
+ def initialize(response, message = nil)
6
+ @response = response
7
+ @message = message
8
+ end
9
+
10
+ def to_s
11
+ "Failed with #{response.code} #{response.message if response.respond_to?(:message)}"
12
+ end
13
+ end
14
+
15
+ # Raised when a Timeout::Error occurs.
16
+ class TimeoutError < ConnectionError
17
+ def initialize(message)
18
+ @message = message
19
+ end
20
+ def to_s; @message ;end
21
+ end
22
+
23
+ # Raised when a OpenSSL::SSL::SSLError occurs.
24
+ class SSLError < ConnectionError
25
+ def initialize(message)
26
+ @message = message
27
+ end
28
+ def to_s; @message ;end
29
+ end
30
+
31
+ # 3xx Redirection
32
+ class Redirection < ConnectionError # :nodoc:
33
+ def to_s; response['Location'] ? "#{super} => #{response['Location']}" : super; end
34
+ end
35
+
36
+ # 4xx Client Error
37
+ class ClientError < ConnectionError; end # :nodoc:
38
+
39
+ # 400 Bad Request
40
+ class BadRequest < ClientError; end # :nodoc
41
+
42
+ # 401 Unauthorized
43
+ class UnauthorizedAccess < ClientError; end # :nodoc
44
+
45
+ # 403 Forbidden
46
+ class ForbiddenAccess < ClientError; end # :nodoc
47
+
48
+ # 404 Not Found
49
+ class ResourceNotFound < ClientError; end # :nodoc:
50
+
51
+ # 409 Conflict
52
+ class ResourceConflict < ClientError; end # :nodoc:
53
+
54
+ # 410 Gone
55
+ class ResourceGone < ClientError; end # :nodoc:
56
+
57
+ # 5xx Server Error
58
+ class ServerError < ConnectionError; end # :nodoc:
59
+
60
+ # 405 Method Not Allowed
61
+ class MethodNotAllowed < ClientError # :nodoc:
62
+ def allowed_methods
63
+ @response['Allow'].split(',').map { |verb| verb.strip.downcase.to_sym }
64
+ end
65
+ end
66
+ end
@@ -11,8 +11,8 @@ module ActiveResource
11
11
  "application/json"
12
12
  end
13
13
 
14
- def encode(hash, options={})
15
- hash.to_json(options)
14
+ def encode(hash, options = nil)
15
+ ActiveSupport::JSON.encode(hash, options)
16
16
  end
17
17
 
18
18
  def decode(json)
@@ -199,11 +199,10 @@ module ActiveResource
199
199
  alias_method :count, :size
200
200
  alias_method :length, :size
201
201
 
202
- # Grabs errors from the XML response.
203
- def from_xml(xml)
202
+ # Grabs errors from an array of messages (like ActiveRecord::Validations)
203
+ def from_array(messages)
204
204
  clear
205
205
  humanized_attributes = @base.attributes.keys.inject({}) { |h, attr_name| h.update(attr_name.humanize => attr_name) }
206
- messages = Array.wrap(Hash.from_xml(xml)['errors']['error']) rescue []
207
206
  messages.each do |message|
208
207
  attr_message = humanized_attributes.keys.detect do |attr_name|
209
208
  if message[0, attr_name.size + 1] == "#{attr_name} "
@@ -214,6 +213,18 @@ module ActiveResource
214
213
  add_to_base message if attr_message.nil?
215
214
  end
216
215
  end
216
+
217
+ # Grabs errors from the json response.
218
+ def from_json(json)
219
+ array = ActiveSupport::JSON.decode(json)['errors'] rescue []
220
+ from_array array
221
+ end
222
+
223
+ # Grabs errors from the XML response.
224
+ def from_xml(xml)
225
+ array = Array.wrap(Hash.from_xml(xml)['errors']['error']) rescue []
226
+ from_array array
227
+ end
217
228
  end
218
229
 
219
230
  # Module to support validation and errors with Active Resource objects. The module overrides
@@ -248,7 +259,12 @@ module ActiveResource
248
259
  save_without_validation
249
260
  true
250
261
  rescue ResourceInvalid => error
251
- errors.from_xml(error.response.body)
262
+ case error.response['Content-Type']
263
+ when 'application/xml'
264
+ errors.from_xml(error.response.body)
265
+ when 'application/json'
266
+ errors.from_json(error.response.body)
267
+ end
252
268
  false
253
269
  end
254
270
 
@@ -2,7 +2,7 @@ module ActiveResource
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 2
4
4
  MINOR = 3
5
- TINY = 2
5
+ TINY = 4
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -1,8 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
-
4
- gem 'mocha', '>= 0.9.5'
5
- require 'mocha'
3
+ require 'active_support/test_case'
6
4
 
7
5
  $:.unshift "#{File.dirname(__FILE__)}/../lib"
8
6
  $:.unshift "#{File.dirname(__FILE__)}/../../activesupport/lib"
@@ -49,7 +49,9 @@ class BaseLoadTest < Test::Unit::TestCase
49
49
  :id => 1, :state => { :id => 1, :name => 'Oregon',
50
50
  :notable_rivers => [
51
51
  { :id => 1, :name => 'Willamette' },
52
- { :id => 2, :name => 'Columbia', :rafted_by => @matz }] }}}
52
+ { :id => 2, :name => 'Columbia', :rafted_by => @matz }],
53
+ :postal_codes => [ 97018, 1234567890 ],
54
+ :places => [ "Columbia City", "Unknown" ]}}}
53
55
 
54
56
  @person = Person.new
55
57
  end
@@ -125,6 +127,19 @@ class BaseLoadTest < Test::Unit::TestCase
125
127
  assert_kind_of Person::Street::State::NotableRiver, rivers.first
126
128
  assert_equal @deep[:street][:state][:notable_rivers].first[:id], rivers.first.id
127
129
  assert_equal @matz[:id], rivers.last.rafted_by.id
130
+
131
+ postal_codes = state.postal_codes
132
+ assert_kind_of Array, postal_codes
133
+ assert_equal 2, postal_codes.size
134
+ assert_kind_of Fixnum, postal_codes.first
135
+ assert_equal @deep[:street][:state][:postal_codes].first, postal_codes.first
136
+ assert_kind_of Numeric, postal_codes.last
137
+ assert_equal @deep[:street][:state][:postal_codes].last, postal_codes.last
138
+
139
+ places = state.places
140
+ assert_kind_of Array, places
141
+ assert_kind_of String, places.first
142
+ assert_equal @deep[:street][:state][:places].first, places.first
128
143
  end
129
144
 
130
145
  def test_nested_collections_within_the_same_namespace
@@ -4,45 +4,82 @@ require "fixtures/person"
4
4
  class BaseErrorsTest < Test::Unit::TestCase
5
5
  def setup
6
6
  ActiveResource::HttpMock.respond_to do |mock|
7
- mock.post "/people.xml", {}, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error></errors>", 422
7
+ mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error></errors>), 422, {'Content-Type' => 'application/xml'}
8
+ mock.post "/people.json", {}, %q({"errors":["Age can't be blank","Name can't be blank","Name must start with a letter","Person quota full for today."]}), 422, {'Content-Type' => 'application/json'}
8
9
  end
9
10
  @person = Person.new(:name => '', :age => '')
10
11
  assert_equal @person.save, false
11
12
  end
12
13
 
13
14
  def test_should_mark_as_invalid
14
- assert !@person.valid?
15
+ [ :json, :xml ].each do |format|
16
+ invalid_user_using_format(format) do
17
+ assert !@person.valid?
18
+ end
19
+ end
15
20
  end
16
21
 
17
22
  def test_should_parse_xml_errors
18
- assert_kind_of ActiveResource::Errors, @person.errors
19
- assert_equal 4, @person.errors.size
23
+ [ :json, :xml ].each do |format|
24
+ invalid_user_using_format(format) do
25
+ assert_kind_of ActiveResource::Errors, @person.errors
26
+ assert_equal 4, @person.errors.size
27
+ end
28
+ end
20
29
  end
21
30
 
22
31
  def test_should_parse_errors_to_individual_attributes
23
- assert @person.errors.invalid?(:name)
24
- assert_equal "can't be blank", @person.errors.on(:age)
25
- assert_equal ["can't be blank", "must start with a letter"], @person.errors[:name]
26
- assert_equal "Person quota full for today.", @person.errors.on_base
32
+ [ :json, :xml ].each do |format|
33
+ invalid_user_using_format(format) do
34
+ assert @person.errors[:name].any?
35
+ assert_equal "can't be blank", @person.errors[:age]
36
+ assert_equal ["can't be blank", "must start with a letter"], @person.errors[:name]
37
+ assert_equal "Person quota full for today.", @person.errors[:base]
38
+ end
39
+ end
27
40
  end
28
41
 
29
42
  def test_should_iterate_over_errors
30
- errors = []
31
- @person.errors.each { |attribute, message| errors << [attribute, message] }
32
- assert errors.include?(["name", "can't be blank"])
43
+ [ :json, :xml ].each do |format|
44
+ invalid_user_using_format(format) do
45
+ errors = []
46
+ @person.errors.each { |attribute, message| errors << [attribute, message] }
47
+ assert errors.include?(['name', "can't be blank"])
48
+ end
49
+ end
33
50
  end
34
51
 
35
52
  def test_should_iterate_over_full_errors
36
- errors = []
37
- @person.errors.each_full { |message| errors << message }
38
- assert errors.include?("Name can't be blank")
53
+ [ :json, :xml ].each do |format|
54
+ invalid_user_using_format(format) do
55
+ errors = []
56
+ @person.errors.to_a.each { |message| errors << message }
57
+ assert errors.include?(["name", "can't be blank"])
58
+ end
59
+ end
39
60
  end
40
61
 
41
62
  def test_should_format_full_errors
42
- full = @person.errors.full_messages
43
- assert full.include?("Age can't be blank")
44
- assert full.include?("Name can't be blank")
45
- assert full.include?("Name must start with a letter")
46
- assert full.include?("Person quota full for today.")
63
+ [ :json, :xml ].each do |format|
64
+ invalid_user_using_format(format) do
65
+ full = @person.errors.full_messages
66
+ assert full.include?("Age can't be blank")
67
+ assert full.include?("Name can't be blank")
68
+ assert full.include?("Name must start with a letter")
69
+ assert full.include?("Person quota full for today.")
70
+ end
71
+ end
72
+ end
73
+
74
+ private
75
+ def invalid_user_using_format(mime_type_reference)
76
+ previous_format = Person.format
77
+ Person.format = mime_type_reference
78
+ @person = Person.new(:name => '', :age => '')
79
+ assert_equal false, @person.save
80
+
81
+ yield
82
+ ensure
83
+ Person.format = previous_format
47
84
  end
48
85
  end
@@ -3,6 +3,7 @@ require "fixtures/person"
3
3
  require "fixtures/customer"
4
4
  require "fixtures/street_address"
5
5
  require "fixtures/beast"
6
+ require "fixtures/proxy"
6
7
 
7
8
  class BaseTest < Test::Unit::TestCase
8
9
  def setup
@@ -124,6 +125,28 @@ class BaseTest < Test::Unit::TestCase
124
125
  assert_nil actor.site
125
126
  end
126
127
 
128
+ def test_proxy_accessor_accepts_uri_or_string_argument
129
+ proxy = URI.parse('http://localhost')
130
+
131
+ assert_nothing_raised { Person.proxy = 'http://localhost' }
132
+ assert_equal proxy, Person.proxy
133
+
134
+ assert_nothing_raised { Person.proxy = proxy }
135
+ assert_equal proxy, Person.proxy
136
+ end
137
+
138
+ def test_should_use_proxy_prefix_and_credentials
139
+ assert_equal 'http://user:password@proxy.local:3000', ProxyResource.proxy.to_s
140
+ end
141
+
142
+ def test_proxy_variable_can_be_reset
143
+ actor = Class.new(ActiveResource::Base)
144
+ assert_nil actor.site
145
+ actor.proxy = 'http://localhost:31337'
146
+ actor.proxy = nil
147
+ assert_nil actor.site
148
+ end
149
+
127
150
  def test_should_accept_setting_user
128
151
  Forum.user = 'david'
129
152
  assert_equal('david', Forum.user)
@@ -142,6 +165,13 @@ class BaseTest < Test::Unit::TestCase
142
165
  assert_equal(5, Forum.connection.timeout)
143
166
  end
144
167
 
168
+ def test_should_accept_setting_ssl_options
169
+ expected = {:verify => 1}
170
+ Forum.ssl_options= expected
171
+ assert_equal(expected, Forum.ssl_options)
172
+ assert_equal(expected, Forum.connection.ssl_options)
173
+ end
174
+
145
175
  def test_user_variable_can_be_reset
146
176
  actor = Class.new(ActiveResource::Base)
147
177
  actor.site = 'http://cinema'
@@ -172,6 +202,16 @@ class BaseTest < Test::Unit::TestCase
172
202
  assert_nil actor.connection.timeout
173
203
  end
174
204
 
205
+ def test_ssl_options_hash_can_be_reset
206
+ actor = Class.new(ActiveResource::Base)
207
+ actor.site = 'https://cinema'
208
+ assert_nil actor.ssl_options
209
+ actor.ssl_options = {:foo => 5}
210
+ actor.ssl_options = nil
211
+ assert_nil actor.ssl_options
212
+ assert_nil actor.connection.ssl_options
213
+ end
214
+
175
215
  def test_credentials_from_site_are_decoded
176
216
  actor = Class.new(ActiveResource::Base)
177
217
  actor.site = 'http://my%40email.com:%31%32%33@cinema'
@@ -220,6 +260,47 @@ class BaseTest < Test::Unit::TestCase
220
260
  assert_equal fruit.site, apple.site, 'subclass did not adopt changes from parent class'
221
261
  end
222
262
 
263
+ def test_proxy_reader_uses_superclass_site_until_written
264
+ # Superclass is Object so returns nil.
265
+ assert_nil ActiveResource::Base.proxy
266
+ assert_nil Class.new(ActiveResource::Base).proxy
267
+
268
+ # Subclass uses superclass proxy.
269
+ actor = Class.new(Person)
270
+ assert_equal Person.proxy, actor.proxy
271
+
272
+ # Subclass returns frozen superclass copy.
273
+ assert !Person.proxy.frozen?
274
+ assert actor.proxy.frozen?
275
+
276
+ # Changing subclass proxy doesn't change superclass site.
277
+ actor.proxy = 'http://localhost:31337'
278
+ assert_not_equal Person.proxy, actor.proxy
279
+
280
+ # Changed subclass proxy is not frozen.
281
+ assert !actor.proxy.frozen?
282
+
283
+ # Changing superclass proxy doesn't overwrite subclass site.
284
+ Person.proxy = 'http://somewhere.else'
285
+ assert_not_equal Person.proxy, actor.proxy
286
+
287
+ # Changing superclass proxy after subclassing changes subclass site.
288
+ jester = Class.new(actor)
289
+ actor.proxy = 'http://nomad'
290
+ assert_equal actor.proxy, jester.proxy
291
+ assert jester.proxy.frozen?
292
+
293
+ # Subclasses are always equal to superclass proxy when not overridden
294
+ fruit = Class.new(ActiveResource::Base)
295
+ apple = Class.new(fruit)
296
+
297
+ fruit.proxy = 'http://market'
298
+ assert_equal fruit.proxy, apple.proxy, 'subclass did not adopt changes from parent class'
299
+
300
+ fruit.proxy = 'http://supermarket'
301
+ assert_equal fruit.proxy, apple.proxy, 'subclass did not adopt changes from parent class'
302
+ end
303
+
223
304
  def test_user_reader_uses_superclass_user_until_written
224
305
  # Superclass is Object so returns nil.
225
306
  assert_nil ActiveResource::Base.user
@@ -330,6 +411,40 @@ class BaseTest < Test::Unit::TestCase
330
411
  assert_equal fruit.timeout, apple.timeout, 'subclass did not adopt changes from parent class'
331
412
  end
332
413
 
414
+ def test_ssl_options_reader_uses_superclass_ssl_options_until_written
415
+ # Superclass is Object so returns nil.
416
+ assert_nil ActiveResource::Base.ssl_options
417
+ assert_nil Class.new(ActiveResource::Base).ssl_options
418
+ Person.ssl_options = {:foo => 'bar'}
419
+
420
+ # Subclass uses superclass ssl_options.
421
+ actor = Class.new(Person)
422
+ assert_equal Person.ssl_options, actor.ssl_options
423
+
424
+ # Changing subclass ssl_options doesn't change superclass ssl_options.
425
+ actor.ssl_options = {:baz => ''}
426
+ assert_not_equal Person.ssl_options, actor.ssl_options
427
+
428
+ # Changing superclass ssl_options doesn't overwrite subclass ssl_options.
429
+ Person.ssl_options = {:color => 'blue'}
430
+ assert_not_equal Person.ssl_options, actor.ssl_options
431
+
432
+ # Changing superclass ssl_options after subclassing changes subclass ssl_options.
433
+ jester = Class.new(actor)
434
+ actor.ssl_options = {:color => 'red'}
435
+ assert_equal actor.ssl_options, jester.ssl_options
436
+
437
+ # Subclasses are always equal to superclass ssl_options when not overridden.
438
+ fruit = Class.new(ActiveResource::Base)
439
+ apple = Class.new(fruit)
440
+
441
+ fruit.ssl_options = {:alpha => 'betas'}
442
+ assert_equal fruit.ssl_options, apple.ssl_options, 'subclass did not adopt changes from parent class'
443
+
444
+ fruit.ssl_options = {:omega => 'moos'}
445
+ assert_equal fruit.ssl_options, apple.ssl_options, 'subclass did not adopt changes from parent class'
446
+ end
447
+
333
448
  def test_updating_baseclass_site_object_wipes_descendent_cached_connection_objects
334
449
  # Subclasses are always equal to superclass site when not overridden
335
450
  fruit = Class.new(ActiveResource::Base)
@@ -783,6 +898,14 @@ class BaseTest < Test::Unit::TestCase
783
898
  assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(1, :params => { :person_id => 1 }) }
784
899
  end
785
900
 
901
+ def test_destroy_with_410_gone
902
+ assert Person.find(1).destroy
903
+ ActiveResource::HttpMock.respond_to do |mock|
904
+ mock.get "/people/1.xml", {}, nil, 410
905
+ end
906
+ assert_raise(ActiveResource::ResourceGone) { Person.find(1).destroy }
907
+ end
908
+
786
909
  def test_delete
787
910
  assert Person.delete(1)
788
911
  ActiveResource::HttpMock.respond_to do |mock|
@@ -798,6 +921,14 @@ class BaseTest < Test::Unit::TestCase
798
921
  end
799
922
  assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(1, :params => { :person_id => 1 }) }
800
923
  end
924
+
925
+ def test_delete_with_410_gone
926
+ assert Person.delete(1)
927
+ ActiveResource::HttpMock.respond_to do |mock|
928
+ mock.get "/people/1.xml", {}, nil, 410
929
+ end
930
+ assert_raise(ActiveResource::ResourceGone) { Person.find(1) }
931
+ end
801
932
 
802
933
  def test_exists
803
934
  # Class method.
@@ -850,6 +981,22 @@ class BaseTest < Test::Unit::TestCase
850
981
  end
851
982
  end
852
983
 
984
+ def test_exists_without_http_mock
985
+ http = Net::HTTP.new(Person.site.host, Person.site.port)
986
+ ActiveResource::Connection.any_instance.expects(:http).returns(http)
987
+ http.expects(:request).returns(ActiveResource::Response.new(""))
988
+
989
+ assert Person.exists?('not-mocked')
990
+ end
991
+
992
+ def test_exists_with_410_gone
993
+ ActiveResource::HttpMock.respond_to do |mock|
994
+ mock.head "/people/1.xml", {}, nil, 410
995
+ end
996
+
997
+ assert !Person.exists?(1)
998
+ end
999
+
853
1000
  def test_to_xml
854
1001
  matz = Person.find(1)
855
1002
  xml = matz.encode