12 import multiprocessing |
12 import multiprocessing |
13 import queue |
13 import queue |
14 import sys |
14 import sys |
15 |
15 |
16 import pycodestyle |
16 import pycodestyle |
17 |
17 from Annotations.AnnotationsChecker import AnnotationsChecker |
18 from Async.AsyncChecker import AsyncChecker |
18 from Async.AsyncChecker import AsyncChecker |
19 from CodeStyleFixer import CodeStyleFixer |
19 from CodeStyleFixer import CodeStyleFixer |
20 from Complexity.ComplexityChecker import ComplexityChecker |
20 from Complexity.ComplexityChecker import ComplexityChecker |
21 from DocStyle.DocStyleChecker import DocStyleChecker |
21 from DocStyle.DocStyleChecker import DocStyleChecker |
22 from Imports.ImportsChecker import ImportsChecker |
22 from Imports.ImportsChecker import ImportsChecker |
313 @rtype tuple of (dict, dict, None) or tuple of (None, None, ast.Module) |
313 @rtype tuple of (dict, dict, None) or tuple of (None, None, ast.Module) |
314 """ |
314 """ |
315 src = "".join(source) |
315 src = "".join(source) |
316 |
316 |
317 try: |
317 try: |
318 tree = ( |
318 tree = ast.parse(src, filename, "exec", type_comments=True) |
319 ast.parse(src, filename, "exec", type_comments=True) |
319 # need the 'type_comments' parameter to include type annotations |
320 # need the 'type_comments' parameter to include type annotations |
|
321 if sys.version_info >= (3, 8) |
|
322 else ast.parse(src, filename, "exec") |
|
323 ) |
|
324 return None, None, tree |
320 return None, None, tree |
325 except (SyntaxError, TypeError): |
321 except (SyntaxError, TypeError): |
326 exc_type, exc = sys.exc_info()[:2] |
322 exc_type, exc = sys.exc_info()[:2] |
327 if len(exc.args) > 1: |
323 if len(exc.args) > 1: |
328 offset = exc.args[1] |
324 offset = exc.args[1] |
492 complexityChecker.run() |
488 complexityChecker.run() |
493 stats.update(complexityChecker.counters) |
489 stats.update(complexityChecker.counters) |
494 errors += complexityChecker.errors |
490 errors += complexityChecker.errors |
495 |
491 |
496 # check function annotations |
492 # check function annotations |
497 if sys.version_info >= (3, 8, 0): |
493 annotationsChecker = AnnotationsChecker( |
498 # annotations with type comments are supported from |
494 source, |
499 # Python 3.8 on |
495 filename, |
500 from Annotations.AnnotationsChecker import ( # __IGNORE_WARNING_I10__ |
496 tree, |
501 AnnotationsChecker, |
497 select, |
502 ) |
498 ignore, |
503 |
499 [], |
504 annotationsChecker = AnnotationsChecker( |
500 repeatMessages, |
505 source, |
501 annotationArgs, |
506 filename, |
502 ) |
507 tree, |
503 annotationsChecker.run() |
508 select, |
504 stats.update(annotationsChecker.counters) |
509 ignore, |
505 errors += annotationsChecker.errors |
510 [], |
|
511 repeatMessages, |
|
512 annotationArgs, |
|
513 ) |
|
514 annotationsChecker.run() |
|
515 stats.update(annotationsChecker.counters) |
|
516 errors += annotationsChecker.errors |
|
517 |
506 |
518 # check for security issues |
507 # check for security issues |
519 securityChecker = SecurityChecker( |
508 securityChecker = SecurityChecker( |
520 source, filename, tree, select, ignore, [], repeatMessages, securityArgs |
509 source, filename, tree, select, ignore, [], repeatMessages, securityArgs |
521 ) |
510 ) |