test-prof 0.6.0.pre1 → 0.6.0

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: cb97ad09442483992d4d0618362de046dae7a5ed4e17f909a8bcbbffe9fc827f
4
- data.tar.gz: d477bbede59c0b94f21181e830bef6f346c1abb6d6fb1c683a582ad237ec9c2a
3
+ metadata.gz: 03ab3753dd924402ef2d09973165d82d17d2e72c26ad317e6513111ff1b93166
4
+ data.tar.gz: 93cbd1952a5054e0c2f76058e227a6e03c0bb6b050f20a74d54fd57b85401e69
5
5
  SHA512:
6
- metadata.gz: d0f049f6e75ed08c3474f58cdbca386ca3c7418223abd51a3e9c7d3d8ab207c68527133b2901de725531044a778de48b8dbf3eab1243bdc16e60f53ed9e2ea80
7
- data.tar.gz: e97987b38878cdf5b29328204fa39d6e364ddbc84fff8bfe322449b02ec2bc4203417f35cc2d9fb82f79dc88c99e4241a1f5979ea11987175d5c806a8ec56965
6
+ metadata.gz: 6f6a2ed0ba54bf9c4e0633b842fa5c961ab832f4a45013e44ae68804c1714b6708be22505c7b6de38a6e90a2661f64c684efefbb07d1569ef22cbdf17d5cef57
7
+ data.tar.gz: 79fa0b40361b533cde8f26c45ed66add0a70cad73f59c5ddcabe6f2997fb944293b36a33f557e4870667a7f023e84219216ef6d4e1ee9d54b316ac038cb281e3
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.6.0 (2018-06-29)
6
+
7
+ ### Features
8
+
5
9
  - Add `EventProf.monitor` to instrument arbitrary methods. ([@palkan][])
6
10
 
7
11
  Add custom instrumetation easily:
@@ -17,14 +21,20 @@ end
17
21
  TestProf::EventProf.monitor(Work, "my.work", :do)
18
22
  ```
19
23
 
24
+ [📝 Docs](https://test-prof.evilmartians.io/#/event_prof?id=profile-arbitrary-methods)
25
+
20
26
  - Adapterize `before_all`. ([@palkan][])
21
27
 
22
28
  Now it's possible to write your own adapter for `before_all` to manage
23
29
  transactions.
24
30
 
31
+ [📝 Docs](https://test-prof.evilmartians.io/#/before_all?id=database-adapters)
32
+
25
33
  - Add `before_all` for Minitest. ([@palkan][])
26
34
 
27
- - Refactor `:with_clean_fixture` to clean data once per group. ([@palkan][])
35
+ [📝 Docs](https://test-prof.evilmartians.io/#/before_all?id=minitest-experimental)
36
+
37
+ ### Fixes & Improvements
28
38
 
29
39
  - Show top `let` declarations per example group in RSpecDissect profiler. ([@palkan][])
30
40
 
@@ -49,8 +59,18 @@ TestProf::RSpecDissect.configure do |config|
49
59
  end
50
60
  ```
51
61
 
62
+ - [Fix [#80](https://github.com/palkan/test-prof/issues/80)] Added ability to preserve traits. ([@Vasfed][])
63
+
64
+ Disabled by default for compatibility. Enable globally by `FactoryDefault.preserve_traits = true` or for single `create_default`: `create_default(:user, preserve_traits: true)`
65
+
66
+ When enabled - default object will be used only when there's no [traits](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#traits) in association.
67
+
52
68
  - Add ability to run only `let` or `before` profiler with RSpecDissect. ([@palkan][])
53
69
 
70
+ - Collect _raw_ data with StackProf by default. ([@palkan][])
71
+
72
+ - Refactor `:with_clean_fixture` to clean data once per group. ([@palkan][])
73
+
54
74
  - [Fix [#75](https://github.com/palkan/test-prof/issues/75)] Fix `RSpec/Aggregate` failures with non-regular examples. ([@palkan][])
55
75
 
56
76
  Do not take into account `xit`, `pending`, `its`, etc. examples,
@@ -312,3 +332,4 @@ Ensure output dir exists in `#artifact_path` method.
312
332
  [@IDolgirev]: https://github.com/IDolgirev
313
333
  [@desoleary]: https://github.com/desoleary
314
334
  [@rabotyaga]: https://github.com/rabotyaga
335
+ [@Vasfed]: https://github.com/Vasfed
data/README.md CHANGED
@@ -32,7 +32,7 @@ Of course, we have some [solutions](https://test-prof.evilmartians.io/#/?id=reci
32
32
 
33
33
  Supported Ruby versions:
34
34
 
35
- - Ruby (MRI) >= 2.2.0
35
+ - Ruby (MRI) >= 2.2.0 (**NOTE:** the next release will require 2.3+)
36
36
 
37
37
  - JRuby >= 9.1.0.0
38
38
 
@@ -9,18 +9,21 @@ module TestProf
9
9
  module FactoryDefault
10
10
  module DefaultSyntax # :nodoc:
11
11
  def create_default(name, *args, &block)
12
- set_factory_default(
13
- name,
14
- TestProf::FactoryBot.create(name, *args, &block)
15
- )
12
+ options = args.extract_options!
13
+ preserve = options.delete(:preserve_traits)
14
+
15
+ obj = TestProf::FactoryBot.create(name, *args, options, &block)
16
+ set_factory_default(name, obj, preserve_traits: preserve)
16
17
  end
17
18
 
18
- def set_factory_default(name, obj)
19
- FactoryDefault.register(name, obj)
19
+ def set_factory_default(name, obj, preserve_traits: nil)
20
+ FactoryDefault.register(name, obj, preserve_traits: preserve_traits)
20
21
  end
21
22
  end
22
23
 
23
24
  class << self
25
+ attr_accessor :preserve_traits
26
+
24
27
  def init
25
28
  TestProf::FactoryBot::Syntax::Methods.include DefaultSyntax
26
29
  TestProf::FactoryBot.extend DefaultSyntax
@@ -29,18 +32,24 @@ module TestProf
29
32
  TestProf::FactoryBot::Strategy::Stub.prepend StrategyExt
30
33
 
31
34
  @store = {}
35
+ # default is false to retain backward compatibility
36
+ @preserve_traits = false
32
37
  end
33
38
 
34
- def register(name, obj)
35
- store[name] = obj
39
+ def register(name, obj, **options)
40
+ options[:preserve_traits] = true if FactoryDefault.preserve_traits
41
+ store[name] = { object: obj, **options }
42
+ obj
36
43
  end
37
44
 
38
- def get(name)
39
- store[name]
40
- end
45
+ def get(name, traits = nil)
46
+ record = store[name]
47
+ return unless record
41
48
 
42
- def exists?(name)
43
- store.key?(name)
49
+ if traits && !traits.empty?
50
+ return if FactoryDefault.preserve_traits || record[:preserve_traits]
51
+ end
52
+ record[:object]
44
53
  end
45
54
 
46
55
  def remove(name)
@@ -7,6 +7,10 @@ module TestProf
7
7
  def name
8
8
  @name
9
9
  end
10
+
11
+ def traits
12
+ @traits
13
+ end
10
14
  end
11
15
  end
12
16
 
@@ -14,8 +18,7 @@ module TestProf
14
18
 
15
19
  module StrategyExt
16
20
  def association(runner)
17
- return super unless FactoryDefault.exists?(runner.name)
18
- FactoryDefault.get(runner.name)
21
+ FactoryDefault.get(runner.name, runner.traits) || super
19
22
  end
20
23
  end
21
24
  end
@@ -1,13 +1,46 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Shared example for RSpec to profile specific examples with RubyProf
4
- RSpec.shared_context "ruby-prof", rprof: true do
5
- prepend_before do
6
- @ruby_prof_report = TestProf::RubyProf.profile
3
+ module TestProf
4
+ module RubyProf
5
+ # Reporter for RSpec to profile specific examples with RubyProf
6
+ class Listener # :nodoc:
7
+ NOTIFICATIONS = %i[
8
+ example_started
9
+ example_failed
10
+ example_passed
11
+ ].freeze
12
+
13
+ def example_started(notification)
14
+ return unless profile?(notification.example)
15
+ notification.example.metadata[:rprof_report] =
16
+ TestProf::RubyProf.profile
17
+ end
18
+
19
+ def example_finished(notification)
20
+ return unless profile?(notification.example)
21
+ notification.example.metadata[:rprof_report].dump(
22
+ notification.example.full_description.parameterize
23
+ )
24
+ end
25
+
26
+ alias example_passed example_finished
27
+ alias example_failed example_finished
28
+
29
+ private
30
+
31
+ def profile?(example)
32
+ example.metadata.key?(:rprof)
33
+ end
34
+ end
7
35
  end
36
+ end
37
+
38
+ RSpec.configure do |config|
39
+ config.before(:suite) do
40
+ listener = TestProf::RubyProf::Listener.new
8
41
 
9
- append_after do |ex|
10
- next unless @ruby_prof_report
11
- @ruby_prof_report.dump ex.full_description.parameterize
42
+ config.reporter.register_listener(
43
+ listener, *TestProf::RubyProf::Listener::NOTIFICATIONS
44
+ )
12
45
  end
13
46
  end
@@ -29,8 +29,7 @@ module TestProf
29
29
  def initialize
30
30
  @mode = ENV.fetch('TEST_STACK_PROF_MODE', :wall).to_sym
31
31
  @target = ENV['TEST_STACK_PROF'] == 'boot' ? :boot : :suite
32
- @raw = ENV['TEST_STACK_PROF'] == 'raw' || ENV['TEST_STACK_PROF_RAW'] == '1'
33
- @raw = true if boot?
32
+ @raw = ENV['TEST_STACK_PROF_RAW'] != '0'
34
33
  end
35
34
 
36
35
  def raw?
@@ -1,14 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Shared example for RSpec to profile specific examples with StackProf
4
- RSpec.shared_context "stackprof", sprof: true do
5
- prepend_before do
6
- @stack_prof_report = TestProf::StackProf.profile
3
+ module TestProf
4
+ module StackProf
5
+ # Reporter for RSpec to profile specific examples with StackProf
6
+ class Listener # :nodoc:
7
+ NOTIFICATIONS = %i[
8
+ example_started
9
+ example_failed
10
+ example_passed
11
+ ].freeze
12
+
13
+ def example_started(notification)
14
+ TestProf::StackProf.profile if profile?(notification.example)
15
+ end
16
+
17
+ def example_finished(notification)
18
+ return unless profile?(notification.example)
19
+ TestProf::StackProf.dump(
20
+ notification.example.full_description.parameterize
21
+ )
22
+ end
23
+
24
+ alias example_passed example_finished
25
+ alias example_failed example_finished
26
+
27
+ private
28
+
29
+ def profile?(example)
30
+ example.metadata.key?(:sprof)
31
+ end
32
+ end
7
33
  end
34
+ end
35
+
36
+ RSpec.configure do |config|
37
+ config.before(:suite) do
38
+ listener = TestProf::StackProf::Listener.new
8
39
 
9
- append_after do |ex|
10
- next unless @stack_prof_report
11
- TestProf::StackProf.dump ex.full_description.parameterize
40
+ config.reporter.register_listener(
41
+ listener, *TestProf::StackProf::Listener::NOTIFICATIONS
42
+ )
12
43
  end
13
44
  end
14
45
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TestProf
4
- VERSION = "0.6.0.pre1".freeze
4
+ VERSION = "0.6.0".freeze
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.6.0.pre1
4
+ version: 0.6.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: 2018-06-24 00:00:00.000000000 Z
11
+ date: 2018-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -209,9 +209,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
209
209
  version: 2.2.0
210
210
  required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  requirements:
212
- - - ">"
212
+ - - ">="
213
213
  - !ruby/object:Gem::Version
214
- version: 1.3.1
214
+ version: '0'
215
215
  requirements: []
216
216
  rubyforge_project:
217
217
  rubygems_version: 2.7.6