test-prof 0.1.0.pre5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +16 -4
  4. data/assets/flamegraph.demo.html +173 -0
  5. data/assets/flamegraph.template.html +196 -0
  6. data/assets/src/d3-tip.js +352 -0
  7. data/assets/src/d3-tip.min.js +1 -0
  8. data/assets/src/d3.flameGraph.css +92 -0
  9. data/assets/src/d3.flameGraph.js +459 -0
  10. data/assets/src/d3.flameGraph.min.css +1 -0
  11. data/assets/src/d3.flameGraph.min.js +1 -0
  12. data/assets/src/d3.v4.min.js +8 -0
  13. data/guides/any_fixture.md +1 -1
  14. data/guides/event_prof.md +30 -0
  15. data/guides/factory_default.md +109 -0
  16. data/guides/factory_prof.md +85 -0
  17. data/guides/rubocop.md +48 -0
  18. data/guides/ruby_prof.md +2 -0
  19. data/guides/stack_prof.md +5 -1
  20. data/guides/tag_prof.md +52 -0
  21. data/guides/tests_sampling.md +24 -0
  22. data/lib/test_prof.rb +31 -7
  23. data/lib/test_prof/cops/rspec/aggregate_failures.rb +140 -0
  24. data/lib/test_prof/event_prof/custom_events.rb +3 -3
  25. data/lib/test_prof/event_prof/custom_events/factory_create.rb +10 -8
  26. data/lib/test_prof/event_prof/custom_events/sidekiq_inline.rb +10 -8
  27. data/lib/test_prof/event_prof/custom_events/sidekiq_jobs.rb +12 -10
  28. data/lib/test_prof/event_prof/rspec.rb +5 -1
  29. data/lib/test_prof/factory_default.rb +58 -0
  30. data/lib/test_prof/factory_default/factory_girl_patch.rb +22 -0
  31. data/lib/test_prof/factory_doctor.rb +11 -9
  32. data/lib/test_prof/factory_doctor/rspec.rb +5 -3
  33. data/lib/test_prof/factory_prof.rb +140 -0
  34. data/lib/test_prof/factory_prof/factory_girl_patch.rb +12 -0
  35. data/lib/test_prof/factory_prof/printers/flamegraph.rb +71 -0
  36. data/lib/test_prof/factory_prof/printers/simple.rb +28 -0
  37. data/lib/test_prof/recipes/minitest/sample.rb +29 -0
  38. data/lib/test_prof/recipes/rspec/factory_default.rb +9 -0
  39. data/lib/test_prof/recipes/rspec/sample.rb +13 -0
  40. data/lib/test_prof/rspec_stamp/rspec.rb +5 -1
  41. data/lib/test_prof/rubocop.rb +3 -0
  42. data/lib/test_prof/ruby_prof.rb +6 -12
  43. data/lib/test_prof/stack_prof.rb +14 -7
  44. data/lib/test_prof/tag_prof.rb +8 -0
  45. data/lib/test_prof/tag_prof/rspec.rb +84 -0
  46. data/lib/test_prof/version.rb +1 -1
  47. metadata +48 -41
  48. data/.gitignore +0 -10
  49. data/.rspec +0 -2
  50. data/.rubocop.yml +0 -69
  51. data/.travis.yml +0 -5
  52. data/Gemfile +0 -4
  53. data/Rakefile +0 -8
  54. data/bin/setup +0 -8
  55. data/circle.yml +0 -11
  56. data/spec/integrations/any_fixture_spec.rb +0 -11
  57. data/spec/integrations/before_all_spec.rb +0 -11
  58. data/spec/integrations/event_prof_spec.rb +0 -100
  59. data/spec/integrations/factory_doctor_spec.rb +0 -20
  60. data/spec/integrations/fixtures/rspec/any_fixture_fixture.rb +0 -37
  61. data/spec/integrations/fixtures/rspec/before_all_fixture.rb +0 -32
  62. data/spec/integrations/fixtures/rspec/event_prof_factory_create_fixture.rb +0 -23
  63. data/spec/integrations/fixtures/rspec/event_prof_fixture.rb +0 -51
  64. data/spec/integrations/fixtures/rspec/event_prof_sidekiq_fixture.rb +0 -53
  65. data/spec/integrations/fixtures/rspec/factory_doctor_fixture.rb +0 -33
  66. data/spec/integrations/fixtures/rspec/rspec_stamp_fixture_tmpl.rb +0 -33
  67. data/spec/integrations/rspec_stamp_spec.rb +0 -53
  68. data/spec/spec_helper.rb +0 -38
  69. data/spec/support/ar_models.rb +0 -43
  70. data/spec/support/instrumenter_stub.rb +0 -19
  71. data/spec/support/integration_helpers.rb +0 -13
  72. data/spec/support/transactional_context.rb +0 -11
  73. data/spec/test_prof/any_fixture_spec.rb +0 -66
  74. data/spec/test_prof/event_prof_spec.rb +0 -138
  75. data/spec/test_prof/ext/float_duration_spec.rb +0 -12
  76. data/spec/test_prof/factory_doctor_spec.rb +0 -84
  77. data/spec/test_prof/rspec_stamp/parser_spec.rb +0 -58
  78. data/spec/test_prof/rspec_stamp_spec.rb +0 -281
  79. data/spec/test_prof/ruby_prof_spec.rb +0 -109
  80. data/spec/test_prof/stack_prof_spec.rb +0 -73
  81. data/spec/test_prof_spec.rb +0 -23
  82. data/test-prof.gemspec +0 -35
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TestProf
4
+ module FactoryProf
5
+ # Wrap #run method with FactoryProf tracking
6
+ module FactoryGirlPatch
7
+ def run(strategy = @strategy)
8
+ FactoryProf.track(strategy, @name) { super }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module TestProf::FactoryProf
6
+ module Printers
7
+ module Flamegraph # :nodoc: all
8
+ class << self
9
+ include TestProf::Logging
10
+
11
+ def dump(result)
12
+ report_data = {
13
+ total_stacks: result.stacks.size,
14
+ total: result.total
15
+ }
16
+
17
+ report_data[:roots] = convert_stacks(result)
18
+
19
+ path = generate_html(report_data)
20
+
21
+ log :info, "FactoryFlame report generated: #{path}"
22
+ end
23
+
24
+ def convert_stacks(result)
25
+ res = []
26
+
27
+ paths = {}
28
+
29
+ result.stacks.each do |stack|
30
+ parent = nil
31
+ path = ""
32
+
33
+ stack.each do |sample|
34
+ path = "#{path}/#{sample}"
35
+
36
+ if paths[path]
37
+ node = paths[path]
38
+ node[:value] += 1
39
+ else
40
+ node = { name: sample, value: 1, total: result.raw_stats.fetch(sample)[:total] }
41
+ paths[path] = node
42
+
43
+ if parent.nil?
44
+ res << node
45
+ else
46
+ parent[:children] ||= []
47
+ parent[:children] << node
48
+ end
49
+ end
50
+
51
+ parent = node
52
+ end
53
+ end
54
+
55
+ res
56
+ end
57
+
58
+ private
59
+
60
+ def generate_html(data)
61
+ template = File.read(TestProf.asset_path("flamegraph.template.html"))
62
+ template.sub! '/**REPORT-DATA**/', data.to_json
63
+
64
+ outpath = TestProf.artefact_path("factory-flame.html")
65
+ File.write(outpath, template)
66
+ outpath
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TestProf::FactoryProf
4
+ module Printers
5
+ module Simple # :nodoc: all
6
+ class << self
7
+ include TestProf::Logging
8
+
9
+ def dump(result)
10
+ msgs = []
11
+
12
+ msgs <<
13
+ <<~MSG
14
+ Factories usage
15
+
16
+ total top-level name
17
+ MSG
18
+
19
+ result.stats.each do |stat|
20
+ msgs << format("%6d %11d %30s", stat[:total], stat[:top_level], stat[:name])
21
+ end
22
+
23
+ log :info, msgs.join("\n")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TestProf
4
+ # Add ability to run only a specified number of example groups (randomly selected)
5
+ module MinitestSample
6
+ # Do not add these classes to resulted sample
7
+ CORE_RUNNABLES = [
8
+ Minitest::Test,
9
+ Minitest::Unit::TestCase,
10
+ Minitest::Spec
11
+ ].freeze
12
+
13
+ def run(*)
14
+ unless ENV['SAMPLE'].nil?
15
+ sample_size = ENV['SAMPLE'].to_i
16
+ # Make sure that sample contains only _real_ suites
17
+ runnables = Minitest::Runnable.runnables
18
+ .sample(sample_size + CORE_RUNNABLES.size)
19
+ .reject { |suite| CORE_RUNNABLES.include?(suite) }
20
+ .take(sample_size)
21
+ Minitest::Runnable.reset
22
+ runnables.each { |r| Minitest::Runnable.runnables << r }
23
+ end
24
+ super
25
+ end
26
+ end
27
+ end
28
+
29
+ Minitest.singleton_class.prepend(TestProf::MinitestSample)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_prof/factory_default"
4
+
5
+ TestProf::FactoryDefault.init
6
+
7
+ RSpec.configure do |config|
8
+ config.after(:each) { TestProf::FactoryDefault.reset }
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TestProf
4
+ # Add ability to run only a specified number of example groups (randomly selected)
5
+ module RspecSample
6
+ def ordered_example_groups
7
+ @example_groups = @example_groups.sample(ENV['SAMPLE'].to_i) unless ENV['SAMPLE'].nil?
8
+ super
9
+ end
10
+ end
11
+ end
12
+
13
+ RSpec::Core::World.prepend(TestProf::RspecSample)
@@ -84,7 +84,11 @@ TestProf.activate('RSTAMP') do
84
84
  RSpec.configure do |config|
