@@ -63,14 +63,71 @@ class Lang(tuple):
6363
6464 __slots__ = () # set immutability of Lang
6565
66- def __new__ (cls , name_or_identifier : Union [str , "Lang" ]):
67- lang_tuple = cls ._validate_arg (name_or_identifier )
68- if lang_tuple == tuple (): # not valid argument
69- cls ._assert_not_deprecated (name_or_identifier )
70- raise InvalidLanguageValue (name_or_identifier = name_or_identifier )
66+ def __new__ (
67+ cls ,
68+ name_or_identifier : Optional [Union [str , "Lang" ]] = None ,
69+ name : Optional [str ] = None ,
70+ pt1 : Optional [str ] = None ,
71+ pt2b : Optional [str ] = None ,
72+ pt2t : Optional [str ] = None ,
73+ pt3 : Optional [str ] = None ,
74+ pt5 : Optional [str ] = None ,
75+ ):
76+ # parse main argument
77+ if name_or_identifier is None :
78+ arg_lang_tuple = None
79+ else :
80+ arg_lang_tuple = cls ._validate_arg (name_or_identifier )
81+
82+ # parse other arguments
83+ if all (v is None for v in (name , pt1 , pt2b , pt2t , pt3 , pt5 )):
84+ kwargs_lang_tuple = None
85+ else :
86+ kwargs_lang_tuple = cls ._validate_kwargs (
87+ name = name , pt1 = pt1 , pt2b = pt2b , pt2t = pt2t , pt3 = pt3 , pt5 = pt5
88+ )
89+
90+ # check compatiblity between main argument and other arguments
91+ if arg_lang_tuple is None and kwargs_lang_tuple is None :
92+ lang_tuple = None
93+ elif arg_lang_tuple is not None and kwargs_lang_tuple is None :
94+ lang_tuple = arg_lang_tuple
95+ elif kwargs_lang_tuple is not None and arg_lang_tuple is None :
96+ lang_tuple = kwargs_lang_tuple
97+ elif (
98+ arg_lang_tuple is not None
99+ and kwargs_lang_tuple is not None
100+ and arg_lang_tuple == kwargs_lang_tuple
101+ ):
102+ lang_tuple = arg_lang_tuple
103+ else :
104+ lang_tuple = tuple ()
71105
72- # instantiate as a tuple of ISO 639 language values
73- return tuple .__new__ (cls , lang_tuple )
106+ # chack if arguments match a deprecated language value
107+ if lang_tuple == tuple ():
108+ cls ._assert_not_deprecated (
109+ name_or_identifier = name_or_identifier ,
110+ name = name ,
111+ pt1 = pt1 ,
112+ pt2b = pt2b ,
113+ pt2t = pt2t ,
114+ pt3 = pt3 ,
115+ pt5 = pt5 ,
116+ )
117+
118+ if not lang_tuple :
119+ raise InvalidLanguageValue (
120+ name_or_identifier = name_or_identifier ,
121+ name = name ,
122+ pt1 = pt1 ,
123+ pt2b = pt2b ,
124+ pt2t = pt2t ,
125+ pt3 = pt3 ,
126+ pt5 = pt5 ,
127+ )
128+ else :
129+ # instantiate as a tuple of ISO 639 language values
130+ return tuple .__new__ (cls , lang_tuple )
74131
75132 def __repr__ (self ):
76133 chunks = ["=" .join ((tg , repr (getattr (self , tg )))) for tg in self ._tags ]
@@ -210,15 +267,42 @@ def _validate_arg(cls, arg_value):
210267 return tuple ()
211268
212269 @classmethod
213- def _assert_not_deprecated (cls , arg_value ):
214- for key in ("id" , "name" ):
215- try :
216- d = cls ._deprecated [key ][arg_value ]
217- except KeyError :
218- pass
219- else :
220- d [key ] = arg_value
221- raise DeprecatedLanguageValue (** d )
270+ def _validate_kwargs (cls , ** kwargs ):
271+ lang_tuples = set ()
272+ for tg , v in kwargs .items ():
273+ if v :
274+ lang_tuples .add (cls ._get_language_tuple (tg , v ))
275+ if len (lang_tuples ) == 1 :
276+ return lang_tuples .pop ()
277+
278+ return tuple ()
279+
280+ @classmethod
281+ def _assert_not_deprecated (cls , ** kwargs ):
282+ deprecated = []
283+ for kw , arg_value in kwargs .items ():
284+ if arg_value is None :
285+ continue
286+ elif kw == "name_or_identifier" :
287+ keys = ("id" , "name" )
288+ elif kw == "name" :
289+ keys = ("name" ,)
290+ elif kw in ("pt1" , "pt2b" , "pt2t" , "pt3" , "pt5" ):
291+ keys = ("id" ,)
292+
293+ for k in keys :
294+ try :
295+ d = cls ._deprecated [k ][arg_value ]
296+ except KeyError :
297+ pass
298+ else :
299+ d [k ] = arg_value
300+ deprecated .append (d )
301+
302+ if deprecated and deprecated .count (deprecated [0 ]) == 1 :
303+ raise DeprecatedLanguageValue (** deprecated [0 ])
304+
305+ return True
222306
223307 @classmethod
224308 def _get_language_tuple (cls , tag , arg_value ):
0 commit comments