Merge pull request #8897 from Rylan12/style-python-version
style: python versions must match python dependency
This commit is contained in:
commit
abf214c01f
@ -319,6 +319,43 @@ module RuboCop
|
|||||||
EOS
|
EOS
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This cop makes sure that python versions are consistent.
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
class PythonVersions < FormulaCop
|
||||||
|
def audit_formula(_node, _class_node, _parent_class_node, body_node)
|
||||||
|
python_formula_node = find_every_method_call_by_name(body_node, :depends_on).find do |dep|
|
||||||
|
string_content(parameters(dep).first).start_with? "python@"
|
||||||
|
end
|
||||||
|
|
||||||
|
return if python_formula_node.blank?
|
||||||
|
|
||||||
|
python_version = string_content(parameters(python_formula_node).first).split("@").last
|
||||||
|
|
||||||
|
find_strings(body_node).each do |str|
|
||||||
|
string_content = string_content(str)
|
||||||
|
|
||||||
|
next unless match = string_content.match(/^python(@)?(\d\.\d+)$/)
|
||||||
|
next if python_version == match[2]
|
||||||
|
|
||||||
|
@fix = if match[1]
|
||||||
|
"python@#{python_version}"
|
||||||
|
else
|
||||||
|
"python#{python_version}"
|
||||||
|
end
|
||||||
|
|
||||||
|
offending_node(str)
|
||||||
|
problem "References to `#{string_content}` should match the specified python dependency (`#{@fix}`)"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def autocorrect(node)
|
||||||
|
lambda do |corrector|
|
||||||
|
corrector.replace(node.source_range, "\"#{@fix}\"")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# This cop checks for other miscellaneous style violations.
|
# This cop checks for other miscellaneous style violations.
|
||||||
#
|
#
|
||||||
# @api private
|
# @api private
|
||||||
|
|||||||
@ -731,6 +731,246 @@ describe RuboCop::Cop::FormulaAudit::Licenses do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe RuboCop::Cop::FormulaAudit::PythonVersions do
|
||||||
|
subject(:cop) { described_class.new }
|
||||||
|
|
||||||
|
context "When auditing python versions" do
|
||||||
|
it "allow python with no dependency" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
def install
|
||||||
|
puts "python@3.8"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allow non versioned python references" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allow python with no version" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allow matching versions" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.9"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allow matching versions without `@`" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.9"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allow matching versions with two digits" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.10"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.10"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allow matching versions without `@` with two digits" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.10"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.10"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "do not allow mismatching versions" do
|
||||||
|
expect_offense(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.8"
|
||||||
|
^^^^^^^^^^^^ References to `python@3.8` should match the specified python dependency (`python@3.9`)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "do not allow mismatching versions without `@`" do
|
||||||
|
expect_offense(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.8"
|
||||||
|
^^^^^^^^^^^ References to `python3.8` should match the specified python dependency (`python3.9`)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "do not allow mismatching versions with two digits" do
|
||||||
|
expect_offense(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.11"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.10"
|
||||||
|
^^^^^^^^^^^^^ References to `python@3.10` should match the specified python dependency (`python@3.11`)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "do not allow mismatching versions without `@` with two digits" do
|
||||||
|
expect_offense(<<~RUBY)
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.11"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.10"
|
||||||
|
^^^^^^^^^^^^ References to `python3.10` should match the specified python dependency (`python3.11`)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "autocorrects mismatching versions" do
|
||||||
|
source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.8"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
corrected_source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.9"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
new_source = autocorrect_source(source)
|
||||||
|
expect(new_source).to eq(corrected_source)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "autocorrects mismatching versions without `@`" do
|
||||||
|
source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.8"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
corrected_source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.9"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.9"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
new_source = autocorrect_source(source)
|
||||||
|
expect(new_source).to eq(corrected_source)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "autocorrects mismatching versions with two digits" do
|
||||||
|
source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.10"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.9"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
corrected_source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.10"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python@3.10"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
new_source = autocorrect_source(source)
|
||||||
|
expect(new_source).to eq(corrected_source)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "autocorrects mismatching versions without `@` with two digits" do
|
||||||
|
source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.11"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.10"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
corrected_source = <<~RUBY
|
||||||
|
class Foo < Formula
|
||||||
|
depends_on "python@3.11"
|
||||||
|
|
||||||
|
def install
|
||||||
|
puts "python3.11"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
new_source = autocorrect_source(source)
|
||||||
|
expect(new_source).to eq(corrected_source)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe RuboCop::Cop::FormulaAudit::Miscellaneous do
|
describe RuboCop::Cop::FormulaAudit::Miscellaneous do
|
||||||
subject(:cop) { described_class.new }
|
subject(:cop) { described_class.new }
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user