Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Lotus
Search
Luca Guidi
October 14, 2014
Programming
8
490
Lotus
Lotus: a complete web framework for Ruby.
Luca Guidi
October 14, 2014
Tweet
Share
More Decks by Luca Guidi
See All by Luca Guidi
Functional Web with Hanami
jodosha
4
380
Lessons Learned While Building Hanami
jodosha
4
870
Lotus RubyDay 2015
jodosha
2
690
Lotus For Rails Developers
jodosha
2
230
Lotus - Brighton Ruby 2015
jodosha
3
830
A Rails Criticism
jodosha
4
1.5k
Other Decks in Programming
See All in Programming
Escolhendo (ou não) o melhor ORM para o seu projeto
andreiacsilva
1
160
WebGLで始める コンピュータグラフィックス入門
heller77
0
390
The test code generator using static analysis and LLM
mikik0
1
170
AmperとFleetを使ったAndroidアプリ
yoppie
0
300
Using "modern" Ruby to build a better, faster Homebrew
mikemcquaid
2
280
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
6
2k
Three ways to use AI on Android: The Good, the Bad and the Ugly
marxallski
0
120
Documentation testsの恩恵 / Documentation testing benefits
ssssota
1
560
Exploring Type-Informed Lint Rules in Rust based TypeScript Linters
unvalley
3
640
Implementing Design Systems in Swift
seyfoyun
2
530
Try creating your own orderedmap
kazamori
1
280
TypeScriptのパフォーマンス改善
yajihum
14
5.1k
Featured
See All Featured
Navigating Team Friction
lara
179
13k
We Have a Design System, Now What?
morganepeng
43
6.8k
jQuery: Nuts, Bolts and Bling
dougneiner
60
7.2k
Mobile First: as difficult as doing things right
swwweet
217
8.6k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
Building Applications with DynamoDB
mza
88
5.7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
1
130
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
104
6.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
25
2k
Practical Orchestrator
shlominoach
183
9.8k
Transcript
Lotus A c o mp l e t e web
framework @jodosha / #lotusrb
None
Do we need yet another web framework?
Are you reinventing the wheel?
What if we never reinvented the wheel?
The wheel
None
We reinvented the wheel after observing it
Complexity should be managed, not hidden.
Why does this matter?
The ultimate goal is…
Money https://flic.kr/p/aFAEHR
Use case: http://bit.ly/github-rails-upgrade
We should not trade control for convenience.
Cost of maintenance 0 20 40 60 80 Years 0
1 2 3 Covenience Simplicity
Silver bullets are a lie.
Philosophy
Standalone frameworks
Full stack applications
Few conventions More objects No monkey- patching
Few conventions More objects No monkey- patching
Few conventions More objects No monkey- patching
Simple
Simplicity is achieved by removing what isn’t essential
Coffee https://flic.kr/p/6rX8pn
Convenient https://flic.kr/p/93Bk4K
Simple https://flic.kr/p/mn57Zm
The output https://flic.kr/p/9oG93w
Lotus doesn’t enable optional features by default
We perceive as simple the things we are familiar with
BookRepository.find 23
Rails.application.routes.draw do get '/' => 'home#index', as: :home resources :books
end ! Rails.application.routes # => ???
router = Lotus::Router.new do get '/', to: 'home#index', as: :home
resources :books end ! router.path(:home) # => '/' router.call(env) # Rack env run router # in config.ru
Fast
Micro benchmarks http://bit.ly/lotus-micro-bench
HTTP benchmarks http://bit.ly/lotus-http-bench
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Testable
Testability is a virtue
There is no “test-damaged” design
class Show include Lotus::Action ! expose :book ! def initialize(repository
= BooksRepository) @repository = repository end ! def call(params) @book = @repository.find params[:id] end end
book = Object.new repository = Minitest::Mock.new repository.expect(:find, book, [Integer]) !
action = Show.new(repository) action.call(id: 23) # => [200, {}, nil] ! repository.verify action.book.must_equal book # assigns(:book) isn’t needed
Demo
The future
Get involved
lotusrb.org #lotusrb @jodosha
Q&A
Thank you!