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,4 +1,5 @@
1
1
  require 'bigdecimal'
2
+ require 'date'
2
3
 
3
4
  module Shoulda
4
5
  module Matchers
@@ -18,7 +19,7 @@ module Shoulda
18
19
  # end
19
20
  #
20
21
  # # RSpec
21
- # describe Issue do
22
+ # RSpec.describe Issue, type: :model do
22
23
  # it do
23
24
  # should validate_inclusion_of(:state).
24
25
  # in_array(['open', 'resolved', 'unresolved'])
@@ -41,7 +42,7 @@ module Shoulda
41
42
  # end
42
43
  #
43
44
  # # RSpec
44
- # describe Issue do
45
+ # RSpec.describe Issue, type: :model do
45
46
  # it { should validate_inclusion_of(:state).in_range(1..5) }
46
47
  # end
47
48
  #
@@ -83,7 +84,7 @@ module Shoulda
83
84
  # end
84
85
  #
85
86
  # # RSpec
86
- # describe Issue do
87
+ # RSpec.describe Issue, type: :model do
87
88
  # it do
88
89
  # should validate_inclusion_of(:severity).
89
90
  # in_array(%w(low medium high)).
@@ -112,7 +113,7 @@ module Shoulda
112
113
  # end
113
114
  #
114
115
  # # RSpec
115
- # describe Issue do
116
+ # RSpec.describe Issue, type: :model do
116
117
  # it do
117
118
  # should validate_inclusion_of(:severity).
118
119
  # in_array(%w(low medium high)).
@@ -148,7 +149,7 @@ module Shoulda
148
149
  # end
149
150
  #
150
151
  # # RSpec
151
- # describe Person do
152
+ # RSpec.describe Person, type: :model do
152
153
  # it do
153
154
  # should validate_inclusion_of(:age).
154
155
  # in_range(0..65).
@@ -184,7 +185,7 @@ module Shoulda
184
185
  # end
185
186
  #
186
187
  # # RSpec
187
- # describe Person do
188
+ # RSpec.describe Person, type: :model do
188
189
  # it do
189
190
  # should validate_inclusion_of(:age).
190
191
  # in_range(0..21).
@@ -214,7 +215,7 @@ module Shoulda
214
215
  # end
215
216
  #
216
217
  # # RSpec
217
- # describe Issue do
218
+ # RSpec.describe Issue, type: :model do
218
219
  # it do
219
220
  # should validate_inclusion_of(:state).
220
221
  # in_array(['open', 'resolved', 'unresolved']).
@@ -244,7 +245,7 @@ module Shoulda
244
245
  # end
245
246
  #
246
247
  # # RSpec
247
- # describe Issue do
248
+ # RSpec.describe Issue, type: :model do
248
249
  # it do
249
250
  # should validate_inclusion_of(:state).
250
251
  # in_array(['open', 'resolved', 'unresolved']).
@@ -267,19 +268,20 @@ module Shoulda
267
268
 
268
269
  # @private
269
270
  class ValidateInclusionOfMatcher < ValidationMatcher
270
- ARBITRARY_OUTSIDE_STRING = 'shoulda-matchers test string'
271
- ARBITRARY_OUTSIDE_FIXNUM = 123456789
272
- ARBITRARY_OUTSIDE_DECIMAL = BigDecimal.new('0.123456789')
271
+ BLANK_VALUES = ['', ' ', "\n", "\r", "\t", "\f"].freeze
272
+ ARBITRARY_OUTSIDE_STRING = 'shoulda-matchers test string'.freeze
273
+ ARBITRARY_OUTSIDE_INTEGER = 123456789
274
+ ARBITRARY_OUTSIDE_DECIMAL = BigDecimal('0.123456789')
273
275
  ARBITRARY_OUTSIDE_DATE = Date.jd(9999999)
274
276
  ARBITRARY_OUTSIDE_DATETIME = DateTime.jd(9999999)
275
277
  ARBITRARY_OUTSIDE_TIME = Time.at(9999999999)
276
- BOOLEAN_ALLOWS_BOOLEAN_MESSAGE = <<EOT
278
+ BOOLEAN_ALLOWS_BOOLEAN_MESSAGE = <<EOT.freeze
277
279
  You are using `validate_inclusion_of` to assert that a boolean column allows
278
280
  boolean values and disallows non-boolean ones. Be aware that it is not possible
279
281
  to fully test this, as boolean columns will automatically convert non-boolean
280
282
  values to boolean ones. Hence, you should consider removing this test.
281
283
  EOT
282
- BOOLEAN_ALLOWS_NIL_MESSAGE = <<EOT
284
+ BOOLEAN_ALLOWS_NIL_MESSAGE = <<EOT.freeze
283
285
  You are using `validate_inclusion_of` to assert that a boolean column allows nil.
