bullematic 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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -1
  3. data/README.md +23 -11
  4. data/exe/bullematic +7 -0
  5. data/lib/bullematic/ast/finder.rb +190 -35
  6. data/lib/bullematic/ast/parser.rb +1 -17
  7. data/lib/bullematic/ast/rewriter.rb +90 -28
  8. data/lib/bullematic/cli.rb +185 -0
  9. data/lib/bullematic/configuration.rb +15 -4
  10. data/lib/bullematic/detection.rb +110 -13
  11. data/lib/bullematic/evidence_store.rb +78 -0
  12. data/lib/bullematic/fixer.rb +258 -31
  13. data/lib/bullematic/integrations/minitest.rb +20 -6
  14. data/lib/bullematic/integrations/rails.rb +23 -9
  15. data/lib/bullematic/integrations/rspec.rb +19 -7
  16. data/lib/bullematic/logger.rb +24 -12
  17. data/lib/bullematic/notifier.rb +131 -36
  18. data/lib/bullematic/version.rb +1 -1
  19. data/lib/bullematic.rb +12 -4
  20. data/sig/generated/bullematic/ast/finder.rbs +70 -11
  21. data/sig/generated/bullematic/ast/parser.rbs +0 -6
  22. data/sig/generated/bullematic/ast/rewriter.rbs +28 -11
  23. data/sig/generated/bullematic/cli.rbs +56 -0
  24. data/sig/generated/bullematic/configuration.rbs +16 -20
  25. data/sig/generated/bullematic/detection.rbs +77 -7
  26. data/sig/generated/bullematic/evidence_store.rbs +35 -0
  27. data/sig/generated/bullematic/fixer.rbs +59 -3
  28. data/sig/generated/bullematic/integrations/rails.rbs +7 -0
  29. data/sig/generated/bullematic/logger.rbs +5 -0
  30. data/sig/generated/bullematic/notifier.rbs +17 -13
  31. data/sig/generated/bullematic.rbs +5 -0
  32. data/sig/stubs/rails.rbs +60 -0
  33. metadata +161 -8
  34. data/Rakefile +0 -26
  35. data/Steepfile +0 -15
  36. data/assets/logo-header.svg +0 -28
  37. data/rbs_collection.lock.yaml +0 -24
  38. data/rbs_collection.yaml +0 -14
@@ -2,19 +2,23 @@
2
2
 
3
3
  module Bullematic
4
4
  class Detection
5
- @type: Symbol
5
+ @source_digest: String?
6
6
 
7
- @base_class: untyped
7
+ @context_id: untyped
8
8
 
9
- @associations: Array[Symbol]
9
+ @method_name: String?
10
10
 
11
- @call_stack: Array[String]
11
+ @line_number: Integer?
12
12
 
13
13
  @source_file: String?
14
14
 
15
- @line_number: Integer?
15
+ @call_stack: Array[String]
16
16
 
17
- @method_name: String?
17
+ @associations: Array[Symbol]
18
+
19
+ @base_class: untyped
20
+
21
+ @type: Symbol
18
22
 
19
23
  # @rbs!
20
24
  # attr_reader type: Symbol
@@ -24,6 +28,8 @@ module Bullematic
24
28
  # attr_reader source_file: String?
25
29
  # attr_reader line_number: Integer?
26
30
  # attr_reader method_name: String?
31
+ # attr_reader context_id: untyped
32
+ # attr_reader source_digest: String?
27
33
  attr_reader type: untyped
28
34
 
29
35
  # @rbs!
@@ -34,6 +40,8 @@ module Bullematic
34
40
  # attr_reader source_file: String?
35
41
  # attr_reader line_number: Integer?
36
42
  # attr_reader method_name: String?
43
+ # attr_reader context_id: untyped
44
+ # attr_reader source_digest: String?
37
45
  attr_reader base_class: untyped
38
46
 
39
47
  # @rbs!
@@ -44,6 +52,8 @@ module Bullematic
44
52
  # attr_reader source_file: String?
45
53
  # attr_reader line_number: Integer?
46
54
  # attr_reader method_name: String?
