soia-client 1.0.8__tar.gz → 1.0.9__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.9}/PKG-INFO +3 -2
- {soia_client-1.0.8 → soia_client-1.0.9}/README +4 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/pyproject.toml +1 -1
- {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/PKG-INFO +3 -2
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/arrays.py +4 -7
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/enums.py +2 -2
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/function_maker.py +6 -6
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/primitives.py +45 -17
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/structs.py +7 -7
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/serializer.py +1 -1
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/serializers.py +3 -1
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/timestamp.py +2 -1
- soia_client-1.0.9/tests/test_serializers.py +155 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/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.9}/LICENSE +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/setup.cfg +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/SOURCES.txt +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/dependency_links.txt +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/top_level.txt +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/__init__.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/__init__.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/optionals.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/repr.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/type_adapter.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/keyed_items.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/method.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/module_initializer.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/never.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/soialib/spec.py +0 -0
- {soia_client-1.0.8 → soia_client-1.0.9}/tests/test_module_initializer.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.9
|
|
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.9
|
|
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 ",
|
|
@@ -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),
|
|
@@ -622,7 +622,7 @@ def _make_from_json_fn(
|
|
|
622
622
|
)
|
|
623
623
|
builder.append_ln(" else:")
|
|
624
624
|
builder.append_ln(
|
|
625
|
-
|
|
625
|
+
" ret._unrecognized = ",
|
|
626
626
|
Expr.local("deepcopy", copy.deepcopy),
|
|
627
627
|
f"(json[{num_slots}:])",
|
|
628
628
|
)
|
|
@@ -638,7 +638,7 @@ def _make_from_json_fn(
|
|
|
638
638
|
builder.append_ln(f" array_len = {field.field.number}")
|
|
639
639
|
builder.append_ln(
|
|
640
640
|
f" {lvalue} = ",
|
|
641
|
-
field.type.from_json_expr(
|
|
641
|
+
field.type.from_json_expr(f'json["{name}"]'),
|
|
642
642
|
)
|
|
643
643
|
builder.append_ln(" else:")
|
|
644
644
|
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()
|
|
@@ -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
|
|
File without changes
|