BLDRMinimalist JSON templating DSL
Alex Sharp@ajsharp
Friday, September 30, 2011
WHO AM I?
Alex Sharp (@ajsharp)
Ruby Engineer at Zaarly (zaarly.com)
Friday, September 30, 2011
WHAT IS ZAARLY?
Buyer-centric local commerce platform
Heavily api driven (iOS, Android, Web, HTML5 mobile)
API only speaks json
Friday, September 30, 2011
WHY BLDR?
Friday, September 30, 2011
LET ME COUNT THE REASONS
#as_json quickly gets...unwieldy
We need tight control over our json responses
Friday, September 30, 2011
SECURITY EXPLOIT
We were leaking information in our json documents we weren’t aware of
We didn’t understand #as_json was recursing through relationships and serializing them
Not good...
Friday, September 30, 2011
TECHCRUNCH STORY
Friday, September 30, 2011
BLDR
We wanted a simple, declarative DSL for defining JSON responses
Friday, September 30, 2011
BLDR
Simple, declarative DSL
Works with Sinatra
Rails 3 support nearly complete
Four DSL methods (object, collection, attribute, attributes)
Friday, September 30, 2011
SINATRA
get '/foo' do bar = 'baz' bldr :foo, :locals => {:bar => bar}end
Friday, September 30, 2011
SINATRA
# foo.bldrobject do attribute :foo, barend
# output{"foo": "baz"}
Friday, September 30, 2011
ATTRIBUTE LISTS
object :post => post do attributes :title, :bodyend
{ "post": { "title": "my title", "body": "..." }}
Friday, September 30, 2011
IMPLIED OBJECTS
object :post do attributes :title, :bodyend
{ "post": { "title": "my title", "body": "..." }}
Friday, September 30, 2011
DYNAMIC ATTRIBUTES
object :post do attribute :comment_count do |post| post.comments.count endend
{ "post": {"comment_count":1} }
Friday, September 30, 2011
OBJECT NESTINGobject :post => post do attributes :title, :body
object :author => post.author do attribute :last_name endend
{ "post": { "title": "my title", "body": "...", "author": {"last_name": "Doe"} }}
Friday, September 30, 2011
ATTRIBUTE ALIASESobject :post => post do attributes :title, :body
object :author => post.author do attribute :surname => :last_name endend
{ "post": { "title": "my title", "body": "...", "author": {"surname": "Doe"} }}
Friday, September 30, 2011
TOP-LEVEL COLLECTIONS
collection :posts => posts do attributes :title, :body attribute :comment_count { |post| post.comments.count }end
{ "posts": [ { "title": "my title", "comment_count": 2, }]}
Friday, September 30, 2011
NESTED COLLECTIONScollection :posts => posts do collection :comments => current_object.comments do attributes :body, :author, :email endend
{ "posts": [ { "comments": [ { "body": "...", "author_name": "Comment Troll", "email": "[email protected]" } ]}]}
Friday, September 30, 2011
OTHER FEATURES
Uses multi_json gem -- pick your encoding library
Bldr.handler
Friday, September 30, 2011
Bldr.handler BSON::ObjectId do |value| val.to_s # => "4e77a682364141ecf5000002"end
Friday, September 30, 2011
MORE INFO
Friday, September 30, 2011
MORE INFO
github.com/ajsharp/bldr
@ajsharp
zaarly.com / alexjsharp.com
Friday, September 30, 2011
Recommended