112 lines
2.8 KiB
Python
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))
|