shoulda-matchers 3.1.0 → 5.2.0

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 (288) hide show
  1. checksums.yaml +5 -5
  2. data/{MIT-LICENSE → LICENSE} +1 -1
  3. data/README.md +407 -232
  4. data/docs/errors/NonCaseSwappableValueError.md +2 -2
  5. data/lib/shoulda/matchers/action_controller/callback_matcher.rb +7 -80
  6. data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +4 -3
  7. data/lib/shoulda/matchers/action_controller/flash_store.rb +2 -4
  8. data/lib/shoulda/matchers/action_controller/permit_matcher.rb +36 -30
  9. data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +8 -10
  10. data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +7 -9
  11. data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +18 -15
  12. data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +3 -2
  13. data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +3 -3
  14. data/lib/shoulda/matchers/action_controller/route_matcher.rb +88 -29
  15. data/lib/shoulda/matchers/action_controller/route_params.rb +2 -2
  16. data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +4 -4
  17. data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -3
  18. data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
  19. data/lib/shoulda/matchers/action_controller.rb +2 -0
  20. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +1 -1
  21. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +5 -9
  22. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +2 -2
  23. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +1 -1
  24. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +1 -1
  25. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +42 -39
  26. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
  27. data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +52 -26
  28. data/lib/shoulda/matchers/active_model/helpers.rb +2 -2
  29. data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -30
  30. data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +2 -1
  31. data/lib/shoulda/matchers/active_model/qualifiers/allow_blank.rb +26 -0
  32. data/lib/shoulda/matchers/active_model/qualifiers/allow_nil.rb +26 -0
  33. data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
  34. data/lib/shoulda/matchers/active_model/qualifiers.rb +2 -0
  35. data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -6
  36. data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +8 -3
  37. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +31 -16
  38. data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +52 -16
  39. data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +137 -84
  40. data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +159 -46
  41. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +130 -66
  42. data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +251 -24
  43. data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +12 -9
  44. data/lib/shoulda/matchers/active_model/validation_matcher.rb +38 -6
  45. data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
  46. data/lib/shoulda/matchers/active_model/validator.rb +4 -9
  47. data/lib/shoulda/matchers/active_model.rb +3 -5
  48. data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +10 -7
  49. data/lib/shoulda/matchers/active_record/association_matcher.rb +386 -111
  50. data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +5 -2
  51. data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +4 -4
  52. data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +1 -1
  53. data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +11 -6
  54. data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +14 -15
  55. data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +30 -8
  56. data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +34 -11
  57. data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +69 -0
  58. data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
  59. data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +74 -0
  60. data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +3 -2
  61. data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +7 -5
  62. data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +458 -42
  63. data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +185 -0
  64. data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +63 -23
  65. data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +164 -48
  66. data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +106 -0
  67. data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +13 -11
  68. data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +83 -0
  69. data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +132 -0
  70. data/lib/shoulda/matchers/active_record/serialize_matcher.rb +18 -18
  71. data/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb +1 -3
  72. data/lib/shoulda/matchers/active_record/uniqueness/test_models.rb +0 -2
  73. data/lib/shoulda/matchers/active_record/uniqueness.rb +1 -1
  74. data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +430 -200
  75. data/lib/shoulda/matchers/active_record.rb +28 -20
  76. data/lib/shoulda/matchers/configuration.rb +12 -1
  77. data/lib/shoulda/matchers/doublespeak/double.rb +1 -1
  78. data/lib/shoulda/matchers/doublespeak/double_collection.rb +3 -3
  79. data/lib/shoulda/matchers/doublespeak/double_implementation_registry.rb +8 -5
  80. data/lib/shoulda/matchers/doublespeak/object_double.rb +6 -2
  81. data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
  82. data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
  83. data/lib/shoulda/matchers/doublespeak.rb +2 -1
  84. data/lib/shoulda/matchers/error.rb +1 -1
  85. data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +109 -29
  86. data/lib/shoulda/matchers/independent.rb +2 -2
  87. data/lib/shoulda/matchers/integrations/configuration.rb +8 -4
  88. data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
  89. data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -2
  90. data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
  91. data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
  92. data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
  93. data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
  94. data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
  95. data/lib/shoulda/matchers/rails_shim.rb +172 -51
  96. data/lib/shoulda/matchers/routing.rb +2 -2
  97. data/lib/shoulda/matchers/util/word_wrap.rb +17 -12
  98. data/lib/shoulda/matchers/util.rb +39 -5
  99. data/lib/shoulda/matchers/version.rb +1 -1
  100. data/lib/shoulda/matchers/warn.rb +4 -3
  101. data/shoulda-matchers.gemspec +33 -15
  102. metadata +31 -338
  103. data/.gitignore +0 -12
  104. data/.hound.yml +0 -3
  105. data/.hound_config/ruby.yml +0 -12
  106. data/.travis.yml +0 -19
  107. data/.yardopts +0 -10
  108. data/Appraisals +0 -73
  109. data/CONTRIBUTING.md +0 -101
  110. data/Gemfile +0 -15
  111. data/Gemfile.lock +0 -70
  112. data/NEWS.md +0 -986
  113. data/Rakefile +0 -39
  114. data/custom_plan.rb +0 -88
  115. data/doc_config/gh-pages/index.html.erb +0 -9
  116. data/doc_config/yard/setup.rb +0 -22
  117. data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -5967
  118. data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +0 -12
  119. data/doc_config/yard/templates/default/fulldoc/html/css/global.css +0 -62
  120. data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +0 -69
  121. data/doc_config/yard/templates/default/fulldoc/html/css/style.css +0 -312
  122. data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +0 -32
  123. data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +0 -1
  124. data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +0 -8
  125. data/doc_config/yard/templates/default/fulldoc/html/js/app.js +0 -298
  126. data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +0 -1
  127. data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +0 -289
  128. data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +0 -6
  129. data/doc_config/yard/templates/default/fulldoc/html/setup.rb +0 -8
  130. data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +0 -14
  131. data/doc_config/yard/templates/default/layout/html/fonts.erb +0 -1
  132. data/doc_config/yard/templates/default/layout/html/footer.erb +0 -6
  133. data/doc_config/yard/templates/default/layout/html/layout.erb +0 -23
  134. data/doc_config/yard/templates/default/layout/html/search.erb +0 -13
  135. data/doc_config/yard/templates/default/layout/html/setup.rb +0 -40
  136. data/doc_config/yard/templates/default/method_details/html/source.erb +0 -10
  137. data/doc_config/yard/templates/default/module/html/box_info.erb +0 -31
  138. data/gemfiles/4.0.0.gemfile +0 -38
  139. data/gemfiles/4.0.0.gemfile.lock +0 -223
  140. data/gemfiles/4.0.1.gemfile +0 -38
  141. data/gemfiles/4.0.1.gemfile.lock +0 -225
  142. data/gemfiles/4.1.gemfile +0 -38
  143. data/gemfiles/4.1.gemfile.lock +0 -220
  144. data/gemfiles/4.2.gemfile +0 -38
  145. data/gemfiles/4.2.gemfile.lock +0 -243
  146. data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +0 -159
  147. data/lib/shoulda/matchers/independent/delegate_method_matcher/stubbed_target.rb +0 -37
  148. data/script/SUPPORTED_VERSIONS +0 -1
  149. data/script/install_gems_in_all_appraisals +0 -14
  150. data/script/run_all_tests +0 -14
  151. data/script/update_gem_in_all_appraisals +0 -15
  152. data/script/update_gems_in_all_appraisals +0 -14
  153. data/spec/acceptance/active_model_integration_spec.rb +0 -23
  154. data/spec/acceptance/independent_matchers_spec.rb +0 -125
  155. data/spec/acceptance/multiple_libraries_integration_spec.rb +0 -55
  156. data/spec/acceptance/rails_integration_spec.rb +0 -156
  157. data/spec/acceptance_spec_helper.rb +0 -23
  158. data/spec/doublespeak_spec_helper.rb +0 -2
  159. data/spec/report_warnings.rb +0 -7
  160. data/spec/spec_helper.rb +0 -21
  161. data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +0 -133
  162. data/spec/support/acceptance/helpers/active_model_helpers.rb +0 -11
  163. data/spec/support/acceptance/helpers/array_helpers.rb +0 -13
  164. data/spec/support/acceptance/helpers/base_helpers.rb +0 -19
  165. data/spec/support/acceptance/helpers/command_helpers.rb +0 -55
  166. data/spec/support/acceptance/helpers/file_helpers.rb +0 -19
  167. data/spec/support/acceptance/helpers/gem_helpers.rb +0 -31
  168. data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -11
  169. data/spec/support/acceptance/helpers/n_unit_helpers.rb +0 -25
  170. data/spec/support/acceptance/helpers/pluralization_helpers.rb +0 -13
  171. data/spec/support/acceptance/helpers/rails_version_helpers.rb +0 -11
  172. data/spec/support/acceptance/helpers/rspec_helpers.rb +0 -24
  173. data/spec/support/acceptance/helpers/ruby_version_helpers.rb +0 -9
  174. data/spec/support/acceptance/helpers/step_helpers.rb +0 -127
  175. data/spec/support/acceptance/helpers.rb +0 -31
  176. data/spec/support/acceptance/matchers/have_output.rb +0 -31
  177. data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -55
  178. data/spec/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -103
  179. data/spec/support/tests/bundle.rb +0 -94
  180. data/spec/support/tests/command_runner.rb +0 -230
  181. data/spec/support/tests/current_bundle.rb +0 -61
  182. data/spec/support/tests/database.rb +0 -28
  183. data/spec/support/tests/database_adapters/postgresql.rb +0 -25
  184. data/spec/support/tests/database_adapters/sqlite3.rb +0 -26
  185. data/spec/support/tests/database_configuration.rb +0 -33
  186. data/spec/support/tests/database_configuration_registry.rb +0 -28
  187. data/spec/support/tests/filesystem.rb +0 -100
  188. data/spec/support/tests/version.rb +0 -45
  189. data/spec/support/unit/active_record/create_table.rb +0 -54
  190. data/spec/support/unit/attribute.rb +0 -47
  191. data/spec/support/unit/capture.rb +0 -40
  192. data/spec/support/unit/change_value.rb +0 -111
  193. data/spec/support/unit/create_model_arguments/basic.rb +0 -135
  194. data/spec/support/unit/create_model_arguments/has_many.rb +0 -15
  195. data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +0 -74
  196. data/spec/support/unit/helpers/active_model_helpers.rb +0 -27
  197. data/spec/support/unit/helpers/active_model_versions.rb +0 -28
  198. data/spec/support/unit/helpers/active_record_versions.rb +0 -24
  199. data/spec/support/unit/helpers/active_resource_builder.rb +0 -27
  200. data/spec/support/unit/helpers/allow_value_matcher_helpers.rb +0 -15
  201. data/spec/support/unit/helpers/class_builder.rb +0 -90
  202. data/spec/support/unit/helpers/column_type_helpers.rb +0 -26
  203. data/spec/support/unit/helpers/confirmation_matcher_helpers.rb +0 -17
  204. data/spec/support/unit/helpers/controller_builder.rb +0 -63
  205. data/spec/support/unit/helpers/database_helpers.rb +0 -20
  206. data/spec/support/unit/helpers/i18n_faker.rb +0 -15
  207. data/spec/support/unit/helpers/mailer_builder.rb +0 -12
  208. data/spec/support/unit/helpers/model_builder.rb +0 -114
  209. data/spec/support/unit/helpers/rails_versions.rb +0 -28
  210. data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +0 -44
  211. data/spec/support/unit/i18n.rb +0 -7
  212. data/spec/support/unit/load_environment.rb +0 -12
  213. data/spec/support/unit/matchers/deprecate.rb +0 -60
  214. data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +0 -51
  215. data/spec/support/unit/matchers/fail_with_message_matcher.rb +0 -62
  216. data/spec/support/unit/matchers/print_warning_including.rb +0 -59
  217. data/spec/support/unit/model_creation_strategies/active_model.rb +0 -111
  218. data/spec/support/unit/model_creation_strategies/active_record.rb +0 -77
  219. data/spec/support/unit/model_creators/active_model.rb +0 -39
  220. data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +0 -95
  221. data/spec/support/unit/model_creators/active_record/has_many.rb +0 -67
  222. data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +0 -42
  223. data/spec/support/unit/model_creators/active_record.rb +0 -43
  224. data/spec/support/unit/model_creators/basic.rb +0 -97
  225. data/spec/support/unit/model_creators.rb +0 -19
  226. data/spec/support/unit/rails_application.rb +0 -126
  227. data/spec/support/unit/record_builder_with_i18n_validation_message.rb +0 -69
  228. data/spec/support/unit/record_validating_confirmation_builder.rb +0 -51
  229. data/spec/support/unit/record_with_different_error_attribute_builder.rb +0 -92
  230. data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +0 -79
  231. data/spec/support/unit/shared_examples/numerical_submatcher.rb +0 -17
  232. data/spec/support/unit/shared_examples/set_session_or_flash.rb +0 -360
  233. data/spec/support/unit/validation_matcher_scenario.rb +0 -62
  234. data/spec/unit/shoulda/matchers/action_controller/callback_matcher_spec.rb +0 -82
  235. data/spec/unit/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +0 -28
  236. data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +0 -592
  237. data/spec/unit/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +0 -42
  238. data/spec/unit/shoulda/matchers/action_controller/render_template_matcher_spec.rb +0 -76
  239. data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +0 -62
  240. data/spec/unit/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +0 -90
  241. data/spec/unit/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +0 -31
  242. data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +0 -330
  243. data/spec/unit/shoulda/matchers/action_controller/route_params_spec.rb +0 -30
  244. data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +0 -67
  245. data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +0 -17
  246. data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +0 -562
  247. data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
  248. data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +0 -823
  249. data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -86
  250. data/spec/unit/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +0 -20
  251. data/spec/unit/shoulda/matchers/active_model/helpers_spec.rb +0 -162
  252. data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +0 -266
  253. data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +0 -91
  254. data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +0 -149
  255. data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -207
  256. data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -1015
  257. data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -288
  258. data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +0 -1837
  259. data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -380
  260. data/spec/unit/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -107
  261. data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +0 -1242
  262. data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +0 -251
  263. data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +0 -168
  264. data/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +0 -111
  265. data/spec/unit/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +0 -85
  266. data/spec/unit/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +0 -41
  267. data/spec/unit/shoulda/matchers/active_record/serialize_matcher_spec.rb +0 -86
  268. data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +0 -1418
  269. data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +0 -190
  270. data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +0 -21
  271. data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +0 -271
  272. data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +0 -77
  273. data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +0 -72
  274. data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +0 -101
  275. data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +0 -80
  276. data/spec/unit/shoulda/matchers/doublespeak_spec.rb +0 -27
  277. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher/stubbed_target_spec.rb +0 -43
  278. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher_spec.rb +0 -517
  279. data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +0 -242
  280. data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +0 -252
  281. data/spec/unit_spec_helper.rb +0 -46
  282. data/spec/warnings_spy/filesystem.rb +0 -45
  283. data/spec/warnings_spy/partitioner.rb +0 -36
  284. data/spec/warnings_spy/reader.rb +0 -53
  285. data/spec/warnings_spy/reporter.rb +0 -88
  286. data/spec/warnings_spy.rb +0 -64
  287. data/tasks/documentation.rb +0 -199
  288. data/zeus.json +0 -11
