mocha 1.1.0 → 1.13.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 (263) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +61 -0
  4. data/.rubocop_todo.yml +27 -0
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTING.md +4 -9
  7. data/README.md +114 -28
  8. data/RELEASE.md +248 -1
  9. data/Rakefile +53 -35
  10. data/gemfiles/Gemfile.test-unit.latest +5 -1
  11. data/init.rb +1 -3
  12. data/lib/mocha/any_instance_method.rb +12 -72
  13. data/lib/mocha/api.rb +121 -56
  14. data/lib/mocha/argument_iterator.rb +4 -8
  15. data/lib/mocha/backtrace_filter.rb +1 -5
  16. data/lib/mocha/block_matcher.rb +31 -0
  17. data/lib/mocha/cardinality.rb +60 -49
  18. data/lib/mocha/central.rb +21 -12
  19. data/lib/mocha/change_state_side_effect.rb +0 -4
  20. data/lib/mocha/class_methods.rb +19 -20
  21. data/lib/mocha/configuration.rb +361 -18
  22. data/lib/mocha/debug.rb +3 -2
  23. data/lib/mocha/deprecation.rb +8 -11
  24. data/lib/mocha/detection/mini_test.rb +0 -2
  25. data/lib/mocha/detection/test_unit.rb +3 -5
  26. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  27. data/lib/mocha/exception_raiser.rb +4 -6
  28. data/lib/mocha/expectation.rb +125 -89
  29. data/lib/mocha/expectation_error.rb +1 -1
  30. data/lib/mocha/expectation_error_factory.rb +0 -1
  31. data/lib/mocha/expectation_list.rb +7 -11
  32. data/lib/mocha/hooks.rb +1 -3
  33. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  34. data/lib/mocha/inspect.rb +30 -38
  35. data/lib/mocha/instance_method.rb +15 -8
  36. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  37. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  38. data/lib/mocha/integration/mini_test/nothing.rb +4 -4
  39. data/lib/mocha/integration/mini_test/version_13.rb +4 -1
  40. data/lib/mocha/integration/mini_test/version_140.rb +4 -1
  41. data/lib/mocha/integration/mini_test/version_141.rb +4 -1
  42. data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
  43. data/lib/mocha/integration/mini_test/version_200.rb +4 -1
  44. data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
  45. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
  46. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
  47. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
  48. data/lib/mocha/integration/mini_test.rb +7 -0
  49. data/lib/mocha/integration/monkey_patcher.rb +8 -2
  50. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  51. data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
  52. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
  53. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
  54. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
  55. data/lib/mocha/integration/test_unit/nothing.rb +4 -4
  56. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +4 -1
  57. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
  58. data/lib/mocha/integration/test_unit.rb +7 -0
  59. data/lib/mocha/integration.rb +2 -5
  60. data/lib/mocha/invocation.rb +77 -0
  61. data/lib/mocha/is_a.rb +0 -2
  62. data/lib/mocha/logger.rb +0 -4
  63. data/lib/mocha/macos_version.rb +5 -0
  64. data/lib/mocha/method_matcher.rb +1 -5
  65. data/lib/mocha/minitest.rb +8 -0
  66. data/lib/mocha/mock.rb +94 -46
  67. data/lib/mocha/mockery.rb +72 -98
  68. data/lib/mocha/names.rb +2 -12
  69. data/lib/mocha/not_initialized_error.rb +7 -0
  70. data/lib/mocha/object_methods.rb +25 -31
  71. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  72. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  73. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  74. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  75. data/lib/mocha/parameter_matchers/base.rb +6 -12
  76. data/lib/mocha/parameter_matchers/equals.rb +1 -7
  77. data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +15 -15
  78. data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
  79. data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
  80. data/lib/mocha/parameter_matchers/has_key.rb +2 -7
  81. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  82. data/lib/mocha/parameter_matchers/has_value.rb +2 -7
  83. data/lib/mocha/parameter_matchers/includes.rb +50 -8
  84. data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
  85. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  86. data/lib/mocha/parameter_matchers/is_a.rb +2 -7
  87. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  88. data/lib/mocha/parameter_matchers/not.rb +2 -7
  89. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  90. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  91. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  92. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  93. data/lib/mocha/parameter_matchers.rb +3 -4
  94. data/lib/mocha/parameters_matcher.rb +6 -9
  95. data/lib/mocha/raised_exception.rb +11 -0
  96. data/lib/mocha/receivers.rb +10 -14
  97. data/lib/mocha/return_values.rb +4 -8
  98. data/lib/mocha/ruby_version.rb +4 -0
  99. data/lib/mocha/sequence.rb +4 -9
  100. data/lib/mocha/setup.rb +5 -0
  101. data/lib/mocha/single_return_value.rb +2 -5
  102. data/lib/mocha/singleton_class.rb +9 -0
  103. data/lib/mocha/state_machine.rb +33 -46
  104. data/lib/mocha/stubbed_method.rb +125 -0
  105. data/lib/mocha/stubbing_error.rb +2 -13
  106. data/lib/mocha/test_unit.rb +7 -2
  107. data/lib/mocha/thrower.rb +4 -6
  108. data/lib/mocha/thrown_object.rb +12 -0
  109. data/lib/mocha/version.rb +1 -1
  110. data/lib/mocha/yield_parameters.rb +7 -17
  111. data/lib/mocha.rb +8 -0
  112. data/mocha.gemspec +42 -40
  113. data/yard-templates/default/layout/html/google_analytics.erb +6 -9
  114. data/yard-templates/default/layout/html/setup.rb +2 -3
  115. metadata +45 -191
  116. data/bin/build-matrix +0 -71
  117. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  118. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  119. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  120. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  121. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  122. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  123. data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
  124. data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
  125. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  126. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
  127. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  128. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  129. data/lib/mocha/class_method.rb +0 -127
  130. data/lib/mocha/mini_test.rb +0 -3
  131. data/lib/mocha/module_method.rb +0 -16
  132. data/lib/mocha/module_methods.rb +0 -14
  133. data/lib/mocha/multiple_yields.rb +0 -20
  134. data/lib/mocha/no_yields.rb +0 -11
  135. data/lib/mocha/parameter_matchers/object.rb +0 -17
  136. data/lib/mocha/pretty_parameters.rb +0 -28
  137. data/lib/mocha/single_yield.rb +0 -18
  138. data/lib/mocha/standalone.rb +0 -4
  139. data/lib/mocha/unexpected_invocation.rb +0 -26
  140. data/lib/mocha_standalone.rb +0 -4
  141. data/test/acceptance/acceptance_test_helper.rb +0 -41
  142. data/test/acceptance/bug_18914_test.rb +0 -43
  143. data/test/acceptance/bug_21465_test.rb +0 -34
  144. data/test/acceptance/bug_21563_test.rb +0 -25
  145. data/test/acceptance/exception_rescue_test.rb +0 -55
  146. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  147. data/test/acceptance/expected_invocation_count_test.rb +0 -232
  148. data/test/acceptance/failure_messages_test.rb +0 -64
  149. data/test/acceptance/issue_65_test.rb +0 -63
  150. data/test/acceptance/issue_70_test.rb +0 -55
  151. data/test/acceptance/mocha_example_test.rb +0 -98
  152. data/test/acceptance/mocha_test_result_test.rb +0 -84
  153. data/test/acceptance/mock_test.rb +0 -100
  154. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  155. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  156. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  157. data/test/acceptance/optional_parameters_test.rb +0 -70
  158. data/test/acceptance/parameter_matcher_test.rb +0 -337
  159. data/test/acceptance/partial_mocks_test.rb +0 -47
  160. data/test/acceptance/prepend_test.rb +0 -88
  161. data/test/acceptance/raise_exception_test.rb +0 -39
  162. data/test/acceptance/return_value_test.rb +0 -52
  163. data/test/acceptance/sequence_test.rb +0 -192
  164. data/test/acceptance/states_test.rb +0 -70
  165. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
  166. data/test/acceptance/stub_any_instance_method_test.rb +0 -238
  167. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  168. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  169. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  170. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
  171. data/test/acceptance/stub_everything_test.rb +0 -56
  172. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  173. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  174. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
  175. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  176. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
  177. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  178. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  179. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  180. data/test/acceptance/stub_module_method_test.rb +0 -163
  181. data/test/acceptance/stub_test.rb +0 -52
  182. data/test/acceptance/stubba_example_test.rb +0 -102
  183. data/test/acceptance/stubba_test_result_test.rb +0 -66
  184. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  185. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  186. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  187. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  188. data/test/acceptance/stubbing_nil_test.rb +0 -59
  189. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
  190. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  191. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  192. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  193. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  194. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  195. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  196. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  197. data/test/acceptance/throw_test.rb +0 -45
  198. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  199. data/test/acceptance/unstubbing_test.rb +0 -168
  200. data/test/assertions.rb +0 -6
  201. data/test/deprecation_disabler.rb +0 -15
  202. data/test/execution_point.rb +0 -36
  203. data/test/integration/mini_test_test.rb +0 -8
  204. data/test/integration/shared_tests.rb +0 -174
  205. data/test/integration/test_unit_test.rb +0 -8
  206. data/test/method_definer.rb +0 -24
  207. data/test/mini_test_result.rb +0 -90
  208. data/test/minitest_result.rb +0 -49
  209. data/test/simple_counter.rb +0 -13
  210. data/test/test_helper.rb +0 -50
  211. data/test/test_runner.rb +0 -58
  212. data/test/test_unit_result.rb +0 -20
  213. data/test/unit/any_instance_method_test.rb +0 -132
  214. data/test/unit/array_inspect_test.rb +0 -16
  215. data/test/unit/backtrace_filter_test.rb +0 -19
  216. data/test/unit/cardinality_test.rb +0 -56
  217. data/test/unit/central_test.rb +0 -100
  218. data/test/unit/change_state_side_effect_test.rb +0 -41
  219. data/test/unit/class_method_test.rb +0 -223
  220. data/test/unit/class_methods_test.rb +0 -40
  221. data/test/unit/configuration_test.rb +0 -38
  222. data/test/unit/date_time_inspect_test.rb +0 -21
  223. data/test/unit/exception_raiser_test.rb +0 -42
  224. data/test/unit/expectation_list_test.rb +0 -82
  225. data/test/unit/expectation_test.rb +0 -497
  226. data/test/unit/hash_inspect_test.rb +0 -16
  227. data/test/unit/hooks_test.rb +0 -29
  228. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  229. data/test/unit/method_matcher_test.rb +0 -28
  230. data/test/unit/mock_test.rb +0 -341
  231. data/test/unit/mockery_test.rb +0 -151
  232. data/test/unit/module_methods_test.rb +0 -19
  233. data/test/unit/multiple_yields_test.rb +0 -18
  234. data/test/unit/no_yields_test.rb +0 -18
  235. data/test/unit/object_inspect_test.rb +0 -38
  236. data/test/unit/object_methods_test.rb +0 -46
  237. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  238. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  239. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  240. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  241. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  242. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  243. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  244. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  245. data/test/unit/parameter_matchers/includes_test.rb +0 -59
  246. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  247. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  248. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  249. data/test/unit/parameter_matchers/not_test.rb +0 -26
  250. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  251. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  252. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  253. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  254. data/test/unit/parameters_matcher_test.rb +0 -121
  255. data/test/unit/receivers_test.rb +0 -66
  256. data/test/unit/return_values_test.rb +0 -63
  257. data/test/unit/sequence_test.rb +0 -104
  258. data/test/unit/single_return_value_test.rb +0 -14
  259. data/test/unit/single_yield_test.rb +0 -18
  260. data/test/unit/state_machine_test.rb +0 -98
  261. data/test/unit/string_inspect_test.rb +0 -11
  262. data/test/unit/thrower_test.rb +0 -20
  263. data/test/unit/yield_parameters_test.rb +0 -93
