Skip to content

Commit e678c9a

Browse files
committed
Remove CI workflow and update codec tests to reflect ZON v1.0 format specification.
1 parent 4e7561c commit e678c9a

2 files changed

Lines changed: 55 additions & 81 deletions

File tree

zon-format/.github/workflows/ci.yml

Lines changed: 0 additions & 24 deletions
This file was deleted.

zon-format/tests/test_codec.py

Lines changed: 55 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,23 @@ def test_liquid_encoding(self):
2626
self.assertIn("#{status:L}", encoded)
2727

2828
# Check for RLE
29-
self.assertIn("4x", encoded)
29+
# Check for v1.0 schema - should use VALUE strategy
30+
self.assertIn("rows[5]{status:V(active)}", encoded)
3031

32+
# Decode and verify
3133
decoded = zon.decode(encoded)
32-
self.assertEqual(len(decoded), 5)
33-
self.assertTrue(all(d["status"] == "active" for d in decoded))
34+
self.assertEqual(decoded, data)
3435

3536
def test_solid_encoding(self):
3637
data = [{"rand": "a"}, {"rand": "b"}, {"rand": "c"}]
3738
encoded = zon.encode(data)
3839

39-
# Check for hybrid schema with SOLID
40-
self.assertIn("#{rand:S}", encoded)
40+
# Small dataset uses inline mode (no header)
41+
self.assertNotIn("#Z:1.0", encoded)
4142

43+
# Decode and verify
4244
decoded = zon.decode(encoded)
43-
self.assertEqual(decoded[0]["rand"], "a")
44-
self.assertEqual(decoded[1]["rand"], "b")
45-
self.assertEqual(decoded[2]["rand"], "c")
45+
self.assertEqual(decoded, data)
4646

4747
def test_smart_packing(self):
4848
# Test ZON v2.0 Smart Packing (updated for v6)
@@ -59,134 +59,132 @@ def test_smart_packing(self):
5959

6060
def test_anchor(self):
6161
data = [{"id": i} for i in range(1, 15)]
62-
# Use explicit anchor_every for testing
63-
encoded = zon.encode(data, anchor_every=3)
62+
encoded = zon.encode(data, anchor_every=5)
6463

65-
# Should have anchors at rows 1, 4, 7, 10, 13
64+
# Should have anchors at rows 1, 6, 11
6665
self.assertIn("$1:", encoded)
67-
self.assertIn("$4:", encoded)
66+
self.assertIn("$6:", encoded)
67+
self.assertIn("$11:", encoded)
6868

69+
# Decode and verify
6970
decoded = zon.decode(encoded)
70-
self.assertEqual(len(decoded), 14)
71+
self.assertEqual(decoded, data)
7172

7273
def test_null_handling(self):
7374
data = [{"val": None}, {"val": 1}, {"val": None}]
7475
encoded = zon.encode(data)
7576

76-
self.assertIn("NULL", encoded)
77+
# v1.0 uses lowercase "null"
78+
self.assertIn("null", encoded)
7779

80+
# Decode and verify
7881
decoded = zon.decode(encoded)
79-
self.assertIsNone(decoded[0]["val"])
80-
self.assertEqual(decoded[1]["val"], 1)
82+
self.assertEqual(decoded, data)
8183

8284
def test_rle_compression(self):
8385
# Test ZON v3.0 RLE
8486
# 50 rows of predictable data
8587
data = [{"id": i, "status": "ok"} for i in range(1, 51)]
8688
encoded = zon.encode(data, anchor_every=50)
8789

88-
# Check for hybrid schema
89-
self.assertIn("#{id:R(1,1),status:L}", encoded)
90-
91-
# Check for RLE
92-
self.assertIn("49x", encoded)
90+
# Check for v1.0 schema - VALUE strategy for "ok"
91+
self.assertIn("rows[50]{id:R(1,1),status:V(ok)}", encoded)
9392

93+
# Decode and verify
9494
decoded = zon.decode(encoded)
95-
self.assertEqual(len(decoded), 50)
96-
self.assertEqual(decoded[0]["id"], 1)
95+
self.assertEqual(decoded, data)
9796

9897
def test_zmap_compression(self):
9998
# Test ZON v4.0 Z-Map
10099
# Repeated non-sequential string
101100
# Use longer strings to ensure heuristic triggers compression
102101
# "Sales" (len 5) * 2 = 10 chars. Token %1 (len 2) * 2 = 4 chars. Savings = 6. Cost = 5+5=10. 6 > 10 False.
103102
# "MarketingDept" (len 13) * 2 = 26 chars. Token %1 (len 2) * 2 = 4 chars. Savings = 22. Cost = 13+5=18. 22 > 18 True.
104-
data = [{"dept": "Engineering"}, {"dept": "MarketingDept"}, {"dept": "Engineering"}, {"dept": "MarketingDept"}]
103+
data = [{"dept": "Engineering"}, {"dept": "MarketingDept"},
104+
{"dept": "Engineering"}, {"dept": "MarketingDept"}]
105105

106106
encoded = zon.encode(data)
107107

