futo-spec 0.4.2 → 0.4.99.1
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/bin/futo +36 -18
- data/lib/context_breakpoint.rb +13 -0
- data/lib/futo-spec.rb +154 -106
- metadata +18 -6
- data/lib/exec_block_context.rb +0 -6
- data/lib/futo-spec/futo_logger.rb +0 -13
- data/lib/futo-spec/self-test/futo/_glue/mocks/basics.setup.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '014822bd29f154dddac018ec8d3ec88e5ab3f41946ae5dd18bd5a1913adcde02'
|
4
|
+
data.tar.gz: 9845a20cdada8b9d5d438ff8310c1f84ea1bb6527803cbf080101812f3e888cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0dd84772c65f807ea39411c2c88572ba01c601b342aa074d9d7498a3aa118a7aa3c3d6c0baf52c5d9437b7f2f0d3c698acf1d22dd37fb17a5813170720144e7
|
7
|
+
data.tar.gz: 8e42690d846e3278b745c31f3da3364f42492d98175906b1ce6d90168833a2ac73bea023b508844cecf11affa9b0c2770b83dc7d09cdb7feb004a023087a327c
|
data/bin/futo
CHANGED
@@ -1,40 +1,58 @@
|
|
1
1
|
#!/usr/bin/env ruby_executeable_hooks
|
2
2
|
require 'fileutils'
|
3
3
|
require 'futo-spec'
|
4
|
+
require 'paint/pa'
|
4
5
|
|
5
|
-
|
6
|
-
opts = {}
|
6
|
+
opts = Set.new
|
7
7
|
|
8
8
|
def futo_init_directories
|
9
|
-
|
10
|
-
|
9
|
+
dirs = ['chizus/shared','_glue']
|
10
|
+
dirs.each do |dd|
|
11
|
+
FileUtils.mkdir_p("#{Dir.pwd}/futo/#{dd}")
|
12
|
+
end
|
13
|
+
File.new("#{Dir.pwd}/futo/_glue/env.rb", "w")
|
11
14
|
end
|
12
15
|
|
16
|
+
def check_debug_envvar
|
17
|
+
if ENV.has_key?('DEBUG') && ENV['DEBUG'] == 'true'
|
18
|
+
$debug = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
exec_cases = true
|
23
|
+
|
13
24
|
ARGV.each do |arg|
|
14
|
-
if arg == '
|
15
|
-
|
16
|
-
|
17
|
-
|
25
|
+
if arg == '--init'
|
26
|
+
exec_cases = false
|
27
|
+
pa 'setting futo directories ...', :yellow, :bright
|
28
|
+
futo_init_directories
|
29
|
+
pa 'init complete.', :yellow
|
18
30
|
elsif arg == '-v' || arg == '--version'
|
19
|
-
|
31
|
+
exec_cases = false
|
20
32
|
puts Gem.loaded_specs['futo-spec'].version
|
21
|
-
elsif arg == '--
|
22
|
-
|
33
|
+
elsif arg == '-D' || arg == '--debug'
|
34
|
+
$debug = true
|
35
|
+
elsif arg == '-d' || arg == '--dry-run'
|
36
|
+
opts << :dry_run
|
37
|
+
elsif arg == '-md' || arg == '--markdown'
|
38
|
+
opts << :markdown
|
23
39
|
elsif arg == '-h' || arg == '--headless'
|
24
|
-
opts
|
25
|
-
elsif arg == '-v' || arg == '--version'
|
26
|
-
output_version_only = true
|
40
|
+
opts << :headless
|
27
41
|
elsif arg.end_with? '.futo'
|
28
|
-
opts
|
42
|
+
opts << :specified_file
|
43
|
+
$specified_file = arg
|
29
44
|
elsif arg.include? ':'
|
30
|
-
opts
|
45
|
+
opts << :specified_line
|
31
46
|
elsif not arg.start_with? '-'
|
32
47
|
# support passing a file name without having to type .futo
|
33
|
-
opts
|
48
|
+
opts << :specified_file
|
49
|
+
$specified_file = "#{arg}.futo"
|
34
50
|
end
|
35
51
|
end
|
36
52
|
|
37
|
-
|
53
|
+
if exec_cases
|
54
|
+
puts
|
55
|
+
check_debug_envvar
|
38
56
|
fs = FutoSpec.new(opts)
|
39
57
|
fs.run
|
40
58
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class BreakpointContext
|
2
|
+
def initialize(bind)
|
3
|
+
@local_vars = bind.local_variable_get(:local_vars)
|
4
|
+
end
|
5
|
+
def method_missing(symbol, *args)
|
6
|
+
if @local_vars.include? symbol.to_s
|
7
|
+
@local_vars[symbol.to_s]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
def contextual_breakpoint
|
11
|
+
breakpoint
|
12
|
+
end
|
13
|
+
end
|
data/lib/futo-spec.rb
CHANGED
@@ -1,13 +1,29 @@
|
|
1
|
-
require '
|
1
|
+
require 'set'
|
2
2
|
require 'find'
|
3
|
+
require 'byebug'; alias :breakpoint :byebug
|
3
4
|
require 'paint/pa'
|
4
5
|
require 'rspec/expectations'
|
5
6
|
require 'rspec'
|
7
|
+
require 'whirly'
|
6
8
|
require_relative './markdown_generator'
|
9
|
+
require_relative './context_breakpoint'
|
7
10
|
|
8
11
|
|
9
12
|
BULLET_POINTS_REGEX = /[\->]*/
|
10
13
|
|
14
|
+
COLORS = {
|
15
|
+
init: :gray,
|
16
|
+
setup: :gray,
|
17
|
+
debug: :gray,
|
18
|
+
log: :yellow,
|
19
|
+
exec: :yellow,
|
20
|
+
support: 'cornflower blue',
|
21
|
+
out: 'dark khaki',
|
22
|
+
warning: 'coral',
|
23
|
+
missing: :yellow,
|
24
|
+
error: :red,
|
25
|
+
}
|
26
|
+
|
11
27
|
RSpec.configure do |config|
|
12
28
|
config.expect_with :rspec do |c|
|
13
29
|
c.syntax = :should
|
@@ -16,11 +32,11 @@ end
|
|
16
32
|
|
17
33
|
def logd(msg, *colors)
|
18
34
|
if $debug
|
19
|
-
unless colors
|
20
|
-
|
35
|
+
unless colors.length > 0
|
36
|
+
pa msg, COLORS[:debug]
|
21
37
|
else
|
22
38
|
if colors.first == :bb
|
23
|
-
pa msg, :
|
39
|
+
pa msg, COLORS[:debug], :bright
|
24
40
|
else
|
25
41
|
pa msg, *colors
|
26
42
|
end
|
@@ -29,6 +45,10 @@ def logd(msg, *colors)
|
|
29
45
|
end
|
30
46
|
alias :dpa :logd
|
31
47
|
|
48
|
+
def pout(msg)
|
49
|
+
pa msg, COLORS[:out]
|
50
|
+
end
|
51
|
+
|
32
52
|
class FutoBullet
|
33
53
|
attr_accessor :label, :associated_commands
|
34
54
|
def initialize(h)
|
@@ -72,69 +92,56 @@ class FutoSpec
|
|
72
92
|
include RSpec::Matchers
|
73
93
|
attr_accessor :cases, :chizu, :unmatched, :included_ins
|
74
94
|
|
75
|
-
def check_and_set_debug
|
76
|
-
if ENV.has_key? 'DEBUG'
|
77
|
-
if ENV.fetch('DEBUG') == 'true'
|
78
|
-
$debug = true
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
95
|
def initialize(opts={})
|
96
|
+
Whirly.configure spinner: "dots"
|
97
|
+
Whirly.configure append_newline: false
|
98
|
+
Whirly.configure color: false
|
99
|
+
|
84
100
|
@cases = Array.new
|
85
|
-
@
|
86
|
-
@
|
101
|
+
@chizu_files = Array.new
|
102
|
+
@chizus = Array.new
|
103
|
+
@unmatched = Set.new
|
87
104
|
@included_ins = Array.new
|
88
105
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
$dry_run = true if opts[:dry]
|
93
|
-
pa 'dry run', :gray
|
106
|
+
if $debug
|
107
|
+
dpa '-- debug mode --'
|
108
|
+
puts
|
94
109
|
end
|
95
110
|
|
96
|
-
if opts.include? :
|
97
|
-
$
|
98
|
-
pa '
|
111
|
+
if opts.include? :dry_run
|
112
|
+
$dry_run = true
|
113
|
+
pa 'dry run', COLORS[:init], :bright
|
99
114
|
end
|
100
115
|
|
101
|
-
if opts.include? :
|
102
|
-
|
116
|
+
if opts.include? :specified_file
|
117
|
+
dpa "specified file: #{$specified_file}"
|
103
118
|
end
|
104
119
|
|
105
|
-
if opts.include? :
|
106
|
-
|
107
|
-
|
108
|
-
elsif opts.include? :specified_file
|
109
|
-
puts "specific file requested: #{opts.fetch(:specified_file)}"
|
110
|
-
specified_file = opts.fetch(:specified_file)
|
120
|
+
if opts.include? :headless
|
121
|
+
$headless = true
|
122
|
+
dpa 'headless mode'
|
111
123
|
end
|
112
124
|
|
113
|
-
if
|
114
|
-
|
115
|
-
raise ArgumentError, "please specify a file when using --markdown option."
|
116
|
-
else
|
117
|
-
test_case_lines = process_specific_file(specified_file)
|
118
|
-
generate_markdown_and_print(test_case_lines)
|
119
|
-
pa 'finished markdown.', :gray, :bright
|
120
|
-
end
|
125
|
+
if opts.include? :markdown
|
126
|
+
markdown_only
|
121
127
|
else
|
122
128
|
look_for_envrb_and_parse
|
123
|
-
|
124
|
-
|
125
|
-
if specified_line
|
126
|
-
test_case_lines = process_specific_line(specified_line)
|
127
|
-
dpa "line specified: #{specified_line} test case lines: #{test_case_lines}", :red
|
128
|
-
elsif specified_file
|
129
|
-
test_case_lines = process_specific_file(specified_file)
|
130
|
-
else
|
131
|
-
test_case_lines = discover_and_process_spec_files
|
132
|
-
end
|
133
|
-
|
129
|
+
test_case_lines = process_specified_file
|
134
130
|
create_test_cases(test_case_lines)
|
135
|
-
|
131
|
+
find_matching_chizu_files
|
132
|
+
process_chizu_files
|
133
|
+
match_cases_to_chizus
|
134
|
+
end
|
135
|
+
end
|
136
136
|
|
137
|
-
|
137
|
+
def markdown_only
|
138
|
+
pa 'markdown mode', COLORS[:init], :bright
|
139
|
+
unless $specified_file
|
140
|
+
raise ArgumentError, "please specify a file when using --markdown option."
|
141
|
+
else
|
142
|
+
test_case_lines = process_specified_file
|
143
|
+
generate_markdown_and_print(test_case_lines)
|
144
|
+
pa 'finished markdown.', COLORS[:init]
|
138
145
|
end
|
139
146
|
end
|
140
147
|
|
@@ -142,7 +149,7 @@ class FutoSpec
|
|
142
149
|
if Dir.children(Dir.pwd).include? 'futo'
|
143
150
|
if Dir.children("#{Dir.pwd}/futo").include? '_glue'
|
144
151
|
if Dir.children("#{Dir.pwd}/futo/_glue").include? 'env.rb'
|
145
|
-
dpa 'found futo/_glue/env.rb', :
|
152
|
+
dpa 'found futo/_glue/env.rb', COLORS[:init]
|
146
153
|
load 'futo/_glue/env.rb'
|
147
154
|
end
|
148
155
|
end
|
@@ -150,7 +157,7 @@ class FutoSpec
|
|
150
157
|
end
|
151
158
|
|
152
159
|
def discover_and_process_spec_files
|
153
|
-
dpa "no file specified, discovering all .futo or .spec files ...", :
|
160
|
+
dpa "no file specified, discovering all .futo or .spec files ...", COLORS[:init], :bright
|
154
161
|
futo_files = []
|
155
162
|
test_case_lines = []
|
156
163
|
|
@@ -165,11 +172,13 @@ class FutoSpec
|
|
165
172
|
return test_case_lines
|
166
173
|
end
|
167
174
|
|
168
|
-
def
|
169
|
-
dpa "
|
170
|
-
path = "futo/#{
|
175
|
+
def process_specified_file
|
176
|
+
dpa "process_specified_file: #{$specified_file}"
|
177
|
+
path = "futo/#{$specified_file}"
|
171
178
|
File.open(path) do |file|
|
172
179
|
file_lines = file.readlines(chomp:true)
|
180
|
+
# add one blank line to facilitate saving the last test case
|
181
|
+
file_lines << ''
|
173
182
|
return file_lines
|
174
183
|
end
|
175
184
|
end
|
@@ -214,7 +223,11 @@ class FutoSpec
|
|
214
223
|
end
|
215
224
|
|
216
225
|
def add_case_to_spec
|
217
|
-
|
226
|
+
# don't add the last test case
|
227
|
+
unless @new_case_label == ''
|
228
|
+
dpa "adding new test case: #{@new_case_label}"
|
229
|
+
@cases << FutoCase.new(@new_case_label, @new_case_bullets)
|
230
|
+
end
|
218
231
|
end
|
219
232
|
|
220
233
|
def begin_new_case
|
@@ -271,7 +284,7 @@ class FutoSpec
|
|
271
284
|
if File.exist?(fn)
|
272
285
|
load(fn)
|
273
286
|
else
|
274
|
-
pa "failed to find setup file #{fn} for line: #{line}", :red
|
287
|
+
pa "failed to find setup file #{fn} for line: #{line}", COLORS[:red]
|
275
288
|
end
|
276
289
|
puts
|
277
290
|
end
|
@@ -283,29 +296,29 @@ class FutoSpec
|
|
283
296
|
l0 = line.gsub('(DONE)','').gsub('(done)','')
|
284
297
|
ll = l0.lstrip.rstrip
|
285
298
|
if is_newline? ll
|
286
|
-
dpa "found newline: #{ll}
|
299
|
+
dpa "found newline: #{ll}, saving existing case and starting a new one"
|
287
300
|
add_case_to_spec
|
288
301
|
begin_new_case
|
289
302
|
else
|
290
303
|
if is_mock_data? ll
|
291
|
-
dpa "found mock data: #{ll}", :
|
304
|
+
dpa "found mock data: #{ll}", COLORS[:setup]
|
292
305
|
load_mock_data(ll)
|
293
306
|
elsif is_bullet? ll
|
294
|
-
dpa "found bullet: #{ll}", :
|
307
|
+
dpa "found bullet: #{ll}", COLORS[:setup]
|
295
308
|
new_bullet(ll)
|
296
309
|
elsif is_asterisk? ll
|
297
|
-
dpa "found asterisk, treating as description: #{ll}", :
|
310
|
+
dpa "found asterisk, treating as description: #{ll}", COLORS[:setup]
|
298
311
|
label = ll.gsub('*', '').lstrip
|
299
312
|
new_label(label)
|
300
313
|
elsif is_description? ll
|
301
|
-
dpa "found new description: #{ll}", :
|
314
|
+
dpa "found new description: #{ll}", COLORS[:setup]
|
302
315
|
new_label(ll)
|
303
316
|
else
|
304
|
-
raise RuntimeError, "could not find entry type for
|
317
|
+
raise RuntimeError, "could not find matching chizu entry type for: #{ll}"
|
305
318
|
end
|
306
319
|
end
|
320
|
+
dpa "test cases loaded: #{@cases.length}"
|
307
321
|
end
|
308
|
-
|
309
322
|
# catch anything left over
|
310
323
|
add_case_to_spec
|
311
324
|
end
|
@@ -324,28 +337,37 @@ class FutoSpec
|
|
324
337
|
return single
|
325
338
|
end
|
326
339
|
|
327
|
-
def
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
340
|
+
def find_matching_chizu_files
|
341
|
+
without_suffix = $specified_file.chomp('.futo')
|
342
|
+
base = "#{Dir.pwd}/futo/chizus"
|
343
|
+
path = "#{base}/#{without_suffix}.chizu"
|
344
|
+
unless File.exist? path
|
345
|
+
pa "#{$specified_file}: couldn't find matching .chizu file", COLORS[:warning]
|
346
|
+
else
|
347
|
+
dpa "loading matching #{$specified_file}.chizu ...", COLORS[:setup]
|
348
|
+
@chizu_files << path
|
333
349
|
end
|
334
350
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
351
|
+
search_dir = "#{base}/shared"
|
352
|
+
dpa "loading shared chizus ...", COLORS[:setup]
|
353
|
+
Find.find(search_dir) do |ff|
|
354
|
+
if ff.end_with? 'chizu'
|
355
|
+
dpa "loading #{ff}"
|
356
|
+
@chizu_files << ff
|
357
|
+
end
|
341
358
|
end
|
342
359
|
end
|
343
360
|
|
361
|
+
def process_chizu_files
|
362
|
+
@chizu_files.each {|ff| load_chizu_commands ff}
|
363
|
+
end
|
364
|
+
|
344
365
|
def add_new_chizu(kkey, commands)
|
345
|
-
@
|
366
|
+
@chizus << ChizuEntry.new(kkey, commands)
|
346
367
|
end
|
347
368
|
|
348
369
|
def load_chizu_commands(ff)
|
370
|
+
dpa "loading chizu commands from file: #{ff}"
|
349
371
|
File.open(ff) do |file|
|
350
372
|
lines = file.readlines(chomp:true)
|
351
373
|
kkey = ''
|
@@ -393,8 +415,7 @@ class FutoSpec
|
|
393
415
|
elsif ll == "\n" || ll == ''
|
394
416
|
next
|
395
417
|
else
|
396
|
-
|
397
|
-
puts
|
418
|
+
pa "encountered unexpected line: #{ll}", :red, :bright
|
398
419
|
end
|
399
420
|
end
|
400
421
|
end
|
@@ -415,16 +436,15 @@ class FutoSpec
|
|
415
436
|
end
|
416
437
|
end
|
417
438
|
|
418
|
-
|
419
|
-
|
420
|
-
if @chizu_array.length == 0
|
439
|
+
def match_cases_to_chizus
|
440
|
+
if @chizus.length == 0
|
421
441
|
set_all_unmatched
|
422
442
|
else
|
423
443
|
@cases.each_with_index do |test_case, tc_index|
|
424
444
|
test_case.bullet_points.each do |bullet|
|
425
445
|
dpa "matching bullet: #{bullet}", :bb
|
426
446
|
matched = false
|
427
|
-
@
|
447
|
+
@chizus.each do |chizu|
|
428
448
|
if process_bullet_chizu_match(bullet, chizu)
|
429
449
|
bullet.associated_commands = chizu.associated_commands
|
430
450
|
matched = true
|
@@ -434,7 +454,7 @@ class FutoSpec
|
|
434
454
|
dpa "matched? #{bullet.label} : #{matched}", :bb
|
435
455
|
if ! matched
|
436
456
|
unless @unmatched.include? bullet.label
|
437
|
-
dpa "couldn't find a match for #{bullet.label}", :
|
457
|
+
dpa "couldn't find a match for #{bullet.label}", COLORS[:error]
|
438
458
|
@unmatched << bullet.label
|
439
459
|
end
|
440
460
|
end
|
@@ -445,57 +465,85 @@ class FutoSpec
|
|
445
465
|
|
446
466
|
def process_bullet_chizu_match(bullet, chizu)
|
447
467
|
matched = false
|
448
|
-
dpa "chizu: #{chizu.kkey}", :
|
468
|
+
dpa "chizu: #{chizu.kkey}", COLORS[:init]
|
449
469
|
if is_todo? chizu
|
450
|
-
|
470
|
+
logd "found todo: #{chizu}", COLORS[:init]
|
451
471
|
# todos aren't considered completed so they are unmatched
|
452
472
|
elsif is_included_in? chizu
|
453
|
-
#logd "found included_in: #{chizu}", :
|
473
|
+
#logd "found included_in: #{chizu}", COLORS[:init]
|
454
474
|
@included_ins << chizu
|
455
475
|
else
|
456
476
|
if bullet.label == chizu.kkey
|
457
|
-
logd "matched: #{bullet.label} #{chizu.kkey}", :blue
|
458
477
|
matched = true
|
459
478
|
end
|
460
479
|
end
|
461
480
|
return matched
|
462
481
|
end
|
463
482
|
|
464
|
-
def output_unmatched_commands
|
465
|
-
puts
|
466
|
-
pa "Missing chizu entries:", :yellow
|
467
|
-
puts
|
468
|
-
@unmatched.each do |label|
|
469
|
-
pa "On '#{label}' do", :yellow
|
470
|
-
pa ' # TODO', :yellow
|
471
|
-
pa 'end', :yellow
|
472
|
-
puts
|
473
|
-
end
|
474
|
-
end
|
475
|
-
|
476
483
|
def run
|
477
484
|
exec_cases unless $dry_run
|
478
485
|
output_unmatched_commands if @unmatched.length > 0
|
479
486
|
end
|
480
487
|
|
488
|
+
def breakpoint_with_local_vars(local_vars)
|
489
|
+
bind = binding
|
490
|
+
bind.local_variable_set(:ish, '555')
|
491
|
+
eval('breakpoint; puts "ishly: #{ish}"', bind).binding
|
492
|
+
puts
|
493
|
+
end
|
494
|
+
|
495
|
+
|
481
496
|
def run_commands_in_block_context(bullet)
|
497
|
+
local_vars = {}
|
482
498
|
bullet.associated_commands.each do |cmd|
|
483
|
-
pa cmd, :cyan if cmd != 'breakpoint'
|
484
499
|
begin
|
485
|
-
|
500
|
+
pa " #{cmd}", COLORS[:support] if cmd != 'breakpoint' # agb ignore
|
501
|
+
bind = binding
|
502
|
+
local_vars.each_pair do |kk, vv|
|
503
|
+
bind.local_variable_set(kk, vv)
|
504
|
+
end
|
505
|
+
unless cmd == 'breakpoint'
|
506
|
+
result = bind.eval(cmd)
|
507
|
+
else
|
508
|
+
c = BreakpointContext.new(bind)
|
509
|
+
c.contextual_breakpoint
|
510
|
+
end
|
511
|
+
dpa "result: #{result}"
|
512
|
+
if cmd.include? '='
|
513
|
+
new_var = cmd.split('=').first.rstrip
|
514
|
+
local_vars.store(new_var, result)
|
515
|
+
end
|
486
516
|
rescue RSpec::Expectations::ExpectationNotMetError => e
|
487
|
-
pa e, :
|
517
|
+
pa e, COLORS[:error], :bright
|
518
|
+
raise e
|
488
519
|
end
|
489
520
|
end
|
490
521
|
end
|
491
522
|
|
492
523
|
def exec_cases
|
493
|
-
puts
|
524
|
+
puts; puts
|
494
525
|
@cases.each do |test_case|
|
495
|
-
|
526
|
+
title = "case: #{test_case.description}"
|
527
|
+
pa "\u22EF" * ( title.length + 5 ), COLORS[:exec]
|
528
|
+
pa " case: #{test_case.description}", COLORS[:exec], :bright
|
529
|
+
puts
|
496
530
|
test_case.bullet_points.each do |bullet|
|
531
|
+
pa "\u229A #{bullet}", COLORS[:exec]
|
497
532
|
run_commands_in_block_context(bullet)
|
498
533
|
end
|
499
534
|
end
|
535
|
+
puts; puts; puts
|
536
|
+
end
|
537
|
+
|
538
|
+
def output_unmatched_commands
|
539
|
+
puts
|
540
|
+
pa "Missing chizu entries:", COLORS[:missing], :bright
|
541
|
+
puts
|
542
|
+
@unmatched.each do |label|
|
543
|
+
pa "On '#{label}' do", COLORS[:missing]
|
544
|
+
pa ' # TODO', COLORS[:missing]
|
545
|
+
pa 'end', COLORS[:missing]
|
546
|
+
puts
|
547
|
+
end
|
500
548
|
end
|
501
549
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: futo-spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.99.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Felipe Wolfe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: paint
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: whirly
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,7 +73,7 @@ dependencies:
|
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '11.1'
|
62
|
-
type: :
|
76
|
+
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
@@ -75,10 +89,8 @@ extensions: []
|
|
75
89
|
extra_rdoc_files: []
|
76
90
|
files:
|
77
91
|
- bin/futo
|
78
|
-
- lib/
|
92
|
+
- lib/context_breakpoint.rb
|
79
93
|
- lib/futo-spec.rb
|
80
|
-
- lib/futo-spec/futo_logger.rb
|
81
|
-
- lib/futo-spec/self-test/futo/_glue/mocks/basics.setup.rb
|
82
94
|
- lib/markdown_generator.rb
|
83
95
|
homepage: https://rubygems.org/gems/futo-spec
|
84
96
|
licenses:
|
data/lib/exec_block_context.rb
DELETED