@@ -1,16 +1,14 @@
1
1
  module Mocha
2
-
3
2
  # Used to constrain the order in which expectations can occur.
4
3
  #
5
4
  # @see API#sequence
6
5
  # @see Expectation#in_sequence
7
6
  class Sequence
8
-
9
7
  # @private
10
8
  class InSequenceOrderingConstraint
11
-
12
9
  def initialize(sequence, index)
13
- @sequence, @index = sequence, index
10
+ @sequence = sequence
11
+ @index = index
14
12
  end
15
13
 
16
14
  def allows_invocation_now?
@@ -20,7 +18,6 @@ module Mocha
20
18
  def mocha_inspect
21
19
  "in sequence #{@sequence.mocha_inspect}"
22
20
  end
23
-
24
21
  end
25
22
 
26
23
  # @private
@@ -38,14 +35,12 @@ module Mocha
38
35
 
39
36
  # @private
40
37
  def satisfied_to_index?(index)
41
- @expectations[0...index].all? { |expectation| expectation.satisfied? }
38
+ @expectations[0...index].all?(&:satisfied?)
42
39
  end
43
40
 
44
41
  # @private
45
42
  def mocha_inspect
46
- "#{@name.mocha_inspect}"
43
+ @name.mocha_inspect.to_s
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
data/lib/mocha/setup.rb CHANGED
@@ -1,4 +1,9 @@
1
1
  require 'mocha/integration'
