test-prof 1.3.0 → 1.3.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0678bc968a267ebeece00e12338f6408683140428ecdd041ece64c70e6bb91c0'
4
- data.tar.gz: 3ab5bc88b7b5dea557847f05a16d7fc3e4c6c9212115cd16984a56b7dd7b1737
3
+ metadata.gz: ed617176a00461b30a96b07f086b52ea89d28fff7d1e4b085110e1b2333b6c60
4
+ data.tar.gz: c2e425a439407505f4ac1ecbfe25d84517343d7e9d7f1260ce675382f3ee6f1f
5
5
  SHA512:
6
- metadata.gz: 5b32e7e689cef27e72ce5f7e65ca0463bae7b83dfcaf77eba17aa0cc9bae1b74d6223b6b141e805debb7640b74b75be34bf238a8f41cb3efaf0386929935d814
7
- data.tar.gz: 34200774bc30c39acc48109fbc5031fd8f48abb5f7175799a1e1bbfd7650a11a441c9ba63638bf186d78ef5cd15b7b33e64782c781a7f28bd43e43cb6d1e5588
6
+ metadata.gz: 3548abd19a6f283dd230e340a0651fc2196b7253bc4fcf4f5115d53a3e55b35e43ece87a875d4267a00edfa5105c303365bc1b7e9f787a0fcd5d3d8ffd86634b
7
+ data.tar.gz: 911ed9f79a48b4fd72b1ea7885f2eb5d3f75410421946cdd61966b9ffc50a245bb1f0c88b93b256ec5b06159267b16ccfcf129c06fde3d021605f1b15375c7cf
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 1.3.2 (2024-03-08) 🌷
6
+
7
+ - Add Minitest support for TagProf. ([@lioneldebauge][])
8
+
9
+ ## 1.3.1 (2023-12-12)
10
+
11
+ - Add support for dumping FactoryProf results in JSON format. ([@uzushino][])
12
+
5
13
  ## 1.3.0 (2023-11-21)
6
14
 
7
15
  - Add Vernier integration. ([@palkan][])