@@ -1,26 +1,34 @@
1
- require "shoulda/matchers/active_record/association_matcher"
2
- require "shoulda/matchers/active_record/association_matchers"
3
- require "shoulda/matchers/active_record/association_matchers/counter_cache_matcher"
4
- require "shoulda/matchers/active_record/association_matchers/inverse_of_matcher"
5
- require "shoulda/matchers/active_record/association_matchers/join_table_matcher"
6
- require "shoulda/matchers/active_record/association_matchers/order_matcher"
7
- require "shoulda/matchers/active_record/association_matchers/through_matcher"
8
- require "shoulda/matchers/active_record/association_matchers/dependent_matcher"
9
- require "shoulda/matchers/active_record/association_matchers/source_matcher"
10
- require "shoulda/matchers/active_record/association_matchers/model_reflector"
11
- require "shoulda/matchers/active_record/association_matchers/model_reflection"
12
- require "shoulda/matchers/active_record/association_matchers/option_verifier"
13
- require "shoulda/matchers/active_record/have_db_column_matcher"
14
- require "shoulda/matchers/active_record/have_db_index_matcher"
15
- require "shoulda/matchers/active_record/have_readonly_attribute_matcher"
16
- require "shoulda/matchers/active_record/serialize_matcher"
17
- require "shoulda/matchers/active_record/accept_nested_attributes_for_matcher"
18
- require "shoulda/matchers/active_record/define_enum_for_matcher"
19
- require "shoulda/matchers/active_record/uniqueness"
20
- require "shoulda/matchers/active_record/validate_uniqueness_of_matcher"
1
+ require 'shoulda/matchers/active_record/association_matcher'
2
+ require 'shoulda/matchers/active_record/association_matchers'
3
+ require 'shoulda/matchers/active_record/association_matchers/counter_cache_matcher'
4
+ require 'shoulda/matchers/active_record/association_matchers/inverse_of_matcher'
5
+ require 'shoulda/matchers/active_record/association_matchers/join_table_matcher'
6
+ require 'shoulda/matchers/active_record/association_matchers/order_matcher'
7
+ require 'shoulda/matchers/active_record/association_matchers/through_matcher'
8
+ require 'shoulda/matchers/active_record/association_matchers/dependent_matcher'
9
+ require 'shoulda/matchers/active_record/association_matchers/required_matcher'
10
+ require 'shoulda/matchers/active_record/association_matchers/optional_matcher'
11
+ require 'shoulda/matchers/active_record/association_matchers/source_matcher'
12
+ require 'shoulda/matchers/active_record/association_matchers/model_reflector'
13
+ require 'shoulda/matchers/active_record/association_matchers/model_reflection'
14
+ require 'shoulda/matchers/active_record/association_matchers/option_verifier'
15
+ require 'shoulda/matchers/active_record/have_db_column_matcher'
16
+ require 'shoulda/matchers/active_record/have_db_index_matcher'
17
+ require 'shoulda/matchers/active_record/have_implicit_order_column'
18
+ require 'shoulda/matchers/active_record/have_readonly_attribute_matcher'
19
+ require 'shoulda/matchers/active_record/have_rich_text_matcher'
20
+ require 'shoulda/matchers/active_record/have_secure_token_matcher'
21
+ require 'shoulda/matchers/active_record/serialize_matcher'
22
+ require 'shoulda/matchers/active_record/accept_nested_attributes_for_matcher'
23
+ require 'shoulda/matchers/active_record/define_enum_for_matcher'
24
+ require 'shoulda/matchers/active_record/uniqueness'
25
+ require 'shoulda/matchers/active_record/validate_uniqueness_of_matcher'
26
+ require 'shoulda/matchers/active_record/have_attached_matcher'
21
27
 
