defl/defl/_configFormats_.py
2024-09-11 11:14:03 -04:00

112 lines
2.8 KiB
Python

import itertools, enum, re, sys, io, csv
from dataclasses import dataclass, field
import defl
from defl import Assert, CLIError, Null, Path, Undefined, cl, log, json, Dunder
from defl._typing_ import *
# == Input
@dataclass(slots=True, kw_only=False, frozen=False)
class ConfigInput:
text: str = field(repr=False)
def extToFunc(_, ext):
return {
'json': _.json,
'jsonc': _.json,
'toml': _.toml,
'md': _.markdown,
'yml': _.yaml,
'csv': _.csv
}.get(ext, None)
def json(_) -> dict:
return defl.jloads(_.text)
def markdown(_) -> dict:
from defl.markdown_ import markdownToJson
return markdownToJson(_.text)
def xml(_) -> dict:
from defl.thirdParty import xmltodict
return xmltodict.parse(_.text)
def ini(_) -> dict:
import configparser
config = configparser.ConfigParser()
config.read_string(_.text)
# raise NotImplementedError('')
return config # todo not this
def toml(_) -> dict:
import tomllib
return tomllib.loads(_.text)
def csv(_) -> list[dict]:
import csv
result = csv.reader(_.text.splitlines())
result = [x for x in result]
head = result[0]
body = result[1:]
result = [dict(zip(head, x)) for x in body]
return result
def yaml(_) -> dict:
import yaml
return yaml.full_load(_.text)
def sql(_) -> dict:
raise NotImplementedError
# == Output
@dataclass(slots=True, kw_only=False, frozen=False)
class ConfigOutput:
data: list | dict
def json(_):
return defl.jdumps(_.data)
def markdown(_):
from defl.markdown_ import jsonToMarkdown
return jsonToMarkdown(_.data)
def xml(_):
raise NotImplementedError
def ini(_):
raise NotImplementedError
def toml(_):
import toml
return toml.dumps(_.data)
def csv(_):
def flattenjson(b, delim):
val = {}
for i in b.keys():
if isinstance(b[i], dict):
get = flattenjson(b[i], delim)
for j in get.keys():
val[i + delim + j] = get[j]
else:
val[i] = b[i]
return val
data = [flattenjson(item, "_") for item in _.data]
columns = set()
for x in data:
columns.update(x.keys())
string = io.StringIO()
writer = csv.DictWriter(string, columns)
writer.writeheader()
for row in data:
writer.writerow(row)
return string.getvalue()
def yaml(_):
import yaml
return yaml.dump(_.data, width=9**9)
def deflTable(_):
return str(defl.Table(_.data))