Skip to content

Commit

Permalink
Add support for linting ECR files (pt. 2) (#541)
Browse files Browse the repository at this point in the history
* Add support for linting ECR files
Requires Crystal >= 1.15.0

* Apply suggestions from code review

Co-authored-by: Sijawusz Pur Rahnama <[email protected]>

* Add some specs related to ECR files

* Remove unnecessary ECR specs

* Macro helper method for ECR support

---------

Co-authored-by: Sijawusz Pur Rahnama <[email protected]>
  • Loading branch information
nobodywasishere and Sija authored Jan 15, 2025
1 parent 262f57d commit 504017b
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 10 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ In this example we define default globs and exclude `src/compiler` folder:
``` yaml
Globs:
- "**/*.cr"
- "**/*.ecr"
- "!lib"
Excluded:
Expand Down
26 changes: 26 additions & 0 deletions spec/ameba/source_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -70,5 +70,31 @@ module Ameba
CRYSTAL
end
end

Ameba.ecr_supported? do
describe "#ast" do
it "parses an ECR file" do
source = Source.new <<-ECR, "filename.ecr"
hello <%= "world" %>
ECR

source.ast.to_s.should eq(<<-CRYSTAL)
__str__ << "hello "
("world").to_s(__str__)
CRYSTAL
end

it "raises an exception when ECR parsing fails" do
source = Source.new <<-ECR, "filename.ecr"
hello <%= "world" >
ECR

expect_raises(Crystal::SyntaxException) do
source.ast
end
end
end
end
end
end
22 changes: 14 additions & 8 deletions src/ameba.cr
Original file line number Diff line number Diff line change
@@ -1,11 +1,3 @@
require "./ameba/*"
require "./ameba/ast/**"
require "./ameba/ext/**"
require "./ameba/rule/**"
require "./ameba/formatter/*"
require "./ameba/presenter/*"
require "./ameba/source/**"

# Ameba's entry module.
#
# To run the linter with default parameters:
Expand Down Expand Up @@ -40,4 +32,18 @@ module Ameba
def run(config = Config.load)
Runner.new(config).run
end

macro ecr_supported?(&)
{% if compare_versions(Crystal::VERSION, "1.15.0") >= 0 %}
{{ yield }}
{% end %}
end
end

require "./ameba/*"
require "./ameba/ast/**"
require "./ameba/ext/**"
require "./ameba/rule/**"
require "./ameba/formatter/*"
require "./ameba/presenter/*"
require "./ameba/source/**"
7 changes: 6 additions & 1 deletion src/ameba/config.cr
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require "semantic_version"
require "yaml"
require "ecr/processor"
require "./glob_utils"

# A configuration entry for `Ameba::Runner`.
Expand Down Expand Up @@ -62,6 +63,10 @@ class Ameba::Config
!lib
)

Ameba.ecr_supported? do
DEFAULT_GLOBS << "**/*.ecr"
end

getter rules : Array(Rule::Base)
property severity = Severity::Convention

Expand Down Expand Up @@ -167,7 +172,7 @@ class Ameba::Config
# ```
# config = Ameba::Config.load
# config.sources # => list of default sources
# config.globs = ["**/*.cr"]
# config.globs = ["**/*.cr", "**/*.ecr"]
# config.excluded = ["spec"]
# config.sources # => list of sources pointing to files found by the wildcards
# ```
Expand Down
9 changes: 8 additions & 1 deletion src/ameba/glob_utils.cr
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@ module Ameba
def expand(globs)
globs
.flat_map do |glob|
glob += "/**/*.cr" if File.directory?(glob)
if File.directory?(glob)
glob += "/**/*.cr"

Ameba.ecr_supported? do
glob += "/**/*.ecr"
end
end

Dir[glob]
end
.uniq!
Expand Down
18 changes: 18 additions & 0 deletions src/ameba/source.cr
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,24 @@ module Ameba
# source.ast
# ```
getter ast : Crystal::ASTNode do
code = @code

Ameba.ecr_supported? do
if @path.ends_with?(".ecr")
begin
code = ECR.process_string(code, @path)
rescue ex : ECR::Lexer::SyntaxException
# Need to rescue to add the filename
raise Crystal::SyntaxException.new(
ex.message,
ex.line_number,
ex.column_number,
@path
)
end
end
end

Crystal::Parser.new(code)
.tap(&.wants_doc = true)
.tap(&.filename = path)
Expand Down

0 comments on commit 504017b

Please sign in to comment.