22
28
  module Shoulda
23
29
  module Matchers
30
+ # This module provides matchers that are used to test behavior within
31
+ # ActiveRecord classes.
24
32
  module ActiveRecord
25
33
  end
26
34
  end
@@ -5,6 +5,11 @@ module Shoulda
5
5
  yield configuration
6
6
  end
7
7
 
8
+ # @private
9
+ def self.integrations
10
+ configuration.integrations
11
+ end
12
+
8
13
  # @private
9
14
  def self.configuration
10
15
  @_configuration ||= Configuration.new
@@ -12,8 +17,14 @@ module Shoulda
12
17
 
13
18
  # @private
14
19
  class Configuration
20
+ attr_reader :integrations
21
+
22
+ def initialize
23
+ @integrations = nil
24
+ end
25
+
15
26
  def integrate(&block)
16
- Integrations::Configuration.apply(self, &block)
27
+ @integrations = Integrations::Configuration.apply(&block)
17
28
  end
18
29
  end
19
30
  end
@@ -82,7 +82,7 @@ module Shoulda
82
82
  method_name: _method_name,
83
83
  args: args,
84
84
  block: block,
85
- caller: caller
85
+ caller: caller,
86
86
  )
87
87
  implementation.call(call)
88
88
  end
@@ -18,19 +18,19 @@ module Shoulda
18
18
  end
