test-prof 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13127b82bf827a56e15c8d060ff5a8e5be791e16deea31e899d88ecd7b76bb38
4
- data.tar.gz: 1ae017bc058b3017355c75fd871c17aad9ec3649f7b982af062d606b93d9fe2c
3
+ metadata.gz: 9571b8fb7edc3bb1f92d9a6db079791a97c3cbeb11a29763ddc3e9f88bd5780a
4
+ data.tar.gz: 4011afa256c8a5f250a6a62e9745ed254f5fe020a366e3b3e4c0a91afb227d68
5
5
  SHA512:
6
- metadata.gz: b272b01aca1fb3bf9328fcd97fc148f5f329acf66650337071568aff6e20e1f3f95c066295df4777a7bd401976879bdddb3ff43fb2ce5093bca261fe65c07a94
7
- data.tar.gz: 309644b36e328286ea52705196daa99e8af2f5237cf27f33ffa0091961f642eb29da73bcf48cb05e51896e3bfe9d709a1c08cbc1cfcd9abae1b429674a98fb2b
6
+ metadata.gz: 9008e4dbd6131efde863a100447d0658663cfbea0486e3043664ddadff097f652230ddb162ee85893883eaf49c54ddeba806ba30563199857848466786e91d34
7
+ data.tar.gz: f86145f0d6539f6de7b3cedd315583d977df01e7e64ff22c8300bbc7f29bfd946e9f738d3b3388696c3344a8ab9e444371993e90b79f204cacf06846d314b930
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 1.2.3 (2023-09-11)
6
+
7
+ - Minor fixes and dependecies upgrades.
8
+
5
9
  ## 1.2.2 (2023-06-27)
6
10
 
7
11
  - Ignore inaccessible connection pools in `before_all`. ([@bf4][])
@@ -18,7 +18,7 @@ module TestProf
18
18
  end
19
19
 
20
20
  def compile_sql(sql, binds)
21
- sql.gsub(/\?/) { binds.shift.gsub("\n", "' || char(10) || '") }
21
+ sql.gsub("?") { binds.shift.gsub("\n", "' || char(10) || '") }
22
22
  end
23
23
 
24
24
  def import(path)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "test_prof"
3
+ require "test_prof/core"
4
4
  require "test_prof/ext/float_duration"
5
5
  require "test_prof/any_fixture/dump"
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "test_prof"
3
+ require "test_prof/core"
4
4
 
5
5
  module TestProf
