spoom 1.0.4 → 1.0.5
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/README.md +253 -1
- data/Rakefile +1 -0
- data/lib/spoom.rb +2 -1
- data/lib/spoom/cli.rb +42 -7
- data/lib/spoom/cli/bump.rb +59 -0
- data/lib/spoom/cli/config.rb +51 -0
- data/lib/spoom/cli/coverage.rb +191 -0
- data/lib/spoom/cli/helper.rb +70 -0
- data/lib/spoom/cli/lsp.rb +165 -0
- data/lib/spoom/cli/run.rb +79 -0
- data/lib/spoom/config.rb +1 -1
- data/lib/spoom/coverage.rb +73 -0
- data/lib/spoom/coverage/d3.rb +110 -0
- data/lib/spoom/coverage/d3/base.rb +50 -0
- data/lib/spoom/coverage/d3/circle_map.rb +195 -0
- data/lib/spoom/coverage/d3/pie.rb +175 -0
- data/lib/spoom/coverage/d3/timeline.rb +486 -0
- data/lib/spoom/coverage/report.rb +308 -0
- data/lib/spoom/coverage/snapshot.rb +132 -0
- data/lib/spoom/file_tree.rb +196 -0
- data/lib/spoom/git.rb +98 -0
- data/lib/spoom/printer.rb +81 -0
- data/lib/spoom/sorbet.rb +15 -2
- data/lib/spoom/sorbet/errors.rb +25 -15
- data/lib/spoom/sorbet/lsp.rb +4 -2
- data/lib/spoom/sorbet/lsp/structures.rb +108 -14
- data/lib/spoom/sorbet/metrics.rb +10 -79
- data/lib/spoom/sorbet/sigils.rb +98 -0
- data/lib/spoom/test_helpers/project.rb +103 -0
- data/lib/spoom/timeline.rb +53 -0
- data/lib/spoom/version.rb +1 -1
- metadata +25 -10
- data/lib/spoom/cli/commands/base.rb +0 -36
- data/lib/spoom/cli/commands/config.rb +0 -67
- data/lib/spoom/cli/commands/lsp.rb +0 -156
- data/lib/spoom/cli/commands/run.rb +0 -92
- data/lib/spoom/cli/symbol_printer.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a5f19185a1beba98f75c9c96b08c06400c9917c0d85734f1dbf9c9d77e3fa74
|
4
|
+
data.tar.gz: 53f4b8b10f81b19588f58d57c93349721230836e3b98524b52c46a78f4682365
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aff5a2bc4b3bd01c815ad0d00e76fcc700728ec659135645dce259db72dc97cf8ea2d339827d979bf9f225637b7d23f2ea09d13dd02786229fe5c42caf88886e
|
7
|
+
data.tar.gz: b2760f8f58a7f3cbfd90d59e16f5bb9b76356f13fc3f38a606758652f53caf72004024128e4195451ca32f30c9d03c6bdb553a6a7aea2893c7f0e6a2e6ec2528
|
data/README.md
CHANGED
@@ -20,7 +20,218 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
23
|
+
`spoom` provides both a CLI and an API to interact with Sorbet.
|
24
|
+
|
25
|
+
### Generate a typing coverage report
|
26
|
+
|
27
|
+
Spoom can create a typing coverage report from Sorbet and Git data:
|
28
|
+
|
29
|
+