19
19
 
20
20
  def activate
21
- doubles_by_method_name.each do |method_name, double|
21
+ doubles_by_method_name.each do |_method_name, double|
22
22
  double.activate
23
23
  end
24
24
  end
25
25
 
26
26
  def deactivate
27
- doubles_by_method_name.each do |method_name, double|
27
+ doubles_by_method_name.each do |_method_name, double|
28
28
  double.deactivate
29
29
  end
30
30
  end
31
31
 
32
32
  def calls_by_method_name
33
- doubles_by_method_name.reduce({}) do |hash, (method_name, double)|
33
+ doubles_by_method_name.inject({}) do |hash, (method_name, double)|
34
34
  hash.merge method_name => double.calls.map(&:args)
35
35
  end
36
36
  end
@@ -4,23 +4,26 @@ module Shoulda
4
4
  # @private
5
5
  module DoubleImplementationRegistry
6
6
  class << self
7
- REGISTRY = {}
8
-
9
7
  def find(type)
10
8
  find_class!(type).create
11
9
  end
12
10
 
13
11
  def register(klass, type)
14
- REGISTRY[type] = klass
12
+ registry[type] = klass
15
13
  end
16
14
 
17
15
  private
18
16
 
19
17
  def find_class!(type)
20
- REGISTRY.fetch(type) do
21
- raise ArgumentError, "No double implementation class found for '#{type}'"
18
+ registry.fetch(type) do
19
+ raise ArgumentError, 'No double implementation class found for'\
20
+ " '#{type}'"
22
21
  end