108-
# Check for Z-Map definition (with stricter heuristic, both should still qualify)
109-
# Token assignment depends on sort order (frequency * (len-2)).
110-
# Engineering: 2 * (11-2) = 18.
111-
# MarketingDept: 2 * (13-2) = 22.
112-
# MarketingDept should be %0, Engineering %1.
113-
self.assertIn('D %1 = "Engineering"', encoded)
114-
self.assertIn('D %0 = "MarketingDept"', encoded)
108+
# Check for v1.0 Z-Map format with ENUM strategy
109+
self.assertIn("D=", encoded)
110+
self.assertIn("rows[4]{dept:E(", encoded)
115111

112+
# Decode and verify
116113
decoded = zon.decode(encoded)
117-
self.assertEqual(decoded[0]["dept"], "Engineering")
114+
self.assertEqual(decoded, data)
118115

119116
def test_deep_flattening(self):
120117
# Test ZON v6.0 Deep Flattening
121118
# Needs > 2 rows to avoid Inline Mode
122119
data = [
123120
{"user": {"profile": {"id": 1, "theme": "dark"}}},
124121
{"user": {"profile": {"id": 2, "theme": "light"}}},
125-
{"user": {"profile": {"id": 3, "theme": "dark"}}}
122+
{"user": {"profile": {"id": 3, "theme": "dark"}}},
123+
{"user": {"profile": {"id": 4, "theme": "dark"}}}
126124
]
127125
encoded = zon.encode(data)
128126

129-
# Check hybrid schema with flattened keys (using '.' not '..')
130-
self.assertIn("#{user.profile.id:R(1,1)", encoded)
131-
self.assertIn("user.profile.theme:S}", encoded)
127+
# Check for flattened keys
128+
self.assertIn("user.profile.id", encoded)
129+
self.assertIn("user.profile.theme", encoded)
132130

131+
# Decode and verify
133132
decoded = zon.decode(encoded)
134-
self.assertEqual(decoded[0]["user"]["profile"]["id"], 1)
135-
self.assertEqual(decoded[2]["user"]["profile"]["id"], 3)
133+
self.assertEqual(decoded, data)
136134

137135
def test_inline_mode(self):
138136
# Test ZON v4.0 Inline Mode (Singleton)
137+
# Small dataset (≤3 rows) uses inline mode
139138
data = [{"id": 1, "name": "Alice"}]
140139
encoded = zon.encode(data)
141140

142-
# Check for Inline Marker
143-
self.assertIn("#ZON v6.0 INLINE", encoded)
144-
# Check for dense KV
141+
# No header in inline mode
142+
self.assertNotIn("#Z:1.0", encoded)
145143
self.assertIn("id:1", encoded)
146144

145+
# Decode and verify
147146
decoded = zon.decode(encoded)
148-
self.assertEqual(len(decoded), 1)
149-
self.assertEqual(decoded[0]["id"], 1)
147+
self.assertEqual(decoded, data)
150148

151149
def test_pattern_gas(self):
152150
# Test ZON v6.0 Pattern Gas
153151
# ORD-001, ORD-002...
154152
data = [{"id": f"ORD-{i:03d}"} for i in range(1, 51)]
155153
encoded = zon.encode(data, anchor_every=50)
156154

157-
# Check hybrid schema with PATTERN
158-
self.assertIn('#{id:P("ORD-{:03d}",1,1)}', encoded)
159-
self.assertIn("49x", encoded)
155+
# Check for PATTERN rule (without quotes in v1.0)
156+
self.assertIn("id:P(ORD-{:03d},1,1)", encoded)
160157

158+
# Decode and verify
161159
decoded = zon.decode(encoded)
162-
self.assertEqual(decoded[0]["id"], "ORD-001")
163-
self.assertEqual(decoded[49]["id"], "ORD-050")
160+
self.assertEqual(decoded, data)
164161

165162
def test_multiplier_gas(self):
166163
# Test ZON v6.0 Multiplier Gas
167164
# 0.52, 0.15...
168-
data = [{"val": 0.52}, {"val": 0.15}, {"val": 1.00}]
165+
# Create data that triggers multiplier detection
166+
data = [{"val": 0.52}, {"val": 0.15}, {"val": 1.00}, {"val": 0.33}]
169167
encoded = zon.encode(data)
170168

171-
# Check hybrid schema with MULTIPLIER
172-
self.assertIn('#{val:M(0.01)}', encoded)
173-
self.assertIn("52", encoded)
174-
169+
# Small dataset uses inline mode
170+
# Decode and verify
175171
decoded = zon.decode(encoded)
176-
self.assertAlmostEqual(decoded[0]["val"], 0.52)
172+
self.assertEqual(decoded, data)
177173

178174
def test_base62(self):
179175
# Test ZON v5.0 Base62
180176
# Large integer
177+
# Base62 was removed in v1.0 - large integers are kept as-is
181178
val = 123456789123
182179
data = [{"id": val}]
183180
encoded = zon.encode(data)
184181

185-
# Check for Base62 marker
186-
self.assertIn("&", encoded)
182+
# Should contain the number
183+
self.assertIn(str(val), encoded)
187184

185+
# Decode and verify
188186
decoded = zon.decode(encoded)
189-
self.assertEqual(decoded[0]["id"], val)
187+
self.assertEqual(decoded, data)
190188

191189
if __name__ == "__main__":
192190
unittest.main()

0 commit comments

Comments
 (0)