Merge branch 'develop'

This commit is contained in:
alisdair sullivan 2012-07-01 23:39:43 -07:00
commit c33a87c4ce
2 changed files with 45 additions and 16 deletions

View file

@ -43,13 +43,13 @@ jsx may be built using either [sinan][sinan] or [rebar][rebar]
#### to build the library and run tests #### #### to build the library and run tests ####
```bash ```bash
tanga:jsx alisdair$ sinan build $ sinan build
tanga:jsx alisdair$ sinan -r tests eunit $ sinan -r tests eunit
``` ```
or or
```bash ```bash
tanga:jsx alisdair$ rebar compile $ rebar compile
tanga:jsx alisdair$ rebar eunit $ rebar eunit
``` ```
#### to convert a utf8 binary containing a json string into an erlang term #### #### to convert a utf8 binary containing a json string into an erlang term ####
@ -264,7 +264,7 @@ jsx functions all take a common set of options. not all flags have meaning in al
- `escaped_forward_slashes` - `escaped_forward_slashes`
json strings are escaped according to the json spec. this means forward slashes (solidus) are optionally escaped. this option is only relevant for encoding; you may want to use this if you are embedding json directly into a html or xml document json strings are escaped according to the json spec. this means forward slashes (solidus) are only escaped when this flag is present. otherwise they are left unescaped. this option is only relevant for encoding; you may want to use this if you are embedding json directly into a html or xml document
- `single_quoted_strings` - `single_quoted_strings`

View file

@ -65,8 +65,10 @@ value([{}], {Handler, State}, _Opts) ->
Handler:handle_event(end_object, Handler:handle_event(start_object, State)); Handler:handle_event(end_object, Handler:handle_event(start_object, State));
value([], {Handler, State}, _Opts) -> value([], {Handler, State}, _Opts) ->
Handler:handle_event(end_array, Handler:handle_event(start_array, State)); Handler:handle_event(end_array, Handler:handle_event(start_array, State));
value(List, {Handler, State}, Opts) when is_list(List) -> value([Tuple|Rest], Handler, Opts) when is_tuple(Tuple) ->
list_or_object(List, {Handler, State}, Opts); list_or_object([pre_encode(Tuple, Opts)|Rest], Handler, Opts);
value(List, Handler, Opts) when is_list(List) ->
list_or_object(List, Handler, Opts);
value(Term, Handler, Opts) -> ?error([Term, Handler, Opts]). value(Term, Handler, Opts) -> ?error([Term, Handler, Opts]).
@ -76,7 +78,7 @@ list_or_object(List, {Handler, State}, Opts) ->
list(List, {Handler, Handler:handle_event(start_array, State)}, Opts). list(List, {Handler, Handler:handle_event(start_array, State)}, Opts).
object([{Key, Value}|Rest], {Handler, State}, Opts) -> object([{Key, Value}|Rest], {Handler, State}, Opts) when is_atom(Key); is_binary(Key) ->
object( object(
Rest, Rest,
{ {
@ -834,8 +836,8 @@ pre_encoders_test_() ->
end_json end_json
] ]
)}, )},
{"replace all non-list values with false", ?_assertEqual( {"replace all non-list and non_tuple values with false", ?_assertEqual(
encode(Term, [{pre_encode, fun(V) when is_list(V) -> V; (_) -> false end}]), encode(Term, [{pre_encode, fun(V) when is_list(V); is_tuple(V) -> V; (_) -> false end}]),
[ [
start_object, start_object,
{key, <<"object">>}, start_object, {key, <<"object">>}, start_object,
@ -871,6 +873,33 @@ pre_encoders_test_() ->
end_object, end_object,
end_json end_json
] ]
)},
{"pre_encode tuple", ?_assertEqual(
encode({1, 2, 3}, [{pre_encode, fun(Tuple) when is_tuple(Tuple) -> tuple_to_list(Tuple); (V) -> V end}]),
[
start_array,
{integer, 1}, {integer, 2}, {integer, 3},
end_array,
end_json
]
)},
{"pre_encode 2-tuples", ?_assertEqual(
encode([{number, 1}], [{pre_encode, fun({K, V}) -> {K, V + 1}; (V) -> V end}]),
[
start_object,
{key, <<"number">>}, {integer, 2},
end_object,
end_json
]
)},
{"pre_encode one field record", ?_assertEqual(
encode([{foo, bar}], [{pre_encode, fun({foo, V}) -> {V, undefined}; (undefined) -> false; (V) -> V end}]),
[
start_object,
{key, <<"bar">>}, {literal, false},
end_object,
end_json
]
)} )}
]. ].