mutant 0.9.2 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +26 -0
- data/Gemfile +0 -8
- data/Gemfile.lock +55 -59
- data/LICENSE +1 -1
- data/README.md +9 -0
- data/config/rubocop.yml +10 -3
- data/docs/commercial-support.md +14 -0
- data/lib/mutant.rb +5 -4
- data/lib/mutant/cli.rb +5 -5
- data/lib/mutant/config.rb +1 -0
- data/lib/mutant/integration.rb +1 -1
- data/lib/mutant/license.rb +33 -6
- data/lib/mutant/license/subscription/opensource.rb +1 -1
- data/lib/mutant/meta.rb +1 -3
- data/lib/mutant/meta/example/verification.rb +1 -1
- data/lib/mutant/mutator/node/generic.rb +25 -2
- data/lib/mutant/mutator/node/send.rb +1 -1
- data/lib/mutant/parallel.rb +1 -1
- data/lib/mutant/reporter/cli/format.rb +1 -1
- data/lib/mutant/transform.rb +6 -5
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/warnings.rb +1 -1
- data/lib/mutant/zombifier.rb +2 -0
- data/mutant.gemspec +17 -16
- data/spec/integrations.yml +3 -1
- data/spec/support/corpus.rb +3 -3
- data/spec/support/ruby_vm.rb +1 -2
- data/spec/support/shared_context.rb +3 -3
- data/spec/support/xspec.rb +2 -2
- data/spec/unit/mutant/license_spec.rb +43 -7
- data/spec/unit/mutant/parallel/driver_spec.rb +4 -4
- data/spec/unit/mutant/parallel/worker_spec.rb +5 -5
- data/spec/unit/mutant/parallel_spec.rb +7 -7
- data/spec/unit/mutant/repository/diff/ranges_spec.rb +2 -2
- metadata +31 -24
- data/lib/mutant/base.rb +0 -192
- data/lib/mutant/variable.rb +0 -282
- data/spec/unit/mutant/either_spec.rb +0 -247
- data/spec/unit/mutant/maybe_spec.rb +0 -60
- data/spec/unit/mutant/variable_spec.rb +0 -618
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9191d87ebe0bde331ae432c838ec2718f41f89d099952598e98fe6d2ee3b9885
|
4
|
+
data.tar.gz: 713134773a289c22d6b43b678c44b483f383aeb2520fd0f95711c47489ad64f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00b83021df08f58b84688d6dad27792e0d5aab81288bf5f7afca9a43b2ebdf05fe09133c18dc19e8169727c20e4815caaafabfab9bbc9c7258100b9201ba967a
|
7
|
+
data.tar.gz: 79659afba997fc24650398f33bc0de60905845429b01a49d999c24e2004f97b0c0ac3bee987e1cbf73010c213906e79a0e8fb856b5de826049cfc169f8154f24
|
data/Changelog.md
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
# v0.9.7 2020-07-22
|
2
|
+
|
3
|
+
* Bump parser dependency to 2.7.1, note this still does not support Ruby 2.7 syntax.
|
4
|
+
But it supports running bundling with that parser version.
|
5
|
+
* Nail diff-lcs to 1.3 till output difference for 1.4 can be addressed.
|
6
|
+
|
7
|
+
# v0.9.6 2020-04-20
|
8
|
+
|
9
|
+
* Dependencies upgrade, should not change user facing semantics.
|
10
|
+
* Bump license nudge to 40s
|
11
|
+
|
12
|
+
# v0.9.5 2020-02-02
|
13
|
+
|
14
|
+
* Change to 2.7 parser series.
|
15
|
+
This does not drop support for < 2.7 but enables to in the future add full Ruby 2.7 support.
|
16
|
+
|
17
|
+
# v0.9.4 2020-01-03
|
18
|
+
|
19
|
+
* Bump unparser dependency
|
20
|
+
|
21
|
+
# v0.9.3 2020-01-03
|
22
|
+
|
23
|
+
* Change to soft dependency on mutant-license.
|
24
|
+
Rationale its fine to bundle mutant if not used.
|
25
|
+
This can easily happen on transitive dependencies.
|
26
|
+
|
1
27
|
# v0.9.2 2020-01-02
|
2
28
|
|
3
29
|
* Upgrade to parser ~> 2.6.5
|
data/Gemfile
CHANGED
@@ -6,14 +6,6 @@ gemspec name: 'mutant'
|
|
6
6
|
|
7
7
|
eval_gemfile File.expand_path('Gemfile.shared', __dir__)
|
8
8
|
|
9
|
-
gem 'unparser', git: 'https://github.com/mbj/unparser.git'
|
10
|
-
|
11
|
-
gem(
|
12
|
-
'devtools',
|
13
|
-
git: 'https://github.com/mbj/devtools.git',
|
14
|
-
ref: '26ba0a1053e6cf7b79fc72d513a73457f9a38ead'
|
15
|
-
)
|
16
|
-
|
17
9
|
# Mutant itself uses an opensource license key.
|
18
10
|
# Scoped to https://github.com/mbj/mutant it'll
|
19
11
|
# not be useful elsewhere.
|
data/Gemfile.lock
CHANGED
@@ -1,56 +1,21 @@
|
|
1
|
-
GIT
|
2
|
-
remote: https://github.com/mbj/devtools.git
|
3
|
-
revision: 26ba0a1053e6cf7b79fc72d513a73457f9a38ead
|
4
|
-
ref: 26ba0a1053e6cf7b79fc72d513a73457f9a38ead
|
5
|
-
specs:
|
6
|
-
devtools (0.1.23)
|
7
|
-
abstract_type (~> 0.0.7)
|
8
|
-
adamantium (~> 0.2.0)
|
9
|
-
anima (~> 0.3.0)
|
10
|
-
concord (~> 0.1.5)
|
11
|
-
flay (~> 2.12.0)
|
12
|
-
flog (~> 4.6.2)
|
13
|
-
procto (~> 0.0.3)
|
14
|
-
rake (~> 12.3.0)
|
15
|
-
reek (~> 5.3.0)
|
16
|
-
rspec (~> 3.8.0)
|
17
|
-
rspec-core (~> 3.8.0)
|
18
|
-
rspec-its (~> 1.2.0)
|
19
|
-
rubocop (~> 0.61.1)
|
20
|
-
simplecov (~> 0.16.1)
|
21
|
-
yard (~> 0.9.16)
|
22
|
-
yardstick (~> 0.9.9)
|
23
|
-
|
24
|
-
GIT
|
25
|
-
remote: https://github.com/mbj/unparser.git
|
26
|
-
revision: 157a5b3b43e9f1d540da74b1751dc2b6f7601c3b
|
27
|
-
specs:
|
28
|
-
unparser (0.4.6)
|
29
|
-
abstract_type (~> 0.0.7)
|
30
|
-
adamantium (~> 0.2.0)
|
31
|
-
concord (~> 0.1.5)
|
32
|
-
diff-lcs (~> 1.3)
|
33
|
-
equalizer (~> 0.0.9)
|
34
|
-
parser (~> 2.6.5)
|
35
|
-
procto (~> 0.0.2)
|
36
|
-
|
37
1
|
PATH
|
38
2
|
remote: .
|
39
3
|
specs:
|
40
|
-
mutant (0.9.
|
4
|
+
mutant (0.9.6)
|
41
5
|
abstract_type (~> 0.0.7)
|
42
6
|
adamantium (~> 0.2.0)
|
43
7
|
anima (~> 0.3.1)
|
44
8
|
ast (~> 2.2)
|
45
9
|
concord (~> 0.1.5)
|
46
|
-
diff-lcs (
|
10
|
+
diff-lcs (= 1.3)
|
47
11
|
equalizer (~> 0.0.9)
|
48
12
|
ice_nine (~> 0.11.1)
|
49
13
|
memoizable (~> 0.4.2)
|
50
|
-
|
51
|
-
parser (~> 2.
|
14
|
+
mprelude (~> 0.1.0)
|
15
|
+
parser (~> 2.7.1)
|
52
16
|
procto (~> 0.0.2)
|
53
|
-
unparser (~> 0.4.
|
17
|
+
unparser (~> 0.4.6)
|
18
|
+
variable (~> 0.0.1)
|
54
19
|
|
55
20
|
GEM
|
56
21
|
remote: https://rubygems.org/
|
@@ -64,7 +29,7 @@ GEM
|
|
64
29
|
abstract_type (~> 0.0.7)
|
65
30
|
adamantium (~> 0.2)
|
66
31
|
equalizer (~> 0.0.11)
|
67
|
-
ast (2.4.
|
32
|
+
ast (2.4.1)
|
68
33
|
axiom-types (0.1.1)
|
69
34
|
descendants_tracker (~> 0.0.4)
|
70
35
|
ice_nine (~> 0.11.0)
|
@@ -78,6 +43,23 @@ GEM
|
|
78
43
|
equalizer (~> 0.0.9)
|
79
44
|
descendants_tracker (0.0.4)
|
80
45
|
thread_safe (~> 0.3, >= 0.3.1)
|
46
|
+
devtools (0.1.26)
|
47
|
+
abstract_type (~> 0.0.7)
|
48
|
+
adamantium (~> 0.2.0)
|
49
|
+
anima (~> 0.3.0)
|
50
|
+
concord (~> 0.1.5)
|
51
|
+
flay (~> 2.12.0)
|
52
|
+
flog (~> 4.6.2)
|
53
|
+
procto (~> 0.0.3)
|
54
|
+
rake (~> 12.3.0)
|
55
|
+
reek (~> 5.6.0)
|
56
|
+
rspec (~> 3.8.0)
|
57
|
+
rspec-core (~> 3.8.0)
|
58
|
+
rspec-its (~> 1.2.0)
|
59
|
+
rubocop (~> 0.79.0)
|
60
|
+
simplecov (~> 0.16.1)
|
61
|
+
yard (~> 0.9.16)
|
62
|
+
yardstick (~> 0.9.9)
|
81
63
|
diff-lcs (1.3)
|
82
64
|
docile (1.3.2)
|
83
65
|
equalizer (0.0.11)
|
@@ -93,24 +75,30 @@ GEM
|
|
93
75
|
sexp_processor (~> 4.8)
|
94
76
|
ice_nine (0.11.2)
|
95
77
|
jaro_winkler (1.5.4)
|
96
|
-
json (2.3.
|
78
|
+
json (2.3.1)
|
97
79
|
kwalify (0.7.2)
|
98
80
|
memoizable (0.4.2)
|
99
81
|
thread_safe (~> 0.3, >= 0.3.1)
|
82
|
+
mprelude (0.1.0)
|
83
|
+
abstract_type (~> 0.0.7)
|
84
|
+
adamantium (~> 0.2.0)
|
85
|
+
concord (~> 0.1.5)
|
86
|
+
equalizer (~> 0.0.9)
|
87
|
+
ice_nine (~> 0.11.1)
|
88
|
+
procto (~> 0.0.2)
|
100
89
|
mutant-license (0.1.0)
|
101
|
-
parallel (1.19.
|
102
|
-
parser (2.
|
103
|
-
ast (~> 2.4.
|
90
|
+
parallel (1.19.2)
|
91
|
+
parser (2.7.1.4)
|
92
|
+
ast (~> 2.4.1)
|
104
93
|
path_expander (1.1.0)
|
105
|
-
powerpack (0.1.2)
|
106
94
|
procto (0.0.3)
|
107
95
|
psych (3.1.0)
|
108
96
|
rainbow (3.0.0)
|
109
97
|
rake (12.3.3)
|
110
|
-
reek (5.
|
98
|
+
reek (5.6.0)
|
111
99
|
codeclimate-engine-rb (~> 0.4.0)
|
112
100
|
kwalify (~> 0.7.0)
|
113
|
-
parser (>= 2.5.0.0, < 2.
|
101
|
+
parser (>= 2.5.0.0, < 2.8, != 2.5.1.1)
|
114
102
|
psych (~> 3.1.0)
|
115
103
|
rainbow (>= 2.0, < 4.0)
|
116
104
|
rspec (3.8.0)
|
@@ -129,31 +117,40 @@ GEM
|
|
129
117
|
diff-lcs (>= 1.2.0, < 2.0)
|
130
118
|
rspec-support (~> 3.8.0)
|
131
119
|
rspec-support (3.8.3)
|
132
|
-
rubocop (0.
|
120
|
+
rubocop (0.79.0)
|
133
121
|
jaro_winkler (~> 1.5.1)
|
134
122
|
parallel (~> 1.10)
|
135
|
-
parser (>= 2.
|
136
|
-
powerpack (~> 0.1)
|
123
|
+
parser (>= 2.7.0.1)
|
137
124
|
rainbow (>= 2.2.2, < 4.0)
|
138
125
|
ruby-progressbar (~> 1.7)
|
139
|
-
unicode-display_width (
|
126
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
140
127
|
ruby-progressbar (1.10.1)
|
141
|
-
ruby_parser (3.14.
|
128
|
+
ruby_parser (3.14.2)
|
142
129
|
sexp_processor (~> 4.9)
|
143
|
-
sexp_processor (4.
|
130
|
+
sexp_processor (4.15.0)
|
144
131
|
simplecov (0.16.1)
|
145
132
|
docile (~> 1.1)
|
146
133
|
json (>= 1.8, < 3)
|
147
134
|
simplecov-html (~> 0.10.0)
|
148
135
|
simplecov-html (0.10.2)
|
149
136
|
thread_safe (0.3.6)
|
150
|
-
unicode-display_width (1.
|
137
|
+
unicode-display_width (1.6.1)
|
138
|
+
unparser (0.4.7)
|
139
|
+
abstract_type (~> 0.0.7)
|
140
|
+
adamantium (~> 0.2.0)
|
141
|
+
concord (~> 0.1.5)
|
142
|
+
diff-lcs (~> 1.3)
|
143
|
+
equalizer (~> 0.0.9)
|
144
|
+
parser (>= 2.6.5)
|
145
|
+
procto (~> 0.0.2)
|
146
|
+
variable (0.0.1)
|
147
|
+
equalizer (~> 0.0.11)
|
151
148
|
virtus (1.0.5)
|
152
149
|
axiom-types (~> 0.1)
|
153
150
|
coercible (~> 1.0)
|
154
151
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
155
152
|
equalizer (~> 0.0, >= 0.0.9)
|
156
|
-
yard (0.9.
|
153
|
+
yard (0.9.25)
|
157
154
|
yardstick (0.9.9)
|
158
155
|
yard (~> 0.8, >= 0.8.7.2)
|
159
156
|
|
@@ -161,11 +158,10 @@ PLATFORMS
|
|
161
158
|
ruby
|
162
159
|
|
163
160
|
DEPENDENCIES
|
164
|
-
devtools
|
161
|
+
devtools (~> 0.1.25)
|
165
162
|
mutant!
|
166
163
|
mutant-license!
|
167
164
|
parallel (~> 1.3)
|
168
|
-
unparser!
|
169
165
|
|
170
166
|
BUNDLED WITH
|
171
167
|
1.17.3
|
data/LICENSE
CHANGED
@@ -116,7 +116,7 @@ the net income of Schirp DSO LTD).
|
|
116
116
|
|
117
117
|
6. Support, Maintenance and Services. Subject to the terms and conditions of
|
118
118
|
this Agreement, as set forth in your invoice, and as set forth on the Mutant
|
119
|
-
support page (https://github.com/mbj/mutant/
|
119
|
+
support page (https://github.com/mbj/mutant/blob/master/docs/commercial-support.md)
|
120
120
|
support and maintenance services may be included with the purchase of your
|
121
121
|
license subscription.
|
122
122
|
|
data/README.md
CHANGED
@@ -29,6 +29,15 @@ On each detection of uncovered semantics you have the opportunity to:
|
|
29
29
|
to test only the code you had been touching. See the [incremental](#only-mutating-changed-code)
|
30
30
|
mutation testing documentation.
|
31
31
|
|
32
|
+
## Ruby Versions
|
33
|
+
|
34
|
+
Mutant currently only works on cRuby/MRI. Starting with version 2.5.x. It supports all syntax features upto and
|
35
|
+
including Ruby 2.6.
|
36
|
+
|
37
|
+
Support for 2.7 syntax features is pending, see unparser issue: https://github.com/mbj/unparser/issues/129.
|
38
|
+
|
39
|
+
Mutant will work under Ruby 2.7 just fine, unless a 2.7 syntax feature is used. This will be resolved shortly.
|
40
|
+
|
32
41
|
## Licensing
|
33
42
|
|
34
43
|
Mutant was recently transitioned commercial software, with a free usage plan for opensource projects.
|
data/config/rubocop.yml
CHANGED
@@ -99,7 +99,7 @@ ClassCheck:
|
|
99
99
|
EnforcedStyle: kind_of?
|
100
100
|
|
101
101
|
# Do not prefer double quotes to be used when %q or %Q is more appropriate
|
102
|
-
|
102
|
+
Style/RedundantPercentQ:
|
103
103
|
Enabled: false
|
104
104
|
|
105
105
|
# Allow a maximum ABC score
|
@@ -145,7 +145,7 @@ Alias:
|
|
145
145
|
EnforcedStyle: prefer_alias_method
|
146
146
|
|
147
147
|
# Do not waste my horizontal or vertical space
|
148
|
-
|
148
|
+
Layout/FirstArrayElementIndentation:
|
149
149
|
Enabled: false
|
150
150
|
|
151
151
|
# Prefer
|
@@ -167,7 +167,7 @@ MultilineMethodCallIndentation:
|
|
167
167
|
Send:
|
168
168
|
Enabled: true
|
169
169
|
|
170
|
-
Layout/
|
170
|
+
Layout/HashAlignment:
|
171
171
|
EnforcedColonStyle: table
|
172
172
|
EnforcedHashRocketStyle: table
|
173
173
|
Layout/EmptyLineAfterGuardClause:
|
@@ -196,3 +196,10 @@ Style/RescueStandardError:
|
|
196
196
|
Enabled: false
|
197
197
|
Style/StderrPuts:
|
198
198
|
Enabled: false
|
199
|
+
# suggesting single letter variablesl bah
|
200
|
+
Naming/RescuedExceptionsVariableName:
|
201
|
+
Enabled: false
|
202
|
+
# false positive on private keywords
|
203
|
+
Layout/IndentationWidth:
|
204
|
+
Enabled: false
|
205
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Commercial Support
|
2
|
+
|
3
|
+
Mutant offers only community support.
|
4
|
+
|
5
|
+
Commercial license customers are entited to priority support via email.
|
6
|
+
|
7
|
+
## Priority Support
|
8
|
+
|
9
|
+
Covers 1 incident per quarter, with a max response time of 7 days.
|
10
|
+
Scope is limited to mutant not the application or infrastructure.
|
11
|
+
|
12
|
+
For support email [Markus Schirp](mailto:mbj@schirp-dso.com?subject=Mutant%20Support).
|
13
|
+
Please email using the same domain as the roiginal license email or explain
|
14
|
+
your connection to the license.
|
data/lib/mutant.rb
CHANGED
@@ -10,6 +10,7 @@ require 'digest/sha1'
|
|
10
10
|
require 'equalizer'
|
11
11
|
require 'etc'
|
12
12
|
require 'ice_nine'
|
13
|
+
require 'mprelude'
|
13
14
|
require 'json'
|
14
15
|
require 'open3'
|
15
16
|
require 'optparse'
|
@@ -20,10 +21,9 @@ require 'set'
|
|
20
21
|
require 'singleton'
|
21
22
|
require 'stringio'
|
22
23
|
require 'unparser'
|
24
|
+
require 'variable'
|
23
25
|
require 'yaml'
|
24
26
|
|
25
|
-
gem 'mutant-license'
|
26
|
-
|
27
27
|
# This setting is done to make errors within the parallel
|
28
28
|
# reporter / execution visible in the main thread.
|
29
29
|
Thread.abort_on_exception = true
|
@@ -32,13 +32,14 @@ Thread.abort_on_exception = true
|
|
32
32
|
#
|
33
33
|
# @api private
|
34
34
|
module Mutant
|
35
|
+
Either = MPrelude::Either
|
36
|
+
|
35
37
|
EMPTY_STRING = ''
|
36
38
|
EMPTY_ARRAY = [].freeze
|
37
39
|
EMPTY_HASH = {}.freeze
|
38
40
|
SCOPE_OPERATOR = '::'
|
39
41
|
end # Mutant
|
40
42
|
|
41
|
-
require 'mutant/base'
|
42
43
|
require 'mutant/bootstrap'
|
43
44
|
require 'mutant/version'
|
44
45
|
require 'mutant/env'
|
@@ -185,7 +186,6 @@ require 'mutant/reporter/cli/format'
|
|
185
186
|
require 'mutant/repository'
|
186
187
|
require 'mutant/repository/diff'
|
187
188
|
require 'mutant/repository/diff/ranges'
|
188
|
-
require 'mutant/variable'
|
189
189
|
require 'mutant/warnings'
|
190
190
|
require 'mutant/zombifier'
|
191
191
|
require 'mutant/range'
|
@@ -198,6 +198,7 @@ module Mutant
|
|
198
198
|
WORLD = World.new(
|
199
199
|
condition_variable: ConditionVariable,
|
200
200
|
gem: Gem,
|
201
|
+
gem_method: method(:gem),
|
201
202
|
io: IO,
|
202
203
|
json: JSON,
|
203
204
|
kernel: Kernel,
|
data/lib/mutant/cli.rb
CHANGED
@@ -36,10 +36,10 @@ module Mutant
|
|
36
36
|
def self.run(world, default_config, arguments)
|
37
37
|
License
|
38
38
|
.apply(world)
|
39
|
-
.
|
40
|
-
.
|
41
|
-
.
|
42
|
-
.
|
39
|
+
.bind { Config.load_config_file(world, default_config) }
|
40
|
+
.bind { |file_config| apply(world, file_config, arguments) }
|
41
|
+
.bind { |cli_config| Bootstrap.apply(world, cli_config) }
|
42
|
+
.bind(&Runner.method(:apply))
|
43
43
|
.from_right { |error| world.stderr.puts(error); return false }
|
44
44
|
.success?
|
45
45
|
end
|
@@ -105,7 +105,7 @@ module Mutant
|
|
105
105
|
#
|
106
106
|
# @return [undefined]
|
107
107
|
#
|
108
|
-
# rubocop:disable MethodLength
|
108
|
+
# rubocop:disable Metrics/MethodLength
|
109
109
|
def add_environment_options(opts)
|
110
110
|
opts.separator('Environment:')
|
111
111
|
opts.on('--zombie', 'Run mutant zombified') do
|
data/lib/mutant/config.rb
CHANGED
data/lib/mutant/integration.rb
CHANGED
data/lib/mutant/license.rb
CHANGED
@@ -2,31 +2,58 @@
|
|
2
2
|
|
3
3
|
module Mutant
|
4
4
|
module License
|
5
|
+
NAME = 'mutant-license'
|
6
|
+
VERSION = '~> 0.1.0'
|
7
|
+
SLEEP = 40
|
8
|
+
|
9
|
+
UNLICENSED =
|
10
|
+
IceNine.deep_freeze(
|
11
|
+
[
|
12
|
+
"Soft fail, continuing in #{SLEEP} seconds",
|
13
|
+
'Next major version will enforce the license',
|
14
|
+
'See https://github.com/mbj/mutant#licensing'
|
15
|
+
]
|
16
|
+
)
|
17
|
+
|
5
18
|
def self.apply(world)
|
6
19
|
soft_fail(world, license_result(world))
|
7
20
|
end
|
8
21
|
|
9
22
|
def self.license_result(world)
|
10
|
-
|
23
|
+
load_mutant_license(world)
|
24
|
+
.fmap { license_path(world) }
|
25
|
+
.fmap { |path| Subscription.from_json(world.json.load(path)) }
|
26
|
+
.bind { |sub| sub.apply(world) }
|
11
27
|
end
|
12
28
|
private_class_method :license_result
|
13
29
|
|
14
|
-
|
15
|
-
|
30
|
+
# ignore :reek:NestedIterators
|
31
|
+
def self.soft_fail(world, result)
|
32
|
+
result.lmap do |message|
|
16
33
|
stderr = world.stderr
|
17
34
|
stderr.puts(message)
|
18
|
-
stderr.puts(
|
19
|
-
world.kernel.sleep(
|
35
|
+
UNLICENSED.each { |line| stderr.puts(unlicensed(line)) }
|
36
|
+
world.kernel.sleep(SLEEP)
|
20
37
|
end
|
21
38
|
|
22
39
|
Either::Right.new(true)
|
23
40
|
end
|
24
41
|
private_class_method :soft_fail
|
25
42
|
|
43
|
+
def self.load_mutant_license(world)
|
44
|
+
Either
|
45
|
+
.wrap_error(LoadError) { world.gem_method.call(NAME, VERSION) }
|
46
|
+
.lmap(&method(:unlicensed))
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.unlicensed(message)
|
50
|
+
"[Mutant-License-Error]: #{message}"
|
51
|
+
end
|
52
|
+
|
26
53
|
def self.license_path(world)
|
27
54
|
world
|
28
55
|
.pathname
|
29
|
-
.new(world.gem.loaded_specs.fetch(
|
56
|
+
.new(world.gem.loaded_specs.fetch(NAME).full_gem_path)
|
30
57
|
.join('license.json')
|
31
58
|
end
|
32
59
|
private_class_method :license_path
|