284
286
  Be aware that it is not possible to fully test this, as anything other than
285
287
  true, false or nil will be converted to false. Hence, you should consider
@@ -293,8 +295,8 @@ EOT
293
295
  @range = nil
294
296
  @minimum = nil
295
297
  @maximum = nil
296
- @low_message = nil
297
- @high_message = nil
298
+ @low_message = :inclusion
299
+ @high_message = :inclusion
298
300
  end
299
301
 
300
302
  def in_array(array)
@@ -309,17 +311,8 @@ EOT
309
311
  self
310
312
  end
311
313
 
312
- def allow_blank(allow_blank = true)
313
- @options[:allow_blank] = allow_blank
314
- self
315
- end
316
-
317
- def expects_to_allow_blank?
318
- @options[:allow_blank]
319
- end
320
-
321
- def allow_nil(allow_nil = true)
322
- @options[:allow_nil] = allow_nil
314
+ def allow_nil
315
+ @options[:allow_nil] = true
323
316
  self
324
317
  end
325
318
 
@@ -361,11 +354,12 @@ EOT
361
354
  else
362
355
  description = "validate that :#{@attribute}"
363
356
 
364
- if @array.many?
365
- description << " is either #{inspected_array}"
366
- else
367
- description << " is #{inspected_array}"
368
- end
357
+ description <<
358
+ if @array.count > 1
359
+ " is either #{inspected_array}"
360
+ else
361
+ " is #{inspected_array}"
362
+ end
369
363
 
370
364
  description
371
365
  end
@@ -375,8 +369,6 @@ EOT
375
369
  super(subject)
376
370
 
377
371
  if @range
378
- @low_message ||= :inclusion
379
- @high_message ||= :inclusion
380
372
  matches_for_range?
381
373
  elsif @array
382
374
  if matches_for_array?
@@ -388,47 +380,55 @@ EOT
388
380
  end
389
381
  end
390
382
 
383
+ def does_not_match?(subject)
384
+ super(subject)
385
+
386
+ if @range
387
+ does_not_match_for_range?
388
+ elsif @array
389
+ if does_not_match_for_array?
390
+ true
391
+ else
392
+ @failure_message = "#{@array} matches array in validation"
393
+ false
394
+ end
395
+ end
396
+ end
397
+
391
398
  private
392
399
 
393
400
  def matches_for_range?
394
401
  disallows_lower_value &&
395
402
  allows_minimum_value &&
396
- disallows_higher_value &&
397
- allows_maximum_value
403
+ allows_maximum_value &&
404
+ disallows_higher_value
405
+ end
406
+
407
+ def does_not_match_for_range?
408
+ allows_lower_value ||
409
+ disallows_minimum_value ||
410
+ disallows_maximum_value ||
411
+ allows_higher_value
398
412
  end
399
413
 
400
414
  def matches_for_array?
401
415
  allows_all_values_in_array? &&
402
- allows_blank_value? &&
416
+ disallows_all_values_outside_of_array? &&
403
417
  allows_nil_value? &&
404
- disallows_value_outside_of_array?
418
+ allow_blank_matches?
405
419
  end
406
420
 
407
- def allows_blank_value?
408
- if @options.key?(:allow_blank)
409
- blank_values = ['', ' ', "\n", "\r", "\t", "\f"]
410
- @options[:allow_blank] == blank_values.all? { |value| allows_value_of(value) }
411
- else
412
- true
413
- end
421
+ def does_not_match_for_array?
422
+ disallows_any_values_in_array? ||
423
+ allows_any_value_outside_of_array? ||
424
+ disallows_nil_value? ||
425
+ allow_blank_does_not_match?
414
426
  end
415
427
 
416
- def allows_nil_value?
417
- if @options.key?(:allow_nil)
418
- @options[:allow_nil] == allows_value_of(nil)
419
- else
420
- true
421
- end
422
- end
423
-
424
- def inspect_message
425
- @range.nil? ? @array.inspect : @range.inspect
426
- end
427
-
428
- def allows_all_values_in_array?
429
- @array.all? do |value|
430
- allows_value_of(value, @low_message)
431
- end
428
+ def allows_lower_value
429
+ @minimum &&
430
+ @minimum != 0 &&
431
+ allows_value_of(@minimum - 1, @low_message)
432
432
  end
433
433
 
434
434
  def disallows_lower_value
@@ -437,19 +437,43 @@ EOT
437
437
  disallows_value_of(@minimum - 1, @low_message)
438
438
  end
439
439
 
440
- def disallows_higher_value
441
- disallows_value_of(@maximum + 1, @high_message)
442
- end
443
-
444
440
  def allows_minimum_value
445
441
  allows_value_of(@minimum, @low_message)
446
442
  end
447
443
 