23
22
  end
23
+
24
+ def registry
25
+ @_registry ||= {}
26
+ end
24
27
  end
25
28
  end
26
29
  end
@@ -14,7 +14,11 @@ module Shoulda
14
14
  @calls_by_method_name[method_name] || []
15
15
  end
16
16
 
17
- def respond_to?(name, include_private = nil)
17
+ def respond_to?(_name, _include_private = nil)
18
+ true
19
+ end
20
+
21
+ def respond_to_missing?(_name, _include_all)
18
22
  true
19
23
  end
20
24
 
@@ -23,7 +27,7 @@ module Shoulda
23
27
  method_name: method_name,
24
28
  args: args,
25
29
  block: block,
26
- caller: ::Kernel.caller
30
+ caller: ::Kernel.caller,
27
31
  )
28
32
  calls << call
29
33
  (calls_by_method_name[method_name] ||= []) << call
@@ -14,11 +14,7 @@ module Shoulda
14
14
  end
15
15
 
16
16
  def returns(value = nil, &block)
17
- if block
18
- @implementation = block
19
- else
20
- @implementation = proc { value }
21
- end
17
+ @implementation = block || proc { value }
22
18
  end
23
19
 
24
20
  def call(call)
@@ -39,13 +39,13 @@ module Shoulda
39
39
  private
