layrz-sdk 4.0.12__py3-none-any.whl → 4.0.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of layrz-sdk might be problematic. Click here for more details.

@@ -0,0 +1,5 @@
1
+ """decorators"""
2
+
3
+ from .func_timing import func_timing
4
+
5
+ __all__ = ['func_timing']
@@ -0,0 +1,96 @@
1
+ """Timing decorator"""
2
+
3
+ import asyncio
4
+ import logging
5
+ import os
6
+ from collections.abc import Callable
7
+ from functools import wraps
8
+ from typing import Any, ParamSpec, TypeVar, overload
9
+
10
+ T = TypeVar('T')
11
+ P = ParamSpec('P')
12
+
13
+ log = logging.getLogger(__name__)
14
+
15
+ SHOULD_DISPLAY = os.environ.get('LAYRZ_SDK_DISPLAY_TIMING', '1') == '1'
16
+
17
+
18
+ @overload
19
+ def func_timing(func: Callable[P, T]) -> Callable[P, T]: ...
20
+
21
+
22
+ @overload
23
+ def func_timing(*, depth: int) -> Callable[[Callable[P, T]], Callable[P, T]]: ...
24
+
25
+
26
+ def func_timing(
27
+ func: Callable[P, T] | None = None,
28
+ *,
29
+ depth: int = 0,
30
+ ) -> Any:
31
+ """
32
+ Decorator to time a function execution.
33
+
34
+ :param depth: The depth of the function call for logging indentation.
35
+ :return: The wrapped function with timing functionality.
36
+ """
37
+
38
+ def decorator(func: Callable[P, T]) -> Callable[P, T]:
39
+ """Decorator to time a function"""
40
+ import time
41
+
42
+ prefix = '\t' * depth
43
+
44
+ @wraps(func)
45
+ async def async_wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
46
+ start_time = time.perf_counter_ns()
47
+ result: T = await func(*args, **kwargs) # type: ignore
48
+ diff = time.perf_counter_ns() - start_time
49
+
50
+ if SHOULD_DISPLAY:
51
+ log.info(f'{prefix}{func.__name__}() took {_readable_time(diff)}')
52
+
53
+ return result
54
+
55
+ @wraps(func)
56
+ def sync_wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
57
+ start_time = time.perf_counter_ns()
58
+ result = func(*args, **kwargs)
59
+ diff = time.perf_counter_ns() - start_time
60
+
61
+ if SHOULD_DISPLAY:
62
+ log.info(f'{prefix}{func.__name__}() took {_readable_time(diff)}')
63
+
64
+ return result
65
+
66
+ if asyncio.iscoroutinefunction(func):
67
+ return async_wrapper # type: ignore
68
+ return sync_wrapper
69
+
70
+ if func is None:
71
+ return decorator
72
+ return decorator(func)
73
+
74
+
75
+ def _readable_time(diff: int) -> str:
76
+ """Convert nanoseconds to a readable format"""
77
+ if diff < 1_000:
78
+ return f'{diff} ns'
79
+
80
+ diff = diff // 1_000
81
+ if diff < 1_000:
82
+ return f'{diff} μs'
83
+
84
+ diff = diff // 1_000
85
+ if diff < 1_000:
86
+ return f'{diff} ms'
87
+
88
+ diff = diff // 1_000
89
+ if diff < 60:
90
+ return f'{diff} s'
91
+
92
+ diff = diff // 60
93
+ if diff < 60:
94
+ return f'{diff} m'
95
+
96
+ return f'{diff // 60} h'
@@ -104,3 +104,8 @@ class Asset(BaseModel):
104
104
  def asset_type(self: Self) -> int | None:
105
105
  """Get asset type"""
106
106
  return self.kind_id
107
+
108
+ partition_number: int | None = Field(
109
+ default=None,
110
+ description='Partition number assigned for this Asset, if is None, will be auto-assigned by the system',
111
+ )
@@ -1,6 +1,7 @@
1
1
  """Broadcast result"""
2
2
 
3
3
  from datetime import datetime
4
+ from typing import Any
4
5
 
5
6
  from pydantic import BaseModel, Field
6
7
 
@@ -12,9 +13,37 @@ from .status import BroadcastStatus
12
13
  class BroadcastResult(BaseModel):
13
14
  """Broadcast result data"""
14
15
 
16
+ pk: int | None = Field(default=None, description='Broadcast result ID', alias='id')
17
+ trigger_id: int | None = Field(default=None, description='Trigger ID')
18
+
15
19
  service_id: int = Field(description='Service ID')
16
20
  asset_id: int = Field(description='Asset ID')
