Slide 1

Slide 1 text

DESENVOLVIMENTO MINIMALISTA Com Sinatra

Slide 2

Slide 2 text

DESENVOLVIMENTO MINIMALISTA Com Sinatra

Slide 3

Slide 3 text

SÉRGIO VILAR Software Engineer @ HackHands

Slide 4

Slide 4 text

O QUE É MINIMALISMO?

Slide 5

Slide 5 text

–Wellington Carrion “O minimalismo não se refere diretamente ao conceito de "pouco", e sim de ampliar a essência do que realmente é importante.”

Slide 6

Slide 6 text

AMBIENTE
 MINIMALISTA !

Slide 7

Slide 7 text

COMO FOCAR NO QUE IMPORTA? • Setup mínimo • Ambiente de desenvolvimento portátil

Slide 8

Slide 8 text

.DOTFILES • Faça Backup, restaure e sincronize suas 
 preferências e apps. • Não perca tempo configurando um computador. • Compartilhe com os amiguinhos.

Slide 9

Slide 9 text

dotfiles.github.io COMEÇANDO HOJE

Slide 10

Slide 10 text

AMBIENTE
 PORTÁTIL • Virtualização com Vagrant • Containers com Docker • Ambientes prontos como Cloud9 ou semelhante

Slide 11

Slide 11 text

AMBIENTE
 PORTÁTIL • Virtualização com Vagrant • Containers com Docker • Ambientes prontos como Cloud9 ou semelhante

Slide 12

Slide 12 text

DOCKER • Baseado em Containers • Fornece comunicação simples entre Containers • Aplicação pode ser levantada/provisionada com apenas um comando • Imagens já prontas em hub.docker.com • Instala apenas o necessário do SO

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

docker-compose.yml 1 sinatra: 2 image: erikap/ruby-sinatra 3 ports: 4 - 80:80 5 volumes: 6 - .:/usr/src/app 7 environment: 8 - MAIN_APP_FILE=app.rb

Slide 15

Slide 15 text

$ docker-compose up

Slide 16

Slide 16 text

COMEÇANDO HOJE http://docker.io http://vagrantup.com http://c9.io

Slide 17

Slide 17 text

COMO ESCREVER UMA APLICAÇÃO MINIMALISTA?

Slide 18

Slide 18 text

Você não precisa de um caminhão pra carregar uma formiga "

Slide 19

Slide 19 text

MICROFRAMEWORKS 
 SÃO ÓTIMOS PARA: • Sites • APIs • Aplicações web

Slide 20

Slide 20 text

PORQUE MICROFRAMEWORKS? • Abordagem minimalista • Fornecem apenas o necessário para tratar requisições HTTP e entregar respostas (renderizar templates). • Não te força a desenvolver dentro de uma forma específica = liberdade! • Te permite usar qualquer biblioteca

Slide 21

Slide 21 text

Mas também não escreva tudo nas rotas… ಠ_ಠ

Slide 22

Slide 22 text

Crie classes para regra de negócio #

Slide 23

Slide 23 text

SRP: Princípio da Responsabilidade Única $

Slide 24

Slide 24 text

COMEÇANDO COM SINATRA EM 3 PASSOS

Slide 25

Slide 25 text

$ gem install sinatra

Slide 26

Slide 26 text

hi.rb 
 1 require 'sinatra' 2 3 get '/hi' do 4 "Hello World!" 5 end

Slide 27

Slide 27 text

$ ruby hi.rb

Slide 28

Slide 28 text

Lidando com requisições HTTP 1 require 'sinatra' 2 3 get '/hi' do 4 "Hello World!" 5 end 6 7 post '/world' do 8 "Hello World!" 9 end 10 11 put '/hello' do 12 "Hello World!" 13 end 14 15 # ...

Slide 29

Slide 29 text

Lidando com parâmetros 1 require 'sinatra' 2 3 get '/hello/:name' do 4 "Hello #{params['name']}!" 5 end

Slide 30

Slide 30 text

Renderizando Views 1 require 'sinatra' 2 3 get '/hello/:name' do 4 @name = params['name'] 5 erb :hello # Renderiza views/hello.erb 6 end

Slide 31

Slide 31 text

Redirecionamentos 1 require 'sinatra' 2 3 get '/hello/:name' do 4 redirect "/hi/#{params['name']}" 5 end 6 7 get '/hi/:name' do 8 @name = params['name'] 9 erb :hello # Renderiza views/hello.erb 10 end

Slide 32

Slide 32 text

SINATRA COM ACTIVERECORD https://github.com/janko-m/sinatra-activerecord

Slide 33

Slide 33 text

Gemfile 1 source "https://rubygems.org" 2 3 gem "sinatra" 4 gem "activerecord" 5 gem "sinatra-activerecord" 6 gem "rake"

Slide 34

Slide 34 text

models/user.rb 1 class User < ActiveRecord::Base 2 validates_presence_of :name 3 end

Slide 35

Slide 35 text

REST COM SINATRA

Slide 36

Slide 36 text

$ gem install sinatra-rest

Slide 37

Slide 37 text

hi.rb 1 require 'sinatra' 2 require 'sinatra/activerecord' 3 require_relative './models/user' 4 5 rest User, :renderer => :erb

Slide 38

Slide 38 text

Equivalente: 1 require 'sinatra' 2 require 'sinatra/activerecord' 3 require_relative './models/user' 4 5 get '/user' do 6 @people = User.all 7 erb :"user/index", options 8 end 9 10 put '/user/:id' do 11 @person = User.find_by_id(params[:id]) 12 redirect url_for_user_show(@person), 'user updated' 13 end 14 15 # Demais rotas do REST

Slide 39

Slide 39 text

TESTANDO

Slide 40

Slide 40 text

spec/spec_helper.rb 1 ENV['RACK_ENV'] = 'test' 2 3 require 'rspec' 4 require 'rack/test' 5 6 require_relative '../app' 7 8 RSpec.configure do |conf| 9 conf.include Rack::Test::Methods 10 end

Slide 41

Slide 41 text

spec/user_spec.rb 1 require 'spec_helper' 2 3 describe User do 4 5 def app 6 Sinatra::Application 7 end 8 9 it "Cadastra um usuário" do 10 post '/user', :name => 'Sergio' 11 expect(last_response.redirect?).to be_truthy 12 user = User.last 13 expect(user.name).to eq('Sergio') 14 end 15 16 end

Slide 42

Slide 42 text

$ bundle exec rspec spec

Slide 43

Slide 43 text

VALEU! vilar.cc twitter.com/feelsen github.com/sergiovilar