rspec-activerecord-formatter 1.1.0 → 2.1.1

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: 573d9da6bd2d49e858ad2598ecf931c7b9909cc4d53881ed84d27b9e071310c5
4
- data.tar.gz: a4f40473db9a50e226ba87b5512b031a1adacf5694f1872ef1571763e997f212
3
+ metadata.gz: c54759e485d19a1a06d151b7f3a0bb3286cdcbb7085d3a51b9552ffed37ea6f8
4
+ data.tar.gz: aeaf1ecc3bcc1253b2f6998f2b4a36eba27712e9168b3d3f793753173d21ee34
5
5
  SHA512:
6
- metadata.gz: 87e83e43deaad1f964e3cc88264ab51779a0362c789f18a5ea3d33d1116059866f7f3df0c8946f936462215b94a8f4440bafb1f11143bf5a7d5a2f964a62f433
7
- data.tar.gz: '068fbce81ae37fe58c1e0d97d61f4024cab3cd233618f870d8e4b842d25291810872504dc53c21e702379a92a4aca472dde66fbdb7869a7d57a6ef1524dac255'
6
+ metadata.gz: 8b01f60872f2818c43ccdb627115f0ac88e62fbeece79436ec24ad1a88beb17f9dc5a241aabc98e8c591a21735107fa82ce00d51262d768ae0d2327840c526e2
7
+ data.tar.gz: 06cded1f82ba0e87f15b70fe126057e86c96a477a59b163d6ec4bd0503483b8d7e36843a23debf1e2f12279d7ff8b8dfcb8870180fab241dc35dd473e4edff69
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  .DS_Store
2
2
  Gemfile.lock
3
3
  coverage
4
+ *.gem
@@ -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,12 +45,17 @@ 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
+ If you want less granularity, you can also use the progress formatter:
49
+
50
+ --require rspec-activerecord-formatter
51
+ --require rails_helper
52
+ --format ActiveRecordProgressFormatter
53
+
48
54
  Next Steps
49
55
  ------------
50
56
  * 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
57
  I'd like to be able to go back to a method other than scanning for `INSERT INTO` strings.
52
58
  * Configuration, especially formatting the output to optionally outdent the counts.
53
- * Add a `--profile`-like behavior to output the most offending tests.
54
59
  * The current dependency versions are a vague guess. They can and should clearly be more lenient.
55
60
  * I dunno, tests.
56
61
 
@@ -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,86 +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_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
- write_profile_summary
35
- end
36
-
37
- def write_profile_summary
38
- output_report_filename = Time.now.strftime("rspec_activerecord_result_%Y_%m_%d_%H_%m_%S.txt")
39
- output_report_path = Rails.root.join("tmp", output_report_filename)
40
-
41
- puts "\nOutputting Detailed Profile Data to #{output_report_path}"
42
- File.open(output_report_path, "wb") do |f|
43
- f.puts "#{collector.total_objects} AR objects, #{collector.total_queries} AR queries\n"
44
- f.puts "Query Summary"
45
- collector.most_common_query_names.each do |name, count|
46
- f.puts "%-4s %s" % [count, name]
47
- end
48
- end
49
- end
50
-
51
- protected
52
-
53
- def passed_output(example)
54
- "#{current_indentation}#{example_counts}" +
55
- colorizer.wrap(example.description.strip, :success)
56
- end
57
-
58
- def failure_output(example)
59
- "#{current_indentation}#{example_counts}" +
60
- colorizer.wrap("#{example.description.strip} (FAILED - #{next_failure_index})", :failure)
61
- end
62
-
63
- def example_counts(suffix: " ")
64
- "(%02d, %02d)#{suffix}" % [collector.objects_count, collector.query_count]
65
- end
66
-
67
- def colorized_expanded_totals(summary)
68
- if summary.failure_count > 0
69
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.failure_color)
70
- elsif summary.pending_count > 0
71
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.pending_color)
72
- else
73
- colorizer.wrap(expanded_totals_line(summary), RSpec.configuration.success_color)
74
- end
75
- end
76
-
77
- def expanded_totals_line(summary)
78
- summary_text = ::RSpec::Core::Formatters::Helpers.pluralize(summary.example_count, "example")
79
- summary_text << ", " << ::RSpec::Core::Formatters::Helpers.pluralize(summary.failure_count, "failure")
80
- summary_text << ", #{summary.pending_count} pending" if summary.pending_count > 0
81
- summary_text << ", #{collector.total_objects} AR objects"
82
- summary_text << ", #{collector.total_queries} AR queries"
83
-
84
- summary_text
85
- end
86
- end
1
+ ActiveRecordFormatter = ActiveRecordDocumentationFormatter
@@ -2,15 +2,21 @@ require 'active_support/notifications'
2
2
 
