rspec-activerecord-formatter 0.1.0 → 0.2.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
- SHA1:
3
- metadata.gz: 215510c55bb74fa62a54c9237eed2f99f795916c
4
- data.tar.gz: 57949cc504f9e0f5dfefa1e6bb94482c95279b7f
2
+ SHA256:
3
+ metadata.gz: 3c8cb5d2c352d6067bb7b6a1005ce9d80f257ef818e94da07b03530e705d5934
4
+ data.tar.gz: a21d87f0badc6b92de0906f3bc7782b6c13dbe89ee40b59ec1b07bf2a40ca1f1
5
5
  SHA512:
6
- metadata.gz: 5eae4c34002844511d9f683e2c22dc7135825ce36ed46c24f83239fe476551161940ce10dce02881e0f951d6952a189fb19d0ac8c586d5c443bc83452b2e7ffc
7
- data.tar.gz: adac5f5c0819573703708c2ee6d34362ff0f127f9c0b67f2c16126901cee2dd84a4ccde4f208120963b1d0b0691722fc9dbc2643cb2b4dd3353a9bec8f6c9bd7
6
+ metadata.gz: d31c6f727a9c54acde509ce7f8b66185eedeb7825ff18af6b7da27f583ed460e38fafcb17a65bd66b0ceadef2b5a2a2db9cdd7a6821d199568e4b2170a81f23f
7
+ data.tar.gz: 1265045f094776141c99699dc6f35514de052cb60c7c40893808bb6ebe4ace017c2244c55d3681adb16c3cc7472dcd197bd3e41566ee6cd17ad9a4e102cf556e
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  .DS_Store
2
+ Gemfile.lock
3
+ coverage
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.simplecov ADDED
@@ -0,0 +1,10 @@
1
+ require 'coveralls'
2
+
3
+ SimpleCov.formatters = [
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+
8
+ SimpleCov.start do
9
+ add_filter './spec'
10
+ end
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ rvm:
5
+ - 2.3.3
6
+
7
+ before_install: gem install bundler
8
+ script: bundle exec rspec
data/README.md CHANGED
@@ -22,14 +22,18 @@ Normal bundle stuff.
22
22
  Usage
23
23
  ------------
24
24
 
25
- The current answer appears to be changing your `.rspec` initializer to include the following:
25
+ The current answer is to change your `.rspec` initializer to include the following:
26
26
 
27
- --require rails_helper
28
- --format ActiveRecordFormatter
27
+ --require rails_helper
28
+ --format ActiveRecordFormatter
29
29
 
30
30
  We have to include the rails_helper so that ActiveRecord is loaded prior to trying to load the
31
31
  formatter. That way, we can hook into AR creations.
32
32
 
33
+ You can also run the formatter as a one-off option to rspec:
34
+
35
+ rspec path/to/example_spec.rb --require rails_helper --format ActiveRecordFormatter
36
+
33
37
  Once you set the formatter, you should now see the number of objects created and total queries
34
38
  for each of your tests:
35
39
 
@@ -43,8 +47,10 @@ Next Steps
43
47
  ------------
44
48
  * The method I was using to count AR objects doesn't work well with DatabaseCleaner when not explicitly wiring the library into `before` blocks.
45
49
  I'd like to be able to go back to a method other than scanning for `INSERT INTO` strings.
46
- * Configuration, especially of the aligning of the metric output (to outdent it optionally).
50
+ * Configuration, especially formatting the output to optionally outdent the counts.
47
51
  * Add a `--profile`-like behavior to output the most offending tests.
52
+ * The current dependency versions are a vague guess. They can and should clearly be more lenient.
53
+ * I dunno, tests.
48
54
 
49
55
  Contributing
50
56
  ------------
@@ -0,0 +1 @@
1
+ require 'rspec/activerecord/formatter'
@@ -1,5 +1,71 @@
1
- require_relative "formatter/collector"
2
- require_relative "formatter/formatter"
1
+ require_relative "helpers/collector"
3
2
 
4
- module ActiveRecordFormatter
3
+ class ActiveRecordFormatter < ::RSpec::Core::Formatters::DocumentationFormatter
4
+ attr_reader :collector, :colorizer, :configuration
5
+
6
+ ::RSpec::Core::Formatters.register self, :start, :dump_summary,
7
+ :example_started, :example_passed, :example_failed
8
+
9
+ def initialize(output)
10
+ super
11
+
12
+ @colorizer = ::RSpec::Core::Formatters::ConsoleCodes
13
+ @collector = ActiveRecordFormatterHelpers::Collector.new
14
+ end
15
+
16
+ def start(start_notification)
17
+ output.puts "Recording and reporting ActiveRecord select and creation counts."
18
+ end
19
+
20
+ def example_started(example)
21
+ collector.reset_example
22
+ end
23
+
24
+ def dump_summary(summary)
25
+ formatted = "\nFinished in #{summary.formatted_duration} " \
26
+ "(files took #{summary.formatted_load_time} to load)\n" \
27
+ "#{colorized_expanded_totals(summary)}\n"
28
+
29
+ unless summary.failed_examples.empty?
30
+ formatted << summary.colorized_rerun_commands(colorizer) << "\n"
31
+ end
32
+
33
+ output.puts formatted
34
+ end
35
+
36
+ protected
37
+
38
+ def passed_output(example)
39
+ "#{current_indentation}#{example_counts}" +
40
+ colorizer.wrap(example.description.strip, :success)
41
+ end
42
+
43
+ def failure_output(example)
44
+ "#{current_indentation}#{example_counts}" +
45
+ colorizer.wrap("#{example.description.strip} (FAILED - #{next_failure_index})", :failure)
46
+ end
47
+
48
+ def example_counts(suffix: " ")
49
+ "(%02d, %02d)#{suffix}" % [collector.objects_count, collector.query_count]
50
+ end
51
+
52
+ def colorized_expanded_totals(summary)
53
+ if summary.failure_count > 0
54
+ colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.failure_color)
55
+ elsif summary.pending_count > 0
56
+ colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.pending_color)
57
+ else
58
+ colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.success_color)
59
+ end
60
+ end
61
+
62
+ def expanded_totals_line(summary)
63
+ summary_text = ::RSpec::Core::Formatters::Helpers.pluralize(summary.example_count, "example")
64
+ summary_text << ", " << ::RSpec::Core::Formatters::Helpers.pluralize(summary.failure_count, "failure")
65
+ summary_text << ", #{summary.pending_count} pending" if summary.pending_count > 0
66
+ summary_text << ", #{collector.total_objects} AR objects"
67
+ summary_text << ", #{collector.total_queries} AR queries"
68
+
69
+ summary_text
70
+ end
5
71
  end
