88import argparse
99import json
1010from datetime import datetime
11+ from typing import Any , Dict , List , Optional , Tuple
1112
1213from pre_commit_hooks .util import validate_required_keys
1314
3435}
3536
3637
37- def build_argument_parser ():
38+ def build_argument_parser () -> argparse . ArgumentParser :
3839 """Build and return the argument parser."""
3940
4041 parser = argparse .ArgumentParser (
@@ -44,7 +45,7 @@ def build_argument_parser():
4445 return parser
4546
4647
47- def validate_key_types (name , manifest , filename ) :
48+ def validate_key_types (name : str , manifest : Dict [ str , Any ], filename : str ) -> bool :
4849 """Validation of manifest key types."""
4950
5051 # Manifest keys and their known types. Omitted keys are left unvalidated.
@@ -78,7 +79,9 @@ def validate_key_types(name, manifest, filename):
7879 return passed
7980
8081
81- def validate_type (name , property , filename ):
82+ def validate_type (
83+ name : str , property : Dict [str , Any ], filename : str
84+ ) -> Tuple [bool , Optional [str ]]: # noqa: A002
8285 """Ensure property type keu is present and among expected values."""
8386 passed = True
8487 type_found = None
@@ -98,7 +101,9 @@ def validate_type(name, property, filename):
98101 return passed , type_found
99102
100103
101- def validate_list_item_types (name , manifest , filename ):
104+ def validate_list_item_types (
105+ name : str , manifest : Dict [str , Any ], filename : str
106+ ) -> bool :
102107 """Validation of list member items."""
103108
104109 passed = True
@@ -109,10 +114,13 @@ def validate_list_item_types(name, manifest, filename):
109114 except IndexError :
110115 # Probably an empty array; no way to validate items
111116 continue
112- if isinstance (MANIFEST_LIST_TYPES [name ], tuple ):
113- desired_types = MANIFEST_LIST_TYPES [name ]
117+ manifest_list_type = MANIFEST_LIST_TYPES [name ]
118+ if isinstance (manifest_list_type , tuple ):
119+ # MANIFEST_LIST_TYPES[name] is a tuple of types
120+ desired_types = list (manifest_list_type )
114121 else :
115- desired_types = [MANIFEST_LIST_TYPES [name ]]
122+ # MANIFEST_LIST_TYPES[name] is a single type
123+ desired_types = [manifest_list_type ]
116124 if actual_type not in desired_types :
117125 print (
118126 f'{ filename } : "{ name } " items should be { MANIFEST_LIST_TYPES [name ]} , not { actual_type } '
@@ -122,7 +130,9 @@ def validate_list_item_types(name, manifest, filename):
122130 return passed
123131
124132
125- def validate_default (name , prop , type_found , filename ):
133+ def validate_default (
134+ name : str , prop : Dict [str , Any ], type_found : Optional [str ], filename : str
135+ ) -> bool :
126136 """Ensure that default values have the expected type."""
127137 passed = True
128138
@@ -132,16 +142,16 @@ def validate_default(name, prop, type_found, filename):
132142 actual_type = str
133143 else :
134144 actual_type = type (prop [test_key ])
135- if actual_type != MANIFEST_TYPES .get (type_found ):
145+ if actual_type != MANIFEST_TYPES .get (type_found ) if type_found else None :
136146 print (
137- f"{ filename } : { test_key } value for { name } should be { MANIFEST_TYPES .get (type_found )} , not { type (prop [test_key ])} "
147+ f"{ filename } : { test_key } value for { name } should be { MANIFEST_TYPES .get (type_found ) if type_found else 'Unknown' } , not { type (prop [test_key ])} "
138148 )
139149 passed = False
140150
141151 return passed
142152
143153
144- def validate_urls (name , prop , filename ) :
154+ def validate_urls (name : str , prop : Dict [ str , Any ], filename : str ) -> bool :
145155 """Ensure that URL values are actual URLs."""
146156 passed = True
147157
@@ -157,7 +167,7 @@ def validate_urls(name, prop, filename):
157167 return passed
158168
159169
160- def validate_properties (properties , filename ) :
170+ def validate_properties (properties : Dict [ str , Any ], filename : str ) -> bool :
161171 """Given a list of properties, run validation on their contents."""
162172 passed = True
163173
@@ -196,7 +206,7 @@ def validate_properties(properties, filename):
196206 return passed
197207
198208
199- def main (argv = None ):
209+ def main (argv : Optional [ List [ str ]] = None ) -> int :
200210 """Main process."""
201211
202212 # Parse command line arguments.
@@ -214,7 +224,7 @@ def main(argv=None):
214224 break # No need to continue checking this file
215225
216226 # Check for presence of required keys.
217- required_keys = ( "title" , "properties" , "description" )
227+ required_keys = [ "title" , "properties" , "description" ]
218228 if not validate_required_keys (manifest , filename , required_keys ):
219229 retval = 1
220230 break # No need to continue checking this file
0 commit comments