11import functools
22import json
3+ import os
34import sys
45from enum import Enum
56from typing import Mapping , MutableSequence
1213 CP2KInputParserSimplified ,
1314)
1415
15- from . import base_dir_option , canonical_option , fhandle_argument , var_values_option
16+ from . import ENV_VAR_FOR_CP2K_INPUT_XML , base_dir_option , canonical_option , fhandle_argument , var_values_option , xml_option
1617
1718
1819def _key_trafo (string ):
@@ -21,11 +22,19 @@ def _key_trafo(string):
2122 return string .lower ()
2223
2324
25+ if sys .version_info >= (3 , 13 ):
26+ from enum import member
27+ else :
28+
29+ def member (value ):
30+ return value
31+
32+
2433class Trafos (Enum ):
2534 # see https://stackoverflow.com/a/40486992 need to wrap functions in function objects
26- auto = functools .partial (_key_trafo )
27- lower = functools .partial (str .lower )
28- upper = functools .partial (str .upper )
35+ auto = member ( functools .partial (_key_trafo ) )
36+ lower = member ( functools .partial (str .lower ) )
37+ upper = member ( functools .partial (str .upper ) )
2938
3039
3140@click .command ()
@@ -44,9 +53,16 @@ class Trafos(Enum):
4453 help = "transformation applied to key and section names" ,
4554)
4655@var_values_option
47- def fromcp2k (fhandle , oformat , canonical , base_dir , trafo , var_values ):
56+ @xml_option
57+ def fromcp2k (fhandle , oformat , canonical , base_dir , trafo , var_values , xml ):
4858 """Convert CP2K input to JSON (default), YAML or an aiida-cp2k run script template"""
4959
60+ if not xml :
61+ xml = os .environ .get (ENV_VAR_FOR_CP2K_INPUT_XML )
62+
63+ if xml :
64+ print (f" Using XML definition '{ xml } '" , file = sys .stderr )
65+
5066 if oformat == "aiida-cp2k-calc" :
5167 if canonical :
5268 print ("The --canonical argument is ignored when generating an aiida-cp2k run script template" , file = sys .stderr )
@@ -55,11 +71,11 @@ def fromcp2k(fhandle, oformat, canonical, base_dir, trafo, var_values):
5571 "Any key transformation function other than 'auto' is ignored when generating an aiida-cp2k run script template" ,
5672 file = sys .stderr ,
5773 )
58- cp2k_parser = CP2KInputParserAiiDA (base_dir = base_dir )
74+ cp2k_parser = CP2KInputParserAiiDA (xmlspec = xml , base_dir = base_dir )
5975 elif canonical :
60- cp2k_parser = CP2KInputParser (base_dir = base_dir , key_trafo = trafo .value )
76+ cp2k_parser = CP2KInputParser (xmlspec = xml , base_dir = base_dir , key_trafo = trafo .value )
6177 else :
62- cp2k_parser = CP2KInputParserSimplified (base_dir = base_dir , key_trafo = trafo .value )
78+ cp2k_parser = CP2KInputParserSimplified (xmlspec = xml , base_dir = base_dir , key_trafo = trafo .value )
6379
6480 tree = cp2k_parser .parse (fhandle , dict (var_values ))
6581
0 commit comments