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.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +2 -2
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +76 -82
- data/README.md +2 -0
- data/docs/code_of_conduct.md +8 -0
- data/docs/configuring_minitest.md +20 -0
- data/docs/configuring_rspec.md +19 -0
- data/docs/example_test.md +594 -0
- data/docs/faq/existing_tests.md +47 -0
- data/docs/faq/mocking_http.md +151 -0
- data/docs/faq/mocking_the_subject.md +161 -0
- data/docs/faq/mocking_time.md +34 -0
- data/docs/faq/partial_mocks.md +34 -0
- data/docs/faq/verifying_real_interactions.md +52 -0
- data/docs/img/delegator_tree.png +0 -0
- data/docs/img/example_test.png +0 -0
- data/docs/img/extract_transform_load.png +0 -0
- data/docs/img/mocktail_sorbet.jpg +0 -0
- data/docs/img/mocktail_untyped.jpg +0 -0
- data/docs/img/spacer.png +0 -0
- data/docs/installation_sorbet.md +99 -0
- data/docs/installation_untyped.md +29 -0
- data/docs/other_uses.md +32 -0
- data/docs/stubbing_and_verifying.md +515 -0
- data/docs/support/api.md +819 -0
- data/docs/support/example_test.rb +94 -0
- data/docs/support/glossary.md +426 -0
- data/docs/tdd/class_methods.md +44 -0
- data/docs/tdd/poro/dependency_inception.md +136 -0
- data/docs/tdd/poro/dependency_injection.md +82 -0
- data/docs/tdd/poro.md +15 -0
- data/docs/tdd/third_party.md +220 -0
- data/docs/tdd.md +15 -0
- data/lib/mocktail/debug.rb +4 -3
- data/lib/mocktail/share/stringifies_call.rb +0 -1
- data/lib/mocktail/simulates_argument_error/transforms_params.rb +2 -2
- data/lib/mocktail/sorbet/mocktail/debug.rb +4 -3
- data/lib/mocktail/sorbet/mocktail/share/stringifies_call.rb +0 -1
- data/lib/mocktail/sorbet/mocktail/simulates_argument_error/transforms_params.rb +2 -2
- data/lib/mocktail/sorbet/mocktail/value/call.rb +1 -1
- data/lib/mocktail/sorbet/mocktail/version.rb +1 -1
- data/lib/mocktail/value/call.rb +1 -1
- data/lib/mocktail/version.rb +1 -1
- data/mocktail.gemspec +2 -2
- data/rbi/mocktail-pregenerated.rbi +58 -0
- data/script/build +47 -0
- data/script/setup +17 -0
- data/script/spoom_me +7 -0
- data/script/strip_sigils +17 -0
- data/script/test +33 -0
- data/script/test_double_require_warnings +46 -0
- data/script/update +21 -0
- data/sorbet/config +12 -0
- data/sorbet/rbi/annotations/rainbow.rbi +269 -0
- data/sorbet/rbi/gems/ast@2.4.2.rbi +584 -0
- data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +1083 -0
- data/sorbet/rbi/gems/docile@1.4.0.rbi +376 -0
- data/sorbet/rbi/gems/json@2.6.3.rbi +1533 -0
- data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
- data/sorbet/rbi/gems/lint_roller@1.0.0.rbi +230 -0
- data/sorbet/rbi/gems/m@1.6.1.rbi +257 -0
- data/sorbet/rbi/gems/method_source@1.0.0.rbi +272 -0
- data/sorbet/rbi/gems/minitest@5.18.0.rbi +1491 -0
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
- data/sorbet/rbi/gems/parallel@1.23.0.rbi +273 -0
- data/sorbet/rbi/gems/parser@3.2.2.1.rbi +7253 -0
- data/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
- data/sorbet/rbi/gems/rake@13.0.6.rbi +3024 -0
- data/sorbet/rbi/gems/rbi@0.0.16.rbi +3049 -0
- data/sorbet/rbi/gems/regexp_parser@2.8.0.rbi +3748 -0
- data/sorbet/rbi/gems/rexml@3.2.5.rbi +4717 -0
- data/sorbet/rbi/gems/rubocop-ast@1.29.0.rbi +7003 -0
- data/sorbet/rbi/gems/rubocop-performance@1.18.0.rbi +8 -0
- data/sorbet/rbi/gems/rubocop-sorbet@0.7.0.rbi +1043 -0
- data/sorbet/rbi/gems/rubocop@1.52.0.rbi +55500 -0
- data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
- data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +216 -0
- data/sorbet/rbi/gems/simplecov@0.22.0.rbi +2148 -0
- data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +8 -0
- data/sorbet/rbi/gems/spoom@1.2.1.rbi +2536 -0
- data/sorbet/rbi/gems/standard-custom@1.0.1.rbi +63 -0
- data/sorbet/rbi/gems/standard-performance@1.1.0.rbi +8 -0
- data/sorbet/rbi/gems/standard@1.29.0.rbi +850 -0
- data/sorbet/rbi/gems/tapioca@0.11.6.rbi +3301 -0
- data/sorbet/rbi/gems/thor@1.2.2.rbi +3965 -0
- data/sorbet/rbi/gems/unicode-display_width@2.4.2.rbi +65 -0
- data/sorbet/rbi/gems/unparser@0.6.7.rbi +4524 -0
- data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +428 -0
- data/sorbet/rbi/gems/yard@0.9.34.rbi +18219 -0
- data/sorbet/tapioca/config.yml +13 -0
- data/sorbet/tapioca/require.rb +4 -0
- data/spoom_data/05f0c49.json +1 -0
- data/spoom_data/1657012.json +1 -0
- data/spoom_data/167434b.json +1 -0
- data/spoom_data/1d0ba5b.json +1 -0
- data/spoom_data/1ffa724.json +1 -0
- data/spoom_data/2129b3d.json +1 -0
- data/spoom_data/24b1c92.json +1 -0
- data/spoom_data/2c46aee.json +1 -0
- data/spoom_data/305ec0b.json +1 -0
- data/spoom_data/30e9528.json +1 -0
- data/spoom_data/4638cd5.json +1 -0
- data/spoom_data/47c7dad.json +1 -0
- data/spoom_data/4b1edef.json +1 -0
- data/spoom_data/4de157f.json +1 -0
- data/spoom_data/526e7db.json +1 -0
- data/spoom_data/5d093b9.json +1 -0
- data/spoom_data/5db3b43.json +1 -0
- data/spoom_data/5fe2a65.json +1 -0
- data/spoom_data/6891312.json +1 -0
- data/spoom_data/6b0fef4.json +1 -0
- data/spoom_data/6b83d12.json +1 -0
- data/spoom_data/74c83c2.json +1 -0
- data/spoom_data/7644ff4.json +1 -0
- data/spoom_data/79054db.json +1 -0
- data/spoom_data/814e515.json +1 -0
- data/spoom_data/88c3b60.json +1 -0
- data/spoom_data/8bd4b6e.json +1 -0
- data/spoom_data/93f8153.json +1 -0
- data/spoom_data/95242fe.json +1 -0
- data/spoom_data/97f4c09.json +1 -0
- data/spoom_data/a13d150.json +1 -0
- data/spoom_data/a17f215.json +1 -0
- data/spoom_data/b705a9d.json +1 -0
- data/spoom_data/ba19195.json +1 -0
- data/spoom_data/bef51ca.json +1 -0
- data/spoom_data/dbb595a.json +1 -0
- data/spoom_data/e8fab92.json +1 -0
- data/spoom_data/f166c87.json +1 -0
- data/spoom_data/f57992d.json +1 -0
- data/spoom_data/f5a1e40.json +1 -0
- data/spoom_data/f6d6431.json +1 -0
- data/spoom_data/f72b67c.json +1 -0
- data/spoom_data/fc2f231.json +1 -0
- data/src/mocktail/collects_calls.rb +18 -0
- data/src/mocktail/debug.rb +55 -0
- data/src/mocktail/dsl.rb +46 -0
- data/src/mocktail/errors.rb +19 -0
- data/src/mocktail/explains_nils.rb +41 -0
- data/src/mocktail/explains_thing.rb +137 -0
- data/src/mocktail/grabs_original_method_parameters.rb +33 -0
- data/src/mocktail/handles_dry_call/fulfills_stubbing/describes_unsatisfied_stubbing.rb +27 -0
- data/src/mocktail/handles_dry_call/fulfills_stubbing/finds_satisfaction.rb +24 -0
- data/src/mocktail/handles_dry_call/fulfills_stubbing.rb +45 -0
- data/src/mocktail/handles_dry_call/logs_call.rb +12 -0
- data/src/mocktail/handles_dry_call/validates_arguments.rb +45 -0
- data/src/mocktail/handles_dry_call.rb +25 -0
- data/src/mocktail/handles_dry_new_call.rb +42 -0
- data/src/mocktail/imitates_type/ensures_imitation_support.rb +16 -0
- data/src/mocktail/imitates_type/makes_double/declares_dry_class/reconstructs_call.rb +73 -0
- data/src/mocktail/imitates_type/makes_double/declares_dry_class.rb +136 -0
- data/src/mocktail/imitates_type/makes_double/gathers_fakeable_instance_methods.rb +28 -0
- data/src/mocktail/imitates_type/makes_double.rb +29 -0
- data/src/mocktail/imitates_type.rb +29 -0
- data/src/mocktail/initialize_based_on_type_system_mode_switching.rb +11 -0
- data/src/mocktail/initializes_mocktail.rb +25 -0
- data/src/mocktail/matcher_presentation.rb +21 -0
- data/src/mocktail/matchers/any.rb +27 -0
- data/src/mocktail/matchers/base.rb +39 -0
- data/src/mocktail/matchers/captor.rb +76 -0
- data/src/mocktail/matchers/includes.rb +32 -0
- data/src/mocktail/matchers/includes_hash.rb +12 -0
- data/src/mocktail/matchers/includes_key.rb +12 -0
- data/src/mocktail/matchers/includes_string.rb +12 -0
- data/src/mocktail/matchers/is_a.rb +17 -0
- data/src/mocktail/matchers/matches.rb +19 -0
- data/src/mocktail/matchers/not.rb +17 -0
- data/src/mocktail/matchers/numeric.rb +27 -0
- data/src/mocktail/matchers/that.rb +32 -0
- data/src/mocktail/matchers.rb +19 -0
- data/src/mocktail/raises_neato_no_method_error.rb +93 -0
- data/src/mocktail/records_demonstration.rb +43 -0
- data/src/mocktail/registers_matcher.rb +65 -0
- data/src/mocktail/registers_stubbing.rb +31 -0
- data/src/mocktail/replaces_next.rb +55 -0
- data/src/mocktail/replaces_type/redefines_new.rb +32 -0
- data/src/mocktail/replaces_type/redefines_singleton_methods.rb +80 -0
- data/src/mocktail/replaces_type/runs_sorbet_sig_blocks_before_replacement.rb +39 -0
- data/src/mocktail/replaces_type.rb +36 -0
- data/src/mocktail/resets_state.rb +14 -0
- data/src/mocktail/share/bind.rb +18 -0
- data/src/mocktail/share/cleans_backtrace.rb +22 -0
- data/src/mocktail/share/creates_identifier.rb +39 -0
- data/src/mocktail/share/determines_matching_calls.rb +72 -0
- data/src/mocktail/share/stringifies_call.rb +84 -0
- data/src/mocktail/share/stringifies_method_name.rb +16 -0
- data/src/mocktail/simulates_argument_error/reconciles_args_with_params.rb +27 -0
- data/src/mocktail/simulates_argument_error/recreates_message.rb +34 -0
- data/src/mocktail/simulates_argument_error/transforms_params.rb +58 -0
- data/src/mocktail/simulates_argument_error.rb +36 -0
- data/src/mocktail/sorbet.rb +3 -0
- data/src/mocktail/stringifies_method_signature.rb +53 -0
- data/src/mocktail/typed.rb +5 -0
- data/src/mocktail/value/cabinet.rb +91 -0
- data/src/mocktail/value/call.rb +51 -0
- data/src/mocktail/value/demo_config.rb +10 -0
- data/src/mocktail/value/double.rb +10 -0
- data/src/mocktail/value/double_data.rb +15 -0
- data/src/mocktail/value/explanation.rb +68 -0
- data/src/mocktail/value/explanation_data.rb +19 -0
- data/src/mocktail/value/fake_method_data.rb +11 -0
- data/src/mocktail/value/matcher_registry.rb +27 -0
- data/src/mocktail/value/no_explanation_data.rb +20 -0
- data/src/mocktail/value/signature.rb +35 -0
- data/src/mocktail/value/stubbing.rb +26 -0
- data/src/mocktail/value/top_shelf.rb +79 -0
- data/src/mocktail/value/type_replacement.rb +11 -0
- data/src/mocktail/value/type_replacement_data.rb +19 -0
- data/src/mocktail/value/unsatisfying_call.rb +9 -0
- data/src/mocktail/value/unsatisfying_call_explanation.rb +24 -0
- data/src/mocktail/value.rb +19 -0
- data/src/mocktail/verifies_call/finds_verifiable_calls.rb +21 -0
- data/src/mocktail/verifies_call/raises_verification_error/gathers_calls_of_method.rb +15 -0
- data/src/mocktail/verifies_call/raises_verification_error.rb +74 -0
- data/src/mocktail/verifies_call.rb +37 -0
- data/src/mocktail/version.rb +12 -0
- data/src/mocktail.rb +154 -0
- data/sub_projects/rbi_generator/Gemfile +4 -0
- data/sub_projects/rbi_generator/Gemfile.lock +63 -0
- data/sub_projects/rbi_generator/sorbet/rbi/gems/.gitattributes +1 -0
- data/sub_projects/sorbet_user/Gemfile +13 -0
- data/sub_projects/sorbet_user/Gemfile.lock +126 -0
- data/sub_projects/sorbet_user/Rakefile +10 -0
- data/sub_projects/sorbet_user/bin/tapioca +27 -0
- data/sub_projects/sorbet_user/rbi/mocktail.rbi +9 -0
- data/sub_projects/sorbet_user/script/test +13 -0
- data/sub_projects/sorbet_user/sorbet/config +4 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/.gitattributes +1 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/ast@2.4.3.rbi +585 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/erubi@1.13.1.rbi +155 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/json@2.21.2.rbi +2140 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/language_server-protocol@3.17.0.4.rbi +14244 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/lint_roller@1.1.0.rbi +239 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/logger@1.7.0.rbi +963 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/m@1.6.2.rbi +258 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/method_source@1.1.0.rbi +9 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/minitest@5.27.0.rbi +1549 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/mocktail@3.0.0.rbi +1923 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/parser@3.3.7.4.rbi +5451 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/prism@1.4.0.rbi +41732 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/racc@1.8.1.rbi +164 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rake@13.2.1.rbi +3028 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rbi@0.3.1.rbi +6599 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rbs@3.9.2.rbi +6976 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/regexp_parser@2.10.0.rbi +3795 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop-ast@1.43.0.rbi +7717 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop-performance@1.24.0.rbi +9 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop-sorbet@0.9.0.rbi +9 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/rubocop@1.73.2.rbi +61306 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/sorbet-eraser@0.3.1.rbi +8 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/spoom@1.6.1.rbi +7274 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/standard-custom@1.0.2.rbi +8 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/standard-performance@1.7.0.rbi +9 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/standard-sorbet@0.0.3.rbi +53 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/standard@1.47.0.rbi +935 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/tapioca@0.16.11.rbi +3628 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/unicode-display_width@3.1.4.rbi +132 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/unicode-emoji@4.2.0.rbi +254 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
- data/sub_projects/sorbet_user/sorbet/rbi/gems/yard@0.9.45.rbi +18916 -0
- data/sub_projects/sorbet_user/sorbet/tapioca/config.yml +13 -0
- data/sub_projects/sorbet_user/sorbet/tapioca/require.rb +4 -0
- data/sub_projects/sorbet_user/test/ensure_type_safety_test.rb +21 -0
- data/sub_projects/sorbet_user/test/paint_by_number_test.rb +113 -0
- data/sub_projects/sorbet_user/test/sorbet_test.rb +289 -0
- data/sub_projects/sorbet_user/test/test_helper.rb +35 -0
- data/sub_projects/untyped_user/Gemfile +4 -0
- data/sub_projects/untyped_user/Gemfile.lock +25 -0
- data/sub_projects/untyped_user/antitype_test.rb +54 -0
- data/sub_projects/untyped_user/script/test +5 -0
- 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
data/script/spoom_me
ADDED
data/script/strip_sigils
ADDED
|
@@ -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
|