mutant 0.11.16 → 0.11.18

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mutant +55 -46
  3. data/lib/mutant/bootstrap.rb +66 -35
  4. data/lib/mutant/cli/command/environment/run.rb +1 -1
  5. data/lib/mutant/cli/command/environment.rb +2 -2
  6. data/lib/mutant/cli/command.rb +24 -11
  7. data/lib/mutant/env.rb +9 -0
  8. data/lib/mutant/mutator/node/literal/regex.rb +8 -8
  9. data/lib/mutant/mutator/node/send.rb +27 -17
  10. data/lib/mutant/mutator/regexp.rb +211 -0
  11. data/lib/mutant/parallel/driver.rb +1 -0
  12. data/lib/mutant/parallel/worker.rb +5 -1
  13. data/lib/mutant/runner.rb +8 -6
  14. data/lib/mutant/segment/recorder.rb +124 -0
  15. data/lib/mutant/segment.rb +25 -0
  16. data/lib/mutant/version.rb +1 -1
  17. data/lib/mutant/world.rb +5 -0
  18. data/lib/mutant.rb +288 -228
  19. metadata +12 -33
  20. data/lib/mutant/ast/regexp/transformer/direct.rb +0 -145
  21. data/lib/mutant/ast/regexp/transformer/named_group.rb +0 -50
  22. data/lib/mutant/ast/regexp/transformer/options_group.rb +0 -68
  23. data/lib/mutant/ast/regexp/transformer/quantifier.rb +0 -92
  24. data/lib/mutant/ast/regexp/transformer/recursive.rb +0 -56
  25. data/lib/mutant/ast/regexp/transformer/root.rb +0 -28
  26. data/lib/mutant/ast/regexp/transformer/text.rb +0 -58
  27. data/lib/mutant/ast/regexp/transformer.rb +0 -152
  28. data/lib/mutant/ast/regexp.rb +0 -54
  29. data/lib/mutant/mutator/node/regexp/alternation_meta.rb +0 -20
  30. data/lib/mutant/mutator/node/regexp/beginning_of_line_anchor.rb +0 -20
  31. data/lib/mutant/mutator/node/regexp/capture_group.rb +0 -23
  32. data/lib/mutant/mutator/node/regexp/character_type.rb +0 -31
  33. data/lib/mutant/mutator/node/regexp/end_of_line_anchor.rb +0 -20
  34. data/lib/mutant/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +0 -20
  35. data/lib/mutant/mutator/node/regexp/named_group.rb +0 -39
  36. data/lib/mutant/mutator/node/regexp/zero_or_more.rb +0 -34
  37. data/lib/mutant/mutator/node/regexp.rb +0 -20
data/lib/mutant.rb CHANGED
@@ -1,32 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'diff/lcs'
4
- require 'diff/lcs/hunk'
5
- require 'digest/sha1'
6
- require 'etc'
7
- require 'irb'
8
- require 'json'
9
- require 'open3'
10
- require 'optparse'
11
- require 'parser'
12
- require 'parser/current'
13
- require 'pathname'
14
- require 'regexp_parser'
15
- require 'set'
16
- require 'singleton'
17
- require 'sorbet-runtime'
18
- require 'stringio'
19
- require 'unparser'
20
- require 'yaml'
21
-
22
- # This setting is done to make errors within the parallel
23
- # reporter / execution visible in the main thread.
24
- Thread.abort_on_exception = true
25
-
26
3
  # Library namespace
27
4
  #
28
5
  # @api private
6
+ # rubocop:disable Metrics/ModuleLength
29
7
  module Mutant
