Skip to content

Commit e79a90a

Browse files
authored
Warn and do nothing if block is passed to measure command (#813)
1 parent 6a9193e commit e79a90a

File tree

3 files changed

+57
-30
lines changed

3 files changed

+57
-30
lines changed

lib/irb/cmd/measure.rb

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,29 @@ def initialize(*args)
1212
super(*args)
1313
end
1414

15-
def execute(type = nil, arg = nil, &block)
15+
def execute(type = nil, arg = nil)
1616
# Please check IRB.init_config in lib/irb/init.rb that sets
1717
# IRB.conf[:MEASURE_PROC] to register default "measure" methods,
1818
# "measure :time" (abbreviated as "measure") and "measure :stackprof".
19+
20+
if block_given?
21+
warn 'Configure IRB.conf[:MEASURE_PROC] to add custom measure methods.'
22+
return
23+
end
24+
1925
case type
2026
when :off
21-
IRB.conf[:MEASURE] = nil
2227
IRB.unset_measure_callback(arg)
2328
when :list
2429
IRB.conf[:MEASURE_CALLBACKS].each do |type_name, _, arg_val|
2530
puts "- #{type_name}" + (arg_val ? "(#{arg_val.inspect})" : '')
2631
end
2732
when :on
28-
IRB.conf[:MEASURE] = true
29-
added = IRB.set_measure_callback(type, arg)
33+
added = IRB.set_measure_callback(arg)
3034
puts "#{added[0]} is added." if added
3135
else
32-
if block_given?
33-
IRB.conf[:MEASURE] = true
34-
added = IRB.set_measure_callback(&block)
35-
puts "#{added[0]} is added." if added
36-
else
37-
IRB.conf[:MEASURE] = true
38-
added = IRB.set_measure_callback(type, arg)
39-
puts "#{added[0]} is added." if added
40-
end
36+
added = IRB.set_measure_callback(type, arg)
37+
puts "#{added[0]} is added." if added
4138
end
4239
nil
4340
end

lib/irb/init.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ def IRB.set_measure_callback(type = nil, arg = nil, &block)
215215
added = [:TIME, IRB.conf[:MEASURE_PROC][:TIME], arg]
216216
end
217217
if added
218+
IRB.conf[:MEASURE] = true
218219
found = IRB.conf[:MEASURE_CALLBACKS].find{ |m| m[0] == added[0] && m[2] == added[2] }
219220
if found
220221
# already added
@@ -235,6 +236,7 @@ def IRB.unset_measure_callback(type = nil)
235236
type_sym = type.upcase.to_sym
236237
IRB.conf[:MEASURE_CALLBACKS].reject!{ |t, | t == type_sym }
237238
end
239+
IRB.conf[:MEASURE] = nil if IRB.conf[:MEASURE_CALLBACKS].empty?
238240
end
239241

240242
def IRB.init_error

test/irb/test_cmd.rb

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -226,17 +226,20 @@ def test_measure
226226

227227
c = Class.new(Object)
228228
out, err = execute_lines(
229-
"3\n",
230229
"measure\n",
231230
"3\n",
232231
"measure :off\n",
233232
"3\n",
233+
"measure :on\n",
234+
"3\n",
235+
"measure :off\n",
236+
"3\n",
234237
conf: conf,
235238
main: c
236239
)
237240

238241
assert_empty err
239-
assert_match(/\A=> 3\nTIME is added\.\n=> nil\nprocessing time: .+\n=> 3\n=> nil\n=> 3\n/, out)
242+
assert_match(/\A(TIME is added\.\n=> nil\nprocessing time: .+\n=> 3\n=> nil\n=> 3\n){2}/, out)
240243
assert_empty(c.class_variables)
241244
end
242245

@@ -353,7 +356,13 @@ def test_measure_with_custom
353356
assert_match(/\A=> 3\nCUSTOM is added\.\n=> nil\ncustom processing time: .+\n=> 3\n=> nil\n=> 3\n/, out)
354357
end
355358

356-
def test_measure_with_proc
359+
def test_measure_toggle
360+
measuring_proc = proc { |line, line_no, &block|
361+
time = Time.now
362+
result = block.()
363+
puts 'custom processing time: %fs' % (Time.now - time) if IRB.conf[:MEASURE]
364+
result
365+
}
357366
conf = {
358367
PROMPT: {
359368
DEFAULT: {
@@ -364,30 +373,49 @@ def test_measure_with_proc
364373
},
365374
PROMPT_MODE: :DEFAULT,
366375
MEASURE: false,
376+
MEASURE_PROC: {
377+
FOO: proc { |&block| puts 'foo'; block.call },
378+
BAR: proc { |&block| puts 'bar'; block.call }
379+
}
367380
}
368-
c = Class.new(Object)
369381
out, err = execute_lines(
382+
"measure :foo",
383+
"measure :on, :bar",
370384
"3\n",
371-
"measure { |context, code, line_no, &block|\n",
372-
" result = block.()\n",
373-
" puts 'aaa' if IRB.conf[:MEASURE]\n",
374-
" result\n",
375-
"}\n",
385+
"measure :off, :foo\n",
386+
"measure :off, :bar\n",
376387
"3\n",
377-
"measure { |context, code, line_no, &block|\n",
378-
" result = block.()\n",
379-
" puts 'bbb' if IRB.conf[:MEASURE]\n",
380-
" result\n",
381-
"}\n",
388+
conf: conf
389+
)
390+
391+
assert_empty err
392+
assert_match(/\AFOO is added\.\n=> nil\nfoo\nBAR is added\.\n=> nil\nbar\nfoo\n=> 3\nbar\nfoo\n=> nil\nbar\n=> nil\n=> 3\n/, out)
393+
end
394+
395+
def test_measure_with_proc_warning
396+
conf = {
397+
PROMPT: {
398+
DEFAULT: {
399+
PROMPT_I: '> ',
400+
PROMPT_S: '> ',
401+
PROMPT_C: '> '
402+
}
403+
},
404+
PROMPT_MODE: :DEFAULT,
405+
MEASURE: false,
406+
}
407+
c = Class.new(Object)
408+
out, err = execute_lines(
382409
"3\n",
383-
"measure :off\n",
410+
"measure do\n",
411+
"end\n",
384412
"3\n",
385413
conf: conf,
386414
main: c
387415
)
388416

389-
assert_empty err
390-
assert_match(/\A=> 3\nBLOCK is added\.\n=> nil\naaa\n=> 3\nBLOCK is added.\naaa\n=> nil\nbbb\n=> 3\n=> nil\n=> 3\n/, out)
417+
assert_match(/to add custom measure/, err)
418+
assert_match(/\A=> 3\n=> nil\n=> 3\n/, out)
391419
assert_empty(c.class_variables)
392420
end
393421
end

0 commit comments

Comments
 (0)