diff --git a/.ameba.yml b/.ameba.yml new file mode 100644 index 0000000..0c35944 --- /dev/null +++ b/.ameba.yml @@ -0,0 +1,9 @@ +Lint/NotNil: + Enabled: false +Lint/MissingBlockArgument: + Enabled: true +Documentation/DocumentationAdmonition: + Enabled: false +Metrics/CyclomaticComplexity: + Enabled: false + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d1a9254..7074739 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Download source - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Crystal uses: crystal-lang/install-crystal@v1 - name: Check formatting @@ -27,4 +27,14 @@ jobs: run: shards update - name: Run tests run: crystal spec --order=random - if: matrix.os == 'ubuntu-latest' + ameba: + strategy: + fail-fast: false + runs-on: ubuntu-latest + steps: + - name: Download source + uses: actions/checkout@v4 + - name: Run ameba linter + uses: crystal-ameba/github-action@v0.12.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/spec/integration/integration_spec.cr b/spec/integration/integration_spec.cr index acbebc8..d66071c 100644 --- a/spec/integration/integration_spec.cr +++ b/spec/integration/integration_spec.cr @@ -25,7 +25,7 @@ class GoldenTest private def context : Liquid::Context vars = @context.as_h? - raise "Bad context: #{@context.to_s}" if vars.nil? + raise "Bad context: #{@context}" if vars.nil? # Golden liquid run ruby tests with `render!`, that raises an exception on first error, this is the strict behavior # of liquid crystal. diff --git a/src/liquid/blank.cr b/src/liquid/blank.cr index f51cafe..0084183 100644 --- a/src/liquid/blank.cr +++ b/src/liquid/blank.cr @@ -2,15 +2,15 @@ require "./drop" module Liquid class Blank < Drop - def ==(str : String) - str.empty? + def ==(other : String) + other.empty? end - def ==(array : Array) - array.empty? + def ==(other : Array) + other.empty? end - def ==(_nil : Nil) + def ==(other : Nil) true end diff --git a/src/liquid/blocks/for.cr b/src/liquid/blocks/for.cr index d92f11e..317691f 100644 --- a/src/liquid/blocks/for.cr +++ b/src/liquid/blocks/for.cr @@ -31,7 +31,7 @@ module Liquid::Block @loop_var = gmatch["var"] @loop_over = if rmatch = gmatch["range"].match(RANGE) rmatch["start"].to_i..rmatch["end"].to_i - elsif (rmatch = gmatch["range"].match VARNAME) + elsif rmatch = gmatch["range"].match VARNAME rmatch["varname"] else raise SyntaxError.new("Invalid for node: #{content}.") diff --git a/src/liquid/blocks/include.cr b/src/liquid/blocks/include.cr index d86827e..355d1a8 100644 --- a/src/liquid/blocks/include.cr +++ b/src/liquid/blocks/include.cr @@ -26,7 +26,7 @@ module Liquid::Block varname = File.basename(@template_name, File.extname(@template_name)) @template_vars[varname] = Expression.new match["value"] elsif groups = content.scan INCLUDE_VARS - groups.each do |group| + groups.each do |_| next if groups.empty? groups.each do |group| diff --git a/src/liquid/drop.cr b/src/liquid/drop.cr index 69d7c24..c0b18f7 100644 --- a/src/liquid/drop.cr +++ b/src/liquid/drop.cr @@ -40,19 +40,19 @@ module Liquid end class String - def ==(any : Liquid::Drop) - any == self + def ==(other : Liquid::Drop) + other == self end end struct Nil - def ==(any : Liquid::Drop) - any == self + def ==(other : Liquid::Drop) + other == self end end class Array - def ==(any : Liquid::Drop) - any == self + def ==(other : Liquid::Drop) + other == self end end diff --git a/src/liquid/expression.cr b/src/liquid/expression.cr index c4b016b..bd9cb5f 100644 --- a/src/liquid/expression.cr +++ b/src/liquid/expression.cr @@ -155,7 +155,7 @@ module Liquid private def apply_filters(ctx : Context, operand : Any, filter_stack : Stack?) : Any return operand if filter_stack.nil? - while filter_stack.any? + while !filter_stack.empty? item = filter_stack.shift return expression_error(ctx, "Expected a filter, got #{item}.") if !item.is_a?(Operator) || !item.filter? @@ -184,7 +184,7 @@ module Liquid filter_args = ctx.filter_args filter_options = ctx.filter_options - while stack.any? + while !stack.empty? item = stack.first return if item.is_a?(Operator) && item.filter? @@ -218,7 +218,7 @@ module Liquid raw = obj.raw return call_drop_method(ctx, raw, method) if raw.is_a?(Drop) return call_hash_method(ctx, raw, method) if raw.is_a?(Hash) - return call_nil_method(ctx, method) if raw.is_a?(Nil) + return call_nil_method(ctx, method) if raw.nil? return expression_error(ctx, "Tried to call ##{method} on a #{raw.class.name}.") if !raw.responds_to?(:size) diff --git a/src/liquid/filters/abs.cr b/src/liquid/filters/abs.cr index f007673..7cc3eaa 100644 --- a/src/liquid/filters/abs.cr +++ b/src/liquid/filters/abs.cr @@ -16,7 +16,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - raise FilterArgumentException.new("Unexpected argument for abs filter") if args && args.any? + raise FilterArgumentException.new("Unexpected argument for abs filter") unless args.empty? if data.raw.is_a? Number Any.new data.raw.as(Number).abs diff --git a/src/liquid/filters/arg_test.cr b/src/liquid/filters/arg_test.cr index 0e62a5b..c038c7e 100644 --- a/src/liquid/filters/arg_test.cr +++ b/src/liquid/filters/arg_test.cr @@ -5,7 +5,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - if (a = args) + if a = args Any.new(a.map(&.to_s).join(", ")) else Any.new(nil) diff --git a/src/liquid/filters/capitalize.cr b/src/liquid/filters/capitalize.cr index 3e5168b..9e09600 100644 --- a/src/liquid/filters/capitalize.cr +++ b/src/liquid/filters/capitalize.cr @@ -20,7 +20,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - raise FilterArgumentException.new("Unexpected argument for capitalize filter") if args && args.any? + raise FilterArgumentException.new("Unexpected argument for capitalize filter") unless args.empty? raw = data.raw if raw.is_a?(String) diff --git a/src/liquid/filters/ceil.cr b/src/liquid/filters/ceil.cr index ca81a3c..9278167 100644 --- a/src/liquid/filters/ceil.cr +++ b/src/liquid/filters/ceil.cr @@ -31,7 +31,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - raise FilterArgumentException.new("Unexpected argument for ceil filter") if args && args.any? + raise FilterArgumentException.new("Unexpected argument for ceil filter") unless args.empty? if (raw = data.raw) && raw.is_a? Number Any.new(raw.ceil.to_i) diff --git a/src/liquid/filters/date.cr b/src/liquid/filters/date.cr index 6df80eb..86a4f2c 100644 --- a/src/liquid/filters/date.cr +++ b/src/liquid/filters/date.cr @@ -31,13 +31,13 @@ module Liquid::Filters def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any raise FilterArgumentException.new "date filter require an argument" unless args && args.size == 1 - format = if (arg = args.first.as_s?) + format = if arg = args.first.as_s? arg else raise FilterArgumentException.new "First argument of date filter should be a string" end - if (time = data.as_t?) + if time = data.as_t? Any.new time.to_s format elsif (d = data.as_s?) && d == "now" Any.new Time.utc.to_s format diff --git a/src/liquid/filters/downcase.cr b/src/liquid/filters/downcase.cr index 1c2fe56..38bbfbe 100644 --- a/src/liquid/filters/downcase.cr +++ b/src/liquid/filters/downcase.cr @@ -22,7 +22,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - raise FilterArgumentException.new("downcase filter expects no arguments.") if args.any? + raise FilterArgumentException.new("downcase filter expects no arguments.") unless args.empty? raw = data.raw if raw.responds_to?(:downcase) diff --git a/src/liquid/filters/floor.cr b/src/liquid/filters/floor.cr index 37544f8..600272c 100644 --- a/src/liquid/filters/floor.cr +++ b/src/liquid/filters/floor.cr @@ -14,7 +14,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - raise FilterArgumentException.new("Unexpected argument for floor filter") if args && args.any? + raise FilterArgumentException.new("Unexpected argument for floor filter") unless args.empty? if (raw = data.raw) && raw.is_a? Number Any.new(raw.floor.to_i) diff --git a/src/liquid/filters/lstrip.cr b/src/liquid/filters/lstrip.cr index a6ed4c8..4c438ea 100644 --- a/src/liquid/filters/lstrip.cr +++ b/src/liquid/filters/lstrip.cr @@ -5,7 +5,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - if (str = data.as_s?) + if str = data.as_s? Any.new str.lstrip else data diff --git a/src/liquid/filters/map.cr b/src/liquid/filters/map.cr index 06b149c..673d9ee 100644 --- a/src/liquid/filters/map.cr +++ b/src/liquid/filters/map.cr @@ -14,7 +14,7 @@ module Liquid::Filters raise FilterArgumentException.new "map filter expects argument to be a string" unless args.first.raw.is_a?(String) if (raw = data.raw) && raw.is_a?(Array) && (first = args.first?) - result = raw.compact_map { |r| self.responds_to(r, first.as_s) } + result = raw.compact_map { |obj| self.responds_to(obj, first.as_s) } if result.empty? data else diff --git a/src/liquid/filters/rstrip.cr b/src/liquid/filters/rstrip.cr index 7bd61bf..6f5a9f5 100644 --- a/src/liquid/filters/rstrip.cr +++ b/src/liquid/filters/rstrip.cr @@ -5,7 +5,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)) : Any - if (str = data.as_s?) + if str = data.as_s? Any.new str.rstrip else data diff --git a/src/liquid/filters/split.cr b/src/liquid/filters/split.cr index 2fffc36..f56dcef 100644 --- a/src/liquid/filters/split.cr +++ b/src/liquid/filters/split.cr @@ -32,7 +32,7 @@ module Liquid::Filters return Any.new(nil) if raw_data.nil? if raw_data.responds_to?(:split) - array = raw_data.split(arg).map { |s| Any.new(s) } + array = raw_data.split(arg).map { |obj| Any.new(obj) } Any.new(array) else Any{data} diff --git a/src/liquid/filters/strip.cr b/src/liquid/filters/strip.cr index d29f383..512cabf 100644 --- a/src/liquid/filters/strip.cr +++ b/src/liquid/filters/strip.cr @@ -5,7 +5,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)?) : Any - if (str = data.as_s?) + if str = data.as_s? Any.new str.strip else data diff --git a/src/liquid/filters/upcase.cr b/src/liquid/filters/upcase.cr index 4a6958e..0627a24 100644 --- a/src/liquid/filters/upcase.cr +++ b/src/liquid/filters/upcase.cr @@ -13,7 +13,7 @@ module Liquid::Filters extend Filter def self.filter(data : Any, args : Array(Any), options : Hash(String, Any)?) : Any - raise FilterArgumentException.new("upcase filter expects no arguments.") if args.any? + raise FilterArgumentException.new("upcase filter expects no arguments.") unless args.empty? raw = data.raw if raw.responds_to?(:upcase) diff --git a/src/liquid/match_visitor.cr b/src/liquid/match_visitor.cr index e3bed94..b5fc676 100644 --- a/src/liquid/match_visitor.cr +++ b/src/liquid/match_visitor.cr @@ -3,15 +3,15 @@ require "./blocks" module Liquid class MatchVisitor < Visitor def visit(node : Node) : String - return node.children.map { |e| self.visit e }.join + node.children.map { |e| self.visit e }.join end def visit(node : Block::RawNode) : String - return node.content + node.content end def visit(node : ExpressionNode) - return ".*" + ".*" end def visit(node : Conditional) : String @@ -29,7 +29,7 @@ module Liquid child_nodes << "" end - return "(#{child_nodes.join("|")})" + "(#{child_nodes.join("|")})" end def visit(node : Case) @@ -47,13 +47,13 @@ module Liquid child_nodes << "" end - return "(#{child_nodes.join("|")})" + "(#{child_nodes.join("|")})" end def visit(node : For) child_nodes = node.children.map { |e| self.visit e } - return "(#{child_nodes.join})*" + "(#{child_nodes.join})*" end end end diff --git a/src/liquid/template.cr b/src/liquid/template.cr index 11bd2e7..1c39c9e 100644 --- a/src/liquid/template.cr +++ b/src/liquid/template.cr @@ -29,7 +29,7 @@ module Liquid match_string = visitor.visit @root match_regex = /^#{match_string}$/ - return match_regex.matches?(target_string) + match_regex.matches?(target_string) end def render(data, io : IO) : Nil