rspec-activerecord-formatter 1.2.0 → 2.2.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: db1b2dbddfb326ac8143998c1b7cc204d90d84f83ccfabe9f3cc022d435a49d8
4
- data.tar.gz: 7f29a63684b8e1ce6614e99cbf6ad978739f2f08357d14abc7a4209f2fd866ea
3
+ metadata.gz: 33c3cdd6e50f53d2ce7e803f8d7490615e17998c22965a47a8d12c6d7b40112d
4
+ data.tar.gz: caaa01518eae7a43266947818f50af3e25109c1953e28f4427ae64025e4810c1
5
5
  SHA512:
6
- metadata.gz: 9f7f871268d7ce2c007d1bede488b073e443ee5e93ae6ed9f07ca7e787811b2bd38d373ca5843c34403dc877942c1b7908f83ed9729f6c5010f71801dbced20d
7
- data.tar.gz: 5dc551ee718ce1fdd0e5ce8997f105750b2295d2e7a9b14e399acce10ee5a17be8a07b76bd51c8d21c30b8c2278337b224cb0d8dda5916977f8082040e72a07a
6
+ metadata.gz: 93b57c45de4afc430f279e03514a61b4c9c2f8bf4b9d3d9b3048dde014265725ff80c9583b6a1f14696163459d62ea1f75abc336647ca93ceb0fcf8ec4da050d
7
+ data.tar.gz: 81ca2e730955c82c4b5ab13cc538907eaf63cb70e55366a26bddd52587555397b55b888c7afcf0db72a85f7ef320e7a82e3e00e58f6eba9ce7c980f670f1d28f
data/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased]
4
+
5
+ ## [2.1.1] - 2020-11-07
6
+ - Pin dependencies a bit more closely.
7
+
8
+ ## [2.1.0] - 2020-11-07
9
+
10
+ - Added better detection for query types. Specifically, it's easier now to see
11
+ how `database_cleaner` impacts your total queries.
12
+ - Adding a changelog, apparently.
13
+
data/README.md CHANGED
@@ -27,14 +27,14 @@ The current answer is to change your `.rspec` initializer to include the followi
27
27
 
28
28
  --require rspec-activerecord-formatter
29
29
  --require rails_helper
30
- --format ActiveRecordFormatter
30
+ --format ActiveRecordDocumentationFormatter
31
31
 
32
32
  We have to include the rails_helper so that ActiveRecord is loaded prior to trying to load the
33
33
  formatter. That way, we can hook into AR creations.
34
34
 
35
35
  You can also run the formatter as a one-off option to rspec:
36
36
 
37
- rspec path/to/example_spec.rb --require rspec-activerecord-formatter --require rails_helper --format ActiveRecordFormatter
37
+ rspec path/to/example_spec.rb --require rspec-activerecord-formatter --require rails_helper --format ActiveRecordDocumentationFormatter
38
38
 
39
39
  Once you set the formatter, you should now see the number of objects created and total queries
40
40
  for each of your tests:
@@ -45,14 +45,14 @@ You'll also get a summary at the end of your test run:
45
45
 
