Merge pull request #16638 from apainintheneck/load-internal-json-v3
Load internal json v3
This commit is contained in:
		
						commit
						154a21706a
					
				@ -184,6 +184,11 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
      Tap.fetch(org, repo)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    sig { returns(T::Boolean) }
 | 
			
		||||
    def self.internal_json_v3?
 | 
			
		||||
      ENV["HOMEBREW_INTERNAL_JSON_V3"].present?
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # @api private
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,10 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
      sig { returns(T::Boolean) }
 | 
			
		||||
      def self.download_and_cache_data!
 | 
			
		||||
        if Homebrew::API.internal_json_v3?
 | 
			
		||||
          json_formulae, updated = Homebrew::API.fetch_json_api_file "internal/v3/homebrew-core.jws.json"
 | 
			
		||||
          overwrite_cache! T.cast(json_formulae, T::Hash[String, T.untyped])
 | 
			
		||||
        else
 | 
			
		||||
          json_formulae, updated = Homebrew::API.fetch_json_api_file "formula.jws.json"
 | 
			
		||||
 | 
			
		||||
          cache["aliases"] = {}
 | 
			
		||||
@ -53,6 +57,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
            [json_formula["name"], json_formula.except("name")]
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        updated
 | 
			
		||||
      end
 | 
			
		||||
@ -88,6 +93,28 @@ module Homebrew
 | 
			
		||||
        cache["renames"]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      sig { returns(Hash) }
 | 
			
		||||
      def self.tap_migrations
 | 
			
		||||
        # Not sure that we need to reload here.
 | 
			
		||||
        unless cache.key?("tap_migrations")
 | 
			
		||||
          json_updated = download_and_cache_data!
 | 
			
		||||
          write_names_and_aliases(regenerate: json_updated)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        cache["tap_migrations"]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      sig { returns(String) }
 | 
			
		||||
      def self.tap_git_head
 | 
			
		||||
        # Note sure we need to reload here.
 | 
			
		||||
        unless cache.key?("tap_git_head")
 | 
			
		||||
          json_updated = download_and_cache_data!
 | 
			
		||||
          write_names_and_aliases(regenerate: json_updated)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        cache["tap_git_head"]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      sig { params(regenerate: T::Boolean).void }
 | 
			
		||||
      def self.write_names_and_aliases(regenerate: false)
 | 
			
		||||
        download_and_cache_data! unless cache.key?("formulae")
 | 
			
		||||
 | 
			
		||||
