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,230 +0,0 @@
1
- require 'timeout'
2
- require 'shellwords'
3
-
4
- module Tests
5
- class CommandRunner
6
- TimeoutError = Class.new(StandardError)
7
-
8
- def self.run(*args)
9
- new(*args).tap do |runner|
10
- yield runner
11
- runner.call
12
- end
13
- end
14
-
15
- def self.run!(*args)
16
- run(*args) do |runner|
17
- runner.run_successfully = true
18
- yield runner if block_given?
19
- end
20
- end
21
-
22
- attr_reader :status, :options, :env
23
- attr_accessor :command_prefix, :run_quickly, :run_successfully, :retries,
24
- :timeout
25
-
26
- def initialize(*args)
27
- @reader, @writer = IO.pipe
28
- options = (args.last.is_a?(Hash) ? args.pop : {})
29
- @args = args
30
- @options = options.merge(
31
- err: [:child, :out],
32
- out: writer
33
- )
34
- @env = extract_env_from(@options)
35
-
36
- @wrapper = ->(block) { block.call }
37
- @command_prefix = ''
38
- self.directory = Dir.pwd
39
- @run_quickly = false
40
- @run_successfully = false
41
- @retries = 1
42
- @num_times_run = 0
43
- @timeout = 20
44
- end
45
-
46
- def around_command(&block)
47
- @wrapper = block
48
- end
49
-
50
- def directory
51
- @options[:chdir]
52
- end
53
-
54
- def directory=(directory)
55
- @options[:chdir] = directory || Dir.pwd
56
- end
57
-
58
- def formatted_command
59
- [formatted_env, Shellwords.join(command)].
60
- select { |value| !value.empty? }.
61
- join(' ')
62
- end
63
-
64
- def call
65
- possibly_retrying do
66
- possibly_running_quickly do
67
- run_with_debugging
68
-
69
- if run_successfully && !success?
70
- fail!
71
- end
72
- end
73
- end
74
-
75
- self
76
- end
77
-
78
- def stop
79
- unless writer.closed?
80
- writer.close
81
- end
82
- end
83
-
84
- def output
85
- @_output ||= begin
86
- stop
87
- without_colors(reader.read)
88
- end
89
- end
90
-
91
- def elided_output
92
- lines = output.split(/\n/)
93
- new_lines = lines[0..4]
94
-
95
- if lines.size > 10
96
- new_lines << "(...#{lines.size - 10} more lines...)"
97
- end
98
-
99
- new_lines << lines[-5..-1]
100
- new_lines.join("\n")
101
- end
102
-
103
- def success?
104
- status.success?
105
- end
106
-
107
- def exit_status
108
- status.exitstatus
109
- end
110
-
111
- def fail!
112
- raise <<-MESSAGE
113
- Command #{formatted_command.inspect} exited with status #{exit_status}.
114
- Output:
115
- #{divider('START') + output + divider('END')}
116
- MESSAGE
117
- end
118
-
119
- def has_output?(expected_output)
120
- if expected_output.is_a?(Regexp)
121
- output =~ expected_output
122
- else
123
- output.include?(expected_output)
124
- end
125
- end
126
-
127
- protected
128
-
129
- attr_reader :args, :reader, :writer, :wrapper
130
-
131
- private
132
-
133
- def extract_env_from(options)
134
- options.delete(:env) { {} }.inject({}) do |hash, (key, value)|
135
- hash[key.to_s] = value
136
- hash
137
- end
138
- end
139
-
140
- def command
141
- ([command_prefix] + args).flatten.flat_map do |word|
142
- Shellwords.split(word)
143
- end
144
- end
145
-
146
- def formatted_env
147
- env.map { |key, value| "#{key}=#{value.inspect}" }.join(' ')
148
- end
149
-
150
- def run
151
- pid = spawn(env, *command, options)
152
- Process.waitpid(pid)
153
- @status = $?
154
- end
155
-
156
- def run_with_wrapper
157
- wrapper.call(method(:run))
158
- end
159
-
160
- def run_with_debugging
161
- debug { "\n\e[33mChanging to directory:\e[0m #{directory}" }
162
- debug { "\e[32mRunning command:\e[0m #{formatted_command}" }
163
-
164
- run_with_wrapper
165
-
166
- debug { "\n" + divider('START') + output + divider('END') }
167
- end
168
-
169
- def possibly_running_quickly(&block)
170
- if run_quickly
171
- begin
172
- Timeout.timeout(timeout, &block)
173
- rescue Timeout::Error
174
- stop
175
-
176
- message =
177
- "Command timed out after #{timeout} seconds: #{formatted_command}\n" +
178
- "Output:\n" +
179
- output
180
-
181
- raise TimeoutError, message
182
- end
183
- else
184
- yield
185
- end
186
- end
187
-
188
- def possibly_retrying
189
- begin
190
- @num_times_run += 1
191
- yield
192
- rescue => error
193
- debug { "#{error.class}: #{error.message}" }
194
-
195
- if @num_times_run < @retries
196
- sleep @num_times_run
197
- retry
198
- else
199
- raise error
200
- end
201
- end
202
- end
203
-
204
- def divider(title = '')
205
- total_length = 72
206
- start_length = 3
207
-
208
- string = ''
209
- string << ('-' * start_length)
210
- string << title
211
- string << '-' * (total_length - start_length - title.length)
212
- string << "\n"
213
- string
214
- end
215
-
216
- def without_colors(string)
217
- string.gsub(/\e\[\d+(?:;\d+)?m(.+?)\e\[0m/, '\1')
218
- end
219
-
220
- def debugging_enabled?
221
- ENV['DEBUG_COMMANDS'] == '1'
222
- end
223
-
224
- def debug(&block)
225
- if debugging_enabled?
226
- puts block.call
227
- end
228
- end
229
- end
230
- end
@@ -1,61 +0,0 @@
1
- require 'bundler'
2
- require 'appraisal'
3
-
4
- module Tests
5
- class CurrentBundle
6
- AppraisalNotSpecified = Class.new(ArgumentError)
7
-
8
- include Singleton
9
-
10
- def assert_appraisal!
11
- unless appraisal_in_use?
12
- message = <<EOT
13
-
14
-
15
- Please run tests starting with `appraisal <appraisal_name>`.
16
- Possible appraisals are: #{available_appraisals}
17
-
18
- EOT
19
- raise AppraisalNotSpecified, message
20
- end
21
- end
22
-
23
- def appraisal_in_use?
24
- path.dirname == root.join('gemfiles')
25
- end
26
-
27
- def current_or_latest_appraisal
28
- current_appraisal || latest_appraisal
29
- end
30
-
31
- def latest_appraisal
32
- available_appraisals.sort.last
33
- end
34
-
35
- private
36
-
37
- def available_appraisals
38
- appraisals = []
39
-
40
- Appraisal::File.each do |appraisal|
41
- appraisals << appraisal.name
42
- end
43
-
44
- appraisals
45
- end
46
-
47
- def current_appraisal
48
- if appraisal_in_use?
49
- File.basename(path, ".gemfile")
50
- end
51
- end
52
-
53
- def path
54
- Bundler.default_gemfile
55
- end
56
-
57
- def root
58
- Pathname.new('../../../..').expand_path(__FILE__)
59
- end
60
- end
61
- end
@@ -1,28 +0,0 @@
1
- require_relative 'database_configuration'
2
-
3
- module Tests
4
- class Database
5
- NAME = 'shoulda-matchers-test'
6
- ADAPTER_NAME = ENV.fetch('DATABASE_ADAPTER', 'sqlite3').to_sym
7
-
8
- include Singleton
9
-
10
- attr_reader :config
11
-
12
- def initialize
13
- @config = Tests::DatabaseConfiguration.for(NAME, ADAPTER_NAME)
14
- end
15
-
16
- def name
17
- config.database
18
- end
19
-
20
- def adapter_name
21
- config.adapter
22
- end
23
-
24
- def adapter_class
25
- config.adapter_class
26
- end
27
- end
28
- end
@@ -1,25 +0,0 @@
1
- module Tests
2
- module DatabaseAdapters
3
- class PostgreSQL
4
- def self.name
5
- :postgresql
6
- end
7
-
8
- attr_reader :database
9
-
10
- def initialize(database)
11
- @database = database
12
- end
13
-
14
- def adapter
15
- self.class.name
16
- end
17
-
18
- def require_dependencies
19
- require 'pg'
20
- end
21
- end
22
-
23
- DatabaseConfigurationRegistry.instance.register(PostgreSQL)
24
- end
25
- end
@@ -1,26 +0,0 @@
1
- module Tests
2
- module DatabaseAdapters
3
- class SQLite3
4
- def self.name
5
- :sqlite3
6
- end
7
-
8
- def initialize(_database)
9
- end
10
-
11
- def adapter
12
- self.class.name
13
- end
14
-
15
- def database
16
- 'db/db.sqlite3'
17
- end
18
-
19
- def require_dependencies
20
- require 'sqlite3'
21
- end
22
- end
23
-
24
- DatabaseConfigurationRegistry.instance.register(SQLite3)
25
- end
26
- end
@@ -1,33 +0,0 @@
1
- require_relative 'database_configuration_registry'
2
- require 'delegate'
3
-
4
- module Tests
5
- class DatabaseConfiguration < SimpleDelegator
6
- ENVIRONMENTS = %w(development test production)
7
-
8
- attr_reader :adapter_class
9
-
10
- def self.for(database_name, adapter_name)
11
- config_class = DatabaseConfigurationRegistry.instance.get(adapter_name)
12
- config = config_class.new(database_name)
13
- new(config)
14
- end
15
-
16
- def initialize(config)
17
- @adapter_class = config.class.to_s.split('::').last
18
- super(config)
19
- end
20
-
21
- def to_hash
22
- ENVIRONMENTS.each_with_object({}) do |env, config_as_hash|
23
- config_as_hash[env] = inner_config_as_hash
24
- end
25
- end
26
-
27
- private
28
-
29
- def inner_config_as_hash
30
- { 'adapter' => adapter.to_s, 'database' => database.to_s }
31
- end
32
- end
33
- end
@@ -1,28 +0,0 @@
1
- require 'singleton'
2
-
3
- module Tests
4
- class DatabaseConfigurationRegistry
5
- include Singleton
6
-
7
- def initialize
8
- @registry = {}
9
- end
10
-
11
- def register(config_class)
12
- registry[config_class.name] = config_class
13
- end
14
-
15
- def get(name)
16
- registry.fetch(name) do
17
- raise KeyError, "No such adapter registered: #{name}"
18
- end
19
- end
20
-
21
- protected
22
-
23
- attr_reader :registry
24
- end
25
- end
26
-
27
- require_relative 'database_adapters/postgresql'
28
- require_relative 'database_adapters/sqlite3'
@@ -1,100 +0,0 @@
1
- require 'fileutils'
2
-
3
- module Tests
4
- class Filesystem
5
- PROJECT_NAME = 'test-project'
6
- ROOT_DIRECTORY = Pathname.new('../../../..').expand_path(__FILE__)
7
- TEMP_DIRECTORY = ROOT_DIRECTORY.join('tmp/acceptance')
8
- PROJECT_DIRECTORY = TEMP_DIRECTORY.join(PROJECT_NAME)
9
-
10
- def root_directory
11
- ROOT_DIRECTORY
12
- end
13
-
14
- def temp_directory
15
- TEMP_DIRECTORY
16
- end
17
-
18
- def project_directory
19
- PROJECT_DIRECTORY
20
- end
21
-
22
- def wrap(path)
23
- if path.is_a?(Pathname)
24
- path
25
- else
26
- find_in_project(path)
27
- end
28
- end
29
-
30
- def within_project(&block)
31
- Dir.chdir(project_directory, &block)
32
- end
33
-
34
- def clean
35
- if temp_directory.exist?
36
- temp_directory.rmtree
37
- end
38
- end
39
-
40
- def create
41
- project_directory.mkpath
42
- end
43
-
44
- def find_in_project(path)
45
- project_directory.join(path)
46
- end
47
-
48
- def open(path, *args, &block)
49
- find_in_project(path).open(*args, &block)
50
- end
51
-
52
- def read(path)
53
- find_in_project(path).read
54
- end
55
-
56
- def write(path, content)
57
- pathname = wrap(path)
58
- create_parents_of(pathname)
59
- pathname.open('w') { |f| f.write(content) }
60
- end
61
-
62
- def create_parents_of(path)
63
- wrap(path).dirname.mkpath
64
- end
65
-
66
- def append_to_file(path, content, options = {})
67
- create_parents_of(path)
68
- open(path, 'a') { |f| f.puts(content + "\n") }
69
- end
70
-
71
- def remove_from_file(path, pattern)
72
- unless pattern.is_a?(Regexp)
73
- pattern = Regexp.new('^' + Regexp.escape(pattern) + '$')
74
- end
75
-
76
- transform(path) do |lines|
77
- lines.reject { |line| line =~ pattern }
78
- end
79
- end
80
-
81
- def comment_lines_matching(path, pattern)
82
- transform(path) do |lines|
83
- lines.map do |line|
84
- if line =~ pattern
85
- "###{line}"
86
- else
87
- line
88
- end
89
- end
90
- end
91
- end
92
-
93
- def transform(path)
94
- content = read(path)
95
- lines = content.split(/\n/)
96
- transformed_lines = yield lines
97
- write(path, transformed_lines.join("\n") + "\n")
98
- end
99
- end
100
- end
@@ -1,45 +0,0 @@
1
- module Tests
2
- class Version
3
- def initialize(version)
4
- @version = Gem::Version.new(version.to_s + '')
5
- end
6
-
7
- def <(other_version)
8
- compare?(:<, other_version)
9
- end
10
-
11
- def <=(other_version)
12
- compare?(:<=, other_version)
13
- end
14
-
15
- def ==(other_version)
16
- compare?(:==, other_version)
17
- end
18
-
19
- def >=(other_version)
20
- compare?(:>=, other_version)
21
- end
22
-
23
- def >(other_version)
24
- compare?(:>, other_version)
25
- end
26
-
27
- def =~(other_version)
28
- Gem::Requirement.new(other_version).satisfied_by?(version)
29
- end
30
-
31
- def to_s
32
- version.to_s
33
- end
34
-
35
- protected
36
-
37
- attr_reader :version
38
-
39
- private
40
-
41
- def compare?(op, other_version)
42
- Gem::Requirement.new("#{op} #{other_version}").satisfied_by?(version)
43
- end
44
- end
45
- end
@@ -1,54 +0,0 @@
1
- module UnitTests
2
- module ActiveRecord
3
- class CreateTable
4
- def self.call(table_name, columns)
5
- new(table_name, columns).call
6
- end
7
-
8
- def initialize(table_name, columns)
9
- @table_name = table_name
10
- @columns = columns
11
- end
12
-
13
- def call
14
- if columns.key?(:id) && columns[:id] == false
15
- columns.delete(:id)
16
- UnitTests::ModelBuilder.create_table(
17
- table_name,
18
- id: false,
19
- &method(:add_columns_to_table)
20
- )
21
- else
22
- UnitTests::ModelBuilder.create_table(
23
- table_name,
24
- &method(:add_columns_to_table)
25
- )
26
- end
27
- end
28
-
29
- protected
30
-
31
- attr_reader :table_name, :columns
32
-
33
- private
34
-
35
- def add_columns_to_table(table)
36
- columns.each do |column_name, column_specification|
37
- add_column_to_table(table, column_name, column_specification)
38
- end
39
- end
40
-
41
- def add_column_to_table(table, column_name, column_specification)
42
- if column_specification.is_a?(Hash)
43
- column_type = column_specification.fetch(:type)
44
- column_options = column_specification.fetch(:options, {})
45
- else
46
- column_type = column_specification
47
- column_options = {}
48
- end
49
-
50
- table.column(column_name, column_type, column_options)
51
- end
52
- end
53
- end
54
- end
@@ -1,47 +0,0 @@
1
- module UnitTests
2
- class Attribute
3
- attr_reader :name, :column_type, :column_options
4
-
5
- DEFAULT_COLUMN_TYPE = :string
6
- DEFAULT_COLUMN_OPTIONS = {
7
- null: false,
8
- array: false
9
- }
10
-
11
- def initialize(args)
12
- @args = args
13
- end
14
-
15
- def name
16
- args.fetch(:name)
17
- end
18
-
19
- def column_type
20
- args.fetch(:column_type, DEFAULT_COLUMN_TYPE)
21
- end
22
-
23
- def column_options
24
- DEFAULT_COLUMN_OPTIONS.
25
- merge(args.fetch(:column_options, {})).
26
- merge(type: column_type)
27
- end
28
-
29
- def array?
30
- column_options[:array]
31
- end
32
-
33
- def default_value
34
- args.fetch(:default_value) do
35
- if column_options[:null]
36
- nil
37
- else
38
- Shoulda::Matchers::Util.dummy_value_for(value_type, array: array?)
39
- end
40
- end
41
- end
42
-
43
- protected
44
-
45
- attr_reader :args
46
- end
47
- end