mocktail 2.0.0 → 3.0.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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +2 -2
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile +3 -2
  5. data/Gemfile.lock +76 -82
  6. data/README.md +2 -0
  7. data/docs/code_of_conduct.md +8 -0
  8. data/docs/configuring_minitest.md +20 -0
  9. data/docs/configuring_rspec.md +19 -0
  10. data/docs/example_test.md +594 -0
  11. data/docs/faq/existing_tests.md +47 -0
  12. data/docs/faq/mocking_http.md +151 -0
  13. data/docs/faq/mocking_the_subject.md +161 -0
  14. data/docs/faq/mocking_time.md +34 -0
  15. data/docs/faq/partial_mocks.md +34 -0
  16. data/docs/faq/verifying_real_interactions.md +52 -0
  17. data/docs/img/delegator_tree.png +0 -0
  18. data/docs/img/example_test.png +0 -0
  19. data/docs/img/extract_transform_load.png +0 -0
  20. data/docs/img/mocktail_sorbet.jpg +0 -0
  21. data/docs/img/mocktail_untyped.jpg +0 -0
  22. data/docs/img/spacer.png +0 -0
  23. data/docs/installation_sorbet.md +99 -0
  24. data/docs/installation_untyped.md +29 -0
  25. data/docs/other_uses.md +32 -0
  26. data/docs/stubbing_and_verifying.md +515 -0
  27. data/docs/support/api.md +819 -0
  28. data/docs/support/example_test.rb +94 -0
  29. data/docs/support/glossary.md +426 -0
  30. data/docs/tdd/class_methods.md +44 -0
  31. data/docs/tdd/poro/dependency_inception.md +136 -0
  32. data/docs/tdd/poro/dependency_injection.md +82 -0
  33. data/docs/tdd/poro.md +15 -0
  34. data/docs/tdd/third_party.md +220 -0
  35. data/docs/tdd.md +15 -0
  36. data/lib/mocktail/debug.rb +4 -3
  37. data/lib/mocktail/share/stringifies_call.rb +0 -1
  38. data/lib/mocktail/simulates_argument_error/transforms_params.rb +2 -2
  39. data/lib/mocktail/sorbet/mocktail/debug.rb +4 -3
  40. data/lib/mocktail/sorbet/mocktail/share/stringifies_call.rb +0 -1
  41. data/lib/mocktail/sorbet/mocktail/simulates_argument_error/transforms_params.rb +2 -2
  42. data/lib/mocktail/sorbet/mocktail/value/call.rb +1 -1
  43. data/lib/mocktail/sorbet/mocktail/version.rb +1 -1
  44. data/lib/mocktail/value/call.rb +1 -1
  45. data/lib/mocktail/version.rb +1 -1
  46. data/mocktail.gemspec +2 -2
  47. data/rbi/mocktail-pregenerated.rbi +58 -0
  48. data/script/build +47 -0
  49. data/script/setup +17 -0
  50. data/script/spoom_me +7 -0
  51. data/script/strip_sigils +17 -0
  52. data/script/test +33 -0
  53. data/script/test_double_require_warnings +46 -0
  54. data/script/update +21 -0
  55. data/sorbet/config +12 -0
  56. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  57. data/sorbet/rbi/gems/ast@2.4.2.rbi +584 -0
  58. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +1083 -0
  59. data/sorbet/rbi/gems/docile@1.4.0.rbi +376 -0
  60. data/sorbet/rbi/gems/json@2.6.3.rbi +1533 -0
  61. data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
  62. data/sorbet/rbi/gems/lint_roller@1.0.0.rbi +230 -0
  63. data/sorbet/rbi/gems/m@1.6.1.rbi +257 -0
  64. data/sorbet/rbi/gems/method_source@1.0.0.rbi +272 -0
  65. data/sorbet/rbi/gems/minitest@5.18.0.rbi +1491 -0
  66. data/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
  67. data/sorbet/rbi/gems/parallel@1.23.0.rbi +273 -0
  68. data/sorbet/rbi/gems/parser@3.2.2.1.rbi +7253 -0
  69. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
  70. data/sorbet/rbi/gems/rake@13.0.6.rbi +3024 -0
  71. data/sorbet/rbi/gems/rbi@0.0.16.rbi +3049 -0
  72. data/sorbet/rbi/gems/regexp_parser@2.8.0.rbi +3748 -0
  73. data/sorbet/rbi/gems/rexml@3.2.5.rbi +4717 -0
  74. data/sorbet/rbi/gems/rubocop-ast@1.29.0.rbi +7003 -0
  75. data/sorbet/rbi/gems/rubocop-performance@1.18.0.rbi +8 -0
  76. data/sorbet/rbi/gems/rubocop-sorbet@0.7.0.rbi +1043 -0
  77. data/sorbet/rbi/gems/rubocop@1.52.0.rbi +55500 -0
  78. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
  79. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +216 -0
  80. data/sorbet/rbi/gems/simplecov@0.22.0.rbi +2148 -0
  81. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +8 -0
  82. data/sorbet/rbi/gems/spoom@1.2.1.rbi +2536 -0
  83. data/sorbet/rbi/gems/standard-custom@1.0.1.rbi +63 -0
  84. data/sorbet/rbi/gems/standard-performance@1.1.0.rbi +8 -0
  85. data/sorbet/rbi/gems/standard@1.29.0.rbi +850 -0
  86. data/sorbet/rbi/gems/tapioca@0.11.6.rbi +3301 -0
  87. data/sorbet/rbi/gems/thor@1.2.2.rbi +3965 -0
  88. data/sorbet/rbi/gems/unicode-display_width@2.4.2.rbi +65 -0
  89. data/sorbet/rbi/gems/unparser@0.6.7.rbi +4524 -0
  90. data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +428 -0
  91. data/sorbet/rbi/gems/yard@0.9.34.rbi +18219 -0
  92. data/sorbet/tapioca/config.yml +13 -0
  93. data/sorbet/tapioca/require.rb +4 -0
  94. data/spoom_data/05f0c49.json +1 -0
  95. data/spoom_data/1657012.json +1 -0
  96. data/spoom_data/167434b.json +1 -0
  97. data/spoom_data/1d0ba5b.json +1 -0
  98. data/spoom_data/1ffa724.json +1 -0
  99. data/spoom_data/2129b3d.json +1 -0
  100. data/spoom_data/24b1c92.json +1 -0
  101. data/spoom_data/2c46aee.json +1 -0
  102. data/spoom_data/305ec0b.json +1 -0
  103. data/spoom_data/30e9528.json +1 -0
  104. data/spoom_data/4638cd5.json +1 -0
  105. data/spoom_data/47c7dad.json +1 -0
  106. data/spoom_data/4b1edef.json +1 -0
  107. data/spoom_data/4de157f.json +1 -0
  108. data/spoom_data/526e7db.json +1 -0
  109. data/spoom_data/5d093b9.json +1 -0
  110. data/spoom_data/5db3b43.json +1 -0
  111. data/spoom_data/5fe2a65.json +1 -0
  112. data/spoom_data/6891312.json +1 -0
  113. data/spoom_data/6b0fef4.json +1 -0
  114. data/spoom_data/6b83d12.json +1 -0
  115. data/spoom_data/74c83c2.json +1 -0
  116. data/spoom_data/7644ff4.json +1 -0
  117. data/spoom_data/79054db.json +1 -0
  118. data/spoom_data/814e515.json +1 -0
  119. data/spoom_data/88c3b60.json +1 -0
  120. data/spoom_data/8bd4b6e.json +1 -0
  121. data/spoom_data/93f8153.json +1 -0
  122. data/spoom_data/95242fe.json +1 -0
  123. data/spoom_data/97f4c09.json +1 -0
  124. data/spoom_data/a13d150.json +1 -0
  125. data/spoom_data/a17f215.json +1 -0
  126. data/spoom_data/b705a9d.json +1 -0
  127. data/spoom_data/ba19195.json +1 -0
  128. data/spoom_data/bef51ca.json +1 -0
  129. data/spoom_data/dbb595a.json +1 -0
  130. data/spoom_data/e8fab92.json +1 -0
  131. data/spoom_data/f166c87.json +1 -0
  132. data/spoom_data/f57992d.json +1 -0
  133. data/spoom_data/f5a1e40.json +1 -0
  134. data/spoom_data/f6d6431.json +1 -0
  135. data/spoom_data/f72b67c.json +1 -0
  136. data/spoom_data/fc2f231.json +1 -0
  137. data/src/mocktail/collects_calls.rb +18 -0
  138. data/src/mocktail/debug.rb +55 -0
  139. data/src/mocktail/dsl.rb +46 -0
  140. data/src/mocktail/errors.rb +19 -0
  141. data/src/mocktail/explains_nils.rb +41 -0
  142. data/src/mocktail/explains_thing.rb +137 -0
  143. data/src/mocktail/grabs_original_method_parameters.rb +33 -0
  144. data/src/mocktail/handles_dry_call/fulfills_stubbing/describes_unsatisfied_stubbing.rb +27 -0
  145. data/src/mocktail/handles_dry_call/fulfills_stubbing/finds_satisfaction.rb +24 -0
  146. data/src/mocktail/handles_dry_call/fulfills_stubbing.rb +45 -0
  147. data/src/mocktail/handles_dry_call/logs_call.rb +12 -0
  148. data/src/mocktail/handles_dry_call/validates_arguments.rb +45 -0
  149. data/src/mocktail/handles_dry_call.rb +25 -0
  150. data/src/mocktail/handles_dry_new_call.rb +42 -0
  151. data/src/mocktail/imitates_type/ensures_imitation_support.rb +16 -0
  152. data/src/mocktail/imitates_type/makes_double/declares_dry_class/reconstructs_call.rb +73 -0
  153. data/src/mocktail/imitates_type/makes_double/declares_dry_class.rb +136 -0
  154. data/src/mocktail/imitates_type/makes_double/gathers_fakeable_instance_methods.rb +28 -0
  155. data/src/mocktail/imitates_type/makes_double.rb +29 -0
  156. data/src/mocktail/imitates_type.rb +29 -0
  157. data/src/mocktail/initialize_based_on_type_system_mode_switching.rb +11 -0
  158. data/src/mocktail/initializes_mocktail.rb +25 -0
  159. data/src/mocktail/matcher_presentation.rb +21 -0
  160. data/src/mocktail/matchers/any.rb +27 -0
  161. data/src/mocktail/matchers/base.rb +39 -0
  162. data/src/mocktail/matchers/captor.rb +76 -0
  163. data/src/mocktail/matchers/includes.rb +32 -0
  164. data/src/mocktail/matchers/includes_hash.rb +12 -0
  165. data/src/mocktail/matchers/includes_key.rb +12 -0
  166. data/src/mocktail/matchers/includes_string.rb +12 -0
  167. data/src/mocktail/matchers/is_a.rb +17 -0
  168. data/src/mocktail/matchers/matches.rb +19 -0
  169. data/src/mocktail/matchers/not.rb +17 -0
  170. data/src/mocktail/matchers/numeric.rb +27 -0
  171. data/src/mocktail/matchers/that.rb +32 -0
  172. data/src/mocktail/matchers.rb +19 -0
  173. data/src/mocktail/raises_neato_no_method_error.rb +93 -0
  174. data/src/mocktail/records_demonstration.rb +43 -0
  175. data/src/mocktail/registers_matcher.rb +65 -0
  176. data/src/mocktail/registers_stubbing.rb +31 -0
  177. data/src/mocktail/replaces_next.rb +55 -0
  178. data/src/mocktail/replaces_type/redefines_new.rb +32 -0
  179. data/src/mocktail/replaces_type/redefines_singleton_methods.rb +80 -0
  180. data/src/mocktail/replaces_type/runs_sorbet_sig_blocks_before_replacement.rb +39 -0
  181. data/src/mocktail/replaces_type.rb +36 -0
  182. data/src/mocktail/resets_state.rb +14 -0
  183. data/src/mocktail/share/bind.rb +18 -0
  184. data/src/mocktail/share/cleans_backtrace.rb +22 -0
  185. data/src/mocktail/share/creates_identifier.rb +39 -0
  186. data/src/mocktail/share/determines_matching_calls.rb +72 -0
  187. data/src/mocktail/share/stringifies_call.rb +84 -0
  188. data/src/mocktail/share/stringifies_method_name.rb +16 -0
  189. data/src/mocktail/simulates_argument_error/reconciles_args_with_params.rb +27 -0
  190. data/src/mocktail/simulates_argument_error/recreates_message.rb +34 -0
  191. data/src/mocktail/simulates_argument_error/transforms_params.rb +58 -0
  192. data/src/mocktail/simulates_argument_error.rb +36 -0
  193. data/src/mocktail/sorbet.rb +3 -0
  194. data/src/mocktail/stringifies_method_signature.rb +53 -0
  195. data/src/mocktail/typed.rb +5 -0
  196. data/src/mocktail/value/cabinet.rb +91 -0
  197. data/src/mocktail/value/call.rb +51 -0
  198. data/src/mocktail/value/demo_config.rb +10 -0
  199. data/src/mocktail/value/double.rb +10 -0
  200. data/src/mocktail/value/double_data.rb +15 -0
  201. data/src/mocktail/value/explanation.rb +68 -0
  202. data/src/mocktail/value/explanation_data.rb +19 -0
  203. data/src/mocktail/value/fake_method_data.rb +11 -0
  204. data/src/mocktail/value/matcher_registry.rb +27 -0
  205. data/src/mocktail/value/no_explanation_data.rb +20 -0
  206. data/src/mocktail/value/signature.rb +35 -0
  207. data/src/mocktail/value/stubbing.rb +26 -0
  208. data/src/mocktail/value/top_shelf.rb +79 -0
  209. data/src/mocktail/value/type_replacement.rb +11 -0
  210. data/src/mocktail/value/type_replacement_data.rb +19 -0
  211. data/src/mocktail/value/unsatisfying_call.rb +9 -0
  212. data/src/mocktail/value/unsatisfying_call_explanation.rb +24 -0
  213. data/src/mocktail/value.rb +19 -0
  214. data/src/mocktail/verifies_call/finds_verifiable_calls.rb +21 -0
  215. data/src/mocktail/verifies_call/raises_verification_error/gathers_calls_of_method.rb +15 -0
  216. data/src/mocktail/verifies_call/raises_verification_error.rb +74 -0
  217. data/src/mocktail/verifies_call.rb +37 -0
  218. data/src/mocktail/version.rb +12 -0
  219. data/src/mocktail.rb +154 -0
  220. data/sub_projects/rbi_generator/Gemfile +4 -0
  221. data/sub_projects/rbi_generator/Gemfile.lock +63 -0
  222. data/sub_projects/rbi_generator/sorbet/rbi/gems/.gitattributes +1 -0
  223. data/sub_projects/sorbet_user/Gemfile +13 -0
  224. data/sub_projects/sorbet_user/Gemfile.lock +126 -0
  225. data/sub_projects/sorbet_user/Rakefile +10 -0
  226. data/sub_projects/sorbet_user/bin/tapioca +27 -0
  227. data/sub_projects/sorbet_user/rbi/mocktail.rbi +9 -0
  228. data/sub_projects/sorbet_user/script/test +13 -0
  229. data/sub_projects/sorbet_user/sorbet/config +4 -0
  230. data/sub_projects/sorbet_user/sorbet/rbi/gems/.gitattributes +1 -0
  231. data/sub_projects/sorbet_user/sorbet/rbi/gems/ast@2.4.3.rbi +585 -0
  232. data/sub_projects/sorbet_user/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
  233. data/sub_projects/sorbet_user/sorbet/rbi/gems/erubi@1.13.1.rbi +155 -0
  234. data/sub_projects/sorbet_user/sorbet/rbi/gems/json@2.21.2.rbi +2140 -0
  235. data/sub_projects/sorbet_user/sorbet/rbi/gems/language_server-protocol@3.17.0.4.rbi +14244 -0
  236. data/sub_projects/sorbet_user/sorbet/rbi/gems/lint_roller@1.1.0.rbi +239 -0
  237. data/sub_projects/sorbet_user/sorbet/rbi/gems/logger@1.7.0.rbi +963 -0
  238. data/sub_projects/sorbet_user/sorbet/rbi/gems/m@1.6.2.rbi +258 -0
  239. data/sub_projects/sorbet_user/sorbet/rbi/gems/method_source@1.1.0.rbi +9 -0
  240. data/sub_projects/sorbet_user/sorbet/rbi/gems/minitest@5.27.0.rbi +1549 -0
  241. data/sub_projects/sorbet_user/sorbet/rbi/gems/mocktail@3.0.0.rbi +1923 -0
  242. data/sub_projects/sorbet_user/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
  243. data/sub_projects/sorbet_user/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
  244. data/sub_projects/sorbet_user/sorbet/rbi/gems/parser@3.3.7.4.rbi +5451 -0
  245. data/sub_projects/sorbet_user/sorbet/rbi/gems/prism@1.4.0.rbi +41732 -0
  246. data/sub_projects/sorbet_user/sorbet/rbi/gems/racc@1.8.1.rbi +164 -0
  247. data/sub_projects/sorbet_user/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
  248. data/sub_projects/sorbet_user/sorbet/rbi/gems/rake@13.2.1.rbi +3028 -0
  249. data/sub_projects/sorbet_user/sorbet/rbi/gems/rbi@0.3.1.rbi +6599 -0
  250. data/sub_projects/sorbet_user/sorbet/rbi/gems/rbs@3.9.2.rbi +6976 -0
  251. data/sub_projects/sorbet_user/sorbet/rbi/gems/regexp_parser@2.10.0.rbi +3795 -0
  252. data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop-ast@1.43.0.rbi +7717 -0
  253. data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop-performance@1.24.0.rbi +9 -0
  254. data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop-sorbet@0.9.0.rbi +9 -0
  255. data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop@1.73.2.rbi +61306 -0
  256. data/sub_projects/sorbet_user/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
  257. data/sub_projects/sorbet_user/sorbet/rbi/gems/sorbet-eraser@0.3.1.rbi +8 -0
  258. data/sub_projects/sorbet_user/sorbet/rbi/gems/spoom@1.6.1.rbi +7274 -0
  259. data/sub_projects/sorbet_user/sorbet/rbi/gems/standard-custom@1.0.2.rbi +8 -0
  260. data/sub_projects/sorbet_user/sorbet/rbi/gems/standard-performance@1.7.0.rbi +9 -0
  261. data/sub_projects/sorbet_user/sorbet/rbi/gems/standard-sorbet@0.0.3.rbi +53 -0
  262. data/sub_projects/sorbet_user/sorbet/rbi/gems/standard@1.47.0.rbi +935 -0
  263. data/sub_projects/sorbet_user/sorbet/rbi/gems/tapioca@0.16.11.rbi +3628 -0
  264. data/sub_projects/sorbet_user/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
  265. data/sub_projects/sorbet_user/sorbet/rbi/gems/unicode-display_width@3.1.4.rbi +132 -0
  266. data/sub_projects/sorbet_user/sorbet/rbi/gems/unicode-emoji@4.2.0.rbi +254 -0
  267. data/sub_projects/sorbet_user/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
  268. data/sub_projects/sorbet_user/sorbet/rbi/gems/yard@0.9.45.rbi +18916 -0
  269. data/sub_projects/sorbet_user/sorbet/tapioca/config.yml +13 -0
  270. data/sub_projects/sorbet_user/sorbet/tapioca/require.rb +4 -0
  271. data/sub_projects/sorbet_user/test/ensure_type_safety_test.rb +21 -0
  272. data/sub_projects/sorbet_user/test/paint_by_number_test.rb +113 -0
  273. data/sub_projects/sorbet_user/test/sorbet_test.rb +289 -0
  274. data/sub_projects/sorbet_user/test/test_helper.rb +35 -0
  275. data/sub_projects/untyped_user/Gemfile +4 -0
  276. data/sub_projects/untyped_user/Gemfile.lock +25 -0
  277. data/sub_projects/untyped_user/antitype_test.rb +54 -0
  278. data/sub_projects/untyped_user/script/test +5 -0
  279. metadata +264 -8
@@ -4,6 +4,7 @@
4
4
  # This is an autogenerated file for types exported from the `mocktail` gem.
5
5
  # Please instead update this file by running `bin/tapioca gem mocktail`.
6
6
 
7
+
7
8
  # typed: true
8
9
 
9
10
  # DO NOT EDIT MANUALLY
@@ -24,6 +25,8 @@ module Mocktail
24
25
  # don't commit code that relies on it!
25
26
  #
26
27
  # source://mocktail//lib/mocktail/sorbet/mocktail.rb#149
28
+ # Stores most transactional state about calls & stubbing configurations
29
+ # Anything returned by this is undocumented and could change at any time, so
27
30
  sig { returns(::Mocktail::Cabinet) }
28
31
  def cabinet; end
29
32
 
@@ -32,6 +35,8 @@ module Mocktail
32
35
  # calls to that method
33
36
  #
34
37
  # source://mocktail//lib/mocktail/sorbet/mocktail.rb#141
38
+ # An alias for Mocktail.explain(double).reference.calls
39
+ # Takes an optional second parameter of the method name to filter only
35
40
  sig do
36
41
  params(
37
42
  double: ::Object,
@@ -71,6 +76,7 @@ module Mocktail
71
76
  # stubs its constructor to return that fake the next time klass.new is called
72
77
  #
73
78
  # source://mocktail//lib/mocktail/sorbet/mocktail.rb#63
79
+ # Returns an instance of `klass` whose implementation is mocked out AND
74
80
  sig do
75
81
  type_parameters(:T)
76
82
  .params(
@@ -100,6 +106,7 @@ module Mocktail
100
106
  # or included will also fake instance methods
101
107
  #
102
108
  # source://mocktail//lib/mocktail/sorbet/mocktail.rb#111
109
+ # Replaces every singleton method on `type` with a fake, and when instantiated
103
110
  sig { params(type: T.any(::Module, T::Class[T.anything])).void }
104
111
  def replace(type); end
105
112
 
@@ -200,6 +207,7 @@ class Mocktail::Call < ::T::Struct
200
207
  # to redefine the equality methods to compare the values of the attributes.
201
208
  #
202
209
  # source://mocktail//lib/mocktail/sorbet/mocktail/value/call.rb#27
210
+ # Because T::Struct compares with referential equality, we need
203
211
  sig { params(other: T.nilable(T.anything)).returns(T::Boolean) }
204
212
  def ==(other); end
205
213
 
@@ -212,6 +220,7 @@ class Mocktail::Call < ::T::Struct
212
220
  def hash; end
213
221
 
214
222
  class << self
223
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
215
224
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
216
225
  def inherited(s); end
217
226
  end
@@ -292,6 +301,14 @@ module Mocktail::Debug
292
301
  # mocked BasicObject
293
302
  #
294
303
  # source://mocktail//lib/mocktail/sorbet/mocktail/debug.rb#20
304
+ # It would be easy and bad for the mocktail lib to call something like
305
+ # double == other_double
306
+ # But if it's a double, that means anyone who stubs that method could change
307
+ # the internal behavior of the library in unexpected ways (as happened here:
308
+ # https://github.com/testdouble/mocktail/issues/7 )
309
+ # For that reason when we run our tests, we also want to blow up if this
310
+ # happens unintentionally. This works in conjunction with the test
311
+ # MockingMethodfulClassesTest, because it mocks every defined method on the
295
312
  sig { void }
296
313
  def guard_against_mocktail_accidentally_calling_mocks_if_debugging!; end
297
314
  end
@@ -320,6 +337,8 @@ class Mocktail::DeclaresDryClass
320
337
  # mocked methods. YMMV
321
338
  #
322
339
  # source://mocktail//lib/mocktail/sorbet/mocktail/imitates_type/makes_double/declares_dry_class.rb#55
340
+ # These have special implementations, but if the user defines
341
+ # any of them on the object itself, then they'll be replaced with normal
323
342
  sig do
324
343
  params(
325
344
  dry_class: T::Class[::Object],
@@ -372,6 +391,7 @@ class Mocktail::DemoConfig < ::T::Struct
372
391
  const :times, T.nilable(::Integer), default: T.unsafe(nil)
373
392
 
374
393
  class << self
394
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
375
395
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
376
396
  def inherited(s); end
377
397
  end
@@ -445,6 +465,7 @@ class Mocktail::Double < ::T::Struct
445
465
  const :dry_methods, T::Array[::Symbol]
446
466
 
447
467
  class << self
468
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
448
469
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
449
470
  def inherited(s); end
450
471
  end
@@ -460,6 +481,7 @@ class Mocktail::DoubleData < ::T::Struct
460
481
  const :stubbings, T::Array[Mocktail::Stubbing[T.anything]]
461
482
 
462
483
  class << self
484
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
463
485
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
464
486
  def inherited(s); end
465
487
  end
@@ -592,6 +614,7 @@ class Mocktail::FakeMethodData < ::T::Struct
592
614
  const :stubbings, T::Array[Mocktail::Stubbing[T.anything]]
593
615
 
594
616
  class << self
617
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
595
618
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
596
619
  def inherited(s); end
597
620
  end
@@ -683,6 +706,10 @@ class Mocktail::GrabsOriginalMethodParameters
683
706
  # per usual
684
707
  #
685
708
  # source://mocktail//lib/mocktail/sorbet/mocktail/grabs_original_method_parameters.rb#14
709
+ # Sorbet wraps the original method in a sig wrapper, so we need to unwrap it.
710
+ # The value returned from `owner.instance_method(method_name)` does not have
711
+ # the real parameters values available, as they'll have been erased
712
+ # If the method isn't wrapped by Sorbet, this will return the #instance_method,
686
713
  sig { params(method: T.nilable(T.any(::Method, ::UnboundMethod))).returns(T::Array[T::Array[::Symbol]]) }
687
714
  def grab(method); end
688
715
 
@@ -874,6 +901,7 @@ class Mocktail::Matchers::Base
874
901
  # single-argument, though, so that's defaulted here and in #insepct
875
902
  #
876
903
  # source://mocktail//lib/mocktail/sorbet/mocktail/matchers/base.rb#15
904
+ # Custom matchers can receive any args, kwargs, or block they want. Usually
877
905
  sig { params(expected: ::BasicObject).void }
878
906
  def initialize(expected); end
879
907
 
@@ -934,6 +962,8 @@ class Mocktail::Matchers::Captor
934
962
  # it needs to think it's being returned whatever parameter is expected
935
963
  #
936
964
  # source://mocktail//lib/mocktail/sorbet/mocktail/matchers/captor.rb#59
965
+ # This T.untyped is intentional. Even though a Capture is surely returned,
966
+ # in order for a verification demonstration to pass its own type check,
937
967
  sig { returns(T.untyped) }
938
968
  def capture; end
939
969
 
@@ -1139,6 +1169,7 @@ class Mocktail::NoExplanationData < ::T::Struct
1139
1169
  def stubbings; end
1140
1170
 
1141
1171
  class << self
1172
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1142
1173
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1143
1174
  def inherited(s); end
1144
1175
  end
@@ -1160,6 +1191,7 @@ class Mocktail::Params < ::T::Struct
1160
1191
  def rest?; end
1161
1192
 
1162
1193
  class << self
1194
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1163
1195
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1164
1196
  def inherited(s); end
1165
1197
  end
@@ -1484,6 +1516,20 @@ class Mocktail::RunsSorbetSigBlocksBeforeReplacement
1484
1516
  # It's very fun and confusing and a great time.
1485
1517
  #
1486
1518
  # source://mocktail//lib/mocktail/sorbet/mocktail/replaces_type/runs_sorbet_sig_blocks_before_replacement.rb#26
1519
+ # This is necessary because when Sorbet runs a sig block of a singleton
1520
+ # method, it has the net effect of unwrapping/redefining the method. If
1521
+ # we try to use Mocktail.replace(Foo) and Foo.bar has a Sorbet sig block,
1522
+ # then we'll end up with three "versions" of the same method and no way
1523
+ # to keep straight which one == which:
1524
+ # A - Foo.bar, as defined in the original class
1525
+ # B - Foo.bar, as redefined by RedefinesSingletonMethods
1526
+ # C - Foo.bar, as wrapped by sorbet-runtime
1527
+ # Initially, Foo.method(:bar) would == C, but after the type
1528
+ # replacement, it would == B (with a reference back to C as the original),
1529
+ # but after handling a single dry call, our invocation of
1530
+ # GrabsOriginalMethodParameters.grab(Foo.method(:bar)) would invoke the
1531
+ # Sorbet `sig` block, which has the net effect of redefining the method back
1532
+ # to A.
1487
1533
  sig { params(type: T.any(::Module, T::Class[T.anything])).void }
1488
1534
  def run(type); end
1489
1535
  end
@@ -1498,6 +1544,7 @@ class Mocktail::Signature < ::T::Struct
1498
1544
  const :block_arg, T.nilable(::Proc), default: T.unsafe(nil)
1499
1545
 
1500
1546
  class << self
1547
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1501
1548
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1502
1549
  def inherited(s); end
1503
1550
  end
@@ -1543,30 +1590,37 @@ class Mocktail::StringifiesCall
1543
1590
 
1544
1591
  private
1545
1592
 
1593
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#46
1546
1594
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#47
1547
1595
  sig { params(args: T::Array[::Object]).returns(T.nilable(::String)) }
1548
1596
  def argify(args); end
1549
1597
 
1598
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#29
1550
1599
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#30
1551
1600
  sig { params(call: ::Mocktail::Call, parens: T::Boolean).returns(T.nilable(::String)) }
1552
1601
  def args_to_s(call, parens: T.unsafe(nil)); end
1553
1602
 
1603
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#64
1554
1604
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#65
1555
1605
  sig { params(block: T.nilable(::Proc), anonymous: T::Boolean).returns(T.nilable(::String)) }
1556
1606
  def blockify(block, anonymous:); end
1557
1607
 
1608
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#52
1558
1609
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#53
1559
1610
  sig { params(kwargs: T::Hash[::Symbol, ::Object]).returns(T.nilable(::String)) }
1560
1611
  def kwargify(kwargs); end
1561
1612
 
1613
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#58
1562
1614
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#59
1563
1615
  sig { params(block: T.nilable(::Proc)).returns(T.nilable(::String)) }
1564
1616
  def lambdafy(block); end
1565
1617
 
1618
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#75
1566
1619
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#76
1567
1620
  sig { params(block: ::Proc).returns(::String) }
1568
1621
  def source_locationify(block); end
1569
1622
 
1623
+ # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#80
1570
1624
  # source://mocktail//lib/mocktail/sorbet/mocktail/share/stringifies_call.rb#81
1571
1625
  sig { params(path: ::String).returns(::String) }
1572
1626
  def strip_pwd(path); end
@@ -1621,6 +1675,7 @@ class Mocktail::Stubbing < ::T::Struct
1621
1675
  def with(&block); end
1622
1676
 
1623
1677
  class << self
1678
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1624
1679
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1625
1680
  def inherited(s); end
1626
1681
  end
@@ -1722,6 +1777,7 @@ class Mocktail::TypeReplacement < ::T::Struct
1722
1777
  prop :replacement_new, T.nilable(::Method)
1723
1778
 
1724
1779
  class << self
1780
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1725
1781
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1726
1782
  def inherited(s); end
1727
1783
  end
@@ -1741,6 +1797,7 @@ class Mocktail::TypeReplacementData < ::T::Struct
1741
1797
  def double; end
1742
1798
 
1743
1799
  class << self
1800
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1744
1801
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1745
1802
  def inherited(s); end
1746
1803
  end
@@ -1756,6 +1813,7 @@ class Mocktail::UnsatisfyingCall < ::T::Struct
1756
1813
  const :backtrace, T::Array[::String]
1757
1814
 
1758
1815
  class << self
1816
+ # source://sorbet-runtime/0.5.11971/lib/types/struct.rb#13
1759
1817
  # source://sorbet-runtime/0.5.10983/lib/types/struct.rb#13
1760
1818
  def inherited(s); end
1761
1819
  end
data/script/build ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -xeuo pipefail
4
+
5
+ echo "-----> Deleting lib/ and copying src/ to lib/"
6
+ rm -rf lib
7
+ cp -r src/ lib
8
+
9
+ echo "-----> Erasing sorbet sigs from lib/ (for non-Sorbet users)"
10
+ bundle exec sorbet-eraser "lib/**/*.rb"
11
+ echo "-----> Overwriting Mocktail::TYPED constant for lib/"
12
+ cat << RUBY > lib/mocktail/typed.rb
13
+ module Mocktail
14
+ TYPED = false
15
+ end
16
+ RUBY
17
+
18
+ echo "-----> Erasing sorbet 'typed: ' sigils from lib/mocktail"
19
+ ./script/strip_sigils
20
+
21
+ echo "-----> Copying src/ to lib/mocktail/sorbet/ (for Sorbet users)"
22
+ cp -r src/ lib/mocktail/sorbet
23
+
24
+ echo "-----> Running Standard against all code"
25
+ bundle exec rake standard:fix
26
+
27
+ echo "-----> Generating RBIs to publish with the gems"
28
+
29
+ echo "----------> ❶ Faking out mocktail.rb and pointing it to mocktail/sorbet"
30
+ mv lib/mocktail.rb lib/mocktail.rb.nope
31
+ cat << RUBY > lib/mocktail.rb
32
+ require_relative "mocktail/sorbet"
33
+ RUBY
34
+
35
+ echo "----------> ❷ Generating sorbet sigs via tapioca in sub_projects/rbi_generator"
36
+ cd sub_projects/rbi_generator
37
+ rm -f rbi/mocktail-pregenerated.rbi
38
+ rm -f sorbet/rbi/gems/mocktail@*.rbi
39
+ bundle
40
+ bundle exec tapioca gem --all --exclude=tapioca ast diff-lcs erubi netrc parser prettier_print racc rbi spoom syntax_tree thor unparser sorbet yard parallel yard-sorbet
41
+ cd ../..
42
+
43
+ echo "----------> ❸ Moving the generated RBI to rbi/mocktail-pregenerated.rbi"
44
+ cp sub_projects/rbi_generator/sorbet/rbi/gems/mocktail@*.rbi rbi/mocktail-pregenerated.rbi
45
+ mv lib/mocktail.rb.nope lib/mocktail.rb
46
+
47
+
data/script/setup ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -xeuo pipefail
4
+
5
+ bundle
6
+
7
+ cd sub_projects/rbi_generator/
8
+ bundle
9
+ cd ../..
10
+
11
+ cd sub_projects/sorbet_user/
12
+ bundle
13
+ cd ../..
14
+
15
+ cd sub_projects/untyped_user/
16
+ bundle
17
+ cd ../..
data/script/spoom_me ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -xeuo pipefail
4
+
5
+ bundle exec spoom coverage --save
6
+ bundle exec spoom coverage report
7
+ bundle exec spoom coverage open
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+
3
+ # Removes all the sigil comments from the top of our sorbet-free code
4
+
5
+ # Find all files that start with "# typed" in the first line
6
+ files=$(grep -rl '^# typed' --exclude-dir=lib/mocktail/sorbet lib/*)
7
+
8
+ # Loop through each file and delete the first line
9
+ for file in $files
10
+ do
11
+ # Check if we're on a Mac
12
+ if [[ "$OSTYPE" == "darwin"* ]]; then
13
+ sed -i '' '1d' $file
14
+ else
15
+ sed -i '1d' $file
16
+ fi
17
+ done
data/script/test ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -xeuo pipefail
4
+
5
+ echo "-----> Running Mocktail's test against src"
6
+ COVER=true bundle exec rake
7
+
8
+ echo "-----> Type-checking Mocktail source"
9
+ bundle exec srb tc
10
+
11
+ echo "-----> Building src/mocktail into lib/mocktail and lib/mocktail/sorbet"
12
+ ./script/build
13
+
14
+ echo "-----> Running Mocktail's test against lib"
15
+ MOCKTAIL_TEST_SRC_DIRECTORY="lib" bundle exec rake
16
+
17
+ echo "-----> Running Mocktail's test against lib/mocktail/sorbet"
18
+ MOCKTAIL_TEST_SRC_DIRECTORY="lib/mocktail/sorbet" bundle exec rake
19
+
20
+ echo "-----> Ensuring that double-requiring Mocktail produces the right warning and bails out of redefining constants"
21
+ script/test_double_require_warnings
22
+
23
+ echo "-----> Type-checking the copy of Mocktail in lib/mocktail/sorbet"
24
+ bundle exec srb tc --ignore src/ --dir lib/mocktail/sorbet
25
+
26
+ echo "-----> Running sample project tests"
27
+ cd sub_projects/sorbet_user
28
+ ./script/test
29
+ cd ../..
30
+
31
+ cd sub_projects/untyped_user
32
+ ./script/test
33
+ cd ../..
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "open3"
4
+
5
+ def assert_warning(command:, warning:)
6
+ stdout, stderr, status = Open3.capture3(command)
7
+ # Ignore incidental Ruby/RubyGems/Bundler runtime warnings (e.g. from a
8
+ # Ruby version shipping a newer RubyGems than an older pinned Bundler
9
+ # expects) -- they always follow Ruby's "path:line: warning: message"
10
+ # format, unlike Mocktail's own warning below.
11
+ relevant_stderr = stderr.lines.reject { |line| line.match?(/\A\S+:\d+: warning: /) }.join
12
+ if relevant_stderr != warning
13
+ fail <<~MSG
14
+ Expected the correct error message on STDERR but it was wrong"
15
+
16
+ Expected:
17
+ #{warning}
18
+
19
+ Actual:
20
+ #{stderr}
21
+ MSG
22
+
23
+ end
24
+ fail "Expected empty STDOUT, but was #{stdout.inspect}" unless stdout.empty?
25
+ fail "Expected command to exit 0, but was #{status.exitstatus}" unless status.success?
26
+ end
27
+
28
+ puts "Test requiring 'mocktail' and then 'mocktail/sorbet' gives the right warning"
29
+ assert_warning(
30
+ command: <<~CMD,
31
+ bundle exec ruby -e 'require "#{Dir.pwd}/lib/mocktail/sorbet"; require "#{Dir.pwd}/lib/mocktail"'
32
+ CMD
33
+ warning: <<~WARN
34
+ `require "mocktail"' was called, but Mocktail was already required as `require "mocktail/sorbet"', so we're NOT going to load it to avoid constants from being redefined. If you want to use Mocktail WITHOUT sorbet runtime checks, remove whatever is requiring `mocktail/sorbet'.
35
+ WARN
36
+ )
37
+
38
+ puts "Test requiring 'mocktail/sorbet' and then 'mocktail' gives the right warning"
39
+ assert_warning(
40
+ command: <<~CMD,
41
+ bundle exec ruby -e 'require "#{Dir.pwd}/lib/mocktail"; require "#{Dir.pwd}/lib/mocktail/sorbet"'
42
+ CMD
43
+ warning: <<~WARN
44
+ `require "mocktail/sorbet"' was called, but Mocktail was already required as `require "mocktail"', so we're NOT going to load it to avoid constants from being redefined. If you want to use Mocktail WITH sorbet runtime checks, remove whatever is requiring `mocktail'.
45
+ WARN
46
+ )
data/script/update ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -xeuo pipefail
4
+
5
+ echo "-----> Updating root gems"
6
+ bundle update
7
+
8
+ echo "-----> Updating 'sub_projects/rbi_generator' gems"
9
+ cd sub_projects/rbi_generator
10
+ bundle update
11
+ cd ../..
12
+
13
+ echo "-----> Updating 'sub_projects/sorbet_user' gems"
14
+ cd sub_projects/sorbet_user
15
+ bundle update
16
+ cd ../..
17
+
18
+ echo "-----> Updating 'sub_projects/untyped_user' gems"
19
+ cd sub_projects/untyped_user
20
+ bundle update
21
+ cd ../..
data/sorbet/config ADDED
@@ -0,0 +1,12 @@
1
+ --dir
2
+ .
3
+ --ignore=tmp/
4
+ --ignore=Rakefile
5
+ --ignore=vendor/
6
+ --ignore=sub_projects/sorbet_user/
7
+ --ignore=sub_projects/rbi_generator/
8
+ --ignore=lib/
9
+ # Ignore b/c these stubs will confuse the typechecker and generate a bunch of errors, even tho #typed: false
10
+ --ignore=test/support/sorbet_stubs.rb
11
+ # Ignore b/c this pregenerated rbi is for consumers of the gem, not the gem itself
12
+ --ignore=rbi/mocktail-pregenerated.rbi