runtimepy 5.11.2__py3-none-any.whl → 5.11.4__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.
runtimepy/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # =====================================
2
2
  # generator=datazen
3
3
  # version=3.1.4
4
- # hash=c5b165c61995fe302ea31f7500b6359f
4
+ # hash=e4bd25a4e8683a203d0244d24322fe41
5
5
  # =====================================
6
6
 
7
7
  """
@@ -10,7 +10,7 @@ Useful defaults and other package metadata.
10
10
 
11
11
  DESCRIPTION = "A framework for implementing Python services."
12
12
  PKG_NAME = "runtimepy"
13
- VERSION = "5.11.2"
13
+ VERSION = "5.11.4"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -440,5 +440,6 @@ class BaseChannelEnvironment(_NamespaceMixin, FinalizeMixin):
440
440
 
441
441
  for fields in self.to_add:
442
442
  self.fields.add(fields)
443
+ self.to_add = []
443
444
 
444
445
  super().finalize(strict=strict)
@@ -91,10 +91,10 @@ def sample_fields(env: ChannelEnvironment, enum: str = "SampleEnum") -> None:
91
91
  env.int_channel("raw", prim)
92
92
 
93
93
  # Add a bit field and flag.
94
- env.add_field(BitFlag("flag1", prim, 0))
94
+ env.add_field(BitFlag(env.namespace(name="flag1"), prim, 0))
95
95
  env.add_field(
96
96
  BitFlag(
97
- "flag2",
97
+ env.namespace(name="flag2"),
98
98
  prim,
99
99
  1,
100
100
  commandable=True,
@@ -103,7 +103,7 @@ def sample_fields(env: ChannelEnvironment, enum: str = "SampleEnum") -> None:
103
103
  )
104
104
  env.add_field(
105
105
  BitField(
106
- "field1",
106
+ env.namespace(name="field1"),
107
107
  prim,
108
108
  2,
109
109
  2,
@@ -112,7 +112,11 @@ def sample_fields(env: ChannelEnvironment, enum: str = "SampleEnum") -> None:
112
112
  description="Sample bit field.",
113
113
  )
114
114
  )
115
- env.add_field(BitField("field2", prim, 4, 4, commandable=True))
115
+ env.add_field(
116
+ BitField(
117
+ env.namespace(name="field2"), prim, 4, 4, commandable=True
118
+ )
119
+ )
116
120
 
117
121
 
118
122
  def sample_float(
@@ -21,7 +21,7 @@ from runtimepy.enum import RuntimeEnum as _RuntimeEnum
21
21
  from runtimepy.enum.registry import EnumRegistry as _EnumRegistry
22
22
  from runtimepy.primitives import AnyPrimitive as _AnyPrimitive
23
23
  from runtimepy.primitives import Primitivelike as _Primitivelike
24
- from runtimepy.primitives import create as _create
24
+ from runtimepy.primitives import normalize_instance as _normalize_instance
25
25
  from runtimepy.primitives.array import PrimitiveArray
26
26
  from runtimepy.primitives.byte_order import (
27
27
  DEFAULT_BYTE_ORDER as _DEFAULT_BYTE_ORDER,
@@ -40,7 +40,7 @@ class FieldSpec(NamedTuple):
40
40
  """Information specifying a protocol field."""
41
41
 
42
42
  name: str
43
- kind: _Primitivelike
43
+ kind: str
44
44
  enum: _Optional[_RegistryKey] = None
45
45
  array_length: _Optional[int] = None
46
46
 
@@ -49,7 +49,7 @@ class FieldSpec(NamedTuple):
49
49
 
50
50
  result: _JsonObject = {
51
51
  "name": self.name,
52
- "kind": _create(self.kind).kind.name,
52
+ "kind": self.kind,
53
53
  "array_length": self.array_length,
54
54
  }
55
55
  if self.enum is not None:
@@ -58,7 +58,7 @@ class FieldSpec(NamedTuple):
58
58
 
59
59
 
60
60
  T = _TypeVar("T", bound="ProtocolBase")
61
- ProtocolBuild = list[_Union[int, FieldSpec, tuple[str, int]]]
61
+ ProtocolBuild = list[_Union[tuple[int, str], FieldSpec, tuple[str, int]]]
62
62
 
63
63
 
64
64
  class ProtocolBase(PrimitiveArray):
@@ -114,16 +114,15 @@ class ProtocolBase(PrimitiveArray):
114
114
  if build is None:
115
115
  build = []
116
116
  for item in build:
117
- if isinstance(item, int):
118
- self._add_bit_fields(self._fields.fields[item])
119
- elif isinstance(item, FieldSpec):
117
+ if isinstance(item, FieldSpec):
120
118
  self.add_field(
121
119
  item.name,
122
120
  item.kind,
123
121
  enum=item.enum,
124
122
  array_length=item.array_length,
125
123
  )
126
- else:
124
+
125
+ elif isinstance(item[0], str):
127
126
  assert serializables, (item, serializables)
128
127
  name = item[0]
129
128
  self.add_serializable(
@@ -133,6 +132,11 @@ class ProtocolBase(PrimitiveArray):
133
132
  )
134
133
  del serializables[name]
135
134
 
135
+ elif isinstance(item[0], int):
136
+ self._add_bit_fields(
137
+ item[1], self._fields.fields[item[0]], index=item[0]
138
+ )
139
+
136
140
  # Ensure all serializables were handled via build.
137
141
  assert not serializables, serializables
138
142
 
@@ -169,15 +173,18 @@ class ProtocolBase(PrimitiveArray):
169
173
 
170
174
  instances = self.add_to_end(serializable, array_length=array_length)
171
175
  self._build.append((name, len(instances)))
176
+
177
+ assert name not in self.serializables, name
172
178
  self.serializables[name] = instances
173
179
 
174
180
  def add_field(
175
181
  self,
176
182
  name: str,
177
- kind: _Primitivelike = None,
183
+ kind: _Primitivelike | _Optional[_AnyPrimitive] = None,
178
184
  enum: _RegistryKey = None,
179
185
  serializable: Serializable = None,
180
186
  array_length: int = None,
187
+ track: bool = True,
181
188
  ) -> None:
182
189
  """Add a new field to the protocol."""
183
190
 
@@ -201,30 +208,39 @@ class ProtocolBase(PrimitiveArray):
201
208
  kind = runtime_enum.primitive
202
209
 
203
210
  assert kind is not None
211
+ inst = _normalize_instance(kind)
204
212
 
205
- self._regular_fields[name] = self.add(
206
- _create(kind), array_length=array_length
207
- )
213
+ assert name not in self._regular_fields, name
214
+ self._regular_fields[name] = self.add(inst, array_length=array_length)
208
215
 
209
- self._build.append(
210
- FieldSpec(name, kind, enum, array_length=array_length)
211
- )
216
+ if track:
217
+ self._build.append(
218
+ FieldSpec(
219
+ name, inst.kind.name, enum, array_length=array_length
220
+ )
221
+ )
212
222
 
213
- def _add_bit_fields(self, fields: _BitFields) -> None:
223
+ def _add_bit_fields(
224
+ self, name: str, fields: _BitFields, index: int = None
225
+ ) -> None:
214
226
  """Add a bit-fields instance."""
215
227
 
216
- self._build.append(self._fields.add(fields))
217
- self.add(fields.raw)
228
+ # If the index is known, these fields are already registered.
229
+ if index is None:
230
+ index = self._fields.add(fields)
231
+
232
+ self._build.append((index, name))
233
+ self.add_field(name, kind=fields.raw, track=False)
218
234
 
219
235
  @contextmanager
220
236
  def add_bit_fields(
221
- self, kind: _Primitivelike = "uint8"
237
+ self, name: str, kind: _Primitivelike | _AnyPrimitive = "uint8"
222
238
  ) -> _Iterator[_BitFields]:
223
239
  """Add a bit-fields primitive to the protocol."""
224
240
 
225
241
  new = _BitFields.new(value=kind)
226
242
  yield new
227
- self._add_bit_fields(new)
243
+ self._add_bit_fields(name, new)
228
244
 
229
245
  def value(
230
246
  self, name: str, resolve_enum: bool = True, index: int = 0
@@ -79,7 +79,9 @@ class JsonProtocol(ProtocolBase):
79
79
  )
80
80
 
81
81
  # Export the build specification.
82
- build: list[_Union[int, _JsonObject, str, tuple[str, int]]] = []
82
+ build: list[
83
+ _Union[tuple[int, str], _JsonObject, str, tuple[str, int]]
84
+ ] = []
83
85
  for item in self._build:
84
86
  if isinstance(item, FieldSpec):
85
87
  build.append(item.asdict())
@@ -3,6 +3,7 @@ A basic type-system implementation.
3
3
  """
