ruby-prof 0.16.2 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +15 -0
  3. data/README.rdoc +36 -5
  4. data/bin/ruby-prof +7 -2
  5. data/doc/LICENSE.html +2 -1
  6. data/doc/README_rdoc.html +42 -8
  7. data/doc/Rack.html +2 -1
  8. data/doc/Rack/RubyProf.html +25 -18
  9. data/doc/Rack/RubyProf/RackProfiler.html +343 -0
  10. data/doc/RubyProf.html +14 -2
  11. data/doc/RubyProf/AbstractPrinter.html +91 -12
  12. data/doc/RubyProf/AggregateCallInfo.html +2 -1
  13. data/doc/RubyProf/CallInfo.html +18 -78
  14. data/doc/RubyProf/CallInfoPrinter.html +2 -1
  15. data/doc/RubyProf/CallInfoVisitor.html +2 -1
  16. data/doc/RubyProf/CallStackPrinter.html +35 -29
  17. data/doc/RubyProf/CallTreePrinter.html +98 -14
  18. data/doc/RubyProf/Cmd.html +11 -5
  19. data/doc/RubyProf/DeprecationWarnings.html +148 -0
  20. data/doc/RubyProf/DotPrinter.html +2 -1
  21. data/doc/RubyProf/FlatPrinter.html +2 -1
  22. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +7 -5
  23. data/doc/RubyProf/GraphHtmlPrinter.html +18 -12
  24. data/doc/RubyProf/GraphPrinter.html +2 -1
  25. data/doc/RubyProf/MethodInfo.html +19 -88
  26. data/doc/RubyProf/MultiPrinter.html +231 -17
  27. data/doc/RubyProf/Profile.html +184 -39
  28. data/doc/RubyProf/Profile/ExcludeCommonMethods.html +411 -0
  29. data/doc/RubyProf/Profile/LegacyMethodElimination.html +158 -0
  30. data/doc/RubyProf/ProfileTask.html +2 -1
  31. data/doc/RubyProf/Thread.html +4 -39
  32. data/doc/created.rid +21 -19
  33. data/doc/css/fonts.css +6 -6
  34. data/doc/examples/flat_txt.html +2 -1
  35. data/doc/examples/graph_html.html +2 -1
  36. data/doc/examples/graph_txt.html +2 -1
  37. data/doc/index.html +47 -7
  38. data/doc/js/darkfish.js +7 -7
  39. data/doc/js/search_index.js +1 -1
  40. data/doc/js/search_index.js.gz +0 -0
  41. data/doc/js/searcher.js +1 -0
  42. data/doc/js/searcher.js.gz +0 -0
  43. data/doc/table_of_contents.html +190 -80
  44. data/ext/ruby_prof/extconf.rb +4 -0
  45. data/ext/ruby_prof/rp_call_info.c +19 -1
  46. data/ext/ruby_prof/rp_call_info.h +8 -3
  47. data/ext/ruby_prof/rp_method.c +282 -57
  48. data/ext/ruby_prof/rp_method.h +28 -5
  49. data/ext/ruby_prof/rp_stack.c +69 -24
  50. data/ext/ruby_prof/rp_stack.h +21 -9
  51. data/ext/ruby_prof/rp_thread.c +4 -1
  52. data/ext/ruby_prof/ruby_prof.c +142 -39
  53. data/ext/ruby_prof/ruby_prof.h +3 -0
  54. data/lib/ruby-prof.rb +10 -0
  55. data/lib/ruby-prof/call_info.rb +0 -11
  56. data/lib/ruby-prof/method_info.rb +4 -12
  57. data/lib/ruby-prof/printers/abstract_printer.rb +19 -1
  58. data/lib/ruby-prof/printers/call_info_printer.rb +1 -1
  59. data/lib/ruby-prof/printers/call_stack_printer.rb +9 -4
  60. data/lib/ruby-prof/printers/call_tree_printer.rb +15 -2
  61. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +23 -4
  62. data/lib/ruby-prof/printers/graph_html_printer.rb +10 -5
  63. data/lib/ruby-prof/printers/graph_printer.rb +2 -2
  64. data/lib/ruby-prof/printers/multi_printer.rb +44 -18
  65. data/lib/ruby-prof/profile.rb +13 -42
  66. data/lib/ruby-prof/profile/exclude_common_methods.rb +201 -0
  67. data/lib/ruby-prof/profile/legacy_method_elimination.rb +49 -0
  68. data/lib/ruby-prof/rack.rb +130 -51
  69. data/lib/ruby-prof/thread.rb +0 -6
  70. data/lib/ruby-prof/version.rb +1 -1
  71. data/ruby-prof.gemspec +4 -3
  72. data/test/aggregate_test.rb +1 -1
  73. data/test/exclude_methods_test.rb +146 -0
  74. data/test/line_number_test.rb +12 -3
  75. data/test/multi_printer_test.rb +23 -2
  76. data/test/no_method_class_test.rb +1 -1
  77. data/test/printers_test.rb +21 -1
  78. data/test/rack_test.rb +64 -0
  79. data/test/recursive_test.rb +15 -15
  80. data/test/test_helper.rb +11 -0
  81. metadata +20 -13
