Skip to content

Commit

Permalink
Added millisecond parsing from float to datetime" (#1653)
Browse files Browse the repository at this point in the history
* Added millisecond parsing from float to datetime
  • Loading branch information
RyanRConaway authored Apr 12, 2023
1 parent ef5a5ab commit 6d98d26
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 9 deletions.
2 changes: 1 addition & 1 deletion apps/alchemist/mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Alchemist.MixProject do
def project do
[
app: :alchemist,
version: "0.2.28",
version: "0.2.29",
elixir: "~> 1.10",
build_path: "../../_build",
config_path: "../../config/config.exs",
Expand Down
26 changes: 20 additions & 6 deletions apps/transformers/lib/transformations/date_time.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ defmodule Transformers.DateTime do
validate(parameters),
{:ok, payload_source_value} <- FieldFetcher.fetch_value(payload, source_field),
{:ok, source_datetime} <-
string_to_datetime(payload_source_value, source_format, source_field),
string_to_datetime("#{payload_source_value}", source_format, source_field),
{:ok, transformed_datetime} <- format_datetime(source_datetime, target_format) do
{:ok, payload |> Map.put(target_field, transformed_datetime)}
else
Expand Down Expand Up @@ -66,15 +66,29 @@ defmodule Transformers.DateTime do

defp parse_format(string, format) do
if format == "{s-epoch}" do
normalized_value = "#{string}"

try do
seconds =
if String.contains?(string, "."),
do: trunc(String.to_float(string)),
else: String.to_integer(string)
if String.contains?(normalized_value, ".") do
trunc(String.to_float(normalized_value))
else
case Float.parse(normalized_value) do
{value, _} ->
trunc(value)

:error ->
raise "Could not parse given value: #{normalized_value} into a float"
end
end

{:ok, Timex.from_unix(seconds)}
if String.length("#{seconds}") < 13 do
{:ok, Timex.from_unix(seconds)}
else
{:ok, Timex.from_unix(seconds, :milliseconds)}
end
rescue
err -> {:error, err.message}
err -> {:error, inspect(err)}
end
else
Timex.parse(string, format)
Expand Down
2 changes: 1 addition & 1 deletion apps/transformers/mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Transformers.MixProject do
def project do
[
app: :transformers,
version: "1.0.23",
version: "1.0.24",
build_path: "../../_build",
config_path: "../../config/config.exs",
deps_path: "../../deps",
Expand Down
34 changes: 33 additions & 1 deletion apps/transformers/test/unit/transformations/date_time_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,38 @@ defmodule Transformers.DateTimeTest do
assert actual_transformed_field == "2023-04-11"
end

test "parses seconds since epoch when source is a float" do
params = %{
"sourceField" => "date1",
"targetField" => "date2",
"sourceFormat" => "{s-epoch}",
"targetFormat" => "{ISOdate}"
}

message_payload = %{"date1" => 1_681_232_228}

{:ok, transformed_payload} = Transformers.DateTime.transform(message_payload, params)

{:ok, actual_transformed_field} = Map.fetch(transformed_payload, params["targetField"])
assert actual_transformed_field == "2023-04-11"
end

test "parses milliseconds since epoch when source is a float" do
params = %{
"sourceField" => "date1",
"targetField" => "date2",
"sourceFormat" => "{s-epoch}",
"targetFormat" => "{ISOdate}"
}

message_payload = %{"date1" => 1_681_297_363_534}

{:ok, transformed_payload} = Transformers.DateTime.transform(message_payload, params)

{:ok, actual_transformed_field} = Map.fetch(transformed_payload, params["targetField"])
assert actual_transformed_field == "2023-04-12"
end

test "parses epoch time and truncates decimal values" do
params = %{
"sourceField" => "date1",
Expand Down Expand Up @@ -185,7 +217,7 @@ defmodule Transformers.DateTimeTest do
{:error, reason} = Transformers.DateTime.transform(message_payload, params)

assert reason ==
"Unable to parse datetime from \"date1\" in format \"{s-epoch}\": argument error"
"Unable to parse datetime from \"date1\" in format \"{s-epoch}\": %RuntimeError{message: \"Could not parse given value: epoch into a float\"}"
end

test "performs transform as normal when condition evaluates to true" do
Expand Down

0 comments on commit 6d98d26

Please sign in to comment.