Coverage for gws-app/gws/spec/generator/util.py: 59%
44 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 23:09 +0200
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 23:09 +0200
1import os
2import re
3import json
5from gws.lib.cli import (
6 find_files,
7 find_dirs,
8 read_file,
9 write_file,
10 ensure_dir,
11)
14def _json(x):
15 if isinstance(x, bytes):
16 return x.hex()
17 try:
18 return vars(x)
19 except:
20 return repr(x)
23def write_json(path, obj):
24 write_file(path, json.dumps(obj, default=_json, indent=4, sort_keys=True))
27def read_json(path):
28 return json.loads(read_file(path))
31def parse_ini(text):
32 dct = {}
33 section = ''
34 key = ''
36 for ln in text.strip().splitlines():
37 ln = ln.strip()
38 if ln.startswith((';', '#', '//')):
39 continue
40 if ln.startswith('['):
41 section = ln[1:-1].strip()
42 continue
43 m = re.match(r'^([a-zA-Z0-9_.]+)\s*=(.*)', ln)
44 if m:
45 key = m.group(1).strip()
46 val = m.group(2)
47 dct.setdefault(section, {})[key] = val.strip().replace('\\n', '\n')
48 elif key:
49 dct[section][key] += '\n' + ln.strip()
50 elif ln:
51 raise ValueError(f'invalid ini string {ln!r}')
53 return dct
56def make_ini(dct):
57 buf = []
59 for sec, rows in dct.items():
60 buf.append('[' + sec + ']')
61 for k, v in sorted(rows.items()):
62 buf.append(k + '=' + v.replace('\n', '\\n'))
63 buf.append('')
65 return '\n'.join(buf)