40
40
 
41
41
  def activate
42
- double_collections_by_class.each do |klass, double_collection|
42
+ double_collections_by_class.each do |_klass, double_collection|
43
43
  double_collection.activate
44
44
  end
45
45
  end
46
46
 
47
47
  def deactivate
48
- double_collections_by_class.each do |klass, double_collection|
48
+ double_collections_by_class.each do |_klass, double_collection|
49
49
  double_collection.deactivate
50
50
  end
51
51
  end
@@ -1,4 +1,5 @@
1
1
  require 'forwardable'
2
+ require 'logger'
2
3
 
3
4
  module Shoulda
4
5
  module Matchers
@@ -20,7 +21,7 @@ module Shoulda
20
21
 
21
22
  def debug(&block)
22
23
  if debugging_enabled?
23
- puts block.call
24
+ puts block.call # rubocop:disable Rails/Output
24
25
  end
25
26
  end
26
27
  end
@@ -18,7 +18,7 @@ module Shoulda
18
18
  end
19
19
 
20
20
  def message
21
- ""
21
+ ''
22
22
  end
23
23
 
24
24
  def inspect
@@ -148,6 +148,26 @@ module Shoulda
148
148
  # with_arguments(expedited: true)
149
149
  # end
150
150
  #
151
+ # ##### allow_nil
152
+ #
153
+ # Use `allow_nil` if the delegation accounts for the fact that your
154
+ # delegate object could be nil. (This is mostly intended as an analogue to
155
+ # the `allow_nil` option that Rails' `delegate` helper takes.)
156
+ #
157
+ # class Account
158
+ # delegate :plan, to: :subscription, allow_nil: true
159
+ # end
160
+ #
161
+ # # RSpec
162
+ # describe Account do
163
+ # it { should delegate_method(:plan).to(:subscription).allow_nil }
164
+ # end
165
+ #
166
+ # # Minitest
167
+ # class PageTest < Minitest::Test
168
+ # should delegate_method(:plan).to(:subscription).allow_nil
169
+ # end
170
+ #
151
171
  # @return [DelegateMethodMatcher]
152
172
  #
153
173
  def delegate_method(delegating_method)
@@ -162,10 +182,11 @@ module Shoulda
162
182
  @delegate_method = @delegating_method
163
183
  @delegate_object = Doublespeak::ObjectDouble.new
164
184
 
165
- @delegated_arguments = []
166
- @delegate_object_reader_method = nil
185
+ @context = nil
167
186
  @subject = nil
168
- @subject_double_collection = nil
187
+ @delegate_object_reader_method = nil
188
+ @delegated_arguments = []
189
+ @expects_to_allow_nil_delegate_object = false
169
190
  end
170
191
 
171
192
  def in_context(context)
@@ -180,11 +201,13 @@ module Shoulda
180
201
 
181
202
  subject_has_delegating_method? &&
182
203
  subject_has_delegate_object_reader_method? &&
183
- subject_delegates_to_delegate_object_correctly?
204
+ subject_delegates_to_delegate_object_correctly? &&
205
+ subject_handles_nil_delegate_object?
184
206
  end
185
207
 
186
208
  def description
187
- string = "delegate #{formatted_delegating_method_name} to " +
209
+ string =
210
+ "delegate #{formatted_delegating_method_name} to the " +
188
211
  "#{formatted_delegate_object_reader_method_name} object"
189
212
 
190
213
  if delegated_arguments.any?
@@ -195,6 +218,12 @@ module Shoulda
195
218
  string << " as #{formatted_delegate_method}"
196
219
  end
197
220
 
221
+ if expects_to_allow_nil_delegate_object?
222
+ string << ', allowing '
223
+ string << formatted_delegate_object_reader_method_name
224
+ string << ' to return nil'
225
+ end
226
+
198
227
  string
199
228
  end
200
229
 
@@ -216,26 +245,46 @@ module Shoulda
216
245
  def with_prefix(prefix = nil)
217
246
  @delegating_method =
218
247
  :"#{build_delegating_method_prefix(prefix)}_#{delegate_method}"
219
- delegate_method
248
+ delegate_method
249
+ self
250
+ end
251
+
252
+ def allow_nil
253
+ @expects_to_allow_nil_delegate_object = true
220
254
  self
221
255
  end
222
256
 
223
257
  def build_delegating_method_prefix(prefix)
224
258
  case prefix
