Slide 1

Slide 1 text

A minimalistic Ruby stack Francesco Rodríguez Mayn Ektvedt Kjær

Slide 2

Slide 2 text

Dependency management

Slide 3

Slide 3 text

$ gem install mygem

Slide 4

Slide 4 text

$ gem list mygem ! mygem (1.0.0, 2.0.0) ! ! $ ruby -r mygem —e "MyGem::VERSION" 2.0.0

Slide 5

Slide 5 text

Gemset

Slide 6

Slide 6 text

$ gem install gs

Slide 7

Slide 7 text

$ gs init

Slide 8

Slide 8 text

$ ls -a .gs ! $ env | grep GEM GEM_HOME=/Code/app/.gs GEM_PATH=/Code/app/.gs: …

Slide 9

Slide 9 text

$ gs gem install mygem ! $ gem list -i mygem false ! $ gs gem list —i mygem true

Slide 10

Slide 10 text

Dependency tracking

Slide 11

Slide 11 text

$ gem install dep

Slide 12

Slide 12 text

$ dep add mygem

Slide 13

Slide 13 text

$ cat .gems mygem -v 2.0.0

Slide 14

Slide 14 text

$ dep install gem install mygem:2.0.0 ! $ dep dep: all cool

Slide 15

Slide 15 text

dep + gs bundler lines of code 189 complexity 197 Comparison lines of code ~12,000 complexity ~17,000

Slide 16

Slide 16 text

dep + gs bundler (x63) x xxxxxxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxx xxxxxxxx xxx Size

Slide 17

Slide 17 text

dep + gs bundler (x86) x xxxxxxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxx xxxxxx Complexity

Slide 18

Slide 18 text

Tynn A thin library for web development

Slide 19

Slide 19 text

• Simple API ! • Unopinionated ! • Extensible ! • Fast

Slide 20

Slide 20 text

require "tynn" ! Tynn.define do root do res.write("Hei Oslo!") end end ! # / => "Hei Oslo"

Slide 21

Slide 21 text

Matchers

Slide 22

Slide 22 text

on "posts" do get do res.write("GET /posts") end ! post do res.write("POST /posts") end end ! # GET /posts => "GET /posts" # POST /posts => "POST /posts"

Slide 23

Slide 23 text

Segment

Slide 24

Slide 24 text

on :slug do |slug| get do res.write("GET /#{ slug }") end end ! # GET /foo => "GET /foo" # GET /bar => "GET /bar"

Slide 25

Slide 25 text

Not only paths or methods

Slide 26

Slide 26 text

on (current_user != nil) do # authenticated routes end ! on resource.nil? do res.write("404") end

Slide 27

Slide 27 text

Routing tree

Slide 28

Slide 28 text

[ /users /users/:id /users/:id/sessions /users/:id/sessions/:token /articles /articles/:id ]

Slide 29

Slide 29 text

[ /users -> :id -> /sessions -> :token /articles -> :id ]

Slide 30

Slide 30 text

Composition

Slide 31

Slide 31 text

class Users < Tynn end ! Users.define do get do # ... end end ! Tynn.define do on "users" do run(Users) end end

Slide 32

Slide 32 text

Default extensions

Slide 33

Slide 33 text

• Tynn::Environment • Tynn::JSON • Tynn::NotFound • Tynn::Protection • Tynn::Render • Tynn::SecureHeaders • Tynn::Session • Tynn::SSL • Tynn::Static • Tynn::Test

Slide 34

Slide 34 text

Comparison

Slide 35

Slide 35 text

get "/articles" do Article.all.to_json end ! post "/articles" do Article.create(params[:article]) status(201) end Sinatra

Slide 36

Slide 36 text

on "articles" do get do json(Article.all) end ! post do Article.create(req[:article]) ! res.status = 201 end end Tynn

Slide 37

Slide 37 text

get "/articles/:id" do article = Article[params[:id]] return status(404) unless article article.to_json end ! put "/articles/:id" do article = Article[params[:id]] return status(404) unless article article.update(params[:article]) article.to_json end ! delete "/articles/:id" do article = Article[params[:id]] return status 404 unless article article.delete status 204 end Sinatra

Slide 38

Slide 38 text

on "articles" do on :id do |id| article = Article[id] ! on article.nil? do res.status = 404 end ! get do json(article) end ! put do article.update(req[:article]) json(article) end ! delete do article.delete res.status = 204 end end end Tynn

Slide 39

Slide 39 text

Numbers

Slide 40

Slide 40 text

Library LOC ============================ Core: 50 Syro: 166 Seg: 51 ---------------------------- 267 Extensions: 259 ---------------------------- 526

Slide 41

Slide 41 text

Framework Requests/sec % from best ==================================================== Rack 10164.77 100.00% Tynn 9739.69 95.82% Cuba 8714.49 85.73% Lotus (*) 8535.46 83.97% Rails (**) 3175.91 31.24% Sinatra (***) 2890.16 28.43% ! ! (*) Lotus Router (**) Without middlewares, ActionController::Metal (***) Without middlewares. ! https://gist.github.com/frodsan/4cf2b3beab1dee39e2b0

Slide 42

Slide 42 text

1.0.0.rc2 github.com/frodsan/tynn

Slide 43

Slide 43 text

Future

Slide 44

Slide 44 text

• More documentation ! • More benchmarks ! • Extensions ! • Security defaults

Slide 45

Slide 45 text

More at: ! tynn.xyz tynn.xyz/support.html

Slide 46

Slide 46 text

A Minimal Stack

Slide 47

Slide 47 text

tynn web library hmote template engine ohm / sequel ORM scrivener validations posten mailing disc workers

Slide 48

Slide 48 text

Links: ! github.com/cyx/dep github.com/frodsan/tynn github.com/harmoni/hmote github.com/harmoni/posten github.com/jeremyevans/sequel github.com/pote/disc github.com/soveran/gs github.com/soveran/ohm github.com/soveran/scrivener

Slide 49

Slide 49 text

takk ! @frodsan @maynkj ! ʕ•ᴥ•ʔ