soia-client 1.0.8__tar.gz → 1.0.10__tar.gz
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 soia-client might be problematic. Click here for more details.
- {soia_client-1.0.8 → soia_client-1.0.10}/PKG-INFO +3 -2
- {soia_client-1.0.8 → soia_client-1.0.10}/README +4 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/pyproject.toml +1 -1
- {soia_client-1.0.8 → soia_client-1.0.10}/soia_client.egg-info/PKG-INFO +3 -2
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/arrays.py +6 -9
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/enums.py +2 -2
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/function_maker.py +6 -6
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/primitives.py +45 -17
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/structs.py +9 -7
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/serializer.py +1 -1
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/serializers.py +3 -1
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/timestamp.py +2 -1
- {soia_client-1.0.8 → soia_client-1.0.10}/tests/test_module_initializer.py +23 -0
- soia_client-1.0.10/tests/test_serializers.py +155 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/tests/test_timestamp.py +1 -1
- soia_client-1.0.8/tests/test_serializers.py +0 -76
- {soia_client-1.0.8 → soia_client-1.0.10}/LICENSE +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/setup.cfg +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soia_client.egg-info/SOURCES.txt +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soia_client.egg-info/dependency_links.txt +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soia_client.egg-info/top_level.txt +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/__init__.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/__init__.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/optionals.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/repr.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/impl/type_adapter.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/keyed_items.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/method.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/module_initializer.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/never.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.10}/soialib/spec.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: soia-client
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.10
|
|
4
4
|
Author-email: Tyler Fibonacci <gepheum@gmail.com>
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -31,3 +31,4 @@ Classifier: Programming Language :: Python :: 3
|
|
|
31
31
|
Requires-Python: >=3.10
|
|
32
32
|
Description-Content-Type: text/markdown
|
|
33
33
|
License-File: LICENSE
|
|
34
|
+
Dynamic: license-file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: soia-client
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.10
|
|
4
4
|
Author-email: Tyler Fibonacci <gepheum@gmail.com>
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -31,3 +31,4 @@ Classifier: Programming Language :: Python :: 3
|
|
|
31
31
|
Requires-Python: >=3.10
|
|
32
32
|
Description-Content-Type: text/markdown
|
|
33
33
|
License-File: LICENSE
|
|
34
|
+
Dynamic: license-file
|
|
@@ -73,16 +73,13 @@ class _ArrayAdapter(TypeAdapter):
|
|
|
73
73
|
return attr_expr
|
|
74
74
|
|
|
75
75
|
def to_json_expr(self, in_expr: ExprLike, readable: bool) -> ExprLike:
|
|
76
|
-
|
|
77
|
-
item_to_json
|
|
78
|
-
if item_to_json == e:
|
|
76
|
+
item_to_json = self.item_adapter.to_json_expr("_e", readable)
|
|
77
|
+
if Expr.join(item_to_json) == Expr.join("_e"):
|
|
79
78
|
return in_expr
|
|
80
79
|
return Expr.join(
|
|
81
80
|
"[",
|
|
82
81
|
item_to_json,
|
|
83
|
-
" for ",
|
|
84
|
-
e,
|
|
85
|
-
" in ",
|
|
82
|
+
" for _e in ",
|
|
86
83
|
in_expr,
|
|
87
84
|
"]",
|
|
88
85
|
)
|
|
@@ -93,7 +90,7 @@ class _ArrayAdapter(TypeAdapter):
|
|
|
93
90
|
return Expr.join(
|
|
94
91
|
listuple_class_local,
|
|
95
92
|
"([",
|
|
96
|
-
self.item_adapter.from_json_expr(
|
|
93
|
+
self.item_adapter.from_json_expr("_e"),
|
|
97
94
|
" for _e in ",
|
|
98
95
|
json_expr,
|
|
99
96
|
"] or ",
|
|
@@ -121,14 +118,14 @@ def _new_listuple_class() -> type:
|
|
|
121
118
|
return Listuple
|
|
122
119
|
|
|
123
120
|
|
|
124
|
-
def _new_keyed_items_class(
|
|
121
|
+
def _new_keyed_items_class(key_attributes: tuple[str, ...], default_expr: ExprLike):
|
|
125
122
|
key_items = make_function(
|
|
126
123
|
name="key_items",
|
|
127
124
|
params=["items"],
|
|
128
125
|
body=[
|
|
129
126
|
"ret = {}",
|
|
130
127
|
"for item in items:",
|
|
131
|
-
f" ret[item.{'.'.join(
|
|
128
|
+
f" ret[item.{'.'.join(key_attributes)}] = item",
|
|
132
129
|
"return ret",
|
|
133
130
|
],
|
|
134
131
|
)
|
|
@@ -292,7 +292,7 @@ def _make_wrap_fn(field: _ValueField) -> Callable[[Any], Any]:
|
|
|
292
292
|
builder.append_ln(
|
|
293
293
|
Expr.local("setattr", object.__setattr__),
|
|
294
294
|
"(ret, 'value', ",
|
|
295
|
-
field.field_type.to_frozen_expr(
|
|
295
|
+
field.field_type.to_frozen_expr("value"),
|
|
296
296
|
")",
|
|
297
297
|
)
|
|
298
298
|
builder.append_ln("return ret")
|
|
@@ -357,7 +357,7 @@ def _make_from_json_fn(
|
|
|
357
357
|
number = numbers[0]
|
|
358
358
|
field = key_to_field[number]
|
|
359
359
|
value_class_local = Expr.local("cls?", field.value_class)
|
|
360
|
-
value_expr = field.field_type.from_json_expr(
|
|
360
|
+
value_expr = field.field_type.from_json_expr("json[1]")
|
|
361
361
|
builder.append_ln(f"{indent}ret = ", value_class_local, "()")
|
|
362
362
|
builder.append_ln(
|
|
363
363
|
indent, obj_setattr_local, '(ret, "value", ', value_expr, ")"
|
|
@@ -49,12 +49,12 @@ def make_function(
|
|
|
49
49
|
|
|
50
50
|
locals = make_locals()
|
|
51
51
|
|
|
52
|
-
def line_to_code(
|
|
53
|
-
if isinstance(
|
|
54
|
-
return
|
|
55
|
-
return
|
|
52
|
+
def line_to_code(ln: Union[str, Line]) -> str:
|
|
53
|
+
if isinstance(ln, str):
|
|
54
|
+
return ln
|
|
55
|
+
return ln._to_code(locals)
|
|
56
56
|
|
|
57
|
-
body_str = "\n ".join(line_to_code(
|
|
57
|
+
body_str = "\n ".join(line_to_code(ln) for ln in body) if body else "pass"
|
|
58
58
|
text = f"""
|
|
59
59
|
def __create_function__({', '.join(locals.locals.keys())}):
|
|
60
60
|
def {name}({', '.join(p._to_code(locals) for p in params)}):
|
|
@@ -152,7 +152,7 @@ class BodyBuilder:
|
|
|
152
152
|
self._lines.append(Line.join(*spans))
|
|
153
153
|
|
|
154
154
|
def extend(self, other: Iterable[Union[str, Line]], indent: str = ""):
|
|
155
|
-
self._lines.extend(Line.join(indent,
|
|
155
|
+
self._lines.extend(Line.join(indent, ln) for ln in other)
|
|
156
156
|
return self
|
|
157
157
|
|
|
158
158
|
def build(self) -> Body:
|
|
@@ -52,44 +52,72 @@ class _AbstractIntAdapter(AbstractPrimitiveAdapter):
|
|
|
52
52
|
return "0"
|
|
53
53
|
|
|
54
54
|
def to_frozen_expr(self, arg_expr: ExprLike) -> Expr:
|
|
55
|
-
round_expr = Expr.local("round", round)
|
|
56
55
|
# Must accept float inputs and turn them into ints.
|
|
57
|
-
return Expr.join("(", arg_expr, "
|
|
56
|
+
return Expr.join("(0).__class__(", arg_expr, ")")
|
|
58
57
|
|
|
59
58
|
def is_not_default_expr(self, arg_expr: ExprLike, attr_expr: ExprLike) -> ExprLike:
|
|
60
59
|
return arg_expr
|
|
61
60
|
|
|
62
|
-
def to_json_expr(self, in_expr: ExprLike, readable: bool) -> ExprLike:
|
|
63
|
-
return in_expr
|
|
64
|
-
|
|
65
61
|
def from_json_expr(self, json_expr: ExprLike) -> Expr:
|
|
66
|
-
# Must accept float inputs and turn them into ints.
|
|
62
|
+
# Must accept float inputs and string inputs and turn them into ints.
|
|
67
63
|
return Expr.join(
|
|
68
|
-
"(",
|
|
69
|
-
json_expr,
|
|
70
|
-
" if ",
|
|
71
|
-
json_expr,
|
|
72
|
-
".__class__ is (0).__class__ else ",
|
|
73
|
-
Expr.local("_round", round),
|
|
74
|
-
"(",
|
|
64
|
+
"(0).__class__(",
|
|
75
65
|
json_expr,
|
|
76
|
-
")
|
|
66
|
+
")",
|
|
77
67
|
)
|
|
78
68
|
|
|
79
69
|
|
|
80
70
|
@dataclass(frozen=True)
|
|
81
71
|
class _Int32Adapter(_AbstractIntAdapter):
|
|
82
|
-
|
|
72
|
+
def to_json_expr(self, in_expr: ExprLike, readable: bool) -> Expr:
|
|
73
|
+
return Expr.join(
|
|
74
|
+
"(-2147483648 if ",
|
|
75
|
+
in_expr,
|
|
76
|
+
" <= -2147483648 else ",
|
|
77
|
+
in_expr,
|
|
78
|
+
" if ",
|
|
79
|
+
in_expr,
|
|
80
|
+
" < 2147483647 else 2147483647)",
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _int64_to_json(i: int) -> int | str:
|
|
85
|
+
if i < -9007199254740991: # min safe integer in JavaScript
|
|
86
|
+
if i <= -9223372036854775808:
|
|
87
|
+
return "-9223372036854775808"
|
|
88
|
+
else:
|
|
89
|
+
return str(i)
|
|
90
|
+
elif i <= 9007199254740991: # max safe integer in JavaScript
|
|
91
|
+
return i
|
|
92
|
+
elif i < 9223372036854775807:
|
|
93
|
+
return str(i)
|
|
94
|
+
else:
|
|
95
|
+
return "9223372036854775807"
|
|
83
96
|
|
|
84
97
|
|
|
85
98
|
@dataclass(frozen=True)
|
|
86
99
|
class _Int64Adapter(_AbstractIntAdapter):
|
|
87
|
-
|
|
100
|
+
def to_json_expr(self, in_expr: ExprLike, readable: bool) -> Expr:
|
|
101
|
+
return Expr.join(Expr.local("int64_to_json", _int64_to_json), "(", in_expr, ")")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _uint64_to_json(i: int) -> int | str:
|
|
105
|
+
if i <= 0:
|
|
106
|
+
return 0
|
|
107
|
+
elif i <= 9007199254740991: # max safe integer in JavaScript
|
|
108
|
+
return i
|
|
109
|
+
elif i < 18446744073709551615:
|
|
110
|
+
return f"{i}"
|
|
111
|
+
else:
|
|
112
|
+
return "18446744073709551615"
|
|
88
113
|
|
|
89
114
|
|
|
90
115
|
@dataclass(frozen=True)
|
|
91
116
|
class _Uint64Adapter(_AbstractIntAdapter):
|
|
92
|
-
|
|
117
|
+
def to_json_expr(self, in_expr: ExprLike, readable: bool) -> Expr:
|
|
118
|
+
return Expr.join(
|
|
119
|
+
Expr.local("uint64_to_json", _uint64_to_json), "(", in_expr, ")"
|
|
120
|
+
)
|
|
93
121
|
|
|
94
122
|
|
|
95
123
|
INT32_ADAPTER: Final[TypeAdapter] = _Int32Adapter()
|
|
@@ -178,7 +178,7 @@ class StructAdapter(TypeAdapter):
|
|
|
178
178
|
)
|
|
179
179
|
|
|
180
180
|
def is_not_default_expr(self, arg_expr: ExprLike, attr_expr: ExprLike) -> Expr:
|
|
181
|
-
return Expr.join(attr_expr,
|
|
181
|
+
return Expr.join(attr_expr, "._array_len")
|
|
182
182
|
|
|
183
183
|
def to_json_expr(
|
|
184
184
|
self,
|
|
@@ -286,7 +286,7 @@ def _make_frozen_class_init_fn(
|
|
|
286
286
|
# Set array length.
|
|
287
287
|
builder.append_ln(
|
|
288
288
|
obj_setattr,
|
|
289
|
-
|
|
289
|
+
'(_self, "_array_len", ',
|
|
290
290
|
array_len_expr(),
|
|
291
291
|
")",
|
|
292
292
|
)
|
|
@@ -311,7 +311,7 @@ def _make_frozen_class_init_fn(
|
|
|
311
311
|
# Set the _unrecognized field.
|
|
312
312
|
builder.append_ln("_self._unrecognized = ()")
|
|
313
313
|
# Set array length.
|
|
314
|
-
builder.append_ln(
|
|
314
|
+
builder.append_ln("_self._array_len = ", array_len_expr())
|
|
315
315
|
# Change back the __class__.
|
|
316
316
|
builder.append_ln("_self.__class__ = ", Expr.local("Frozen", frozen_class))
|
|
317
317
|
|
|
@@ -360,7 +360,7 @@ def _make_to_mutable_fn(
|
|
|
360
360
|
Returns the implementation of the to_mutable() method of the frozen class.
|
|
361
361
|
"""
|
|
362
362
|
builder = BodyBuilder()
|
|
363
|
-
# Create an instance of the simple class. We'll later change its __class__
|
|
363
|
+
# Create an instance of the simple class. We'll later change its __class__ attr.
|
|
364
364
|
builder.append_ln(
|
|
365
365
|
"ret = ",
|
|
366
366
|
Expr.local("Simple", simple_class),
|
|
@@ -392,7 +392,7 @@ def _make_to_frozen_fn(
|
|
|
392
392
|
"""
|
|
393
393
|
|
|
394
394
|
builder = BodyBuilder()
|
|
395
|
-
# Create an instance of the simple class. We'll later change its __class__
|
|
395
|
+
# Create an instance of the simple class. We'll later change its __class__ attr.
|
|
396
396
|
builder.append_ln(
|
|
397
397
|
"ret = ",
|
|
398
398
|
Expr.local("Simple", simple_class),
|
|
@@ -457,6 +457,8 @@ def _make_eq_fn(
|
|
|
457
457
|
"""
|
|
458
458
|
|
|
459
459
|
builder = BodyBuilder()
|
|
460
|
+
builder.append_ln("if other is self:")
|
|
461
|
+
builder.append_ln(" return True")
|
|
460
462
|
builder.append_ln("if other.__class__ is self.__class__:")
|
|
461
463
|
operands: list[ExprLike]
|
|
462
464
|
if fields:
|
|
@@ -622,7 +624,7 @@ def _make_from_json_fn(
|
|
|
622
624
|
)
|
|
623
625
|
builder.append_ln(" else:")
|
|
624
626
|
builder.append_ln(
|
|
625
|
-
|
|
627
|
+
" ret._unrecognized = ",
|
|
626
628
|
Expr.local("deepcopy", copy.deepcopy),
|
|
627
629
|
f"(json[{num_slots}:])",
|
|
628
630
|
)
|
|
@@ -638,7 +640,7 @@ def _make_from_json_fn(
|
|
|
638
640
|
builder.append_ln(f" array_len = {field.field.number}")
|
|
639
641
|
builder.append_ln(
|
|
640
642
|
f" {lvalue} = ",
|
|
641
|
-
field.type.from_json_expr(
|
|
643
|
+
field.type.from_json_expr(f'json["{name}"]'),
|
|
642
644
|
)
|
|
643
645
|
builder.append_ln(" else:")
|
|
644
646
|
builder.append_ln(f" {lvalue} = ", field.type.default_expr())
|
|
@@ -39,7 +39,7 @@ class Serializer(Generic[T]):
|
|
|
39
39
|
)
|
|
40
40
|
object.__setattr__(self, "_from_json_fn", _make_from_json_fn(adapter))
|
|
41
41
|
|
|
42
|
-
def to_json(self, input: T, readable=False) -> Any:
|
|
42
|
+
def to_json(self, input: T, *, readable=False) -> Any:
|
|
43
43
|
if readable:
|
|
44
44
|
return self._to_readable_json_fn(input)
|
|
45
45
|
else:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Final, Literal,
|
|
1
|
+
from typing import Final, Literal, TypeVar, overload
|
|
2
2
|
|
|
3
3
|
from soialib.impl import primitives
|
|
4
4
|
from soialib.impl.arrays import get_array_adapter
|
|
@@ -38,6 +38,8 @@ def primitive_serializer(primitive: Literal["timestamp"]) -> Serializer[Timestam
|
|
|
38
38
|
def primitive_serializer(primitive: Literal["string"]) -> Serializer[str]: ...
|
|
39
39
|
@overload
|
|
40
40
|
def primitive_serializer(primitive: Literal["bytes"]) -> Serializer[bytes]: ...
|
|
41
|
+
|
|
42
|
+
|
|
41
43
|
def primitive_serializer(
|
|
42
44
|
primitive: (
|
|
43
45
|
Literal["bool"]
|
|
@@ -54,6 +54,7 @@ class Timestamp:
|
|
|
54
54
|
def __sub__(self, other: datetime.timedelta) -> "Timestamp": ...
|
|
55
55
|
@overload
|
|
56
56
|
def __sub__(self, other: "Timestamp") -> datetime.timedelta: ...
|
|
57
|
+
|
|
57
58
|
def __sub__(
|
|
58
59
|
self, other: Union["Timestamp", datetime.timedelta]
|
|
59
60
|
) -> Union["Timestamp", datetime.timedelta]:
|
|
@@ -111,7 +112,7 @@ class Timestamp:
|
|
|
111
112
|
def _iso_format(self) -> str:
|
|
112
113
|
try:
|
|
113
114
|
dt = self.to_datetime_or_raise()
|
|
114
|
-
except:
|
|
115
|
+
except Exception:
|
|
115
116
|
return ""
|
|
116
117
|
if dt:
|
|
117
118
|
ret = dt.isoformat()
|
|
@@ -294,6 +294,21 @@ class ModuleInitializerTestCase(unittest.TestCase):
|
|
|
294
294
|
),
|
|
295
295
|
),
|
|
296
296
|
),
|
|
297
|
+
spec.Struct(
|
|
298
|
+
id="my/module.soia:Rec",
|
|
299
|
+
fields=(
|
|
300
|
+
spec.Field(
|
|
301
|
+
name="r",
|
|
302
|
+
number=0,
|
|
303
|
+
type="my/module.soia:Rec",
|
|
304
|
+
),
|
|
305
|
+
spec.Field(
|
|
306
|
+
name="x",
|
|
307
|
+
number=1,
|
|
308
|
+
type=spec.PrimitiveType.INT32,
|
|
309
|
+
),
|
|
310
|
+
),
|
|
311
|
+
),
|
|
297
312
|
spec.Struct(
|
|
298
313
|
id="my/module.soia:Foobar",
|
|
299
314
|
fields=(
|
|
@@ -530,6 +545,14 @@ class ModuleInitializerTestCase(unittest.TestCase):
|
|
|
530
545
|
self.assertEqual(serializer.to_json_code(foobar), "[0,0,0,0,[2.0]]")
|
|
531
546
|
self.assertEqual(serializer.from_json_code("[0,0,0,0,[2.0]]"), foobar)
|
|
532
547
|
|
|
548
|
+
def test_recursive_struct(self):
|
|
549
|
+
rec_cls = self.init_test_module()["Rec"]
|
|
550
|
+
r = rec_cls(r=rec_cls(r=rec_cls.DEFAULT, x=1))
|
|
551
|
+
serializer = rec_cls.SERIALIZER
|
|
552
|
+
self.assertEqual(serializer.to_json_code(r), "[[[],1]]")
|
|
553
|
+
self.assertEqual(serializer.from_json_code("[[[],1]]"), r)
|
|
554
|
+
self.assertEqual(str(r), "Rec(\n r=Rec(x=1),\n)")
|
|
555
|
+
|
|
533
556
|
def test_struct_ctor_accepts_mutable_struct(self):
|
|
534
557
|
module = self.init_test_module()
|
|
535
558
|
segment_cls = module["Segment"]
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from soialib import (
|
|
4
|
+
Timestamp,
|
|
5
|
+
array_serializer,
|
|
6
|
+
optional_serializer,
|
|
7
|
+
primitive_serializer,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TimestampTestCase(unittest.TestCase):
|
|
12
|
+
def test_primitive_serializers(self):
|
|
13
|
+
self.assertEqual(primitive_serializer("bool").to_json_code(True), "1")
|
|
14
|
+
self.assertEqual(
|
|
15
|
+
primitive_serializer("bool").to_json_code(True, readable=True),
|
|
16
|
+
"true",
|
|
17
|
+
)
|
|
18
|
+
self.assertEqual(primitive_serializer("bool").from_json_code("true"), True)
|
|
19
|
+
self.assertEqual(primitive_serializer("bool").from_json_code("false"), False)
|
|
20
|
+
self.assertEqual(primitive_serializer("bool").from_json_code("0"), False)
|
|
21
|
+
|
|
22
|
+
self.assertEqual(primitive_serializer("int32").to_json_code(7), "7")
|
|
23
|
+
self.assertEqual(
|
|
24
|
+
primitive_serializer("int32").to_json_code(7, readable=True), "7"
|
|
25
|
+
)
|
|
26
|
+
self.assertEqual(
|
|
27
|
+
primitive_serializer("int32").to_json_code(2147483648), "2147483647"
|
|
28
|
+
)
|
|
29
|
+
self.assertEqual(
|
|
30
|
+
primitive_serializer("int32").to_json_code(-2147483649), "-2147483648"
|
|
31
|
+
)
|
|
32
|
+
self.assertEqual(primitive_serializer("int32").from_json_code("0"), 0)
|
|
33
|
+
self.assertEqual(primitive_serializer("int32").from_json_code('"7"'), 7)
|
|
34
|
+
self.assertEqual(primitive_serializer("int32").from_json_code("3.14"), 3)
|
|
35
|
+
self.assertEqual(primitive_serializer("int32").from_json_code("-3.14"), -3)
|
|
36
|
+
|
|
37
|
+
self.assertEqual(
|
|
38
|
+
primitive_serializer("int64").to_json_code(2147483648), "2147483648"
|
|
39
|
+
)
|
|
40
|
+
self.assertEqual(
|
|
41
|
+
primitive_serializer("int64").to_json_code(9007199254740991),
|
|
42
|
+
"9007199254740991",
|
|
43
|
+
)
|
|
44
|
+
self.assertEqual(
|
|
45
|
+
primitive_serializer("int64").to_json_code(9007199254740992),
|
|
46
|
+
'"9007199254740992"',
|
|
47
|
+
)
|
|
48
|
+
self.assertEqual(
|
|
49
|
+
primitive_serializer("int64").to_json_code(9223372036854775808),
|
|
50
|
+
'"9223372036854775807"',
|
|
51
|
+
)
|
|
52
|
+
self.assertEqual(
|
|
53
|
+
primitive_serializer("int64").to_json_code(-9007199254740991),
|
|
54
|
+
"-9007199254740991",
|
|
55
|
+
)
|
|
56
|
+
self.assertEqual(
|
|
57
|
+
primitive_serializer("int64").to_json_code(-9007199254740992),
|
|
58
|
+
'"-9007199254740992"',
|
|
59
|
+
)
|
|
60
|
+
self.assertEqual(
|
|
61
|
+
primitive_serializer("int64").to_json_code(-9223372036854775809),
|
|
62
|
+
'"-9223372036854775808"',
|
|
63
|
+
)
|
|
64
|
+
self.assertEqual(primitive_serializer("int64").from_json_code("0"), 0)
|
|
65
|
+
self.assertEqual(primitive_serializer("int64").from_json_code('"7"'), 7)
|
|
66
|
+
self.assertEqual(primitive_serializer("int64").from_json_code("3.14"), 3)
|
|
67
|
+
self.assertEqual(primitive_serializer("int64").from_json_code("-3.14"), -3)
|
|
68
|
+
|
|
69
|
+
self.assertEqual(
|
|
70
|
+
primitive_serializer("uint64").to_json_code(2147483648),
|
|
71
|
+
"2147483648",
|
|
72
|
+
)
|
|
73
|
+
self.assertEqual(
|
|
74
|
+
primitive_serializer("uint64").to_json_code(-1),
|
|
75
|
+
"0",
|
|
76
|
+
)
|
|
77
|
+
self.assertEqual(
|
|
78
|
+
primitive_serializer("uint64").to_json_code(9007199254740991),
|
|
79
|
+
"9007199254740991",
|
|
80
|
+
)
|
|
81
|
+
self.assertEqual(
|
|
82
|
+
primitive_serializer("uint64").to_json_code(9007199254740992),
|
|
83
|
+
'"9007199254740992"',
|
|
84
|
+
)
|
|
85
|
+
self.assertEqual(primitive_serializer("uint64").from_json_code("0"), 0)
|
|
86
|
+
self.assertEqual(primitive_serializer("uint64").from_json_code('"7"'), 7)
|
|
87
|
+
self.assertEqual(primitive_serializer("uint64").from_json_code("3.14"), 3)
|
|
88
|
+
self.assertEqual(primitive_serializer("uint64").from_json_code("-3.14"), -3)
|
|
89
|
+
|
|
90
|
+
self.assertEqual(primitive_serializer("float32").to_json_code(3.14), "3.14")
|
|
91
|
+
self.assertEqual(
|
|
92
|
+
primitive_serializer("float32").to_json_code(float("inf")), "Infinity"
|
|
93
|
+
)
|
|
94
|
+
self.assertEqual(
|
|
95
|
+
primitive_serializer("float32").to_json_code(-float("inf")), "-Infinity"
|
|
96
|
+
)
|
|
97
|
+
self.assertEqual(
|
|
98
|
+
primitive_serializer("float32").to_json_code(float("nan")), "NaN"
|
|
99
|
+
)
|
|
100
|
+
self.assertEqual(primitive_serializer("float64").to_json_code(3.14), "3.14")
|
|
101
|
+
self.assertEqual(
|
|
102
|
+
primitive_serializer("float64").to_json_code(3.14, readable=True),
|
|
103
|
+
"3.14",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
self.assertEqual(
|
|
107
|
+
primitive_serializer("timestamp").to_json_code(
|
|
108
|
+
Timestamp.from_unix_millis(3)
|
|
109
|
+
),
|
|
110
|
+
"3",
|
|
111
|
+
)
|
|
112
|
+
self.assertEqual(
|
|
113
|
+
primitive_serializer("timestamp").to_json_code(
|
|
114
|
+
Timestamp.from_unix_millis(3), readable=True
|
|
115
|
+
),
|
|
116
|
+
'{\n "unix_millis": 3,\n "formatted": "1970-01-01T00:00:00.003000Z"\n}',
|
|
117
|
+
)
|
|
118
|
+
self.assertEqual(
|
|
119
|
+
primitive_serializer("timestamp").from_json_code("3"),
|
|
120
|
+
Timestamp.from_unix_millis(3),
|
|
121
|
+
)
|
|
122
|
+
self.assertEqual(
|
|
123
|
+
primitive_serializer("timestamp").from_json_code(
|
|
124
|
+
'{\n "unix_millis": 3,\n "formatted": "FOO",\n "bar": true\n}'
|
|
125
|
+
),
|
|
126
|
+
Timestamp.from_unix_millis(3),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
def test_array_serializer(self):
|
|
130
|
+
self.assertEqual(
|
|
131
|
+
array_serializer(primitive_serializer("bool")).to_json_code((True, False)),
|
|
132
|
+
"[1,0]",
|
|
133
|
+
)
|
|
134
|
+
self.assertEqual(
|
|
135
|
+
array_serializer(primitive_serializer("bool")).to_json_code(
|
|
136
|
+
(True, False), readable=True
|
|
137
|
+
),
|
|
138
|
+
"[\n true,\n false\n]",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def test_optional_serializer(self):
|
|
142
|
+
self.assertEqual(
|
|
143
|
+
optional_serializer(primitive_serializer("bool")).to_json_code(True),
|
|
144
|
+
"1",
|
|
145
|
+
)
|
|
146
|
+
self.assertEqual(
|
|
147
|
+
optional_serializer(primitive_serializer("bool")).to_json_code(
|
|
148
|
+
True, readable=True
|
|
149
|
+
),
|
|
150
|
+
"true",
|
|
151
|
+
)
|
|
152
|
+
self.assertEqual(
|
|
153
|
+
optional_serializer(primitive_serializer("bool")).to_json_code(None),
|
|
154
|
+
"null",
|
|
155
|
+
)
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import unittest
|
|
2
|
-
|
|
3
|
-
from soialib import (
|
|
4
|
-
Timestamp,
|
|
5
|
-
array_serializer,
|
|
6
|
-
optional_serializer,
|
|
7
|
-
primitive_serializer,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class TimestampTestCase(unittest.TestCase):
|
|
12
|
-
def test_primitive_serializers(self):
|
|
13
|
-
self.assertEqual(primitive_serializer("bool").to_json_code(True), "1")
|
|
14
|
-
self.assertEqual(
|
|
15
|
-
primitive_serializer("bool").to_json_code(True, readable=True),
|
|
16
|
-
"true",
|
|
17
|
-
)
|
|
18
|
-
self.assertEqual(primitive_serializer("int32").to_json_code(7), "7")
|
|
19
|
-
self.assertEqual(
|
|
20
|
-
primitive_serializer("int32").to_json_code(7, readable=True), "7"
|
|
21
|
-
)
|
|
22
|
-
self.assertEqual(
|
|
23
|
-
primitive_serializer("int64").to_json_code(2147483648), "2147483648"
|
|
24
|
-
)
|
|
25
|
-
self.assertEqual(
|
|
26
|
-
primitive_serializer("uint64").to_json_code(2147483648),
|
|
27
|
-
"2147483648",
|
|
28
|
-
)
|
|
29
|
-
self.assertEqual(primitive_serializer("float32").to_json_code(3.14), "3.14")
|
|
30
|
-
self.assertEqual(primitive_serializer("float64").to_json_code(3.14), "3.14")
|
|
31
|
-
self.assertEqual(
|
|
32
|
-
primitive_serializer("float64").to_json_code(3.14, readable=True),
|
|
33
|
-
"3.14",
|
|
34
|
-
)
|
|
35
|
-
self.assertEqual(
|
|
36
|
-
primitive_serializer("timestamp").to_json_code(
|
|
37
|
-
Timestamp.from_unix_millis(3)
|
|
38
|
-
),
|
|
39
|
-
"3",
|
|
40
|
-
)
|
|
41
|
-
self.assertEqual(
|
|
42
|
-
primitive_serializer("timestamp").to_json_code(
|
|
43
|
-
Timestamp.from_unix_millis(3), readable=True
|
|
44
|
-
),
|
|
45
|
-
'{\n "unix_millis": 3,\n "formatted": "1970-01-01T00:00:00.003000Z"\n}',
|
|
46
|
-
)
|
|
47
|
-
self.assertEqual(primitive_serializer("string").to_json_code("foo"), '"foo"')
|
|
48
|
-
self.assertEqual(primitive_serializer("bytes").to_json_code(b"foo"), '"666f6f"')
|
|
49
|
-
|
|
50
|
-
def test_array_serializer(self):
|
|
51
|
-
self.assertEqual(
|
|
52
|
-
array_serializer(primitive_serializer("bool")).to_json_code((True, False)),
|
|
53
|
-
"[1,0]",
|
|
54
|
-
)
|
|
55
|
-
self.assertEqual(
|
|
56
|
-
array_serializer(primitive_serializer("bool")).to_json_code(
|
|
57
|
-
(True, False), readable=True
|
|
58
|
-
),
|
|
59
|
-
"[\n true,\n false\n]",
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
def test_optional_serializer(self):
|
|
63
|
-
self.assertEqual(
|
|
64
|
-
optional_serializer(primitive_serializer("bool")).to_json_code(True),
|
|
65
|
-
"1",
|
|
66
|
-
)
|
|
67
|
-
self.assertEqual(
|
|
68
|
-
optional_serializer(primitive_serializer("bool")).to_json_code(
|
|
69
|
-
True, readable=True
|
|
70
|
-
),
|
|
71
|
-
"true",
|
|
72
|
-
)
|
|
73
|
-
self.assertEqual(
|
|
74
|
-
optional_serializer(primitive_serializer("bool")).to_json_code(None),
|
|
75
|
-
"null",
|
|
76
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|