@@ -1,6 +1,6 @@
1
1
  require 'active_support/notifications'
2
2
 
3
- module ActiveRecordFormatter
3
+ module ActiveRecordFormatterHelpers
4
4
  class Collector
5
5
  attr_reader :query_count, :objects_count, :total_queries, :total_objects
6
6
  SKIP_QUERIES = ["SELECT tablename FROM pg_tables", "select sum(ct) from (select count(*) ct from"]
@@ -3,12 +3,10 @@
3
3
  lib_dir = File.join(File.dirname(__FILE__),'lib')
4
4
  $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
5
5
 
6
- require 'rspec/activerecord/formatter/version'
7
-
8
6
  Gem::Specification.new do |gem|
9
7
 
10
8
  gem.name = "rspec-activerecord-formatter"
11
- gem.version = ActiveRecordFormatter::VERSION
9
+ gem.version = "0.2.0"
12
10
 
13
11
  gem.summary = "Adds object creations and queries to Rspec output."
14
12
  gem.description = "Creates a new formatter for ActiveRecord that can help you diagnose performance issues in RSpec"
@@ -31,4 +29,6 @@ Gem::Specification.new do |gem|
31
29
  gem.add_dependency "bundler", "~> 1.9"
32
30
  gem.add_dependency "activesupport", ">= 4.0"
