mirror of
https://github.com/PyCQA/flake8.git
synced 2026-04-05 04:36:52 +00:00
Merge branch 'origin/proposed/3.0' into master
This commit is contained in:
commit
cee691059f
167 changed files with 11120 additions and 3162 deletions
300
docs/source/conf.py
Normal file
300
docs/source/conf.py
Normal file
|
|
@ -0,0 +1,300 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# flake8 documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Jan 19 07:14:10 2016.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
needs_sphinx = '1.3'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.doctest',
|
||||
'sphinx.ext.intersphinx',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.coverage',
|
||||
'sphinx.ext.viewcode',
|
||||
'sphinx-prompt',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The encoding of source files.
|
||||
#source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'flake8'
|
||||
copyright = u'2016, Ian Cordasco'
|
||||
author = u'Ian Cordasco'
|
||||
|
||||
import flake8
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = flake8.__version__
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = flake8.__version__
|
||||
|
||||
rst_epilog = """
|
||||
.. |Flake8| replace:: :program:`Flake8`
|
||||
"""
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = []
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
#default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
#keep_warnings = False
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = True
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
#html_theme_path = []
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
#html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
# html_static_path = ['_static']
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#html_extra_path = []
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
#html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
#html_file_suffix = None
|
||||
|
||||
# Language to be used for generating the HTML full-text search index.
|
||||
# Sphinx supports the following languages:
|
||||
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
|
||||
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
|
||||
#html_search_language = 'en'
|
||||
|
||||
# A dictionary with options for the search language support, empty by default.
|
||||
# Now only 'ja' uses this config value
|
||||
#html_search_options = {'type': 'default'}
|
||||
|
||||
# The name of a javascript file (relative to the configuration directory) that
|
||||
# implements a search results scorer. If empty, the default will be used.
|
||||
#html_search_scorer = 'scorer.js'
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'flake8doc'
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'flake8.tex', u'flake8 Documentation',
|
||||
u'Ian Cordasco', 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'flake8', u'flake8 Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#man_show_urls = False
|
||||
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
('index', 'Flake8', u'Flake8 Documentation', u'Tarek Ziade',
|
||||
'Flake8', 'Code checking using pycodestyle, pyflakes and mccabe',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#texinfo_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#texinfo_domain_indices = True
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
#texinfo_show_urls = 'footnote'
|
||||
|
||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
||||
#texinfo_no_detailmenu = False
|
||||
|
||||
|
||||
# Example configuration for intersphinx: refer to the Python standard library.
|
||||
intersphinx_mapping = {'python': ('https://docs.python.org/3.4', None)}
|
||||
56
docs/source/faq.rst
Normal file
56
docs/source/faq.rst
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
============================
|
||||
Frequently Asked Questions
|
||||
============================
|
||||
|
||||
When is Flake8 released?
|
||||
========================
|
||||
|
||||
|Flake8| is released *as necessary*. Sometimes there are specific goals and
|
||||
drives to get to a release. Usually, we release as users report and fix
|
||||
bugs.
|
||||
|
||||
|
||||
How can I help Flake8 release faster?
|
||||
=====================================
|
||||
|
||||
Look at the next milestone. If there's work you can help us complete, that
|
||||
will help us get to the next milestone. If there's a show-stopping bug that
|
||||
needs to be released, let us know but please be kind. |Flake8| is developed
|
||||
and released entirely on volunteer time.
|
||||
|
||||
|
||||
What is the next version of Flake8?
|
||||
===================================
|
||||
|
||||
In general we try to use milestones to indicate this. If the last release
|
||||
on PyPI is 3.1.5 and you see a milestone for 3.2.0 in GitLab, there's a
|
||||
good chance that 3.2.0 is the next release.
|
||||
|
||||
|
||||
Why does Flake8 use ranges for its dependencies?
|
||||
================================================
|
||||
|
||||
|Flake8| uses ranges for mccabe, pyflakes, and pycodestyle because each of
|
||||
those projects tend to add *new* checks in minor releases. It has been an
|
||||
implicit design goal of |Flake8|'s to make the list of error codes stable in
|
||||
its own minor releases. That way if you install something from the 2.5
|
||||
series today, you will not find new checks in the same series in a month
|
||||
from now when you install it again.
|
||||
|
||||
|Flake8|'s dependencies tend to avoid new checks in patch versions which is
|
||||
why |Flake8| expresses its dependencies roughly as::
|
||||
|
||||
pycodestyle >= 2.0.0, < 2.1.0
|
||||
pyflakes >= 0.8.0, != 1.2.0, != 1.2.1, != 1.2.2, < 1.3.0
|
||||
mccabe >= 0.5.0, < 0.6.0
|
||||
|
||||
This allows those projects to release patch versions that fix bugs and for
|
||||
|Flake8| users to consume those fixes.
|
||||
|
||||
|
||||
Should I file an issue when a new version of a dependency is available?
|
||||
=======================================================================
|
||||
|
||||
**No.** The current Flake8 core team (of one person) is also
|
||||
a core developer of pycodestyle, pyflakes, and mccabe. They are aware of
|
||||
these releases.
|
||||
56
docs/source/glossary.rst
Normal file
56
docs/source/glossary.rst
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
.. _glossary:
|
||||
|
||||
================================================
|
||||
Glossary of Terms Used in Flake8 Documentation
|
||||
================================================
|
||||
|
||||
.. glossary::
|
||||
:sorted:
|
||||
|
||||
formatter
|
||||
A :term:`plugin` that augments the output of |Flake8| when passed
|
||||
to :option:`flake8 --format`.
|
||||
|
||||
plugin
|
||||
A package that is typically installed from PyPI to augment the
|
||||
behaviour of |Flake8| either through adding one or more additional
|
||||
:term:`check`\ s or providing additional :term:`formatter`\ s.
|
||||
|
||||
check
|
||||
A piece of logic that corresponds to an error code. A check may
|
||||
be a style check (e.g., check the length of a given line against
|
||||
the user configured maximum) or a lint check (e.g., checking for
|
||||
unused imports) or some other check as defined by a plugin.
|
||||
|
||||
error
|
||||
error code
|
||||
The symbol associated with a specific :term:`check`. For example,
|
||||
pycodestyle implements :term:`check`\ s that look for whitespace
|
||||
around binary operators and will either return an error code of
|
||||
``W503`` or ``W504``.
|
||||
|
||||
warning
|
||||
Typically the ``W`` class of :term:`error code`\ s from pycodestyle.
|
||||
|
||||
class
|
||||
error class
|
||||
A larger grouping of related :term:`error code`\ s. For example,
|
||||
``W503`` and ``W504`` are two codes related to whitespace. ``W50``
|
||||
would be the most specific class of codes relating to whitespace.
|
||||
``W`` would be the warning class that subsumes all whitespace
|
||||
errors.
|
||||
|
||||
pyflakes
|
||||
The project |Flake8| depends on to lint files (check for unused
|
||||
imports, variables, etc.). This uses the ``F`` :term:`class` of
|
||||
:term:`error code`\ s reported by |Flake8|.
|
||||
|
||||
pycodestyle
|
||||
The project |Flake8| depends on to provide style enforcement.
|
||||
pycodestyle implements :term:`check`\ s for :pep:`8`. This uses the
|
||||
``E`` and ``W`` :term:`class`\ es of :term:`error code`\ s.
|
||||
|
||||
mccabe
|
||||
The project |Flake8| depends on to calculate the McCabe complexity
|
||||
of a unit of code (e.g., a function). This uses the ``C``
|
||||
:term:`class` of :term`error code`\ s.
|
||||
131
docs/source/index.rst
Normal file
131
docs/source/index.rst
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
.. flake8 documentation master file, created by
|
||||
sphinx-quickstart on Tue Jan 19 07:14:10 2016.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
===============================================
|
||||
Flake8: Your Tool For Style Guide Enforcement
|
||||
===============================================
|
||||
|
||||
Quickstart
|
||||
==========
|
||||
|
||||
.. _installation-guide:
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
To install |Flake8|, open an interactive shell and run:
|
||||
|
||||
.. code::
|
||||
|
||||
python<version> -m pip install flake8
|
||||
|
||||
If you want |Flake8| to be installed for your default Python installation, you
|
||||
can instead use:
|
||||
|
||||
.. code::
|
||||
|
||||
python -m pip install flake8
|
||||
|
||||
.. note::
|
||||
|
||||
It is **very** important to install |Flake8| on the *correct* version of
|
||||
Python for your needs. If you want |Flake8| to properly parse new language
|
||||
features in Python 3.5 (for example), you need it to be installed on 3.5
|
||||
for |Flake8| to understand those features. In many ways, Flake8 is tied to
|
||||
the version of Python on which it runs.
|
||||
|
||||
Using Flake8
|
||||
------------
|
||||
|
||||
To start using |Flake8|, open an interactive shell and run:
|
||||
|
||||
.. code::
|
||||
|
||||
flake8 path/to/code/to/check.py
|
||||
# or
|
||||
flake8 path/to/code/
|
||||
|
||||
.. note::
|
||||
|
||||
If you have installed |Flake8| on a particular version of Python (or on
|
||||
several versions), it may be best to instead run ``python<version> -m
|
||||
flake8``.
|
||||
|
||||
If you only want to see the instances of a specific warning or error, you can
|
||||
*select* that error like so:
|
||||
|
||||
.. code::
|
||||
|
||||
flake8 --select E123,W503 path/to/code/
|
||||
|
||||
Alternatively, if you want to *ignore* only one specific warning or error:
|
||||
|
||||
.. code::
|
||||
|
||||
flake8 --ignore E24,W504 path/to/code/
|
||||
|
||||
Please read our user guide for more information about how to use and configure
|
||||
|Flake8|.
|
||||
|
||||
FAQ and Glossary
|
||||
================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
faq
|
||||
glossary
|
||||
|
||||
User Guide
|
||||
==========
|
||||
|
||||
All users of |Flake8| should read this portion of the documentation. This
|
||||
provides examples and documentation around |Flake8|'s assortment of options
|
||||
and how to specify them on the command-line or in configuration files.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
user/index
|
||||
|
||||
Plugin Developer Guide
|
||||
======================
|
||||
|
||||
If you're maintaining a plugin for |Flake8| or creating a new one, you should
|
||||
read this section of the documentation. It explains how you can write your
|
||||
plugins and distribute them to others.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
plugin-development/index
|
||||
|
||||
Contributor Guide
|
||||
=================
|
||||
|
||||
If you are reading |Flake8|'s source code for fun or looking to contribute,
|
||||
you should read this portion of the documentation. This is a mix of documenting
|
||||
the internal-only interfaces |Flake8| and documenting reasoning for Flake8's
|
||||
design.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
internal/index
|
||||
|
||||
Release Notes and History
|
||||
=========================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
release-notes/index
|
||||
|
||||
General Indices
|
||||
===============
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`Index of Documented Public Modules <modindex>`
|
||||
* :ref:`Glossary of terms <glossary>`
|
||||
0
docs/source/internal/.keep
Normal file
0
docs/source/internal/.keep
Normal file
70
docs/source/internal/checker.rst
Normal file
70
docs/source/internal/checker.rst
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
====================
|
||||
How Checks are Run
|
||||
====================
|
||||
|
||||
In |Flake8| 2.x, |Flake8| delegated check running to pep8. In 3.0 |Flake8|
|
||||
takes on that responsibility. This has allowed for simpler
|
||||
handling of the ``--jobs`` parameter (using :mod:`multiprocessing`) and
|
||||
simplified our fallback if something goes awry with concurency.
|
||||
At the lowest level we have a |FileChecker|. Instances of |FileChecker| are
|
||||
created for *each* file to be analyzed by |Flake8|. Each instance, has a copy
|
||||
of all of the plugins registered with setuptools in the ``flake8.extension``
|
||||
entry-point group.
|
||||
|
||||
The |FileChecker| instances are managed by an instance of |Manager|. The
|
||||
|Manager| instance handles creating sub-processes with
|
||||
:mod:`multiprocessing` module and falling back to running checks in serial if
|
||||
an operating system level error arises. When creating |FileChecker| instances,
|
||||
the |Manager| is responsible for determining if a particular file has been
|
||||
excluded.
|
||||
|
||||
|
||||
Processing Files
|
||||
----------------
|
||||
|
||||
Unfortunately, since |Flake8| took over check running from pep8/pycodestyle,
|
||||
it also had to take over parsing and processing files for the checkers
|
||||
to use. Since it couldn't reuse pycodestyle's functionality (since it did not
|
||||
separate cleanly the processing from check running) that function was isolated
|
||||
into the :class:`~flake8.processor.FileProcessor` class. We moved
|
||||
several helper functions into the :mod:`flake8.processor` module (see also
|
||||
:ref:`Processor Utility Functions <processor_utility_functions>`).
|
||||
|
||||
|
||||
API Reference
|
||||
-------------
|
||||
|
||||
.. autoclass:: flake8.checker.FileChecker
|
||||
:members:
|
||||
|
||||
.. autoclass:: flake8.checker.Manager
|
||||
:members:
|
||||
|
||||
.. autoclass:: flake8.processor.FileProcessor
|
||||
:members:
|
||||
|
||||
|
||||
.. _processor_utility_functions:
|
||||
|
||||
Utility Functions
|
||||
`````````````````
|
||||
|
||||
.. autofunction:: flake8.processor.count_parentheses
|
||||
|
||||
.. autofunction:: flake8.processor.expand_indent
|
||||
|
||||
.. autofunction:: flake8.processor.is_eol_token
|
||||
|
||||
.. autofunction:: flake8.processor.is_multiline_string
|
||||
|
||||
.. autofunction:: flake8.processor.log_token
|
||||
|
||||
.. autofunction:: flake8.processor.mutate_string
|
||||
|
||||
.. autofunction:: flake8.processor.token_is_comment
|
||||
|
||||
.. autofunction:: flake8.processor.token_is_newline
|
||||
|
||||
.. Substitutions
|
||||
.. |FileChecker| replace:: :class:`~flake8.checker.FileChecker`
|
||||
.. |Manager| replace:: :class:`~flake8.checker.Manager`
|
||||
26
docs/source/internal/cli.rst
Normal file
26
docs/source/internal/cli.rst
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Command Line Interface
|
||||
======================
|
||||
|
||||
The command line interface of |Flake8| is modeled as an application via
|
||||
:class:`~flake8.main.cli.Application`. When a user runs ``flake8`` at their
|
||||
command line, :func:`~flake8.main.cli.main` is run which handles
|
||||
management of the application.
|
||||
|
||||
User input is parsed *twice* to accomodate logging and verbosity options
|
||||
passed by the user as early as possible.
|
||||
This is so as much logging can be produced as possible.
|
||||
|
||||
The default |Flake8| options are registered by
|
||||
:func:`~flake8.main.options.register_default_options`. Trying to register
|
||||
these options in plugins will result in errors.
|
||||
|
||||
|
||||
API Documentation
|
||||
-----------------
|
||||
|
||||
.. autofunction:: flake8.main.cli.main
|
||||
|
||||
.. autoclass:: flake8.main.application.Application
|
||||
:members:
|
||||
|
||||
.. autofunction:: flake8.main.options.register_default_options
|
||||
202
docs/source/internal/contributing.rst
Normal file
202
docs/source/internal/contributing.rst
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
========================
|
||||
Contributing to Flake8
|
||||
========================
|
||||
|
||||
There are many ways to contriubte to |Flake8|, and we encourage them all:
|
||||
|
||||
- contributing bug reports and feature requests
|
||||
|
||||
- contributing documenation (and yes that includes this document)
|
||||
|
||||
- reviewing and triaging bugs and merge requests
|
||||
|
||||
Before you go any further, please allow me to reassure you that I do want
|
||||
*your* contribution. If you think your contribution might not be valuable, I
|
||||
reassure you that any help you can provide *is* valuable.
|
||||
|
||||
|
||||
Code of Conduct
|
||||
===============
|
||||
|
||||
|Flake8| adheres to the `Python Code Quality Authority's Code of Conduct`_.
|
||||
Any violations of the Code of Conduct should be reported to Ian Cordasco
|
||||
(graffatcolmingov [at] gmail [dot] com).
|
||||
|
||||
|
||||
Setting Up A Development Environment
|
||||
====================================
|
||||
|
||||
To contribute to |Flake8|'s development, you simply need:
|
||||
|
||||
- Python (one of the versions we support)
|
||||
|
||||
- `tox`_
|
||||
|
||||
We suggest installing this like:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
pip install --user tox
|
||||
|
||||
Or
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
python<version> -m pip install --user tox
|
||||
|
||||
- your favorite editor
|
||||
|
||||
|
||||
Filing a Bug
|
||||
============
|
||||
|
||||
When filing a bug against |Flake8|, please fill out the issue template as it
|
||||
is provided to you by `GitLab`_. If your bug is in reference to one of the
|
||||
checks that |Flake8| reports by default, please do not report them to |Flake8|
|
||||
unless |Flake8| is doing something to prevent the check from running or you
|
||||
have some reason to believe |Flake8| is inhibiting the effectiveness of the
|
||||
check.
|
||||
|
||||
**Please search for closed and open bug reports before opening new ones.**
|
||||
|
||||
All bug reports about checks should go to their respective projects:
|
||||
|
||||
- Error codes starting with ``E`` and ``W`` should be reported to
|
||||
`pycodestyle`_.
|
||||
|
||||
- Error codes starting with ``F`` should be reported to `pyflakes`_
|
||||
|
||||
- Error codes starting with ``C`` should be reported to `mccabe`_
|
||||
|
||||
|
||||
Requesting a New Feature
|
||||
========================
|
||||
|
||||
When requesting a new feature in |Flake8|, please fill out the issue template.
|
||||
Please also note if there are any existing alternatives to your new feature
|
||||
either via plugins, or combining command-line options. Please provide example
|
||||
use cases. For example, do not ask for a feature like this:
|
||||
|
||||
I need feature frobulate for my job.
|
||||
|
||||
Instead ask:
|
||||
|
||||
I need |Flake8| to frobulate these files because my team expects them to
|
||||
frobulated but |Flake8| currently does not frobulate them. We tried using
|
||||
``--filename`` but we could not create a pattern that worked.
|
||||
|
||||
The more you explain about *why* you need a feature, the more likely we are to
|
||||
understand your needs and help you to the best of our ability.
|
||||
|
||||
|
||||
Contributing Documentation
|
||||
==========================
|
||||
|
||||
To contribute to |Flake8|'s documentation, you might want to first read a
|
||||
little about reStructuredText or Sphinx. |Flake8| has a :ref:`guide of best
|
||||
practices <docs-style>` when contributing to our documentation. For the most
|
||||
part, you should be fine following the structure and style of the rest of
|
||||
|Flake8|'s documentation.
|
||||
|
||||
All of |Flake8|'s documentation is written in reStructuredText and rendered by
|
||||
Sphinx. The source (reStructuredText) lives in ``docs/source/``. To build
|
||||
the documentation the way our Continuous Integration does, run:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
tox -e docs
|
||||
|
||||
To view the documentation locally, you can also run:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
tox -e serve-docs
|
||||
|
||||
You can run the latter in a separate terminal and continuously re-run the
|
||||
documentation generation and refresh the documentation you're working on.
|
||||
|
||||
.. note::
|
||||
|
||||
We lint our documentation just like we lint our code.
|
||||
You should also run:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
tox -e linters
|
||||
|
||||
After making changes and before pushing them to ensure that they will
|
||||
pass our CI tests.
|
||||
|
||||
|
||||
Contributing Code
|
||||
=================
|
||||
|
||||
|Flake8| development happens on `GitLab`_. Code contributions should be
|
||||
submitted there.
|
||||
|
||||
Merge requests should:
|
||||
|
||||
- Fix one issue and fix it well
|
||||
|
||||
Fix the issue, but do not include extraneous refactoring or code
|
||||
reformatting. In other words, keep the diff short, but only as short
|
||||
as is necessary to fix the bug appropriately and add sufficient testing
|
||||
around it. Long diffs are fine, so long as everything that it includes
|
||||
is necessary to the purpose of the merge request.
|
||||
|
||||
- Have descriptive titles and descriptions
|
||||
|
||||
Searching old merge requests is made easier when a merge request is well
|
||||
described.
|
||||
|
||||
- Have commits that follow this style:
|
||||
|
||||
.. code::
|
||||
|
||||
Create a short title that is 50 characters long
|
||||
|
||||
Ensure the title and commit message use the imperative voice. The
|
||||
commit and you are doing something. Also, please ensure that the
|
||||
body of the commit message does not exceed 72 characters.
|
||||
|
||||
The body may have multiple paragraphs as necessary.
|
||||
|
||||
The final line of the body references the issue appropriately.
|
||||
|
||||
|
||||
Reviewing and Triaging Issues and Merge Requests
|
||||
================================================
|
||||
|
||||
When reviewing other people's merge requests and issues, please be
|
||||
**especially** mindful of how the words you choose can be read by someone
|
||||
else. We strive for professional code reviews that do not insult the
|
||||
contributor's intelligence or impugn their character. The code review
|
||||
should be focused on the code, it's effectiveness, and whether it is
|
||||
appropriate for |Flake8|.
|
||||
|
||||
If you have the ability to edit an issue or merge request's labels, please do
|
||||
so to make search and prioritization easier.
|
||||
|
||||
|Flake8| uses milestones with both issues and merge requests. This provides
|
||||
direction for other contributors about when an issue or merge request will be
|
||||
delivered.
|
||||
|
||||
|
||||
.. links
|
||||
.. _Python Code Quality Authority's Code of Conduct:
|
||||
http://meta.pycqa.org/en/latest/code-of-conduct.html
|
||||
|
||||
.. _tox:
|
||||
https://tox.readthedocs.io/
|
||||
|
||||
.. _GitLab:
|
||||
https://gitlab.com/pycqa/flake8
|
||||
|
||||
.. _pycodestyle:
|
||||
https://github.com/pycqa/pycodestyle
|
||||
|
||||
.. _pyflakes:
|
||||
https://github.com/pyflakes/pyflakes
|
||||
|
||||
.. _mccabe:
|
||||
https://github.com/pycqa/mccabe
|
||||
47
docs/source/internal/formatters.rst
Normal file
47
docs/source/internal/formatters.rst
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
=====================
|
||||
Built-in Formatters
|
||||
=====================
|
||||
|
||||
By default |Flake8| has two formatters built-in, ``default`` and ``pylint``.
|
||||
These correspond to two classes |DefaultFormatter| and |PylintFormatter|.
|
||||
|
||||
In |Flake8| 2.0, pep8 handled formatting of errors and also allowed users to
|
||||
specify an arbitrary format string as a parameter to ``--format``. In order
|
||||
to allow for this backwards compatibility, |Flake8| 3.0 made two choices:
|
||||
|
||||
#. To not limit a user's choices for ``--format`` to the format class names
|
||||
|
||||
#. To make the default formatter attempt to use the string provided by the
|
||||
user if it cannot find a formatter with that name.
|
||||
|
||||
Default Formatter
|
||||
=================
|
||||
|
||||
The |DefaultFormatter| continues to use the same default format string as
|
||||
pep8: ``'%(path)s:%(row)d:%(col)d: %(code)s %(text)s'``.
|
||||
|
||||
To provide the default functionality it overrides two methods:
|
||||
|
||||
#. ``after_init``
|
||||
|
||||
#. ``format``
|
||||
|
||||
The former allows us to inspect the value provided to ``--format`` by the
|
||||
user and alter our own format based on that value. The second simply uses
|
||||
that format string to format the error.
|
||||
|
||||
.. autoclass:: flake8.formatting.default.Default
|
||||
:members:
|
||||
|
||||
Pylint Formatter
|
||||
================
|
||||
|
||||
The |PylintFormatter| simply defines the default Pylint format string from
|
||||
pep8: ``'%(path)s:%(row)d: [%(code)s] %(text)s'``.
|
||||
|
||||
.. autoclass:: flake8.formatting.default.Pylint
|
||||
:members:
|
||||
|
||||
|
||||
.. |DefaultFormatter| replace:: :class:`~flake8.formatting.default.Default`
|
||||
.. |PylintFormatter| replace:: :class:`~flake8.formatting.default.Pylint`
|
||||
26
docs/source/internal/index.rst
Normal file
26
docs/source/internal/index.rst
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
==============================
|
||||
Exploring Flake8's Internals
|
||||
==============================
|
||||
|
||||
While writing |Flake8| 3.0, the developers attempted to capture some reasoning
|
||||
and decision information in internal documentation meant for future developers
|
||||
and maintaners. Most of this information is unnecessary for users and plugin
|
||||
developers. Some of it, however, is linked to from the plugin development
|
||||
documentation.
|
||||
|
||||
Keep in mind that not everything will be here and you may need to help pull
|
||||
information out of the developers' heads and into these documents. Please
|
||||
pull gently.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
contributing
|
||||
writing-documentation
|
||||
releases
|
||||
checker
|
||||
cli
|
||||
formatters
|
||||
option_handling
|
||||
plugin_handling
|
||||
utils
|
||||
234
docs/source/internal/option_handling.rst
Normal file
234
docs/source/internal/option_handling.rst
Normal file
|
|
@ -0,0 +1,234 @@
|
|||
Option and Configuration Handling
|
||||
=================================
|
||||
|
||||
Option Management
|
||||
-----------------
|
||||
|
||||
Command-line options are often also set in configuration files for |Flake8|.
|
||||
While not all options are meant to be parsed from configuration files, many
|
||||
default options are also parsed from configuration files as well as
|
||||
most plugin options.
|
||||
|
||||
In |Flake8| 2, plugins received a :class:`optparse.OptionParser` instance and
|
||||
called :meth:`optparse.OptionParser.add_option` to register options. If the
|
||||
plugin author also wanted to have that option parsed from config files they
|
||||
also had to do something like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
parser.config_options.append('my_config_option')
|
||||
parser.config_options.extend(['config_opt1', 'config_opt2'])
|
||||
|
||||
This was previously undocumented and led to a lot of confusion about why
|
||||
registered options were not automatically parsed from configuration files.
|
||||
|
||||
Since |Flake8| 3 was rewritten from scratch, we decided to take a different
|
||||
approach to configuration file parsing. Instead of needing to know about an
|
||||
undocumented attribute that pep8 looks for, |Flake8| 3 now accepts a parameter
|
||||
to ``add_option``, specifically ``parse_from_config`` which is a boolean
|
||||
value.
|
||||
|
||||
|Flake8| does this by creating its own abstractions on top of :mod:`optparse`.
|
||||
The first abstraction is the :class:`flake8.options.manager.Option` class. The
|
||||
second is the :class:`flake8.options.manager.OptionManager`. In fact, we add
|
||||
three new parameters:
|
||||
|
||||
- ``parse_from_config``
|
||||
|
||||
- ``comma_separated_list``
|
||||
|
||||
- ``normalize_paths``
|
||||
|
||||
The last two are not specifically for configuration file handling, but they
|
||||
do improve that dramatically. We found that there were options that, when
|
||||
specified in a configuration file, often necessitated being spit
|
||||
multiple lines and those options were almost always comma-separated. For
|
||||
example, let's consider a user's list of ignored error codes for a project:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
ignore =
|
||||
# Reasoning
|
||||
E111,
|
||||
# Reasoning
|
||||
E711,
|
||||
# Reasoning
|
||||
E712,
|
||||
# Reasoning
|
||||
E121,
|
||||
# Reasoning
|
||||
E122,
|
||||
# Reasoning
|
||||
E123,
|
||||
# Reasoning
|
||||
E131,
|
||||
# Reasoning
|
||||
E251
|
||||
|
||||
It makes sense here to allow users to specify the value this way, but, the
|
||||
standard libary's :class:`configparser.RawConfigParser` class does returns a
|
||||
string that looks like
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
"\nE111, \nE711, \nE712, \nE121, \nE122, \nE123, \nE131, \nE251 "
|
||||
|
||||
This means that a typical call to :meth:`str.split` with ``','`` will not be
|
||||
sufficient here. Telling |Flake8| that something is a comma-separated list
|
||||
(e.g., ``comma_separated_list=True``) will handle this for you. |Flake8| will
|
||||
return:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
["E111", "E711", "E712", "E121", "E122", "E123", "E131", "E251"]
|
||||
|
||||
Next let's look at how users might like to specify their ``exclude`` list.
|
||||
Presently OpenStack's Nova project has this line in their `tox.ini`_:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
exclude = .venv,.git,.tox,dist,doc,*openstack/common/*,*lib/python*,*egg,build,tools/xenserver*,releasenotes
|
||||
|
||||
We think we can all agree that this would be easier to read like this:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
exclude =
|
||||
.venv,
|
||||
.git,
|
||||
.tox,
|
||||
dist,
|
||||
doc,
|
||||
*openstack/common/*,
|
||||
*lib/python*,
|
||||
*egg,
|
||||
build,
|
||||
tools/xenserver*,
|
||||
releasenotes
|
||||
|
||||
In this case, since these are actually intended to be paths, we would specify
|
||||
both ``comma_separated_list=True`` and ``normalize_paths=True`` because we
|
||||
want the paths to be provided to us with some consistency (either all absolute
|
||||
paths or not).
|
||||
|
||||
Now let's look at how this will actually be used. Most plugin developers
|
||||
will receive an instance of :class:`~flake8.options.manager.OptionManager` so
|
||||
to ease the transition we kept the same API as the
|
||||
:class:`optparse.OptionParser` object. The only difference is that
|
||||
:meth:`~flake8.options.manager.OptionManager.add_option` accepts the three
|
||||
extra arguments we highlighted above.
|
||||
|
||||
.. _tox.ini:
|
||||
https://github.com/openstack/nova/blob/3eb190c4cfc0eefddac6c2cc1b94a699fb1687f8/tox.ini#L155
|
||||
|
||||
Configuration File Management
|
||||
-----------------------------
|
||||
|
||||
In |Flake8| 2, configuration file discovery and management was handled by
|
||||
pep8. In pep8's 1.6 release series, it drastically broke how discovery and
|
||||
merging worked (as a result of trying to improve it). To avoid a dependency
|
||||
breaking |Flake8| again in the future, we have created our own discovery and
|
||||
management.
|
||||
As part of managing this ourselves, we decided to change management/discovery
|
||||
for 3.0.0. We have done the following:
|
||||
|
||||
- User files (files stored in a user's home directory or in the XDG directory
|
||||
inside their home directory) are the first files read. For example, if the
|
||||
user has a ``~/.flake8`` file, we will read that first.
|
||||
|
||||
- Project files (files stored in the current directory) are read next and
|
||||
merged on top of the user file. In other words, configuration in project
|
||||
files takes precedence over configuration in user files.
|
||||
|
||||
- **New in 3.0.0** The user can specify ``--append-config <path-to-file>``
|
||||
repeatedly to include extra configuration files that should be read and
|
||||
take precedence over user and project files.
|
||||
|
||||
- **New in 3.0.0** The user can specify ``--config <path-to-file>`` to so this
|
||||
file is the only configuration file used. This is a change from |Flake8| 2
|
||||
where pep8 would simply merge this configuration file into the configuration
|
||||
generated by user and project files (where this takes precedence).
|
||||
|
||||
- **New in 3.0.0** The user can specify ``--isolated`` to disable
|
||||
configuration via discovered configuration files.
|
||||
|
||||
To facilitate the configuration file management, we've taken a different
|
||||
approach to discovery and management of files than pep8. In pep8 1.5, 1.6, and
|
||||
1.7 configuration discovery and management was centralized in `66 lines of
|
||||
very terse python`_ which was confusing and not very explicit. The terseness
|
||||
of this function (|Flake8|'s authors believe) caused the confusion and
|
||||
problems with pep8's 1.6 series. As such, |Flake8| has separated out
|
||||
discovery, management, and merging into a module to make reasoning about each
|
||||
of these pieces easier and more explicit (as well as easier to test).
|
||||
|
||||
Configuration file discovery is managed by the
|
||||
:class:`~flake8.options.config.ConfigFileFinder` object. This object needs to
|
||||
know information about the program's name, any extra arguments passed to it,
|
||||
and any configuration files that should be appended to the list of discovered
|
||||
files. It provides methods for finding the files and similiar methods for
|
||||
parsing those fles. For example, it provides
|
||||
:meth:`~flake8.options.config.ConfigFileFinder.local_config_files` to find
|
||||
known local config files (and append the extra configuration files) and it
|
||||
also provides :meth:`~flake8.options.config.ConfigFileFinder.local_configs`
|
||||
to parse those configuration files.
|
||||
|
||||
.. note:: ``local_config_files`` also filters out non-existent files.
|
||||
|
||||
Configuration file merging and managemnt is controlled by the
|
||||
:class:`~flake8.options.config.MergedConfigParser`. This requires the instance
|
||||
of :class:`~flake8.options.manager.OptionManager` that the program is using,
|
||||
the list of appended config files, and the list of extra arguments. This
|
||||
object is currently the sole user of the
|
||||
:class:`~flake8.options.config.ConfigFileFinder` object. It appropriately
|
||||
initializes the object and uses it in each of
|
||||
|
||||
- :meth:`~flake8.options.config.MergedConfigParser.parse_cli_config`
|
||||
- :meth:`~flake8.options.config.MergedConfigParser.parse_local_config`
|
||||
- :meth:`~flake8.options.config.MergedConfigParser.parse_user_config`
|
||||
|
||||
Finally,
|
||||
:meth:`~flake8.options.config.MergedConfigParser.merge_user_and_local_config`
|
||||
takes the user and local configuration files that are parsed by
|
||||
:meth:`~flake8.options.config.MergedConfigParser.parse_local_config` and
|
||||
:meth:`~flake8.options.config.MergedConfigParser.parse_user_config`. The
|
||||
main usage of the ``MergedConfigParser`` is in
|
||||
:func:`~flake8.options.aggregator.aggregate_options`.
|
||||
|
||||
Aggregating Configuration File and Command Line Arguments
|
||||
---------------------------------------------------------
|
||||
|
||||
:func:`~flake8.options.aggregator.aggregate_options` accepts an instance of
|
||||
:class:`~flake8.options.maanger.OptionManager` and does the work to parse the
|
||||
command-line arguments passed by the user necessary for creating an instance
|
||||
of :class:`~flake8.options.config.MergedConfigParser`.
|
||||
|
||||
After parsing the configuration file, we determine the default ignore list. We
|
||||
use the defaults from the OptionManager and update those with the parsed
|
||||
configuration files. Finally we parse the user-provided options one last time
|
||||
using the option defaults and configuration file values as defaults. The
|
||||
parser merges on the command-line specified arguments for us so we have our
|
||||
final, definitive, aggregated options.
|
||||
|
||||
.. _66 lines of very terse python:
|
||||
https://github.com/PyCQA/pep8/blob/b8088a2b6bc5b76bece174efad877f764529bc74/pep8.py#L1981..L2047
|
||||
|
||||
API Documentation
|
||||
-----------------
|
||||
|
||||
.. autofunction:: flake8.options.aggregator.aggregate_options
|
||||
|
||||
.. autoclass:: flake8.options.manager.Option
|
||||
:members: __init__, normalize, to_optparse
|
||||
|
||||
.. autoclass:: flake8.options.manager.OptionManager
|
||||
:members:
|
||||
:special-members:
|
||||
|
||||
.. autoclass:: flake8.options.config.ConfigFileFinder
|
||||
:members:
|
||||
:special-members:
|
||||
|
||||
.. autoclass:: flake8.options.config.MergedConfigParser
|
||||
:members:
|
||||
:special-members:
|
||||
129
docs/source/internal/plugin_handling.rst
Normal file
129
docs/source/internal/plugin_handling.rst
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
Plugin Handling
|
||||
===============
|
||||
|
||||
Plugin Management
|
||||
-----------------
|
||||
|
||||
|Flake8| 3.0 added support for two other plugins besides those which define
|
||||
new checks. It now supports:
|
||||
|
||||
- extra checks
|
||||
|
||||
- alternative report formatters
|
||||
|
||||
- listeners to auto-correct violations of checks
|
||||
|
||||
To facilitate this, |Flake8| needed a more mature way of managing plugins.
|
||||
Thus, we developed the |PluginManager| which accepts a namespace and will load
|
||||
the plugins for that namespace. A |PluginManager| creates and manages many
|
||||
|Plugin| instances.
|
||||
|
||||
A |Plugin| lazily loads the underlying entry-point provided by setuptools.
|
||||
The entry-point will be loaded either by calling
|
||||
:meth:`~flake8.plugins.manager.Plugin.load_plugin` or accessing the ``plugin``
|
||||
attribute. We also use this abstraction to retrieve options that the plugin
|
||||
wishes to register and parse.
|
||||
|
||||
The only public method the |PluginManager| provides is
|
||||
:meth:`~flake8.plugins.manager.PluginManager.map`. This will accept a function
|
||||
(or other callable) and call it with each plugin as the first parameter.
|
||||
|
||||
We build atop the |PluginManager| with the |PTM|. It is expected that users of
|
||||
the |PTM| will subclass it and specify the ``namespace``, e.g.,
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class ExamplePluginType(flake8.plugin.manager.PluginTypeManager):
|
||||
namespace = 'example-plugins'
|
||||
|
||||
This provides a few extra methods via the |PluginManager|'s ``map`` method.
|
||||
|
||||
Finally, we create three classes of plugins:
|
||||
|
||||
- :class:`~flake8.plugins.manager.Checkers`
|
||||
|
||||
- :class:`~flake8.plugins.manager.Listeners`
|
||||
|
||||
- :class:`~flake8.plugins.manager.ReportFormatters`
|
||||
|
||||
These are used to interact with each of the types of plugins individually.
|
||||
|
||||
.. note::
|
||||
|
||||
Our inspiration for our plugin handling comes from the author's extensive
|
||||
experience with ``stevedore``.
|
||||
|
||||
Notifying Listener Plugins
|
||||
--------------------------
|
||||
|
||||
One of the interesting challenges with allowing plugins to be notified each
|
||||
time an error or warning is emitted by a checker is finding listeners quickly
|
||||
and efficiently. It makes sense to allow a listener to listen for a certain
|
||||
class of warnings or just a specific warning. Hence, we need to allow all
|
||||
plugins that listen to a specific warning or class to be notified. For
|
||||
example, someone might register a listener for ``E1`` and another for ``E111``
|
||||
if ``E111`` is triggered by the code, both listeners should be notified.
|
||||
If ``E112`` is returned, then only ``E1`` (and any other listeners) would be
|
||||
notified.
|
||||
|
||||
To implement this goal, we needed an object to store listeners in that would
|
||||
allow for efficient look up - a Trie (or Prefix Tree). Given that none of the
|
||||
existing packages on PyPI allowed for storing data on each node of the trie,
|
||||
it was left up to write our own as :class:`~flake8.plugins._trie.Trie`. On
|
||||
top of that we layer our :class:`~flake8.plugins.notifier.Notifier` class.
|
||||
|
||||
Now when |Flake8| receives an error or warning, we can easily call the
|
||||
:meth:`~flake8.plugins.notifier.Notifier.notify` method and let plugins act on
|
||||
that knowledge.
|
||||
|
||||
Default Plugins
|
||||
---------------
|
||||
|
||||
Finally, |Flake8| has always provided its own plugin shim for Pyflakes. As
|
||||
part of that we carry our own shim in-tree and now store that in
|
||||
:mod:`flake8.plugins.pyflakes`.
|
||||
|
||||
|Flake8| also registers plugins for pep8. Each check in pep8 requires
|
||||
different parameters and it cannot easily be shimmed together like Pyflakes
|
||||
was. As such, plugins have a concept of a "group". If you look at our
|
||||
:file:`setup.py` you will see that we register pep8 checks roughly like so:
|
||||
|
||||
.. code::
|
||||
|
||||
pep8.<check-name> = pep8:<check-name>
|
||||
|
||||
We do this to identify that ``<check-name>>`` is part of a group. This also
|
||||
enables us to special-case how we handle reporting those checks. Instead of
|
||||
reporting each check in the ``--version`` output, we report ``pep8`` and check
|
||||
``pep8`` the module for a ``__version__`` attribute. We only report it once
|
||||
to avoid confusing users.
|
||||
|
||||
API Documentation
|
||||
-----------------
|
||||
|
||||
.. autoclass:: flake8.plugins.manager.PluginManager
|
||||
:members:
|
||||
:special-members: __init__, __contains__, __getitem__
|
||||
|
||||
.. autoclass:: flake8.plugins.manager.Plugin
|
||||
:members:
|
||||
:special-members: __init__
|
||||
|
||||
.. autoclass:: flake8.plugins.manager.PluginTypeManager
|
||||
:members:
|
||||
|
||||
.. autoclass:: flake8.plugins.manager.Checkers
|
||||
:members:
|
||||
|
||||
.. autoclass:: flake8.plugins.manager.Listeners
|
||||
:members: build_notifier
|
||||
|
||||
.. autoclass:: flake8.plugins.manager.ReportFormatters
|
||||
|
||||
.. autoclass:: flake8.plugins.notifier.Notifier
|
||||
|
||||
.. autoclass:: flake8.plugins._trie.Trie
|
||||
|
||||
.. |PluginManager| replace:: :class:`~flake8.plugins.manager.PluginManager`
|
||||
.. |Plugin| replace:: :class:`~flake8.plugins.manager.Plugin`
|
||||
.. |PTM| replace:: :class:`~flake8.plugins.manager.PluginTypeManager`
|
||||
99
docs/source/internal/releases.rst
Normal file
99
docs/source/internal/releases.rst
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
==================
|
||||
Releasing Flake8
|
||||
==================
|
||||
|
||||
There is not much that is hard to find about how |Flake8| is released.
|
||||
|
||||
- We use **major** releases (e.g., 2.0.0, 3.0.0, etc.) for big, potentially
|
||||
backwards incompatible, releases.
|
||||
|
||||
- We use **minor** releases (e.g., 2.1.0, 2.2.0, 3.1.0, 3.2.0, etc.) for
|
||||
releases that contain features and dependency version changes.
|
||||
|
||||
- We use **patch** releases (e.g., 2.1.1, 2.1.2, 3.0.1, 3.0.10, etc.) for
|
||||
releases that contain *only* bug fixes.
|
||||
|
||||
In this sense we follow semantic versioning. But we follow it as more of a set
|
||||
of guidelines. We're also not perfect, so we may make mistakes, and that's
|
||||
fine.
|
||||
|
||||
|
||||
Major Releases
|
||||
==============
|
||||
|
||||
Major releases are often associated with backwards incompatibility. |Flake8|
|
||||
hopes to avoid those, but will occasionally need them.
|
||||
|
||||
Historically, |Flake8| has generated major releases for:
|
||||
|
||||
- Unvendoring dependencies (2.0)
|
||||
|
||||
- Large scale refactoring (2.0, 3.0)
|
||||
|
||||
- Subtly breaking CLI changes (3.0)
|
||||
|
||||
- Breaking changes to its plugin interface (3.0)
|
||||
|
||||
Major releases can also contain:
|
||||
|
||||
- Bug fixes (which may have backwards incompatible solutions)
|
||||
|
||||
- New features
|
||||
|
||||
- Dependency changes
|
||||
|
||||
|
||||
Minor Releases
|
||||
==============
|
||||
|
||||
Minor releases often have new features in them, which we define roughly as:
|
||||
|
||||
- New command-line flags
|
||||
|
||||
- New behaviour that does not break backwards compatibility
|
||||
|
||||
- New errors detected by dependencies, e.g., by raising the upper limit on
|
||||
PyFlakes we introduce F405
|
||||
|
||||
- Bug fixes
|
||||
|
||||
|
||||
Patch Releases
|
||||
==============
|
||||
|
||||
Patch releases should only ever have bug fixes in them.
|
||||
|
||||
We do not update dependency constraints in patch releases. If you do not
|
||||
install |Flake8| from PyPI, there is a chance that your packager is using
|
||||
different requirements. Some downstream redistributors have been known to
|
||||
force a new version of PyFlakes, pep8/PyCodestyle, or McCabe into place.
|
||||
Occasionally this will cause breakage when using |Flake8|. There is little
|
||||
we can do to help you in those cases.
|
||||
|
||||
|
||||
Process
|
||||
=======
|
||||
|
||||
To prepare a release, we create a file in :file:`docs/source/releases/` named:
|
||||
``{{ release_number }}.rst`` (e.g., ``3.0.0.rst``). We note bug fixes,
|
||||
improvements, and dependency version changes as well as other items of note
|
||||
for users.
|
||||
|
||||
Before releasing, the following tox test environments must pass:
|
||||
|
||||
- Python 2.7 (a.k.a., ``tox -e py27``)
|
||||
|
||||
- Python 3.4 (a.k.a., ``tox -e py34``)
|
||||
|
||||
- Python 3.5 (a.k.a., ``tox -e py35``)
|
||||
|
||||
- PyPy (a.k.a., ``tox -e pypy``)
|
||||
|
||||
- Linters (a.k.a., ``tox -e linters``)
|
||||
|
||||
We tag the most recent commit that passes those items and contains our release
|
||||
notes.
|
||||
|
||||
Finally, we run ``tox -e release`` to build source distributions (e.g.,
|
||||
``flake8-3.0.0.tar.gz``), universal wheels, and upload them to PyPI with
|
||||
Twine.
|
||||
127
docs/source/internal/utils.rst
Normal file
127
docs/source/internal/utils.rst
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
===================
|
||||
Utility Functions
|
||||
===================
|
||||
|
||||
|Flake8| has a few utility functions that it uses internally.
|
||||
|
||||
.. warning::
|
||||
|
||||
As should be implied by where these are documented, these are all
|
||||
**internal** utility functions. Their signatures and return types
|
||||
may change between releases without notice.
|
||||
|
||||
Bugs reported about these **internal** functions will be closed
|
||||
immediately.
|
||||
|
||||
If functions are needed by plugin developers, they may be requested
|
||||
in the bug tracker and after careful consideration they *may* be added
|
||||
to the *documented* stable API.
|
||||
|
||||
.. autofunction:: flake8.utils.parse_comma_separated_list
|
||||
|
||||
:func:`~flake8.utils.parse_comma_separated_list` takes either a string like
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
"E121,W123,F904"
|
||||
"E121,\nW123,\nF804"
|
||||
"E121,\n\tW123,\n\tF804"
|
||||
|
||||
Or it will take a list of strings (potentially with whitespace) such as
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
[" E121\n", "\t\nW123 ", "\n\tF904\n "]
|
||||
|
||||
And converts it to a list that looks as follows
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
["E121", "W123", "F904"]
|
||||
|
||||
This function helps normalize any kind of comma-separated input you or |Flake8|
|
||||
might receive. This is most helpful when taking advantage of |Flake8|'s
|
||||
additional parameters to :class:`~flake8.options.manager.Option`.
|
||||
|
||||
.. autofunction:: flake8.utils.normalize_path
|
||||
|
||||
This utility takes a string that represents a path and returns the absolute
|
||||
path if the string has a ``/`` in it. It also removes trailing ``/``\ s.
|
||||
|
||||
.. autofunction:: flake8.utils.normalize_paths
|
||||
|
||||
This function utilizes :func:`~flake8.utils.parse_comma_separated_list` and
|
||||
:func:`~flake8.utils.normalize_path` to normalize it's input to a list of
|
||||
strings that should be paths.
|
||||
|
||||
.. autofunction:: flake8.utils.stdin_get_value
|
||||
|
||||
This function retrieves and caches the value provided on ``sys.stdin``. This
|
||||
allows plugins to use this to retrieve ``stdin`` if necessary.
|
||||
|
||||
.. autofunction:: flake8.utils.is_windows
|
||||
|
||||
This provides a convenient and explicitly named function that checks if we are
|
||||
currently running on a Windows (or ``nt``) operating system.
|
||||
|
||||
.. autofunction:: flake8.utils.can_run_multiprocessing_on_windows
|
||||
|
||||
This provides a separate and distinct check from
|
||||
:func:`~flake8.utils.is_windows` that allows us to check if the version of
|
||||
Python we're using can actually use multiprocessing on Windows.
|
||||
|
||||
.. autofunction:: flake8.utils.is_using_stdin
|
||||
|
||||
Another helpful function that is named only to be explicit given it is a very
|
||||
trivial check, this checks if the user specified ``-`` in their arguments to
|
||||
|Flake8| to indicate we should read from stdin.
|
||||
|
||||
.. autofunction:: flake8.utils.filenames_from
|
||||
|
||||
When provided an argument to |Flake8|, we need to be able to traverse
|
||||
directories in a convenient manner. For example, if someone runs
|
||||
|
||||
.. code::
|
||||
|
||||
$ flake8 flake8/
|
||||
|
||||
Then they want us to check all of the files in the directory ``flake8/``. This
|
||||
function will handle that while also handling the case where they specify a
|
||||
file like:
|
||||
|
||||
.. code::
|
||||
|
||||
$ flake8 flake8/__init__.py
|
||||
|
||||
|
||||
.. autofunction:: flake8.utils.fnmatch
|
||||
|
||||
The standard library's :func:`fnmatch.fnmatch` is excellent at deciding if a
|
||||
filename matches a single pattern. In our use case, however, we typically have
|
||||
a list of patterns and want to know if the filename matches any of them. This
|
||||
function abstracts that logic away with a little extra logic.
|
||||
|
||||
.. autofunction:: flake8.utils.parameters_for
|
||||
|
||||
|Flake8| analyzes the parameters to plugins to determine what input they are
|
||||
expecting. Plugins may expect one of the following:
|
||||
|
||||
- ``physical_line`` to receive the line as it appears in the file
|
||||
|
||||
- ``logical_line`` to receive the logical line (not as it appears in the file)
|
||||
|
||||
- ``tree`` to receive the abstract syntax tree (AST) for the file
|
||||
|
||||
We also analyze the rest of the parameters to provide more detail to the
|
||||
plugin. This function will return the parameters in a consistent way across
|
||||
versions of Python and will handle both classes and functions that are used as
|
||||
plugins. Further, if the plugin is a class, it will strip the ``self``
|
||||
argument so we can check the parameters of the plugin consistently.
|
||||
|
||||
.. autofunction:: flake8.utils.parse_unified_diff
|
||||
|
||||
To handle usage of :option:`flake8 --diff`, |Flake8| needs to be able
|
||||
to parse the name of the files in the diff as well as the ranges indicated the
|
||||
sections that have been changed. This function either accepts the diff as an
|
||||
argument or reads the diff from standard-in. It then returns a dictionary with
|
||||
filenames as the keys and sets of line numbers as the value.
|
||||
183
docs/source/internal/writing-documentation.rst
Normal file
183
docs/source/internal/writing-documentation.rst
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
.. _docs-style:
|
||||
|
||||
==================================
|
||||
Writing Documentation for Flake8
|
||||
==================================
|
||||
|
||||
The maintainers of |Flake8| believe strongly in benefit of style guides.
|
||||
Hence, for all contributors who wish to work on our documentation, we've
|
||||
put together a loose set of guidelines and best practices when adding to
|
||||
our documentation.
|
||||
|
||||
|
||||
View the docs locally before submitting
|
||||
=======================================
|
||||
|
||||
You can and should generate the docs locally before you submit a pull request
|
||||
with your changes. You can build the docs by running:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
tox -e docs
|
||||
|
||||
From the directory containing the ``tox.ini`` file (which also contains the
|
||||
``docs/`` directory that this file lives in).
|
||||
|
||||
.. note::
|
||||
|
||||
If the docs don't build locally, they will not build in our continuous
|
||||
integration system. We will generally not merge any pull request that
|
||||
fails continuous integration.
|
||||
|
||||
|
||||
Run the docs linter tests before submitting
|
||||
===========================================
|
||||
|
||||
You should run the ``doc8`` linter job before you're ready to commit and fix
|
||||
any errors found.
|
||||
|
||||
|
||||
Capitalize Flake8 in prose
|
||||
==========================
|
||||
|
||||
We believe that by capitalizing |Flake8| in prose, we can help reduce
|
||||
confusion between the command-line usage of ``flake8`` and the project.
|
||||
|
||||
We also have defined a global replacement ``|Flake8|`` that should be used
|
||||
and will replace each instance with ``:program:`Flake8```.
|
||||
|
||||
|
||||
Use the prompt directive for command-line examples
|
||||
==================================================
|
||||
|
||||
When documenting something on the command-line, use the ``.. prompt::``
|
||||
directive to make it easier for users to copy and paste into their terminal.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: restructuredtext
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --select E123,W503 dir/
|
||||
flake8 --ignore E24,W504 dir
|
||||
|
||||
|
||||
Wrap lines around 79 characters
|
||||
===============================
|
||||
|
||||
We use a maximum line-length in our documentation that is similar to the
|
||||
default in |Flake8|. Please wrap lines at 79 characters (or less).
|
||||
|
||||
|
||||
Use two new-lines before new sections
|
||||
=====================================
|
||||
|
||||
After the final paragraph of a section and before the next section title,
|
||||
use two new-lines to separate them. This makes reading the plain-text
|
||||
document a little nicer. Sphinx ignores these when rendering so they have
|
||||
no semantic meaning.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: restructuredtext
|
||||
|
||||
Section Header
|
||||
==============
|
||||
|
||||
Paragraph.
|
||||
|
||||
|
||||
Next Section Header
|
||||
===================
|
||||
|
||||
Paragraph.
|
||||
|
||||
|
||||
Surround document titles with equal symbols
|
||||
===========================================
|
||||
|
||||
To indicate the title of a document, we place an equal number of ``=`` symbols
|
||||
on the lines before and after the title. For example:
|
||||
|
||||
.. code-block:: restructuredtext
|
||||
|
||||
==================================
|
||||
Writing Documentation for Flake8
|
||||
==================================
|
||||
|
||||
Note also that we "center" the title by adding a leading space and having
|
||||
extra ``=`` symbols at the end of those lines.
|
||||
|
||||
|
||||
Use the option template for new options
|
||||
=======================================
|
||||
|
||||
All of |Flake8|'s command-line options are documented in the User Guide. Each
|
||||
option is documented individually using the ``.. option::`` directive provided
|
||||
by Sphinx. At the top of the document, in a reStructuredText comment, is a
|
||||
template that should be copied and pasted into place when documening new
|
||||
options.
|
||||
|
||||
.. note::
|
||||
|
||||
The ordering of the options page is the order that options are printed
|
||||
in the output of:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --help
|
||||
|
||||
Please insert your option documentation according to that order.
|
||||
|
||||
|
||||
Use anchors for easy reference linking
|
||||
======================================
|
||||
|
||||
Use link anchors to allow for other areas of the documentation to use the
|
||||
``:ref:`` role for intralinking documentation. Example:
|
||||
|
||||
.. code-block:: restructuredtext
|
||||
|
||||
.. _use-anchors:
|
||||
|
||||
Use anchors for easy reference linking
|
||||
======================================
|
||||
|
||||
.. code-block:: restructuredtext
|
||||
|
||||
Somewhere in this paragraph we will :ref:`reference anchors
|
||||
<use-anchors>`.
|
||||
|
||||
.. note::
|
||||
|
||||
You do not need to provide custom text for the ``:ref:`` if the title of
|
||||
the section has a title that is sufficient.
|
||||
|
||||
|
||||
Keep your audience in mind
|
||||
==========================
|
||||
|
||||
|Flake8|'s documentation has three distinct (but not separate) audiences:
|
||||
|
||||
#. Users
|
||||
|
||||
#. Plugin Developers
|
||||
|
||||
#. Flake8 Developers and Contributors
|
||||
|
||||
At the moment, you're one of the third group (because you're contributing
|
||||
or thinking of contributing).
|
||||
|
||||
Consider that most Users aren't very interested in the internal working of
|
||||
|Flake8|. When writing for Users, focus on how to do something or the
|
||||
behaviour of a certain piece of configuration or invocation.
|
||||
|
||||
Plugin developers will only care about the internals of |Flake8| as much as
|
||||
they will have to interact with that. Keep discussions of internal to the
|
||||
mininmum required.
|
||||
|
||||
Finally, Flake8 Developers and Contributors need to know how everything fits
|
||||
together. We don't need detail about every line of code, but cogent
|
||||
explanations and design specifications will help future developers understand
|
||||
the Hows and Whys of |Flake8|'s internal design.
|
||||
0
docs/source/plugin-development/.keep
Normal file
0
docs/source/plugin-development/.keep
Normal file
150
docs/source/plugin-development/cross-compatibility.rst
Normal file
150
docs/source/plugin-development/cross-compatibility.rst
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
====================================
|
||||
Writing Plugins For Flake8 2 and 3
|
||||
====================================
|
||||
|
||||
Plugins have existed for |Flake8| 2.x for a few years. There are a number of
|
||||
these on PyPI already. While it did not seem reasonable for |Flake8| to attempt
|
||||
to provide a backwards compatible shim for them, we did decide to try to
|
||||
document the easiest way to write a plugin that's compatible across both
|
||||
versions.
|
||||
|
||||
.. note::
|
||||
|
||||
If your plugin does not register options, it *should* Just Work.
|
||||
|
||||
The **only** breaking change in |Flake8| 3.0 is the fact that we no longer
|
||||
check the option parser for a list of strings to parse from a config file. On
|
||||
|Flake8| 2.x, to have an option parsed from the configuration files that
|
||||
|Flake8| finds and parses you would have to do something like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
parser.add_option('-X', '--example-flag', type='string',
|
||||
help='...')
|
||||
parser.config_options.append('example-flag')
|
||||
|
||||
For |Flake8| 3.0, we have added *three* arguments to the
|
||||
:meth:`~flake8.options.manager.OptionManager.add_option` method you will call
|
||||
on the parser you receive:
|
||||
|
||||
- ``parse_from_config`` which expects ``True`` or ``False``
|
||||
|
||||
When ``True``, |Flake8| will parse the option from the config files |Flake8|
|
||||
finds.
|
||||
|
||||
- ``comma_separated_list`` which expects ``True`` or ``False``
|
||||
|
||||
When ``True``, |Flake8| will split the string intelligently and handle
|
||||
extra whitespace. The parsed value will be a list.
|
||||
|
||||
- ``normalize_paths`` which expects ``True`` or ``False``
|
||||
|
||||
When ``True``, |Flake8| will:
|
||||
|
||||
* remove trailing path separators (i.e., ``os.path.sep``)
|
||||
|
||||
* return the absolute path for values that have the separator in them
|
||||
|
||||
All three of these options can be combined or used separately.
|
||||
|
||||
|
||||
Parsing Options from Configuration Files
|
||||
========================================
|
||||
|
||||
The example from |Flake8| 2.x now looks like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
parser.add_option('-X', '--example-flag', type='string',
|
||||
parse_from_config=True,
|
||||
help='...')
|
||||
|
||||
|
||||
Parsing Comma-Separated Lists
|
||||
=============================
|
||||
|
||||
Now let's imagine that the option we want to add is expecting a comma-separatd
|
||||
list of values from the user (e.g., ``--select E123,W503,F405``). |Flake8| 2.x
|
||||
often forced users to parse these lists themselves since pep8 special-cased
|
||||
certain flags and left others on their own. |Flake8| 3.0 adds
|
||||
``comma_separated_list`` so that the parsed option is already a list for
|
||||
plugin authors. When combined with ``parse_from_config`` this means that users
|
||||
can also do something like:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
example-flag =
|
||||
first,
|
||||
second,
|
||||
third,
|
||||
fourth,
|
||||
fifth
|
||||
|
||||
And |Flake8| will just return the list:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
["first", "second", "third", "fourth", "fifth"]
|
||||
|
||||
|
||||
Normalizing Values that Are Paths
|
||||
=================================
|
||||
|
||||
Finally, let's imagine that our new option wants a path or list of paths. To
|
||||
ensure that these paths are semi-normalized (the way |Flake8| 2.x used to
|
||||
work) we need only pass ``normalize_paths=True``. If you have specified
|
||||
``comma_separated_list=True`` then this will parse the value as a list of
|
||||
paths that have been normalized. Otherwise, this will parse the value
|
||||
as a single path.
|
||||
|
||||
|
||||
Option Handling on Flake8 2 and 3
|
||||
=================================
|
||||
|
||||
So, in conclusion, we can now write our plugin that relies on registering
|
||||
options with |Flake8| and have it work on |Flake8| 2.x and 3.x.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
option_args = ('-X', '--example-flag')
|
||||
option_kwargs = {
|
||||
'type': 'string',
|
||||
'parse_from_config': True,
|
||||
'help': '...',
|
||||
}
|
||||
try:
|
||||
# Flake8 3.x registration
|
||||
parser.add_option(*option_args, **option_kwargs)
|
||||
except TypeError:
|
||||
# Flake8 2.x registration
|
||||
parse_from_config = option_kwargs.pop('parse_from_config', False)
|
||||
parser.add_option(*option_args, **option_kwargs)
|
||||
if parse_from_config:
|
||||
parser.config_options.append(option_args[-1].lstrip('-'))
|
||||
|
||||
|
||||
Or, you can write a tiny helper function:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def register_opt(parser, *args, **kwargs):
|
||||
try:
|
||||
# Flake8 3.x registration
|
||||
parser.add_option(*args, **kwargs)
|
||||
except TypeError:
|
||||
# Flake8 2.x registration
|
||||
parse_from_config = kwargs.pop('parse_from_config', False)
|
||||
parser.add_option(*args, **kwargs)
|
||||
if parse_from_config:
|
||||
parser.config_options.append(args[-1].lstrip('-'))
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
@classmethod
|
||||
def register_options(cls, parser):
|
||||
register_opt(parser, '-X', '--example-flag', type='string',
|
||||
parse_from_config=True, help='...')
|
||||
|
||||
The transition period is admittedly not fantastic, but we believe that this
|
||||
is a worthwhile change for plugin developers going forward. We also hope to
|
||||
help with the transition phase for as many plugins as we can manage.
|
||||
54
docs/source/plugin-development/formatters.rst
Normal file
54
docs/source/plugin-development/formatters.rst
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
.. _formatting-plugins:
|
||||
|
||||
===========================================
|
||||
Developing a Formatting Plugin for Flake8
|
||||
===========================================
|
||||
|
||||
|Flake8| allowed for custom formatting plugins in version
|
||||
3.0.0. Let's write a plugin together:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from flake8.formatting import base
|
||||
|
||||
|
||||
class Example(base.BaseFormatter):
|
||||
"""Flake8's example formatter."""
|
||||
|
||||
pass
|
||||
|
||||
We notice, as soon as we start, that we inherit from |Flake8|'s
|
||||
:class:`~flake8.formatting.base.BaseFormatter` class. If we follow the
|
||||
:ref:`instructions to register a plugin <register-a-plugin>` and try to use
|
||||
our example formatter, e.g., ``flake8 --format=example`` then
|
||||
|Flake8| will fail because we did not implement the ``format`` method.
|
||||
Let's do that next.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class Example(base.BaseFormatter):
|
||||
"""Flake8's example formatter."""
|
||||
|
||||
def format(self, error):
|
||||
return 'Example formatter: {0!r}'.format(error)
|
||||
|
||||
With that we're done. Obviously this isn't a very useful formatter, but it
|
||||
should highlight the simplicitly of creating a formatter with Flake8. If we
|
||||
wanted to instead create a formatter that aggregated the results and returned
|
||||
XML, JSON, or subunit we could also do that. |Flake8| interacts with the
|
||||
formatter in two ways:
|
||||
|
||||
#. It creates the formatter and provides it the options parsed from the
|
||||
configuration files and command-line
|
||||
|
||||
#. It uses the instance of the formatter and calls ``handle`` with the error.
|
||||
|
||||
By default :meth:`flake8.formatting.base.BaseFormatter.handle` simply calls
|
||||
the ``format`` method and then ``write``. Any extra handling you wish to do
|
||||
for formatting purposes should override the ``handle`` method.
|
||||
|
||||
API Documentation
|
||||
=================
|
||||
|
||||
.. autoclass:: flake8.formatting.base.BaseFormatter
|
||||
:members:
|
||||
56
docs/source/plugin-development/index.rst
Normal file
56
docs/source/plugin-development/index.rst
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
============================
|
||||
Writing Plugins for Flake8
|
||||
============================
|
||||
|
||||
Since |Flake8| 2.0, the |Flake8| tool has allowed for extensions and custom
|
||||
plugins. In |Flake8| 3.0, we're expanding that ability to customize and
|
||||
extend **and** we're attempting to thoroughly document it. Some of the
|
||||
documentation in this section may reference third-party documentation to
|
||||
reduce duplication and to point you, the developer, towards the authoritative
|
||||
documentation for those pieces.
|
||||
|
||||
Getting Started
|
||||
===============
|
||||
|
||||
To get started writing a |Flake8| :term:`plugin` you first need:
|
||||
|
||||
- An idea for a plugin
|
||||
|
||||
- An available package name on PyPI
|
||||
|
||||
- One or more versions of Python installed
|
||||
|
||||
- A text editor or IDE of some kind
|
||||
|
||||
- An idea of what *kind* of plugin you want to build:
|
||||
|
||||
* Formatter
|
||||
|
||||
* Check
|
||||
|
||||
Once you've gathered these things, you can get started.
|
||||
|
||||
All plugins for |Flake8| must be registered via `entry points`_. In this
|
||||
section we cover:
|
||||
|
||||
- How to register your plugin so |Flake8| can find it
|
||||
|
||||
- How to make |Flake8| provide your check plugin with information (via
|
||||
command-line flags, function/class parameters, etc.)
|
||||
|
||||
- How to make a formatter plugin
|
||||
|
||||
- How to write your check plugin so that it works with |Flake8| 2.x and 3.x
|
||||
|
||||
.. toctree::
|
||||
:caption: Plugin Developer Documentation
|
||||
:maxdepth: 2
|
||||
|
||||
registering-plugins
|
||||
plugin-parameters
|
||||
formatters
|
||||
cross-compatibility
|
||||
|
||||
|
||||
.. _entry points:
|
||||
https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points
|
||||
163
docs/source/plugin-development/plugin-parameters.rst
Normal file
163
docs/source/plugin-development/plugin-parameters.rst
Normal file
|
|
@ -0,0 +1,163 @@
|
|||
.. _plugin-parameters:
|
||||
|
||||
==========================================
|
||||
Receiving Information For A Check Plugin
|
||||
==========================================
|
||||
|
||||
Plugins to |Flake8| have a great deal of information that they can request
|
||||
from a :class:`~flake8.processor.FileProcessor` instance. Historically,
|
||||
|Flake8| has supported two types of plugins:
|
||||
|
||||
#. classes that accept parsed abstract syntax trees (ASTs)
|
||||
|
||||
#. functions that accept a range of arguments
|
||||
|
||||
|Flake8| now does not distinguish between the two types of plugins. Any plugin
|
||||
can accept either an AST or a range of arguments. Further, any plugin that has
|
||||
certain callable attributes can also register options and receive parsed
|
||||
options.
|
||||
|
||||
|
||||
Indicating Desired Data
|
||||
=======================
|
||||
|
||||
|Flake8| inspects the plugin's signature to determine what parameters it
|
||||
expects using :func:`flake8.utils.parameters_for`.
|
||||
:attr:`flake8.plugins.manager.Plugin.parameters` caches the values so that
|
||||
each plugin makes that fairly expensive call once per plugin. When processing
|
||||
a file, a plugin can ask for any of the following:
|
||||
|
||||
- :attr:`~flake8.processor.FileProcessor.blank_before`
|
||||
- :attr:`~flake8.processor.FileProcessor.blank_lines`
|
||||
- :attr:`~flake8.processor.FileProcessor.checker_state`
|
||||
- :attr:`~flake8.processor.FileProcessor.indect_char`
|
||||
- :attr:`~flake8.processor.FileProcessor.indent_level`
|
||||
- :attr:`~flake8.processor.FileProcessor.line_number`
|
||||
- :attr:`~flake8.processor.FileProcessor.logical_line`
|
||||
- :attr:`~flake8.processor.FileProcessor.max_line_length`
|
||||
- :attr:`~flake8.processor.FileProcessor.multiline`
|
||||
- :attr:`~flake8.processor.FileProcessor.noqa`
|
||||
- :attr:`~flake8.processor.FileProcessor.previous_indent_level`
|
||||
- :attr:`~flake8.processor.FileProcessor.previous_logical`
|
||||
- :attr:`~flake8.processor.FileProcessor.tokens`
|
||||
- :attr:`~flake8.processor.FileProcessor.total_lines`
|
||||
- :attr:`~flake8.processor.FileProcessor.verbose`
|
||||
|
||||
Alternatively, a plugin can accept ``tree`` and ``filename``.
|
||||
``tree`` will be a parsed abstract syntax tree that will be used by plugins
|
||||
like PyFlakes and McCabe.
|
||||
|
||||
|
||||
Registering Options
|
||||
===================
|
||||
|
||||
Any plugin that has callable attributes ``provide_options`` and
|
||||
``register_options`` can parse option information and register new options.
|
||||
|
||||
Your ``register_options`` function should expect to receive an instance of
|
||||
|OptionManager|. An |OptionManager| instance behaves very similarly to
|
||||
:class:`optparse.OptionParser`. It, however, uses the layer that |Flake8| has
|
||||
developed on top of :mod:`optparse` to also handle configuration file parsing.
|
||||
:meth:`~flake8.options.manager.OptionManager.add_option` creates an |Option|
|
||||
which accepts the same parameters as :mod:`optparse` as well as three extra
|
||||
boolean parameters:
|
||||
|
||||
- ``parse_from_config``
|
||||
|
||||
The command-line option should also be parsed from config files discovered
|
||||
by |Flake8|.
|
||||
|
||||
.. note::
|
||||
|
||||
This takes the place of appending strings to a list on the
|
||||
:class:`optparse.OptionParser`.
|
||||
|
||||
- ``comma_separated_list``
|
||||
|
||||
The value provided to this option is a comma-separated list. After parsing
|
||||
the value, it should be further broken up into a list. This also allows us
|
||||
to handle values like:
|
||||
|
||||
.. code::
|
||||
|
||||
E123,E124,
|
||||
E125,
|
||||
E126
|
||||
|
||||
- ``normalize_paths``
|
||||
|
||||
The value provided to this option is a path. It should be normalized to be
|
||||
an absolute path. This can be combined with ``comma_separated_list`` to
|
||||
allow a comma-separated list of paths.
|
||||
|
||||
Each of these options works individually or can be combined. Let's look at a
|
||||
couple examples from |Flake8|. In each example, we will have
|
||||
``option_manager`` which is an instance of |OptionManager|.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
option_manager.add_option(
|
||||
'--max-line-length', type='int', metavar='n',
|
||||
default=defaults.MAX_LINE_LENGTH, parse_from_config=True,
|
||||
help='Maximum allowed line length for the entirety of this run. '
|
||||
'(Default: %default)',
|
||||
)
|
||||
|
||||
Here we are adding the ``--max-line-length`` command-line option which is
|
||||
always an integer and will be parsed from the configuration file. Since we
|
||||
provide a default, we take advantage of :mod:`optparse`\ 's willingness to
|
||||
display that in the help text with ``%default``.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
option_manager.add_option(
|
||||
'--select', metavar='errors', default='',
|
||||
parse_from_config=True, comma_separated_list=True,
|
||||
help='Comma-separated list of errors and warnings to enable.'
|
||||
' For example, ``--select=E4,E51,W234``. (Default: %default)',
|
||||
)
|
||||
|
||||
In adding the ``--select`` command-line option, we're also indicating to the
|
||||
|OptionManager| that we want the value parsed from the config files and parsed
|
||||
as a comma-separated list.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
option_manager.add_option(
|
||||
'--exclude', metavar='patterns', default=defaults.EXCLUDE,
|
||||
comma_separated_list=True, parse_from_config=True,
|
||||
normalize_paths=True,
|
||||
help='Comma-separated list of files or directories to exclude.'
|
||||
'(Default: %default)',
|
||||
)
|
||||
|
||||
Finally, we show an option that uses all three extra flags. Values from
|
||||
``--exclude`` will be parsed from the config, converted from a comma-separated
|
||||
list, and then each item will be normalized.
|
||||
|
||||
For information about other parameters to
|
||||
:meth:`~flake8.options.manager.OptionManager.add_option` refer to the
|
||||
documentation of :mod:`optparse`.
|
||||
|
||||
|
||||
Accessing Parsed Options
|
||||
========================
|
||||
|
||||
When a plugin has a callable ``provide_options`` attribute, |Flake8| will call
|
||||
it and attempt to provide the |OptionManager| instance, the parsed options
|
||||
which will be an instance of :class:`optparse.Values`, and the extra arguments
|
||||
that were not parsed by the |OptionManager|. If that fails, we will just pass
|
||||
the :class:`optparse.Values`. In other words, your ``provide_options``
|
||||
callable will have one of the following signatures:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def provide_options(option_manager, options, args):
|
||||
pass
|
||||
# or
|
||||
def provide_options(options):
|
||||
pass
|
||||
|
||||
.. substitutions
|
||||
.. |OptionManager| replace:: :class:`~flake8.options.manager.OptionManager`
|
||||
.. |Option| replace:: :class:`~flake8.options.manager.Option`
|
||||
115
docs/source/plugin-development/registering-plugins.rst
Normal file
115
docs/source/plugin-development/registering-plugins.rst
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
.. _register-a-plugin:
|
||||
|
||||
==================================
|
||||
Registering a Plugin with Flake8
|
||||
==================================
|
||||
|
||||
To register any kind of plugin with |Flake8|, you need:
|
||||
|
||||
#. A way to install the plugin (whether it is packaged on its own or
|
||||
as part of something else). In this section, we will use a ``setup.py``
|
||||
written for an example plugin.
|
||||
|
||||
#. A name for your plugin that will (ideally) be unique.
|
||||
|
||||
#. A somewhat recent version of setuptools (newer than 0.7.0 but preferably as
|
||||
recent as you can attain).
|
||||
|
||||
|Flake8| relies on functionality provided by setuptools called
|
||||
`Entry Points`_. These allow any package to register a plugin with |Flake8|
|
||||
via that package's ``setup.py`` file.
|
||||
|
||||
Let's presume that we already have our plugin written and it's in a module
|
||||
called ``flake8_example``. We might have a ``setup.py`` that looks something
|
||||
like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from __future__ import with_statement
|
||||
import setuptools
|
||||
|
||||
requires = [
|
||||
"flake8 > 3.0.0",
|
||||
]
|
||||
|
||||
flake8_entry_point = # ...
|
||||
|
||||
setuptools.setup(
|
||||
name="flake8_example",
|
||||
license="MIT",
|
||||
version="0.1.0",
|
||||
description="our extension to flake8",
|
||||
author="Me",
|
||||
author_email="example@example.com",
|
||||
url="https://gitlab.com/me/flake8_example",
|
||||
packages=[
|
||||
"flake8_example",
|
||||
],
|
||||
install_requires=requires,
|
||||
entry_points={
|
||||
flake8_entry_point: [
|
||||
'X = flake8_example:ExamplePlugin',
|
||||
],
|
||||
},
|
||||
classifiers=[
|
||||
"Environment :: Console",
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Programming Language :: Python",
|
||||
"Programming Language :: Python :: 2",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Topic :: Software Development :: Libraries :: Python Modules",
|
||||
"Topic :: Software Development :: Quality Assurance",
|
||||
],
|
||||
)
|
||||
|
||||
Note specifically these lines:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
flake8_entry_point = # ...
|
||||
|
||||
setuptools.setup(
|
||||
# snip ...
|
||||
entry_points={
|
||||
flake8_entry_point: [
|
||||
'X = flake8_example:ExamplePlugin',
|
||||
],
|
||||
},
|
||||
# snip ...
|
||||
)
|
||||
|
||||
We tell setuptools to register our entry point "X" inside the specific
|
||||
grouping of entry-points that flake8 should look in.
|
||||
|
||||
|Flake8| presently looks at three groups:
|
||||
|
||||
- ``flake8.extension``
|
||||
|
||||
- ``flake8.listen``
|
||||
|
||||
- ``flake8.report``
|
||||
|
||||
If your plugin is one that adds checks to |Flake8|, you will use
|
||||
``flake8.extension``. If your plugin automatically fixes errors in code, you
|
||||
will use ``flake8.listen``. Finally, if your plugin performs extra report
|
||||
handling (formatting, filtering, etc.) it will use ``flake8.report``.
|
||||
|
||||
If our ``ExamplePlugin`` is something that adds checks, our code would look
|
||||
like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
setuptools.setup(
|
||||
# snip ...
|
||||
entry_points={
|
||||
'flake8.extension': [
|
||||
'X = flake8_example:ExamplePlugin',
|
||||
],
|
||||
},
|
||||
# snip ...
|
||||
)
|
||||
|
||||
|
||||
.. _Entry Points:
|
||||
https://pythonhosted.org/setuptools/pkg_resources.html#entry-points
|
||||
4
docs/source/release-notes/0.6.0.rst
Normal file
4
docs/source/release-notes/0.6.0.rst
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
0.6 - 2010-02-15
|
||||
----------------
|
||||
|
||||
- Fix the McCabe metric on some loops
|
||||
6
docs/source/release-notes/0.7.0.rst
Normal file
6
docs/source/release-notes/0.7.0.rst
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
0.7 - 2010-02-18
|
||||
----------------
|
||||
|
||||
- Fix pep8 initialization when run through Hg
|
||||
- Make pep8 short options work when run through the command line
|
||||
- Skip duplicates when controlling files via Hg
|
||||
5
docs/source/release-notes/0.8.0.rst
Normal file
5
docs/source/release-notes/0.8.0.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
0.8 - 2011-02-27
|
||||
----------------
|
||||
|
||||
- fixed hg hook
|
||||
- discard unexisting files on hook check
|
||||
5
docs/source/release-notes/0.9.0.rst
Normal file
5
docs/source/release-notes/0.9.0.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
0.9 - 2011-11-09
|
||||
----------------
|
||||
|
||||
- update pep8 version to 0.6.1
|
||||
- mccabe check: gracefully handle compile failure
|
||||
5
docs/source/release-notes/1.0.0.rst
Normal file
5
docs/source/release-notes/1.0.0.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
1.0 - 2011-11-29
|
||||
----------------
|
||||
|
||||
- Deactivates by default the complexity checker
|
||||
- Introduces the complexity option in the HG hook and the command line.
|
||||
8
docs/source/release-notes/1.1.0.rst
Normal file
8
docs/source/release-notes/1.1.0.rst
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
1.1 - 2012-02-14
|
||||
----------------
|
||||
|
||||
- fixed the value returned by --version
|
||||
- allow the flake8: header to be more generic
|
||||
- fixed the "hg hook raises 'physical lines'" bug
|
||||
- allow three argument form of raise
|
||||
- now uses setuptools if available, for 'develop' command
|
||||
6
docs/source/release-notes/1.2.0.rst
Normal file
6
docs/source/release-notes/1.2.0.rst
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
1.2 - 2012-02-12
|
||||
----------------
|
||||
|
||||
- added a git hook
|
||||
- now Python 3 compatible
|
||||
- mccabe and pyflakes have warning codes like pep8 now
|
||||
4
docs/source/release-notes/1.3.0.rst
Normal file
4
docs/source/release-notes/1.3.0.rst
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
1.3 - 2012-03-12
|
||||
----------------
|
||||
|
||||
- fixed false W402 warning on exception blocks.
|
||||
4
docs/source/release-notes/1.3.1.rst
Normal file
4
docs/source/release-notes/1.3.1.rst
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
1.3.1 - 2012-05-19
|
||||
------------------
|
||||
|
||||
- fixed support for Python 2.5
|
||||
5
docs/source/release-notes/1.4.0.rst
Normal file
5
docs/source/release-notes/1.4.0.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
1.4 - 2012-07-12
|
||||
----------------
|
||||
|
||||
- git_hook: Only check staged changes for compliance
|
||||
- use pep8 1.2
|
||||
9
docs/source/release-notes/1.5.0.rst
Normal file
9
docs/source/release-notes/1.5.0.rst
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
1.5 - 2012-10-13
|
||||
----------------
|
||||
|
||||
- fixed the stdin
|
||||
- make sure mccabe catches the syntax errors as warnings
|
||||
- pep8 upgrade
|
||||
- added max_line_length default value
|
||||
- added Flake8Command and entry points if setuptools is around
|
||||
- using the setuptools console wrapper when available
|
||||
14
docs/source/release-notes/1.6.0.rst
Normal file
14
docs/source/release-notes/1.6.0.rst
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
1.6 - 2012-11-16
|
||||
----------------
|
||||
|
||||
- changed the signatures of the ``check_file`` function in flake8/run.py,
|
||||
``skip_warning`` in flake8/util.py and the ``check``, ``checkPath``
|
||||
functions in flake8/pyflakes.py.
|
||||
- fix ``--exclude`` and ``--ignore`` command flags (#14, #19)
|
||||
- fix the git hook that wasn't catching files not already added to the index
|
||||
(#29)
|
||||
- pre-emptively includes the addition to pep8 to ignore certain lines.
|
||||
Add ``# nopep8`` to the end of a line to ignore it. (#37)
|
||||
- ``check_file`` can now be used without any special prior setup (#21)
|
||||
- unpacking exceptions will no longer cause an exception (#20)
|
||||
- fixed crash on non-existent file (#38)
|
||||
7
docs/source/release-notes/1.6.1.rst
Normal file
7
docs/source/release-notes/1.6.1.rst
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
1.6.1 - 2012-11-24
|
||||
------------------
|
||||
|
||||
- fixed the mercurial hook, a change from a previous patch was not properly
|
||||
applied
|
||||
- fixed an assumption about warnings/error messages that caused an exception
|
||||
to be thrown when McCabe is used
|
||||
4
docs/source/release-notes/1.6.2.rst
Normal file
4
docs/source/release-notes/1.6.2.rst
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
1.6.2 - 2012-11-25
|
||||
------------------
|
||||
|
||||
- fixed the NameError: global name 'message' is not defined (#46)
|
||||
9
docs/source/release-notes/1.7.0.rst
Normal file
9
docs/source/release-notes/1.7.0.rst
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
1.7.0 - 2012-12-21
|
||||
------------------
|
||||
|
||||
- Fixes part of #35: Exception for no WITHITEM being an attribute of Checker
|
||||
for Python 3.3
|
||||
- Support stdin
|
||||
- Incorporate @phd's builtins pull request
|
||||
- Fix the git hook
|
||||
- Update pep8.py to the latest version
|
||||
13
docs/source/release-notes/2.0.0.rst
Normal file
13
docs/source/release-notes/2.0.0.rst
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
2.0.0 - 2013-02-23
|
||||
------------------
|
||||
|
||||
- Pyflakes errors are prefixed by an ``F`` instead of an ``E``
|
||||
- McCabe complexity warnings are prefixed by a ``C`` instead of a ``W``
|
||||
- Flake8 supports extensions through entry points
|
||||
- Due to the above support, we **require** setuptools
|
||||
- We publish the `documentation <https://flake8.readthedocs.org/>`_
|
||||
- Fixes #13: pep8, pyflakes and mccabe become external dependencies
|
||||
- Split run.py into main.py, engine.py and hooks.py for better logic
|
||||
- Expose our parser for our users
|
||||
- New feature: Install git and hg hooks automagically
|
||||
- By relying on pyflakes (0.6.1), we also fixed #45 and #35
|
||||
12
docs/source/release-notes/2.1.0.rst
Normal file
12
docs/source/release-notes/2.1.0.rst
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
2.1.0 - 2013-10-26
|
||||
------------------
|
||||
|
||||
- Add FLAKE8_LAZY and FLAKE8_IGNORE environment variable support to git and
|
||||
mercurial hooks
|
||||
- Force git and mercurial hooks to repsect configuration in setup.cfg
|
||||
- Only check staged files if that is specified
|
||||
- Fix hook file permissions
|
||||
- Fix the git hook on python 3
|
||||
- Ignore non-python files when running the git hook
|
||||
- Ignore .tox directories by default
|
||||
- Flake8 now reports the column number for PyFlakes messages
|
||||
12
docs/source/release-notes/2.2.0.rst
Normal file
12
docs/source/release-notes/2.2.0.rst
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
2.2.0 - 2014-06-22
|
||||
------------------
|
||||
|
||||
- New option ``doctests`` to run Pyflakes checks on doctests too
|
||||
- New option ``jobs`` to launch multiple jobs in parallel
|
||||
- Turn on using multiple jobs by default using the CPU count
|
||||
- Add support for ``python -m flake8`` on Python 2.7 and Python 3
|
||||
- Fix Git and Mercurial hooks: issues #88, #133, #148 and #149
|
||||
- Fix crashes with Python 3.4 by upgrading dependencies
|
||||
- Fix traceback when running tests with Python 2.6
|
||||
- Fix the setuptools command ``python setup.py flake8`` to read
|
||||
the project configuration
|
||||
5
docs/source/release-notes/2.2.1.rst
Normal file
5
docs/source/release-notes/2.2.1.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
2.2.1 - 2014-06-30
|
||||
------------------
|
||||
|
||||
- Turn off multiple jobs by default. To enable automatic use of all CPUs, use
|
||||
``--jobs=auto``. Fixes #155 and #154.
|
||||
5
docs/source/release-notes/2.2.2.rst
Normal file
5
docs/source/release-notes/2.2.2.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
2.2.2 - 2014-07-04
|
||||
------------------
|
||||
|
||||
- Re-enable multiprocessing by default while fixing the issue Windows users
|
||||
were seeing.
|
||||
4
docs/source/release-notes/2.2.3.rst
Normal file
4
docs/source/release-notes/2.2.3.rst
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
2.2.3 - 2014-08-25
|
||||
------------------
|
||||
|
||||
- Actually turn multiprocessing on by default
|
||||
20
docs/source/release-notes/2.2.4.rst
Normal file
20
docs/source/release-notes/2.2.4.rst
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
2.2.4 - 2014-10-09
|
||||
------------------
|
||||
|
||||
- Fix bugs triggered by turning multiprocessing on by default (again)
|
||||
|
||||
Multiprocessing is forcibly disabled in the following cases:
|
||||
|
||||
- Passing something in via stdin
|
||||
|
||||
- Analyzing a diff
|
||||
|
||||
- Using windows
|
||||
|
||||
- Fix --install-hook when there are no config files present for pep8 or
|
||||
flake8.
|
||||
|
||||
- Fix how the setuptools command parses excludes in config files
|
||||
|
||||
- Fix how the git hook determines which files to analyze (Thanks Chris
|
||||
Buccella!)
|
||||
6
docs/source/release-notes/2.2.5.rst
Normal file
6
docs/source/release-notes/2.2.5.rst
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
2.2.5 - 2014-10-19
|
||||
------------------
|
||||
|
||||
- Flush standard out when using multiprocessing
|
||||
|
||||
- Make the check for "# flake8: noqa" more strict
|
||||
10
docs/source/release-notes/2.3.0.rst
Normal file
10
docs/source/release-notes/2.3.0.rst
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
2.3.0 - 2015-01-04
|
||||
------------------
|
||||
|
||||
- **Feature**: Add ``--output-file`` option to specify a file to write to
|
||||
instead of ``stdout``.
|
||||
|
||||
- **Bug** Fix interleaving of output while using multiprocessing
|
||||
(`GitLab#17`_)
|
||||
|
||||
.. _GitLab#17: https://gitlab.com/pycqa/flake8/issues/17
|
||||
33
docs/source/release-notes/2.4.0.rst
Normal file
33
docs/source/release-notes/2.4.0.rst
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
2.4.0 - 2015-03-07
|
||||
------------------
|
||||
|
||||
- **Bug** Print filenames when using multiprocessing and ``-q`` option.
|
||||
(`GitLab#31`_)
|
||||
|
||||
- **Bug** Put upper cap on dependencies. The caps for 2.4.0 are:
|
||||
|
||||
- ``pep8 < 1.6`` (Related to `GitLab#35`_)
|
||||
|
||||
- ``mccabe < 0.4``
|
||||
|
||||
- ``pyflakes < 0.9``
|
||||
|
||||
See also `GitLab#32`_
|
||||
|
||||
- **Bug** Files excluded in a config file were not being excluded when flake8
|
||||
was run from a git hook. (`GitHub#2`_)
|
||||
|
||||
- **Improvement** Print warnings for users who are providing mutually
|
||||
exclusive options to flake8. (`GitLab#8`_, `GitLab!18`_)
|
||||
|
||||
- **Feature** Allow git hook configuration to live in ``.git/config``.
|
||||
See the updated `VCS hooks docs`_ for more details. (`GitLab!20`_)
|
||||
|
||||
.. _GitHub#2: https://github.com/pycqa/flake8/pull/2
|
||||
.. _GitLab#8: https://gitlab.com/pycqa/flake8/issues/8
|
||||
.. _GitLab#31: https://gitlab.com/pycqa/flake8/issues/31
|
||||
.. _GitLab#32: https://gitlab.com/pycqa/flake8/issues/32
|
||||
.. _GitLab#35: https://gitlab.com/pycqa/flake8/issues/35
|
||||
.. _GitLab!18: https://gitlab.com/pycqa/flake8/merge_requests/18
|
||||
.. _GitLab!20: https://gitlab.com/pycqa/flake8/merge_requests/20
|
||||
.. _VCS hooks docs: https://flake8.readthedocs.org/en/latest/vcs.html
|
||||
12
docs/source/release-notes/2.4.1.rst
Normal file
12
docs/source/release-notes/2.4.1.rst
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
2.4.1 - 2015-05-18
|
||||
------------------
|
||||
|
||||
- **Bug** Do not raise a ``SystemError`` unless there were errors in the
|
||||
setuptools command. (`GitLab#39`_, `GitLab!23`_)
|
||||
|
||||
- **Bug** Do not verify dependencies of extensions loaded via entry-points.
|
||||
|
||||
- **Improvement** Blacklist versions of pep8 we know are broken
|
||||
|
||||
.. _GitLab#39: https://gitlab.com/pycqa/flake8/issues/39
|
||||
.. _GitLab!23: https://gitlab.com/pycqa/flake8/merge_requests/23
|
||||
25
docs/source/release-notes/2.5.0.rst
Normal file
25
docs/source/release-notes/2.5.0.rst
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
2.5.0 - 2015-10-26
|
||||
------------------
|
||||
|
||||
- **Improvement** Raise cap on PyFlakes for Python 3.5 support
|
||||
|
||||
- **Improvement** Avoid deprecation warnings when loading extensions
|
||||
(`GitLab#59`_, `GitLab#90`_)
|
||||
|
||||
- **Improvement** Separate logic to enable "off-by-default" extensions
|
||||
(`GitLab#67`_)
|
||||
|
||||
- **Bug** Properly parse options to setuptools Flake8 command (`GitLab!41`_)
|
||||
|
||||
- **Bug** Fix exceptions when output on stdout is truncated before Flake8
|
||||
finishes writing the output (`GitLab#69`_)
|
||||
|
||||
- **Bug** Fix error on OS X where Flake8 can no longer acquire or create new
|
||||
semaphores (`GitLab#74`_)
|
||||
|
||||
.. _GitLab!41: https://gitlab.com/pycqa/flake8/merge_requests/41
|
||||
.. _GitLab#59: https://gitlab.com/pycqa/flake8/issues/59
|
||||
.. _GitLab#67: https://gitlab.com/pycqa/flake8/issues/67
|
||||
.. _GitLab#69: https://gitlab.com/pycqa/flake8/issues/69
|
||||
.. _GitLab#74: https://gitlab.com/pycqa/flake8/issues/74
|
||||
.. _GitLab#90: https://gitlab.com/pycqa/flake8/issues/90
|
||||
13
docs/source/release-notes/2.5.1.rst
Normal file
13
docs/source/release-notes/2.5.1.rst
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
2.5.1 - 2015-12-08
|
||||
------------------
|
||||
|
||||
- **Bug** Properly look for ``.flake8`` in current working directory
|
||||
(`GitLab#103`_)
|
||||
|
||||
- **Bug** Monkey-patch ``pep8.stdin_get_value`` to cache the actual value in
|
||||
stdin. This helps plugins relying on the function when run with
|
||||
multiprocessing. (`GitLab#105`_, `GitLab#107`_)
|
||||
|
||||
.. _GitLab#103: https://gitlab.com/pycqa/flake8/issues/103
|
||||
.. _GitLab#105: https://gitlab.com/pycqa/flake8/issues/105
|
||||
.. _GitLab#107: https://gitlab.com/pycqa/flake8/issues/107
|
||||
7
docs/source/release-notes/2.5.2.rst
Normal file
7
docs/source/release-notes/2.5.2.rst
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
2.5.2 - 2016-01-30
|
||||
------------------
|
||||
|
||||
- **Bug** Parse ``output_file`` and ``enable_extensions`` from config files
|
||||
|
||||
- **Improvement** Raise upper bound on mccabe plugin to allow for version
|
||||
0.4.0
|
||||
5
docs/source/release-notes/2.5.3.rst
Normal file
5
docs/source/release-notes/2.5.3.rst
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
2.5.3 - 2016-02-11
|
||||
------------------
|
||||
|
||||
- **Bug** Actually parse ``output_file`` and ``enable_extensions`` from config
|
||||
files
|
||||
4
docs/source/release-notes/2.5.4.rst
Normal file
4
docs/source/release-notes/2.5.4.rst
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
2.5.4 - 2016-02-11
|
||||
------------------
|
||||
|
||||
- **Bug** Missed an attribute rename during the v2.5.3 release.
|
||||
7
docs/source/release-notes/2.5.5.rst
Normal file
7
docs/source/release-notes/2.5.5.rst
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
2.5.5 - 2016-06-14
|
||||
------------------
|
||||
|
||||
- **Bug** Fix setuptools integration when parsing config files
|
||||
|
||||
- **Bug** Don't pass the user's config path as the config_file when creating a
|
||||
StyleGuide
|
||||
6
docs/source/release-notes/2.6.1.rst
Normal file
6
docs/source/release-notes/2.6.1.rst
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
2.6.1 - 2016-06-25
|
||||
------------------
|
||||
|
||||
- **Bug** Update the config files to search for to include ``setup.cfg`` and
|
||||
``tox.ini``. This was broken in 2.5.5 when we stopped passing
|
||||
``config_file`` to our Style Guide
|
||||
42
docs/source/release-notes/3.0.0.rst
Normal file
42
docs/source/release-notes/3.0.0.rst
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
3.0.0b1 -- 2016-06-25
|
||||
---------------------
|
||||
|
||||
- Rewrite our documentation from scratch! (http://flake8.pycqa.org)
|
||||
|
||||
- Drop explicit support for Pythons 2.6, 3.2, and 3.3.
|
||||
|
||||
- Remove dependence on pep8/pycodestyle for file processing, plugin
|
||||
dispatching, and more. We now control all of this while keeping backwards
|
||||
compatibility.
|
||||
|
||||
- ``--select`` and ``--ignore`` can now both be specified and try to find the
|
||||
most specific rule from each. For example, if you do ``--select E --ignore
|
||||
E123`` then we will report everything that starts with ``E`` except for
|
||||
``E123``. Previously, you would have had to do ``--ignore E123,F,W`` which
|
||||
will also still work, but the former should be far more intuitive.
|
||||
|
||||
- Add support for in-line ``# noqa`` comments to specify **only** the error
|
||||
codes to be ignored, e.g., ``# noqa: E123,W503``
|
||||
|
||||
- Add entry-point for formatters as well as a base class that new formatters
|
||||
can inherit from. See the documentation for more details.
|
||||
|
||||
- Add detailed verbose output using the standard library logging module.
|
||||
|
||||
- Enhance our usage of optparse for plugin developers by adding new parameters
|
||||
to the ``add_option`` that plugins use to register new options.
|
||||
|
||||
- Update ``--install-hook`` to require the name of version control system hook
|
||||
you wish to install a Flake8.
|
||||
|
||||
- Stop checking sub-directories more than once via the setuptools command
|
||||
|
||||
- When passing a file on standard-in, allow the caller to specify
|
||||
``--stdin-display-name`` so the output is properly formatted
|
||||
|
||||
- The Git hook now uses ``sys.executable`` to format the shebang line.
|
||||
This allows Flake8 to install a hook script from a virtualenv that points to
|
||||
that virtualenv's Flake8 as opposed to a global one (without the virtualenv
|
||||
being sourced).
|
||||
|
||||
- When using ``--count``, the output is no longer written to stderr.
|
||||
41
docs/source/release-notes/index.rst
Normal file
41
docs/source/release-notes/index.rst
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
===========================
|
||||
Release Notes and History
|
||||
===========================
|
||||
|
||||
All of the release notes that have been recorded for Flake8 are organized here
|
||||
with the newest releases first.
|
||||
|
||||
.. toctree::
|
||||
3.0.0
|
||||
2.5.5
|
||||
2.5.4
|
||||
2.5.3
|
||||
2.5.2
|
||||
2.5.1
|
||||
2.5.0
|
||||
2.4.1
|
||||
2.4.0
|
||||
2.3.0
|
||||
2.2.5
|
||||
2.2.4
|
||||
2.2.3
|
||||
2.2.2
|
||||
2.2.1
|
||||
2.2.0
|
||||
2.1.0
|
||||
2.0.0
|
||||
1.7.0
|
||||
1.6.2
|
||||
1.6.1
|
||||
1.6.0
|
||||
1.5.0
|
||||
1.4.0
|
||||
1.3.1
|
||||
1.3.0
|
||||
1.2.0
|
||||
1.1.0
|
||||
1.0.0
|
||||
0.9.0
|
||||
0.8.0
|
||||
0.7.0
|
||||
0.6.0
|
||||
4
docs/source/requirements.txt
Normal file
4
docs/source/requirements.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
sphinx>=1.3.0
|
||||
sphinx_rtd_theme
|
||||
sphinx-prompt
|
||||
configparser
|
||||
0
docs/source/user/.keep
Normal file
0
docs/source/user/.keep
Normal file
227
docs/source/user/configuration.rst
Normal file
227
docs/source/user/configuration.rst
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
.. _configuration:
|
||||
|
||||
====================
|
||||
Configuring Flake8
|
||||
====================
|
||||
|
||||
Once you have learned how to :ref:`invoke <invocation>` |Flake8|, you will soon
|
||||
want to learn how to configure it so you do not have to specify the same
|
||||
options every time you use it.
|
||||
|
||||
This section will show you how to make
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8
|
||||
|
||||
Remember that you want to specify certain options without writing
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --select E123,W456 --enable-extensions H111
|
||||
|
||||
|
||||
Configuration Locations
|
||||
=======================
|
||||
|
||||
|Flake8| supports storing its configuration in the following places:
|
||||
|
||||
- Your top-level user directory
|
||||
|
||||
- In your project in one of ``setup.cfg``, ``tox.ini``, or ``.flake8``.
|
||||
|
||||
|
||||
"User" Configuration
|
||||
--------------------
|
||||
|
||||
|Flake8| allows a user to use "global" configuration file to store preferences.
|
||||
The user configuration file is expected to be stored somewhere in the user's
|
||||
"home" directory.
|
||||
|
||||
- On Windows the "home" directory will be something like
|
||||
``C:\\Users\sigmavirus24``, a.k.a, ``~\``.
|
||||
|
||||
- On Linux and other Unix like systems (including OS X) we will look in
|
||||
``~/``.
|
||||
|
||||
Note that |Flake8| looks for ``~\.flake8`` on Windows and ``~/.config/flake8``
|
||||
on Linux and other Unix systems.
|
||||
|
||||
User configuration files use the same syntax as Project Configuration files.
|
||||
Keep reading to see that syntax.
|
||||
|
||||
|
||||
Project Configuration
|
||||
---------------------
|
||||
|
||||
|Flake8| is written with the understanding that people organize projects into
|
||||
sub-directories. Let's take for example |Flake8|'s own project structure
|
||||
|
||||
.. code::
|
||||
|
||||
flake8
|
||||
├── docs
|
||||
│ ├── build
|
||||
│ └── source
|
||||
│ ├── _static
|
||||
│ ├── _templates
|
||||
│ ├── dev
|
||||
│ ├── internal
|
||||
│ └── user
|
||||
├── flake8
|
||||
│ ├── formatting
|
||||
│ ├── main
|
||||
│ ├── options
|
||||
│ └── plugins
|
||||
└── tests
|
||||
├── fixtures
|
||||
│ └── config_files
|
||||
├── integration
|
||||
└── unit
|
||||
|
||||
In the top-level ``flake8`` directory (which contains ``docs``, ``flake8``,
|
||||
and ``tests``) there's also ``tox.ini`` and ``setup.cfg`` files. In our case,
|
||||
we keep our |Flake8| configuration in ``tox.ini``. Regardless of whether you
|
||||
keep your config in ``.flake8``, ``setup.cfg``, or ``tox.ini`` we expect you
|
||||
to use INI to configure |Flake8| (since each of these files already uses INI
|
||||
as a format). This means that any |Flake8| configuration you wish to set needs
|
||||
to be in the ``flake8`` section, which means it needs to start like so:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
|
||||
Each command-line option that you want to specify in your config file can
|
||||
be named in either of two ways:
|
||||
|
||||
#. Using underscores (``_``) instead of hyphens (``-``)
|
||||
|
||||
#. Simply using hyphens (without the leading hyphens)
|
||||
|
||||
.. note::
|
||||
|
||||
Not every |Flake8| command-line option can be specified in the
|
||||
configuration file. See :ref:`our list of options <options-list>` to
|
||||
determine which options will be parsed from the configuration files.
|
||||
|
||||
Let's actually look at |Flake8|'s own configuration section:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
ignore = D203
|
||||
exclude = .git,__pycache__,docs/source/conf.py,old,build,dist
|
||||
max-complexity = 10
|
||||
|
||||
This is equivalent to:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --ignore D203 \
|
||||
--exclude .git,__pycache__,docs/source/conf.py,old,build,dist \
|
||||
--max-complexity 10
|
||||
|
||||
In our case, if we wanted to, we could also do
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
ignore = D203
|
||||
exclude =
|
||||
.git,
|
||||
__pycache__,
|
||||
docs/source/conf.py,
|
||||
old,
|
||||
build,
|
||||
dist
|
||||
max-complexity = 10
|
||||
|
||||
This would allow us to add comments for why we're excluding items, e.g.,
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
ignore = D203
|
||||
exclude =
|
||||
# No need to traverse our git directory
|
||||
.git,
|
||||
# There's no value in checking cache directories
|
||||
__pycache__,
|
||||
# The conf file is mostly autogenerated, ignore it
|
||||
docs/source/conf.py,
|
||||
# The old directory contains Flake8 2.0
|
||||
old,
|
||||
# This contains our built documentation
|
||||
build,
|
||||
# This contains builds of flake8 that we don't want to check
|
||||
dist
|
||||
max-complexity = 10
|
||||
|
||||
.. note::
|
||||
|
||||
If you're using Python 2, you will notice that we download the
|
||||
:mod:`configparser` backport from PyPI. That backport enables us to
|
||||
support this behaviour on all supported versions of Python.
|
||||
|
||||
Please do **not** open issues about this dependency to |Flake8|.
|
||||
|
||||
.. note::
|
||||
|
||||
You can also specify ``--max-complexity`` as ``max_complexity = 10``.
|
||||
|
||||
This is also useful if you have a long list of error codes to ignore. Let's
|
||||
look at a portion of OpenStack's Swift `project configuration`_:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
# it's not a bug that we aren't using all of hacking, ignore:
|
||||
# F812: list comprehension redefines ...
|
||||
# H101: Use TODO(NAME)
|
||||
# H202: assertRaises Exception too broad
|
||||
# H233: Python 3.x incompatible use of print operator
|
||||
# H301: one import per line
|
||||
# H306: imports not in alphabetical order (time, os)
|
||||
# H401: docstring should not start with a space
|
||||
# H403: multi line docstrings should end on a new line
|
||||
# H404: multi line docstring should start without a leading new line
|
||||
# H405: multi line docstring summary not separated with an empty line
|
||||
# H501: Do not use self.__dict__ for string formatting
|
||||
ignore = F812,H101,H202,H233,H301,H306,H401,H403,H404,H405,H501
|
||||
|
||||
They use the comments to describe the check but they could also write this as:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[flake8]
|
||||
# it's not a bug that we aren't using all of hacking
|
||||
ignore =
|
||||
# F812: list comprehension redefines ...
|
||||
F812,
|
||||
# H101: Use TODO(NAME)
|
||||
H101,
|
||||
# H202: assertRaises Exception too broad
|
||||
H202,
|
||||
# H233: Python 3.x incompatible use of print operator
|
||||
H233,
|
||||
# H301: one import per line
|
||||
H301,
|
||||
# H306: imports not in alphabetical order (time, os)
|
||||
H306,
|
||||
# H401: docstring should not start with a space
|
||||
H401,
|
||||
# H403: multi line docstrings should end on a new line
|
||||
H403,
|
||||
# H404: multi line docstring should start without a leading new line
|
||||
H404,
|
||||
# H405: multi line docstring summary not separated with an empty line
|
||||
H405,
|
||||
# H501: Do not use self.__dict__ for string formatting
|
||||
H501
|
||||
|
||||
Or they could use each comment to describe **why** they've ignored the check.
|
||||
|Flake8| knows how to parse these lists and will appropriatey handle
|
||||
these situations.
|
||||
|
||||
.. _project configuration:
|
||||
https://github.com/openstack/swift/blob/3944d820387f08372c1a29444f4af7d8e6090ae9/tox.ini#L66..L81
|
||||
90
docs/source/user/ignoring-errors.rst
Normal file
90
docs/source/user/ignoring-errors.rst
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
=============================
|
||||
Ignoring Errors with Flake8
|
||||
=============================
|
||||
|
||||
By default, |Flake8| has a list of error codes that it ignores. The list used
|
||||
by a version of |Flake8| may be different than the list used by a different
|
||||
version. To see the default list, :option:`flake8 --help` will
|
||||
show the output with the current default list.
|
||||
|
||||
|
||||
Changing the Ignore List
|
||||
========================
|
||||
|
||||
If we want to change the list of ignored codes for a single run, we can use
|
||||
:option:`flake8 --ignore` to specify a comma-separated list of codes for a
|
||||
specific run on the command-line, e.g.,
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --ignore=E1,E23,W503 path/to/files/ path/to/more/files/
|
||||
|
||||
This tells |Flake8| to ignore any error codes starting with ``E1``, ``E23``,
|
||||
or ``W503`` while it is running.
|
||||
|
||||
.. note::
|
||||
|
||||
The documentation for :option:`flake8 --ignore` shows examples for how
|
||||
to change the ignore list in the configuration file. See also
|
||||
:ref:`configuration` as well for details about how to use configuration
|
||||
files.
|
||||
|
||||
|
||||
In-line Ignoring Errors
|
||||
=======================
|
||||
|
||||
In some cases, we might not want to ignore an error code (or class of error
|
||||
codes) for the entirety of our project. Instead, we might want to ignore the
|
||||
specific error code on a specific line. Let's take for example a line like
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
example = lambda: 'example'
|
||||
|
||||
Sometimes we genuinely need something this simple. We could instead define
|
||||
a function like we normally would. Note, in some contexts this distracts from
|
||||
what is actually happening. In those cases, we can also do:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
example = lambda: 'example' # noqa: E731
|
||||
|
||||
This will only ignore the error from pycodestyle that checks for lambda
|
||||
assignments and generates an ``E731``. If there are other errors on the line
|
||||
then those will be reported.
|
||||
|
||||
.. note::
|
||||
|
||||
If we ever want to disable |Flake8| respecting ``# noqa`` comments, we can
|
||||
can refer to :option:`flake8 --disable-noqa`.
|
||||
|
||||
If we instead had more than one error that we wished to ignore, we could
|
||||
list all of the errors with commas separating them:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# noqa: E731,E123
|
||||
|
||||
Finally, if we have a particularly bad line of code, we can ignore every error
|
||||
using simply ``# noqa`` with nothing after it.
|
||||
|
||||
|
||||
Ignoring Entire Files
|
||||
=====================
|
||||
|
||||
Imagine a situation where we are adding |Flake8| to a codebase. Let's further
|
||||
imagine that with the exception of a few particularly bad files, we can add
|
||||
|Flake8| easily and move on with our lives. There are two ways to ignore the
|
||||
file:
|
||||
|
||||
#. By explicitly adding it to our list of excluded paths (see: :option:`flake8
|
||||
--exclude`)
|
||||
|
||||
#. By adding ``# flake8: noqa`` to the file
|
||||
|
||||
The former is the **recommended** way of ignoring entire files. By using our
|
||||
exclude list, we can include it in our configuration file and have one central
|
||||
place to find what files aren't included in |Flake8| checks. The latter has the
|
||||
benefit that when we run |Flake8| with :option:`flake8 --disable-noqa` all of
|
||||
the errors in that file will show up without having to modify our
|
||||
configuration. Both exist so we can choose which is better for us.
|
||||
33
docs/source/user/index.rst
Normal file
33
docs/source/user/index.rst
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
==============
|
||||
Using Flake8
|
||||
==============
|
||||
|
||||
|Flake8| can be used in many ways. A few:
|
||||
|
||||
- invoked on the command-line
|
||||
|
||||
- invoked via Python
|
||||
|
||||
- called by Git or Mercurial on or around committing
|
||||
|
||||
This guide will cover all of these and the nuances for using |Flake8|.
|
||||
|
||||
.. note::
|
||||
|
||||
This portion of |Flake8|'s documentation does not cover installation. See
|
||||
the :ref:`installation-guide` section for how to install |Flake8|.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
invocation
|
||||
configuration
|
||||
options
|
||||
ignoring-errors
|
||||
using-plugins
|
||||
python-api
|
||||
|
||||
.. config files
|
||||
.. command-line tutorial
|
||||
.. VCS usage
|
||||
.. installing and using plugins
|
||||
144
docs/source/user/invocation.rst
Normal file
144
docs/source/user/invocation.rst
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
.. _invocation:
|
||||
|
||||
=================
|
||||
Invoking Flake8
|
||||
=================
|
||||
|
||||
Once you have :ref:`installed <installation-guide>` |Flake8|, you can begin
|
||||
using it. Most of the time, you will be able to generically invoke |Flake8|
|
||||
like so:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 ...
|
||||
|
||||
Where you simply allow the shell running in your terminal to locate |Flake8|.
|
||||
In some cases, though, you may have installed |Flake8| for multiple versions
|
||||
of Python (e.g., Python 2.7 and Python 3.5) and you need to call a specific
|
||||
version. In that case, you will have much better results using:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
python2.7 -m flake8
|
||||
|
||||
Or
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
python3.5 -m flake8
|
||||
|
||||
Since that will tell the correct version of Python to run |Flake8|.
|
||||
|
||||
.. note::
|
||||
|
||||
Installing |Flake8| once will not install it on both Python 2.7 and
|
||||
Python 3.5. It will only install it for the version of Python that
|
||||
is running pip.
|
||||
|
||||
It is also possible to specify command-line options directly to |Flake8|:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --select E123
|
||||
|
||||
Or
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
python<version> -m flake8 --select E123
|
||||
|
||||
.. note::
|
||||
|
||||
This is the last time we will show both versions of an invocation.
|
||||
From now on, we'll simply use ``flake8`` and assume that the user
|
||||
knows they can instead use ``python<version> -m flake8`` instead.
|
||||
|
||||
It's also possible to narrow what |Flake8| will try to check by specifying
|
||||
exactly the paths and directories you want it to check. Let's assume that
|
||||
we have a directory with python files and sub-directories which have python
|
||||
files (and may have more sub-directories) called ``my_project``. Then if
|
||||
we only want errors from files found inside ``my_project`` we can do:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 my_project
|
||||
|
||||
And if we only want certain errors (e.g., ``E123``) from files in that
|
||||
directory we can also do:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --select E123 my_project
|
||||
|
||||
If you want to explore more options that can be passed on the command-line,
|
||||
you can use the ``--help`` option:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --help
|
||||
|
||||
And you should see something like:
|
||||
|
||||
.. code::
|
||||
|
||||
Usage: flake8 [options] file file ...
|
||||
|
||||
Options:
|
||||
--version show program's version number and exit
|
||||
-h, --help show this help message and exit
|
||||
-v, --verbose Print more information about what is happening in
|
||||
flake8. This option is repeatable and will increase
|
||||
verbosity each time it is repeated.
|
||||
-q, --quiet Report only file names, or nothing. This option is
|
||||
repeatable.
|
||||
--count Print total number of errors and warnings to standard
|
||||
error and set the exit code to 1 if total is not
|
||||
empty.
|
||||
--diff Report changes only within line number ranges in the
|
||||
unified diff provided on standard in by the user.
|
||||
--exclude=patterns Comma-separated list of files or directories to
|
||||
exclude.(Default:
|
||||
.svn,CVS,.bzr,.hg,.git,__pycache__,.tox)
|
||||
--filename=patterns Only check for filenames matching the patterns in this
|
||||
comma-separated list. (Default: *.py)
|
||||
--format=format Format errors according to the chosen formatter.
|
||||
--hang-closing Hang closing bracket instead of matching indentation
|
||||
of opening bracket's line.
|
||||
--ignore=errors Comma-separated list of errors and warnings to ignore
|
||||
(or skip). For example, ``--ignore=E4,E51,W234``.
|
||||
(Default: E121,E123,E126,E226,E24,E704)
|
||||
--max-line-length=n Maximum allowed line length for the entirety of this
|
||||
run. (Default: 79)
|
||||
--select=errors Comma-separated list of errors and warnings to enable.
|
||||
For example, ``--select=E4,E51,W234``. (Default: )
|
||||
--disable-noqa Disable the effect of "# noqa". This will report
|
||||
errors on lines with "# noqa" at the end.
|
||||
--show-source Show the source generate each error or warning.
|
||||
--statistics Count errors and warnings.
|
||||
--enabled-extensions=ENABLED_EXTENSIONS
|
||||
Enable plugins and extensions that are otherwise
|
||||
disabled by default
|
||||
--exit-zero Exit with status code "0" even if there are errors.
|
||||
-j JOBS, --jobs=JOBS Number of subprocesses to use to run checks in
|
||||
parallel. This is ignored on Windows. The default,
|
||||
"auto", will auto-detect the number of processors
|
||||
available to use. (Default: auto)
|
||||
--output-file=OUTPUT_FILE
|
||||
Redirect report to a file.
|
||||
--append-config=APPEND_CONFIG
|
||||
Provide extra config files to parse in addition to the
|
||||
files found by Flake8 by default. These files are the
|
||||
last ones read and so they take the highest precedence
|
||||
when multiple files provide the same option.
|
||||
--config=CONFIG Path to the config file that will be the authoritative
|
||||
config source. This will cause Flake8 to ignore all
|
||||
other configuration files.
|
||||
--isolated Ignore all found configuration files.
|
||||
--builtins=BUILTINS define more built-ins, comma separated
|
||||
--doctests check syntax of the doctests
|
||||
--include-in-doctest=INCLUDE_IN_DOCTEST
|
||||
Run doctests only on these files
|
||||
--exclude-from-doctest=EXCLUDE_FROM_DOCTEST
|
||||
Skip these files when running doctests
|
||||
|
||||
Installed plugins: pyflakes: 1.0.0, pep8: 1.7.0
|
||||
730
docs/source/user/options.rst
Normal file
730
docs/source/user/options.rst
Normal file
|
|
@ -0,0 +1,730 @@
|
|||
.. _options-list:
|
||||
|
||||
================================================
|
||||
Full Listing of Options and Their Descriptions
|
||||
================================================
|
||||
|
||||
..
|
||||
NOTE(sigmavirus24): When adding new options here, please follow the
|
||||
following _rough_ template:
|
||||
|
||||
.. option:: --<opt-name>[=<descriptive-name-of-parameter>]
|
||||
|
||||
Active description of option's purpose (note that each description
|
||||
starts with an active verb)
|
||||
|
||||
Command-line usage:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --<opt-name>[=<example-parameter(s)>] [positional params]
|
||||
|
||||
This **can[ not]** be specified in config files.
|
||||
|
||||
(If it can be, an example using .. code-block:: ini)
|
||||
|
||||
Thank you for your contribution to Flake8's documentation.
|
||||
|
||||
.. program:: flake8
|
||||
|
||||
.. option:: --version
|
||||
|
||||
Show |Flake8|'s version as well as the versions of all plugins
|
||||
installed.
|
||||
|
||||
Command-line usage:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --version
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: -h, --help
|
||||
|
||||
Show a description of how to use |Flake8| and its options.
|
||||
|
||||
Command-line usage:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --help
|
||||
flake8 -h
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: -v, --verbose
|
||||
|
||||
Increase the verbosity of |Flake8|'s output. Each time you specify
|
||||
it, it will print more and more information.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 -vv
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
verbose = 2
|
||||
|
||||
|
||||
.. option:: -q, --quiet
|
||||
|
||||
Decrease the verbosity of |Flake8|'s output. Each time you specify it,
|
||||
it will print less and less information.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 -q
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
quiet = 1
|
||||
|
||||
|
||||
.. option:: --count
|
||||
|
||||
Print the total number of errors.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --count dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
count = True
|
||||
|
||||
|
||||
.. option:: --diff
|
||||
|
||||
Use the unified diff provided on standard in to only check the modified
|
||||
files and report errors included in the diff.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
git diff -u | flake8 --diff
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --exclude=<patterns>
|
||||
|
||||
Provide a comma-separated list of glob patterns to exclude from checks.
|
||||
|
||||
This defaults to: ``.svn,CVS,.bzr,.hg,.git,__pycache__,.tox``
|
||||
|
||||
Example patterns:
|
||||
|
||||
- ``*.pyc`` will match any file that ends with ``.pyc``
|
||||
|
||||
- ``__pycache__`` will match any path that has ``__pycache__`` in it
|
||||
|
||||
- ``lib/python`` will look expand that using :func:`os.path.abspath` and
|
||||
look for matching paths
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --exclude=*.pyc dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
exclude =
|
||||
.tox,
|
||||
__pycache__
|
||||
|
||||
|
||||
.. option:: --filename=<patterns>
|
||||
|
||||
Provide a comma-separate list of glob patterns to include for checks.
|
||||
|
||||
This defaults to: ``*.py``
|
||||
|
||||
Example patterns:
|
||||
|
||||
- ``*.py`` will match any file that ends with ``.py``
|
||||
|
||||
- ``__pycache__`` will match any path that has ``__pycache__`` in it
|
||||
|
||||
- ``lib/python`` will look expand that using :func:`os.path.abspath` and
|
||||
look for matching paths
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --filename=*.py dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
filename =
|
||||
example.py,
|
||||
another-example*.py
|
||||
|
||||
|
||||
.. option:: --stdin-display-name=<display_name>
|
||||
|
||||
Provide the name to use to report warnings and errors from code on stdin.
|
||||
|
||||
Instead of reporting an error as something like:
|
||||
|
||||
.. code::
|
||||
|
||||
stdin:82:73 E501 line too long
|
||||
|
||||
You can specify this option to have it report whatever value you want
|
||||
instead of stdin.
|
||||
|
||||
This defaults to: ``stdin``
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
cat file.py | flake8 --stdin-display-name=file.py -
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --format=<format>
|
||||
|
||||
Select the formatter used to display errors to the user.
|
||||
|
||||
This defaults to: ``default``
|
||||
|
||||
By default, there are two formatters available:
|
||||
|
||||
- default
|
||||
- pylint
|
||||
|
||||
Other formatters can be installed. Refer to their documentation for the
|
||||
name to use to select them. Further, users can specify their own format
|
||||
string. The variables available are:
|
||||
|
||||
- code
|
||||
- col
|
||||
- path
|
||||
- row
|
||||
- text
|
||||
|
||||
The default formatter has a format string of:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
'%(path)s:%(row)d:%(col)d: %(code)s %(text)s'
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --format=pylint dir/
|
||||
flake8 --format='%(path)s::%(row)d,%(col)d::%(code)s::%(text)s' dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
format=pylint
|
||||
format=%(path)s::%(row)d,%(col)d::%(code)s::%(text)s
|
||||
|
||||
|
||||
.. option:: --hang-closing
|
||||
|
||||
Toggle whether pycodestyle should enforce matching the indentation of the
|
||||
opening bracket's line. When you specify this, it will prefer that you
|
||||
hang the closing bracket rather than match the indentation.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --hang-closing dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
hang_closing = True
|
||||
hang-closing = True
|
||||
|
||||
|
||||
.. option:: --ignore=<errors>
|
||||
|
||||
Specify a list of codes to ignore. The list is expected to be
|
||||
comma-separated, and does not need to specify an error code exactly.
|
||||
Since |Flake8| 3.0, this **can** be combined with :option:`--select`. See
|
||||
:option:`--select` for more information.
|
||||
|
||||
For example, if you wish to only ignore ``W234``, then you can specify
|
||||
that. But if you want to ignore all codes that start with ``W23`` you
|
||||
need only specify ``W23`` to ignore them. This also works for ``W2`` and
|
||||
``W`` (for example).
|
||||
|
||||
This defaults to: ``E121,E123,E126,E226,E24,E704``
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --ignore=E121,E123 dir/
|
||||
flake8 --ignore=E24,E704 dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
ignore =
|
||||
E121,
|
||||
E123
|
||||
ignore = E121,E123
|
||||
|
||||
|
||||
.. option:: --max-line-length=<n>
|
||||
|
||||
Set the maximum length that any line (with some exceptions) may be.
|
||||
|
||||
Exceptions include lines that are either strings or comments which are
|
||||
entirely URLs. For example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# https://some-super-long-domain-name.com/with/some/very/long/path
|
||||
|
||||
url = (
|
||||
'http://...'
|
||||
)
|
||||
|
||||
This defaults to: 79
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --max-line-length 99 dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
max-line-length = 79
|
||||
|
||||
|
||||
.. option:: --select=<errors>
|
||||
|
||||
Specify the list of error codes you wish |Flake8| to report. Similarly to
|
||||
:option:`--ignore`. You can specify a portion of an error code to get all
|
||||
that start with that string. For example, you can use ``E``, ``E4``,
|
||||
``E43``, and ``E431``.
|
||||
|
||||
This defaults to: E,F,W,C
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --select=E431,E5,W,F dir/
|
||||
flake8 --select=E,W dir/
|
||||
|
||||
This can also be combined with :option:`--ignore`:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --select=E --ignore=E432 dir/
|
||||
|
||||
This will report all codes that start with ``E``, but ignore ``E432``
|
||||
specifically. This is more flexibly than the |Flake8| 2.x and 1.x used
|
||||
to be.
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
select =
|
||||
E431,
|
||||
W,
|
||||
F
|
||||
|
||||
|
||||
.. option:: --disable-noqa
|
||||
|
||||
Report all errors, even if it is on the same line as a ``# NOQA`` comment.
|
||||
``# NOQA`` can be used to silence messages on specific lines. Sometimes,
|
||||
users will want to see what errors are being silenced without editing the
|
||||
file. This option allows you to see all the warnings, errors, etc.
|
||||
reported.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --disable-noqa dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
disable_noqa = True
|
||||
disable-noqa = True
|
||||
|
||||
|
||||
.. option:: --show-source
|
||||
|
||||
Print the source code generating the error/warning in question.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --show-source dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
show_source = True
|
||||
show-source = True
|
||||
|
||||
|
||||
.. option:: --statistics
|
||||
|
||||
Count the number of occurrences of each error/warning code and
|
||||
print a report.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --statistics
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
statistics = True
|
||||
|
||||
|
||||
.. option:: --enable-extensions=<errors>
|
||||
|
||||
Enable off-by-default extensions.
|
||||
|
||||
Plugins to |Flake8| have the option of registering themselves as
|
||||
off-by-default. These plugins effectively add themselves to the
|
||||
default ignore list.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --enable-extensions=H111 dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
enable-extensions =
|
||||
H111,
|
||||
G123
|
||||
enable_extensions =
|
||||
H111,
|
||||
G123
|
||||
|
||||
|
||||
.. option:: --exit-zero
|
||||
|
||||
Force |Flake8| to use the exit status code 0 even if there are errors.
|
||||
|
||||
By default |Flake8| will exit with a non-zero integer if there are errors.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --exit-zero dir/
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --install-hook=VERSION_CONTROL_SYSTEM
|
||||
|
||||
Install a hook for your version control system that is executed before
|
||||
or during commit.
|
||||
|
||||
The available options are:
|
||||
|
||||
- git
|
||||
- mercurial
|
||||
|
||||
Command-line usage:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --install-hook=git
|
||||
flake8 --install-hook=mercurial
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --jobs=<n>
|
||||
|
||||
Specify the number of subprocesses that |Flake8| will use to run checks in
|
||||
parallel.
|
||||
|
||||
.. note::
|
||||
|
||||
This option is ignored on Windows because :mod:`multiprocessing` does
|
||||
not support Windows across all supported versions of Python.
|
||||
|
||||
This defaults to: ``auto``
|
||||
|
||||
The default behaviour will use the number of CPUs on your machine as
|
||||
reported by :func:`multiprocessing.cpu_count`.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --jobs=8 dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
jobs = 8
|
||||
|
||||
|
||||
.. option:: --output-file=<path>
|
||||
|
||||
Redirect all output to the specified file.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --output-file=output.txt dir/
|
||||
flake8 -vv --output-file=output.txt dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
output-file = output.txt
|
||||
output_file = output.txt
|
||||
|
||||
|
||||
.. option:: --append-config=<config>
|
||||
|
||||
Provide extra config files to parse in after and in addition to the files
|
||||
that |Flake8| found on its own. Since these files are the last ones read
|
||||
into the Configuration Parser, so it has the highest precedence if it
|
||||
provides an option specified in another config file.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --append-config=my-extra-config.ini dir/
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --config=<config>
|
||||
|
||||
Provide a path to a config file that will be the only config file read and
|
||||
used. This will cause |Flake8| to ignore all other config files that
|
||||
exist.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --config=my-only-config.ini dir/
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --isolated
|
||||
|
||||
Ignore any config files and use |Flake8| as if there were no config files
|
||||
found.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --isolated dir/
|
||||
|
||||
This **can not** be specified in config files.
|
||||
|
||||
|
||||
.. option:: --builtins=<builtins>
|
||||
|
||||
Provide a custom list of builtin functions, objects, names, etc.
|
||||
|
||||
This allows you to let pyflakes know about builtins that it may
|
||||
not immediately recognize so it does not report warnings for using
|
||||
an undefined name.
|
||||
|
||||
This is registered by the default PyFlakes plugin.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --builtins=_,_LE,_LW dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
builtins =
|
||||
_,
|
||||
_LE,
|
||||
_LW
|
||||
|
||||
|
||||
.. option:: --doctests
|
||||
|
||||
Enable PyFlakes syntax checking of doctests in docstrings.
|
||||
|
||||
This is registered by the default PyFlakes plugin.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --doctests dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
doctests = True
|
||||
|
||||
|
||||
.. option:: --include-in-doctest=<paths>
|
||||
|
||||
Specify which files are checked by PyFlakes for doctest syntax.
|
||||
|
||||
This is registered by the default PyFlakes plugin.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --include-in-doctest=dir/subdir/file.py,dir/other/file.py dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
include-in-doctest =
|
||||
dir/subdir/file.py,
|
||||
dir/other/file.py
|
||||
include_in_doctest =
|
||||
dir/subdir/file.py,
|
||||
dir/other/file.py
|
||||
|
||||
|
||||
.. option:: --exclude-from-doctest=<paths>
|
||||
|
||||
Specify which files are not to be checked by PyFlakes for doctest syntax.
|
||||
|
||||
This is registered by the default PyFlakes plugin.
|
||||
|
||||
Command-line example:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --exclude-in-doctest=dir/subdir/file.py,dir/other/file.py dir/
|
||||
|
||||
This **can** be specified in config files.
|
||||
|
||||
Example config file usage:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
exclude-in-doctest =
|
||||
dir/subdir/file.py,
|
||||
dir/other/file.py
|
||||
exclude_in_doctest =
|
||||
dir/subdir/file.py,
|
||||
dir/other/file.py
|
||||
|
||||
|
||||
.. option:: --benchmark
|
||||
|
||||
Collect and print benchmarks for this run of |Flake8|. This aggregates the
|
||||
total number of:
|
||||
|
||||
- tokens
|
||||
- physical lines
|
||||
- logical lines
|
||||
- files
|
||||
|
||||
and the number of elapsed seconds.
|
||||
|
||||
Command-line usage:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --benchmark dir/
|
||||
|
||||
This **can not** be specified in config files.
|
||||
11
docs/source/user/python-api.rst
Normal file
11
docs/source/user/python-api.rst
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
===================
|
||||
Public Python API
|
||||
===================
|
||||
|
||||
|Flake8| 3.0.0 presently does not have a public, stable Python API.
|
||||
|
||||
When it does it will be located in :mod:`flake8.api` and that will
|
||||
be documented here.
|
||||
|
||||
.. automodule:: flake8.api
|
||||
:members:
|
||||
66
docs/source/user/using-plugins.rst
Normal file
66
docs/source/user/using-plugins.rst
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
==================================
|
||||
Using Plugins For Fun and Profit
|
||||
==================================
|
||||
|
||||
|Flake8| is useful on its own but a lot of |Flake8|'s popularity is due to
|
||||
its extensibility. Our community has developed :term:`plugin`\ s that augment
|
||||
|Flake8|'s behaviour. Most of these plugins are uploaded to PyPI_. The
|
||||
developers of these plugins often have some style they wish to enforce.
|
||||
|
||||
For example, `flake8-docstrings`_ adds a check for :pep:`257` style
|
||||
conformance. Others attempt to enforce consistency, like `flake8-future`_.
|
||||
|
||||
.. note::
|
||||
|
||||
The accuracy or reliability of these plugins may vary wildly from plugin
|
||||
to plugin and not all plugins are guaranteed to work with |Flake8| 3.0.
|
||||
|
||||
To install a third-party plugin, make sure that you know which version of
|
||||
Python (or pip) you used to install |Flake8|. You can then use the most
|
||||
appropriate of:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
pip install <plugin-name>
|
||||
pip3 install <plugin-name>
|
||||
python -m pip install <plugin-name>
|
||||
python2.7 -m pip install <plugin-name>
|
||||
python3 -m pip install <plugin-name>
|
||||
python3.4 -m pip install <plugin-name>
|
||||
python3.5 -m pip install <plugin-name>
|
||||
|
||||
To install the plugin, where ``<plugin-name>`` is the package name on PyPI_.
|
||||
To verify installation use:
|
||||
|
||||
.. prompt:: bash
|
||||
|
||||
flake8 --version
|
||||
python<version> -m flake8 --version
|
||||
|
||||
To see the plugin's name and version in the output.
|
||||
|
||||
.. seealso:: :ref:`How to Invoke Flake8 <invocation>`
|
||||
|
||||
After installation, most plugins immediately start reporting :term:`error`\ s.
|
||||
Check the plugin's documentation for which error codes it returns and if it
|
||||
disables any by default.
|
||||
|
||||
.. note::
|
||||
|
||||
You can use both :option:`flake8 --select` and :option:`flake8 --ignore`
|
||||
with plugins.
|
||||
|
||||
Some plugins register new options, so be sure to check :option:`flake8 --help`
|
||||
for new flags and documentation. These plugins may also allow these flags to
|
||||
be specified in your configuration file. Hopefully, the plugin authors have
|
||||
documented this for you.
|
||||
|
||||
.. seealso:: :ref:`Configuring Flake8 <configuration>`
|
||||
|
||||
|
||||
.. _PyPI:
|
||||
https://pypi.io/
|
||||
.. _flake8-docstrings:
|
||||
https://pypi.io/project/flake8-docstrings/
|
||||
.. _flake8-future:
|
||||
https://pypi.io/project/flake8-future/
|
||||
Loading…
Add table
Add a link
Reference in a new issue