ruby-prof 0.16.2 → 0.17.0

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 (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