mutant 0.8.0 → 0.8.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.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +7 -0
  3. data/config/flay.yml +1 -1
  4. data/config/reek.yml +1 -0
  5. data/lib/mutant.rb +10 -3
  6. data/lib/mutant/actor.rb +2 -5
  7. data/lib/mutant/actor/env.rb +1 -3
  8. data/lib/mutant/actor/mailbox.rb +2 -4
  9. data/lib/mutant/actor/receiver.rb +0 -2
  10. data/lib/mutant/actor/sender.rb +0 -1
  11. data/lib/mutant/ast.rb +22 -28
  12. data/lib/mutant/ast/meta.rb +8 -88
  13. data/lib/mutant/ast/named_children.rb +1 -8
  14. data/lib/mutant/ast/sexp.rb +0 -2
  15. data/lib/mutant/cache.rb +1 -3
  16. data/lib/mutant/cli.rb +9 -19
  17. data/lib/mutant/color.rb +0 -3
  18. data/lib/mutant/config.rb +6 -2
  19. data/lib/mutant/context.rb +2 -4
  20. data/lib/mutant/context/scope.rb +10 -16
  21. data/lib/mutant/delegator.rb +0 -3
  22. data/lib/mutant/diff.rb +8 -17
  23. data/lib/mutant/env.rb +3 -5
  24. data/lib/mutant/env/bootstrap.rb +32 -39
  25. data/lib/mutant/expression.rb +14 -132
  26. data/lib/mutant/expression/method.rb +25 -42
  27. data/lib/mutant/expression/methods.rb +17 -29
  28. data/lib/mutant/expression/namespace.rb +33 -28
  29. data/lib/mutant/expression/parser.rb +71 -0
  30. data/lib/mutant/integration.rb +17 -16
  31. data/lib/mutant/isolation.rb +14 -14
  32. data/lib/mutant/loader.rb +2 -4
  33. data/lib/mutant/matcher.rb +1 -11
  34. data/lib/mutant/matcher/chain.rb +0 -1
  35. data/lib/mutant/matcher/compiler.rb +19 -52
  36. data/lib/mutant/matcher/config.rb +65 -5
  37. data/lib/mutant/matcher/filter.rb +11 -1
  38. data/lib/mutant/matcher/method.rb +11 -21
  39. data/lib/mutant/matcher/method/instance.rb +2 -16
  40. data/lib/mutant/matcher/method/singleton.rb +3 -20
  41. data/lib/mutant/matcher/methods.rb +11 -21
  42. data/lib/mutant/matcher/namespace.rb +0 -4
  43. data/lib/mutant/matcher/null.rb +0 -1
  44. data/lib/mutant/matcher/scope.rb +0 -12
  45. data/lib/mutant/meta.rb +0 -1
  46. data/lib/mutant/meta/example.rb +12 -26
  47. data/lib/mutant/meta/example/dsl.rb +1 -8
  48. data/lib/mutant/mutation.rb +6 -14
  49. data/lib/mutant/mutator.rb +2 -14
  50. data/lib/mutant/mutator/node.rb +6 -33
  51. data/lib/mutant/mutator/node/and_asgn.rb +0 -1
  52. data/lib/mutant/mutator/node/argument.rb +0 -5
  53. data/lib/mutant/mutator/node/arguments.rb +1 -7
  54. data/lib/mutant/mutator/node/begin.rb +0 -2
  55. data/lib/mutant/mutator/node/binary.rb +0 -3
  56. data/lib/mutant/mutator/node/block.rb +0 -2
  57. data/lib/mutant/mutator/node/break.rb +0 -1
  58. data/lib/mutant/mutator/node/case.rb +0 -3
  59. data/lib/mutant/mutator/node/conditional_loop.rb +0 -1
  60. data/lib/mutant/mutator/node/const.rb +0 -1
  61. data/lib/mutant/mutator/node/define.rb +0 -1
  62. data/lib/mutant/mutator/node/defined.rb +0 -1
  63. data/lib/mutant/mutator/node/dstr.rb +0 -1
  64. data/lib/mutant/mutator/node/dsym.rb +0 -1
  65. data/lib/mutant/mutator/node/generic.rb +0 -1
  66. data/lib/mutant/mutator/node/if.rb +0 -4
  67. data/lib/mutant/mutator/node/kwbegin.rb +0 -1
  68. data/lib/mutant/mutator/node/literal/array.rb +0 -2
  69. data/lib/mutant/mutator/node/literal/boolean.rb +0 -1
  70. data/lib/mutant/mutator/node/literal/fixnum.rb +2 -5
  71. data/lib/mutant/mutator/node/literal/float.rb +1 -4
  72. data/lib/mutant/mutator/node/literal/hash.rb +0 -3
  73. data/lib/mutant/mutator/node/literal/nil.rb +0 -1
  74. data/lib/mutant/mutator/node/literal/range.rb +1 -5
  75. data/lib/mutant/mutator/node/literal/regex.rb +1 -3
  76. data/lib/mutant/mutator/node/literal/string.rb +0 -1
  77. data/lib/mutant/mutator/node/literal/symbol.rb +0 -1
  78. data/lib/mutant/mutator/node/masgn.rb +0 -1
  79. data/lib/mutant/mutator/node/match_current_line.rb +0 -1
  80. data/lib/mutant/mutator/node/mlhs.rb +0 -1
  81. data/lib/mutant/mutator/node/named_value/access.rb +0 -1
  82. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -2
  83. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -2
  84. data/lib/mutant/mutator/node/next.rb +0 -1
  85. data/lib/mutant/mutator/node/noop.rb +0 -1
  86. data/lib/mutant/mutator/node/nthref.rb +0 -1
  87. data/lib/mutant/mutator/node/op_asgn.rb +0 -1
  88. data/lib/mutant/mutator/node/or_asgn.rb +1 -2
  89. data/lib/mutant/mutator/node/resbody.rb +0 -2
  90. data/lib/mutant/mutator/node/rescue.rb +1 -6
  91. data/lib/mutant/mutator/node/return.rb +0 -1
  92. data/lib/mutant/mutator/node/send.rb +16 -17
  93. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -3
  94. data/lib/mutant/mutator/node/send/binary.rb +0 -1
  95. data/lib/mutant/mutator/node/send/index.rb +0 -3
  96. data/lib/mutant/mutator/node/splat.rb +0 -1
  97. data/lib/mutant/mutator/node/super.rb +0 -1
  98. data/lib/mutant/mutator/node/when.rb +2 -7
  99. data/lib/mutant/mutator/node/yield.rb +0 -1
  100. data/lib/mutant/mutator/node/zsuper.rb +0 -1
  101. data/lib/mutant/mutator/registry.rb +1 -4
  102. data/lib/mutant/mutator/util.rb +0 -2
  103. data/lib/mutant/mutator/util/array.rb +0 -3
  104. data/lib/mutant/mutator/util/symbol.rb +0 -1
  105. data/lib/mutant/parallel.rb +3 -9
  106. data/lib/mutant/parallel/master.rb +7 -17
  107. data/lib/mutant/parallel/source.rb +2 -7
  108. data/lib/mutant/parallel/worker.rb +1 -5
  109. data/lib/mutant/reporter.rb +0 -4
  110. data/lib/mutant/reporter/cli.rb +1 -8
  111. data/lib/mutant/reporter/cli/format.rb +7 -18
  112. data/lib/mutant/reporter/cli/printer.rb +2 -12
  113. data/lib/mutant/reporter/cli/printer/config.rb +1 -4
  114. data/lib/mutant/reporter/cli/printer/env_progress.rb +3 -7
  115. data/lib/mutant/reporter/cli/printer/env_result.rb +0 -1
  116. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -2
  117. data/lib/mutant/reporter/cli/printer/mutation_result.rb +3 -11
  118. data/lib/mutant/reporter/cli/printer/status.rb +1 -4
  119. data/lib/mutant/reporter/cli/printer/status_progressive.rb +1 -3
  120. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -5
  121. data/lib/mutant/reporter/cli/printer/subject_result.rb +0 -1
  122. data/lib/mutant/reporter/cli/printer/test_result.rb +0 -1
  123. data/lib/mutant/reporter/cli/tput.rb +4 -1
  124. data/lib/mutant/reporter/trace.rb +2 -4
  125. data/lib/mutant/repository.rb +88 -0
  126. data/lib/mutant/require_highjack.rb +0 -1
  127. data/lib/mutant/result.rb +25 -48
  128. data/lib/mutant/runner.rb +7 -16
  129. data/lib/mutant/runner/sink.rb +3 -11
  130. data/lib/mutant/selector.rb +1 -2
  131. data/lib/mutant/selector/expression.rb +1 -2
  132. data/lib/mutant/subject.rb +10 -21
  133. data/lib/mutant/subject/method.rb +11 -12
  134. data/lib/mutant/subject/method/instance.rb +1 -5
  135. data/lib/mutant/subject/method/singleton.rb +1 -3
  136. data/lib/mutant/test.rb +1 -2
  137. data/lib/mutant/version.rb +2 -2
  138. data/lib/mutant/warning_filter.rb +2 -7
  139. data/lib/mutant/zombifier.rb +6 -10
  140. data/meta/send.rb +8 -0
  141. data/spec/spec_helper.rb +5 -1
  142. data/spec/support/corpus.rb +5 -9
  143. data/spec/support/rb_bug.rb +0 -1
  144. data/spec/support/rspec.rb +0 -1
  145. data/spec/support/ruby_vm.rb +0 -2
  146. data/spec/unit/mutant/ast/meta/send_spec.rb +42 -0
  147. data/spec/unit/mutant/ast/named_children_spec.rb +51 -0
  148. data/spec/unit/mutant/ast/sexp_spec.rb +36 -0
  149. data/spec/unit/mutant/ast_spec.rb +8 -0
  150. data/spec/unit/mutant/cli_spec.rb +34 -19
  151. data/spec/unit/mutant/context/scope_spec.rb +11 -0
  152. data/spec/unit/mutant/env/boostrap_spec.rb +5 -2
  153. data/spec/unit/mutant/env_spec.rb +14 -15
  154. data/spec/unit/mutant/expression/method_spec.rb +10 -14
  155. data/spec/unit/mutant/expression/methods_spec.rb +24 -11
  156. data/spec/unit/mutant/expression/namespace/flat_spec.rb +5 -6
  157. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +16 -10
  158. data/spec/unit/mutant/expression/parser_spec.rb +67 -0
  159. data/spec/unit/mutant/expression_spec.rb +24 -57
  160. data/spec/unit/mutant/integration/rspec_spec.rb +7 -7
  161. data/spec/unit/mutant/integration_spec.rb +2 -2
  162. data/spec/unit/mutant/isolation_spec.rb +31 -29
  163. data/spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb +2 -2
  164. data/spec/unit/mutant/matcher/compiler_spec.rb +27 -58
  165. data/spec/unit/mutant/matcher/config_spec.rb +45 -0
  166. data/spec/unit/mutant/matcher/filter_spec.rb +12 -5
  167. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -1
  168. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -1
  169. data/spec/unit/mutant/matcher/namespace_spec.rb +4 -4
  170. data/spec/unit/mutant/parallel/worker_spec.rb +1 -1
  171. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +4 -4
  172. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +7 -7
  173. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +2 -2
  174. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +2 -2
  175. data/spec/unit/mutant/reporter/cli/printer/status_spec.rb +12 -12
  176. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +1 -1
  177. data/spec/unit/mutant/reporter/cli_spec.rb +9 -10
  178. data/spec/unit/mutant/repository/diff_spec.rb +80 -0
  179. data/spec/unit/mutant/repository/subject_filter_spec.rb +28 -0
  180. data/spec/unit/mutant/result/env_spec.rb +1 -1
  181. data/spec/unit/mutant/runner_spec.rb +0 -1
  182. data/spec/unit/mutant/selector/expression_spec.rb +14 -14
  183. data/spec/unit/mutant/subject/method/instance_spec.rb +2 -2
  184. data/spec/unit/mutant/subject/method/singleton_spec.rb +2 -2
  185. data/spec/unit/mutant/subject_spec.rb +5 -2
  186. metadata +20 -3
  187. data/spec/support/mutation_verifier.rb +0 -96
