-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ci: Encourage Sorbet # typed: strict
in new code
#18018
Conversation
- Let's make Sorbet strict mode the default for new files, where possible. - This adds a new GitHub Actions step in the test job, _before_ typechecking, which ensures that new Ruby files are Sorbet strictly typed. Tested with: ```shell [ci-check-new-files-srb-strict e9dc524ef6] test new files Date: Sun Aug 11 23:39:50 2024 +0100 4 files changed, 5 insertions(+) create mode 100644 Library/Homebrew/bad.rb create mode 100644 Library/Homebrew/forgot.rb create mode 100644 Library/Homebrew/good.rb create mode 100644 Library/Homebrew/should_not_care.yml $ bash sorbet_sigils.sh Add the Sorbet strict sigil (# typed: strict) to Library/Homebrew/bad.rb. Add the Sorbet strict sigil (# typed: strict) to Library/Homebrew/forgot.rb. ```
# typed: strict
in new code
|
||
for file in ${new_files}; do | ||
if ! grep -q '# typed: strict' "${file}"; then | ||
echo "Add the Sorbet strict sigil ("# typed: strict") to ${file}." |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could make this an annotation that shows up at the first line of the file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR @issyl0, I like the idea! I think a cleaner/easier fix for this would be enable the Sorbet/StrictSigil
(and possibly Sorbet/TrueSigil
) RuboCop(s) and add disables for the relevant files that are lacking them.
Ahhh, that's the angle you were going for. Fair enough. Will do! (The issue said "new files" explicitly so I went this way.) |
@issyl0 Thanks and sorry for confusion! |
But wait, if we want to do this incrementally then I don't think the RuboCop's gonna work because that doesn't detect "new files" explicitly, and so every file will have a True/Strict offense? (Or a big long list of enable/disable on the True one, which is unsightly.) |
Yeh, the RuboCop pattern for this is to enable globally and explicitly ignore the old files with a
A disable is preferable if possible because RuboCop will complain if unnecessary but, yeh, if not: a long list of |
- Previously I thought that comments were fine to discourage people from wasting their time trying to bump things that used `undef` that Sorbet didn't support. But RuboCop is better at this since it'll complain if the comments are unnecessary. - Suggested in #18018 (comment). - I've gone for a mixture of `rubocop:disable` for the files that can't be `typed: strict` (use of undef, required before everything else, etc) and `rubocop:todo` for everything else that should be tried to make strictly typed. There's no functional difference between the two as `rubocop:todo` is `rubocop:disable` with a different name. - This means that now it's easier to track what needs to be done rather than relying on checklists of files in our big Sorbet issue: ```shell $ git grep 'typed: true # rubocop:todo Sorbet/StrictSigil' | wc -l 268 ```
- Previously I thought that comments were fine to discourage people from wasting their time trying to bump things that used `undef` that Sorbet didn't support. But RuboCop is better at this since it'll complain if the comments are unnecessary. - Suggested in #18018 (comment). - I've gone for a mixture of `rubocop:disable` for the files that can't be `typed: strict` (use of undef, required before everything else, etc) and `rubocop:todo` for everything else that should be tried to make strictly typed. There's no functional difference between the two as `rubocop:todo` is `rubocop:disable` with a different name. - And I entirely disabled the cop for the docs/ directory since `typed: strict` isn't going to gain us anything for some Markdown linting config files. - This means that now it's easier to track what needs to be done rather than relying on checklists of files in our big Sorbet issue: ```shell $ git grep 'typed: true # rubocop:todo Sorbet/StrictSigil' | wc -l 268 ``` - And this is confirmed working for new files: ```shell $ git status On branch use-rubocop-for-sorbet-strict-sigils Untracked files: (use "git add <file>..." to include in what will be committed) Library/Homebrew/bad.rb Library/Homebrew/good.rb nothing added to commit but untracked files present (use "git add" to track) $ brew style Offenses: bad.rb:1:1: C: Sorbet/StrictSigil: Sorbet sigil should be at least strict got true. ^^^^^^^^^^^^^ 1340 files inspected, 1 offense detected ```
- Previously I thought that comments were fine to discourage people from wasting their time trying to bump things that used `undef` that Sorbet didn't support. But RuboCop is better at this since it'll complain if the comments are unnecessary. - Suggested in #18018 (comment). - I've gone for a mixture of `rubocop:disable` for the files that can't be `typed: strict` (use of undef, required before everything else, etc) and `rubocop:todo` for everything else that should be tried to make strictly typed. There's no functional difference between the two as `rubocop:todo` is `rubocop:disable` with a different name. - And I entirely disabled the cop for the docs/ directory since `typed: strict` isn't going to gain us anything for some Markdown linting config files. - This means that now it's easier to track what needs to be done rather than relying on checklists of files in our big Sorbet issue: ```shell $ git grep 'typed: true # rubocop:todo Sorbet/StrictSigil' | wc -l 268 ``` - And this is confirmed working for new files: ```shell $ git status On branch use-rubocop-for-sorbet-strict-sigils Untracked files: (use "git add <file>..." to include in what will be committed) Library/Homebrew/bad.rb Library/Homebrew/good.rb nothing added to commit but untracked files present (use "git add" to track) $ brew style Offenses: bad.rb:1:1: C: Sorbet/StrictSigil: Sorbet sigil should be at least strict got true. ^^^^^^^^^^^^^ 1340 files inspected, 1 offense detected ```
- Previously I thought that comments were fine to discourage people from wasting their time trying to bump things that used `undef` that Sorbet didn't support. But RuboCop is better at this since it'll complain if the comments are unnecessary. - Suggested in Homebrew#18018 (comment). - I've gone for a mixture of `rubocop:disable` for the files that can't be `typed: strict` (use of undef, required before everything else, etc) and `rubocop:todo` for everything else that should be tried to make strictly typed. There's no functional difference between the two as `rubocop:todo` is `rubocop:disable` with a different name. - And I entirely disabled the cop for the docs/ directory since `typed: strict` isn't going to gain us anything for some Markdown linting config files. - This means that now it's easier to track what needs to be done rather than relying on checklists of files in our big Sorbet issue: ```shell $ git grep 'typed: true # rubocop:todo Sorbet/StrictSigil' | wc -l 268 ``` - And this is confirmed working for new files: ```shell $ git status On branch use-rubocop-for-sorbet-strict-sigils Untracked files: (use "git add <file>..." to include in what will be committed) Library/Homebrew/bad.rb Library/Homebrew/good.rb nothing added to commit but untracked files present (use "git add" to track) $ brew style Offenses: bad.rb:1:1: C: Sorbet/StrictSigil: Sorbet sigil should be at least strict got true. ^^^^^^^^^^^^^ 1340 files inspected, 1 offense detected ```
brew style
with your changes locally?brew typecheck
with your changes locally?brew tests
with your changes locally?typed: strict
in all (non-package) files in Homebrew organisation #17297, specifically the "good transition step" of "requiringtyped: strict
on all new files".# typed: strict
).Tested with: