From afceaec076ece774672c83daf077e8d3f6f56954 Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Thu, 21 Mar 2024 10:18:05 -0700 Subject: [PATCH] Port Homebrew::DevCmd::GenerateCaskApi --- Library/Homebrew/dev-cmd/generate-cask-api.rb | 131 +++++++++--------- .../test/dev-cmd/generate-cask-api_spec.rb | 3 +- 2 files changed, 68 insertions(+), 66 deletions(-) diff --git a/Library/Homebrew/dev-cmd/generate-cask-api.rb b/Library/Homebrew/dev-cmd/generate-cask-api.rb index 61f2ab8403..c6682521c6 100644 --- a/Library/Homebrew/dev-cmd/generate-cask-api.rb +++ b/Library/Homebrew/dev-cmd/generate-cask-api.rb @@ -1,82 +1,83 @@ # typed: true # frozen_string_literal: true +require "abstract_command" require "cli/parser" require "cask/cask" require "formula" module Homebrew - module_function - - sig { returns(CLI::Parser) } - def generate_cask_api_args - Homebrew::CLI::Parser.new do - description <<~EOS - Generate `homebrew/cask` API data files for <#{HOMEBREW_API_WWW}>. - The generated files are written to the current directory. + module DevCmd + class GenerateCaskApi < AbstractCommand + CASK_JSON_TEMPLATE = <<~EOS + --- + layout: cask_json + --- + {{ content }} EOS - switch "-n", "--dry-run", description: "Generate API data without writing it to files." + cmd_args do + description <<~EOS + Generate `homebrew/cask` API data files for <#{HOMEBREW_API_WWW}>. + The generated files are written to the current directory. + EOS - named_args :none - end - end + switch "-n", "--dry-run", description: "Generate API data without writing it to files." - CASK_JSON_TEMPLATE = <<~EOS - --- - layout: cask_json - --- - {{ content }} - EOS - - def html_template(title) - <<~EOS - --- - title: #{title} - layout: cask - --- - {{ content }} - EOS - end - - def generate_cask_api - args = generate_cask_api_args.parse - - tap = CoreCaskTap.instance - raise TapUnavailableError, tap.name unless tap.installed? - - unless args.dry_run? - directories = ["_data/cask", "api/cask", "api/cask-source", "cask", "api/internal/v3"].freeze - FileUtils.rm_rf directories - FileUtils.mkdir_p directories - end - - Homebrew.with_no_api_env do - tap_migrations_json = JSON.dump(tap.tap_migrations) - File.write("api/cask_tap_migrations.json", tap_migrations_json) unless args.dry_run? - - Cask::Cask.generating_hash! - - tap.cask_files.each do |path| - cask = Cask::CaskLoader.load(path) - name = cask.token - json = JSON.pretty_generate(cask.to_hash_with_variations) - cask_source = path.read - html_template_name = html_template(name) - - unless args.dry_run? - File.write("_data/cask/#{name}.json", "#{json}\n") - File.write("api/cask/#{name}.json", CASK_JSON_TEMPLATE) - File.write("api/cask-source/#{name}.rb", cask_source) - File.write("cask/#{name}.html", html_template_name) - end - rescue - onoe "Error while generating data for cask '#{path.stem}'." - raise + named_args :none end - homebrew_cask_tap_json = JSON.generate(tap.to_internal_api_hash) - File.write("api/internal/v3/homebrew-cask.json", homebrew_cask_tap_json) unless args.dry_run? + sig { override.void } + def run + tap = CoreCaskTap.instance + raise TapUnavailableError, tap.name unless tap.installed? + + unless args.dry_run? + directories = ["_data/cask", "api/cask", "api/cask-source", "cask", "api/internal/v3"].freeze + FileUtils.rm_rf directories + FileUtils.mkdir_p directories + end + + Homebrew.with_no_api_env do + tap_migrations_json = JSON.dump(tap.tap_migrations) + File.write("api/cask_tap_migrations.json", tap_migrations_json) unless args.dry_run? + + Cask::Cask.generating_hash! + + tap.cask_files.each do |path| + cask = Cask::CaskLoader.load(path) + name = cask.token + json = JSON.pretty_generate(cask.to_hash_with_variations) + cask_source = path.read + html_template_name = html_template(name) + + unless args.dry_run? + File.write("_data/cask/#{name}.json", "#{json}\n") + File.write("api/cask/#{name}.json", CASK_JSON_TEMPLATE) + File.write("api/cask-source/#{name}.rb", cask_source) + File.write("cask/#{name}.html", html_template_name) + end + rescue + onoe "Error while generating data for cask '#{path.stem}'." + raise + end + + homebrew_cask_tap_json = JSON.generate(tap.to_internal_api_hash) + File.write("api/internal/v3/homebrew-cask.json", homebrew_cask_tap_json) unless args.dry_run? + end + end + + private + + def html_template(title) + <<~EOS + --- + title: #{title} + layout: cask + --- + {{ content }} + EOS + end end end end diff --git a/Library/Homebrew/test/dev-cmd/generate-cask-api_spec.rb b/Library/Homebrew/test/dev-cmd/generate-cask-api_spec.rb index 08db0a6083..426c4b9cb1 100644 --- a/Library/Homebrew/test/dev-cmd/generate-cask-api_spec.rb +++ b/Library/Homebrew/test/dev-cmd/generate-cask-api_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require "cmd/shared_examples/args_parse" +require "dev-cmd/generate-cask-api" -RSpec.describe "brew generate-cask-api" do +RSpec.describe Homebrew::DevCmd::GenerateCaskApi do it_behaves_like "parseable arguments" end