@@ -15,7 +15,6 @@ module Mutant
15
15
  # @return [undefined]
16
16
  #
17
17
  # @api private
18
- #
19
18
  def dispatch
20
19
  emit_singletons
21
20
  return unless value
@@ -24,6 +24,8 @@ module Mutant
24
24
  to_s: %i[to_str],
25
25
  to_i: %i[to_int],
26
26
  to_a: %i[to_ary],
27
+ at: %i[fetch],
28
+ :[] => %i[at fetch],
27
29
  :== => %i[eql? equal?],
28
30
  :>= => %i[> == eql? equal?],
29
31
  :<= => %i[< == eql? equal?],
@@ -38,7 +40,6 @@ module Mutant
38
40
  # @return [undefined]
39
41
  #
40
42
  # @api private
41
- #
42
43
  def dispatch
43
44
  emit_singletons
44
45
  if meta.index_assignment?
@@ -53,24 +54,31 @@ module Mutant
53
54
  # @return [undefined]
54
55
  #
55
56
  # @api private
56
- #
57
57
  def non_index_dispatch
58
- case
59
- when meta.binary_method_operator?
58
+ if meta.binary_method_operator?
60
59
  run(Binary)
61
- when meta.attribute_assignment?
60
+ elsif meta.attribute_assignment?
62
61
  run(AttributeAssignment)
