Compare commits

...
4 Commits
6 changed files with 95 additions and 30 deletions
+8
View File
@@ -116,6 +116,14 @@ Percentage | Module
77.19% | Total
```
## v1.7.1 (2018-07-26)
### 1. Bug fixes
#### Elixir
* [Calendar] Work-around a Dialyzer bug that causes it to loop for a long time, potentially indefinitely
## v1.7.0 (2018-07-25)
### 1. Enhancements
+1 -1
View File
@@ -1 +1 @@
1.7.0
1.7.1
+19 -14
View File
@@ -263,24 +263,29 @@ defmodule Date do
@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t} | {:error, atom}
def from_iso8601(string, calendar \\ Calendar.ISO)
[match_date, guard_date, read_date] = Calendar.ISO.__match_date__()
def from_iso8601(unquote(match_date), calendar) when unquote(guard_date) do
{year, month, day} = unquote(read_date)
with {:ok, date} <- new(year, month, day, Calendar.ISO) do
convert(date, calendar)
end
end
def from_iso8601(<<?-, next, rest::binary>>, calendar) when next != ?- do
with {:ok, %{year: year} = date} <- from_iso8601(<<next>> <> rest, calendar) do
def from_iso8601(<<?-, rest::binary>>, calendar) do
with {:ok, %{year: year} = date} <- raw_from_iso8601(rest, calendar) do
{:ok, %{date | year: -year}}
end
end
def from_iso8601(<<_::binary>>, _calendar) do
{:error, :invalid_format}
def from_iso8601(<<rest::binary>>, calendar) do
raw_from_iso8601(rest, calendar)
end
[match_date, guard_date, read_date] = Calendar.ISO.__match_date__()
defp raw_from_iso8601(string, calendar) do
with unquote(match_date) <- string,
true <- unquote(guard_date) do
{year, month, day} = unquote(read_date)
with {:ok, date} <- new(year, month, day, Calendar.ISO) do
convert(date, calendar)
end
else
_ -> {:error, :invalid_format}
end
end
@doc """
+20 -2
View File
@@ -511,8 +511,8 @@ defmodule DateTime do
[match_time, guard_time, read_time] = Calendar.ISO.__match_time__()
def from_iso8601(string, calendar \\ Calendar.ISO) when is_binary(string) do
with <<unquote(match_date), sep, unquote(match_time), rest::binary>>
when unquote(guard_date) and sep in @sep and unquote(guard_time) <- string,
with <<unquote(match_date), sep, unquote(match_time), rest::binary>> <- string,
true <- unquote(guard_date) and sep in @sep and unquote(guard_time),
{microsecond, rest} <- Calendar.ISO.parse_microsecond(rest),
{offset, ""} <- Calendar.ISO.parse_offset(rest) do
{year, month, day} = unquote(read_date)
@@ -525,6 +525,24 @@ defmodule DateTime do
not calendar.valid_time?(hour, minute, second, microsecond) ->
{:error, :invalid_time}
offset == 0 ->
datetime = %DateTime{
calendar: calendar,
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second,
microsecond: microsecond,
std_offset: 0,
utc_offset: 0,
zone_abbr: "UTC",
time_zone: "Etc/UTC"
}
{:ok, datetime, 0}
is_nil(offset) ->
{:error, :missing_offset}
+38 -9
View File
@@ -171,10 +171,35 @@ defmodule NaiveDateTime do
Calendar.microsecond(),
Calendar.calendar()
) :: {:ok, t} | {:error, atom}
def new(year, month, day, hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO) do
with {:ok, date} <- Date.new(year, month, day, calendar),
{:ok, time} <- Time.new(hour, minute, second, microsecond, calendar),
do: new(date, time)
def new(year, month, day, hour, minute, second, microsecond \\ {0, 0}, calendar \\ Calendar.ISO)
def new(year, month, day, hour, minute, second, microsecond, calendar)
when is_integer(microsecond) do
new(year, month, day, hour, minute, second, {microsecond, 6}, calendar)
end
def new(year, month, day, hour, minute, second, microsecond, calendar) do
cond do
not calendar.valid_date?(year, month, day) ->
{:error, :invalid_date}
not calendar.valid_time?(hour, minute, second, microsecond) ->
{:error, :invalid_time}
true ->
naive_datetime = %NaiveDateTime{
calendar: calendar,
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second,
microsecond: microsecond
}
{:ok, naive_datetime}
end
end
@doc """
@@ -470,19 +495,23 @@ defmodule NaiveDateTime do
@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t} | {:error, atom}
def from_iso8601(string, calendar \\ Calendar.ISO)
def from_iso8601(<<?-, next, rest::binary>>, calendar) when next != ?- do
with {:ok, %{year: year} = naive_datetime} <- from_iso8601(<<next>> <> rest, calendar) do
def from_iso8601(<<?-, rest::binary>>, calendar) do
with {:ok, %{year: year} = naive_datetime} <- raw_from_iso8601(rest, calendar) do
{:ok, %{naive_datetime | year: -year}}
end
end
def from_iso8601(<<rest::binary>>, calendar) do
raw_from_iso8601(rest, calendar)
end
@sep [?\s, ?T]
[match_date, guard_date, read_date] = Calendar.ISO.__match_date__()
[match_time, guard_time, read_time] = Calendar.ISO.__match_time__()
def from_iso8601(string, calendar) when is_binary(string) do
with <<unquote(match_date), sep, unquote(match_time), rest::binary>>
when unquote(guard_date) and sep in @sep and unquote(guard_time) <- string,
defp raw_from_iso8601(string, calendar) do
with <<unquote(match_date), sep, unquote(match_time), rest::binary>> <- string,
true <- unquote(guard_date) and sep in @sep and unquote(guard_time),
{microsec, rest} <- Calendar.ISO.parse_microsecond(rest),
{_offset, ""} <- Calendar.ISO.parse_offset(rest) do
{year, month, day} = unquote(read_date)
+9 -4
View File
@@ -217,14 +217,19 @@ defmodule Time do
@spec from_iso8601(String.t(), Calendar.calendar()) :: {:ok, t} | {:error, atom}
def from_iso8601(string, calendar \\ Calendar.ISO)
def from_iso8601(<<?T, h, rest::binary>>, calendar) when h in ?0..?9 do
from_iso8601(<<h, rest::binary>>, calendar)
def from_iso8601(<<?T, rest::binary>>, calendar) do
raw_from_iso8601(rest, calendar)
end
def from_iso8601(<<rest::binary>>, calendar) do
raw_from_iso8601(rest, calendar)
end
[match_time, guard_time, read_time] = Calendar.ISO.__match_time__()
def from_iso8601(string, calendar) do
with <<unquote(match_time), rest::binary>> when unquote(guard_time) <- string,
defp raw_from_iso8601(string, calendar) do
with <<unquote(match_time), rest::binary>> <- string,
true <- unquote(guard_time),
{microsec, rest} <- Calendar.ISO.parse_microsecond(rest),
{_offset, ""} <- Calendar.ISO.parse_offset(rest) do
{hour, min, sec} = unquote(read_time)