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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -1
- data/README.md +23 -11
- data/exe/bullematic +7 -0
- data/lib/bullematic/ast/finder.rb +190 -35
- data/lib/bullematic/ast/parser.rb +1 -17
- data/lib/bullematic/ast/rewriter.rb +90 -28
- data/lib/bullematic/cli.rb +185 -0
- data/lib/bullematic/configuration.rb +15 -4
- data/lib/bullematic/detection.rb +110 -13
- data/lib/bullematic/evidence_store.rb +78 -0
- data/lib/bullematic/fixer.rb +258 -31
- data/lib/bullematic/integrations/minitest.rb +20 -6
- data/lib/bullematic/integrations/rails.rb +23 -9
- data/lib/bullematic/integrations/rspec.rb +19 -7
- data/lib/bullematic/logger.rb +24 -12
- data/lib/bullematic/notifier.rb +131 -36
- data/lib/bullematic/version.rb +1 -1
- data/lib/bullematic.rb +12 -4
- data/sig/generated/bullematic/ast/finder.rbs +70 -11
- data/sig/generated/bullematic/ast/parser.rbs +0 -6
- data/sig/generated/bullematic/ast/rewriter.rbs +28 -11
- data/sig/generated/bullematic/cli.rbs +56 -0
- data/sig/generated/bullematic/configuration.rbs +16 -20
- data/sig/generated/bullematic/detection.rbs +77 -7
- data/sig/generated/bullematic/evidence_store.rbs +35 -0
- data/sig/generated/bullematic/fixer.rbs +59 -3
- data/sig/generated/bullematic/integrations/rails.rbs +7 -0
- data/sig/generated/bullematic/logger.rbs +5 -0
- data/sig/generated/bullematic/notifier.rbs +17 -13
- data/sig/generated/bullematic.rbs +5 -0
- data/sig/stubs/rails.rbs +60 -0
- metadata +161 -8
- data/Rakefile +0 -26
- data/Steepfile +0 -15
- data/assets/logo-header.svg +0 -28
- data/rbs_collection.lock.yaml +0 -24
- data/rbs_collection.yaml +0 -14
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
module Bullematic
|
|
4
4
|
class Detection
|
|
5
|
-
@
|
|
5
|
+
@source_digest: String?
|
|
6
6
|
|
|
7
|
-
@
|
|
7
|
+
@context_id: untyped
|
|
8
8
|
|
|
9
|
-
@
|
|
9
|
+
@method_name: String?
|
|
10
10
|
|
|
11
|
-
@
|
|
11
|
+
@line_number: Integer?
|
|
12
12
|
|
|
13
13
|
@source_file: String?
|
|
14
14
|
|
|
15
|
-
@
|
|
15
|
+
@call_stack: Array[String]
|
|
16
16
|
|
|
17
|
-
@
|
|
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
|
-
# : () ->
|
|
16
|
-
def self.apply_fixes: () ->
|
|
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
|
-
# : () ->
|
|
9
|
-
def self.
|
|
8
|
+
# : () -> bool
|
|
9
|
+
def self.compatible?: () -> bool
|
|
10
10
|
|
|
11
|
-
# :
|
|
12
|
-
|
|
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.
|
|
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
|
-
-
|
|
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.
|
|
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: []
|