diff options
author | Tim Siegel <siegeltr@gmail.com> | 2021-03-19 22:35:35 -0400 |
---|---|---|
committer | Tim Siegel <siegeltr@gmail.com> | 2021-03-29 21:47:58 -0400 |
commit | 42ac090a06435dc9790d06a4d71724158c05a3a8 (patch) | |
tree | 12ebdba184b9d83dc2225f4d26c7d9d0e30a47dd | |
parent | 1d5972335e539d1f32566d4fce4ea3e215871409 (diff) | |
download | mustache-spec-42ac090a06435dc9790d06a4d71724158c05a3a8.tar.gz |
Fix Rakefile to add __tag__: code for ~lambda test data
This was broken when Ruby switched YAML engines from Syck to Psych
around Ruby 1.9.3. Syck was removed completely around version 2.0.
The code didn't fail, because Psych also implements the add_builtin_type
routine, but it does not recognize `!code` as a builtin type (because it
isn't; builtins look like !!str or !!map).
Instead, Psych requires a custom class to handle decoding the tagged
YAML item to Ruby.
And then, to get JSON to actually display the object, it is easiest to
just inherit from `Hash`.
-rw-r--r-- | Rakefile | 9 | ||||
-rw-r--r-- | specs/~lambdas.json | 10 |
2 files changed, 17 insertions, 2 deletions
@@ -2,10 +2,15 @@ require 'json' require 'yaml' # Our custom YAML tags must retain their magic. -%w[ code ].each do |tag| - YAML::add_builtin_type(tag) { |_,val| val.merge(:__tag__ => tag) } +class TaggedMap < Hash + yaml_tag '!code' + def init_with(psych_coder) + self.replace({:__tag__ => 'code'}.merge(psych_coder.map)) + end end +YAML::add_tag('code', TaggedMap) + desc 'Build all alternate versions of the specs.' multitask :build => [ 'build:json' ] diff --git a/specs/~lambdas.json b/specs/~lambdas.json index c0362ac..7b6d59c 100644 --- a/specs/~lambdas.json +++ b/specs/~lambdas.json @@ -7,6 +7,7 @@ "desc": "A lambda's return value should be interpolated.", "data": { "lambda": { + "__tag__": "code", "ruby": "proc { \"world\" }", "raku": "sub { \"world\" }", "perl": "sub { \"world\" }", @@ -26,6 +27,7 @@ "data": { "planet": "world", "lambda": { + "__tag__": "code", "ruby": "proc { \"{{planet}}\" }", "raku": "sub { q+{{planet}}+ }", "perl": "sub { \"{{planet}}\" }", @@ -45,6 +47,7 @@ "data": { "planet": "world", "lambda": { + "__tag__": "code", "ruby": "proc { \"|planet| => {{planet}}\" }", "raku": "sub { q+|planet| => {{planet}}+ }", "perl": "sub { \"|planet| => {{planet}}\" }", @@ -63,6 +66,7 @@ "desc": "Interpolated lambdas should not be cached.", "data": { "lambda": { + "__tag__": "code", "ruby": "proc { $calls ||= 0; $calls += 1 }", "raku": "sub { state $calls += 1 }", "perl": "sub { no strict; $calls += 1 }", @@ -81,6 +85,7 @@ "desc": "Lambda results should be appropriately escaped.", "data": { "lambda": { + "__tag__": "code", "ruby": "proc { \">\" }", "raku": "sub { \">\" }", "perl": "sub { \">\" }", @@ -100,6 +105,7 @@ "data": { "x": "Error!", "lambda": { + "__tag__": "code", "ruby": "proc { |text| text == \"{{x}}\" ? \"yes\" : \"no\" }", "raku": "sub { $^section eq q+{{x}}+ ?? \"yes\" !! \"no\" }", "perl": "sub { $_[0] eq \"{{x}}\" ? \"yes\" : \"no\" }", @@ -119,6 +125,7 @@ "data": { "planet": "Earth", "lambda": { + "__tag__": "code", "ruby": "proc { |text| \"#{text}{{planet}}#{text}\" }", "raku": "sub { $^section ~ q+{{planet}}+ ~ $^section }", "perl": "sub { $_[0] . \"{{planet}}\" . $_[0] }", @@ -138,6 +145,7 @@ "data": { "planet": "Earth", "lambda": { + "__tag__": "code", "ruby": "proc { |text| \"#{text}{{planet}} => |planet|#{text}\" }", "raku": "sub { $^section ~ q+{{planet}} => |planet|+ ~ $^section }", "perl": "sub { $_[0] . \"{{planet}} => |planet|\" . $_[0] }", @@ -156,6 +164,7 @@ "desc": "Lambdas used for sections should not be cached.", "data": { "lambda": { + "__tag__": "code", "ruby": "proc { |text| \"__#{text}__\" }", "raku": "sub { \"__\" ~ $^section ~ \"__\" }", "perl": "sub { \"__\" . $_[0] . \"__\" }", @@ -175,6 +184,7 @@ "data": { "static": "static", "lambda": { + "__tag__": "code", "ruby": "proc { |text| false }", "raku": "sub { 0 }", "perl": "sub { 0 }", |