2
+ require 'mocha/deprecation'
3
+
4
+ Mocha::Deprecation.warning(
5
+ "Require 'mocha/test_unit', 'mocha/minitest' or 'mocha/api' instead of 'mocha/setup'."
6
+ )
2
7
 
3
8
  module Mocha
4
9
  def self.activate
@@ -1,17 +1,14 @@
1
1
  require 'mocha/is_a'
2
2
 
3
3
  module Mocha
4
-
5
4
  class SingleReturnValue
6
-
7
5
  def initialize(value)
8
6
  @value = value
9
7
  end
10
8
 
11
- def evaluate
9
+ def evaluate(invocation)
10
+ invocation.returned(@value)
12
11
  @value
13
12
  end
14
-
15
13
  end
16
-
17
14
  end
@@ -0,0 +1,9 @@
1
+ if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('1.9.2')
2
+ unless Kernel.method_defined?(:singleton_class)
3
+ module Kernel
4
+ def singleton_class
5
+ class << self; self; end
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,52 +1,34 @@
1
1
  module Mocha
2
-
3
2
  # A state machine that is used to constrain the order of invocations.
4
3
  # An invocation can be constrained to occur when a state {#is}, or {#is_not}, active.
5
4
  class StateMachine
6
-
7
- # Provides a mechanism to change the state of a {StateMachine} at some point in the future.
8
- class State
9
-
10
- # @private
11
- def initialize(state_machine, state)
12
- @state_machine, @state = state_machine, state
13
- end
14
-
5
+ # Provides the ability to determine whether a {StateMachine} is in a specified state at some point in the future.
6
+ class StatePredicate
15
7
  # @private