46
46
  ![Test summary.](https://github.com/jmmastey/rspec-activerecord-formatter/raw/master/doc/images/demo_1.png "Test summary.")
47
47
 
48
- Next Steps
49
- ------------
50
- * The method I was using to count AR objects doesn't work well with DatabaseCleaner when not explicitly wiring the library into `before` blocks.
51
- I'd like to be able to go back to a method other than scanning for `INSERT INTO` strings.
52
- * Configuration, especially formatting the output to optionally outdent the counts.
53
- * Add a `--profile`-like behavior to output the most offending tests.
54
- * The current dependency versions are a vague guess. They can and should clearly be more lenient.
55
- * I dunno, tests.
48
+ The formatter will spit out a report with more data at the end of your run:
49
+
50
+
51
+ If you want less granularity, you can also use the progress formatter:
52
+
53
+ --require rspec-activerecord-formatter
54
+ --require rails_helper
55
+ --format ActiveRecordProgressFormatter
56
56
 
57
57
  Contributing
58
58
  ------------
@@ -1 +1,6 @@
1
+ require "rspec/activerecord/helpers/collector"
2
+ require "rspec/activerecord/helpers/report"
3
+ require 'rspec/activerecord/base'
4
+ require 'rspec/activerecord/progress_formatter'
5
+ require 'rspec/activerecord/documentation_formatter'
1
6
  require 'rspec/activerecord/formatter'
@@ -0,0 +1,43 @@
1
+ class ActiveRecordFormatterBase
2
+ attr_reader :colorizer, :summary, :collector
3
+
4
+ def initialize(summary, collector)
5
+ @colorizer = ::RSpec::Core::Formatters::ConsoleCodes
6
+ @summary = summary
7
+ @collector = collector
8
+ end
9
+
10
+ def colorized_summary
11
+ formatted = "\nFinished in #{summary.formatted_duration} " \
12
+ "(files took #{summary.formatted_load_time} to load)\n" \
13
+ "#{colorized_expanded_totals}\n"
14
+
15
+ unless summary.failed_examples.empty?
16
+ formatted << summary.colorized_rerun_commands(colorizer) << "\n"
17
+ end
18
+
19
+ formatted
20
+ end
21
+
22
+ private
23
+
24
+ def colorized_expanded_totals
25
+ if summary.failure_count > 0
26
+ colorizer.wrap(expanded_totals_line, RSpec.configuration.failure_color)
27
+ elsif summary.pending_count > 0
28
+ colorizer.wrap(expanded_totals_line, RSpec.configuration.pending_color)
29
+ else
30
+ colorizer.wrap(expanded_totals_line, RSpec.configuration.success_color)
31
+ end
32
+ end
33
+
34
+ def expanded_totals_line
35
+ summary_text = ::RSpec::Core::Formatters::Helpers.pluralize(summary.example_count, "example")
36
+ summary_text << ", " << ::RSpec::Core::Formatters::Helpers.pluralize(summary.failure_count, "failure")
37
+ summary_text << ", #{summary.pending_count} pending" if summary.pending_count > 0
38
+ summary_text << ", #{collector.total_objects} AR objects"
39
+ summary_text << ", #{collector.total_queries} AR queries"
40
+
41
+ summary_text
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ class ActiveRecordDocumentationFormatter < ::RSpec::Core::Formatters::DocumentationFormatter
2
+ attr_reader :collector, :colorizer, :report
3
+
4
+ ::RSpec::Core::Formatters.register self, :start, :dump_summary,
5
+ :example_started, :example_group_started,
6
+ :example_group_finished
7
+
8
+ def initialize(output)
9
+ super
10
+
11
+ @colorizer = ::RSpec::Core::Formatters::ConsoleCodes
12
+ @collector = ActiveRecordFormatterHelpers::Collector.new
13
+ @report = ActiveRecordFormatterHelpers::Report.new(collector)
14
+ end
15
+
16
+ def start(_start_notification)
17
+ output.puts "Recording and reporting ActiveRecord select and creation counts."
18
+ super
19
+ end
20
+
21
+ def example_group_started(example_group)
22
+ collector.group_started(example_group.group)
23
+ super
24
+ end
25
+
26
+ def example_group_finished(example_group)
27
+ collector.group_finished(example_group.group)
28
+ super
29
+ end
30
+
31
+ def example_started(example)
32
+ collector.reset_example(example)
33
+ end
34
+
35
+ def dump_summary(summary)
36
+ base = ActiveRecordFormatterBase.new(summary, collector)
37
+ output.puts base.colorized_summary
38
+
39
+ output.puts "\nOutputting Detailed Profile Data to #{report.report_path}"
40
+ report.write
41
+ end
42
+
43
+ protected
44
+
45
+ def passed_output(example)
46
+ "#{current_indentation}#{example_counts}" +
47
+ colorizer.wrap(example.description.strip, :success)
48
+ end
49
+
50
+ def failure_output(example)
51
+ "#{current_indentation}#{example_counts}" +
52
+ colorizer.wrap("#{example.description.strip} (FAILED - #{next_failure_index})", :failure)
53
+ end
54
+
55
+ def example_counts(suffix: " ")
56
+ "(%02d, %02d)#{suffix}" % [collector.objects_count, collector.query_count]
57
+ end
58
+ end
@@ -1,107 +1 @@
1
- require_relative "helpers/collector"
2
-
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_group_started,
8
- :example_group_finished
9
-
10
- def initialize(output)
11
- super
12
-
13
- @colorizer = ::RSpec::Core::Formatters::ConsoleCodes
14
- @collector = ActiveRecordFormatterHelpers::Collector.new
15
- end
16
-
17
- def start(start_notification)
18
- output.puts "Recording and reporting ActiveRecord select and creation counts."
19
- end
20
-
21
- def example_group_started(example_group)
22
- collector.group_started(example_group.group)
23
- super
24
- end
25
-
26
- def example_group_finished(example_group)
27
- collector.group_finished(example_group.group)
28
- super
29
- end
30
-
31
- def example_started(example)
32
- collector.reset_example(example)
33
- end
34
-
35
- def dump_summary(summary)
36
- formatted = "\nFinished in #{summary.formatted_duration} " \
37
- "(files took #{summary.formatted_load_time} to load)\n" \
38
- "#{colorized_expanded_totals(summary)}\n"
39
-
40
- unless summary.failed_examples.empty?
41
- formatted << summary.colorized_rerun_commands(colorizer) << "\n"
42
- end
43
-
44
- output.puts formatted
45
- write_profile_summary
46
- end
47
-
48
- def write_profile_summary
49
- output_report_filename = Time.now.strftime("ar_%Y_%m_%d_%H_%m_%S.txt")
50
- report_dir = Rails.root.join("tmp", "profile")
51
- output_report_path = report_dir.join(output_report_filename)
52
-
53
- output.puts "\nOutputting Detailed Profile Data to #{output_report_path}"
54
- Dir.mkdir(report_dir) unless File.exists?(report_dir)
55
- File.open(output_report_path, "wb") do |f|
56
- f.puts "#{collector.total_objects} AR objects, #{collector.total_queries} AR queries"
57
-
58
- f.puts ""
59
- f.puts "Worst Example Groups by Object Creation"
60
- collector.most_expensive_groups.first(50).each do |name, count|
61
- f.puts "%-5s %s" % [count, name]
62
- end
63
-
64
- f.puts ""
65
- f.puts "Most Common Queries"
66
- collector.most_common_query_names.first(50).each do |name, count|
67
- f.puts "%-5s %s" % [count, name]
68
- end
69
- end
70
- end
71
-
72
- protected
73
-
74
- def passed_output(example)
75
- "#{current_indentation}#{example_counts}" +
76
- colorizer.wrap(example.description.strip, :success)
77
- end
78
-
79
- def failure_output(example)
80
- "#{current_indentation}#{example_counts}" +
81
- colorizer.wrap("#{example.description.strip} (FAILED - #{next_failure_index})", :failure)
82
- end
83
-
84
- def example_counts(suffix: " ")
85
- "(%02d, %02d)#{suffix}" % [collector.objects_count, collector.query_count]
86
- end
87
-
88
- def colorized_expanded_totals(summary)
89
- if summary.failure_count > 0
90
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.failure_color)
91
- elsif summary.pending_count > 0
92
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.pending_color)
93
- else
94
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.success_color)
95
- end
96
- end
97
-
98
- def expanded_totals_line(summary)
99
- summary_text = ::RSpec::Core::Formatters::Helpers.pluralize(summary.example_count, "example")
100
- summary_text << ", " << ::RSpec::Core::Formatters::Helpers.pluralize(summary.failure_count, "failure")
101
- summary_text << ", #{summary.pending_count} pending" if summary.pending_count > 0
102
- summary_text << ", #{collector.total_objects} AR objects"
103
- summary_text << ", #{collector.total_queries} AR queries"
104
-
105
- summary_text
106
- end
107
- end
1
+ ActiveRecordFormatter = ActiveRecordDocumentationFormatter
@@ -3,12 +3,14 @@ require 'active_support/notifications'
3
3
  module ActiveRecordFormatterHelpers