@@ -10,12 +10,6 @@ module RubyProf
10
10
  top_methods.map(&:call_infos).flatten.select(&:root?)
11
11
  end
12
12
 
13
- # This method detect recursive calls in the call tree of a given thread
14
- # It should be called only once for each thread
15
- def detect_recursion
16
- top_call_infos.each(&:detect_recursion)
17
- end
18
-
19
13
  def total_time
20
14
  self.top_methods.inject(0) do |sum, method_info|
21
15
  method_info.call_infos.each do |call_info|
@@ -1,3 +1,3 @@
1
1
  module RubyProf
2
- VERSION = "0.16.2"
2
+ VERSION = "0.17.0"
3
3
  end
@@ -44,6 +44,7 @@ EOF
44
44
  'lib/unprof.rb',
45
45
  'lib/ruby-prof/*.rb',
46
46
  'lib/ruby-prof/assets/*.{html,png}',
47
+ 'lib/ruby-prof/profile/*.rb',
47
48
  'lib/ruby-prof/printers/*.rb',
48
49
  'test/*.rb']
49
50
 
@@ -51,7 +52,7 @@ EOF
51
52
  spec.required_ruby_version = '>= 1.9.3'
52
53
  spec.date = Time.now.strftime('%Y-%m-%d')
53
54
  spec.homepage = 'https://github.com/ruby-prof/ruby-prof'
54
- spec.add_development_dependency('minitest', '~> 5.8.3')
55
- spec.add_development_dependency('rake-compiler')
56
- spec.add_development_dependency('rdoc')
55
+ spec.add_development_dependency('minitest', '~> 5.0')
56
+ spec.add_development_dependency('rake-compiler', '~> 1.0')
57
+ spec.add_development_dependency('rdoc', '~> 5.0')
57
58
  end
@@ -44,7 +44,7 @@ class AggregateTest < TestCase
44
44
  methods = result.threads.first.methods.sort.reverse
45
45
  methods.each do |m|
46
46
  m.call_infos.each do |ci|
47
- assert(!ci.recursive)
47
+ assert(!ci.recursive?)
48
48
  end
49
49
  end