16
- def activate
17
- @state_machine.current_state = @state
8
+ def initialize(state_machine, state, description, &active_check)
9
+ @state_machine = state_machine
10
+ @state = state
11
+ @description = description
12
+ @active_check = active_check
18
13
  end
19
14
 
20
15
  # @private
21
16
  def active?
22
- @state_machine.current_state == @state
17
+ @active_check.call(@state_machine.current_state, @state)
23
18
  end
24
19
 
25
20
  # @private
26
21
  def mocha_inspect
27
- "#{@state_machine.name} is #{@state.mocha_inspect}"
22
+ "#{@state_machine.name} #{@description} #{@state.mocha_inspect}"
28
23
  end
29
-
30
24
  end
31
25
 
32
- # Provides the ability to determine whether a {StateMachine} is in a specified state at some point in the future.
33
- class StatePredicate
34
-
35
- # @private
36
- def initialize(state_machine, state)
37
- @state_machine, @state = state_machine, state
38
- end
39
-
40
- # @private
41
- def active?
42
- @state_machine.current_state != @state
43
- end
44
-
26
+ # Provides a mechanism to change the state of a {StateMachine} at some point in the future.
27
+ class State < StatePredicate
45
28
  # @private
46
- def mocha_inspect
47
- "#{@state_machine.name} is not #{@state.mocha_inspect}"
29
+ def activate
30
+ @state_machine.current_state = @state
48
31
  end