63
62
  else
64
63
  normal_dispatch
65
64
  end
66
65
  end
67
66
 
68
- # Return arguments
67
+ # AST metadata for node
69
68
  #
70
- # @return [Enumerable<Parser::AST::Node>]
69
+ # @return [AST::Meta::Send]
71
70
  #
72
71
  # @api private
72
+ def meta
73
+ AST::Meta::Send.new(node)
74
+ end
75
+ memoize :meta
76
+
77
+ # Arguments being send
78
+ #
79
+ # @return [Enumerable<Parser::AST::Node>]
73
80
  #
81
+ # @api private
74
82
  alias_method :arguments, :remaining_children
75
83
 
76
84
  # Perform normal, non special case dispatch
@@ -78,7 +86,6 @@ module Mutant
78
86
  # @return [undefined]
79
87
  #
80
88
  # @api private
81
- #
82
89
  def normal_dispatch
83
90
  emit_naked_receiver
84
91
  emit_selector_replacement
@@ -92,11 +99,8 @@ module Mutant
92
99
  # @return [undefined]
93
100
  #
94
101
  # @api private
95
- #
96
102
  def emit_selector_replacement
97
- SELECTOR_REPLACEMENTS.fetch(selector, EMPTY_ARRAY).each do |replacement|
98
- emit_selector(replacement)
99
- end
103
+ SELECTOR_REPLACEMENTS.fetch(selector, EMPTY_ARRAY).each(&method(:emit_selector))
100
104
  end
