Skip to content

Commit 48de78f

Browse files
swapnil-veerSeluj78
authored andcommitted
Devices: Added convertion of datetime strings to python datetime objects
Fix issue at status_updated_at Fix: PEP 8 correction Fix: Version correction Added check for datetime string format + tests
1 parent bdb5a34 commit 48de78f

File tree

3 files changed

+52
-10
lines changed

3 files changed

+52
-10
lines changed

shellhub/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Increment versions here according to SemVer
2-
__version__ = "0.2.3"
2+
__version__ = "0.3.0"
33

44
from .models.device import ShellHubDevice, ShellHubDeviceInfo
55
from .models.base import ShellHub

shellhub/models/device.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from typing import Dict
23
from typing import List
34
from typing import Optional
@@ -40,12 +41,12 @@ class ShellHubDevice:
4041
info: ShellHubDeviceInfo
4142
public_key: str
4243
tenant_id: str
43-
last_seen: str
44+
last_seen: datetime
4445
online: bool
4546
namespace: str
4647
status: str
47-
status_updated_at: str
48-
created_at: str
48+
status_updated_at: datetime
49+
created_at: datetime
4950
remote_addr: str
5051
tags: List[str]
5152
acceptable: bool
@@ -59,16 +60,23 @@ def __init__(self, api_object: shellhub.models.base.ShellHub, device_json): # t
5960
self.info = ShellHubDeviceInfo(device_json["info"])
6061
self.public_key = device_json["public_key"]
6162
self.tenant_id = device_json["tenant_id"]
62-
self.last_seen = device_json["last_seen"]
63+
self.last_seen = self._safe_isoformat_to_datetime(device_json["last_seen"])
6364
self.online = device_json["online"]
6465
self.namespace = device_json["namespace"]
6566
self.status = device_json["status"]
66-
self.status_updated_at = device_json["status_updated_at"]
67-
self.created_at = device_json["created_at"]
67+
self.status_updated_at = self._safe_isoformat_to_datetime(device_json["status_updated_at"])
68+
self.created_at = self._safe_isoformat_to_datetime(device_json["created_at"])
6869
self.remote_addr = device_json["remote_addr"]
6970
self.tags = device_json["tags"]
7071
self.acceptable = device_json["acceptable"]
7172

73+
@staticmethod
74+
def _safe_isoformat_to_datetime(date_string: str) -> datetime:
75+
try:
76+
return datetime.fromisoformat(date_string)
77+
except ValueError as e:
78+
raise ShellHubApiError(f"Invalid date string: {date_string} (Couldn't convert to datetime)") from e
79+
7280
def delete(self) -> bool:
7381
"""
7482
Delete the device from the API

tests/test_devices.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from datetime import datetime
2+
13
import pytest
24

35
from shellhub.exceptions import ShellHubApiError
@@ -118,16 +120,48 @@ def test_get_device(self, shellhub, requests_mock):
118120
== "-----BEGIN RSA PUBLIC KEY-----\nxxx\nxxx\nxxx\nxxx\nxxx\nxxx\n-----END RSA PUBLIC KEY-----\n"
119121
)
120122
assert device.tenant_id == "1"
121-
assert device.last_seen == "1970-01-01T00:00:00Z"
123+
assert device.last_seen == datetime.fromisoformat("1970-01-01T00:00:00Z")
122124
assert device.online
123125
assert device.namespace == "dev"
124126
assert device.status == "accepted"
125-
assert device.status_updated_at == "1970-01-01T00:00:00Z"
126-
assert device.created_at == "1970-01-01T00:00:00Z"
127+
assert device.status_updated_at == datetime.fromisoformat("1970-01-01T00:00:00Z")
128+
assert device.created_at == datetime.fromisoformat("1970-01-01T00:00:00Z")
127129
assert device.remote_addr == "0.0.0.0"
128130
assert device.tags == []
129131
assert not device.acceptable
130132

133+
def test_get_incorrect_datetime_format(self, shellhub, requests_mock):
134+
mock_response = {
135+
"uid": "1",
136+
"name": "default",
137+
"identity": {"mac": "06:04:ju:le:s7:08"},
138+
"info": {
139+
"id": "ubuntu",
140+
"pretty_name": "Ubuntu 20.04.2 LTS",
141+
"version": "v0.14.1",
142+
"arch": "amd64",
143+
"platform": "docker",
144+
},
145+
"public_key": "-----BEGIN RSA PUBLIC KEY-----\nxxx\nxxx\nxxx\n"
146+
"xxx\nxxx\nxxx\n-----END RSA PUBLIC KEY-----\n",
147+
"tenant_id": "1",
148+
"last_seen": "-1",
149+
"online": True,
150+
"namespace": "dev",
151+
"status": "accepted",
152+
"status_updated_at": "-1",
153+
"created_at": "-1",
154+
"remote_addr": "0.0.0.0",
155+
"position": {"latitude": 0, "longitude": 0},
156+
"tags": [],
157+
"public_url": False,
158+
"public_url_address": "",
159+
"acceptable": False,
160+
}
161+
requests_mock.get(f"{MOCKED_DOMAIN_URL}/api/devices/1", json=mock_response)
162+
with pytest.raises(ShellHubApiError):
163+
shellhub.get_device("1")
164+
131165

132166
class TestDeleteDevice:
133167
def test_delete_device(self, shellhub_device, requests_mock):

0 commit comments

Comments
 (0)