49
-
50
32
  end
51
33
 
52
34
  # @private
@@ -77,30 +59,35 @@ module Mocha
77
59
  @current_state = next_state_name
78
60
  end
79
61
 
80
- # Provides a mechanism to change the {StateMachine} into the state specified by +state_name+ at some point in the future.
62
+ # Provides mechanisms to (a) determine whether the {StateMachine} is in a given state; or (b) to change the {StateMachine} into the given state.
63
+ #
64
+ # @param [String] state_name name of expected/desired state.
65
+ # @return [StatePredicate,State] (a) state predicate which, when queried, will indicate whether the {StateMachine} is in the given state; or (b) state which, when activated, will change the {StateMachine} into the given state.
81
66
  #
82
- # Or provides a mechanism to determine whether the {StateMachine} is in the state specified by +state_name+ at some point in the future.
67
+ # @overload def is(expected_state_name)
68
+ # Provides a mechanism to determine whether the {StateMachine} is in the state specified by +expected_state_name+ at some point in the future
69
+ # @param [String] expected_state_name name of expected state.
70
+ # @return [StatePredicate] state predicate which, when queried, will indicate whether the {StateMachine} is in the state specified by +expected_state_name+
83
71
  #
84
- # @param [String] state_name name of new state
85
- # @return [State] state which, when activated, will change the {StateMachine} into the state with the specified +state_name+.
72
+ # @overload def is(desired_state_name)
73
+ # Provides a mechanism to change the {StateMachine} into the state specified by +desired_state_name+ at some point in the future.
74
+ # @param [String] desired_state_name name of desired new state.
75
+ # @return [State] state which, when activated, will change the {StateMachine} into the state with the specified +desired_state_name+.
86
76
  def is(state_name)
87
- State.new(self, state_name)
77
+ State.new(self, state_name, 'is') { |current, given| current == given }
88
78
  end
89
79
 
90
- # Provides a mechanism to determine whether the {StateMachine} is not in the state specified by +state_name+ at some point in the future.
91
- def is_not(state_name)
92
- StatePredicate.new(self, state_name)
80
+ # Provides a mechanism to determine whether the {StateMachine} is *not* in the state specified by +unexpected_state_name+ at some point in the future.
81
+ #
82
+ # @param [String] unexpected_state_name name of unexpected state.
83
+ # @return [StatePredicate] state predicate which, when queried, will indicate whether the {StateMachine} is *not* in the state specified by +unexpected_state_name+.
84
+ def is_not(unexpected_state_name) # rubocop:disable Naming/PredicateName
85
+ StatePredicate.new(self, unexpected_state_name, 'is not') { |current, given| current != given }
93
86
  end
94
87
 
95
88
  # @private
96
89
  def mocha_inspect
