mirror of
				https://gitea.invidious.io/iv-org/shard-ameba.git
				synced 2024-08-15 00:53:29 +00:00 
			
		
		
		
	Fix travis build & new rule: constant names (#14)
This commit is contained in:
		
							parent
							
								
									8440747353
								
							
						
					
					
						commit
						374956f3dd
					
				
					 6 changed files with 91 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -1,4 +1,3 @@
 | 
			
		|||
language: crystal
 | 
			
		||||
after_script:
 | 
			
		||||
  - make build
 | 
			
		||||
  - ./bin/ameba
 | 
			
		||||
script:
 | 
			
		||||
  - make test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -8,3 +8,6 @@ clean:
 | 
			
		|||
install: build
 | 
			
		||||
	mkdir -p $(PREFIX)/bin
 | 
			
		||||
	cp ./bin/ameba $(PREFIX)/bin
 | 
			
		||||
test: build
 | 
			
		||||
	$(CRYSTAL_BIN) spec
 | 
			
		||||
	./bin/ameba
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										51
									
								
								spec/ameba/rules/constant_names_spec.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								spec/ameba/rules/constant_names_spec.cr
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
require "../../spec_helper"
 | 
			
		||||
 | 
			
		||||
module Ameba
 | 
			
		||||
  subject = Rules::ConstantNames.new
 | 
			
		||||
 | 
			
		||||
  private def it_reports_constant(content, expected)
 | 
			
		||||
    it "reports constant name #{expected}" do
 | 
			
		||||
      s = Source.new content
 | 
			
		||||
      Rules::ConstantNames.new.catch(s).should_not be_valid
 | 
			
		||||
      s.errors.first.message.should contain expected
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe Rules::ConstantNames do
 | 
			
		||||
    it "passes if type names are screaming-cased" do
 | 
			
		||||
      s = Source.new %(
 | 
			
		||||
        LUCKY_NUMBERS     = [3, 7, 11]
 | 
			
		||||
        DOCUMENTATION_URL = "http://crystal-lang.org/docs"
 | 
			
		||||
 | 
			
		||||
        Int32
 | 
			
		||||
 | 
			
		||||
        s : String = "str"
 | 
			
		||||
 | 
			
		||||
        def works(n : Int32)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        a = 1
 | 
			
		||||
        myVar = 2
 | 
			
		||||
        m_var = 3
 | 
			
		||||
      )
 | 
			
		||||
      subject.catch(s).should be_valid
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it_reports_constant "MyBadConstant=1", "MYBADCONSTANT"
 | 
			
		||||
    it_reports_constant "Wrong_NAME=2", "WRONG_NAME"
 | 
			
		||||
    it_reports_constant "Wrong_Name=3", "WRONG_NAME"
 | 
			
		||||
 | 
			
		||||
    it "reports rule, pos and message" do
 | 
			
		||||
      s = Source.new %(
 | 
			
		||||
        Const = 1
 | 
			
		||||
      )
 | 
			
		||||
      subject.catch(s).should_not be_valid
 | 
			
		||||
      error = s.errors.first
 | 
			
		||||
      error.rule.should_not be_nil
 | 
			
		||||
      error.pos.should eq 2
 | 
			
		||||
      error.message.should eq(
 | 
			
		||||
        "Constant name should be screaming-cased: CONST, not Const"
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ require "compiler/crystal/syntax/*"
 | 
			
		|||
module Ameba::AST
 | 
			
		||||
  NODE_VISITORS = [
 | 
			
		||||
    Alias,
 | 
			
		||||
    Assign,
 | 
			
		||||
    Call,
 | 
			
		||||
    Case,
 | 
			
		||||
    ClassDef,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										33
									
								
								src/ameba/rules/constant_names.cr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/ameba/rules/constant_names.cr
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
module Ameba::Rules
 | 
			
		||||
  # A rule that enforces constant names to be in screaming case.
 | 
			
		||||
  #
 | 
			
		||||
  # For example, these constant names are considered valid:
 | 
			
		||||
  #
 | 
			
		||||
  # ```
 | 
			
		||||
  # LUCKY_NUMBERS     = [3, 7, 11]
 | 
			
		||||
  # DOCUMENTATION_URL = "http://crystal-lang.org/docs"
 | 
			
		||||
  # ```
 | 
			
		||||
  #
 | 
			
		||||
  # And these are invalid names:
 | 
			
		||||
  #
 | 
			
		||||
  # ```
 | 
			
		||||
  # MyBadConstant = 1
 | 
			
		||||
  # Wrong_NAME    = 2
 | 
			
		||||
  # ```
 | 
			
		||||
  #
 | 
			
		||||
  struct ConstantNames < Rule
 | 
			
		||||
    def test(source)
 | 
			
		||||
      AST::AssignVisitor.new self, source
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def test(source, node : Crystal::Assign)
 | 
			
		||||
      if (target = node.target).is_a? Crystal::Path
 | 
			
		||||
        name = target.names.first
 | 
			
		||||
        return if (expected = name.upcase) == name
 | 
			
		||||
 | 
			
		||||
        source.error self, node.location.try &.line_number,
 | 
			
		||||
          "Constant name should be screaming-cased: #{expected}, not #{name}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +15,4 @@ OptionParser.parse(ARGV) do |parser|
 | 
			
		|||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
sources = Ameba.run
 | 
			
		||||
failed = sources.any? { |s| !s.valid? }
 | 
			
		||||
exit(-1) if failed
 | 
			
		||||
exit(1) unless Ameba.run.all? &.valid?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue