plaid/plaid-python

ApiTypeError when calling `accounts_balance_get` on version 8.0.0b12

whitneylarow opened this issue ยท 5 comments

We saw the following error on Plaid request ID ljeWFQxQDMkRoEx:

Invalid type for variable 'current'. Required value type is float and passed type was NoneType at ['received_data']['accounts'][0]['balances']['current']

Later attempts to make the same request with the same parameters did not throw this error (request IDs: L7MxZhnHm4iqcHT, a39w9rr6E3oPvch, AuELH8Lzggd0LqK).

This was thrown from the serialization code in the SDK because it doesn't seem to handle NoneType for the indicated field. If the API isn't expected to ever return None for that field, then this is an API bug that should be passed along to that team. If the API is expected to return None sometimes for that field, then this a bug with the SDK.

Here's our full stack trace:

Traceback (most recent call last):
  File \"/var/task/flask/app.py\", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File \"/var/task/flask/app.py\", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File \"/var/task/flask/app.py\", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File \"/var/task/flask/_compat.py\", line 39, in reraise
    raise value
  File \"/var/task/flask/app.py\", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File \"/var/task/flask/app.py\", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File \"/var/task/webargs/core.py\", line 450, in wrapper
    return func(*args, **kwargs)
  File \"/var/task/src/endpoints/decorators.py\", line 44, in func_wrapper
    return f(*args, **kwargs, user_id=user_id)
  File \"/var/task/src/endpoints/decorators.py\", line 85, in wrapper
    return func(*args, **kwargs)
  File \"/var/task/src/endpoints/payment_instruments.py\", line 154, in get_active_payment_instruments
    payment_instruments = handlers.get_active_payment_instruments(
  File \"/var/task/src/request_handlers/payment_instruments.py\", line 273, in get_active_payment_instruments
    account_balance = plaid_client.get_account_balance(
  File \"/var/task/src/clients/plaid.py\", line 94, in wrapper
    return func(*args, **kwargs)
  File \"/var/task/src/clients/plaid.py\", line 224, in get_account_balance
    response = get_plaid_client().accounts_balance_get(
  File \"/var/task/plaid/api_client.py\", line 769, in __call__
    return self.callable(self, *args, **kwargs)
  File \"/var/task/plaid/api/plaid_api.py\", line 235, in __accounts_balance_get
    return self.call_with_http_info(**kwargs)
  File \"/var/task/plaid/api_client.py\", line 831, in call_with_http_info
    return self.api_client.call_api(
  File \"/var/task/plaid/api_client.py\", line 406, in call_api
    return self.__call_api(resource_path, method,
  File \"/var/task/plaid/api_client.py\", line 221, in __call_api
    return_data = self.deserialize(
  File \"/var/task/plaid/api_client.py\", line 322, in deserialize
    deserialized_data = validate_and_convert_types(
  File \"/var/task/plaid/model_utils.py\", line 1392, in validate_and_convert_types
    converted_instance = attempt_convert_item(
  File \"/var/task/plaid/model_utils.py\", line 1288, in attempt_convert_item
    raise conversion_exc
  File \"/var/task/plaid/model_utils.py\", line 1279, in attempt_convert_item
    return deserialize_model(input_value, valid_class,
  File \"/var/task/plaid/model_utils.py\", line 1199, in deserialize_model
    return model_class(**kw_args)
  File \"/var/task/plaid/model_utils.py\", line 1564, in wrapped_init
    return fn(self, *args, **kwargs)
  File \"/var/task/plaid/model/accounts_get_response.py\", line 179, in __init__
    self.accounts = accounts
  File \"/var/task/plaid/model_utils.py\", line 165, in __setattr__
    self[attr] = value
  File \"/var/task/plaid/model_utils.py\", line 350, in __setitem__
    self.set_attribute(name, value)
  File \"/var/task/plaid/model_utils.py\", line 137, in set_attribute
    value = validate_and_convert_types(
  File \"/var/task/plaid/model_utils.py\", line 1442, in validate_and_convert_types
    input_value[index] = validate_and_convert_types(
  File \"/var/task/plaid/model_utils.py\", line 1392, in validate_and_convert_types
    converted_instance = attempt_convert_item(
  File \"/var/task/plaid/model_utils.py\", line 1288, in attempt_convert_item
    raise conversion_exc
  File \"/var/task/plaid/model_utils.py\", line 1279, in attempt_convert_item
    return deserialize_model(input_value, valid_class,
  File \"/var/task/plaid/model_utils.py\", line 1199, in deserialize_model
    return model_class(**kw_args)
  File \"/var/task/plaid/model_utils.py\", line 1564, in wrapped_init
    return fn(self, *args, **kwargs)
  File \"/var/task/plaid/model/account_base.py\", line 205, in __init__
    self.balances = balances
  File \"/var/task/plaid/model_utils.py\", line 165, in __setattr__
    self[attr] = value
  File \"/var/task/plaid/model_utils.py\", line 350, in __setitem__
    self.set_attribute(name, value)
  File \"/var/task/plaid/model_utils.py\", line 137, in set_attribute
    value = validate_and_convert_types(
  File \"/var/task/plaid/model_utils.py\", line 1392, in validate_and_convert_types
    converted_instance = attempt_convert_item(
  File \"/var/task/plaid/model_utils.py\", line 1288, in attempt_convert_item
    raise conversion_exc
  File \"/var/task/plaid/model_utils.py\", line 1279, in attempt_convert_item
    return deserialize_model(input_value, valid_class,
  File \"/var/task/plaid/model_utils.py\", line 1199, in deserialize_model
    return model_class(**kw_args)
  File \"/var/task/plaid/model_utils.py\", line 1564, in wrapped_init
    return fn(self, *args, **kwargs)
  File \"/var/task/plaid/model/account_balance.py\", line 180, in __init__
    self.current = current
  File \"/var/task/plaid/model_utils.py\", line 165, in __setattr__
    self[attr] = value
  File \"/var/task/plaid/model_utils.py\", line 350, in __setitem__
    self.set_attribute(name, value)
  File \"/var/task/plaid/model_utils.py\", line 137, in set_attribute
    value = validate_and_convert_types(
  File \"/var/task/plaid/model_utils.py\", line 1392, in validate_and_convert_types
    converted_instance = attempt_convert_item(
  File \"/var/task/plaid/model_utils.py\", line 1274, in attempt_convert_item
    raise get_type_error(input_value, path_to_item, valid_classes,
plaid.exceptions.ApiTypeError: Invalid type for variable 'current'. Required value type is float and passed type was NoneType at ['received_data']['accounts'][0]['balances']['current']

@whitneylarow thanks for the report. This has been fixed in the openapi file and will be fixed in the library when the next version is generated.

@phoenixy1 any idea on when the next version still be generated? Thanks ๐Ÿ˜Š

@stephenjayakar, do you happen to know when we're going to do the next version of the python beta?

@phoenixy1 I believe this should be fixed with beta 13. https://pypi.org/project/plaid-python/8.0.0b13/

This should be fixed in 8.0.0b(13) released today, please re-open if it is not.