97
- if @current_state
98
- "#{@name} is #{@current_state.mocha_inspect}"
99
- else
100
- "#{@name} has no current state"
101
- end
90
+ %(#{@name} #{@current_state ? "is #{@current_state.mocha_inspect}" : 'has no current state'})
102
91
  end
103
-
104
92
  end
105
-
106
93
  end
@@ -0,0 +1,125 @@
1
+ require 'mocha/ruby_version'
2
+ require 'mocha/singleton_class'
3
+
4
+ module Mocha
5
+ class StubbedMethod
6
+ PrependedModule = Class.new(Module)
7
+
8
+ attr_reader :stubbee, :method_name
9
+
10
+ def initialize(stubbee, method_name)
11
+ @stubbee = stubbee
12
+ @original_method = nil
13
+ @original_visibility = nil
14
+ @method_name = PRE_RUBY_V19 ? method_name.to_s : method_name.to_sym
15
+ end
16
+
17
+ def stub
18
+ hide_original_method
19
+ define_new_method
20
+ end
21
+
22
+ def unstub
23
+ remove_new_method
24
+ restore_original_method
25
+ mock.unstub(method_name.to_sym)
26
+ return if mock.any_expectations?
27
+ reset_mocha
28
+ end
29
+
30
+ def mock
31
+ mock_owner.mocha
32
+ end
33
+
34
+ def reset_mocha
35
+ mock_owner.reset_mocha
36
+ end
37
+
38
+ def hide_original_method
39
+ return unless original_method_owner.__method_exists__?(method_name)
40
+ store_original_method_visibility
41
+ if use_prepended_module_for_stub_method?
42
+ use_prepended_module_for_stub_method
43
+ else
44
+ begin
45
+ store_original_method
46
+ # rubocop:disable Lint/HandleExceptions
47
+ rescue NameError
48
+ # deal with nasties like ActiveRecord::Associations::AssociationProxy
49
+ end
50
+ # rubocop:enable Lint/HandleExceptions
51
+ if stub_method_overwrites_original_method?
52
+ remove_original_method_from_stubbee
53
+ end
54
+ end
55
+ end
56
+
57
+ def define_new_method
58
+ self_in_scope = self
59
+ method_name_in_scope = method_name
60
+ stub_method_owner.send(:define_method, method_name) do |*args, &block|
61
+ self_in_scope.mock.method_missing(method_name_in_scope, *args, &block)
62
+ end
63
+ retain_original_visibility(stub_method_owner)
64
+ end
65
+
66
+ def remove_new_method
67
+ stub_method_owner.send(:remove_method, method_name)
68
+ end
69
+
70
+ def store_original_method
71
+ @original_method = stubbee_method(method_name)
72
+ end
73
+
74
+ def restore_original_method
75
+ return if use_prepended_module_for_stub_method?
76
+ if stub_method_overwrites_original_method?
77
+ original_method_owner.send(:define_method, method_name, method_body(@original_method))
78
+ end
79
+ retain_original_visibility(original_method_owner)
80
+ end
81
+
82
+ def matches?(other)
83
+ return false unless other.class == self.class
84
+ (stubbee.object_id == other.stubbee.object_id) && (method_name == other.method_name)
85
+ end
86
+
87
+ alias_method :==, :eql?
88
+
89
+ def to_s
90
+ "#{stubbee}.#{method_name}"
91
+ end
92
+
93
+ private
94
+
95
+ def retain_original_visibility(method_owner)
96
+ return unless @original_visibility
97
+ Module.instance_method(@original_visibility).bind(method_owner).call(method_name)
98
+ end
99
+
100
+ def store_original_method_visibility
101
+ @original_visibility = original_method_owner.__method_visibility__(method_name)
102
+ end
103
+
104
+ def stub_method_overwrites_original_method?
105
+ @original_method && @original_method.owner == original_method_owner
106
+ end
107
+
108
+ def remove_original_method_from_stubbee
109
+ original_method_owner.send(:remove_method, method_name)
110
+ end
111
+
112
+ def use_prepended_module_for_stub_method?
113
+ RUBY_V2_PLUS
114
+ end
115
+
116
+ def use_prepended_module_for_stub_method
117
+ @stub_method_owner = PrependedModule.new
118
+ original_method_owner.__send__ :prepend, @stub_method_owner
119
+ end
120
+
121
+ def stub_method_owner
122
+ @stub_method_owner ||= original_method_owner
123
+ end
124
+ end
125
+ end
@@ -1,19 +1,8 @@
1
- require 'mocha/backtrace_filter'
1
+ require 'mocha/error_with_filtered_backtrace'
2
2
 
3
3
  module Mocha
4
-
5
4
  # Exception raised when stubbing a particular method is not allowed.
6
5
  #
7
6
  # @see Configuration.prevent
8
- class StubbingError < StandardError
9
-
10
- # @private
11
- def initialize(message = nil, backtrace = [])
12
- super(message)
13
- filter = BacktraceFilter.new
14
- set_backtrace(filter.filtered(backtrace))
15
- end
16
-
17
- end
18
-
7
+ class StubbingError < ErrorWithFilteredBacktrace; end
19
8
  end
@@ -1,3 +1,8 @@
1
- require "mocha/integration/test_unit"
1
+ require 'mocha/integration/test_unit'
2
+ require 'mocha/deprecation'
2
3
 
3
- Mocha::Integration::TestUnit.activate
4
+ unless Mocha::Integration::TestUnit.activate
5
+ Mocha::Deprecation.warning(
6
+ "Test::Unit must be loaded *before* `require 'mocha/test_unit'`."
7
+ )
8
+ end
data/lib/mocha/thrower.rb CHANGED
@@ -1,15 +1,13 @@
1
1
  module Mocha
2
-
3
2
  class Thrower
4
-
5
3
  def initialize(tag, object = nil)
6
- @tag, @object = tag, object
4
+ @tag = tag
5
+ @object = object
7
6
  end
8
7
 
9
- def evaluate
8
+ def evaluate(invocation)
9
+ invocation.threw(@tag, @object)
10
10
  throw @tag, @object
11
11
  end
12
-
13
12
  end
14
-
15
13
  end
@@ -0,0 +1,12 @@
1
+ module Mocha
2
+ class ThrownObject
3
+ def initialize(tag, value = nil)
4
+ @tag = tag
5
+ @value = value
6
+ end
7
+
8
+ def mocha_inspect
9
+ "threw (#{@tag.mocha_inspect}, #{@value.mocha_inspect})"
10
+ end
11
+ end
12
+ end
data/lib/mocha/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mocha
2
- VERSION = "1.1.0"
2
+ VERSION = '1.13.0'.freeze
3
3
  end
@@ -1,31 +1,21 @@
1
- require 'mocha/no_yields'
2
- require 'mocha/single_yield'
3
- require 'mocha/multiple_yields'
4
-
5
1
  module Mocha
6
-
7
2
  class YieldParameters
8
-
9
3
  def initialize
10
4
  @parameter_groups = []
11
5
  end
12
6
 
13
7
  def next_invocation
14
8
  case @parameter_groups.length
15
- when 0 then NoYields.new
16
- when 1 then @parameter_groups.first
17
- else @parameter_groups.shift
9
+ when 0 then []
10
+ when 1 then @parameter_groups.first
11
+ else @parameter_groups.shift
18
12
  end
19
13
  end
20
14
 
21
- def add(*parameters)
22
- @parameter_groups << SingleYield.new(*parameters)
23
- end
24
-
25
- def multiple_add(*parameter_groups)
26
- @parameter_groups << MultipleYields.new(*parameter_groups)
15
+ def add(*parameter_groups)
16
+ @parameter_groups << parameter_groups.map do |pg|
17
+ pg.is_a?(Array) ? pg : [pg]
18
+ end
27
19
  end
28
-
29
20
  end
30
-
31
21
  end
data/lib/mocha.rb CHANGED
@@ -1 +1,9 @@
1
1
  require 'mocha/version'
2
+ require 'mocha/ruby_version'
3
+ require 'mocha/deprecation'
4
+
5
+ if Mocha::PRE_RUBY_V19
6
+ Mocha::Deprecation.warning(
7
+ 'Versions of Ruby earlier than v1.9 will not be supported in future versions of Mocha.'
8
+ )
9
+ end
data/mocha.gemspec CHANGED
@@ -1,53 +1,55 @@
1
- # -*- encoding: utf-8 -*-
2
1
  lib = File.expand_path('../lib/', __FILE__)
3
2
  $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
4
- require "mocha/version"
3
+ require 'mocha/version'
5
4
 
6
- Gem::Specification.new do |s|
7
- s.name = "mocha"
5
+ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
6
+ s.name = 'mocha'
8
7
  s.version = Mocha::VERSION
8
+ s.licenses = ['MIT', 'BSD-2-Clause']
9
+ s.required_ruby_version = '>= 1.8.7'
9
10
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["James Mead"]
12
- s.description = "Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes."
13
- s.email = "mocha-developer@googlegroups.com"
11
+ s.authors = ['James Mead']
12
+ s.description = 'Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes.'
13
+ s.email = 'mocha-developer@googlegroups.com'
14
14
 
15
- s.files = `git ls-files`.split("\n")
16
- s.files.delete(".travis.yml")
17
- s.files.delete(".gitignore")
18
-
19
- s.homepage = "http://gofreerange.com/mocha/docs"
20
- s.require_paths = ["lib"]
21
- s.rubyforge_project = "mocha"
22
- s.summary = "Mocking and stubbing library"
23
- s.has_rdoc = "yard"
15
+ s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
16
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(docs|test)/}) }
17
+ end
18
+ s.files.delete('.circleci/config.yml')
19
+ s.files.delete('.gitignore')
24
20
 