4
4
  class Collector
5
5
  attr_reader :query_count, :objects_count, :total_queries, :total_objects,
6
- :query_names, :active_groups, :group_counts
6
+ :query_names, :active_groups, :group_counts, :groups_encountered
7
7
 
8
8
  SKIP_QUERIES = ["SELECT tablename FROM pg_tables", "select sum(ct) from (select count(*) ct from"]
9
9
 
10
10
  def initialize
11
+ #@unnamed_queries = []
11
12
  @query_count = 0
13
+ @groups_encountered = 0
12
14
  @objects_count = 0
13
15
  @total_queries = 0
14
16
  @total_objects = 0
@@ -41,6 +43,8 @@ module ActiveRecordFormatterHelpers
41
43
  end
42
44
 
43
45
  def group_started(group)
46
+ @groups_encountered += 1
47
+
44
48
  return unless group.parent_groups.length > 1
45
49
 
46
50
  active_groups.push(group_path(group))
@@ -69,6 +73,41 @@ module ActiveRecordFormatterHelpers
69
73
  def inc_query_name(data)
70
74
  name = data[:name] || "Unnamed"
71
75
 
76
+ # In older versions of Rails, insert statements are just counted as SQL
77
+ # queries, which means that all the queries are just bunchedup at the top.
78
+ # Makes this data pretty useless. So anyway, try to suss out a name for
79
+ # at least those insertions (which are much more frequent than, say,
80
+ # updates in a test suite anyway).
81
+ if data[:name] == "SQL" && query_is_an_insert?(data[:sql])
82
+ table = data[:sql].scan(/INSERT INTO "(\w+)"/).first.first
83
+ name = "#{table} Create"
84
+ elsif query_is_a_full_table_delete?(data[:sql])
85
+ table = data[:sql].scan(/DELETE FROM "(\w+)"/).first.first
86
+ name = "Full Delete Table"
87
+ # TODO: truncate table
88
+ elsif query_is_transaction_management?(data[:sql])
89
+ name = "Transaction Management"
90
+ elsif query_is_schema_detection?(data[:sql])
91
+ name = "SCHEMA"
92
+ elsif query_is_trigger_management?(data[:sql])
93
+ name = "Trigger Management"
94
+ elsif query_refreshes_materialized_view?(data[:sql])
95
+ name = "Refresh Materialized View"
96
+ end
97
+
98
+
99
+ # In older versions of Rails, insert statements are just counted as SQL
100
+ # queries, which means that all the queries are just bunchedup at the top.
101
+ # Makes this data pretty useless. So anyway, try to suss out a name for
102
+ # at least those insertions (which are much more frequent than, say,
103
+ # updates in a test suite anyway).
104
+ #if data[:name].nil? && query_is_a_delete?(data[:sql])
105
+ # table = data[:sql].scan(/DELETE FROM "(\w+)"/).first.first
106
+ # name = "#{table} Delete"
107
+ #end
108
+
109
+ #@unnamed_queries << data if name == "Unnamed"
110
+
72
111
  query_names[name] += 1
