Adapt to new RDF.ex literal datatype system
This commit is contained in:
parent
67264807e0
commit
33946bae8f
5
.iex.exs
5
.iex.exs
|
@ -1,6 +1,7 @@
|
||||||
import RDF.Sigils
|
import RDF.Sigils
|
||||||
|
|
||||||
alias RDF.NS.{XSD, RDFS, OWL, SKOS}
|
alias RDF.NS
|
||||||
|
alias RDF.NS.{RDFS, OWL, SKOS}
|
||||||
|
|
||||||
alias RDF.{
|
alias RDF.{
|
||||||
Term,
|
Term,
|
||||||
|
@ -15,6 +16,8 @@ alias RDF.{
|
||||||
Description,
|
Description,
|
||||||
Graph,
|
Graph,
|
||||||
Dataset,
|
Dataset,
|
||||||
|
|
||||||
|
XSD
|
||||||
}
|
}
|
||||||
|
|
||||||
alias RDF.BlankNode, as: BNode
|
alias RDF.BlankNode, as: BNode
|
||||||
|
|
|
@ -6,8 +6,7 @@ defmodule JSON.LD.Decoder do
|
||||||
|
|
||||||
import JSON.LD.{NodeIdentifierMap, Utils}
|
import JSON.LD.{NodeIdentifierMap, Utils}
|
||||||
alias JSON.LD.NodeIdentifierMap
|
alias JSON.LD.NodeIdentifierMap
|
||||||
alias RDF.{Dataset, Graph}
|
alias RDF.{Dataset, Graph, NS}
|
||||||
alias RDF.NS.{XSD}
|
|
||||||
|
|
||||||
|
|
||||||
@impl RDF.Serialization.Decoder
|
@impl RDF.Serialization.Decoder
|
||||||
|
@ -117,30 +116,34 @@ defmodule JSON.LD.Decoder do
|
||||||
{value, datatype} =
|
{value, datatype} =
|
||||||
cond do
|
cond do
|
||||||
is_boolean(value) ->
|
is_boolean(value) ->
|
||||||
value = value |> RDF.Boolean.new |> RDF.Literal.canonical |> RDF.Literal.lexical
|
value = value |> RDF.XSD.Boolean.new() |> RDF.XSD.Boolean.canonical() |> RDF.XSD.Boolean.lexical()
|
||||||
datatype = if is_nil(datatype), do: XSD.boolean, else: datatype
|
datatype = if is_nil(datatype), do: NS.XSD.boolean, else: datatype
|
||||||
{value, datatype}
|
{value, datatype}
|
||||||
is_float(value) or (is_number(value) and datatype == to_string(XSD.double)) ->
|
is_float(value) or (is_number(value) and datatype == to_string(NS.XSD.double)) ->
|
||||||
value = value |> RDF.Double.new |> RDF.Literal.canonical |> RDF.Literal.lexical
|
value = value |> RDF.XSD.Double.new() |> RDF.XSD.Double.canonical() |> RDF.XSD.Double.lexical()
|
||||||
datatype = if is_nil(datatype), do: XSD.double, else: datatype
|
datatype = if is_nil(datatype), do: NS.XSD.double, else: datatype
|
||||||
{value, datatype}
|
{value, datatype}
|
||||||
is_integer(value) or (is_number(value) and datatype == to_string(XSD.integer)) ->
|
is_integer(value) or (is_number(value) and datatype == to_string(NS.XSD.integer)) ->
|
||||||
value = value |> RDF.Integer.new |> RDF.Literal.canonical |> RDF.Literal.lexical
|
value = value |> RDF.XSD.Integer.new() |> RDF.XSD.Integer.canonical() |> RDF.XSD.Integer.lexical()
|
||||||
datatype = if is_nil(datatype), do: XSD.integer, else: datatype
|
datatype = if is_nil(datatype), do: NS.XSD.integer, else: datatype
|
||||||
{value, datatype}
|
{value, datatype}
|
||||||
is_nil(datatype) ->
|
is_nil(datatype) ->
|
||||||
datatype =
|
datatype =
|
||||||
if Map.has_key?(item, "@language") do
|
if Map.has_key?(item, "@language") do
|
||||||
RDF.langString
|
RDF.langString
|
||||||
else
|
else
|
||||||
XSD.string
|
NS.XSD.string
|
||||||
end
|
end
|
||||||
{value, datatype}
|
{value, datatype}
|
||||||
true ->
|
true ->
|
||||||
{value, datatype}
|
{value, datatype}
|
||||||
end
|
end
|
||||||
RDF.Literal.new(value,
|
|
||||||
%{datatype: datatype, language: item["@language"], canonicalize: true})
|
if language = item["@language"] do
|
||||||
|
RDF.Literal.new(value, language: language, canonicalize: true)
|
||||||
|
else
|
||||||
|
RDF.Literal.new(value, datatype: datatype, canonicalize: true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp list_to_rdf(list, node_id_map) do
|
defp list_to_rdf(list, node_id_map) do
|
||||||
|
|
|
@ -4,8 +4,7 @@ defmodule JSON.LD.Encoder do
|
||||||
|
|
||||||
use RDF.Serialization.Encoder
|
use RDF.Serialization.Encoder
|
||||||
|
|
||||||
alias RDF.{IRI, BlankNode, Literal}
|
alias RDF.{IRI, BlankNode, Literal, XSD, NS}
|
||||||
alias RDF.NS.{XSD}
|
|
||||||
|
|
||||||
@rdf_type to_string(RDF.NS.RDF.type)
|
@rdf_type to_string(RDF.NS.RDF.type)
|
||||||
@rdf_nil to_string(RDF.NS.RDF.nil)
|
@rdf_nil to_string(RDF.NS.RDF.nil)
|
||||||
|
@ -279,38 +278,39 @@ defmodule JSON.LD.Encoder do
|
||||||
%{"@id" => to_string(bnode)}
|
%{"@id" => to_string(bnode)}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp rdf_to_object(%Literal{value: value, datatype: datatype} = literal, use_native_types) do
|
defp rdf_to_object(%Literal{literal: %datatype{}} = literal, use_native_types) do
|
||||||
result = %{}
|
result = %{}
|
||||||
|
value = Literal.value(literal)
|
||||||
converted_value = literal
|
converted_value = literal
|
||||||
type = nil
|
type = nil
|
||||||
{converted_value, type, result} =
|
{converted_value, type, result} =
|
||||||
if use_native_types do
|
if use_native_types do
|
||||||
cond do
|
cond do
|
||||||
datatype == XSD.string ->
|
datatype == XSD.String ->
|
||||||
{value, type, result}
|
{value, type, result}
|
||||||
datatype == XSD.boolean ->
|
datatype == XSD.Boolean ->
|
||||||
if RDF.Boolean.valid?(literal) do
|
if RDF.XSD.Boolean.valid?(literal) do
|
||||||
{value, type, result}
|
{value, type, result}
|
||||||
else
|
else
|
||||||
{converted_value, XSD.boolean, result}
|
{converted_value, NS.XSD.boolean, result}
|
||||||
end
|
end
|
||||||
datatype in [XSD.integer, XSD.double] ->
|
datatype in [XSD.Integer, XSD.Double] ->
|
||||||
if RDF.Literal.valid?(literal) do
|
if Literal.valid?(literal) do
|
||||||
{value, type, result}
|
{value, type, result}
|
||||||
else
|
else
|
||||||
{converted_value, type, result}
|
{converted_value, type, result}
|
||||||
end
|
end
|
||||||
true ->
|
true ->
|
||||||
{converted_value, datatype, result}
|
{converted_value, Literal.datatype(literal), result}
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
cond do
|
cond do
|
||||||
datatype == RDF.langString ->
|
datatype == RDF.LangString ->
|
||||||
{converted_value, type, Map.put(result, "@language", literal.language)}
|
{converted_value, type, Map.put(result, "@language", Literal.language(literal))}
|
||||||
datatype == XSD.string ->
|
datatype == XSD.String ->
|
||||||
{converted_value, type, result}
|
{converted_value, type, result}
|
||||||
true ->
|
true ->
|
||||||
{converted_value, datatype, result}
|
{Literal.lexical(literal), Literal.datatype(literal), result}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -327,5 +327,4 @@ defmodule JSON.LD.Encoder do
|
||||||
defp encode_json!(value, opts) do
|
defp encode_json!(value, opts) do
|
||||||
Jason.encode!(value, opts)
|
Jason.encode!(value, opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,6 @@ defmodule JSON.LD.EncoderTest do
|
||||||
|
|
||||||
alias RDF.{Dataset, Graph, Description}
|
alias RDF.{Dataset, Graph, Description}
|
||||||
alias RDF.NS
|
alias RDF.NS
|
||||||
alias RDF.NS.{XSD, RDFS}
|
|
||||||
|
|
||||||
import RDF.Sigils
|
import RDF.Sigils
|
||||||
|
|
||||||
|
@ -167,14 +166,14 @@ defmodule JSON.LD.EncoderTest do
|
||||||
integer: 1,
|
integer: 1,
|
||||||
unsignedInt: 1,
|
unsignedInt: 1,
|
||||||
nonNegativeInteger: 1,
|
nonNegativeInteger: 1,
|
||||||
float: 1,
|
float: 1.0,
|
||||||
nonPositiveInteger: -1,
|
nonPositiveInteger: -1,
|
||||||
negativeInteger: -1,
|
negativeInteger: -1,
|
||||||
}
|
}
|
||||||
|> Enum.each(fn ({type, _} = data) ->
|
|> Enum.each(fn ({type, _} = data) ->
|
||||||
@tag data: data
|
@tag data: data
|
||||||
test "#{type}", %{data: {type, value}} do
|
test "#{type}", %{data: {type, value}} do
|
||||||
{EX.a, EX.b, RDF.literal(value, datatype: apply(XSD, type, []))}
|
{EX.a, EX.b, RDF.literal(value, datatype: apply(NS.XSD, type, []))}
|
||||||
|> gets_serialized_to([%{
|
|> gets_serialized_to([%{
|
||||||
"@id" => "http://example.com/a",
|
"@id" => "http://example.com/a",
|
||||||
"http://example.com/b" => [%{"@value" => "#{value}", "@type" => "http://www.w3.org/2001/XMLSchema##{type}"}]
|
"http://example.com/b" => [%{"@value" => "#{value}", "@type" => "http://www.w3.org/2001/XMLSchema##{type}"}]
|
||||||
|
@ -440,7 +439,7 @@ defmodule JSON.LD.EncoderTest do
|
||||||
describe "problems" do
|
describe "problems" do
|
||||||
%{
|
%{
|
||||||
"xsd:boolean as value" => {
|
"xsd:boolean as value" => {
|
||||||
{~I<http://data.wikia.com/terms#playable>, RDFS.range, XSD.boolean},
|
{~I<http://data.wikia.com/terms#playable>, NS.RDFS.range, NS.XSD.boolean},
|
||||||
[%{
|
[%{
|
||||||
"@id" => "http://data.wikia.com/terms#playable",
|
"@id" => "http://data.wikia.com/terms#playable",
|
||||||
"http://www.w3.org/2000/01/rdf-schema#range" => [
|
"http://www.w3.org/2000/01/rdf-schema#range" => [
|
||||||
|
|
Loading…
Reference in a new issue