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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9191d87ebe0bde331ae432c838ec2718f41f89d099952598e98fe6d2ee3b9885
4
- data.tar.gz: 713134773a289c22d6b43b678c44b483f383aeb2520fd0f95711c47489ad64f0
3
+ metadata.gz: 71f2d39499ffdc3adced885c60b9b22220e409f360fce5ab8ac0aaeb36bdbda3
4
+ data.tar.gz: dee6aa26ddce9e06949566dfc75d4daf295ec76ea46903af80b0ac4027f338ac
5
5
  SHA512:
6
- metadata.gz: 00b83021df08f58b84688d6dad27792e0d5aab81288bf5f7afca9a43b2ebdf05fe09133c18dc19e8169727c20e4815caaafabfab9bbc9c7258100b9201ba967a
7
- data.tar.gz: 79659afba997fc24650398f33bc0de60905845429b01a49d999c24e2004f97b0c0ac3bee987e1cbf73010c213906e79a0e8fb856b5de826049cfc169f8154f24
6
+ metadata.gz: e6a44765e6fec377e0f4d9e3047832468af386b34f5d7a231fb940802a97977bba6000b016ca6739f402314bf03027dd8852776ff1ee687d6e67fb6168d5416a
7
+ data.tar.gz: 9d696a03e4a86c8838fa73ab147a75dac9f8f14b1f20eef653b30a3758c4044f016f4444f94827738d6bd39d05fdd9cddafdcfbd2a6475c2ebbc8674f005738d
@@ -51,6 +51,7 @@ require 'mutant/ast/types'
51
51
  require 'mutant/ast/nodes'
52
52
  require 'mutant/ast/named_children'
53
53
  require 'mutant/ast/node_predicates'
54
+ require 'mutant/ast/find_metaclass_containing'
54
55
  require 'mutant/ast/meta'
55
56
  require 'mutant/ast/meta/send'
56
57
  require 'mutant/ast/meta/const'
@@ -112,12 +113,14 @@ require 'mutant/mutator/node/send/conditional'
112
113
  require 'mutant/mutator/node/send/attribute_assignment'
113
114
  require 'mutant/mutator/node/when'
114
115
  require 'mutant/mutator/node/class'
116
+ require 'mutant/mutator/node/sclass'
115
117
  require 'mutant/mutator/node/define'
116
118
  require 'mutant/mutator/node/mlhs'
117
119
  require 'mutant/mutator/node/nthref'
118
120
  require 'mutant/mutator/node/masgn'
119
121
  require 'mutant/mutator/node/return'
120
122
  require 'mutant/mutator/node/block'
123
+ require 'mutant/mutator/node/block_pass'
121
124
  require 'mutant/mutator/node/if'
122
125
  require 'mutant/mutator/node/case'
123
126
  require 'mutant/mutator/node/splat'
@@ -134,11 +137,13 @@ require 'mutant/subject'
134
137
  require 'mutant/subject/method'
135
138
  require 'mutant/subject/method/instance'
136
139
  require 'mutant/subject/method/singleton'
140
+ require 'mutant/subject/method/metaclass'
137
141
  require 'mutant/matcher'
138
142
  require 'mutant/matcher/config'
139
143
  require 'mutant/matcher/chain'
140
144
  require 'mutant/matcher/method'
141
145
  require 'mutant/matcher/method/singleton'
146
+ require 'mutant/matcher/method/metaclass'
142
147
  require 'mutant/matcher/method/instance'
143
148
  require 'mutant/matcher/methods'
144
149
  require 'mutant/matcher/namespace'
@@ -161,8 +166,6 @@ require 'mutant/selector/expression'
161
166
  require 'mutant/selector/null'
162
167
  require 'mutant/config'
163
168
  require 'mutant/cli'
164
- require 'mutant/color'
165
- require 'mutant/diff'
166
169
  require 'mutant/runner'
167
170
  require 'mutant/runner/sink'
168
171
  require 'mutant/result'
@@ -27,15 +27,6 @@ module Mutant
27
27
  path
28
28
  end
29
29
 
30
- # Walk all ast nodes keeping track of path
31
- #
32
- # @param [Parser::AST::Node] root
33
- # @param [Array<Parser::AST::Node>] stack
34
- #
35
- # @yield [Parser::AST::Node]
36
- # all nodes visited recursively including root
37
- #
38
- # @return [undefined]
39
30
  def self.walk(node, stack, &block)
40
31
  block.call(node, stack)
