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.

Files changed (31) hide show
  1. {soia_client-1.0.8 → soia_client-1.0.9}/PKG-INFO +3 -2
  2. {soia_client-1.0.8 → soia_client-1.0.9}/README +4 -0
  3. {soia_client-1.0.8 → soia_client-1.0.9}/pyproject.toml +1 -1
  4. {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/PKG-INFO +3 -2
  5. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/arrays.py +4 -7
  6. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/enums.py +2 -2
  7. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/function_maker.py +6 -6
  8. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/primitives.py +45 -17
  9. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/structs.py +7 -7
  10. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/serializer.py +1 -1
  11. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/serializers.py +3 -1
  12. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/timestamp.py +2 -1
  13. soia_client-1.0.9/tests/test_serializers.py +155 -0
  14. {soia_client-1.0.8 → soia_client-1.0.9}/tests/test_timestamp.py +1 -1
  15. soia_client-1.0.8/tests/test_serializers.py +0 -76
  16. {soia_client-1.0.8 → soia_client-1.0.9}/LICENSE +0 -0
  17. {soia_client-1.0.8 → soia_client-1.0.9}/setup.cfg +0 -0
  18. {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/SOURCES.txt +0 -0
  19. {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/dependency_links.txt +0 -0
  20. {soia_client-1.0.8 → soia_client-1.0.9}/soia_client.egg-info/top_level.txt +0 -0
  21. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/__init__.py +0 -0
  22. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/__init__.py +0 -0
  23. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/optionals.py +0 -0
  24. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/repr.py +0 -0
  25. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/impl/type_adapter.py +0 -0
  26. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/keyed_items.py +0 -0
  27. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/method.py +0 -0
  28. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/module_initializer.py +0 -0
  29. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/never.py +0 -0
  30. {soia_client-1.0.8 → soia_client-1.0.9}/soialib/spec.py +0 -0
  31. {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
1
+ Metadata-Version: 2.4
2
2
  Name: soia-client
3
- Version: 1.0.8
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 +1,5 @@
1
1
  python3 -m unittest tests/**.py
2
+
3
+ pyright
4
+ flake8
5
+ black-formatter
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "soia-client"
7
- version = "1.0.8"
7
+ version = "1.0.9"
8
8
  description = ""
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Tyler Fibonacci", email = "gepheum@gmail.com" }]
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: soia-client
3
- Version: 1.0.8
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
- e = Expr.join("_e")
77
- item_to_json = self.item_adapter.to_json_expr(e, readable)
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(Expr.join("_e")),
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(Expr.join("value")),
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(Expr.join("json[1]"))
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(l: Union[str, Line]) -> str:
53
- if isinstance(l, str):
54
- return l
55
- return l._to_code(locals)
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(l) for l in body) if body else "pass"
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, l) for l in other)
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, " | 0)")
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
- pass
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
- pass
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
- pass
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, f"._array_len")
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
- f'(_self, "_array_len", ',
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(f"_self._array_len = ", array_len_expr())
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__ attribute.
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__ attribute.
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
- f" ret._unrecognized = ",
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(Expr.join(f'json["{name}"]')),
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, Optional, TypeVar, overload
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
+ )
@@ -87,7 +87,7 @@ class TimestampTestCase(unittest.TestCase):
87
87
  try:
88
88
  Timestamp.MIN.to_datetime_or_raise()
89
89
  self.fail("Expected to fail with OverflowError or ValueError")
90
- except Exception as e:
90
+ except Exception:
91
91
  pass
92
92
 
93
93
  def test_add_timedelta(self):
@@ -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