17
21
  status: BroadcastStatus = Field(description='Broadcast status')
18
22
  request: BroadcastRequest = Field(description='Broadcast request')
19
23
  response: BroadcastResponse = Field(description='Broadcast response')
20
24
  submitted_at: datetime = Field(description='Broadcast submission date')
25
+
26
+ algorithm: str | None = Field(
27
+ default=None,
28
+ description='Algorithm used for the broadcast, if any',
29
+ )
30
+
31
+ error: dict[str, Any] = Field(
32
+ default_factory=dict,
33
+ description='Error message if the broadcast failed',
34
+ )
35
+
36
+ service: dict[str, Any] = Field(
37
+ default_factory=dict,
38
+ description='Service details at the time of the broadcast',
39
+ )
40
+
41
+ asset: dict[str, Any] = Field(
42
+ default_factory=dict,
43
+ description='Asset details at the time of the broadcast',
44
+ )
45
+
46
+ trigger: dict[str, Any] = Field(
47
+ default_factory=dict,
48
+ description='Trigger details at the time of the broadcast',
49
+ )
@@ -8,8 +8,8 @@ class BroadcastStatus(StrEnum):
8
8
  """Broadcast result status"""
9
9
 
10
10
  OK = 'OK'
11
- BADREQUEST = 'BADREQUEST'
12
- INTERNALERROR = 'INTERNALERROR'
11
+ BAD_REQUEST = 'BADREQUEST'
12
+ INTERNAL_ERROR = 'INTERNALERROR'
13
13
  UNAUTHORIZED = 'UNAUTHORIZED'
14
14
  UNPROCESSABLE = 'UNPROCESSABLE'
15
15
  DISCONNECTED = 'DISCONNECTED'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: layrz-sdk
3
- Version: 4.0.12
3
+ Version: 4.0.14
4
4
  Summary: Layrz SDK for Python
5
5
  Author-email: "Golden M, Inc." <software@goldenm.com>
6
6
  Maintainer-email: Kenny Mochizuki <kenny@goldenm.com>, Luis Reyes <lreyes@goldenm.com>, Kasen Li <kli@goldenm.com>, Miguel Zauzich <miguel@goldenm.com>, Angel Prieto <aprieto@goldenm.com>
@@ -1,12 +1,14 @@
1
1
  layrz_sdk/__init__.py,sha256=OutylN0QazaeDVIA5NRDVyzwfYnZkAwVQzT-2F6iX2M,28
2
2
  layrz_sdk/constants.py,sha256=guXfIsVAcex76OEMv6DAJy1km1A_WUfWJuUO2Lo3kXE,344
3
3
  layrz_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ layrz_sdk/decorators/__init__.py,sha256=btoa1egRuYFWggsnfXprvCnxBN9Oq8pbRGcRUR2lm10,82
5
+ layrz_sdk/decorators/func_timing.py,sha256=xRZrWv13ppS8wDy8DeMSNwH21soXGg-i1lOkSzsJ0c8,2196
4
6
  layrz_sdk/entities/__init__.py,sha256=7v3V9s_k2vf2WmHtgf9bMrEqm5EOPRR8xgZmg2B0eJ8,6079
5
7
  layrz_sdk/entities/action.py,sha256=cbyrfeBsUpdv5ipMtIDvFNJj-FE6whPt7I22BnEZ2sU,2020
6
8
  layrz_sdk/entities/action_geofence_ownership.py,sha256=xP_JG2qY7ogJtbCv-jE1xWAdc2oA0icoRIOAI6acicA,590
7
9
  layrz_sdk/entities/action_kind.py,sha256=2PR4MesAyKssdWAwOGE4hYfzyhGd9pW78H9rlyXu28Q,1189
8
10
  layrz_sdk/entities/action_subkind.py,sha256=lNsX3C_YTI3aui4AIe0lD86IcjAqwfxsUSf7blRbtgA,635
9
- layrz_sdk/entities/asset.py,sha256=NkYk0c1BBv8Vzmanrdc7TRLGAhZ93FEZqQ3QMwG_yEY,3356
11
+ layrz_sdk/entities/asset.py,sha256=oFfrp5p7qYLi0kRlulL_kyTGxUV2whcEgRyBIAH9RFc,3528
10
12
  layrz_sdk/entities/asset_constants.py,sha256=m2pL4FKgPVVHxGKfmF80xv4W-rTh9NL7ClksfEcFkx8,600
11
13
  layrz_sdk/entities/asset_contact.py,sha256=ptxItpob4VdQeM6qMUtSZgZxBw5DfKp3kVfBVlXpujo,422