41
32
  node.children.grep(::Parser::AST::Node) do |child|
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mutant
4
+ module AST
5
+ # Given an AST, finds the sclass that directly(-ish) contains the provided
6
+ # node.
7
+ # This won't match arbitrarily complex structures - it only searches the
8
+ # first level deep (no begins-in-begins, for example). This is in
9
+ # keeping with mutant generally not supporting 'weird' syntax.
10
+ # Descending into 'begin' nodes is supported because these are generated for
11
+ # the one-line syntax class << self; def foo; end
12
+ class FindMetaclassContaining
13
+ include NodePredicates, Concord.new(:root, :target), Procto.call
14
+
15
+ SCLASS_BODY_INDEX = 1
16
+
17
+ private_constant(*constants(false))
18
+
19
+ # Find metaclass node containing target node
20
+ #
21
+ # @return [Parser::AST::Node, nil]
22
+ #
23
+ # @api private
24
+ def call
25
+ AST.find_last_path(root) do |current|
26
+ next unless n_sclass?(current)
27
+
28
+ metaclass_of?(current)
29
+ end.last
30
+ end
31
+
32
+ private
33
+
34
+ def metaclass_of?(sclass)
35
+ body = sclass.children.fetch(SCLASS_BODY_INDEX)
36
+ body.equal?(target) || transparently_contains?(body)
37
+ end
38
+
39
+ def transparently_contains?(body)
40
+ n_begin?(body) && include_exact?(body.children, target)
41
+ end
42
+
43
+ def include_exact?(haystack, needle)
44
+ haystack.any? { |elem| elem.equal?(needle) }
45
+ end
46
+ end
47
+ end
48
+ end
@@ -56,16 +56,10 @@ module Mutant
56
56
 
57
57
  private
58
58
 
59
- # Test if node is `proc { ... }`
60
- #
61
- # @return [Boolean]
62
59
  def naked_proc?
63
60
  !receiver && selector.equal?(:proc)
64
61
  end
65
62
 
66
- # Test if node is `Proc.new { ... }`
67
- #
68
- # @return [Boolean]
69
63
  def proc_new?
70
64
  receiver &&
71
65
  selector.equal?(:new) &&
@@ -49,9 +49,6 @@ module Mutant
49
49
  end
50
50
  # rubocop:enable Metrics/MethodLength
51
51
 
52
- # Infect environment
53
- #
54
- # @return [undefined]
55
52
  def self.infect(env)
56
53
  config, world = env.config, env.world
57
54
 
@@ -60,12 +57,6 @@ module Mutant
60
57
  end
61
58
  private_class_method :infect
62
59
 
63
- # Matchable scopes
64
- #
65
- # @param [World] world
66
- # @param [Config] config
67
- #
68
- # @return [Array<Scope>]
69
60
  def self.matchable_scopes(world, config)
70
61
  scopes = world.object_space.each_object(Module).each_with_object([]) do |scope, aggregate|
71
62
  expression = expression(config.reporter, config.expression_parser, scope) || next
@@ -76,15 +67,6 @@ module Mutant
76
67
  end
77
68
  private_class_method :matchable_scopes
78
69
 
79
- # Scope name from scoping object
80
- #
81
- # @param [Class, Module] scope
82
- #
83
- # @return [String]
84
- # if scope has a name and does not raise exceptions obtaining it
85
- #
86
- # @return [nil]
87
- # otherwise
88
70
  def self.scope_name(reporter, scope)
89
71
  scope.name
90
72
  rescue => exception
@@ -99,20 +81,7 @@ module Mutant
99
81
  end
100
82
  private_class_method :scope_name
101
83
 
102
- # Try to turn scope into expression
103
- #
104
- # @param [Expression::Parser] expression_parser
105
- # @param [Class, Module] scope
106
- #
107
- # @return [Expression]
108
- # if scope can be represented in an expression
109
- #
110
- # @return [nil]
111
- # otherwise
112
- #
113
84
  # rubocop:disable Metrics/MethodLength
114
- #
115
- # ignore :reek:LongParameterList
116
85
  def self.expression(reporter, expression_parser, scope)
117
86
  name = scope_name(reporter, scope) or return
118
87
 
@@ -132,11 +101,6 @@ module Mutant
132
101
  private_class_method :expression
133
102
  # rubocop:enable Metrics/MethodLength
134
103
 
135
- # Write a semantics warning
136
- #
137
- # @return [undefined]
138
- #
139
- # ignore :reek:LongParameterList
140
104
  def self.semantics_warning(reporter, format, options)
