mocha 2.7.1 → 3.0.0.pre.rc.1
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/.rubocop.yml +67 -3
- data/.rubocop_todo.yml +25 -13
- data/Gemfile +11 -27
- data/README.md +3 -4
- data/RELEASE.md +37 -0
- data/Rakefile +6 -5
- data/gemfiles/Gemfile.minitest.latest +3 -3
- data/gemfiles/Gemfile.rubocop +9 -0
- data/gemfiles/Gemfile.test-unit.latest +3 -3
- data/lib/mocha/any_instance_method.rb +2 -0
- data/lib/mocha/any_instance_receiver.rb +20 -0
- data/lib/mocha/api.rb +4 -2
- data/lib/mocha/argument_iterator.rb +5 -5
- data/lib/mocha/backtrace_filter.rb +2 -0
- data/lib/mocha/{block_matcher.rb → block_matchers.rb} +2 -0
- data/lib/mocha/cardinality.rb +2 -2
- data/lib/mocha/central.rb +4 -0
- data/lib/mocha/change_state_side_effect.rb +2 -0
- data/lib/mocha/class_methods.rb +5 -4
- data/lib/mocha/configuration.rb +18 -41
- data/lib/mocha/default_name.rb +15 -0
- data/lib/mocha/default_receiver.rb +13 -0
- data/lib/mocha/deprecation.rb +15 -9
- data/lib/mocha/detection/minitest.rb +2 -0
- data/lib/mocha/detection/test_unit.rb +4 -1
- data/lib/mocha/error_with_filtered_backtrace.rb +2 -0
- data/lib/mocha/exception_raiser.rb +3 -0
- data/lib/mocha/expectation.rb +57 -23
- data/lib/mocha/expectation_error.rb +2 -0
- data/lib/mocha/expectation_error_factory.rb +2 -0
- data/lib/mocha/expectation_list.rb +2 -0
- data/lib/mocha/hooks.rb +2 -0
- data/lib/mocha/impersonating_any_instance_name.rb +13 -0
- data/lib/mocha/impersonating_name.rb +13 -0
- data/lib/mocha/in_state_ordering_constraint.rb +2 -0
- data/lib/mocha/inspect.rb +13 -10
- data/lib/mocha/instance_method.rb +2 -0
- data/lib/mocha/integration/assertion_counter.rb +2 -0
- data/lib/mocha/integration/minitest/adapter.rb +3 -0
- data/lib/mocha/integration/minitest.rb +4 -3
- data/lib/mocha/integration/monkey_patcher.rb +4 -2
- data/lib/mocha/integration/test_unit/adapter.rb +3 -0
- data/lib/mocha/integration/test_unit.rb +4 -3
- data/lib/mocha/invocation.rb +9 -6
- data/lib/mocha/logger.rb +2 -0
- data/lib/mocha/macos_version.rb +2 -0
- data/lib/mocha/method_matcher.rb +2 -0
- data/lib/mocha/minitest.rb +2 -1
- data/lib/mocha/mock.rb +8 -8
- data/lib/mocha/mockery.rb +16 -6
- data/lib/mocha/name.rb +13 -0
- data/lib/mocha/not_initialized_error.rb +2 -0
- data/lib/mocha/object_methods.rb +7 -5
- data/lib/mocha/object_receiver.rb +20 -0
- data/lib/mocha/parameter_matchers/all_of.rb +5 -1
- data/lib/mocha/parameter_matchers/any_of.rb +5 -1
- data/lib/mocha/parameter_matchers/any_parameters.rb +5 -1
- data/lib/mocha/parameter_matchers/anything.rb +5 -1
- data/lib/mocha/parameter_matchers/base.rb +4 -2
- data/lib/mocha/parameter_matchers/equals.rb +5 -1
- data/lib/mocha/parameter_matchers/equivalent_uri.rb +5 -1
- data/lib/mocha/parameter_matchers/has_entries.rb +5 -1
- data/lib/mocha/parameter_matchers/has_entry.rb +6 -1
- data/lib/mocha/parameter_matchers/has_key.rb +6 -1
- data/lib/mocha/parameter_matchers/has_keys.rb +6 -2
- data/lib/mocha/parameter_matchers/has_value.rb +6 -1
- data/lib/mocha/parameter_matchers/includes.rb +8 -7
- data/lib/mocha/parameter_matchers/instance_methods.rb +4 -2
- data/lib/mocha/parameter_matchers/instance_of.rb +5 -1
- data/lib/mocha/parameter_matchers/is_a.rb +5 -1
- data/lib/mocha/parameter_matchers/kind_of.rb +5 -1
- data/lib/mocha/parameter_matchers/not.rb +5 -1
- data/lib/mocha/parameter_matchers/optionally.rb +6 -1
- data/lib/mocha/parameter_matchers/positional_or_keyword_hash.rb +41 -16
- data/lib/mocha/parameter_matchers/regexp_matches.rb +6 -1
- data/lib/mocha/parameter_matchers/responds_with.rb +5 -1
- data/lib/mocha/parameter_matchers/yaml_equivalent.rb +5 -1
- data/lib/mocha/parameter_matchers.rb +2 -0
- data/lib/mocha/parameters_matcher.rb +9 -1
- data/lib/mocha/raised_exception.rb +2 -0
- data/lib/mocha/return_values.rb +2 -0
- data/lib/mocha/ruby_version.rb +3 -0
- data/lib/mocha/sequence.rb +2 -0
- data/lib/mocha/single_return_value.rb +1 -1
- data/lib/mocha/state_machine.rb +2 -0
- data/lib/mocha/stubbed_method.rb +9 -2
- data/lib/mocha/stubbing_error.rb +2 -0
- data/lib/mocha/test_unit.rb +2 -1
- data/lib/mocha/thrower.rb +2 -0
- data/lib/mocha/thrown_object.rb +2 -0
- data/lib/mocha/version.rb +3 -1
- data/lib/mocha/yield_parameters.rb +2 -0
- data/lib/mocha.rb +5 -0
- data/mocha.gemspec +10 -4
- metadata +17 -15
- data/lib/mocha/debug.rb +0 -9
- data/lib/mocha/integration/minitest/exception_translation.rb +0 -14
- data/lib/mocha/is_a.rb +0 -7
- data/lib/mocha/names.rb +0 -43
- data/lib/mocha/receivers.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e64d5427fb1829eee6958310ca322357d6fc0a8fa0d7856ea6b616edbf326c45
|
4
|
+
data.tar.gz: 052c4fc645bb95c2f09f9d66e1ef6a9025aea478b90accd1fc932de0151f684b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efd275f6eb30e58383bc67037953e8f02ffa0d0d9ca920ec492267184fe6f3ac8a4765b074d39d8d3b1de38d1e11a374262e3e4a4a3b3e7ee7877f8aba0529b0
|
7
|
+
data.tar.gz: 22b0a2331dc25358032dd83823de41c884a752eb69e80b21befc1d79f931cee4dcc13cf5d40f04bddc3e9ef894b1d2168b90daf3fc89935ed0cd85b41e1b3611
|
data/.rubocop.yml
CHANGED
@@ -1,7 +1,22 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rake
|
3
|
+
|
1
4
|
inherit_from: .rubocop_todo.yml
|
2
5
|
|
6
|
+
inherit_mode:
|
7
|
+
merge:
|
8
|
+
- Include
|
9
|
+
|
3
10
|
AllCops:
|
4
|
-
TargetRubyVersion: 2.2
|
11
|
+
TargetRubyVersion: 2.2
|
12
|
+
|
13
|
+
Include:
|
14
|
+
- '**/Gemfile.*'
|
15
|
+
|
16
|
+
Exclude:
|
17
|
+
- '**/Gemfile*.lock'
|
18
|
+
|
19
|
+
NewCops: enable
|
5
20
|
|
6
21
|
# Even the reference in the documentation suggests that you should prefer
|
7
22
|
# `alias_method` vs `alias`, so I don't understand why that isn't the default.
|
@@ -50,9 +65,58 @@ Layout/AccessModifierIndentation:
|
|
50
65
|
Enabled: false
|
51
66
|
|
52
67
|
# Allow long comment lines, e.g. YARD documentation
|
53
|
-
|
54
|
-
|
68
|
+
Layout/LineLength:
|
69
|
+
AllowedPatterns: ['\A\s*#']
|
55
70
|
|
56
71
|
# It's not possible to set TargetRubyVersion to Ruby < v2.2
|
57
72
|
Gemspec/RequiredRubyVersion:
|
58
73
|
Enabled: false
|
74
|
+
|
75
|
+
# It can be useful to violate this cop in tests in order to be more explicit
|
76
|
+
Lint/UselessTimes:
|
77
|
+
Exclude:
|
78
|
+
- 'test/**/*.rb'
|
79
|
+
|
80
|
+
# It can be useful to violate this cop in tests
|
81
|
+
Lint/EmptyClass:
|
82
|
+
Exclude:
|
83
|
+
- 'test/**/*.rb'
|
84
|
+
|
85
|
+
# It can be useful to violate this cop in tests when testing methods that accept a block
|
86
|
+
Lint/EmptyBlock:
|
87
|
+
Exclude:
|
88
|
+
- 'test/**/*.rb'
|
89
|
+
|
90
|
+
# There are a mix of styles in the tests and so I don't think it's worth enforcing for now
|
91
|
+
Naming/VariableNumber:
|
92
|
+
Exclude:
|
93
|
+
- 'test/**/*.rb'
|
94
|
+
|
95
|
+
# These methods from Ruby core are legitimately overridden in the tests
|
96
|
+
Style/OptionalBooleanParameter:
|
97
|
+
AllowedMethods:
|
98
|
+
- respond_to?
|
99
|
+
- public_methods
|
100
|
+
- protected_methods
|
101
|
+
- private_methods
|
102
|
+
- public_instance_methods
|
103
|
+
- protected_instance_methods
|
104
|
+
- private_instance_methods
|
105
|
+
|
106
|
+
# This cop is useful for required environment variables, but not for optional ones
|
107
|
+
Style/FetchEnvVar:
|
108
|
+
AllowedVars:
|
109
|
+
- MOCHA_RUN_INTEGRATION_TESTS
|
110
|
+
|
111
|
+
Naming/FileName:
|
112
|
+
ExpectMatchingDefinition: true
|
113
|
+
CheckDefinitionPathHierarchyRoots:
|
114
|
+
- test/unit
|
115
|
+
- test/acceptance
|
116
|
+
Exclude:
|
117
|
+
- lib/mocha/version.rb
|
118
|
+
- lib/mocha/minitest.rb
|
119
|
+
- lib/mocha/test_unit.rb
|
120
|
+
- lib/mocha/ruby_version.rb
|
121
|
+
- lib/mocha/macos_version.rb
|
122
|
+
- test/test_helper.rb
|
data/.rubocop_todo.yml
CHANGED
@@ -1,27 +1,39 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2025-01-03 14:37:32 UTC using RuboCop version 1.69.2.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
9
|
+
# Offense count: 34
|
10
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
|
10
11
|
Metrics/AbcSize:
|
11
|
-
Max:
|
12
|
+
Max: 27
|
12
13
|
|
13
|
-
# Offense count:
|
14
|
-
# Configuration parameters: CountComments.
|
14
|
+
# Offense count: 28
|
15
|
+
# Configuration parameters: CountComments, CountAsOne.
|
15
16
|
Metrics/ClassLength:
|
16
|
-
Max:
|
17
|
+
Max: 381
|
17
18
|
|
18
|
-
# Offense count:
|
19
|
-
# Configuration parameters:
|
19
|
+
# Offense count: 2
|
20
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
21
|
+
Metrics/CyclomaticComplexity:
|
22
|
+
Max: 9
|
23
|
+
|
24
|
+
# Offense count: 200
|
25
|
+
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
|
20
26
|
Metrics/MethodLength:
|
21
|
-
Max:
|
27
|
+
Max: 27
|
28
|
+
|
29
|
+
# Offense count: 3
|
30
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
31
|
+
Metrics/PerceivedComplexity:
|
32
|
+
Max: 10
|
22
33
|
|
23
|
-
# Offense count:
|
24
|
-
#
|
34
|
+
# Offense count: 68
|
35
|
+
# This cop supports safe autocorrection (--autocorrect).
|
36
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, SplitStrings.
|
25
37
|
# URISchemes: http, https
|
26
|
-
|
27
|
-
Max:
|
38
|
+
Layout/LineLength:
|
39
|
+
Max: 173
|
data/Gemfile
CHANGED
@@ -2,34 +2,18 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
gem '
|
8
|
-
else
|
5
|
+
group :development do
|
6
|
+
gem 'introspection', '~> 0.0.1'
|
7
|
+
gem 'minitest'
|
9
8
|
gem 'rake'
|
10
|
-
end
|
11
|
-
# rubocop:enable Bundler/DuplicatedGem
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
gem 'psych', '< 4'
|
18
|
-
end
|
10
|
+
if RUBY_ENGINE == 'jruby'
|
11
|
+
# Workaround for https://github.com/jruby/jruby/issues/8488
|
12
|
+
gem 'jar-dependencies', '~> 0.4.1'
|
13
|
+
end
|
19
14
|
|
20
|
-
if
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
if RUBY_VERSION >= '2.2.0'
|
25
|
-
gem 'jaro_winkler', '>= 1.5.5'
|
26
|
-
gem 'rubocop', '> 0.56', '<= 0.58.2'
|
27
|
-
end
|
28
|
-
if RUBY_ENGINE == 'jruby'
|
29
|
-
# Workaround for https://github.com/jruby/jruby/issues/8488
|
30
|
-
gem 'jar-dependencies', '~> 0.4.1'
|
31
|
-
end
|
32
|
-
if ENV['MOCHA_GENERATE_DOCS']
|
33
|
-
gem 'redcarpet'
|
34
|
-
gem 'yard'
|
15
|
+
if ENV['MOCHA_GENERATE_DOCS']
|
16
|
+
gem 'redcarpet'
|
17
|
+
gem 'yard'
|
18
|
+
end
|
35
19
|
end
|
data/README.md
CHANGED
@@ -292,10 +292,9 @@ If you want, Mocha can generate a warning or raise an exception when:
|
|
292
292
|
|
293
293
|
See the [documentation](https://mocha.jamesmead.org/Mocha/Configuration.html) for `Mocha::Configuration` for further details.
|
294
294
|
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
* `debug`: Enables a debug mode which will output backtraces for each deprecation warning. This is useful for finding where in the test suite the deprecated calls are.
|
295
|
+
### Debugging
|
296
|
+
|
297
|
+
Mocha provides some extra output to help with debugging when the standard Ruby debug option (`-d`) is set.
|
299
298
|
|
300
299
|
### Semantic versioning
|
301
300
|
|
data/RELEASE.md
CHANGED
@@ -1,5 +1,42 @@
|
|
1
1
|
# Release Notes
|
2
2
|
|
3
|
+
## 3.0.0-rc.1
|
4
|
+
|
5
|
+
### External changes
|
6
|
+
|
7
|
+
* Improvements to docs for cardinality-related methods (#700)
|
8
|
+
* Drop support for Ruby v2.1 (#628 & #695)
|
9
|
+
* Improve gemspec description (#692 & #696)
|
10
|
+
* Remove docs for `use_test_unit_gem` option (eaf03493)
|
11
|
+
* Correct docs for `MOCHA_OPTIONS` "debug" value (69ef41c0)
|
12
|
+
* Use built-in Ruby debug option vs custom module (#714 & #715)
|
13
|
+
* Enable strict keyword argument matching by default in Ruby >= v3 (#697 & #718)
|
14
|
+
* Use Ruby v1.9 Hash syntax in `Hash#mocha_inspect` used in failure messages (#651 & #719)
|
15
|
+
* Improve `#mocha_inspect` for empty keyword argument `Hash` (#588 & #720) - thanks to @herwinw for reporting
|
16
|
+
* Improve error if `Mockery.teardown` called before `Mockery.setup` (#611, #646 & #721) - thanks to @riniculous for reporting
|
17
|
+
* Freeze string literals (#722)
|
18
|
+
* Remove support for running tests with Minitest < v5 (#727)
|
19
|
+
* Allow keyword arguments to match an expectation expecting *only* positional arguments (#593 & #732) - thanks to @seandilda
|
20
|
+
for reporting
|
21
|
+
|
22
|
+
### Internal changes
|
23
|
+
|
24
|
+
* Add `Expectation#thrice` (#701) - thanks to @andrewn617
|
25
|
+
* Add `base64` to Gemfile for Ruby >= v3.3.0 to avoid warning (8c49314c & a76330d6)
|
26
|
+
* Include custom Gemfiles in Rubocop linting (04063f0d)
|
27
|
+
* Use ruby:3.4.0-rc1 vs ruby:3.4.0-preview2 in CI in preparation for the Ruby v3.4 release (b2127407)
|
28
|
+
* Add `ostruct` to Gemfile for Ruby >= v3.4.0 to avoid warning (2b05e09e)
|
29
|
+
* Add Ruby v3.4 to CI build matrix (#708)
|
30
|
+
* Fix Ruby v3.4 warnings in ObjectInspectTest (#709 & #710)
|
31
|
+
* Rubocop-related improvements (#702 & #705)
|
32
|
+
* Consistently use development group in Gemfiles (#706 & #716)
|
33
|
+
* Add missing requires for 'mocha/ruby_version' (7f99db69)
|
34
|
+
* Convert `ParameterMatchers::Base` class -> module (#712 & #723)
|
35
|
+
* Enable `ExpectMatchingDefinition` option on `Naming/FileName` cop (#726)
|
36
|
+
* Remove duplicate `DefaultReceiverTest` (39d99954)
|
37
|
+
* Improvements to keyword argument matching tests (#730)
|
38
|
+
* Improvements to keyword argument matcher unit test (#731)
|
39
|
+
|
3
40
|
## 2.7.1
|
4
41
|
|
5
42
|
### External changes
|
data/Rakefile
CHANGED
@@ -6,9 +6,10 @@ require 'bundler/setup'
|
|
6
6
|
|
7
7
|
require 'rake/testtask'
|
8
8
|
begin
|
9
|
-
# Only available with
|
9
|
+
# Only available with `gemfiles/Gemfile.rubocop`
|
10
10
|
require 'rubocop/rake_task'
|
11
|
-
rescue LoadError
|
11
|
+
rescue LoadError
|
12
|
+
warn "Unable to load 'rubocop/rake_task', but continuing anyway" if $DEBUG
|
12
13
|
end
|
13
14
|
|
14
15
|
desc 'Run all linters and tests'
|
@@ -81,6 +82,7 @@ namespace 'test' do # rubocop:disable Metrics/BlockLength
|
|
81
82
|
end
|
82
83
|
end
|
83
84
|
|
85
|
+
desc 'Run linters'
|
84
86
|
task 'lint' do
|
85
87
|
if defined?(RuboCop::RakeTask)
|
86
88
|
RuboCop::RakeTask.new
|
@@ -90,7 +92,6 @@ task 'lint' do
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
94
95
|
def benchmark_test_case(klass, iterations)
|
95
96
|
require 'benchmark'
|
96
97
|
require 'mocha/detection/minitest'
|
@@ -119,8 +120,6 @@ def benchmark_test_case(klass, iterations)
|
|
119
120
|
Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass, @silent_option) } }
|
120
121
|
end
|
121
122
|
end
|
122
|
-
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
123
|
-
|
124
123
|
if ENV['MOCHA_GENERATE_DOCS']
|
125
124
|
require 'yard'
|
126
125
|
|
@@ -134,10 +133,12 @@ if ENV['MOCHA_GENERATE_DOCS']
|
|
134
133
|
task.options = ['--title', "Mocha #{Mocha::VERSION}", '--fail-on-warning']
|
135
134
|
end
|
136
135
|
|
136
|
+
desc 'Ensure custom domain remains in place for docs on GitHub Pages'
|
137
137
|
task 'checkout_docs_cname' do
|
138
138
|
`git checkout docs/CNAME`
|
139
139
|
end
|
140
140
|
|
141
|
+
desc 'Ensure custom JavaScript files remain in place for docs on GitHub Pages'
|
141
142
|
task 'checkout_docs_js' do
|
142
143
|
`git checkout docs/js/app.js`
|
143
144
|
`git checkout docs/js/jquery.js`
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
class AnyInstanceReceiver
|
5
|
+
def initialize(klass)
|
6
|
+
@klass = klass
|
7
|
+
end
|
8
|
+
|
9
|
+
def mocks
|
10
|
+
klass = @klass
|
11
|
+
mocks = []
|
12
|
+
while klass
|
13
|
+
mocha = klass.any_instance.mocha(instantiate: false)
|
14
|
+
mocks << mocha if mocha
|
15
|
+
klass = klass.superclass
|
16
|
+
end
|
17
|
+
mocks
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/mocha/api.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/ruby_version'
|
2
4
|
require 'mocha/parameter_matchers'
|
3
5
|
require 'mocha/hooks'
|
@@ -37,8 +39,8 @@ module Mocha
|
|
37
39
|
|
38
40
|
# @private
|
39
41
|
def self.included(_mod)
|
40
|
-
Object.
|
41
|
-
Class.
|
42
|
+
Object.include Mocha::ObjectMethods
|
43
|
+
Class.include Mocha::ClassMethods
|
42
44
|
end
|
43
45
|
|
44
46
|
# @private
|
@@ -1,16 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mocha
|
2
4
|
class ArgumentIterator
|
3
5
|
def initialize(argument)
|
4
6
|
@argument = argument
|
5
7
|
end
|
6
8
|
|
7
|
-
def each
|
9
|
+
def each(&block)
|
8
10
|
if @argument.is_a?(Hash)
|
9
|
-
@argument.each
|
10
|
-
yield method_name, return_value
|
11
|
-
end
|
11
|
+
@argument.each(&block)
|
12
12
|
else
|
13
|
-
|
13
|
+
block.call(@argument)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/mocha/cardinality.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mocha
|
2
4
|
class Cardinality
|
3
5
|
INFINITY = 1 / 0.0
|
@@ -58,7 +60,6 @@ module Mocha
|
|
58
60
|
@invocations.any? || maximum.zero?
|
59
61
|
end
|
60
62
|
|
61
|
-
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
62
63
|
def anticipated_times
|
63
64
|
if allowed_any_number_of_times?
|
64
65
|
'allowed any number of times'
|
@@ -74,7 +75,6 @@ module Mocha
|
|
74
75
|
"expected between #{required} and #{count(maximum)}"
|
75
76
|
end
|
76
77
|
end
|
77
|
-
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
78
78
|
|
79
79
|
def invoked_times
|
80
80
|
"invoked #{count(@invocations.size)}"
|
data/lib/mocha/central.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mocha
|
2
4
|
class Central
|
3
5
|
class Null < self
|
@@ -23,12 +25,14 @@ module Mocha
|
|
23
25
|
|
24
26
|
def stub(method)
|
25
27
|
return if stubba_methods.detect { |m| m.matches?(method) }
|
28
|
+
|
26
29
|
method.stub
|
27
30
|
stubba_methods.push(method)
|
28
31
|
end
|
29
32
|
|
30
33
|
def unstub(method)
|
31
34
|
return unless (existing = stubba_methods.detect { |m| m.matches?(method) })
|
35
|
+
|
32
36
|
existing.unstub
|
33
37
|
stubba_methods.delete(existing)
|
34
38
|
end
|
data/lib/mocha/class_methods.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/mockery'
|
2
4
|
require 'mocha/any_instance_method'
|
3
5
|
|
@@ -10,7 +12,7 @@ module Mocha
|
|
10
12
|
@stubba_object = klass
|
11
13
|
end
|
12
14
|
|
13
|
-
def mocha(instantiate
|
15
|
+
def mocha(instantiate: true)
|
14
16
|
if instantiate
|
15
17
|
@mocha ||= Mocha::Mockery.instance.mock_impersonating_any_instance_of(@stubba_object)
|
16
18
|
else
|
@@ -46,17 +48,16 @@ module Mocha
|
|
46
48
|
if frozen?
|
47
49
|
raise StubbingError.new("can't stub method on frozen object: #{mocha_inspect}.any_instance", caller)
|
48
50
|
end
|
51
|
+
|
49
52
|
@any_instance ||= AnyInstance.new(self)
|
50
53
|
end
|
51
54
|
|
52
55
|
# @private
|
53
|
-
|
54
|
-
def __method_visibility__(method, include_public_methods = true)
|
56
|
+
def __method_visibility__(method, include_public_methods: true)
|
55
57
|
(include_public_methods && public_method_defined?(method) && :public) ||
|
56
58
|
(protected_method_defined?(method) && :protected) ||
|
57
59
|
(private_method_defined?(method) && :private)
|
58
60
|
end
|
59
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
60
61
|
alias_method :__method_exists__?, :__method_visibility__
|
61
62
|
end
|
62
63
|
end
|
data/lib/mocha/configuration.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/ruby_version'
|
2
4
|
require 'mocha/deprecation'
|
3
5
|
|
@@ -14,7 +16,6 @@ module Mocha
|
|
14
16
|
# Mocha.configure do |c|
|
15
17
|
# c.stubbing_method_unnecessarily = :prevent
|
16
18
|
# c.stubbing_method_on_non_mock_object = :warn
|
17
|
-
# c.stubbing_method_on_nil = :allow
|
18
19
|
# end
|
19
20
|
#
|
20
21
|
def self.configure
|
@@ -34,7 +35,6 @@ module Mocha
|
|
34
35
|
# Mocha.configure do |c|
|
35
36
|
# c.stubbing_method_unnecessarily = :prevent
|
36
37
|
# c.stubbing_method_on_non_mock_object = :warn
|
37
|
-
# c.stubbing_method_on_nil = :allow
|
38
38
|
# end
|
39
39
|
#
|
40
40
|
class Configuration
|
@@ -44,9 +44,8 @@ module Mocha
|
|
44
44
|
stubbing_method_on_non_mock_object: :allow,
|
45
45
|
stubbing_non_existent_method: :allow,
|
46
46
|
stubbing_non_public_method: :allow,
|
47
|
-
stubbing_method_on_nil: :prevent,
|
48
47
|
display_matching_invocations_on_failure: false,
|
49
|
-
strict_keyword_argument_matching:
|
48
|
+
strict_keyword_argument_matching: Mocha::RUBY_V30_PLUS
|
50
49
|
}.freeze
|
51
50
|
|
52
51
|
attr_reader :options
|
@@ -196,33 +195,6 @@ module Mocha
|
|
196
195
|
@options[:stubbing_non_public_method]
|
197
196
|
end
|
198
197
|
|
199
|
-
# Configure whether stubbing methods on the +nil+ object is allowed.
|
200
|
-
#
|
201
|
-
# This is usually done accidentally, but there might be rare cases where it is intended.
|
202
|
-
#
|
203
|
-
# This option only works for Ruby < v2.2.0. In later versions of Ruby +nil+ is frozen and so a {StubbingError} will be raised if you attempt to stub a method on +nil+.
|
204
|
-
#
|
205
|
-
# When +value+ is +:allow+, do nothing.
|
206
|
-
# When +value+ is +:warn+, display a warning.
|
207
|
-
# When +value+ is +:prevent+, raise a {StubbingError}. This is the default.
|
208
|
-
#
|
209
|
-
# @param [Symbol] value one of +:allow+, +:warn+, +:prevent+.
|
210
|
-
# @deprecated This method is deprecated and will be removed in a future release. +nil+ is frozen in Ruby >= v2.2 and Mocha will be dropping support for Ruby v2.1. At that point it won't be possible to stub methods on +nil+ any more.
|
211
|
-
#
|
212
|
-
def stubbing_method_on_nil=(value)
|
213
|
-
Deprecation.warning([
|
214
|
-
'`Mocha::Configuration#stubbing_method_on_nil=` is deprecated and will be removed in a future release.',
|
215
|
-
'`nil` is frozen in Ruby >= v2.2 and Mocha will be dropping support for Ruby v2.1.',
|
216
|
-
"At that point it won't be possible to stub methods on `nil` any more."
|
217
|
-
].join(' '))
|
218
|
-
@options[:stubbing_method_on_nil] = value
|
219
|
-
end
|
220
|
-
|
221
|
-
# @private
|
222
|
-
def stubbing_method_on_nil
|
223
|
-
@options[:stubbing_method_on_nil]
|
224
|
-
end
|
225
|
-
|
226
198
|
# Display matching invocations alongside expectations on Mocha-related test failure.
|
227
199
|
#
|
228
200
|
# @param [Boolean] value +true+ to enable display of matching invocations; disabled by default.
|
@@ -259,17 +231,21 @@ module Mocha
|
|
259
231
|
|
260
232
|
# Perform strict keyword argument comparison. Only supported in Ruby >= v2.7.
|
261
233
|
#
|
262
|
-
# When this option is set to +false+ a positional +Hash+ and a set of keyword arguments are treated the same during comparison, which can lead to misleading passing tests in Ruby >= v3.0 (see examples below). However, a deprecation warning will be displayed if a positional +Hash+ matches a set of keyword arguments or vice versa.
|
234
|
+
# When this option is set to +false+ a positional +Hash+ and a set of keyword arguments are treated the same during comparison, which can lead to misleading passing tests in Ruby >= v3.0 (see examples below). However, a deprecation warning will be displayed if a positional +Hash+ matches a set of keyword arguments or vice versa.
|
263
235
|
#
|
264
236
|
# For more details on keyword arguments in Ruby v3, refer to {https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0 this article}.
|
265
237
|
#
|
266
238
|
# Note that +Hash+-related matchers such as {ParameterMatchers#has_value} or {ParameterMatchers#has_key} will still treat a positional +Hash+ and a set of keyword arguments the same, so misleading passing tests are still possible when they are used.
|
267
239
|
#
|
268
|
-
# This configuration option is +false+ by default to enable gradual adoption, but
|
240
|
+
# This configuration option is +false+ by default in Ruby v2.7 to enable gradual adoption, but +true+ by default in Ruby >= v3.0.
|
269
241
|
#
|
270
|
-
# @param [Boolean] value +true+ to enable strict keyword argument matching
|
242
|
+
# @param [Boolean] value +true+ to enable strict keyword argument matching.
|
271
243
|
#
|
272
|
-
# @example Loose keyword argument matching (default)
|
244
|
+
# @example Loose keyword argument matching (default in Ruby v2.7)
|
245
|
+
#
|
246
|
+
# Mocha.configure do |c|
|
247
|
+
# c.strict_keyword_argument_matching = false
|
248
|
+
# end
|
273
249
|
#
|
274
250
|
# class Example
|
275
251
|
# def foo(a, bar:); end
|
@@ -280,7 +256,7 @@ module Mocha
|
|
280
256
|
# example.foo('a', { bar: 'b' })
|
281
257
|
# # This passes the test, but would result in an ArgumentError in practice
|
282
258
|
#
|
283
|
-
# @example Strict keyword argument matching
|
259
|
+
# @example Strict keyword argument matching (default in Ruby >= v3.0)
|
284
260
|
#
|
285
261
|
# Mocha.configure do |c|
|
286
262
|
# c.strict_keyword_argument_matching = true
|
@@ -296,6 +272,7 @@ module Mocha
|
|
296
272
|
# # This now fails as expected
|
297
273
|
def strict_keyword_argument_matching=(value)
|
298
274
|
raise 'Strict keyword argument matching requires Ruby 2.7 and above.' unless Mocha::RUBY_V27_PLUS
|
275
|
+
|
299
276
|
@options[:strict_keyword_argument_matching] = value
|
300
277
|
end
|
301
278
|
|
@@ -318,9 +295,9 @@ module Mocha
|
|
318
295
|
# @param [Hash] temporary_options the configuration options to apply for the duration of the block.
|
319
296
|
# @yield block during which the configuration change will be in force.
|
320
297
|
#
|
321
|
-
# @example Temporarily
|
322
|
-
# Mocha::Configuration.override(
|
323
|
-
#
|
298
|
+
# @example Temporarily prevent stubbing of non-mock object
|
299
|
+
# Mocha::Configuration.override(stubbing_method_on_non_mock_object: :prevent) do
|
300
|
+
# 123.stubs(:to_s).returns('456')
|
324
301
|
# end
|
325
302
|
def override(temporary_options)
|
326
303
|
original_configuration = configuration
|
@@ -342,7 +319,7 @@ module Mocha
|
|
342
319
|
if block_given?
|
343
320
|
temporarily_change_config action, new_value, &block
|
344
321
|
else
|
345
|
-
configuration.send("#{action}="
|
322
|
+
configuration.send(:"#{action}=", new_value)
|
346
323
|
end
|
347
324
|
end
|
348
325
|
|
@@ -350,7 +327,7 @@ module Mocha
|
|
350
327
|
def temporarily_change_config(action, new_value)
|
351
328
|
original_configuration = configuration
|
352
329
|
new_configuration = configuration.dup
|
353
|
-
new_configuration.send("#{action}="
|
330
|
+
new_configuration.send(:"#{action}=", new_value)
|
354
331
|
@configuration = new_configuration
|
355
332
|
yield
|
356
333
|
ensure
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
class DefaultName
|
5
|
+
def initialize(mock)
|
6
|
+
@mock = mock
|
7
|
+
end
|
8
|
+
|
9
|
+
def mocha_inspect
|
10
|
+
address = @mock.__id__ * 2
|
11
|
+
address += 0x100000000 if address < 0
|
12
|
+
"#<Mock:0x#{format('%<address>x', address: address)}>"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|