futo-spec 0.4.2 → 0.4.99.1
Sign up to get free protection for your applications and to get access to all the features.
- 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