diff --git a/.gitignore b/.gitignore index bb179fb7f3..bdd631f909 100644 --- a/.gitignore +++ b/.gitignore @@ -84,7 +84,6 @@ **/vendor/bundle/ruby/*/gems/thread_safe-*/lib/thread_safe/util # Ignore dependencies we don't wish to vendor -**/vendor/bundle/ruby/*/gems/addressable-*/ **/vendor/bundle/ruby/*/gems/ast-*/ **/vendor/bundle/ruby/*/gems/bootsnap-*/ **/vendor/bundle/ruby/*/gems/bundler-*/ @@ -97,11 +96,14 @@ **/vendor/bundle/ruby/*/gems/diff-lcs-*/ **/vendor/bundle/ruby/*/gems/docile-*/ **/vendor/bundle/ruby/*/gems/domain_name-*/ +**/vendor/bundle/ruby/*/gems/ecma-re-validator-*/ +**/vendor/bundle/ruby/*/gems/hana-*/ **/vendor/bundle/ruby/*/gems/highline-*/ **/vendor/bundle/ruby/*/gems/http-cookie-*/ **/vendor/bundle/ruby/*/gems/hpricot-*/ **/vendor/bundle/ruby/*/gems/jaro_winkler-*/ **/vendor/bundle/ruby/*/gems/json-*/ +**/vendor/bundle/ruby/*/gems/json_schemer-*/ **/vendor/bundle/ruby/*/gems/method_source-*/ **/vendor/bundle/ruby/*/gems/mime-types-data-*/ **/vendor/bundle/ruby/*/gems/mime-types-*/ @@ -120,7 +122,6 @@ **/vendor/bundle/ruby/*/gems/powerpack-*/ **/vendor/bundle/ruby/*/gems/psych-*/ **/vendor/bundle/ruby/*/gems/pry-*/ -**/vendor/bundle/ruby/*/gems/public_suffix-*/ **/vendor/bundle/ruby/*/gems/racc-*/ **/vendor/bundle/ruby/*/gems/rainbow-*/ **/vendor/bundle/ruby/*/gems/rdiscount-*/ @@ -152,6 +153,7 @@ **/vendor/bundle/ruby/*/gems/unf_ext-*/ **/vendor/bundle/ruby/*/gems/unf-*/ **/vendor/bundle/ruby/*/gems/unicode-display_width-*/ +**/vendor/bundle/ruby/*/gems/uri_template-*/ **/vendor/bundle/ruby/*/gems/webrobots-*/ # Ignore `bin` contents (again). diff --git a/Library/Homebrew/github_packages.rb b/Library/Homebrew/github_packages.rb index 41a3acf057..a73262b97e 100644 --- a/Library/Homebrew/github_packages.rb +++ b/Library/Homebrew/github_packages.rb @@ -46,10 +46,8 @@ class GitHubPackages end # TODO: these dependencies are installed but cannot be required automatically. - Homebrew.install_gem!("public_suffix") - Homebrew.install_gem!("addressable") - Homebrew.install_gem!("json-schema") - require "json-schema" + Homebrew.install_gem!("json_schemer") + require "json_schemer" load_schemas! @@ -97,13 +95,30 @@ class GitHubPackages out, = curl_output(url) json = JSON.parse(out) + @schema_json ||= {} Array(uris).each do |uri| - schema = JSON::Schema.new(json, uri) - schema.uri = uri - JSON::Validator.add_schema(schema) + @schema_json[uri] = json end end + def schema_resolver(uri) + @schema_json[uri.to_s.gsub(/#.*/, "")] + end + + def validate_schema!(schema_uri, json) + schema = JSONSchemer.schema(@schema_json[schema_uri], ref_resolver: method(:schema_resolver)) + json = json.deep_stringify_keys + return if schema.valid?(json) + + puts + ofail "#{Formatter.url(schema_uri)} JSON schema validation failed!" + oh1 "Errors" + pp schema.validate(json).to_a + oh1 "JSON" + pp json + exit 1 + end + def upload_bottle(user, token, skopeo, formula_name, bottle_hash) _, org, repo, = *bottle_hash["bottle"]["root_url"].match(URL_REGEX) @@ -217,7 +232,7 @@ class GitHubPackages }], annotations: annotations_hash, } - JSON::Validator.validate!(IMAGE_MANIFEST_SCHEMA_URI, image_manifest) + validate_schema!(IMAGE_MANIFEST_SCHEMA_URI, image_manifest) manifest_json_sha256, manifest_json_size = write_hash(blobs, image_manifest) { @@ -244,7 +259,7 @@ class GitHubPackages def write_image_layout(root) image_layout = { imageLayoutVersion: "1.0.0" } - JSON::Validator.validate!(IMAGE_LAYOUT_SCHEMA_URI, image_layout) + validate_schema!(IMAGE_LAYOUT_SCHEMA_URI, image_layout) write_hash(root, image_layout, "oci-layout") end @@ -262,7 +277,7 @@ class GitHubPackages diff_ids: ["sha256:#{tar_sha256}"], }, }) - JSON::Validator.validate!(IMAGE_CONFIG_SCHEMA_URI, image_config) + validate_schema!(IMAGE_CONFIG_SCHEMA_URI, image_config) write_hash(blobs, image_config) end @@ -272,7 +287,7 @@ class GitHubPackages manifests: manifests, annotations: {}, } - JSON::Validator.validate!(IMAGE_INDEX_SCHEMA_URI, image_index) + validate_schema!(IMAGE_INDEX_SCHEMA_URI, image_index) write_hash(blobs, image_index) end @@ -287,7 +302,7 @@ class GitHubPackages }], annotations: {}, } - JSON::Validator.validate!(IMAGE_INDEX_SCHEMA_URI, index_json) + validate_schema!(IMAGE_INDEX_SCHEMA_URI, index_json) write_hash(root, index_json, "index.json") end diff --git a/Library/Homebrew/sorbet/rbi/todo.rbi b/Library/Homebrew/sorbet/rbi/todo.rbi index 50a72ebfcd..ca35a66298 100644 --- a/Library/Homebrew/sorbet/rbi/todo.rbi +++ b/Library/Homebrew/sorbet/rbi/todo.rbi @@ -4,8 +4,7 @@ # typed: strong module ::StackProf; end module DependencyCollector::Compat; end -module JSON::Schema; end -module JSON::Validator; end +module GitHubPackages::JSONSchemer; end module OS::Mac::Version::NULL; end module T::InterfaceWrapper::Helpers; end module T::Private::Abstract::Hooks; end