defl/tests/test_jq.py

168 lines
4.7 KiB
Python
Raw Normal View History

2025-03-09 09:17:53 -04:00
#!/usr/bin/env python
import json
from defl.testing_ import Tester, Test, TestState
from dataclasses import dataclass, field, KW_ONLY
import sys
import re, io
import os
import enum
import itertools
from functools import partial, partialmethod
from time import sleep
from operator import itemgetter
from defl import log, cl, Undefined, Null, Assert, Obj, JqLoad, Dath
from defl import CLIError
from defl._typing_ import *
from defl._pydantic_ import *
from defl._typing_ import false, true, none
import defl
log.setLevel('i')
tester = Tester(name=__file__)
@tester.add()
def toJson():
r = []
a = b'{"a":9,"b":[1,2,3],"c":{"a":{"b":1,"c":{"a":1},"d":{"a":2}},"d":[{"a":3},{"a":4}]}}\n'
jl = JqLoad()
r.extend(jl.send(a))
r.extend(jl.res())
Assert(r).eq(
[{'a': 9, 'b': [1, 2, 3], 'c': {'a': {'b': 1, 'c': {'a': 1}, 'd': {'a': 2}}, 'd': [{'a': 3}, {'a': 4}]}}]
)
@tester.add()
def toJson():
r = []
a = b"""
{"a":1}\n
{"a":2}\n
{"a":3}\n
"""
jl = JqLoad()
r.extend(jl.send(a))
r.extend(jl.res())
Assert(r).eq([{'a': 1}, {'a': 2}, {'a': 3}])
@tester.add()
def toJson():
r = []
a = b"""
{"a":1}\n
{"a"
"""
jl = JqLoad()
r.extend(jl.send(a))
a = jl.res()
Assert(next(a)) == {'a': 1}
try:
next(a)
raise NotImplementedError('dont get here')
except defl.JqError:
...
data = """
{ "name": "sda", "maj:min": "8:0", "rm": false, "size": "476.9G", "ro": false, "type": "disk" }
{ "name": "sda1", "maj:min": "8:1", "rm": false, "size": "512M", "ro": false, "type": "part"}
{
"name": "sda2", "maj:min": "8:2", "rm": false,
"size": "476.4G", "ro": false, "type": "part"
}
{
"name": "", "maj:min": "254:0",
"rm": false, "size": "476.4G", "ro": false, "type": "crypt" }
{
"name": "-swap",
"maj:min": "254:1",
"rm": false,
"size": "8G",
"ro": false,
"type": "lvm"
}
{"name":
"-root","maj:min":"254:2","rm":false,"size":"32G","ro":false,"type":"lvm"}
{ "name": "-home",
"maj:min": "254:3",
"rm": false, "size": "436.4G",
"ro": false,
"type": "lvm" }
"""
equ = [
{'name': 'sda', 'maj:min': '8:0', 'rm': False, 'size': '476.9G', 'ro': False, 'type': 'disk'},
{'name': 'sda1', 'maj:min': '8:1', 'rm': False, 'size': '512M', 'ro': False, 'type': 'part'},
{'name': 'sda2', 'maj:min': '8:2', 'rm': False, 'size': '476.4G', 'ro': False, 'type': 'part'},
{'name': '', 'maj:min': '254:0', 'rm': False, 'size': '476.4G', 'ro': False, 'type': 'crypt'},
{'name': '-swap', 'maj:min': '254:1', 'rm': False, 'size': '8G', 'ro': False, 'type': 'lvm'},
{'name': '-root', 'maj:min': '254:2', 'rm': False, 'size': '32G', 'ro': False, 'type': 'lvm'},
{'name': '-home', 'maj:min': '254:3', 'rm': False, 'size': '436.4G', 'ro': False, 'type': 'lvm'},
]
@tester.add()
def toJsonLoad():
a = io.BytesIO(data.encode())
Assert([x for x in JqLoad().fromFile(a)]).eq(equ)
a = io.BytesIO(data.encode())
Assert([x for x in JqLoad().fromFile(a, amnt=2)]).eq(equ)
@tester.add()
def toJsonSave():
tmp = Dath.Temp().tempFile(autoRemove=T)
with defl.JqDump(output=tmp) as d:
for i in equ:
d.dump(i)
t = tmp.read_text().split('\n')
Assert(t) == [
'{"name":"sda","maj:min":"8:0","rm":false,"size":"476.9G","ro":false,"type":"disk"}',
'{"name":"sda1","maj:min":"8:1","rm":false,"size":"512M","ro":false,"type":"part"}',
'{"name":"sda2","maj:min":"8:2","rm":false,"size":"476.4G","ro":false,"type":"part"}',
'{"name":"","maj:min":"254:0","rm":false,"size":"476.4G","ro":false,"type":"crypt"}',
'{"name":"-swap","maj:min":"254:1","rm":false,"size":"8G","ro":false,"type":"lvm"}',
'{"name":"-root","maj:min":"254:2","rm":false,"size":"32G","ro":false,"type":"lvm"}',
'{"name":"-home","maj:min":"254:3","rm":false,"size":"436.4G","ro":false,"type":"lvm"}',
'',
]
@tester.add()
def pydant():
@dantClass()
class A:
a: int
b: list['A'] | N = N
a = A(a=1, b=(A(a=2), A(a=3)))
for i in [
'__pydantic_complete__',
'__pydantic_config__',
'__pydantic_core_schema__',
'__pydantic_decorators__',
'__pydantic_fields__',
'__pydantic_serializer__',
'__pydantic_validator__',
]:
print(i, getattr(a, i))
a = defl.jsonReprDump(a)
Assert(a) == {'a': 1, 'b': [{'a': 2, 'b': None}, {'a': 3, 'b': None}]}
log.info(tester.run())
tester.exitWithStatus()