Skip to content

Commit 7b9e497

Browse files
author
tradel
committed
more lenient parsing for inconsistent event data
1 parent 94e6a6b commit 7b9e497

File tree

9 files changed

+19646
-230
lines changed

9 files changed

+19646
-230
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# PyBanyan Change History
22

3+
## 0.15.0
4+
* allow for inconsistent timestamps in event data
5+
* implement paging for events v2 API
6+
* fix broken callable support in API base class
7+
* more parser tests for events
8+
39
## 0.14.0
410
* more updates to events model
511
* added filter to remove null fields in JSON output

banyan/api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def paged_request(self, method: str, uri: str, params: Dict[str, Any] = None, da
198198
results = self.api_request(method, uri, params, data, json, headers, accept)
199199
for key in results.keys():
200200
logging.debug(f'Looking for {key} in {uri}')
201-
if key in uri:
201+
if key in uri or key == 'data':
202202
if len(results[key]) == 0:
203203
return all_results
204204
all_results.extend(results[key])

banyan/api/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from abc import ABC
2-
from typing import Dict, List, Union, Iterable, Any
2+
from typing import Dict, List, Union, Iterable, Any, Callable
33

44
from banyan.core.exc import BanyanError
55
from banyan.model import InfoBase, BanyanApiObject, Resource, ResourceOrName
@@ -73,7 +73,7 @@ def args_to_html_params(args: Iterable) -> Dict[str, Any]:
7373
params = dict()
7474
for arg, key, val in args:
7575
if arg:
76-
params[key] = val
76+
params[key] = val() if isinstance(val, Callable) else val
7777
return params
7878

7979
def find(self, obj: ResourceOrName):

banyan/api/event_v2.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Meta:
1414
list_uri = '/events'
1515
uri_param = 'EventID'
1616
obj_name = 'event'
17-
supports_paging = False
17+
supports_paging = True
1818

1919
def create(self, obj: BanyanApiObject) -> str:
2020
raise NotImplementedError('The Banyan API does not support this operation')
@@ -43,8 +43,7 @@ def list(self, before_dt: datetime = None, after_dt: datetime = None, order: str
4343
(service_name, 'service_name', service_name),
4444
(event_id, 'id', event_id),
4545
])
46-
response_json = self._client.api_request('GET', self.Meta.list_uri, params=params)
47-
response_json = response_json['data']
46+
response_json = self._client.paged_request('GET', self.Meta.list_uri, params=params)
4847
data: List[Resource] = self.Meta.info_class.Schema().load(response_json, many=True)
4948
self._build_cache(data)
5049
return data

banyan/core/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
from cement.utils.version import get_version as cement_get_version
33

4-
VERSION = (0, 14, 0, 'final', 1)
4+
VERSION = (0, 15, 0, 'final', 1)
55

66

77
def get_version(version=VERSION):

banyan/model/__init__.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ def _deserialize(self, value, attr, data, **kwargs):
2929
elif isinstance(value, int):
3030
try:
3131
return datetime.fromtimestamp(value)
32-
except Exception as ex:
33-
raise ValueError(f'{ex.args[0]}, value = {value}, attr = {attr}')
32+
except OSError:
33+
return None
3434
else:
3535
return super()._deserialize(value, attr, data, **kwargs)
3636

@@ -59,7 +59,10 @@ def _serialize(self, value: datetime, attr, obj, **kwargs):
5959
if not value:
6060
return 0
6161
elif isinstance(value, datetime):
62-
return int(value.timestamp() * 1000000000)
62+
try:
63+
return int(value.timestamp() * 1000000000)
64+
except OSError:
65+
return 0
6366
else:
6467
return super()._serialize(value, attr, obj, **kwargs)
6568

banyan/model/event_v2.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from marshmallow.fields import String
88
from marshmallow_dataclass import dataclass
99

10-
from banyan.model import Resource, NanoTimestampField, MilliTimestampField, BanyanEnum
10+
from banyan.model import Resource, NanoTimestampField, MilliTimestampField, BanyanEnum, TimestampField
1111

1212

1313
@dataclass
@@ -34,7 +34,7 @@ class EventDevice:
3434
class Meta:
3535
unknown = EXCLUDE
3636

37-
device_id: Optional[UUID] = field(metadata={"data_key": "id"})
37+
device_id: str = field(metadata={"data_key": "id"})
3838
friendly_name: str
3939
mac_address: str
4040
serial_number: str
@@ -48,14 +48,8 @@ class Meta:
4848
architecture: str
4949
udid: str
5050
source: str
51-
last_mdm_data_synced_at: datetime = field(metadata={'marshmallow_field': MilliTimestampField()})
52-
53-
# noinspection PyUnusedLocal
54-
@pre_load
55-
def _remove_nulls(self, data, many, **kwargs):
56-
if "id" in data and not data["id"]:
57-
del data["id"]
58-
return data
51+
last_mdm_data_synced_at: datetime = field(metadata={'marshmallow_field': TimestampField()})
52+
last_user_agent: Optional[str]
5953

6054

6155
@dataclass
@@ -72,7 +66,7 @@ class EventUserPrincipal:
7266
class Meta:
7367
unknown = EXCLUDE
7468

75-
user: EventUser
69+
user: Optional[EventUser]
7670
device: Optional[EventDevice]
7771
client: Optional[EventClient]
7872

0 commit comments

Comments
 (0)