|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require "uri" |
| 4 | + |
| 5 | +def validate(name, checks) |
| 6 | + failed = checks.reject { |_description, passed| passed }.keys |
| 7 | + abort("#{name} validation failed: #{failed.join(', ')}") unless failed.empty? |
| 8 | +end |
| 9 | + |
| 10 | +cask = File.read("Casks/openai.rb") |
| 11 | +cask_checks = { |
| 12 | + "generated header" => cask.start_with?("# This file was generated by GoReleaser. DO NOT EDIT.\n"), |
| 13 | + "openai cask token" => cask.match?(/^cask "openai" do$/), |
| 14 | + "semantic version" => cask.match?(/^ version "\d+\.\d+\.\d+"$/), |
| 15 | + "homepage" => cask.include?(' homepage "https://developers.openai.com/api/docs"'), |
| 16 | + "binary" => cask.include?(' binary "openai"'), |
| 17 | + "manpage" => cask.include?(' manpage "man/man1/openai.1.gz"'), |
| 18 | + "macos amd64 zip" => cask.match?(/openai_#\{version\}_macos_amd64\.zip/), |
| 19 | + "macos arm64 zip" => cask.match?(/openai_#\{version\}_macos_arm64\.zip/), |
| 20 | + "linux amd64 tarball" => cask.match?(/openai_#\{version\}_linux_amd64\.tar\.gz/), |
| 21 | + "linux arm64 tarball" => cask.match?(/openai_#\{version\}_linux_arm64\.tar\.gz/), |
| 22 | + "release host" => cask.scan(%r{https://github\.com/openai/openai-cli/releases/download/v#\{version\}/}).length == 4, |
| 23 | + "sha256 count" => cask.scan(/^\s+sha256 "[a-f0-9]{64}"$/).length == 4, |
| 24 | +} |
| 25 | +validate("Casks/openai.rb", cask_checks) |
| 26 | + |
| 27 | +formulas = { |
| 28 | + "Formula/orchard.rb" => { |
| 29 | + class_name: "Orchard", |
| 30 | + repository: "orchard", |
| 31 | + install: 'bin.install "orchard"', |
| 32 | + }, |
| 33 | + "Formula/softnet.rb" => { |
| 34 | + class_name: "Softnet", |
| 35 | + repository: "softnet", |
| 36 | + install: 'bin.install "softnet"', |
| 37 | + }, |
| 38 | + "Formula/tart-guest-agent.rb" => { |
| 39 | + class_name: "TartGuestAgent", |
| 40 | + repository: "tart-guest-agent", |
| 41 | + install: 'bin.install "tart-guest-agent"', |
| 42 | + }, |
| 43 | + "Formula/tart.rb" => { |
| 44 | + class_name: "Tart", |
| 45 | + repository: "tart", |
| 46 | + install: 'bin.write_exec_script "#{libexec}/tart.app/Contents/MacOS/tart"', |
| 47 | + dependency: 'depends_on "openai/tools/softnet"', |
| 48 | + }, |
| 49 | +} |
| 50 | + |
| 51 | +unknown_formulas = Dir["Formula/*.rb"] - formulas.keys |
| 52 | +abort("Unexpected formula: #{unknown_formulas.join(', ')}") unless unknown_formulas.empty? |
| 53 | + |
| 54 | +formulas.each do |path, expected| |
| 55 | + next unless File.exist?(path) |
| 56 | + |
| 57 | + formula = File.read(path) |
| 58 | + version = formula[/^\s*version "(\d+\.\d+\.\d+)"$/, 1] |
| 59 | + urls = formula.scan(/^\s*url "([^"]+)"$/).flatten |
| 60 | + shas = formula.scan(/^\s*sha256 "([a-f0-9]+)"$/).flatten |
| 61 | + release_url = if version |
| 62 | + %r{\Ahttps://github\.com/openai/#{Regexp.escape(expected[:repository])}/releases/download/v?#{Regexp.escape(version)}/[^/]+\z} |
| 63 | + end |
| 64 | + artifact_name = %r{/#{Regexp.escape(expected[:repository])}(?:[-_.][^/]+)?\z} |
| 65 | + |
| 66 | + checks = { |
| 67 | + "generated header" => formula.include?("# This file was generated by GoReleaser. DO NOT EDIT.\n"), |
| 68 | + "formula class" => formula.match?(/^class #{expected[:class_name]} < Formula$/), |
| 69 | + "semantic version" => !version.nil?, |
| 70 | + "homepage" => formula.include?(%Q(homepage "https://github.com/openai/#{expected[:repository]}")), |
| 71 | + "release URLs" => !urls.empty? && release_url && urls.all? { |url| url.match?(release_url) }, |
| 72 | + "artifact names" => !urls.empty? && urls.all? { |url| URI.decode_www_form_component(url).match?(artifact_name) }, |
| 73 | + "sha256 values" => shas.length == urls.length && shas.all? { |sha| sha.match?(/\A[a-f0-9]{64}\z/) }, |
| 74 | + "binary install" => formula.include?(expected[:install]), |
| 75 | + "tap dependency" => !expected[:dependency] || formula.include?(expected[:dependency]), |
| 76 | + } |
| 77 | + validate(path, checks) |
| 78 | +end |
0 commit comments