Skip to content

UptimeApi.service.get_uptime_test errors out due to old python-dateutil #18

@ajmalsiddiqui

Description

@ajmalsiddiqui

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'

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions