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
data/src/mocktail.rb ADDED
@@ -0,0 +1,154 @@
1
+ # typed: strict
2
+
3
+ require "pathname"
4
+
5
+ if defined?(Mocktail::TYPED)
6
+ if eval("Mocktail::TYPED", binding, __FILE__, __LINE__)
7
+ warn "`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'."
8
+ else
9
+ warn "`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'."
10
+ end
11
+ return
12
+ end
13
+
14
+ require_relative "mocktail/initialize_based_on_type_system_mode_switching"
15
+
16
+ require_relative "mocktail/collects_calls"
17
+ require_relative "mocktail/debug"
18
+ require_relative "mocktail/dsl"
19
+ require_relative "mocktail/errors"
20
+ require_relative "mocktail/explains_thing"
21
+ require_relative "mocktail/explains_nils"
22
+ require_relative "mocktail/grabs_original_method_parameters"
23
+ require_relative "mocktail/handles_dry_call"
24
+ require_relative "mocktail/handles_dry_new_call"
25
+ require_relative "mocktail/imitates_type"
26
+ require_relative "mocktail/initializes_mocktail"
27
+ require_relative "mocktail/matcher_presentation"
28
+ require_relative "mocktail/matchers"
29
+ require_relative "mocktail/raises_neato_no_method_error"
30
+ require_relative "mocktail/registers_matcher"
31
+ require_relative "mocktail/registers_stubbing"
32
+ require_relative "mocktail/replaces_next"
33
+ require_relative "mocktail/replaces_type"
34
+ require_relative "mocktail/resets_state"
35
+ require_relative "mocktail/simulates_argument_error"
36
+ require_relative "mocktail/stringifies_method_signature"
37
+ require_relative "mocktail/value"
38
+ require_relative "mocktail/verifies_call"
39
+ require_relative "mocktail/version"
40
+
41
+ module Mocktail
42
+ extend T::Sig
43
+ extend DSL
44
+ BASE_PATH = T.let((Pathname.new(__FILE__) + "..").to_s, String)
45
+
46
+ # Returns an instance of `type` whose implementation is mocked out
47
+ sig {
48
+ type_parameters(:T)
49
+ .params(type: T::Class[T.all(T.type_parameter(:T), Object)])
50
+ .returns(T.all(T.type_parameter(:T), Object))
51
+ }
52
+ def self.of(type)
53
+ ImitatesType.new.imitate(type)
54
+ end
55
+
56
+ # Returns an instance of `klass` whose implementation is mocked out AND
57
+ # stubs its constructor to return that fake the next time klass.new is called
58
+ sig {
59
+ type_parameters(:T)
60
+ .params(type: T::Class[T.all(T.type_parameter(:T), Object)], count: T.nilable(Integer))
61
+ .returns(T.type_parameter(:T))
62
+ }
63
+ def self.of_next(type, count: 1)
64
+ count ||= 1
65
+ if count == 1
66
+ ReplacesNext.new.replace_once(type)
67
+ elsif !T.unsafe(Mocktail::TYPED) || T::Private::RuntimeLevels.default_checked_level == :never
68
+ T.unsafe(ReplacesNext.new).replace(type, count)
69
+ else
70
+ raise TypeCheckingError.new <<~MSG
71
+ Calling `Mocktail.of_next()' with a `count' value other than 1 is not supported when
72
+ type checking is enabled. There are two ways to fix this:
73
+
74
+ 1. Use `Mocktail.of_next_with_count(type, count)' instead, which will always return
75
+ an array of fake objects.
76
+
77
+ 2. Disable runtime type checking by setting `T::Private::RuntimeLevels.default_checked_level = :never'
78
+ or by setting the envronment variable `SORBET_RUNTIME_DEFAULT_CHECKED_LEVEL=never'
79
+ MSG
80
+ end
81
+ end
82
+
83
+ # An alias of of_next that always returns an array of fakes
84
+ sig {
85
+ type_parameters(:T)
86
+ .params(type: T::Class[T.all(T.type_parameter(:T), Object)], count: Integer)
87
+ .returns(T::Array[T.type_parameter(:T)])
88
+ }
89
+ def self.of_next_with_count(type, count)
90
+ ReplacesNext.new.replace(type, count)
91
+ end
92
+
93
+ sig { returns(Mocktail::MatcherPresentation) }
94
+ def self.matchers
95
+ MatcherPresentation.new
96
+ end
97
+
98
+ sig { returns(Mocktail::Matchers::Captor) }
99
+ def self.captor
100
+ Matchers::Captor.new
101
+ end
102
+
103
+ sig { params(matcher: T.class_of(Mocktail::Matchers::Base)).void }
104
+ def self.register_matcher(matcher)
105
+ RegistersMatcher.new.register(matcher)
106
+ end
107
+
108
+ # Replaces every singleton method on `type` with a fake, and when instantiated
109
+ # or included will also fake instance methods
110
+ sig { params(type: T.any(T::Class[T.anything], Module)).void }
111
+ def self.replace(type)
112
+ ReplacesType.new.replace(type)
113
+ nil
114
+ end
115
+
116
+ sig { void }
117
+ def self.reset
118
+ ResetsState.new.reset
119
+ end
120
+
121
+ sig {
122
+ params(thing: Object)
123
+ .returns(Explanation)
124
+ }
125
+ def self.explain(thing)
126
+ ExplainsThing.new.explain(thing)
127
+ end
128
+
129
+ sig { returns(T::Array[Mocktail::UnsatisfyingCallExplanation]) }
130
+ def self.explain_nils
131
+ ExplainsNils.new.explain
132
+ end
133
+
134
+ # An alias for Mocktail.explain(double).reference.calls
135
+ # Takes an optional second parameter of the method name to filter only
136
+ # calls to that method
137
+ sig {
138
+ params(double: Object, method_name: T.nilable(T.any(String, Symbol)))
139
+ .returns(T::Array[Mocktail::Call])
140
+ }
141
+ def self.calls(double, method_name = nil)
142
+ CollectsCalls.new.collect(double, method_name&.to_sym)
143
+ end
144
+
145
+ # Stores most transactional state about calls & stubbing configurations
146
+ # Anything returned by this is undocumented and could change at any time, so
147
+ # don't commit code that relies on it!
148
+ sig { returns Cabinet }
149
+ def self.cabinet
150
+ Thread.current[:mocktail_store] ||= Cabinet.new
151
+ end
152
+ end
153
+
154
+ Mocktail::InitializesMocktail.new.init
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "mocktail", require: false, path: "../.."
4
+ gem "tapioca", require: false
@@ -0,0 +1,63 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ mocktail (3.0.0)
5
+ sorbet-eraser (~> 0.3.1)
6
+ sorbet-runtime (~> 0.5.9204)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ benchmark (0.4.0)
12
+ erubi (1.13.1)
13
+ logger (1.7.0)
14
+ netrc (0.11.0)
15
+ parallel (1.26.3)
16
+ prism (1.4.0)
17
+ rbi (0.3.1)
18
+ prism (~> 1.0)
19
+ rbs (>= 3.4.4)
20
+ sorbet-runtime (>= 0.5.9204)
21
+ rbs (3.9.2)
22
+ logger
23
+ sorbet (0.5.11971)
24
+ sorbet-static (= 0.5.11971)
25
+ sorbet-eraser (0.3.1)
26
+ sorbet-runtime (0.5.11971)
27
+ sorbet-static (0.5.11971-universal-darwin)
28
+ sorbet-static-and-runtime (0.5.11971)
29
+ sorbet (= 0.5.11971)
30
+ sorbet-runtime (= 0.5.11971)
31
+ spoom (1.6.1)
32
+ erubi (>= 1.10.0)
33
+ prism (>= 0.28.0)
34
+ rbi (>= 0.2.3)
35
+ sorbet-static-and-runtime (>= 0.5.10187)
36
+ thor (>= 0.19.2)
37
+ tapioca (0.16.11)
38
+ benchmark
39
+ bundler (>= 2.2.25)
40
+ netrc (>= 0.11.0)
41
+ parallel (>= 1.21.0)
42
+ rbi (~> 0.2)
43
+ sorbet-static-and-runtime (>= 0.5.11087)
44
+ spoom (>= 1.2.0)
45
+ thor (>= 1.2.0)
46
+ yard-sorbet
47
+ thor (1.3.2)
48
+ yard (0.9.45)
49
+ yard-sorbet (0.9.0)
50
+ sorbet-runtime
51
+ yard
52
+
53
+ PLATFORMS
54
+ arm64-darwin-22
55
+ arm64-darwin-24
56
+ arm64-darwin-25
57
+
58
+ DEPENDENCIES
59
+ mocktail!
60
+ tapioca
61
+
62
+ BUNDLED WITH
63
+ 2.4.13
@@ -0,0 +1 @@
1
+ **/*.rbi linguist-generated=true
@@ -0,0 +1,13 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "mocktail", path: "../..", require: "mocktail/sorbet"
4
+
5
+ gem "standard"
6
+ gem "standard-sorbet"
7
+ gem "minitest", "~> 5.26" # 6.0+ requires Ruby >= 3.2, dropping support for Ruby 3.1
8
+ gem "rake"
9
+ gem "m"
10
+
11
+ gem "sorbet"
12
+ gem "sorbet-runtime"
13
+ gem "tapioca"
@@ -0,0 +1,126 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ mocktail (3.0.0)
5
+ sorbet-eraser (~> 0.3.1)
6
+ sorbet-runtime (~> 0.5.9204)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.3)
12
+ benchmark (0.4.0)
13
+ erubi (1.13.1)
14
+ json (2.21.2)
15
+ language_server-protocol (3.17.0.4)
16
+ lint_roller (1.1.0)
17
+ logger (1.7.0)
18
+ m (1.6.2)
19
+ method_source (>= 0.6.7)
20
+ rake (>= 0.9.2.2)
21
+ method_source (1.1.0)
22
+ minitest (5.27.0)
23
+ netrc (0.11.0)
24
+ parallel (1.26.3)
25
+ parser (3.3.7.4)
26
+ ast (~> 2.4.1)
27
+ racc
28
+ prism (1.4.0)
29
+ racc (1.8.1)
30
+ rainbow (3.1.1)
31
+ rake (13.2.1)
32
+ rbi (0.3.1)
33
+ prism (~> 1.0)
34
+ rbs (>= 3.4.4)
35
+ sorbet-runtime (>= 0.5.9204)
36
+ rbs (3.9.2)
37
+ logger
38
+ regexp_parser (2.10.0)
39
+ rubocop (1.73.2)
40
+ json (~> 2.3)
41
+ language_server-protocol (~> 3.17.0.2)
42
+ lint_roller (~> 1.1.0)
43
+ parallel (~> 1.10)
44
+ parser (>= 3.3.0.2)
45
+ rainbow (>= 2.2.2, < 4.0)
46
+ regexp_parser (>= 2.9.3, < 3.0)
47
+ rubocop-ast (>= 1.38.0, < 2.0)
48
+ ruby-progressbar (~> 1.7)
49
+ unicode-display_width (>= 2.4.0, < 4.0)
50
+ rubocop-ast (1.43.0)
51
+ parser (>= 3.3.7.2)
52
+ prism (~> 1.4)
53
+ rubocop-performance (1.24.0)
54
+ lint_roller (~> 1.1)
55
+ rubocop (>= 1.72.1, < 2.0)
56
+ rubocop-ast (>= 1.38.0, < 2.0)
57
+ rubocop-sorbet (0.9.0)
58
+ lint_roller (~> 1.1)
59
+ rubocop (>= 1)
60
+ ruby-progressbar (1.13.0)
61
+ sorbet (0.5.11971)
62
+ sorbet-static (= 0.5.11971)
63
+ sorbet-eraser (0.3.1)
64
+ sorbet-runtime (0.5.11971)
65
+ sorbet-static (0.5.11971-universal-darwin)
66
+ sorbet-static-and-runtime (0.5.11971)
67
+ sorbet (= 0.5.11971)
68
+ sorbet-runtime (= 0.5.11971)
69
+ spoom (1.6.1)
70
+ erubi (>= 1.10.0)
71
+ prism (>= 0.28.0)
72
+ rbi (>= 0.2.3)
73
+ sorbet-static-and-runtime (>= 0.5.10187)
74
+ thor (>= 0.19.2)
75
+ standard (1.47.0)
76
+ language_server-protocol (~> 3.17.0.2)
77
+ lint_roller (~> 1.0)
78
+ rubocop (~> 1.73.0)
79
+ standard-custom (~> 1.0.0)
80
+ standard-performance (~> 1.7)
81
+ standard-custom (1.0.2)
82
+ lint_roller (~> 1.0)
83
+ rubocop (~> 1.50)
84
+ standard-performance (1.7.0)
85
+ lint_roller (~> 1.1)
86
+ rubocop-performance (~> 1.24.0)
87
+ standard-sorbet (0.0.3)
88
+ lint_roller (~> 1.1)
89
+ rubocop-sorbet (~> 0.9.0)
90
+ tapioca (0.16.11)
91
+ benchmark
92
+ bundler (>= 2.2.25)
93
+ netrc (>= 0.11.0)
94
+ parallel (>= 1.21.0)
95
+ rbi (~> 0.2)
96
+ sorbet-static-and-runtime (>= 0.5.11087)
97
+ spoom (>= 1.2.0)
98
+ thor (>= 1.2.0)
99
+ yard-sorbet
100
+ thor (1.3.2)
101
+ unicode-display_width (3.1.4)
102
+ unicode-emoji (~> 4.0, >= 4.0.4)
103
+ unicode-emoji (4.2.0)
104
+ yard (0.9.45)
105
+ yard-sorbet (0.9.0)
106
+ sorbet-runtime
107
+ yard
108
+
109
+ PLATFORMS
110
+ arm64-darwin-22
111
+ arm64-darwin-24
112
+ arm64-darwin-25
113
+
114
+ DEPENDENCIES
115
+ m
116
+ minitest (~> 5.26)
117
+ mocktail!
118
+ rake
119
+ sorbet
120
+ sorbet-runtime
121
+ standard
122
+ standard-sorbet
123
+ tapioca
124
+
125
+ BUNDLED WITH
126
+ 2.4.13
@@ -0,0 +1,10 @@
1
+ require "rake/testtask"
2
+ require "standard/rake"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task default: [:test, "standard:fix"]
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'tapioca' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
12
+
13
+ bundle_binstub = File.expand_path("bundle", __dir__)
14
+
15
+ if File.file?(bundle_binstub)
16
+ if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
17
+ load(bundle_binstub)
18
+ else
19
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21
+ end
22
+ end
23
+
24
+ require "rubygems"
25
+ require "bundler/setup"
26
+
27
+ load Gem.bin_path("tapioca", "tapioca")
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+
3
+ class Mocktail::MatcherPresentation
4
+ sig {
5
+ returns(T.untyped)
6
+ }
7
+ def is_5
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -xeuo pipefail
4
+
5
+ echo "-----> [Sorbet Example Project] Nuking and regenerating Mocktail RBI files"
6
+ rm -rf sorbet/rbi/gems/mocktail*
7
+ bin/tapioca gems
8
+
9
+ echo "-----> [Sorbet Example Project] Type-checking"
10
+ bundle exec srb tc
11
+
12
+ echo "-----> [Sorbet Example Project] Running tests"
13
+ bundle exec rake
@@ -0,0 +1,4 @@
1
+ --dir
2
+ .
3
+ --ignore=tmp/
4
+ --ignore=vendor/
@@ -0,0 +1 @@
1
+ **/*.rbi linguist-generated=true