55
+ # attr_reader context_id: untyped
56
+ # attr_reader source_digest: String?
47
57
  attr_reader associations: untyped
48
58
 
49
59
  # @rbs!
@@ -54,6 +64,8 @@ module Bullematic
54
64
  # attr_reader source_file: String?
55
65
  # attr_reader line_number: Integer?
56
66
  # attr_reader method_name: String?
67
+ # attr_reader context_id: untyped
68
+ # attr_reader source_digest: String?
57
69
  attr_reader call_stack: untyped
58
70
 
59
71
  # @rbs!
@@ -64,6 +76,8 @@ module Bullematic
64
76
  # attr_reader source_file: String?
65
77
  # attr_reader line_number: Integer?
66
78
  # attr_reader method_name: String?
79
+ # attr_reader context_id: untyped
80
+ # attr_reader source_digest: String?
67
81
  attr_reader source_file: untyped
68
82
 
69
83
  # @rbs!
@@ -74,6 +88,8 @@ module Bullematic
74
88
  # attr_reader source_file: String?
75
89
  # attr_reader line_number: Integer?
76
90
  # attr_reader method_name: String?
91
+ # attr_reader context_id: untyped
92
+ # attr_reader source_digest: String?
77
93
  attr_reader line_number: untyped
78
94
 
79
95
  # @rbs!
@@ -84,14 +100,49 @@ module Bullematic
84
100
  # attr_reader source_file: String?
85
101
  # attr_reader line_number: Integer?
86
102
  # attr_reader method_name: String?
103
+ # attr_reader context_id: untyped
104
+ # attr_reader source_digest: String?
87
105
  attr_reader method_name: untyped
88
106
 
107
+ # @rbs!
108
+ # attr_reader type: Symbol
109
+ # attr_reader base_class: untyped
110
+ # attr_reader associations: Array[Symbol]
111
+ # attr_reader call_stack: Array[String]
112
+ # attr_reader source_file: String?
113
+ # attr_reader line_number: Integer?
114
+ # attr_reader method_name: String?
115
+ # attr_reader context_id: untyped
116
+ # attr_reader source_digest: String?
117
+ attr_reader context_id: untyped
118
+
119
+ # @rbs!
120
+ # attr_reader type: Symbol
121
+ # attr_reader base_class: untyped
122
+ # attr_reader associations: Array[Symbol]
123
+ # attr_reader call_stack: Array[String]
124
+ # attr_reader source_file: String?
125
+ # attr_reader line_number: Integer?
126
+ # attr_reader method_name: String?
127
+ # attr_reader context_id: untyped
128
+ # attr_reader source_digest: String?
129
+ attr_reader source_digest: untyped
130
+
89
131
  # @rbs type: Symbol
90
132
  # @rbs base_class: untyped
91
133
  # @rbs associations: untyped
92
134
  # @rbs call_stack: Array[String]
135
+ # @rbs context_id: untyped
136
+ # @rbs source_digest: String?
93
137
  # @rbs return: void
94
- def initialize: (type: Symbol, base_class: untyped, associations: untyped, call_stack: Array[String]) -> void
138
+ def initialize: (type: Symbol, base_class: untyped, associations: untyped, call_stack: Array[String], ?context_id: untyped, ?source_digest: String?) -> void
139
+
140
+ # @rbs data: Hash[String, untyped]
141
+ # @rbs return: Detection
142
+ def self.from_h: (Hash[String, untyped] data) -> Detection
143
+
144
+ # @rbs return: Hash[String, untyped]
145
+ def to_h: () -> Hash[String, untyped]
95
146
 
96
147
  # : () -> String
97
148
  def model_class_name: () -> String
@@ -99,6 +150,9 @@ module Bullematic
99
150
  # : () -> bool
100
151
  def fixable?: () -> bool
101
152
 
153
+ # : () -> Array[untyped]
154
+ def fingerprint: () -> Array[untyped]
155
+
102
156
  private
103
157
 
104
158
  # @rbs assocs: untyped
@@ -113,5 +167,21 @@ module Bullematic
113
167
 
114
168
  # : () -> bool
115
169
  def skip_path?: () -> bool
