Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Lotus is a full stack web framework for Ruby, built with lightness, performance and testability in mind. It aims to bring back OOP to web development, leveraging on stable APIs, a minimal DSL, and plain objects.

Slide 3

Slide 3 text

Does it replace Rails? Nope.

Slide 4

Slide 4 text

Philosophy • based on simplicity • less DSLs • few conventions • more objects • zero monkey-patching of the core language and standard lib • separation of concerns for MVC layers

Slide 5

Slide 5 text

Standalone frameworks • Lotus::Router • Lotus::Controller • Lotus::View

Slide 6

Slide 6 text

Release Strategy Release a component of the framework on the 23rd of every month

Slide 7

Slide 7 text

Lotus::Router Problem:
 No generic router for Ruby web apps

Slide 8

Slide 8 text

Lotus::Router require 'lotus-router' ! router = Lotus::Router.new do get '/hello', to: ->(env) { [200, {}, ['Hello, World!']] } get '/dashboard', to: 'dashboard#index' get '/middleware', to: RackMiddleware get '/rack-app', to: RackApp.new ! redirect '/legacy', to: '/' ! namespace 'admin' do get '/users', to: UsersController::Index end ! resources 'users' end ! Rack::Server.start app: app, Port: 2306

Slide 9

Slide 9 text

Lotus::Router require 'lotus-router' ! router = Lotus::Router.new do get '/hello', to: ->(env) { [200, {}, ['Hello, World!']] } get '/dashboard', to: 'dashboard#index' get '/middleware', to: RackMiddleware get '/rack-app', to: RackApp.new ! redirect '/legacy', to: '/' ! namespace 'admin' do get '/users', to: UsersController::Index end ! resources 'users' end ! Rack::Server.start app: app, Port: 2306

Slide 10

Slide 10 text

class Endpoint < Lotus::Routing::Endpoint def call(env) [200, {}, [super(params(env))]] end ! private def params(env) env.fetch('router.params') end end ! r = Lotus::Routing::EndpointResolver.new(endpoint: Endpoint) ! Application = Rack::Builder.new do app = Lotus::Router.new(resolver: r) do get '/' do 'Hello, World!' end ! get '/greet/:planet' do |params| "Hello from the #{ params[:planet] }!" end end run app end.to_app

Slide 11

Slide 11 text

class Endpoint < Lotus::Routing::Endpoint def call(env) [200, {}, [super(params(env))]] end ! private def params(env) env.fetch('router.params') end end ! r = Lotus::Routing::EndpointResolver.new(endpoint: Endpoint) ! Application = Rack::Builder.new do app = Lotus::Router.new(resolver: r) do get '/' do 'Hello, World!' end ! get '/greet/:planet' do |params| "Hello from the #{ params[:planet] }!" end end run app end.to_app

Slide 12

Slide 12 text

And now for something completely different

Slide 13

Slide 13 text

Lotus::Controller class Show include Lotus::Action ! def call(params) @article = Article.find params[:id] end end

Slide 14

Slide 14 text

But… Controller? class ArticlesController class Show include Lotus::Action ! def call(params) @article = Article.find params[:id] end end end

Slide 15

Slide 15 text

Or… class ArticlesController include Lotus::Controller ! action 'Index' do def call @articles = Article.all end end ! action 'Show' do def call(params) @article = Article.find params[:id] end end end

Slide 16

Slide 16 text

Featuring OOP • Single Responsibility Principle • Dependency Injection

Slide 17

Slide 17 text

DI in controllers class ArticlesController include Lotus::Controller ! action 'Index' do def initialize(repository = Article) @repository = repository end ! def call @articles = @repository.all end end end

Slide 18

Slide 18 text

No instance variables class ArticlesController include Lotus::Controller ! action 'Index' do expose :articles def initialize(repository = Article) @repository = repository end ! def call @articles = @repository.all end end end

Slide 19

Slide 19 text

Lotus::View class Index include Lotus::View ! def hi "Hi there, Sarma!" end end

Slide 20

Slide 20 text

and… Presenter! ! class ArticlePresenter include Lotus::Presenter ! def short_title title[0..15] end end

Slide 21

Slide 21 text

http://lotusrb.org/ http://lucaguidi.com/2014/01/28/building-sinatra-with- lotus.html