# Utils {{{ def flatten_brews(brews) brews.flat_map do |category, brew_list| brew_list.map do |brew| if brew.is_a?(Hash) brew.to_a.first # Extract the package name and options from the hash else [brew, {}] # No options, so use an empty hash end end end end def liftoff(root) root[:taps].each do |name| tap name end flatten_brews(root[:brews]).each do |pkg, opts| brew(pkg, opts) end root[:casks].each do |name| cask name end end # }}} packages = { taps: [ "ddev/ddev", "the-wineskin-project/wineskin", "isen-ng/dotnet-sdk-versions" ], brews: { # {{{ services: [ { "syncthing" => { restart_service: :changed } }, ], system: [ "cmark", "cmark-gfm", "gcc@12", "mkcert", "nss", "pinentry-mac", "pkg-config", "sdl2" ], languages: [ "bash-language-server", "composer", "dhall", "dhall-json", "dhall-lsp-server", "go", "gradle", "kotlin", "lua-language-server", "node", "openjdk", "php", "poetry", "ruby", "stylua", "uv", "yaml-language-server" ], tools: [ "act", "bat", "bear", "coder", "croc", "ddev", "dua-cli", "eza", "ffmpeg", "fzf", "gawk", "gh", "git-crypt", "git-delta", "gitui", "gnupg", "ijq", "imagemagick", "kubernetes-cli", "neovim", "pandoc", "ripgrep", "shellcheck", "shfmt", "sops", "tealdeer", "wget" ] }, # }}} casks: [ # {{{ "1password", "1password-cli", "alt-tab", "android-studio", "browserstacklocal", "crossover", "dotnet-sdk9", "dotnet-sdk8", "db-browser-for-sqlite", "discord", "discord@ptb", "firefox@developer-edition", "font-ibm-plex", "font-jetbrains-mono-nerd-font", "goland", "google-chrome", "imhex", "insomnia", "intellij-idea", "iterm2", "kitty", "lens", "obs", "obsidian", "orbstack", "phpstorm", "prismlauncher", "qbittorrent", "raycast", "rectangle", "rider", "rubymine", "sequel-ace", "shottr", "slack", "spotify", # "steam", "tailscale-app", "thunderbird", "transmit", "visual-studio-code" ] # }}} } liftoff packages