From 3372ca8136a13af28c80b1cbe4e11be82ffbed5e Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Wed, 13 May 2015 17:56:13 +0000 Subject: [PATCH] Rubocop --- .rubocop.yml | 92 +++++++ .rubocop_todo.yml | 142 +++++++++++ Gemfile | 1 + Rakefile | 17 +- example/server/example_servlet.rb | 16 +- example/server/server.rb | 2 +- lib/liquid/block.rb | 12 +- lib/liquid/block_body.rb | 6 +- lib/liquid/condition.rb | 20 +- lib/liquid/context.rb | 32 ++- lib/liquid/document.rb | 4 +- lib/liquid/drop.rb | 9 +- lib/liquid/errors.rb | 6 +- lib/liquid/expression.rb | 1 - lib/liquid/file_system.rb | 4 +- lib/liquid/i18n.rb | 1 + lib/liquid/interrupts.rb | 3 +- lib/liquid/lexer.rb | 4 +- lib/liquid/module_ex.rb | 8 +- lib/liquid/parser_switching.rb | 1 + lib/liquid/profiler.rb | 8 +- lib/liquid/resource_limits.rb | 6 +- lib/liquid/standardfilters.rb | 19 +- lib/liquid/strainer.rb | 7 +- lib/liquid/tag.rb | 4 +- lib/liquid/tags/assign.rb | 3 +- lib/liquid/tags/break.rb | 3 - lib/liquid/tags/case.rb | 4 +- lib/liquid/tags/comment.rb | 4 +- lib/liquid/tags/decrement.rb | 5 +- lib/liquid/tags/for.rb | 6 +- lib/liquid/tags/if.rb | 82 +++--- lib/liquid/tags/ifchanged.rb | 2 - lib/liquid/tags/include.rb | 52 ++-- lib/liquid/tags/raw.rb | 4 +- lib/liquid/tags/table_row.rb | 5 +- lib/liquid/tags/unless.rb | 1 - lib/liquid/template.rb | 7 +- lib/liquid/utils.rb | 4 +- lib/liquid/variable.rb | 29 +-- lib/liquid/variable_lookup.rb | 6 +- liquid.gemspec | 4 +- performance/profile.rb | 2 +- performance/shopify/comment_form.rb | 2 +- performance/shopify/database.rb | 4 +- performance/shopify/json_filter.rb | 4 +- performance/shopify/money_filter.rb | 5 +- performance/shopify/paginate.rb | 17 +- performance/shopify/shop_filter.rb | 14 +- performance/shopify/tag_filter.rb | 4 +- performance/shopify/weight_filter.rb | 2 - performance/theme_runner.rb | 7 +- test/integration/assign_test.rb | 16 +- test/integration/blank_test.rb | 26 +- test/integration/drop_test.rb | 57 ++--- test/integration/error_handling_test.rb | 32 +-- test/integration/filter_test.rb | 12 +- test/integration/output_test.rb | 35 ++- test/integration/parsing_quirks_test.rb | 10 +- test/integration/render_profiling_test.rb | 2 +- test/integration/security_test.rb | 10 +- test/integration/standard_filter_test.rb | 74 +++--- test/integration/tags/break_tag_test.rb | 2 +- test/integration/tags/for_tag_test.rb | 211 ++++++++-------- test/integration/tags/if_else_tag_test.rb | 142 ++++++----- test/integration/tags/include_tag_test.rb | 29 +-- test/integration/tags/increment_tag_test.rb | 20 +- test/integration/tags/raw_tag_test.rb | 2 +- test/integration/tags/standard_tag_test.rb | 233 +++++++++--------- test/integration/tags/statements_test.rb | 8 +- test/integration/tags/table_row_test.rb | 35 ++- test/integration/tags/unless_else_tag_test.rb | 12 +- test/integration/template_test.rb | 40 +-- test/integration/variable_test.rb | 22 +- test/unit/block_unit_test.rb | 11 +- test/unit/condition_unit_test.rb | 41 +-- test/unit/context_unit_test.rb | 81 +++--- test/unit/file_system_unit_test.rb | 4 +- test/unit/i18n_unit_test.rb | 2 +- test/unit/lexer_unit_test.rb | 12 +- test/unit/module_ex_unit_test.rb | 15 +- test/unit/regexp_unit_test.rb | 2 +- test/unit/strainer_unit_test.rb | 2 +- test/unit/variable_unit_test.rb | 70 +++--- 84 files changed, 1069 insertions(+), 908 deletions(-) create mode 100644 .rubocop.yml create mode 100644 .rubocop_todo.yml diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..2270ee9 --- /dev/null +++ b/.rubocop.yml @@ -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 diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml new file mode 100644 index 0000000..800c726 --- /dev/null +++ b/.rubocop_todo.yml @@ -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 diff --git a/Gemfile b/Gemfile index 2952419..5f22d02 100644 --- a/Gemfile +++ b/Gemfile @@ -6,4 +6,5 @@ gem 'stackprof', platforms: :mri_21 group :test do gem 'spy', '0.4.1' gem 'benchmark-ips' + gem 'rubocop' end diff --git a/Rakefile b/Rakefile index 6296027..fd86697 100755 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,7 @@ require 'rake/testtask' $LOAD_PATH.unshift File.expand_path("../lib", __FILE__) require "liquid/version" -task :default => 'test' +task default: [:rubocop, :test] desc 'run test suite with default parser' Rake::TestTask.new(:base_test) do |t| @@ -18,6 +18,11 @@ task :warn_test do Rake::Task['base_test'].invoke end +task :rubocop do + require 'rubocop/rake_task' + RuboCop::RakeTask.new +end + desc 'runs test suite with both strict and lax parsers' task :test do ENV['LIQUID_PARSER_MODE'] = 'lax' @@ -27,16 +32,16 @@ task :test do Rake::Task['base_test'].invoke end -task :gem => :build +task gem: :build task :build do system "gem build liquid.gemspec" end -task :install => :build do +task install: :build do system "gem install liquid-#{Liquid::VERSION}.gem" end -task :release => :build do +task release: :build do system "git tag -a v#{Liquid::VERSION} -m 'Tagging #{Liquid::VERSION}'" system "git push --tags" system "gem push liquid-#{Liquid::VERSION}.gem" @@ -44,7 +49,6 @@ task :release => :build do end namespace :benchmark do - desc "Run the liquid benchmark with lax parsing" task :run do ruby "./performance/benchmark.rb lax" @@ -56,9 +60,7 @@ namespace :benchmark do end end - namespace :profile do - desc "Run the liquid profile/performance coverage" task :run do ruby "./performance/profile.rb" @@ -68,7 +70,6 @@ namespace :profile do task :strict do ruby "./performance/profile.rb strict" end - end desc "Run example" diff --git a/example/server/example_servlet.rb b/example/server/example_servlet.rb index 971e9c5..dbc7a4b 100644 --- a/example/server/example_servlet.rb +++ b/example/server/example_servlet.rb @@ -4,7 +4,7 @@ module ProductsFilter end def prettyprint(text) - text.gsub( /\*(.*)\*/, '\1' ) + text.gsub(/\*(.*)\*/, '\1') end def count(array) @@ -17,30 +17,28 @@ module ProductsFilter end class Servlet < LiquidServlet - def index { 'date' => Time.now } end 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 private def products_list - [{'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 Diamond', 'price' => 59900, 'description' => 'the *arbor diamond* is a made up product because im obsessed with arbor and have no creativity'}] + [{ '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 Diamond', 'price' => 59900, 'description' => 'the *arbor diamond* is a made up product because im obsessed with arbor and have no creativity' }] end 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 Fish', 'price' => 40000, 'description' => 'the *arbor fish* is a compact pin that features an extended wheelbase and time-honored teardrop shape'}] + [{ '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' }] end def description "List of Products ~ This is a list of products with price and description." end - end diff --git a/example/server/server.rb b/example/server/server.rb index e56edbd..703b361 100644 --- a/example/server/server.rb +++ b/example/server/server.rb @@ -6,7 +6,7 @@ require_relative 'liquid_servlet' require_relative 'example_servlet' # Setup webrick -server = WEBrick::HTTPServer.new( :Port => ARGV[1] || 3000 ) +server = WEBrick::HTTPServer.new(Port: ARGV[1] || 3000) server.mount('/', Servlet) trap("INT"){ server.shutdown } server.start diff --git a/lib/liquid/block.rb b/lib/liquid/block.rb index e6db869..eaccd04 100644 --- a/lib/liquid/block.rb +++ b/lib/liquid/block.rb @@ -35,17 +35,17 @@ module Liquid all_warnings end - def unknown_tag(tag, params, tokens) + def unknown_tag(tag, _params, _tokens) case tag when 'else'.freeze raise SyntaxError.new(options[:locale].t("errors.syntax.unexpected_else".freeze, - :block_name => block_name)) + block_name: block_name)) when 'end'.freeze raise SyntaxError.new(options[:locale].t("errors.syntax.invalid_delimiter".freeze, - :block_name => block_name, - :block_delimiter => block_delimiter)) + block_name: block_name, + block_delimiter: block_delimiter)) 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 @@ -65,7 +65,7 @@ module Liquid return false if end_tag_name == block_delimiter 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 # this tag is not registered with the system diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 371e058..66eaffa 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -79,7 +79,7 @@ module Liquid # If we get an Interrupt that means the block must stop processing. An # Interrupt is any command that stops block execution such as {% break %} # 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) break end @@ -121,11 +121,11 @@ module Liquid end 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 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 diff --git a/lib/liquid/condition.rb b/lib/liquid/condition.rb index 33e829f..c76376a 100644 --- a/lib/liquid/condition.rb +++ b/lib/liquid/condition.rb @@ -8,16 +8,16 @@ module Liquid # class Condition #:nodoc: @@operators = { - '=='.freeze => lambda { |cond, left, right| cond.send(:equal_variables, left, right) }, - '!='.freeze => lambda { |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 => ->(cond, left, right) { !cond.send(:equal_variables, left, right) }, + '<>'.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) }, '<'.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 - } + end } def self.operators @@ -96,7 +96,7 @@ module Liquid # 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 # return this as the result. - return context.evaluate(left) if op == nil + return context.evaluate(left) if op.nil? left = context.evaluate(left) right = context.evaluate(right) @@ -105,27 +105,23 @@ module Liquid if operation.respond_to?(:call) 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 left.send(operation, right) rescue ::ArgumentError => e raise Liquid::ArgumentError.new(e.message) end - else - nil end end end - class ElseCondition < Condition def else? true end - def evaluate(context) + def evaluate(_context) true end end - end diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index e93dcba..3314eee 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -1,5 +1,4 @@ module Liquid - # Context keeps the variable stack and resolves variables, as well as keywords # # context['variable'] = 'testing' @@ -63,8 +62,7 @@ module Liquid @interrupts.pop end - - def handle_error(e, token=nil) + def handle_error(e, token = nil) if e.is_a?(Liquid::Error) e.set_line_number_from_token(token) end @@ -79,7 +77,7 @@ module Liquid end # Push new local scope on the stack. use Context#stack instead - def push(new_scope={}) + def push(new_scope = {}) @scopes.unshift(new_scope) raise StackLevelError, "Nesting too deep".freeze if @scopes.length > 100 end @@ -103,7 +101,7 @@ module Liquid # end # # context['var] #=> nil - def stack(new_scope=nil) + def stack(new_scope = nil) old_stack_used = @this_stack_used if 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 def find_variable(key) - # 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 index = @scopes.find_index { |s| s.has_key?(key) } @@ -171,13 +168,13 @@ module Liquid end end - scope ||= @environments.last || @scopes.last - variable ||= lookup_and_evaluate(scope, key) + scope ||= @environments.last || @scopes.last + variable ||= lookup_and_evaluate(scope, key) variable = variable.to_liquid variable.context = self if variable.respond_to?(:context=) - return variable + variable end def lookup_and_evaluate(obj, key) @@ -189,15 +186,16 @@ module Liquid end private - def squash_instance_assigns_with_environments - @scopes.last.each_key do |k| - @environments.each do |env| - if env.has_key?(k) - scopes.last[k] = lookup_and_evaluate(env, k) - break - end + + def squash_instance_assigns_with_environments + @scopes.last.each_key do |k| + @environments.each do |env| + if env.has_key?(k) + scopes.last[k] = lookup_and_evaluate(env, k) + break end end - end # squash_instance_assigns_with_environments + end + end # squash_instance_assigns_with_environments end # Context end # Liquid diff --git a/lib/liquid/document.rb b/lib/liquid/document.rb index c5709cb..7ecced6 100644 --- a/lib/liquid/document.rb +++ b/lib/liquid/document.rb @@ -15,9 +15,9 @@ module Liquid def unknown_tag(tag, options) case tag 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 - 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 diff --git a/lib/liquid/drop.rb b/lib/liquid/drop.rb index 58d07a0..203f76e 100644 --- a/lib/liquid/drop.rb +++ b/lib/liquid/drop.rb @@ -1,7 +1,6 @@ require 'set' module Liquid - # A drop in liquid is a class which allows you to export DOM like things to liquid. # Methods of drops are callable. # The main use for liquid drops is to implement lazy loaded objects. @@ -27,7 +26,7 @@ module Liquid EMPTY_STRING = ''.freeze # Catch all for the method - def before_method(method) + def before_method(_method) nil end @@ -40,7 +39,7 @@ module Liquid end end - def has_key?(name) + def has_key?(_name) true end @@ -56,13 +55,13 @@ module Liquid self.class.name end - alias :[] :invoke_drop + alias_method :[], :invoke_drop private # Check for method existence without invoking respond_to?, which creates symbols def self.invokable?(method_name) - self.invokable_methods.include?(method_name.to_s) + invokable_methods.include?(method_name.to_s) end def self.invokable_methods diff --git a/lib/liquid/errors.rb b/lib/liquid/errors.rb index 04b0fa6..feb4262 100644 --- a/lib/liquid/errors.rb +++ b/lib/liquid/errors.rb @@ -3,7 +3,7 @@ module Liquid attr_accessor :line_number attr_accessor :markup_context - def to_s(with_prefix=true) + def to_s(with_prefix = true) str = "" str << message_prefix if with_prefix str << super() @@ -18,7 +18,7 @@ module Liquid def set_line_number_from_token(token) return unless token.respond_to?(:line_number) - return if self.line_number + return if line_number self.line_number = token.line_number end @@ -26,7 +26,7 @@ module Liquid if e.is_a?(Liquid::Error) e.to_s else - "Liquid error: #{e.to_s}" + "Liquid error: #{e}" end end diff --git a/lib/liquid/expression.rb b/lib/liquid/expression.rb index 3c8a585..73624a8 100644 --- a/lib/liquid/expression.rb +++ b/lib/liquid/expression.rb @@ -28,6 +28,5 @@ module Liquid end end end - end end diff --git a/lib/liquid/file_system.rb b/lib/liquid/file_system.rb index 6c4396b..8e71f44 100644 --- a/lib/liquid/file_system.rb +++ b/lib/liquid/file_system.rb @@ -14,7 +14,7 @@ module Liquid # This will parse the template with a LocalFileSystem implementation rooted at 'template_path'. class BlankFileSystem # 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." end end @@ -51,7 +51,7 @@ module Liquid def read_template_file(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) end diff --git a/lib/liquid/i18n.rb b/lib/liquid/i18n.rb index 5d538b7..3657c22 100644 --- a/lib/liquid/i18n.rb +++ b/lib/liquid/i18n.rb @@ -22,6 +22,7 @@ module Liquid end private + def interpolate(name, vars) name.gsub(/%\{(\w+)\}/) { # raise TranslationError, "Undefined key #{$1} for interpolation in translation #{name}" unless vars[$1.to_sym] diff --git a/lib/liquid/interrupts.rb b/lib/liquid/interrupts.rb index 6ff01ac..41359d7 100644 --- a/lib/liquid/interrupts.rb +++ b/lib/liquid/interrupts.rb @@ -1,10 +1,9 @@ module Liquid - # An interrupt is any command that breaks processing of a block (ex: a for loop). class Interrupt attr_reader :message - def initialize(message=nil) + def initialize(message = nil) @message = message || "interrupt".freeze end end diff --git a/lib/liquid/lexer.rb b/lib/liquid/lexer.rb index 4b724b1..b9f2422 100644 --- a/lib/liquid/lexer.rb +++ b/lib/liquid/lexer.rb @@ -27,7 +27,7 @@ module Liquid def tokenize @output = [] - while !@ss.eos? + until @ss.eos? @ss.skip(/\s*/) tok = case when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t] @@ -39,7 +39,7 @@ module Liquid else c = @ss.getch if s = SPECIALS[c] - [s,c] + [s, c] else raise SyntaxError, "Unexpected character #{c}" end diff --git a/lib/liquid/module_ex.rb b/lib/liquid/module_ex.rb index 9c7cc00..5b394d2 100644 --- a/lib/liquid/module_ex.rb +++ b/lib/liquid/module_ex.rb @@ -43,17 +43,17 @@ # class Module 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 drop_class.new(self) end - + drop_class.class_eval do def initialize(object) @object = object end - + allowed_methods.each do |sym| define_method sym do @object.send sym diff --git a/lib/liquid/parser_switching.rb b/lib/liquid/parser_switching.rb index 5fc0f38..fe033bf 100644 --- a/lib/liquid/parser_switching.rb +++ b/lib/liquid/parser_switching.rb @@ -17,6 +17,7 @@ module Liquid end private + def strict_parse_with_error_context(markup) strict_parse(markup) rescue SyntaxError => e diff --git a/lib/liquid/profiler.rb b/lib/liquid/profiler.rb index 67ad6fa..2bf51e2 100644 --- a/lib/liquid/profiler.rb +++ b/lib/liquid/profiler.rb @@ -1,7 +1,6 @@ require 'liquid/profiler/hooks' module Liquid - # Profiler enables support for profiling template rendering to help track down performance issues. # # To enable profiling, first require 'liquid/profiler'. @@ -55,9 +54,7 @@ module Liquid end def self.start(token, partial) - new(token, partial).tap do |t| - t.start - end + new(token, partial).tap(&:start) end def start @@ -139,7 +136,7 @@ module Liquid @timing_stack.push(Timing.start(token, current_partial)) end - def end_token(token) + def end_token(_token) timing = @timing_stack.pop timing.finish @@ -157,6 +154,5 @@ module Liquid def pop_partial @partial_stack.pop end - end end diff --git a/lib/liquid/resource_limits.rb b/lib/liquid/resource_limits.rb index 190685e..08b359b 100644 --- a/lib/liquid/resource_limits.rb +++ b/lib/liquid/resource_limits.rb @@ -1,7 +1,7 @@ module Liquid class ResourceLimits 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) @render_length_limit = limits[:render_length_limit] @@ -12,8 +12,8 @@ module Liquid def reached? (@render_length_limit && @render_length > @render_length_limit) || - (@render_score_limit && @render_score > @render_score_limit ) || - (@assign_score_limit && @assign_score > @assign_score_limit ) + (@render_score_limit && @render_score > @render_score_limit) || + (@assign_score_limit && @assign_score > @assign_score_limit) end def reset diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 8421e85..4d10bb3 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -2,7 +2,6 @@ require 'cgi' require 'bigdecimal' module Liquid - module StandardFilters HTML_ESCAPE = { '&'.freeze => '&'.freeze, @@ -46,7 +45,7 @@ module Liquid CGI.escape(input) rescue input end - def slice(input, offset, length=nil) + def slice(input, offset, length = nil) offset = Integer(offset) length = length ? Integer(length) : 1 @@ -59,14 +58,14 @@ module Liquid # Truncate a string down to x characters 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 = 0 if l < 0 input.length > length.to_i ? input[0...l] + truncate_string : input end def truncatewords(input, words = 15, truncate_string = "...".freeze) - if input.nil? then return end + return if input.nil? wordlist = input.to_s.split l = words.to_i - 1 l = 0 if l < 0 @@ -116,9 +115,9 @@ module Liquid if property.nil? ary.sort 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) - ary.sort {|a,b| a.send(property) <=> b.send(property) } + ary.sort { |a, b| a.send(property) <=> b.send(property) } end end @@ -128,11 +127,11 @@ module Liquid ary = InputIterator.new(input) 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? - ary.sort {|a,b| a[property].casecmp(b[property]) } + ary.sort { |a, b| a[property].casecmp(b[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 @@ -336,8 +335,6 @@ module Liquid Time.at(obj.to_i) when String Time.parse(obj) - else - nil end rescue ArgumentError nil diff --git a/lib/liquid/strainer.rb b/lib/liquid/strainer.rb index 31a1ec2..c9bd1eb 100644 --- a/lib/liquid/strainer.rb +++ b/lib/liquid/strainer.rb @@ -1,7 +1,6 @@ require 'set' module Liquid - # 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. # @@ -22,14 +21,14 @@ module Liquid @context = context end - def self.filter_methods - @filter_methods + class << self + attr_reader :filter_methods end def self.add_filter(filter) raise ArgumentError, "Expected module but got: #{f.class}" unless filter.is_a?(Module) unless self.class.include?(filter) - self.send(:include, filter) + send(:include, filter) @filter_methods.merge(filter.public_instance_methods.map(&:to_s)) end end diff --git a/lib/liquid/tag.rb b/lib/liquid/tag.rb index d8d35c5..e8dd22b 100644 --- a/lib/liquid/tag.rb +++ b/lib/liquid/tag.rb @@ -20,7 +20,7 @@ module Liquid @options = options end - def parse(tokens) + def parse(_tokens) end def raw @@ -31,7 +31,7 @@ module Liquid self.class.name.downcase end - def render(context) + def render(_context) ''.freeze end diff --git a/lib/liquid/tags/assign.rb b/lib/liquid/tags/assign.rb index f1dfb19..b0e1458 100644 --- a/lib/liquid/tags/assign.rb +++ b/lib/liquid/tags/assign.rb @@ -1,5 +1,4 @@ module Liquid - # Assign sets a variable in your template. # # {% assign foo = 'monkey' %} @@ -15,7 +14,7 @@ module Liquid super if markup =~ Syntax @to = $1 - @from = Variable.new($2,options) + @from = Variable.new($2, options) @from.line_number = line_number else raise SyntaxError.new options[:locale].t("errors.syntax.assign".freeze) diff --git a/lib/liquid/tags/break.rb b/lib/liquid/tags/break.rb index 411a3b1..6fe0969 100644 --- a/lib/liquid/tags/break.rb +++ b/lib/liquid/tags/break.rb @@ -1,5 +1,4 @@ module Liquid - # Break tag to be used to break out of a for loop. # # == Basic Usage: @@ -10,11 +9,9 @@ module Liquid # {% endfor %} # class Break < Tag - def interrupt BreakInterrupt.new end - end Template.register_tag('break'.freeze, Break) diff --git a/lib/liquid/tags/case.rb b/lib/liquid/tags/case.rb index dea0be2..e664387 100644 --- a/lib/liquid/tags/case.rb +++ b/lib/liquid/tags/case.rb @@ -59,7 +59,7 @@ module Liquid body = BlockBody.new while markup - if not markup =~ WhenSyntax + unless markup =~ WhenSyntax raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_when".freeze)) end @@ -72,7 +72,7 @@ module Liquid end 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)) end diff --git a/lib/liquid/tags/comment.rb b/lib/liquid/tags/comment.rb index 3e6bb69..c57c9cd 100644 --- a/lib/liquid/tags/comment.rb +++ b/lib/liquid/tags/comment.rb @@ -1,10 +1,10 @@ module Liquid class Comment < Block - def render(context) + def render(_context) ''.freeze end - def unknown_tag(tag, markup, tokens) + def unknown_tag(_tag, _markup, _tokens) end def blank? diff --git a/lib/liquid/tags/decrement.rb b/lib/liquid/tags/decrement.rb index d604750..b5cdaaa 100644 --- a/lib/liquid/tags/decrement.rb +++ b/lib/liquid/tags/decrement.rb @@ -1,5 +1,4 @@ module Liquid - # decrement is used in a place where one needs to insert a counter # into a template, and needs the counter to survive across # multiple instantiations of the template. @@ -26,12 +25,10 @@ module Liquid def render(context) value = context.environments.first[@variable] ||= 0 - value = value - 1 + value -= 1 context.environments.first[@variable] = value value.to_s end - - private end Template.register_tag('decrement'.freeze, Decrement) diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index 33f12af..d1cd4a7 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -1,5 +1,4 @@ module Liquid - # "For" iterates over an array or collection. # Several useful variables are available to you within the loop. # @@ -54,9 +53,8 @@ module Liquid end def parse(tokens) - if more = parse_body(@for_block, tokens) - parse_body(@else_block, tokens) - end + return unless parse_body(@for_block, tokens) + parse_body(@else_block, tokens) end def nodelist diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index ba668f2..4901d4a 100644 --- a/lib/liquid/tags/if.rb +++ b/lib/liquid/tags/if.rb @@ -21,7 +21,7 @@ module Liquid end def parse(tokens) - while more = parse_body(@blocks.last.attachment, tokens) + while parse_body(@blocks.last.attachment, tokens) end end @@ -50,61 +50,61 @@ module Liquid private - def push_block(tag, markup) - block = if tag == 'else'.freeze - ElseCondition.new - else - parse_with_selected_parser(markup) - end - - @blocks.push(block) - block.attach(BlockBody.new) + def push_block(tag, markup) + block = if tag == 'else'.freeze + ElseCondition.new + else + parse_with_selected_parser(markup) end - def lax_parse(markup) - expressions = markup.scan(ExpressionsAndOperators) - raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop =~ Syntax + @blocks.push(block) + block.attach(BlockBody.new) + 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? - operator = expressions.pop.to_s.strip + 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 + 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 BOOLEAN_OPERATORS.include?(operator) - new_condition.send(operator, condition) - condition = new_condition - end + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax - 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 - def strict_parse(markup) - p = Parser.new(markup) + condition + end - condition = parse_comparison(p) + def strict_parse(markup) + p = Parser.new(markup) - while op = (p.id?('and'.freeze) || p.id?('or'.freeze)) - new_cond = parse_comparison(p) - new_cond.send(op, condition) - condition = new_cond - end - p.consume(:end_of_string) + condition = parse_comparison(p) - 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 + p.consume(:end_of_string) - def parse_comparison(p) - a = Expression.parse(p.expression) - if op = p.consume?(:comparison) - b = Expression.parse(p.expression) - Condition.new(a, op, b) - else - Condition.new(a) - end + condition + end + + def parse_comparison(p) + a = Expression.parse(p.expression) + if op = p.consume?(:comparison) + b = Expression.parse(p.expression) + Condition.new(a, op, b) + else + Condition.new(a) end + end end Template.register_tag('if'.freeze, If) diff --git a/lib/liquid/tags/ifchanged.rb b/lib/liquid/tags/ifchanged.rb index 86dbe72..d70cbe1 100644 --- a/lib/liquid/tags/ifchanged.rb +++ b/lib/liquid/tags/ifchanged.rb @@ -1,9 +1,7 @@ module Liquid class Ifchanged < Block - def render(context) context.stack do - output = super if output != context.registers[:ifchanged] diff --git a/lib/liquid/tags/include.rb b/lib/liquid/tags/include.rb index b552559..80b46d9 100644 --- a/lib/liquid/tags/include.rb +++ b/lib/liquid/tags/include.rb @@ -1,5 +1,4 @@ module Liquid - # Include allows templates to relate with other templates # # Simply include another template: @@ -38,7 +37,7 @@ module Liquid end end - def parse(tokens) + def parse(_tokens) end def render(context) @@ -71,35 +70,36 @@ module Liquid end 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] - return cached - 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 + def load_cached_partial(context) + cached_partials = context.registers[:cached_partials] || {} + template_name = context.evaluate(@template_name_expr) + + if cached = cached_partials[template_name] + return cached 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) - file_system = context.registers[:file_system] || Liquid::Template.file_system + def read_template_from_file_system(context) + file_system = context.registers[:file_system] || Liquid::Template.file_system - file_system.read_template_file(context.evaluate(@template_name_expr)) - end - - def pass_options - dont_pass = @options[:include_options_blacklist] - return {locale: @options[:locale]} if dont_pass == true - opts = @options.merge(included: true, include_options_blacklist: false) - if dont_pass.is_a?(Array) - dont_pass.each {|o| opts.delete(o)} - end - opts + file_system.read_template_file(context.evaluate(@template_name_expr)) + end + + def pass_options + dont_pass = @options[:include_options_blacklist] + return { locale: @options[:locale] } if dont_pass == true + opts = @options.merge(included: true, include_options_blacklist: false) + if dont_pass.is_a?(Array) + dont_pass.each { |o| opts.delete(o) } end + opts + end end Template.register_tag('include'.freeze, Include) diff --git a/lib/liquid/tags/raw.rb b/lib/liquid/tags/raw.rb index 41b2ec4..b7dd3b3 100644 --- a/lib/liquid/tags/raw.rb +++ b/lib/liquid/tags/raw.rb @@ -9,11 +9,11 @@ module Liquid @body << $1 if $1 != "".freeze return if block_delimiter == $2 end - @body << token if not token.empty? + @body << token unless token.empty? end end - def render(context) + def render(_context) @body end diff --git a/lib/liquid/tags/table_row.rb b/lib/liquid/tags/table_row.rb index 85b1f5a..efd4891 100644 --- a/lib/liquid/tags/table_row.rb +++ b/lib/liquid/tags/table_row.rb @@ -33,7 +33,6 @@ module Liquid result = "\n" context.stack do - collection.each_with_index do |item, index| context[@variable_name] = item context['tablerowloop'.freeze] = { @@ -50,17 +49,15 @@ module Liquid 'col_last'.freeze => (col == cols - 1) } - col += 1 result << "" << super << '' - if col == cols and (index != length - 1) + if col == cols && (index != length - 1) col = 0 row += 1 result << "\n" end - end end result << "\n" diff --git a/lib/liquid/tags/unless.rb b/lib/liquid/tags/unless.rb index dce3971..1d4280d 100644 --- a/lib/liquid/tags/unless.rb +++ b/lib/liquid/tags/unless.rb @@ -8,7 +8,6 @@ module Liquid class Unless < If def render(context) context.stack do - # First condition is interpreted backwards ( if not ) first_block = @blocks.first unless first_block.evaluate(context) diff --git a/lib/liquid/template.rb b/lib/liquid/template.rb index c8ee0f8..88d9977 100644 --- a/lib/liquid/template.rb +++ b/lib/liquid/template.rb @@ -1,5 +1,4 @@ module Liquid - # Templates are central to liquid. # Interpretating templates is a two step process. First you compile the # source code you got. During compile time some extensive error checking is performed. @@ -15,7 +14,7 @@ module Liquid # class Template DEFAULT_OPTIONS = { - :locale => I18n.new + locale: I18n.new } attr_accessor :root @@ -189,7 +188,7 @@ module Liquid options = args.pop if options[:registers].is_a?(Hash) - self.registers.merge!(options[:registers]) + registers.merge!(options[:registers]) end if options[:filters] @@ -237,7 +236,7 @@ module Liquid tokens = calculate_line_numbers(source.split(TemplateParser)) # 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 end diff --git a/lib/liquid/utils.rb b/lib/liquid/utils.rb index cfa675a..ed1e9d9 100644 --- a/lib/liquid/utils.rb +++ b/lib/liquid/utils.rb @@ -1,8 +1,7 @@ module Liquid module Utils - 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) else slice_collection_using_each(collection, from, to) @@ -21,7 +20,6 @@ module Liquid return [collection] if non_blank_string?(collection) collection.each do |item| - if to && to <= index break end diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index 92b0537..5e455c0 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -1,5 +1,4 @@ module Liquid - # Holds variables. Variables are only loaded "just in time" # and are not evaluated as part of the render stage # @@ -34,18 +33,18 @@ module Liquid def lax_parse(markup) @filters = [] - if markup =~ /(#{QuotedFragment})(.*)/om - name_markup = $1 - filter_markup = $2 - @name = Expression.parse(name_markup) - if filter_markup =~ /#{FilterSeparator}\s*(.*)/om - filters = $1.scan(FilterParser) - filters.each do |f| - if f =~ /\w+/ - filtername = Regexp.last_match(0) - filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten - @filters << parse_filter_expressions(filtername, filterargs) - end + return unless markup =~ /(#{QuotedFragment})(.*)/om + + name_markup = $1 + filter_markup = $2 + @name = Expression.parse(name_markup) + if filter_markup =~ /#{FilterSeparator}\s*(.*)/om + filters = $1.scan(FilterParser) + filters.each do |f| + if f =~ /\w+/ + filtername = Regexp.last_match(0) + filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten + @filters << parse_filter_expressions(filtername, filterargs) end end end @@ -68,9 +67,7 @@ module Liquid # first argument filterargs = [p.argument] # followed by comma separated others - while p.consume?(:comma) - filterargs << p.argument - end + filterargs << p.argument while p.consume?(:comma) filterargs end diff --git a/lib/liquid/variable_lookup.rb b/lib/liquid/variable_lookup.rb index 92f57c8..3b8374b 100644 --- a/lib/liquid/variable_lookup.rb +++ b/lib/liquid/variable_lookup.rb @@ -41,8 +41,8 @@ module Liquid # If object is a hash- or array-like object we look for the # presence of the key and if its available we return it if object.respond_to?(:[]) && - ((object.respond_to?(:has_key?) && object.has_key?(key)) || - (object.respond_to?(:fetch) && key.is_a?(Integer))) + ((object.respond_to?(:has_key?) && object.has_key?(key)) || + (object.respond_to?(:fetch) && key.is_a?(Integer))) # if its a proc we will replace the entry with the proc res = context.lookup_and_evaluate(object, key) @@ -68,7 +68,7 @@ module Liquid end def ==(other) - self.class == other.class && self.state == other.state + self.class == other.class && state == other.state end protected diff --git a/liquid.gemspec b/liquid.gemspec index dd065a5..b8845ca 100644 --- a/liquid.gemspec +++ b/liquid.gemspec @@ -1,6 +1,6 @@ # encoding: utf-8 lib = File.expand_path('../lib/', __FILE__) -$:.unshift lib unless $:.include?(lib) +$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib) require "liquid/version" @@ -13,7 +13,7 @@ Gem::Specification.new do |s| s.email = ["tobi@leetsoft.com"] s.homepage = "http://www.liquidmarkup.org" 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" diff --git a/performance/profile.rb b/performance/profile.rb index 6931774..f0fd9bd 100644 --- a/performance/profile.rb +++ b/performance/profile.rb @@ -6,7 +6,7 @@ profiler = ThemeRunner.new profiler.run [: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 200.times do profiler.run diff --git a/performance/shopify/comment_form.rb b/performance/shopify/comment_form.rb index 30226dd..d661c31 100644 --- a/performance/shopify/comment_form.rb +++ b/performance/shopify/comment_form.rb @@ -28,6 +28,6 @@ class CommentForm < Liquid::Block end def wrap_in_form(article, input) - %Q{
\n#{input}\n
} + %(
\n#{input}\n
) end end diff --git a/performance/shopify/database.rb b/performance/shopify/database.rb index 8755684..2b5bca4 100644 --- a/performance/shopify/database.rb +++ b/performance/shopify/database.rb @@ -39,7 +39,7 @@ module Database end end -if __FILE__ == $0 +if __FILE__ == $PROGRAM_NAME p Database.tables['collections']['frontpage'].keys - #p Database.tables['blog']['articles'] + # p Database.tables['blog']['articles'] end diff --git a/performance/shopify/json_filter.rb b/performance/shopify/json_filter.rb index d3f02d0..8fbb5b6 100644 --- a/performance/shopify/json_filter.rb +++ b/performance/shopify/json_filter.rb @@ -1,9 +1,7 @@ require 'json' module JsonFilter - def json(object) - JSON.dump(object.reject {|k,v| k == "collections" }) + JSON.dump(object.reject { |k, v| k == "collections" }) end - end diff --git a/performance/shopify/money_filter.rb b/performance/shopify/money_filter.rb index b200831..8dad789 100644 --- a/performance/shopify/money_filter.rb +++ b/performance/shopify/money_filter.rb @@ -1,13 +1,12 @@ module MoneyFilter - def money_with_currency(money) return '' if money.nil? - sprintf("$ %.2f USD", money/100.0) + sprintf("$ %.2f USD", money / 100.0) end def money(money) return '' if money.nil? - sprintf("$ %.2f", money/100.0) + sprintf("$ %.2f", money / 100.0) end private diff --git a/performance/shopify/paginate.rb b/performance/shopify/paginate.rb index 3464d08..38a9a1a 100644 --- a/performance/shopify/paginate.rb +++ b/performance/shopify/paginate.rb @@ -42,23 +42,22 @@ class Paginate < Liquid::Block page_count = (collection_size.to_f / @page_size.to_f).to_f.ceil + 1 pagination['items'] = collection_size - pagination['pages'] = page_count -1 - pagination['previous'] = link('« Previous', current_page-1 ) unless 1 >= current_page - pagination['next'] = link('Next »', current_page+1 ) unless page_count <= current_page+1 + pagination['pages'] = page_count - 1 + pagination['previous'] = link('« Previous', current_page - 1) unless 1 >= current_page + pagination['next'] = link('Next »', current_page + 1) unless page_count <= current_page + 1 pagination['parts'] = [] hellip_break = false if page_count > 2 - 1.upto(page_count-1) do |page| - + 1.upto(page_count - 1) do |page| if current_page == page pagination['parts'] << no_link(page) elsif page == 1 pagination['parts'] << link(page, page) - elsif page == page_count -1 + elsif page == page_count - 1 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 pagination['parts'] << no_link('…') hellip_break = true @@ -78,11 +77,11 @@ class Paginate < Liquid::Block private def no_link(title) - { 'title' => title, 'is_link' => false} + { 'title' => title, 'is_link' => false } end 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 def current_url diff --git a/performance/shopify/shop_filter.rb b/performance/shopify/shop_filter.rb index 27b6b57..89c9083 100644 --- a/performance/shopify/shop_filter.rb +++ b/performance/shopify/shop_filter.rb @@ -1,5 +1,4 @@ module ShopFilter - def asset_url(input) "/files/1/[shop_id]/[shop_id]/assets/#{input}" end @@ -16,16 +15,16 @@ module ShopFilter %() end - def stylesheet_tag(url, media="all") + def stylesheet_tag(url, media = "all") %() end - def link_to(link, url, title="") - %|#{link}| + def link_to(link, url, title = "") + %(#{link}) end - def img_tag(url, alt="") - %|#{alt}| + def img_tag(url, alt = "") + %(#{alt}) end def link_to_vendor(vendor) @@ -53,7 +52,6 @@ module ShopFilter end def product_img_url(url, style = 'small') - unless url =~ /\Aproducts\/([\w\-\_]+)\.(\w{2,4})/ raise ArgumentError, 'filter "size" can only be called on product images' end @@ -69,7 +67,6 @@ module ShopFilter end def default_pagination(paginate) - html = [] html << %(#{link_to(paginate['previous']['title'], paginate['previous']['url'])}) if paginate['previous'] @@ -106,5 +103,4 @@ module ShopFilter result.gsub!(/\A-+/, '') if result[0] == '-' result end - end diff --git a/performance/shopify/tag_filter.rb b/performance/shopify/tag_filter.rb index ed6f8b4..ab5aef6 100644 --- a/performance/shopify/tag_filter.rb +++ b/performance/shopify/tag_filter.rb @@ -1,10 +1,9 @@ module TagFilter - def link_to_tag(label, tag) "#{label}" end - def highlight_active_tag(tag, css_class='active') + def highlight_active_tag(tag, css_class = 'active') if @context['current_tags'].include?(tag) "#{tag}" else @@ -21,5 +20,4 @@ module TagFilter tags = (@context['current_tags'] - [tag]).uniq "#{label}" end - end diff --git a/performance/shopify/weight_filter.rb b/performance/shopify/weight_filter.rb index 3ff7c2c..a0a15fc 100644 --- a/performance/shopify/weight_filter.rb +++ b/performance/shopify/weight_filter.rb @@ -1,5 +1,4 @@ module WeightFilter - def weight(grams) sprintf("%.2f", grams / 1000) end @@ -7,5 +6,4 @@ module WeightFilter def weight_with_unit(grams) "#{weight(grams)} kg" end - end diff --git a/performance/theme_runner.rb b/performance/theme_runner.rb index 7b15d03..6ac7917 100644 --- a/performance/theme_runner.rb +++ b/performance/theme_runner.rb @@ -11,7 +11,6 @@ require_relative 'shopify/database' class ThemeRunner class FileSystem - def initialize(path) @path = path end @@ -38,7 +37,6 @@ class ThemeRunner # Dup assigns because will make some changes to them @tests.each do |liquid, layout, template_name| - tmpl = Liquid::Template.new tmpl.parse(liquid) tmpl = Liquid::Template.new @@ -46,20 +44,17 @@ class ThemeRunner end end - def run + def run # Dup assigns because will make some changes to them assigns = Database.tables.dup @tests.each do |liquid, layout, template_name| - # Compute page_tempalte outside of profiler run, uninteresting to profiler page_template = File.basename(template_name, File.extname(template_name)) compile_and_render(liquid, layout, assigns, page_template, template_name) - end end - def compile_and_render(template, layout, assigns, page_template, template_file) tmpl = Liquid::Template.new tmpl.assigns['page_title'] = 'Page title' diff --git a/test/integration/assign_test.rb b/test/integration/assign_test.rb index f9f5aaa..5502289 100644 --- a/test/integration/assign_test.rb +++ b/test/integration/assign_test.rb @@ -15,24 +15,24 @@ class AssignTest < Minitest::Test def test_assigned_variable assert_template_result('.foo.', - '{% assign foo = values %}.{{ foo[0] }}.', - 'values' => %w{foo bar baz}) + '{% assign foo = values %}.{{ foo[0] }}.', + 'values' => %w(foo bar baz)) assert_template_result('.bar.', - '{% assign foo = values %}.{{ foo[1] }}.', - 'values' => %w{foo bar baz}) + '{% assign foo = values %}.{{ foo[1] }}.', + 'values' => %w(foo bar baz)) end def test_assign_with_filter assert_template_result('.bar.', - '{% assign foo = values | split: "," %}.{{ foo[1] }}.', - 'values' => "foo,bar,baz") + '{% assign foo = values | split: "," %}.{{ foo[1] }}.', + 'values' => "foo,bar,baz") end def test_assign_syntax_error assert_match_syntax_error(/assign/, - '{% assign foo not values %}.', - 'values' => "foo,bar,baz") + '{% assign foo not values %}.', + 'values' => "foo,bar,baz") end def test_assign_uses_error_mode diff --git a/test/integration/blank_test.rb b/test/integration/blank_test.rb index 1032863..e9b56df 100644 --- a/test/integration/blank_test.rb +++ b/test/integration/blank_test.rb @@ -31,7 +31,7 @@ class BlankTest < Minitest::Test end 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 def test_loops_are_blank @@ -47,7 +47,7 @@ class BlankTest < Minitest::Test end 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 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 assert_template_result("", wrap(wrap(" "))) - assert_template_result("\n but this is not "*(N+1), - wrap(%q{{% if true %} {% comment %} this is blank {% endcomment %} {% endif %} - {% if true %} but this is not {% endif %}})) + assert_template_result("\n but this is not " * (N + 1), + wrap('{% if true %} {% comment %} this is blank {% endcomment %} {% endif %} + {% if true %} but this is not {% endif %}')) end def test_assigns_are_blank @@ -76,31 +76,31 @@ class BlankTest < Minitest::Test def test_whitespace_is_not_blank_if_other_stuff_is_present body = " x " - assert_template_result(body*(N+1), wrap(body)) + assert_template_result(body * (N + 1), wrap(body)) end 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 def test_cycle_is_not_blank - assert_template_result(" "*((N+1)/2)+" ", wrap("{% cycle ' ', ' ' %}")) + assert_template_result(" " * ((N + 1) / 2) + " ", wrap("{% cycle ' ', ' ' %}")) end def test_raw_is_not_blank - assert_template_result(" "*(N+1), wrap(" {% raw %} {% endraw %}")) + assert_template_result(" " * (N + 1), wrap(" {% raw %} {% endraw %}")) end def test_include_is_blank 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 " "*(N+1), wrap(" {% include ' ' %} ") + 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 ' ' %} ") end 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 = '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 diff --git a/test/integration/drop_test.rb b/test/integration/drop_test.rb index 96e7fa5..a1b0c3f 100644 --- a/test/integration/drop_test.rb +++ b/test/integration/drop_test.rb @@ -14,7 +14,7 @@ class ContextDrop < Liquid::Drop end def before_method(method) - return @context[method] + @context[method] end end @@ -32,7 +32,7 @@ class ProductDrop < Liquid::Drop class CatchallDrop < Liquid::Drop def before_method(method) - return 'method: ' << method.to_s + 'method: ' << method.to_s end end @@ -53,9 +53,10 @@ class ProductDrop < Liquid::Drop end protected - def callmenot - "protected" - end + + def callmenot + "protected" + end end class EnumerableDrop < Liquid::Drop @@ -151,37 +152,37 @@ class DropsTest < Minitest::Test end 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 end 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 end 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 end 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 end 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 end 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 end 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 end @@ -193,40 +194,40 @@ class DropsTest < Minitest::Test end def test_scope - 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 '3', Liquid::Template.parse( '{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}' ).render!('context' => ContextDrop.new, 'dummy' => [1]) + 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 '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) end 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 '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 '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 '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{ |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 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"%}{%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 '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 '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 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 '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 '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 '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 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 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 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 def test_enumerable_drop_will_invoke_before_method_for_clashing_method_names diff --git a/test/integration/error_handling_test.rb b/test/integration/error_handling_test.rb index c21b4b4..88465ae 100644 --- a/test/integration/error_handling_test.rb +++ b/test/integration/error_handling_test.rb @@ -56,7 +56,7 @@ class ErrorHandlingTest < Minitest::Test end 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 1, template.errors.size @@ -64,7 +64,7 @@ class ErrorHandlingTest < Minitest::Test end 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 1, template.errors.size @@ -72,7 +72,7 @@ class ErrorHandlingTest < Minitest::Test end 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 1, template.errors.size @@ -102,31 +102,31 @@ class ErrorHandlingTest < Minitest::Test def test_with_line_numbers_adds_numbers_to_parser_errors err = assert_raises(SyntaxError) do - template = Liquid::Template.parse(%q{ + template = Liquid::Template.parse(%q( foobar {% "cat" | foobar %} bla - }, + ), :line_numbers => true - ) + ) end assert_match /Liquid syntax error \(line 4\)/, err.message end def test_parsing_warn_with_line_numbers_adds_numbers_to_lexer_errors - template = Liquid::Template.parse(%q{ + template = Liquid::Template.parse(' foobar {% if 1 =! 2 %}ok{% endif %} bla - }, + ', :error_mode => :warn, :line_numbers => true - ) + ) assert_equal ['Liquid syntax error (line 4): Unexpected character = in "1 =! 2"'], template.warnings.map(&:message) @@ -134,16 +134,16 @@ class ErrorHandlingTest < Minitest::Test def test_parsing_strict_with_line_numbers_adds_numbers_to_lexer_errors err = assert_raises(SyntaxError) do - Liquid::Template.parse(%q{ + Liquid::Template.parse(' foobar {% if 1 =! 2 %}ok{% endif %} bla - }, + ', :error_mode => :strict, :line_numbers => true - ) + ) end 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 err = assert_raises(SyntaxError) do - Liquid::Template.parse(%q{ + Liquid::Template.parse(' foobar {% if 1 != 2 %} @@ -159,9 +159,9 @@ class ErrorHandlingTest < Minitest::Test {% endif %} bla - }, + ', :line_numbers => true - ) + ) end 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 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message 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 # Liquid should not catch Exceptions that are not subclasses of StandardError, like Interrupt and NoMemoryError diff --git a/test/integration/filter_test.rb b/test/integration/filter_test.rb index ba58e0f..e346444 100644 --- a/test/integration/filter_test.rb +++ b/test/integration/filter_test.rb @@ -17,7 +17,7 @@ module CanadianMoneyFilter end module SubstituteFilter - def substitute(input, params={}) + def substitute(input, params = {}) input.gsub(/%\{(\w+)\}/) { |match| params[$1] } end end @@ -64,19 +64,19 @@ class FiltersTest < Minitest::Test end 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) end def test_sort @context['value'] = 3 - @context['numbers'] = [2,1,4,3] + @context['numbers'] = [2, 1, 4, 3] @context['words'] = ['expected', 'as', 'alphabetic'] @context['arrays'] = ['flower', 'are'] @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 [3], Variable.new("value | 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 @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')] # Test strings @@ -131,7 +131,7 @@ class FiltersTest < Minitest::Test def test_filter_with_keyword_arguments @context['surname'] = 'john' @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 end diff --git a/test/integration/output_test.rb b/test/integration/output_test.rb index b7aaf7d..eb1248f 100644 --- a/test/integration/output_test.rb +++ b/test/integration/output_test.rb @@ -14,7 +14,7 @@ module FunnyFilter end def add_tag(input, tag = "p", id = "foo") - %|<#{tag} id="#{id}">#{input}| + %(<#{tag} id="#{id}">#{input}) end def paragraph(input) @@ -22,9 +22,8 @@ module FunnyFilter end def link_to(name, url) - %|#{name}| + %(#{name}) end - end class OutputTest < Minitest::Test @@ -33,34 +32,34 @@ class OutputTest < Minitest::Test def setup @assigns = { 'best_cars' => 'bmw', - 'car' => {'bmw' => 'good', 'gm' => 'bad'} - } + 'car' => { 'bmw' => 'good', 'gm' => 'bad' } + } end def test_variable - text = %| {{best_cars}} | + text = %( {{best_cars}} ) - expected = %| bmw | + expected = %( bmw ) assert_equal expected, Template.parse(text).render!(@assigns) end 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) end def test_variable_piping text = %( {{ car.gm | make_funny }} ) - expected = %| LOL | + expected = %( LOL ) assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) end def test_variable_piping_with_input text = %( {{ car.gm | cite_funny }} ) - expected = %| LOL: bad | + expected = %( LOL: bad ) assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) end @@ -73,7 +72,7 @@ class OutputTest < Minitest::Test end def test_variable_piping_with_no_args - text = %! {{ car.gm | add_smiley }} ! + text = %( {{ car.gm | add_smiley }} ) expected = %| bad :-) | assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) @@ -87,29 +86,29 @@ class OutputTest < Minitest::Test end def test_variable_piping_with_multiple_args - text = %! {{ car.gm | add_tag : 'span', 'bar'}} ! - expected = %| bad | + text = %( {{ car.gm | add_tag : 'span', 'bar'}} ) + expected = %( bad ) assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) end def test_variable_piping_with_variable_args - text = %! {{ car.gm | add_tag : 'span', car.bmw}} ! - expected = %| bad | + text = %( {{ car.gm | add_tag : 'span', car.bmw}} ) + expected = %( bad ) assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) end def test_multiple_pipings text = %( {{ best_cars | cite_funny | paragraph }} ) - expected = %|