170
+
171
+ # @rbs filepath: String
172
+ # @rbs paths: Array[String]
173
+ # @rbs return: bool
174
+ def path_in?: (String filepath, Array[String] paths) -> bool
175
+
176
+ # @rbs path: String
177
+ # @rbs return: Pathname
178
+ def expand_path: (String path) -> Pathname
179
+
180
+ # @rbs path: String
181
+ # @rbs return: Pathname
182
+ def absolute_path: (String path) -> Pathname
183
+
184
+ # @rbs return: String?
185
+ def current_source_digest: () -> String?
116
186
  end
117
187
  end
@@ -0,0 +1,35 @@
1
+ # Generated from lib/bullematic/evidence_store.rb with RBS::Inline
2
+
3
+ module Bullematic
4
+ class EvidenceStore
5
+ ENV_KEY: ::String
6
+
7
+ DEFAULT_PATH: ::String
8
+
9
+ # : () -> bool
10
+ def self.recording?: () -> bool
11
+
12
+ # : () -> String
13
+ def self.path: () -> String
14
+
15
+ # @rbs detection: Detection
16
+ # @rbs filepath: String
17
+ # @rbs return: void
18
+ def self.append: (Detection detection, ?String filepath) -> void
19
+
20
+ # @rbs filepath: String
21
+ # @rbs return: void
22
+ def self.clear: (?String filepath) -> void
23
+
24
+ # @rbs filepath: String
25
+ # @rbs return: Array[Detection]
26
+ def self.read: (?String filepath) -> Array[Detection]
27
+
28
+ # @rbs filepath: String
29
+ # @rbs return: void
30
+ private def self.reject_symlink!: (String filepath) -> void
31
+
32
+ # : (String, Integer) { (File) -> untyped } -> untyped
33
+ private def self.open_evidence: (String, Integer) { (File) -> untyped } -> untyped
34
+ end
35
+ end
@@ -12,8 +12,17 @@ module Bullematic
12
12
  # : () -> void
13
13
  def self.clear: () -> void
14
14
 
15
- # : () -> void
16
- def self.apply_fixes: () -> void
15
+ # : () -> Hash[Symbol, Integer]
16
+ def self.apply_fixes: () -> Hash[Symbol, Integer]
17
+
18
+ # : () -> Array[Detection]
19
+ private def self.queue_store: () -> Array[Detection]
20
+
21
+ # : () -> Mutex
22
+ private def self.queue_mutex: () -> Mutex
23
+
24
+ # : () -> Array[Detection]
25
+ private def self.drain_queue: () -> Array[Detection]
17
26
 
18
27
  # @rbs filepath: String
19
28
  # @rbs detections: Array[Detection]
@@ -26,8 +35,55 @@ module Bullematic
26
35
  # @rbs return: AST::Finder::QueryLocation?
27
36
  private def self.find_query_location: (AST::Finder finder, Detection detection) -> AST::Finder::QueryLocation?
28
37
 
38
+ # @rbs finder: AST::Finder
39
+ # @rbs detections: Array[Detection]
40
+ # @rbs logger: BullematicLogger
41
+ # @rbs filepath: String
42
+ # @rbs return: Array[Hash[Symbol, untyped]]
43
+ private def self.build_requests: (AST::Finder finder, Array[Detection] detections, BullematicLogger logger, String filepath) -> Array[Hash[Symbol, untyped]]
44
+
45
+ # @rbs detection: Detection
46
+ # @rbs return: bool
47
+ private def self.valid_associations?: (Detection detection) -> bool
48
+
49
+ # @rbs detection: Detection
50
+ # @rbs candidates: Array[Detection]
51
+ # @rbs consumed: Array[Detection]
52
+ # @rbs seen: Array[String]
53
+ # @rbs finder: AST::Finder
54
+ # @rbs return: Array[untyped]
55
+ private def self.association_tree: (Detection detection, Array[Detection] candidates, Array[Detection] consumed, Array[String] seen, AST::Finder finder) -> Array[untyped]
56
+
57
+ # @rbs parent: Detection
58
+ # @rbs association: Symbol
59
+ # @rbs candidates: Array[Detection]
60
+ # @rbs finder: AST::Finder
61
+ # @rbs return: Detection?
62
+ private def self.nested_detection: (Detection parent, Symbol association, Array[Detection] candidates, AST::Finder finder) -> Detection?
63
+
64
+ # @rbs detection: Detection
65
+ # @rbs return: String?
66
+ private def self.normalized_method: (Detection detection) -> String?
67
+
68
+ # @rbs left: Detection
69
+ # @rbs right: Detection
70
+ # @rbs return: bool
71
+ private def self.same_execution_location?: (Detection left, Detection right) -> bool
72
+
73
+ # @rbs name: String
74
+ # @rbs return: untyped
75
+ private def self.constantize_model: (String name) -> untyped
76
+
77
+ # @rbs filepath: String
78
+ # @rbs source: String
79
+ # @rbs expected_digest: String
80
+ # @rbs return: void
81
+ private def self.atomic_write: (String filepath, String source, String expected_digest) -> void
82
+
29
83
  # @rbs filepath: String
