brew/Library/Homebrew/test/rubocops/cask/stanza_grouping_spec.rb
Issy Long 089680c76f
rubocops/cask/stanza_order: Ensure arch and os are adjacent
- Because Patrick wanted this to be codified.
2025-03-16 21:36:07 +00:00

442 lines
12 KiB
Ruby

# frozen_string_literal: true
require "rubocops/rubocop-cask"
RSpec.describe RuboCop::Cop::Cask::StanzaGrouping, :config do
it "accepts a sole stanza" do
expect_no_offenses <<~CASK
cask 'foo' do
version :latest
end
CASK
end
it "accepts correctly grouped stanzas" do
expect_no_offenses <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
end
CASK
end
it "accepts correctly grouped stanzas and variable assignments" do
expect_no_offenses <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
os macos: ">= :big_sur"
version :latest
sha256 :no_check
end
CASK
end
it "reports an offense when a stanza is grouped incorrectly" do
expect_offense <<~CASK
cask 'foo' do
version :latest
^{} stanzas within the same group should have no lines between them
sha256 :no_check
end
CASK
expect_correction <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
end
CASK
end
it "reports an offense for an incorrectly grouped `arch` stanza" do
expect_offense <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
version :latest
^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
sha256 :no_check
end
CASK
expect_correction <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
version :latest
sha256 :no_check
end
CASK
end
it "reports an offense for an incorrectly grouped variable assignment" do
expect_offense <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
version :latest
^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
sha256 :no_check
end
CASK
expect_correction <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
version :latest
sha256 :no_check
end
CASK
end
it "reports an offense for multiple incorrectly grouped stanzas" do
expect_offense <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
^{} stanzas within the same group should have no lines between them
name 'Foo'
^{} stanzas within the same group should have no lines between them
homepage 'https://foo.brew.sh'
app 'Foo.app'
uninstall :quit => 'com.example.foo',
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
:kext => 'com.example.foo.kextextension'
end
CASK
expect_correction <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
homepage 'https://foo.brew.sh'
app 'Foo.app'
uninstall :quit => 'com.example.foo',
:kext => 'com.example.foo.kextextension'
end
CASK
end
it "reports an offense for multiple incorrectly grouped stanzas and variable assignments" do
expect_offense <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
^{} stanzas within the same group should have no lines between them
platform = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
version :latest
^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
^{} stanzas within the same group should have no lines between them
name 'Foo'
^{} stanzas within the same group should have no lines between them
homepage 'https://foo.brew.sh'
app 'Foo.app'
uninstall :quit => 'com.example.foo',
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
:kext => 'com.example.foo.kextextension'
end
CASK
expect_correction <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
platform = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
homepage 'https://foo.brew.sh'
app 'Foo.app'
uninstall :quit => 'com.example.foo',
:kext => 'com.example.foo.kextextension'
end
CASK
end
shared_examples "caveats" do
it "reports an offense for an incorrectly grouped `caveats` stanza" do
# Indent all except the first line.
interpolated_caveats = caveats.strip
expect_offense <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
name 'Foo'
app 'Foo.app'
^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
#{interpolated_caveats}
end
CASK
# Remove offense annotations.
corrected_caveats = interpolated_caveats.gsub(/\n\s*\^+\s+.*$/, "")
expect_correction <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
#{corrected_caveats}
end
CASK
end
end
context "when `caveats` is a one-line string" do
let(:caveats) do
<<~CAVEATS
caveats 'This is a one-line caveat.'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
CAVEATS
end
include_examples "caveats"
end
context "when `caveats` is a heredoc" do
let(:caveats) do
<<~CAVEATS
caveats <<~EOS
^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
This is a multiline caveat.
Let's hope it doesn't cause any problems!
EOS
CAVEATS
end
include_examples "caveats"
end
context "when `caveats` is a block" do
let(:caveats) do
<<~CAVEATS
caveats do
^^^^^^^^^^^^ stanza groups should be separated by a single empty line
puts 'This is a multiline caveat.'
puts "Let's hope it doesn't cause any problems!"
end
CAVEATS
end
include_examples "caveats"
end
it "reports an offense for an incorrectly grouped `postflight` stanza" do
expect_offense <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
name 'Foo'
app 'Foo.app'
^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
postflight do
^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
puts 'We have liftoff!'
end
end
CASK
expect_correction <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
postflight do
puts 'We have liftoff!'
end
end
CASK
end
it "reports an offense for incorrectly grouped comments" do
expect_offense <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
# comment with an empty line between
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
# comment directly above
postflight do
puts 'We have liftoff!'
end
url 'https://foo.brew.sh/foo.zip'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
name 'Foo'
app 'Foo.app'
^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
end
CASK
expect_correction <<~CASK
cask 'foo' do
version :latest
sha256 :no_check
# comment with an empty line between
# comment directly above
postflight do
puts 'We have liftoff!'
end
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
end
CASK
end
it "reports an offense for incorrectly grouped comments and variable assignments" do
expect_offense <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
# comment with an empty line between
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
version :latest
sha256 :no_check
# comment directly above
postflight do
puts 'We have liftoff!'
end
url 'https://foo.brew.sh/foo.zip'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
name 'Foo'
app 'Foo.app'
^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
end
CASK
expect_correction <<~CASK
cask 'foo' do
arch arm: "arm64", intel: "x86_64"
folder = on_arch_conditional arm: "darwin-arm64", intel: "darwin"
# comment with an empty line between
version :latest
sha256 :no_check
# comment directly above
postflight do
puts 'We have liftoff!'
end
url 'https://foo.brew.sh/foo.zip'
name 'Foo'
app 'Foo.app'
end
CASK
end
it "reports an offense for incorrectly grouped stanzas in `on_*` blocks" do
expect_offense <<~CASK
cask 'foo' do
on_arm do
version "1.0.2"
^{} stanzas within the same group should have no lines between them
sha256 :no_check
end
on_intel do
version "0.9.8"
sha256 :no_check
url "https://foo.brew.sh/foo-intel.zip"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stanza groups should be separated by a single empty line
end
end
CASK
expect_correction <<~CASK
cask 'foo' do
on_arm do
version "1.0.2"
sha256 :no_check
end
on_intel do
version "0.9.8"
sha256 :no_check
url "https://foo.brew.sh/foo-intel.zip"
end
end
CASK
end
it "reports an offense for incorrectly grouped stanzas with comments in `on_*` blocks" do
expect_offense <<~CASK
cask 'foo' do
on_arm do
version "1.0.2"
^{} stanzas within the same group should have no lines between them
sha256 :no_check # comment on same line
end
on_intel do
version "0.9.8"
sha256 :no_check
end
end
CASK
expect_correction <<~CASK
cask 'foo' do
on_arm do
version "1.0.2"
sha256 :no_check # comment on same line
end
on_intel do
version "0.9.8"
sha256 :no_check
end
end
CASK
end
end