Skip to content
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

Closed
wants to merge 1 commit into from

Conversation

issyl0
Copy link
Member

@issyl0 issyl0 commented Aug 11, 2024

  • Have you followed the guidelines in our Contributing document?
  • Have you checked to ensure there aren't other open Pull Requests for the same change?
  • Have you added an explanation of what your changes do and why you'd like us to include them?
  • Have you written new tests for your changes? Here's an example.
  • Have you successfully run brew style with your changes locally?
  • Have you successfully run brew typecheck with your changes locally?
  • Have you successfully run brew tests with your changes locally?

Tested with:

[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.

- 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.
```
@issyl0 issyl0 changed the title ci: Encourage Sorbet "# typed: strict" in new code ci: Encourage Sorbet # typed: strict in new code Aug 11, 2024

for file in ${new_files}; do
if ! grep -q '# typed: strict' "${file}"; then
echo "Add the Sorbet strict sigil ("# typed: strict") to ${file}."
Copy link
Member

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.

Copy link
Member

@MikeMcQuaid MikeMcQuaid left a 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.

@issyl0
Copy link
Member Author

issyl0 commented Aug 12, 2024

I think a cleaner/easier fix for this would be enable the Sorbet/StrictSigil (and possibly Sorbet/TrueSigil) RuboCop(s)

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 issyl0 closed this Aug 12, 2024
@issyl0 issyl0 deleted the ci-check-new-files-srb-strict branch August 12, 2024 08:01
@MikeMcQuaid
Copy link
Member

@issyl0 Thanks and sorry for confusion!

@issyl0
Copy link
Member Author

issyl0 commented Aug 12, 2024

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.)

@MikeMcQuaid
Copy link
Member

RuboCop's gonna work because that doesn't detect "new files" explicitly

Yeh, the RuboCop pattern for this is to enable globally and explicitly ignore the old files with a # rubocop:disable comment.

Or a big long list of enable/disable on the True one, which is unsightly.)

A disable is preferable if possible because RuboCop will complain if unnecessary but, yeh, if not: a long list of Exclude I think is better than custom code here.

issyl0 added a commit that referenced this pull request Aug 12, 2024
- 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
```
issyl0 added a commit that referenced this pull request Aug 12, 2024
- 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
```
issyl0 added a commit that referenced this pull request Aug 12, 2024
- 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
```
ctaintor pushed a commit to ctaintor/brew that referenced this pull request Sep 4, 2024
- 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
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants