mutant 0.9.8 → 0.9.13

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 (335) 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 +14 -37
  7. data/lib/mutant/cli.rb +11 -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 +2 -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 -3
  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/reporter/cli.rb +0 -5
  97. data/lib/mutant/reporter/cli/format.rb +0 -9
  98. data/lib/mutant/reporter/cli/printer.rb +2 -42
  99. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  100. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
  101. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  102. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  103. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  104. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  105. data/lib/mutant/repository/diff.rb +1 -13
  106. data/lib/mutant/repository/diff/ranges.rb +0 -11
  107. data/lib/mutant/result.rb +0 -3
  108. data/lib/mutant/runner.rb +0 -18
  109. data/lib/mutant/runner/sink.rb +0 -5
  110. data/lib/mutant/subject.rb +0 -8
  111. data/lib/mutant/subject/method.rb +0 -3
  112. data/lib/mutant/subject/method/instance.rb +40 -6
  113. data/lib/mutant/subject/method/metaclass.rb +30 -0
  114. data/lib/mutant/transform.rb +0 -92
  115. data/lib/mutant/version.rb +1 -1
  116. data/lib/mutant/warnings.rb +0 -6
  117. data/lib/mutant/zombifier.rb +2 -34
  118. metadata +61 -333
  119. data/.github/workflows/ci.yml +0 -121
  120. data/.gitignore +0 -38
  121. data/.rspec +0 -5
  122. data/.rubocop.yml +0 -7
  123. data/Changelog.md +0 -75
  124. data/Gemfile +0 -7
  125. data/Gemfile.lock +0 -167
  126. data/Gemfile.shared +0 -10
  127. data/README.md +0 -138
  128. data/Rakefile +0 -5
  129. data/config/devtools.yml +0 -2
  130. data/config/reek.yml +0 -138
  131. data/config/rubocop.yml +0 -205
  132. data/config/yardstick.yml +0 -2
  133. data/docs/commercial-support.md +0 -14
  134. data/docs/concurrency.md +0 -39
  135. data/docs/incremental.md +0 -76
  136. data/docs/known-problems.md +0 -30
  137. data/docs/limitations.md +0 -50
  138. data/docs/mutant-minitest.md +0 -149
  139. data/docs/mutant-rspec.md +0 -130
  140. data/docs/nomenclature.md +0 -82
  141. data/docs/reading-reports.md +0 -74
  142. data/lib/mutant/color.rb +0 -43
  143. data/lib/mutant/diff.rb +0 -114
  144. data/meta/and.rb +0 -15
  145. data/meta/and_asgn.rb +0 -14
  146. data/meta/array.rb +0 -30
  147. data/meta/begin.rb +0 -23
  148. data/meta/block.rb +0 -202
  149. data/meta/block_pass.rb +0 -8
  150. data/meta/blockarg.rb +0 -10
  151. data/meta/break.rb +0 -10
  152. data/meta/case.rb +0 -223
  153. data/meta/casgn.rb +0 -28
  154. data/meta/cbase.rb +0 -8
  155. data/meta/class.rb +0 -12
  156. data/meta/const.rb +0 -17
  157. data/meta/csend.rb +0 -10
  158. data/meta/cvar.rb +0 -7
  159. data/meta/cvasgn.rb +0 -10
  160. data/meta/date.rb +0 -59
  161. data/meta/def.rb +0 -203
  162. data/meta/defined.rb +0 -9
  163. data/meta/dstr.rb +0 -13
  164. data/meta/dsym.rb +0 -14
  165. data/meta/ensure.rb +0 -9
  166. data/meta/false.rb +0 -8
  167. data/meta/file.rb +0 -5
  168. data/meta/float.rb +0 -37
  169. data/meta/gvar.rb +0 -7
  170. data/meta/gvasgn.rb +0 -10
  171. data/meta/hash.rb +0 -24
  172. data/meta/if.rb +0 -77
  173. data/meta/index.rb +0 -133
  174. data/meta/indexasgn.rb +0 -31
  175. data/meta/int.rb +0 -18
  176. data/meta/ivar.rb +0 -8
  177. data/meta/ivasgn.rb +0 -23
  178. data/meta/kwarg.rb +0 -10
  179. data/meta/kwbegin.rb +0 -9
  180. data/meta/kwoptarg.rb +0 -13
  181. data/meta/lambda.rb +0 -23
  182. data/meta/line.rb +0 -5
  183. data/meta/lvar.rb +0 -16
  184. data/meta/lvasgn.rb +0 -25
  185. data/meta/masgn.rb +0 -7
  186. data/meta/match_current_line.rb +0 -15
  187. data/meta/next.rb +0 -11
  188. data/meta/nil.rb +0 -5
  189. data/meta/nthref.rb +0 -14
  190. data/meta/op_assgn.rb +0 -17
  191. data/meta/or.rb +0 -15
  192. data/meta/or_asgn.rb +0 -50
  193. data/meta/range.rb +0 -39
  194. data/meta/redo.rb +0 -5
  195. data/meta/regexp.rb +0 -81
  196. data/meta/regopt.rb +0 -10
  197. data/meta/rescue.rb +0 -90
  198. data/meta/return.rb +0 -16
  199. data/meta/self.rb +0 -7
  200. data/meta/send.rb +0 -604
  201. data/meta/str.rb +0 -7
  202. data/meta/super.rb +0 -27
  203. data/meta/sym.rb +0 -8
  204. data/meta/true.rb +0 -8
  205. data/meta/until.rb +0 -17
  206. data/meta/while.rb +0 -26
  207. data/meta/yield.rb +0 -10
  208. data/mutant-minitest.gemspec +0 -22
  209. data/mutant-rspec.gemspec +0 -22
  210. data/mutant.gemspec +0 -41
  211. data/mutant.yml +0 -6
  212. data/spec/integration/mutant/corpus_spec.rb +0 -15
  213. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  214. data/spec/integration/mutant/minitest_spec.rb +0 -11
  215. data/spec/integration/mutant/null_spec.rb +0 -16
  216. data/spec/integration/mutant/rspec_spec.rb +0 -15
  217. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  218. data/spec/integrations.yml +0 -63
  219. data/spec/shared/base_behavior.rb +0 -45
  220. data/spec/shared/framework_integration_behavior.rb +0 -70
  221. data/spec/shared/method_matcher_behavior.rb +0 -47
  222. data/spec/spec_helper.rb +0 -75
  223. data/spec/support/corpus.rb +0 -318
  224. data/spec/support/file_system.rb +0 -62
  225. data/spec/support/ice_nine_config.rb +0 -10
  226. data/spec/support/ruby_vm.rb +0 -84
  227. data/spec/support/shared_context.rb +0 -169
  228. data/spec/support/test_app.rb +0 -7
  229. data/spec/support/warnings.yml +0 -6
  230. data/spec/support/xspec.rb +0 -183
  231. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  232. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  233. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  234. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  235. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  236. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  237. data/spec/unit/mutant/ast_spec.rb +0 -57
  238. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  239. data/spec/unit/mutant/cli_spec.rb +0 -305
  240. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  241. data/spec/unit/mutant/config_spec.rb +0 -126
  242. data/spec/unit/mutant/context_spec.rb +0 -111
  243. data/spec/unit/mutant/diff_spec.rb +0 -189
  244. data/spec/unit/mutant/env_spec.rb +0 -229
  245. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  246. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  247. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  248. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  249. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  250. data/spec/unit/mutant/expression_spec.rb +0 -45
  251. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  252. data/spec/unit/mutant/integration_spec.rb +0 -150
  253. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  254. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  255. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  256. data/spec/unit/mutant/license_spec.rb +0 -293
  257. data/spec/unit/mutant/loader_spec.rb +0 -79
  258. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  259. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  260. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  261. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  262. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  263. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  264. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  265. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  266. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  267. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  268. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  269. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  270. data/spec/unit/mutant/matcher_spec.rb +0 -102
  271. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  272. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  273. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  274. data/spec/unit/mutant/mutation_spec.rb +0 -140
  275. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  276. data/spec/unit/mutant/mutator_spec.rb +0 -21
  277. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  278. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  279. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  280. data/spec/unit/mutant/parallel_spec.rb +0 -115
  281. data/spec/unit/mutant/parser_spec.rb +0 -26
  282. data/spec/unit/mutant/range_spec.rb +0 -141
  283. data/spec/unit/mutant/registry_spec.rb +0 -74
  284. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  285. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  286. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  287. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  288. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  290. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  291. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  292. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  293. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  294. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  295. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  296. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  297. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  298. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  299. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  300. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  301. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  302. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  303. data/spec/unit/mutant/result/env_spec.rb +0 -161
  304. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  305. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  306. data/spec/unit/mutant/result/test_spec.rb +0 -14
  307. data/spec/unit/mutant/result_spec.rb +0 -33
  308. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  309. data/spec/unit/mutant/runner_spec.rb +0 -121
  310. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  311. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  312. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  313. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  314. data/spec/unit/mutant/subject_spec.rb +0 -93
  315. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  316. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  317. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  318. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  319. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  320. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  321. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  322. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  323. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  324. data/spec/unit/mutant/util/one_spec.rb +0 -22
  325. data/spec/unit/mutant/warnings_spec.rb +0 -89
  326. data/spec/unit/mutant/world_spec.rb +0 -63
  327. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  328. data/test_app/.rspec +0 -1
  329. data/test_app/Gemfile.minitest +0 -4
  330. data/test_app/Gemfile.rspec3.8 +0 -7
  331. data/test_app/lib/test_app.rb +0 -109
  332. data/test_app/lib/test_app/literal.rb +0 -35
  333. data/test_app/spec/spec_helper.rb +0 -9
  334. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  335. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -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
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mutant
4
4
  # Current mutant version