50
50
  end
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ module ExcludeMethodsModule
7
+ def c
8
+ 1.times { |i| ExcludeMethodsModule.d }
9
+ end
10
+
11
+ def self.d
12
+ 1.times { |i| ExcludeMethodsClass.e }
13
+ end
14
+ end
15
+
16
+ class ExcludeMethodsClass
17
+ include ExcludeMethodsModule
18
+
19
+ def a
20
+ 1.times { |i| b }
21
+ end
22
+
23
+ def b
24
+ 1.times { |i| c; self.class.e }
25
+ end
26
+
27
+ def self.e
28
+ 1.times { |i| f }
29
+ end
30
+
31
+ def self.f
32
+ sleep 0.1
33
+ end
34
+ end
35
+
36
+ class ExcludeMethodsTest < TestCase
37
+ def setup
38
+ # Need to use wall time for this test due to the sleep calls
39
+ RubyProf::measure_mode = RubyProf::WALL_TIME
40
+ end
41
+
42
+ def test_methods_can_be_profiled
43
+ obj = ExcludeMethodsClass.new
44
+ prf = RubyProf::Profile.new
45
+
46
+ result = prf.profile { 5.times {obj.a} }
47
+ methods = result.threads.first.methods.sort.reverse
48
+
49
+ assert_equal(10, methods.count)
50
+ assert_equal('ExcludeMethodsTest#test_methods_can_be_profiled', methods[0].full_name)
51
+ assert_equal('Integer#times', methods[1].full_name)
52
+ assert_equal('ExcludeMethodsClass#a', methods[2].full_name)
53
+ assert_equal('ExcludeMethodsClass#b', methods[3].full_name)
54
+ assert_equal('<Class::ExcludeMethodsClass>#e', methods[4].full_name)
55
+ assert_equal('<Class::ExcludeMethodsClass>#f', methods[5].full_name)
56
+ assert_equal('Kernel#sleep', methods[6].full_name)
57
+ assert_equal('ExcludeMethodsModule#c', methods[7].full_name)
58
+ assert_equal('<Module::ExcludeMethodsModule>#d', methods[8].full_name)
59
+ assert_equal('Kernel#class', methods[9].full_name)
60
+ end
61
+
62
+ def test_methods_can_be_hidden1
63
+ obj = ExcludeMethodsClass.new
64
+ prf = RubyProf::Profile.new
65
+
66
+ prf.exclude_methods!(Integer, :times)
67
+
68
+ result = prf.profile { 5.times {obj.a} }
69
+ methods = result.threads.first.methods.sort.reverse
70
+
71
+ assert_equal(9, methods.count)
72
+ assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden1', methods[0].full_name)
73
+ assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
74
+ assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
75
+ assert_equal('<Class::ExcludeMethodsClass>#e', methods[3].full_name)
76
+ assert_equal('<Class::ExcludeMethodsClass>#f', methods[4].full_name)
77
+ assert_equal('Kernel#sleep', methods[5].full_name)
78
+ assert_equal('ExcludeMethodsModule#c', methods[6].full_name)
79
+ assert_equal('<Module::ExcludeMethodsModule>#d', methods[7].full_name)
80
+ assert_equal('Kernel#class', methods[8].full_name)
81
+ end
82
+
83
+ def test_methods_can_be_hidden2
84
+ obj = ExcludeMethodsClass.new
85
+ prf = RubyProf::Profile.new
86
+
87
+ prf.exclude_methods!(Integer, :times)
88
+ prf.exclude_methods!(ExcludeMethodsClass.singleton_class, :f)
89
+ prf.exclude_methods!(ExcludeMethodsModule.singleton_class, :d)
90
+
91
+ result = prf.profile { 5.times {obj.a} }
92
+ methods = result.threads.first.methods.sort.reverse
93
+
94
+ assert_equal(7, methods.count)
95
+ assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden2', methods[0].full_name)
96
+ assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
97
+ assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
98
+ assert_equal('<Class::ExcludeMethodsClass>#e', methods[3].full_name)
99
+ assert_equal('Kernel#sleep', methods[4].full_name)
100
+ assert_equal('ExcludeMethodsModule#c', methods[5].full_name)
101
+ assert_equal('Kernel#class', methods[6].full_name)
102
+ end
103
+
104
+ def test_exclude_common_methods1
105
+ obj = ExcludeMethodsClass.new
106
+ prf = RubyProf::Profile.new
107
+
108
+ prf.exclude_common_methods!
109
+
110
+ result = prf.profile { 5.times {obj.a} }
111
+ methods = result.threads.first.methods.sort.reverse
112
+
113
+ assert_equal(9, methods.count)
114
+ assert_equal('ExcludeMethodsTest#test_exclude_common_methods1', methods[0].full_name)
115
+ assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
116
+ assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
117
+ end
118
+
119
+ def test_exclude_common_methods2
120
+ obj = ExcludeMethodsClass.new
121
+
122
+ result = RubyProf.profile(exclude_common: true) { 5.times {obj.a} }
123
+ methods = result.threads.first.methods.sort.reverse
124
+
125
+ assert_equal(9, methods.count)
126
+ assert_equal('ExcludeMethodsTest#test_exclude_common_methods2', methods[0].full_name)
127
+ assert_equal('ExcludeMethodsClass#a', methods[1].full_name)
128
+ assert_equal('ExcludeMethodsClass#b', methods[2].full_name)
129
+ end
130
+
131
+ private
132
+
133
+ def assert_method_has_been_eliminated(result, eliminated_method)
134
+ result.threads.each do |thread|
135
+ thread.methods.each do |method|
136
+ method.call_infos.each do |ci|
137
+ assert(ci.target != eliminated_method, "broken self")
138
+ assert(ci.parent.target != eliminated_method, "broken parent") if ci.parent
139
+ ci.children.each do |callee|
140
+ assert(callee.target != eliminated_method, "broken kid")
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -34,7 +34,11 @@ class LineNumbersTest < TestCase
34
34
 
