logs-py 2.9.5__py3-none-any.whl → 2.9.6__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 logs-py might be problematic. Click here for more details.

@@ -58,13 +58,13 @@ class CustomField(
58
58
 
59
59
  super().__init__(connection=connection, id=id, ref=ref)
60
60
 
61
- def fromDict(self, ref, formatDict=None) -> None:
61
+ def fromDict(self, ref) -> None:
62
62
  if isinstance(ref, dict) and "type" in ref and isinstance(ref["type"], int):
63
63
  del ref["type"]
64
64
  if isinstance(ref, dict) and "widget" in ref and isinstance(ref["widget"], int):
65
65
  del ref["widget"]
66
66
 
67
- super().fromDict(ref=ref, formatDict=formatDict)
67
+ super().fromDict(ref=ref)
68
68
 
69
69
  @classmethod
70
70
  def _idFromName(cls, name):
LOGS/Entities/Dataset.py CHANGED
@@ -176,7 +176,7 @@ class Dataset(
176
176
 
177
177
  self._files = FileEntry.entriesFromFiles(files)
178
178
 
179
- def fromDict(self, ref, formatDict=None) -> None:
179
+ def fromDict(self, ref) -> None:
180
180
  if isinstance(ref, dict):
181
181
  if "parameters" in ref:
182
182
  self._parameters = self.checkAndConvertNullable(
@@ -210,7 +210,7 @@ class Dataset(
210
210
  )
211
211
  self._noInfo = False
212
212
 
213
- super().fromDict(ref=ref, formatDict=formatDict)
213
+ super().fromDict(ref=ref)
214
214
 
215
215
  def fetchZipSize(self):
216
216
  connection, endpoint, id = self._getConnectionData()
@@ -28,11 +28,11 @@ class FormatMethod(EntityWithStrId, INamedEntity):
28
28
 
29
29
  super().__init__(ref=ref, id=id, connection=connection)
30
30
 
31
- def fromDict(self, ref, formatDict=None) -> None:
31
+ def fromDict(self, ref) -> None:
32
32
  if isinstance(ref, dict) and "from" in ref:
33
33
  ref["parent"] = ref["from"]
34
34
 
35
- super().fromDict(ref=ref, formatDict=formatDict)
35
+ super().fromDict(ref=ref)
36
36
 
37
37
  @property
38
38
  def fullName(self) -> Optional[str]:
@@ -45,12 +45,12 @@ class LabNotebookEntry(
45
45
 
46
46
  super().__init__(ref=ref, id=id, connection=connection)
47
47
 
48
- def fromDict(self, ref, formatDict=None) -> None:
48
+ def fromDict(self, ref) -> None:
49
49
  if isinstance(ref, dict):
50
50
  if "name" in ref:
51
51
  ref["name"] = ref["name"].replace(" > ", "_")
52
52
 
53
- super().fromDict(ref, formatDict)
53
+ super().fromDict(ref)
54
54
 
55
55
  @property
56
56
  def version(self) -> Optional[int]:
LOGS/Entities/Track.py CHANGED
@@ -26,7 +26,7 @@ class Track(Generic[_T], ConnectedEntity):
26
26
  _dataIds: Optional[dict] = None
27
27
  _datatracks: Optional[_T] = None
28
28
 
29
- def fromDict(self, ref, formatDict=None) -> None:
29
+ def fromDict(self, ref) -> None:
30
30
  if isinstance(ref, dict):
31
31
  if "data" in ref:
32
32
  if "type" in ref:
@@ -35,7 +35,7 @@ class Track(Generic[_T], ConnectedEntity):
35
35
 
36
36
  ref["data"] = None
37
37
 
38
- super().fromDict(ref, formatDict)
38
+ super().fromDict(ref)
39
39
 
40
40
  def __str__(self):
41
41
  s = (" name:'%s'" % getattr(self, "name")) if hasattr(self, "name") else ""
@@ -2,7 +2,6 @@ import inspect
2
2
  import json
3
3
  import math
4
4
  import random
5
- from copy import deepcopy
6
5
  from datetime import datetime
7
6
  from enum import Enum
8
7
  from typing import (
@@ -32,7 +31,12 @@ _T = TypeVar("_T")
32
31
  class SerializeableContent:
33
32
  _noSerialize: List[str] = []
34
33
  _typeMapper: Optional[Dict[str, Any]] = None
35
- _planeClass = False
34
+ _slack: Dict[str, Any] = {}
35
+
36
+ _planeClass: bool = False
37
+ _includeNone: bool = False
38
+ _debugPrintRef: bool = False
39
+ _includeSlack: bool = False
36
40
 
37
41
  def __init__(self, ref=None):
38
42
  if ref != None:
@@ -45,11 +49,10 @@ class SerializeableContent:
45
49
  self,
46
50
  ref,
47
51
  selfClass,
48
- fromInstance=None,
49
- fromDict=None,
50
- formatDict=None,
51
52
  convertOtherType: Optional[Tuple[type, Callable[[Any], Any]]] = None,
52
53
  ):
54
+ if self._debugPrintRef:
55
+ print("FromRef", selfClass.__name__, "\n", self._dictToJson(ref))
53
56
  # print("FromRef", selfClass.__name__, self._json_schema)
54
57
 
55
58
  # if not isinstance(ref, (selfClass, dict)) and convertOtherType:
@@ -58,10 +61,7 @@ class SerializeableContent:
58
61
  ref = convertOtherType[1](ref)
59
62
 
60
63
  if isinstance(ref, selfClass):
61
- if fromInstance:
62
- fromInstance(ref)
63
- else:
64
- self.fromInstance(ref)
64
+ self.fromInstance(ref)
65
65
  elif isinstance(ref, dict):
66
66
  if hasattr(self, "_typeMapper") and self._typeMapper:
67
67
  for k, t in self._typeMapper.items():
@@ -75,10 +75,7 @@ class SerializeableContent:
75
75
  elements=ref, fieldName=k, fieldType=t, allowNone=True
76
76
  )
77
77
 
78
- if fromDict:
79
- fromDict(ref)
80
- else:
81
- self.fromDict(ref, formatDict=formatDict)
78
+ self.fromDict(ref)
82
79
  else:
83
80
  types: List[type] = [dict, type(self)]
84
81
  if convertOtherType:
@@ -99,21 +96,22 @@ class SerializeableContent:
99
96
  attrList = self._getAttrList()
100
97
  for k in attrList:
101
98
  if hasattr(ref, k):
102
- setattr(self, k, getattr(ref, k))
103
-
104
- def fromDict(self, ref, formatDict=None) -> None:
105
- if formatDict:
106
- ref = deepcopy(ref)
107
- ref = formatDict(ref)
108
- if ref == None:
109
- ref = {}
110
-
111
- # if "type" in ref:
112
- # self.type = ref["type"]
99
+ try:
100
+ setattr(self, k, getattr(ref, k))
101
+ except AttributeError:
102
+ pass
113
103
 
114
- # self.validateDict(ref)
104
+ def fromDict(self, ref) -> None:
115
105
  # print("ref", ref)
116
106
  # print("ref", type(self).__name__)
107
+ if not hasattr(self, "_noSerialize"):
108
+ self._noSerialize = []
109
+
110
+ mappedKey = {
111
+ k: False
112
+ for k, v in ref.items()
113
+ if v is not None and k not in self._noSerialize
114
+ }
117
115
 
118
116
  for k in dir(self):
119
117
  # print(
@@ -123,19 +121,27 @@ class SerializeableContent:
123
121
  # "->",
124
122
  # ref[k] if k in ref else "NULL",
125
123
  # )
126
- if k in ref and hasattr(self, k) and not callable(getattr(self, k)):
124
+
125
+ try:
126
+ hasAttr = hasattr(self, k)
127
+ except (
128
+ EntityIncompleteException
129
+ ): # while deserializing we want to ignore incomplete fields
130
+ hasAttr = False
131
+
132
+ if k in ref and hasAttr and not callable(getattr(self, k)):
127
133
  try:
128
134
  # print(" ", k, "->", ref[k])
129
135
  setattr(self, k, ref[k])
136
+ mappedKey[k] = True
130
137
  except AttributeError as e:
131
138
  # print(f"[{type(self).__name__}] ERROR:", k, "->", ref[k], e)
132
139
  pass
133
140
 
134
- # This is the old way to check if settable: checks if a private attr exists and sets this
135
- # setattr(self, k, [])
136
- # if hasattr(self, _k) and not callable(getattr(self, _k)) and k in ref:
137
- # print(k, "->", ref[k])
138
- # setattr(self, _k, ref[k])
141
+ self._slack = {k: ref[k] for k, v in mappedKey.items() if not v}
142
+
143
+ # if self._slack:
144
+ # print(type(self).__name__, "->", ", ".join(self._slack.keys()))
139
145
 
140
146
  @classmethod
141
147
  def toBaseclassString(cls, obj):
@@ -148,11 +154,13 @@ class SerializeableContent:
148
154
  def toString(self):
149
155
  return str(self)
150
156
 
151
- @classmethod
152
- def _serializeItem(cls, item):
157
+ def _serializeItem(self, item):
153
158
  # print("serialize", item, hasattr(item, "__dict__"))
154
159
  if hasattr(item, "toDict"):
155
- return item.toDict()
160
+ if self._includeSlack and hasattr(item, "_toDictWithSlack"):
161
+ return item._toDictWithSlack()
162
+ else:
163
+ return item.toDict()
156
164
  if isinstance(item, cast(Any, np.float32)):
157
165
  return item.item()
158
166
  elif hasattr(
@@ -199,6 +207,13 @@ class SerializeableContent:
199
207
 
200
208
  return result
201
209
 
210
+ def _toDictWithSlack(self):
211
+ tmp = self._includeSlack
212
+ self._includeSlack = True
213
+ result = self.toDict()
214
+ self._includeSlack = tmp
215
+ return result
216
+
202
217
  def toDict(self) -> Dict[str, Any]:
203
218
  # print("toDict", type(self).__name__)
204
219
  if not hasattr(self, "_noSerialize"):
@@ -233,9 +248,12 @@ class SerializeableContent:
233
248
  # d[k] = "2021-12-01T00:00:00.000Z"
234
249
  elif isinstance(a, Enum):
235
250
  d[k] = a.value
236
- elif a != None:
251
+ elif a != None or self._includeNone:
237
252
  d[k] = self._serializeItem(a)
238
253
 
254
+ if self._includeSlack:
255
+ d.update({k: v for k, v in self._slack.items() if k not in d})
256
+
239
257
  return d
240
258
 
241
259
  @classmethod
@@ -274,8 +292,12 @@ class SerializeableContent:
274
292
  self.toDict(), indent=indent, sort_keys=sort_keys, compact=compact
275
293
  )
276
294
 
277
- def printJson(self, validate=False):
278
- print(self.toJson(validate=validate))
295
+ def printJson(self, indent=2, sort_keys=True, compact=False, validate=False):
296
+ print(
297
+ self.toJson(
298
+ validate=validate, indent=indent, sort_keys=sort_keys, compact=compact
299
+ )
300
+ )
279
301
 
280
302
  @classmethod
281
303
  def truncString(cls, text: str, length: int = 30) -> str:
@@ -515,11 +537,14 @@ class SerializeableContent:
515
537
  excludeCharacters.append("line feed")
516
538
  for k in text.keys():
517
539
  if k not in excludeKeys:
518
- text[k], messages = cls.replaceControlCharacters(
519
- text[k],
520
- excludeKeys=excludeKeys,
521
- excludeCharacters=excludeCharacters,
522
- mergeMessages=mergeMessages,
540
+ text[k], messages = cast(
541
+ Any,
542
+ cls.replaceControlCharacters(
543
+ text[k],
544
+ excludeKeys=excludeKeys,
545
+ excludeCharacters=excludeCharacters,
546
+ mergeMessages=mergeMessages,
547
+ ),
523
548
  )
524
549
  if messages:
525
550
  for m in messages:
@@ -1,5 +1,5 @@
1
1
  from dataclasses import dataclass
2
- from typing import TYPE_CHECKING, Optional
2
+ from typing import TYPE_CHECKING, Dict, Optional
3
3
 
4
4
  from LOGS.Auxiliary import Tools
5
5
  from LOGS.Interfaces.IEntityInterface import IEntityInterface
@@ -14,10 +14,10 @@ class IPermissionedEntityRequest:
14
14
 
15
15
 
16
16
  class IPermissionedEntity(IEntityInterface):
17
- _permissions: Optional[dict[str, bool]] = None
17
+ _permissions: Optional[Dict[str, bool]] = None
18
18
 
19
19
  @property
20
- def permissions(self) -> Optional[dict[str, bool]]:
20
+ def permissions(self) -> Optional[Dict[str, bool]]:
21
21
  return self._permissions
22
22
 
23
23
  @permissions.setter
@@ -14,7 +14,8 @@ _Relations = TypeVar("_Relations", bound=IRelationModel)
14
14
 
15
15
  @dataclass
16
16
  class IRelatedEntity(Generic[_Relations], IEntityInterface):
17
- _relationType: Optional[Type[_Relations]] = None
17
+ # The expression here should be _relationType: Optional[Type[_Relations]] = None, but it is not working
18
+ _relationType: Optional[Type] = None
18
19
  _relations: Optional[_Relations] = None
19
20
 
20
21
  @property
@@ -29,6 +30,6 @@ class IRelatedEntity(Generic[_Relations], IEntityInterface):
29
30
  % (type(self).__name__)
30
31
  )
31
32
 
32
- self._createdOn = Tools.checkAndConvert(
33
+ self._relations = Tools.checkAndConvert(
33
34
  value, self._relationType, "relations", allowNone=True
34
35
  )
LOGS/LOGS.py CHANGED
@@ -352,7 +352,8 @@ class LOGS:
352
352
  raise EntityNotFoundException(entities[0])
353
353
 
354
354
  data, responseError = self._connection.putEndpoint(
355
- entityType._endpoint + [str(entities[0].id)], data=entities[0].toDict()
355
+ entityType._endpoint + [str(entities[0].id)],
356
+ data=entities[0]._toDictWithSlack(),
356
357
  )
357
358
  if (
358
359
  isinstance(data, dict)
@@ -364,7 +365,7 @@ class LOGS:
364
365
  else:
365
366
  data, responseError = self._connection.postEndpoint(
366
367
  entityType._endpoint + ["bulk_edit"],
367
- data=[e.toDict() for e in entities],
368
+ data=[e._toDictWithSlack() for e in entities],
368
369
  )
369
370
  if (
370
371
  isinstance(data, dict)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: logs-py
3
- Version: 2.9.5
3
+ Version: 2.9.6
4
4
  Summary: A python interface for the LOGS public API
5
5
  Home-page: https://docs.logs-python.com
6
6
  Author: Sina Kazemi
@@ -15,7 +15,7 @@ Requires-Python: >=3.8
15
15
  Description-Content-Type: text/markdown
16
16
  Requires-Dist: numpy
17
17
  Requires-Dist: requests
18
- Requires-Dist: regex >=2019.12.9
18
+ Requires-Dist: regex>=2019.12.9
19
19
  Requires-Dist: Pillow
20
20
  Requires-Dist: deprecation
21
21
 
@@ -1,4 +1,4 @@
1
- LOGS/LOGS.py,sha256=qprzwI6wXx2xePkT6EBmWYYiCxwMIPnC9LNa-3NnBIE,41826
1
+ LOGS/LOGS.py,sha256=rTYbIvms7szm2DxRJyxppxgBWZ6ztUzB6-peARcK02o,41863
2
2
  LOGS/LOGSConnection.py,sha256=GOkmFj7CtCinn9SmRkzzdToaZqnmUaiqwuMI0mQGvCo,19845
3
3
  LOGS/ServerMetaData.py,sha256=WdXCCiCSFqER6s9c3N3v0O273OvxygxBzmE6_C8FmXs,3361
4
4
  LOGS/__init__.py,sha256=faGD87i0eeKbqEq6DTcteF6KoNa2O0BH1RnjxEvuGbQ,253
@@ -23,7 +23,7 @@ LOGS/Entities/BridgeRelations.py,sha256=nI6mqu_BIDt01tKHKyK38COHhpqrRHCi8wyy9Iyw
23
23
  LOGS/Entities/BridgeRequestParameter.py,sha256=m0C3iQLYZppFChj4lQ9cteAdDtpDClyrcBM9OAdryHM,838
24
24
  LOGS/Entities/BridgeType.py,sha256=YB55JKJtS38fAlRb5T_OIPvT2qTJIzUC6uoC24eq3sE,88
25
25
  LOGS/Entities/Bridges.py,sha256=WgspgZ9zXxi9tDPg4JPsDLq-fvNQkiaUbKEfbz1iG7E,420
26
- LOGS/Entities/CustomField.py,sha256=jUvaEHdWiVnimao8sD1sgKvYDMqP5GOSO42aag7oiaY,5219
26
+ LOGS/Entities/CustomField.py,sha256=wvGcMyjwRku8HhnvPboEkSuG_oUgNeSlzRWm8SQZusM,5179
27
27
  LOGS/Entities/CustomFieldEnums.py,sha256=JNvaMmvzDKaoI504XgE8pjKrpzE0sZ6j9jA6fi-tZzM,520
28
28
  LOGS/Entities/CustomFieldMinimal.py,sha256=GrfKIeyE1Bp4vvCA1zVoN9Hp73Vlt0Vw7z5wUKBhpvQ,266
29
29
  LOGS/Entities/CustomFieldRequestParameter.py,sha256=lIkSRNteqOMFtkfv5c-6MT6FhHDlXlqAQG6NUf5Gb0U,1307
@@ -37,7 +37,7 @@ LOGS/Entities/DataSourceRelations.py,sha256=eIszpHjZqz6v4WyhaPNu8efSzedsJLNrYR9b
37
37
  LOGS/Entities/DataSourceRequestParameter.py,sha256=zAfC61NvVt4XO3HhIy1PLViN3AEBJo7Q6Fa_EtyqNvA,1610
38
38
  LOGS/Entities/DataSourceStatus.py,sha256=81IAcLhdvkrAxgcL1Hw47aJqiZ0Vb7UnZUj-UEo8wX0,430
39
39
  LOGS/Entities/DataSources.py,sha256=UU5ey98_vX4WQknyWITMy-dPOV-wgjblXxu5uXpnVso,481
40
- LOGS/Entities/Dataset.py,sha256=JQk_7vdpmkjztZ8247V2_tifTi3WXwvbDdQOp3oVtbk,21915
40
+ LOGS/Entities/Dataset.py,sha256=V7W2zT6JnCwOUaEvjpiRjF6jygUNE9iqS6JF3-qEkl4,21875
41
41
  LOGS/Entities/DatasetCreator.py,sha256=vWTSGk5zM7xXvI8n9mldeS96SN0atF2e04lwol7CWqo,5084
42
42
  LOGS/Entities/DatasetInfo.py,sha256=VnobiT04yd9GSZQ6tH8eUrO9jknzfLW9-wvMz-QAhTw,3882
43
43
  LOGS/Entities/DatasetMatchTypes.py,sha256=f8v5bYEWiDMVBbEKONEDg2jm-Qp-WVbuBLyJ5SlMv9c,4373
@@ -76,7 +76,7 @@ LOGS/Entities/FormatInstrumentMinimal.py,sha256=QVRrJws-qZhy2h4aEXvbIe9pS6Jig7-5
76
76
  LOGS/Entities/FormatInstrumentRequestParameter.py,sha256=dDZBtaexM1BRVmrCLLozD80V9Lp-1NzM4PehPPtxPgs,241
77
77
  LOGS/Entities/FormatInstruments.py,sha256=kA5EWMvU2ERfCJrubBR8-E0pYaM8lhOPSqva8TDgU_8,545
78
78
  LOGS/Entities/FormatMetaData.py,sha256=s44Yhn_rxJTdRg8OYRmrVK7FJWgeB76HcvELZNXRXw8,2111
79
- LOGS/Entities/FormatMethod.py,sha256=1IPwKndK6DpWga_AQkeZTKNhrwxgLzCds3A0ZYXFzhE,1843
79
+ LOGS/Entities/FormatMethod.py,sha256=LYE01rU2kIzbzRwKLPwVyKAv3WcasbwMjsy31HP8TT8,1803
80
80
  LOGS/Entities/FormatMethodMinimal.py,sha256=GS4f8GmX6YRrBVxWugeHnBgiuGRjjtVeNQamqMx0IBs,271
81
81
  LOGS/Entities/FormatMethodRequestParameter.py,sha256=-s5xFzAUGSp3FFilS5EByWhT0iv5grquZQ8NfmS3xE8,237
82
82
  LOGS/Entities/FormatMethods.py,sha256=9GXFYed_o0YRYc2R_W2J6kHSyLqyl6G9Is_PMXRVZ5s,486
@@ -97,7 +97,7 @@ LOGS/Entities/InstrumentRelations.py,sha256=sXlLo_TQiRnkWAOkAAYlYxqquas9KBVEJVW6
97
97
  LOGS/Entities/InstrumentRequestParameter.py,sha256=mDPAtXMHVLaYiGnXSUVXGzitG6xFMr75FzCOLD5sUME,1433
98
98
  LOGS/Entities/Instruments.py,sha256=0KgCWU5J9nFOM9qQw5s6tRyAdnCzOnjuvAtSwpdbyiU,453
99
99
  LOGS/Entities/LabNotebookEntries.py,sha256=zbP78OV-pD2Yrg6bxQSU4e12AJd-ZqbPn1n5QGykTro,542
100
- LOGS/Entities/LabNotebookEntry.py,sha256=H_TFNLKqg5zGePhD9UPqsZ2-fOjlWnaMQSiSNkPEI0A,2911
100
+ LOGS/Entities/LabNotebookEntry.py,sha256=4oZE6Z-iXMRITz4wZZcvEbJjPcd29RBth6bFJ4qtmQE,2882
101
101
  LOGS/Entities/LabNotebookEntryMinimal.py,sha256=2VbggIr1QnKT_VFizupZH6ubIsD-PntL7HOH7rHuzzs,291
102
102
  LOGS/Entities/LabNotebookEntryRelations.py,sha256=SljETldOvUZ6xCaywxGxwEKEZnz0ONwEnPlsY4SZkOo,2608
103
103
  LOGS/Entities/LabNotebookEntryRequestParameter.py,sha256=bLuF6ysxBWvJCxLbRvPoyfEnJuY-ZqWdJkgm2vu76nU,2769
@@ -138,7 +138,7 @@ LOGS/Entities/SampleTypeMinimal.py,sha256=e5bJ2ZJwJu9fMugaXrp9MxBsPkpNEihhx0fWnc
138
138
  LOGS/Entities/SampleTypeRequestParameter.py,sha256=uWkYftn9c0iin0i2JobawECEUmCjsX8dSh0jXswDo58,222
139
139
  LOGS/Entities/SampleTypes.py,sha256=cdkSBl5eZMTf431TZBCsfnKQ45QZGVys9CcXKkPTXL4,459
140
140
  LOGS/Entities/Samples.py,sha256=fAOp5MvHnACilEF0gehmdmLD3-gdvDEZAFAHitm3ib0,414
141
- LOGS/Entities/Track.py,sha256=a72Qiq5ZjvifqbBc2y7IfKhJspRWltBXxKR9_HEC_LQ,2782
141
+ LOGS/Entities/Track.py,sha256=Yy7MHq1XvhDy3S8r9PkfxEjtTC-u1Gd64x6Mf0W45GU,2753
142
142
  LOGS/Entities/TrackData.py,sha256=0qNQIVQPeNWex8L8d12lXlbGvihezJRfAZY0ghdd-yc,287
143
143
  LOGS/Entities/TrackSettings.py,sha256=UITmvJ1a4Ru3D0arIU1A5fa4682xb9aOwCm2bkqy52M,1028
144
144
  LOGS/Entities/TrackXY.py,sha256=rffrNVR8DbQpWcjQpFMM1_7OnefKEE7UzVWBPfYaRp0,1186
@@ -159,7 +159,7 @@ LOGS/Entity/EntityRelations.py,sha256=zaAASS5SVDwPVMUyNgUH8DcZhWdErRulrZjD6MAWlh
159
159
  LOGS/Entity/EntityRequestParameter.py,sha256=RH6-Sh8ug3aeq_AOFHs0Lp2J94cKI9Ts3slAATZ1tNA,828
160
160
  LOGS/Entity/EntityWithIntId.py,sha256=B79VqAQ9I0uEQwbf3DMHXoi064gCw4fv3vCKoXwrHQM,631
161
161
  LOGS/Entity/EntityWithStrId.py,sha256=5hz8-F_t_X4kf85DMwW3DJ2NqH_RiRV1Io1WiMN11yk,631
162
- LOGS/Entity/SerializeableContent.py,sha256=pW9I51n5GyDM5oGCzFI_FoS1g2HJ-DipkzEDalvtVZ4,19115
162
+ LOGS/Entity/SerializeableContent.py,sha256=-mtqAnIdwIkhymaHGpRK8ZEBYUYDN-e0CvcLfGmfdrI,19975
163
163
  LOGS/Entity/__init__.py,sha256=8q6dB_AqlLGx-6PexFn8QH7LWOnSGRhgPfFVkYAghR0,749
164
164
  LOGS/Interfaces/ICreationRecord.py,sha256=SpACPwz2zA60pkApErZelUOsPq40fHAfiFW3vm9qW9k,1461
165
165
  LOGS/Interfaces/ICustomField.py,sha256=rAMnUKW9wMxgUfkXUFECCclggYt9aGKgXlIep67sEo4,726
@@ -168,16 +168,16 @@ LOGS/Interfaces/IModificationRecord.py,sha256=SGXtCMHLCsH3pS199jr6QaxSD3LpGUXbNO
168
168
  LOGS/Interfaces/INamedEntity.py,sha256=ds0qM8BGIr0Ii_sdIYZ7cG-8Mh0jeyTPbzEcQ_dRnbk,559
169
169
  LOGS/Interfaces/IOwnedEntity.py,sha256=JmrTl3SI-ResGN5GQAiK_P1U5uoFwlEGep-lJ-9LdyQ,688
170
170
  LOGS/Interfaces/IPaginationRequest.py,sha256=L0A5rul1B9r-g-xRqoPjLeDM0lpYXecLCJFaBQXkao8,210
171
- LOGS/Interfaces/IPermissionedEntity.py,sha256=xZra5oZ0TXNL9brqF7DJSbfFVGlfF118MrLFMwJGQQU,671
171
+ LOGS/Interfaces/IPermissionedEntity.py,sha256=52xIkASjoszIh277rtYEvPZ_WRezhDPyRQug8OAZweI,677
172
172
  LOGS/Interfaces/IProjectBased.py,sha256=dXmqBD6s4f8p0Eig_JqP4heqvo53Uq3cBz7SvHae_DA,863
173
- LOGS/Interfaces/IRelatedEntity.py,sha256=Gg0dHtnTu5ykh874Lea7FxWmZz2Dw8BLyoyRi60q4VI,1012
173
+ LOGS/Interfaces/IRelatedEntity.py,sha256=fcqlbACgtfBco7Zg_OgmxS7WnxogbOTAb6NkGa-PC6I,1108
174
174
  LOGS/Interfaces/IRelationModel.py,sha256=oKwB7FOlf4ygD08zuUdow5BL4OncA8r2DK1xpK4K3h0,78
175
175
  LOGS/Interfaces/IRelationRequest.py,sha256=NGSBLyKD4G341giLfPMd1NH0RmeXKnxcAWHAwsrZsXI,283
176
176
  LOGS/Interfaces/ISoftDeletable.py,sha256=urnmSfcYJrEm1iIo0k3nyBvMMnpomJWAYAON_uvSX64,672
177
177
  LOGS/Interfaces/ITypedEntity.py,sha256=hMlzGuca8vW1qT5Dop-b-6_gteAeXjK0sz85eRjOZrY,724
178
178
  LOGS/Interfaces/IUniqueEntity.py,sha256=K-Q80qZX1wTjPnjbs-1PF85BbzYre2su_2xMnescYi4,1894
179
179
  LOGS/Interfaces/__init__.py,sha256=tGykqoQeT2_HV-oLYVKJJ9Z0a_Li8_y3AOJjG1btKYw,172
180
- logs_py-2.9.5.dist-info/METADATA,sha256=6bkXJDjYrX9PmjMj7EdqAzJASSnuZ0DdBKnEh4glNEs,2053
181
- logs_py-2.9.5.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
182
- logs_py-2.9.5.dist-info/top_level.txt,sha256=Ckn2LiAmGaR7k3tdEnKAc04z_uboMD4gLreYghRNdCs,5
183
- logs_py-2.9.5.dist-info/RECORD,,
180
+ logs_py-2.9.6.dist-info/METADATA,sha256=A-tvm1iJ2b4o7ULJ8fV502Sf64IifTF9AAExPAX_Ozk,2052
181
+ logs_py-2.9.6.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
182
+ logs_py-2.9.6.dist-info/top_level.txt,sha256=Ckn2LiAmGaR7k3tdEnKAc04z_uboMD4gLreYghRNdCs,5
183
+ logs_py-2.9.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.0)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5