Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Requirements
Description of the Change
This PR adds methods needed for parsing JSON RPC responses from a received JSON string. In order to accomplish that the following changes have been made:
JSONRPCInvalidResponseException
(just likeJSONRPCInvalidRequestException
);JSONRPCResponse
- JSON RPC version agnostic parser, based onJSONRPCRequest
. It exposes two class methods:from_json
andfrom_data
- the former just deserializes JSON string and the latter relays parsing to version-specific class. The mechanism is the exact copy of the one used inJSONRPCRequest
;JSONRPC10Response
andJSONRPC20Response
classes:error
setters - verify whetherresult
field is None prior to assigning the error object (raiseValueError
if it is not), deleteresult
key in case ofJSONRPC20Response
(result
anderror
fields are mutually exclusive), attempt to construct error object before assigning the value;result
anderror
deleters toJSONRPC20Response
;from_json
andfrom_data
class methods - the mechanism reflects the one found inJSONRPC10Request
andJSONRPC20Request
.To ensure proper implementation new tests have been added:
test_jsonrpc1.py
:test_from_json_invalid_response_result
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with missingresult
field;test_from_json_invalid_response_error
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with missingerror
field;test_from_json_invalid_response_id
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with missingid
field;test_from_json_invalid_response_both_result_and_error
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with bothresult
anderror
fields other thanNone
;test_from_json_invalid_response_extra_data
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with extra fields;test_from_json_response_result
- tests whether parsing is correct for a specifiedresult
field;test_from_json_response_error
- tests whether parsing is correct for a specifiederror
fieldtest_from_json_string_not_dict
- tests whether the parser raises aValueError
if supplied JSON string does not represent a dictionary.test_jsonrpc2.py
:test_from_json_invalid_response_jsonrpc
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with missingjsonrpc
field;test_from_json_invalid_response_id
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with missingid
field;test_from_json_invalid_response_no_result_error
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with neitherresult
norerror
fields specified;test_from_json_invalid_response_result_and_error
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with bothresult
anderror
fields specified;test_from_json_invalid_response_extra_data
- tests whether the parser raises anJSONRPCInvalidResponseException
if supplied with JSON string with extra fields;test_from_json_response_result_null
- tests whether the parsing is correct for aNone
as aresult
;test_from_json_response_result
- tests whether the parsing is correct for alist
as aresult
;test_from_json_response_error
- tests whether the parsing is correct for an error response.Benefits
This change provides a symmetrical interface for both
JSONRPCRequest
andJSONRPCResponse
. This provides an easy and consistent way to implement symmetrical interfaces, in which either side of an connection acts as a server-client hybrid, e.g. server that sends notifications to connected clients.Possible Drawbacks
Should be none as all tests are passing.