35
35
  method = methods[1]
36
36
  assert_equal('LineNumbers#method2', method.full_name)
37
- assert_equal(10, method.line)
37
+ if RUBY_VERSION < "2.5"
38
+ assert_equal(10, method.line)
39
+ else
40
+ assert_equal(11, method.line)
41
+ end
38
42
 
39
43
  method = methods[2]
40
44
  assert_equal('LineNumbers#method1', method.full_name)
@@ -62,10 +66,15 @@ class LineNumbersTest < TestCase
62
66
 
63
67
  method = methods[1]
64
68
  assert_equal('LineNumbers#method3', method.full_name)
65
- assert_equal(14, method.line)
69
+ if RUBY_VERSION < "2.5"
70
+ assert_equal(14, method.line)
71
+ else
72
+ assert_equal(15, method.line)
73
+ end
66
74
 
67
75
  method = methods[2]
68
76
  assert_equal('LineNumbersTest#test_c_function', method.full_name)
69
- assert_equal(48, method.line)
77
+ assert_equal(52, method.line)
70
78
  end
79
+
71
80
  end
@@ -32,6 +32,28 @@ class MultiPrinterTest < TestCase
32
32
  RubyProf::measure_mode = RubyProf::WALL_TIME
33
33
  end
34
34
 
35
+ def test_refuses_io_objects
36
+ # we don't need a real profile for this test
37
+ p = RubyProf::MultiPrinter.new nil
38
+ begin
39
+ p.print(STDOUT)
40
+ flunk "should have raised an ArgumentError"
41
+ rescue ArgumentError => e
42
+ assert_match(/IO/, e.to_s)
43
+ end
44
+ end
45
+
46
+ def test_refuses_non_hashes
47
+ # we don't need a real profile for this test
48
+ p = RubyProf::MultiPrinter.new nil
49
+ begin
50
+ p.print([])
51
+ flunk "should have raised an ArgumentError"
52
+ rescue ArgumentError => e
53
+ assert_match(/hash/, e.to_s)
54
+ end
55
+ end
56
+
35
57
  def test_all_profiles_can_be_created
36
58
  start_time = Time.now
37
59
  RubyProf.start
@@ -39,8 +61,7 @@ class MultiPrinterTest < TestCase
39
61
  result = RubyProf.stop
40
62
  end_time = Time.now
41
63
  expected_time = end_time - start_time
