core: add error handling for RDF.Namespace term resolution
This commit is contained in:
parent
7c34231bb5
commit
fd45a9ed6c
2 changed files with 21 additions and 5 deletions
|
@ -46,15 +46,28 @@ defmodule RDF.Namespace do
|
||||||
|
|
||||||
def resolve_term(expr)
|
def resolve_term(expr)
|
||||||
|
|
||||||
def resolve_term(uri = %URI{}), do: uri
|
def resolve_term(uri = %URI{}),
|
||||||
|
do: uri
|
||||||
|
def resolve_term(namespaced_term) when is_atom(namespaced_term),
|
||||||
|
do: namespaced_term |> to_string() |> do_resolve_term()
|
||||||
|
|
||||||
def resolve_term(namespaced_atom) when is_atom(namespaced_atom) do
|
defp do_resolve_term("Elixir." <> _ = namespaced_term) do
|
||||||
{term, namespace} =
|
{term, namespace} =
|
||||||
namespaced_atom
|
namespaced_term
|
||||||
|> Module.split
|
|> Module.split
|
||||||
|> List.pop_at(-1)
|
|> List.pop_at(-1)
|
||||||
{term, namespace} = {String.to_atom(term), Module.concat(namespace)}
|
{term, namespace} = {String.to_atom(term), Module.concat(namespace)}
|
||||||
|
if Keyword.has_key?(namespace.__info__(:functions), :__resolve_term__) do
|
||||||
namespace.__resolve_term__(term)
|
namespace.__resolve_term__(term)
|
||||||
|
else
|
||||||
|
raise RDF.Namespace.UndefinedTermError,
|
||||||
|
"#{namespaced_term} is not a term on a RDF.Namespace"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp do_resolve_term(namespaced_term) do
|
||||||
|
raise RDF.Namespace.UndefinedTermError,
|
||||||
|
"#{namespaced_term} is not a term on a RDF.Namespace"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -384,11 +384,14 @@ defmodule RDF.Vocabulary.NamespaceTest do
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@tag skip: "TODO: Can we make RDF.uri(:foo) an undefined function call with guards or in another way?"
|
|
||||||
test "resolving an unqualified term raises an error" do
|
test "resolving an unqualified term raises an error" do
|
||||||
assert_raise RDF.Namespace.UndefinedTermError, fn -> RDF.uri(:foo) end
|
assert_raise RDF.Namespace.UndefinedTermError, fn -> RDF.uri(:foo) end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "resolving an non-RDF.Namespace module" do
|
||||||
|
assert_raise RDF.Namespace.UndefinedTermError, fn -> RDF.uri(ExUnit.Test) end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
describe "term resolution in a strict vocab namespace" do
|
describe "term resolution in a strict vocab namespace" do
|
||||||
alias TestNS.{ExampleFromGraph, ExampleFromNTriplesFile, StrictExampleFromTerms}
|
alias TestNS.{ExampleFromGraph, ExampleFromNTriplesFile, StrictExampleFromTerms}
|
||||||
|
|
Loading…
Reference in a new issue