From d6c3e3970d4dcbe89de3f714bb009edd62d054af Mon Sep 17 00:00:00 2001 From: James Aimonetti Date: Thu, 15 Jan 2015 11:57:46 -0800 Subject: [PATCH 01/10] Track a schema loader callback for loading $ref schema URIs --- src/jesse_state.erl | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/jesse_state.erl b/src/jesse_state.erl index dfd37cf1..87a3efe7 100644 --- a/src/jesse_state.erl +++ b/src/jesse_state.erl @@ -27,6 +27,7 @@ , get_allowed_errors/1 , get_current_path/1 , get_current_schema/1 + , get_original_schema/1 , get_default_schema_ver/1 , get_error_handler/1 , get_error_list/1 @@ -35,11 +36,17 @@ , set_allowed_errors/2 , set_current_schema/2 , set_error_list/2 + , find_schema/2 ]). -export_type([ state/0 ]). +%% Includes +-include("jesse_schema_validator.hrl"). + +-define(schema_loader_fun, fun jesse_database:read/1). + %% Internal datastructures -record( state , { original_schema :: jesse:json_term() @@ -49,14 +56,12 @@ , error_list :: list() , error_handler :: fun((#state{}) -> list() | no_return()) , default_schema_ver :: atom() + , schema_loader_fun :: fun((binary()) -> {ok, jesse:json_term()} | jesse:json_term() | ?not_found) } ). -opaque state() :: #state{}. -%% Includes --include("jesse_schema_validator.hrl"). - %%% API %% @doc Adds `Property' to the `current_path' in `State'. -spec add_to_path(State :: state(), Property :: binary()) -> state(). @@ -79,6 +84,11 @@ get_current_path(#state{current_path = CurrentPath}) -> get_current_schema(#state{current_schema = CurrentSchema}) -> CurrentSchema. +%% @doc Getter for `original_schema'. +-spec get_original_schema(State :: state()) -> jesse:json_term(). +get_original_schema(#state{original_schema = OriginalSchema}) -> + OriginalSchema. + %% @doc Getter for `default_schema_ver'. -spec get_default_schema_ver(State :: state()) -> binary(). get_default_schema_ver(#state{default_schema_ver = SchemaVer}) -> @@ -113,6 +123,10 @@ new(JsonSchema, Options) -> , Options , ?default_schema_ver ), + LoaderFun = proplists:get_value( schema_loader_fun + , Options + , ?schema_loader_fun + ), #state{ current_schema = JsonSchema , current_path = [] , original_schema = JsonSchema @@ -120,6 +134,7 @@ new(JsonSchema, Options) -> , error_list = [] , error_handler = ErrorHandler , default_schema_ver = DefaultSchemaVer + , schema_loader_fun = LoaderFun }. %% @doc Removes the last element from `current_path' in `State'. @@ -146,6 +161,20 @@ set_current_schema(State, NewSchema) -> set_error_list(State, ErrorList) -> State#state{error_list = ErrorList}. +%% @doc Find a schema based on URI +-spec find_schema(State :: state(), SchemaURI :: binary()) -> jesse:json_term() | ?not_found. +find_schema(#state{schema_loader_fun=LoaderFun}, SchemaURI) -> + try LoaderFun(SchemaURI) of + {ok, Schema} -> Schema; + Schema -> + case jesse_lib:is_json_object(Schema) of + true -> Schema; + false -> ?not_found + end + catch + _:_ -> ?not_found + end. + %%% Local Variables: %%% erlang-indent-level: 2 %%% End: From da97b8e989d53f61749caae69e0145a22f009ae6 Mon Sep 17 00:00:00 2001 From: James Aimonetti Date: Thu, 15 Jan 2015 11:58:07 -0800 Subject: [PATCH 02/10] Load and validate data using $ref'd schema --- src/jesse_validator_draft3.erl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/jesse_validator_draft3.erl b/src/jesse_validator_draft3.erl index 914ac6ce..61f1ba6b 100644 --- a/src/jesse_validator_draft3.erl +++ b/src/jesse_validator_draft3.erl @@ -185,6 +185,9 @@ check_value(Value, [{?DISALLOW, Disallow} | Attrs], State) -> check_value(Value, [{?EXTENDS, Extends} | Attrs], State) -> NewState = check_extends(Value, Extends, State), check_value(Value, Attrs, NewState); +check_value(Value, [{?_REF, RefSchemaURI} | Attrs], State) -> + NewState = check_ref(Value, RefSchemaURI, State), + check_value(Value, Attrs, NewState); check_value(_Value, [], State) -> State; check_value(Value, [_Attr | Attrs], State) -> @@ -861,6 +864,35 @@ check_extends_array(Value, Extends, State) -> , Extends ). +%% @private +check_ref(Value, <<"#", LocalPath/binary>>, State) -> + Keys = binary:split(LocalPath, <<"/">>, ['global']), + OriginalSchema = jesse_state:get_original_schema(State), + + case local_schema(OriginalSchema, Keys) of + ?not_found -> State; + LocalSchema -> check_ref_schema(Value, LocalSchema, State) + end; +check_ref(Value, RefSchemaURI, State) -> + case jesse_state:find_schema(State, RefSchemaURI) of + ?not_found -> State; + RefSchema -> check_ref_schema(Value, RefSchema, State) + end. + +%% @private +check_ref_schema(Value, RefSchema, State) -> + TmpState = check_value(Value, unwrap(RefSchema), set_current_schema(State, RefSchema)), + set_current_schema(TmpState, get_current_schema(State)). + +local_schema(Schema, []) -> Schema; +local_schema(Schema, [<<>> | Keys]) -> local_schema(Schema, Keys); +local_schema(Schema, [Key | Keys]) -> + SubSchema = get_value(Key, Schema), + case jesse_lib:is_json_object(SubSchema) of + true -> local_schema(SubSchema, Keys); + false -> ?not_found + end. + %%============================================================================= %% @doc Returns `true' if given values (instance) are equal, otherwise `false' %% is returned. From f121e9c50d1b9ee2c6ec0eb6394c840e6cac3a23 Mon Sep 17 00:00:00 2001 From: James Aimonetti Date: Thu, 15 Jan 2015 11:58:46 -0800 Subject: [PATCH 03/10] Enable ref test suite --- test/jesse_tests_draft3_SUITE.erl | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/jesse_tests_draft3_SUITE.erl b/test/jesse_tests_draft3_SUITE.erl index 991fa430..55d77756 100644 --- a/test/jesse_tests_draft3_SUITE.erl +++ b/test/jesse_tests_draft3_SUITE.erl @@ -43,7 +43,7 @@ , pattern/1 , patternProperties/1 , properties/1 - %% , ref/1 + , ref/1 , required/1 , type/1 , uniqueItems/1 @@ -78,7 +78,7 @@ all() -> , pattern , patternProperties , properties - %% , ref + , ref , required , type , uniqueItems @@ -179,11 +179,10 @@ properties(Config) -> Specs = ?config(Key, Config), ok = run_tests(Specs). -%% not implemented yet -%% ref(Config) -> -%% Key = "ref", -%% Specs = ?config(Key, Config), -%% ok = run_tests(Specs). +ref(Config) -> + Key = "ref", + Specs = ?config(Key, Config), + ok = run_tests(Specs). required(Config) -> Key = "required", From efb81b75f58c4702310e553bb3fb2c675968d61d Mon Sep 17 00:00:00 2001 From: James Aimonetti Date: Thu, 15 Jan 2015 12:26:49 -0800 Subject: [PATCH 04/10] Fail validation if $ref schema is not found --- src/jesse_validator_draft3.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jesse_validator_draft3.erl b/src/jesse_validator_draft3.erl index 61f1ba6b..d91fa65f 100644 --- a/src/jesse_validator_draft3.erl +++ b/src/jesse_validator_draft3.erl @@ -865,17 +865,17 @@ check_extends_array(Value, Extends, State) -> ). %% @private -check_ref(Value, <<"#", LocalPath/binary>>, State) -> +check_ref(Value, <<"#", LocalPath/binary>> = RefSchemaURI, State) -> Keys = binary:split(LocalPath, <<"/">>, ['global']), OriginalSchema = jesse_state:get_original_schema(State), case local_schema(OriginalSchema, Keys) of - ?not_found -> State; + ?not_found -> handle_schema_invalid({'schema_unsupported', RefSchemaURI}, State); LocalSchema -> check_ref_schema(Value, LocalSchema, State) end; check_ref(Value, RefSchemaURI, State) -> case jesse_state:find_schema(State, RefSchemaURI) of - ?not_found -> State; + ?not_found -> handle_schema_invalid({'schema_unsupported', RefSchemaURI}, State); RefSchema -> check_ref_schema(Value, RefSchema, State) end. From f6cf7a359ab00b5da60561f6a3f90f8477d28a7f Mon Sep 17 00:00:00 2001 From: Emilio Del Tessandoro Date: Tue, 8 Dec 2015 17:46:10 +0100 Subject: [PATCH 05/10] Added support for local --- src/jesse_schema_validator.erl | 62 ++++++++++++++++++++++++++++++- test/jesse_tests_draft3_SUITE.erl | 13 +++---- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/jesse_schema_validator.erl b/src/jesse_schema_validator.erl index 2e47900b..4452dab1 100644 --- a/src/jesse_schema_validator.erl +++ b/src/jesse_schema_validator.erl @@ -54,7 +54,7 @@ -define(DISALLOW, <<"disallow">>). -define(EXTENDS, <<"extends">>). -define(ID, <<"id">>). --define(_REF, <<"$ref">>). % NOT IMPLEMENTED YET +-define(REF, <<"$ref">>). % ONLY LOCAL %% Constant definitions for Json types -define(ANY, <<"any">>). @@ -65,6 +65,7 @@ -define(NUMBER, <<"number">>). -define(OBJECT, <<"object">>). -define(STRING, <<"string">>). +-define(SEPARATOR, <<"/">>). %% -define(data_invalid, 'data_invalid'). @@ -73,6 +74,7 @@ -define(missing_id_field, 'missing_id_field'). -define(missing_required_property, 'missing_required_property'). -define(missing_dependency, 'missing_dependency'). +-define(missing_ref_path, 'missing_ref_path'). -define(no_match, 'no_match'). -define(no_extra_properties_allowed, 'no_extra_properties_allowed'). -define(no_extra_items_allowed, 'no_extra_items_allowed'). @@ -165,6 +167,14 @@ check_value(Property, Value, Attrs, State) -> %% @doc Goes through attributes of the given schema `JsonSchema' and %% validates the value `Value' against them. %% @private +check_value(Value, [{?REF, Ref} | Attrs], State) -> + State1 = check_value(Value, Attrs, State), + case resolve_ref(Ref, State1) of + {NewAttrs, NewState} -> check_value(Value, NewAttrs, NewState); + no_such_ref -> handle_data_invalid(?missing_ref_path + , binary:bin_to_list(Ref) + , State) + end; check_value(Value, [{?TYPE, Type} | Attrs], State) -> NewState = check_type(Value, Type, State), check_value(Value, Attrs, NewState); @@ -319,6 +329,56 @@ check_value(_Value, [], State) -> check_value(Value, [_Attr | Attrs], State) -> check_value(Value, Attrs, State). + +%% @doc Resolve local references, changing the state of the automata to the +%% right path in the schema. It supports recursive definitions and references to +%% array elements. +%% @private +resolve_ref(RefPath, State) -> + OriginalSchema = State#state.original_schema, + Tokens = binary:split(RefPath, ?SEPARATOR, [global]), + DecodedTokens = lists:map(fun(T) -> decode_path_element(T) end, Tokens), + resolve_ref(DecodedTokens, OriginalSchema, State). + +%% @private +resolve_ref([<<"#">> | Rest], Schema, State) -> + resolve_ref(Rest, Schema, State); +resolve_ref([CurrentItem | Rest], Schema, State) -> + CurrentAttrs = unwrap(Schema), + CurrentSchema = proplists:get_value(CurrentItem, CurrentAttrs), + case {CurrentItem, CurrentSchema} of + {_, undefined} -> no_such_ref; + {?ITEMS, _} -> resolve_array_ref(Rest, CurrentSchema, State); + {_, _} -> resolve_ref(Rest, CurrentSchema, State) + end; +resolve_ref([], Schema, State) -> + {unwrap(Schema), set_current_schema(State, Schema)}. + +%% @private +resolve_array_ref([Item | Rest], Attrs, State) -> + try + Index = binary_to_integer(Item), + CurrentSchema = lists:nth(Index + 1, Attrs), + resolve_ref(Rest, CurrentSchema, State) + catch + % maybe Item is not an integer + error:badarg -> no_such_ref; + % maybe it happens to be an integer and there's not such index in the list + error:function_clause -> no_such_ref + end; +resolve_array_ref([], Attrs, State) -> + resolve_ref([], Attrs, State). + +%% @doc Decodes a $ref URI token. Replacen the ~0 and ~1 according to RFC 6901, +%% run URI decode, then go back to binary. +%% @private +decode_path_element(Token) -> + String = binary:bin_to_list(Token), + String1 = http_uri:decode(String), + String2 = re:replace(String1, "~0", "~", [global,{return,list}]), + String3 = re:replace(String2, "~1", "/", [global,{return,list}]), + binary:list_to_bin(String3). + %% @doc 5.1. type %% %% This attribute defines what the primitive type or the schema of the diff --git a/test/jesse_tests_draft3_SUITE.erl b/test/jesse_tests_draft3_SUITE.erl index f9d6056a..ec3bd12e 100644 --- a/test/jesse_tests_draft3_SUITE.erl +++ b/test/jesse_tests_draft3_SUITE.erl @@ -43,7 +43,7 @@ , pattern/1 , patternProperties/1 , properties/1 - %% , ref/1 + , ref/1 , required/1 , type/1 , uniqueItems/1 @@ -78,7 +78,7 @@ all() -> , pattern , patternProperties , properties - %% , ref + , ref , required , type , uniqueItems @@ -179,11 +179,10 @@ properties(Config) -> Specs = ?config(Key, Config), ok = run_tests(Specs). -%% not implemented yet -%% ref(Config) -> -%% Key = "ref", -%% Specs = ?config(Key, Config), -%% ok = run_tests(Specs). +ref(Config) -> + Key = "ref", + Specs = ?config(Key, Config), + ok = run_tests(Specs). required(Config) -> Key = "required", From dbf0da7f8c69a49ded9d6c230bff9a42ff5a2568 Mon Sep 17 00:00:00 2001 From: Emilio Del Tessandoro Date: Wed, 9 Dec 2015 10:43:28 +0100 Subject: [PATCH 06/10] fix to escaping --- AUTHORS | 1 + README.md | 2 +- src/jesse_schema_validator.erl | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index eb8a1cb9..e79a174b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,3 +9,4 @@ Viktor Söderqvist Robert Timothy Stewart Łukasz Biedrycki Daniel Kempkens +Emilio Del Tessandoro diff --git a/README.md b/README.md index c9bbf2e6..c6cf0d13 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ jesse implements [Draft 03] (http://tools.ietf.org/html/draft-zyp-json-schema-03 the specification. It supports almost all core schema definitions except: * format -* $ref +* $ref (but local references are supported) Quick start ----------- diff --git a/src/jesse_schema_validator.erl b/src/jesse_schema_validator.erl index 4452dab1..1ca44543 100644 --- a/src/jesse_schema_validator.erl +++ b/src/jesse_schema_validator.erl @@ -375,8 +375,8 @@ resolve_array_ref([], Attrs, State) -> decode_path_element(Token) -> String = binary:bin_to_list(Token), String1 = http_uri:decode(String), - String2 = re:replace(String1, "~0", "~", [global,{return,list}]), - String3 = re:replace(String2, "~1", "/", [global,{return,list}]), + String2 = re:replace(String1, "\~0", "\~", [global,{return,list}]), + String3 = re:replace(String2, "\~1", "/", [global,{return,list}]), binary:list_to_bin(String3). %% @doc 5.1. type From 994b00bfe0160ec9dfb6787ba67b892e8572c75d Mon Sep 17 00:00:00 2001 From: Emilio Del Tessandoro Date: Wed, 9 Dec 2015 12:54:56 +0100 Subject: [PATCH 07/10] a bit of refactoring --- src/jesse_validator_draft3.erl | 103 ++++++++++++--------------------- 1 file changed, 38 insertions(+), 65 deletions(-) diff --git a/src/jesse_validator_draft3.erl b/src/jesse_validator_draft3.erl index 4933521f..3c29a459 100644 --- a/src/jesse_validator_draft3.erl +++ b/src/jesse_validator_draft3.erl @@ -186,14 +186,9 @@ check_value(Value, [{?DISALLOW, Disallow} | Attrs], State) -> check_value(Value, [{?EXTENDS, Extends} | Attrs], State) -> NewState = check_extends(Value, Extends, State), check_value(Value, Attrs, NewState); -check_value(Value, [{?REF, Ref} | Attrs], State) -> - State1 = check_value(Value, Attrs, State), - case resolve_ref(Ref, State1) of - {NewAttrs, NewState} -> check_value(Value, NewAttrs, NewState); - no_such_ref -> handle_data_invalid(?missing_ref_path - , binary:bin_to_list(Ref) - , State) - end; +check_value(Value, [{?REF, RefSchemaURI} | Attrs], State) -> + NewState = check_ref(Value, RefSchemaURI, State), + check_value(Value, Attrs, NewState); check_value(_Value, [], State) -> State; check_value(Value, [_Attr | Attrs], State) -> @@ -211,45 +206,52 @@ check_value(Property, Value, Attrs, State) -> jesse_state:remove_last_from_path(State2). - -%% @doc Resolve local references, changing the state of the automata to the -%% right path in the schema. It supports recursive definitions and references to -%% array elements. %% @private -resolve_ref(RefPath, State) -> +check_ref(Value, <<"#", LocalPath/binary>> = RefSchemaURI, State) -> + Keys = binary:split(LocalPath, <<"/">>, ['global']), + DecodedKeys = lists:map(fun(T) -> decode_path_element(T) end, Keys), OriginalSchema = jesse_state:get_original_schema(State), - Tokens = binary:split(RefPath, ?SEPARATOR, [global]), - DecodedTokens = lists:map(fun(T) -> decode_path_element(T) end, Tokens), - resolve_ref(DecodedTokens, OriginalSchema, State). -%% @private -resolve_ref([<<"#">> | Rest], Schema, State) -> - resolve_ref(Rest, Schema, State); -resolve_ref([CurrentItem | Rest], Schema, State) -> - CurrentAttrs = unwrap(Schema), - CurrentSchema = proplists:get_value(CurrentItem, CurrentAttrs), - case {CurrentItem, CurrentSchema} of - {_, undefined} -> no_such_ref; - {?ITEMS, _} -> resolve_array_ref(Rest, CurrentSchema, State); - {_, _} -> resolve_ref(Rest, CurrentSchema, State) + case local_schema(OriginalSchema, DecodedKeys) of + ?not_found -> handle_schema_invalid({no_such_ref, RefSchemaURI}, State); + LocalSchema -> check_ref_schema(Value, LocalSchema, State) end; -resolve_ref([], Schema, State) -> - {unwrap(Schema), set_current_schema(State, Schema)}. +check_ref(Value, RefSchemaURI, State) -> + case jesse_state:find_schema(State, RefSchemaURI) of + ?not_found -> handle_schema_invalid({no_such_schema, RefSchemaURI}, State); + RefSchema -> check_ref_schema(Value, RefSchema, State) + end. %% @private -resolve_array_ref([Item | Rest], Attrs, State) -> +check_ref_schema(Value, RefSchema, State) -> + TmpState = check_value(Value + , unwrap(RefSchema) + , set_current_schema(State, RefSchema)), + set_current_schema(TmpState, get_current_schema(State)). + +local_schema(Schema, []) -> Schema; +local_schema(Schema, [<<>> | Keys]) -> local_schema(Schema, Keys); +local_schema(Schema, [Key | Keys]) -> + SubSchema = get_value(Key, Schema), + case {Key, jesse_lib:is_json_object(SubSchema)} of + {?ITEMS, true} -> local_schema_array(Keys, SubSchema); + {_, true} -> local_schema(SubSchema, Keys); + {_, false} -> ?not_found + end. + +local_schema_array(Schema, [Key | Keys]) -> try - Index = binary_to_integer(Item), - CurrentSchema = lists:nth(Index + 1, Attrs), - resolve_ref(Rest, CurrentSchema, State) + Index = binary_to_integer(Key), + SubSchema = lists:nth(Index + 1, Schema), + local_schema(SubSchema, Keys) catch % maybe Item is not an integer - error:badarg -> no_such_ref; + error:badarg -> ?not_found; % maybe it happens to be an integer and there's not such index in the list - error:function_clause -> no_such_ref + error:function_clause -> ?not_found end; -resolve_array_ref([], Attrs, State) -> - resolve_ref([], Attrs, State). +local_schema_array(Schema, []) -> + Schema. %% @doc Decodes a $ref URI token. Replacen the ~0 and ~1 according to RFC 6901, %% run URI decode, then go back to binary. @@ -922,35 +924,6 @@ check_extends_array(Value, Extends, State) -> , Extends ). -%% @private -% check_ref(Value, <<"#", LocalPath/binary>> = RefSchemaURI, State) -> -% Keys = binary:split(LocalPath, <<"/">>, ['global']), -% OriginalSchema = jesse_state:get_original_schema(State), - -% case local_schema(OriginalSchema, Keys) of -% ?not_found -> handle_schema_invalid({'schema_unsupported', RefSchemaURI}, State); -% LocalSchema -> check_ref_schema(Value, LocalSchema, State) -% end; -% check_ref(Value, RefSchemaURI, State) -> -% case jesse_state:find_schema(State, RefSchemaURI) of -% ?not_found -> handle_schema_invalid({'schema_unsupported', RefSchemaURI}, State); -% RefSchema -> check_ref_schema(Value, RefSchema, State) -% end. - -% %% @private -% check_ref_schema(Value, RefSchema, State) -> -% TmpState = check_value(Value, unwrap(RefSchema), set_current_schema(State, RefSchema)), -% set_current_schema(TmpState, get_current_schema(State)). - -% local_schema(Schema, []) -> Schema; -% local_schema(Schema, [<<>> | Keys]) -> local_schema(Schema, Keys); -% local_schema(Schema, [Key | Keys]) -> -% SubSchema = get_value(Key, Schema), -% case jesse_lib:is_json_object(SubSchema) of -% true -> local_schema(SubSchema, Keys); -% false -> ?not_found -% end. - %%============================================================================= %% @doc Returns `true' if given values (instance) are equal, otherwise `false' %% is returned. From 376024395ed7190ab5bcc95c99ce465e548567b1 Mon Sep 17 00:00:00 2001 From: Emilio Del Tessandoro Date: Wed, 9 Dec 2015 13:14:10 +0100 Subject: [PATCH 08/10] fixed bug in args order --- src/jesse_validator_draft3.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jesse_validator_draft3.erl b/src/jesse_validator_draft3.erl index 3c29a459..588e2598 100644 --- a/src/jesse_validator_draft3.erl +++ b/src/jesse_validator_draft3.erl @@ -234,9 +234,9 @@ local_schema(Schema, [<<>> | Keys]) -> local_schema(Schema, Keys); local_schema(Schema, [Key | Keys]) -> SubSchema = get_value(Key, Schema), case {Key, jesse_lib:is_json_object(SubSchema)} of - {?ITEMS, true} -> local_schema_array(Keys, SubSchema); - {_, true} -> local_schema(SubSchema, Keys); - {_, false} -> ?not_found + {?ITEMS, _} -> local_schema_array(SubSchema, Keys); + {_, true} -> local_schema(SubSchema, Keys); + {_, false} -> ?not_found end. local_schema_array(Schema, [Key | Keys]) -> From 9dd9240e4dc9d1bbfe89f7d163442739ce7a00a7 Mon Sep 17 00:00:00 2001 From: Emilio Del Tessandoro Date: Wed, 9 Dec 2015 13:26:49 +0100 Subject: [PATCH 09/10] style fixes to jesse_state.erl --- src/jesse_state.erl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/jesse_state.erl b/src/jesse_state.erl index fa663c15..6d5032b8 100644 --- a/src/jesse_state.erl +++ b/src/jesse_state.erl @@ -46,7 +46,7 @@ %% Includes -include("jesse_schema_validator.hrl"). --define(schema_loader_fun, fun jesse_database:read/1). +-define(SCHEMA_LOADER_FUN, fun jesse_database:read/1). %% Internal datastructures -record( state @@ -57,7 +57,9 @@ , error_list :: list() , error_handler :: fun((#state{}) -> list() | no_return()) , default_schema_ver :: atom() - , schema_loader_fun :: fun((binary()) -> {ok, jesse:json_term()} | jesse:json_term() | ?not_found) + , schema_loader_fun :: fun((binary()) -> {ok, jesse:json_term()} | + jesse:json_term() | + ?not_found) } ). @@ -126,7 +128,7 @@ new(JsonSchema, Options) -> ), LoaderFun = proplists:get_value( schema_loader_fun , Options - , ?schema_loader_fun + , ?SCHEMA_LOADER_FUN ), #state{ current_schema = JsonSchema , current_path = [] @@ -163,7 +165,8 @@ set_error_list(State, ErrorList) -> State#state{error_list = ErrorList}. %% @doc Find a schema based on URI --spec find_schema(State :: state(), SchemaURI :: binary()) -> jesse:json_term() | ?not_found. +-spec find_schema(State :: state(), SchemaURI :: binary()) -> + jesse:json_term() | ?not_found. find_schema(#state{schema_loader_fun=LoaderFun}, SchemaURI) -> try LoaderFun(SchemaURI) of {ok, Schema} -> Schema; From 52eddf5d7c883be01a6287fd9bdfb37167552059 Mon Sep 17 00:00:00 2001 From: Emilio Del Tessandoro Date: Wed, 9 Dec 2015 13:29:19 +0100 Subject: [PATCH 10/10] style fixes to jesse_validator_draft3.erl --- src/jesse_validator_draft3.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jesse_validator_draft3.erl b/src/jesse_validator_draft3.erl index 588e2598..4ae0f9cd 100644 --- a/src/jesse_validator_draft3.erl +++ b/src/jesse_validator_draft3.erl @@ -259,8 +259,8 @@ local_schema_array(Schema, []) -> decode_path_element(Token) -> String = binary:bin_to_list(Token), String1 = http_uri:decode(String), - String2 = re:replace(String1, "\~0", "\~", [global,{return,list}]), - String3 = re:replace(String2, "\~1", "/", [global,{return,list}]), + String2 = re:replace(String1, "~0", "\~", [global,{return,list}]), + String3 = re:replace(String2, "~1", "/", [global,{return,list}]), binary:list_to_bin(String3).