73
112
  end
74
113
 
@@ -79,7 +118,32 @@ module ActiveRecordFormatterHelpers
79
118
  # TODO: what happens if we try to create many records at once?
80
119
  # TODO: are there any false positives we need to worry about? false negatives?
81
120
  def query_is_an_insert?(query)
82
- query =~ /INSERT INTO/
121
+ query =~ /^INSERT INTO/
122
+ end
123
+
124
+ def query_is_a_delete?(query)
125
+ query =~ /^DELETE FROM/
126
+ end
127
+
128
+ def query_is_a_full_table_delete?(query)
129
+ query =~ /^DELETE FROM [a-z_\."]*;$/i
130
+ end
131
+
132
+ def query_is_transaction_management?(query)
133
+ query =~ /^(COMMIT|BEGIN|ROLLBACK|SAVEPOINT|RELEASE SAVEPOINT)/
134
+ end
135
+
136
+ def query_is_schema_detection?(query)
137
+ query =~ /SELECT .* FROM pg_tables/m ||
138
+ query =~ /SELECT .* FROM information_schema.views/
139
+ end
140
+
141
+ def query_is_trigger_management?(query)
142
+ query =~ /(DISABLE|ENABLE) TRIGGER ALL/m
143
+ end
144
+
145
+ def query_refreshes_materialized_view?(query)
146
+ query =~ /REFRESH MATERIALIZED VIEW/m
83
147
  end
84
148
  end
85
149
  end
@@ -0,0 +1,45 @@
1
+ module ActiveRecordFormatterHelpers
2
+ class Report
3
+ attr_reader :report_path, :default_path, :report_dir, :collector
4
+
5
+ def initialize(collector)
6
+ @collector = collector
7
+
8
+ @report_dir = Rails.root.join("tmp", "profile")
9
+ @report_path = report_dir.join(timestamped_filename)
10
+ @default_path = report_dir.join('ar_most_recent.txt')
11
+ end
12
+
13
+ def write
14
+ write_file(file_path: report_path)
15
+ write_file(file_path: default_path)
16
+ end
17
+
18
+ private
19
+
20
+ def timestamped_filename
21
+ Time.now.strftime("ar_%Y_%m_%d_%H_%m_%S.txt")
22
+ end
23
+
24
+ def write_file(file_path:)
25
+ Dir.mkdir(report_dir) unless File.exists?(report_dir)
26
+
27
+ File.open(file_path, "wb") do |f|
28
+ f.puts "#{collector.total_objects} AR objects, #{collector.total_queries} AR queries"
29
+ f.puts "#{collector.groups_encountered} example groups executed"
30
+
31
+ f.puts ""
32
+ f.puts "Worst Example Groups by Object Creation"
33
+ collector.most_expensive_groups.first(50).each do |name, count|
34
+ f.puts "%-5s %s" % [count, name]
35
+ end
36
+
37
+ f.puts ""
38
+ f.puts "Most Common Queries"
39
+ collector.most_common_query_names.first(50).each do |name, count|
40
+ f.puts "%-5s %s" % [count, name]
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ require_relative "helpers/collector"
2
+ require_relative "helpers/report"
3
+
4
+ class ActiveRecordProgressFormatter < ::RSpec::Core::Formatters::ProgressFormatter
5
+ attr_reader :collector, :colorizer, :report
6
+
7
+ ::RSpec::Core::Formatters.register self, :start, :dump_summary,
8
+ :example_started, :example_group_started,
9
+ :example_group_finished
10
+
11
+ def initialize(output)
12
+ super
13
+
14
+ @colorizer = ::RSpec::Core::Formatters::ConsoleCodes
15
+ @collector = ActiveRecordFormatterHelpers::Collector.new
16
+ @report = ActiveRecordFormatterHelpers::Report.new(collector)
17
+ end
18
+
19
+ def start(_start_notification)
20
+ output.puts "Recording and reporting ActiveRecord select and creation counts."
21
+ super
22
+ end
23
+
24
+ def example_group_started(example_group)
25
+ collector.group_started(example_group.group)
26
+ super
27
+ end
28
+
29
+ def example_group_finished(example_group)
30
+ collector.group_finished(example_group.group)
31
+ end
32
+
33
+ def example_started(example)
34
+ collector.reset_example(example)
35
+ end
36
+
37
+ def dump_summary(summary)
38
+ base = ActiveRecordFormatterBase.new(summary, collector)
39
+ output.puts base.colorized_summary
40
+
41
+ output.puts "\nOutputting Detailed Profile Data to #{report.report_path}"
42
+ report.write
43
+ end
44
+ end
@@ -6,7 +6,7 @@ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
6
6
  Gem::Specification.new do |gem|
7
7
 
8
8
  gem.name = "rspec-activerecord-formatter"
9
- gem.version = "1.2.0"
9
+ gem.version = "2.2.0"
10
10
 
11
11
  gem.summary = "Adds object creations and queries to Rspec output."
12
12
  gem.description = "Creates a new formatter for ActiveRecord that can help you diagnose performance issues in RSpec"
@@ -25,9 +25,8 @@ Gem::Specification.new do |gem|
25
25
 
26
26
  gem.require_paths = %w[ext lib].select { |dir| File.directory?(dir) }
27
27
 
28
- # TODO: these are almost certainly too restrictive.
29
- gem.add_dependency "activesupport", ">= 4.0"
30
- gem.add_dependency "rspec", "~> 3.4"
28
+ gem.add_dependency "activesupport", ">= 4.0", "< 7.0"
29
+ gem.add_dependency "rspec", ">= 3.4"
31
30
 
32
- gem.add_development_dependency "coveralls"
31
+ gem.add_development_dependency "coveralls", "~> 0.8"
33
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-activerecord-formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.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: 2019-06-20 00:00:00.000000000 Z
11
+ date: 2021-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,40 +27,44 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rspec
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '3.4'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - "~>"
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
46
  version: '3.4'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: coveralls
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - ">="
51
+ - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '0'
53
+ version: '0.8'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - ">="
58
+ - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '0'
60
+ version: '0.8'
55
61
  description: Creates a new formatter for ActiveRecord that can help you diagnose performance
56
62
  issues in RSpec
57
63
  email: jmmastey@gmail.com
58
64
  executables: []
59
65
  extensions: []
60
66
  extra_rdoc_files:
67
+ - CHANGELOG.md
61
68
  - CODE_OF_CONDUCT.md
62
69
  - README.md
63
70
  files:
@@ -65,6 +72,7 @@ files:
65
72
  - ".rspec"
66
73
  - ".simplecov"
67
74
  - ".travis.yml"
75
+ - CHANGELOG.md
68
76
  - CODE_OF_CONDUCT.md
69
77
  - Gemfile
70
78
  - MIT-LICENSE
@@ -72,8 +80,12 @@ files:
72
80
  - doc/images/demo_1.png
73
81
  - doc/images/demo_2.png
74
82
  - lib/rspec-activerecord-formatter.rb
83
+ - lib/rspec/activerecord/base.rb
84
+ - lib/rspec/activerecord/documentation_formatter.rb
75
85
  - lib/rspec/activerecord/formatter.rb
76
86
  - lib/rspec/activerecord/helpers/collector.rb
87
+ - lib/rspec/activerecord/helpers/report.rb
88
+ - lib/rspec/activerecord/progress_formatter.rb
77
89
  - rspec-activerecord-formatter.gemspec
78
90
  - spec/collector_spec.rb
79
91
  - spec/formatter_spec.rb
@@ -97,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
109
  - !ruby/object:Gem::Version
98
110
  version: '0'
99
111
  requirements: []
100
- rubyforge_project:
101
- rubygems_version: 2.7.3
112
+ rubygems_version: 3.0.3
102
113
  signing_key:
103
114
  specification_version: 4
104
115
  summary: Adds object creations and queries to Rspec output.