85
85
  listener = TestProf::RSpecStamp::RSpecListener.new
86
86
 
87
- config.reporter.register_listener(listener, *TestProf::RSpecStamp::RSpecListener::NOTIFICATIONS)
87
+ config.before(:suite) do
88
+ config.reporter.register_listener(
89
+ listener, *TestProf::RSpecStamp::RSpecListener::NOTIFICATIONS
90
+ )
91
+ end
88
92
 
89
93
  config.after(:suite) { listener.stamp! }
90
94
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_prof/cops/rspec/aggregate_failures"
@@ -48,8 +48,8 @@ module TestProf
48
48
  :include_threads, :eliminate_methods
49
49
 
50
50
  def initialize
51
- @printer = :call_stack
52
- @mode = :wall
51
+ @printer = ENV.fetch('TEST_RUBY_PROF_PRINTER', :call_stack).to_sym
52
+ @mode = ENV.fetch('TEST_RUBY_PROF_MODE', :wall).to_sym
53
53
  @min_percent = 1
54
54
  @include_threads = false
55
55
  @eliminate_methods = ELIMINATE_METHODS
@@ -65,13 +65,10 @@ module TestProf
65
65
  end
66
66
 
67
67
  # Returns an array of printer type (ID) and class.
68
- # Takes ENV variable TEST_RUBY_PROF_PRINTER into account.
69
68
  def resolve_printer