6
6
  # `before_all` helper configuration
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "logger"
5
+
6
+ require "test_prof/logging"
7
+ require "test_prof/utils"
8
+
9
+ # Ruby applications tests profiling tools.
10
+ #
11
+ # Contains tools to analyze factories usage, integrate with Ruby profilers,
12
+ # profile your examples using ActiveSupport notifications (if any) and
13
+ # statically analyze your code with custom RuboCop cops.
14
+ #
15
+ # Example usage:
16
+ #
17
+ # require 'test_prof'
18
+ #
19
+ # # Activate a tool by providing environment variable, e.g.
20
+ # TEST_RUBY_PROF=1 rspec ...
21
+ #
22
+ # # or manually in your code
23
+ # TestProf::RubyProf.run
24
+ #
25
+ # See other modules for more examples.
26
+ module TestProf
27
+ class << self
28
+ include Logging
29
+
30
+ def config
31
+ @config ||= Configuration.new
32
+ end
33
+
34
+ def configure
35
+ yield config
36
+ end
37
+
38
+ # Returns true if we're inside RSpec
39
+ def rspec?
40
+ defined?(RSpec::Core)
41
+ end
42
+
43
+ # Returns true if we're inside Minitest
44
+ def minitest?
45
+ defined?(Minitest)
46
+ end
47
+
48
+ # Returns true if Spring is used and not disabled
49
+ def spring?
50
+ # See https://github.com/rails/spring/blob/577cf01f232bb6dbd0ade7df2df2ac209697e741/lib/spring/binstub.rb
51
+ disabled = ENV["DISABLE_SPRING"]
52
+ defined?(::Spring::Application) && (disabled.nil? || disabled.empty? || disabled == "0")
53
+ end
54
+
55
+ # Returns the current process time
56
+ def now
57
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
58
+ end
59
+
60
+ # Require gem and shows a custom
61
+ # message if it fails to load
62
+ def require(gem_name, msg = nil)
63
+ Kernel.require gem_name
64
+ block_given? ? yield : true
65
+ rescue LoadError
66
+ log(:error, msg) if msg
67
+ false
68
+ end
69
+
70
+ # Run block only if provided env var is present and
71
+ # equal to the provided value (if any).
72
+ # Contains workaround for applications using Spring.
73
+ def activate(env_var, val = nil)
74
+ if spring?
75
+ notify_spring_detected
76
+ ::Spring.after_fork do
77
+ activate!(env_var, val) do
78
+ notify_spring_activate env_var
79
+ yield
80
+ end
81
+ end
82
+ else
83
+ activate!(env_var, val) { yield }
84
+ end
85
+ end
86
+
87
+ # Return absolute path to asset
88
+ def asset_path(filename)
89
+ ::File.expand_path(filename, ::File.join(::File.dirname(__FILE__), "..", "..", "assets"))
90
+ end
91
+
92
+ # Return a path to store artifact
93
+ def artifact_path(filename)
94
+ create_artifact_dir
95
+
96
+ with_timestamps(
97
+ ::File.join(
98
+ config.output_dir,
99
+ with_report_suffix(
100
+ filename
101
+ )
102
+ )
103
+ )
104
+ end
105
+
106
+ def create_artifact_dir
107
+ FileUtils.mkdir_p(config.output_dir)[0]
108
+ end
109
+
110
+ private
111
+
112
+ def activate!(env_var, val)
113
+ yield if ENV[env_var] && (val.nil? || val === ENV[env_var])
114
+ end
115
+
116
+ def with_timestamps(path)
117
+ return path unless config.timestamps?
118
+ timestamps = "-#{now.to_i}"
119
+ "#{path.sub(/\.\w+$/, "")}#{timestamps}#{::File.extname(path)}"
120
+ end
121
+
122
+ def with_report_suffix(path)
123
+ return path if config.report_suffix.nil?
124
+
125
+ "#{path.sub(/\.\w+$/, "")}-#{config.report_suffix}#{::File.extname(path)}"
126
+ end
127
+
128
+ def notify_spring_detected
129
+ return if instance_variable_defined?(:@spring_notified)
130
+ log :info, "Spring detected"
131
+ @spring_notified = true
132
+ end
133
+
134
+ def notify_spring_activate(env_var)
135
+ log :info, "Activating #{env_var} with `Spring.after_fork`"
136
+ end
137
+ end
138
+
139
+ # TestProf configuration
140
+ class Configuration
141
+ attr_accessor :output, # IO to write logs
142
+ :color, # Whether to colorize output or not
143
+ :output_dir, # Directory to store artifacts
144
+ :timestamps, # Whether to use timestamped names for artifacts,
145
+ :report_suffix # Custom suffix for reports/artifacts
146
+
147
+ def initialize
148
+ @output = $stdout
149
+ @color = true
150
+ @output_dir = "tmp/test_prof"
151
+ @timestamps = false
152
+ @report_suffix = ENV["TEST_PROF_REPORT"]
153
+ end
154
+
155
+ def color?
156
+ color == true && output.is_a?(IO) && output.tty?
157
+ end
158
+
159
+ def timestamps?
160
+ timestamps == true
161
+ end
162
+
163
+ def logger
164
+ @logger ||= Logger.new(output, formatter: Logging::Formatter.new)
165
+ end
166
+ end
167
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "test_prof"
3
+ require "test_prof/core"
4
4
  require "test_prof/factory_bot"
5
5
  require "test_prof/factory_all_stub/factory_bot_patch"
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "test_prof"
3
+ require "test_prof/core"
4
4
  require "test_prof/factory_bot"
5
5
  require "test_prof/factory_default/factory_bot_patch"
6
6
  require "test_prof/ext/float_duration"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "test_prof"
3
+ require "test_prof/core"
4
4
 
5
5
  module TestProf
6
6
  module Rails
@@ -6,9 +6,9 @@ module TestProf
6
6
  # Do not add these classes to resulted sample
7
7
  CORE_RUNNABLES = [
8
8
  Minitest::Test,
9
- Minitest::Unit::TestCase,
9
+ defined?(Minitest::Unit::TestCase) ? Minitest::Unit::TestCase : nil,
10
10
  Minitest::Spec
11
- ].freeze
11
+ ].compact.freeze
12
12
 
13
13
  class << self
14
14
  def suites
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "test_prof"
3
+ require "test_prof/core"
4
4
  require "test_prof/recipes/rspec/before_all"
5
5
 
6
6
  module TestProf
@@ -53,7 +53,7 @@ module TestProf
53
53
  def initialize
54
54
  @printer = ENV["TEST_RUBY_PROF"].to_sym if PRINTERS.key?(ENV["TEST_RUBY_PROF"])