25
- s.add_dependency("metaclass", "~> 0.0.1")
26
- if s.respond_to? :specification_version then
27
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
28
- s.specification_version = 3
21
+ s.homepage = 'https://mocha.jamesmead.org'
22
+ s.require_paths = ['lib']
23
+ s.summary = 'Mocking and stubbing library'
29
24
 
30
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
31
- s.add_development_dependency("rake", ">= 0")
32
- s.add_development_dependency("introspection", "~> 0.0.1")
33
- unless ENV["MOCHA_NO_DOCS"]
34
- s.add_development_dependency("yard")
35
- s.add_development_dependency("redcarpet", "~> 1")
36
- end
37
- else
38
- s.add_dependency("rake", ">= 0")
39
- s.add_dependency("introspection", "~> 0.0.1")
40
- unless ENV["MOCHA_NO_DOCS"]
41
- s.add_dependency("yard")
42
- s.add_dependency("redcarpet", "~> 1")
25
+ unless s.respond_to?(:add_development_dependency)
26
+ class << s
27
+ def add_development_dependency(*args)
28
+ add_dependency(*args)
43
29
  end
44
30
  end
31
+ end
32
+
33
+ if RUBY_VERSION < '1.9.3'
34
+ s.add_development_dependency 'rake', '~> 10.0'
35
+ elsif RUBY_VERSION < '2'
36
+ s.add_development_dependency 'rake', '~> 12.2.1'
37
+ elsif RUBY_VERSION < '2.2'
38
+ s.add_development_dependency 'rake', '~> 12.3.3'
45
39
  else
