Compare commits

..

4 Commits

Author SHA1 Message Date
Mike Angell
e2f5cf30f6 Format tests 2019-09-16 12:37:37 +10:00
Mike Angell
917ae7a6ab Switch to named inputs 2019-09-16 12:36:37 +10:00
Mike Angell
bfe4f60e13 Follow ISO recommendation to use space as thousands separator 2019-09-01 09:01:02 +10:00
Mike Angell
32b9530985 Add new format filter 2019-09-01 00:07:42 +10:00
9 changed files with 37 additions and 21 deletions

View File

@@ -20,6 +20,6 @@ group :test do
gem 'rubocop-performance', require: false
platform :mri, :truffleruby do
gem 'liquid-c', github: 'Shopify/liquid-c', ref: 'master'
gem 'liquid-c', github: 'Shopify/liquid-c', ref: 'liquid-tag'
end
end

View File

@@ -106,9 +106,3 @@ template = Liquid::Template.parse("{{x}} {{y}}")
template.render!({ 'x' => 1}, { strict_variables: true })
#=> Liquid::UndefinedVariable: Liquid error: undefined variable y
```
### Usage tracking
To help track usages of a feature or code path in production, we have released opt-in usage tracking. To enable this, we provide an empty `Liquid:: Usage.increment` method which you can customize to your needs. The feature is well suited to https://github.com/Shopify/statsd-instrument. However, the choice of implementation is up to you.
Once you have enabled usage tracking, we recommend reporting any events through Github Issues that your system may be logging. It is highly likely this event has been added to consider deprecating or improving code specific to this event, so please raise any concerns.

View File

@@ -75,7 +75,6 @@ require 'liquid/utils'
require 'liquid/tokenizer'
require 'liquid/parse_context'
require 'liquid/partial_cache'
require 'liquid/usage'
# Load all the tags of the standard library
#

View File

@@ -391,6 +391,17 @@ module Liquid
raise Liquid::FloatDomainError, e.message
end
# Defaults are passed as nil so systems can easily override
def format_number(input, options = {})
options = {} unless options.is_a?(Hash)
precision = options['precision'] || 2
delimiter = options['delimiter'] || " ".freeze
separator = options['separator'] || ".".freeze
return input if (prec = Utils.to_number(precision).to_i) < 0
whole_part, decimal_part = Kernel.format("%.#{prec}f", Utils.to_number(input)).split('.')
[whole_part.gsub(/(\d)(?=\d{3}+$)/, "\\1#{delimiter}"), decimal_part].compact.join(separator.to_s)
end
def ceil(input)
Utils.to_number(input).ceil.to_i
rescue ::FloatDomainError => e
@@ -421,7 +432,6 @@ module Liquid
def default(input, default_value = ''.freeze)
if !input || input.respond_to?(:empty?) && input.empty?
Usage.increment("default_filter_received_false_value") if input == false # See https://github.com/Shopify/liquid/issues/1127
default_value
else
input

View File

@@ -1,13 +1,13 @@
module Liquid
class Render < Tag
SYNTAX = /(#{QuotedString})#{QuotedFragment}*/o
Syntax = /(#{QuotedString})#{QuotedFragment}*/o
attr_reader :template_name_expr, :attributes
def initialize(tag_name, markup, options)
super
raise SyntaxError.new(options[:locale].t("errors.syntax.render".freeze)) unless markup =~ SYNTAX
raise SyntaxError.new(options[:locale].t("errors.syntax.render".freeze)) unless markup =~ Syntax
template_name = $1

View File

@@ -1,6 +0,0 @@
module Liquid
module Usage
def self.increment(name)
end
end
end

View File

@@ -610,6 +610,25 @@ class StandardFiltersTest < Minitest::Test
assert_template_result "4", "{{ price | round }}", 'price' => NumberLikeThing.new(4.3)
end
def test_format_number
assert_template_result "4.60", "{{ input | format_number }}", 'input' => 4.6
assert_template_result "4.30", "{{ '4.3' | format_number }}"
assert_template_result "4.56", "{{ input | format_number: precision: 2 }}", 'input' => 4.5612
assert_template_result "5", "{{ price | format_number: precision: 0 }}", 'price' => NumberLikeThing.new(4.6)
assert_template_result "4", "{{ price | format_number: precision: 0 }}", 'price' => NumberLikeThing.new(4.3)
assert_template_result "4.30", "{{ price | format_number: precision: 2 }}", 'price' => NumberLikeThing.new(4.3)
assert_template_result "5.0000000", "{{ price | format_number: precision: 7 }}", 'price' => 5
assert_template_result "50", "{{ price | format_number: precision: -1 }}", 'price' => 50
assert_template_result "50.00", "{{ price | format_number: precision: A }}", 'price' => 50
assert_template_result "50.00", "{{ price | format_number: precision: '2e' }}", 'price' => 50
assert_template_result "50 000 000", "{{ price | format_number: precision: 0 }}", 'price' => 50000000
assert_template_result "50 000 000.00", "{{ price | format_number }}", 'price' => 50000000
assert_template_result "50000000.00", "{{ price | format_number: precision: 2, delimiter: '', separator: '.'}}", 'price' => 50000000
assert_template_result "50$000$000#00", "{{ price | format_number: precision: 2, delimiter: '$', separator:'#'}}", 'price' => 50000000
assert_template_result "-50$000$000#00", "{{ price | format_number: precision: 2, delimiter: '$', separator: '#'}}", 'price' => -50000000
assert_template_result "-50 000 000.00", "{{ price | format_number: precision: A, delimiter: A, separator: A}}", 'price' => -50000000
end
def test_ceil
assert_template_result "5", "{{ input | ceil }}", 'input' => 4.6
assert_template_result "5", "{{ '4.3' | ceil }}"

View File

@@ -110,7 +110,7 @@ class RenderTagTest < Minitest::Test
file_system = StubFileSystem.new('snippet' => 'echo')
assert_equal 'echoecho',
Template.parse('{% render "snippet" %}{% render "snippet" %}')
.render!({}, registers: { file_system: file_system })
.render!({}, registers: { file_system: file_system })
assert_equal 1, file_system.file_read_count
end

View File

@@ -4,7 +4,7 @@ class PartialCacheUnitTest < Minitest::Test
def test_uses_the_file_system_register_if_present
context = Liquid::Context.build(
registers: {
file_system: StubFileSystem.new('my_partial' => 'my partial body'),
file_system: StubFileSystem.new('my_partial' => 'my partial body')
}
)
@@ -41,12 +41,12 @@ class PartialCacheUnitTest < Minitest::Test
)
context_one = Liquid::Context.build(
registers: {
file_system: shared_file_system,
file_system: shared_file_system
}
)
context_two = Liquid::Context.build(
registers: {
file_system: shared_file_system,
file_system: shared_file_system
}
)