Skip to content

AttributeError: 'str' object has no attribute '__dict__' #173

Open
@craig-matadeen

Description

@craig-matadeen

Hey guys, when trying to create an API context with the latest version of the python package, I get the error in issue title.

The following is the full traceback with the API key removed:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[7], line 2
      1 # Create API context
----> 2 api_context = ApiContext.create(
      3     environment_type=ApiEnvironmentType.PRODUCTION,
      4     api_key="...",
      5     description="..."
      6 )

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/context/api_context.py:66, in ApiContext.create(cls, environment_type, api_key, description, all_permitted_ip, proxy_url)
     64 api_context.__initialize_installation()
     65 api_context.__register_device(description, all_permitted_ip)
---> 66 api_context.__initialize_session()
     68 return api_context

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/context/api_context.py:148, in ApiContext.__initialize_session(self)
    146 def __initialize_session(self) -> None:
    147     from bunq.sdk.model.core.session_server import SessionServer
--> 148     session_server = SessionServer.create(self).value
    150     token = session_server.token
    151     expiry_time = self._get_expiry_timestamp(session_server)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/model/core/session_server.py:74, in SessionServer.create(cls, api_context)
     71 body_bytes = cls.generate_request_body_bytes(api_context.api_key)
     72 response_raw = api_client.post(cls._ENDPOINT_URL_POST, body_bytes, {})
---> 74 return cls._from_json_array_nested(response_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/model/core/bunq_model.py:39, in BunqModel._from_json_array_nested(cls, response_raw)
     37 json = response_raw.body_bytes.decode()
     38 obj = converter.json_to_class(dict, json)
---> 39 value = converter.deserialize(cls, obj[cls._FIELD_RESPONSE])
     41 return BunqResponse(value, response_raw.headers)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:464, in deserialize(cls, obj_raw)
    463 def deserialize(cls: Type[T], obj_raw: JsonValue) -> T:
--> 464     return JsonAdapter.deserialize(cls, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:104, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
    102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
--> 104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/session_server_adapter.py:73, in SessionServerAdapter.deserialize(cls, target_class, array)
     66     session_server.__dict__[cls._ATTRIBUTE_USER_COMPANY] = \
     67         converter.deserialize(
     68             UserCompanyApiObject,
     69             user_dict_wrapped[cls._FIELD_USER_COMPANY]
     70         )
     71 elif cls._FIELD_USER_PERSON in user_dict_wrapped:
     72     session_server.__dict__[cls._ATTRIBUTE_USER_PERSON] = \
---> 73         converter.deserialize(
     74             UserPersonApiObject,
     75             user_dict_wrapped[cls._FIELD_USER_PERSON]
     76         )
     77 elif cls._FIELD_USER_API_KEY in user_dict_wrapped:
     78     session_server.__dict__[cls._ATTRIBUTE_USER_API_KEY] = \
     79         converter.deserialize(
     80             UserApiKeyApiObject,
     81             user_dict_wrapped[cls._FIELD_USER_API_KEY]
     82         )

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:464, in deserialize(cls, obj_raw)
    463 def deserialize(cls: Type[T], obj_raw: JsonValue) -> T:
--> 464     return JsonAdapter.deserialize(cls, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:102, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
     99 deserializer = cls._get_deserializer(cls_target)
    101 if deserializer == cls:
--> 102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
    104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:117, in JsonAdapter._deserialize_default(cls, cls_target, obj_raw)
    115     return obj_raw
    116 elif type(obj_raw) == dict:
--> 117     return cls._deserialize_dict(cls_target, obj_raw)
    118 else:
    119     return cls_target(obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:147, in JsonAdapter._deserialize_dict(cls, cls_target, dict_)
    142 @classmethod
    143 def _deserialize_dict(cls,
    144                       cls_target: Type[T],
    145                       dict_: Dict) -> T:
    146     instance = cls_target.__new__(cls_target)
--> 147     dict_deserialized = cls._deserialize_dict_attributes(cls_target, dict_)
    148     instance.__dict__ = cls._fill_default_values(cls_target, dict_deserialized)
    150     return instance

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:163, in JsonAdapter._deserialize_dict_attributes(cls, cls_context, dict_)
    160     value_specs = cls._get_value_specs(cls_context, key_deserialized)
    162     if value_specs is not None:
--> 163         dict_deserialized[value_specs.name] = cls._deserialize_value(value_specs.types, dict_[key])
    165 return dict_deserialized

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:307, in JsonAdapter._deserialize_value(cls, types, value)
    305     return cls._deserialize_list(types.sub, value)
    306 else:
--> 307     return cls.deserialize(types.main, value)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:102, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
     99 deserializer = cls._get_deserializer(cls_target)
    101 if deserializer == cls:
--> 102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
    104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:117, in JsonAdapter._deserialize_default(cls, cls_target, obj_raw)
    115     return obj_raw
    116 elif type(obj_raw) == dict:
--> 117     return cls._deserialize_dict(cls_target, obj_raw)
    118 else:
    119     return cls_target(obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:147, in JsonAdapter._deserialize_dict(cls, cls_target, dict_)
    142 @classmethod
    143 def _deserialize_dict(cls,
    144                       cls_target: Type[T],
    145                       dict_: Dict) -> T:
    146     instance = cls_target.__new__(cls_target)
--> 147     dict_deserialized = cls._deserialize_dict_attributes(cls_target, dict_)
    148     instance.__dict__ = cls._fill_default_values(cls_target, dict_deserialized)
    150     return instance

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:163, in JsonAdapter._deserialize_dict_attributes(cls, cls_context, dict_)
    160     value_specs = cls._get_value_specs(cls_context, key_deserialized)
    162     if value_specs is not None:
--> 163         dict_deserialized[value_specs.name] = cls._deserialize_value(value_specs.types, dict_[key])
    165 return dict_deserialized

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:307, in JsonAdapter._deserialize_value(cls, types, value)
    305     return cls._deserialize_list(types.sub, value)
    306 else:
--> 307     return cls.deserialize(types.main, value)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:102, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
     99 deserializer = cls._get_deserializer(cls_target)
    101 if deserializer == cls:
--> 102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
    104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:117, in JsonAdapter._deserialize_default(cls, cls_target, obj_raw)
    115     return obj_raw
    116 elif type(obj_raw) == dict:
--> 117     return cls._deserialize_dict(cls_target, obj_raw)
    118 else:
    119     return cls_target(obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:148, in JsonAdapter._deserialize_dict(cls, cls_target, dict_)
    146 instance = cls_target.__new__(cls_target)
    147 dict_deserialized = cls._deserialize_dict_attributes(cls_target, dict_)
--> 148 instance.__dict__ = cls._fill_default_values(cls_target, dict_deserialized)
    150 return instance

AttributeError: 'str' object has no attribute '__dict__'

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions