mutant 0.9.7 → 0.9.12

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 (336) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +5 -2
  3. data/lib/mutant/ast.rb +0 -9
  4. data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
  5. data/lib/mutant/ast/meta/send.rb +0 -6
  6. data/lib/mutant/bootstrap.rb +0 -36
  7. data/lib/mutant/cli.rb +5 -49
  8. data/lib/mutant/config.rb +0 -8
  9. data/lib/mutant/context.rb +0 -3
  10. data/lib/mutant/env.rb +0 -6
  11. data/lib/mutant/expression/method.rb +6 -6
  12. data/lib/mutant/expression/methods.rb +6 -6
  13. data/lib/mutant/expression/parser.rb +0 -6
  14. data/lib/mutant/integration.rb +0 -18
  15. data/lib/mutant/isolation.rb +1 -1
  16. data/lib/mutant/isolation/fork.rb +2 -24
  17. data/lib/mutant/isolation/none.rb +1 -1
  18. data/lib/mutant/license.rb +11 -0
  19. data/lib/mutant/matcher.rb +0 -14
  20. data/lib/mutant/matcher/config.rb +0 -11
  21. data/lib/mutant/matcher/method.rb +0 -31
  22. data/lib/mutant/matcher/method/instance.rb +0 -8
  23. data/lib/mutant/matcher/method/metaclass.rb +86 -0
  24. data/lib/mutant/matcher/method/singleton.rb +0 -25
  25. data/lib/mutant/matcher/methods.rb +17 -28
  26. data/lib/mutant/matcher/namespace.rb +0 -10
  27. data/lib/mutant/matcher/scope.rb +2 -4
  28. data/lib/mutant/meta/example/dsl.rb +0 -21
  29. data/lib/mutant/meta/example/verification.rb +0 -20
  30. data/lib/mutant/minitest/coverage.rb +53 -0
  31. data/lib/mutant/mutation.rb +0 -3
  32. data/lib/mutant/mutator.rb +1 -29
  33. data/lib/mutant/mutator/node.rb +1 -66
  34. data/lib/mutant/mutator/node/and_asgn.rb +0 -3
  35. data/lib/mutant/mutator/node/argument.rb +0 -15
  36. data/lib/mutant/mutator/node/arguments.rb +0 -20
  37. data/lib/mutant/mutator/node/begin.rb +0 -3
  38. data/lib/mutant/mutator/node/binary.rb +0 -23
  39. data/lib/mutant/mutator/node/block.rb +0 -15
  40. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  41. data/lib/mutant/mutator/node/break.rb +0 -3
  42. data/lib/mutant/mutator/node/case.rb +0 -9
  43. data/lib/mutant/mutator/node/class.rb +0 -3
  44. data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
  45. data/lib/mutant/mutator/node/const.rb +0 -3
  46. data/lib/mutant/mutator/node/define.rb +0 -11
  47. data/lib/mutant/mutator/node/defined.rb +0 -3
  48. data/lib/mutant/mutator/node/dstr.rb +0 -3
  49. data/lib/mutant/mutator/node/dsym.rb +0 -3
  50. data/lib/mutant/mutator/node/generic.rb +0 -74
  51. data/lib/mutant/mutator/node/if.rb +0 -12
  52. data/lib/mutant/mutator/node/index.rb +0 -27
  53. data/lib/mutant/mutator/node/kwbegin.rb +0 -3
  54. data/lib/mutant/mutator/node/literal.rb +0 -3
  55. data/lib/mutant/mutator/node/literal/array.rb +0 -6
  56. data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
  57. data/lib/mutant/mutator/node/literal/float.rb +0 -9
  58. data/lib/mutant/mutator/node/literal/hash.rb +0 -9
  59. data/lib/mutant/mutator/node/literal/integer.rb +0 -9
  60. data/lib/mutant/mutator/node/literal/nil.rb +0 -3
  61. data/lib/mutant/mutator/node/literal/range.rb +4 -7
  62. data/lib/mutant/mutator/node/literal/regex.rb +0 -6
  63. data/lib/mutant/mutator/node/literal/string.rb +0 -3
  64. data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
  65. data/lib/mutant/mutator/node/masgn.rb +0 -3
  66. data/lib/mutant/mutator/node/match_current_line.rb +0 -3
  67. data/lib/mutant/mutator/node/mlhs.rb +0 -3
  68. data/lib/mutant/mutator/node/named_value/access.rb +2 -14
  69. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
  70. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
  71. data/lib/mutant/mutator/node/next.rb +0 -3
  72. data/lib/mutant/mutator/node/noop.rb +1 -4
  73. data/lib/mutant/mutator/node/nthref.rb +0 -3
  74. data/lib/mutant/mutator/node/op_asgn.rb +0 -3
  75. data/lib/mutant/mutator/node/or_asgn.rb +0 -3
  76. data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
  77. data/lib/mutant/mutator/node/regopt.rb +0 -6
  78. data/lib/mutant/mutator/node/resbody.rb +0 -6
  79. data/lib/mutant/mutator/node/rescue.rb +2 -19
  80. data/lib/mutant/mutator/node/return.rb +0 -3
  81. data/lib/mutant/mutator/node/sclass.rb +20 -0
  82. data/lib/mutant/mutator/node/send.rb +26 -61
  83. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
  84. data/lib/mutant/mutator/node/send/binary.rb +0 -11
  85. data/lib/mutant/mutator/node/send/conditional.rb +0 -3
  86. data/lib/mutant/mutator/node/splat.rb +0 -3
  87. data/lib/mutant/mutator/node/super.rb +0 -3
  88. data/lib/mutant/mutator/node/when.rb +0 -19
  89. data/lib/mutant/mutator/node/yield.rb +0 -3
  90. data/lib/mutant/mutator/node/zsuper.rb +0 -3
  91. data/lib/mutant/mutator/util/array.rb +0 -6
  92. data/lib/mutant/mutator/util/symbol.rb +0 -3
  93. data/lib/mutant/parallel.rb +0 -13
  94. data/lib/mutant/parallel/driver.rb +0 -10
  95. data/lib/mutant/parallel/worker.rb +0 -22
  96. data/lib/mutant/registry.rb +2 -7
  97. data/lib/mutant/reporter/cli.rb +0 -5
  98. data/lib/mutant/reporter/cli/format.rb +0 -9
  99. data/lib/mutant/reporter/cli/printer.rb +2 -42
  100. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  101. data/lib/mutant/reporter/cli/printer/isolation_result.rb +0 -18
  102. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  103. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  104. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  105. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  106. data/lib/mutant/repository/diff.rb +1 -13
  107. data/lib/mutant/repository/diff/ranges.rb +0 -11
  108. data/lib/mutant/result.rb +0 -3
  109. data/lib/mutant/runner.rb +0 -18
  110. data/lib/mutant/runner/sink.rb +0 -5
  111. data/lib/mutant/subject.rb +0 -8
  112. data/lib/mutant/subject/method.rb +0 -3
  113. data/lib/mutant/subject/method/instance.rb +40 -6
  114. data/lib/mutant/subject/method/metaclass.rb +30 -0
  115. data/lib/mutant/transform.rb +0 -92
  116. data/lib/mutant/version.rb +1 -1
  117. data/lib/mutant/warnings.rb +0 -6
  118. data/lib/mutant/zombifier.rb +2 -34
  119. metadata +61 -333
  120. data/.circleci/config.yml +0 -53
  121. data/.gitignore +0 -38
  122. data/.rspec +0 -5
  123. data/.rubocop.yml +0 -7
  124. data/Changelog.md +0 -71
  125. data/Gemfile +0 -14
  126. data/Gemfile.lock +0 -167
  127. data/Gemfile.shared +0 -3
  128. data/README.md +0 -138
  129. data/Rakefile +0 -5
  130. data/config/devtools.yml +0 -2
  131. data/config/reek.yml +0 -138
  132. data/config/rubocop.yml +0 -205
  133. data/config/yardstick.yml +0 -2
  134. data/docs/commercial-support.md +0 -14
  135. data/docs/concurrency.md +0 -39
  136. data/docs/incremental.md +0 -76
  137. data/docs/known-problems.md +0 -30
  138. data/docs/limitations.md +0 -50
  139. data/docs/mutant-minitest.md +0 -149
  140. data/docs/mutant-rspec.md +0 -130
  141. data/docs/nomenclature.md +0 -82
  142. data/docs/reading-reports.md +0 -74
  143. data/lib/mutant/color.rb +0 -43
  144. data/lib/mutant/diff.rb +0 -114
  145. data/meta/and.rb +0 -15
  146. data/meta/and_asgn.rb +0 -14
  147. data/meta/array.rb +0 -30
  148. data/meta/begin.rb +0 -23
  149. data/meta/block.rb +0 -202
  150. data/meta/block_pass.rb +0 -8
  151. data/meta/blockarg.rb +0 -10
  152. data/meta/break.rb +0 -10
  153. data/meta/case.rb +0 -223
  154. data/meta/casgn.rb +0 -28
  155. data/meta/cbase.rb +0 -8
  156. data/meta/class.rb +0 -12
  157. data/meta/const.rb +0 -17
  158. data/meta/csend.rb +0 -10
  159. data/meta/cvar.rb +0 -7
  160. data/meta/cvasgn.rb +0 -10
  161. data/meta/date.rb +0 -59
  162. data/meta/def.rb +0 -203
  163. data/meta/defined.rb +0 -9
  164. data/meta/dstr.rb +0 -13
  165. data/meta/dsym.rb +0 -14
  166. data/meta/ensure.rb +0 -9
  167. data/meta/false.rb +0 -8
  168. data/meta/file.rb +0 -5
  169. data/meta/float.rb +0 -37
  170. data/meta/gvar.rb +0 -7
  171. data/meta/gvasgn.rb +0 -10
  172. data/meta/hash.rb +0 -24
  173. data/meta/if.rb +0 -77
  174. data/meta/index.rb +0 -133
  175. data/meta/indexasgn.rb +0 -31
  176. data/meta/int.rb +0 -18
  177. data/meta/ivar.rb +0 -8
  178. data/meta/ivasgn.rb +0 -23
  179. data/meta/kwarg.rb +0 -10
  180. data/meta/kwbegin.rb +0 -9
  181. data/meta/kwoptarg.rb +0 -13
  182. data/meta/lambda.rb +0 -23
  183. data/meta/line.rb +0 -5
  184. data/meta/lvar.rb +0 -16
  185. data/meta/lvasgn.rb +0 -25
  186. data/meta/masgn.rb +0 -7
  187. data/meta/match_current_line.rb +0 -15
  188. data/meta/next.rb +0 -11
  189. data/meta/nil.rb +0 -5
  190. data/meta/nthref.rb +0 -14
  191. data/meta/op_assgn.rb +0 -17
  192. data/meta/or.rb +0 -15
  193. data/meta/or_asgn.rb +0 -50
  194. data/meta/range.rb +0 -39
  195. data/meta/redo.rb +0 -5
  196. data/meta/regexp.rb +0 -81
  197. data/meta/regopt.rb +0 -10
  198. data/meta/rescue.rb +0 -90
  199. data/meta/return.rb +0 -16
  200. data/meta/self.rb +0 -7
  201. data/meta/send.rb +0 -604
  202. data/meta/str.rb +0 -7
  203. data/meta/super.rb +0 -27
  204. data/meta/sym.rb +0 -8
  205. data/meta/true.rb +0 -8
  206. data/meta/until.rb +0 -17
  207. data/meta/while.rb +0 -26
  208. data/meta/yield.rb +0 -10
  209. data/mutant-minitest.gemspec +0 -22
  210. data/mutant-rspec.gemspec +0 -22
  211. data/mutant.gemspec +0 -41
  212. data/mutant.yml +0 -6
  213. data/spec/integration/mutant/corpus_spec.rb +0 -15
  214. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  215. data/spec/integration/mutant/minitest_spec.rb +0 -11
  216. data/spec/integration/mutant/null_spec.rb +0 -16
  217. data/spec/integration/mutant/rspec_spec.rb +0 -15
  218. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  219. data/spec/integrations.yml +0 -63
  220. data/spec/shared/base_behavior.rb +0 -45
  221. data/spec/shared/framework_integration_behavior.rb +0 -70
  222. data/spec/shared/method_matcher_behavior.rb +0 -47
  223. data/spec/spec_helper.rb +0 -75
  224. data/spec/support/corpus.rb +0 -318
  225. data/spec/support/file_system.rb +0 -62
  226. data/spec/support/ice_nine_config.rb +0 -10
  227. data/spec/support/ruby_vm.rb +0 -84
  228. data/spec/support/shared_context.rb +0 -169
  229. data/spec/support/test_app.rb +0 -7
  230. data/spec/support/warnings.yml +0 -6
  231. data/spec/support/xspec.rb +0 -183
  232. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  233. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  234. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  235. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  236. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  237. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  238. data/spec/unit/mutant/ast_spec.rb +0 -57
  239. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  240. data/spec/unit/mutant/cli_spec.rb +0 -305
  241. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  242. data/spec/unit/mutant/config_spec.rb +0 -126
  243. data/spec/unit/mutant/context_spec.rb +0 -111
  244. data/spec/unit/mutant/diff_spec.rb +0 -189
  245. data/spec/unit/mutant/env_spec.rb +0 -229
  246. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  247. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  248. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  249. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  250. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  251. data/spec/unit/mutant/expression_spec.rb +0 -45
  252. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  253. data/spec/unit/mutant/integration_spec.rb +0 -150
  254. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  255. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  256. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  257. data/spec/unit/mutant/license_spec.rb +0 -293
  258. data/spec/unit/mutant/loader_spec.rb +0 -79
  259. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  260. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  261. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  262. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  263. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  264. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  265. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  266. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  267. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  268. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  269. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  270. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  271. data/spec/unit/mutant/matcher_spec.rb +0 -102
  272. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  273. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  274. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  275. data/spec/unit/mutant/mutation_spec.rb +0 -140
  276. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  277. data/spec/unit/mutant/mutator_spec.rb +0 -21
  278. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  279. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  280. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  281. data/spec/unit/mutant/parallel_spec.rb +0 -115
  282. data/spec/unit/mutant/parser_spec.rb +0 -26
  283. data/spec/unit/mutant/range_spec.rb +0 -141
  284. data/spec/unit/mutant/registry_spec.rb +0 -47
  285. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  286. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  287. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  288. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  290. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  291. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  292. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  293. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  294. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  295. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  296. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  297. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  298. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  299. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  300. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  301. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  302. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  303. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  304. data/spec/unit/mutant/result/env_spec.rb +0 -161
  305. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  306. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  307. data/spec/unit/mutant/result/test_spec.rb +0 -14
  308. data/spec/unit/mutant/result_spec.rb +0 -33
  309. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  310. data/spec/unit/mutant/runner_spec.rb +0 -121
  311. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  312. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  313. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  314. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  315. data/spec/unit/mutant/subject_spec.rb +0 -93
  316. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  317. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  318. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  319. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  320. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  321. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  322. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  323. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  324. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  325. data/spec/unit/mutant/util/one_spec.rb +0 -22
  326. data/spec/unit/mutant/warnings_spec.rb +0 -89
  327. data/spec/unit/mutant/world_spec.rb +0 -63
  328. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  329. data/test_app/.rspec +0 -1
  330. data/test_app/Gemfile.minitest +0 -4
  331. data/test_app/Gemfile.rspec3.8 +0 -7
  332. data/test_app/lib/test_app.rb +0 -109
  333. data/test_app/lib/test_app/literal.rb +0 -35
  334. data/test_app/spec/spec_helper.rb +0 -9
  335. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  336. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -35,18 +35,10 @@ module Mutant
35
35
 
36
36
  private
37
37
 
38
- # Object being printed
39
- #
40
- # @return [Result::Env]
41
38
  def object
42
39
  super().payload
43
40
  end
44
41
 
45
- # Mutations processed per second
46
- #
47
- # @return [Float]
48
- #
49
- # @api private
50
42
  def mutations_per_second
51
43
  amount_mutation_results / runtime
52
44
  end
@@ -32,9 +32,6 @@ module Mutant
32
32
 
33
33
  private
34
34
 
35
- # Print stats
36
- #
37
- # @return [undefined]
38
35
  def print_stats
39
36
  status(
40
37
  FORMAT,
@@ -47,16 +44,10 @@ module Mutant
47
44
  )
48
45
  end
49
46
 
50
- # Print progress bar finish
51
- #
52
- # @return [undefined]
53
47
  def print_progress_bar_finish
54
48
  puts(nil) unless amount_mutation_results.zero?
55
49
  end
56
50
 
57
- # Print mutation results
58
- #
59
- # @return [undefined]
60
51
  def print_mutation_results
61
52
  visit_collection(MutationProgressResult, object.mutation_results)
62
53
  end
@@ -29,10 +29,6 @@ module Mutant
29
29
 
30
30
  private
31
31
 
32
- # Touched paths
33
- #
34
- # @return [Hash{Pathname => Path}]
35
- #
36
32
  # rubocop:disable Metrics/MethodLength
