442 lines
12 KiB
Ruby
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
|