84
+ # @rbs source: String
85
+ # @rbs mode: Integer
30
86
  # @rbs return: void
31
- private def self.backup_file: (String filepath) -> void
87
+ private def self.backup_file: (String filepath, String source, Integer mode) -> void
32
88
  end
33
89
  end
@@ -3,6 +3,7 @@
3
3
  module Bullematic
4
4
  module Integrations
5
5
  class Railtie < ::Rails::Railtie
6
+ BULLET_MIDDLEWARE_INITIALIZER: untyped
6
7
  end
7
8
  end
8
9
 
@@ -16,5 +17,11 @@ module Bullematic
16
17
  # @rbs env: Hash[String, untyped]
17
18
  # @rbs return: untyped
18
19
  def call: (Hash[String, untyped] env) -> untyped
20
+
21
+ private
22
+
23
+ # @rbs env: Hash[String, untyped]
24
+ # @rbs return: void
25
+ def capture_notifications: (Hash[String, untyped] env) -> void
19
26
  end
20
27
  end
@@ -35,6 +35,11 @@ module Bullematic
35
35
  # @rbs return: void
36
36
  def log_fix: (String filepath, Detection detection) -> void
37
37
 
38
+ # @rbs filepath: String
39
+ # @rbs detection: Detection
40
+ # @rbs return: void
41
+ def log_plan: (String filepath, Detection detection) -> void
42
+
38
43
  # @rbs filepath: String
39
44
  # @rbs detection: Detection
40
45
  # @rbs reason: String
@@ -5,26 +5,30 @@ module Bullematic
5
5
  # : () -> void
6
6
  def self.setup: () -> void
7
7
 
8
- # : () -> void
9
- def self.process_notifications: () -> void
8
+ # : () -> bool
9
+ def self.compatible?: () -> bool
10
10
 
11
- # : () -> void
12
- private def self.setup_notification_hook: () -> void
11
+ # @rbs context_id: untyped
12
+ # @rbs return: void
13
+ def self.process_notifications: (?context_id: untyped) -> void
14
+
15
+ # @rbs notification: untyped
16
+ # @rbs context_id: untyped
17
+ # @rbs return: Symbol?
18
+ private def self.process_notification: (untyped notification, untyped context_id) -> Symbol?
13
19
 
14
20
  # @rbs notification: untyped
21
+ # @rbs context_id: untyped
15
22
  # @rbs return: void
16
- private def self.process_n_plus_one: (untyped notification) -> void
23
+ private def self.process_n_plus_one: (untyped notification, untyped context_id) -> void
24
+
25
+ # @rbs notification: untyped
26
+ # @rbs context_id: untyped
27
+ # @rbs return: void
28
+ private def self.process_unused_eager_loading: (untyped notification, untyped context_id) -> void
17
29
 
18
30
  # @rbs notification: untyped
19
31
  # @rbs return: Array[String]
20
32
  private def self.extract_call_stack: (untyped notification) -> Array[String]