141
105
  reporter.warn(SEMANTICS_MESSAGE_FORMAT % { message: format % options })
142
106
  end
@@ -88,23 +88,12 @@ module Mutant
88
88
 
89
89
  private
90
90
 
91
- # Parse matchers
92
- #
93
- # @param [Array<String>] expressions
94
- #
95
- # @return [undefined]
96
91
  def parse_match_expressions(expressions)
97
92
  expressions.each do |expression|
98
93
  add_matcher(:match_expressions, config.expression_parser.apply(expression).from_right)
99
94
  end
100
95
  end
101
96
 
102
- # Add environmental options
103
- #
104
- # @param [Object] opts
105
- #
106
- # @return [undefined]
107
- #
108
97
  # rubocop:disable Metrics/MethodLength
109
98
  def add_environment_options(opts)
110
99
  opts.separator('Environment:')
@@ -121,12 +110,8 @@ module Mutant
121
110
  with(jobs: Integer(number))
122
111
  end
123
112
  end
113
+ # rubocop:enable Metrics/MethodLength
124
114
 
125
- # Add mutation options
126
- #
127
- # @param [OptionParser] opts
128
- #
129
- # @return [undefined]
130
115
  def add_mutation_options(opts)
131
116
  opts.separator(nil)
132
117
  opts.separator('Options:')
@@ -136,11 +121,7 @@ module Mutant
136
121
  end
137
122
  end
138
123
 
139
- # Add filter options
140
- #
141
- # @param [OptionParser] opts
142
- #
143
- # @return [undefined]
124
+ # rubocop:disable Metrics/MethodLength
144
125
  def add_filter_options(opts)
145
126
  opts.on('--ignore-subject EXPRESSION', 'Ignore subjects that match EXPRESSION as prefix') do |pattern|
146
127
  add_matcher(:ignore_expressions, config.expression_parser.apply(pattern).from_right)
@@ -154,12 +135,9 @@ module Mutant
154
135
  )
155
136
  end
156
137
  end
138
+ # rubocop:enable Metrics/MethodLength
157
139
 
158
- # Add debug options
159
- #
160
- # @param [OptionParser] opts
161
- #
162
- # @return [undefined]
140
+ # rubocop:disable Metrics/MethodLength
163
141
  def add_debug_options(opts)
164
142
  opts.on('--fail-fast', 'Fail fast') do
165
143
  with(fail_fast: true)
@@ -173,38 +151,16 @@ module Mutant
173
151
  world.kernel.exit
174
152
  end
175
153
  end
154
+ # rubocop:enable Metrics/MethodLength
176
155
 
177
- # With configuration
178
- #
179
- # @param [Hash<Symbol, Object>] attributes
180
- #
181
- # @return [undefined]
182
156
  def with(attributes)
183
157
  @config = config.with(attributes)
184
158
  end
185
159
 
186
- # Add configuration
187
- #
188
- # @param [Symbol] attribute
189
- # the attribute to add to
190
- #
191
- # @param [Object] value
192
- # the value to add
193
- #
194
- # @return [undefined]
195
160
  def add(attribute, value)
196
161
  with(attribute => config.public_send(attribute) + [value])
197
162
  end
198
163
 
199
- # Add matcher configuration
200
- #
201
- # @param [Symbol] attribute
202
- # the attribute to add to
203
- #
204
- # @param [Object] value
205
- # the value to add
206
- #
207
- # @return [undefined]
208
164
  def add_matcher(attribute, value)
209
165
  with(matcher: config.matcher.add(attribute, value))
210
166
  end
@@ -126,14 +126,6 @@ module Mutant
126
126
  end
127
127
  end
128
128
 
129
- # Load contents of file
130
- #
131
- # @param [Pathname] path
132
- #
133
- # @return [Config]
134
- #
135
- # @raise [Either<String, Hash{Symbol => Object}>]
136
- # in case of config file error
137
129
  def self.load_contents(path)
138
130
  Transform::Named
139
131
  .new(path.to_s, TRANSFORM)
@@ -81,9 +81,6 @@ module Mutant
81
81
 
82
82
  private
83
83
 
84
- # Nesting of names in scope
85
- #
86
- # @return [Array<String>]
87
84
  def name_nesting
88
85
  scope.name.split(NAMESPACE_DELIMITER)
89
86
  end
@@ -126,12 +126,6 @@ module Mutant
126
126
 
127
127
  private
128
128
 