70
- type = ENV['TEST_RUBY_PROF_PRINTER'] || printer
69
+ return ['custom', printer] if printer.is_a?(Module)
71
70
 
72
- return ['custom', type] if type.is_a?(Module)
73
-
74
- type = type.to_s
71
+ type = printer.to_s
75
72
 
76
73
  raise ArgumentError, "Unknown printer: #{type}" unless
77
74
  PRINTERS.key?(type)
@@ -110,11 +107,8 @@ module TestProf
110
107
  private
111
108
 
112
109
  def build_path(name, printer)
113
- TestProf.with_timestamps(
114
- File.join(
115
- TestProf.config.output_dir,
116
- "ruby-prof-report-#{printer}-#{config.mode}-#{name}.html"
117
- )
110
+ TestProf.artefact_path(
111
+ "ruby-prof-report-#{printer}-#{config.mode}-#{name}.html"
118
112
  )
119
113
  end
120
114
 
@@ -25,8 +25,8 @@ module TestProf
25
25
  attr_accessor :mode, :interval, :raw
26
26
 
27
27
  def initialize
28
- @mode = :wall
29
- @raw = false
28
+ @mode = ENV.fetch('TEST_STACK_PROF_MODE', :wall).to_sym
29
+ @raw = ENV['TEST_STACK_PROF_RAW'] == '1'
30
30
  end
31
31
  end
32
32
 
@@ -83,16 +83,23 @@ module TestProf
83
83
  ::StackProf.results(path)
84
84
 
85
85
  log :info, "StackProf report generated: #{path}"
86
+
87
+ return unless config.raw
88
+
89
+ html_path = path.gsub(/\.dump$/, '.html')
90
+
91
+ log :info, <<~MSG
92
+ Run the following command to generate a flame graph report:
93
+
94
+ stackprof --flamegraph #{path} > #{html_path} && stackprof --flamegraph-viewer=#{html_path}
95
+ MSG
86
96
  end
87
97
 
88
98
  private
89
99
 
90
100
  def build_path(name)
91
- TestProf.with_timestamps(
92
- File.join(
93
- TestProf.config.output_dir,
94
- "stack-prof-report-#{config.mode}-#{name}.dump"
95
- )
101
+ TestProf.artefact_path(
102
+ "stack-prof-report-#{config.mode}#{config.raw ? '-raw' : ''}-#{name}.dump"
96
103
  )
97
104
  end
98
105
 
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TestProf
4
+ module TagProf # :nodoc:
5
+ end
6
+ end
7
+
8
+ require "test_prof/tag_prof/rspec" if defined?(RSpec)
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_prof/ext/float_duration"
4
+
5
+ module TestProf
6
+ module TagProf
7
+ class RSpecListener # :nodoc:
8
+ include Logging
9
+ using FloatDuration
10
+
11
+ NOTIFICATIONS = %i[
12
+ example_started
13
+ example_finished
14
+ ].freeze
15
+
16
+ def initialize
17
+ @tag = ENV['TAG_PROF'].to_sym
18
+ @tags = Hash.new { |h, k| h[k] = { val: k, count: 0, time: 0.0 } }
19
+
20
+ log :info, "TagProf enabled (#{@tag})"
21
+ end
22
+
23
+ def example_started(_notification)
24
+ @ts = Time.now
25
+ end
26
+
27
+ def example_finished(notification)
28
+ return if notification.example.pending?
29
+
30
+ tag = notification.example.metadata.fetch(@tag, :__unknown__)
31
+
32
+ @tags[tag][:count] += 1
33
+ @tags[tag][:time] += (Time.now - @ts)
34
+ end
35
+
36
+ def print
37
+ msgs = []
38
+
39
+ msgs <<
40
+ <<~MSG
41
+ TagProf report for #{@tag}
42
+ MSG
43
+
44
+ msgs << format(
45
+ "%15s %12s %6s %6s %6s %12s",
46
+ @tag,
47
+ 'time', 'total', '%total', '%time', 'avg'
48
+ )
49
+
50
+ msgs << ""
51
+
52
+ total = @tags.values.inject(0) { |acc, v| acc + v[:count] }
53
+ total_time = @tags.values.inject(0) { |acc, v| acc + v[:time] }
54
+
55
+ @tags.values.sort_by { |v| -v[:time] }.each do |tag|
56
+ msgs << format(
57
+ "%15s %12s %6d %6.2f %6.2f %12s",
58
+ tag[:val], tag[:time].duration, tag[:count],
59
+ 100 * tag[:count].to_f / total,
60
+ 100 * tag[:time] / total_time,
61
+ (tag[:time] / tag[:count]).duration
62
+ )
63
+ end
64
+
65
+ log :info, msgs.join("\n")
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ # Register TagProf listener
72
+ TestProf.activate('TAG_PROF') do
73
+ RSpec.configure do |config|
74
+ listener = TestProf::TagProf::RSpecListener.new
75
+
76
+ config.before(:suite) do
77
+ config.reporter.register_listener(
78
+ listener, *TestProf::TagProf::RSpecListener::NOTIFICATIONS
79
+ )
80
+ end
81
+
82
+ config.after(:suite) { listener.print }
83
+ end
84
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TestProf
4
- VERSION = "0.1.0.pre5"
4
+ VERSION = "0.1.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-prof
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-27 00:00:00.000000000 Z
11
+ date: 2017-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.9'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: activerecord
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -146,26 +160,34 @@ executables: []
146
160
  extensions: []
147
161
  extra_rdoc_files: []
148
162
  files:
149
- - ".gitignore"
150
- - ".rspec"
151
- - ".rubocop.yml"
152
- - ".travis.yml"
153
- - Gemfile
163
+ - CHANGELOG.md
154
164
  - LICENSE.txt
155
165
  - README.md
156
- - Rakefile
157
- - bin/setup
158
- - circle.yml
166
+ - assets/flamegraph.demo.html
167
+ - assets/flamegraph.template.html
168
+ - assets/src/d3-tip.js
169
+ - assets/src/d3-tip.min.js
170
+ - assets/src/d3.flameGraph.css
171
+ - assets/src/d3.flameGraph.js
172
+ - assets/src/d3.flameGraph.min.css
173
+ - assets/src/d3.flameGraph.min.js
174
+ - assets/src/d3.v4.min.js
159
175
  - guides/any_fixture.md
160
176
  - guides/before_all.md
161
177
  - guides/event_prof.md
178
+ - guides/factory_default.md
162
179
  - guides/factory_doctor.md
180
+ - guides/factory_prof.md
163
181
  - guides/rspec_stamp.md
182
+ - guides/rubocop.md
164
183
  - guides/ruby_prof.md
165
184
  - guides/stack_prof.md
185
+ - guides/tag_prof.md
186
+ - guides/tests_sampling.md
166
187
  - lib/test-prof.rb
167
188
  - lib/test_prof.rb
168
189
  - lib/test_prof/any_fixture.rb
190
+ - lib/test_prof/cops/rspec/aggregate_failures.rb
169
191
  - lib/test_prof/event_prof.rb
170
192
  - lib/test_prof/event_prof/custom_events.rb
171
193
  - lib/test_prof/event_prof/custom_events/factory_create.rb
@@ -175,48 +197,33 @@ files:
175
197
  - lib/test_prof/event_prof/minitest.rb
176
198
  - lib/test_prof/event_prof/rspec.rb
177
199
  - lib/test_prof/ext/float_duration.rb
200
+ - lib/test_prof/factory_default.rb
201
+ - lib/test_prof/factory_default/factory_girl_patch.rb
178
202
  - lib/test_prof/factory_doctor.rb
179
203
  - lib/test_prof/factory_doctor/factory_girl_patch.rb
180
204
  - lib/test_prof/factory_doctor/minitest.rb
181
205
  - lib/test_prof/factory_doctor/rspec.rb
206
+ - lib/test_prof/factory_prof.rb
207
+ - lib/test_prof/factory_prof/factory_girl_patch.rb
208
+ - lib/test_prof/factory_prof/printers/flamegraph.rb
209
+ - lib/test_prof/factory_prof/printers/simple.rb
182
210
  - lib/test_prof/logging.rb
211
+ - lib/test_prof/recipes/minitest/sample.rb
183
212
  - lib/test_prof/recipes/rspec/any_fixture.rb
184
213
  - lib/test_prof/recipes/rspec/before_all.rb
214
+ - lib/test_prof/recipes/rspec/factory_default.rb
215
+ - lib/test_prof/recipes/rspec/sample.rb
185
216
  - lib/test_prof/rspec_stamp.rb
186
217
  - lib/test_prof/rspec_stamp/parser.rb
187
218
  - lib/test_prof/rspec_stamp/rspec.rb
219
+ - lib/test_prof/rubocop.rb
188
220
  - lib/test_prof/ruby_prof.rb
189
221
  - lib/test_prof/ruby_prof/rspec.rb
190
222
  - lib/test_prof/stack_prof.rb
191
223
  - lib/test_prof/stack_prof/rspec.rb
224
+ - lib/test_prof/tag_prof.rb
225
+ - lib/test_prof/tag_prof/rspec.rb
192
226
  - lib/test_prof/version.rb
193
- - spec/integrations/any_fixture_spec.rb
194
- - spec/integrations/before_all_spec.rb
195
- - spec/integrations/event_prof_spec.rb
196
- - spec/integrations/factory_doctor_spec.rb
197
- - spec/integrations/fixtures/rspec/any_fixture_fixture.rb
198
- - spec/integrations/fixtures/rspec/before_all_fixture.rb
199
- - spec/integrations/fixtures/rspec/event_prof_factory_create_fixture.rb
200
- - spec/integrations/fixtures/rspec/event_prof_fixture.rb
201
- - spec/integrations/fixtures/rspec/event_prof_sidekiq_fixture.rb
202
- - spec/integrations/fixtures/rspec/factory_doctor_fixture.rb
203
- - spec/integrations/fixtures/rspec/rspec_stamp_fixture_tmpl.rb
204
- - spec/integrations/rspec_stamp_spec.rb
205
- - spec/spec_helper.rb
206
- - spec/support/ar_models.rb
207
- - spec/support/instrumenter_stub.rb
208
- - spec/support/integration_helpers.rb
209
- - spec/support/transactional_context.rb
210
- - spec/test_prof/any_fixture_spec.rb
211
- - spec/test_prof/event_prof_spec.rb
212
- - spec/test_prof/ext/float_duration_spec.rb
213
- - spec/test_prof/factory_doctor_spec.rb
214
- - spec/test_prof/rspec_stamp/parser_spec.rb
215
- - spec/test_prof/rspec_stamp_spec.rb
216
- - spec/test_prof/ruby_prof_spec.rb
217
- - spec/test_prof/stack_prof_spec.rb
218
- - spec/test_prof_spec.rb
219
- - test-prof.gemspec
220
227
  homepage: http://github.com/palkan/test-prof
221
228
  licenses:
222
229
  - MIT
@@ -229,15 +236,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
229
236
  requirements:
230
237
  - - ">="
231
238
  - !ruby/object:Gem::Version
232
- version: '0'
239
+ version: 2.3.0
233
240
  required_rubygems_version: !ruby/object:Gem::Requirement
234
241
  requirements:
235
- - - ">"
242
+ - - ">="
236
243
  - !ruby/object:Gem::Version
237
- version: 1.3.1
244
+ version: '0'
238
245
  requirements: []
239
246
  rubyforge_project:
240
- rubygems_version: 2.6.4
247
+ rubygems_version: 2.6.11
241
248
  signing_key:
242
249
  specification_version: 4
243
250
  summary: Ruby applications tests profiling tools