3
3
  module ActiveRecordFormatterHelpers
4
4
  class Collector
5
- attr_reader :query_count, :objects_count, :total_queries, :total_objects, :query_names
5
+ attr_reader :query_count, :objects_count, :total_queries, :total_objects,
6
+ :query_names, :active_groups, :group_counts, :groups_encountered
7
+
6
8
  SKIP_QUERIES = ["SELECT tablename FROM pg_tables", "select sum(ct) from (select count(*) ct from"]
7
9
 
8
10
  def initialize
11
+ #@unnamed_queries = []
9
12
  @query_count = 0
13
+ @groups_encountered = 0
10
14
  @objects_count = 0
11
15
  @total_queries = 0
12
16
  @total_objects = 0
13
17
  @query_names = Hash.new(0)
18
+ @group_counts = Hash.new(0)
19
+ @active_groups = []
14
20
 
15
21
  ActiveSupport::Notifications.subscribe("sql.active_record", method(:record_query))
16
22
  end
@@ -18,33 +24,126 @@ module ActiveRecordFormatterHelpers
18
24
  def record_query(*_unused, data)
19
25
  return if SKIP_QUERIES.any? { |q| data[:sql].index(q) == 0 }
20
26
 
21
- @query_count += 1
22
- @total_queries += 1
23
-
24
- if query_is_an_insert?(data[:sql])
25
- @objects_count += 1
26
- @total_objects += 1
27
- end
28
-
29
- name = data[:name] || "Unnamed"
30
- @query_names[name] += 1
27
+ inc_query
28
+ inc_object if query_is_an_insert?(data[:sql])
29
+ inc_query_name(data)
31
30
  end
32
31
 
33
32
  def most_common_query_names
34
- @query_names.sort_by(&:last).reverse
33
+ query_names.sort_by(&:last).reverse
34
+ end
35
+
36
+ def most_expensive_groups
37
+ group_counts.sort_by(&:last).reverse
35
38
  end
36
39
 
37
- def reset_example
40
+ def reset_example(_)
38
41
  @query_count = 0
39
42
  @objects_count = 0
40
43
  end
41
44
 
45
+ def group_started(group)
46
+ @groups_encountered += 1
47
+
48
+ return unless group.parent_groups.length > 1
49
+
50
+ active_groups.push(group_path(group))
51
+ end
52
+
53
+ def group_finished(group)
54
+ active_groups.delete(group_path(group))
55
+ end
56
+
42
57
  protected
43
58
 
59
+ def inc_object
60
+ @objects_count += 1
61
+ @total_objects += 1
62
+
63
+ active_groups.each do |group|
64
+ @group_counts[group] += 1
65
+ end
66
+ end
67
+
68
+ def inc_query
69
+ @query_count += 1
70
+ @total_queries += 1
71
+ end
72
+
73
+ def inc_query_name(data)
74
+ name = data[:name] || "Unnamed"
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
+
111
+ query_names[name] += 1
112
+ end
113
+
114
+ def group_path(group)
115
+ group.parent_groups.reverse.map(&:description).join(' ')
116
+ end
117
+
44
118
  # TODO: what happens if we try to create many records at once?
45
119
  # TODO: are there any false positives we need to worry about? false negatives?
46
120
  def query_is_an_insert?(query)
47
- 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
48
147
  end
49
148
  end
50
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.1.0"
9
+ gem.version = "2.1.1"
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,9 @@ 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"
28
+ # TODO: these are almost certainly too restrictive looking backward
29
+ gem.add_dependency "activesupport", ">= 4.0", "< 7.0"
30
30
  gem.add_dependency "rspec", "~> 3.4"
31
31
 
32
- gem.add_development_dependency "coveralls"
32
+ gem.add_development_dependency "coveralls", "~> 0.8"
33
33
  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.1.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Mastey
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-20 00:00:00.000000000 Z
11
+ date: 2020-11-07 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,6 +27,9 @@ 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
@@ -42,22 +48,23 @@ dependencies:
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
@@ -82,7 +94,7 @@ homepage: http://github.com/jmmastey/rspec-activerecord-formatter
82
94
  licenses:
83
95
  - MIT
84
96
  metadata: {}
85
- post_install_message:
97
+ post_install_message:
86
98
  rdoc_options: []
87
99
  require_paths:
88
100
  - lib
@@ -97,9 +109,8 @@ 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
102
- signing_key:
112
+ rubygems_version: 3.1.4
113
+ signing_key:
103
114
  specification_version: 4
104
115
  summary: Adds object creations and queries to Rspec output.
105
116
  test_files: []