@ -58,14 +58,6 @@ module Homebrew
 | 
			
		||||
      Formulary.enable_factory_cache!
 | 
			
		||||
      Formula.generating_hash!
 | 
			
		||||
 | 
			
		||||
      homebrew_core_tap_hash = {
 | 
			
		||||
        "tap_git_head"   => tap.git_head,
 | 
			
		||||
        "aliases"        => tap.alias_table,
 | 
			
		||||
        "renames"        => tap.formula_renames,
 | 
			
		||||
        "tap_migrations" => tap.tap_migrations,
 | 
			
		||||
        "formulae"       => {},
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      tap.formula_names.each do |name|
 | 
			
		||||
        formula = Formulary.factory(name)
 | 
			
		||||
        name = formula.name
 | 
			
		||||
@ -77,15 +69,12 @@ module Homebrew
 | 
			
		||||
          File.write("api/formula/#{name}.json", FORMULA_JSON_TEMPLATE)
 | 
			
		||||
          File.write("formula/#{name}.html", html_template_name)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        homebrew_core_tap_hash["formulae"][formula.name] =
 | 
			
		||||
          formula.to_hash_with_variations(hash_method: :to_api_hash)
 | 
			
		||||
      rescue
 | 
			
		||||
        onoe "Error while generating data for formula '#{name}'."
 | 
			
		||||
        raise
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      homebrew_core_tap_json = JSON.generate(homebrew_core_tap_hash)
 | 
			
		||||
      homebrew_core_tap_json = JSON.generate(tap.to_api_hash)
 | 
			
		||||
      File.write("api/internal/v3/homebrew-core.json", homebrew_core_tap_json) unless args.dry_run?
 | 
			
		||||
      canonical_json = JSON.pretty_generate(tap.formula_renames.merge(tap.alias_table))
 | 
			
		||||
      File.write("_data/formula_canonical.json", "#{canonical_json}\n") unless args.dry_run?
 | 
			
		||||
 | 
			
		||||
@ -11,4 +11,11 @@ module Cachable
 | 
			
		||||
  def clear_cache
 | 
			
		||||
    cache.clear
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  sig { params(hash: T::Hash[T.untyped, T.untyped]).void }
 | 
			
		||||
  def overwrite_cache!(hash)
 | 
			
		||||
    @cache = hash
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -251,8 +251,8 @@ module Formulary
 | 
			
		||||
      desc json_formula["desc"]
 | 
			
		||||
      homepage json_formula["homepage"]
 | 
			
		||||
      license SPDX.string_to_license_expression(json_formula["license"])
 | 
			
		||||
      revision json_formula["revision"]
 | 
			
		||||
      version_scheme json_formula["version_scheme"]
 | 
			
		||||
      revision json_formula.fetch("revision", 0)
 | 
			
		||||
      version_scheme json_formula.fetch("version_scheme", 0)
 | 
			
		||||
 | 
			
		||||
      if (urls_stable = json_formula["urls"]["stable"].presence)
 | 
			
		||||
        stable do
 | 
			
		||||
@ -262,7 +262,7 @@ module Formulary
 | 
			
		||||
            using:    urls_stable["using"]&.to_sym,
 | 
			
		||||
          }.compact
 | 
			
		||||
          url urls_stable["url"], **url_spec
 | 
			
		||||
          version json_formula["versions"]["stable"]
 | 
			
		||||
          version Homebrew::API.internal_json_v3? ? json_formula["version"] : json_formula["versions"]["stable"]
 | 
			
		||||
          sha256 urls_stable["checksum"] if urls_stable["checksum"].present?
 | 
			
		||||
 | 
			
		||||
          instance_exec(:stable, &add_deps)
 | 
			
		||||
@ -289,7 +289,13 @@ module Formulary
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      if (bottles_stable = json_formula["bottle"]["stable"].presence)
 | 
			
		||||
      bottles_stable = if Homebrew::API.internal_json_v3?
 | 
			
		||||
        json_formula["bottle"]
 | 
			
		||||
      else
 | 
			
		||||
        json_formula["bottle"]["stable"]
 | 
			
		||||
      end.presence
 | 
			
		||||
 | 
			
		||||
      if bottles_stable
 | 
			
		||||
        bottle do
 | 
			
		||||
          if Homebrew::EnvConfig.bottle_domain == HOMEBREW_BOTTLE_DEFAULT_DOMAIN
 | 
			
		||||
            root_url HOMEBREW_BOTTLE_DEFAULT_DOMAIN
 | 
			
		||||
@ -373,11 +379,17 @@ module Formulary
 | 
			
		||||
            &.gsub(HOMEBREW_HOME_PLACEHOLDER, Dir.home)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @tap_git_head_string = json_formula["tap_git_head"]
 | 
			
		||||
      @tap_git_head_string = if Homebrew::API.internal_json_v3?
 | 
			
		||||
        Homebrew::API::Formula.tap_git_head
 | 
			
		||||
      else
 | 
			
		||||
        json_formula["tap_git_head"]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def tap_git_head
 | 
			
		||||
        self.class.instance_variable_get(:@tap_git_head_string)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      unless Homebrew::API.internal_json_v3?
 | 
			
		||||
        @oldnames_array = json_formula["oldnames"] || [json_formula["oldname"]].compact
 | 
			
		||||
        def oldnames
 | 
			
		||||
          self.class.instance_variable_get(:@oldnames_array)
 | 
			
		||||
@ -387,6 +399,7 @@ module Formulary
 | 
			
		||||
        def aliases
 | 
			
		||||
          self.class.instance_variable_get(:@aliases_array)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @versioned_formulae_array = json_formula.fetch("versioned_formulae", [])
 | 
			
		||||
      def versioned_formulae_names
 | 
			
		||||
 | 
			
		||||