444
+ def disallows_minimum_value
445
+ disallows_value_of(@minimum, @low_message)
446
+ end
447
+
448
448
  def allows_maximum_value
449
449
  allows_value_of(@maximum, @high_message)
450
450
  end
451
451
 
452
- def disallows_value_outside_of_array?
452
+ def disallows_maximum_value
453
+ disallows_value_of(@maximum, @high_message)
454
+ end
455
+
456
+ def allows_higher_value
457
+ allows_value_of(@maximum + 1, @high_message)
458
+ end
459
+
460
+ def disallows_higher_value
461
+ disallows_value_of(@maximum + 1, @high_message)
462
+ end
463
+
464
+ def allows_all_values_in_array?
465
+ @array.all? do |value|
466
+ allows_value_of(value, @low_message)
467
+ end
468
+ end
469
+
470
+ def disallows_any_values_in_array?
471
+ @array.any? do |value|
472
+ disallows_value_of(value, @low_message)
473
+ end
474
+ end
475
+
476
+ def allows_any_value_outside_of_array?
453
477
  if attribute_type == :boolean
454
478
  case @array
455
479
  when [false, true], [true, false]
@@ -465,11 +489,32 @@ EOT
465
489
  end
466
490
  end
467
491
 
468
- !values_outside_of_array.any? do |value|
492
+ values_outside_of_array.any? do |value|
469
493
  allows_value_of(value, @low_message)
470
494
  end
471
495
  end
472
496
 
497
+ def disallows_all_values_outside_of_array?
498
+ if attribute_type == :boolean
499
+ case @array
500
+ when [false, true], [true, false]
501
+ Shoulda::Matchers.warn BOOLEAN_ALLOWS_BOOLEAN_MESSAGE
502
+ return true
503
+ when [nil]
504
+ if attribute_column.null
505
+ Shoulda::Matchers.warn BOOLEAN_ALLOWS_NIL_MESSAGE
506
+ return true
507
+ else
508
+ raise NonNullableBooleanError.create(@attribute)
509
+ end
510
+ end
511
+ end
512
+
513
+ values_outside_of_array.all? do |value|
514
+ disallows_value_of(value, @low_message)
515
+ end
516
+ end
517
+
473
518
  def values_outside_of_array
474
519
  if !(@array & outside_values).empty?
475
520
  raise CouldNotDetermineValueOutsideOfArray
@@ -482,8 +527,8 @@ EOT
482
527
  case attribute_type
483
528
  when :boolean
484
529
  boolean_outside_values
485
- when :fixnum
486
- [ARBITRARY_OUTSIDE_FIXNUM]
530
+ when :integer
531
+ [ARBITRARY_OUTSIDE_INTEGER]
487
532
  when :decimal
488
533
  [ARBITRARY_OUTSIDE_DECIMAL]
489
534
  when :date
@@ -501,10 +546,10 @@ EOT
501
546
  values = []
502
547
 
503
548
  values << case @array
504
- when [true] then false
505
- when [false] then true
506
- else raise CouldNotDetermineValueOutsideOfArray
507
- end
549
+ when [true] then false
550
+ when [false] then true
551
+ else raise CouldNotDetermineValueOutsideOfArray
552
+ end
508
553
 
509
554
  if attribute_allows_nil?
510
555
  values << nil
@@ -537,28 +582,36 @@ EOT
537
582
 
538
583
  def column_type_to_attribute_type(type)
539
584
  case type
540
- when :integer, :float then :fixnum
541
- when :timestamp then :datetime
542
- else type
585
+ when :float then :integer
586
+ when :timestamp then :datetime
587
+ else type
543
588
  end
544
589
  end
545
590
 
546
591
  def value_to_attribute_type(value)
547
592
  case value
548
- when true, false then :boolean
549
- when BigDecimal then :decimal
550
- when Fixnum then :fixnum
551
- when Date then :date
552
- when DateTime then :datetime
553
- when Time then :time
554
- else :unknown
593
+ when true, false then :boolean
594
+ when BigDecimal then :decimal
595
+ when Integer then :integer
596
+ when Date then :date
597
+ when DateTime then :datetime
598
+ when Time then :time
599
+ else :unknown
555
600
  end
556
601
  end
557
602
 
603
+ def allows_nil_value?
604
+ @options[:allow_nil] != true || allows_value_of(nil)
605
+ end
606
+
607
+ def disallows_nil_value?
608
+ @options[:allow_nil] && disallows_value_of(nil)
609
+ end
610
+
558
611
  def inspected_array
559
612
  Shoulda::Matchers::Util.inspect_values(@array).to_sentence(
560
- two_words_connector: " or ",
561
- last_word_connector: ", or "
613
+ two_words_connector: ' or ',
614
+ last_word_connector: ', or ',
562
615
  )
563
616
  end
564
617
  end