5
- VERSION = '0.9.8'
5
+ VERSION = '0.9.13'
6
6
  end # Mutant
@@ -92,9 +92,6 @@ module Mutant
92
92
 
93
93
  private
94
94
 
95
- # Hook called when capturing a warning
96
- #
97
- # @return [undefined]
98
95
  def capture(*arguments)
99
96
  if @disabled
100
97
  @original.call(*arguments)
@@ -103,9 +100,6 @@ module Mutant
103
100
  end
104
101
  end
105
102
 
106
- # Assert warnings capture does not call itself
107
- #
108
- # Its currently not supported nor intended to be supported.
109
103
  def assert_no_recursion
110
104
  fail RecursiveUseError unless @disabled
111
105
  end
@@ -42,32 +42,20 @@ module Mutant
42
42
 
43
43
  private
44
44
 
45
- # Original require method
45
+ attr_reader :original
46
+ private :original
46
47
  #
47
48
  # @return [Method]
48
- attr_reader :original
49
49
 
50
- # Run zombifier
51
- #
52
- # @return [undefined]
53
50
  def call
54
51
  @original = require_highjack.call(method(:require))
55
52
  require(root_require)
56
53
  end
57
54
 
58
- # Test if logical name is subjected to zombification
59
- #
60
- # @param [String]
61
55
  def include?(logical_name)
