test-prof 0.6.0.pre1 → 0.6.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.
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