101
105
 
102
106
  # Emit naked receiver mutation
@@ -104,7 +108,6 @@ module Mutant
104
108
  # @return [undefined]
105
109
  #
106
110
  # @api private
107
- #
108
111
  def emit_naked_receiver
109
112
  emit(receiver) if receiver && !NOT_ASSIGNABLE.include?(receiver.type)
110
113
  end
@@ -114,7 +117,6 @@ module Mutant
114
117
  # @return [undefined]
115
118
  #
116
119
  # @api private
117
- #
118
120
  def mutate_arguments
119
121
  emit_type(receiver, selector)
120
122
  remaining_children_with_index.each do |_node, index|
@@ -128,7 +130,6 @@ module Mutant
128
130
  # @return [undefined]
129
131
  #
130
132
  # @api private
131
- #
132
133
  def emit_argument_propagation
133
134
  node = arguments.first
134
135
  emit(node) if arguments.one? && !NOT_STANDALONE.include?(node.type)
@@ -139,7 +140,6 @@ module Mutant
139
140
  # @return [undefined]
140
141
  #
141
142
  # @api private
142
- #
143
143
  def mutate_receiver
144
144
  return unless receiver
145
145
  emit_implicit_self
@@ -153,7 +153,6 @@ module Mutant
153
153
  # @return [undefined]
154
154
  #
155
155
  # @api private