225
- when true, nil then delegate_object_reader_method
226
- else prefix
259
+ when true, nil then delegate_object_reader_method
260
+ else prefix
227
261
  end
228
262
  end
229
263
 
230
264
  def failure_message
231
- "Expected #{class_under_test} to #{description}\n" +
232
- "Method calls sent to " +
233
- "#{formatted_delegate_object_reader_method_name(include_module: true)}:" +
234
- formatted_calls_on_delegate_object
265
+ message = "Expected #{class_under_test} to #{description}.\n\n"
266
+
267
+ if failed_to_allow_nil_delegate_object?
268
+ message << formatted_delegating_method_name(include_module: true)
269
+ message << ' did delegate to '
270
+ message << formatted_delegate_object_reader_method_name
271
+ message << ' when it was non-nil, but it failed to account '
272
+ message << 'for when '
273
+ message << formatted_delegate_object_reader_method_name
274
+ message << ' *was* nil.'
275
+ else
276
+ message << 'Method calls sent to '
277
+ message << formatted_delegate_object_reader_method_name(
278
+ include_module: true,
279
+ )
280
+ message << ": #{formatted_calls_on_delegate_object}"
281
+ end
282
+
283
+ Shoulda::Matchers.word_wrap(message)
235
284
  end
236
285
 
237
286
  def failure_message_when_negated
238
- "Expected #{class_under_test} not to #{description}, but it did"
287
+ "Expected #{class_under_test} not to #{description}, but it did."
239
288
  end
240
289
 
241
290
  protected
@@ -246,7 +295,6 @@ module Shoulda
246
295
  :delegating_method,
247
296
  :method,
248
297
  :delegate_method,
249
- :subject_double_collection,
250
298
  :delegate_object,
251
299
  :delegate_object_reader_method
252
300
 
@@ -270,6 +318,10 @@ module Shoulda
270
318
  end
271
319
  end
272
320
 
321
+ def expects_to_allow_nil_delegate_object?
322
+ @expects_to_allow_nil_delegate_object
323
+ end
324
+
273
325
  def formatted_delegate_method(options = {})
274
326
  formatted_method_name_for(delegate_method, options)
275
327
  end
@@ -292,7 +344,7 @@ module Shoulda
292
344
  if options[:include_module]
293
345
  class_under_test.to_s
294
346
  else
295
- ""
347
+ ''
296
348
  end
297
349
  end
298
350
 
@@ -329,11 +381,7 @@ module Shoulda
329
381
  end
330
382
 
331
383
  def subject_delegates_to_delegate_object_correctly?
332
- register_subject_double_collection
333
-
334
- Doublespeak.with_doubles_activated do
335
- subject.public_send(delegating_method, *delegated_arguments)
336
- end
384
+ call_delegating_method_with_delegate_method_returning(delegate_object)
337
385
 
338
386
  if delegated_arguments.any?
339
387
  delegate_object_received_call_with_delegated_arguments?
@@ -342,13 +390,45 @@ module Shoulda
342
390
  end
343
391
  end
344
392
 