8
+ # Boot timing infrastructure
9
+ get_timestamp = lambda do
10
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
11
+ end
12
+
13
+ library_timestamp = get_timestamp.call
14
+ boot_events = []
15
+
16
+ record = lambda do |name, &block|
17
+ start = get_timestamp.call
18
+
19
+ block.call.tap do
20
+ boot_events << [name, start, get_timestamp.call]
21
+ end
22
+ end
23
+
24
+ record.call(:require_dependencies) do
25
+ %w[
26
+ diff/lcs
27
+ diff/lcs/hunk
28
+ digest/sha1
29
+ etc
30
+ irb
31
+ json
32
+ open3
33
+ optparse
34
+ parser
35
+ parser/current
36
+ pathname
37
+ regexp_parser
38
+ securerandom
39
+ set
40
+ singleton
41
+ sorbet-runtime
42
+ stringio
43
+ unparser
44
+ yaml
45
+ ].each { |name| require(name) }
46
+ end
47
+
48
+ # This setting is done to make errors within the parallel
49
+ # reporter / execution visible in the main thread.
50
+ Thread.abort_on_exception = true
51
+
30
52
  AbstractType = Unparser::AbstractType
31
53
  Adamantium = Unparser::Adamantium
32
54
  Anima = Unparser::Anima
@@ -43,211 +65,247 @@ module Mutant
43
65
 
