MSPF-532: Remove rfc3339 (#217)

* MSPF-532: Remove rfc3339

* Review fixes

* Fix error reporting
This commit is contained in:
Sergey Yelin 2020-05-19 21:55:01 +03:00 committed by GitHub
parent 82d8e54fa6
commit 2b05c52f60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 80 additions and 203 deletions

View File

@ -29,13 +29,11 @@ now() ->
-spec to_rfc3339(timestamp_ms()) -> binary().
to_rfc3339(Timestamp) ->
{ok, BTimestamp} = rfc3339:format(Timestamp, millisecond),
BTimestamp.
genlib_rfc3339:format_relaxed(Timestamp, millisecond).
-spec from_rfc3339(binary()) -> timestamp_ms().
from_rfc3339(BTimestamp) ->
{ok, Timestamp} = rfc3339:to_time(BTimestamp, millisecond),
Timestamp.
genlib_rfc3339:parse(BTimestamp, millisecond).
-spec add_interval(timestamp_ms(), datetime_interval()) ->
timestamp_ms().

View File

@ -390,5 +390,4 @@ account(SymCode, C) ->
end.
timestamp() ->
{ok, Now} = rfc3339:format(calendar:universal_time()),
Now.
genlib_rfc3339:format(genlib_time:daytime_to_unixtime(calendar:universal_time()), second).

View File

@ -229,13 +229,17 @@ marshal(sub_failure, Failure) ->
sub = maybe_marshal(sub_failure, ff_failure:sub_failure(Failure))
};
marshal(timestamp, {{Date, Time}, USec} = V) ->
case rfc3339:format({Date, Time, USec, 0}) of
{ok, R} when is_binary(R) ->
R;
Error ->
error({bad_timestamp, Error}, [timestamp, V])
end;
marshal(timestamp, {DateTime, USec}) ->
DateTimeinSeconds = genlib_time:daytime_to_unixtime(DateTime),
{TimeinUnit, Unit} =
case USec of
0 ->
{DateTimeinSeconds, second};
USec ->
MicroSec = erlang:convert_time_unit(DateTimeinSeconds, second, microsecond),
{MicroSec + USec, microsecond}
end,
genlib_rfc3339:format_relaxed(TimeinUnit, Unit);
marshal(timestamp_ms, V) ->
ff_time:to_rfc3339(V);
marshal(domain_revision, V) when is_integer(V) ->
@ -513,31 +517,24 @@ maybe_marshal(_Type, undefined) ->
maybe_marshal(Type, Value) ->
marshal(Type, Value).
%% Suppress dialyzer warning until rfc3339 spec will be fixed.
%% see https://github.com/talentdeficit/rfc3339/pull/5
-dialyzer([{nowarn_function, [parse_timestamp/1]}, no_match]).
-spec parse_timestamp(binary()) ->
machinery:timestamp().
parse_timestamp(Bin) ->
case rfc3339:parse(Bin) of
{ok, {_Date, _Time, _Usec, TZ}} when TZ =/= 0 andalso TZ =/= undefined ->
erlang:error({bad_deadline, not_utc}, [Bin]);
{ok, {Date, Time, undefined, _TZ}} ->
{to_calendar_datetime(Date, Time), 0};
{ok, {Date, Time, Usec, _TZ}} ->
{to_calendar_datetime(Date, Time), Usec div 1000};
{error, Error} ->
erlang:error({bad_timestamp, Error}, [Bin])
try
MicroSeconds = genlib_rfc3339:parse(Bin, microsecond),
case genlib_rfc3339:is_utc(Bin) of
false ->
erlang:error({bad_timestamp, not_utc}, [Bin]);
true ->
USec = MicroSeconds rem 1000000,
DateTime = calendar:system_time_to_universal_time(MicroSeconds, microsecond),
{DateTime, USec}
end
catch
error:Error:St ->
erlang:raise(error, {bad_timestamp, Bin, Error}, St)
end.
to_calendar_datetime(Date, Time = {H, _, S}) when H =:= 24 orelse S =:= 60 ->
%% Type specifications for hours and seconds differ in calendar and rfc3339,
%% so make a proper calendar:datetime() here.
Sec = calendar:datetime_to_gregorian_seconds({Date, Time}),
calendar:gregorian_seconds_to_datetime(Sec);
to_calendar_datetime(Date, Time) ->
{Date, Time}.
marshal_msgpack(nil) -> {nl, #msgp_Nil{}};
marshal_msgpack(V) when is_boolean(V) -> {b, V};
marshal_msgpack(V) when is_integer(V) -> {i, V};

View File

@ -182,7 +182,7 @@ deposit_symmetry_test() ->
id = genlib:unique(),
domain_revision = 24500062,
party_revision = 140028,
created_at = <<"2025-01-01T00:00:00.001000Z">>
created_at = <<"2025-01-01T00:00:00.001Z">>
},
?assertEqual(Encoded, marshal(deposit, unmarshal(deposit, Encoded))).