@@ -376,3 +384,5 @@ See [changelog](https://github.com/test-prof/test-prof/blob/v0.8.0/CHANGELOG.md)
376
384
  [@peret]: https://github.com/peret
377
385
  [@bf4]: https://github.com/bf4
378
386
  [@Vankiru]: https://github.com/Vankiru
387
+ [@uzushino]: https://github.com/uzushino
388
+ [@lioneldebauge]: https://github.com/lioneldebauge
@@ -3,6 +3,7 @@
3
3
  require "test_prof/event_prof/minitest"
4
4
  require "test_prof/factory_doctor/minitest"
5
5
  require "test_prof/memory_prof/minitest"
6
+ require "test_prof/tag_prof/minitest"
6
7
 
7
8
  module Minitest # :nodoc:
8
9
  module TestProf # :nodoc:
@@ -16,6 +17,7 @@ module Minitest # :nodoc:
16
17
  opts[:sample] = true if ENV["SAMPLE"] || ENV["SAMPLE_GROUPS"]
17
18
  opts[:mem_prof_mode] = ENV["TEST_MEM_PROF"] if ENV["TEST_MEM_PROF"]
18
19
  opts[:mem_prof_top_count] = ENV["TEST_MEM_PROF_COUNT"] if ENV["TEST_MEM_PROF_COUNT"]
20
+ opts[:tag_prof] = true if ENV["TAG_PROF"] == "type"
19
21
  end
20
22
  end
21
23
  end
@@ -50,6 +52,7 @@ module Minitest # :nodoc:
50
52
  reporter << TestProf::EventProfReporter.new(options[:io], options) if options[:event]
51
53
  reporter << TestProf::FactoryDoctorReporter.new(options[:io], options) if options[:fdoc]
52
54
  reporter << TestProf::MemoryProfReporter.new(options[:io], options) if options[:mem_prof_mode]
55
+ reporter << Minitest::TestProf::TagProfReporter.new(options[:io], options) if options[:tag_prof]
53
56
 
54
57
  ::TestProf::MinitestSample.call if options[:sample]
55
58
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_prof/ext/float_duration"
4
+
5
+ module TestProf::FactoryProf
6
+ module Printers
7
+ module Json # :nodoc: all
8
+ class << self
9
+ using TestProf::FloatDuration
10
+ include TestProf::Logging
11
+
12
+ def dump(result, start_time:)
13
+ return log(:info, "No factories detected") if result.raw_stats == {}
14
+
15
+ outpath = TestProf.artifact_path("test-prof.result.json")
16
+ File.write(outpath, convert_stats(result, start_time).to_json)
17
+
18
+ log :info, "Profile results to JSON: #{outpath}"
19
+ end
20
+
21
+ def convert_stats(result, start_time)
22
+ total_run_time = TestProf.now - start_time
23
+ total_count = result.stats.sum { |stat| stat[:total_count] }
24
+ total_top_level_count = result.stats.sum { |stat| stat[:top_level_count] }
25
+ total_time = result.stats.sum { |stat| stat[:top_level_time] }
26
+ total_uniq_factories = result.stats.map { |stat| stat[:name] }.uniq.count
27
+
28
+ {
29
+ total_count: total_count,
30
+ total_top_level_count: total_top_level_count,
31
+ total_time: total_time.duration,
32
+ total_run_time: total_run_time.duration,
33
+ total_uniq_factories: total_uniq_factories,
34
+
35
+ stats: result.stats
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -3,6 +3,7 @@
3
3
  require "test_prof/factory_prof/printers/simple"
4
4
  require "test_prof/factory_prof/printers/flamegraph"
5
5
  require "test_prof/factory_prof/printers/nate_heckler"
6
+ require "test_prof/factory_prof/printers/json"
6
7
  require "test_prof/factory_prof/factory_builders/factory_bot"
7
8
  require "test_prof/factory_prof/factory_builders/fabrication"
8
9
 
@@ -25,6 +26,8 @@ module TestProf
25
26
  Printers::Flamegraph
26
27
  when "nate_heckler"
27
28
  Printers::NateHeckler
29
+ when "json"
30
+ Printers::Json
28
31
  else
29
32
  Printers::Simple
30
33
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Minitest
4
+ module TestProf
5
+ class TagProfReporter < BaseReporter # :nodoc:
6
+ attr_reader :results
7
+
8
+ def initialize(io = $stdout, _options = {})
9
+ super
10
+ @results = ::TestProf::TagProf::Result.new("type")
11
+
12
+ if event_prof_activated?
13
+ require "test_prof/event_prof"
14
+ @current_group_id = nil
15
+ @events_profiler = configure_profiler
16
+ @results = ::TestProf::TagProf::Result.new("type", @events_profiler.events)
17
+ end
18
+ end
19
+
20
+ def prerecord(group, example)
21
+ return unless event_prof_activated?
22
+
23
+ # enable event profiling
24
+ @events_profiler.group_started(true)
25
+ end
26
+
27
+ def record(result)
28
+ results.track(main_folder_path(result), time: result.time, events: fetch_events_data)
29
+ @events_profiler.group_started(nil) if event_prof_activated? # reset and disable event profilers
30
+ end
31
+
32
+ def report
33
+ printer = (ENV["TAG_PROF_FORMAT"] == "html") ? ::TestProf::TagProf::Printers::HTML : ::TestProf::TagProf::Printers::Simple
34
+ printer.dump(results)
35
+ end
36
+
37
+ private
38
+
39
+ def main_folder_path(result)
40
+ return :__unknown__ if absolute_path_from(result).nil?
41
+
42
+ absolute_path_from(result)
43
+ end
44
+
45
+ def absolute_path_from(result)
46
+ absolute_path = File.expand_path(result.source_location.first)
47
+ absolute_path.slice(/(?<=(?:spec|test)\/)\w*/)
48
+ end
49
+
50
+ def configure_profiler
51
+ ::TestProf::EventProf::CustomEvents.activate_all(tag_prof_event)
52
+ ::TestProf::EventProf.build(tag_prof_event)
53
+ end
54
+
55
+ def event_prof_activated?
56
+ return false if tag_prof_event.nil?
57
+
58
+ !tag_prof_event.empty?
59
+ end
60
+
61
+ def tag_prof_event
62
+ ENV["TAG_PROF_EVENT"]
63
+ end
64
+
65
+ def fetch_events_data
66
+ return {} unless @events_profiler
67
+
68
+ @events_profiler.profilers.map do |profiler|
69
+ [profiler.event, profiler.time || 0.0]
70
+ end.to_h
71
+ end
72
+ end
73
+ end
74
+ end
@@ -21,8 +21,8 @@ module TestProf
21
21
  def track(tag, time:, events: {})
22
22
  data[tag][:count] += 1
23
23
  data[tag][:time] += time
24
- events.each do |k, v|
25
- data[tag][k] += v
24
+ events.each do |event, time|
25
+ data[tag][event] += time
26
26
  end
27
27
  end
28
28
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TestProf
4
- VERSION = "1.3.0"
4
+ VERSION = "1.3.2"
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: 1.3.0
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-21 00:00:00.000000000 Z
11
+ date: 2024-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -177,6 +177,7 @@ files:
177
177
  - lib/test_prof/factory_prof/factory_builders/factory_bot.rb
178
178
  - lib/test_prof/factory_prof/nate_heckler.rb
179
179
  - lib/test_prof/factory_prof/printers/flamegraph.rb
180
+ - lib/test_prof/factory_prof/printers/json.rb
180
181
  - lib/test_prof/factory_prof/printers/nate_heckler.rb
181
182
  - lib/test_prof/factory_prof/printers/simple.rb
182
183
  - lib/test_prof/logging.rb
@@ -212,6 +213,7 @@ files:
212
213
  - lib/test_prof/stack_prof.rb
213
214
  - lib/test_prof/stack_prof/rspec.rb
214
215
  - lib/test_prof/tag_prof.rb
216
+ - lib/test_prof/tag_prof/minitest.rb
215
217
  - lib/test_prof/tag_prof/printers/html.rb
216
218
  - lib/test_prof/tag_prof/printers/simple.rb
217
219
  - lib/test_prof/tag_prof/result.rb