@ -126,6 +126,7 @@ class Tap
 | 
			
		||||
    @formula_dir = nil
 | 
			
		||||
    @cask_dir = nil
 | 
			
		||||
    @command_dir = nil
 | 
			
		||||
    @formula_names = nil
 | 
			
		||||
    @formula_files = nil
 | 
			
		||||
    @cask_files = nil
 | 
			
		||||
    @alias_dir = nil
 | 
			
		||||
@ -1101,6 +1102,8 @@ class CoreTap < AbstractCoreTap
 | 
			
		||||
    @tap_migrations ||= if Homebrew::EnvConfig.no_install_from_api?
 | 
			
		||||
      ensure_installed!
 | 
			
		||||
      super
 | 
			
		||||
    elsif Homebrew::API.internal_json_v3?
 | 
			
		||||
      Homebrew::API::Formula.tap_migrations
 | 
			
		||||
    else
 | 
			
		||||
      migrations, = Homebrew::API.fetch_json_api_file "formula_tap_migrations.jws.json",
 | 
			
		||||
                                                      stale_seconds: TAP_MIGRATIONS_STALE_SECONDS
 | 
			
		||||
@ -1188,6 +1191,23 @@ class CoreTap < AbstractCoreTap
 | 
			
		||||
      hash[name] = Pathname(new_path) if existing_path.nil? || existing_path.to_s.length < new_path.length
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  sig { returns(T::Hash[String, T.untyped]) }
 | 
			
		||||
  def to_api_hash
 | 
			
		||||
    formulae_api_hash = formula_names.to_h do |name|
 | 
			
		||||
      formula = Formulary.factory(name)
 | 
			
		||||
      formula_hash = formula.to_hash_with_variations(hash_method: :to_api_hash)
 | 
			
		||||
      [name, formula_hash]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
      "tap_git_head"   => git_head,
 | 
			
		||||
      "aliases"        => alias_table,
 | 
			
		||||
      "renames"        => formula_renames,
 | 
			
		||||
      "tap_migrations" => tap_migrations,
 | 
			
		||||
      "formulae"       => formulae_api_hash,
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
# A specialized {Tap} class for homebrew-cask.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										144
									
								
								Library/Homebrew/test/api/internal_tap_json/formula_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								Library/Homebrew/test/api/internal_tap_json/formula_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,144 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