42
- stack = graph = nil
43
- assert_nothing_raised { stack, graph = print(result) }
64
+ graph = print(result)[1]
44
65
  re = Regexp.new('
45
66
  \s*<table>
46
67
  \s*<tr>
@@ -10,6 +10,6 @@ end
10
10
 
11
11
  methods = result.threads.first.methods
12
12
  global_method = methods.sort_by {|method| method.full_name}.first
13
- if global_method.full_name != 'Global#[No method]'
13
+ if global_method.full_name != 'Kernel#sleep'
14
14
  raise(RuntimeError, "Wrong method name. Expected: Global#[No method]. Actual: #{global_method.full_name}")
15
15
  end
@@ -63,6 +63,26 @@ class PrintersTest < TestCase
63
63
  end
64
64
  end
65
65
 
66
+ def test_refuses_io_objects
67
+ p = RubyProf::MultiPrinter.new(@result)
68
+ begin
69
+ p.print(STDOUT)
70
+ flunk "should have raised an ArgumentError"
71
+ rescue ArgumentError => e
72
+ assert_match(/IO/, e.to_s)
73
+ end
74
+ end
75
+
76
+ def test_refuses_non_hashes
77
+ p = RubyProf::MultiPrinter.new (@result)
78
+ begin
79
+ p.print([])
80
+ flunk "should have raised an ArgumentError"
81
+ rescue ArgumentError => e
82
+ assert_match(/hash/, e.to_s)
83
+ end
84
+ end
85
+
66
86
  def test_flat_string
67
87
  output = helper_test_flat_string(RubyProf::FlatPrinter)
68
88
  refute_match(/prime.rb/, output)
@@ -120,7 +140,7 @@ class PrintersTest < TestCase
120
140
  main_output_file_name = File.join(RubyProf.tmpdir, "lolcat.callgrind.out.#{$$}")
121
141
  assert(File.exist?(main_output_file_name))
122
142
  output = File.read(main_output_file_name)
123
- assert_match(/fn=Object#find_primes/i, output)
143
+ assert_match(/fn=Object::find_primes/i, output)
124
144
  assert_match(/events: wall_time/i, output)
125
145
  refute_match(/d\d\d\d\d\d/, output) # old bug looked [in error] like Object::run_primes(d5833116)
126
146
  end
@@ -24,6 +24,16 @@ module Rack
24
24
  end
25
25
  end
26
26
 
27
+ module Rack
28
+ class RubyProf
29
+ attr_reader :_profiler
30
+
31
+ def public_delete_profiler!
32
+ delete_profiler!
33
+ end
34
+ end
35
+ end
36
+
27
37
  class RackTest < TestCase
28
38
  def test_create_print_path
29
39
  path = Dir.mktmpdir
@@ -90,4 +100,58 @@ class RackTest < TestCase
90
100
  file_path = ::File.join(path, 'path-to-resource.json-dynamic.txt')
91
101
  assert(File.exist?(file_path))
92
102
  end
103
+
104
+ def test_works_for_multiple_requests
105
+ path = Dir.mktmpdir
106
+
107
+ adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :max_requests => 2)
108
+
109
+ # make a 1st request, and check that this didn't create any files
110
+ adapter.call(:fake_env)
111
+ assert(Dir["#{path}/*"].empty?)
112
+
113
+ # now a second request should create all the expected files
114
+ adapter.call(:fake_env)
115
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
116
+ file_path = ::File.join(path, "multi-requests-2-#{base_name}")
117
+ assert(File.exist?(file_path))
118
+ end
119
+
120
+ # let's clean up
121
+ FileUtils.rm_rf(Dir["#{path}/*"])
122
+
123
+ # and do the same again for the next 2 requests
124
+ adapter.call(:fake_env)
125
+ assert(Dir["#{path}/*"].empty?)
126
+
127
+ adapter.call(:fake_env)
128
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
129
+ file_path = ::File.join(path, "multi-requests-2-#{base_name}")
130
+ assert(File.exist?(file_path))
131
+ end
132
+ end
133
+
134
+ def test_tries_to_print_results_if_shut_down_before_max_requests_reached
135
+ path = Dir.mktmpdir
136
+
137
+ adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :max_requests => 100)
138
+
139
+ # make a 1st request, and check that this didn't create any files
140
+ adapter.call(:fake_env)
141
+ assert(Dir["#{path}/*"].empty?)
142
+
143
+ adapter.public_delete_profiler!
144
+
145
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
146
+ file_path = ::File.join(path, "multi-requests-1-#{base_name}")
147
+ assert(File.exist?(file_path))
148
+ end
149
+ end
150
+
151
+ def test_it_uses_separate_profilers_if_not_aggregating_multiple_requests
152
+ adapter1 = Rack::RubyProf.new(FakeRackApp.new)
153
+ adapter2 = Rack::RubyProf.new(FakeRackApp.new)
154
+
155
+ assert(adapter1.object_id != adapter2.object_id)
156
+ end
93
157
  end
@@ -64,7 +64,7 @@ class RecursiveTest < TestCase
64
64
 
65
65
  assert_equal(1, method.call_infos.length)
66
66
  call_info = method.call_infos[0]
67
- assert(!call_info.recursive)
67
+ assert(!call_info.recursive?)
68
68
  assert_equal('RecursiveTest#test_simple', call_info.call_sequence)
69
69
  assert_equal(1, call_info.children.length)
70
70
 
@@ -82,12 +82,12 @@ class RecursiveTest < TestCase
82
82
  call_info = method.call_infos.first
83
83
  assert_equal(2, call_info.children.length)
84
84
  assert_equal('RecursiveTest#test_simple->SimpleRecursion#simple', call_info.call_sequence)
85
- assert(!call_info.recursive)
85
+ assert(!call_info.recursive?)
86
86
 
87
87
  call_info = method.call_infos.last
88
88
  assert_equal(1, call_info.children.length)
89
89
  assert_equal('RecursiveTest#test_simple->SimpleRecursion#simple->SimpleRecursion#simple', call_info.call_sequence)
90
- assert(call_info.recursive)
90
+ assert(call_info.recursive?)
91
91
 
92
92
  method = methods[2]
93
93
  assert_equal('Kernel#sleep', method.full_name)
@@ -101,12 +101,12 @@ class RecursiveTest < TestCase
101
101
  call_info = method.call_infos[0]