4
4
 
5
5
  # built-in
6
+ from contextlib import suppress
6
7
  from typing import Iterable, Optional, Union
7
8
 
8
9
  # third-party
@@ -10,15 +11,14 @@ from vcorelib.logging import LoggerMixin
10
11
  from vcorelib.namespace import CPP_DELIM, Namespace
11
12
 
12
13
  # internal
13
- from runtimepy import PKG_NAME
14
14
  from runtimepy.codec.protocol import Protocol
15
15
  from runtimepy.enum import RuntimeEnum
16
- from runtimepy.enum.registry import (
17
- DEFAULT_ENUM_PRIMITIVE,
18
- EnumRegistry,
19
- RuntimeIntEnum,
16
+ from runtimepy.enum.registry import DEFAULT_ENUM_PRIMITIVE, RuntimeIntEnum
17
+ from runtimepy.primitives.byte_order import (
18
+ DEFAULT_BYTE_ORDER,
19
+ ByteOrder,
20
+ enum_registry,
20
21
  )
21
- from runtimepy.primitives.byte_order import DEFAULT_BYTE_ORDER, ByteOrder
22
22
  from runtimepy.primitives.types import AnyPrimitiveType, PrimitiveTypes
23
23
  from runtimepy.registry.name import RegistryKey
24
24
  from runtimepy.util import Identifier
@@ -54,7 +54,7 @@ class TypeSystem(LoggerMixin):
54
54
  self.custom: dict[str, Protocol] = {}
55
55
  self.custom_ids = Identifier(scale=1)
56
56
 
57
- self._enums = EnumRegistry()
57
+ self._enums = enum_registry(register_byte_order=False)
58
58
 
59
59
  global_namespace = Namespace(delim=CPP_DELIM)
60
60
 
@@ -65,12 +65,22 @@ class TypeSystem(LoggerMixin):
65
65
  self.root_namespace = global_namespace
66
66
 
67
67
  # Register enums.
68
- with self.root_namespace.pushed(PKG_NAME):
69
- for enum in [ByteOrder]:
70
- self.runtime_int_enum(enum)
68
+ for enum in [ByteOrder]:
69
+ self.runtime_int_enum(enum)
71
70
 
72
71
  self.root_namespace = global_namespace.child(*namespace)
73
72
 
73
+ def is_enum(self, name: str, *namespace: str, exact: bool = True) -> bool:
74
+ """Determine if the arguments identify a registered enumeration."""
75
+
76
+ result = False
77
+
78
+ with suppress(KeyError, AssertionError):
79
+ self.get_enum(name, *namespace, exact=exact)
80
+ result = True
81
+
82
+ return result
83
+
74
84
  def get_enum(
75
85
  self, name: str, *namespace: str, exact: bool = True
76
86
  ) -> RuntimeEnum:
@@ -120,6 +130,19 @@ class TypeSystem(LoggerMixin):
120
130
  self.custom[resolved] = new_type
121
131
  return new_type
122
132
 
133
+ def is_custom(
134
+ self, name: str, *namespace: str, exact: bool = True
135
+ ) -> bool:
136
+ """Determine if the parameters identify a custom type."""
137
+
138
+ result = False
139
+
140
+ with suppress(KeyError, AssertionError):
141
+ self.get_protocol(name, *namespace, exact=exact)
142
+ result = True
143
+
144
+ return result
145
+
123
146
  def get_protocol(
124
147
  self, name: str, *namespace: str, exact: bool = True
125
148
  ) -> Protocol:
@@ -100,14 +100,5 @@ class RuntimeIntEnum(_IntEnum):
100
100
  data["id"] = ident
101
101
 
102
102
  result = registry.register_dict(name, data)
103
- assert result is not None
103
+ assert result is not None, (name, data)
104
104
  return result
105
-
106
-
107
- def enum_registry(*kinds: type[RuntimeIntEnum]) -> EnumRegistry:
108
- """Create an enum registry with the provided custom types registered."""
109
-
110
- result = EnumRegistry()
111
- for kind in kinds:
112
- kind.register_enum(result)
113
- return result
@@ -119,3 +119,13 @@ def normalize(value: Primitivelike) -> type[AnyPrimitive]:
119
119
  def create(value: Primitivelike, **kwargs) -> AnyPrimitive:
120
120
  """Create an instance of a primitive."""
121
121
  return normalize(value)(**kwargs)
122
+
123
+
124
+ def normalize_instance(
125
+ value: Primitivelike | AnyPrimitive, **kwargs
126
+ ) -> AnyPrimitive:
127
+ """Creates a new instance only if necessary."""
128
+
129
+ if not isinstance(value, Primitive):
130
+ value = create(value, **kwargs)
131
+ return value
@@ -2,11 +2,14 @@
2
2
  A module implementing an enumeration for byte ordering options.
3
3
  """
4
4
 
5
+ # built-in
6
+ from typing import Optional
7
+
5
8
  # internal
6
- from runtimepy.enum.registry import RuntimeIntEnum as _RuntimeIntEnum
9
+ from runtimepy.enum.registry import EnumRegistry, RuntimeIntEnum
7
10
 
8
11
 
9
- class ByteOrder(_RuntimeIntEnum):
12
+ class ByteOrder(RuntimeIntEnum):
10
13
  """An enumeration for viable byte orders."""
11
14
 
12
15
  NATIVE = 1
@@ -30,5 +33,33 @@ class ByteOrder(_RuntimeIntEnum):
30
33
  """Get this byte order as a string."""
31
34
  return self.fmt
32
35
 
36
+ @classmethod
37
+ def id(cls) -> Optional[int]:
38
+ """Override in sub-class to coerce enum id."""
39
+ return 1
40
+
41
+
42
+ # https://en.cppreference.com/w/cpp/types/endian
43
+ STD_ENDIAN = {
44
+ "little": ByteOrder.LITTLE_ENDIAN,
45
+ "big": ByteOrder.BIG_ENDIAN,
46
+ "native": ByteOrder.NATIVE,
47
+ }
48
+
33
49
 
34
50
  DEFAULT_BYTE_ORDER = ByteOrder.NETWORK
51
+
52
+
53
+ def enum_registry(
54
+ *kinds: type[RuntimeIntEnum], register_byte_order: bool = True
55
+ ) -> EnumRegistry:
56
+ """Create an enum registry with the provided custom types registered."""
57
+
58
+ result = EnumRegistry()
59
+
60
+ if register_byte_order:
61
+ ByteOrder.register_enum(result)
62
+
63
+ for kind in kinds:
64
+ kind.register_enum(result)
65
+ return result
@@ -14,8 +14,9 @@ from vcorelib.io.types import JsonObject as _JsonObject
14
14
  from vcorelib.io.types import JsonValue as _JsonValue
15
15
 
16
16
  # internal
17
+ from runtimepy.primitives import AnyPrimitive as _AnyPrimitive
17
18
  from runtimepy.primitives import Primitivelike as _Primitivelike
18
- from runtimepy.primitives import normalize as _normalize
19
+ from runtimepy.primitives import normalize_instance as _normalize_instance
19
20
  from runtimepy.primitives.field import BitField as _BitField
20
21
  from runtimepy.primitives.field import BitFieldBase as _BitFieldBase
21
22
  from runtimepy.primitives.field import BitFlag as _BitFlag
@@ -37,7 +38,7 @@ class BitFields(_RuntimepyDictCodec):
37
38
 
38
39
  # Create the underlying storage element.
39
40
  self.raw: _UnsignedInt = _cast(
40
- _UnsignedInt, _normalize(_cast(str, data["type"]))()
41
+ _UnsignedInt, _normalize_instance(_cast(str, data["type"]))
41
42
  )
42
43
 
43
44
  self.curr_index = 0
@@ -194,6 +195,8 @@ class BitFields(_RuntimepyDictCodec):
194
195
  def claim_field(self, field: _BitField) -> _BitField:
195
196
  """Claim a bit field."""
196
197
 
198
+ self._claim_bits(field.width, index=field.index)
199
+
197
200
  assert field.name not in self.fields, field.name
198
201
  self.fields[field.name] = field
199
202
  self.by_index[field.index] = field
@@ -216,7 +219,7 @@ class BitFields(_RuntimepyDictCodec):
216
219
  _BitField(
217
220
  name,
218
221
  self.raw,
219
- self._claim_bits(width, index=index),
222
+ index if index is not None else self.curr_index,
220
223
  width,
221
224
  enum=enum,
222
225
  description=description,
@@ -225,7 +228,9 @@ class BitFields(_RuntimepyDictCodec):
225
228
  )
226
229
 
227
230
  @classmethod
228
- def new(cls: type[T], value: _Primitivelike = "uint8") -> T:
231
+ def new(
232
+ cls: type[T], value: _Primitivelike | _AnyPrimitive = "uint8"
233
+ ) -> T:
229
234
  """Create a new bit-field storage entity."""
230
235
 
231
236
  return cls.create(
@@ -100,6 +100,7 @@ class BitFieldsManagerBase:
100
100
  for name, field in fields.fields.items():
101
101
  ident = self.registry.register_name(name)
102
102
  assert ident is not None, "Couldn't register bit-field '{name}'!"
103
+ assert name not in self.lookup, name
103
104
  self.lookup[name] = index
104
105
 
105
106
  # Also store the enum mapping.
@@ -220,7 +221,11 @@ class BitFieldsManagerBase:
220
221
  new_fields.raw = prim
221
222
  self.by_primitive[prim] = new_fields
222
223
 
223
- self.by_primitive[prim].claim_field(field)
224
+ fields = self.by_primitive[prim]
225
+ fields.claim_field(field)
226
+
227
+ if not fields.bits_available:
228
+ del self.by_primitive[prim]
224
229
 
225
230
  # self.add(new_fields, finalize=False)
226
231
  return new_fields
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.11.2
3
+ Version: 5.11.4
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/vkottler/runtimepy
6
6
  Author: Vaughn Kottler
@@ -17,11 +17,11 @@ Classifier: License :: OSI Approved :: MIT License
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: psutil
21
20
  Requires-Dist: websockets
22
- Requires-Dist: aiofiles
23
- Requires-Dist: vcorelib>=3.5.1
24
21
  Requires-Dist: svgen>=0.7.4
22
+ Requires-Dist: psutil
23
+ Requires-Dist: vcorelib>=3.5.1
24
+ Requires-Dist: aiofiles
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -50,11 +50,11 @@ Dynamic: requires-python
50
50
  =====================================
51
51
  generator=datazen
52
52
  version=3.1.4
53
- hash=8a7622d7187fa17bfcc479f8f6f78d1a
53
+ hash=0a7881b3e47a699bb3a235518a84f5ab
54
54
  =====================================
55
55
  -->
56
56
 
57
- # runtimepy ([5.11.2](https://pypi.org/project/runtimepy/))
57
+ # runtimepy ([5.11.4](https://pypi.org/project/runtimepy/))
58
58
 
59
59
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
60
60
  ![Build Status](https://github.com/vkottler/runtimepy/workflows/Python%20Package/badge.svg)
@@ -1,4 +1,4 @@
1
- runtimepy/__init__.py,sha256=ClGjUTeqSc-7--8TPBkQrpNpwnkj6vXDfX4AMafRXRk,391
1
+ runtimepy/__init__.py,sha256=CL65SCL1H_Hd4dTF8u4ghL1IxZDybzOzh0wC1Vbbflg,391
2
2
  runtimepy/__main__.py,sha256=OPAed6hggoQdw-6QAR62mqLC-rCkdDhOq0wyeS2vDRI,332
3
3
  runtimepy/app.py,sha256=sTvatbsGZ2Hdel36Si_WUbNMtg9CzsJyExr5xjIcxDE,970
4
4
  runtimepy/dev_requirements.txt,sha256=j0dh11ztJAzfaUL0iFheGjaZj9ppDzmTkclTT8YKO8c,230
@@ -12,10 +12,10 @@ runtimepy/channel/__init__.py,sha256=pf0RJ5g37_FVV8xoUNgzFGuIfbZEYSBA_cQlJSDTPDo
12
12
  runtimepy/channel/registry.py,sha256=nk36qM_Bf6qK6AFR0plaZHR1PU7b4LZqbQ0feJqk4lc,4784
13
13
  runtimepy/channel/environment/__init__.py,sha256=0Jj8g7Y4bdDvmWtzpegB9D4milGPhsZokoYxmps5zgU,1612
14
14
  runtimepy/channel/environment/array.py,sha256=f9cWaYsRXUw8qE629h6jQxbYKDpOwC2GLBo4QaMa1JM,3748
15
- runtimepy/channel/environment/base.py,sha256=tpD_6OHJv1bpfXmfFCNckoNo8ATOOi-XX66NQrkSNYU,14331
15
+ runtimepy/channel/environment/base.py,sha256=uCQKCH6wNrKqYSX2PMDAbIFoCZh68Xt-Cr_daGG7eeI,14356
16
16
  runtimepy/channel/environment/create.py,sha256=DHjoNmzZsARjfB_CfutXQ1PDdxPETi6yQoRMhM0FbwA,5319
17
17
  runtimepy/channel/environment/file.py,sha256=PV05KZ3-CvftbKUM8acQmawOMeGGCcMrEESEBuymykg,6949
18
- runtimepy/channel/environment/sample.py,sha256=Geinp2Q_qYkzYKpUJroepv6A4JWypUnAPl57jn_r_R4,4976
18
+ runtimepy/channel/environment/sample.py,sha256=c__4ZKs1ERoQNbBOimIqjdYbyb4KGgVFk6Ar606Luh4,5108
19
19
  runtimepy/channel/environment/telemetry.py,sha256=3A7Xcp-4eHJWz_oR1SnI6rsl4o8wiSUaiMHrnK1IaQ8,5338
20
20
  runtimepy/channel/environment/command/__init__.py,sha256=mymqk5roA-7evUovXlD2dmWaprSzrPb_3ae6bA9oEZ0,8162
21
21
  runtimepy/channel/environment/command/parser.py,sha256=cMOsEsXnfFlATiWTNSxlgvc_XoICsJlcZigFJlQ47tk,1804
@@ -25,9 +25,9 @@ runtimepy/channel/event/__init__.py,sha256=9LCSNa1Iiwr6Q6JkwQGELDQ7rWfU_xjAMh6qM
25
25
  runtimepy/channel/event/header.py,sha256=eDRZgzzM5HZQ8QtV4DjyAsrAhEZyM7IfwqK6WB5ACEw,868
26
26
  runtimepy/codec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  runtimepy/codec/protocol/__init__.py,sha256=Rg7RSKGn2UBpGMpwq1aCLUBA5h4pORdh53NfR7Cjw0U,1530
28
- runtimepy/codec/protocol/base.py,sha256=aIQCuUYPhe7-jgaYaoNzq3UU57lnBzrLqIr0H7fnHFc,10464
29
- runtimepy/codec/protocol/json.py,sha256=gYGB_OEfZYySKQ_n3eDxYNs6Ku80FdawY5zDqjx9ctc,4315
30
- runtimepy/codec/system/__init__.py,sha256=TRLfWTRPHtjJZHlRnQrEMGTYFzNK979vwSDLXr4nPsk,7308
28
+ runtimepy/codec/protocol/base.py,sha256=ezNX-93NBChNpMszkkcx-0X_YzdU2oOFdqAMfKaEqMo,11053
29
+ runtimepy/codec/protocol/json.py,sha256=qmcoCcTRS-HgVYLPBsCAPhekAgZmHX9JBfGivLl3b0Y,4349
30
+ runtimepy/codec/system/__init__.py,sha256=fIOUo7QhwI81YAIz9myeSo1oo94De41sK5HKJ-sAdfY,7959
31
31
  runtimepy/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  runtimepy/commands/all.py,sha256=jH2dsmkqyBFe_2ZlPFpko0UCMW3fFfJsuGIbeJFbDoQ,1619
33
33
  runtimepy/commands/arbiter.py,sha256=CtTMRYpqCAN3vWHkkr9jqWpoF7JGNXafKIBFmkarAfc,1567
@@ -118,7 +118,7 @@ runtimepy/data/static/woff2/CascadiaMono-Italic.woff2,sha256=S31PimDgq0GV7XMRV-Y
118
118
  runtimepy/data/static/woff2/CascadiaMono-Regular.woff2,sha256=hHPAFO0U10TCKBw-UofHN2BLjax9qNClzN9oWGKkQx0,143936
119
119
  runtimepy/data/static/woff2/README.md,sha256=flHwSRmDxd6OnWhzxmnXzwio1Mong5tB4d8VgieWCOs,289
120
120
  runtimepy/enum/__init__.py,sha256=WIBMOaogauR1u7mK-I4Z5BZUoWANU7alIlrz82QdCmY,5820
121
- runtimepy/enum/registry.py,sha256=SWCsyk7zLphlGC1doftT1z0AHwpdHRpffgyD4jgTs_A,3096
121
+ runtimepy/enum/registry.py,sha256=b_oW8l-yNXvrVGfwQ2kKs2bqBk5pT48WBc2vXUTkJks,2861
122
122
  runtimepy/enum/types.py,sha256=uQYGvaAJVm5tUdwxn_SLHkTZHJpEf7364rTSL27necA,1027
123
123
  runtimepy/message/__init__.py,sha256=X5PZqSPGhNT4MruaiQjN4MwJHhy8gV9W32QXyxgS9-E,3004
124
124
  runtimepy/message/handlers.py,sha256=He9NC7MCkaV2clKc8dTSZ_T8N2l3ATjaTFzBr9n1T34,3775
@@ -230,10 +230,10 @@ runtimepy/net/udp/tftp/io.py,sha256=w6cnUt-T-Ma6Vg8BWoRbsNnIWUv0HTY4am6bcLWxNJs,
230
230
  runtimepy/net/websocket/__init__.py,sha256=YjSmoxiigmsI_hcQw6nueX7bxhrRGerEERnPvgLVEVA,313
231
231
  runtimepy/net/websocket/connection.py,sha256=BMR58bLpHuulCdbLGnmMdFJOF53wVxYcUe52WbdzKEM,9025
232
232
  runtimepy/noise/__init__.py,sha256=EJM7h3t_z74wwrn6FAFQwYE2yUcOZQ1K1IQqOb8Z0AI,384
233
- runtimepy/primitives/__init__.py,sha256=nwWJH1e0KN2NsVwQ3wvRtUpl9s9Ap8Q32NNZLGol0wU,2323
233
+ runtimepy/primitives/__init__.py,sha256=uyihG0zIzarH99iskrL97VUd44m6AqNoLZPF5cC7q9A,2569
234
234
  runtimepy/primitives/base.py,sha256=BaGPUTeVMnLnTPcpjqnS2lzPN74Pe5C0XaQdgrTfW7A,9185
235
235
  runtimepy/primitives/bool.py,sha256=lATPgb1e62rjLn5XlJX8lP3tVYR3DlxV8RT9HpOMdT0,1640
236
- runtimepy/primitives/byte_order.py,sha256=80mMk1Sj_l49XvAtvrPmoYFpFYSM1HgYuwR2-P7os3Q,767
236
+ runtimepy/primitives/byte_order.py,sha256=J2Pg3gXg8Lmu_uU2mduNJt3mnP_enwDI4Y-X8kWAUP0,1456
237
237
  runtimepy/primitives/evaluation.py,sha256=0N7mT8uoiJaY-coF2PeEXU2WO-FmbyN2Io9_EaghO9Q,4657
238
238
  runtimepy/primitives/float.py,sha256=6vzNKnnLzzM4vP10V4E0PHZQH6vTvIl34pId1oFtlqc,2146
239
239
  runtimepy/primitives/int.py,sha256=Ia2vtzXXfBb8fj1mgwu_PFpblrL2qzsN4Qwjvk5NhT4,3618
@@ -241,9 +241,9 @@ runtimepy/primitives/scaling.py,sha256=Vtxp2CSBahqPp4i2-IS4wjbcC023xwf-dqZMbYWf3
241
241
  runtimepy/primitives/string.py,sha256=ic5VKhXCSIwEOUfqIb1VUpZPwjdAcBul-cLLIihVkQI,2532
242
242
  runtimepy/primitives/array/__init__.py,sha256=ZVJt4810hTFYMdolY_R75lRRHHaNKxZ4comBvuK_69E,8956
243
243
  runtimepy/primitives/field/__init__.py,sha256=iHZSQBozMpfiv_5KE_GIX1FAvDB9unUO0xmWZHiA_Jk,4491
244
- runtimepy/primitives/field/fields.py,sha256=jDNi1tl2Xc3GBmt6QJuqxbhP8MtxgertGbPFmDXa7b4,7481
244
+ runtimepy/primitives/field/fields.py,sha256=c7J8BHAmOoJmRZQzYWKzYtsB_DnWwvRiKd0oj0HpyD0,7668
245
245
  runtimepy/primitives/field/manager/__init__.py,sha256=BCRi6-_5OOJ8kz78JHkiLp8cZ71KA1uiF2zq5FFe9js,2586
246
- runtimepy/primitives/field/manager/base.py,sha256=EyWs5D9_reKOTLkh8PuW45ySjCh31fY_qrtFIcmIOV4,6914
246
+ runtimepy/primitives/field/manager/base.py,sha256=lXEdRm4TlH8TYm_YQ8UH33RhDfH0OhUnwMx1Kc1I_ys,7066
247
247
  runtimepy/primitives/serializable/__init__.py,sha256=R9_derxnK1OCaYyqBZA4CCjPkXCBw6InkE8-3Zy75Uk,399
248
248
  runtimepy/primitives/serializable/base.py,sha256=EIj7Ao0sZaXCXgZari35kimjkr3SzFWGy3rNjxgsv1E,5727
249
249
  runtimepy/primitives/serializable/fixed.py,sha256=rhr6uVbo0Lvazk4fLI7iei-vVNEwP1J8-LoUjW1NaMI,1077
@@ -285,9 +285,9 @@ runtimepy/tui/task.py,sha256=nUZo9fuOC-k1Wpqdzkv9v1tQirCI28fZVgcC13Ijvus,1093
285
285
  runtimepy/tui/channels/__init__.py,sha256=evDaiIn-YS9uGhdo8ZGtP9VK1ek6sr_P1nJ9JuSET0o,4536
286
286
  runtimepy/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
287
  runtimepy/ui/controls.py,sha256=yvT7h3thbYaitsakcIAJ90EwKzJ4b-jnc6p3UuVf_XE,1241
288
- runtimepy-5.11.2.dist-info/licenses/LICENSE,sha256=yKBRwbO-cOPBrlpsZmJkkSa33DfY31aE8t7lZ0DwlUo,1071
289
- runtimepy-5.11.2.dist-info/METADATA,sha256=owly4GKtd8gZzMzY2TyKEJsTgDAjejgpmUvK4iNtlGM,9395
290
- runtimepy-5.11.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
291
- runtimepy-5.11.2.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
292
- runtimepy-5.11.2.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
293
- runtimepy-5.11.2.dist-info/RECORD,,
288
+ runtimepy-5.11.4.dist-info/licenses/LICENSE,sha256=yKBRwbO-cOPBrlpsZmJkkSa33DfY31aE8t7lZ0DwlUo,1071
289
+ runtimepy-5.11.4.dist-info/METADATA,sha256=irNLpzsQisHnkApv2NMrx7BftuY0HCY5nxwVswd-u2E,9395
290
+ runtimepy-5.11.4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
291
+ runtimepy-5.11.4.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
292
+ runtimepy-5.11.4.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
293
+ runtimepy-5.11.4.dist-info/RECORD,,