345
- def register_subject_double_collection
393
+ def subject_handles_nil_delegate_object?
394
+ @subject_handled_nil_delegate_object =
395
+ if expects_to_allow_nil_delegate_object?
396
+ begin
397
+ call_delegating_method_with_delegate_method_returning(nil)
398
+ true
399
+ rescue Module::DelegationError
400
+ false
401
+ rescue NoMethodError => e
402
+ if e.message =~
403
+ /undefined method `#{delegate_method}' for nil:NilClass/
404
+ false
405
+ else
406
+ raise e
407
+ end
408
+ end
409
+ else
410
+ true
411
+ end
412
+ end
413
+
414
+ def failed_to_allow_nil_delegate_object?
415
+ expects_to_allow_nil_delegate_object? &&
416
+ !@subject_handled_nil_delegate_object
417
+ end
418
+
419
+ def call_delegating_method_with_delegate_method_returning(value)
420
+ register_subject_double_collection_to(value)
421
+
422
+ Doublespeak.with_doubles_activated do
423
+ subject.public_send(delegating_method, *delegated_arguments)
424
+ end
425
+ end
426
+
427
+ def register_subject_double_collection_to(returned_value)
346
428
  double_collection =
347
429
  Doublespeak.double_collection_for(subject.singleton_class)
348
430
  double_collection.register_stub(delegate_object_reader_method).
349
- to_return(delegate_object)
350
-
351
- @subject_double_collection = double_collection
431
+ to_return(returned_value)
352
432
  end
353
433
 
354
434
  def calls_to_delegate_method
@@ -360,17 +440,17 @@ module Shoulda
360
440
  end
361
441
 
362
442
  def formatted_calls_on_delegate_object
363
- string = ""
443
+ string = ''
364
444
 
365
445
  if calls_on_delegate_object.any?
366
- string << "\n"
446
+ string << "\n\n"
367
447
  calls_on_delegate_object.each_with_index do |call, i|
368
448
  name = call.method_name
369
- args = call.args.map { |arg| arg.inspect }.join(', ')
370
- string << "#{i+1}) #{name}(#{args})\n"
449
+ args = call.args.map(&:inspect).join(', ')
450
+ string << "#{i + 1}) #{name}(#{args})\n"
371
451
  end
372
452
  else
373
- string << " (none)"
453
+ string << ' (none)'
374
454
  end
375
455
 
376
456
  string.rstrip!
@@ -1,10 +1,10 @@
1
1
  require 'shoulda/matchers/independent/delegate_method_matcher'
2
- require 'shoulda/matchers/independent/delegate_method_matcher/stubbed_target'
3
2
  require 'shoulda/matchers/independent/delegate_method_matcher/target_not_defined_error'
4
3
 
5
4
  module Shoulda
6
5
  module Matchers
7
- # Matchers for non-Rails-dependent code.
6
+ # This module provides matchers that are used to test behavior outside of
7
+ # Rails-specific classes.
8
8
  module Independent
9
9
  end
10
10
  end
@@ -5,11 +5,13 @@ module Shoulda
5
5
  module Integrations
6
6
  # @private
7
7
  class Configuration
8
- def self.apply(configuration, &block)
9
- new(configuration, &block).apply
8
+ def self.apply(&block)
9
+ new(&block).apply
10
10
  end
11
11
 
12
- def initialize(configuration, &block)
12
+ attr_reader :test_frameworks
13
+
14
+ def initialize(&block)
13
15
  @test_frameworks = Set.new
14
16
  @libraries = Set.new
15
17
 
@@ -47,6 +49,8 @@ EOT
47
49
  test_framework.include(Shoulda::Matchers::Independent)
48
50
  @libraries.each { |library| library.integrate_with(test_framework) }
49
51
  end
52
+
53
+ self
50
54
  end
51
55
 
52
56
  private
@@ -56,7 +60,7 @@ EOT
56
60
  end
57
61
 
58
62
  def no_test_frameworks_added?
59
- @test_frameworks.empty? || !@test_frameworks.any?(&:present?)
63
+ @test_frameworks.empty? || @test_frameworks.none?(&:present?)
60
64
  end
61
65
 
62
66
  def no_libraries_added?
@@ -13,7 +13,7 @@ module Shoulda
13
13
  test_framework.include(matchers_module, type: :controller)
14
14
 
15
15
  include_into(::ActionController::TestCase, matchers_module) do
16
- def subject
16
+ def subject # rubocop:disable Lint/NestedMethodDefinition
17
17
  @controller
18
18
  end
19
19
  end
@@ -12,8 +12,8 @@ module Shoulda
12
12
  :active_model,
13
13
  :active_record,
14
14
  :action_controller,
15
- :routing
16
- ]
15
+ :routing,
16
+ ].freeze
17
17
 
18
18
  def integrate_with(test_framework)
19
19
  Shoulda::Matchers.assertion_exception_class =
@@ -9,7 +9,7 @@ module Shoulda
9
9
  def validate!
10
10
  end
11
11
 
12
- def include(*modules, **options)
12
+ def include(*modules, **_options)
13
13
  test_case_class.include(*modules)
14
14
  end
15
15
 
@@ -9,7 +9,7 @@ module Shoulda
9
9
  def validate!
10
10
  end
11
11
 
12
- def include(*modules, **options)
12
+ def include(*modules, **_options)
13
13
  test_case_class.class_eval do
14
14
  include(*modules)
15
15
  extend(*modules)
@@ -10,7 +10,7 @@ module Shoulda
10
10
  def validate!
11
11
  end
12
12
 
13
- def include(*modules, **options)
13
+ def include(*modules, **_options)
14
14
  test_case_class.class_eval do
15
15
  include(*modules)
16
16
  extend(*modules)
@@ -20,7 +20,7 @@ Shoulda::Matchers.configure do |config|
20
20
  with.test_framework :test_unit
21
21
  end
22
22
  end
23
- EOT
23
+ EOT
24
24
  end
25
25
 
26
26
  def include(*modules, **options)
@@ -9,7 +9,7 @@ module Shoulda
9
9
  def validate!
10
10
  end
11
11
 
12
- def include(*modules, **options)
12
+ def include(*modules, **_options)
13
13
  test_case_class.class_eval do
14
14
  include(*modules)
15
15
  extend(*modules)