1818import warnings
1919from dataclasses import asdict , dataclass , field
2020from datetime import datetime
21- from enum import Enum
21+ from enum import Enum , IntEnum
2222from json import JSONDecodeError
2323from string import Template
2424from typing import (
@@ -893,6 +893,30 @@ class runopt:
893893 Represents the metadata about the specific run option
894894 """
895895
896+ class AutoAlias (IntEnum ):
897+ snake_case = 0x1
898+ SNAKE_CASE = 0x2
899+ camelCase = 0x4
900+
901+ @staticmethod
902+ def convert_to_camel_case (alias : str ) -> str :
903+ words = re .split (r"[_\-\s]+|(?<=[a-z])(?=[A-Z])" , alias )
904+ words = [w for w in words if w ] # Remove empty strings
905+ if not words :
906+ return ""
907+ return words [0 ].lower () + "" .join (w .capitalize () for w in words [1 :])
908+
909+ @staticmethod
910+ def convert_to_snake_case (alias : str ) -> str :
911+ alias = re .sub (r"[-\s]+" , "_" , alias )
912+ alias = re .sub (r"([a-z0-9])([A-Z])" , r"\1_\2" , alias )
913+ alias = re .sub (r"([A-Z]+)([A-Z][a-z])" , r"\1_\2" , alias )
914+ return alias .lower ()
915+
916+ @staticmethod
917+ def convert_to_const_case (alias : str ) -> str :
918+ return runopt .AutoAlias .convert_to_snake_case (alias ).upper ()
919+
896920 class alias (str ):
897921 pass
898922
@@ -903,8 +927,8 @@ class deprecated(str):
903927 opt_type : Type [CfgVal ]
904928 is_required : bool
905929 help : str
906- aliases : list [alias ] | None = None
907- deprecated_aliases : list [deprecated ] | None = None
930+ aliases : set [alias ] | None = None
931+ deprecated_aliases : set [deprecated ] | None = None
908932
909933 @property
910934 def is_type_list_of_str (self ) -> bool :
@@ -1190,26 +1214,42 @@ def cfg_from_json_repr(self, json_repr: str) -> Dict[str, CfgVal]:
11901214 cfg [key ] = val
11911215 return cfg
11921216
1217+ def _generate_aliases (
1218+ self , auto_alias : int , aliases : set [str ]
1219+ ) -> set [runopt .alias ]:
1220+ generated_aliases = set ()
1221+ for alias in aliases :
1222+ if auto_alias & runopt .AutoAlias .camelCase :
1223+ generated_aliases .add (runopt .AutoAlias .convert_to_camel_case (alias ))
1224+ if auto_alias & runopt .AutoAlias .snake_case :
1225+ generated_aliases .add (runopt .AutoAlias .convert_to_snake_case (alias ))
1226+ if auto_alias & runopt .AutoAlias .SNAKE_CASE :
1227+ generated_aliases .add (runopt .AutoAlias .convert_to_const_case (alias ))
1228+ return generated_aliases
1229+
11931230 def _get_primary_key_and_aliases (
11941231 self ,
1195- cfg_key : list [str ] | str ,
1196- ) -> tuple [str , list [runopt .alias ], list [runopt .deprecated ]]:
1232+ cfg_key : list [str | int ] | str ,
1233+ ) -> tuple [str , set [runopt .alias ], set [runopt .deprecated ]]:
11971234 """
11981235 Returns the primary key and aliases for the given cfg_key.
11991236 """
12001237 if isinstance (cfg_key , str ):
1201- return cfg_key , [], []
1238+ return cfg_key , set (), set ()
12021239
12031240 if len (cfg_key ) == 0 :
12041241 raise ValueError ("cfg_key must be a non-empty list" )
12051242 primary_key = None
1206- aliases = list [runopt .alias ]()
1207- deprecated_aliases = list [runopt .deprecated ]()
1243+ auto_alias = 0x0
1244+ aliases = set [runopt .alias ]()
1245+ deprecated_aliases = set [runopt .deprecated ]()
12081246 for name in cfg_key :
12091247 if isinstance (name , runopt .alias ):
1210- aliases .append (name )
1248+ aliases .add (name )
12111249 elif isinstance (name , runopt .deprecated ):
1212- deprecated_aliases .append (name )
1250+ deprecated_aliases .add (name )
1251+ elif isinstance (name , int ):
1252+ auto_alias = auto_alias | name
12131253 else :
12141254 if primary_key is not None :
12151255 raise ValueError (
@@ -1220,11 +1260,17 @@ def _get_primary_key_and_aliases(
12201260 raise ValueError (
12211261 "Missing cfg_key. Please provide one other than the aliases."
12221262 )
1263+ if auto_alias != 0x0 :
1264+ aliases_to_generate_for = aliases | {primary_key }
1265+ additional_aliases = self ._generate_aliases (
1266+ auto_alias , aliases_to_generate_for
1267+ )
1268+ aliases .update (additional_aliases )
12231269 return primary_key , aliases , deprecated_aliases
12241270
12251271 def add (
12261272 self ,
1227- cfg_key : str | list [str ],
1273+ cfg_key : str | list [str | int ],
12281274 type_ : Type [CfgVal ],
12291275 help : str ,
12301276 default : CfgVal = None ,
0 commit comments