21
-
22
- module NotificationHook
23
- # @rbs base_class: untyped
24
- # @rbs associations: untyped
25
- # @rbs path: untyped
26
- # @rbs return: void
27
- def initialize: (untyped base_class, untyped associations, ?untyped path) -> void
28
- end
29
33
  end
30
34
  end
@@ -10,7 +10,12 @@ module Bullematic
10
10
  class FixError < Error
11
11
  end
12
12
 
13
+ @configuration: Configuration?
14
+
15
+ # : () -> Configuration?
13
16
  def self.configuration: () -> Configuration?
17
+
18
+ # : (Configuration?) -> Configuration?
14
19
  def self.configuration=: (Configuration?) -> Configuration?
15
20
 
16
21
  # : () { (Configuration) -> void } -> void
data/sig/stubs/rails.rbs CHANGED
@@ -41,6 +41,13 @@ module ActiveSupport
41
41
  end
42
42
 
43
43
  module Bullet
44
+ class BulletRailtie
45
+ def self.initializers: () -> Array[untyped]
46
+ end
47
+
48
+ class Rack
49
+ end
50
+
44
51
  def self.enable?: () -> bool
45
52
  def self.start_request: () -> void
46
53
  def self.end_request: () -> void
@@ -53,10 +60,21 @@ module Bullet
53
60
 
54
61
  def initialize: (untyped, untyped, ?untyped?) -> void
55
62
  end
63
+
64
+ class UnusedEagerLoading
65
+ attr_reader base_class: untyped
66
+ attr_reader associations: untyped
67
+ end
68
+ end
69
+
70
+ module Detector
71
+ module Association
72
+ end
56
73
  end
57
74
  end
58
75
 
59
76
  class Prism::CallNode
77
+ def block: () -> untyped
60
78
  def receiver: () -> untyped
61
79
  def name: () -> Symbol
62
80
  def arguments: () -> untyped
@@ -65,14 +83,37 @@ end
65
83
 
66
84
  class Prism::ConstantReadNode
67
85
  def name: () -> Symbol
86
+ def full_name: () -> String
87
+ def location: () -> untyped
88
+ end
89
+
90
+ class Prism::ConstantPathNode
91
+ def full_name: () -> String
68
92
  def location: () -> untyped
69
93
  end
70
94
 
71
95
  class Prism::InstanceVariableWriteNode
96
+ def name: () -> Symbol
97
+ def value: () -> untyped
98
+ def location: () -> untyped
99
+ end
100
+
101
+ class Prism::LocalVariableWriteNode
102
+ def name: () -> Symbol
72
103
  def value: () -> untyped
73
104
  def location: () -> untyped
74
105
  end
75
106
 
107
+ class Prism::InstanceVariableReadNode
108
+ def name: () -> Symbol
109
+ def location: () -> untyped
110
+ end
111
+
112
+ class Prism::LocalVariableReadNode
113
+ def name: () -> Symbol
114
+ def location: () -> untyped
115
+ end
116
+
76
117
  class Prism::SymbolNode
77
118
  def value: () -> String
78
119
  end
@@ -81,6 +122,25 @@ class Prism::ArrayNode
81
122
  def elements: () -> Array[untyped]
82
123
  end
83
124
 
125
+ class Prism::KeywordHashNode
126
+ def elements: () -> Array[untyped]
127
+ end
128
+
129
+ class Prism::HashNode
130
+ def elements: () -> Array[untyped]
131
+ end
132
+
133
+ class Prism::AssocNode
134
+ def key: () -> untyped
135
+ def value: () -> untyped
136
+ end
137
+
138
+ class Prism::DefNode
139
+ def name: () -> Symbol
140
+ def body: () -> untyped
141
+ def location: () -> untyped
142
+ end
143
+
84
144
  module Prism
85
145
  def self.parse: (String, ?filepath: String?) -> untyped
86
146
  def self.parse_file: (String) -> untyped
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullematic
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
  - Yudai Takada
@@ -16,6 +16,9 @@ dependencies:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: '6.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '9.0'
19
22
  type: :runtime
20
23
  prerelease: false
21
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -23,6 +26,9 @@ dependencies:
23
26
  - - ">="
24
27
  - !ruby/object:Gem::Version
25
28
  version: '6.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '9.0'