102
102
  assert_equal('RecursiveTest#test_simple->SimpleRecursion#simple->Kernel#sleep', call_info.call_sequence)
103
103
  assert_equal(0, call_info.children.length)
104
- assert(!call_info.recursive)
104
+ assert(!call_info.recursive?)
105
105
 
106
106
  call_info = method.call_infos[1]
107
107
  assert_equal('RecursiveTest#test_simple->SimpleRecursion#simple->SimpleRecursion#simple->Kernel#sleep', call_info.call_sequence)
108
108
  assert_equal(0, call_info.children.length)
109
- assert(!call_info.recursive)
109
+ assert(!call_info.recursive?)
110
110
  end
111
111
 
112
112
  def test_cycle
@@ -129,7 +129,7 @@ class RecursiveTest < TestCase
129
129
  call_info = method.call_infos[0]
130
130
  assert_equal('RecursiveTest#test_cycle', call_info.call_sequence)
131
131
  assert_equal(1, call_info.children.length)
132
- assert(!call_info.recursive)
132
+ assert(!call_info.recursive?)
133
133
 
134
134
  method = methods[1]
135
135
  assert_equal('SimpleRecursion#render', method.full_name)
@@ -143,7 +143,7 @@ class RecursiveTest < TestCase
143
143
  call_info = method.call_infos[0]
144
144
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render', call_info.call_sequence)
145
145
  assert_equal(1, call_info.children.length)
146
- assert(!call_info.recursive)
146
+ assert(!call_info.recursive?)
147
147
 
148
148
  method = methods[2]
149
149
  assert_equal('Integer#times', method.full_name)
@@ -157,12 +157,12 @@ class RecursiveTest < TestCase
157
157
  call_info = method.call_infos[0]
158
158
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times', call_info.call_sequence)
159
159
  assert_equal(1, call_info.children.length)
160
- assert(!call_info.recursive)
160
+ assert(!call_info.recursive?)
161
161
 
162
162
  call_info = method.call_infos[1]
163
163
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial->Integer#times', call_info.call_sequence)
164
164
  assert_equal(1, call_info.children.length)
165
- assert(call_info.recursive)
165
+ assert(call_info.recursive?)
166
166
 
167
167
  method = methods[3]
168
168
  assert_equal('SimpleRecursion#render_partial', method.full_name)
@@ -176,17 +176,17 @@ class RecursiveTest < TestCase
176
176
  call_info = method.call_infos[0]
177
177
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial', call_info.call_sequence)
178
178
  assert_equal(3, call_info.children.length)
179
- assert(!call_info.recursive)
179
+ assert(!call_info.recursive?)
180
180
 
181
181
  call_info = method.call_infos[1]
182
182
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial->SimpleRecursion#render_partial', call_info.call_sequence)
183
183
  assert_equal(1, call_info.children.length)
184
- assert(call_info.recursive)
184
+ assert(call_info.recursive?)
185
185
 
186
186
  call_info = method.call_infos[2]
187
187
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial->Integer#times->SimpleRecursion#render_partial', call_info.call_sequence)
188
188
  assert_equal(1, call_info.children.length)
189
- assert(call_info.recursive)
189
+ assert(call_info.recursive?)
190
190
 
191
191
  method = methods[4]
192
192
  assert_equal('Kernel#sleep', method.full_name)
@@ -200,16 +200,16 @@ class RecursiveTest < TestCase
200
200
  call_info = method.call_infos[0]
201
201
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial->Kernel#sleep', call_info.call_sequence)
202
202
  assert_equal(0, call_info.children.length)
203
- assert(!call_info.recursive)
203
+ assert(!call_info.recursive?)
204
204
 
205
205
  call_info = method.call_infos[1]
206
206
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial->SimpleRecursion#render_partial->Kernel#sleep', call_info.call_sequence)
207
207
  assert_equal(0, call_info.children.length)
208
- assert(!call_info.recursive)
208
+ assert(!call_info.recursive?)
209
209
 
210
210
  call_info = method.call_infos[2]
211
211
  assert_equal('RecursiveTest#test_cycle->SimpleRecursion#render->Integer#times->SimpleRecursion#render_partial->Integer#times->SimpleRecursion#render_partial->Kernel#sleep', call_info.call_sequence)
212
212
  assert_equal(0, call_info.children.length)
213
- assert(!call_info.recursive)
213
+ assert(!call_info.recursive?)
214
214
  end
215
215
  end