@@ -93,16 +93,17 @@ def score(self, transaction, validate=True):
9393
9494 def _response_for (self , path , model_class , request , validate ):
9595 """Send request and create response object"""
96+ cleaned_request = self ._copy_and_clean (request )
9697 if validate :
9798 try :
98- validate_transaction (request )
99+ validate_transaction (cleaned_request )
99100 except MultipleInvalid as ex :
100101 raise InvalidRequestError (
101102 "Invalid transaction data: {0}" .format (ex ))
102103 uri = '/' .join ([self ._base_uri , path ])
103104 response = requests .post (
104105 uri ,
105- json = request ,
106+ json = cleaned_request ,
106107 auth = (self ._user_id , self ._license_key ),
107108 headers =
108109 {'Accept' : 'application/json' ,
@@ -113,6 +114,16 @@ def _response_for(self, path, model_class, request, validate):
113114 else :
114115 self ._handle_error (response , uri )
115116
117+ def _copy_and_clean (self , data ):
118+ """This returns a copy of the data structure with Nones removed"""
119+ if isinstance (data , dict ):
120+ return dict ((k , self ._copy_and_clean (v )) for (k , v ) in data .items ()
121+ if v is not None )
122+ elif isinstance (data , (list , set , tuple )):
123+ return [self ._copy_and_clean (x ) for x in data if x is not None ]
124+ else :
125+ return data
126+
116127 def _user_agent (self ):
117128 """Create User-Agent header"""
118129 return 'minFraud-API/%s %s' % (__version__ , default_user_agent ())
@@ -154,9 +165,9 @@ def _handle_4xx_status(self, response, status, uri):
154165 except ValueError :
155166 raise HTTPError (
156167 'Received a {status:d} error but it did not include'
157- ' the expected JSON body: {content}'
158- . format ( status = status ,
159- content = response .content ), status , uri )
168+ ' the expected JSON body: {content}' . format (
169+ status = status ,
170+ content = response .content ), status , uri )
160171 else :
161172 if 'code' in body and 'error' in body :
162173 self ._handle_web_service_error (body .get ('error' ),
0 commit comments