RSpec.describe "Internal Tap JSON -- Formula" do
 | 
			
		||||
  let(:internal_tap_json) { File.read(TEST_FIXTURE_DIR/"internal_tap_json/homebrew-core.json").chomp }
 | 
			
		||||
  let(:tap_git_head) { "9977471165641744a829d3e494fa563407503297" }
 | 
			
		||||
 | 
			
		||||
  context "when generating JSON", :needs_macos do
 | 
			
		||||
    before do
 | 
			
		||||
      cp_r(TEST_FIXTURE_DIR/"internal_tap_json/homebrew-core", Tap::TAP_DIRECTORY/"homebrew")
 | 
			
		||||
 | 
			
		||||
      # NOTE: Symlinks can't be copied recursively so we create them manually here.
 | 
			
		||||
      (Tap::TAP_DIRECTORY/"homebrew/homebrew-core").tap do |core_tap|
 | 
			
		||||
        mkdir(core_tap/"Aliases")
 | 
			
		||||
        ln_s(core_tap/"Formula/f/fennel.rb", core_tap/"Aliases/fennel-lang")
 | 
			
		||||
        ln_s(core_tap/"Formula/p/ponyc.rb", core_tap/"Aliases/ponyc-lang")
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "creates the expected hash" do
 | 
			
		||||
      api_hash = CoreTap.instance.to_api_hash
 | 
			
		||||
      api_hash["tap_git_head"] = tap_git_head # tricky to mock
 | 
			
		||||
 | 
			
		||||
      expect(JSON.pretty_generate(api_hash)).to eq(internal_tap_json)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context "when loading JSON" do
 | 
			
		||||
    before do
 | 
			
		||||
      ENV["HOMEBREW_INTERNAL_JSON_V3"] = "1"
 | 
			
		||||
      ENV.delete("HOMEBREW_NO_INSTALL_FROM_API")
 | 
			
		||||
 | 
			
		||||
      allow(Homebrew::API).to receive(:fetch_json_api_file)
 | 
			
		||||
        .with("internal/v3/homebrew-core.jws.json")
 | 
			
		||||
        .and_return([JSON.parse(internal_tap_json), false])
 | 
			
		||||
 | 
			
		||||
      # `Tap.reverse_tap_migrations_renames` looks for renames in every
 | 
			
		||||
      # tap so `CoreCaskTap.tap_migrations` gets called and tries to
 | 
			
		||||
      # fetch stuff from the API. This just avoids errors.
 | 
			
		||||
      allow(Homebrew::API).to receive(:fetch_json_api_file)
 | 
			
		||||
        .with("cask_tap_migrations.jws.json", anything)
 | 
			
		||||
        .and_return([{}, false])
 | 
			
		||||
 | 
			
		||||
      # To allow `formula_names.txt` to be written to the cache.
 | 
			
		||||
      (HOMEBREW_CACHE/"api").mkdir
 | 
			
		||||
 | 
			
		||||
      Homebrew::API::Formula.clear_cache
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    after do
 | 
			
		||||
      Homebrew::API::Formula.clear_cache
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "loads tap aliases" do
 | 
			
		||||
      expect(CoreTap.instance.alias_table).to eq({
 | 
			
		||||
        "fennel-lang" => "fennel",
 | 
			
		||||
        "ponyc-lang"  => "ponyc",
 | 
			
		||||
      })
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "loads formula renames" do
 | 
			
		||||
      expect(CoreTap.instance.formula_renames).to eq({
 | 
			
		||||
        "advancemenu" => "advancemame",
 | 
			
		||||
        "amtk"        => "libgedit-amtk",
 | 
			
		||||
        "annie"       => "lux",
 | 
			
		||||
        "antlr2"      => "antlr@2",
 | 
			
		||||
        "romanesco"   => "fennel",
 | 
			
		||||
      })
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "loads tap migrations" do
 | 
			
		||||
      expect(CoreTap.instance.tap_migrations).to eq({
 | 
			
		||||
        "adobe-air-sdk"          => "homebrew/cask",
 | 
			
		||||
        "android-ndk"            => "homebrew/cask",
 | 
			
		||||
        "android-platform-tools" => "homebrew/cask",
 | 
			
		||||
        "android-sdk"            => "homebrew/cask",
 | 
			
		||||
        "app-engine-go-32"       => "homebrew/cask/google-cloud-sdk",
 | 
			
		||||
      })
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "loads tap git head" do
 | 
			
		||||
      expect(Homebrew::API::Formula.tap_git_head)
 | 
			
		||||
        .to eq(tap_git_head)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context "when loading formulae" do
 | 
			
		||||
      let(:fennel_metadata) do
 | 
			
		||||
        {
 | 
			
		||||
          "dependencies"     => ["lua"],
 | 
			
		||||
          "desc"             => "Lua Lisp Language",
 | 
			
		||||
          "full_name"        => "fennel",
 | 
			
		||||
          "homepage"         => "https://fennel-lang.org",
 | 
			
		||||
          "license"          => "MIT",
 | 
			
		||||
          "name"             => "fennel",
 | 
			
		||||
          "ruby_source_path" => "Formula/f/fennel.rb",
 | 
			
		||||
          "tap"              => "homebrew/core",
 | 
			
		||||
          "tap_git_head"     => tap_git_head,
 | 
			
		||||
          "versions"         => { "bottle"=>true, "head"=>nil, "stable"=>"1.4.0" },
 | 
			
		||||
        }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      let(:ponyc_metadata) do
 | 
			
		||||
        {
 | 
			
		||||
          "desc"                   => "Object-oriented, actor-model, capabilities-secure programming language",
 | 
			
		||||
          "full_name"              => "ponyc",
 | 
			
		||||
          "homepage"               => "https://www.ponylang.io/",
 | 
			
		||||
          "license"                => "BSD-2-Clause",
 | 
			
		||||
          "name"                   => "ponyc",
 | 
			
		||||
          "ruby_source_path"       => "Formula/p/ponyc.rb",
 | 
			
		||||
          "tap"                    => "homebrew/core",
 | 
			
		||||
          "tap_git_head"           => tap_git_head,
 | 
			
		||||
          # TODO: improve this API before we ship internal API v3 to users
 | 
			
		||||
          "uses_from_macos"        => [{ "llvm"=>[:build, :test] }, "zlib"],
 | 
			
		||||
          "uses_from_macos_bounds" => [{}, {}],
 | 
			
		||||
          "versions"               => { "bottle"=>true, "head"=>nil, "stable"=>"0.58.1" },
 | 
			
		||||
        }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "loads fennel" do
 | 
			
		||||
        fennel = Formulary.factory("fennel")
 | 
			
		||||
        expect(fennel.to_hash).to include(**fennel_metadata)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "loads fennel from rename" do
 | 
			
		||||
        fennel = Formulary.factory("romanesco")
 | 
			
		||||
        expect(fennel.to_hash).to include(**fennel_metadata)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "loads fennel from alias" do
 | 
			
		||||
        fennel = Formulary.factory("fennel-lang")
 | 
			
		||||
        expect(fennel.to_hash).to include(**fennel_metadata)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "loads ponyc" do
 | 
			
		||||
        ponyc = Formulary.factory("ponyc")
 | 
			
		||||
        expect(ponyc.to_hash).to include(**ponyc_metadata)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it "loads ponyc from alias" do
 | 
			
		||||
        ponyc = Formulary.factory("ponyc-lang")
 | 
			
		||||
        expect(ponyc.to_hash).to include(**ponyc_metadata)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -0,0 +1,116 @@
 | 
			
		||||
{
 | 
			
		||||
  "tap_git_head": "9977471165641744a829d3e494fa563407503297",
 | 
			
		||||
  "aliases": {
 | 
			
		||||
    "fennel-lang": "fennel",
 | 
			
		||||
    "ponyc-lang": "ponyc"
 | 
			
		||||
  },
 | 
			
		||||
  "renames": {
 | 
			
		||||
    "advancemenu": "advancemame",
 | 
			
		||||
    "amtk": "libgedit-amtk",
 | 
			
		||||
    "annie": "lux",
 | 
			
		||||
    "antlr2": "antlr@2",
 | 
			
		||||
    "romanesco": "fennel"
 | 
			
		||||
  },
 | 
			
		||||
  "tap_migrations": {
 | 
			
		||||
    "adobe-air-sdk": "homebrew/cask",
 | 
			
		||||
    "android-ndk": "homebrew/cask",
 | 
			
		||||
    "android-platform-tools": "homebrew/cask",
 | 
			
		||||
    "android-sdk": "homebrew/cask",
 | 
			
		||||
    "app-engine-go-32": "homebrew/cask/google-cloud-sdk"
 | 
			
		||||
  },
 | 
			
		||||
  "formulae": {
 | 
			
		||||
    "fennel": {
 | 
			
		||||
      "desc": "Lua Lisp Language",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "homepage": "https://fennel-lang.org",
 | 
			
		||||
      "urls": {
 | 
			
		||||
        "stable": {
 | 
			
		||||
          "url": "https://github.com/bakpakin/Fennel/archive/refs/tags/1.4.0.tar.gz",
 | 
			
		||||
          "checksum": "161eb7f17f86e95de09070214d042fb25372f71ad266f451431f3109e87965c7"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "post_install_defined": false,
 | 
			
		||||
      "ruby_source_path": "Formula/f/fennel.rb",
 | 
			
		||||
      "ruby_source_sha256": "5856e655fd1cea11496d67bc27fb14fee5cfbdea63c697c3773c7f247581197d",
 | 
			
		||||
      "dependencies": [
 | 
			
		||||
        "lua"
 | 
			
		||||
      ],
 | 
			
		||||
      "version": "1.4.0",
 | 
			
		||||
      "bottle": {
 | 
			
		||||
        "files": {
 | 
			
		||||
          "all": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "f46028597883cbc38864c61bd3fa402da9cb90ce97415d51a7b5279bc17f7bd0"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "ponyc": {
 | 
			
		||||
      "desc": "Object-oriented, actor-model, capabilities-secure programming language",
 | 
			
		||||
      "license": "BSD-2-Clause",
 | 
			
		||||
      "homepage": "https://www.ponylang.io/",
 | 
			
		||||
      "urls": {
 | 
			
		||||
        "stable": {
 | 
			
		||||
          "url": "https://github.com/ponylang/ponyc.git",
 | 
			
		||||
          "tag": "0.58.1",
 | 
			
		||||
          "revision": "fe3895eb4af494bf36d7690641bdfb5755db8350"
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "post_install_defined": false,
 | 
			
		||||
      "ruby_source_path": "Formula/p/ponyc.rb",
 | 
			
		||||
      "ruby_source_sha256": "81d51c25d18710191beb62f9f380bae3d878aad815a65ec1ee2a3b132c1fadb3",
 | 
			
		||||
      "build_dependencies": [
 | 
			
		||||
        "cmake",
 | 
			
		||||
        "python@3.12"
 | 
			
		||||
      ],
 | 
			
		||||
      "uses_from_macos": [
 | 
			
		||||
        {
 | 
			
		||||
          "llvm": [
 | 
			
		||||
            "build",
 | 
			
		||||
            "test"
 | 
			
		||||
          ]
 | 
			
		||||
        },
 | 
			
		||||
        "zlib"
 | 
			
		||||
      ],
 | 
			
		||||
      "uses_from_macos_bounds": [
 | 
			
		||||
        {
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "version": "0.58.1",
 | 
			
		||||
      "bottle": {
 | 
			
		||||
        "files": {
 | 
			
		||||
          "arm64_sonoma": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "e3aecfcf02aea56d53d82691e2ad7a780f771023d7070271bfce96b17439a34d"
 | 
			
		||||
          },
 | 
			
		||||
          "arm64_ventura": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "6ff83717191e16e4f852fb3be8f838afba312cc39e601bb5cebd2a618a328658"
 | 
			
		||||
          },
 | 
			
		||||
          "arm64_monterey": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "25c91bce200583a96f4cea34f31393c8f10eadcab363cc7d4d864d15f5f97e25"
 | 
			
		||||
          },
 | 
			
		||||
          "sonoma": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "5f4c550ce33e2970e0ada18a409755fa62936181289a21c15582ff80343866b6"
 | 
			
		||||
          },
 | 
			
		||||
          "ventura": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "f26c799f45013685da779bf2008ebe1907f9b3a93d5f260ce271a3f3b628da50"
 | 
			
		||||
          },
 | 
			
		||||
          "monterey": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "1cff10d068b36b18b253d235424c4f5aef71ff9ee44f2522c4b041dd4383ec30"
 | 
			
		||||
          },
 | 
			
		||||
          "x86_64_linux": {
 | 
			
		||||
            "cellar": ":any_skip_relocation",
 | 
			
		||||
            "sha256": "ab49318d75eed3ee932c8e5add22f252ec0c852aad94945022877f926e93899f"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,25 @@
 | 
			
		||||
class Fennel < Formula
 | 
			
		||||
  desc "Lua Lisp Language"
 | 
			
		||||
  homepage "https://fennel-lang.org"
 | 
			
		||||
  url "https://github.com/bakpakin/Fennel/archive/refs/tags/1.4.0.tar.gz"
 | 
			
		||||
  sha256 "161eb7f17f86e95de09070214d042fb25372f71ad266f451431f3109e87965c7"
 | 
			
		||||
  license "MIT"
 | 
			
		||||
 | 
			
		||||
  bottle do
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, all: "f46028597883cbc38864c61bd3fa402da9cb90ce97415d51a7b5279bc17f7bd0"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  depends_on "lua"
 | 
			
		||||
 | 
			
		||||
  def install
 | 
			
		||||
    system "make"
 | 
			
		||||
    bin.install "fennel"
 | 
			
		||||
 | 
			
		||||
    lua = Formula["lua"]
 | 
			
		||||
    (share/"lua"/lua.version.major_minor).install "fennel.lua"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test do
 | 
			
		||||
    assert_match "hello, world!", shell_output("#{bin}/fennel -e '(print \"hello, world!\")'")
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -0,0 +1,60 @@
 | 
			
		||||
class Ponyc < Formula
 | 
			
		||||
  desc "Object-oriented, actor-model, capabilities-secure programming language"
 | 
			
		||||
  homepage "https://www.ponylang.io/"
 | 
			
		||||
  url "https://github.com/ponylang/ponyc.git",
 | 
			
		||||
      tag:      "0.58.1",
 | 
			
		||||
      revision: "fe3895eb4af494bf36d7690641bdfb5755db8350"
 | 
			
		||||
  license "BSD-2-Clause"
 | 
			
		||||
 | 
			
		||||
  bottle do
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, arm64_sonoma:   "e3aecfcf02aea56d53d82691e2ad7a780f771023d7070271bfce96b17439a34d"
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, arm64_ventura:  "6ff83717191e16e4f852fb3be8f838afba312cc39e601bb5cebd2a618a328658"
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, arm64_monterey: "25c91bce200583a96f4cea34f31393c8f10eadcab363cc7d4d864d15f5f97e25"
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, sonoma:         "5f4c550ce33e2970e0ada18a409755fa62936181289a21c15582ff80343866b6"
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, ventura:        "f26c799f45013685da779bf2008ebe1907f9b3a93d5f260ce271a3f3b628da50"
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, monterey:       "1cff10d068b36b18b253d235424c4f5aef71ff9ee44f2522c4b041dd4383ec30"
 | 
			
		||||
    sha256 cellar: :any_skip_relocation, x86_64_linux:   "ab49318d75eed3ee932c8e5add22f252ec0c852aad94945022877f926e93899f"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  depends_on "cmake" => :build
 | 
			
		||||
  depends_on "python@3.12" => :build
 | 
			
		||||
 | 
			
		||||
  uses_from_macos "llvm" => [:build, :test]
 | 
			
		||||
  uses_from_macos "zlib"
 | 
			
		||||
 | 
			
		||||
  # We use LLVM to work around an error while building bundled `google-benchmark` with GCC
 | 
			
		||||
  fails_with :gcc do
 | 
			
		||||
    cause <<-EOS
 | 
			
		||||
      .../src/gbenchmark/src/thread_manager.h:50:31: error: expected ')' before '(' token
 | 
			
		||||
         50 |   GUARDED_BY(GetBenchmarkMutex()) Result results;
 | 
			
		||||
            |                               ^
 | 
			
		||||
    EOS
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def install
 | 
			
		||||
    inreplace "CMakeLists.txt", "PONY_COMPILER=\"${CMAKE_C_COMPILER}\"", "PONY_COMPILER=\"#{ENV.cc}\"" if OS.linux?
 | 
			
		||||
 | 
			
		||||
    ENV["CMAKE_FLAGS"] = "-DCMAKE_OSX_SYSROOT=#{MacOS.sdk_path}" if OS.mac?
 | 
			
		||||
    ENV["MAKEFLAGS"] = "build_flags=-j#{ENV.make_jobs}"
 | 
			
		||||
 | 
			
		||||
    system "make", "libs"
 | 
			
		||||
    system "make", "configure"
 | 
			
		||||
    system "make", "build"
 | 
			
		||||
    system "make", "install", "DESTDIR=#{prefix}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test do
 | 
			
		||||
    # ENV["CC"] returns llvm_clang, which does not work in a test block.
 | 
			
		||||
    ENV.clang
 | 
			
		||||
 | 
			
		||||
    system "#{bin}/ponyc", "-rexpr", "#{prefix}/packages/stdlib"
 | 
			
		||||
 | 
			
		||||
    (testpath/"test/main.pony").write <<~EOS
 | 
			
		||||
      actor Main
 | 
			
		||||
        new create(env: Env) =>
 | 
			
		||||
          env.out.print("Hello World!")
 | 
			
		||||
    EOS
 | 
			
		||||
    system "#{bin}/ponyc", "test"
 | 
			
		||||
    assert_equal "Hello World!", shell_output("./test1").strip
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@ -0,0 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "advancemenu": "advancemame",
 | 
			
		||||
  "amtk": "libgedit-amtk",
 | 
			
		||||
  "annie": "lux",
 | 
			
		||||
  "antlr2": "antlr@2",
 | 
			
		||||
  "romanesco": "fennel"
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "adobe-air-sdk": "homebrew/cask",
 | 
			
		||||
  "android-ndk": "homebrew/cask",
 | 
			
		||||
  "android-platform-tools": "homebrew/cask",
 | 
			
		||||
  "android-sdk": "homebrew/cask",
 | 
			
		||||
  "app-engine-go-32": "homebrew/cask/google-cloud-sdk"
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user