View File

@ -138,7 +138,7 @@ w2w_transfer_symmetry_test() ->
id = genlib:unique(),
domain_revision = 24500062,
party_revision = 140028,
created_at = <<"2025-01-01T00:00:00.001000Z">>
created_at = <<"2025-01-01T00:00:00.001Z">>
},
?assertEqual(Encoded, marshal(w2w_transfer, unmarshal(w2w_transfer, Encoded))).

View File

@ -265,7 +265,7 @@ withdrawal_symmetry_test() ->
},
domain_revision = 1,
party_revision = 3,
created_at = <<"2099-01-01T00:00:00.123000Z">>
created_at = <<"2099-01-01T00:00:00.123Z">>
},
?assertEqual(In, marshal_withdrawal(unmarshal_withdrawal(In))).

View File

@ -75,13 +75,19 @@ unmarshal(namespace, V) ->
unmarshal(event_id, V) ->
unmarshal(integer, V);
unmarshal(timestamp, V) when is_binary(V) ->
case rfc3339:parse(V) of
{ok, {Date, Time, USec, TZOffset}} when TZOffset == undefined orelse TZOffset == 0 ->
{{Date, Time}, USec};
{ok, _} ->
error(badarg, {timestamp, V, badoffset});
{error, Reason} ->
error(badarg, {timestamp, V, Reason})
try
MilliSec = genlib_rfc3339:parse(V, millisecond),
case genlib_rfc3339:is_utc(V) of
false ->
erlang:error(badarg, [timestamp, V, badoffset]);
true ->
USec = MilliSec rem 1000,
DateTime = calendar:system_time_to_universal_time(MilliSec, millisecond),
{DateTime, USec}
end
catch
error:Reason:St ->
erlang:raise(error, {timestamp, V, Reason}, St)
end;
unmarshal(
{evsink_event, Schema},

View File

@ -1,126 +0,0 @@
%% Common project erlang options.
{erl_opts, [
%% % mandatory
%% debug_info,
%% warnings_as_errors,
%% warn_export_all,
%% warn_missing_spec,
%% warn_untyped_record,
%% warn_export_vars,
%% % by default
%% warn_unused_record,
%% warn_bif_clash,
%% warn_obsolete_guard,
%% warn_unused_vars,
%% warn_shadow_vars,
%% warn_unused_import,
%% warn_unused_function,
%% warn_deprecated_function,
%% % at will
%% % bin_opt_info
%% % no_auto_import
%% % warn_missing_spec_all
]}.
%% Common project dependencies.
{deps, [
{cowboy, "2.7.0"},
%% {rfc3339, "0.2.2"},
{jose, "1.9.0"},
%% {lager, "3.6.1"},
{base64url, "0.0.1"},
{jsx, "2.9.0"},
%% {genlib,
%% {git, "https://github.com/rbkmoney/genlib.git", {branch, "master"}}
%% },
%% {woody,
%% {git, "git@github.com:rbkmoney/woody_erlang.git", {branch, "master"}}
%% },
%% {woody_user_identity,
%% {git, "git@github.com:rbkmoney/woody_erlang_user_identity.git", {branch, "master"}}
%% },
%% {dmsl,
%% {git, "git@github.com:rbkmoney/damsel.git", {branch, "release/erlang/master"}}
%% },
{cowboy_cors,
{git, "https://github.com/rbkmoney/cowboy_cors.git", {branch, master}}
},
{cowboy_access_log,
{git, "git@github.com:rbkmoney/cowboy_access_log.git", {branch, "master"}}
},
{payproc_errors,
{git, "git@github.com:rbkmoney/payproc-errors-erlang.git", {branch, "master"}}
},
{erl_health,
{git, "https://github.com/rbkmoney/erlang-health.git", {branch, "master"}}
}
]}.
%% XRef checks
%% {xref_checks, [
%% undefined_function_calls,
%% undefined_functions,
%% deprecated_functions_calls,
%% deprecated_functions
%% ]}.
% at will
% {xref_warnings, true}.
%% Tests
%% {cover_enabled, true}.
%% Relx configuration
%% {relx, [
%% {release, { capi , "0.1.0"}, [
%% {recon , load }, % tools for introspection
%% {runtime_tools, load }, % debugger
%% {tools , load }, % profiler
%% capi,
%% sasl
%% ]},
%% {sys_config, "./config/sys.config"},
%% {vm_args, "./config/vm.args"},
%% {dev_mode, true},
%% {include_erts, false},
%% {extended_start_script, true}
%% ]}.
%% Dialyzer static analyzing
%% {dialyzer, [
%% {warnings, [
%% % mandatory
%% unmatched_returns,
%% error_handling,
%% race_conditions,
%% unknown
%% ]},
%% {plt_apps, all_deps}
%% ]}.
%% {profiles, [
%% {prod, [
%% {deps, [
%% % for introspection on production
%% {recon, "2.3.2"}
%% ]},
%% {relx, [
%% {dev_mode, false},
%% {include_erts, true},
%% {overlay, [
%% {mkdir , "var/keys/capi" },
%% {copy , "var/keys/capi/private.pem" , "var/keys/capi/private.pem" }
%% ]}
%% ]}
%% ]},
%% {test, [
%% {cover_enabled, true},
%% {deps, []}
%% ]}
%% ]}.
%% {pre_hooks, [
%% {thrift, "git submodule update --init"}
%% ]}.

View File

@ -24,7 +24,6 @@
jsx,
cowboy_cors,
cowboy_access_log,
rfc3339,
base64url,
snowflake,
woody_user_identity,

View File

@ -102,20 +102,8 @@ mask(leading, MaskLen, MaskChar, Chardata) ->
-spec to_universal_time(Timestamp :: binary()) -> TimestampUTC :: binary().
to_universal_time(Timestamp) ->
{ok, {Date, Time, Usec, TZOffset}} = rfc3339:parse(Timestamp),
Seconds = calendar:datetime_to_gregorian_seconds({Date, Time}),
%% The following crappy code is a dialyzer workaround
%% for the wrong rfc3339:parse/1 spec.
{DateUTC, TimeUTC} = calendar:gregorian_seconds_to_datetime(
case TZOffset of
_ when is_integer(TZOffset) ->
Seconds - (60 * TZOffset);
_ ->
Seconds
end
),
{ok, TimestampUTC} = rfc3339:format({DateUTC, TimeUTC, Usec, 0}),
TimestampUTC.
TimestampMS = genlib_rfc3339:parse(Timestamp, microsecond),
genlib_rfc3339:format_relaxed(TimestampMS, microsecond).
-spec unwrap(ok | {ok, Value} | {error, _Error}) ->
Value | no_return().
@ -206,7 +194,7 @@ try_parse_woody_default(DeadlineStr) ->
catch
error:{bad_deadline, _Reason} ->
{error, bad_deadline};
error:{badmatch, {error, baddate}} ->
error:{badmatch, _} ->
{error, bad_deadline};
error:deadline_reached ->
{error, bad_deadline}
@ -260,10 +248,10 @@ get_unique_id() ->
-spec to_universal_time_test() -> _.
to_universal_time_test() ->
?assertEqual(<<"2017-04-19T13:56:07Z">>, to_universal_time(<<"2017-04-19T13:56:07Z">>)),
?assertEqual(<<"2017-04-19T13:56:07.530000Z">>, to_universal_time(<<"2017-04-19T13:56:07.53Z">>)),
?assertEqual(<<"2017-04-19T10:36:07.530000Z">>, to_universal_time(<<"2017-04-19T13:56:07.53+03:20">>)),
?assertEqual(<<"2017-04-19T17:16:07.530000Z">>, to_universal_time(<<"2017-04-19T13:56:07.53-03:20">>)).
?assertEqual(<<"2017-04-19T13:56:07Z">>, to_universal_time(<<"2017-04-19T13:56:07Z">>)),
?assertEqual(<<"2017-04-19T13:56:07.530Z">>, to_universal_time(<<"2017-04-19T13:56:07.53Z">>)),
?assertEqual(<<"2017-04-19T10:36:07.530Z">>, to_universal_time(<<"2017-04-19T13:56:07.53+03:20">>)),
?assertEqual(<<"2017-04-19T17:16:07.530Z">>, to_universal_time(<<"2017-04-19T13:56:07.53-03:20">>)).
-spec redact_test() -> _.
redact_test() ->

View File

@ -1982,9 +1982,9 @@ to_swag(withdrawal_event, {EventId, Ts, {status_changed, Status}}) ->
)]
});
to_swag(timestamp, {{Date, Time}, Usec}) ->
{ok, Timestamp} = rfc3339:format({Date, Time, Usec, undefined}),
Timestamp;
to_swag(timestamp, {DateTime, USec}) ->
DateTimeSeconds = genlib_time:daytime_to_unixtime(DateTime),
genlib_rfc3339:format_relaxed(DateTimeSeconds + USec, microsecond);
to_swag(timestamp_ms, Timestamp) ->
ff_time:to_rfc3339(Timestamp);
to_swag(currency, Currency) ->

