From 92be9319c330367e4fa9576369be71e37d822c59 Mon Sep 17 00:00:00 2001 From: Ashlynne Mitchell Date: Tue, 26 Aug 2025 23:41:02 +1000 Subject: [PATCH] fix(lexicon): correct a bunch of mistakes in `deflexicon` --- lib/atex/handle.ex | 2 +- lib/atex/lexicon.ex | 85 ++++++++++++++++++++------------------ lib/atex/lexicon/schema.ex | 15 ++++--- lib/atex/nsid.ex | 3 +- 4 files changed, 55 insertions(+), 50 deletions(-) diff --git a/lib/atex/handle.ex b/lib/atex/handle.ex index 77ff0c0..1c1aa76 100644 --- a/lib/atex/handle.ex +++ b/lib/atex/handle.ex @@ -1,5 +1,5 @@ defmodule Atex.Handle do - @re ~r/^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/ + @re ~r/^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/ @spec re() :: Regex.t() def re, do: @re diff --git a/lib/atex/lexicon.ex b/lib/atex/lexicon.ex index 1a714fe..3697df8 100644 --- a/lib/atex/lexicon.ex +++ b/lib/atex/lexicon.ex @@ -64,10 +64,10 @@ defmodule Atex.Lexicon do def_name, %{ type: "object", - properties: properties, - required: required + properties: properties } = def ) do + required = Map.get(def, :required, []) nullable = Map.get(def, :nullable, []) properties @@ -114,8 +114,7 @@ defmodule Atex.Lexicon do [schema] = def_to_schema(nsid, "params", %{ type: "object", - required: def.parameters.required, - nullable: [], + required: Map.get(def.parameters, :required, []), properties: def.parameters.properties }) @@ -123,7 +122,7 @@ defmodule Atex.Lexicon do end output = - if def.output && def.output.schema do + if def[:output] && def.output[:schema] do [schema] = def_to_schema(nsid, "output", def.output.schema) schema end @@ -139,7 +138,7 @@ defmodule Atex.Lexicon do [schema] = def_to_schema(nsid, "params", %{ type: "object", - required: def.parameters.required, + required: Map.get(def.parameters, :required, []), properties: def.parameters.properties }) @@ -147,14 +146,14 @@ defmodule Atex.Lexicon do end output = - if def[:output] && def.output.schema do + if def[:output] && def.output[:schema] do [schema] = def_to_schema(nsid, "output", def.output.schema) schema end input = - if def[:input] && def.input.schema do - [schema] = def_to_schema(nsid, "output", def.input.schema) + if def[:input] && def.input[:schema] do + [schema] = def_to_schema(nsid, "input", def.input.schema) schema end @@ -168,7 +167,7 @@ defmodule Atex.Lexicon do [schema] = def_to_schema(nsid, "params", %{ type: "object", - required: def.parameters.required, + required: Map.get(def.parameters, :required, []), properties: def.parameters.properties }) @@ -234,13 +233,13 @@ defmodule Atex.Lexicon do |> Enum.map(fn {k, v} -> {Recase.to_snake(k), v} end) |> then(&{:custom, {Validators.String, :validate, [&1]}}) |> maybe_default(field) - |> then( - &{Macro.escape(&1), - quote do - String.t() - end} - ) end + |> then( + &{Macro.escape(&1), + quote do + String.t() + end} + ) end defp field_to_schema(%{type: "boolean"} = field, _nsid) do @@ -351,31 +350,37 @@ defmodule Atex.Lexicon do end defp field_to_schema(%{type: "union", refs: refs}, nsid) do - refs - |> Enum.map(fn ref -> - {nsid, fragment} = - nsid - |> Atex.NSID.expand_possible_fragment_shorthand(ref) - |> Atex.NSID.to_atom_with_fragment() - + if refs == [] do {quote do - unquote(nsid).get_schema(unquote(fragment)) - end, - quote do - unquote(nsid).unquote(fragment)() - end} - end) - |> Enum.reduce({[], []}, fn {quoted_schema, quoted_type}, {schemas, types} -> - {[quoted_schema | schemas], [quoted_type | types]} - end) - |> then(fn {schemaa, types} -> - {quote do - {:oneof, unquote(schemaa)} - end, - quote do - unquote(join_with_pipe(types)) - end} - end) + {:oneof, []} + end, nil} + else + refs + |> Enum.map(fn ref -> + {nsid, fragment} = + nsid + |> Atex.NSID.expand_possible_fragment_shorthand(ref) + |> Atex.NSID.to_atom_with_fragment() + + {quote do + unquote(nsid).get_schema(unquote(fragment)) + end, + quote do + unquote(nsid).unquote(fragment)() + end} + end) + |> Enum.reduce({[], []}, fn {quoted_schema, quoted_type}, {schemas, types} -> + {[quoted_schema | schemas], [quoted_type | types]} + end) + |> then(fn {schemas, types} -> + {quote do + {:oneof, unquote(schemas)} + end, + quote do + unquote(join_with_pipe(types)) + end} + end) + end end # TODO: apparently should be a data object, not a primitive? diff --git a/lib/atex/lexicon/schema.ex b/lib/atex/lexicon/schema.ex index 92eaca6..6a7bc07 100644 --- a/lib/atex/lexicon/schema.ex +++ b/lib/atex/lexicon/schema.ex @@ -3,11 +3,7 @@ defmodule Atex.Lexicon.Schema do defschema :lexicon, %{ lexicon: {:required, {:literal, 1}}, - id: - {:required, - {:string, - {:regex, - ~r/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z]{0,61}[a-zA-Z])?)$/}}}, + id: {:required, {:string, {:regex, Atex.NSID.re()}}}, revision: {:integer, {:gte, 0}}, description: :string, defs: { @@ -66,7 +62,8 @@ defmodule Atex.Lexicon.Schema do defschema :parameters, %{ type: {:required, {:literal, "params"}}, description: :string, - required: {{:list, :string}, {:default, []}}, + # required: {{:list, :string}, {:default, []}}, + required: {:list, :string}, properties: {:required, {:map, {:either, {get_schema(:primitive), get_schema(:primitive_array)}}}} } @@ -145,8 +142,10 @@ defmodule Atex.Lexicon.Schema do defschema :object, %{ type: {:required, {:literal, "object"}}, description: :string, - required: {{:list, :string}, {:default, []}}, - nullable: {{:list, :string}, {:default, []}}, + # required: {{:list, :string}, {:default, []}}, + # nullable: {{:list, :string}, {:default, []}}, + required: {:list, :string}, + nullable: {:list, :string}, properties: {:required, {:map, diff --git a/lib/atex/nsid.ex b/lib/atex/nsid.ex index da74cc1..0f44043 100644 --- a/lib/atex/nsid.ex +++ b/lib/atex/nsid.ex @@ -1,5 +1,6 @@ defmodule Atex.NSID do - @re ~r/^[a-zA-Z](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\\.[a-zA-Z](?:[a-zA-Z0-9]{0,62})?)$/ + @re ~r/^[a-zA-Z](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\.[a-zA-Z](?:[a-zA-Z0-9]{0,62})?)$/ + # TODO: regex with support for fragment @spec re() :: Regex.t() def re, do: @re -- 2.51.2