|
30
|
+
|
31
|
+
After installing the `spoom` gem, run the `timeline` command to collect the history data:
|
32
|
+
|
33
|
+
```
|
34
|
+
$ spoom coverage timeline --save
|
35
|
+
```
|
36
|
+
|
37
|
+
Then create the HTML page with `report`:
|
38
|
+
|
39
|
+
```
|
40
|
+
$ spoom coverage report
|
41
|
+
```
|
42
|
+
|
43
|
+
Your report will be generated under `spoom_report.html`.
|
44
|
+
|
45
|
+
See all the [Typing Coverage](#typing-coverage) CLI commands for more details.
|
46
|
+
|
47
|
+
### Command Line Interface
|
48
|
+
|
49
|
+
#### Sorbet configuration commands
|
50
|
+
|
51
|
+
Spoom works with your `sorbet/config` file. No additional configuration is needed.
|
52
|
+
|
53
|
+
Show Sorbet config options:
|
54
|
+
|
55
|
+
```
|
56
|
+
$ spoom config
|
57
|
+
```
|
58
|
+
|
59
|
+
#### Listing files
|
60
|
+
|
61
|
+
List the files (and related strictness) that will be typchecked with the current Sorbet config options:
|
62
|
+
|
63
|
+
```
|
64
|
+
$ spoom files
|
65
|
+
```
|
66
|
+
|
67
|
+
#### Errors sorting and filtering
|
68
|
+
|
69
|
+
List all typechecking errors sorted by location:
|
70
|
+
|
71
|
+
```
|
72
|
+
$ spoom tc -s
|
73
|
+
```
|
74
|
+
|
75
|
+
List all typechecking errors sorted by error code first:
|
76
|
+
|
77
|
+
```
|
78
|
+
$ spoom tc -s code
|
79
|
+
```
|
80
|
+
|
81
|
+
List only typechecking errors from a specific error code:
|
82
|
+
|
83
|
+
```
|
84
|
+
$ spoom tc -c 7004
|
85
|
+
```
|
86
|
+
|
87
|
+
List only the first 10 typechecking errors
|
88
|
+
|
89
|
+
```
|
90
|
+
$ spoom tc -l 10
|
91
|
+
```
|
92
|
+
|
93
|
+
These options can be combined:
|
94
|
+
|
95
|
+
```
|
96
|
+
$ spoom tc -s -c 7004 -l 10
|
97
|
+
```
|
98
|
+
|
99
|
+
#### Typing coverage
|
100
|
+
|
101
|
+
Show metrics about the project contents and the typing coverage:
|
102
|
+
|
103
|
+
```
|
104
|
+
$ spoom coverage
|
105
|
+
```
|
106
|
+
|
107
|
+
Save coverage data under `spoom_data/`:
|
108
|
+
|
109
|
+
```
|
110
|
+
$ spoom coverage --save
|
111
|
+
```
|
112
|
+
|
113
|
+
Save coverage data under a specific directory:
|
114
|
+
|
115
|
+
```
|
116
|
+
$ spoom coverage --save my_data/
|
117
|
+
```
|
118
|
+
|
119
|
+
Show typing coverage evolution based on the commits history:
|
120
|
+
|
121
|
+
```
|
122
|
+
$ spoom coverage timeline
|
123
|
+
```
|
124
|
+
|
125
|
+
Show typing coverage evolution based on the commits history between specific dates:
|
126
|
+
|
127
|
+
```
|
128
|
+
$ spoom coverage timeline --from YYYY-MM-DD --to YYYY-MM-DD
|
129
|
+
```
|
130
|
+
|
131
|
+
Save the typing coverage evolution as JSON under `spoom_data/`:
|
132
|
+
|
133
|
+
```
|
134
|
+
$ spoom coverage timeline --save
|
135
|
+
```
|
136
|
+
|
137
|
+
Save the typing coverage evolution as JSON in a specific directory:
|
138
|
+
|
139
|
+
```
|
140
|
+
$ spoom coverage timeline --save my_data/
|
141
|
+
```
|
142
|
+
|
143
|
+
Run `bundle install` for each commit of the timeline (may solve errors due to different Sorbet versions):
|
144
|
+
|
145
|
+
```
|
146
|
+
$ spoom coverage timeline --bundle-install
|
147
|
+
```
|
148
|
+
|
149
|
+
Generate an HTML typing coverage report:
|
150
|
+
|
151
|
+
```
|
152
|
+
$ spoom coverage report
|
153
|
+
```
|
154
|
+
|
155
|
+
Change the colors used for strictnesses (useful for colorblind folks):
|
156
|
+
|
157
|
+
```
|
158
|
+
$ spoom coverage report \
|
159
|
+
--color-true "#648ffe" \
|
160
|
+
--color-false "#fe6002" \
|
161
|
+
--color-ignore "#feb000" \
|
162
|
+
--color-strict "#795ef0" \
|
163
|
+
--color-strong "#6444f1"
|
164
|
+
```
|
165
|
+
|
166
|
+
Open the HTML typing coverage report:
|
167
|
+
|
168
|
+
```
|
169
|
+
$ spoom coverage open
|
170
|
+
```
|
171
|
+
|
172
|
+
#### Change the sigil used in files
|
173
|
+
|
174
|
+
Bump the strictness from all files currently at `typed: false` to `typed: true` where it does not create typechecking errors:
|
175
|
+
|
176
|
+
```
|
177
|
+
$ spoom bump --from false --to true
|
178
|
+
```
|
179
|
+
|
180
|
+
Bump the strictness from all files currently at `typed: false` to `typed: true` even if it creates typechecking errors:
|
181
|
+
|
182
|
+
```
|
183
|
+
$ spoom bump --from false --to true -f
|
184
|
+
```
|
185
|
+
|
186
|
+
#### Interact with Sorbet LSP mode
|
187
|
+
|
188
|
+
**Experimental**
|
189
|
+
|
190
|
+
Find all definitions for `Foo`:
|
191
|
+
|
192
|
+
```
|
193
|
+
$ spoom lsp find Foo
|
194
|
+
```
|
195
|
+
|
196
|
+
List all symbols in a file:
|
197
|
+
|
198
|
+
```
|
199
|
+
$ spoom lsp symbols <file.rb>
|
200
|
+
```
|
201
|
+
|
202
|
+
List all definitions for a specific code location:
|
203
|
+
|
204
|
+
```
|
205
|
+
$ spoom lsp defs <file.rb> <line> <column>
|
206
|
+
```
|
207
|
+
|
208
|
+
List all references for a specific code location:
|
209
|
+
|
210
|
+
```
|
211
|
+
$ spoom lsp refs <file.rb> <line> <column>
|
212
|
+
```
|
213
|
+
|
214
|
+
Show hover information for a specific code location:
|
215
|
+
|
216
|
+
```
|
217
|
+
$ spoom lsp hover <file.rb> <line> <column>
|
218
|
+
```
|
219
|
+
|
220
|
+
Show signature information for a specific code location:
|
221
|
+
|
222
|
+
```
|
223
|
+
$ spoom lsp sig <file.rb> <line> <column>
|
224
|
+
```
|
225
|
+
|
226
|
+
Show type information for a specific code location:
|
227
|
+
|
228
|
+
```
|
229
|
+
$ spoom lsp sig <file.rb> <line> <column>
|
230
|
+
```
|
231
|
+
|
232
|
+
### API
|
233
|
+
|
234
|
+
#### Parsing Sorbet config
|
24
235
|
|
25
236
|
Parses a Sorbet config file:
|
26
237
|
|
@@ -41,6 +252,47 @@ puts config.paths # "a", "b"
|
|
41
252
|
puts config.ignore # "c"
|
42
253
|
```
|
43
254
|
|
255
|
+
List all files typchecked by Sorbet:
|
256
|
+
|
257
|
+
```ruby
|
258
|
+
config = Spoom::Sorbet::Config.parse_file("sorbet/config")
|
259
|
+
puts Spoom::Sorbet.srb_files(config)
|
260
|
+
```
|
261
|
+
|
262
|
+
#### Parsing Sorbet metrics
|
263
|
+
|
264
|
+
Display metrics collected during typechecking:
|
265
|
+
|
266
|
+
```ruby
|
267
|
+
puts Spoom::Sorbet.srb_metrics(capture_err: false)
|
268
|
+
```
|
269
|
+
|
270
|
+
#### Interacting with LSP
|
271
|
+
|
272
|
+
Create an LSP client:
|
273
|
+
|
274
|
+
```rb
|
275
|
+
client = Spoom::LSP::Client.new(
|
276
|
+
Spoom::Config::SORBET_PATH,
|
277
|
+
"--lsp",
|
278
|
+
"--enable-all-experimental-lsp-features",
|
279
|
+
"--disable-watchman",
|
280
|
+
)
|
281
|
+
client.open(".")
|
282
|
+
```
|
283
|
+
|
284
|
+
Find all the symbols matching a string:
|
285
|
+
|
286
|
+
```rb
|
287
|
+
puts client.symbols("Foo")
|
288
|
+
```
|
289
|
+
|
290
|
+
Find all the symbols for a file:
|
291
|
+
|
292
|
+
```rb
|
293
|
+
puts client.document_symbols("file://path/to/my/file.rb")
|
294
|
+
```
|
295
|
+
|
44
296
|
## Development
|
45
297
|
|
46
298
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Don't forget to run `bin/sanity` before pushing your changes.
|
data/Rakefile
CHANGED
data/lib/spoom.rb
CHANGED
data/lib/spoom/cli.rb
CHANGED
@@ -3,25 +3,60 @@
|
|
3
3
|
|
4
4
|
require "thor"
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
|
8
|
-
require_relative "cli/
|
6
|
+
require_relative 'cli/helper'
|
7
|
+
|
8
|
+
require_relative "cli/bump"
|
9
|
+
require_relative "cli/config"
|
10
|
+
require_relative "cli/lsp"
|
11
|
+
require_relative "cli/coverage"
|
12
|
+
require_relative "cli/run"
|
9
13
|
|
10
14
|
module Spoom
|
11
15
|
module Cli
|
12
16
|
class Main < Thor
|
13
17
|
extend T::Sig
|
18
|
+
include Helper
|
19
|
+
|
20
|
+
class_option :color, desc: "Use colors", type: :boolean, default: true
|
21
|
+
class_option :path, desc: "Run spoom in a specific path", type: :string, default: ".", aliases: :p
|
22
|
+
map T.unsafe(%w[--version -v] => :__print_version)
|
14
23
|
|
15
|
-
|
24
|
+
desc "bump", "bump Sorbet sigils from `false` to `true` when no errors"
|
25
|
+
subcommand "bump", Spoom::Cli::Bump
|
16
26
|
|
17
27
|
desc "config", "manage Sorbet config"
|
18
|
-
subcommand "config", Spoom::Cli::
|
28
|
+
subcommand "config", Spoom::Cli::Config
|
29
|
+
|
30
|
+
desc "coverage", "collect metrics related to Sorbet coverage"
|
31
|
+
subcommand "coverage", Spoom::Cli::Coverage
|
19
32
|
|
20
33
|
desc "lsp", "send LSP requests to Sorbet"
|
21
|
-
subcommand "lsp", Spoom::Cli::
|
34
|
+
subcommand "lsp", Spoom::Cli::LSP
|
22
35
|
|
23
36
|
desc "tc", "run Sorbet and parses its output"
|
24
|
-
subcommand "tc", Spoom::Cli::
|
37
|
+
subcommand "tc", Spoom::Cli::Run
|
38
|
+
|
39
|
+
desc "files", "list all the files typechecked by Sorbet"
|
40
|
+
def files
|
41
|
+
in_sorbet_project!
|
42
|
+
|
43
|
+
path = exec_path
|
44
|
+
config = Spoom::Sorbet::Config.parse_file(sorbet_config)
|
45
|
+
files = Spoom::Sorbet.srb_files(config, path: path)
|
46
|
+
|
47
|
+
say("Files matching `#{sorbet_config}`:")
|
48
|
+
if files.empty?
|
49
|
+
say(" NONE")
|
50
|
+
else
|
51
|
+
tree = FileTree.new(files, strip_prefix: path)
|
52
|
+
tree.print(colors: options[:color], indent_level: 2)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "--version", "show version"
|
57
|
+
def __print_version
|
58
|
+
puts "Spoom v#{Spoom::VERSION}"
|
59
|
+
end
|
25
60
|
|
26
61
|
# Utils
|
27
62
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'find'
|
5
|
+
require 'open3'
|
6
|
+
|
7
|
+
module Spoom
|
8
|
+
module Cli
|
9
|
+
class Bump < Thor
|
10
|
+
extend T::Sig
|
11
|
+
include Helper
|
12
|
+
|
13
|
+
default_task :bump
|
14
|
+
|
15
|
+
desc "bump DIRECTORY", "change Sorbet sigils from one strictness to another when no errors"
|
16
|
+
option :from, type: :string, default: Spoom::Sorbet::Sigils::STRICTNESS_FALSE
|
17
|
+
option :to, type: :string, default: Spoom::Sorbet::Sigils::STRICTNESS_TRUE
|
18
|
+
option :force, desc: "change strictness without type checking", type: :boolean, default: false, aliases: :f
|
19
|
+
sig { params(directory: String).void }
|
20
|
+
def bump(directory = ".")
|
21
|
+
from = options[:from]
|
22
|
+
to = options[:to]
|
23
|
+
force = options[:force]
|
24
|
+
|
25
|
+
unless Sorbet::Sigils.valid_strictness?(from)
|
26
|
+
say_error("Invalid strictness #{from} for option --from")
|
27
|
+
exit(1)
|
28
|
+
end
|
29
|
+
|
30
|
+
unless Sorbet::Sigils.valid_strictness?(to)
|
31
|
+
say_error("Invalid strictness #{to} for option --to")
|
32
|
+
exit(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
files_to_bump = Sorbet::Sigils.files_with_sigil_strictness(directory, from)
|
36
|
+
|
37
|
+
Sorbet::Sigils.change_sigil_in_files(files_to_bump, to)
|
38
|
+
|
39
|
+
return [] if force
|
40
|
+
|
41
|
+
output, no_errors = Sorbet.srb_tc(path: File.expand_path(directory), capture_err: true)
|
42
|
+
|
43
|
+
return [] if no_errors
|
44
|
+
|
45
|
+
errors = Sorbet::Errors::Parser.parse_string(output)
|
46
|
+
|
47
|
+
files_with_errors = errors.map do |err|
|
48
|
+
path = err.file
|
49
|
+
File.join(directory, path) if path && File.file?(path)
|
50
|
+
end.compact.uniq
|
51
|
+
|
52
|
+
Sorbet::Sigils.change_sigil_in_files(files_with_errors, from)
|
53
|
+
end
|
54
|
+
|
55
|
+
no_commands do
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative "../file_tree"
|
5
|
+
require_relative "../sorbet/config"
|
6
|
+
|
7
|
+
module Spoom
|
8
|
+
module Cli
|
9
|
+
class Config < Thor
|
10
|
+
include Helper
|
11
|
+
|
12
|
+
default_task :show
|
13
|
+
|
14
|
+
desc "show", "show Sorbet config"
|
15
|
+
def show
|
16
|
+
in_sorbet_project!
|
17
|
+
config = Spoom::Sorbet::Config.parse_file(sorbet_config)
|
18
|
+
|
19
|
+
say("Found Sorbet config at `#{sorbet_config}`.")
|
20
|
+
|
21
|
+
say("\nPaths typechecked:")
|
22
|
+
if config.paths.empty?
|
23
|
+
say(" * (default: .)")
|
24
|
+
else
|
25
|
+
config.paths.each do |path|
|
26
|
+
say(" * #{path}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
say("\nPaths ignored:")
|
31
|
+
if config.ignore.empty?
|
32
|
+
say(" * (default: none)")
|
33
|
+
else
|
34
|
+
config.ignore.each do |path|
|
35
|
+
say(" * #{path}")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
say("\nAllowed extensions:")
|
40
|
+
if config.allowed_extensions.empty?
|
41
|
+
say(" * .rb (default)")
|
42
|
+
say(" * .rbi (default)")
|
43
|
+
else
|
44
|
+
config.allowed_extensions.each do |ext|
|
45
|
+
say(" * #{ext}")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|