LOL: bmw

| + expected = %(

LOL: bmw

) assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) end def test_link_to text = %( {{ 'Typo' | link_to: 'http://typo.leetsoft.com' }} ) - expected = %| Typo | + expected = %( Typo ) assert_equal expected, Template.parse(text).render!(@assigns, :filters => [FunnyFilter]) end diff --git a/test/integration/parsing_quirks_test.rb b/test/integration/parsing_quirks_test.rb index 7d0ada7..6f45a45 100644 --- a/test/integration/parsing_quirks_test.rb +++ b/test/integration/parsing_quirks_test.rb @@ -69,18 +69,18 @@ class ParsingQuirksTest < Minitest::Test def test_meaningless_parens_lax 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" - assert_template_result(' YES ',"{% if #{markup} %} YES {% endif %}", assigns) + assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}", assigns) end end def test_unexpected_characters_silently_eat_logic_lax with_error_mode(:lax) do markup = "true && false" - assert_template_result(' YES ',"{% if #{markup} %} YES {% endif %}") + assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}") markup = "false || true" - assert_template_result('',"{% if #{markup} %} YES {% endif %}") + assert_template_result('', "{% if #{markup} %} YES {% endif %}") end end @@ -92,7 +92,7 @@ class ParsingQuirksTest < Minitest::Test def test_unanchored_filter_arguments 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) }}") diff --git a/test/integration/render_profiling_test.rb b/test/integration/render_profiling_test.rb index 747fcb9..d43a20b 100644 --- a/test/integration/render_profiling_test.rb +++ b/test/integration/render_profiling_test.rb @@ -145,7 +145,7 @@ class RenderProfilingTest < Minitest::Test def test_profiling_marks_children_of_for_blocks 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 # Will profile each invocation of the for block diff --git a/test/integration/security_test.rb b/test/integration/security_test.rb index 427975c..033a953 100644 --- a/test/integration/security_test.rb +++ b/test/integration/security_test.rb @@ -11,30 +11,28 @@ class SecurityTest < Minitest::Test def test_no_instance_eval text = %( {{ '1+1' | instance_eval }} ) - expected = %| 1+1 | + expected = %( 1+1 ) assert_equal expected, Template.parse(text).render!(@assigns) end def test_no_existing_instance_eval text = %( {{ '1+1' | __instance_eval__ }} ) - expected = %| 1+1 | + expected = %( 1+1 ) assert_equal expected, Template.parse(text).render!(@assigns) end - def test_no_instance_eval_after_mixing_in_new_filter text = %( {{ '1+1' | instance_eval }} ) - expected = %| 1+1 | + expected = %( 1+1 ) assert_equal expected, Template.parse(text).render!(@assigns) end - def test_no_instance_eval_later_in_chain 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) end diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 9eef70b..8dc376c 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -49,7 +49,7 @@ class StandardFiltersTest < Minitest::Test end 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(nil) end @@ -80,16 +80,16 @@ class StandardFiltersTest < Minitest::Test def test_slice_on_arrays input = 'foobar'.split(//) - 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{}, @filters.slice(input, 1, 0) - assert_equal %w{o}, @filters.slice(input, 1, 1) - 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, 1000) - 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(o o b), @filters.slice(input, 1, 3) + assert_equal %w(o o b a r), @filters.slice(input, 1, 1000) + assert_equal %w(), @filters.slice(input, 1, 0) + assert_equal %w(o), @filters.slice(input, 1, 1) + 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, 1000) + assert_equal %w(r), @filters.slice(input, -1) + assert_equal %w(), @filters.slice(input, 100, 10) + assert_equal %w(), @filters.slice(input, -100, 10) end def test_truncate @@ -101,11 +101,11 @@ class StandardFiltersTest < Minitest::Test end def test_split - assert_equal ['12','34'], @filters.split('12~34', '~') - assert_equal ['A? ',' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~') + assert_equal ['12', '34'], @filters.split('12~34', '~') + assert_equal ['A? ', ' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~') assert_equal ['A?Z'], @filters.split('A?Z', '~') # 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, ' ') end @@ -142,45 +142,45 @@ class StandardFiltersTest < Minitest::Test end 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 def test_sort - 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 [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") end 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 def test_numerical_vs_lexicographical_sort 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 [{"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 def test_uniq - 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 [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") testdrop = TestDrop.new assert_equal [testdrop], @filters.uniq([testdrop, TestDrop.new], 'test') end 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 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 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' }}", - 'ary' => [{'foo' => {'bar' => 'a'}}, {'foo' => {'bar' => 'b'}}, {'foo' => {'bar' => 'c'}}] + 'ary' => [{ 'foo' => { 'bar' => 'a' } }, { 'foo' => { 'bar' => 'b' } }, { 'foo' => { 'bar' => 'c' } }] end def test_map_doesnt_call_arbitrary_stuff @@ -212,7 +212,7 @@ class StandardFiltersTest < Minitest::Test def test_map_over_proc drop = TestDrop.new - p = Proc.new{ drop } + p = proc{ drop } templ = '{{ procs | map: "test" }}' assert_template_result "testfoo", templ, "procs" => [p] end @@ -260,8 +260,8 @@ class StandardFiltersTest < Minitest::Test end def test_first_last - assert_equal 1, @filters.first([1,2,3]) - assert_equal 3, @filters.last([1,2,3]) + assert_equal 1, @filters.first([1, 2, 3]) + assert_equal 3, @filters.last([1, 2, 3]) assert_equal nil, @filters.first([]) assert_equal nil, @filters.last([]) end @@ -356,9 +356,9 @@ class StandardFiltersTest < Minitest::Test end def test_append - assigns = {'a' => 'bc', 'b' => 'd' } - assert_template_result('bcd',"{{ a | append: 'd'}}",assigns) - assert_template_result('bcd',"{{ a | append: b}}",assigns) + assigns = { 'a' => 'bc', 'b' => 'd' } + assert_template_result('bcd', "{{ a | append: 'd'}}", assigns) + assert_template_result('bcd', "{{ a | append: b}}", assigns) end def test_concat @@ -373,9 +373,9 @@ class StandardFiltersTest < Minitest::Test end def test_prepend - assigns = {'a' => 'bc', 'b' => 'a' } - assert_template_result('abc',"{{ a | prepend: 'a'}}",assigns) - assert_template_result('abc',"{{ a | prepend: b}}",assigns) + assigns = { 'a' => 'bc', 'b' => 'a' } + assert_template_result('abc', "{{ a | prepend: 'a'}}", assigns) + assert_template_result('abc', "{{ a | prepend: b}}", assigns) end def test_default @@ -388,6 +388,6 @@ class StandardFiltersTest < Minitest::Test end def test_cannot_access_private_methods - assert_template_result('a',"{{ 'a' | to_number }}") + assert_template_result('a', "{{ 'a' | to_number }}") end end # StandardFiltersTest diff --git a/test/integration/tags/break_tag_test.rb b/test/integration/tags/break_tag_test.rb index 1dd657b..6de955a 100644 --- a/test/integration/tags/break_tag_test.rb +++ b/test/integration/tags/break_tag_test.rb @@ -6,7 +6,7 @@ class BreakTagTest < Minitest::Test # tests that no weird errors are raised if break is called outside of a # block def test_break_with_no_block - assigns = {'i' => 1} + assigns = { 'i' => 1 } markup = '{% break %}' expected = '' diff --git a/test/integration/tags/for_tag_test.rb b/test/integration/tags/for_tag_test.rb index 23752bb..977bd65 100644 --- a/test/integration/tags/for_tag_test.rb +++ b/test/integration/tags/for_tag_test.rb @@ -10,10 +10,10 @@ class ForTagTest < Minitest::Test include Liquid def test_for - 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(' yo ','{%for item in array%} yo {%endfor%}','array' => [1]) - assert_template_result('','{%for item in array%}{%endfor%}','array' => [1,2]) + 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(' yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1]) + assert_template_result('', '{%for item in array%}{%endfor%}', 'array' => [1, 2]) expected = < [1,2,3]) + assert_template_result(expected, template, 'array' => [1, 2, 3]) end def test_for_reversed - assigns = {'array' => [ 1, 2, 3] } - assert_template_result('321','{%for item in array reversed %}{{item}}{%endfor%}',assigns) + assigns = { 'array' => [ 1, 2, 3] } + assert_template_result('321', '{%for item in array reversed %}{{item}}{%endfor%}', assigns) end 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 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 def test_for_with_hash_value_range 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 def test_for_with_drop_value_range 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 def test_for_with_variable - 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('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('abc','{%for item in array%}{{item}}{%endfor%}','array' => ['a','','b','','c']) + 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('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('abc', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', '', 'b', '', 'c']) end def test_for_helpers - assigns = {'array' => [1,2,3] } + assigns = { 'array' => [1, 2, 3] } assert_template_result(' 1/3 2/3 3/3 ', - '{%for item in array%} {{forloop.index}}/{{forloop.length}} {%endfor%}', - assigns) + '{%for item in array%} {{forloop.index}}/{{forloop.length}} {%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(' 2 1 0 ', '{%for item in array%} {{forloop.rindex0}} {%endfor%}', assigns) @@ -77,20 +77,20 @@ HERE end def test_for_and_if - assigns = {'array' => [1,2,3] } + assigns = { 'array' => [1, 2, 3] } assert_template_result('+--', - '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}', - assigns) + '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}', + assigns) end 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'=>[]) - assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>nil) + 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' => nil) end 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('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) @@ -98,7 +98,7 @@ HERE end 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['offset'] = 2 @@ -106,17 +106,17 @@ HERE end 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) end 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) end 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 {%for i in array.items limit: 3 %}{{i}}{%endfor%} next @@ -131,11 +131,11 @@ HERE next 789 XPCTD - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) end 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 {%for i in array.items limit:3 %}{{i}}{%endfor%} next @@ -150,11 +150,11 @@ HERE next 7 XPCTD - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) end 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 {%for i in array.items limit:3 %}{{i}}{%endfor%} next @@ -169,103 +169,102 @@ HERE next 7890 XPCTD - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) end - def test_pause_resume_BIG_offset - assigns = {'array' => {'items' => [1,2,3,4,5,6,7,8,9,0]}} - markup = %q({%for i in array.items limit:3 %}{{i}}{%endfor%} + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = '{%for i in array.items limit:3 %}{{i}}{%endfor%} next {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} next - {%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%}) - expected = %q(123 + {%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%}' + expected = '123 next 456 next - ) - assert_template_result(expected,markup,assigns) + ' + assert_template_result(expected, markup, assigns) end 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 %}' expected = "" - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}' expected = "1" - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}' 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 %}' 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 # and not all of them. - assigns = {'array' => [[1,2],[3,4],[5,6]] } - markup = '{% for item in array %}' + - '{% for i in item %}' + - '{% if i == 1 %}' + - '{% break %}' + - '{% endif %}' + - '{{ i }}' + - '{% endfor %}' + + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + markup = '{% for item in array %}' \ + '{% for i in item %}' \ + '{% if i == 1 %}' \ + '{% break %}' \ + '{% endif %}' \ + '{{ i }}' \ + '{% endfor %}' \ '{% endfor %}' expected = '3456' assert_template_result(expected, markup, assigns) # 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 %}' expected = '12345' assert_template_result(expected, markup, assigns) end 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 %}' expected = "" - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}' expected = "12345" - assert_template_result(expected,markup,assigns) + assert_template_result(expected, markup, assigns) markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}' 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 %}' 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 %}' 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. - assigns = {'array' => [[1,2],[3,4],[5,6]] } - markup = '{% for item in array %}' + - '{% for i in item %}' + - '{% if i == 1 %}' + - '{% continue %}' + - '{% endif %}' + - '{{ i }}' + - '{% endfor %}' + + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + markup = '{% for item in array %}' \ + '{% for i in item %}' \ + '{% if i == 1 %}' \ + '{% continue %}' \ + '{% endif %}' \ + '{{ i }}' \ + '{% endfor %}' \ '{% endfor %}' expected = '23456' assert_template_result(expected, markup, assigns) # 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 %}' expected = '12345' assert_template_result(expected, markup, assigns) @@ -277,41 +276,41 @@ HERE # the functionality for backwards compatibility assert_template_result('test string', - '{%for val in string%}{{val}}{%endfor%}', - 'string' => "test string") + '{%for val in string%}{{val}}{%endfor%}', + 'string' => "test string") assert_template_result('test string', - '{%for val in string limit:1%}{{val}}{%endfor%}', - 'string' => "test string") + '{%for val in string limit:1%}{{val}}{%endfor%}', + 'string' => "test string") assert_template_result('val-string-1-1-0-1-0-true-true-test string', - '{%for val in string%}' + - '{{forloop.name}}-' + - '{{forloop.index}}-' + - '{{forloop.length}}-' + - '{{forloop.index0}}-' + - '{{forloop.rindex}}-' + - '{{forloop.rindex0}}-' + - '{{forloop.first}}-' + - '{{forloop.last}}-' + - '{{val}}{%endfor%}', - 'string' => "test string") + '{%for val in string%}' \ + '{{forloop.name}}-' \ + '{{forloop.index}}-' \ + '{{forloop.length}}-' \ + '{{forloop.index0}}-' \ + '{{forloop.rindex}}-' \ + '{{forloop.rindex0}}-' \ + '{{forloop.first}}-' \ + '{{forloop.last}}-' \ + '{{val}}{%endfor%}', + 'string' => "test string") end def test_for_parentloop_references_parent_loop assert_template_result('1.1 1.2 1.3 2.1 2.2 2.3 ', - '{% for inner in outer %}{% for k in inner %}' + - '{{ forloop.parentloop.index }}.{{ forloop.index }} ' + - '{% endfor %}{% endfor %}', - 'outer' => [[1, 1, 1], [1, 1, 1]]) + '{% for inner in outer %}{% for k in inner %}' \ + '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \ + '{% endfor %}{% endfor %}', + 'outer' => [[1, 1, 1], [1, 1, 1]]) end def test_for_parentloop_nil_when_not_present assert_template_result('.1 .2 ', - '{% for inner in outer %}' + - '{{ forloop.parentloop.index }}.{{ forloop.index }} ' + - '{% endfor %}', - 'outer' => [[1, 1, 1], [1, 1, 1]]) + '{% for inner in outer %}' \ + '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \ + '{% endfor %}', + 'outer' => [[1, 1, 1], [1, 1, 1]]) end def test_blank_string_not_iterable @@ -327,7 +326,7 @@ HERE def test_spacing_with_variable_naming_in_for_loop expected = '12345' 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) end @@ -345,13 +344,13 @@ HERE def load_slice(from, to) @load_slice_called = true - @data[(from..to-1)] + @data[(from..to - 1)] end end def test_iterate_with_each_when_no_limit_applied - loader = LoaderDrop.new([1,2,3,4,5]) - assigns = {'items' => loader} + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } expected = '12345' template = '{% for item in items %}{{item}}{% endfor %}' assert_template_result(expected, template, assigns) @@ -360,8 +359,8 @@ HERE end def test_iterate_with_load_slice_when_limit_applied - loader = LoaderDrop.new([1,2,3,4,5]) - assigns = {'items' => loader} + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } expected = '1' template = '{% for item in items limit:1 %}{{item}}{% endfor %}' assert_template_result(expected, template, assigns) @@ -370,8 +369,8 @@ HERE end def test_iterate_with_load_slice_when_limit_and_offset_applied - loader = LoaderDrop.new([1,2,3,4,5]) - assigns = {'items' => loader} + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } expected = '34' template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' assert_template_result(expected, template, assigns) @@ -380,9 +379,9 @@ HERE end def test_iterate_with_load_slice_returns_same_results_as_without - loader = LoaderDrop.new([1,2,3,4,5]) - loader_assigns = {'items' => loader} - array_assigns = {'items' => [1,2,3,4,5]} + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + loader_assigns = { 'items' => loader } + array_assigns = { 'items' => [1, 2, 3, 4, 5] } expected = '34' template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' assert_template_result(expected, template, loader_assigns) diff --git a/test/integration/tags/if_else_tag_test.rb b/test/integration/tags/if_else_tag_test.rb index 3e1797e..73a7acc 100644 --- a/test/integration/tags/if_else_tag_test.rb +++ b/test/integration/tags/if_else_tag_test.rb @@ -4,101 +4,100 @@ class IfElseTagTest < Minitest::Test include Liquid 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 ', - ' {% 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 %}?') + ' {% 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 %}?') end def test_literal_comparisons - 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(' NO ', '{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}') + assert_template_result(' YES ', '{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}') end def test_if_else - 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 "foo" %} YES {% else %} NO {% 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 "foo" %} YES {% else %} NO {% endif %}') end 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 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' => 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' => 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' => false, 'b' => true) 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) end 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 == 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(' 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('', '{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true) end 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" - 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) + 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) end def test_comparison_of_expressions_starting_with_and_or_or - assigns = {'order' => {'items_count' => 0}, 'android' => {'name' => 'Roy'}} - assert_template_result( "YES", - "{% if android.name == 'Roy' %}YES{% endif %}", - assigns) - assert_template_result( "YES", - "{% if order.items_count == 0 %}YES{% endif %}", - assigns) + assigns = { 'order' => { 'items_count' => 0 }, 'android' => { 'name' => 'Roy' } } + assert_template_result("YES", + "{% if android.name == 'Roy' %}YES{% endif %}", + assigns) + assert_template_result("YES", + "{% if order.items_count == 0 %}YES{% endif %}", + assigns) end def test_if_and - 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(' 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 %}') end - 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 def test_if_from_variable - assert_template_result('','{% if var %} NO {% endif %}', 'var' => false) - 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' => {}) - assert_template_result('','{% if foo.bar %} NO {% endif %}', 'foo' => nil) - assert_template_result('','{% if foo.bar %} NO {% endif %}', 'foo' => true) + assert_template_result('', '{% if var %} NO {% endif %}', 'var' => false) + 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' => {}) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => nil) + 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' => true) - 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 "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' => "text"}) - 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 var %} YES {% endif %}', 'var' => "text") + 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' => {}) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => []) + 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' => "text" }) + 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 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 %} YES {% else %} NO {% endif %}', 'var' => true) - assert_template_result(' YES ','{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text") + 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 %} YES {% else %} NO {% endif %}', 'var' => true) + 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 %} 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 %} 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 %}', 'notfoo' => {'bar' => true}) + 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' => "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' => {}) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => { 'bar' => true }) end 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 false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}') assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}') - end 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 def test_else_if - 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('2','{% 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('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 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 def test_syntax_error_no_expression @@ -156,7 +154,7 @@ class IfElseTagTest < Minitest::Test Condition.operators['contains'] = :[] 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 Condition.operators['contains'] = original_op end diff --git a/test/integration/tags/include_tag_test.rb b/test/integration/tags/include_tag_test.rb index 32f2f5c..613524d 100644 --- a/test/integration/tags/include_tag_test.rb +++ b/test/integration/tags/include_tag_test.rb @@ -77,23 +77,22 @@ class IncludeTagTest < Minitest::Test def test_include_tag_looks_for_file_system_in_registers_first 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 - def test_include_tag_with 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 def test_include_tag_with_default_name assert_template_result "Product: Draft 151cm ", - "{% include 'product' %}", "product" => {'title' => 'Draft 151cm'} + "{% include 'product' %}", "product" => { 'title' => 'Draft 151cm' } end def test_include_tag_for 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 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 assert_template_result "Locale: test123 test321", "{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}", - 'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321'} + 'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321' } end def test_included_templates_assigns_variables @@ -123,14 +122,13 @@ class IncludeTagTest < Minitest::Test def test_nested_include_with_variable 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 ", - "{% 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 def test_recursively_included_template_does_not_produce_endless_loop - infinite_file_system = Class.new do def read_template_file(template_path) "-{% include 'loop' %}" @@ -142,7 +140,6 @@ class IncludeTagTest < Minitest::Test assert_raises(Liquid::StackLevelError, SystemStackError) do Template.parse("{% include 'loop' %}").render! end - end def test_dynamically_choosen_template @@ -150,24 +147,24 @@ class IncludeTagTest < Minitest::Test assert_template_result "Test321", "{% include template %}", "template" => 'Test321' assert_template_result "Product: Draft 151cm ", "{% include template for product %}", - "template" => 'product', 'product' => { 'title' => 'Draft 151cm'} + "template" => 'product', 'product' => { 'title' => 'Draft 151cm' } end def test_include_tag_caches_second_read_of_same_partial file_system = CountingFileSystem.new 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 end def test_include_tag_doesnt_cache_partials_across_renders file_system = CountingFileSystem.new 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 '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 end @@ -223,8 +220,8 @@ class IncludeTagTest < Minitest::Test def test_including_via_variable_value 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 # IncludeTagTest diff --git a/test/integration/tags/increment_tag_test.rb b/test/integration/tags/increment_tag_test.rb index a09a041..08bbeae 100644 --- a/test/integration/tags/increment_tag_test.rb +++ b/test/integration/tags/increment_tag_test.rb @@ -4,21 +4,21 @@ class IncrementTagTest < Minitest::Test include Liquid def test_inc - assert_template_result('0','{%increment port %}', {}) - assert_template_result('0 1','{%increment port %} {%increment port%}', {}) + assert_template_result('0', '{%increment port %}', {}) + assert_template_result('0 1', '{%increment port %} {%increment port%}', {}) assert_template_result('0 0 1 2 1', - '{%increment port %} {%increment starboard%} ' + - '{%increment port %} {%increment port%} ' + - '{%increment starboard %}', {}) + '{%increment port %} {%increment starboard%} ' \ + '{%increment port %} {%increment port%} ' \ + '{%increment starboard %}', {}) end def test_dec - assert_template_result('9','{%decrement port %}', { 'port' => 10}) - assert_template_result('-1 -2','{%decrement port %} {%decrement port%}', {}) + assert_template_result('9', '{%decrement port %}', { 'port' => 10 }) + assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {}) assert_template_result('1 5 2 2 5', - '{%increment port %} {%increment starboard%} ' + - '{%increment port %} {%decrement port%} ' + - '{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 }) + '{%increment port %} {%increment starboard%} ' \ + '{%increment port %} {%decrement port%} ' \ + '{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 }) end end diff --git a/test/integration/tags/raw_tag_test.rb b/test/integration/tags/raw_tag_test.rb index 167474c..e50874a 100644 --- a/test/integration/tags/raw_tag_test.rb +++ b/test/integration/tags/raw_tag_test.rb @@ -5,7 +5,7 @@ class RawTagTest < Minitest::Test def test_tag_in_raw assert_template_result '{% comment %} test {% endcomment %}', - '{% raw %}{% comment %} test {% endcomment %}{% endraw %}' + '{% raw %}{% comment %} test {% endcomment %}{% endraw %}' end def test_output_in_raw diff --git a/test/integration/tags/standard_tag_test.rb b/test/integration/tags/standard_tag_test.rb index c8221b6..43b9ac1 100644 --- a/test/integration/tags/standard_tag_test.rb +++ b/test/integration/tags/standard_tag_test.rb @@ -5,116 +5,116 @@ class StandardTagTest < Minitest::Test def test_no_transform 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('','') - assert_template_result('|,.:','|,.:') - assert_template_result('','') + assert_template_result('blah', 'blah') + assert_template_result('', '') + assert_template_result('|,.:', '|,.:') + assert_template_result('', '') - text = %|this shouldnt see any transformation either but has multiple lines - as you can clearly see here ...| - assert_template_result(text,text) + text = %(this shouldnt see any transformation either but has multiple lines + as you can clearly see here ...) + assert_template_result(text, text) end def test_has_a_block_which_does_nothing - assert_template_result(%|the comment block should be removed .. right?|, - %|the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?|) + assert_template_result(%(the comment block should be removed .. 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%}comment{%endcomment%}') - assert_template_result('','{% comment %}comment{% endcomment %}') - assert_template_result('','{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% 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 %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}') - assert_template_result('','{%comment%}{%blabla%}{%endcomment%}') - assert_template_result('','{% comment %}{% blabla %}{% endcomment %}') - assert_template_result('','{%comment%}{% endif %}{%endcomment%}') - assert_template_result('','{% comment %}{% endwhatever %}{% endcomment %}') - assert_template_result('','{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}') + assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}') + assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}') + assert_template_result('', '{%comment%}{% endif %}{%endcomment%}') + assert_template_result('', '{% comment %}{% endwhatever %}{% 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%}comment{%endcomment%} bar') - assert_template_result('foo bar','foo {%comment%} 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('foobar','foo{%comment%} + assert_template_result('foobar', 'foo{%comment%} {%endcomment%}bar') end 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) end 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) end def test_capture - assigns = {'var' => 'content' } + assigns = { 'var' => 'content' } assert_template_result('content foo content foo ', - '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', - assigns) + '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', + assigns) end def test_capture_detects_bad_syntax assert_raises(SyntaxError) do assert_template_result('content foo content foo ', - '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', - {'var' => 'content' }) + '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', + { 'var' => 'content' }) end end def test_case - assigns = {'condition' => 2 } + assigns = { 'condition' => 2 } assert_template_result(' its 2 ', - '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', - assigns) + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) - assigns = {'condition' => 1 } + assigns = { 'condition' => 1 } assert_template_result(' its 1 ', - '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', - assigns) + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) - assigns = {'condition' => 3 } + assigns = { 'condition' => 3 } assert_template_result('', - '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', - assigns) + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) - assigns = {'condition' => "string here" } + assigns = { 'condition' => "string here" } assert_template_result(' hit ', - '{% case condition %}{% when "string here" %} hit {% endcase %}', - assigns) + '{% case condition %}{% when "string here" %} hit {% endcase %}', + assigns) - assigns = {'condition' => "bad string here" } + assigns = { 'condition' => "bad string here" } assert_template_result('', - '{% case condition %}{% when "string here" %} hit {% endcase %}',\ - assigns) + '{% case condition %}{% when "string here" %} hit {% endcase %}',\ + assigns) end def test_case_with_else - assigns = {'condition' => 5 } + assigns = { 'condition' => 5 } assert_template_result(' hit ', - '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', - assigns) + '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', + assigns) - assigns = {'condition' => 6 } + assigns = { 'condition' => 6 } assert_template_result(' else ', - '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', - assigns) + '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', + assigns) - assigns = {'condition' => 6 } + assigns = { 'condition' => 6 } assert_template_result(' else ', - '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}', - assigns) + '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}', + assigns) end def test_case_on_size @@ -128,87 +128,87 @@ class StandardTagTest < Minitest::Test def test_case_on_size_with_else assert_template_result('else', - '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', - 'a' => []) + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => []) assert_template_result('1', - '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', - 'a' => [1]) + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1]) assert_template_result('2', - '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', - 'a' => [1, 1]) + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1]) assert_template_result('else', - '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', - 'a' => [1, 1, 1]) + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1]) assert_template_result('else', - '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', - 'a' => [1, 1, 1, 1]) + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1, 1]) assert_template_result('else', - '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', - 'a' => [1, 1, 1, 1, 1]) + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1, 1, 1]) end def test_case_on_length_with_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', - '{% 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', - '{% 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', - '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', - {}) + '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) end def test_assign_from_case # 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) - assert_equal "menswear", template.render!("collection" => {'handle' => 'menswear-jackets'}) - 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' => 'y'}) - assert_equal "womenswear", template.render!("collection" => {'handle' => 'z'}) + assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' }) + 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' => 'y' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' }) end 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 %}' - 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' => 3 }) - assert_template_result(' its 4 ', code, {'condition' => 4 }) - assert_template_result('', code, {'condition' => 5 }) + 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' => 3 }) + assert_template_result(' its 4 ', code, { 'condition' => 4 }) + 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 %}' - 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' => nil }) - assert_template_result('', code, {'condition' => 'something else' }) + 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' => nil }) + assert_template_result('', code, { 'condition' => 'something else' }) end def test_case_when_comma 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' => 2 }) - assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 }) - assert_template_result(' its 4 ', code, {'condition' => 4 }) - assert_template_result('', code, {'condition' => 5 }) + 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' => 3 }) + assert_template_result(' its 4 ', code, { 'condition' => 4 }) + assert_template_result('', code, { 'condition' => 5 }) 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' => 'string' }) - assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil }) - assert_template_result('', code, {'condition' => 'something else' }) + 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' => nil }) + assert_template_result('', code, { 'condition' => 'something else' }) end def test_assign @@ -236,15 +236,14 @@ class StandardTagTest < Minitest::Test assert_raises(SyntaxError) do assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {}) end - end def test_cycle - assert_template_result('one','{%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('one', '{%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('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', '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}') @@ -261,18 +260,18 @@ class StandardTagTest < Minitest::Test end 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', '{%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 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) end 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) end @@ -284,11 +283,11 @@ class StandardTagTest < Minitest::Test end def test_ifchanged - assigns = {'array' => [ 1, 1, 2, 2, 3, 3] } - assert_template_result('123','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns) + assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] } + assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns) - assigns = {'array' => [ 1, 1, 1, 1] } - assert_template_result('1','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns) + assigns = { 'array' => [ 1, 1, 1, 1] } + assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns) end def test_multiline_tag diff --git a/test/integration/tags/statements_test.rb b/test/integration/tags/statements_test.rb index a7b3bad..eeff166 100644 --- a/test/integration/tags/statements_test.rb +++ b/test/integration/tags/statements_test.rb @@ -37,7 +37,6 @@ class StatementsTest < Minitest::Test text = ' {% if null <= 0 %} true {% else %} false {% endif %} ' assert_template_result ' false ', text - text = ' {% if 0 <= null %} true {% else %} false {% endif %} ' assert_template_result ' false ', text end @@ -72,18 +71,17 @@ class StatementsTest < Minitest::Test assert_template_result ' true ', text, 'var' => 'hello there!' end - def test_var_and_long_string_are_equal_backwards text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} " assert_template_result ' true ', text, 'var' => 'hello there!' end - #def test_is_nil + # def test_is_nil # text = %| {% if var != nil %} true {% else %} false {% end %} | # @template.assigns = { 'var' => 'hello there!'} # expected = %| true | # assert_equal expected, @template.parse(text) - #end + # end def test_is_collection_empty text = ' {% if array == empty %} true {% else %} false {% endif %} ' @@ -92,7 +90,7 @@ class StatementsTest < Minitest::Test def test_is_not_collection_empty 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 def test_nil diff --git a/test/integration/tags/table_row_test.rb b/test/integration/tags/table_row_test.rb index 3751963..6405a9c 100644 --- a/test/integration/tags/table_row_test.rb +++ b/test/integration/tags/table_row_test.rb @@ -16,48 +16,45 @@ class TableRowTest < Minitest::Test end def test_table_row - assert_template_result("\n 1 2 3 \n 4 5 6 \n", - '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', - 'numbers' => [1,2,3,4,5,6]) + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) assert_template_result("\n\n", - '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', - 'numbers' => []) + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => []) end def test_table_row_with_different_cols assert_template_result("\n 1 2 3 4 5 \n 6 \n", - '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}', - 'numbers' => [1,2,3,4,5,6]) - + '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) end def test_table_col_counter assert_template_result("\n12\n12\n12\n", - '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}', - 'numbers' => [1,2,3,4,5,6]) + '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) end def test_quoted_fragment assert_template_result("\n 1 2 3 \n 4 5 6 \n", - "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}", - 'collections' => {'frontpage' => [1,2,3,4,5,6]}) + "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}", + 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] }) assert_template_result("\n 1 2 3 \n 4 5 6 \n", - "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}", - 'collections' => {'frontpage' => [1,2,3,4,5,6]}) - + "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}", + 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] }) end def test_enumerable_drop assert_template_result("\n 1 2 3 \n 4 5 6 \n", - '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', - 'numbers' => ArrayDrop.new([1,2,3,4,5,6])) + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6])) end def test_offset_and_limit assert_template_result("\n 1 2 3 \n 4 5 6 \n", - '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}', - 'numbers' => [0,1,2,3,4,5,6,7]) + '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}', + 'numbers' => [0, 1, 2, 3, 4, 5, 6, 7]) end end diff --git a/test/integration/tags/unless_else_tag_test.rb b/test/integration/tags/unless_else_tag_test.rb index ba147cf..c414a71 100644 --- a/test/integration/tags/unless_else_tag_test.rb +++ b/test/integration/tags/unless_else_tag_test.rb @@ -4,16 +4,16 @@ class UnlessElseTagTest < Minitest::Test include Liquid 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 ', - ' {% 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 %}?') + ' {% 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 %}?') end def test_unless_else - 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 "foo" %} 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 "foo" %} NO {% else %} YES {% endunless %}') end def test_unless_in_loop diff --git a/test/integration/template_test.rb b/test/integration/template_test.rb index e0fc528..977101a 100644 --- a/test/integration/template_test.rb +++ b/test/integration/template_test.rb @@ -45,7 +45,7 @@ class TemplateTest < Minitest::Test end t = Template.parse(str) - assert_equal [], Timeout::timeout(1) { t.warnings } + assert_equal [], Timeout.timeout(1) { t.warnings } end 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 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.render! @@ -84,7 +84,7 @@ class TemplateTest < Minitest::Test def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders 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.render!(assigns) @@ -100,51 +100,51 @@ class TemplateTest < Minitest::Test def test_resource_limits_render_length t = Template.parse("0123456789") 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? t.resource_limits.render_length_limit = 10 - assert_equal "0123456789", t.render!() + assert_equal "0123456789", t.render! refute_nil t.resource_limits.render_length end def test_resource_limits_render_score t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}") 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? t = Template.parse("{% for a in (1..100) %} foo {% endfor %}") 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? 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 end def test_resource_limits_assign_score t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}") 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? t.resource_limits.assign_score_limit = 2 - assert_equal "", t.render!() + assert_equal "", t.render! refute_nil t.resource_limits.assign_score end 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.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? end 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.render!() + t.render! assert t.resource_limits.assign_score > 0 assert t.resource_limits.render_score > 0 assert t.resource_limits.render_length > 0 @@ -153,23 +153,23 @@ class TemplateTest < Minitest::Test def test_render_length_persists_between_blocks t = Template.parse("{% if true %}aaaa{% endif %}") 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 - assert_equal "aaaa", t.render() + assert_equal "aaaa", t.render t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}") 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 - 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.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 - 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 - assert_equal "ababab", t.render() + assert_equal "ababab", t.render end def test_default_resource_limits_unaffected_by_render_with_context @@ -191,7 +191,7 @@ class TemplateTest < Minitest::Test end 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 }}') e = assert_raises RuntimeError do diff --git a/test/integration/variable_test.rb b/test/integration/variable_test.rb index b55d88a..e8e4f00 100644 --- a/test/integration/variable_test.rb +++ b/test/integration/variable_test.rb @@ -4,7 +4,7 @@ class VariableTest < Minitest::Test include Liquid def test_simple_variable - template = Template.parse(%|{{test}}|) + template = Template.parse(%({{test}})) assert_equal 'worked', template.render!('test' => 'worked') assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully') end @@ -14,19 +14,19 @@ class VariableTest < Minitest::Test end def test_simple_with_whitespaces - template = Template.parse(%| {{ test }} |) + template = Template.parse(%( {{ test }} )) assert_equal ' worked ', template.render!('test' => 'worked') assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully') end def test_ignore_unknown - template = Template.parse(%|{{ test }}|) + template = Template.parse(%({{ test }})) assert_equal '', template.render! end def test_hash_scoping - template = Template.parse(%|{{ test.test }}|) - assert_equal 'worked', template.render!('test' => {'test' => 'worked'}) + template = Template.parse(%({{ test.test }})) + assert_equal 'worked', template.render!('test' => { 'test' => 'worked' }) end def test_false_renders_as_false @@ -40,23 +40,23 @@ class VariableTest < Minitest::Test end def test_preset_assigns - template = Template.parse(%|{{ test }}|) + template = Template.parse(%({{ test }})) template.assigns['test'] = 'worked' assert_equal 'worked', template.render! end def test_reuse_parsed_template - template = Template.parse(%|{{ greeting }} {{ name }}|) + template = Template.parse(%({{ greeting }} {{ name }})) template.assigns['greeting'] = 'Goodbye' assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi') assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi') assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian') assert_equal 'Goodbye Brian', template.render!('name' => 'Brian') - assert_equal({'greeting'=>'Goodbye'}, template.assigns) + assert_equal({ 'greeting' => 'Goodbye' }, template.assigns) end 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' assert_equal 'bazbar', template.render! assert_equal 'bazbar', template.render! @@ -65,8 +65,8 @@ class VariableTest < Minitest::Test end def test_hash_with_default_proc - template = Template.parse(%|Hello {{ test }}|) - assigns = Hash.new { |h,k| raise "Unknown variable '#{k}'" } + template = Template.parse(%(Hello {{ test }})) + assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" } assigns['test'] = 'Tobi' assert_equal 'Hello Tobi', template.render!(assigns) assigns.delete('test') diff --git a/test/unit/block_unit_test.rb b/test/unit/block_unit_test.rb index 09bbbea..106c4d4 100644 --- a/test/unit/block_unit_test.rb +++ b/test/unit/block_unit_test.rb @@ -34,7 +34,7 @@ class BlockUnitTest < Minitest::Test template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ") assert_equal 7, template.root.nodelist.size assert_equal [String, Variable, String, Variable, String, Variable, String], - block_types(template.root.nodelist) + block_types(template.root.nodelist) end def test_with_block @@ -45,11 +45,12 @@ class BlockUnitTest < Minitest::Test def test_with_custom_tag Liquid::Template.register_tag("testtag", Block) - assert Liquid::Template.parse( "{% testtag %} {% endtesttag %}") + assert Liquid::Template.parse("{% testtag %} {% endtesttag %}") end private - def block_types(nodelist) - nodelist.collect { |node| node.class } - end + + def block_types(nodelist) + nodelist.collect(&:class) + end end # VariableTest diff --git a/test/unit/condition_unit_test.rb b/test/unit/condition_unit_test.rb index c2348a4..2ffecf6 100644 --- a/test/unit/condition_unit_test.rb +++ b/test/unit/condition_unit_test.rb @@ -62,15 +62,15 @@ class ConditionUnitTest < Minitest::Test def test_contains_works_on_arrays @context = Liquid::Context.new - @context['array'] = [1,2,3,4,5] + @context['array'] = [1, 2, 3, 4, 5] array_expr = VariableLookup.new("array") assert_evalutes_false array_expr, 'contains', 0 - assert_evalutes_true array_expr, 'contains', 1 - assert_evalutes_true array_expr, 'contains', 2 - assert_evalutes_true array_expr, 'contains', 3 - assert_evalutes_true array_expr, 'contains', 4 - assert_evalutes_true array_expr, 'contains', 5 + assert_evalutes_true array_expr, 'contains', 1 + assert_evalutes_true array_expr, 'contains', 2 + assert_evalutes_true array_expr, 'contains', 3 + assert_evalutes_true array_expr, 'contains', 4 + assert_evalutes_true array_expr, 'contains', 5 assert_evalutes_false array_expr, 'contains', 6 assert_evalutes_false array_expr, 'contains', "1" end @@ -114,9 +114,9 @@ class ConditionUnitTest < Minitest::Test end 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' ensure Condition.operators.delete 'starts_with' @@ -130,20 +130,21 @@ class ConditionUnitTest < Minitest::Test end 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) - assert !Condition.new(left, op, right).evaluate(@context || Liquid::Context.new), - "Evaluated true: #{left} #{op} #{right}" - end + 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_evaluates_argument_error(left, op, right) - assert_raises(Liquid::ArgumentError) do - Condition.new(left, op, right).evaluate(@context || Liquid::Context.new) - end + def assert_evalutes_false(left, op, right) + assert !Condition.new(left, op, right).evaluate(@context || Liquid::Context.new), + "Evaluated true: #{left} #{op} #{right}" + 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 # ConditionTest diff --git a/test/unit/context_unit_test.rb b/test/unit/context_unit_test.rb index b649483..a90a9cd 100644 --- a/test/unit/context_unit_test.rb +++ b/test/unit/context_unit_test.rb @@ -122,30 +122,25 @@ class ContextUnitTest < Minitest::Test end def test_length_query - - @context['numbers'] = [1,2,3,4] + @context['numbers'] = [1, 2, 3, 4] 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'] - @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'] - end def test_hyphenated_variable - @context['oh-my'] = 'godz' assert_equal 'godz', @context['oh-my'] - end def test_add_filter - filter = Module.new do def hi(output) output + ' hi!' @@ -161,11 +156,9 @@ class ContextUnitTest < Minitest::Test context.add_filters(filter) assert_equal 'hi? hi!', context.invoke(:hi, 'hi?') - end def test_only_intended_filters_make_it_there - filter = Module.new do def hi(output) output + ' hi!' @@ -196,7 +189,7 @@ class ContextUnitTest < Minitest::Test end def test_hierachical_data - @context['hash'] = {"name" => 'tobi'} + @context['hash'] = { "name" => 'tobi' } assert_equal 'tobi', @context['hash.name'] assert_equal 'tobi', @context['hash["name"]'] end @@ -225,7 +218,7 @@ class ContextUnitTest < Minitest::Test end 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 2, @context['test[1]'] @@ -235,21 +228,21 @@ class ContextUnitTest < Minitest::Test end 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]'] - @context['test'] = [{'test' => 'worked'}] + @context['test'] = [{ 'test' => 'worked' }] assert_equal 'worked', @context['test[0].test'] end def test_hash_to_array_transition @context['colors'] = { - 'Blue' => ['003366','336699', '6699CC', '99CCFF'], - 'Green' => ['003300','336633', '669966', '99CC99'], - 'Yellow' => ['CC9900','FFCC00', 'FFFF99', 'FFFFCC'], - 'Red' => ['660000','993333', 'CC6666', 'FF9999'] + 'Blue' => ['003366', '336699', '6699CC', '99CCFF'], + 'Green' => ['003300', '336633', '669966', '99CC99'], + 'Yellow' => ['CC9900', 'FFCC00', 'FFFF99', 'FFFFCC'], + 'Red' => ['660000', '993333', 'CC6666', 'FF9999'] } assert_equal '003366', @context['colors.Blue[0]'] @@ -257,12 +250,12 @@ class ContextUnitTest < Minitest::Test end 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 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 5, @context['test.test.last'] @@ -273,8 +266,8 @@ class ContextUnitTest < Minitest::Test end def test_access_hashes_with_hash_notation - @context['products'] = {'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } - @context['product'] = {'variants' => [ {'title' => 'draft151cm'}, {'title' => 'element151cm'} ]} + @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } + @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] } assert_equal 5, @context['products["count"]'] assert_equal 'deepsnow', @context['products["tags"][0]'] @@ -294,18 +287,17 @@ class ContextUnitTest < Minitest::Test end def test_access_hashes_with_hash_access_variables - @context['var'] = 'tags' - @context['nested'] = {'var' => 'tags'} - @context['products'] = {'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } + @context['nested'] = { 'var' => 'tags' } + @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } assert_equal 'deepsnow', @context['products[var].first'] assert_equal 'freestyle', @context['products[nested.var].last'] end def test_hash_notation_only_for_hash_access - @context['array'] = [1,2,3,4,5] - @context['hash'] = {'first' => 'Hello'} + @context['array'] = [1, 2, 3, 4, 5] + @context['hash'] = { 'first' => 'Hello' } assert_equal 1, @context['array.first'] assert_equal nil, @context['array["first"]'] @@ -313,66 +305,64 @@ class ContextUnitTest < Minitest::Test end 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 'element151cm', @context['product.variants[1].title'] assert_equal 'draft151cm', @context['product.variants.first.title'] assert_equal 'element151cm', @context['product.variants.last.title'] - end def test_cents - @context.merge( "cents" => HundredCentes.new ) + @context.merge("cents" => HundredCentes.new) assert_equal 100, @context['cents'] end def test_nested_cents - @context.merge( "cents" => { 'amount' => HundredCentes.new} ) + @context.merge("cents" => { 'amount' => HundredCentes.new }) 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'] end def test_cents_through_drop - @context.merge( "cents" => CentsDrop.new ) + @context.merge("cents" => CentsDrop.new) assert_equal 100, @context['cents.amount'] end 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'] end def test_drop_methods_with_question_marks - @context.merge( "cents" => CentsDrop.new ) + @context.merge("cents" => CentsDrop.new) assert @context['cents.non_zero?'] end 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'] end 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'] end def test_ranges - @context.merge( "test" => '5' ) + @context.merge("test" => '5') assert_equal (1..5), @context['(1..5)'] assert_equal (1..5), @context['(1..test)'] assert_equal (5..5), @context['(test..test)'] end 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'] - @context.merge( "cents" => { "cents" => {"cents" => CentsDrop.new}} ) + @context.merge("cents" => { "cents" => { "cents" => CentsDrop.new } }) assert_equal 100, @context['cents.cents.cents.amount'] end @@ -393,7 +383,7 @@ class ContextUnitTest < Minitest::Test end def test_proc_as_variable - @context['dynamic'] = Proc.new { 'Hello' } + @context['dynamic'] = proc { 'Hello' } assert_equal 'Hello', @context['dynamic'] end @@ -411,7 +401,7 @@ class ContextUnitTest < Minitest::Test end 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]'] end @@ -437,7 +427,7 @@ class ContextUnitTest < Minitest::Test end 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]'] @@ -472,11 +462,10 @@ class ContextUnitTest < Minitest::Test end 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_nil contx['poutine'] end - end # ContextTest diff --git a/test/unit/file_system_unit_test.rb b/test/unit/file_system_unit_test.rb index da09eed..2c7250b 100644 --- a/test/unit/file_system_unit_test.rb +++ b/test/unit/file_system_unit_test.rb @@ -11,7 +11,7 @@ class FileSystemUnitTest < Minitest::Test def test_local 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_raises(FileSystemError) do @@ -29,7 +29,7 @@ class FileSystemUnitTest < Minitest::Test def test_custom_template_filename_patterns 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") end end # FileSystemTest diff --git a/test/unit/i18n_unit_test.rb b/test/unit/i18n_unit_test.rb index 389ea56..867a9ca 100644 --- a/test/unit/i18n_unit_test.rb +++ b/test/unit/i18n_unit_test.rb @@ -24,7 +24,7 @@ class I18nUnitTest < Minitest::Test # @i18n.translate("whatever", :oopstypos => "yes") # end # end - + def test_raises_unknown_translation assert_raises I18n::TranslationError do @i18n.translate("doesnt_exist") diff --git a/test/unit/lexer_unit_test.rb b/test/unit/lexer_unit_test.rb index c331380..af9c267 100644 --- a/test/unit/lexer_unit_test.rb +++ b/test/unit/lexer_unit_test.rb @@ -4,23 +4,23 @@ class LexerUnitTest < Minitest::Test include Liquid def test_strings - tokens = Lexer.new(%! 'this is a test""' "wat 'lol'"!).tokenize - assert_equal [[:string,%!'this is a test""'!], [:string, %!"wat 'lol'"!], [:end_of_string]], tokens + tokens = Lexer.new(%( 'this is a test""' "wat 'lol'")).tokenize + assert_equal [[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens end def test_integer 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 def test_float 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 def test_comparison 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 def test_specials @@ -40,7 +40,7 @@ class LexerUnitTest < Minitest::Test def test_whitespace 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 def test_unexpected_character diff --git a/test/unit/module_ex_unit_test.rb b/test/unit/module_ex_unit_test.rb index 8e12653..9a8ec2e 100644 --- a/test/unit/module_ex_unit_test.rb +++ b/test/unit/module_ex_unit_test.rb @@ -5,9 +5,11 @@ class TestClassA def allowedA 'allowedA' end + def restrictedA 'restrictedA' end + def chainedB TestClassB.new end @@ -18,6 +20,7 @@ class TestClassB def allowedB 'allowedB' end + def chainedC TestClassC.new end @@ -77,11 +80,11 @@ class ModuleExUnitTest < Minitest::Test end def test_should_use_regular_objects_as_drops - assert_template_result 'allowedA', "{{ a.allowedA }}", 'a'=>@a - assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", '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 '', "{{ a.restricted }}", 'a'=>@a - assert_template_result '', "{{ a.unknown }}", 'a'=>@a + assert_template_result 'allowedA', "{{ a.allowedA }}", 'a' => @a + assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", '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 '', "{{ a.restricted }}", 'a' => @a + assert_template_result '', "{{ a.unknown }}", 'a' => @a end end # ModuleExTest diff --git a/test/unit/regexp_unit_test.rb b/test/unit/regexp_unit_test.rb index baabae3..0821229 100644 --- a/test/unit/regexp_unit_test.rb +++ b/test/unit/regexp_unit_test.rb @@ -18,7 +18,7 @@ class RegexpUnitTest < Minitest::Test def test_tags assert_equal ['', ''], ' '.scan(QuotedFragment) assert_equal [''], ''.scan(QuotedFragment) - assert_equal ['', ''], %||.scan(QuotedFragment) + assert_equal ['', ''], %().scan(QuotedFragment) end def test_double_quoted_words diff --git a/test/unit/strainer_unit_test.rb b/test/unit/strainer_unit_test.rb index 9fcff9c..0f970da 100644 --- a/test/unit/strainer_unit_test.rb +++ b/test/unit/strainer_unit_test.rb @@ -59,7 +59,7 @@ class StrainerUnitTest < Minitest::Test def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation a = 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 a, strainer assert_kind_of b, strainer diff --git a/test/unit/variable_unit_test.rb b/test/unit/variable_unit_test.rb index d175af2..17fc8de 100644 --- a/test/unit/variable_unit_test.rb +++ b/test/unit/variable_unit_test.rb @@ -11,59 +11,59 @@ class VariableUnitTest < Minitest::Test def test_filters var = Variable.new('hello | textileze') assert_equal VariableLookup.new('hello'), var.name - assert_equal [['textileze',[]]], var.filters + assert_equal [['textileze', []]], var.filters var = Variable.new('hello | textileze | paragraph') 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 [['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 [['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 [['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 [['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 [['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 [['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 [['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 [['things',['%Y, okay?','the other one']]], var.filters + assert_equal [['things', ['%Y, okay?', 'the other one']]], var.filters end 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 [['date',['%m/%d/%Y']]], var.filters + assert_equal [['date', ['%m/%d/%Y']]], var.filters end def test_filters_without_whitespace var = Variable.new('hello | textileze | paragraph') 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') 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") assert_equal VariableLookup.new('hello'), var.name @@ -73,32 +73,32 @@ class VariableUnitTest < Minitest::Test def test_symbol 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 [['image',['med']]], var.filters + assert_equal [['image', ['med']]], var.filters end def test_string_to_filter var = Variable.new("'http://disney.com/logo.gif' | image: 'med' ") assert_equal 'http://disney.com/logo.gif', var.name - assert_equal [['image',['med']]], var.filters + assert_equal [['image', ['med']]], var.filters end def test_string_single_quoted - var = Variable.new(%| "hello" |) + var = Variable.new(%( "hello" )) assert_equal 'hello', var.name end def test_string_double_quoted - var = Variable.new(%| 'hello' |) + var = Variable.new(%( 'hello' )) assert_equal 'hello', var.name end def test_integer - var = Variable.new(%| 1000 |) + var = Variable.new(%( 1000 )) assert_equal 1000, var.name end def test_float - var = Variable.new(%| 1000.01 |) + var = Variable.new(%( 1000.01 )) assert_equal 1000.01, var.name end @@ -114,37 +114,37 @@ class VariableUnitTest < Minitest::Test end def test_string_with_special_chars - var = Variable.new(%| 'hello! $!@.;"ddasd" ' |) + var = Variable.new(%( 'hello! $!@.;"ddasd" ' )) assert_equal 'hello! $!@.;"ddasd" ', var.name end def test_string_dot - var = Variable.new(%| test.test |) + var = Variable.new(%( test.test )) assert_equal VariableLookup.new('test.test'), var.name end 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 [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters end 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 [['pluralize',['comment','comments']]], var.filters + assert_equal [['pluralize', ['comment', 'comments']]], var.filters end def test_strict_filter_argument_parsing with_error_mode(:strict) do assert_raises(SyntaxError) do - Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !) + Variable.new(%( number_of_comments | pluralize: 'comment': 'comments' )) end end end 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 end