55
55
  @printer ||= ENV.fetch("TEST_RUBY_PROF_PRINTER", :flat).to_sym
56
- @mode = ENV.fetch("TEST_RUBY_PROF_MODE", :wall).to_sym
56
+ @mode = ENV.fetch("TEST_RUBY_PROF_MODE", :wall).to_s
57
57
  @min_percent = 1
58
58
  @include_threads = false
59
59
  @exclude_common_methods = true
@@ -84,6 +84,22 @@ module TestProf
84
84
 
85
85
  [type, ::RubyProf.const_get(PRINTERS[type])]
86
86
  end
87
+
88
+ # Based on deprecated https://github.com/ruby-prof/ruby-prof/blob/fd3a5236a459586c5ca7ce4de506c1835129516a/lib/ruby-prof.rb#L36
89
+ def ruby_prof_mode
90
+ case mode
91
+ when "wall", "wall_time"
92
+ ::RubyProf::WALL_TIME
93
+ when "allocations"
94
+ ::RubyProf::ALLOCATIONS
95
+ when "memory"
96
+ ::RubyProf::MEMORY
97
+ when "process", "process_time"
98
+ ::RubyProf::PROCESS_TIME
99
+ else
100
+ ::RubyProf::WALL_TIME
101
+ end
102
+ end
87
103
  end
88
104
 
89
105
  # Wrapper over RubyProf profiler and printer
@@ -166,7 +182,7 @@ module TestProf
166
182
  log :warn, <<~MSG
167
183
  RubyProf is activated globally, you cannot generate per-example report.
168
184
 
169
- Make sure you haven's set the TEST_RUBY_PROF environmental variable.
185
+ Make sure you haven't set the TEST_RUBY_PROF environmental variable.
170
186
  MSG
171
187
  return
172
188
  end
@@ -177,6 +193,7 @@ module TestProf
177
193
 
178
194
  options[:include_threads] = [Thread.current] unless
179
195
  config.include_threads?
196
+ options[:measure_mode] = config.ruby_prof_mode
180
197
 
181
198
  profiler = ::RubyProf::Profile.new(options)
182
199
  profiler.exclude_common_methods! if config.exclude_common_methods?
@@ -206,7 +223,6 @@ module TestProf
206
223
 
207
224
  def init_ruby_prof
208
225
  return @initialized if instance_variable_defined?(:@initialized)