44
66
  ENV_VARIABLE_KEY_VALUE_REGEXP = /\A(?<key>#{env_key}+)=(?<value>.*)\z/.freeze
45
67
  ENV_VARIABLE_KEY_REGEXP = /\A#{env_key}\z/.freeze
46
- end # Mutant
47
68
 
48
- require 'mutant/procto'
49
- require 'mutant/transform'
50
- require 'mutant/variable'
51
- require 'mutant/bootstrap'
52
- require 'mutant/version'
53
- require 'mutant/env'
54
- require 'mutant/pipe'
55
- require 'mutant/util'
56
- require 'mutant/registry'
57
- require 'mutant/ast'
58
- require 'mutant/ast/sexp'
59
- require 'mutant/ast/types'
60
- require 'mutant/ast/nodes'
61
- require 'mutant/ast/named_children'
62
- require 'mutant/ast/node_predicates'
63
- require 'mutant/ast/find_metaclass_containing'
64
- require 'mutant/ast/regexp'
65
- require 'mutant/ast/regexp/transformer'
66
- require 'mutant/ast/regexp/transformer/direct'
67
- require 'mutant/ast/regexp/transformer/named_group'
68
- require 'mutant/ast/regexp/transformer/options_group'
69
- require 'mutant/ast/regexp/transformer/quantifier'
70
- require 'mutant/ast/regexp/transformer/recursive'
71
- require 'mutant/ast/regexp/transformer/root'
72
- require 'mutant/ast/regexp/transformer/text'
73
- require 'mutant/ast/meta'
74
- require 'mutant/ast/meta/send'
75
- require 'mutant/ast/meta/const'
76
- require 'mutant/ast/meta/symbol'
77
- require 'mutant/ast/meta/optarg'
78
- require 'mutant/ast/meta/resbody'
79
- require 'mutant/ast/pattern'
80
- require 'mutant/ast/pattern/lexer'
81
- require 'mutant/ast/pattern/parser'
82
- require 'mutant/ast/pattern/source'
83
- require 'mutant/ast/pattern/token'
84
- require 'mutant/ast/structure'
85
- require 'mutant/parser'
86
- require 'mutant/isolation'
87
- require 'mutant/isolation/exception'
88
- require 'mutant/isolation/fork'
89
- require 'mutant/isolation/none'
90
- require 'mutant/parallel'
91
- require 'mutant/parallel/driver'
92
- require 'mutant/parallel/source'
93
- require 'mutant/parallel/worker'
94
- require 'mutant/require_highjack'
95
- require 'mutant/mutation'
96
- require 'mutant/mutation/config'
97
- require 'mutant/mutator'
98
- require 'mutant/mutator/util'
99
- require 'mutant/mutator/util/array'
100
- require 'mutant/mutator/util/symbol'
101
- require 'mutant/mutator/node'
102
- require 'mutant/mutator/node/generic'
103
- require 'mutant/mutator/node/regexp'
104
- require 'mutant/mutator/node/regexp/alternation_meta'
105
- require 'mutant/mutator/node/regexp/beginning_of_line_anchor'
106
- require 'mutant/mutator/node/regexp/capture_group'
107
- require 'mutant/mutator/node/regexp/named_group'
108
- require 'mutant/mutator/node/regexp/character_type'
109
- require 'mutant/mutator/node/regexp/end_of_line_anchor'
110
- require 'mutant/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor'
111
- require 'mutant/mutator/node/regexp/zero_or_more'
112
- require 'mutant/mutator/node/literal'
113
- require 'mutant/mutator/node/literal/boolean'
114
- require 'mutant/mutator/node/literal/range'
115
- require 'mutant/mutator/node/literal/symbol'
116
- require 'mutant/mutator/node/literal/string'
117
- require 'mutant/mutator/node/literal/integer'
118
- require 'mutant/mutator/node/literal/float'
119
- require 'mutant/mutator/node/literal/array'
120
- require 'mutant/mutator/node/literal/hash'
121
- require 'mutant/mutator/node/literal/regex'
122
- require 'mutant/mutator/node/literal/nil'
123
- require 'mutant/mutator/node/argument'
124
- require 'mutant/mutator/node/arguments'
125
- require 'mutant/mutator/node/begin'
126
- require 'mutant/mutator/node/binary'
127
- require 'mutant/mutator/node/const'
128
- require 'mutant/mutator/node/dynamic_literal'
129
- require 'mutant/mutator/node/kwbegin'
130
- require 'mutant/mutator/node/named_value/access'
131
- require 'mutant/mutator/node/named_value/constant_assignment'
132
- require 'mutant/mutator/node/named_value/variable_assignment'
133
- require 'mutant/mutator/node/next'
134
- require 'mutant/mutator/node/break'
135
- require 'mutant/mutator/node/noop'
136
- require 'mutant/mutator/node/or_asgn'
137
- require 'mutant/mutator/node/and_asgn'
138
- require 'mutant/mutator/node/defined'
139
- require 'mutant/mutator/node/op_asgn'
140
- require 'mutant/mutator/node/conditional_loop'
141
- require 'mutant/mutator/node/yield'
142
- require 'mutant/mutator/node/super'
143
- require 'mutant/mutator/node/zsuper'
144
- require 'mutant/mutator/node/send'
145
- require 'mutant/mutator/node/send/binary'
146
- require 'mutant/mutator/node/send/conditional'
147
- require 'mutant/mutator/node/send/attribute_assignment'
148
- require 'mutant/mutator/node/when'
149
- require 'mutant/mutator/node/class'
150
- require 'mutant/mutator/node/sclass'
151
- require 'mutant/mutator/node/define'
152
- require 'mutant/mutator/node/mlhs'
153
- require 'mutant/mutator/node/nthref'
154
- require 'mutant/mutator/node/masgn'
155
- require 'mutant/mutator/node/module'
156
- require 'mutant/mutator/node/return'
157
- require 'mutant/mutator/node/block'
158
- require 'mutant/mutator/node/block_pass'
159
- require 'mutant/mutator/node/if'
160
- require 'mutant/mutator/node/case'
161
- require 'mutant/mutator/node/splat'
162
- require 'mutant/mutator/node/regopt'
163
- require 'mutant/mutator/node/resbody'
164
- require 'mutant/mutator/node/rescue'
165
- require 'mutant/mutator/node/match_current_line'
166
- require 'mutant/mutator/node/index'
167
- require 'mutant/mutator/node/procarg_zero'
168
- require 'mutant/mutator/node/kwargs'
169
- require 'mutant/mutator/node/numblock'
170
- require 'mutant/loader'
171
- require 'mutant/context'
172
- require 'mutant/scope'
173
- require 'mutant/subject'
174
- require 'mutant/subject/config'
175
- require 'mutant/subject/method'
176
- require 'mutant/subject/method/instance'
177
- require 'mutant/subject/method/singleton'
178
- require 'mutant/subject/method/metaclass'
179
- require 'mutant/matcher'
180
- require 'mutant/matcher/chain'
181
- require 'mutant/matcher/config'
182
- require 'mutant/matcher/descendants'
183
- require 'mutant/matcher/filter'
184
- require 'mutant/matcher/method'
185
- require 'mutant/matcher/method/instance'
186
- require 'mutant/matcher/method/metaclass'
187
- require 'mutant/matcher/method/singleton'
188
- require 'mutant/matcher/methods'
189
- require 'mutant/matcher/namespace'
190
- require 'mutant/matcher/null'
191
- require 'mutant/matcher/scope'
192
- require 'mutant/matcher/static'
193
- require 'mutant/expression'
194
- require 'mutant/expression/descendants'
195
- require 'mutant/expression/method'
196
- require 'mutant/expression/methods'
197
- require 'mutant/expression/namespace'
198
- require 'mutant/expression/parser'
199
- require 'mutant/test'
200
- require 'mutant/timer'
201
- require 'mutant/integration'
202
- require 'mutant/integration/null'
203
- require 'mutant/selector'
204
- require 'mutant/selector/expression'
205
- require 'mutant/selector/null'
206
- require 'mutant/world'
207
- require 'mutant/hooks'
208
- require 'mutant/config'
209
- require 'mutant/config/coverage_criteria'
210
- require 'mutant/cli'
211
- require 'mutant/cli/command'
212
- require 'mutant/cli/command/subscription'
213
- require 'mutant/cli/command/environment'
214
- require 'mutant/cli/command/environment/irb'
215
- require 'mutant/cli/command/environment/run'
216
- require 'mutant/cli/command/environment/show'
217
- require 'mutant/cli/command/environment/subject'
218
- require 'mutant/cli/command/environment/test'
219
- require 'mutant/cli/command/util'
220
- require 'mutant/cli/command/root'
221
- require 'mutant/runner'
222
- require 'mutant/runner/sink'
223
- require 'mutant/result'
224
- require 'mutant/reporter'
225
- require 'mutant/reporter/null'
226
- require 'mutant/reporter/sequence'
227
- require 'mutant/reporter/cli'
228
- require 'mutant/reporter/cli/printer'
229
- require 'mutant/reporter/cli/printer/config'
230
- require 'mutant/reporter/cli/printer/coverage_result'
231
- require 'mutant/reporter/cli/printer/env'
232
- require 'mutant/reporter/cli/printer/env_progress'
233
- require 'mutant/reporter/cli/printer/env_result'
234
- require 'mutant/reporter/cli/printer/isolation_result'
235
- require 'mutant/reporter/cli/printer/mutation'
236
- require 'mutant/reporter/cli/printer/mutation_result'
237
- require 'mutant/reporter/cli/printer/status_progressive'
238
- require 'mutant/reporter/cli/printer/subject_result'
239
- require 'mutant/reporter/cli/format'
240
- require 'mutant/repository'
241
- require 'mutant/repository/diff'
242
- require 'mutant/repository/diff/ranges'
243
- require 'mutant/zombifier'
244
- require 'mutant/range'
245
- require 'mutant/license'
246
- require 'mutant/license/subscription'
247
- require 'mutant/license/subscription/opensource'
248
- require 'mutant/license/subscription/commercial'
69
+ # rubocop:disable Metrics/BlockLength
70
+ record.call(:require_mutant_lib) do
71
+ require 'mutant/procto'
72
+ require 'mutant/transform'
73
+ require 'mutant/variable'
74
+ require 'mutant/bootstrap'
75
+ require 'mutant/version'
76
+ require 'mutant/env'
77
+ require 'mutant/pipe'
78
+ require 'mutant/util'
79
+ require 'mutant/registry'
80
+ require 'mutant/ast'
81
+ require 'mutant/ast/sexp'
82
+ require 'mutant/ast/types'
83
+ require 'mutant/ast/nodes'
84
+ require 'mutant/ast/named_children'
85
+ require 'mutant/ast/node_predicates'
86
+ require 'mutant/ast/find_metaclass_containing'
87
+ require 'mutant/ast/meta'
88
+ require 'mutant/ast/meta/send'
89
+ require 'mutant/ast/meta/const'
90
+ require 'mutant/ast/meta/symbol'
91
+ require 'mutant/ast/meta/optarg'
92
+ require 'mutant/ast/meta/resbody'
93
+ require 'mutant/ast/pattern'
94
+ require 'mutant/ast/pattern/lexer'
95
+ require 'mutant/ast/pattern/parser'
96
+ require 'mutant/ast/pattern/source'
97
+ require 'mutant/ast/pattern/token'
98
+ require 'mutant/ast/structure'
99
+ require 'mutant/parser'
100
+ require 'mutant/isolation'
101
+ require 'mutant/isolation/exception'
102
+ require 'mutant/isolation/fork'
103
+ require 'mutant/isolation/none'
104
+ require 'mutant/parallel'
105
+ require 'mutant/parallel/driver'
106
+ require 'mutant/parallel/source'
107
+ require 'mutant/parallel/worker'
108
+ require 'mutant/require_highjack'
109
+ require 'mutant/mutation'
110
+ require 'mutant/mutation/config'
111
+ require 'mutant/mutator'
112
+ require 'mutant/mutator/util'
113
+ require 'mutant/mutator/util/array'
114
+ require 'mutant/mutator/util/symbol'
115
+ require 'mutant/mutator/node'
116
+ require 'mutant/mutator/node/generic'
117
+ require 'mutant/mutator/node/literal'
118
+ require 'mutant/mutator/node/literal/boolean'
119
+ require 'mutant/mutator/node/literal/range'
120
+ require 'mutant/mutator/node/literal/symbol'
121
+ require 'mutant/mutator/node/literal/string'
122
+ require 'mutant/mutator/node/literal/integer'
123
+ require 'mutant/mutator/node/literal/float'
124
+ require 'mutant/mutator/node/literal/array'
125
+ require 'mutant/mutator/node/literal/hash'
126
+ require 'mutant/mutator/node/literal/regex'
127
+ require 'mutant/mutator/node/literal/nil'
128
+ require 'mutant/mutator/node/argument'
129
+ require 'mutant/mutator/node/arguments'
130
+ require 'mutant/mutator/node/begin'
131
+ require 'mutant/mutator/node/binary'
132
+ require 'mutant/mutator/node/const'
133
+ require 'mutant/mutator/node/dynamic_literal'
134
+ require 'mutant/mutator/node/kwbegin'
135
+ require 'mutant/mutator/node/named_value/access'
136
+ require 'mutant/mutator/node/named_value/constant_assignment'
137
+ require 'mutant/mutator/node/named_value/variable_assignment'
138
+ require 'mutant/mutator/node/next'
139
+ require 'mutant/mutator/node/break'
140
+ require 'mutant/mutator/node/noop'
141
+ require 'mutant/mutator/node/or_asgn'
142
+ require 'mutant/mutator/node/and_asgn'
143
+ require 'mutant/mutator/node/defined'
144
+ require 'mutant/mutator/node/op_asgn'
145
+ require 'mutant/mutator/node/conditional_loop'
146
+ require 'mutant/mutator/node/yield'
147
+ require 'mutant/mutator/node/super'
148
+ require 'mutant/mutator/node/zsuper'
149
+ require 'mutant/mutator/node/send'
150
+ require 'mutant/mutator/node/send/binary'
151
+ require 'mutant/mutator/node/send/conditional'
152
+ require 'mutant/mutator/node/send/attribute_assignment'
153
+ require 'mutant/mutator/node/when'
154
+ require 'mutant/mutator/node/class'
155
+ require 'mutant/mutator/node/sclass'
156
+ require 'mutant/mutator/node/define'
157
+ require 'mutant/mutator/node/mlhs'
158
+ require 'mutant/mutator/node/nthref'
159
+ require 'mutant/mutator/node/masgn'
160
+ require 'mutant/mutator/node/module'
161
+ require 'mutant/mutator/node/return'
162
+ require 'mutant/mutator/node/block'
163
+ require 'mutant/mutator/node/block_pass'
164
+ require 'mutant/mutator/node/if'
165
+ require 'mutant/mutator/node/case'
166
+ require 'mutant/mutator/node/splat'
167
+ require 'mutant/mutator/node/regopt'
168
+ require 'mutant/mutator/node/resbody'
169
+ require 'mutant/mutator/node/rescue'
170
+ require 'mutant/mutator/node/match_current_line'
171
+ require 'mutant/mutator/node/index'
172
+ require 'mutant/mutator/node/procarg_zero'
173
+ require 'mutant/mutator/node/kwargs'
174
+ require 'mutant/mutator/node/numblock'
175
+ require 'mutant/mutator/regexp'
176
+ require 'mutant/loader'
177
+ require 'mutant/context'
178
+ require 'mutant/scope'
179
+ require 'mutant/subject'
180
+ require 'mutant/subject/config'
181
+ require 'mutant/subject/method'
182
+ require 'mutant/subject/method/instance'
183
+ require 'mutant/subject/method/singleton'
184
+ require 'mutant/subject/method/metaclass'
185
+ require 'mutant/matcher'
186
+ require 'mutant/matcher/chain'
187
+ require 'mutant/matcher/config'
188
+ require 'mutant/matcher/descendants'
189
+ require 'mutant/matcher/filter'
190
+ require 'mutant/matcher/method'
191
+ require 'mutant/matcher/method/instance'
192
+ require 'mutant/matcher/method/metaclass'
193
+ require 'mutant/matcher/method/singleton'
194
+ require 'mutant/matcher/methods'
195
+ require 'mutant/matcher/namespace'
196
+ require 'mutant/matcher/null'
197
+ require 'mutant/matcher/scope'
198
+ require 'mutant/matcher/static'
199
+ require 'mutant/expression'
200
+ require 'mutant/expression/descendants'
201
+ require 'mutant/expression/method'
202
+ require 'mutant/expression/methods'
203
+ require 'mutant/expression/namespace'
204
+ require 'mutant/expression/parser'
205
+ require 'mutant/test'
206
+ require 'mutant/timer'
207
+ require 'mutant/integration'
208
+ require 'mutant/integration/null'
209
+ require 'mutant/selector'
210
+ require 'mutant/selector/expression'
211
+ require 'mutant/selector/null'
212
+ require 'mutant/world'
213
+ require 'mutant/hooks'
214
+ require 'mutant/config'
215
+ require 'mutant/config/coverage_criteria'
216
+ require 'mutant/cli'
217
+ require 'mutant/cli/command'
218
+ require 'mutant/cli/command/subscription'
219
+ require 'mutant/cli/command/environment'
220
+ require 'mutant/cli/command/environment/irb'
221
+ require 'mutant/cli/command/environment/run'
222
+ require 'mutant/cli/command/environment/show'
223
+ require 'mutant/cli/command/environment/subject'
224
+ require 'mutant/cli/command/environment/test'
225
+ require 'mutant/cli/command/util'
226
+ require 'mutant/cli/command/root'
227
+ require 'mutant/runner'
228
+ require 'mutant/runner/sink'
229
+ require 'mutant/result'
230
+ require 'mutant/reporter'
231
+ require 'mutant/reporter/null'
232
+ require 'mutant/reporter/sequence'
233
+ require 'mutant/reporter/cli'
234
+ require 'mutant/reporter/cli/printer'
235
+ require 'mutant/reporter/cli/printer/config'
236
+ require 'mutant/reporter/cli/printer/coverage_result'
237
+ require 'mutant/reporter/cli/printer/env'
238
+ require 'mutant/reporter/cli/printer/env_progress'
239
+ require 'mutant/reporter/cli/printer/env_result'
240
+ require 'mutant/reporter/cli/printer/isolation_result'
241
+ require 'mutant/reporter/cli/printer/mutation'
242
+ require 'mutant/reporter/cli/printer/mutation_result'
243
+ require 'mutant/reporter/cli/printer/status_progressive'
244
+ require 'mutant/reporter/cli/printer/subject_result'
245
+ require 'mutant/reporter/cli/format'
246
+ require 'mutant/repository'
247
+ require 'mutant/repository/diff'
248
+ require 'mutant/repository/diff/ranges'
249
+ require 'mutant/zombifier'
250
+ require 'mutant/range'
251
+ require 'mutant/license'
252
+ require 'mutant/license/subscription'
253
+ require 'mutant/license/subscription/opensource'
254
+ require 'mutant/license/subscription/commercial'
255
+ require 'mutant/segment'
256
+ require 'mutant/segment/recorder'
257
+ end
258
+ # rubocop:enable Metrics/BlockLength
259
+
260
+ gen_id = SecureRandom.method(:uuid)
261
+
262
+ # Transform boot events into segments
263
+ if instance_variable_defined?(:@executable_timestamp)
264
+ recording_start = @executable_timestamp
265
+
266
+ executable_segment =
267
+ Segment.new(
268
+ id: gen_id.call,
269
+ name: :executable,
270
+ parent_id: nil,
271
+ timestamp_end: nil,
272
+ timestamp_start: @executable_timestamp
273
+ )
274
+
275
+ remove_instance_variable(:@executable_timestamp)
276
+ else
277
+ recording_start = library_timestamp
278
+ end
279
+
280
+ library_segment = Segment.new(
281
+ id: gen_id.call,
282
+ name: :library,
283
+ parent_id: executable_segment&.id,
284
+ timestamp_end: nil,
285
+ timestamp_start: library_timestamp
286
+ )
287
+
288
+ boot_segments = boot_events.map do |name, timestamp_start, timestamp_end|
289
+ Segment.new(
290
+ id: gen_id.call,
291
+ name: name,
292
+ parent_id: library_segment.id,
293
+ timestamp_end: timestamp_end,
294
+ timestamp_start: timestamp_start
295
+ )
296
+ end
297
+
298
+ timer = Timer.new(Process)
299
+
300
+ recorder = Segment::Recorder.new(
301
+ gen_id: gen_id,
302
+ root_id: (executable_segment || library_segment).id,
303
+ parent_id: library_segment.id,
304
+ recording_start: recording_start,
305
+ segments: [*executable_segment, library_segment, *boot_segments],
306
+ timer: timer
307
+ )
249
308
 
250
- module Mutant
251
309
  WORLD = World.new(
252
310
  condition_variable: ConditionVariable,
253
311
  environment_variables: ENV,
@@ -264,10 +322,11 @@ module Mutant
264
322
  pathname: Pathname,
265
323
  process: Process,
266
324
  random: Random,
325
+ recorder: recorder,
267
326
  stderr: $stderr,
268
327
  stdout: $stdout,
269
328
  thread: Thread,
270
- timer: Timer.new(Process)
329
+ timer: timer
271
330
  )
272
331
 
273
332
  # Reopen class to initialize constant to avoid dep circle
@@ -281,8 +340,8 @@ module Mutant
281
340
  Expression::Namespace::Exact,
282
341
  Expression::Namespace::Recursive
283
342
  ]),
284
- fail_fast: false,
285
343
  environment_variables: EMPTY_HASH,
344
+ fail_fast: false,
286
345
  hooks: EMPTY_ARRAY,
287
346
  includes: EMPTY_ARRAY,
288
347
  integration: nil,
@@ -308,3 +367,4 @@ module Mutant
308
367
  )
309
368
  end
310
369
  end # Mutant
370
+ # rubocop:enable Metrics/ModuleLength