@ -15,6 +15,40 @@ import re
mutable_default_args = re . compile ( r " ^ \ s*def .+ \ ((.+= \ { \ }|.+= \ [ \ ]) " )
# D703: Found use of _() without explicit import of _!
UNDERSCORE_IMPORT_FILES = [ ]
string_translation = re . compile ( r " [^_]*_ \ ( \ s*( ' | \" ) " )
translated_log = re . compile (
r " (.)*LOG \ .(audit|error|info|warn|warning|critical|exception) "
" \ ( \ s*_ \ ( \ s*( ' | \" ) " )
underscore_import_check = re . compile ( r " (.)*import _(.)* " )
# We need this for cases where they have created their own _ function.
custom_underscore_check = re . compile ( r " (.)*_ \ s*= \ s*(.)* " )
def check_explicit_underscore_import ( logical_line , filename ) :
""" Check for explicit import of the _ function
We need to ensure that any files that are using the _ ( ) function
to translate logs are explicitly importing the _ function . We
can ' t trust unit test to catch whether the import has been
added so we need to check for it here .
"""
# Build a list of the files that have _ imported. No further
# checking needed once it is found.
if filename in UNDERSCORE_IMPORT_FILES :
pass
elif ( underscore_import_check . match ( logical_line ) or
custom_underscore_check . match ( logical_line ) ) :
UNDERSCORE_IMPORT_FILES . append ( filename )
elif ( translated_log . match ( logical_line ) or
string_translation . match ( logical_line ) ) :
yield ( 0 , " D703: Found use of _() without explicit import of _! " )
def no_log_warn ( logical_line ) :
""" Disallow ' LOG.warn( '
@ -36,5 +70,6 @@ def no_mutable_default_args(logical_line):
def factory ( register ) :
register ( check_explicit_underscore_import )
register ( no_mutable_default_args )
register ( no_log_warn )