mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-02 16:45:12 -07:00
Rubocop
This commit is contained in:
@@ -0,0 +1,92 @@
|
|||||||
|
inherit_from: ./.rubocop_todo.yml
|
||||||
|
|
||||||
|
AllCops:
|
||||||
|
Exclude:
|
||||||
|
- 'performance/shopify/*'
|
||||||
|
|
||||||
|
Lint/AssignmentInCondition:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Lint/UnusedBlockArgument:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Lint/EndAlignment:
|
||||||
|
AlignWith: variable
|
||||||
|
|
||||||
|
Style/SingleLineBlockParams:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/StringLiteralsInInterpolation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/SignalException:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/StringLiterals:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/BracesAroundHashParameters:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/NumericLiterals:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/SpaceInsideBrackets:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/SpaceBeforeBlockBraces:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/Documentation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/ClassAndModuleChildren:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/TrailingComma:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/IndentHash:
|
||||||
|
EnforcedStyle: consistent
|
||||||
|
|
||||||
|
Style/FormatString:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/AlignParameters:
|
||||||
|
EnforcedStyle: with_fixed_indentation
|
||||||
|
|
||||||
|
Style/MultilineOperationIndentation:
|
||||||
|
EnforcedStyle: indented
|
||||||
|
|
||||||
|
Style/IfUnlessModifier:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/RaiseArgs:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/DeprecatedHashMethods:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/RegexpLiteral:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/SymbolLiteral:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Performance/Count:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/ConstantName:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/CaseIndentation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/ClassVars:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/PerlBackrefs:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/WordArray:
|
||||||
|
Enabled: false
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
# This configuration was generated by `rubocop --auto-gen-config`
|
||||||
|
# on 2015-05-13 19:54:01 +0000 using RuboCop version 0.31.0.
|
||||||
|
# The point is for the user to remove these configuration records
|
||||||
|
# one by one as the offenses are removed from the code base.
|
||||||
|
# Note that changes in the inspected code, or installation of new
|
||||||
|
# versions of RuboCop, may require this file to be generated again.
|
||||||
|
|
||||||
|
# Offense count: 2
|
||||||
|
Lint/AmbiguousOperator:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 2
|
||||||
|
Lint/AmbiguousRegexpLiteral:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Lint/Eval:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 4
|
||||||
|
Lint/ParenthesesAsGroupedExpression:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 3
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Lint/UnusedMethodArgument:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Lint/UselessAccessModifier:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 6
|
||||||
|
Lint/UselessAssignment:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 51
|
||||||
|
Metrics/AbcSize:
|
||||||
|
Max: 59
|
||||||
|
|
||||||
|
# Offense count: 2
|
||||||
|
Metrics/BlockNesting:
|
||||||
|
Max: 6
|
||||||
|
|
||||||
|
# Offense count: 16
|
||||||
|
# Configuration parameters: CountComments.
|
||||||
|
Metrics/ClassLength:
|
||||||
|
Max: 304
|
||||||
|
|
||||||
|
# Offense count: 10
|
||||||
|
Metrics/CyclomaticComplexity:
|
||||||
|
Max: 15
|
||||||
|
|
||||||
|
# Offense count: 547
|
||||||
|
# Configuration parameters: AllowURI, URISchemes.
|
||||||
|
Metrics/LineLength:
|
||||||
|
Max: 294
|
||||||
|
|
||||||
|
# Offense count: 76
|
||||||
|
# Configuration parameters: CountComments.
|
||||||
|
Metrics/MethodLength:
|
||||||
|
Max: 46
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Configuration parameters: CountComments.
|
||||||
|
Metrics/ModuleLength:
|
||||||
|
Max: 216
|
||||||
|
|
||||||
|
# Offense count: 6
|
||||||
|
Metrics/PerceivedComplexity:
|
||||||
|
Max: 13
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Style/AccessorMethodName:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 2
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||||
|
Style/AndOr:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 2
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
|
||||||
|
Style/BlockDelimiters:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Style/DoubleNegation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||||
|
Style/EmptyLinesAroundClassBody:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 2
|
||||||
|
# Configuration parameters: MinBodyLength.
|
||||||
|
Style/GuardClause:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues.
|
||||||
|
Style/HashSyntax:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 13
|
||||||
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||||
|
Style/MethodName:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Style/MultilineBlockChain:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 3
|
||||||
|
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
|
||||||
|
Style/Next:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 3
|
||||||
|
# Configuration parameters: NamePrefix, NamePrefixBlacklist.
|
||||||
|
Style/PredicateName:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Style/RescueModifier:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 7
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: AllowAsExpressionSeparator.
|
||||||
|
Style/Semicolon:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Offense count: 3
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Style/SpecialGlobalVars:
|
||||||
|
Enabled: false
|
||||||
@@ -6,4 +6,5 @@ gem 'stackprof', platforms: :mri_21
|
|||||||
group :test do
|
group :test do
|
||||||
gem 'spy', '0.4.1'
|
gem 'spy', '0.4.1'
|
||||||
gem 'benchmark-ips'
|
gem 'benchmark-ips'
|
||||||
|
gem 'rubocop'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ require 'rake/testtask'
|
|||||||
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
||||||
require "liquid/version"
|
require "liquid/version"
|
||||||
|
|
||||||
task :default => 'test'
|
task default: [:rubocop, :test]
|
||||||
|
|
||||||
desc 'run test suite with default parser'
|
desc 'run test suite with default parser'
|
||||||
Rake::TestTask.new(:base_test) do |t|
|
Rake::TestTask.new(:base_test) do |t|
|
||||||
@@ -18,6 +18,11 @@ task :warn_test do
|
|||||||
Rake::Task['base_test'].invoke
|
Rake::Task['base_test'].invoke
|
||||||
end
|
end
|
||||||
|
|
||||||
|
task :rubocop do
|
||||||
|
require 'rubocop/rake_task'
|
||||||
|
RuboCop::RakeTask.new
|
||||||
|
end
|
||||||
|
|
||||||
desc 'runs test suite with both strict and lax parsers'
|
desc 'runs test suite with both strict and lax parsers'
|
||||||
task :test do
|
task :test do
|
||||||
ENV['LIQUID_PARSER_MODE'] = 'lax'
|
ENV['LIQUID_PARSER_MODE'] = 'lax'
|
||||||
@@ -27,16 +32,16 @@ task :test do
|
|||||||
Rake::Task['base_test'].invoke
|
Rake::Task['base_test'].invoke
|
||||||
end
|
end
|
||||||
|
|
||||||
task :gem => :build
|
task gem: :build
|
||||||
task :build do
|
task :build do
|
||||||
system "gem build liquid.gemspec"
|
system "gem build liquid.gemspec"
|
||||||
end
|
end
|
||||||
|
|
||||||
task :install => :build do
|
task install: :build do
|
||||||
system "gem install liquid-#{Liquid::VERSION}.gem"
|
system "gem install liquid-#{Liquid::VERSION}.gem"
|
||||||
end
|
end
|
||||||
|
|
||||||
task :release => :build do
|
task release: :build do
|
||||||
system "git tag -a v#{Liquid::VERSION} -m 'Tagging #{Liquid::VERSION}'"
|
system "git tag -a v#{Liquid::VERSION} -m 'Tagging #{Liquid::VERSION}'"
|
||||||
system "git push --tags"
|
system "git push --tags"
|
||||||
system "gem push liquid-#{Liquid::VERSION}.gem"
|
system "gem push liquid-#{Liquid::VERSION}.gem"
|
||||||
@@ -44,7 +49,6 @@ task :release => :build do
|
|||||||
end
|
end
|
||||||
|
|
||||||
namespace :benchmark do
|
namespace :benchmark do
|
||||||
|
|
||||||
desc "Run the liquid benchmark with lax parsing"
|
desc "Run the liquid benchmark with lax parsing"
|
||||||
task :run do
|
task :run do
|
||||||
ruby "./performance/benchmark.rb lax"
|
ruby "./performance/benchmark.rb lax"
|
||||||
@@ -56,9 +60,7 @@ namespace :benchmark do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
namespace :profile do
|
namespace :profile do
|
||||||
|
|
||||||
desc "Run the liquid profile/performance coverage"
|
desc "Run the liquid profile/performance coverage"
|
||||||
task :run do
|
task :run do
|
||||||
ruby "./performance/profile.rb"
|
ruby "./performance/profile.rb"
|
||||||
@@ -68,7 +70,6 @@ namespace :profile do
|
|||||||
task :strict do
|
task :strict do
|
||||||
ruby "./performance/profile.rb strict"
|
ruby "./performance/profile.rb strict"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Run example"
|
desc "Run example"
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ module ProductsFilter
|
|||||||
end
|
end
|
||||||
|
|
||||||
class Servlet < LiquidServlet
|
class Servlet < LiquidServlet
|
||||||
|
|
||||||
def index
|
def index
|
||||||
{ 'date' => Time.now }
|
{ 'date' => Time.now }
|
||||||
end
|
end
|
||||||
@@ -42,5 +41,4 @@ class Servlet < LiquidServlet
|
|||||||
def description
|
def description
|
||||||
"List of Products ~ This is a list of products with price and description."
|
"List of Products ~ This is a list of products with price and description."
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ require_relative 'liquid_servlet'
|
|||||||
require_relative 'example_servlet'
|
require_relative 'example_servlet'
|
||||||
|
|
||||||
# Setup webrick
|
# Setup webrick
|
||||||
server = WEBrick::HTTPServer.new( :Port => ARGV[1] || 3000 )
|
server = WEBrick::HTTPServer.new(Port: ARGV[1] || 3000)
|
||||||
server.mount('/', Servlet)
|
server.mount('/', Servlet)
|
||||||
trap("INT"){ server.shutdown }
|
trap("INT"){ server.shutdown }
|
||||||
server.start
|
server.start
|
||||||
|
|||||||
+6
-6
@@ -35,17 +35,17 @@ module Liquid
|
|||||||
all_warnings
|
all_warnings
|
||||||
end
|
end
|
||||||
|
|
||||||
def unknown_tag(tag, params, tokens)
|
def unknown_tag(tag, _params, _tokens)
|
||||||
case tag
|
case tag
|
||||||
when 'else'.freeze
|
when 'else'.freeze
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.unexpected_else".freeze,
|
raise SyntaxError.new(options[:locale].t("errors.syntax.unexpected_else".freeze,
|
||||||
:block_name => block_name))
|
block_name: block_name))
|
||||||
when 'end'.freeze
|
when 'end'.freeze
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.invalid_delimiter".freeze,
|
raise SyntaxError.new(options[:locale].t("errors.syntax.invalid_delimiter".freeze,
|
||||||
:block_name => block_name,
|
block_name: block_name,
|
||||||
:block_delimiter => block_delimiter))
|
block_delimiter: block_delimiter))
|
||||||
else
|
else
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.unknown_tag".freeze, :tag => tag))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.unknown_tag".freeze, tag: tag))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ module Liquid
|
|||||||
|
|
||||||
return false if end_tag_name == block_delimiter
|
return false if end_tag_name == block_delimiter
|
||||||
unless end_tag_name
|
unless end_tag_name
|
||||||
raise SyntaxError.new(@options[:locale].t("errors.syntax.tag_never_closed".freeze, :block_name => block_name))
|
raise SyntaxError.new(@options[:locale].t("errors.syntax.tag_never_closed".freeze, block_name: block_name))
|
||||||
end
|
end
|
||||||
|
|
||||||
# this tag is not registered with the system
|
# this tag is not registered with the system
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ module Liquid
|
|||||||
# If we get an Interrupt that means the block must stop processing. An
|
# If we get an Interrupt that means the block must stop processing. An
|
||||||
# Interrupt is any command that stops block execution such as {% break %}
|
# Interrupt is any command that stops block execution such as {% break %}
|
||||||
# or {% continue %}
|
# or {% continue %}
|
||||||
if token.is_a?(Continue) or token.is_a?(Break)
|
if token.is_a?(Continue) || token.is_a?(Break)
|
||||||
context.push_interrupt(token.interrupt)
|
context.push_interrupt(token.interrupt)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@@ -121,11 +121,11 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def raise_missing_tag_terminator(token, options)
|
def raise_missing_tag_terminator(token, options)
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.tag_termination".freeze, :token => token, :tag_end => TagEnd.inspect))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.tag_termination".freeze, token: token, tag_end: TagEnd.inspect))
|
||||||
end
|
end
|
||||||
|
|
||||||
def raise_missing_variable_terminator(token, options)
|
def raise_missing_variable_terminator(token, options)
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.variable_termination".freeze, :token => token, :tag_end => VariableEnd.inspect))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.variable_termination".freeze, token: token, tag_end: VariableEnd.inspect))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+8
-12
@@ -8,16 +8,16 @@ module Liquid
|
|||||||
#
|
#
|
||||||
class Condition #:nodoc:
|
class Condition #:nodoc:
|
||||||
@@operators = {
|
@@operators = {
|
||||||
'=='.freeze => lambda { |cond, left, right| cond.send(:equal_variables, left, right) },
|
'=='.freeze => ->(cond, left, right) { cond.send(:equal_variables, left, right) },
|
||||||
'!='.freeze => lambda { |cond, left, right| !cond.send(:equal_variables, left, right) },
|
'!='.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) },
|
||||||
'<>'.freeze => lambda { |cond, left, right| !cond.send(:equal_variables, left, right) },
|
'<>'.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) },
|
||||||
'<'.freeze => :<,
|
'<'.freeze => :<,
|
||||||
'>'.freeze => :>,
|
'>'.freeze => :>,
|
||||||
'>='.freeze => :>=,
|
'>='.freeze => :>=,
|
||||||
'<='.freeze => :<=,
|
'<='.freeze => :<=,
|
||||||
'contains'.freeze => lambda { |cond, left, right|
|
'contains'.freeze => lambda do |cond, left, right|
|
||||||
left && right && left.respond_to?(:include?) ? left.include?(right) : false
|
left && right && left.respond_to?(:include?) ? left.include?(right) : false
|
||||||
}
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
def self.operators
|
def self.operators
|
||||||
@@ -96,7 +96,7 @@ module Liquid
|
|||||||
# If the operator is empty this means that the decision statement is just
|
# If the operator is empty this means that the decision statement is just
|
||||||
# a single variable. We can just poll this variable from the context and
|
# a single variable. We can just poll this variable from the context and
|
||||||
# return this as the result.
|
# return this as the result.
|
||||||
return context.evaluate(left) if op == nil
|
return context.evaluate(left) if op.nil?
|
||||||
|
|
||||||
left = context.evaluate(left)
|
left = context.evaluate(left)
|
||||||
right = context.evaluate(right)
|
right = context.evaluate(right)
|
||||||
@@ -105,27 +105,23 @@ module Liquid
|
|||||||
|
|
||||||
if operation.respond_to?(:call)
|
if operation.respond_to?(:call)
|
||||||
operation.call(self, left, right)
|
operation.call(self, left, right)
|
||||||
elsif left.respond_to?(operation) and right.respond_to?(operation)
|
elsif left.respond_to?(operation) && right.respond_to?(operation)
|
||||||
begin
|
begin
|
||||||
left.send(operation, right)
|
left.send(operation, right)
|
||||||
rescue ::ArgumentError => e
|
rescue ::ArgumentError => e
|
||||||
raise Liquid::ArgumentError.new(e.message)
|
raise Liquid::ArgumentError.new(e.message)
|
||||||
end
|
end
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
class ElseCondition < Condition
|
class ElseCondition < Condition
|
||||||
def else?
|
def else?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def evaluate(context)
|
def evaluate(_context)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Context keeps the variable stack and resolves variables, as well as keywords
|
# Context keeps the variable stack and resolves variables, as well as keywords
|
||||||
#
|
#
|
||||||
# context['variable'] = 'testing'
|
# context['variable'] = 'testing'
|
||||||
@@ -63,7 +62,6 @@ module Liquid
|
|||||||
@interrupts.pop
|
@interrupts.pop
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def handle_error(e, token = nil)
|
def handle_error(e, token = nil)
|
||||||
if e.is_a?(Liquid::Error)
|
if e.is_a?(Liquid::Error)
|
||||||
e.set_line_number_from_token(token)
|
e.set_line_number_from_token(token)
|
||||||
@@ -153,7 +151,6 @@ module Liquid
|
|||||||
|
|
||||||
# Fetches an object starting at the local scope and then moving up the hierachy
|
# Fetches an object starting at the local scope and then moving up the hierachy
|
||||||
def find_variable(key)
|
def find_variable(key)
|
||||||
|
|
||||||
# This was changed from find() to find_index() because this is a very hot
|
# This was changed from find() to find_index() because this is a very hot
|
||||||
# path and find_index() is optimized in MRI to reduce object allocation
|
# path and find_index() is optimized in MRI to reduce object allocation
|
||||||
index = @scopes.find_index { |s| s.has_key?(key) }
|
index = @scopes.find_index { |s| s.has_key?(key) }
|
||||||
@@ -177,7 +174,7 @@ module Liquid
|
|||||||
variable = variable.to_liquid
|
variable = variable.to_liquid
|
||||||
variable.context = self if variable.respond_to?(:context=)
|
variable.context = self if variable.respond_to?(:context=)
|
||||||
|
|
||||||
return variable
|
variable
|
||||||
end
|
end
|
||||||
|
|
||||||
def lookup_and_evaluate(obj, key)
|
def lookup_and_evaluate(obj, key)
|
||||||
@@ -189,6 +186,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def squash_instance_assigns_with_environments
|
def squash_instance_assigns_with_environments
|
||||||
@scopes.last.each_key do |k|
|
@scopes.last.each_key do |k|
|
||||||
@environments.each do |env|
|
@environments.each do |env|
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ module Liquid
|
|||||||
def unknown_tag(tag, options)
|
def unknown_tag(tag, options)
|
||||||
case tag
|
case tag
|
||||||
when 'else'.freeze, 'end'.freeze
|
when 'else'.freeze, 'end'.freeze
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.unexpected_outer_tag".freeze, :tag => tag))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.unexpected_outer_tag".freeze, tag: tag))
|
||||||
else
|
else
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.unknown_tag".freeze, :tag => tag))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.unknown_tag".freeze, tag: tag))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+4
-5
@@ -1,7 +1,6 @@
|
|||||||
require 'set'
|
require 'set'
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# A drop in liquid is a class which allows you to export DOM like things to liquid.
|
# A drop in liquid is a class which allows you to export DOM like things to liquid.
|
||||||
# Methods of drops are callable.
|
# Methods of drops are callable.
|
||||||
# The main use for liquid drops is to implement lazy loaded objects.
|
# The main use for liquid drops is to implement lazy loaded objects.
|
||||||
@@ -27,7 +26,7 @@ module Liquid
|
|||||||
EMPTY_STRING = ''.freeze
|
EMPTY_STRING = ''.freeze
|
||||||
|
|
||||||
# Catch all for the method
|
# Catch all for the method
|
||||||
def before_method(method)
|
def before_method(_method)
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -40,7 +39,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_key?(name)
|
def has_key?(_name)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -56,13 +55,13 @@ module Liquid
|
|||||||
self.class.name
|
self.class.name
|
||||||
end
|
end
|
||||||
|
|
||||||
alias :[] :invoke_drop
|
alias_method :[], :invoke_drop
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Check for method existence without invoking respond_to?, which creates symbols
|
# Check for method existence without invoking respond_to?, which creates symbols
|
||||||
def self.invokable?(method_name)
|
def self.invokable?(method_name)
|
||||||
self.invokable_methods.include?(method_name.to_s)
|
invokable_methods.include?(method_name.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.invokable_methods
|
def self.invokable_methods
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ module Liquid
|
|||||||
|
|
||||||
def set_line_number_from_token(token)
|
def set_line_number_from_token(token)
|
||||||
return unless token.respond_to?(:line_number)
|
return unless token.respond_to?(:line_number)
|
||||||
return if self.line_number
|
return if line_number
|
||||||
self.line_number = token.line_number
|
self.line_number = token.line_number
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ module Liquid
|
|||||||
if e.is_a?(Liquid::Error)
|
if e.is_a?(Liquid::Error)
|
||||||
e.to_s
|
e.to_s
|
||||||
else
|
else
|
||||||
"Liquid error: #{e.to_s}"
|
"Liquid error: #{e}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,5 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ module Liquid
|
|||||||
# This will parse the template with a LocalFileSystem implementation rooted at 'template_path'.
|
# This will parse the template with a LocalFileSystem implementation rooted at 'template_path'.
|
||||||
class BlankFileSystem
|
class BlankFileSystem
|
||||||
# Called by Liquid to retrieve a template file
|
# Called by Liquid to retrieve a template file
|
||||||
def read_template_file(template_path)
|
def read_template_file(_template_path)
|
||||||
raise FileSystemError, "This liquid context does not allow includes."
|
raise FileSystemError, "This liquid context does not allow includes."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -51,7 +51,7 @@ module Liquid
|
|||||||
|
|
||||||
def read_template_file(template_path)
|
def read_template_file(template_path)
|
||||||
full_path = full_path(template_path)
|
full_path = full_path(template_path)
|
||||||
raise FileSystemError, "No such template '#{template_path}'" unless File.exists?(full_path)
|
raise FileSystemError, "No such template '#{template_path}'" unless File.exist?(full_path)
|
||||||
|
|
||||||
File.read(full_path)
|
File.read(full_path)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def interpolate(name, vars)
|
def interpolate(name, vars)
|
||||||
name.gsub(/%\{(\w+)\}/) {
|
name.gsub(/%\{(\w+)\}/) {
|
||||||
# raise TranslationError, "Undefined key #{$1} for interpolation in translation #{name}" unless vars[$1.to_sym]
|
# raise TranslationError, "Undefined key #{$1} for interpolation in translation #{name}" unless vars[$1.to_sym]
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# An interrupt is any command that breaks processing of a block (ex: a for loop).
|
# An interrupt is any command that breaks processing of a block (ex: a for loop).
|
||||||
class Interrupt
|
class Interrupt
|
||||||
attr_reader :message
|
attr_reader :message
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ module Liquid
|
|||||||
def tokenize
|
def tokenize
|
||||||
@output = []
|
@output = []
|
||||||
|
|
||||||
while !@ss.eos?
|
until @ss.eos?
|
||||||
@ss.skip(/\s*/)
|
@ss.skip(/\s*/)
|
||||||
tok = case
|
tok = case
|
||||||
when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t]
|
when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t]
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
#
|
#
|
||||||
class Module
|
class Module
|
||||||
def liquid_methods(*allowed_methods)
|
def liquid_methods(*allowed_methods)
|
||||||
drop_class = eval "class #{self.to_s}::LiquidDropClass < Liquid::Drop; self; end"
|
drop_class = eval "class #{self}::LiquidDropClass < Liquid::Drop; self; end"
|
||||||
|
|
||||||
define_method :to_liquid do
|
define_method :to_liquid do
|
||||||
drop_class.new(self)
|
drop_class.new(self)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def strict_parse_with_error_context(markup)
|
def strict_parse_with_error_context(markup)
|
||||||
strict_parse(markup)
|
strict_parse(markup)
|
||||||
rescue SyntaxError => e
|
rescue SyntaxError => e
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
require 'liquid/profiler/hooks'
|
require 'liquid/profiler/hooks'
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Profiler enables support for profiling template rendering to help track down performance issues.
|
# Profiler enables support for profiling template rendering to help track down performance issues.
|
||||||
#
|
#
|
||||||
# To enable profiling, first require 'liquid/profiler'.
|
# To enable profiling, first require 'liquid/profiler'.
|
||||||
@@ -55,9 +54,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.start(token, partial)
|
def self.start(token, partial)
|
||||||
new(token, partial).tap do |t|
|
new(token, partial).tap(&:start)
|
||||||
t.start
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def start
|
def start
|
||||||
@@ -139,7 +136,7 @@ module Liquid
|
|||||||
@timing_stack.push(Timing.start(token, current_partial))
|
@timing_stack.push(Timing.start(token, current_partial))
|
||||||
end
|
end
|
||||||
|
|
||||||
def end_token(token)
|
def end_token(_token)
|
||||||
timing = @timing_stack.pop
|
timing = @timing_stack.pop
|
||||||
timing.finish
|
timing.finish
|
||||||
|
|
||||||
@@ -157,6 +154,5 @@ module Liquid
|
|||||||
def pop_partial
|
def pop_partial
|
||||||
@partial_stack.pop
|
@partial_stack.pop
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ require 'cgi'
|
|||||||
require 'bigdecimal'
|
require 'bigdecimal'
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
module StandardFilters
|
module StandardFilters
|
||||||
HTML_ESCAPE = {
|
HTML_ESCAPE = {
|
||||||
'&'.freeze => '&'.freeze,
|
'&'.freeze => '&'.freeze,
|
||||||
@@ -59,14 +58,14 @@ module Liquid
|
|||||||
|
|
||||||
# Truncate a string down to x characters
|
# Truncate a string down to x characters
|
||||||
def truncate(input, length = 50, truncate_string = "...".freeze)
|
def truncate(input, length = 50, truncate_string = "...".freeze)
|
||||||
if input.nil? then return end
|
return if input.nil?
|
||||||
l = length.to_i - truncate_string.length
|
l = length.to_i - truncate_string.length
|
||||||
l = 0 if l < 0
|
l = 0 if l < 0
|
||||||
input.length > length.to_i ? input[0...l] + truncate_string : input
|
input.length > length.to_i ? input[0...l] + truncate_string : input
|
||||||
end
|
end
|
||||||
|
|
||||||
def truncatewords(input, words = 15, truncate_string = "...".freeze)
|
def truncatewords(input, words = 15, truncate_string = "...".freeze)
|
||||||
if input.nil? then return end
|
return if input.nil?
|
||||||
wordlist = input.to_s.split
|
wordlist = input.to_s.split
|
||||||
l = words.to_i - 1
|
l = words.to_i - 1
|
||||||
l = 0 if l < 0
|
l = 0 if l < 0
|
||||||
@@ -336,8 +335,6 @@ module Liquid
|
|||||||
Time.at(obj.to_i)
|
Time.at(obj.to_i)
|
||||||
when String
|
when String
|
||||||
Time.parse(obj)
|
Time.parse(obj)
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
end
|
||||||
rescue ArgumentError
|
rescue ArgumentError
|
||||||
nil
|
nil
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
require 'set'
|
require 'set'
|
||||||
|
|
||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Strainer is the parent class for the filters system.
|
# Strainer is the parent class for the filters system.
|
||||||
# New filters are mixed into the strainer class which is then instantiated for each liquid template render run.
|
# New filters are mixed into the strainer class which is then instantiated for each liquid template render run.
|
||||||
#
|
#
|
||||||
@@ -22,14 +21,14 @@ module Liquid
|
|||||||
@context = context
|
@context = context
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.filter_methods
|
class << self
|
||||||
@filter_methods
|
attr_reader :filter_methods
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.add_filter(filter)
|
def self.add_filter(filter)
|
||||||
raise ArgumentError, "Expected module but got: #{f.class}" unless filter.is_a?(Module)
|
raise ArgumentError, "Expected module but got: #{f.class}" unless filter.is_a?(Module)
|
||||||
unless self.class.include?(filter)
|
unless self.class.include?(filter)
|
||||||
self.send(:include, filter)
|
send(:include, filter)
|
||||||
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
|
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+2
-2
@@ -20,7 +20,7 @@ module Liquid
|
|||||||
@options = options
|
@options = options
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse(tokens)
|
def parse(_tokens)
|
||||||
end
|
end
|
||||||
|
|
||||||
def raw
|
def raw
|
||||||
@@ -31,7 +31,7 @@ module Liquid
|
|||||||
self.class.name.downcase
|
self.class.name.downcase
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context)
|
def render(_context)
|
||||||
''.freeze
|
''.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Assign sets a variable in your template.
|
# Assign sets a variable in your template.
|
||||||
#
|
#
|
||||||
# {% assign foo = 'monkey' %}
|
# {% assign foo = 'monkey' %}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Break tag to be used to break out of a for loop.
|
# Break tag to be used to break out of a for loop.
|
||||||
#
|
#
|
||||||
# == Basic Usage:
|
# == Basic Usage:
|
||||||
@@ -10,11 +9,9 @@ module Liquid
|
|||||||
# {% endfor %}
|
# {% endfor %}
|
||||||
#
|
#
|
||||||
class Break < Tag
|
class Break < Tag
|
||||||
|
|
||||||
def interrupt
|
def interrupt
|
||||||
BreakInterrupt.new
|
BreakInterrupt.new
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Template.register_tag('break'.freeze, Break)
|
Template.register_tag('break'.freeze, Break)
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ module Liquid
|
|||||||
body = BlockBody.new
|
body = BlockBody.new
|
||||||
|
|
||||||
while markup
|
while markup
|
||||||
if not markup =~ WhenSyntax
|
unless markup =~ WhenSyntax
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_when".freeze))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_when".freeze))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def record_else_condition(markup)
|
def record_else_condition(markup)
|
||||||
if not markup.strip.empty?
|
unless markup.strip.empty?
|
||||||
raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_else".freeze))
|
raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_else".freeze))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
class Comment < Block
|
class Comment < Block
|
||||||
def render(context)
|
def render(_context)
|
||||||
''.freeze
|
''.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def unknown_tag(tag, markup, tokens)
|
def unknown_tag(_tag, _markup, _tokens)
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
def blank?
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# decrement is used in a place where one needs to insert a counter
|
# decrement is used in a place where one needs to insert a counter
|
||||||
# into a template, and needs the counter to survive across
|
# into a template, and needs the counter to survive across
|
||||||
# multiple instantiations of the template.
|
# multiple instantiations of the template.
|
||||||
@@ -26,12 +25,10 @@ module Liquid
|
|||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
value = context.environments.first[@variable] ||= 0
|
value = context.environments.first[@variable] ||= 0
|
||||||
value = value - 1
|
value -= 1
|
||||||
context.environments.first[@variable] = value
|
context.environments.first[@variable] = value
|
||||||
value.to_s
|
value.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Template.register_tag('decrement'.freeze, Decrement)
|
Template.register_tag('decrement'.freeze, Decrement)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# "For" iterates over an array or collection.
|
# "For" iterates over an array or collection.
|
||||||
# Several useful variables are available to you within the loop.
|
# Several useful variables are available to you within the loop.
|
||||||
#
|
#
|
||||||
@@ -54,10 +53,9 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def parse(tokens)
|
def parse(tokens)
|
||||||
if more = parse_body(@for_block, tokens)
|
return unless parse_body(@for_block, tokens)
|
||||||
parse_body(@else_block, tokens)
|
parse_body(@else_block, tokens)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
def nodelist
|
def nodelist
|
||||||
@else_block ? [@for_block, @else_block] : [@for_block]
|
@else_block ? [@for_block, @else_block] : [@for_block]
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def parse(tokens)
|
def parse(tokens)
|
||||||
while more = parse_body(@blocks.last.attachment, tokens)
|
while parse_body(@blocks.last.attachment, tokens)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ module Liquid
|
|||||||
|
|
||||||
condition = Condition.new(Expression.parse($1), $2, Expression.parse($3))
|
condition = Condition.new(Expression.parse($1), $2, Expression.parse($3))
|
||||||
|
|
||||||
while not expressions.empty?
|
until expressions.empty?
|
||||||
operator = expressions.pop.to_s.strip
|
operator = expressions.pop.to_s.strip
|
||||||
|
|
||||||
raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax
|
raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
class Ifchanged < Block
|
class Ifchanged < Block
|
||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
context.stack do
|
context.stack do
|
||||||
|
|
||||||
output = super
|
output = super
|
||||||
|
|
||||||
if output != context.registers[:ifchanged]
|
if output != context.registers[:ifchanged]
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Include allows templates to relate with other templates
|
# Include allows templates to relate with other templates
|
||||||
#
|
#
|
||||||
# Simply include another template:
|
# Simply include another template:
|
||||||
@@ -38,7 +37,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse(tokens)
|
def parse(_tokens)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context)
|
def render(context)
|
||||||
@@ -71,6 +70,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_cached_partial(context)
|
def load_cached_partial(context)
|
||||||
cached_partials = context.registers[:cached_partials] || {}
|
cached_partials = context.registers[:cached_partials] || {}
|
||||||
template_name = context.evaluate(@template_name_expr)
|
template_name = context.evaluate(@template_name_expr)
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ module Liquid
|
|||||||
@body << $1 if $1 != "".freeze
|
@body << $1 if $1 != "".freeze
|
||||||
return if block_delimiter == $2
|
return if block_delimiter == $2
|
||||||
end
|
end
|
||||||
@body << token if not token.empty?
|
@body << token unless token.empty?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(context)
|
def render(_context)
|
||||||
@body
|
@body
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ module Liquid
|
|||||||
|
|
||||||
result = "<tr class=\"row1\">\n"
|
result = "<tr class=\"row1\">\n"
|
||||||
context.stack do
|
context.stack do
|
||||||
|
|
||||||
collection.each_with_index do |item, index|
|
collection.each_with_index do |item, index|
|
||||||
context[@variable_name] = item
|
context[@variable_name] = item
|
||||||
context['tablerowloop'.freeze] = {
|
context['tablerowloop'.freeze] = {
|
||||||
@@ -50,17 +49,15 @@ module Liquid
|
|||||||
'col_last'.freeze => (col == cols - 1)
|
'col_last'.freeze => (col == cols - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
col += 1
|
col += 1
|
||||||
|
|
||||||
result << "<td class=\"col#{col}\">" << super << '</td>'
|
result << "<td class=\"col#{col}\">" << super << '</td>'
|
||||||
|
|
||||||
if col == cols and (index != length - 1)
|
if col == cols && (index != length - 1)
|
||||||
col = 0
|
col = 0
|
||||||
row += 1
|
row += 1
|
||||||
result << "</tr>\n<tr class=\"row#{row}\">"
|
result << "</tr>\n<tr class=\"row#{row}\">"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
result << "</tr>\n"
|
result << "</tr>\n"
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ module Liquid
|
|||||||
class Unless < If
|
class Unless < If
|
||||||
def render(context)
|
def render(context)
|
||||||
context.stack do
|
context.stack do
|
||||||
|
|
||||||
# First condition is interpreted backwards ( if not )
|
# First condition is interpreted backwards ( if not )
|
||||||
first_block = @blocks.first
|
first_block = @blocks.first
|
||||||
unless first_block.evaluate(context)
|
unless first_block.evaluate(context)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Templates are central to liquid.
|
# Templates are central to liquid.
|
||||||
# Interpretating templates is a two step process. First you compile the
|
# Interpretating templates is a two step process. First you compile the
|
||||||
# source code you got. During compile time some extensive error checking is performed.
|
# source code you got. During compile time some extensive error checking is performed.
|
||||||
@@ -15,7 +14,7 @@ module Liquid
|
|||||||
#
|
#
|
||||||
class Template
|
class Template
|
||||||
DEFAULT_OPTIONS = {
|
DEFAULT_OPTIONS = {
|
||||||
:locale => I18n.new
|
locale: I18n.new
|
||||||
}
|
}
|
||||||
|
|
||||||
attr_accessor :root
|
attr_accessor :root
|
||||||
@@ -189,7 +188,7 @@ module Liquid
|
|||||||
options = args.pop
|
options = args.pop
|
||||||
|
|
||||||
if options[:registers].is_a?(Hash)
|
if options[:registers].is_a?(Hash)
|
||||||
self.registers.merge!(options[:registers])
|
registers.merge!(options[:registers])
|
||||||
end
|
end
|
||||||
|
|
||||||
if options[:filters]
|
if options[:filters]
|
||||||
@@ -237,7 +236,7 @@ module Liquid
|
|||||||
tokens = calculate_line_numbers(source.split(TemplateParser))
|
tokens = calculate_line_numbers(source.split(TemplateParser))
|
||||||
|
|
||||||
# removes the rogue empty element at the beginning of the array
|
# removes the rogue empty element at the beginning of the array
|
||||||
tokens.shift if tokens[0] and tokens[0].empty?
|
tokens.shift if tokens[0] && tokens[0].empty?
|
||||||
|
|
||||||
tokens
|
tokens
|
||||||
end
|
end
|
||||||
|
|||||||
+1
-3
@@ -1,8 +1,7 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
module Utils
|
module Utils
|
||||||
|
|
||||||
def self.slice_collection(collection, from, to)
|
def self.slice_collection(collection, from, to)
|
||||||
if (from != 0 || to != nil) && collection.respond_to?(:load_slice)
|
if (from != 0 || !to.nil?) && collection.respond_to?(:load_slice)
|
||||||
collection.load_slice(from, to)
|
collection.load_slice(from, to)
|
||||||
else
|
else
|
||||||
slice_collection_using_each(collection, from, to)
|
slice_collection_using_each(collection, from, to)
|
||||||
@@ -21,7 +20,6 @@ module Liquid
|
|||||||
return [collection] if non_blank_string?(collection)
|
return [collection] if non_blank_string?(collection)
|
||||||
|
|
||||||
collection.each do |item|
|
collection.each do |item|
|
||||||
|
|
||||||
if to && to <= index
|
if to && to <= index
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module Liquid
|
module Liquid
|
||||||
|
|
||||||
# Holds variables. Variables are only loaded "just in time"
|
# Holds variables. Variables are only loaded "just in time"
|
||||||
# and are not evaluated as part of the render stage
|
# and are not evaluated as part of the render stage
|
||||||
#
|
#
|
||||||
@@ -34,7 +33,8 @@ module Liquid
|
|||||||
|
|
||||||
def lax_parse(markup)
|
def lax_parse(markup)
|
||||||
@filters = []
|
@filters = []
|
||||||
if markup =~ /(#{QuotedFragment})(.*)/om
|
return unless markup =~ /(#{QuotedFragment})(.*)/om
|
||||||
|
|
||||||
name_markup = $1
|
name_markup = $1
|
||||||
filter_markup = $2
|
filter_markup = $2
|
||||||
@name = Expression.parse(name_markup)
|
@name = Expression.parse(name_markup)
|
||||||
@@ -49,7 +49,6 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
def strict_parse(markup)
|
def strict_parse(markup)
|
||||||
@filters = []
|
@filters = []
|
||||||
@@ -68,9 +67,7 @@ module Liquid
|
|||||||
# first argument
|
# first argument
|
||||||
filterargs = [p.argument]
|
filterargs = [p.argument]
|
||||||
# followed by comma separated others
|
# followed by comma separated others
|
||||||
while p.consume?(:comma)
|
filterargs << p.argument while p.consume?(:comma)
|
||||||
filterargs << p.argument
|
|
||||||
end
|
|
||||||
filterargs
|
filterargs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def ==(other)
|
def ==(other)
|
||||||
self.class == other.class && self.state == other.state
|
self.class == other.class && state == other.state
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
lib = File.expand_path('../lib/', __FILE__)
|
lib = File.expand_path('../lib/', __FILE__)
|
||||||
$:.unshift lib unless $:.include?(lib)
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
||||||
|
|
||||||
require "liquid/version"
|
require "liquid/version"
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ profiler = ThemeRunner.new
|
|||||||
profiler.run
|
profiler.run
|
||||||
|
|
||||||
[:cpu, :object].each do |profile_type|
|
[:cpu, :object].each do |profile_type|
|
||||||
puts "Profiling in #{profile_type.to_s} mode..."
|
puts "Profiling in #{profile_type} mode..."
|
||||||
results = StackProf.run(mode: profile_type) do
|
results = StackProf.run(mode: profile_type) do
|
||||||
200.times do
|
200.times do
|
||||||
profiler.run
|
profiler.run
|
||||||
|
|||||||
@@ -28,6 +28,6 @@ class CommentForm < Liquid::Block
|
|||||||
end
|
end
|
||||||
|
|
||||||
def wrap_in_form(article, input)
|
def wrap_in_form(article, input)
|
||||||
%Q{<form id="article-#{article.id}-comment-form" class="comment-form" method="post" action="">\n#{input}\n</form>}
|
%(<form id="article-#{article.id}-comment-form" class="comment-form" method="post" action="">\n#{input}\n</form>)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ module Database
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if __FILE__ == $0
|
if __FILE__ == $PROGRAM_NAME
|
||||||
p Database.tables['collections']['frontpage'].keys
|
p Database.tables['collections']['frontpage'].keys
|
||||||
# p Database.tables['blog']['articles']
|
# p Database.tables['blog']['articles']
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
require 'json'
|
require 'json'
|
||||||
|
|
||||||
module JsonFilter
|
module JsonFilter
|
||||||
|
|
||||||
def json(object)
|
def json(object)
|
||||||
JSON.dump(object.reject { |k, v| k == "collections" })
|
JSON.dump(object.reject { |k, v| k == "collections" })
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module MoneyFilter
|
module MoneyFilter
|
||||||
|
|
||||||
def money_with_currency(money)
|
def money_with_currency(money)
|
||||||
return '' if money.nil?
|
return '' if money.nil?
|
||||||
sprintf("$ %.2f USD", money / 100.0)
|
sprintf("$ %.2f USD", money / 100.0)
|
||||||
|
|||||||
@@ -51,14 +51,13 @@ class Paginate < Liquid::Block
|
|||||||
|
|
||||||
if page_count > 2
|
if page_count > 2
|
||||||
1.upto(page_count - 1) do |page|
|
1.upto(page_count - 1) do |page|
|
||||||
|
|
||||||
if current_page == page
|
if current_page == page
|
||||||
pagination['parts'] << no_link(page)
|
pagination['parts'] << no_link(page)
|
||||||
elsif page == 1
|
elsif page == 1
|
||||||
pagination['parts'] << link(page, page)
|
pagination['parts'] << link(page, page)
|
||||||
elsif page == page_count - 1
|
elsif page == page_count - 1
|
||||||
pagination['parts'] << link(page, page)
|
pagination['parts'] << link(page, page)
|
||||||
elsif page <= current_page - @attributes['window_size'] or page >= current_page + @attributes['window_size']
|
elsif page <= current_page - @attributes['window_size'] || page >= current_page + @attributes['window_size']
|
||||||
next if hellip_break
|
next if hellip_break
|
||||||
pagination['parts'] << no_link('…')
|
pagination['parts'] << no_link('…')
|
||||||
hellip_break = true
|
hellip_break = true
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module ShopFilter
|
module ShopFilter
|
||||||
|
|
||||||
def asset_url(input)
|
def asset_url(input)
|
||||||
"/files/1/[shop_id]/[shop_id]/assets/#{input}"
|
"/files/1/[shop_id]/[shop_id]/assets/#{input}"
|
||||||
end
|
end
|
||||||
@@ -21,11 +20,11 @@ module ShopFilter
|
|||||||
end
|
end
|
||||||
|
|
||||||
def link_to(link, url, title = "")
|
def link_to(link, url, title = "")
|
||||||
%|<a href="#{url}" title="#{title}">#{link}</a>|
|
%(<a href="#{url}" title="#{title}">#{link}</a>)
|
||||||
end
|
end
|
||||||
|
|
||||||
def img_tag(url, alt = "")
|
def img_tag(url, alt = "")
|
||||||
%|<img src="#{url}" alt="#{alt}" />|
|
%(<img src="#{url}" alt="#{alt}" />)
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_to_vendor(vendor)
|
def link_to_vendor(vendor)
|
||||||
@@ -53,7 +52,6 @@ module ShopFilter
|
|||||||
end
|
end
|
||||||
|
|
||||||
def product_img_url(url, style = 'small')
|
def product_img_url(url, style = 'small')
|
||||||
|
|
||||||
unless url =~ /\Aproducts\/([\w\-\_]+)\.(\w{2,4})/
|
unless url =~ /\Aproducts\/([\w\-\_]+)\.(\w{2,4})/
|
||||||
raise ArgumentError, 'filter "size" can only be called on product images'
|
raise ArgumentError, 'filter "size" can only be called on product images'
|
||||||
end
|
end
|
||||||
@@ -69,7 +67,6 @@ module ShopFilter
|
|||||||
end
|
end
|
||||||
|
|
||||||
def default_pagination(paginate)
|
def default_pagination(paginate)
|
||||||
|
|
||||||
html = []
|
html = []
|
||||||
html << %(<span class="prev">#{link_to(paginate['previous']['title'], paginate['previous']['url'])}</span>) if paginate['previous']
|
html << %(<span class="prev">#{link_to(paginate['previous']['title'], paginate['previous']['url'])}</span>) if paginate['previous']
|
||||||
|
|
||||||
@@ -106,5 +103,4 @@ module ShopFilter
|
|||||||
result.gsub!(/\A-+/, '') if result[0] == '-'
|
result.gsub!(/\A-+/, '') if result[0] == '-'
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module TagFilter
|
module TagFilter
|
||||||
|
|
||||||
def link_to_tag(label, tag)
|
def link_to_tag(label, tag)
|
||||||
"<a title=\"Show tag #{tag}\" href=\"/collections/#{@context['handle']}/#{tag}\">#{label}</a>"
|
"<a title=\"Show tag #{tag}\" href=\"/collections/#{@context['handle']}/#{tag}\">#{label}</a>"
|
||||||
end
|
end
|
||||||
@@ -21,5 +20,4 @@ module TagFilter
|
|||||||
tags = (@context['current_tags'] - [tag]).uniq
|
tags = (@context['current_tags'] - [tag]).uniq
|
||||||
"<a title=\"Show tag #{tag}\" href=\"/collections/#{@context['handle']}/#{tags.join("+")}\">#{label}</a>"
|
"<a title=\"Show tag #{tag}\" href=\"/collections/#{@context['handle']}/#{tags.join("+")}\">#{label}</a>"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
module WeightFilter
|
module WeightFilter
|
||||||
|
|
||||||
def weight(grams)
|
def weight(grams)
|
||||||
sprintf("%.2f", grams / 1000)
|
sprintf("%.2f", grams / 1000)
|
||||||
end
|
end
|
||||||
@@ -7,5 +6,4 @@ module WeightFilter
|
|||||||
def weight_with_unit(grams)
|
def weight_with_unit(grams)
|
||||||
"#{weight(grams)} kg"
|
"#{weight(grams)} kg"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ require_relative 'shopify/database'
|
|||||||
|
|
||||||
class ThemeRunner
|
class ThemeRunner
|
||||||
class FileSystem
|
class FileSystem
|
||||||
|
|
||||||
def initialize(path)
|
def initialize(path)
|
||||||
@path = path
|
@path = path
|
||||||
end
|
end
|
||||||
@@ -38,7 +37,6 @@ class ThemeRunner
|
|||||||
# Dup assigns because will make some changes to them
|
# Dup assigns because will make some changes to them
|
||||||
|
|
||||||
@tests.each do |liquid, layout, template_name|
|
@tests.each do |liquid, layout, template_name|
|
||||||
|
|
||||||
tmpl = Liquid::Template.new
|
tmpl = Liquid::Template.new
|
||||||
tmpl.parse(liquid)
|
tmpl.parse(liquid)
|
||||||
tmpl = Liquid::Template.new
|
tmpl = Liquid::Template.new
|
||||||
@@ -51,15 +49,12 @@ class ThemeRunner
|
|||||||
assigns = Database.tables.dup
|
assigns = Database.tables.dup
|
||||||
|
|
||||||
@tests.each do |liquid, layout, template_name|
|
@tests.each do |liquid, layout, template_name|
|
||||||
|
|
||||||
# Compute page_tempalte outside of profiler run, uninteresting to profiler
|
# Compute page_tempalte outside of profiler run, uninteresting to profiler
|
||||||
page_template = File.basename(template_name, File.extname(template_name))
|
page_template = File.basename(template_name, File.extname(template_name))
|
||||||
compile_and_render(liquid, layout, assigns, page_template, template_name)
|
compile_and_render(liquid, layout, assigns, page_template, template_name)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def compile_and_render(template, layout, assigns, page_template, template_file)
|
def compile_and_render(template, layout, assigns, page_template, template_file)
|
||||||
tmpl = Liquid::Template.new
|
tmpl = Liquid::Template.new
|
||||||
tmpl.assigns['page_title'] = 'Page title'
|
tmpl.assigns['page_title'] = 'Page title'
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ class AssignTest < Minitest::Test
|
|||||||
def test_assigned_variable
|
def test_assigned_variable
|
||||||
assert_template_result('.foo.',
|
assert_template_result('.foo.',
|
||||||
'{% assign foo = values %}.{{ foo[0] }}.',
|
'{% assign foo = values %}.{{ foo[0] }}.',
|
||||||
'values' => %w{foo bar baz})
|
'values' => %w(foo bar baz))
|
||||||
|
|
||||||
assert_template_result('.bar.',
|
assert_template_result('.bar.',
|
||||||
'{% assign foo = values %}.{{ foo[1] }}.',
|
'{% assign foo = values %}.{{ foo[1] }}.',
|
||||||
'values' => %w{foo bar baz})
|
'values' => %w(foo bar baz))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_assign_with_filter
|
def test_assign_with_filter
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ class BlankTest < Minitest::Test
|
|||||||
def test_nested_blocks_are_blank_but_only_if_all_children_are
|
def test_nested_blocks_are_blank_but_only_if_all_children_are
|
||||||
assert_template_result("", wrap(wrap(" ")))
|
assert_template_result("", wrap(wrap(" ")))
|
||||||
assert_template_result("\n but this is not " * (N + 1),
|
assert_template_result("\n but this is not " * (N + 1),
|
||||||
wrap(%q{{% if true %} {% comment %} this is blank {% endcomment %} {% endif %}
|
wrap('{% if true %} {% comment %} this is blank {% endcomment %} {% endif %}
|
||||||
{% if true %} but this is not {% endif %}}))
|
{% if true %} but this is not {% endif %}'))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_assigns_are_blank
|
def test_assigns_are_blank
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ContextDrop < Liquid::Drop
|
|||||||
end
|
end
|
||||||
|
|
||||||
def before_method(method)
|
def before_method(method)
|
||||||
return @context[method]
|
@context[method]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ class ProductDrop < Liquid::Drop
|
|||||||
|
|
||||||
class CatchallDrop < Liquid::Drop
|
class CatchallDrop < Liquid::Drop
|
||||||
def before_method(method)
|
def before_method(method)
|
||||||
return 'method: ' << method.to_s
|
'method: ' << method.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -53,6 +53,7 @@ class ProductDrop < Liquid::Drop
|
|||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def callmenot
|
def callmenot
|
||||||
"protected"
|
"protected"
|
||||||
end
|
end
|
||||||
@@ -199,9 +200,9 @@ class DropsTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_scope_though_proc
|
def test_scope_though_proc
|
||||||
assert_equal '1', Liquid::Template.parse( '{{ s }}' ).render!('context' => ContextDrop.new, 's' => Proc.new{|c| c['context.scopes'] })
|
assert_equal '1', Liquid::Template.parse('{{ s }}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] })
|
||||||
assert_equal '2', Liquid::Template.parse( '{%for i in dummy%}{{ s }}{%endfor%}' ).render!('context' => ContextDrop.new, 's' => Proc.new{|c| c['context.scopes'] }, 'dummy' => [1])
|
assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ s }}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1])
|
||||||
assert_equal '3', Liquid::Template.parse( '{%for i in dummy%}{%for i in dummy%}{{ s }}{%endfor%}{%endfor%}' ).render!('context' => ContextDrop.new, 's' => Proc.new{|c| c['context.scopes'] }, 'dummy' => [1])
|
assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ s }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_scope_with_assigns
|
def test_scope_with_assigns
|
||||||
|
|||||||
@@ -102,13 +102,13 @@ class ErrorHandlingTest < Minitest::Test
|
|||||||
|
|
||||||
def test_with_line_numbers_adds_numbers_to_parser_errors
|
def test_with_line_numbers_adds_numbers_to_parser_errors
|
||||||
err = assert_raises(SyntaxError) do
|
err = assert_raises(SyntaxError) do
|
||||||
template = Liquid::Template.parse(%q{
|
template = Liquid::Template.parse(%q(
|
||||||
foobar
|
foobar
|
||||||
|
|
||||||
{% "cat" | foobar %}
|
{% "cat" | foobar %}
|
||||||
|
|
||||||
bla
|
bla
|
||||||
},
|
),
|
||||||
:line_numbers => true
|
:line_numbers => true
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@@ -117,13 +117,13 @@ class ErrorHandlingTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_parsing_warn_with_line_numbers_adds_numbers_to_lexer_errors
|
def test_parsing_warn_with_line_numbers_adds_numbers_to_lexer_errors
|
||||||
template = Liquid::Template.parse(%q{
|
template = Liquid::Template.parse('
|
||||||
foobar
|
foobar
|
||||||
|
|
||||||
{% if 1 =! 2 %}ok{% endif %}
|
{% if 1 =! 2 %}ok{% endif %}
|
||||||
|
|
||||||
bla
|
bla
|
||||||
},
|
',
|
||||||
:error_mode => :warn,
|
:error_mode => :warn,
|
||||||
:line_numbers => true
|
:line_numbers => true
|
||||||
)
|
)
|
||||||
@@ -134,13 +134,13 @@ class ErrorHandlingTest < Minitest::Test
|
|||||||
|
|
||||||
def test_parsing_strict_with_line_numbers_adds_numbers_to_lexer_errors
|
def test_parsing_strict_with_line_numbers_adds_numbers_to_lexer_errors
|
||||||
err = assert_raises(SyntaxError) do
|
err = assert_raises(SyntaxError) do
|
||||||
Liquid::Template.parse(%q{
|
Liquid::Template.parse('
|
||||||
foobar
|
foobar
|
||||||
|
|
||||||
{% if 1 =! 2 %}ok{% endif %}
|
{% if 1 =! 2 %}ok{% endif %}
|
||||||
|
|
||||||
bla
|
bla
|
||||||
},
|
',
|
||||||
:error_mode => :strict,
|
:error_mode => :strict,
|
||||||
:line_numbers => true
|
:line_numbers => true
|
||||||
)
|
)
|
||||||
@@ -151,7 +151,7 @@ class ErrorHandlingTest < Minitest::Test
|
|||||||
|
|
||||||
def test_syntax_errors_in_nested_blocks_have_correct_line_number
|
def test_syntax_errors_in_nested_blocks_have_correct_line_number
|
||||||
err = assert_raises(SyntaxError) do
|
err = assert_raises(SyntaxError) do
|
||||||
Liquid::Template.parse(%q{
|
Liquid::Template.parse('
|
||||||
foobar
|
foobar
|
||||||
|
|
||||||
{% if 1 != 2 %}
|
{% if 1 != 2 %}
|
||||||
@@ -159,7 +159,7 @@ class ErrorHandlingTest < Minitest::Test
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
bla
|
bla
|
||||||
},
|
',
|
||||||
:line_numbers => true
|
:line_numbers => true
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class FiltersTest < Minitest::Test
|
|||||||
def test_filter_with_keyword_arguments
|
def test_filter_with_keyword_arguments
|
||||||
@context['surname'] = 'john'
|
@context['surname'] = 'john'
|
||||||
@context.add_filters(SubstituteFilter)
|
@context.add_filters(SubstituteFilter)
|
||||||
output = Variable.new(%! 'hello %{first_name}, %{last_name}' | substitute: first_name: surname, last_name: 'doe' !).render(@context)
|
output = Variable.new(%( 'hello %{first_name}, %{last_name}' | substitute: first_name: surname, last_name: 'doe' )).render(@context)
|
||||||
assert_equal 'hello john, doe', output
|
assert_equal 'hello john, doe', output
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ module FunnyFilter
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_tag(input, tag = "p", id = "foo")
|
def add_tag(input, tag = "p", id = "foo")
|
||||||
%|<#{tag} id="#{id}">#{input}</#{tag}>|
|
%(<#{tag} id="#{id}">#{input}</#{tag}>)
|
||||||
end
|
end
|
||||||
|
|
||||||
def paragraph(input)
|
def paragraph(input)
|
||||||
@@ -22,9 +22,8 @@ module FunnyFilter
|
|||||||
end
|
end
|
||||||
|
|
||||||
def link_to(name, url)
|
def link_to(name, url)
|
||||||
%|<a href="#{url}">#{name}</a>|
|
%(<a href="#{url}">#{name}</a>)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class OutputTest < Minitest::Test
|
class OutputTest < Minitest::Test
|
||||||
@@ -38,29 +37,29 @@ class OutputTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_variable
|
def test_variable
|
||||||
text = %| {{best_cars}} |
|
text = %( {{best_cars}} )
|
||||||
|
|
||||||
expected = %| bmw |
|
expected = %( bmw )
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns)
|
assert_equal expected, Template.parse(text).render!(@assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_variable_traversing
|
def test_variable_traversing
|
||||||
text = %| {{car.bmw}} {{car.gm}} {{car.bmw}} |
|
text = %( {{car.bmw}} {{car.gm}} {{car.bmw}} )
|
||||||
|
|
||||||
expected = %| good bad good |
|
expected = %( good bad good )
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns)
|
assert_equal expected, Template.parse(text).render!(@assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_variable_piping
|
def test_variable_piping
|
||||||
text = %( {{ car.gm | make_funny }} )
|
text = %( {{ car.gm | make_funny }} )
|
||||||
expected = %| LOL |
|
expected = %( LOL )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_variable_piping_with_input
|
def test_variable_piping_with_input
|
||||||
text = %( {{ car.gm | cite_funny }} )
|
text = %( {{ car.gm | cite_funny }} )
|
||||||
expected = %| LOL: bad |
|
expected = %( LOL: bad )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
end
|
end
|
||||||
@@ -73,7 +72,7 @@ class OutputTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_variable_piping_with_no_args
|
def test_variable_piping_with_no_args
|
||||||
text = %! {{ car.gm | add_smiley }} !
|
text = %( {{ car.gm | add_smiley }} )
|
||||||
expected = %| bad :-) |
|
expected = %| bad :-) |
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
@@ -87,29 +86,29 @@ class OutputTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_variable_piping_with_multiple_args
|
def test_variable_piping_with_multiple_args
|
||||||
text = %! {{ car.gm | add_tag : 'span', 'bar'}} !
|
text = %( {{ car.gm | add_tag : 'span', 'bar'}} )
|
||||||
expected = %| <span id="bar">bad</span> |
|
expected = %( <span id="bar">bad</span> )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_variable_piping_with_variable_args
|
def test_variable_piping_with_variable_args
|
||||||
text = %! {{ car.gm | add_tag : 'span', car.bmw}} !
|
text = %( {{ car.gm | add_tag : 'span', car.bmw}} )
|
||||||
expected = %| <span id="good">bad</span> |
|
expected = %( <span id="good">bad</span> )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_multiple_pipings
|
def test_multiple_pipings
|
||||||
text = %( {{ best_cars | cite_funny | paragraph }} )
|
text = %( {{ best_cars | cite_funny | paragraph }} )
|
||||||
expected = %| <p>LOL: bmw</p> |
|
expected = %( <p>LOL: bmw</p> )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_link_to
|
def test_link_to
|
||||||
text = %( {{ 'Typo' | link_to: 'http://typo.leetsoft.com' }} )
|
text = %( {{ 'Typo' | link_to: 'http://typo.leetsoft.com' }} )
|
||||||
expected = %| <a href="http://typo.leetsoft.com">Typo</a> |
|
expected = %( <a href="http://typo.leetsoft.com">Typo</a> )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,30 +11,28 @@ class SecurityTest < Minitest::Test
|
|||||||
|
|
||||||
def test_no_instance_eval
|
def test_no_instance_eval
|
||||||
text = %( {{ '1+1' | instance_eval }} )
|
text = %( {{ '1+1' | instance_eval }} )
|
||||||
expected = %| 1+1 |
|
expected = %( 1+1 )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns)
|
assert_equal expected, Template.parse(text).render!(@assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_no_existing_instance_eval
|
def test_no_existing_instance_eval
|
||||||
text = %( {{ '1+1' | __instance_eval__ }} )
|
text = %( {{ '1+1' | __instance_eval__ }} )
|
||||||
expected = %| 1+1 |
|
expected = %( 1+1 )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns)
|
assert_equal expected, Template.parse(text).render!(@assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def test_no_instance_eval_after_mixing_in_new_filter
|
def test_no_instance_eval_after_mixing_in_new_filter
|
||||||
text = %( {{ '1+1' | instance_eval }} )
|
text = %( {{ '1+1' | instance_eval }} )
|
||||||
expected = %| 1+1 |
|
expected = %( 1+1 )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns)
|
assert_equal expected, Template.parse(text).render!(@assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def test_no_instance_eval_later_in_chain
|
def test_no_instance_eval_later_in_chain
|
||||||
text = %( {{ '1+1' | add_one | instance_eval }} )
|
text = %( {{ '1+1' | add_one | instance_eval }} )
|
||||||
expected = %| 1+1 + 1 |
|
expected = %( 1+1 + 1 )
|
||||||
|
|
||||||
assert_equal expected, Template.parse(text).render!(@assigns, :filters => SecurityFilter)
|
assert_equal expected, Template.parse(text).render!(@assigns, :filters => SecurityFilter)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -80,16 +80,16 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
|
|
||||||
def test_slice_on_arrays
|
def test_slice_on_arrays
|
||||||
input = 'foobar'.split(//)
|
input = 'foobar'.split(//)
|
||||||
assert_equal %w{o o b}, @filters.slice(input, 1, 3)
|
assert_equal %w(o o b), @filters.slice(input, 1, 3)
|
||||||
assert_equal %w{o o b a r}, @filters.slice(input, 1, 1000)
|
assert_equal %w(o o b a r), @filters.slice(input, 1, 1000)
|
||||||
assert_equal %w{}, @filters.slice(input, 1, 0)
|
assert_equal %w(), @filters.slice(input, 1, 0)
|
||||||
assert_equal %w{o}, @filters.slice(input, 1, 1)
|
assert_equal %w(o), @filters.slice(input, 1, 1)
|
||||||
assert_equal %w{b a r}, @filters.slice(input, 3, 3)
|
assert_equal %w(b a r), @filters.slice(input, 3, 3)
|
||||||
assert_equal %w{a r}, @filters.slice(input, -2, 2)
|
assert_equal %w(a r), @filters.slice(input, -2, 2)
|
||||||
assert_equal %w{a r}, @filters.slice(input, -2, 1000)
|
assert_equal %w(a r), @filters.slice(input, -2, 1000)
|
||||||
assert_equal %w{r}, @filters.slice(input, -1)
|
assert_equal %w(r), @filters.slice(input, -1)
|
||||||
assert_equal %w{}, @filters.slice(input, 100, 10)
|
assert_equal %w(), @filters.slice(input, 100, 10)
|
||||||
assert_equal %w{}, @filters.slice(input, -100, 10)
|
assert_equal %w(), @filters.slice(input, -100, 10)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_truncate
|
def test_truncate
|
||||||
@@ -212,7 +212,7 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
|
|
||||||
def test_map_over_proc
|
def test_map_over_proc
|
||||||
drop = TestDrop.new
|
drop = TestDrop.new
|
||||||
p = Proc.new{ drop }
|
p = proc{ drop }
|
||||||
templ = '{{ procs | map: "test" }}'
|
templ = '{{ procs | map: "test" }}'
|
||||||
assert_template_result "testfoo", templ, "procs" => [p]
|
assert_template_result "testfoo", templ, "procs" => [p]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -172,19 +172,18 @@ HERE
|
|||||||
assert_template_result(expected, markup, assigns)
|
assert_template_result(expected, markup, assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def test_pause_resume_BIG_offset
|
def test_pause_resume_BIG_offset
|
||||||
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
|
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
|
||||||
markup = %q({%for i in array.items limit:3 %}{{i}}{%endfor%}
|
markup = '{%for i in array.items limit:3 %}{{i}}{%endfor%}
|
||||||
next
|
next
|
||||||
{%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
|
{%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
|
||||||
next
|
next
|
||||||
{%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%})
|
{%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%}'
|
||||||
expected = %q(123
|
expected = '123
|
||||||
next
|
next
|
||||||
456
|
456
|
||||||
next
|
next
|
||||||
)
|
'
|
||||||
assert_template_result(expected, markup, assigns)
|
assert_template_result(expected, markup, assigns)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -210,13 +209,13 @@ HERE
|
|||||||
# tests to ensure it only breaks out of the local for loop
|
# tests to ensure it only breaks out of the local for loop
|
||||||
# and not all of them.
|
# and not all of them.
|
||||||
assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
|
assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
|
||||||
markup = '{% for item in array %}' +
|
markup = '{% for item in array %}' \
|
||||||
'{% for i in item %}' +
|
'{% for i in item %}' \
|
||||||
'{% if i == 1 %}' +
|
'{% if i == 1 %}' \
|
||||||
'{% break %}' +
|
'{% break %}' \
|
||||||
'{% endif %}' +
|
'{% endif %}' \
|
||||||
'{{ i }}' +
|
'{{ i }}' \
|
||||||
'{% endfor %}' +
|
'{% endfor %}' \
|
||||||
'{% endfor %}'
|
'{% endfor %}'
|
||||||
expected = '3456'
|
expected = '3456'
|
||||||
assert_template_result(expected, markup, assigns)
|
assert_template_result(expected, markup, assigns)
|
||||||
@@ -253,13 +252,13 @@ HERE
|
|||||||
|
|
||||||
# tests to ensure it only continues the local for loop and not all of them.
|
# tests to ensure it only continues the local for loop and not all of them.
|
||||||
assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
|
assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
|
||||||
markup = '{% for item in array %}' +
|
markup = '{% for item in array %}' \
|
||||||
'{% for i in item %}' +
|
'{% for i in item %}' \
|
||||||
'{% if i == 1 %}' +
|
'{% if i == 1 %}' \
|
||||||
'{% continue %}' +
|
'{% continue %}' \
|
||||||
'{% endif %}' +
|
'{% endif %}' \
|
||||||
'{{ i }}' +
|
'{{ i }}' \
|
||||||
'{% endfor %}' +
|
'{% endfor %}' \
|
||||||
'{% endfor %}'
|
'{% endfor %}'
|
||||||
expected = '23456'
|
expected = '23456'
|
||||||
assert_template_result(expected, markup, assigns)
|
assert_template_result(expected, markup, assigns)
|
||||||
@@ -285,31 +284,31 @@ HERE
|
|||||||
'string' => "test string")
|
'string' => "test string")
|
||||||
|
|
||||||
assert_template_result('val-string-1-1-0-1-0-true-true-test string',
|
assert_template_result('val-string-1-1-0-1-0-true-true-test string',
|
||||||
'{%for val in string%}' +
|
'{%for val in string%}' \
|
||||||
'{{forloop.name}}-' +
|
'{{forloop.name}}-' \
|
||||||
'{{forloop.index}}-' +
|
'{{forloop.index}}-' \
|
||||||
'{{forloop.length}}-' +
|
'{{forloop.length}}-' \
|
||||||
'{{forloop.index0}}-' +
|
'{{forloop.index0}}-' \
|
||||||
'{{forloop.rindex}}-' +
|
'{{forloop.rindex}}-' \
|
||||||
'{{forloop.rindex0}}-' +
|
'{{forloop.rindex0}}-' \
|
||||||
'{{forloop.first}}-' +
|
'{{forloop.first}}-' \
|
||||||
'{{forloop.last}}-' +
|
'{{forloop.last}}-' \
|
||||||
'{{val}}{%endfor%}',
|
'{{val}}{%endfor%}',
|
||||||
'string' => "test string")
|
'string' => "test string")
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_for_parentloop_references_parent_loop
|
def test_for_parentloop_references_parent_loop
|
||||||
assert_template_result('1.1 1.2 1.3 2.1 2.2 2.3 ',
|
assert_template_result('1.1 1.2 1.3 2.1 2.2 2.3 ',
|
||||||
'{% for inner in outer %}{% for k in inner %}' +
|
'{% for inner in outer %}{% for k in inner %}' \
|
||||||
'{{ forloop.parentloop.index }}.{{ forloop.index }} ' +
|
'{{ forloop.parentloop.index }}.{{ forloop.index }} ' \
|
||||||
'{% endfor %}{% endfor %}',
|
'{% endfor %}{% endfor %}',
|
||||||
'outer' => [[1, 1, 1], [1, 1, 1]])
|
'outer' => [[1, 1, 1], [1, 1, 1]])
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_for_parentloop_nil_when_not_present
|
def test_for_parentloop_nil_when_not_present
|
||||||
assert_template_result('.1 .2 ',
|
assert_template_result('.1 .2 ',
|
||||||
'{% for inner in outer %}' +
|
'{% for inner in outer %}' \
|
||||||
'{{ forloop.parentloop.index }}.{{ forloop.index }} ' +
|
'{{ forloop.parentloop.index }}.{{ forloop.index }} ' \
|
||||||
'{% endfor %}',
|
'{% endfor %}',
|
||||||
'outer' => [[1, 1, 1], [1, 1, 1]])
|
'outer' => [[1, 1, 1], [1, 1, 1]])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ class IfElseTagTest < Minitest::Test
|
|||||||
assert_template_result('', '{% if false and true %} YES {% endif %}')
|
assert_template_result('', '{% if false and true %} YES {% endif %}')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def test_hash_miss_generates_false
|
def test_hash_miss_generates_false
|
||||||
assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
|
assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
|
||||||
end
|
end
|
||||||
@@ -110,7 +109,6 @@ class IfElseTagTest < Minitest::Test
|
|||||||
assert_template_result(' YES ', '{% if true %}{% if true %} YES {% else %} NO {% endif %}{% else %} NO {% endif %}')
|
assert_template_result(' YES ', '{% if true %}{% if true %} YES {% else %} NO {% endif %}{% else %} NO {% endif %}')
|
||||||
assert_template_result(' YES ', '{% if true %}{% if false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}')
|
assert_template_result(' YES ', '{% if true %}{% if false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}')
|
||||||
assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}')
|
assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_comparisons_on_null
|
def test_comparisons_on_null
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ class IncludeTagTest < Minitest::Test
|
|||||||
Template.parse("{% include 'pick_a_source' %}").render!({}, :registers => { :file_system => OtherFileSystem.new })
|
Template.parse("{% include 'pick_a_source' %}").render!({}, :registers => { :file_system => OtherFileSystem.new })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def test_include_tag_with
|
def test_include_tag_with
|
||||||
assert_template_result "Product: Draft 151cm ",
|
assert_template_result "Product: Draft 151cm ",
|
||||||
"{% include 'product' with products[0] %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ]
|
"{% include 'product' with products[0] %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ]
|
||||||
@@ -130,7 +129,6 @@ class IncludeTagTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_recursively_included_template_does_not_produce_endless_loop
|
def test_recursively_included_template_does_not_produce_endless_loop
|
||||||
|
|
||||||
infinite_file_system = Class.new do
|
infinite_file_system = Class.new do
|
||||||
def read_template_file(template_path)
|
def read_template_file(template_path)
|
||||||
"-{% include 'loop' %}"
|
"-{% include 'loop' %}"
|
||||||
@@ -142,7 +140,6 @@ class IncludeTagTest < Minitest::Test
|
|||||||
assert_raises(Liquid::StackLevelError, SystemStackError) do
|
assert_raises(Liquid::StackLevelError, SystemStackError) do
|
||||||
Template.parse("{% include 'loop' %}").render!
|
Template.parse("{% include 'loop' %}").render!
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_dynamically_choosen_template
|
def test_dynamically_choosen_template
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ class IncrementTagTest < Minitest::Test
|
|||||||
assert_template_result('0', '{%increment port %}', {})
|
assert_template_result('0', '{%increment port %}', {})
|
||||||
assert_template_result('0 1', '{%increment port %} {%increment port%}', {})
|
assert_template_result('0 1', '{%increment port %} {%increment port%}', {})
|
||||||
assert_template_result('0 0 1 2 1',
|
assert_template_result('0 0 1 2 1',
|
||||||
'{%increment port %} {%increment starboard%} ' +
|
'{%increment port %} {%increment starboard%} ' \
|
||||||
'{%increment port %} {%increment port%} ' +
|
'{%increment port %} {%increment port%} ' \
|
||||||
'{%increment starboard %}', {})
|
'{%increment starboard %}', {})
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -16,8 +16,8 @@ class IncrementTagTest < Minitest::Test
|
|||||||
assert_template_result('9', '{%decrement port %}', { 'port' => 10 })
|
assert_template_result('9', '{%decrement port %}', { 'port' => 10 })
|
||||||
assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {})
|
assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {})
|
||||||
assert_template_result('1 5 2 2 5',
|
assert_template_result('1 5 2 2 5',
|
||||||
'{%increment port %} {%increment starboard%} ' +
|
'{%increment port %} {%increment starboard%} ' \
|
||||||
'{%increment port %} {%decrement port%} ' +
|
'{%increment port %} {%decrement port%} ' \
|
||||||
'{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 })
|
'{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ class StandardTagTest < Minitest::Test
|
|||||||
assert_template_result('|,.:', '|,.:')
|
assert_template_result('|,.:', '|,.:')
|
||||||
assert_template_result('', '')
|
assert_template_result('', '')
|
||||||
|
|
||||||
text = %|this shouldnt see any transformation either but has multiple lines
|
text = %(this shouldnt see any transformation either but has multiple lines
|
||||||
as you can clearly see here ...|
|
as you can clearly see here ...)
|
||||||
assert_template_result(text, text)
|
assert_template_result(text, text)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_has_a_block_which_does_nothing
|
def test_has_a_block_which_does_nothing
|
||||||
assert_template_result(%|the comment block should be removed .. right?|,
|
assert_template_result(%(the comment block should be removed .. right?),
|
||||||
%|the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?|)
|
%(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?))
|
||||||
|
|
||||||
assert_template_result('', '{%comment%}{%endcomment%}')
|
assert_template_result('', '{%comment%}{%endcomment%}')
|
||||||
assert_template_result('', '{%comment%}{% endcomment %}')
|
assert_template_result('', '{%comment%}{% endcomment %}')
|
||||||
@@ -172,7 +172,7 @@ class StandardTagTest < Minitest::Test
|
|||||||
|
|
||||||
def test_assign_from_case
|
def test_assign_from_case
|
||||||
# Example from the shopify forums
|
# Example from the shopify forums
|
||||||
code = %q({% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }})
|
code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}"
|
||||||
template = Liquid::Template.parse(code)
|
template = Liquid::Template.parse(code)
|
||||||
assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' })
|
assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' })
|
||||||
assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' })
|
assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' })
|
||||||
@@ -236,7 +236,6 @@ class StandardTagTest < Minitest::Test
|
|||||||
assert_raises(SyntaxError) do
|
assert_raises(SyntaxError) do
|
||||||
assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {})
|
assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {})
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_cycle
|
def test_cycle
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ class StatementsTest < Minitest::Test
|
|||||||
text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
|
text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
|
||||||
assert_template_result ' false ', text
|
assert_template_result ' false ', text
|
||||||
|
|
||||||
|
|
||||||
text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
|
text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
|
||||||
assert_template_result ' false ', text
|
assert_template_result ' false ', text
|
||||||
end
|
end
|
||||||
@@ -72,7 +71,6 @@ class StatementsTest < Minitest::Test
|
|||||||
assert_template_result ' true ', text, 'var' => 'hello there!'
|
assert_template_result ' true ', text, 'var' => 'hello there!'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def test_var_and_long_string_are_equal_backwards
|
def test_var_and_long_string_are_equal_backwards
|
||||||
text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
|
text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
|
||||||
assert_template_result ' true ', text, 'var' => 'hello there!'
|
assert_template_result ' true ', text, 'var' => 'hello there!'
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ class TableRowTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_table_row
|
def test_table_row
|
||||||
|
|
||||||
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
||||||
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
|
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
|
||||||
'numbers' => [1, 2, 3, 4, 5, 6])
|
'numbers' => [1, 2, 3, 4, 5, 6])
|
||||||
@@ -30,7 +29,6 @@ class TableRowTest < Minitest::Test
|
|||||||
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n",
|
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n",
|
||||||
'{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
|
'{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
|
||||||
'numbers' => [1, 2, 3, 4, 5, 6])
|
'numbers' => [1, 2, 3, 4, 5, 6])
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_table_col_counter
|
def test_table_col_counter
|
||||||
@@ -46,7 +44,6 @@ class TableRowTest < Minitest::Test
|
|||||||
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
||||||
"{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
|
"{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
|
||||||
'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
|
'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_enumerable_drop
|
def test_enumerable_drop
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class TemplateTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
t = Template.parse(str)
|
t = Template.parse(str)
|
||||||
assert_equal [], Timeout::timeout(1) { t.warnings }
|
assert_equal [], Timeout.timeout(1) { t.warnings }
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_instance_assigns_persist_on_same_template_parsing_between_renders
|
def test_instance_assigns_persist_on_same_template_parsing_between_renders
|
||||||
@@ -75,7 +75,7 @@ class TemplateTest < Minitest::Test
|
|||||||
|
|
||||||
def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders
|
def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders
|
||||||
t = Template.new
|
t = Template.new
|
||||||
t.assigns['number'] = lambda { @global ||= 0; @global += 1 }
|
t.assigns['number'] = -> { @global ||= 0; @global += 1 }
|
||||||
assert_equal '1', t.parse("{{number}}").render!
|
assert_equal '1', t.parse("{{number}}").render!
|
||||||
assert_equal '1', t.parse("{{number}}").render!
|
assert_equal '1', t.parse("{{number}}").render!
|
||||||
assert_equal '1', t.render!
|
assert_equal '1', t.render!
|
||||||
@@ -84,7 +84,7 @@ class TemplateTest < Minitest::Test
|
|||||||
|
|
||||||
def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders
|
def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders
|
||||||
t = Template.new
|
t = Template.new
|
||||||
assigns = {'number' => lambda { @global ||= 0; @global += 1 }}
|
assigns = { 'number' => -> { @global ||= 0; @global += 1 } }
|
||||||
assert_equal '1', t.parse("{{number}}").render!(assigns)
|
assert_equal '1', t.parse("{{number}}").render!(assigns)
|
||||||
assert_equal '1', t.parse("{{number}}").render!(assigns)
|
assert_equal '1', t.parse("{{number}}").render!(assigns)
|
||||||
assert_equal '1', t.render!(assigns)
|
assert_equal '1', t.render!(assigns)
|
||||||
@@ -100,51 +100,51 @@ class TemplateTest < Minitest::Test
|
|||||||
def test_resource_limits_render_length
|
def test_resource_limits_render_length
|
||||||
t = Template.parse("0123456789")
|
t = Template.parse("0123456789")
|
||||||
t.resource_limits.render_length_limit = 5
|
t.resource_limits.render_length_limit = 5
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
assert t.resource_limits.reached?
|
assert t.resource_limits.reached?
|
||||||
|
|
||||||
t.resource_limits.render_length_limit = 10
|
t.resource_limits.render_length_limit = 10
|
||||||
assert_equal "0123456789", t.render!()
|
assert_equal "0123456789", t.render!
|
||||||
refute_nil t.resource_limits.render_length
|
refute_nil t.resource_limits.render_length
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_resource_limits_render_score
|
def test_resource_limits_render_score
|
||||||
t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}")
|
t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}")
|
||||||
t.resource_limits.render_score_limit = 50
|
t.resource_limits.render_score_limit = 50
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
assert t.resource_limits.reached?
|
assert t.resource_limits.reached?
|
||||||
|
|
||||||
t = Template.parse("{% for a in (1..100) %} foo {% endfor %}")
|
t = Template.parse("{% for a in (1..100) %} foo {% endfor %}")
|
||||||
t.resource_limits.render_score_limit = 50
|
t.resource_limits.render_score_limit = 50
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
assert t.resource_limits.reached?
|
assert t.resource_limits.reached?
|
||||||
|
|
||||||
t.resource_limits.render_score_limit = 200
|
t.resource_limits.render_score_limit = 200
|
||||||
assert_equal (" foo " * 100), t.render!()
|
assert_equal (" foo " * 100), t.render!
|
||||||
refute_nil t.resource_limits.render_score
|
refute_nil t.resource_limits.render_score
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_resource_limits_assign_score
|
def test_resource_limits_assign_score
|
||||||
t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}")
|
t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}")
|
||||||
t.resource_limits.assign_score_limit = 1
|
t.resource_limits.assign_score_limit = 1
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
assert t.resource_limits.reached?
|
assert t.resource_limits.reached?
|
||||||
|
|
||||||
t.resource_limits.assign_score_limit = 2
|
t.resource_limits.assign_score_limit = 2
|
||||||
assert_equal "", t.render!()
|
assert_equal "", t.render!
|
||||||
refute_nil t.resource_limits.assign_score
|
refute_nil t.resource_limits.assign_score
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_resource_limits_aborts_rendering_after_first_error
|
def test_resource_limits_aborts_rendering_after_first_error
|
||||||
t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}")
|
t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}")
|
||||||
t.resource_limits.render_score_limit = 50
|
t.resource_limits.render_score_limit = 50
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
assert t.resource_limits.reached?
|
assert t.resource_limits.reached?
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set
|
def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set
|
||||||
t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
|
t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
|
||||||
t.render!()
|
t.render!
|
||||||
assert t.resource_limits.assign_score > 0
|
assert t.resource_limits.assign_score > 0
|
||||||
assert t.resource_limits.render_score > 0
|
assert t.resource_limits.render_score > 0
|
||||||
assert t.resource_limits.render_length > 0
|
assert t.resource_limits.render_length > 0
|
||||||
@@ -153,23 +153,23 @@ class TemplateTest < Minitest::Test
|
|||||||
def test_render_length_persists_between_blocks
|
def test_render_length_persists_between_blocks
|
||||||
t = Template.parse("{% if true %}aaaa{% endif %}")
|
t = Template.parse("{% if true %}aaaa{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 7
|
t.resource_limits.render_length_limit = 7
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 8
|
t.resource_limits.render_length_limit = 8
|
||||||
assert_equal "aaaa", t.render()
|
assert_equal "aaaa", t.render
|
||||||
|
|
||||||
t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}")
|
t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 13
|
t.resource_limits.render_length_limit = 13
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 14
|
t.resource_limits.render_length_limit = 14
|
||||||
assert_equal "aaaabbb", t.render()
|
assert_equal "aaaabbb", t.render
|
||||||
|
|
||||||
t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}")
|
t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}")
|
||||||
t.resource_limits.render_length_limit = 5
|
t.resource_limits.render_length_limit = 5
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 11
|
t.resource_limits.render_length_limit = 11
|
||||||
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
assert_equal "Liquid error: Memory limits exceeded", t.render
|
||||||
t.resource_limits.render_length_limit = 12
|
t.resource_limits.render_length_limit = 12
|
||||||
assert_equal "ababab", t.render()
|
assert_equal "ababab", t.render
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_default_resource_limits_unaffected_by_render_with_context
|
def test_default_resource_limits_unaffected_by_render_with_context
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ class VariableTest < Minitest::Test
|
|||||||
include Liquid
|
include Liquid
|
||||||
|
|
||||||
def test_simple_variable
|
def test_simple_variable
|
||||||
template = Template.parse(%|{{test}}|)
|
template = Template.parse(%({{test}}))
|
||||||
assert_equal 'worked', template.render!('test' => 'worked')
|
assert_equal 'worked', template.render!('test' => 'worked')
|
||||||
assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully')
|
assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully')
|
||||||
end
|
end
|
||||||
@@ -14,18 +14,18 @@ class VariableTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_simple_with_whitespaces
|
def test_simple_with_whitespaces
|
||||||
template = Template.parse(%| {{ test }} |)
|
template = Template.parse(%( {{ test }} ))
|
||||||
assert_equal ' worked ', template.render!('test' => 'worked')
|
assert_equal ' worked ', template.render!('test' => 'worked')
|
||||||
assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully')
|
assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully')
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_ignore_unknown
|
def test_ignore_unknown
|
||||||
template = Template.parse(%|{{ test }}|)
|
template = Template.parse(%({{ test }}))
|
||||||
assert_equal '', template.render!
|
assert_equal '', template.render!
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_hash_scoping
|
def test_hash_scoping
|
||||||
template = Template.parse(%|{{ test.test }}|)
|
template = Template.parse(%({{ test.test }}))
|
||||||
assert_equal 'worked', template.render!('test' => { 'test' => 'worked' })
|
assert_equal 'worked', template.render!('test' => { 'test' => 'worked' })
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -40,13 +40,13 @@ class VariableTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_preset_assigns
|
def test_preset_assigns
|
||||||
template = Template.parse(%|{{ test }}|)
|
template = Template.parse(%({{ test }}))
|
||||||
template.assigns['test'] = 'worked'
|
template.assigns['test'] = 'worked'
|
||||||
assert_equal 'worked', template.render!
|
assert_equal 'worked', template.render!
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_reuse_parsed_template
|
def test_reuse_parsed_template
|
||||||
template = Template.parse(%|{{ greeting }} {{ name }}|)
|
template = Template.parse(%({{ greeting }} {{ name }}))
|
||||||
template.assigns['greeting'] = 'Goodbye'
|
template.assigns['greeting'] = 'Goodbye'
|
||||||
assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi')
|
assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi')
|
||||||
assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi')
|
assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi')
|
||||||
@@ -56,7 +56,7 @@ class VariableTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_assigns_not_polluted_from_template
|
def test_assigns_not_polluted_from_template
|
||||||
template = Template.parse(%|{{ test }}{% assign test = 'bar' %}{{ test }}|)
|
template = Template.parse(%({{ test }}{% assign test = 'bar' %}{{ test }}))
|
||||||
template.assigns['test'] = 'baz'
|
template.assigns['test'] = 'baz'
|
||||||
assert_equal 'bazbar', template.render!
|
assert_equal 'bazbar', template.render!
|
||||||
assert_equal 'bazbar', template.render!
|
assert_equal 'bazbar', template.render!
|
||||||
@@ -65,7 +65,7 @@ class VariableTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_hash_with_default_proc
|
def test_hash_with_default_proc
|
||||||
template = Template.parse(%|Hello {{ test }}|)
|
template = Template.parse(%(Hello {{ test }}))
|
||||||
assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" }
|
assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" }
|
||||||
assigns['test'] = 'Tobi'
|
assigns['test'] = 'Tobi'
|
||||||
assert_equal 'Hello Tobi', template.render!(assigns)
|
assert_equal 'Hello Tobi', template.render!(assigns)
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ class BlockUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def block_types(nodelist)
|
def block_types(nodelist)
|
||||||
nodelist.collect { |node| node.class }
|
nodelist.collect(&:class)
|
||||||
end
|
end
|
||||||
end # VariableTest
|
end # VariableTest
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ class ConditionUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_should_allow_custom_proc_operator
|
def test_should_allow_custom_proc_operator
|
||||||
Condition.operators['starts_with'] = Proc.new { |cond, left, right| left =~ %r{^#{right}} }
|
Condition.operators['starts_with'] = proc { |cond, left, right| left =~ %r{^#{right}} }
|
||||||
|
|
||||||
assert_evalutes_true 'bob', 'starts_with', 'b'
|
assert_evalutes_true 'bob', 'starts_with', 'b'
|
||||||
assert_evalutes_false 'bob', 'starts_with', 'o'
|
assert_evalutes_false 'bob', 'starts_with', 'o'
|
||||||
@@ -130,6 +130,7 @@ class ConditionUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def assert_evalutes_true(left, op, right)
|
def assert_evalutes_true(left, op, right)
|
||||||
assert Condition.new(left, op, right).evaluate(@context || Liquid::Context.new),
|
assert Condition.new(left, op, right).evaluate(@context || Liquid::Context.new),
|
||||||
"Evaluated false: #{left} #{op} #{right}"
|
"Evaluated false: #{left} #{op} #{right}"
|
||||||
|
|||||||
@@ -122,7 +122,6 @@ class ContextUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_length_query
|
def test_length_query
|
||||||
|
|
||||||
@context['numbers'] = [1, 2, 3, 4]
|
@context['numbers'] = [1, 2, 3, 4]
|
||||||
|
|
||||||
assert_equal 4, @context['numbers.size']
|
assert_equal 4, @context['numbers.size']
|
||||||
@@ -134,18 +133,14 @@ class ContextUnitTest < Minitest::Test
|
|||||||
@context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4, 'size' => 1000 }
|
@context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4, 'size' => 1000 }
|
||||||
|
|
||||||
assert_equal 1000, @context['numbers.size']
|
assert_equal 1000, @context['numbers.size']
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_hyphenated_variable
|
def test_hyphenated_variable
|
||||||
|
|
||||||
@context['oh-my'] = 'godz'
|
@context['oh-my'] = 'godz'
|
||||||
assert_equal 'godz', @context['oh-my']
|
assert_equal 'godz', @context['oh-my']
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_add_filter
|
def test_add_filter
|
||||||
|
|
||||||
filter = Module.new do
|
filter = Module.new do
|
||||||
def hi(output)
|
def hi(output)
|
||||||
output + ' hi!'
|
output + ' hi!'
|
||||||
@@ -161,11 +156,9 @@ class ContextUnitTest < Minitest::Test
|
|||||||
|
|
||||||
context.add_filters(filter)
|
context.add_filters(filter)
|
||||||
assert_equal 'hi? hi!', context.invoke(:hi, 'hi?')
|
assert_equal 'hi? hi!', context.invoke(:hi, 'hi?')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_only_intended_filters_make_it_there
|
def test_only_intended_filters_make_it_there
|
||||||
|
|
||||||
filter = Module.new do
|
filter = Module.new do
|
||||||
def hi(output)
|
def hi(output)
|
||||||
output + ' hi!'
|
output + ' hi!'
|
||||||
@@ -294,7 +287,6 @@ class ContextUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_access_hashes_with_hash_access_variables
|
def test_access_hashes_with_hash_access_variables
|
||||||
|
|
||||||
@context['var'] = 'tags'
|
@context['var'] = 'tags'
|
||||||
@context['nested'] = { 'var' => 'tags' }
|
@context['nested'] = { 'var' => 'tags' }
|
||||||
@context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
|
@context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
|
||||||
@@ -313,14 +305,12 @@ class ContextUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_first_can_appear_in_middle_of_callchain
|
def test_first_can_appear_in_middle_of_callchain
|
||||||
|
|
||||||
@context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] }
|
@context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] }
|
||||||
|
|
||||||
assert_equal 'draft151cm', @context['product.variants[0].title']
|
assert_equal 'draft151cm', @context['product.variants[0].title']
|
||||||
assert_equal 'element151cm', @context['product.variants[1].title']
|
assert_equal 'element151cm', @context['product.variants[1].title']
|
||||||
assert_equal 'draft151cm', @context['product.variants.first.title']
|
assert_equal 'draft151cm', @context['product.variants.first.title']
|
||||||
assert_equal 'element151cm', @context['product.variants.last.title']
|
assert_equal 'element151cm', @context['product.variants.last.title']
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_cents
|
def test_cents
|
||||||
@@ -393,7 +383,7 @@ class ContextUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_proc_as_variable
|
def test_proc_as_variable
|
||||||
@context['dynamic'] = Proc.new { 'Hello' }
|
@context['dynamic'] = proc { 'Hello' }
|
||||||
|
|
||||||
assert_equal 'Hello', @context['dynamic']
|
assert_equal 'Hello', @context['dynamic']
|
||||||
end
|
end
|
||||||
@@ -472,11 +462,10 @@ class ContextUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_context_initialization_with_a_proc_in_environment
|
def test_context_initialization_with_a_proc_in_environment
|
||||||
contx = Context.new([:test => lambda { |c| c['poutine']}], {:test => :foo})
|
contx = Context.new([:test => ->(c) { c['poutine'] }], { :test => :foo })
|
||||||
|
|
||||||
assert contx
|
assert contx
|
||||||
assert_nil contx['poutine']
|
assert_nil contx['poutine']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
end # ContextTest
|
end # ContextTest
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ class LexerUnitTest < Minitest::Test
|
|||||||
include Liquid
|
include Liquid
|
||||||
|
|
||||||
def test_strings
|
def test_strings
|
||||||
tokens = Lexer.new(%! 'this is a test""' "wat 'lol'"!).tokenize
|
tokens = Lexer.new(%( 'this is a test""' "wat 'lol'")).tokenize
|
||||||
assert_equal [[:string,%!'this is a test""'!], [:string, %!"wat 'lol'"!], [:end_of_string]], tokens
|
assert_equal [[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_integer
|
def test_integer
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ class TestClassA
|
|||||||
def allowedA
|
def allowedA
|
||||||
'allowedA'
|
'allowedA'
|
||||||
end
|
end
|
||||||
|
|
||||||
def restrictedA
|
def restrictedA
|
||||||
'restrictedA'
|
'restrictedA'
|
||||||
end
|
end
|
||||||
|
|
||||||
def chainedB
|
def chainedB
|
||||||
TestClassB.new
|
TestClassB.new
|
||||||
end
|
end
|
||||||
@@ -18,6 +20,7 @@ class TestClassB
|
|||||||
def allowedB
|
def allowedB
|
||||||
'allowedB'
|
'allowedB'
|
||||||
end
|
end
|
||||||
|
|
||||||
def chainedC
|
def chainedC
|
||||||
TestClassC.new
|
TestClassC.new
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class RegexpUnitTest < Minitest::Test
|
|||||||
def test_tags
|
def test_tags
|
||||||
assert_equal ['<tr>', '</tr>'], '<tr> </tr>'.scan(QuotedFragment)
|
assert_equal ['<tr>', '</tr>'], '<tr> </tr>'.scan(QuotedFragment)
|
||||||
assert_equal ['<tr></tr>'], '<tr></tr>'.scan(QuotedFragment)
|
assert_equal ['<tr></tr>'], '<tr></tr>'.scan(QuotedFragment)
|
||||||
assert_equal ['<style', 'class="hello">', '</style>'], %|<style class="hello">' </style>|.scan(QuotedFragment)
|
assert_equal ['<style', 'class="hello">', '</style>'], %(<style class="hello">' </style>).scan(QuotedFragment)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_double_quoted_words
|
def test_double_quoted_words
|
||||||
|
|||||||
@@ -17,41 +17,41 @@ class VariableUnitTest < Minitest::Test
|
|||||||
assert_equal VariableLookup.new('hello'), var.name
|
assert_equal VariableLookup.new('hello'), var.name
|
||||||
assert_equal [['textileze', []], ['paragraph', []]], var.filters
|
assert_equal [['textileze', []], ['paragraph', []]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! hello | strftime: '%Y'!)
|
var = Variable.new(%( hello | strftime: '%Y'))
|
||||||
assert_equal VariableLookup.new('hello'), var.name
|
assert_equal VariableLookup.new('hello'), var.name
|
||||||
assert_equal [['strftime', ['%Y']]], var.filters
|
assert_equal [['strftime', ['%Y']]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! 'typo' | link_to: 'Typo', true !)
|
var = Variable.new(%( 'typo' | link_to: 'Typo', true ))
|
||||||
assert_equal 'typo', var.name
|
assert_equal 'typo', var.name
|
||||||
assert_equal [['link_to', ['Typo', true]]], var.filters
|
assert_equal [['link_to', ['Typo', true]]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! 'typo' | link_to: 'Typo', false !)
|
var = Variable.new(%( 'typo' | link_to: 'Typo', false ))
|
||||||
assert_equal 'typo', var.name
|
assert_equal 'typo', var.name
|
||||||
assert_equal [['link_to', ['Typo', false]]], var.filters
|
assert_equal [['link_to', ['Typo', false]]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! 'foo' | repeat: 3 !)
|
var = Variable.new(%( 'foo' | repeat: 3 ))
|
||||||
assert_equal 'foo', var.name
|
assert_equal 'foo', var.name
|
||||||
assert_equal [['repeat', [3]]], var.filters
|
assert_equal [['repeat', [3]]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! 'foo' | repeat: 3, 3 !)
|
var = Variable.new(%( 'foo' | repeat: 3, 3 ))
|
||||||
assert_equal 'foo', var.name
|
assert_equal 'foo', var.name
|
||||||
assert_equal [['repeat', [3, 3]]], var.filters
|
assert_equal [['repeat', [3, 3]]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! 'foo' | repeat: 3, 3, 3 !)
|
var = Variable.new(%( 'foo' | repeat: 3, 3, 3 ))
|
||||||
assert_equal 'foo', var.name
|
assert_equal 'foo', var.name
|
||||||
assert_equal [['repeat', [3, 3, 3]]], var.filters
|
assert_equal [['repeat', [3, 3, 3]]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! hello | strftime: '%Y, okay?'!)
|
var = Variable.new(%( hello | strftime: '%Y, okay?'))
|
||||||
assert_equal VariableLookup.new('hello'), var.name
|
assert_equal VariableLookup.new('hello'), var.name
|
||||||
assert_equal [['strftime', ['%Y, okay?']]], var.filters
|
assert_equal [['strftime', ['%Y, okay?']]], var.filters
|
||||||
|
|
||||||
var = Variable.new(%! hello | things: "%Y, okay?", 'the other one'!)
|
var = Variable.new(%( hello | things: "%Y, okay?", 'the other one'))
|
||||||
assert_equal VariableLookup.new('hello'), var.name
|
assert_equal VariableLookup.new('hello'), var.name
|
||||||
assert_equal [['things', ['%Y, okay?', 'the other one']]], var.filters
|
assert_equal [['things', ['%Y, okay?', 'the other one']]], var.filters
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_filter_with_date_parameter
|
def test_filter_with_date_parameter
|
||||||
var = Variable.new(%! '2006-06-06' | date: "%m/%d/%Y"!)
|
var = Variable.new(%( '2006-06-06' | date: "%m/%d/%Y"))
|
||||||
assert_equal '2006-06-06', var.name
|
assert_equal '2006-06-06', var.name
|
||||||
assert_equal [['date', ['%m/%d/%Y']]], var.filters
|
assert_equal [['date', ['%m/%d/%Y']]], var.filters
|
||||||
end
|
end
|
||||||
@@ -83,22 +83,22 @@ class VariableUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_string_single_quoted
|
def test_string_single_quoted
|
||||||
var = Variable.new(%| "hello" |)
|
var = Variable.new(%( "hello" ))
|
||||||
assert_equal 'hello', var.name
|
assert_equal 'hello', var.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_string_double_quoted
|
def test_string_double_quoted
|
||||||
var = Variable.new(%| 'hello' |)
|
var = Variable.new(%( 'hello' ))
|
||||||
assert_equal 'hello', var.name
|
assert_equal 'hello', var.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_integer
|
def test_integer
|
||||||
var = Variable.new(%| 1000 |)
|
var = Variable.new(%( 1000 ))
|
||||||
assert_equal 1000, var.name
|
assert_equal 1000, var.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_float
|
def test_float
|
||||||
var = Variable.new(%| 1000.01 |)
|
var = Variable.new(%( 1000.01 ))
|
||||||
assert_equal 1000.01, var.name
|
assert_equal 1000.01, var.name
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -114,23 +114,23 @@ class VariableUnitTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_string_with_special_chars
|
def test_string_with_special_chars
|
||||||
var = Variable.new(%| 'hello! $!@.;"ddasd" ' |)
|
var = Variable.new(%( 'hello! $!@.;"ddasd" ' ))
|
||||||
assert_equal 'hello! $!@.;"ddasd" ', var.name
|
assert_equal 'hello! $!@.;"ddasd" ', var.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_string_dot
|
def test_string_dot
|
||||||
var = Variable.new(%| test.test |)
|
var = Variable.new(%( test.test ))
|
||||||
assert_equal VariableLookup.new('test.test'), var.name
|
assert_equal VariableLookup.new('test.test'), var.name
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_filter_with_keyword_arguments
|
def test_filter_with_keyword_arguments
|
||||||
var = Variable.new(%! hello | things: greeting: "world", farewell: 'goodbye'!)
|
var = Variable.new(%( hello | things: greeting: "world", farewell: 'goodbye'))
|
||||||
assert_equal VariableLookup.new('hello'), var.name
|
assert_equal VariableLookup.new('hello'), var.name
|
||||||
assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters
|
assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_lax_filter_argument_parsing
|
def test_lax_filter_argument_parsing
|
||||||
var = Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !, :error_mode => :lax)
|
var = Variable.new(%( number_of_comments | pluralize: 'comment': 'comments' ), :error_mode => :lax)
|
||||||
assert_equal VariableLookup.new('number_of_comments'), var.name
|
assert_equal VariableLookup.new('number_of_comments'), var.name
|
||||||
assert_equal [['pluralize', ['comment', 'comments']]], var.filters
|
assert_equal [['pluralize', ['comment', 'comments']]], var.filters
|
||||||
end
|
end
|
||||||
@@ -138,13 +138,13 @@ class VariableUnitTest < Minitest::Test
|
|||||||
def test_strict_filter_argument_parsing
|
def test_strict_filter_argument_parsing
|
||||||
with_error_mode(:strict) do
|
with_error_mode(:strict) do
|
||||||
assert_raises(SyntaxError) do
|
assert_raises(SyntaxError) do
|
||||||
Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !)
|
Variable.new(%( number_of_comments | pluralize: 'comment': 'comments' ))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_output_raw_source_of_variable
|
def test_output_raw_source_of_variable
|
||||||
var = Variable.new(%! name_of_variable | upcase !)
|
var = Variable.new(%( name_of_variable | upcase ))
|
||||||
assert_equal " name_of_variable | upcase ", var.raw
|
assert_equal " name_of_variable | upcase ", var.raw
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user