This commit is contained in:
Florian Weingarten
2015-05-14 14:37:18 +00:00
parent 8cf524e91c
commit 3372ca8136
84 changed files with 1069 additions and 908 deletions
+92
View File
@@ -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
+142
View File
@@ -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
+1
View File
@@ -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
+9 -8
View File
@@ -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"
+7 -9
View File
@@ -4,7 +4,7 @@ module ProductsFilter
end end
def prettyprint(text) def prettyprint(text)
text.gsub( /\*(.*)\*/, '<b>\1</b>' ) text.gsub(/\*(.*)\*/, '<b>\1</b>')
end end
def count(array) def count(array)
@@ -17,30 +17,28 @@ module ProductsFilter
end end
class Servlet < LiquidServlet class Servlet < LiquidServlet
def index def index
{ 'date' => Time.now } { 'date' => Time.now }
end end
def products def products
{ 'products' => products_list, 'more_products' => more_products_list, 'description' => description, 'section' => 'Snowboards', 'cool_products' => true} { 'products' => products_list, 'more_products' => more_products_list, 'description' => description, 'section' => 'Snowboards', 'cool_products' => true }
end end
private private
def products_list def products_list
[{'name' => 'Arbor Draft', 'price' => 39900, 'description' => 'the *arbor draft* is a excellent product' }, [{ 'name' => 'Arbor Draft', 'price' => 39900, 'description' => 'the *arbor draft* is a excellent product' },
{'name' => 'Arbor Element', 'price' => 40000, 'description' => 'the *arbor element* rocks for freestyling'}, { 'name' => 'Arbor Element', 'price' => 40000, 'description' => 'the *arbor element* rocks for freestyling' },
{'name' => 'Arbor Diamond', 'price' => 59900, 'description' => 'the *arbor diamond* is a made up product because im obsessed with arbor and have no creativity'}] { 'name' => 'Arbor Diamond', 'price' => 59900, 'description' => 'the *arbor diamond* is a made up product because im obsessed with arbor and have no creativity' }]
end end
def more_products_list def more_products_list
[{'name' => 'Arbor Catalyst', 'price' => 39900, 'description' => 'the *arbor catalyst* is an advanced drop-through for freestyle and flatground performance and versatility' }, [{ 'name' => 'Arbor Catalyst', 'price' => 39900, 'description' => 'the *arbor catalyst* is an advanced drop-through for freestyle and flatground performance and versatility' },
{'name' => 'Arbor Fish', 'price' => 40000, 'description' => 'the *arbor fish* is a compact pin that features an extended wheelbase and time-honored teardrop shape'}] { 'name' => 'Arbor Fish', 'price' => 40000, 'description' => 'the *arbor fish* is a compact pin that features an extended wheelbase and time-honored teardrop shape' }]
end end
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
+1 -1
View File
@@ -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
View File
@@ -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
+3 -3
View File
@@ -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
View File
@@ -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
+15 -17
View File
@@ -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,8 +62,7 @@ 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)
end end
@@ -79,7 +77,7 @@ module Liquid
end end
# Push new local scope on the stack. use <tt>Context#stack</tt> instead # Push new local scope on the stack. use <tt>Context#stack</tt> instead
def push(new_scope={}) def push(new_scope = {})
@scopes.unshift(new_scope) @scopes.unshift(new_scope)
raise StackLevelError, "Nesting too deep".freeze if @scopes.length > 100 raise StackLevelError, "Nesting too deep".freeze if @scopes.length > 100
end end
@@ -103,7 +101,7 @@ module Liquid
# end # end
# #
# context['var] #=> nil # context['var] #=> nil
def stack(new_scope=nil) def stack(new_scope = nil)
old_stack_used = @this_stack_used old_stack_used = @this_stack_used
if new_scope if new_scope
push(new_scope) push(new_scope)
@@ -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) }
@@ -171,13 +168,13 @@ module Liquid
end end
end end
scope ||= @environments.last || @scopes.last scope ||= @environments.last || @scopes.last
variable ||= lookup_and_evaluate(scope, key) variable ||= lookup_and_evaluate(scope, key)
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,15 +186,16 @@ module Liquid
end end
private private
def squash_instance_assigns_with_environments
@scopes.last.each_key do |k| def squash_instance_assigns_with_environments
@environments.each do |env| @scopes.last.each_key do |k|
if env.has_key?(k) @environments.each do |env|
scopes.last[k] = lookup_and_evaluate(env, k) if env.has_key?(k)
break scopes.last[k] = lookup_and_evaluate(env, k)
end break
end end
end end
end # squash_instance_assigns_with_environments end
end # squash_instance_assigns_with_environments
end # Context end # Context
end # Liquid end # Liquid
+2 -2
View File
@@ -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
View File
@@ -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
+3 -3
View File
@@ -3,7 +3,7 @@ module Liquid
attr_accessor :line_number attr_accessor :line_number
attr_accessor :markup_context attr_accessor :markup_context
def to_s(with_prefix=true) def to_s(with_prefix = true)
str = "" str = ""
str << message_prefix if with_prefix str << message_prefix if with_prefix
str << super() str << super()
@@ -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
-1
View File
@@ -28,6 +28,5 @@ module Liquid
end end
end end
end end
end end
end end
+2 -2
View File
@@ -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
+1
View File
@@ -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 -2
View File
@@ -1,10 +1,9 @@
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
def initialize(message=nil) def initialize(message = nil)
@message = message || "interrupt".freeze @message = message || "interrupt".freeze
end end
end end
+2 -2
View File
@@ -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]
@@ -39,7 +39,7 @@ module Liquid
else else
c = @ss.getch c = @ss.getch
if s = SPECIALS[c] if s = SPECIALS[c]
[s,c] [s, c]
else else
raise SyntaxError, "Unexpected character #{c}" raise SyntaxError, "Unexpected character #{c}"
end end
+1 -1
View File
@@ -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)
+1
View File
@@ -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
+2 -6
View File
@@ -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
+3 -3
View File
@@ -1,7 +1,7 @@
module Liquid module Liquid
class ResourceLimits class ResourceLimits
attr_accessor :render_length, :render_score, :assign_score, attr_accessor :render_length, :render_score, :assign_score,
:render_length_limit, :render_score_limit, :assign_score_limit :render_length_limit, :render_score_limit, :assign_score_limit
def initialize(limits) def initialize(limits)
@render_length_limit = limits[:render_length_limit] @render_length_limit = limits[:render_length_limit]
@@ -12,8 +12,8 @@ module Liquid
def reached? def reached?
(@render_length_limit && @render_length > @render_length_limit) || (@render_length_limit && @render_length > @render_length_limit) ||
(@render_score_limit && @render_score > @render_score_limit ) || (@render_score_limit && @render_score > @render_score_limit) ||
(@assign_score_limit && @assign_score > @assign_score_limit ) (@assign_score_limit && @assign_score > @assign_score_limit)
end end
def reset def reset
+8 -11
View File
@@ -2,7 +2,6 @@ require 'cgi'
require 'bigdecimal' require 'bigdecimal'
module Liquid module Liquid
module StandardFilters module StandardFilters
HTML_ESCAPE = { HTML_ESCAPE = {
'&'.freeze => '&amp;'.freeze, '&'.freeze => '&amp;'.freeze,
@@ -46,7 +45,7 @@ module Liquid
CGI.escape(input) rescue input CGI.escape(input) rescue input
end end
def slice(input, offset, length=nil) def slice(input, offset, length = nil)
offset = Integer(offset) offset = Integer(offset)
length = length ? Integer(length) : 1 length = length ? Integer(length) : 1
@@ -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
@@ -116,9 +115,9 @@ module Liquid
if property.nil? if property.nil?
ary.sort ary.sort
elsif ary.first.respond_to?(:[]) && !ary.first[property].nil? elsif ary.first.respond_to?(:[]) && !ary.first[property].nil?
ary.sort {|a,b| a[property] <=> b[property] } ary.sort { |a, b| a[property] <=> b[property] }
elsif ary.first.respond_to?(property) elsif ary.first.respond_to?(property)
ary.sort {|a,b| a.send(property) <=> b.send(property) } ary.sort { |a, b| a.send(property) <=> b.send(property) }
end end
end end
@@ -128,11 +127,11 @@ module Liquid
ary = InputIterator.new(input) ary = InputIterator.new(input)
if property.nil? if property.nil?
ary.sort {|a,b| a.casecmp(b) } ary.sort { |a, b| a.casecmp(b) }
elsif ary.first.respond_to?(:[]) && !ary.first[property].nil? elsif ary.first.respond_to?(:[]) && !ary.first[property].nil?
ary.sort {|a,b| a[property].casecmp(b[property]) } ary.sort { |a, b| a[property].casecmp(b[property]) }
elsif ary.first.respond_to?(property) elsif ary.first.respond_to?(property)
ary.sort {|a,b| a.send(property).casecmp(b.send(property)) } ary.sort { |a, b| a.send(property).casecmp(b.send(property)) }
end end
end end
@@ -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
+3 -4
View File
@@ -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
View File
@@ -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 -2
View File
@@ -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' %}
@@ -15,7 +14,7 @@ module Liquid
super super
if markup =~ Syntax if markup =~ Syntax
@to = $1 @to = $1
@from = Variable.new($2,options) @from = Variable.new($2, options)
@from.line_number = line_number @from.line_number = line_number
else else
raise SyntaxError.new options[:locale].t("errors.syntax.assign".freeze) raise SyntaxError.new options[:locale].t("errors.syntax.assign".freeze)
-3
View File
@@ -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)
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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 -4
View File
@@ -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)
+2 -4
View File
@@ -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,9 +53,8 @@ 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
+41 -41
View File
@@ -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
@@ -50,61 +50,61 @@ module Liquid
private private
def push_block(tag, markup) def push_block(tag, markup)
block = if tag == 'else'.freeze block = if tag == 'else'.freeze
ElseCondition.new ElseCondition.new
else else
parse_with_selected_parser(markup) parse_with_selected_parser(markup)
end
@blocks.push(block)
block.attach(BlockBody.new)
end end
def lax_parse(markup) @blocks.push(block)
expressions = markup.scan(ExpressionsAndOperators) block.attach(BlockBody.new)
raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop =~ Syntax end
condition = Condition.new(Expression.parse($1), $2, Expression.parse($3)) def lax_parse(markup)
expressions = markup.scan(ExpressionsAndOperators)
raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop =~ Syntax
while not expressions.empty? condition = Condition.new(Expression.parse($1), $2, Expression.parse($3))
operator = expressions.pop.to_s.strip
raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax until expressions.empty?
operator = expressions.pop.to_s.strip
new_condition = Condition.new(Expression.parse($1), $2, Expression.parse($3)) 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 BOOLEAN_OPERATORS.include?(operator)
new_condition.send(operator, condition)
condition = new_condition
end
condition new_condition = Condition.new(Expression.parse($1), $2, Expression.parse($3))
raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless BOOLEAN_OPERATORS.include?(operator)
new_condition.send(operator, condition)
condition = new_condition
end end
def strict_parse(markup) condition
p = Parser.new(markup) end
condition = parse_comparison(p) def strict_parse(markup)
p = Parser.new(markup)
while op = (p.id?('and'.freeze) || p.id?('or'.freeze)) condition = parse_comparison(p)
new_cond = parse_comparison(p)
new_cond.send(op, condition)
condition = new_cond
end
p.consume(:end_of_string)
condition while op = (p.id?('and'.freeze) || p.id?('or'.freeze))
new_cond = parse_comparison(p)
new_cond.send(op, condition)
condition = new_cond
end end
p.consume(:end_of_string)
def parse_comparison(p) condition
a = Expression.parse(p.expression) end
if op = p.consume?(:comparison)
b = Expression.parse(p.expression) def parse_comparison(p)
Condition.new(a, op, b) a = Expression.parse(p.expression)
else if op = p.consume?(:comparison)
Condition.new(a) b = Expression.parse(p.expression)
end Condition.new(a, op, b)
else
Condition.new(a)
end end
end
end end
Template.register_tag('if'.freeze, If) Template.register_tag('if'.freeze, If)
-2
View File
@@ -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]
+26 -26
View File
@@ -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,35 +70,36 @@ module Liquid
end end
private private
def load_cached_partial(context)
cached_partials = context.registers[:cached_partials] || {}
template_name = context.evaluate(@template_name_expr)
if cached = cached_partials[template_name] def load_cached_partial(context)
return cached cached_partials = context.registers[:cached_partials] || {}
end template_name = context.evaluate(@template_name_expr)
source = read_template_from_file_system(context)
partial = Liquid::Template.parse(source, pass_options) if cached = cached_partials[template_name]
cached_partials[template_name] = partial return cached
context.registers[:cached_partials] = cached_partials
partial
end end
source = read_template_from_file_system(context)
partial = Liquid::Template.parse(source, pass_options)
cached_partials[template_name] = partial
context.registers[:cached_partials] = cached_partials
partial
end
def read_template_from_file_system(context) def read_template_from_file_system(context)
file_system = context.registers[:file_system] || Liquid::Template.file_system file_system = context.registers[:file_system] || Liquid::Template.file_system
file_system.read_template_file(context.evaluate(@template_name_expr)) file_system.read_template_file(context.evaluate(@template_name_expr))
end end
def pass_options def pass_options
dont_pass = @options[:include_options_blacklist] dont_pass = @options[:include_options_blacklist]
return {locale: @options[:locale]} if dont_pass == true return { locale: @options[:locale] } if dont_pass == true
opts = @options.merge(included: true, include_options_blacklist: false) opts = @options.merge(included: true, include_options_blacklist: false)
if dont_pass.is_a?(Array) if dont_pass.is_a?(Array)
dont_pass.each {|o| opts.delete(o)} dont_pass.each { |o| opts.delete(o) }
end
opts
end end
opts
end
end end
Template.register_tag('include'.freeze, Include) Template.register_tag('include'.freeze, Include)
+2 -2
View File
@@ -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
+1 -4
View File
@@ -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"
-1
View File
@@ -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)
+3 -4
View File
@@ -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
View File
@@ -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
+13 -16
View File
@@ -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,18 +33,18 @@ module Liquid
def lax_parse(markup) def lax_parse(markup)
@filters = [] @filters = []
if markup =~ /(#{QuotedFragment})(.*)/om return unless markup =~ /(#{QuotedFragment})(.*)/om
name_markup = $1
filter_markup = $2 name_markup = $1
@name = Expression.parse(name_markup) filter_markup = $2
if filter_markup =~ /#{FilterSeparator}\s*(.*)/om @name = Expression.parse(name_markup)
filters = $1.scan(FilterParser) if filter_markup =~ /#{FilterSeparator}\s*(.*)/om
filters.each do |f| filters = $1.scan(FilterParser)
if f =~ /\w+/ filters.each do |f|
filtername = Regexp.last_match(0) if f =~ /\w+/
filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten filtername = Regexp.last_match(0)
@filters << parse_filter_expressions(filtername, filterargs) filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten
end @filters << parse_filter_expressions(filtername, filterargs)
end end
end end
end end
@@ -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
+3 -3
View File
@@ -41,8 +41,8 @@ module Liquid
# If object is a hash- or array-like object we look for the # If object is a hash- or array-like object we look for the
# presence of the key and if its available we return it # presence of the key and if its available we return it
if object.respond_to?(:[]) && if object.respond_to?(:[]) &&
((object.respond_to?(:has_key?) && object.has_key?(key)) || ((object.respond_to?(:has_key?) && object.has_key?(key)) ||
(object.respond_to?(:fetch) && key.is_a?(Integer))) (object.respond_to?(:fetch) && key.is_a?(Integer)))
# if its a proc we will replace the entry with the proc # if its a proc we will replace the entry with the proc
res = context.lookup_and_evaluate(object, key) res = context.lookup_and_evaluate(object, key)
@@ -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
+2 -2
View File
@@ -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"
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
s.email = ["[email protected]"] s.email = ["[email protected]"]
s.homepage = "http://www.liquidmarkup.org" s.homepage = "http://www.liquidmarkup.org"
s.license = "MIT" s.license = "MIT"
#s.description = "A secure, non-evaling end user template engine with aesthetic markup." # s.description = "A secure, non-evaling end user template engine with aesthetic markup."
s.required_rubygems_version = ">= 1.3.7" s.required_rubygems_version = ">= 1.3.7"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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 -3
View File
@@ -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
+2 -3
View File
@@ -1,13 +1,12 @@
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)
end end
def money(money) def money(money)
return '' if money.nil? return '' if money.nil?
sprintf("$ %.2f", money/100.0) sprintf("$ %.2f", money / 100.0)
end end
private private
+8 -9
View File
@@ -42,23 +42,22 @@ class Paginate < Liquid::Block
page_count = (collection_size.to_f / @page_size.to_f).to_f.ceil + 1 page_count = (collection_size.to_f / @page_size.to_f).to_f.ceil + 1
pagination['items'] = collection_size pagination['items'] = collection_size
pagination['pages'] = page_count -1 pagination['pages'] = page_count - 1
pagination['previous'] = link('&laquo; Previous', current_page-1 ) unless 1 >= current_page pagination['previous'] = link('&laquo; Previous', current_page - 1) unless 1 >= current_page
pagination['next'] = link('Next &raquo;', current_page+1 ) unless page_count <= current_page+1 pagination['next'] = link('Next &raquo;', current_page + 1) unless page_count <= current_page + 1
pagination['parts'] = [] pagination['parts'] = []
hellip_break = false hellip_break = false
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('&hellip;') pagination['parts'] << no_link('&hellip;')
hellip_break = true hellip_break = true
@@ -78,11 +77,11 @@ class Paginate < Liquid::Block
private private
def no_link(title) def no_link(title)
{ 'title' => title, 'is_link' => false} { 'title' => title, 'is_link' => false }
end end
def link(title, page) def link(title, page)
{ 'title' => title, 'url' => current_url + "?page=#{page}", 'is_link' => true} { 'title' => title, 'url' => current_url + "?page=#{page}", 'is_link' => true }
end end
def current_url def current_url
+5 -9
View File
@@ -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
@@ -16,16 +15,16 @@ module ShopFilter
%(<script src="#{url}" type="text/javascript"></script>) %(<script src="#{url}" type="text/javascript"></script>)
end end
def stylesheet_tag(url, media="all") def stylesheet_tag(url, media = "all")
%(<link href="#{url}" rel="stylesheet" type="text/css" media="#{media}" />) %(<link href="#{url}" rel="stylesheet" type="text/css" media="#{media}" />)
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 -3
View File
@@ -1,10 +1,9 @@
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
def highlight_active_tag(tag, css_class='active') def highlight_active_tag(tag, css_class = 'active')
if @context['current_tags'].include?(tag) if @context['current_tags'].include?(tag)
"<span class=\"#{css_class}\">#{tag}</span>" "<span class=\"#{css_class}\">#{tag}</span>"
else else
@@ -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
-2
View File
@@ -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
+1 -6
View File
@@ -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
@@ -46,20 +44,17 @@ class ThemeRunner
end end
end end
def run def run
# Dup assigns because will make some changes to them # Dup assigns because will make some changes to them
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'
+8 -8
View File
@@ -15,24 +15,24 @@ 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
assert_template_result('.bar.', assert_template_result('.bar.',
'{% assign foo = values | split: "," %}.{{ foo[1] }}.', '{% assign foo = values | split: "," %}.{{ foo[1] }}.',
'values' => "foo,bar,baz") 'values' => "foo,bar,baz")
end end
def test_assign_syntax_error def test_assign_syntax_error
assert_match_syntax_error(/assign/, assert_match_syntax_error(/assign/,
'{% assign foo not values %}.', '{% assign foo not values %}.',
'values' => "foo,bar,baz") 'values' => "foo,bar,baz")
end end
def test_assign_uses_error_mode def test_assign_uses_error_mode
+13 -13
View File
@@ -31,7 +31,7 @@ class BlankTest < Minitest::Test
end end
def test_new_tags_are_not_blank_by_default def test_new_tags_are_not_blank_by_default
assert_template_result(" "*N, wrap_in_for("{% foobar %}")) assert_template_result(" " * N, wrap_in_for("{% foobar %}"))
end end
def test_loops_are_blank def test_loops_are_blank
@@ -47,7 +47,7 @@ class BlankTest < Minitest::Test
end end
def test_mark_as_blank_only_during_parsing def test_mark_as_blank_only_during_parsing
assert_template_result(" "*(N+1), wrap(" {% if false %} this never happens, but still, this block is not blank {% endif %}")) assert_template_result(" " * (N + 1), wrap(" {% if false %} this never happens, but still, this block is not blank {% endif %}"))
end end
def test_comments_are_blank def test_comments_are_blank
@@ -60,9 +60,9 @@ 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
@@ -76,31 +76,31 @@ class BlankTest < Minitest::Test
def test_whitespace_is_not_blank_if_other_stuff_is_present def test_whitespace_is_not_blank_if_other_stuff_is_present
body = " x " body = " x "
assert_template_result(body*(N+1), wrap(body)) assert_template_result(body * (N + 1), wrap(body))
end end
def test_increment_is_not_blank def test_increment_is_not_blank
assert_template_result(" 0"*2*(N+1), wrap("{% assign foo = 0 %} {% increment foo %} {% decrement foo %}")) assert_template_result(" 0" * 2 * (N + 1), wrap("{% assign foo = 0 %} {% increment foo %} {% decrement foo %}"))
end end
def test_cycle_is_not_blank def test_cycle_is_not_blank
assert_template_result(" "*((N+1)/2)+" ", wrap("{% cycle ' ', ' ' %}")) assert_template_result(" " * ((N + 1) / 2) + " ", wrap("{% cycle ' ', ' ' %}"))
end end
def test_raw_is_not_blank def test_raw_is_not_blank
assert_template_result(" "*(N+1), wrap(" {% raw %} {% endraw %}")) assert_template_result(" " * (N + 1), wrap(" {% raw %} {% endraw %}"))
end end
def test_include_is_blank def test_include_is_blank
Liquid::Template.file_system = BlankTestFileSystem.new Liquid::Template.file_system = BlankTestFileSystem.new
assert_template_result "foobar"*(N+1), wrap("{% include 'foobar' %}") assert_template_result "foobar" * (N + 1), wrap("{% include 'foobar' %}")
assert_template_result " foobar "*(N+1), wrap("{% include ' foobar ' %}") assert_template_result " foobar " * (N + 1), wrap("{% include ' foobar ' %}")
assert_template_result " "*(N+1), wrap(" {% include ' ' %} ") assert_template_result " " * (N + 1), wrap(" {% include ' ' %} ")
end end
def test_case_is_blank def test_case_is_blank
assert_template_result("", wrap(" {% assign foo = 'bar' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} ")) assert_template_result("", wrap(" {% assign foo = 'bar' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} "))
assert_template_result("", wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} ")) assert_template_result("", wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} "))
assert_template_result(" x "*(N+1), wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} x {% endcase %} ")) assert_template_result(" x " * (N + 1), wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} x {% endcase %} "))
end end
end end
+29 -28
View File
@@ -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,9 +53,10 @@ class ProductDrop < Liquid::Drop
end end
protected protected
def callmenot
"protected" def callmenot
end "protected"
end
end end
class EnumerableDrop < Liquid::Drop class EnumerableDrop < Liquid::Drop
@@ -151,37 +152,37 @@ class DropsTest < Minitest::Test
end end
def test_text_drop def test_text_drop
output = Liquid::Template.parse( ' {{ product.texts.text }} ' ).render!('product' => ProductDrop.new) output = Liquid::Template.parse(' {{ product.texts.text }} ').render!('product' => ProductDrop.new)
assert_equal ' text1 ', output assert_equal ' text1 ', output
end end
def test_unknown_method def test_unknown_method
output = Liquid::Template.parse( ' {{ product.catchall.unknown }} ' ).render!('product' => ProductDrop.new) output = Liquid::Template.parse(' {{ product.catchall.unknown }} ').render!('product' => ProductDrop.new)
assert_equal ' method: unknown ', output assert_equal ' method: unknown ', output
end end
def test_integer_argument_drop def test_integer_argument_drop
output = Liquid::Template.parse( ' {{ product.catchall[8] }} ' ).render!('product' => ProductDrop.new) output = Liquid::Template.parse(' {{ product.catchall[8] }} ').render!('product' => ProductDrop.new)
assert_equal ' method: 8 ', output assert_equal ' method: 8 ', output
end end
def test_text_array_drop def test_text_array_drop
output = Liquid::Template.parse( '{% for text in product.texts.array %} {{text}} {% endfor %}' ).render!('product' => ProductDrop.new) output = Liquid::Template.parse('{% for text in product.texts.array %} {{text}} {% endfor %}').render!('product' => ProductDrop.new)
assert_equal ' text1 text2 ', output assert_equal ' text1 text2 ', output
end end
def test_context_drop def test_context_drop
output = Liquid::Template.parse( ' {{ context.bar }} ' ).render!('context' => ContextDrop.new, 'bar' => "carrot") output = Liquid::Template.parse(' {{ context.bar }} ').render!('context' => ContextDrop.new, 'bar' => "carrot")
assert_equal ' carrot ', output assert_equal ' carrot ', output
end end
def test_nested_context_drop def test_nested_context_drop
output = Liquid::Template.parse( ' {{ product.context.foo }} ' ).render!('product' => ProductDrop.new, 'foo' => "monkey") output = Liquid::Template.parse(' {{ product.context.foo }} ').render!('product' => ProductDrop.new, 'foo' => "monkey")
assert_equal ' monkey ', output assert_equal ' monkey ', output
end end
def test_protected def test_protected
output = Liquid::Template.parse( ' {{ product.callmenot }} ' ).render!('product' => ProductDrop.new) output = Liquid::Template.parse(' {{ product.callmenot }} ').render!('product' => ProductDrop.new)
assert_equal ' ', output assert_equal ' ', output
end end
@@ -193,40 +194,40 @@ class DropsTest < Minitest::Test
end end
def test_scope def test_scope
assert_equal '1', Liquid::Template.parse( '{{ context.scopes }}' ).render!('context' => ContextDrop.new) assert_equal '1', Liquid::Template.parse('{{ context.scopes }}').render!('context' => ContextDrop.new)
assert_equal '2', Liquid::Template.parse( '{%for i in dummy%}{{ context.scopes }}{%endfor%}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ context.scopes }}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1])
assert_equal '3', Liquid::Template.parse( '{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1])
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
assert_equal 'variable', Liquid::Template.parse( '{% assign a = "variable"%}{{a}}' ).render!('context' => ContextDrop.new) assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{{a}}').render!('context' => ContextDrop.new)
assert_equal 'variable', Liquid::Template.parse( '{% assign a = "variable"%}{%for i in dummy%}{{a}}{%endfor%}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{%for i in dummy%}{{a}}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1])
assert_equal 'test', Liquid::Template.parse( '{% assign header_gif = "test"%}{{header_gif}}' ).render!('context' => ContextDrop.new) assert_equal 'test', Liquid::Template.parse('{% assign header_gif = "test"%}{{header_gif}}').render!('context' => ContextDrop.new)
assert_equal 'test', Liquid::Template.parse( "{% assign header_gif = 'test'%}{{header_gif}}" ).render!('context' => ContextDrop.new) assert_equal 'test', Liquid::Template.parse("{% assign header_gif = 'test'%}{{header_gif}}").render!('context' => ContextDrop.new)
end end
def test_scope_from_tags def test_scope_from_tags
assert_equal '1', Liquid::Template.parse( '{% for i in context.scopes_as_array %}{{i}}{% endfor %}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) assert_equal '1', Liquid::Template.parse('{% for i in context.scopes_as_array %}{{i}}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1])
assert_equal '12', Liquid::Template.parse( '{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) assert_equal '12', Liquid::Template.parse('{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1])
assert_equal '123', Liquid::Template.parse( '{%for a in dummy%}{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}{% endfor %}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1])
end end
def test_access_context_from_drop def test_access_context_from_drop
assert_equal '123', Liquid::Template.parse( '{%for a in dummy%}{{ context.loop_pos }}{% endfor %}' ).render!('context' => ContextDrop.new, 'dummy' => [1,2,3]) assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{{ context.loop_pos }}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1, 2, 3])
end end
def test_enumerable_drop def test_enumerable_drop
assert_equal '123', Liquid::Template.parse( '{% for c in collection %}{{c}}{% endfor %}').render!('collection' => EnumerableDrop.new) assert_equal '123', Liquid::Template.parse('{% for c in collection %}{{c}}{% endfor %}').render!('collection' => EnumerableDrop.new)
end end
def test_enumerable_drop_size def test_enumerable_drop_size
assert_equal '3', Liquid::Template.parse( '{{collection.size}}').render!('collection' => EnumerableDrop.new) assert_equal '3', Liquid::Template.parse('{{collection.size}}').render!('collection' => EnumerableDrop.new)
end end
def test_enumerable_drop_will_invoke_before_method_for_clashing_method_names def test_enumerable_drop_will_invoke_before_method_for_clashing_method_names
+16 -16
View File
@@ -56,7 +56,7 @@ class ErrorHandlingTest < Minitest::Test
end end
def test_standard_error def test_standard_error
template = Liquid::Template.parse( ' {{ errors.standard_error }} ' ) template = Liquid::Template.parse(' {{ errors.standard_error }} ')
assert_equal ' Liquid error: standard error ', template.render('errors' => ErrorDrop.new) assert_equal ' Liquid error: standard error ', template.render('errors' => ErrorDrop.new)
assert_equal 1, template.errors.size assert_equal 1, template.errors.size
@@ -64,7 +64,7 @@ class ErrorHandlingTest < Minitest::Test
end end
def test_syntax def test_syntax
template = Liquid::Template.parse( ' {{ errors.syntax_error }} ' ) template = Liquid::Template.parse(' {{ errors.syntax_error }} ')
assert_equal ' Liquid syntax error: syntax error ', template.render('errors' => ErrorDrop.new) assert_equal ' Liquid syntax error: syntax error ', template.render('errors' => ErrorDrop.new)
assert_equal 1, template.errors.size assert_equal 1, template.errors.size
@@ -72,7 +72,7 @@ class ErrorHandlingTest < Minitest::Test
end end
def test_argument def test_argument
template = Liquid::Template.parse( ' {{ errors.argument_error }} ' ) template = Liquid::Template.parse(' {{ errors.argument_error }} ')
assert_equal ' Liquid error: argument error ', template.render('errors' => ErrorDrop.new) assert_equal ' Liquid error: argument error ', template.render('errors' => ErrorDrop.new)
assert_equal 1, template.errors.size assert_equal 1, template.errors.size
@@ -102,31 +102,31 @@ 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
assert_match /Liquid syntax error \(line 4\)/, err.message assert_match /Liquid syntax error \(line 4\)/, err.message
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
) )
assert_equal ['Liquid syntax error (line 4): Unexpected character = in "1 =! 2"'], assert_equal ['Liquid syntax error (line 4): Unexpected character = in "1 =! 2"'],
template.warnings.map(&:message) template.warnings.map(&:message)
@@ -134,16 +134,16 @@ 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
) )
end end
assert_equal 'Liquid syntax error (line 4): Unexpected character = in "1 =! 2"', err.message assert_equal 'Liquid syntax error (line 4): Unexpected character = in "1 =! 2"', err.message
@@ -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,9 +159,9 @@ class ErrorHandlingTest < Minitest::Test
{% endif %} {% endif %}
bla bla
}, ',
:line_numbers => true :line_numbers => true
) )
end end
assert_equal "Liquid syntax error (line 5): Unknown tag 'foo'", err.message assert_equal "Liquid syntax error (line 5): Unknown tag 'foo'", err.message
@@ -194,7 +194,7 @@ class ErrorHandlingTest < Minitest::Test
assert_equal 'Liquid syntax error (line 2): Unexpected character % in "{{%%%}}"', template.warnings[1].message assert_equal 'Liquid syntax error (line 2): Unexpected character % in "{{%%%}}"', template.warnings[1].message
assert_equal 'Liquid syntax error (line 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message assert_equal 'Liquid syntax error (line 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message
assert_equal 3, template.warnings.size assert_equal 3, template.warnings.size
assert_equal [1,2,3], template.warnings.map(&:line_number) assert_equal [1, 2, 3], template.warnings.map(&:line_number)
end end
# Liquid should not catch Exceptions that are not subclasses of StandardError, like Interrupt and NoMemoryError # Liquid should not catch Exceptions that are not subclasses of StandardError, like Interrupt and NoMemoryError
+6 -6
View File
@@ -17,7 +17,7 @@ module CanadianMoneyFilter
end end
module SubstituteFilter module SubstituteFilter
def substitute(input, params={}) def substitute(input, params = {})
input.gsub(/%\{(\w+)\}/) { |match| params[$1] } input.gsub(/%\{(\w+)\}/) { |match| params[$1] }
end end
end end
@@ -64,19 +64,19 @@ class FiltersTest < Minitest::Test
end end
def test_join def test_join
@context['var'] = [1,2,3,4] @context['var'] = [1, 2, 3, 4]
assert_equal "1 2 3 4", Variable.new("var | join").render(@context) assert_equal "1 2 3 4", Variable.new("var | join").render(@context)
end end
def test_sort def test_sort
@context['value'] = 3 @context['value'] = 3
@context['numbers'] = [2,1,4,3] @context['numbers'] = [2, 1, 4, 3]
@context['words'] = ['expected', 'as', 'alphabetic'] @context['words'] = ['expected', 'as', 'alphabetic']
@context['arrays'] = ['flower', 'are'] @context['arrays'] = ['flower', 'are']
@context['case_sensitive'] = ['sensitive', 'Expected', 'case'] @context['case_sensitive'] = ['sensitive', 'Expected', 'case']
assert_equal [1,2,3,4], Variable.new("numbers | sort").render(@context) assert_equal [1, 2, 3, 4], Variable.new("numbers | sort").render(@context)
assert_equal ['alphabetic', 'as', 'expected'], Variable.new("words | sort").render(@context) assert_equal ['alphabetic', 'as', 'expected'], Variable.new("words | sort").render(@context)
assert_equal [3], Variable.new("value | sort").render(@context) assert_equal [3], Variable.new("value | sort").render(@context)
assert_equal ['are', 'flower'], Variable.new("arrays | sort").render(@context) assert_equal ['are', 'flower'], Variable.new("arrays | sort").render(@context)
@@ -85,7 +85,7 @@ class FiltersTest < Minitest::Test
def test_sort_natural def test_sort_natural
@context['words'] = ['case', 'Assert', 'Insensitive'] @context['words'] = ['case', 'Assert', 'Insensitive']
@context['hashes'] = [{ 'a' => 'A'}, { 'a' => 'b'}, { 'a' => 'C' }] @context['hashes'] = [{ 'a' => 'A' }, { 'a' => 'b' }, { 'a' => 'C' }]
@context['objects'] = [TestObject.new('A'), TestObject.new('b'), TestObject.new('C')] @context['objects'] = [TestObject.new('A'), TestObject.new('b'), TestObject.new('C')]
# Test strings # Test strings
@@ -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
+17 -18
View File
@@ -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
@@ -33,34 +32,34 @@ class OutputTest < Minitest::Test
def setup def setup
@assigns = { @assigns = {
'best_cars' => 'bmw', 'best_cars' => 'bmw',
'car' => {'bmw' => 'good', 'gm' => 'bad'} 'car' => { 'bmw' => 'good', 'gm' => 'bad' }
} }
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
+5 -5
View File
@@ -69,18 +69,18 @@ class ParsingQuirksTest < Minitest::Test
def test_meaningless_parens_lax def test_meaningless_parens_lax
with_error_mode(:lax) do with_error_mode(:lax) do
assigns = {'b' => 'bar', 'c' => 'baz'} assigns = { 'b' => 'bar', 'c' => 'baz' }
markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false" markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false"
assert_template_result(' YES ',"{% if #{markup} %} YES {% endif %}", assigns) assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}", assigns)
end end
end end
def test_unexpected_characters_silently_eat_logic_lax def test_unexpected_characters_silently_eat_logic_lax
with_error_mode(:lax) do with_error_mode(:lax) do
markup = "true && false" markup = "true && false"
assert_template_result(' YES ',"{% if #{markup} %} YES {% endif %}") assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}")
markup = "false || true" markup = "false || true"
assert_template_result('',"{% if #{markup} %} YES {% endif %}") assert_template_result('', "{% if #{markup} %} YES {% endif %}")
end end
end end
@@ -92,7 +92,7 @@ class ParsingQuirksTest < Minitest::Test
def test_unanchored_filter_arguments def test_unanchored_filter_arguments
with_error_mode(:lax) do with_error_mode(:lax) do
assert_template_result('hi',"{{ 'hi there' | split$$$:' ' | first }}") assert_template_result('hi', "{{ 'hi there' | split$$$:' ' | first }}")
assert_template_result('x', "{{ 'X' | downcase) }}") assert_template_result('x', "{{ 'X' | downcase) }}")
+1 -1
View File
@@ -145,7 +145,7 @@ class RenderProfilingTest < Minitest::Test
def test_profiling_marks_children_of_for_blocks def test_profiling_marks_children_of_for_blocks
t = Template.parse("{% for item in collection %} {{ item }} {% endfor %}", :profile => true) t = Template.parse("{% for item in collection %} {{ item }} {% endfor %}", :profile => true)
t.render!({"collection" => ["one", "two"]}) t.render!({ "collection" => ["one", "two"] })
assert_equal 1, t.profiler.length assert_equal 1, t.profiler.length
# Will profile each invocation of the for block # Will profile each invocation of the for block
+4 -6
View File
@@ -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
+37 -37
View File
@@ -49,7 +49,7 @@ class StandardFiltersTest < Minitest::Test
end end
def test_size def test_size
assert_equal 3, @filters.size([1,2,3]) assert_equal 3, @filters.size([1, 2, 3])
assert_equal 0, @filters.size([]) assert_equal 0, @filters.size([])
assert_equal 0, @filters.size(nil) assert_equal 0, @filters.size(nil)
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
@@ -101,11 +101,11 @@ class StandardFiltersTest < Minitest::Test
end end
def test_split def test_split
assert_equal ['12','34'], @filters.split('12~34', '~') assert_equal ['12', '34'], @filters.split('12~34', '~')
assert_equal ['A? ',' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~') assert_equal ['A? ', ' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~')
assert_equal ['A?Z'], @filters.split('A?Z', '~') assert_equal ['A?Z'], @filters.split('A?Z', '~')
# Regexp works although Liquid does not support. # Regexp works although Liquid does not support.
assert_equal ['A','Z'], @filters.split('AxZ', /x/) assert_equal ['A', 'Z'], @filters.split('AxZ', /x/)
assert_equal [], @filters.split(nil, ' ') assert_equal [], @filters.split(nil, ' ')
end end
@@ -142,45 +142,45 @@ class StandardFiltersTest < Minitest::Test
end end
def test_join def test_join
assert_equal '1 2 3 4', @filters.join([1,2,3,4]) assert_equal '1 2 3 4', @filters.join([1, 2, 3, 4])
assert_equal '1 - 2 - 3 - 4', @filters.join([1,2,3,4], ' - ') assert_equal '1 - 2 - 3 - 4', @filters.join([1, 2, 3, 4], ' - ')
end end
def test_sort def test_sort
assert_equal [1,2,3,4], @filters.sort([4,3,2,1]) assert_equal [1, 2, 3, 4], @filters.sort([4, 3, 2, 1])
assert_equal [{"a" => 1}, {"a" => 2}, {"a" => 3}, {"a" => 4}], @filters.sort([{"a" => 4}, {"a" => 3}, {"a" => 1}, {"a" => 2}], "a") assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], @filters.sort([{ "a" => 4 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a")
end end
def test_legacy_sort_hash def test_legacy_sort_hash
assert_equal [{a:1, b:2}], @filters.sort({a:1, b:2}) assert_equal [{ a: 1, b: 2 }], @filters.sort({ a: 1, b: 2 })
end end
def test_numerical_vs_lexicographical_sort def test_numerical_vs_lexicographical_sort
assert_equal [2, 10], @filters.sort([10, 2]) assert_equal [2, 10], @filters.sort([10, 2])
assert_equal [{"a" => 2}, {"a" => 10}], @filters.sort([{"a" => 10}, {"a" => 2}], "a") assert_equal [{ "a" => 2 }, { "a" => 10 }], @filters.sort([{ "a" => 10 }, { "a" => 2 }], "a")
assert_equal ["10", "2"], @filters.sort(["10", "2"]) assert_equal ["10", "2"], @filters.sort(["10", "2"])
assert_equal [{"a" => "10"}, {"a" => "2"}], @filters.sort([{"a" => "10"}, {"a" => "2"}], "a") assert_equal [{ "a" => "10" }, { "a" => "2" }], @filters.sort([{ "a" => "10" }, { "a" => "2" }], "a")
end end
def test_uniq def test_uniq
assert_equal [1,3,2,4], @filters.uniq([1,1,3,2,3,1,4,3,2,1]) assert_equal [1, 3, 2, 4], @filters.uniq([1, 1, 3, 2, 3, 1, 4, 3, 2, 1])
assert_equal [{"a" => 1}, {"a" => 3}, {"a" => 2}], @filters.uniq([{"a" => 1}, {"a" => 3}, {"a" => 1}, {"a" => 2}], "a") assert_equal [{ "a" => 1 }, { "a" => 3 }, { "a" => 2 }], @filters.uniq([{ "a" => 1 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a")
testdrop = TestDrop.new testdrop = TestDrop.new
assert_equal [testdrop], @filters.uniq([testdrop, TestDrop.new], 'test') assert_equal [testdrop], @filters.uniq([testdrop, TestDrop.new], 'test')
end end
def test_reverse def test_reverse
assert_equal [4,3,2,1], @filters.reverse([1,2,3,4]) assert_equal [4, 3, 2, 1], @filters.reverse([1, 2, 3, 4])
end end
def test_legacy_reverse_hash def test_legacy_reverse_hash
assert_equal [{a:1, b:2}], @filters.reverse(a:1, b:2) assert_equal [{ a: 1, b: 2 }], @filters.reverse(a: 1, b: 2)
end end
def test_map def test_map
assert_equal [1,2,3,4], @filters.map([{"a" => 1}, {"a" => 2}, {"a" => 3}, {"a" => 4}], 'a') assert_equal [1, 2, 3, 4], @filters.map([{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], 'a')
assert_template_result 'abc', "{{ ary | map:'foo' | map:'bar' }}", assert_template_result 'abc', "{{ ary | map:'foo' | map:'bar' }}",
'ary' => [{'foo' => {'bar' => 'a'}}, {'foo' => {'bar' => 'b'}}, {'foo' => {'bar' => 'c'}}] 'ary' => [{ 'foo' => { 'bar' => 'a' } }, { 'foo' => { 'bar' => 'b' } }, { 'foo' => { 'bar' => 'c' } }]
end end
def test_map_doesnt_call_arbitrary_stuff def test_map_doesnt_call_arbitrary_stuff
@@ -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
@@ -260,8 +260,8 @@ class StandardFiltersTest < Minitest::Test
end end
def test_first_last def test_first_last
assert_equal 1, @filters.first([1,2,3]) assert_equal 1, @filters.first([1, 2, 3])
assert_equal 3, @filters.last([1,2,3]) assert_equal 3, @filters.last([1, 2, 3])
assert_equal nil, @filters.first([]) assert_equal nil, @filters.first([])
assert_equal nil, @filters.last([]) assert_equal nil, @filters.last([])
end end
@@ -356,9 +356,9 @@ class StandardFiltersTest < Minitest::Test
end end
def test_append def test_append
assigns = {'a' => 'bc', 'b' => 'd' } assigns = { 'a' => 'bc', 'b' => 'd' }
assert_template_result('bcd',"{{ a | append: 'd'}}",assigns) assert_template_result('bcd', "{{ a | append: 'd'}}", assigns)
assert_template_result('bcd',"{{ a | append: b}}",assigns) assert_template_result('bcd', "{{ a | append: b}}", assigns)
end end
def test_concat def test_concat
@@ -373,9 +373,9 @@ class StandardFiltersTest < Minitest::Test
end end
def test_prepend def test_prepend
assigns = {'a' => 'bc', 'b' => 'a' } assigns = { 'a' => 'bc', 'b' => 'a' }
assert_template_result('abc',"{{ a | prepend: 'a'}}",assigns) assert_template_result('abc', "{{ a | prepend: 'a'}}", assigns)
assert_template_result('abc',"{{ a | prepend: b}}",assigns) assert_template_result('abc', "{{ a | prepend: b}}", assigns)
end end
def test_default def test_default
@@ -388,6 +388,6 @@ class StandardFiltersTest < Minitest::Test
end end
def test_cannot_access_private_methods def test_cannot_access_private_methods
assert_template_result('a',"{{ 'a' | to_number }}") assert_template_result('a', "{{ 'a' | to_number }}")
end end
end # StandardFiltersTest end # StandardFiltersTest
+1 -1
View File
@@ -6,7 +6,7 @@ class BreakTagTest < Minitest::Test
# tests that no weird errors are raised if break is called outside of a # tests that no weird errors are raised if break is called outside of a
# block # block
def test_break_with_no_block def test_break_with_no_block
assigns = {'i' => 1} assigns = { 'i' => 1 }
markup = '{% break %}' markup = '{% break %}'
expected = '' expected = ''
+105 -106
View File
@@ -10,10 +10,10 @@ class ForTagTest < Minitest::Test
include Liquid include Liquid
def test_for def test_for
assert_template_result(' yo yo yo yo ','{%for item in array%} yo {%endfor%}','array' => [1,2,3,4]) assert_template_result(' yo yo yo yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1, 2, 3, 4])
assert_template_result('yoyo','{%for item in array%}yo{%endfor%}','array' => [1,2]) assert_template_result('yoyo', '{%for item in array%}yo{%endfor%}', 'array' => [1, 2])
assert_template_result(' yo ','{%for item in array%} yo {%endfor%}','array' => [1]) assert_template_result(' yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1])
assert_template_result('','{%for item in array%}{%endfor%}','array' => [1,2]) assert_template_result('', '{%for item in array%}{%endfor%}', 'array' => [1, 2])
expected = <<HERE expected = <<HERE
yo yo
@@ -28,46 +28,46 @@ HERE
yo yo
{%endfor%} {%endfor%}
HERE HERE
assert_template_result(expected,template,'array' => [1,2,3]) assert_template_result(expected, template, 'array' => [1, 2, 3])
end end
def test_for_reversed def test_for_reversed
assigns = {'array' => [ 1, 2, 3] } assigns = { 'array' => [ 1, 2, 3] }
assert_template_result('321','{%for item in array reversed %}{{item}}{%endfor%}',assigns) assert_template_result('321', '{%for item in array reversed %}{{item}}{%endfor%}', assigns)
end end
def test_for_with_range def test_for_with_range
assert_template_result(' 1 2 3 ','{%for item in (1..3) %} {{item}} {%endfor%}') assert_template_result(' 1 2 3 ', '{%for item in (1..3) %} {{item}} {%endfor%}')
end end
def test_for_with_variable_range def test_for_with_variable_range
assert_template_result(' 1 2 3 ','{%for item in (1..foobar) %} {{item}} {%endfor%}', "foobar" => 3) assert_template_result(' 1 2 3 ', '{%for item in (1..foobar) %} {{item}} {%endfor%}', "foobar" => 3)
end end
def test_for_with_hash_value_range def test_for_with_hash_value_range
foobar = { "value" => 3 } foobar = { "value" => 3 }
assert_template_result(' 1 2 3 ','{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar) assert_template_result(' 1 2 3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar)
end end
def test_for_with_drop_value_range def test_for_with_drop_value_range
foobar = ThingWithValue.new foobar = ThingWithValue.new
assert_template_result(' 1 2 3 ','{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar) assert_template_result(' 1 2 3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar)
end end
def test_for_with_variable def test_for_with_variable
assert_template_result(' 1 2 3 ','{%for item in array%} {{item}} {%endfor%}','array' => [1,2,3]) assert_template_result(' 1 2 3 ', '{%for item in array%} {{item}} {%endfor%}', 'array' => [1, 2, 3])
assert_template_result('123','{%for item in array%}{{item}}{%endfor%}','array' => [1,2,3]) assert_template_result('123', '{%for item in array%}{{item}}{%endfor%}', 'array' => [1, 2, 3])
assert_template_result('123','{% for item in array %}{{item}}{% endfor %}','array' => [1,2,3]) assert_template_result('123', '{% for item in array %}{{item}}{% endfor %}', 'array' => [1, 2, 3])
assert_template_result('abcd','{%for item in array%}{{item}}{%endfor%}','array' => ['a','b','c','d']) assert_template_result('abcd', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', 'b', 'c', 'd'])
assert_template_result('a b c','{%for item in array%}{{item}}{%endfor%}','array' => ['a',' ','b',' ','c']) assert_template_result('a b c', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', ' ', 'b', ' ', 'c'])
assert_template_result('abc','{%for item in array%}{{item}}{%endfor%}','array' => ['a','','b','','c']) assert_template_result('abc', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', '', 'b', '', 'c'])
end end
def test_for_helpers def test_for_helpers
assigns = {'array' => [1,2,3] } assigns = { 'array' => [1, 2, 3] }
assert_template_result(' 1/3 2/3 3/3 ', assert_template_result(' 1/3 2/3 3/3 ',
'{%for item in array%} {{forloop.index}}/{{forloop.length}} {%endfor%}', '{%for item in array%} {{forloop.index}}/{{forloop.length}} {%endfor%}',
assigns) assigns)
assert_template_result(' 1 2 3 ', '{%for item in array%} {{forloop.index}} {%endfor%}', assigns) assert_template_result(' 1 2 3 ', '{%for item in array%} {{forloop.index}} {%endfor%}', assigns)
assert_template_result(' 0 1 2 ', '{%for item in array%} {{forloop.index0}} {%endfor%}', assigns) assert_template_result(' 0 1 2 ', '{%for item in array%} {{forloop.index0}} {%endfor%}', assigns)
assert_template_result(' 2 1 0 ', '{%for item in array%} {{forloop.rindex0}} {%endfor%}', assigns) assert_template_result(' 2 1 0 ', '{%for item in array%} {{forloop.rindex0}} {%endfor%}', assigns)
@@ -77,20 +77,20 @@ HERE
end end
def test_for_and_if def test_for_and_if
assigns = {'array' => [1,2,3] } assigns = { 'array' => [1, 2, 3] }
assert_template_result('+--', assert_template_result('+--',
'{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}', '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}',
assigns) assigns)
end end
def test_for_else def test_for_else
assert_template_result('+++', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>[1,2,3]) assert_template_result('+++', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => [1, 2, 3])
assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>[]) assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => [])
assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>nil) assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => nil)
end end
def test_limiting def test_limiting
assigns = {'array' => [1,2,3,4,5,6,7,8,9,0]} assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns) assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns)
assert_template_result('1234', '{%for i in array limit:4 %}{{ i }}{%endfor%}', assigns) assert_template_result('1234', '{%for i in array limit:4 %}{{ i }}{%endfor%}', assigns)
assert_template_result('3456', '{%for i in array limit:4 offset:2 %}{{ i }}{%endfor%}', assigns) assert_template_result('3456', '{%for i in array limit:4 offset:2 %}{{ i }}{%endfor%}', assigns)
@@ -98,7 +98,7 @@ HERE
end end
def test_dynamic_variable_limiting def test_dynamic_variable_limiting
assigns = {'array' => [1,2,3,4,5,6,7,8,9,0]} assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
assigns['limit'] = 2 assigns['limit'] = 2
assigns['offset'] = 2 assigns['offset'] = 2
@@ -106,17 +106,17 @@ HERE
end end
def test_nested_for def test_nested_for
assigns = {'array' => [[1,2],[3,4],[5,6]] } assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
assert_template_result('123456', '{%for item in array%}{%for i in item%}{{ i }}{%endfor%}{%endfor%}', assigns) assert_template_result('123456', '{%for item in array%}{%for i in item%}{{ i }}{%endfor%}{%endfor%}', assigns)
end end
def test_offset_only def test_offset_only
assigns = {'array' => [1,2,3,4,5,6,7,8,9,0]} assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
assert_template_result('890', '{%for i in array offset:7 %}{{ i }}{%endfor%}', assigns) assert_template_result('890', '{%for i in array offset:7 %}{{ i }}{%endfor%}', assigns)
end end
def test_pause_resume def test_pause_resume
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 = <<-MKUP markup = <<-MKUP
{%for i in array.items limit: 3 %}{{i}}{%endfor%} {%for i in array.items limit: 3 %}{{i}}{%endfor%}
next next
@@ -131,11 +131,11 @@ HERE
next next
789 789
XPCTD XPCTD
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
end end
def test_pause_resume_limit def test_pause_resume_limit
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 = <<-MKUP markup = <<-MKUP
{%for i in array.items limit:3 %}{{i}}{%endfor%} {%for i in array.items limit:3 %}{{i}}{%endfor%}
next next
@@ -150,11 +150,11 @@ HERE
next next
7 7
XPCTD XPCTD
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
end end
def test_pause_resume_BIG_limit def test_pause_resume_BIG_limit
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 = <<-MKUP markup = <<-MKUP
{%for i in array.items limit:3 %}{{i}}{%endfor%} {%for i in array.items limit:3 %}{{i}}{%endfor%}
next next
@@ -169,103 +169,102 @@ HERE
next next
7890 7890
XPCTD XPCTD
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
def test_for_with_break def test_for_with_break
assigns = {'array' => {'items' => [1,2,3,4,5,6,7,8,9,10]}} assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } }
markup = '{% for i in array.items %}{% break %}{% endfor %}' markup = '{% for i in array.items %}{% break %}{% endfor %}'
expected = "" expected = ""
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}' markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}'
expected = "1" expected = "1"
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}' markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}'
expected = "" expected = ""
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{{ i }}{% if i > 3 %}{% break %}{% endif %}{% endfor %}' markup = '{% for i in array.items %}{{ i }}{% if i > 3 %}{% break %}{% endif %}{% endfor %}'
expected = "1234" expected = "1234"
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
# 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)
# test break does nothing when unreached # test break does nothing when unreached
assigns = {'array' => {'items' => [1,2,3,4,5]}} assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
markup = '{% for i in array.items %}{% if i == 9999 %}{% break %}{% endif %}{{ i }}{% endfor %}' markup = '{% for i in array.items %}{% if i == 9999 %}{% break %}{% endif %}{{ i }}{% endfor %}'
expected = '12345' expected = '12345'
assert_template_result(expected, markup, assigns) assert_template_result(expected, markup, assigns)
end end
def test_for_with_continue def test_for_with_continue
assigns = {'array' => {'items' => [1,2,3,4,5]}} assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
markup = '{% for i in array.items %}{% continue %}{% endfor %}' markup = '{% for i in array.items %}{% continue %}{% endfor %}'
expected = "" expected = ""
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}' markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}'
expected = "12345" expected = "12345"
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}' markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}'
expected = "" expected = ""
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{% if i > 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}' markup = '{% for i in array.items %}{% if i > 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}'
expected = "123" expected = "123"
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
markup = '{% for i in array.items %}{% if i == 3 %}{% continue %}{% else %}{{ i }}{% endif %}{% endfor %}' markup = '{% for i in array.items %}{% if i == 3 %}{% continue %}{% else %}{{ i }}{% endif %}{% endfor %}'
expected = "1245" expected = "1245"
assert_template_result(expected,markup,assigns) assert_template_result(expected, markup, assigns)
# 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)
# test continue does nothing when unreached # test continue does nothing when unreached
assigns = {'array' => {'items' => [1,2,3,4,5]}} assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
markup = '{% for i in array.items %}{% if i == 9999 %}{% continue %}{% endif %}{{ i }}{% endfor %}' markup = '{% for i in array.items %}{% if i == 9999 %}{% continue %}{% endif %}{{ i }}{% endfor %}'
expected = '12345' expected = '12345'
assert_template_result(expected, markup, assigns) assert_template_result(expected, markup, assigns)
@@ -277,41 +276,41 @@ HERE
# the functionality for backwards compatibility # the functionality for backwards compatibility
assert_template_result('test string', assert_template_result('test string',
'{%for val in string%}{{val}}{%endfor%}', '{%for val in string%}{{val}}{%endfor%}',
'string' => "test string") 'string' => "test string")
assert_template_result('test string', assert_template_result('test string',
'{%for val in string limit:1%}{{val}}{%endfor%}', '{%for val in string limit:1%}{{val}}{%endfor%}',
'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
def test_blank_string_not_iterable def test_blank_string_not_iterable
@@ -327,7 +326,7 @@ HERE
def test_spacing_with_variable_naming_in_for_loop def test_spacing_with_variable_naming_in_for_loop
expected = '12345' expected = '12345'
template = '{% for item in items %}{{item}}{% endfor %}' template = '{% for item in items %}{{item}}{% endfor %}'
assigns = {'items' => [1,2,3,4,5]} assigns = { 'items' => [1, 2, 3, 4, 5] }
assert_template_result(expected, template, assigns) assert_template_result(expected, template, assigns)
end end
@@ -345,13 +344,13 @@ HERE
def load_slice(from, to) def load_slice(from, to)
@load_slice_called = true @load_slice_called = true
@data[(from..to-1)] @data[(from..to - 1)]
end end
end end
def test_iterate_with_each_when_no_limit_applied def test_iterate_with_each_when_no_limit_applied
loader = LoaderDrop.new([1,2,3,4,5]) loader = LoaderDrop.new([1, 2, 3, 4, 5])
assigns = {'items' => loader} assigns = { 'items' => loader }
expected = '12345' expected = '12345'
template = '{% for item in items %}{{item}}{% endfor %}' template = '{% for item in items %}{{item}}{% endfor %}'
assert_template_result(expected, template, assigns) assert_template_result(expected, template, assigns)
@@ -360,8 +359,8 @@ HERE
end end
def test_iterate_with_load_slice_when_limit_applied def test_iterate_with_load_slice_when_limit_applied
loader = LoaderDrop.new([1,2,3,4,5]) loader = LoaderDrop.new([1, 2, 3, 4, 5])
assigns = {'items' => loader} assigns = { 'items' => loader }
expected = '1' expected = '1'
template = '{% for item in items limit:1 %}{{item}}{% endfor %}' template = '{% for item in items limit:1 %}{{item}}{% endfor %}'
assert_template_result(expected, template, assigns) assert_template_result(expected, template, assigns)
@@ -370,8 +369,8 @@ HERE
end end
def test_iterate_with_load_slice_when_limit_and_offset_applied def test_iterate_with_load_slice_when_limit_and_offset_applied
loader = LoaderDrop.new([1,2,3,4,5]) loader = LoaderDrop.new([1, 2, 3, 4, 5])
assigns = {'items' => loader} assigns = { 'items' => loader }
expected = '34' expected = '34'
template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
assert_template_result(expected, template, assigns) assert_template_result(expected, template, assigns)
@@ -380,9 +379,9 @@ HERE
end end
def test_iterate_with_load_slice_returns_same_results_as_without def test_iterate_with_load_slice_returns_same_results_as_without
loader = LoaderDrop.new([1,2,3,4,5]) loader = LoaderDrop.new([1, 2, 3, 4, 5])
loader_assigns = {'items' => loader} loader_assigns = { 'items' => loader }
array_assigns = {'items' => [1,2,3,4,5]} array_assigns = { 'items' => [1, 2, 3, 4, 5] }
expected = '34' expected = '34'
template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
assert_template_result(expected, template, loader_assigns) assert_template_result(expected, template, loader_assigns)
+70 -72
View File
@@ -4,101 +4,100 @@ class IfElseTagTest < Minitest::Test
include Liquid include Liquid
def test_if def test_if
assert_template_result(' ',' {% if false %} this text should not go into the output {% endif %} ') assert_template_result(' ', ' {% if false %} this text should not go into the output {% endif %} ')
assert_template_result(' this text should go into the output ', assert_template_result(' this text should go into the output ',
' {% if true %} this text should go into the output {% endif %} ') ' {% if true %} this text should go into the output {% endif %} ')
assert_template_result(' you rock ?','{% if false %} you suck {% endif %} {% if true %} you rock {% endif %}?') assert_template_result(' you rock ?', '{% if false %} you suck {% endif %} {% if true %} you rock {% endif %}?')
end end
def test_literal_comparisons def test_literal_comparisons
assert_template_result(' NO ','{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}') assert_template_result(' NO ', '{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}')
assert_template_result(' YES ','{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}') assert_template_result(' YES ', '{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}')
end end
def test_if_else def test_if_else
assert_template_result(' YES ','{% if false %} NO {% else %} YES {% endif %}') assert_template_result(' YES ', '{% if false %} NO {% else %} YES {% endif %}')
assert_template_result(' YES ','{% if true %} YES {% else %} NO {% endif %}') assert_template_result(' YES ', '{% if true %} YES {% else %} NO {% endif %}')
assert_template_result(' YES ','{% if "foo" %} YES {% else %} NO {% endif %}') assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}')
end end
def test_if_boolean def test_if_boolean
assert_template_result(' YES ','{% if var %} YES {% endif %}', 'var' => true) assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true)
end end
def test_if_or def test_if_or
assert_template_result(' YES ','{% if a or b %} YES {% endif %}', 'a' => true, 'b' => true) assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => true)
assert_template_result(' YES ','{% if a or b %} YES {% endif %}', 'a' => true, 'b' => false) assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => false)
assert_template_result(' YES ','{% if a or b %} YES {% endif %}', 'a' => false, 'b' => true) assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => true)
assert_template_result('', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => false) assert_template_result('', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => false)
assert_template_result(' YES ','{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => true) assert_template_result(' YES ', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => true)
assert_template_result('', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => false) assert_template_result('', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => false)
end end
def test_if_or_with_operators def test_if_or_with_operators
assert_template_result(' YES ','{% if a == true or b == true %} YES {% endif %}', 'a' => true, 'b' => true) assert_template_result(' YES ', '{% if a == true or b == true %} YES {% endif %}', 'a' => true, 'b' => true)
assert_template_result(' YES ','{% if a == true or b == false %} YES {% endif %}', 'a' => true, 'b' => true) assert_template_result(' YES ', '{% if a == true or b == false %} YES {% endif %}', 'a' => true, 'b' => true)
assert_template_result('','{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true) assert_template_result('', '{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true)
end end
def test_comparison_of_strings_containing_and_or_or def test_comparison_of_strings_containing_and_or_or
awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar" awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar"
assigns = {'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true} assigns = { 'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true }
assert_template_result(' YES ',"{% if #{awful_markup} %} YES {% endif %}", assigns) assert_template_result(' YES ', "{% if #{awful_markup} %} YES {% endif %}", assigns)
end end
def test_comparison_of_expressions_starting_with_and_or_or def test_comparison_of_expressions_starting_with_and_or_or
assigns = {'order' => {'items_count' => 0}, 'android' => {'name' => 'Roy'}} assigns = { 'order' => { 'items_count' => 0 }, 'android' => { 'name' => 'Roy' } }
assert_template_result( "YES", assert_template_result("YES",
"{% if android.name == 'Roy' %}YES{% endif %}", "{% if android.name == 'Roy' %}YES{% endif %}",
assigns) assigns)
assert_template_result( "YES", assert_template_result("YES",
"{% if order.items_count == 0 %}YES{% endif %}", "{% if order.items_count == 0 %}YES{% endif %}",
assigns) assigns)
end end
def test_if_and def test_if_and
assert_template_result(' YES ','{% if true and true %} YES {% endif %}') assert_template_result(' YES ', '{% if true and true %} YES {% endif %}')
assert_template_result('','{% if false and true %} YES {% endif %}') assert_template_result('', '{% if false and true %} YES {% endif %}')
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
def test_if_from_variable def test_if_from_variable
assert_template_result('','{% if var %} NO {% endif %}', 'var' => false) assert_template_result('', '{% if var %} NO {% endif %}', 'var' => false)
assert_template_result('','{% if var %} NO {% endif %}', 'var' => nil) assert_template_result('', '{% if var %} NO {% endif %}', 'var' => nil)
assert_template_result('','{% if foo.bar %} NO {% endif %}', 'foo' => {'bar' => false}) assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => { 'bar' => false })
assert_template_result('','{% if foo.bar %} NO {% endif %}', 'foo' => {}) assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
assert_template_result('','{% if foo.bar %} NO {% endif %}', 'foo' => nil) assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => nil)
assert_template_result('','{% if foo.bar %} NO {% endif %}', 'foo' => true) assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => true)
assert_template_result(' YES ','{% if var %} YES {% endif %}', 'var' => "text") assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => "text")
assert_template_result(' YES ','{% if var %} YES {% endif %}', 'var' => true) assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true)
assert_template_result(' YES ','{% if var %} YES {% endif %}', 'var' => 1) assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => 1)
assert_template_result(' YES ','{% if var %} YES {% endif %}', 'var' => {}) assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => {})
assert_template_result(' YES ','{% if var %} YES {% endif %}', 'var' => []) assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => [])
assert_template_result(' YES ','{% if "foo" %} YES {% endif %}') assert_template_result(' YES ', '{% if "foo" %} YES {% endif %}')
assert_template_result(' YES ','{% if foo.bar %} YES {% endif %}', 'foo' => {'bar' => true}) assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => true })
assert_template_result(' YES ','{% if foo.bar %} YES {% endif %}', 'foo' => {'bar' => "text"}) assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => "text" })
assert_template_result(' YES ','{% if foo.bar %} YES {% endif %}', 'foo' => {'bar' => 1 }) assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => 1 })
assert_template_result(' YES ','{% if foo.bar %} YES {% endif %}', 'foo' => {'bar' => {} }) assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => {} })
assert_template_result(' YES ','{% if foo.bar %} YES {% endif %}', 'foo' => {'bar' => [] }) assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => [] })
assert_template_result(' YES ','{% if var %} NO {% else %} YES {% endif %}', 'var' => false) assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => false)
assert_template_result(' YES ','{% if var %} NO {% else %} YES {% endif %}', 'var' => nil) assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => nil)
assert_template_result(' YES ','{% if var %} YES {% else %} NO {% endif %}', 'var' => true) assert_template_result(' YES ', '{% if var %} YES {% else %} NO {% endif %}', 'var' => true)
assert_template_result(' YES ','{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text") assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text")
assert_template_result(' YES ','{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {'bar' => false}) assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'bar' => false })
assert_template_result(' YES ','{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => {'bar' => true}) assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => true })
assert_template_result(' YES ','{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => {'bar' => "text"}) assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => "text" })
assert_template_result(' YES ','{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {'notbar' => true}) assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'notbar' => true })
assert_template_result(' YES ','{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {}) assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {})
assert_template_result(' YES ','{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => {'bar' => true}) assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => { 'bar' => true })
end end
def test_nested_if def test_nested_if
@@ -110,31 +109,30 @@ 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
assert_template_result('','{% if null < 10 %} NO {% endif %}') assert_template_result('', '{% if null < 10 %} NO {% endif %}')
assert_template_result('','{% if null <= 10 %} NO {% endif %}') assert_template_result('', '{% if null <= 10 %} NO {% endif %}')
assert_template_result('','{% if null >= 10 %} NO {% endif %}') assert_template_result('', '{% if null >= 10 %} NO {% endif %}')
assert_template_result('','{% if null > 10 %} NO {% endif %}') assert_template_result('', '{% if null > 10 %} NO {% endif %}')
assert_template_result('','{% if 10 < null %} NO {% endif %}') assert_template_result('', '{% if 10 < null %} NO {% endif %}')
assert_template_result('','{% if 10 <= null %} NO {% endif %}') assert_template_result('', '{% if 10 <= null %} NO {% endif %}')
assert_template_result('','{% if 10 >= null %} NO {% endif %}') assert_template_result('', '{% if 10 >= null %} NO {% endif %}')
assert_template_result('','{% if 10 > null %} NO {% endif %}') assert_template_result('', '{% if 10 > null %} NO {% endif %}')
end end
def test_else_if def test_else_if
assert_template_result('0','{% if 0 == 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}') assert_template_result('0', '{% if 0 == 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}')
assert_template_result('1','{% if 0 != 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}') assert_template_result('1', '{% if 0 != 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}')
assert_template_result('2','{% if 0 != 0 %}0{% elsif 1 != 1%}1{% else %}2{% endif %}') assert_template_result('2', '{% if 0 != 0 %}0{% elsif 1 != 1%}1{% else %}2{% endif %}')
assert_template_result('elsif','{% if false %}if{% elsif true %}elsif{% endif %}') assert_template_result('elsif', '{% if false %}if{% elsif true %}elsif{% endif %}')
end end
def test_syntax_error_no_variable def test_syntax_error_no_variable
assert_raises(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}')} assert_raises(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}') }
end end
def test_syntax_error_no_expression def test_syntax_error_no_expression
@@ -156,7 +154,7 @@ class IfElseTagTest < Minitest::Test
Condition.operators['contains'] = :[] Condition.operators['contains'] = :[]
assert_template_result('yes', assert_template_result('yes',
%({% if 'gnomeslab-and-or-liquid' contains 'gnomeslab-and-or-liquid' %}yes{% endif %})) %({% if 'gnomeslab-and-or-liquid' contains 'gnomeslab-and-or-liquid' %}yes{% endif %}))
ensure ensure
Condition.operators['contains'] = original_op Condition.operators['contains'] = original_op
end end
+13 -16
View File
@@ -77,23 +77,22 @@ class IncludeTagTest < Minitest::Test
def test_include_tag_looks_for_file_system_in_registers_first def test_include_tag_looks_for_file_system_in_registers_first
assert_equal 'from OtherFileSystem', assert_equal 'from OtherFileSystem',
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' } ]
end end
def test_include_tag_with_default_name def test_include_tag_with_default_name
assert_template_result "Product: Draft 151cm ", assert_template_result "Product: Draft 151cm ",
"{% include 'product' %}", "product" => {'title' => 'Draft 151cm'} "{% include 'product' %}", "product" => { 'title' => 'Draft 151cm' }
end end
def test_include_tag_for def test_include_tag_for
assert_template_result "Product: Draft 151cm Product: Element 155cm ", assert_template_result "Product: Draft 151cm Product: Element 155cm ",
"{% include 'product' for products %}", "products" => [ {'title' => 'Draft 151cm'}, {'title' => 'Element 155cm'} ] "{% include 'product' for products %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ]
end end
def test_include_tag_with_local_variables def test_include_tag_with_local_variables
@@ -108,7 +107,7 @@ class IncludeTagTest < Minitest::Test
def test_include_tag_with_multiple_local_variables_from_context def test_include_tag_with_multiple_local_variables_from_context
assert_template_result "Locale: test123 test321", assert_template_result "Locale: test123 test321",
"{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}", "{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}",
'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321'} 'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321' }
end end
def test_included_templates_assigns_variables def test_included_templates_assigns_variables
@@ -123,14 +122,13 @@ class IncludeTagTest < Minitest::Test
def test_nested_include_with_variable def test_nested_include_with_variable
assert_template_result "Product: Draft 151cm details ", assert_template_result "Product: Draft 151cm details ",
"{% include 'nested_product_template' with product %}", "product" => {"title" => 'Draft 151cm'} "{% include 'nested_product_template' with product %}", "product" => { "title" => 'Draft 151cm' }
assert_template_result "Product: Draft 151cm details Product: Element 155cm details ", assert_template_result "Product: Draft 151cm details Product: Element 155cm details ",
"{% include 'nested_product_template' for products %}", "products" => [{"title" => 'Draft 151cm'}, {"title" => 'Element 155cm'}] "{% include 'nested_product_template' for products %}", "products" => [{ "title" => 'Draft 151cm' }, { "title" => 'Element 155cm' }]
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
@@ -150,24 +147,24 @@ class IncludeTagTest < Minitest::Test
assert_template_result "Test321", "{% include template %}", "template" => 'Test321' assert_template_result "Test321", "{% include template %}", "template" => 'Test321'
assert_template_result "Product: Draft 151cm ", "{% include template for product %}", assert_template_result "Product: Draft 151cm ", "{% include template for product %}",
"template" => 'product', 'product' => { 'title' => 'Draft 151cm'} "template" => 'product', 'product' => { 'title' => 'Draft 151cm' }
end end
def test_include_tag_caches_second_read_of_same_partial def test_include_tag_caches_second_read_of_same_partial
file_system = CountingFileSystem.new file_system = CountingFileSystem.new
assert_equal 'from CountingFileSystemfrom CountingFileSystem', assert_equal 'from CountingFileSystemfrom CountingFileSystem',
Template.parse("{% include 'pick_a_source' %}{% include 'pick_a_source' %}").render!({}, :registers => {:file_system => file_system}) Template.parse("{% include 'pick_a_source' %}{% include 'pick_a_source' %}").render!({}, :registers => { :file_system => file_system })
assert_equal 1, file_system.count assert_equal 1, file_system.count
end end
def test_include_tag_doesnt_cache_partials_across_renders def test_include_tag_doesnt_cache_partials_across_renders
file_system = CountingFileSystem.new file_system = CountingFileSystem.new
assert_equal 'from CountingFileSystem', assert_equal 'from CountingFileSystem',
Template.parse("{% include 'pick_a_source' %}").render!({}, :registers => {:file_system => file_system}) Template.parse("{% include 'pick_a_source' %}").render!({}, :registers => { :file_system => file_system })
assert_equal 1, file_system.count assert_equal 1, file_system.count
assert_equal 'from CountingFileSystem', assert_equal 'from CountingFileSystem',
Template.parse("{% include 'pick_a_source' %}").render!({}, :registers => {:file_system => file_system}) Template.parse("{% include 'pick_a_source' %}").render!({}, :registers => { :file_system => file_system })
assert_equal 2, file_system.count assert_equal 2, file_system.count
end end
@@ -223,8 +220,8 @@ class IncludeTagTest < Minitest::Test
def test_including_via_variable_value def test_including_via_variable_value
assert_template_result "from TestFileSystem", "{% assign page = 'pick_a_source' %}{% include page %}" assert_template_result "from TestFileSystem", "{% assign page = 'pick_a_source' %}{% include page %}"
assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page %}", "product" => {'title' => 'Draft 151cm'} assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page %}", "product" => { 'title' => 'Draft 151cm' }
assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page for foo %}", "foo" => {'title' => 'Draft 151cm'} assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page for foo %}", "foo" => { 'title' => 'Draft 151cm' }
end end
end # IncludeTagTest end # IncludeTagTest
+10 -10
View File
@@ -4,21 +4,21 @@ class IncrementTagTest < Minitest::Test
include Liquid include Liquid
def test_inc def test_inc
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
def test_dec def test_dec
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
end end
+1 -1
View File
@@ -5,7 +5,7 @@ class RawTagTest < Minitest::Test
def test_tag_in_raw def test_tag_in_raw
assert_template_result '{% comment %} test {% endcomment %}', assert_template_result '{% comment %} test {% endcomment %}',
'{% raw %}{% comment %} test {% endcomment %}{% endraw %}' '{% raw %}{% comment %} test {% endcomment %}{% endraw %}'
end end
def test_output_in_raw def test_output_in_raw
+116 -117
View File
@@ -5,116 +5,116 @@ class StandardTagTest < Minitest::Test
def test_no_transform def test_no_transform
assert_template_result('this text should come out of the template without change...', assert_template_result('this text should come out of the template without change...',
'this text should come out of the template without change...') 'this text should come out of the template without change...')
assert_template_result('blah','blah') assert_template_result('blah', 'blah')
assert_template_result('<blah>','<blah>') assert_template_result('<blah>', '<blah>')
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 %}')
assert_template_result('','{% comment %}{%endcomment%}') assert_template_result('', '{% comment %}{%endcomment%}')
assert_template_result('','{% comment %}{% endcomment %}') assert_template_result('', '{% comment %}{% endcomment %}')
assert_template_result('','{%comment%}comment{%endcomment%}') assert_template_result('', '{%comment%}comment{%endcomment%}')
assert_template_result('','{% comment %}comment{% endcomment %}') assert_template_result('', '{% comment %}comment{% endcomment %}')
assert_template_result('','{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}') assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
assert_template_result('','{%comment%}{%blabla%}{%endcomment%}') assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}')
assert_template_result('','{% comment %}{% blabla %}{% endcomment %}') assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}')
assert_template_result('','{%comment%}{% endif %}{%endcomment%}') assert_template_result('', '{%comment%}{% endif %}{%endcomment%}')
assert_template_result('','{% comment %}{% endwhatever %}{% endcomment %}') assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}')
assert_template_result('','{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}') assert_template_result('', '{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
assert_template_result('foobar','foo{%comment%}comment{%endcomment%}bar') assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar')
assert_template_result('foobar','foo{% comment %}comment{% endcomment %}bar') assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar')
assert_template_result('foobar','foo{%comment%} comment {%endcomment%}bar') assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar')
assert_template_result('foobar','foo{% comment %} comment {% endcomment %}bar') assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar')
assert_template_result('foo bar','foo {%comment%} {%endcomment%} bar') assert_template_result('foo bar', 'foo {%comment%} {%endcomment%} bar')
assert_template_result('foo bar','foo {%comment%}comment{%endcomment%} bar') assert_template_result('foo bar', 'foo {%comment%}comment{%endcomment%} bar')
assert_template_result('foo bar','foo {%comment%} comment {%endcomment%} bar') assert_template_result('foo bar', 'foo {%comment%} comment {%endcomment%} bar')
assert_template_result('foobar','foo{%comment%} assert_template_result('foobar', 'foo{%comment%}
{%endcomment%}bar') {%endcomment%}bar')
end end
def test_hyphenated_assign def test_hyphenated_assign
assigns = {'a-b' => '1' } assigns = { 'a-b' => '1' }
assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns) assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
end end
def test_assign_with_colon_and_spaces def test_assign_with_colon_and_spaces
assigns = {'var' => {'a:b c' => {'paged' => '1' }}} assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } }
assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns) assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns)
end end
def test_capture def test_capture
assigns = {'var' => 'content' } assigns = { 'var' => 'content' }
assert_template_result('content foo content foo ', assert_template_result('content foo content foo ',
'{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
assigns) assigns)
end end
def test_capture_detects_bad_syntax def test_capture_detects_bad_syntax
assert_raises(SyntaxError) do assert_raises(SyntaxError) do
assert_template_result('content foo content foo ', assert_template_result('content foo content foo ',
'{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
{'var' => 'content' }) { 'var' => 'content' })
end end
end end
def test_case def test_case
assigns = {'condition' => 2 } assigns = { 'condition' => 2 }
assert_template_result(' its 2 ', assert_template_result(' its 2 ',
'{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
assigns) assigns)
assigns = {'condition' => 1 } assigns = { 'condition' => 1 }
assert_template_result(' its 1 ', assert_template_result(' its 1 ',
'{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
assigns) assigns)
assigns = {'condition' => 3 } assigns = { 'condition' => 3 }
assert_template_result('', assert_template_result('',
'{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
assigns) assigns)
assigns = {'condition' => "string here" } assigns = { 'condition' => "string here" }
assert_template_result(' hit ', assert_template_result(' hit ',
'{% case condition %}{% when "string here" %} hit {% endcase %}', '{% case condition %}{% when "string here" %} hit {% endcase %}',
assigns) assigns)
assigns = {'condition' => "bad string here" } assigns = { 'condition' => "bad string here" }
assert_template_result('', assert_template_result('',
'{% case condition %}{% when "string here" %} hit {% endcase %}',\ '{% case condition %}{% when "string here" %} hit {% endcase %}',\
assigns) assigns)
end end
def test_case_with_else def test_case_with_else
assigns = {'condition' => 5 } assigns = { 'condition' => 5 }
assert_template_result(' hit ', assert_template_result(' hit ',
'{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
assigns) assigns)
assigns = {'condition' => 6 } assigns = { 'condition' => 6 }
assert_template_result(' else ', assert_template_result(' else ',
'{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
assigns) assigns)
assigns = {'condition' => 6 } assigns = { 'condition' => 6 }
assert_template_result(' else ', assert_template_result(' else ',
'{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}', '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
assigns) assigns)
end end
def test_case_on_size def test_case_on_size
@@ -128,87 +128,87 @@ class StandardTagTest < Minitest::Test
def test_case_on_size_with_else def test_case_on_size_with_else
assert_template_result('else', assert_template_result('else',
'{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
'a' => []) 'a' => [])
assert_template_result('1', assert_template_result('1',
'{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
'a' => [1]) 'a' => [1])
assert_template_result('2', assert_template_result('2',
'{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
'a' => [1, 1]) 'a' => [1, 1])
assert_template_result('else', assert_template_result('else',
'{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
'a' => [1, 1, 1]) 'a' => [1, 1, 1])
assert_template_result('else', assert_template_result('else',
'{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
'a' => [1, 1, 1, 1]) 'a' => [1, 1, 1, 1])
assert_template_result('else', assert_template_result('else',
'{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
'a' => [1, 1, 1, 1, 1]) 'a' => [1, 1, 1, 1, 1])
end end
def test_case_on_length_with_else def test_case_on_length_with_else
assert_template_result('else', assert_template_result('else',
'{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
{}) {})
assert_template_result('false', assert_template_result('false',
'{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
{}) {})
assert_template_result('true', assert_template_result('true',
'{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
{}) {})
assert_template_result('else', assert_template_result('else',
'{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
{}) {})
end end
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' })
assert_equal "womenswear", template.render!("collection" => {'handle' => 'x'}) assert_equal "womenswear", template.render!("collection" => { 'handle' => 'x' })
assert_equal "womenswear", template.render!("collection" => {'handle' => 'y'}) assert_equal "womenswear", template.render!("collection" => { 'handle' => 'y' })
assert_equal "womenswear", template.render!("collection" => {'handle' => 'z'}) assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' })
end end
def test_case_when_or def test_case_when_or
code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 2 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
assert_template_result(' its 4 ', code, {'condition' => 4 }) assert_template_result(' its 4 ', code, { 'condition' => 4 })
assert_template_result('', code, {'condition' => 5 }) assert_template_result('', code, { 'condition' => 5 })
code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 'string' }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
assert_template_result('', code, {'condition' => 'something else' }) assert_template_result('', code, { 'condition' => 'something else' })
end end
def test_case_when_comma def test_case_when_comma
code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 2 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
assert_template_result(' its 4 ', code, {'condition' => 4 }) assert_template_result(' its 4 ', code, { 'condition' => 4 })
assert_template_result('', code, {'condition' => 5 }) assert_template_result('', code, { 'condition' => 5 })
code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 'string' }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil }) assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
assert_template_result('', code, {'condition' => 'something else' }) assert_template_result('', code, { 'condition' => 'something else' })
end end
def test_assign def test_assign
@@ -236,15 +236,14 @@ 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
assert_template_result('one','{%cycle "one", "two"%}') assert_template_result('one', '{%cycle "one", "two"%}')
assert_template_result('one two','{%cycle "one", "two"%} {%cycle "one", "two"%}') assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}')
assert_template_result(' two','{%cycle "", "two"%} {%cycle "", "two"%}') assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}')
assert_template_result('one two one','{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}') assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
assert_template_result('text-align: left text-align: right', assert_template_result('text-align: left text-align: right',
'{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}') '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}')
@@ -261,18 +260,18 @@ class StandardTagTest < Minitest::Test
end end
def test_multiple_named_cycles_with_names_from_context def test_multiple_named_cycles_with_names_from_context
assigns = {"var1" => 1, "var2" => 2 } assigns = { "var1" => 1, "var2" => 2 }
assert_template_result('one one two two one one', assert_template_result('one one two two one one',
'{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns) '{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns)
end end
def test_size_of_array def test_size_of_array
assigns = {"array" => [1,2,3,4]} assigns = { "array" => [1, 2, 3, 4] }
assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns) assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns)
end end
def test_size_of_hash def test_size_of_hash
assigns = {"hash" => {:a => 1, :b => 2, :c=> 3, :d => 4}} assigns = { "hash" => { :a => 1, :b => 2, :c => 3, :d => 4 } }
assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns) assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns)
end end
@@ -284,11 +283,11 @@ class StandardTagTest < Minitest::Test
end end
def test_ifchanged def test_ifchanged
assigns = {'array' => [ 1, 1, 2, 2, 3, 3] } assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] }
assert_template_result('123','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns) assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
assigns = {'array' => [ 1, 1, 1, 1] } assigns = { 'array' => [ 1, 1, 1, 1] }
assert_template_result('1','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns) assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
end end
def test_multiline_tag def test_multiline_tag
+3 -5
View File
@@ -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,18 +71,17 @@ 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!'
end end
#def test_is_nil # def test_is_nil
# text = %| {% if var != nil %} true {% else %} false {% end %} | # text = %| {% if var != nil %} true {% else %} false {% end %} |
# @template.assigns = { 'var' => 'hello there!'} # @template.assigns = { 'var' => 'hello there!'}
# expected = %| true | # expected = %| true |
# assert_equal expected, @template.parse(text) # assert_equal expected, @template.parse(text)
#end # end
def test_is_collection_empty def test_is_collection_empty
text = ' {% if array == empty %} true {% else %} false {% endif %} ' text = ' {% if array == empty %} true {% else %} false {% endif %} '
@@ -92,7 +90,7 @@ class StatementsTest < Minitest::Test
def test_is_not_collection_empty def test_is_not_collection_empty
text = ' {% if array == empty %} true {% else %} false {% endif %} ' text = ' {% if array == empty %} true {% else %} false {% endif %} '
assert_template_result ' false ', text, 'array' => [1,2,3] assert_template_result ' false ', text, 'array' => [1, 2, 3]
end end
def test_nil def test_nil
+16 -19
View File
@@ -16,48 +16,45 @@ 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])
assert_template_result("<tr class=\"row1\">\n</tr>\n", assert_template_result("<tr class=\"row1\">\n</tr>\n",
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
'numbers' => []) 'numbers' => [])
end end
def test_table_row_with_different_cols def test_table_row_with_different_cols
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
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n", assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n",
'{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}', '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
'numbers' => [1,2,3,4,5,6]) 'numbers' => [1, 2, 3, 4, 5, 6])
end end
def test_quoted_fragment def test_quoted_fragment
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] })
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
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' => ArrayDrop.new([1,2,3,4,5,6])) 'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6]))
end end
def test_offset_and_limit def test_offset_and_limit
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 offset:1 limit:6%} {{n}} {% endtablerow %}', '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
'numbers' => [0,1,2,3,4,5,6,7]) 'numbers' => [0, 1, 2, 3, 4, 5, 6, 7])
end end
end end
@@ -4,16 +4,16 @@ class UnlessElseTagTest < Minitest::Test
include Liquid include Liquid
def test_unless def test_unless
assert_template_result(' ',' {% unless true %} this text should not go into the output {% endunless %} ') assert_template_result(' ', ' {% unless true %} this text should not go into the output {% endunless %} ')
assert_template_result(' this text should go into the output ', assert_template_result(' this text should go into the output ',
' {% unless false %} this text should go into the output {% endunless %} ') ' {% unless false %} this text should go into the output {% endunless %} ')
assert_template_result(' you rock ?','{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?') assert_template_result(' you rock ?', '{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
end end
def test_unless_else def test_unless_else
assert_template_result(' YES ','{% unless true %} NO {% else %} YES {% endunless %}') assert_template_result(' YES ', '{% unless true %} NO {% else %} YES {% endunless %}')
assert_template_result(' YES ','{% unless false %} YES {% else %} NO {% endunless %}') assert_template_result(' YES ', '{% unless false %} YES {% else %} NO {% endunless %}')
assert_template_result(' YES ','{% unless "foo" %} NO {% else %} YES {% endunless %}') assert_template_result(' YES ', '{% unless "foo" %} NO {% else %} YES {% endunless %}')
end end
def test_unless_in_loop def test_unless_in_loop
+20 -20
View File
@@ -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
@@ -191,7 +191,7 @@ class TemplateTest < Minitest::Test
end end
def test_render_bang_force_rethrow_errors_on_passed_context def test_render_bang_force_rethrow_errors_on_passed_context
context = Context.new({'drop' => ErroneousDrop.new}) context = Context.new({ 'drop' => ErroneousDrop.new })
t = Template.new.parse('{{ drop.bad_method }}') t = Template.new.parse('{{ drop.bad_method }}')
e = assert_raises RuntimeError do e = assert_raises RuntimeError do
+11 -11
View File
@@ -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,19 +14,19 @@ 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
def test_false_renders_as_false def test_false_renders_as_false
@@ -40,23 +40,23 @@ 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')
assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian') assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian')
assert_equal 'Goodbye Brian', template.render!('name' => 'Brian') assert_equal 'Goodbye Brian', template.render!('name' => 'Brian')
assert_equal({'greeting'=>'Goodbye'}, template.assigns) assert_equal({ 'greeting' => 'Goodbye' }, template.assigns)
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,8 +65,8 @@ 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)
assigns.delete('test') assigns.delete('test')
+6 -5
View File
@@ -34,7 +34,7 @@ class BlockUnitTest < Minitest::Test
template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ") template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ")
assert_equal 7, template.root.nodelist.size assert_equal 7, template.root.nodelist.size
assert_equal [String, Variable, String, Variable, String, Variable, String], assert_equal [String, Variable, String, Variable, String, Variable, String],
block_types(template.root.nodelist) block_types(template.root.nodelist)
end end
def test_with_block def test_with_block
@@ -45,11 +45,12 @@ class BlockUnitTest < Minitest::Test
def test_with_custom_tag def test_with_custom_tag
Liquid::Template.register_tag("testtag", Block) Liquid::Template.register_tag("testtag", Block)
assert Liquid::Template.parse( "{% testtag %} {% endtesttag %}") assert Liquid::Template.parse("{% testtag %} {% endtesttag %}")
end end
private private
def block_types(nodelist)
nodelist.collect { |node| node.class } def block_types(nodelist)
end nodelist.collect(&:class)
end
end # VariableTest end # VariableTest
+21 -20
View File
@@ -62,15 +62,15 @@ class ConditionUnitTest < Minitest::Test
def test_contains_works_on_arrays def test_contains_works_on_arrays
@context = Liquid::Context.new @context = Liquid::Context.new
@context['array'] = [1,2,3,4,5] @context['array'] = [1, 2, 3, 4, 5]
array_expr = VariableLookup.new("array") array_expr = VariableLookup.new("array")
assert_evalutes_false array_expr, 'contains', 0 assert_evalutes_false array_expr, 'contains', 0
assert_evalutes_true array_expr, 'contains', 1 assert_evalutes_true array_expr, 'contains', 1
assert_evalutes_true array_expr, 'contains', 2 assert_evalutes_true array_expr, 'contains', 2
assert_evalutes_true array_expr, 'contains', 3 assert_evalutes_true array_expr, 'contains', 3
assert_evalutes_true array_expr, 'contains', 4 assert_evalutes_true array_expr, 'contains', 4
assert_evalutes_true array_expr, 'contains', 5 assert_evalutes_true array_expr, 'contains', 5
assert_evalutes_false array_expr, 'contains', 6 assert_evalutes_false array_expr, 'contains', 6
assert_evalutes_false array_expr, 'contains', "1" assert_evalutes_false array_expr, 'contains', "1"
end end
@@ -114,9 +114,9 @@ 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'
ensure ensure
Condition.operators.delete 'starts_with' Condition.operators.delete 'starts_with'
@@ -130,20 +130,21 @@ class ConditionUnitTest < Minitest::Test
end end
private private
def assert_evalutes_true(left, op, right)
assert Condition.new(left, op, right).evaluate(@context || Liquid::Context.new),
"Evaluated false: #{left} #{op} #{right}"
end
def assert_evalutes_false(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 true: #{left} #{op} #{right}" "Evaluated false: #{left} #{op} #{right}"
end end
def assert_evaluates_argument_error(left, op, right) def assert_evalutes_false(left, op, right)
assert_raises(Liquid::ArgumentError) do assert !Condition.new(left, op, right).evaluate(@context || Liquid::Context.new),
Condition.new(left, op, right).evaluate(@context || Liquid::Context.new) "Evaluated true: #{left} #{op} #{right}"
end end
def assert_evaluates_argument_error(left, op, right)
assert_raises(Liquid::ArgumentError) do
Condition.new(left, op, right).evaluate(@context || Liquid::Context.new)
end end
end
end # ConditionTest end # ConditionTest
+35 -46
View File
@@ -122,30 +122,25 @@ 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']
@context['numbers'] = {1 => 1,2 => 2,3 => 3,4 => 4} @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4 }
assert_equal 4, @context['numbers.size'] assert_equal 4, @context['numbers.size']
@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!'
@@ -196,7 +189,7 @@ class ContextUnitTest < Minitest::Test
end end
def test_hierachical_data def test_hierachical_data
@context['hash'] = {"name" => 'tobi'} @context['hash'] = { "name" => 'tobi' }
assert_equal 'tobi', @context['hash.name'] assert_equal 'tobi', @context['hash.name']
assert_equal 'tobi', @context['hash["name"]'] assert_equal 'tobi', @context['hash["name"]']
end end
@@ -225,7 +218,7 @@ class ContextUnitTest < Minitest::Test
end end
def test_array_notation def test_array_notation
@context['test'] = [1,2,3,4,5] @context['test'] = [1, 2, 3, 4, 5]
assert_equal 1, @context['test[0]'] assert_equal 1, @context['test[0]']
assert_equal 2, @context['test[1]'] assert_equal 2, @context['test[1]']
@@ -235,21 +228,21 @@ class ContextUnitTest < Minitest::Test
end end
def test_recoursive_array_notation def test_recoursive_array_notation
@context['test'] = {'test' => [1,2,3,4,5]} @context['test'] = { 'test' => [1, 2, 3, 4, 5] }
assert_equal 1, @context['test.test[0]'] assert_equal 1, @context['test.test[0]']
@context['test'] = [{'test' => 'worked'}] @context['test'] = [{ 'test' => 'worked' }]
assert_equal 'worked', @context['test[0].test'] assert_equal 'worked', @context['test[0].test']
end end
def test_hash_to_array_transition def test_hash_to_array_transition
@context['colors'] = { @context['colors'] = {
'Blue' => ['003366','336699', '6699CC', '99CCFF'], 'Blue' => ['003366', '336699', '6699CC', '99CCFF'],
'Green' => ['003300','336633', '669966', '99CC99'], 'Green' => ['003300', '336633', '669966', '99CC99'],
'Yellow' => ['CC9900','FFCC00', 'FFFF99', 'FFFFCC'], 'Yellow' => ['CC9900', 'FFCC00', 'FFFF99', 'FFFFCC'],
'Red' => ['660000','993333', 'CC6666', 'FF9999'] 'Red' => ['660000', '993333', 'CC6666', 'FF9999']
} }
assert_equal '003366', @context['colors.Blue[0]'] assert_equal '003366', @context['colors.Blue[0]']
@@ -257,12 +250,12 @@ class ContextUnitTest < Minitest::Test
end end
def test_try_first def test_try_first
@context['test'] = [1,2,3,4,5] @context['test'] = [1, 2, 3, 4, 5]
assert_equal 1, @context['test.first'] assert_equal 1, @context['test.first']
assert_equal 5, @context['test.last'] assert_equal 5, @context['test.last']
@context['test'] = {'test' => [1,2,3,4,5]} @context['test'] = { 'test' => [1, 2, 3, 4, 5] }
assert_equal 1, @context['test.test.first'] assert_equal 1, @context['test.test.first']
assert_equal 5, @context['test.test.last'] assert_equal 5, @context['test.test.last']
@@ -273,8 +266,8 @@ class ContextUnitTest < Minitest::Test
end end
def test_access_hashes_with_hash_notation def test_access_hashes_with_hash_notation
@context['products'] = {'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
@context['product'] = {'variants' => [ {'title' => 'draft151cm'}, {'title' => 'element151cm'} ]} @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] }
assert_equal 5, @context['products["count"]'] assert_equal 5, @context['products["count"]']
assert_equal 'deepsnow', @context['products["tags"][0]'] assert_equal 'deepsnow', @context['products["tags"][0]']
@@ -294,18 +287,17 @@ 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'] }
assert_equal 'deepsnow', @context['products[var].first'] assert_equal 'deepsnow', @context['products[var].first']
assert_equal 'freestyle', @context['products[nested.var].last'] assert_equal 'freestyle', @context['products[nested.var].last']
end end
def test_hash_notation_only_for_hash_access def test_hash_notation_only_for_hash_access
@context['array'] = [1,2,3,4,5] @context['array'] = [1, 2, 3, 4, 5]
@context['hash'] = {'first' => 'Hello'} @context['hash'] = { 'first' => 'Hello' }
assert_equal 1, @context['array.first'] assert_equal 1, @context['array.first']
assert_equal nil, @context['array["first"]'] assert_equal nil, @context['array["first"]']
@@ -313,66 +305,64 @@ 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
@context.merge( "cents" => HundredCentes.new ) @context.merge("cents" => HundredCentes.new)
assert_equal 100, @context['cents'] assert_equal 100, @context['cents']
end end
def test_nested_cents def test_nested_cents
@context.merge( "cents" => { 'amount' => HundredCentes.new} ) @context.merge("cents" => { 'amount' => HundredCentes.new })
assert_equal 100, @context['cents.amount'] assert_equal 100, @context['cents.amount']
@context.merge( "cents" => { 'cents' => { 'amount' => HundredCentes.new} } ) @context.merge("cents" => { 'cents' => { 'amount' => HundredCentes.new } })
assert_equal 100, @context['cents.cents.amount'] assert_equal 100, @context['cents.cents.amount']
end end
def test_cents_through_drop def test_cents_through_drop
@context.merge( "cents" => CentsDrop.new ) @context.merge("cents" => CentsDrop.new)
assert_equal 100, @context['cents.amount'] assert_equal 100, @context['cents.amount']
end end
def test_nested_cents_through_drop def test_nested_cents_through_drop
@context.merge( "vars" => {"cents" => CentsDrop.new} ) @context.merge("vars" => { "cents" => CentsDrop.new })
assert_equal 100, @context['vars.cents.amount'] assert_equal 100, @context['vars.cents.amount']
end end
def test_drop_methods_with_question_marks def test_drop_methods_with_question_marks
@context.merge( "cents" => CentsDrop.new ) @context.merge("cents" => CentsDrop.new)
assert @context['cents.non_zero?'] assert @context['cents.non_zero?']
end end
def test_context_from_within_drop def test_context_from_within_drop
@context.merge( "test" => '123', "vars" => ContextSensitiveDrop.new ) @context.merge("test" => '123', "vars" => ContextSensitiveDrop.new)
assert_equal '123', @context['vars.test'] assert_equal '123', @context['vars.test']
end end
def test_nested_context_from_within_drop def test_nested_context_from_within_drop
@context.merge( "test" => '123', "vars" => {"local" => ContextSensitiveDrop.new } ) @context.merge("test" => '123', "vars" => { "local" => ContextSensitiveDrop.new })
assert_equal '123', @context['vars.local.test'] assert_equal '123', @context['vars.local.test']
end end
def test_ranges def test_ranges
@context.merge( "test" => '5' ) @context.merge("test" => '5')
assert_equal (1..5), @context['(1..5)'] assert_equal (1..5), @context['(1..5)']
assert_equal (1..5), @context['(1..test)'] assert_equal (1..5), @context['(1..test)']
assert_equal (5..5), @context['(test..test)'] assert_equal (5..5), @context['(test..test)']
end end
def test_cents_through_drop_nestedly def test_cents_through_drop_nestedly
@context.merge( "cents" => {"cents" => CentsDrop.new} ) @context.merge("cents" => { "cents" => CentsDrop.new })
assert_equal 100, @context['cents.cents.amount'] assert_equal 100, @context['cents.cents.amount']
@context.merge( "cents" => { "cents" => {"cents" => CentsDrop.new}} ) @context.merge("cents" => { "cents" => { "cents" => CentsDrop.new } })
assert_equal 100, @context['cents.cents.cents.amount'] assert_equal 100, @context['cents.cents.cents.amount']
end end
@@ -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
@@ -411,7 +401,7 @@ class ContextUnitTest < Minitest::Test
end end
def test_array_containing_lambda_as_variable def test_array_containing_lambda_as_variable
@context['dynamic'] = [1,2, proc { 'Hello' } ,4,5] @context['dynamic'] = [1, 2, proc { 'Hello' }, 4, 5]
assert_equal 'Hello', @context['dynamic[2]'] assert_equal 'Hello', @context['dynamic[2]']
end end
@@ -437,7 +427,7 @@ class ContextUnitTest < Minitest::Test
end end
def test_lambda_in_array_is_called_once def test_lambda_in_array_is_called_once
@context['callcount'] = [1,2, proc { @global ||= 0; @global += 1; @global.to_s } ,4,5] @context['callcount'] = [1, 2, proc { @global ||= 0; @global += 1; @global.to_s }, 4, 5]
assert_equal '1', @context['callcount[2]'] assert_equal '1', @context['callcount[2]']
assert_equal '1', @context['callcount[2]'] assert_equal '1', @context['callcount[2]']
@@ -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
+2 -2
View File
@@ -11,7 +11,7 @@ class FileSystemUnitTest < Minitest::Test
def test_local def test_local
file_system = Liquid::LocalFileSystem.new("/some/path") file_system = Liquid::LocalFileSystem.new("/some/path")
assert_equal "/some/path/_mypartial.liquid" , file_system.full_path("mypartial") assert_equal "/some/path/_mypartial.liquid", file_system.full_path("mypartial")
assert_equal "/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial") assert_equal "/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial")
assert_raises(FileSystemError) do assert_raises(FileSystemError) do
@@ -29,7 +29,7 @@ class FileSystemUnitTest < Minitest::Test
def test_custom_template_filename_patterns def test_custom_template_filename_patterns
file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html") file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
assert_equal "/some/path/mypartial.html" , file_system.full_path("mypartial") assert_equal "/some/path/mypartial.html", file_system.full_path("mypartial")
assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial") assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial")
end end
end # FileSystemTest end # FileSystemTest
+6 -6
View File
@@ -4,23 +4,23 @@ 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
tokens = Lexer.new('hi 50').tokenize tokens = Lexer.new('hi 50').tokenize
assert_equal [[:id,'hi'], [:number, '50'], [:end_of_string]], tokens assert_equal [[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens
end end
def test_float def test_float
tokens = Lexer.new('hi 5.0').tokenize tokens = Lexer.new('hi 5.0').tokenize
assert_equal [[:id,'hi'], [:number, '5.0'], [:end_of_string]], tokens assert_equal [[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens
end end
def test_comparison def test_comparison
tokens = Lexer.new('== <> contains').tokenize tokens = Lexer.new('== <> contains').tokenize
assert_equal [[:comparison,'=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens assert_equal [[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens
end end
def test_specials def test_specials
@@ -40,7 +40,7 @@ class LexerUnitTest < Minitest::Test
def test_whitespace def test_whitespace
tokens = Lexer.new("five|\n\t ==").tokenize tokens = Lexer.new("five|\n\t ==").tokenize
assert_equal [[:id,'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens assert_equal [[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens
end end
def test_unexpected_character def test_unexpected_character
+9 -6
View File
@@ -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
@@ -77,11 +80,11 @@ class ModuleExUnitTest < Minitest::Test
end end
def test_should_use_regular_objects_as_drops def test_should_use_regular_objects_as_drops
assert_template_result 'allowedA', "{{ a.allowedA }}", 'a'=>@a assert_template_result 'allowedA', "{{ a.allowedA }}", 'a' => @a
assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", 'a'=>@a assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", 'a' => @a
assert_template_result 'allowedC', "{{ a.chainedB.chainedC.allowedC }}", 'a'=>@a assert_template_result 'allowedC', "{{ a.chainedB.chainedC.allowedC }}", 'a' => @a
assert_template_result 'another_allowedC', "{{ a.chainedB.chainedC.another_allowedC }}", 'a'=>@a assert_template_result 'another_allowedC', "{{ a.chainedB.chainedC.another_allowedC }}", 'a' => @a
assert_template_result '', "{{ a.restricted }}", 'a'=>@a assert_template_result '', "{{ a.restricted }}", 'a' => @a
assert_template_result '', "{{ a.unknown }}", 'a'=>@a assert_template_result '', "{{ a.unknown }}", 'a' => @a
end end
end # ModuleExTest end # ModuleExTest
+1 -1
View File
@@ -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
+1 -1
View File
@@ -59,7 +59,7 @@ class StrainerUnitTest < Minitest::Test
def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
a = Module.new a = Module.new
b = Module.new b = Module.new
strainer = Strainer.create(nil, [a,b]) strainer = Strainer.create(nil, [a, b])
assert_kind_of Strainer, strainer assert_kind_of Strainer, strainer
assert_kind_of a, strainer assert_kind_of a, strainer
assert_kind_of b, strainer assert_kind_of b, strainer
+35 -35
View File
@@ -11,59 +11,59 @@ class VariableUnitTest < Minitest::Test
def test_filters def test_filters
var = Variable.new('hello | textileze') var = Variable.new('hello | textileze')
assert_equal VariableLookup.new('hello'), var.name assert_equal VariableLookup.new('hello'), var.name
assert_equal [['textileze',[]]], var.filters assert_equal [['textileze', []]], var.filters
var = Variable.new('hello | textileze | paragraph') var = Variable.new('hello | textileze | paragraph')
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
def test_filters_without_whitespace def test_filters_without_whitespace
var = Variable.new('hello | textileze | paragraph') var = Variable.new('hello | textileze | paragraph')
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|textileze|paragraph') var = Variable.new('hello|textileze|paragraph')
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|replace:'foo','bar'|textileze") var = Variable.new("hello|replace:'foo','bar'|textileze")
assert_equal VariableLookup.new('hello'), var.name assert_equal VariableLookup.new('hello'), var.name
@@ -73,32 +73,32 @@ class VariableUnitTest < Minitest::Test
def test_symbol def test_symbol
var = Variable.new("http://disney.com/logo.gif | image: 'med' ", :error_mode => :lax) var = Variable.new("http://disney.com/logo.gif | image: 'med' ", :error_mode => :lax)
assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name
assert_equal [['image',['med']]], var.filters assert_equal [['image', ['med']]], var.filters
end end
def test_string_to_filter def test_string_to_filter
var = Variable.new("'http://disney.com/logo.gif' | image: 'med' ") var = Variable.new("'http://disney.com/logo.gif' | image: 'med' ")
assert_equal 'http://disney.com/logo.gif', var.name assert_equal 'http://disney.com/logo.gif', var.name
assert_equal [['image',['med']]], var.filters assert_equal [['image', ['med']]], var.filters
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,37 +114,37 @@ 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
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