156
- #
157
156
  def emit_implicit_self
158
157
  emit_receiver(nil) if n_self?(receiver) && !(
159
158
  KEYWORDS.include?(selector) ||
@@ -12,7 +12,6 @@ module Mutant
12
12
  # @return [undefined]
13
13
  #
14
14
  # @api private
15
- #
16
15
  def dispatch
17
16
  normal_dispatch
18
17
  emit_attribute_read
@@ -23,7 +22,6 @@ module Mutant
23
22
  # @return [undefined]
24
23
  #
25
24
  # @api private
26
- #
27
25
  def mutate_arguments
28
26
  remaining_children_indices.each do |index|
29
27
  mutate_child(index)
@@ -35,7 +33,6 @@ module Mutant
35
33
  # @return [undefined]
36
34
  #
37
35
  # @api private
38
- #
39
36
  def emit_attribute_read
40
37
  emit_type(receiver, selector.to_s[0..-2].to_sym)
41
38
  end
@@ -15,7 +15,6 @@ module Mutant
15
15
  # @return [undefined]
16
16
  #
17
17
  # @api private
18
- #
19
18
  def dispatch
20
19
  emit(left)
21
20
  emit_left_mutations
@@ -19,7 +19,6 @@ module Mutant
19
19
  # @return [undefined]
20
20
  #
21
21
  # @api private
22
- #
23
22
  def dispatch
24
23
  emit_naked_receiver
25
24
  emit_value_mutations
@@ -33,7 +32,6 @@ module Mutant
33
32
  # @return [undefined]
34
33
  #
35
34
  # @api private
36
- #
37
35
  def mutate_indices
38
36
  children_indices(INDEX_RANGE).each do |index|
39
37
  delete_child(index)
@@ -46,7 +44,6 @@ module Mutant
46
44
  # @return [undefined]
47
45
  #
48
46
  # @api private
49
- #
50
47
  def emit_index_read
51
48
  emit_type(receiver, :[], *children[INDEX_RANGE])
52
49
  end
@@ -15,7 +15,6 @@ module Mutant
15
15
  # @return [undefined]
16
16
  #
17
17
  # @api private
18
- #
19
18
  def dispatch
20
19
  emit_singletons
21
20
  emit_expression_mutations
@@ -14,7 +14,6 @@ module Mutant
14
14
  # @return [undefined]
15
15
  #
16
16
  # @api private
17
- #
18
17
  def dispatch
19
18
  emit_singletons
20
19
  emit(N_ZSUPER)
@@ -14,7 +14,6 @@ module Mutant
14
14
  # @return [undefined]
15
15
  #
16
16
  # @api private
17
- #
18
17
  def dispatch
19
18
  if body
20
19
  mutate_body
@@ -29,7 +28,6 @@ module Mutant
29
28
  # @return [undefined]
30
29
  #
31
30
  # @api private
32
- #
33
31
  def mutate_conditions
34
32
  conditions = children.length - 1
35
33
  children[0..-2].each_index do |index|
@@ -43,12 +41,11 @@ module Mutant
43
41
  # @return [undefined]
44
42
  #
45
43
  # @api private
46
- #
47
44
  def mutate_body
48
45
  mutate_child(body_index)
49
46
  end
50
47
 
51
- # Return body node
48
+ # Body node
52
49
  #
53
50
  # @return [Parser::AST::Node]
54
51
  # if body is present
@@ -57,17 +54,15 @@ module Mutant
57
54
  # otherwise
58
55
  #
59
56
  # @api private
60
- #
61
57
  def body
62
58
  children[body_index]
63
59
  end
64
60
 
65
- # Return body index
61
+ # Index of body node
66
62
  #
67
63
  # @return [Fixnum]
68
64
  #
69
65
  # @api private
70
- #
71
66
  def body_index
72
67
  children.length - 1
73
68
  end
@@ -14,7 +14,6 @@ module Mutant
14
14
  # @return [undefined]
15
15
  #
16
16
  # @api private
17
- #
18
17
  def dispatch
19
18
  super
20
19
  emit_singletons
@@ -14,7 +14,6 @@ module Mutant
14
14
  # @return [undefined]
15
15
  #
16
16
  # @api private
17
- #
18
17
  def dispatch
19
18
  emit_singletons
20
19
  end
@@ -8,7 +8,6 @@ module Mutant
8
8
  # @return [undefined]
9
9
  #
10
10
  # @api private
11
- #
12
11
  def initialize
13
12
  @registry = {}
14
13
  end
@@ -21,10 +20,9 @@ module Mutant
21
20
  # @param [Symbol] type
22
21
  # @param [Class:Mutator] mutator
23
22
  #
24
- # @api private
25
- #
26
23
  # @return [self]
27
24
  #
25
+ # @api private
28
26
  def register(type, mutator)
29
27
  fail RegistryError, "Invalid type registration: #{type}" unless AST::Types::ALL.include?(type)
30
28
  fail RegistryError, "Duplicate type registration: #{type}" if @registry.key?(type)
@@ -42,7 +40,6 @@ module Mutant
42
40
  # raises argument error when mutator class cannot be found
43
41
  #
44
42
  # @api private
45
- #
46
43
  def lookup(node)
47
44
  type = node.type
48
45
  @registry.fetch(type) do
@@ -15,7 +15,6 @@ module Mutant
15
15
  # otherwise
16
16
  #
17
17
  # @api private
18
- #
19
18
  def self.each(object, parent, &block)
20
19
  return to_enum(__method__, object, parent) unless block_given?
21
20
 
@@ -33,7 +32,6 @@ module Mutant
33
32
  # @return [Boolean]
34
33
  #
35
34
  # @api private
36
- #
37
35
  def new?(generated)
38
36
  !input.eql?(generated)
39
37
  end
@@ -15,7 +15,6 @@ module Mutant
15
15
  # @return [undefined]
16
16
  #
17
17
  # @api private
18
- #
19
18
  def dispatch
20
19
  input.each_index do |index|
21
20
  dup = dup_input
@@ -36,7 +35,6 @@ module Mutant
36
35
  # @return [undefined]
37
36
  #
38
37
  # @api private
39
- #
40
38
  def dispatch
41
39
  input.each_with_index do |element, index|
42
40
  Mutator.each(element).each do |mutation|
@@ -56,7 +54,6 @@ module Mutant
56
54
  # @return [undefined]
57
55
  #
58
56
  # @api private
59
- #
60
57
  def dispatch
61
58
  run(Element)
62
59
  run(Presence)
@@ -14,7 +14,6 @@ module Mutant
14
14
  # @return [undefined]
15
15
  #
16
16
  # @api private
17
- #
18
17
  def dispatch
19
18
  emit((input.to_s + POSTFIX).to_sym)
20
19
  end
@@ -1,17 +1,16 @@
1
1
  module Mutant
2
- # Parallel excecution engine of arbitrary payloads
2
+ # Parallel execution engine of arbitrary payloads
3
3
  module Parallel
4
4
 
5
5
  # Driver for parallelized execution
6
6
  class Driver
7
7
  include Concord.new(:binding)
8
8
 
9
- # Return scheduler status
9
+ # Scheduler status
10
10
  #
11
11
  # @return [Object]
12
12
  #
13
13
  # @api private
14
- #
15
14
  def status
16
15
  binding.call(__method__)
17
16
  end
@@ -21,7 +20,6 @@ module Mutant
21
20
  # @return [self]
22
21
  #
23
22
  # @api private
24
- #
25
23
  def stop
26
24
  binding.call(__method__)
27
25
  self
@@ -33,7 +31,6 @@ module Mutant
33
31
  # @return [Driver]
34
32
  #
35
33
  # @api private
36
- #
37
34
  def self.async(config)
38
35
  Driver.new(config.env.new_mailbox.bind(Master.call(config)))
39
36
  end
@@ -49,15 +46,13 @@ module Mutant
49
46
  # @return [self]
50
47
  #
51
48
  # @api private
52
- #
53
49
  abstract_method :result
54
50
 
55
- # Return status
51
+ # Sink status
56
52
  #
57
53
  # @return [Object]
58
54
  #
59
55
  # @api private
60
- #
61
56
  abstract_method :status
62
57
 
63
58
  # Test if processing should stop
@@ -65,7 +60,6 @@ module Mutant
65
60
  # @return [Boolean]
66
61
  #
67
62
  # @api private
68
- #
69
63
  abstract_method :stop?
70
64
  end # Sink
71
65
 
@@ -13,7 +13,6 @@ module Mutant
13
13
  # @return [Actor::Sender]
14
14
  #
15
15
  # @api private
16
- #
17
16
  def self.call(config)
18
17
  config.env.spawn do |mailbox|
19
18
  new(config, mailbox).__send__(:run)
@@ -25,7 +24,6 @@ module Mutant
25
24
  # @return [undefined]
26
25
  #
27
26
  # @api private
28
- #
29
27
  def initialize(*)
30
28
  super
31
29
 
@@ -39,10 +37,11 @@ module Mutant
39
37
 
40
38
  # Run work loop
41
39
  #
42
- # @api private
43
- #
44
40
  # rubocop:disable MethodLength
45
41
  #
42
+ # @return [undefined]
43
+ #
44
+ # @api private
46
45
  def run
47
46
  config.jobs.times do
48
47
  @workers += 1
@@ -72,7 +71,6 @@ module Mutant
72
71
  # @return [undefined]
73
72
  #
74
73
  # @api private
75
- #
76
74
  def handle(message)
77
75
  type, payload = message.type, message.payload
78
76
  method = MAP.fetch(type) do
@@ -86,7 +84,6 @@ module Mutant
86
84
  # @return [undefined]
87
85
  #
88
86
  # @api private
89
- #
90
87
  def receive_loop
91
88
  handle(mailbox.receiver.call) until @workers.zero? && @stop
92
89
  end
@@ -98,7 +95,6 @@ module Mutant
98
95
  # @return [undefined]
99
96
  #
100
97
  # @api private
101
- #
102
98
  def handle_status(sender)
103
99
  status = Status.new(
104
100
  payload: sink.status,
@@ -115,7 +111,6 @@ module Mutant
115
111
  # @return [undefined]
116
112
  #
117
113
  # @api private
118
- #
119
114
  def handle_result(job_result)
120
115
  @active_jobs.delete(job_result.job)
121
116
  sink.result(job_result.payload)
@@ -128,7 +123,6 @@ module Mutant
128
123
  # @return [undefined]
129
124
  #
130
125
  # @api private
131
- #
132
126
  def handle_stop(sender)
133
127
  @stop = true
134
128
  receive_loop
@@ -142,7 +136,6 @@ module Mutant
142
136
  # @return [undefined]
143
137
  #
144
138
  # @api private
145
- #
146
139
  def handle_ready(sender)
147
140
  if stop_work?
148
141
  stop_worker(sender)
@@ -152,13 +145,14 @@ module Mutant
152
145
  sender.call(Actor::Message.new(:job, next_job))
153
146
  end
154
147
 
155
- # Return next job if any
148
+ # Next job if any
156
149
  #
157
150
  # @return [Job]
158
151
  # if next job is available
159
152
  #
160
153
  # @return [nil]
161
154
  #
155
+ # @api private
162
156
  def next_job
163
157
  Job.new(
164
158
  index: @index,
@@ -176,7 +170,6 @@ module Mutant
176
170
  # @return [undefined]
177
171
  #
178
172
  # @api private
179
- #
180
173
  def stop_worker(sender)
181
174
  @workers -= 1
182
175
  sender.call(Actor::Message.new(:stop))
@@ -187,27 +180,24 @@ module Mutant
187
180
  # @return [Boolean]
188
181
  #
189
182
  # @api private
190
- #
191
183
  def stop_work?
192
184
  @stop || !source.next? || sink.stop?
193
185
  end
194
186
 
195
- # Return source
187
+ # Job source
196
188
  #
197
189
  # @return [Source]
198
190
  #
199
191
  # @api private
200
- #
201
192
  def source
202
193
  config.source
203
194
  end
204
195
 
205
- # Return sink
196
+ # Job result sink
206
197
  #
207
198
  # @return [Sink]
208
199
  #
209
200
  # @api private
210
- #
211
201
  def sink
212
202
  config.sink
213
203
  end