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 | ||||
|       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. | ||||
|       # | ||||
|       # @api private | ||||
|  | ||||
| @ -731,6 +731,246 @@ describe RuboCop::Cop::FormulaAudit::Licenses do | ||||
|   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 | ||||
|   subject(:cop) { described_class.new } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Rylan Polster
						Rylan Polster