Skip to content

Commit

Permalink
Fix Rakefile to add __tag__: code for ~lambda test data
Browse files Browse the repository at this point in the history
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`.
  • Loading branch information
softmoth committed Mar 20, 2021
1 parent 40fc4d1 commit f0e4744
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
10 changes: 7 additions & 3 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,11 +1,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' ]

Expand Down
10 changes: 10 additions & 0 deletions specs/~lambdas.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"desc": "A lambda's return value should be interpolated.",
"data": {
"lambda": {
"__tag__": "code",
"ruby": "proc { \"world\" }",
"perl": "sub { \"world\" }",
"js": "function() { return \"world\" }",
Expand All @@ -25,6 +26,7 @@
"data": {
"planet": "world",
"lambda": {
"__tag__": "code",
"ruby": "proc { \"{{planet}}\" }",
"perl": "sub { \"{{planet}}\" }",
"js": "function() { return \"{{planet}}\" }",
Expand All @@ -43,6 +45,7 @@
"data": {
"planet": "world",
"lambda": {
"__tag__": "code",
"ruby": "proc { \"|planet| => {{planet}}\" }",
"perl": "sub { \"|planet| => {{planet}}\" }",
"js": "function() { return \"|planet| => {{planet}}\" }",
Expand All @@ -60,6 +63,7 @@
"desc": "Interpolated lambdas should not be cached.",
"data": {
"lambda": {
"__tag__": "code",
"ruby": "proc { $calls ||= 0; $calls += 1 }",
"perl": "sub { no strict; $calls += 1 }",
"js": "function() { return (g=(function(){return this})()).calls=(g.calls||0)+1 }",
Expand All @@ -77,6 +81,7 @@
"desc": "Lambda results should be appropriately escaped.",
"data": {
"lambda": {
"__tag__": "code",
"ruby": "proc { \">\" }",
"perl": "sub { \">\" }",
"js": "function() { return \">\" }",
Expand All @@ -95,6 +100,7 @@
"data": {
"x": "Error!",
"lambda": {
"__tag__": "code",
"ruby": "proc { |text| text == \"{{x}}\" ? \"yes\" : \"no\" }",
"perl": "sub { $_[0] eq \"{{x}}\" ? \"yes\" : \"no\" }",
"js": "function(txt) { return (txt == \"{{x}}\" ? \"yes\" : \"no\") }",
Expand All @@ -113,6 +119,7 @@
"data": {
"planet": "Earth",
"lambda": {
"__tag__": "code",
"ruby": "proc { |text| \"#{text}{{planet}}#{text}\" }",
"perl": "sub { $_[0] . \"{{planet}}\" . $_[0] }",
"js": "function(txt) { return txt + \"{{planet}}\" + txt }",
Expand All @@ -131,6 +138,7 @@
"data": {
"planet": "Earth",
"lambda": {
"__tag__": "code",
"ruby": "proc { |text| \"#{text}{{planet}} => |planet|#{text}\" }",
"perl": "sub { $_[0] . \"{{planet}} => |planet|\" . $_[0] }",
"js": "function(txt) { return txt + \"{{planet}} => |planet|\" + txt }",
Expand All @@ -148,6 +156,7 @@
"desc": "Lambdas used for sections should not be cached.",
"data": {
"lambda": {
"__tag__": "code",
"ruby": "proc { |text| \"__#{text}__\" }",
"perl": "sub { \"__\" . $_[0] . \"__\" }",
"js": "function(txt) { return \"__\" + txt + \"__\" }",
Expand All @@ -166,6 +175,7 @@
"data": {
"static": "static",
"lambda": {
"__tag__": "code",
"ruby": "proc { |text| false }",
"perl": "sub { 0 }",
"js": "function(txt) { return false }",
Expand Down

0 comments on commit f0e4744

Please sign in to comment.