26
32
  - !ruby/object:Gem::Dependency
27
33
  name: prism
28
34
  requirement: !ruby/object:Gem::Requirement
@@ -37,25 +43,172 @@ dependencies:
37
43
  - - ">="
38
44
  - !ruby/object:Gem::Version
39
45
  version: 0.24.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: appraisal
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.5'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.5'
60
+ - !ruby/object:Gem::Dependency
61
+ name: combustion
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.4'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '1.4'
74
+ - !ruby/object:Gem::Dependency
75
+ name: database_cleaner-active_record
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '2.1'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '2.1'
88
+ - !ruby/object:Gem::Dependency
89
+ name: factory_bot
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '6.4'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '6.4'
102
+ - !ruby/object:Gem::Dependency
103
+ name: minitest
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '5.20'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '5.20'
116
+ - !ruby/object:Gem::Dependency
117
+ name: rails
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '6.1'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '6.1'
130
+ - !ruby/object:Gem::Dependency
131
+ name: rspec
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3.12'
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '3.12'
144
+ - !ruby/object:Gem::Dependency
145
+ name: rspec-rails
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '6.1'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '6.1'
158
+ - !ruby/object:Gem::Dependency
159
+ name: simplecov
160
+ requirement: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '0.22'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '0.22'
172
+ - !ruby/object:Gem::Dependency
173
+ name: sqlite3
174
+ requirement: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '1.7'
179
+ - - "<"
180
+ - !ruby/object:Gem::Version
181
+ version: '3.0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '1.7'
189
+ - - "<"
190
+ - !ruby/object:Gem::Version
191
+ version: '3.0'
40
192
  description: Automatically adds includes/preload to fix N+1 queries detected by Bullet
41
193
  email:
42
194
  - t.yudai92@gmail.com
43
- executables: []
195
+ executables:
196
+ - bullematic
44
197
  extensions: []
45
198
  extra_rdoc_files: []
46
199
  files:
47
200
  - CHANGELOG.md
48
201
  - LICENSE.txt
49
202
  - README.md
50
- - Rakefile
51
- - Steepfile
52
- - assets/logo-header.svg
203
+ - exe/bullematic
53
204
  - lib/bullematic.rb
54
205
  - lib/bullematic/ast/finder.rb
55
206
  - lib/bullematic/ast/parser.rb
56
207
  - lib/bullematic/ast/rewriter.rb
208
+ - lib/bullematic/cli.rb
57
209
  - lib/bullematic/configuration.rb
58
210
  - lib/bullematic/detection.rb
211
+ - lib/bullematic/evidence_store.rb
59
212
  - lib/bullematic/fixer.rb
60
213
  - lib/bullematic/integrations/minitest.rb
61
214
  - lib/bullematic/integrations/rails.rb
@@ -63,14 +216,14 @@ files:
63
216
  - lib/bullematic/logger.rb
64
217
  - lib/bullematic/notifier.rb
65
218
  - lib/bullematic/version.rb
66
- - rbs_collection.lock.yaml
67
- - rbs_collection.yaml
68
219
  - sig/generated/bullematic.rbs
69
220
  - sig/generated/bullematic/ast/finder.rbs
70
221
  - sig/generated/bullematic/ast/parser.rbs
71
222
  - sig/generated/bullematic/ast/rewriter.rbs
223
+ - sig/generated/bullematic/cli.rbs
72
224
  - sig/generated/bullematic/configuration.rbs
73
225
  - sig/generated/bullematic/detection.rbs
226
+ - sig/generated/bullematic/evidence_store.rbs
74
227
  - sig/generated/bullematic/fixer.rbs
75
228
  - sig/generated/bullematic/integrations/minitest.rbs
76
229
  - sig/generated/bullematic/integrations/rails.rbs
@@ -102,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
255
  - !ruby/object:Gem::Version
103
256
  version: '0'
104
257
  requirements: []
105
- rubygems_version: 4.0.3
258
+ rubygems_version: 4.0.19
106
259
  specification_version: 4
107
260
  summary: Auto-fix N+1 queries detected by Bullet at runtime
108
261
  test_files: []