Fix RDF.Time to store microseconds

This commit is contained in:
Marcel Otto 2018-09-14 23:08:36 +02:00
parent c746706a10
commit fa7e214985
4 changed files with 16 additions and 20 deletions

View file

@ -47,7 +47,7 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
### Fixed
- `RDF.DateTime`: store microseconds
- `RDF.DateTime` and `RDF.Time` store microseconds
- `RDF.DateTime`: '24:00:00' is a valid time in a xsd:dateTime; the dateTime
value so represented is the first instant of the following day
- `RDF.LangString`: non-strings or the empty string as language produce invalid

View file

@ -15,9 +15,7 @@ defmodule RDF.Time do
{convert(value, Map.delete(opts, :tz)), tz}
end
def convert(%Time{} = value, _opts) do
value |> strip_microseconds
end
def convert(%Time{} = value, _opts), do: value
def convert(value, opts) when is_binary(value) do
case Regex.run(@grammar, value) do
@ -63,12 +61,6 @@ defmodule RDF.Time do
%Time{time | hour: hour, minute: minute}
end
# microseconds are not part of the xsd:dateTime value space
defp strip_microseconds(%{microsecond: ms} = date_time) when ms != {0, 0},
do: %{date_time | microsecond: {0, 0}}
defp strip_microseconds(date_time),
do: date_time
def canonical_lexical(%Time{} = value) do
Time.to_iso8601(value)

View file

@ -13,8 +13,8 @@ defmodule RDF.DateTimeTest do
dt("2009-12-31T23:00:00-01:00") => { dt( "2010-01-01T00:00:00Z") , nil , "2010-01-01T00:00:00Z" },
dt("2009-12-31T23:00:00.00-01:00") => { dt( "2010-01-01T00:00:00.00Z") , nil , "2010-01-01T00:00:00.00Z" },
"2010-01-01T00:00:00Z" => { dt( "2010-01-01T00:00:00Z") , nil , "2010-01-01T00:00:00Z" },
"2010-01-01T00:00:00.0000Z" => { dt( "2010-01-01T00:00:00.0000Z") , nil, "2010-01-01T00:00:00.0000Z" },
"2010-01-01T00:00:00.123456Z" => { dt( "2010-01-01T00:00:00.123456Z") , nil, "2010-01-01T00:00:00.123456Z" },
"2010-01-01T00:00:00.0000Z" => { dt( "2010-01-01T00:00:00.0000Z") , nil , "2010-01-01T00:00:00.0000Z" },
"2010-01-01T00:00:00.123456Z" => { dt( "2010-01-01T00:00:00.123456Z") , nil , "2010-01-01T00:00:00.123456Z" },
"2010-01-01T00:00:00" => { dt( "2010-01-01T00:00:00") , nil , "2010-01-01T00:00:00" },
"2010-01-01T00:00:00+00:00" => { dt( "2010-01-01T00:00:00Z") , "2010-01-01T00:00:00+00:00", "2010-01-01T00:00:00Z" },
"2010-01-01T01:00:00+01:00" => { dt( "2010-01-01T00:00:00Z") , "2010-01-01T01:00:00+01:00", "2010-01-01T00:00:00Z" },

View file

@ -1,14 +1,18 @@
defmodule RDF.TimeTest do
use RDF.Datatype.Test.Case, datatype: RDF.Time, id: RDF.NS.XSD.time,
valid: %{
# input => { value , lexical , canonicalized }
~T[00:00:00] => { ~T[00:00:00] , nil , "00:00:00" },
"00:00:00" => { ~T[00:00:00] , nil , "00:00:00" },
"00:00:00Z" => { {~T[00:00:00], true } , nil , "00:00:00Z" },
"00:00:00.0000Z" => { {~T[00:00:00], true } , "00:00:00.0000Z" , "00:00:00Z" },
"00:00:00+00:00" => { {~T[00:00:00], true } , "00:00:00+00:00" , "00:00:00Z" },
"01:00:00+01:00" => { {~T[00:00:00], true } , "01:00:00+01:00" , "00:00:00Z" },
"23:00:00-01:00" => { {~T[00:00:00], true } , "23:00:00-01:00" , "00:00:00Z" },
# input => { value , lexical , canonicalized }
~T[00:00:00] => { ~T[00:00:00] , nil , "00:00:00" },
~T[00:00:00.123] => { ~T[00:00:00.123] , nil , "00:00:00.123" },
"00:00:00" => { ~T[00:00:00] , nil , "00:00:00" },
"00:00:00.123" => { ~T[00:00:00.123] , nil , "00:00:00.123" },
"00:00:00Z" => { {~T[00:00:00], true } , nil , "00:00:00Z" },
"00:00:00.1234Z" => { {~T[00:00:00.1234], true }, nil , "00:00:00.1234Z" },
"00:00:00.0000Z" => { {~T[00:00:00.0000], true }, nil , "00:00:00.0000Z" },
"00:00:00+00:00" => { {~T[00:00:00], true } , "00:00:00+00:00" , "00:00:00Z" },
"01:00:00+01:00" => { {~T[00:00:00], true } , "01:00:00+01:00" , "00:00:00Z" },
"23:00:00-01:00" => { {~T[00:00:00], true } , "23:00:00-01:00" , "00:00:00Z" },
"23:00:00.45-01:00" => { {~T[00:00:00.45], true } , "23:00:00.45-01:00" , "00:00:00.45Z" },
},
invalid: ~w(
foo