Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Shopify/spoom
Useful tools for Sorbet enthusiasts
https://github.com/Shopify/spoom
coverage lsp sorbet typing
Last synced: 19 days ago
JSON representation
Useful tools for Sorbet enthusiasts
- Host: GitHub
- URL: https://github.com/Shopify/spoom
- Owner: Shopify
- License: mit
- Created: 2020-07-07T14:53:11.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2024-11-11T21:36:33.000Z (about 1 month ago)
- Last Synced: 2024-11-17T14:57:02.180Z (25 days ago)
- Topics: coverage, lsp, sorbet, typing
- Language: Ruby
- Homepage:
- Size: 9.42 MB
- Stars: 222
- Watchers: 254
- Forks: 19
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# Spoom
Useful tools for Sorbet enthusiasts.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'spoom'
```And then execute:
$ bundle
Or install it yourself as:
$ gem install spoom
## Usage
`spoom` provides both a CLI and an API to interact with Sorbet.
### Generate a typing coverage report
Spoom can create a typing coverage report from Sorbet and Git data:
![Coverage Report](docs/report.png)
After installing the `spoom` gem, run the `timeline` command to collect the history data:
```
$ spoom srb coverage timeline --save
```Then create the HTML page with `report`:
```
$ spoom srb coverage report
```Your report will be generated under `spoom_report.html`.
See all the [Typing Coverage](#typing-coverage) CLI commands for more details.
### Command Line Interface
#### Errors sorting and filtering
List all typechecking errors sorted by location:
```
$ spoom srb tc -s loc
```List all typechecking errors sorted by error code first:
```
$ spoom srb tc -s code
```List only typechecking errors from a specific error code:
```
$ spoom srb tc -c 7004
```List only the first 10 typechecking errors
```
$ spoom srb tc -l 10
```These options can be combined:
```
$ spoom srb tc -s -c 7004 -l 10
```Remove duplicated error lines:
```
$ spoom srb tc -u
```Format each error line:
```
$ spoom srb tc -f '%C - %F:%L: %M'
```Where:
* `%C` is the error code
* `%F` is the file the error is from
* `%L` is the line the error is from
* `%M` is the error messageHide the `Errors: X` at the end of the list:
```
$ spoom srb tc --no-count
```List only the errors coming from specific directories or files:
```
$ spoom srb tc file1.rb path1/ path2/
```#### Typing coverage
Show metrics about the project contents and the typing coverage:
```
$ spoom srb coverage
```Save coverage data under `spoom_data/`:
```
$ spoom srb coverage --save
```Save coverage data under a specific directory:
```
$ spoom srb coverage --save my_data/
```Show typing coverage evolution based on the commits history:
```
$ spoom srb coverage timeline
```Show typing coverage evolution based on the commits history between specific dates:
```
$ spoom srb coverage timeline --from YYYY-MM-DD --to YYYY-MM-DD
```Save the typing coverage evolution as JSON under `spoom_data/`:
```
$ spoom srb coverage timeline --save
```Save the typing coverage evolution as JSON in a specific directory:
```
$ spoom srb coverage timeline --save my_data/
```Run `bundle install` for each commit of the timeline (may solve errors due to different Sorbet versions):
```
$ spoom srb coverage timeline --bundle-install
```Generate an HTML typing coverage report:
```
$ spoom srb coverage report
```Change the colors used for strictnesses (useful for colorblind folks):
```
$ spoom srb coverage report \
--color-true "#648ffe" \
--color-false "#fe6002" \
--color-ignore "#feb000" \
--color-strict "#795ef0" \
--color-strong "#6444f1"
```Open the HTML typing coverage report:
```
$ spoom srb coverage open
```#### Change the sigil used in files
Bump the strictness from all files currently at `typed: false` to `typed: true` where it does not create typechecking errors:
```
$ spoom srb bump --from false --to true
```Bump the strictness from all files currently at `typed: false` to `typed: true` even if it creates typechecking errors:
```
$ spoom srb bump --from false --to true -f
```Bump the strictness from a list of files (one file by line):
```
$ spoom srb bump --from false --to true -o list.txt
```Check if files can be bumped without applying any change and show the list of files that can be bumped without errors.
Will exit with a non-zero status if some files can be bumped without errors (useful to check for bumpable files on CI for example):```
$ spoom srb bump --from false --to true --dry
```Bump files using a custom instance of Sorbet:
```
$ spoom srb bump --from false --to true --sorbet /path/to/sorbet/bin
```Count the number of type-checking errors if all files were bumped to true:
```
$ spoom srb bump --count-errors --dry
```#### Interact with Sorbet LSP mode
**Experimental**
Find all definitions for `Foo`:
```
$ spoom srb lsp find Foo
```List all symbols in a file:
```
$ spoom srb lsp symbols
```List all definitions for a specific code location:
```
$ spoom srb lsp defs
```List all references for a specific code location:
```
$ spoom srb lsp refs
```Show hover information for a specific code location:
```
$ spoom srb lsp hover
```Show signature information for a specific code location:
```
$ spoom srb lsp sig
```Show type information for a specific code location:
```
$ spoom srb lsp sig
```### API
#### Parsing Sorbet config
Parses a Sorbet config file:
```ruby
config = Spoom::Sorbet::Config.parse_file("sorbet/config")
puts config.paths # "."
```Parses a Sorbet config string:
```ruby
config = Spoom::Sorbet::Config.parse_string(<<~CONFIG)
a
--file=b
--ignore=c
CONFIG
puts config.paths # "a", "b"
puts config.ignore # "c"
```List all files typchecked by Sorbet:
```ruby
config = Spoom::Sorbet::Config.parse_file("sorbet/config")
puts Spoom::Sorbet.srb_files(config)
```#### Parsing Sorbet metrics
Display metrics collected during typechecking:
```ruby
puts Spoom::Sorbet.srb_metrics(capture_err: false)
```#### Interacting with LSP
Create an LSP client:
```rb
client = Spoom::LSP::Client.new(
Spoom::Sorbet::BIN_PATH,
"--lsp",
"--enable-all-experimental-lsp-features",
"--disable-watchman",
)
client.open(".")
```Find all the symbols matching a string:
```rb
puts client.symbols("Foo")
```Find all the symbols for a file:
```rb
puts client.document_symbols("file://path/to/my/file.rb")
```### Backtrace Filtering
Spoom provides a backtrace filter for Minitest to remove the Sorbet frames from test failures, giving a more readable output. To enable it:
```ruby
# test/test_helper.rb
require "spoom/backtrace_filter/minitest"
Minitest.backtrace_filter = Spoom::BacktraceFilter::Minitest.new
```### Dead code removal
Run dead code detection in your project with:
```
$ spoom deadcode
```This will list all the methods and constants that do not appear to be used in your project.
You can remove them with Spoom:
```
$ spoom deadcode remove path/to/file.rb:42:18-47:23
```## Development
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.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/Shopify/spoom. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
## Code of Conduct
Everyone interacting in the Spoom project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/Shopify/spoom/blob/main/CODE_OF_CONDUCT.md).