#!/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()