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 22:59 +0200

1import os 

2import re 

3import json 

4 

5from gws.lib.cli import ( 

6 find_files, 

7 find_dirs, 

8 read_file, 

9 write_file, 

10 ensure_dir, 

11) 

12 

13 

14def _json(x): 

15 if isinstance(x, bytes): 

16 return x.hex() 

17 try: 

18 return vars(x) 

19 except: 

20 return repr(x) 

21 

22 

23def write_json(path, obj): 

24 write_file(path, json.dumps(obj, default=_json, indent=4, sort_keys=True)) 

25 

26 

27def read_json(path): 

28 return json.loads(read_file(path)) 

29 

30 

31def parse_ini(text): 

32 dct = {} 

33 section = '' 

34 key = '' 

35 

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}') 

52 

53 return dct 

54 

55 

56def make_ini(dct): 

57 buf = [] 

58 

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('') 

64 

65 return '\n'.join(buf)