37
33
  def touched_paths
38
34
  pathname = world.pathname
@@ -49,13 +45,8 @@ module Mutant
49
45
  .to_h
50
46
  end
51
47
  memoize :touched_paths
48
+ # rubocop:enable Metrics/MethodLength
52
49
 
53
- # Parse path
54
- #
55
- # @param [Pathname] work_dir
56
- # @param [String] line
57
- #
58
- # @return [Path]
59
50
  def parse_line(work_dir, line)
60
51
  match = FORMAT.match(line) or fail Error, "Invalid git diff-index line: #{line}"
61
52
 
@@ -88,9 +79,6 @@ module Mutant
88
79
 
89
80
  private
90
81
 
91
- # Ranges of hunks in the diff
92
- #
93
- # @return [Array<Range<Integer>>]
94
82
  def diff_ranges
95
83
  world
96
84
  .capture_stdout(%W[git diff --unified=0 #{to} -- #{path}])
@@ -18,11 +18,6 @@ module Mutant
18
18
  diff.lines.flat_map(&method(:parse_ranges)).to_set
19
19
  end
20
20
 
21
- # Parse ranges from line
22
- #
23
- # @param [String] line
24
- #
25
- # @return [Array<Range<Integer>>]
26
21
  def self.parse_ranges(line)
27
22
  match = REGEXP.match(line) or return EMPTY_ARRAY
28
23
 
@@ -34,12 +29,6 @@ module Mutant
34
29
  end
35
30
  private_class_method :parse_ranges
36
31
 
37
- # Construct a range from start point and offset
38
- #
39
- # @param [String] start
40
- # @param [String, nil] offset
41
- #
42
- # @return [Range<Integer>]
43
32
  def self.mk_range(start, offset)
44
33
  start = Integer(start)
45
34
 
@@ -193,9 +193,6 @@ module Mutant
193
193
 
194
194
  private
195
195
 
196
- # Killed mutation results
197
- #
198
- # @return [Array<Result::Mutation>]
199
196
  def killed_mutation_results
200
197
  mutation_results.select(&:success?)
201
198
  end
@@ -12,9 +12,6 @@ module Mutant
12
12
  Either::Right.new(run_mutation_analysis(env))
13
13
  end
14
14
 
15
- # Run mutation analysis
16
- #
17
- # @return [undefined]
18
15
  def self.run_mutation_analysis(env)
19
16
  reporter = reporter(env)
20
17
 
@@ -27,13 +24,6 @@ module Mutant
27
24
  end
28
25
  private_class_method :run_mutation_analysis
29
26
 
30
- # Run driver
31
- #
32
- # @param [Reporter] reporter
33
- # @param [Driver] driver
34
- #
35
- # @return [Object]
36
- # the last returned status payload
37
27
  def self.run_driver(reporter, driver)
38
28
  loop do
39
29
  status = driver.wait_timeout(reporter.delay)
@@ -43,9 +33,6 @@ module Mutant
43
33
  end
44
34
  private_class_method :run_driver
45
35
 
46
- # Configuration for parallel execution engine
47
- #
48
- # @return [Parallell::Config]
49
36
  def self.mutation_test_config(env)
50
37
  world = env.world
51
38
 
@@ -61,11 +48,6 @@ module Mutant
61
48
  end
62
49
  private_class_method :mutation_test_config
63
50
 
64
- # Reporter to use
65
- #
66
- # @param [Env] env
67
- #
68
- # @return [Reporter]
69
51
  def self.reporter(env)
70
52
  env.config.reporter
71
53
  end
@@ -51,11 +51,6 @@ module Mutant
51
51
 
52
52
  private
53
53
 
54
- # Return previous results
55
- #
56
- # @param [Subject]
57
- #
58
- # @return [Array<Result::Mutation>]
59
54
  def previous_mutation_results(subject)
60
55
  subject_result = @subject_results.fetch(subject) { return EMPTY_ARRAY }
61
56
  subject_result.mutation_results
@@ -79,18 +79,10 @@ module Mutant
79
79
 
80
80
  private
81
81
 
82
- # Neutral mutation
83
- #
84
- # @return [Mutation::Neutral]
85
82
  def neutral_mutation
86
83
  Mutation::Neutral.new(self, wrap_node(node))
87
84
  end
88
85
 
89
- # Wrap node into subject specific container
90
- #
91
- # @param [Parser::AST::Node] node
92
- #
93
- # @return [Parser::AST::Node]
94
86
  def wrap_node(node)
95
87
  node
96
88
  end
@@ -34,9 +34,6 @@ module Mutant
34
34
 
35
35
  private
36
36
 
37
- # The scope
38
- #
39
- # @return [Class, Module]
40
37
  def scope
41
38
  context.scope
42
39
  end
@@ -23,23 +23,57 @@ module Mutant
23
23
  class Memoized < self
24
24
  include AST::Sexp
25
25
 
26
+ FREEZER_OPTION_VALUES = {
27
+ Adamantium::Freezer::Deep => :deep,
28
+ Adamantium::Freezer::Flat => :flat,
29
+ Adamantium::Freezer::Noop => :noop
30
+ }.freeze
31
+
32
+ private_constant(*constants(false))
33
+
26
34
  # Prepare subject for mutation insertion
27
35
  #
28
36
  # @return [self]
29
37
  def prepare
30
- scope.__send__(:memoized_methods).instance_variable_get(:@memory).delete(name)
38
+ memory.delete(name)
31
39
  super()
32
40
  end
33
41
 
34
42
  private
35
43
 
36
- # Memoizer node for mutant
44
+ def wrap_node(mutant)
45
+ s(:begin, mutant, s(:send, nil, :memoize, s(:args, s(:sym, name), *options)))
46
+ end
47
+
48
+ # The optional AST node for adamantium memoization options
37
49
  #
38
- # @param [Parser::AST::Node] mutant
50
+ # @return [Array(Parser::AST::Node), nil]
51
+ def options
52
+ # rubocop:disable Style/GuardClause
53
+ if FREEZER_OPTION_VALUES.key?(freezer)
54
+ [
55
+ s(:hash,
56
+ s(:pair,
57
+ s(:sym, :freezer),
58
+ s(:sym, FREEZER_OPTION_VALUES.fetch(freezer))))
59
+ ]
60
+ end
61
+ # rubocop:enable Style/GuardClause
62
+ end
63
+
64
+ # The freezer used for memoization
39
65
  #
40
- # @return [Parser::AST::Node]
41
- def wrap_node(mutant)
42
- s(:begin, mutant, s(:send, nil, :memoize, s(:args, s(:sym, name))))
66
+ # @return [Object]
67
+ def freezer
68
+ memory.fetch(name).instance_variable_get(:@freezer)
69
+ end
70
+ memoize :freezer, freezer: :noop
71
+
72
+ # The memory used for memoization
73
+ #
74
+ # @return [ThreadSafe::Cache]
75
+ def memory
76
+ scope.__send__(:memoized_methods).instance_variable_get(:@memory)
43
77
  end
44
78
 
45
79
  end # Memoized
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mutant
4
+ class Subject
5
+ class Method
6
+ # Singleton method defined using metaclass syntax
7
+ # (class << self; def foo; end; end)
8
+ class Metaclass < self
9
+ include AST::Sexp
10
+
11
+ NAME_INDEX = 0
12
+ SYMBOL = '.'
13
+
14
+ # Prepare subject for mutation insertion
15
+ #
16
+ # @return [self]
17
+ def prepare
18
+ scope.singleton_class.public_send(:undef_method, name)
19
+ self
20
+ end
21
+
22
+ private
23
+
24
+ def wrap_node(mutant)
25
+ s(:sclass, AST::Nodes::N_SELF, mutant)
26
+ end
27
+ end # Metaclass
28
+ end # Method
29
+ end # Subject
30
+ end # Mutant
@@ -49,9 +49,6 @@ module Mutant
49
49
 
50
50
  private
51
51
 
52
- # Path representation to error
53
- #
54
- # @return [String]
55
52
  def path
56
53
  trace.map { |error| error.transform.slug }.reject(&:empty?).join('/')
57
54
  end
@@ -78,23 +75,6 @@ module Mutant
78
75
 
79
76
  private
80
77
 
81
- # Make error from curent context
82
- #
83
- # @param [Error, nil] cause
84
- # original error, if any
85
- #
86
- # @param [Object] input
87
- # input that ran into the error
88
- #
89
- # @param [String] message
90
- # human readable error message
91
- #
92
- # @param [Transform, nil]
93
- # transform that generated the error from input
94
- #
95
- # @return [Error]
96
- #
97
- # ignore :reek:LongParameterList
98
78
  def error(cause: nil, input:, message: nil)
99
79
  Error.new(
100
80
  cause: cause,
@@ -104,42 +84,18 @@ module Mutant
104
84
  )
105
85
  end
106
86
 
107
- # Lift error
108
- #
109
- # @param [Error]
110
- #
111
- # @return [Error]
112
87
  def lift_error(error)
113
88
  error.with(transform: self)
114
89
  end
115
90
 
116
- # Wrap error
117
- #
118
- # @param [Error]
119
- #
120
- # @return [Error]
121
91
  def wrap_error(error)
122
92
  error(cause: error, input: error.input)
123
93
  end
124
94
 
125
- # Create failure
126
- #
127
- # @param [Object] value
128
- #
129
- # @return [Either::Left]
130
- #
131
- # ignore :reek:UtilityFunction
132
95
  def failure(value)
133
96
  Either::Left.new(value)
134
97
  end
135
98
 
136
- # Create success
137
- #
138
- # @param [Object] value
139
- #
140
- # @return [Either::Right]
141
- #
142
- # ignore :reek:UtilityFunction
143
99
  def success(value)
144
100
  Either::Right.new(value)
145
101
  end
@@ -268,14 +224,6 @@ module Mutant
268
224
 
269
225
  private
270
226
 
271
- # Transform array
272
- #
273
- # @param [Array<Object>] input
274
- #
275
- # @return [Either<Error, Array<Object>]
276
- #
277
- # ignore :reek:NestedIterators
278
- #
279
227
  # rubocop:disable Metrics/MethodLength
280
228
  def run(input)
281
229
  output = []
@@ -357,31 +305,16 @@ module Mutant
357
305
 
358
306
  private
359
307
 
360
- # Transform hash
361
- #
362
- # @param [Hash] input
363
- #
364
- # @return [Either<Error, Hash>]
365
308
  def transform(input)
366
309
  transform_required(input).bind do |required|
367
310
  transform_optional(input).fmap(&required.method(:merge))
368
311
  end
369
312
  end
370
313
 
371
- # Transform required keys
372
- #
373
- # @param [Hash] input
374
- #
375
- # @return [Either<Error, Hash>]
376
314
  def transform_required(input)
377
315
  transform_keys(required, input)
378
316
  end
379
317
 
380
- # Transform optional keys
381
- #
382
- # @param [Hash] input
383
- #
384
- # @return [Either<Error, Hash>]
385
318
  def transform_optional(input)
386
319
  transform_keys(
387
320
  optional.select { |key| input.key?(key.value) },
@@ -389,13 +322,6 @@ module Mutant
389
322
  )
390
323
  end
391
324
 
392
- # Transform keys
393
- #
394
- # @param [Array<Transform::Hash::Key>] keys
395
- # @param [Hash] input
396
- #
397
- # @return [Either<Error, Hash>]
398
- #
399
325
  # ignore :reek:NestedIterators
400
326
  #
401
327
  # rubocop:disable Metrics/MethodLength
@@ -415,24 +341,12 @@ module Mutant
415
341
  end
416
342
  # rubocop:enable Metrics/MethodLength
417
343
 
418
- # Coerce key value under key specific transformer
419
- #
420
- # @param [Hash::Key] key
421
- # @param [Hash] input
422
- #
423
- # @return [Either<Error, Object>]
424
344
  def coerce_key(key, input)
425
345
  key.apply(input.fetch(key.value)).lmap do |error|
426
346
  error(input: input, cause: error)
427
347
  end
428
348
  end
429
349
 
430
- # Reject unexpected keys
431
- #
432
- # @param [Hash]
433
- #
434
- # @return [Either<Error, Object>]
435
- #
436
350
  # rubocop:disable Metrics/MethodLength
437
351
  def reject_keys(input)
438
352
  keys = input.keys
@@ -452,17 +366,11 @@ module Mutant
452
366
  end
453
367
  # rubocop:enable Metrics/MethodLength
454
368
 
455
- # Key values allowed to be present
456
- #
457
- # @return [Array<Object>]
458
369
  def allowed_keys
459
370
  required_keys + optional.map(&:value)
460
371
  end
461
372
  memoize :allowed_keys
462
373
 
463
- # Key values required to be present
464
- #
465
- # @return [Array<Object>]
466
374
  def required_keys
467
375
  required.map(&:value)
468
376
  end