33
31
  gem.add_dependency "rspec", "~> 3.4"
32
+
33
+ gem.add_development_dependency "coveralls"
34
34
  end
@@ -0,0 +1,2 @@
1
+ RSpec.describe ActiveRecordFormatter::Collector do
2
+ end
@@ -0,0 +1,2 @@
1
+ RSpec.describe ActiveRecordFormatter::Formatter do
2
+ end
@@ -0,0 +1,54 @@
1
+ require 'simplecov'
2
+
3
+ require 'rspec/activerecord/formatter'
4
+
5
+ # This file was generated by the `rspec --init` command. Conventionally, all
6
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
7
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
8
+ # this file to always be loaded, without a need to explicitly require it in any
9
+ # files.
10
+ #
11
+ # Given that it is always loaded, you are encouraged to keep this file as
12
+ # light-weight as possible. Requiring heavyweight dependencies from this file
13
+ # will add to the boot time of your test suite on EVERY test run, even for an
14
+ # individual file that may not need all of that loaded. Instead, consider making
15
+ # a separate helper file that requires the additional dependencies and performs
16
+ # the additional setup, and require it from the spec files that actually need
17
+ # it.
18
+ #
19
+ # The `.rspec` file also contains a few flags that are not defaults but that
20
+ # users commonly want.
21
+ #
22
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
23
+
24
+ RSpec.configure do |config|
25
+ # This allows you to limit a spec run to individual examples or groups
26
+ # you care about by tagging them with `:focus` metadata. When nothing
27
+ # is tagged with `:focus`, all examples get run. RSpec also provides
28
+ # aliases for `it`, `describe`, and `context` that include `:focus`
29
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
30
+ config.filter_run_when_matching :focus
31
+
32
+ # Limits the available syntax to the non-monkey patched syntax that is
33
+ # recommended. For more details, see:
34
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
35
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
36
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
37
+ config.disable_monkey_patching!
38
+
39
+ # This setting enables warnings. It's recommended, but in some cases may
40
+ # be too noisy due to issues in dependencies.
41
+ config.warnings = true
42
+
43
+ # Run specs in random order to surface order dependencies. If you find an
44
+ # order dependency and want to debug it, you can fix the order by providing
45
+ # the seed, which is printed after each run.
46
+ # --seed 1234
47
+ config.order = :random
48
+
49
+ # Seed global randomization in this process using the `--seed` CLI option.
50
+ # Setting this allows you to use `--seed` to deterministically reproduce
51
+ # test failures related to randomization by passing the same `--seed` value
52
+ # as the one that triggered the failure.
53
+ Kernel.srand config.seed
54
+ end
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-activerecord-formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Mastey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-16 00:00:00.000000000 Z
11
+ date: 2019-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coveralls
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Creates a new formatter for ActiveRecord that can help you diagnose performance
56
70
  issues in RSpec
57
71
  email: jmmastey@gmail.com
@@ -61,18 +75,23 @@ extra_rdoc_files:
61
75
  - CODE_OF_CONDUCT.md
62
76
  - README.md
63
77
  files:
64
- - .gitignore
78
+ - ".gitignore"
79
+ - ".rspec"
80
+ - ".simplecov"
81
+ - ".travis.yml"
65
82
  - CODE_OF_CONDUCT.md
66
83
  - Gemfile
67
84
  - MIT-LICENSE
68
85
  - README.md
69
86
  - doc/images/demo_1.png
70
87
  - doc/images/demo_2.png
88
+ - lib/rspec-activerecord-formatter.rb
71
89
  - lib/rspec/activerecord/formatter.rb
72
- - lib/rspec/activerecord/formatter/collector.rb
73
- - lib/rspec/activerecord/formatter/formatter.rb
74
- - lib/rspec/activerecord/formatter/version.rb
90
+ - lib/rspec/activerecord/helpers/collector.rb
75
91
  - rspec-activerecord-formatter.gemspec
