浏览代码

Support printing iolists with ~s

pull/108/head
Andrew Thompson 12 年前
父节点
当前提交
932b482e4a
共有 3 个文件被更改,包括 20 次插入3 次删除
  1. +2
    -0
      src/lager_format.erl
  2. +10
    -0
      src/lager_trunc_io.erl
  3. +8
    -3
      test/trunc_io_eqc.erl

+ 2
- 0
src/lager_format.erl 查看文件

@ -29,6 +29,8 @@
format(FmtStr, Args, MaxLen) -> format(FmtStr, Args, MaxLen) ->
format(FmtStr, Args, MaxLen, []). format(FmtStr, Args, MaxLen, []).
format([], [], _, _) ->
"";
format(FmtStr, Args, MaxLen, Opts) when is_atom(FmtStr) -> format(FmtStr, Args, MaxLen, Opts) when is_atom(FmtStr) ->
format(atom_to_list(FmtStr), Args, MaxLen, Opts); format(atom_to_list(FmtStr), Args, MaxLen, Opts);
format(FmtStr, Args, MaxLen, Opts) when is_binary(FmtStr) -> format(FmtStr, Args, MaxLen, Opts) when is_binary(FmtStr) ->

+ 10
- 0
src/lager_trunc_io.erl 查看文件

@ -394,6 +394,11 @@ alist([H|T], Max, Options) when H =:= $\t; H =:= $\n; H =:= $\r; H =:= $\v; H =:
alist([H|T], Max, #print_options{force_strings=true} = Options) when is_integer(H) -> alist([H|T], Max, #print_options{force_strings=true} = Options) when is_integer(H) ->
{L, Len} = alist(T, Max-1, Options), {L, Len} = alist(T, Max-1, Options),
{[H|L], Len + 1}; {[H|L], Len + 1};
alist([H|T], Max, Options = #print_options{force_strings=true}) when is_binary(H) ->
{List, Len} = print(H, Max, Options),
%% no need to decrement depth, as we're in printable string mode
{Final, FLen} = alist(T, Max - Len, Options),
{[List|Final], FLen};
alist(_, _, #print_options{force_strings=true}) -> alist(_, _, #print_options{force_strings=true}) ->
erlang:error(badarg); erlang:error(badarg);
alist([H|_L], _Max, _Options) -> alist([H|_L], _Max, _Options) ->
@ -650,6 +655,11 @@ list_printing_test() ->
?assertEqual("[9|9]", lists:flatten(format("~p", [[9|9]], 50))), ?assertEqual("[9|9]", lists:flatten(format("~p", [[9|9]], 50))),
ok. ok.
iolist_printing_test() ->
?assertEqual("iolist: HelloIamaniolist",
lists:flatten(format("iolist: ~s", [[$H, $e, $l, $l, $o, "I", ["am", [<<"an">>], [$i, $o, $l, $i, $s, $t]]]], 1000))),
ok.
tuple_printing_test() -> tuple_printing_test() ->
?assertEqual("{}", lists:flatten(format("~p", [{}], 50))), ?assertEqual("{}", lists:flatten(format("~p", [{}], 50))),
?assertEqual("{}", lists:flatten(format("~w", [{}], 50))), ?assertEqual("{}", lists:flatten(format("~w", [{}], 50))),

+ 8
- 3
test/trunc_io_eqc.erl 查看文件

@ -66,7 +66,7 @@ gen_fmt_args() ->
"~~", "~~",
{"~10000000.p", gen_any(5)}, {"~10000000.p", gen_any(5)},
{"~w", gen_any(5)}, {"~w", gen_any(5)},
{"~s", oneof([gen_print_str(), gen_atom(), gen_quoted_atom(), gen_print_bin()])},
{"~s", oneof([gen_print_str(), gen_atom(), gen_quoted_atom(), gen_print_bin(), gen_iolist(5)])},
{"~1000000.P", gen_any(5), 4}, {"~1000000.P", gen_any(5), 4},
{"~W", gen_any(5), 4}, {"~W", gen_any(5), 4},
{"~i", gen_any(5)}, {"~i", gen_any(5)},
@ -91,7 +91,7 @@ gen_fmt_args() ->
%% Generates a printable string %% Generates a printable string
gen_print_str() -> gen_print_str() ->
?LET(Xs, list(char()), [X || X <- Xs, io_lib:printable_list([X]), X /= $~]).
?LET(Xs, list(char()), [X || X <- Xs, io_lib:printable_list([X]), X /= $~, X < 255]).
gen_print_bin() -> gen_print_bin() ->
?LET(Xs, gen_print_str(), list_to_binary(Xs)). ?LET(Xs, gen_print_str(), list_to_binary(Xs)).
@ -110,7 +110,12 @@ gen_any(MaxDepth) ->
gen_fun()] ++ gen_fun()] ++
[?LAZY(list(gen_any(MaxDepth - 1))) || MaxDepth /= 0] ++ [?LAZY(list(gen_any(MaxDepth - 1))) || MaxDepth /= 0] ++
[?LAZY(gen_tuple(gen_any(MaxDepth - 1))) || MaxDepth /= 0]). [?LAZY(gen_tuple(gen_any(MaxDepth - 1))) || MaxDepth /= 0]).
gen_iolist(0) ->
[];
gen_iolist(Depth) ->
list(oneof([gen_char(), gen_print_str(), gen_print_bin(), gen_iolist(Depth-1)])).
gen_atom() -> gen_atom() ->
elements([abc, def, ghi]). elements([abc, def, ghi]).

正在加载...
取消
保存