test-prof 0.1.0.pre5 → 0.1.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 (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