-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Describe the bug
The UptimeApi.service.get_uptime_test method (and possibly other methods) blows up with Python 3.11 (and possibly other versions of Python 3) due to this error stemming from an old version of the python-dateutil library:
AttributeError: module 'collections' has no attribute 'Callable'
To Reproduce
Here is a minimal reproducer (reproduced using Python 3.11.3 and statuscake-py 1.1.0b1 (latest at the time of creating this issue):
import os
from statuscake import ApiClient
from statuscake.apis import (
UptimeApi,
)
client = ApiClient(
header_name='Authorization',
header_value=f"Bearer <api-key>",
)
service = UptimeApi(api_client=client)
uptime_test = service.get_uptime_test(<some-id>)
print(uptime_test)
Expected behavior
Python dict with the details of the requested uptime test.
Additional context
This issue stems from the collections module of the standard library moving a bunch of classes from the collections namespace to the collections.abc namespace at some point, which breaks a number of things. The python-dateutil module uses collections internally. As of creating this issue, the latest version of python-dateutil is 2.8.2, which fixes the above issue. Thus, the simple fix is to update the version constraint in the requirements.txt file here.
Workaround
Things seem to work fine in a Python 3.11 environment by manually running pip install -U python-dateutil in the virtualenv of the project after having installed statuscake-py.
Full Stacktrace
This is the complete stacktrace of the issue as generated using the reproduce script above.
Traceback (most recent call last):
File "/home/ajmal/projects/wirebot/test.py", line 14, in <module>
uptime_test = service.get_uptime_test("7013710")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/api/uptime_api.py", line 1202, in get_uptime_test
return self.get_uptime_test_endpoint.call_with_http_info(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/api_client.py", line 874, in call_with_http_info
return self.api_client.call_api(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/api_client.py", line 432, in call_api
return self.__call_api(resource_path, method,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/api_client.py", line 244, in __call_api
return_data = self.deserialize(
^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/api_client.py", line 348, in deserialize
deserialized_data = validate_and_convert_types(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1602, in validate_and_convert_types
converted_instance = attempt_convert_item(
^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1482, in attempt_convert_item
return deserialize_model(input_value, valid_class,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1396, in deserialize_model
return model_class._new_from_openapi_data(**kw_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 69, in wrapped_init
return fn(__self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 391, in _new_from_openapi_data
return cls._from_openapi_data(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 69, in wrapped_init
return fn(__self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model/uptime_test_response.py", line 192, in _from_openapi_data
self.data = data
^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 210, in __setattr__
self[attr] = value
~~~~^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 530, in __setitem__
self.set_attribute(name, value)
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 182, in set_attribute
value = validate_and_convert_types(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1602, in validate_and_convert_types
converted_instance = attempt_convert_item(
^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1482, in attempt_convert_item
return deserialize_model(input_value, valid_class,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1396, in deserialize_model
return model_class._new_from_openapi_data(**kw_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 69, in wrapped_init
return fn(__self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 391, in _new_from_openapi_data
return cls._from_openapi_data(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 69, in wrapped_init
return fn(__self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model/uptime_test.py", line 349, in _from_openapi_data
setattr(self, var_name, var_value)
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 210, in __setattr__
self[attr] = value
~~~~^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 530, in __setitem__
self.set_attribute(name, value)
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 182, in set_attribute
value = validate_and_convert_types(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1602, in validate_and_convert_types
converted_instance = attempt_convert_item(
^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1487, in attempt_convert_item
return deserialize_primitive(input_value, valid_class,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/statuscake/model_utils.py", line 1276, in deserialize_primitive
parsed_datetime = parse(data)
^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/dateutil/parser.py", line 1164, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ajmal/projects/wirebot/.venv/lib/python3.11/site-packages/dateutil/parser.py", line 583, in parse
if (isinstance(tzinfos, collections.Callable) or
^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'collections' has no attribute 'Callable'