12
14
  layrz_sdk/entities/asset_operation_mode.py,sha256=umvmRb8W3kEDUd9dqyKhJ745xe3wssNjPw8gGGcKYO8,551
@@ -65,9 +67,9 @@ layrz_sdk/entities/broadcast/__init__.py,sha256=Q1fIeDj1oAL63Q0JDddkW_FuP826-Im6
65
67
  layrz_sdk/entities/broadcast/payload.py,sha256=ugD5m3zVFZVDfBMkR2WlZTWunn9gZSQ1Ej8YXbeA8Wk,1417
66
68
  layrz_sdk/entities/broadcast/request.py,sha256=MQb9kyDSAMXtp4_sPOamBsYyCVZ02wj8NXmi8IEmM68,260
67
69
  layrz_sdk/entities/broadcast/response.py,sha256=hK3D05pecln9wbkdGr892Kzmd7bMzjsaayPxzJPVHsw,263
68
- layrz_sdk/entities/broadcast/result.py,sha256=07P7cE6LCBpw8jlgmyVsGxBmRpO4A7Jva5hpLh-n5U0,656
70
+ layrz_sdk/entities/broadcast/result.py,sha256=-raIiY1QD_rPOyWnSYHdONNc7VtsRZ_r_DBpUlQuCUc,1462
69
71
  layrz_sdk/entities/broadcast/service.py,sha256=6FBuiHfiWc8J3WtUCLS7wmbhJ9qGXDhi-Fs4N2wgeAk,374
70
- layrz_sdk/entities/broadcast/status.py,sha256=vARwQSH-WWVEPbb_qTTyuENZehSDfvq2ZeUR6iYIJdM,509
72
+ layrz_sdk/entities/broadcast/status.py,sha256=eZMEIL_PmyJ5DFrHOhnvjBXA_LJZtXWUQbZDLamEcao,511
71
73
  layrz_sdk/entities/charts/axis_config.py,sha256=ZvVsjB26FMbbfM9318KaQm3XyiNAkyzz2120fM2DH50,604
72
74
  layrz_sdk/entities/charts/bar_chart.py,sha256=EiQc7g3UlaOxzuoJJBbMdpfYIqew-ElLXYN_1xXpUSk,4910
73
75
  layrz_sdk/entities/charts/chart_alignment.py,sha256=NemdGai33s7mOUe35ye41bo_VvzOnaIz82TloI1BqB0,379
@@ -109,8 +111,8 @@ layrz_sdk/helpers/__init__.py,sha256=5iW3z2m3jrYhvTfxX-p-QTkR9X9oTKfEsbtVOg9jFFY
109
111
  layrz_sdk/helpers/color.py,sha256=dlpMafbM-4Wd9D9hMbbnZJf4ALkpie_ZmBR2Vz_YCmM,1203
110
112
  layrz_sdk/lcl/__init__.py,sha256=U967AWANkL3u_YVxMNAYlh8jkZ6hqHfStacz7yz6sOA,89
111
113
  layrz_sdk/lcl/core.py,sha256=_3uK05I0iwJl63cVWKxt-qFkq0DWggCj5M680GHH5uQ,25161
112
- layrz_sdk-4.0.12.dist-info/licenses/LICENSE,sha256=d5ZrU--lIPER7QByXDKcrtOTOMk1JvN_9FdYDuoWi7Y,1057
113
- layrz_sdk-4.0.12.dist-info/METADATA,sha256=EZ4TLSVWLR-ail082uCcIbVQ5BsG8ae07H7XR6xi9CM,2045
114
- layrz_sdk-4.0.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
115
- layrz_sdk-4.0.12.dist-info/top_level.txt,sha256=yUTMMzfdZ0HDWQH5TaSlFM4xtwmP1fSGxmlL1dmu4l4,10
116
- layrz_sdk-4.0.12.dist-info/RECORD,,
114
+ layrz_sdk-4.0.14.dist-info/licenses/LICENSE,sha256=d5ZrU--lIPER7QByXDKcrtOTOMk1JvN_9FdYDuoWi7Y,1057
115
+ layrz_sdk-4.0.14.dist-info/METADATA,sha256=9pfKdzeUqrLsbNTAmRPo7U_YZ-3ghxpyAu_K4yCWCck,2045
116
+ layrz_sdk-4.0.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
117
+ layrz_sdk-4.0.14.dist-info/top_level.txt,sha256=yUTMMzfdZ0HDWQH5TaSlFM4xtwmP1fSGxmlL1dmu4l4,10
118
+ layrz_sdk-4.0.14.dist-info/RECORD,,