schema_reaper 1.0.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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +56 -0
  4. data/.schema_reaper.yml.example +43 -0
  5. data/CHANGELOG.md +45 -0
  6. data/CODE_OF_CONDUCT.md +84 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +136 -0
  9. data/Rakefile +12 -0
  10. data/exe/schema_reaper +6 -0
  11. data/lib/schema_reaper/analyzers/always_null_column.rb +43 -0
  12. data/lib/schema_reaper/analyzers/base.rb +54 -0
  13. data/lib/schema_reaper/analyzers/dead_column.rb +72 -0
  14. data/lib/schema_reaper/analyzers/dead_table.rb +60 -0
  15. data/lib/schema_reaper/analyzers/duplicate_index.rb +41 -0
  16. data/lib/schema_reaper/analyzers/missing_fk_index.rb +43 -0
  17. data/lib/schema_reaper/analyzers/registry.rb +20 -0
  18. data/lib/schema_reaper/analyzers/single_value_column.rb +46 -0
  19. data/lib/schema_reaper/analyzers/unused_index.rb +43 -0
  20. data/lib/schema_reaper/baseline.rb +35 -0
  21. data/lib/schema_reaper/cli.rb +68 -0
  22. data/lib/schema_reaper/config.rb +78 -0
  23. data/lib/schema_reaper/finding.rb +28 -0
  24. data/lib/schema_reaper/gem_awareness.rb +80 -0
  25. data/lib/schema_reaper/history.rb +60 -0
  26. data/lib/schema_reaper/introspect/postgres.rb +134 -0
  27. data/lib/schema_reaper/migration_generator.rb +67 -0
  28. data/lib/schema_reaper/railtie.rb +21 -0
  29. data/lib/schema_reaper/reporters/bytes.rb +22 -0
  30. data/lib/schema_reaper/reporters/json.rb +31 -0
  31. data/lib/schema_reaper/reporters/markdown.rb +41 -0
  32. data/lib/schema_reaper/reporters/sarif.rb +67 -0
  33. data/lib/schema_reaper/reporters/table.rb +45 -0
  34. data/lib/schema_reaper/runner.rb +64 -0
  35. data/lib/schema_reaper/runtime.rb +111 -0
  36. data/lib/schema_reaper/schema.rb +34 -0
  37. data/lib/schema_reaper/static/scanner.rb +88 -0
  38. data/lib/schema_reaper/tasks/schema_reaper.rake +26 -0
  39. data/lib/schema_reaper/version.rb +5 -0
  40. data/lib/schema_reaper.rb +44 -0
  41. data/schema_reaper.gemspec +47 -0
  42. data/sig/schema_reaper.rbs +4 -0
  43. metadata +167 -0
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/schema_reaper/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "schema_reaper"
7
+ spec.version = SchemaReaper::VERSION
8
+ spec.authors = ["aksshatt"]
9
+ spec.email = ["akshatpegwar5@gmail.com"]
10
+
11
+ spec.summary = "Find dead columns, unused indexes and schema dead-weight in Rails/ActiveRecord apps."
12
+ spec.description = <<~DESC
13
+ schema_reaper scans your PostgreSQL schema, its planner statistics and your
14
+ codebase to surface columns, indexes and tables that are no longer used:
15
+ dead columns and tables, unused and duplicate indexes, missing foreign-key
16
+ indexes, always-NULL and single-value columns. Findings are scored by
17
+ confidence (fusing an optional runtime attribute-access signal), carry a
18
+ reclaimable-bytes estimate, and come with staged, reversible migrations.
19
+ Ships table/json/markdown/sarif reporters, a CI baseline gate and a trend
20
+ log.
21
+ DESC
22
+ spec.homepage = "https://github.com/aksshatt/schema_reaper"
23
+ spec.license = "MIT"
24
+ spec.required_ruby_version = ">= 3.1.0"
25
+
26
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
27
+ spec.metadata["homepage_uri"] = spec.homepage
28
+ spec.metadata["source_code_uri"] = spec.homepage
29
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/main/CHANGELOG.md"
30
+ spec.metadata["rubygems_mfa_required"] = "true"
31
+
32
+ spec.files = Dir.chdir(__dir__) do
33
+ `git ls-files -z`.split("\x0").reject do |f|
34
+ (File.expand_path(f) == __FILE__) ||
35
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .github Gemfile])
36
+ end
37
+ end
38
+ spec.bindir = "exe"
39
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
40
+ spec.require_paths = ["lib"]
41
+
42
+ spec.add_dependency "prism", ">= 0.19", "< 2.0"
43
+ spec.add_dependency "thor", "~> 1.3"
44
+
45
+ spec.add_development_dependency "activerecord", ">= 6.1", "< 9.0"
46
+ spec.add_development_dependency "pg", "~> 1.5"
47
+ end
@@ -0,0 +1,4 @@
1
+ module SchemaReaper
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: schema_reaper
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - aksshatt
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2026-09-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: prism
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.19'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '0.19'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: thor
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.3'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.3'
47
+ - !ruby/object:Gem::Dependency
48
+ name: activerecord
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '6.1'
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '9.0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '6.1'
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '9.0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: pg
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '1.5'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.5'
81
+ description: |
82
+ schema_reaper scans your PostgreSQL schema, its planner statistics and your
83
+ codebase to surface columns, indexes and tables that are no longer used:
84
+ dead columns and tables, unused and duplicate indexes, missing foreign-key
85
+ indexes, always-NULL and single-value columns. Findings are scored by
86
+ confidence (fusing an optional runtime attribute-access signal), carry a
87
+ reclaimable-bytes estimate, and come with staged, reversible migrations.
88
+ Ships table/json/markdown/sarif reporters, a CI baseline gate and a trend
89
+ log.
90
+ email:
91
+ - akshatpegwar5@gmail.com
92
+ executables:
93
+ - schema_reaper
94
+ extensions: []
95
+ extra_rdoc_files: []
96
+ files:
97
+ - ".rspec"
98
+ - ".rubocop.yml"
99
+ - ".schema_reaper.yml.example"
100
+ - CHANGELOG.md
101
+ - CODE_OF_CONDUCT.md
102
+ - LICENSE.txt
103
+ - README.md
104
+ - Rakefile
105
+ - exe/schema_reaper
106
+ - lib/schema_reaper.rb
107
+ - lib/schema_reaper/analyzers/always_null_column.rb
108
+ - lib/schema_reaper/analyzers/base.rb
109
+ - lib/schema_reaper/analyzers/dead_column.rb
110
+ - lib/schema_reaper/analyzers/dead_table.rb
111
+ - lib/schema_reaper/analyzers/duplicate_index.rb
112
+ - lib/schema_reaper/analyzers/missing_fk_index.rb
113
+ - lib/schema_reaper/analyzers/registry.rb
114
+ - lib/schema_reaper/analyzers/single_value_column.rb
115
+ - lib/schema_reaper/analyzers/unused_index.rb
116
+ - lib/schema_reaper/baseline.rb
117
+ - lib/schema_reaper/cli.rb
118
+ - lib/schema_reaper/config.rb
119
+ - lib/schema_reaper/finding.rb
120
+ - lib/schema_reaper/gem_awareness.rb
121
+ - lib/schema_reaper/history.rb
122
+ - lib/schema_reaper/introspect/postgres.rb
123
+ - lib/schema_reaper/migration_generator.rb
124
+ - lib/schema_reaper/railtie.rb
125
+ - lib/schema_reaper/reporters/bytes.rb
126
+ - lib/schema_reaper/reporters/json.rb
127
+ - lib/schema_reaper/reporters/markdown.rb
128
+ - lib/schema_reaper/reporters/sarif.rb
129
+ - lib/schema_reaper/reporters/table.rb
130
+ - lib/schema_reaper/runner.rb
131
+ - lib/schema_reaper/runtime.rb
132
+ - lib/schema_reaper/schema.rb
133
+ - lib/schema_reaper/static/scanner.rb
134
+ - lib/schema_reaper/tasks/schema_reaper.rake
135
+ - lib/schema_reaper/version.rb
136
+ - schema_reaper.gemspec
137
+ - sig/schema_reaper.rbs
138
+ homepage: https://github.com/aksshatt/schema_reaper
139
+ licenses:
140
+ - MIT
141
+ metadata:
142
+ allowed_push_host: https://rubygems.org
143
+ homepage_uri: https://github.com/aksshatt/schema_reaper
144
+ source_code_uri: https://github.com/aksshatt/schema_reaper
145
+ changelog_uri: https://github.com/aksshatt/schema_reaper/blob/main/CHANGELOG.md
146
+ rubygems_mfa_required: 'true'
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 3.1.0
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubygems_version: 3.4.10
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: Find dead columns, unused indexes and schema dead-weight in Rails/ActiveRecord
166
+ apps.
167
+ test_files: []