Bldr - Rubyconf 2011 Lightning Talk

Post on 12-May-2015

5.043 views 2 download

Tags:

description

Lightning talk I gave at Rubyconf 2011 on Bldr (https://github.com/ajsharp/bldr)

Transcript of Bldr - Rubyconf 2011 Lightning Talk

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": "troll@trolling.edu" } ]}]}

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

ajsharp@gmail.com

zaarly.com / alexjsharp.com

Friday, September 30, 2011