mutant 0.10.24 → 0.10.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mutant.rb +2 -1
- data/lib/mutant/loader.rb +1 -1
- data/lib/mutant/matcher/config.rb +3 -1
- data/lib/mutant/matcher/method/metaclass.rb +1 -1
- data/lib/mutant/mutator/node/dynamic_literal.rb +1 -1
- data/lib/mutant/mutator/node/regexp.rb +0 -11
- data/lib/mutant/mutator/node/regexp/beginning_of_line_anchor.rb +20 -0
- data/lib/mutant/mutator/node/regexp/zero_or_more.rb +34 -0
- data/lib/mutant/mutator/node/sclass.rb +1 -1
- data/lib/mutant/mutator/node/send.rb +11 -0
- data/lib/mutant/reporter/cli/printer/env.rb +1 -1
- data/lib/mutant/transform.rb +25 -0
- data/lib/mutant/version.rb +1 -1
- metadata +5 -4
- data/lib/mutant/mutator/node/regexp/greedy_zero_or_more.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f02dec057593b8e61c2b207918ed6f1b9c4aa1d41bc0b2f2390c2a1da9172b5d
|
4
|
+
data.tar.gz: 99a318ed1f02d9976037694b2dbc1de463863f747cc4b8b5e95809b307680f03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5312bd87fc41b3442b886b40b200357c254c2d7d65081cdfaca2e2e213311539eb23b00eb5b792c9f7978c8eeed5a6cbd72b3a513598b9abc9f72a3beaa9989d
|
7
|
+
data.tar.gz: 922e0ea1878e05f014a3c832d7bfa23e0d8410cc8c8d5b9bd1bc8b81124a18ecd11403be643cd144772863950076b17ab06ce3cd809cda01a9563ec815c95e79
|
data/lib/mutant.rb
CHANGED
@@ -88,11 +88,12 @@ require 'mutant/mutator/node'
|
|
88
88
|
require 'mutant/mutator/node/generic'
|
89
89
|
require 'mutant/mutator/node/regexp'
|
90
90
|
require 'mutant/mutator/node/regexp/alternation_meta'
|
91
|
+
require 'mutant/mutator/node/regexp/beginning_of_line_anchor'
|
91
92
|
require 'mutant/mutator/node/regexp/capture_group'
|
92
93
|
require 'mutant/mutator/node/regexp/character_type'
|
93
94
|
require 'mutant/mutator/node/regexp/end_of_line_anchor'
|
94
95
|
require 'mutant/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor'
|
95
|
-
require 'mutant/mutator/node/regexp/
|
96
|
+
require 'mutant/mutator/node/regexp/zero_or_more'
|
96
97
|
require 'mutant/mutator/node/literal'
|
97
98
|
require 'mutant/mutator/node/literal/boolean'
|
98
99
|
require 'mutant/mutator/node/literal/range'
|
data/lib/mutant/loader.rb
CHANGED
@@ -26,7 +26,9 @@ module Mutant
|
|
26
26
|
|
27
27
|
DEFAULT = new(Hash[anima.attribute_names.map { |name| [name, []] }])
|
28
28
|
|
29
|
-
expression =
|
29
|
+
expression = Transform::Block.capture(:expression) do |input|
|
30
|
+
Mutant::Config::DEFAULT.expression_parser.call(input)
|
31
|
+
end
|
30
32
|
|
31
33
|
expression_array = Transform::Array.new(expression)
|
32
34
|
|
@@ -14,17 +14,6 @@ module Mutant
|
|
14
14
|
children.each_index(&method(:mutate_child))
|
15
15
|
end
|
16
16
|
end # RootExpression
|
17
|
-
|
18
|
-
# Mutator for beginning of line anchor `^`
|
19
|
-
class BeginningOfLineAnchor < Node
|
20
|
-
handle(:regexp_bol_anchor)
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def dispatch
|
25
|
-
emit(s(:regexp_bos_anchor))
|
26
|
-
end
|
27
|
-
end # BeginningOfLineAnchor
|
28
17
|
end # Regexp
|
29
18
|
end # Node
|
30
19
|
end # Mutator
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Mutator
|
5
|
+
class Node
|
6
|
+
module Regexp
|
7
|
+
# Mutator for beginning of line anchor `^`
|
8
|
+
class BeginningOfLineAnchor < Node
|
9
|
+
handle(:regexp_bol_anchor)
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def dispatch
|
14
|
+
emit(s(:regexp_bos_anchor))
|
15
|
+
end
|
16
|
+
end # BeginningOfLineAnchor
|
17
|
+
end # Regexp
|
18
|
+
end # Node
|
19
|
+
end # Mutator
|
20
|
+
end # Mutant
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Mutator
|
5
|
+
class Node
|
6
|
+
module Regexp
|
7
|
+
# Mutator for zero-or-more quantifier, `*`
|
8
|
+
class ZeroOrMore < Node
|
9
|
+
MAP = IceNine.deep_freeze(
|
10
|
+
regexp_greedy_zero_or_more: :regexp_greedy_one_or_more,
|
11
|
+
regexp_reluctant_zero_or_more: :regexp_reluctant_one_or_more,
|
12
|
+
regexp_possessive_zero_or_more: :regexp_possessive_one_or_more
|
13
|
+
)
|
14
|
+
|
15
|
+
handle(*MAP.keys)
|
16
|
+
|
17
|
+
children :min, :max, :subject
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Replace:
|
22
|
+
# * `/a*/` with `/a+/`
|
23
|
+
# * `/a*?/` with `/a+?/`
|
24
|
+
# * `/a*+/` with `/a++/`
|
25
|
+
def dispatch
|
26
|
+
emit(s(MAP.fetch(node.type), *children))
|
27
|
+
emit_subject_mutations
|
28
|
+
emit(subject)
|
29
|
+
end
|
30
|
+
end # ZeroOrMore
|
31
|
+
end # Regexp
|
32
|
+
end # Node
|
33
|
+
end # Mutator
|
34
|
+
end # Mutant
|
@@ -17,6 +17,8 @@ module Mutant
|
|
17
17
|
:< => %i[== eql? equal?],
|
18
18
|
:<= => %i[< == eql? equal?],
|
19
19
|
:== => %i[eql? equal?],
|
20
|
+
:=== => %i[is_a?],
|
21
|
+
:=~ => %i[match?],
|
20
22
|
:> => %i[== eql? equal?],
|
21
23
|
:>= => %i[> == eql? equal?],
|
22
24
|
__send__: %i[public_send],
|
@@ -31,6 +33,7 @@ module Mutant
|
|
31
33
|
kind_of?: %i[instance_of?],
|
32
34
|
map: %i[each],
|
33
35
|
method: %i[public_method],
|
36
|
+
match: %i[match?],
|
34
37
|
reverse_each: %i[each],
|
35
38
|
reverse_map: %i[map each],
|
36
39
|
reverse_merge: %i[merge],
|
@@ -81,6 +84,7 @@ module Mutant
|
|
81
84
|
end
|
82
85
|
|
83
86
|
def emit_selector_specific_mutations
|
87
|
+
emit_predicate_mutations
|
84
88
|
emit_array_mutation
|
85
89
|
emit_static_send
|
86
90
|
emit_const_get_mutation
|
@@ -90,6 +94,13 @@ module Mutant
|
|
90
94
|
emit_lambda_mutation
|
91
95
|
end
|
92
96
|
|
97
|
+
def emit_predicate_mutations
|
98
|
+
return unless selector.match?(/\?\z/) && !selector.equal?(:defined?)
|
99
|
+
|
100
|
+
emit(s(:true))
|
101
|
+
emit(s(:false))
|
102
|
+
end
|
103
|
+
|
93
104
|
def emit_array_mutation
|
94
105
|
return unless selector.equal?(:Array) && possible_kernel_method?
|
95
106
|
|
data/lib/mutant/transform.rb
CHANGED
@@ -73,6 +73,31 @@ module Mutant
|
|
73
73
|
end
|
74
74
|
end # Named
|
75
75
|
|
76
|
+
class Block < self
|
77
|
+
include Anima.new(:block, :name)
|
78
|
+
|
79
|
+
def self.capture(name, &block)
|
80
|
+
new(block: block, name: name)
|
81
|
+
end
|
82
|
+
|
83
|
+
def call(input)
|
84
|
+
block
|
85
|
+
.call(input)
|
86
|
+
.lmap do |message|
|
87
|
+
Error.new(
|
88
|
+
cause: nil,
|
89
|
+
input: input,
|
90
|
+
message: message,
|
91
|
+
transform: self
|
92
|
+
)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def slug
|
97
|
+
name
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
76
101
|
private
|
77
102
|
|
78
103
|
def error(cause: nil, input:, message: nil)
|
data/lib/mutant/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.25
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: abstract_type
|
@@ -423,11 +423,12 @@ files:
|
|
423
423
|
- lib/mutant/mutator/node/procarg_zero.rb
|
424
424
|
- lib/mutant/mutator/node/regexp.rb
|
425
425
|
- lib/mutant/mutator/node/regexp/alternation_meta.rb
|
426
|
+
- lib/mutant/mutator/node/regexp/beginning_of_line_anchor.rb
|
426
427
|
- lib/mutant/mutator/node/regexp/capture_group.rb
|
427
428
|
- lib/mutant/mutator/node/regexp/character_type.rb
|
428
429
|
- lib/mutant/mutator/node/regexp/end_of_line_anchor.rb
|
429
430
|
- lib/mutant/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb
|
430
|
-
- lib/mutant/mutator/node/regexp/
|
431
|
+
- lib/mutant/mutator/node/regexp/zero_or_more.rb
|
431
432
|
- lib/mutant/mutator/node/regopt.rb
|
432
433
|
- lib/mutant/mutator/node/resbody.rb
|
433
434
|
- lib/mutant/mutator/node/rescue.rb
|
@@ -510,7 +511,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
510
511
|
- !ruby/object:Gem::Version
|
511
512
|
version: '0'
|
512
513
|
requirements: []
|
513
|
-
rubygems_version: 3.
|
514
|
+
rubygems_version: 3.1.4
|
514
515
|
signing_key:
|
515
516
|
specification_version: 4
|
516
517
|
summary: ''
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mutant
|
4
|
-
class Mutator
|
5
|
-
class Node
|
6
|
-
module Regexp
|
7
|
-
# Mutator for greedy zero-or-more quantifier, `*`
|
8
|
-
class GreedyZeroOrMore < Node
|
9
|
-
handle(:regexp_greedy_zero_or_more)
|
10
|
-
|
11
|
-
children :min, :max, :subject
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def dispatch
|
16
|
-
emit(s(:regexp_greedy_one_or_more, *children))
|
17
|
-
emit_subject_mutations
|
18
|
-
emit(subject)
|
19
|
-
end
|
20
|
-
end # GreedyZeroOrMore
|
21
|
-
end # Regexp
|
22
|
-
end # Node
|
23
|
-
end # Mutator
|
24
|
-
end # Mutant
|