46
- s.add_dependency("rake", ">= 0")
47
- s.add_dependency("introspection", "~> 0.0.1")
48
- unless ENV["MOCHA_NO_DOCS"]
49
- s.add_dependency("yard")
50
- s.add_dependency("redcarpet", "~> 1")
51
- end
40
+ s.add_development_dependency 'rake'
41
+ end
42
+
43
+ s.add_development_dependency('introspection', '~> 0.0.1')
44
+ if RUBY_VERSION >= '2.2.0'
45
+ # No test libraries in standard library
46
+ s.add_development_dependency('minitest')
47
+ end
48
+ if RUBY_VERSION >= '2.2.0'
49
+ s.add_development_dependency('rubocop', '<= 0.58.2')
50
+ end
51
+ if ENV['MOCHA_GENERATE_DOCS']
52
+ s.add_development_dependency('redcarpet')
53
+ s.add_development_dependency('yard')
52
54
  end
53
55
  end
@@ -1,11 +1,8 @@
1
- <script src="/javascripts/app.js" type="text/javascript" charset="utf-8"></script>
2
-
1
+ <script async src="https://www.googletagmanager.com/gtag/js?id=<%= ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID'] %>"></script>
3
2
  <script>
4
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
5
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
6
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
7
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
3
+ window.dataLayer = window.dataLayer || [];
4
+ function gtag(){dataLayer.push(arguments);}
5
+ gtag('js', new Date());
8
6
 
9
- ga('create', '<%= ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID'] %>', 'gofreerange.com');
10
- ga('send', 'pageview');
11
- </script>
7
+ gtag('config', '<%= ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID'] %>');
8
+ </script>
@@ -1,6 +1,5 @@
1
1
  def init
2
2
  super
3
- if ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID']
4
- sections[:layout] << :google_analytics
5
- end
3
+ return unless ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID']
4
+ sections[:layout] << :google_analytics
6
5
  end