66import re
77import shlex
88import sys
9+ from collections .abc import Callable
910from collections .abc import Sequence
1011from typing import Any
1112from typing import NamedTuple
@@ -190,6 +191,42 @@ def remove_default(self, dct: dict[str, Any]) -> None:
190191 raise NotImplementedError
191192
192193
194+ def _translate_language (name : str ) -> str :
195+ return {
196+ 'system' : 'unsupported' ,
197+ 'script' : 'unsupported_script' ,
198+ }.get (name , name )
199+
200+
201+ class LanguageMigration (NamedTuple ): # remove
202+ key : str
203+ check_fn : Callable [[object ], None ]
204+
205+ def check (self , dct : dict [str , Any ]) -> None :
206+ if self .key not in dct :
207+ return
208+
209+ with cfgv .validate_context (f'At key: { self .key } ' ):
210+ self .check_fn (_translate_language (dct [self .key ]))
211+
212+ def apply_default (self , dct : dict [str , Any ]) -> None :
213+ if self .key not in dct :
214+ return
215+
216+ dct [self .key ] = _translate_language (dct [self .key ])
217+
218+ def remove_default (self , dct : dict [str , Any ]) -> None :
219+ raise NotImplementedError
220+
221+
222+ class LanguageMigrationRequired (LanguageMigration ): # replace with Required
223+ def check (self , dct : dict [str , Any ]) -> None :
224+ if self .key not in dct :
225+ raise cfgv .ValidationError (f'Missing required key: { self .key } ' )
226+
227+ super ().check (dct )
228+
229+
193230MANIFEST_HOOK_DICT = cfgv .Map (
194231 'Hook' , 'id' ,
195232
@@ -203,7 +240,7 @@ def remove_default(self, dct: dict[str, Any]) -> None:
203240 cfgv .Required ('id' , cfgv .check_string ),
204241 cfgv .Required ('name' , cfgv .check_string ),
205242 cfgv .Required ('entry' , cfgv .check_string ),
206- cfgv . Required ('language' , cfgv .check_one_of (language_names )),
243+ LanguageMigrationRequired ('language' , cfgv .check_one_of (language_names )),
207244 cfgv .Optional ('alias' , cfgv .check_string , '' ),
208245
209246 cfgv .Optional ('files' , check_string_regex , '' ),
@@ -368,8 +405,10 @@ def check(self, dct: dict[str, Any]) -> None:
368405 'Hook' , 'id' ,
369406 cfgv .Required ('id' , cfgv .check_string ),
370407 cfgv .Required ('id' , cfgv .check_one_of (tuple (k for k , _ in _meta ))),
371- # language must be system
372- cfgv .Optional ('language' , cfgv .check_one_of ({'system' }), 'system' ),
408+ # language must be `unsupported`
409+ cfgv .Optional (
410+ 'language' , cfgv .check_one_of ({'unsupported' }), 'unsupported' ,
411+ ),
373412 # entry cannot be overridden
374413 NotAllowed ('entry' , cfgv .check_any ),
375414 * (
@@ -402,8 +441,10 @@ def check(self, dct: dict[str, Any]) -> None:
402441 for item in MANIFEST_HOOK_DICT .items
403442 if item .key != 'id'
404443 if item .key != 'stages'
444+ if item .key != 'language' # remove
405445 ),
406446 StagesMigrationNoDefault ('stages' , []),
447+ LanguageMigration ('language' , cfgv .check_one_of (language_names )), # remove
407448 * _COMMON_HOOK_WARNINGS ,
408449)
409450LOCAL_HOOK_DICT = cfgv .Map (
0 commit comments