Upgrade to Pro — share decks privately, control downloads, hide ads and more …

viewing ruby blossom kaigi2017

Anton Davydov
September 18, 2017

viewing ruby blossom kaigi2017

Slides from my talk about hanami at rubykaigi2017

Links:
railshurts.com/quiz
awesome-hanami.org
www.ossboard.org
octostar.herokuapp.com
contributors.hanamirb.org
hanamirb.org
gitter.im/hanami/chat
discuss.hanamirb.org

Anton Davydov

September 18, 2017
Tweet

More Decks by Anton Davydov

Other Decks in Programming

Transcript



  1. Hello ruby kaigi!


    View Slide

  2. View Slide

  3. Japan is awesome

    View Slide

  4. What have I learned here?

    View Slide

  5. One ramen per day is normal

    View Slide

  6. View Slide

  7. View Slide

  8. Juice pack

    View Slide

  9. View Slide

  10. View Slide

  11. Tax free

    View Slide

  12. View Slide

  13. Anton Davydov
    github.com/davydovanton

    twitter.com/anton_davydov
    davydovanton.com

    View Slide

  14. Stickers

    View Slide

  15. View Slide

  16. Hanami core

    View Slide

  17. ruby
    rom-rb
    dry-rb
    rails
    crystal
    etc

    View Slide

  18. moscow.rb

    View Slide

  19. View Slide

  20. Luca Guidi
    github.com/jodosha

    View Slide

  21. View Slide

  22. General Ideas

    View Slide

  23. Long-term maintenance

    View Slide

  24. Modularity
    Forget about fat models

    View Slide

  25. View Slide

  26. Simplicity and Lightweight
    Framework is just a tool

    View Slide

  27. Architecturally Sound
    Isolation everywhere

    View Slide

  28. Zero Monkey-Patching
    Don’t think about framework or language

    View Slide

  29. railshurts.com/quiz

    View Slide

  30. railshurts.com/quiz

    View Slide

  31. Threadsafe

    View Slide

  32. View Slide

  33. hanami != rails


    View Slide

  34. Typical parts
    of any web project

    View Slide

  35. Web Project
    Business

    logic
    Data
    flow

    View Slide

  36. Data flow

    View Slide

  37. Container Architecture
    Clean Architecture

    View Slide

  38. Project
    request

    View Slide

  39. App App App
    request

    View Slide

  40. App App App
    lib
    request

    View Slide

  41. App App App
    lib
    App App App
    lib
    App App App
    lib
    request

    View Slide

  42. App App App
    lib
    App App
    lib
    App App App
    lib
    request
    App

    View Slide

  43. apps/
    ├── admin
    │ ├── application.rb
    │ ├── assets
    │ │ └── ...
    │ ├── config
    │ │ └── ...
    │ ├── controllers
    │ │ └── ...
    │ ├── templates
    │ │ └── ...
    │ └── views
    │ └── ...
    └── web
    ├── ...

    View Slide

  44. Business Logic

    View Slide

  45. lib/
    ├── project_name
    │ ├── interactors
    │ │ └── create_user.rb
    │ ├── entities
    │ │ └── user.rb
    │ ├── mailers
    │ │ └── templates
    │ └── repositories
    │ └── user_repository.rb
    └── project_name.rb

    View Slide

  46. lib/
    ├── project_name
    │ ├── interactors
    │ │ └── create_user.rb
    │ ├── entities
    │ │ └── user.rb
    │ ├── mailers
    │ │ └── templates
    │ └── repositories
    │ └── user_repository.rb
    └── project_name.rb

    View Slide

  47. lib/
    ├── project_name
    │ ├── interactors
    │ │ └── create_user.rb
    │ ├── entities
    │ │ └── user.rb
    │ ├── mailers
    │ │ └── templates
    │ └── repositories
    │ └── user_repository.rb
    └── project_name.rb

    View Slide

  48. lib/
    ├── project_name
    │ ├── interactors
    │ │ └── create_user.rb
    │ ├── entities
    │ │ └── user.rb
    │ ├── mailers
    │ │ └── templates
    │ └── repositories
    │ └── user_repository.rb
    └── project_name.rb

    View Slide

  49. Gems

    View Slide

  50. hanami - Base repository, CLI
    router - Rack compatible HTTP router for Ruby
    controller - Full featured and fast actions for Rack
    utils - Ruby core extensions and class utilities
    model - Persistence with entities and repositories

    View Slide

  51. validations - Validations mixin for Ruby objects
    helpers - View helpers for Ruby applications
    view - Presentation with a separation
    assets - Assets management for Ruby
    mailer - Mail for Ruby applications

    View Slide

  52. Differences

    View Slide

  53. # rack
    class HelloApp
    def call(env)
    [200, { **env }, ['Hello!']]
    end
    end

    View Slide

  54. # hanami-router
    class HelloApp
    def call(env)
    [200, { **env }, ['Hello!']]
    end
    end
    router = Hanami::Router.new
    router.get '/', to: 'hello_app'

    View Slide

  55. # sinatra
    class Hello < Sinatra
    get '/' do
    'Hello!'
    end
    end

    View Slide

  56. # hanami
    Hanami::Router.new do
    get '/' do
    [200, { **env }, ['Hello!']]
    end
    end

    View Slide

  57. Rails and Hanami

    View Slide

  58. Controllers

    View Slide

  59. class UsersController < AC
    def new
    end
    def send_sms
    end

    private
    def user_params
    end
    end
    Controllers: Rails

    View Slide

  60. Controllers: hanami action
    module Web::Controllers::Board
    class Index
    include Web::Action
    params do
    required(:email).filled
    end
    def call(params)
    end
    end
    end

    View Slide

  61. Controllers: hanami
    module Web::Controllers::Board
    class Index
    include Web::Action
    params do
    required(:email).filled
    end
    def call(params)
    end
    end
    end

    View Slide

  62. Controllers: hanami
    module Web::Controllers::Board
    class Index
    include Web::Action
    params do
    required(:email).filled
    end
    def call(params)
    end
    end
    end

    View Slide

  63. Model

    View Slide

  64. class User < ActiveRecord::Base

    include Gravtastic
    before_destroy :yank_gems
    has_many :rubygems, through: :ownerships
    validates :name, presence: true
    # ...
    end
    Model: Rails

    View Slide

  65. class User < ActiveRecord::Base

    include Gravtastic
    before_destroy :yank_gems
    has_many :rubygems, through: :ownerships
    validates :name, presence: true
    # ...
    end
    Model: Rails

    View Slide

  66. class User < ActiveRecord::Base

    include Gravtastic
    before_destroy :yank_gems
    has_many :rubygems, through: :ownerships
    validates :name, presence: true
    # ...
    end
    Model: Rails

    View Slide

  67. class User < ActiveRecord::Base

    include Gravtastic
    before_destroy :yank_gems
    has_many :rubygems, through: :ownerships
    validates :name, presence: true
    # ...
    end
    Model: Rails

    View Slide

  68. class User < ActiveRecord::Base

    include Gravtastic
    before_destroy :yank_gems
    has_many :rubygems, through: :ownerships
    validates :name, presence: true
    # ...
    end
    Model: Rails

    View Slide

  69. Model: hanami
    hanami + ROM = ❤
    rom-rb.org

    View Slide

  70. Model: hanami entity
    class User < Hanami::Entity
    # ...
    end

    View Slide

  71. Model: hanami entity
    >> user = User.new(id: 1)
    => #1}>
    >> user.id
    => 1
    >> user.id = 1
    NoMethodError: undefined method `id=' for
    #1}>
    Did you mean? id

    View Slide

  72. Model: hanami entity
    >> user = User.new(id: 1)
    => #1}>
    >> user.id
    => 1
    >> user.id = 1
    NoMethodError: undefined method `id=' for
    #1}>
    Did you mean? id

    View Slide

  73. Model: hanami entity
    >> user = User.new(id: 1)
    => #1}>
    >> user.id
    => 1
    >> user.id = 1
    NoMethodError: undefined method `id=' for
    #1}>
    Did you mean? id

    View Slide

  74. class UserRepository < Hanami::Repository
    associations do
    has_many :books
    end
    def find_by_name(name)
    users # => ROM relation
    users.where(name: name).limit(1).order { id }.one
    end
    end
    Model: hanami repository

    View Slide

  75. >> repo = UserRepository.new
    => #
    >> repo.find(1)
    => #
    >> repo.find_by_name(‘Anton’)
    => #
    Model: hanami repository

    View Slide

  76. View

    View Slide

  77. View: Rails
    rails view (partials?)
    +
    rails helper

    View Slide

  78. View: Hanami
    hanami view (ruby class)
    +
    templates

    View Slide

  79. Assets

    View Slide

  80. Pros and Cons

    View Slide

  81. No magic

    View Slide

  82. module Web::Controllers::Board
    class Index
    include Web::Action
    def call(params)
    end
    end
    end

    View Slide

  83. Action test
    describe Web::Controllers::Board::Index do
    let(:action){ Board::Index.new }
    let(:params){ Hash[] }
    it 'is successful' do
    response = action.call(params)
    response[0].must_equal 200
    end
    end

    View Slide

  84. Action test
    describe Web::Controllers::Board::Index do
    let(:action){ Board::Index.new }
    let(:params){ Hash[] }
    it 'is successful' do
    response = action.call(params)
    response[0].must_equal 200
    end
    end

    View Slide

  85. Action test
    describe Web::Controllers::Board::Index do
    let(:action){ Board::Index.new }
    let(:params){ Hash[] }
    it 'is successful' do
    response = action.call(params)
    response[0].must_equal 200
    end
    end

    View Slide

  86. No monkey-patching

    View Slide

  87. Best practices

    View Slide

  88. Dependency Injection

    View Slide

  89. View Slide

  90. The logic separation

    View Slide

  91. Interactors out the box

    View Slide

  92. View Slide

  93. View Slide

  94. TDD

    View Slide

  95. View Slide

  96. View Slide

  97. TDD

    View Slide

  98. Good but not great
    documentation

    View Slide

  99. Missing Gems

    View Slide

  100. WebSockets

    Pagination

    WebPack
    GraphQL

    Devise
    2016

    View Slide

  101. WebSockets

    Pagination

    WebPack
    GraphQL

    Devise
    Now

    View Slide

  102. awesome-hanami.org

    View Slide

  103. Projects are good

    for new contributors

    View Slide

  104. www.ossboard.org

    View Slide

  105. octostar.herokuapp.com

    View Slide

  106. contributors.hanamirb.org

    View Slide

  107. Contacts
    hanamirb.org
    gitter.im/hanami/chat
    discuss.hanamirb.org

    View Slide

  108. github.com/davydovanton

    twitter.com/anton_davydov
    davydovanton.com
    Thank you ❤

    View Slide