1515import pathlib
1616import re
1717import typing
18+ import warnings
1819from dataclasses import asdict , dataclass , field
1920from datetime import datetime
2021from enum import Enum
@@ -895,11 +896,15 @@ class runopt:
895896 class alias (str ):
896897 pass
897898
899+ class deprecated_alias (str ):
900+ pass
901+
898902 default : CfgVal
899903 opt_type : Type [CfgVal ]
900904 is_required : bool
901905 help : str
902906 aliases : list [alias ] | None = None
907+ deprecated_aliases : list [deprecated_alias ] | None = None
903908
904909 @property
905910 def is_type_list_of_str (self ) -> bool :
@@ -991,7 +996,7 @@ class runopts:
991996
992997 def __init__ (self ) -> None :
993998 self ._opts : Dict [str , runopt ] = {}
994- self ._alias_to_key : Dict [runopt .alias , str ] = {}
999+ self ._alias_to_key : Dict [runopt .alias | runopt . deprecated_alias | str ] = {}
9951000
9961001 def __iter__ (self ) -> Iterator [Tuple [str , runopt ]]:
9971002 return self ._opts .items ().__iter__ ()
@@ -1045,12 +1050,24 @@ def resolve(self, cfg: Mapping[str, CfgVal]) -> Dict[str, CfgVal]:
10451050 val = resolved_cfg .get (cfg_key )
10461051 resolved_name = None
10471052 aliases = runopt .aliases or []
1053+ deprecated_aliases = runopt .deprecated_aliases or []
10481054 if val is None :
10491055 for alias in aliases :
10501056 val = resolved_cfg .get (alias )
10511057 if alias in cfg or val is not None :
10521058 resolved_name = alias
10531059 break
1060+ for alias in deprecated_aliases :
1061+ val = resolved_cfg .get (alias )
1062+ if val is not None :
1063+ resolved_name = alias
1064+ use_instead = self ._alias_to_key .get (alias )
1065+ warnings .warn (
1066+ f"Run option: { alias } , is deprecated. Please use { use_instead } instead" ,
1067+ UserWarning ,
1068+ stacklevel = 2 ,
1069+ )
1070+ break
10541071 else :
10551072 resolved_name = cfg_key
10561073 for alias in aliases :
@@ -1176,20 +1193,23 @@ def cfg_from_json_repr(self, json_repr: str) -> Dict[str, CfgVal]:
11761193 def _get_primary_key_and_aliases (
11771194 self ,
11781195 cfg_key : list [str ] | str ,
1179- ) -> tuple [str , list [runopt .alias ]]:
1196+ ) -> tuple [str , list [runopt .alias ], list [ runopt . deprecated_alias ] ]:
11801197 """
11811198 Returns the primary key and aliases for the given cfg_key.
11821199 """
11831200 if isinstance (cfg_key , str ):
1184- return cfg_key , []
1201+ return cfg_key , [], []
11851202
11861203 if len (cfg_key ) == 0 :
11871204 raise ValueError ("cfg_key must be a non-empty list" )
11881205 primary_key = None
11891206 aliases = list [runopt .alias ]()
1207+ deprecated_aliases = list [runopt .deprecated_alias ]()
11901208 for name in cfg_key :
11911209 if isinstance (name , runopt .alias ):
11921210 aliases .append (name )
1211+ elif isinstance (name , runopt .deprecated_alias ):
1212+ deprecated_aliases .append (name )
11931213 else :
11941214 if primary_key is not None :
11951215 raise ValueError (
@@ -1200,7 +1220,7 @@ def _get_primary_key_and_aliases(
12001220 raise ValueError (
12011221 "Missing cfg_key. Please provide one other than the aliases."
12021222 )
1203- return primary_key , aliases
1223+ return primary_key , aliases , deprecated_aliases
12041224
12051225 def add (
12061226 self ,
@@ -1215,7 +1235,9 @@ def add(
12151235 value (if any). If the ``default`` is not specified then this option
12161236 is a required option.
12171237 """
1218- primary_key , aliases = self ._get_primary_key_and_aliases (cfg_key )
1238+ primary_key , aliases , deprecated_aliases = self ._get_primary_key_and_aliases (
1239+ cfg_key
1240+ )
12191241 if required and default is not None :
12201242 raise ValueError (
12211243 f"Required option: { cfg_key } must not specify default value. Given: { default } "
@@ -1226,9 +1248,11 @@ def add(
12261248 f"Option: { cfg_key } , must be of type: { type_ } ."
12271249 f" Given: { default } ({ type (default ).__name__ } )"
12281250 )
1229- opt = runopt (default , type_ , required , help , aliases )
1251+ opt = runopt (default , type_ , required , help , aliases , deprecated_aliases )
12301252 for alias in aliases :
12311253 self ._alias_to_key [alias ] = primary_key
1254+ for deprecated_alias in deprecated_aliases :
1255+ self ._alias_to_key [deprecated_alias ] = primary_key
12321256 self ._opts [primary_key ] = opt
12331257
12341258 def update (self , other : "runopts" ) -> None :
0 commit comments