92
+ - spec/collector_spec.rb
93
+ - spec/formatter_spec.rb
94
+ - spec/spec_helper.rb
76
95
  homepage: http://github.com/jmmastey/rspec-activerecord-formatter
77
96
  licenses:
78
97
  - MIT
@@ -83,17 +102,17 @@ require_paths:
83
102
  - lib
84
103
  required_ruby_version: !ruby/object:Gem::Requirement
85
104
  requirements:
86
- - - '>='
105
+ - - ">="
87
106
  - !ruby/object:Gem::Version
88
107
  version: '0'
89
108
  required_rubygems_version: !ruby/object:Gem::Requirement
90
109
  requirements:
91
- - - '>='
110
+ - - ">="
92
111
  - !ruby/object:Gem::Version
93
112
  version: '0'
94
113
  requirements: []
95
114
  rubyforge_project:
96
- rubygems_version: 2.0.14
115
+ rubygems_version: 2.7.6
97
116
  signing_key:
98
117
  specification_version: 4
99
118
  summary: Adds object creations and queries to Rspec output.
@@ -1,71 +0,0 @@
1
- module ActiveRecordFormatter
2
- class Formatter < ::RSpec::Core::Formatters::DocumentationFormatter
3
- attr_reader :collector, :colorizer, :configuration
4
-
5
- ::RSpec::Core::Formatters.register self, :start, :dump_summary,
6
- :example_started, :example_passed, :example_failed
7
-
8
- def initialize(output)
9
- super
10
-
11
- @colorizer = ::RSpec::Core::Formatters::ConsoleCodes
12
- @collector = ActiveRecordFormatter::Collector.new
13
- end
14
-
15
- def start(start_notification)
16
- output.puts "Recording and reporting ActiveRecord select and creation counts."
17
- end
18
-
19
- def example_started(example)
20
- collector.reset_example
21
- end
22
-
23
- def dump_summary(summary)
24
- formatted = "\nFinished in #{summary.formatted_duration} " \
25
- "(files took #{summary.formatted_load_time} to load)\n" \
26
- "#{colorized_expanded_totals(summary)}\n"
27
-
28
- unless summary.failed_examples.empty?
29
- formatted << summary.colorized_rerun_commands(colorizer) << "\n"
30
- end
31
-
32
- output.puts formatted
33
- end
34
-
35
- protected
36
-
37
- def passed_output(example)
38
- "#{current_indentation}#{example_counts}" +
39
- colorizer.wrap(example.description.strip, :success)
40
- end
41
-
42
- def failure_output(example)
43
- "#{current_indentation}#{example_counts}" +
44
- colorizer.wrap("#{example.description.strip} (FAILED - #{next_failure_index})", :failure)
45
- end
46
-
47
- def example_counts(suffix: " ")
48
- "(%02d, %02d)#{suffix}" % [collector.objects_count, collector.query_count]
49
- end
50
-
51
- def colorized_expanded_totals(summary)
52
- if summary.failure_count > 0
53
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.failure_color)
54
- elsif summary.pending_count > 0
55
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.pending_color)
56
- else
57
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.success_color)
58
- end
59
- end
60
-
61
- def expanded_totals_line(summary)
62
- summary_text = ::RSpec::Core::Formatters::Helpers.pluralize(summary.example_count, "example")
63
- summary_text << ", " << ::RSpec::Core::Formatters::Helpers.pluralize(summary.failure_count, "failure")
64
- summary_text << ", #{summary.pending_count} pending" if summary.pending_count > 0
65
- summary_text << ", #{collector.total_objects} AR objects"
66
- summary_text << ", #{collector.total_queries} AR queries"
67
-
68
- summary_text
69
- end
70
- end
71
- end
@@ -1,3 +0,0 @@
1
- module ActiveRecordFormatter
2
- VERSION = '0.1.0'
3
- end