129
- # Kill mutation under isolation with integration
130
- #
131
- # @param [Mutation] mutation
132
- # @param [Array<Test>] test
133
- #
134
- # @return [Result::Isolation]
135
129
  def run_mutation_tests(mutation, tests)
136
130
  config.isolation.call do
137
131
  result = mutation.insert(world.kernel)
@@ -14,8 +14,8 @@ module Mutant
14
14
  private(*anima.attribute_names)
15
15
 
16
16
  MATCHERS = IceNine.deep_freeze(
17
- '.' => Matcher::Methods::Singleton,
18
- '#' => Matcher::Methods::Instance
17
+ '.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
18
+ '#' => [Matcher::Methods::Instance]
19
19
  )
20
20
 
21
21
  METHOD_NAME_PATTERN = Regexp.union(
@@ -39,16 +39,16 @@ module Mutant
39
39
  #
40
40
  # @return [Matcher]
41
41
  def matcher
42
- methods_matcher = MATCHERS.fetch(scope_symbol).new(scope)
42
+ matcher_candidates = MATCHERS.fetch(scope_symbol)
43
+ .map { |submatcher| submatcher.new(scope) }
44
+
45
+ methods_matcher = Matcher::Chain.new(matcher_candidates)
43
46
 
44
47
  Matcher::Filter.new(methods_matcher, ->(subject) { subject.expression.eql?(self) })
45
48
  end
46
49
 
47
50
  private
48
51
 
49
- # Scope object
50
- #
51
- # @return [Class, Method]
52
52
  def scope
53
53
  Object.const_get(scope_name)
54
54
  end
@@ -13,8 +13,8 @@ module Mutant
13
13
  private(*anima.attribute_names)
14
14
 
15
15
  MATCHERS = IceNine.deep_freeze(
16
- '.' => Matcher::Methods::Singleton,
17
- '#' => Matcher::Methods::Instance
16
+ '.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
17
+ '#' => [Matcher::Methods::Instance]
18
18
  )
19
19
  private_constant(*constants(false))
20
20
 
@@ -32,7 +32,10 @@ module Mutant
32
32
  #
33
33
  # @return [Matcher::Method]
34
34
  def matcher
35
- MATCHERS.fetch(scope_symbol).new(scope)
35
+ matcher_candidates = MATCHERS.fetch(scope_symbol)
36
+ .map { |submatcher| submatcher.new(scope) }
37
+
38
+ Matcher::Chain.new(matcher_candidates)
36
39
  end
37
40
 
38
41
  # Length of match with other expression
@@ -50,9 +53,6 @@ module Mutant
50
53
 
51
54
  private
52
55
 
53
- # Scope object
54
- #
55
- # @return [Class, Method]
56
56
  def scope
57
57
  Object.const_get(scope_name)
58
58
  end
@@ -28,12 +28,6 @@ module Mutant
28
28
 
29
29
  private
30
30
 
31
- # Expressions parsed from input
32
- #
33
- # @param [String] input
34
- #
35
- # @return [Array<Expression>]
36
- # if expressions can be parsed from input
37
31
  def expressions(input)
38
32
  types.each_with_object([]) do |type, aggregate|
39
33
  expression = type.try_parse(input) and aggregate << expression
@@ -32,14 +32,6 @@ module Mutant
32
32
  .fmap { |klass| klass.new(env.config).setup }
33
33
  end
34
34
 
35
- # Attempt to require integration
36
- #
37
- # @param env [Bootstrap]
38
- #
39
- # @return [Either<String, undefined>]
40
- #
41
- # @api private
42
- #
43
35
  # rubocop:disable Style/MultilineBlockChain
44
36
  def self.attempt_require(env)
45
37
  integration_name = env.config.integration
@@ -56,13 +48,6 @@ module Mutant
56
48
  private_class_method :attempt_require
57
49
  # rubocop:enable Style/MultilineBlockChain
58
50
 
59
- # Attempt const get
60
- #
61
- # @param env [Boostrap]
62
- #
63
- # @return [Either<String, Class<Integration>>]
64
- #
65
- # @api private
66
51
  def self.attempt_const_get(env)
67
52
  integration_name = env.config.integration
68
53
  constant_name = integration_name.capitalize
@@ -98,9 +83,6 @@ module Mutant
98
83
 
99
84
  private
100
85
 
101
- # Expression parser
102
- #
103
- # @return [Expression::Parser]
104
86
  def expression_parser
105
87
  config.expression_parser
106
88
  end