View File

@ -723,4 +723,4 @@ get_expiration_deadline(Expiration) ->
get_default_url_lifetime() ->
Now = erlang:system_time(second),
Lifetime = application:get_env(wapi, file_storage_url_lifetime, ?DEFAULT_URL_LIFETIME),
wapi_utils:unwrap(rfc3339:format(Now + Lifetime, second)).
genlib_rfc3339:format(Now + Lifetime, second).

View File

@ -31,9 +31,6 @@
{genlib,
{git, "https://github.com/rbkmoney/genlib.git", {branch, "master"}}
},
{rfc3339,
"0.2.2"
},
{uuid,
{git, "https://github.com/okeuday/uuid.git", {branch, "master"}}
},
@ -58,9 +55,18 @@
{hackney,
"1.15.1"
},
% {erlang_localtime,
% {git, "https://github.com/kpy3/erlang_localtime", {branch, "master"}}
% },
{cowboy,
"2.7.0"
},
{jose,
"1.9.0"
},
{base64url,
"0.0.1"
},
{jsx,
"2.9.0"
},
{cds_proto,
{git, "git@github.com:rbkmoney/cds-proto.git", {branch, "master"}}
},
@ -102,6 +108,18 @@
},
{lechiffre,
{git, "git@github.com:rbkmoney/lechiffre.git", {branch, "master"}}
},
{cowboy_cors,
{git, "https://github.com/rbkmoney/cowboy_cors.git", {branch, master}}
},
{cowboy_access_log,
{git, "git@github.com:rbkmoney/cowboy_access_log.git", {branch, "master"}}
},
{payproc_errors,
{git, "git@github.com:rbkmoney/payproc-errors-erlang.git", {branch, "master"}}
},
{erl_health,
{git, "https://github.com/rbkmoney/erlang-health.git", {branch, "master"}}
}
]}.