62
56
  !@zombified.include?(logical_name) && includes =~ logical_name
63
57
  end
64
58
 
65
- # Require file in zombie namespace
66
- #
67
- # @param [#to_s] logical_name
68
- #
69
- # @return [Bool]
70
- # true if successful and false if feature already loaded
71
59
  def require(logical_name)
72
60
  logical_name = logical_name.to_s
73
61
  loaded = original.call(logical_name)
@@ -77,14 +65,6 @@ module Mutant
77
65
  true
78
66
  end
79
67
 
80
- # Find file by logical path
81
- #
82
- # @param [String] logical_name
83
- #
84
- # @return [File]
85
- #
86
- # @raise [LoadError]
87
- # otherwise
88
68
  def find(logical_name)
89
69
  file_name = "#{logical_name}.rb"
90
70
 
@@ -96,13 +76,6 @@ module Mutant
96
76
  fail LoadError, "Cannot find file #{file_name.inspect} in load path"
97
77
  end
98
78
 
99
- # Zombify contents of file
100
- #
101
- # Probably the 2nd valid use of eval ever. (First one is inserting mutants!).
102
- #
103
- # @param [Pathname] source_path
104
- #
105
- # @return [undefined]
106
79
  def zombify(source_path)
107
80
  kernel.eval(
108
81
  Unparser.unparse(namespaced_node(source_path)),
@@ -111,11 +84,6 @@ module Mutant
111
84
  )
112
85
  end
113
86
 
114
- # Namespaced root node
115
- #
116
- # @param [Pathname] source_path
117
- #
118
- # @return [Parser::AST::Node]
119
87
  def namespaced_node(source_path)
120
88
  s(:module, s(:const, nil, namespace), Unparser.parse(source_path.read))
121
89
  end