Coverage for gws-app/gws/plugin/qgis/cli.py: 0%

51 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1"""CLI utility for qgis""" 

2 

3import re 

4 

5import gws 

6import gws.config 

7import gws.base.shape 

8import gws.gis.crs 

9import gws.lib.importer 

10import gws.lib.jsonx 

11 

12from . import project 

13 

14 

15class CapsParams(gws.CliParams): 

16 src: str 

17 """Source path or postgres address `postgres:<dbUid>/<schema>/<projectName>`""" 

18 out: str = '' 

19 """Output filename""" 

20 

21 

22class CopyParams(gws.CliParams): 

23 src: str 

24 """Source path or postgres address `postgres:<dbUid>/<schema>/<projectName>`""" 

25 dst: str 

26 """Source path or postgres address `postgres:<dbUid>/<schema>/<projectName>`""" 

27 

28 

29class Object(gws.Node): 

30 

31 @gws.ext.command.cli('qgisCopy') 

32 def do_copy(self, p: CopyParams): 

33 """Copy a qgis project.""" 

34 

35 root = gws.config.load() 

36 src_prj = project.from_store(root, _addr_to_store(p.src)) 

37 src_prj.to_store(root, _addr_to_store(p.dst)) 

38 

39 @gws.ext.command.cli('qgisCaps') 

40 def do_caps(self, p: CapsParams): 

41 """Print the capabilities of a document in JSON format""" 

42 

43 root = gws.config.load() 

44 src_prj = project.from_store(root, _addr_to_store(p.src)) 

45 caps = src_prj.caps() 

46 

47 js = gws.lib.jsonx.to_pretty_string(caps, default=_caps_json) 

48 

49 if p.out: 

50 gws.u.write_file(p.out, js) 

51 gws.log.info(f'saved to {p.out!r}') 

52 else: 

53 print(js) 

54 

55 

56def _addr_to_store(addr): 

57 m = re.match(r'^postgres:(.*?)/(.*?)/(.+?)$', addr) 

58 if m: 

59 return project.Store( 

60 type=project.StoreType.postgres, 

61 dbUid=m.group(1), 

62 schema=m.group(2), 

63 projectName=m.group(3) 

64 ) 

65 m = re.match(r'^(/.+)$', addr) 

66 if m: 

67 return project.Store( 

68 type=project.StoreType.file, 

69 path=m.group(1), 

70 ) 

71 raise ValueError('invalid path or postgres address') 

72 

73 

74def _caps_json(x): 

75 if isinstance(x, gws.Crs): 

76 return x.epsg 

77 if isinstance(x, gws.base.shape.Shape): 

78 return x.to_geojson() 

79 try: 

80 return vars(x) 

81 except TypeError: 

82 return repr(x)