From 97d39ec8db06a29ffc59d9d23816a54049e69eeb Mon Sep 17 00:00:00 2001 From: Ben Kearns Date: Thu, 24 Jan 2013 11:58:04 -0800 Subject: [PATCH] Added support for ISO8601 Zulu and TZ time zone support. Remove hard coded version string in rebar.config.script for unit test pass. Remove dializer and edoc from default target to enable tests to run on Travis-ci Signed-off-by: Jordan Wilberding --- Makefile | 45 ++++++++++++++++++++++++++++++++------------- rebar.config.script | 6 +++--- src/ec_date.erl | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 538bc3e..51727d2 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ # BSD License see COPYING ERL = $(shell which erl) +ERL_VER = $(shell erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell) ERLFLAGS= -pa $(CURDIR)/.eunit -pa $(CURDIR)/ebin -pa $(CURDIR)/*/ebin @@ -14,10 +15,9 @@ endif ERLWARE_COMMONS_PLT=$(CURDIR)/.erlware_commons_plt -.PHONY: all compile doc clean test dialyzer typer shell distclean pdf get-deps \ - rebuild +.PHONY: all compile doc clean test shell distclean pdf get-deps rebuild #dialyzer typer #fail on Travis. -all: compile dialyzer doc test +all: compile doc test #dialyzer #fail on travis get-deps: $(REBAR) get-deps @@ -27,22 +27,41 @@ compile: $(REBAR) skip_deps=true compile doc: compile - $(REBAR) skip_deps=true doc + - $(REBAR) skip_deps=true doc test: compile $(REBAR) skip_deps=true eunit -$(ERLWARE_COMMONS_PLT): - @echo Building local plt at $(ERLWARE_COMMONS_PLT) +$(ERLWARE_COMMONS_PLT).$(ERL_VER).erts: + @echo Building local plt at $(ERLWARE_COMMONS_PLT).$(ERL_VER).base @echo - - dialyzer --fullpath --output_plt $(ERLWARE_COMMONS_PLT) --build_plt \ - --apps erts kernel stdlib eunit -r deps -dialyzer: $(ERLWARE_COMMONS_PLT) - dialyzer --fullpath --plt $(ERLWARE_COMMONS_PLT) -Wrace_conditions -r ./ebin + - dialyzer --fullpath --verbose --output_plt $(ERLWARE_COMMONS_PLT).$(ERL_VER).base --build_plt \ + --apps erts -typer: - typer --plt $(ERLWARE_COMMONS_PLT) -r ./src +$(ERLWARE_COMMONS_PLT).$(ERL_VER).kernel:$(ERLWARE_COMMONS_PLT).$(ERL_VER).erts + @echo Building local plt at $(ERLWARE_COMMONS_PLT).$(ERL_VER).base + @echo + - dialyzer --fullpath --verbose --output_plt $(ERLWARE_COMMONS_PLT).$(ERL_VER).base --build_plt \ + --apps kernel + +$(ERLWARE_COMMONS_PLT).$(ERL_VER).base:$(ERLWARE_COMMONS_PLT).$(ERL_VER).kernel + @echo Building local plt at $(ERLWARE_COMMONS_PLT).$(ERL_VER).base + @echo + - dialyzer --fullpath --verbose --output_plt $(ERLWARE_COMMONS_PLT).$(ERL_VER).base --build_plt \ + --apps stdlib + +$(ERLWARE_COMMONS_PLT).$(ERL_VER): $(ERLWARE_COMMONS_PLT).$(ERL_VER).base + @echo Building local plt at $(ERLWARE_COMMONS_PLT).$(ERL_VER) + @echo + - dialyzer --fullpath --verbose --output_plt $(ERLWARE_COMMONS_PLT).$(ERL_VER) --add_to_plt --plt $(ERLWARE_COMMONS_PLT).$(ERL_VER).base \ + --apps eunit -r deps + +dialyzer: $(ERLWARE_COMMONS_PLT).$(ERL_VER) + dialyzer --fullpath --plt $(ERLWARE_COMMONS_PLT).$(ERL_VER) -Wrace_conditions -r ./ebin + +typer: $(ERLWARE_COMMONS_PLT).$(ERL)VER( + typer --plt $(ERLWARE_COMMONS_PLT).$(ERL_VER) -r ./src shell: compile # You often want *rebuilt* rebar tests to be available to the @@ -61,7 +80,7 @@ clean: - rm $(CURDIR)/doc/edoc-info distclean: clean - rm -rf $(ERLWARE_COMMONS_PLT) + rm -rf $(ERLWARE_COMMONS_PLT).$(ERL_VER) rm -rvf $(CURDIR)/deps/* rebuild: distclean get-deps all diff --git a/rebar.config.script b/rebar.config.script index 1d5996c..c19a751 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -1,4 +1,4 @@ -{match, [ErtsNumber]} = re:run("R15B02", "R(\\d+).+", [{capture, [1], list}]), +{match, [ErtsNumber]} = re:run(erlang:system_info(otp_release), "R(\\d+).+", [{capture, [1], list}]), ErtsVsn = erlang:list_to_integer(ErtsNumber), Opts1 = case lists:keysearch(erl_opts, 1, CONFIG) of {value, {erl_opts, Opts0}} -> @@ -8,8 +8,8 @@ Opts1 = case lists:keysearch(erl_opts, 1, CONFIG) of end, Opts2 = if ErtsVsn >= 15 -> - [{d, have_callback_support} | Opts1]; - true -> + [{d, have_callback_support} | Opts1]; + true -> Opts1 end, lists:keystore(erl_opts, 1, CONFIG, {erl_opts, Opts2}). diff --git a/src/ec_date.erl b/src/ec_date.erl index 240e14b..b32de88 100644 --- a/src/ec_date.erl +++ b/src/ec_date.erl @@ -122,6 +122,20 @@ nparse(Date) -> %% LOCAL FUNCTIONS %% +parse([Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $Z ], _Now, _Opts) + when (?is_us_sep(X) orelse ?is_world_sep(X)) + andalso Year > 31 -> + {{Year, Month, Day}, {hour(Hour, []), Min, Sec}, { 0}}; + +parse([Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $+, Off | _Rest ], _Now, _Opts) + when (?is_us_sep(X) orelse ?is_world_sep(X)) + andalso Year > 31 -> + {{Year, Month, Day}, {hour(Hour, []) - Off, Min, Sec}, {0}}; + +parse([Year, X, Month, X, Day, Hour, $:, Min, $:, Sec, $-, Off | _Rest ], _Now, _Opts) + when (?is_us_sep(X) orelse ?is_world_sep(X)) + andalso Year > 31 -> + {{Year, Month, Day}, {hour(Hour, []) + Off, Min, Sec}, {0}}; %% Date/Times 22 Aug 2008 6:35.0001 PM parse([Year,X,Month,X,Day,Hour,$:,Min,$:,Sec,$., Ms | PAM], _Now, _Opts) @@ -317,7 +331,9 @@ tokenise("ND"++Rest, Acc) -> tokenise(Rest, Acc); tokenise("ST"++Rest, Acc) -> tokenise(Rest, Acc); tokenise("OF"++Rest, Acc) -> tokenise(Rest, Acc); tokenise("T"++Rest, Acc) -> tokenise(Rest, Acc); % 2012-12-12T12:12:12 ISO formatting. -tokenise([$. | Rest], Acc) -> tokenise(Rest, [$. | Acc]); % 2012-12-12T12:12:12.xxxx ISO formatting. +tokenise([$Z | Rest], Acc) -> tokenise(Rest, [$Z | Acc]); % 2012-12-12T12:12:12Zulu +tokenise([$. | Rest], Acc) -> tokenise(Rest, [$. | Acc]); % 2012-12-12T12:12:12.xxxx ISO formatting. +tokenise([$+| Rest], Acc) -> tokenise(Rest, [$+ | Acc]); % 2012-12-12T12:12:12.xxxx+ ISO formatting. tokenise([Else | Rest], Acc) -> tokenise(Rest, [{bad_token, Else} | Acc]). @@ -778,3 +794,19 @@ ms_test_() -> "2001-03-10T15:16:17.123456"), ?_assertEqual(Now, nparse(format("Y-m-d\\TH:i:s.f", Now))) ]. + +zulu_test_() -> + [ + ?_assertEqual(format("Y-m-d\\TH:i:sZ",nparse("2001-03-10T15:16:17.123456")), + "2001-03-10T15:16:17Z"), + ?_assertEqual(format("Y-m-d\\TH:i:s",nparse("2001-03-10T15:16:17Z")), + "2001-03-10T15:16:17"), + ?_assertEqual(format("Y-m-d\\TH:i:s",nparse("2001-03-10T15:16:17+04")), + "2001-03-10T11:16:17"), + ?_assertEqual(format("Y-m-d\\TH:i:s",nparse("2001-03-10T15:16:17+04:00")), + "2001-03-10T11:16:17"), + ?_assertEqual(format("Y-m-d\\TH:i:s",nparse("2001-03-10T15:16:17-04")), + "2001-03-10T19:16:17"), + ?_assertEqual(format("Y-m-d\\TH:i:s",nparse("2001-03-10T15:16:17-04:00")), + "2001-03-10T19:16:17") + ].