diff --git a/Dockerfile b/Dockerfile index e13d778..7e707c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG elixir_image=elixir:1.17.1-alpine +ARG elixir_image=elixir:1.17.2-alpine FROM ${elixir_image} AS builder diff --git a/lib/schema.ex b/lib/schema.ex index 1659975..ae389b6 100644 --- a/lib/schema.ex +++ b/lib/schema.ex @@ -614,6 +614,11 @@ defmodule Schema do Map.delete(data, :_links) end + @spec deep_clean(map()) :: map() + def deep_clean(data) do + reduce_attributes(data) + end + def apply_profiles(types, _profiles, 0) do Enum.into(types, %{}, fn {name, type} -> remove_profiles(name, type) diff --git a/lib/schema/cache.ex b/lib/schema/cache.ex index fe036eb..18dbf23 100644 --- a/lib/schema/cache.ex +++ b/lib/schema/cache.ex @@ -978,14 +978,13 @@ defmodule Schema.Cache do base |> Map.put(:profiles, profiles) |> Map.put(:attributes, attributes) - - # Top-level observable. - # Only occurs in objects, but is safe to do for classes too. - patched_base = Utils.put_non_nil(patched_base, :observable, item[:observable]) - - # Top-level path-based observables. - # Only occurs in classes, but is safe to do for objects too. - patched_base = Utils.put_non_nil(patched_base, :observables, item[:observables]) + # Top-level observable. + # Only occurs in objects, but is safe to do for classes too. + |> Utils.put_non_nil(:observable, item[:observable]) + # Top-level path-based observables. + # Only occurs in classes, but is safe to do for objects too. + |> Utils.put_non_nil(:observables, item[:observables]) + |> patch_constraints(item) Map.put(acc, base_key, patched_base) end @@ -1005,6 +1004,20 @@ defmodule Schema.Cache do patch_name(item) == item[:extends] end + defp patch_constraints(base, item) do + if Map.has_key?(item, :constraints) do + constraints = item[:constraints] + + if constraints != nil and !Enum.empty?(constraints) do + Map.put(base, :constraints, constraints) + else + Map.delete(base, :constraints) + end + else + base + end + end + defp resolve_extends(items) do Enum.map(items, fn {item_key, item} -> {item_key, resolve_extends(items, item)} end) end diff --git a/lib/schema/validator2.ex b/lib/schema/validator2.ex index 8c79a96..8304225 100644 --- a/lib/schema/validator2.ex +++ b/lib/schema/validator2.ex @@ -1591,11 +1591,11 @@ defmodule Schema.Validator2 do cond do Map.has_key?(dictionary_type, :regex) -> # This is a primitive type or subtype with a range - pattern = dictionary_type[:regex] + regex = dictionary_type[:regex] - case Regex.compile(pattern) do - {:ok, regex} -> - if Regex.match?(regex, value) do + case Regex.compile(regex) do + {:ok, compiled_regex} -> + if Regex.match?(compiled_regex, value) do response else add_error( @@ -1628,7 +1628,7 @@ defmodule Schema.Validator2 do attribute_path: attribute_path, attribute: attribute_name, type: attribute_type_key, - regex: pattern, + regex: regex, regex_error_message: to_string(message), regex_error_position: position } @@ -1641,11 +1641,11 @@ defmodule Schema.Validator2 do super_type = dictionary_types[super_type_key] if Map.has_key?(super_type, :regex) do - pattern = dictionary_type[:regex] + regex = dictionary_type[:regex] - case Regex.compile(pattern) do - {:ok, regex} -> - if Regex.match?(regex, value) do + case Regex.compile(regex) do + {:ok, compiled_regex} -> + if Regex.match?(compiled_regex, value) do response else add_error( @@ -1658,7 +1658,7 @@ defmodule Schema.Validator2 do attribute: attribute_name, super_type: super_type_key, type: attribute_type_key, - regex: pattern, + regex: regex, value: value } ) @@ -1681,7 +1681,7 @@ defmodule Schema.Validator2 do attribute_path: attribute_path, attribute: attribute_name, type: super_type_key, - regex: pattern, + regex: regex, regex_error_message: to_string(message), regex_error_position: position } diff --git a/lib/schema_web/views/page_view.ex b/lib/schema_web/views/page_view.ex index 796dc7e..961e9b9 100644 --- a/lib/schema_web/views/page_view.ex +++ b/lib/schema_web/views/page_view.ex @@ -646,7 +646,7 @@ defmodule SchemaWeb.PageView do defp dictionary_links_class_to_html(_, _, nil), do: [] defp dictionary_links_class_to_html(conn, attribute_name, linked_classes) do - classes = SchemaController.classes(conn.params()) + classes = SchemaController.classes(conn.params) all_classes = Schema.all_classes() attribute_key = Schema.Utils.descope_to_uid(attribute_name) @@ -735,7 +735,7 @@ defmodule SchemaWeb.PageView do defp dictionary_links_class_updated_to_html(_, _, nil), do: [] defp dictionary_links_class_updated_to_html(conn, attribute_name, linked_classes) do - classes = SchemaController.classes(conn.params()) + classes = SchemaController.classes(conn.params) all_classes = Schema.all_classes() attribute_key = Schema.Utils.descope_to_uid(attribute_name) diff --git a/mix.exs b/mix.exs index 46f8caa..6a4fa37 100644 --- a/mix.exs +++ b/mix.exs @@ -10,7 +10,7 @@ defmodule Schema.MixProject do use Mix.Project - @version "2.71.1" + @version "2.72.0" def project do build = System.get_env("GITHUB_RUN_NUMBER") || "SNAPSHOT" diff --git a/mix.lock b/mix.lock index abbdf79..df63fa9 100644 --- a/mix.lock +++ b/mix.lock @@ -11,7 +11,7 @@ "ex_json_schema": {:hex, :ex_json_schema, "0.7.4", "09eb5b0c8184e5702bc89625a9d0c05c7a0a845d382e9f6f406a0fc1c9a8cc3f", [:mix], [], "hexpm", "45c67fa840f0d719a2b5578126dc29bcdc1f92499c0f61bcb8a3bcb5935f9684"}, "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, - "jason": {:hex, :jason, "1.4.3", "d3f984eeb96fe53b85d20e0b049f03e57d075b5acda3ac8d465c969a2536c17b", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "9a90e868927f7c777689baa16d86f4d0e086d968db5c05d917ccff6d443e58a3"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, "number": {:hex, :number, "1.0.5", "d92136f9b9382aeb50145782f116112078b3465b7be58df1f85952b8bb399b0f", [:mix], [{:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "c0733a0a90773a66582b9e92a3f01290987f395c972cb7d685f51dd927cd5169"}, "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"},