Overview
========

**pydiatra** is yet another static checker for Python code.

Implemented checks
==================

* embedded code copies

* ``except`` shadowing builtins
  (e.g. ``except IOError, OSError:``, which overwrites ``OSError``)

* bare ``except``
  (i.e. ``except:``)

* hardcoded errno values
  (e.g. ``exc.errno == 2`` instead of ``exc.errno == errno.ENOENT``)

* inconsistent use of tabs and spaces in indentation

* ``mkstemp()`` file descriptor leaks
  (e.g. ``path = tempfile.mkstemp()[1]``)

* obsolete PIL imports
  (e.g. ``import Image`` instead of ``from PIL import Image``)

* regular expression syntax errors

* misplaced flags arguments in
  ``re.split()``, ``re.sub()``, ``re.subn()``

* dubious or deprecated constructs in regular expressions:

  * duplicate range
    (e.g. ``re.compile("[aa]")``)

  * overlapping ranges
    (e.g. ``re.compile("[a-zA-z]")``)

  * bad escape sequences
    (e.g. ``re.compile(r"\eggs")``)

  * misplaced inline flags
    (e.g. ``re.compile("eggs(?i)")``; Python 3.6+ only)

  * combining incompatible flags

  * redundant flags

* string exceptions
  (e.g. ``raise "eggs"`` or ``except "ham":``)

* string formatting errors

* comparisons with ``sys.version`` or ``sys.hexversion``

* Python syntax errors

* Python syntax warnings

  * assertions that are always true

  * syntactic constructs that are no longer supported in Python 3

  * ill-formed assignments to global variables

  * use of ``async`` and ``await`` as names

  * invalid escape sequences in strings
    (Python 3.6+ only)

See the manual page for details.

Prerequisites
=============

* Python 2.6+ or 3.2+
* argparse_ (needed only for Python 2.6)
* futures_ (needed only for Python 2.X)

.. _argparse:
   https://pypi.org/project/argparse/

.. _futures:
   https://pypi.org/project/futures/

.. vim:ft=rst ts=3 sts=3 sw=3 et tw=72