View File

@ -75,7 +75,7 @@
2},
{<<"genlib">>,
{git,"https://github.com/rbkmoney/genlib.git",
{ref,"6601a9f1cfd4bce566f0bd0016fdee5a26c8818c"}},
{ref,"54920e768a71f121304a5eda547ee60295398f3c"}},
0},
{<<"gproc">>,{pkg,<<"gproc">>,<<"0.8.0">>},0},
{<<"gun">>,
@ -98,7 +98,7 @@
{<<"idna">>,{pkg,<<"idna">>,<<"6.0.0">>},1},
{<<"jesse">>,
{git,"https://github.com/rbkmoney/jesse.git",
{ref,"723e835708a022bbce9e57807ecf220b00fb771a"}},
{ref,"a21da0609e446f328c01b1a72191cda26a8969a4"}},
0},
{<<"jiffy">>,
{git,"git@github.com:davisp/jiffy.git",
@ -142,7 +142,6 @@
0},
{<<"quickrand">>,{pkg,<<"quickrand">>,<<"1.7.3">>},1},
{<<"ranch">>,{pkg,<<"ranch">>,<<"1.7.1">>},1},
{<<"rfc3339">>,{pkg,<<"rfc3339">>,<<"0.2.2">>},0},
{<<"scoper">>,
{git,"git@github.com:rbkmoney/scoper.git",
{ref,"f2ac9c0b4e98a49a569631c3763c0585ec76abe5"}},
@ -191,7 +190,6 @@
{<<"mimerl">>, <<"67E2D3F571088D5CFD3E550C383094B47159F3EEE8FFA08E64106CDF5E981BE3">>},
{<<"quickrand">>, <<"0E4FB48FAC904FE0C6E21D7E8C31A288A0700E1E81A35B38B649FC119079755D">>},
{<<"ranch">>, <<"6B1FAB51B49196860B733A49C07604465A47BDB78AA10C1C16A3D199F7F8C881">>},
{<<"rfc3339">>, <<"1552DF616ACA368D982E9F085A0E933B6688A3F4938A671798978EC2C0C58730">>},
{<<"ssl_verify_fun">>, <<"F0EAFFF810D2041E93F915EF59899C923F4568F4585904D010387ED74988E77B">>},
{<<"unicode_util_compat">>, <<"D869E4C68901DD9531385BB0C8C40444EBF624E60B6962D95952775CAC5E90CD">>},
{<<"uuid">>, <<"C5DF97D1A3D626235C2415E74053C47B2138BB863C5CD802AB5CAECB8ECC019F">>}]}