mutant-rspec 0.8.8 → 0.8.11
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.
- checksums.yaml +4 -4
- data/lib/mutant/integration/rspec.rb +18 -31
- metadata +9 -11
- data/TODO +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b08fee6107177b9701d008b59646666911378b48
|
4
|
+
data.tar.gz: 1f08f363e3de560a667dcfa6ae378b8ac7a20278
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63b630e88b213b90046787a01ed8d4e02c012bf4f5ae3f62f1ed9ed1de66b5e8bca0dbc36fbd366a44cbbd395246ce408c6f2bc2af8c79ba5cd06da9fe080b70
|
7
|
+
data.tar.gz: 37950c27d632e17bb6ae40339fee7360e152c0c57e39a0b5ff2f849d5ed7e1589e7254af9e52085b483c3d12af2f8e5bf5d05cdbce82f2b0c16da3d1497348d9
|
@@ -9,7 +9,7 @@ module Mutant
|
|
9
9
|
# * Keeps its state global in RSpec.world and lots of other places
|
10
10
|
# * There is no API to "just run a subset of examples", the examples
|
11
11
|
# need to be selected in-place via mutating the `RSpec.filtered_examples`
|
12
|
-
#
|
12
|
+
# data structure
|
13
13
|
# * Does not maintain a unique identification for an example,
|
14
14
|
# aside the instances of `RSpec::Core::Example` objects itself.
|
15
15
|
# For that reason identifying examples by:
|
@@ -17,6 +17,8 @@ module Mutant
|
|
17
17
|
# * location
|
18
18
|
# Is NOT enough. It would not be unique. So we add an "example index"
|
19
19
|
# for unique reference.
|
20
|
+
#
|
21
|
+
# :reek:TooManyConstants
|
20
22
|
class Rspec < self
|
21
23
|
|
22
24
|
ALL_EXPRESSION = Expression::Namespace::Recursive.new(scope_name: nil)
|
@@ -24,16 +26,13 @@ module Mutant
|
|
24
26
|
LOCATION_DELIMITER = ':'.freeze
|
25
27
|
EXIT_SUCCESS = 0
|
26
28
|
CLI_OPTIONS = IceNine.deep_freeze(%w[spec --fail-fast])
|
29
|
+
TEST_ID_FORMAT = 'rspec:%<index>d:%<location>s/%<description>s'.freeze
|
27
30
|
|
28
31
|
private_constant(*constants(false))
|
29
32
|
|
30
|
-
register 'rspec'
|
31
|
-
|
32
33
|
# Initialize rspec integration
|
33
34
|
#
|
34
35
|
# @return [undefined]
|
35
|
-
#
|
36
|
-
# @api private
|
37
36
|
def initialize(*)
|
38
37
|
super
|
39
38
|
@output = StringIO.new
|
@@ -44,8 +43,6 @@ module Mutant
|
|
44
43
|
# Setup rspec integration
|
45
44
|
#
|
46
45
|
# @return [self]
|
47
|
-
#
|
48
|
-
# @api private
|
49
46
|
def setup
|
50
47
|
@runner.setup($stderr, @output)
|
51
48
|
self
|
@@ -59,8 +56,6 @@ module Mutant
|
|
59
56
|
# @return [Result::Test]
|
60
57
|
#
|
61
58
|
# rubocop:disable MethodLength
|
62
|
-
#
|
63
|
-
# @api private
|
64
59
|
def call(tests)
|
65
60
|
examples = tests.map(&all_tests_index.method(:fetch))
|
66
61
|
filter_examples(&examples.method(:include?))
|
@@ -68,18 +63,16 @@ module Mutant
|
|
68
63
|
passed = @runner.run_specs(@world.ordered_example_groups).equal?(EXIT_SUCCESS)
|
69
64
|
@output.rewind
|
70
65
|
Result::Test.new(
|
71
|
-
|
72
|
-
|
73
|
-
runtime:
|
74
|
-
|
66
|
+
output: @output.read,
|
67
|
+
passed: passed,
|
68
|
+
runtime: Time.now - start,
|
69
|
+
tests: tests
|
75
70
|
)
|
76
71
|
end
|
77
72
|
|
78
73
|
# Available tests
|
79
74
|
#
|
80
75
|
# @return [Enumerable<Test>]
|
81
|
-
#
|
82
|
-
# @api private
|
83
76
|
def all_tests
|
84
77
|
all_tests_index.keys
|
85
78
|
end
|
@@ -90,8 +83,6 @@ module Mutant
|
|
90
83
|
# Index of available tests
|
91
84
|
#
|
92
85
|
# @return [Hash<Test, RSpec::Core::Example]
|
93
|
-
#
|
94
|
-
# @api private
|
95
86
|
def all_tests_index
|
96
87
|
all_examples.each_with_index.each_with_object({}) do |(example, example_index), index|
|
97
88
|
index[parse_example(example, example_index)] = example
|
@@ -105,26 +96,26 @@ module Mutant
|
|
105
96
|
# @param [Fixnum] index
|
106
97
|
#
|
107
98
|
# @return [Test]
|
108
|
-
#
|
109
|
-
# @api private
|
110
99
|
def parse_example(example, index)
|
111
|
-
metadata
|
112
|
-
|
113
|
-
|
100
|
+
metadata = example.metadata
|
101
|
+
|
102
|
+
id = TEST_ID_FORMAT % {
|
103
|
+
index: index,
|
104
|
+
location: metadata.fetch(:location),
|
105
|
+
description: metadata.fetch(:full_description)
|
106
|
+
}
|
114
107
|
|
115
108
|
Test.new(
|
116
|
-
|
117
|
-
|
109
|
+
expression: parse_expression(metadata),
|
110
|
+
id: id
|
118
111
|
)
|
119
112
|
end
|
120
113
|
|
121
114
|
# Parse metadata into expression
|
122
115
|
#
|
123
|
-
# @param [RSpec::Core::Example::
|
116
|
+
# @param [RSpec::Core::Example::MetaData] metadata
|
124
117
|
#
|
125
118
|
# @return [Expression]
|
126
|
-
#
|
127
|
-
# @api private
|
128
119
|
def parse_expression(metadata)
|
129
120
|
if metadata.key?(:mutant_expression)
|
130
121
|
expression_parser.(metadata.fetch(:mutant_expression))
|
@@ -137,8 +128,6 @@ module Mutant
|
|
137
128
|
# Available rspec examples
|
138
129
|
#
|
139
130
|
# @return [Array<String, RSpec::Core::Example]
|
140
|
-
#
|
141
|
-
# @api private
|
142
131
|
def all_examples
|
143
132
|
@world.example_groups.flat_map(&:descendants).flat_map(&:examples).select do |example|
|
144
133
|
example.metadata.fetch(:mutant, true)
|
@@ -150,8 +139,6 @@ module Mutant
|
|
150
139
|
# @param [#call] predicate
|
151
140
|
#
|
152
141
|
# @return [undefined]
|
153
|
-
#
|
154
|
-
# @api private
|
155
142
|
def filter_examples(&predicate)
|
156
143
|
@world.filtered_examples.each_value do |examples|
|
157
144
|
examples.keep_if(&predicate)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutant-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mutant
|
@@ -16,34 +16,34 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.8.
|
19
|
+
version: 0.8.11
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.8.
|
26
|
+
version: 0.8.11
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec-core
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.
|
33
|
+
version: 3.4.0
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 3.
|
36
|
+
version: 3.6.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 3.
|
43
|
+
version: 3.4.0
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 3.
|
46
|
+
version: 3.6.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,11 +70,9 @@ email:
|
|
70
70
|
executables: []
|
71
71
|
extensions: []
|
72
72
|
extra_rdoc_files:
|
73
|
-
- TODO
|
74
73
|
- LICENSE
|
75
74
|
files:
|
76
75
|
- LICENSE
|
77
|
-
- TODO
|
78
76
|
- lib/mutant/integration/rspec.rb
|
79
77
|
homepage: https://github.com/mbj/mutant
|
80
78
|
licenses:
|
@@ -96,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
94
|
version: '0'
|
97
95
|
requirements: []
|
98
96
|
rubyforge_project:
|
99
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.5.1
|
100
98
|
signing_key:
|
101
99
|
specification_version: 4
|
102
100
|
summary: Rspec integration for mutant
|
data/TODO
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
Code:
|
2
|
-
* Test mutant with dynamically created zombie.
|
3
|
-
|
4
|
-
Mutations:
|
5
|
-
* Add true masgn mutations
|
6
|
-
* Add some kind of a "do not touch me object" that raises on all messages.
|
7
|
-
It can be used to make sure each literal value is touched.
|
8
|
-
* Replace nil or add "do not touch me object" to literal mutations.
|
9
|
-
* Mutate options on Regexp literals
|
10
|
-
* Add mutations for dynamic regexp symbol and string literals
|
11
|
-
* Add timeout to terminate infinite loops
|
12
|
-
|
13
|
-
Loader:
|
14
|
-
* Make sure loader does not change visibility of injected mutants
|
15
|
-
|
16
|
-
Matcher:
|
17
|
-
* Allow matches on attr_reader with literal name argument(s)?
|
18
|
-
* Allow matches on define_method with literal name argument?
|
19
|
-
|
20
|
-
jruby-support:
|
21
|
-
* Create a runtime per mutation to kill mutations in isolation
|