Slide 1

Slide 1 text

@MikeMcQuaid Building Homebrew in Ruby

Slide 2

Slide 2 text

@MikeMcQuaid

Slide 3

Slide 3 text

@MikeMcQuaid Mike McQuaid [email protected] https://github.com/MikeMcQuaid A

Slide 4

Slide 4 text

@MikeMcQuaid Homebrew Ruby

Slide 5

Slide 5 text

@MikeMcQuaid Ruby 2.6 in 2019

Slide 6

Slide 6 text

@MikeMcQuaid Ruby 1.8 in 2016

Slide 7

Slide 7 text

@MikeMcQuaid Ruby 2.3 in 2019

Slide 8

Slide 8 text

@MikeMcQuaid /usr/bin/ruby 2.3.7p456

Slide 9

Slide 9 text

@MikeMcQuaid ./Library/Homebrew/ vendor/portable-ruby/ 2.3.7/bin/ruby

Slide 10

Slide 10 text

@MikeMcQuaid ↙

Slide 11

Slide 11 text

@MikeMcQuaid brew irb == irb/pry brew man == ronn brew prof == ruby-prof brew style == rubocop brew tests == rspec brew vendor-gems == bundle install --standalone

Slide 12

Slide 12 text

@MikeMcQuaid bundle install

Slide 13

Slide 13 text

@MikeMcQuaid bundle exec brew

Slide 14

Slide 14 text

@MikeMcQuaid Library/Homebrew/Gemfile

Slide 15

Slide 15 text

@MikeMcQuaid Library/Homebrew/vendor/ bundle/bundler/setup.rb

Slide 16

Slide 16 text

@MikeMcQuaid $:.unshift "#{path}/../ #{ruby_engine}/ #{ruby_version}/gems/ concurrent-ruby-1.1.5/lib"

Slide 17

Slide 17 text

@MikeMcQuaid Library/Homebrew/vendor/ bundle/ruby/2.3.0/ extensions/universal- darwin-18/2.3.0/

Slide 18

Slide 18 text

@MikeMcQuaid ActiveSupport String#present?

Slide 19

Slide 19 text

@MikeMcQuaid RuboCop 0

Slide 20

Slide 20 text

@MikeMcQuaid brew style

Slide 21

Slide 21 text

@MikeMcQuaid brew style wget

Slide 22

Slide 22 text

@MikeMcQuaid

Slide 23

Slide 23 text

@MikeMcQuaid No Ruby API

Slide 24

Slide 24 text

@MikeMcQuaid

Slide 25

Slide 25 text

@MikeMcQuaid $ brew info wget --json | jq . [ { "name": "wget", "full_name": "wget", "oldname": null, "aliases": [], "versioned_formulae": [], "desc": "Internet file retriever", "homepage": "https://www.gnu.org/software/wget/", "versions": { "stable": "1.20.3", "devel": null, "head": "HEAD", "bottle": true }, "revision": 0, "version_scheme": 0, "bottle": { "stable": {

Slide 26

Slide 26 text

@MikeMcQuaid $ curl https://formulae.brew.sh/api/formula/wget.json | jq . [ { "name": "wget", "full_name": "wget", "oldname": null, "aliases": [], "versioned_formulae": [], "desc": "Internet file retriever", "homepage": "https://www.gnu.org/software/wget/", "versions": { "stable": "1.20.3", "devel": null, "head": "HEAD", "bottle": true }, "revision": 0, "version_scheme": 0, "bottle": { "stable": {

Slide 27

Slide 27 text

@MikeMcQuaid Bash $ time brew shellenv >/dev/null … 91% cpu 0.223 total Ruby $ time brew help >/dev/null … 96% cpu 0.852 total

Slide 28

Slide 28 text

@MikeMcQuaid Bash $ time brew shellenv >/dev/null … 91% cpu 0.223 total Ruby(Kaigi) $ time brew help >/dev/null … 96% cpu 0.754 total

Slide 29

Slide 29 text

@MikeMcQuaid Formula DSL

Slide 30

Slide 30 text

@MikeMcQuaid class Wget < Formula homepage "https://www.gnu.org/software/wget/" url "https://ftp.gnu.org/gnu/wget/wget-…" sha256 "52126be8cf1bddd7536886e74c053ad7d0ed…" def install system "./configure", "--prefix=#{prefix}" system "make", "install" end end

Slide 31

Slide 31 text

@MikeMcQuaid require "cli_parser" module Homebrew module_function def home_args Homebrew::CLI::Parser.new do usage_banner <<~EOS `home` [] Open 's homepage in a browser. If no formula is provided, open Homebrew's own homepage in a browser. EOS switch :debug end end def home home_args.parse if args.remaining.empty? exec_browser HOMEBREW_WWW else exec_browser(*ARGV.formulae.map(&:homepage)) end end end

Slide 32

Slide 32 text

@MikeMcQuaid Homebrew ❤ Ruby and Ruby community

Slide 33

Slide 33 text

@MikeMcQuaid questions?