209
- ENV["RUBY_PROF_MEASURE_MODE"] = config.mode.to_s
210
226
  @initialized = TestProf.require(
211
227
  "ruby-prof",
212
228
  <<~MSG
@@ -83,7 +83,7 @@ module TestProf
83
83
  log :warn, <<~MSG
84
84
  StackProf is activated globally, you cannot generate per-example report.
85
85
 
86
- Make sure you haven's set the TEST_STACK_PROF environmental variable.
86
+ Make sure you haven't set the TEST_STACK_PROF environmental variable.
87
87
  MSG
88
88
  return false
89
89
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TestProf
4
- VERSION = "1.2.2"
4
+ VERSION = "1.2.3"
5
5
  end
data/lib/test_prof.rb CHANGED
@@ -1,171 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "fileutils"
4
- require "logger"
5
-
6
3
  require "test_prof/version"
7
- require "test_prof/logging"
8
- require "test_prof/utils"
9
-
10
- # Ruby applications tests profiling tools.
11
- #
12
- # Contains tools to analyze factories usage, integrate with Ruby profilers,
13
- # profile your examples using ActiveSupport notifications (if any) and
14
- # statically analyze your code with custom RuboCop cops.
15
- #
16
- # Example usage:
17
- #
18
- # require 'test_prof'
19
- #
20
- # # Activate a tool by providing environment variable, e.g.
21
- # TEST_RUBY_PROF=1 rspec ...
22
- #
23
- # # or manually in your code
24
- # TestProf::RubyProf.run
25
- #
26
- # See other modules for more examples.
27
- module TestProf
28
- class << self
29
- include Logging
30
-
31
- def config
32
- @config ||= Configuration.new
33
- end
34
-
35
- def configure
36
- yield config
37
- end
38
-
39
- # Returns true if we're inside RSpec
40
- def rspec?
41
- defined?(RSpec::Core)
42
- end
43
-
44
- # Returns true if we're inside Minitest
45
- def minitest?
46
- defined?(Minitest)
47
- end
48
-
49
- # Returns true if Spring is used and not disabled
50
- def spring?
51
- # See https://github.com/rails/spring/blob/577cf01f232bb6dbd0ade7df2df2ac209697e741/lib/spring/binstub.rb
52
- disabled = ENV["DISABLE_SPRING"]
53
- defined?(::Spring::Application) && (disabled.nil? || disabled.empty? || disabled == "0")
54
- end
55
-
56
- # Returns the current process time
57
- def now
58
- Process.clock_gettime(Process::CLOCK_MONOTONIC)
59
- end
60
-
61
- # Require gem and shows a custom
62
- # message if it fails to load
63
- def require(gem_name, msg = nil)
64
- Kernel.require gem_name
65
- block_given? ? yield : true
66
- rescue LoadError
67
- log(:error, msg) if msg
68
- false
69
- end
70
-
71
- # Run block only if provided env var is present and
72
- # equal to the provided value (if any).
73
- # Contains workaround for applications using Spring.
74
- def activate(env_var, val = nil)
75
- if spring?
76
- notify_spring_detected
77
- ::Spring.after_fork do
78
- activate!(env_var, val) do
79
- notify_spring_activate env_var
80
- yield
81
- end
82
- end
83
- else
84
- activate!(env_var, val) { yield }
85
- end
86
- end
87
-
88
- # Return absolute path to asset
89
- def asset_path(filename)
90
- ::File.expand_path(filename, ::File.join(::File.dirname(__FILE__), "..", "assets"))
91
- end
92
-
93
- # Return a path to store artifact
94
- def artifact_path(filename)
95
- create_artifact_dir
96
-
97
- with_timestamps(
98
- ::File.join(
99
- config.output_dir,
100
- with_report_suffix(
101
- filename
102
- )
103
- )
104
- )
105
- end
106
-
107
- def create_artifact_dir
108
- FileUtils.mkdir_p(config.output_dir)[0]
109
- end
110
-
111
- private
112
-
113
- def activate!(env_var, val)
114
- yield if ENV[env_var] && (val.nil? || val === ENV[env_var])
115
- end
116
-
117
- def with_timestamps(path)
118
- return path unless config.timestamps?
119
- timestamps = "-#{now.to_i}"
120
- "#{path.sub(/\.\w+$/, "")}#{timestamps}#{::File.extname(path)}"
121
- end
122
-
123
- def with_report_suffix(path)
124
- return path if config.report_suffix.nil?
125
-
126
- "#{path.sub(/\.\w+$/, "")}-#{config.report_suffix}#{::File.extname(path)}"
127
- end
128
-
129
- def notify_spring_detected
130
- return if instance_variable_defined?(:@spring_notified)
131
- log :info, "Spring detected"
132
- @spring_notified = true
133
- end
134
-
135
- def notify_spring_activate(env_var)
136
- log :info, "Activating #{env_var} with `Spring.after_fork`"
137
- end
138
- end
139
-
140
- # TestProf configuration
141
- class Configuration
142
- attr_accessor :output, # IO to write logs
143
- :color, # Whether to colorize output or not
144
- :output_dir, # Directory to store artifacts
145
- :timestamps, # Whether to use timestamped names for artifacts,
146
- :report_suffix # Custom suffix for reports/artifacts
147
-
148
- def initialize
149
- @output = $stdout
150
- @color = true
151
- @output_dir = "tmp/test_prof"
152
- @timestamps = false
153
- @report_suffix = ENV["TEST_PROF_REPORT"]
154
- end
155
-
156
- def color?
157
- color == true && output.is_a?(IO) && output.tty?
158
- end
159
-
160
- def timestamps?
161
- timestamps == true
162
- end
163
-
164
- def logger
165
- @logger ||= Logger.new(output, formatter: Logging::Formatter.new)
166
- end
167
- end
168
- end
4
+ require "test_prof/core"
169
5
 
170
6
  require "test_prof/ruby_prof"
171
7
  require "test_prof/stack_prof"
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.2.2
4
+ version: 1.2.3
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-06-27 00:00:00.000000000 Z
11
+ date: 2023-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -143,6 +143,7 @@ files:
143
143
  - lib/test_prof/cops/rspec/aggregate_examples/metadata_helpers.rb
144
144
  - lib/test_prof/cops/rspec/aggregate_examples/node_matchers.rb
145
145
  - lib/test_prof/cops/rspec/language.rb
146
+ - lib/test_prof/core.rb
146
147
  - lib/test_prof/event_prof.rb
147
148
  - lib/test_prof/event_prof/custom_events.rb
148
149
  - lib/test_prof/event_prof/custom_events/factory_create.rb