Slide 1

Slide 1 text

Hanami 2.0 and You WNB.rb March 2023 Meetup

Slide 2

Slide 2 text

@[email protected] Continuing on our dry-rb journey github.com/timriley github.com/solnic github.com/jodosha All in dry-rb + Hanami

Slide 3

Slide 3 text

@[email protected] What is it? Modern web framework for Ruby - Focused on maintainability, testability, and scaling - Create applications that are systems of well-formed components with clear dependencies. - Anyone work on a really big Rails app? - Let’s dive in on what a Hanami project looks like, and it’s benefits

Slide 4

Slide 4 text

@[email protected] Hanami 2.X != Hanami 1.X

Slide 5

Slide 5 text

@[email protected] Getting started project structure

Slide 6

Slide 6 text

@[email protected] Location Purpose Gemfile The application’s gem dependencies, installed using bundler. Guardfile Supports code reloading in development. README.md The application’s readme document. Rakefile Support for running rake tasks. app/ This is the directory where you’ll put the majority of your application’s code. config/ A directory for your application’s configuration, including things like routes, settings and Puma configuration. config.ru A Rack config file. lib/ A directory for supporting code. spec/ The application’s RSpec test suite.

Slide 7

Slide 7 text

@[email protected] Maintainability

Slide 8

Slide 8 text

@[email protected] Maintainability - Hanami Container ● Zeitwork for loading ● Code autoloading helps you work with minimal fuss ● Autoload not just application code but dependencies which means faster boot times ○ Doesn’t have to eager load every constant ever at boot time…unlike Rails ● App core itself is special ○ Can use the app object itself to load and return any individual component ○ Hanami.app["actions.food.index"] ● Hanami console, like a supercharged Rails console

Slide 9

Slide 9 text

@[email protected] Testability

Slide 10

Slide 10 text

@[email protected] Helps remove rigid dependencies (so Sandi Metz approved ™) - Dependency injection is easy - include Deps["key"], the Deps mixin allows a component to use any other component in its container as a dependency - Easier to code up tests too! Just inject your mocks Deps - friendly dependency injection helper

Slide 11

Slide 11 text

@[email protected] Deps code example No dependency injection == tightly coupled

Slide 12

Slide 12 text

@[email protected] Using the Deps mixin, no attr_reader or initializer boilerplate needed

Slide 13

Slide 13 text

@[email protected] You don’t have to go all in on Hanami…

Slide 14

Slide 14 text

@[email protected] Hanami-api HTTP framework Extremely fast, lightweight Ruby framework for HTTP APIs Ideal mini framework to build HTTP APIs and microservices

Slide 15

Slide 15 text

@[email protected] Want to try it for yourself? Use the Getting Started guide or check out Picnic, our example project

Slide 16

Slide 16 text

@[email protected] See an example Hanami app - Picnic (github.com/cseeman/picnic)

Slide 17

Slide 17 text

@[email protected] See an example Hanami app - Picnic (github.com/cseeman/picnic)

Slide 18

Slide 18 text

@[email protected] See an example Hanami app - Picnic (github.com/cseeman/picnic)

Slide 19

Slide 19 text

Slide 20

Slide 20 text

@[email protected] Scaling - Hanami Slices Draw boundaries between its major areas of concern. Built-in facility for organizing your code, encouraging maintainable boundaries, and creating operational flexibility. Just like a miniature Hanami app in your Hanami app!

Slide 21

Slide 21 text

@[email protected] Slices == the way to keep your application from ballooning

Slide 22

Slide 22 text

@[email protected] Slices in action

Slide 23

Slide 23 text

Slide 24

Slide 24 text

@[email protected] Dry::CLI ● General-purpose framework for developing Command Line Interface (CLI) applications ● Commands as objects that can be registered

Slide 25

Slide 25 text

@[email protected] Sometimes you want the DB helpers that rails has…

Slide 26

Slide 26 text

@[email protected] Helpful generators ● Create Action $ bundle exec hanami generate action home.show ● Create Database Migration $ bundle exec rake db:create_migration[create_books] ● Create a whole app $ hanami new picnic ● Or a smaller part of the app, a slice $ hanami generate slice api ● And in the slice $ hanami generate action food.show --slice api

Slide 27

Slide 27 text

@[email protected] My favorite things about Hanami ● Blazing fast console ● Slices can deploy out as their own containers (mini contained apps…) ● Great for APIs ● Deps really is a great way to make it easy to create reusable components that are easy to test ● Dry::CLI is a joy to compose together developer centric tasks

Slide 28

Slide 28 text

@[email protected] Room for improvement with Hanami ● ROM is a learning curve vs ActiveRecord ● Frontend integration is not there yet…dry-view integration is not available yet ● Dry-rb and understanding the functional programming is still necessary to get all the benefits of Hanami

Slide 29

Slide 29 text

@[email protected] Hanami in action DRY::CLI + Hanami makes creating tools to help devs easy

Slide 30

Slide 30 text

@[email protected] Hanami in action Boot Time ● No noticeable difference between brand new hanami app vs production app Full app > < Example App

Slide 31

Slide 31 text

@[email protected] Hanami in action - Build Time - Averaging 5-6 minutes - How it has sped up new feature development - Deployed 15 actions spanning 3 different slices - Test Time - Running each slice full test suite is quick

Slide 32

Slide 32 text

@[email protected] Who am I? Christine Seeman 🌽 lifetime learner from Omaha, NE 📚 likes to read too much 🥙🍜🍛 eats food that probably took too long to prepare Professionally solving problems on the Identity team at WP Engine christine-seeman.com

Slide 33

Slide 33 text

@[email protected] Thank you to my awesome teammates For all you taught me about Hanami and vim (yes I can exit now) Adam Lassek Andy Neely Jim Finn Miguel Tapia

Slide 34

Slide 34 text

@[email protected] References Hanami Official Site: https://hanamirb.org/ Hanami 2.0 Announcement: https://hanamirb.org/blog/2022/11/22/announcing-hanami-200/ Introducing Hanami::API https://hanamirb.org/blog/2020/02/26/introducing-hanami-api/ Hanami API GitHub: https://github.com/hanami/api Highlights of Hanami 2.0: https://discourse.hanamirb.org/t/highlights-of-hanami-2-0/728 Hanami 2.0 Guide: https://guides.hanamirb.org/v2.0/introduction/getting-started/ Hanami 2.0 Container and Components: https://guides.hanamirb.org/v2.0/app/container-and-components/ Hanami 2.0.3 Release: https://hanamirb.org/blog/2023/02/01/hanami-203/ Dry-rb Home: https://dry-rb.org/ Hanami Discourse: https://discourse.hanamirb.org/ Introducing dry-files: https://dry-rb.org/news/2021/05/04/introducing-dry-files/ Hanami 2.0 and You Slides: https://christine-seeman.com/2023-talks/

Slide 35

Slide 35 text

@[email protected] https://coolors.co/palette/ffcdb2-ffb4a2-e5989b-b5838d-6d6875 https://www.clker.com/cliparts/y/u/g/3/b/E/sakura-blossom-alice-md.png