A plugin for Flake8 that checks pandas code

Overview

pandas-vet

tests codecov Code style: black PyPI - License

PyPI PyPI - Status PyPI - Downloads

Conda Version Conda Downloads

pandas-vet is a plugin for flake8 that provides opinionated linting for pandas code.

It began as a project during the PyCascades 2019 sprints.

Motivation

Starting with pandas can be daunting. The usual internet help sites are littered with different ways to do the same thing and some features that the pandas docs themselves discourage live on in the API. pandas-vet is (hopefully) a way to help make pandas a little more friendly for newcomers by taking some opinionated stances about pandas best practices. It is designed to help users reduce the pandas universe.

The idea to create a linter was sparked by Ania Kapuścińska's talk at PyCascades 2019, "Lint your code responsibly!".

Many of the opinions stem from Ted Petrou's excellent Minimally Sufficient Pandas. Other ideas are drawn from pandas docs or elsewhere. The Pandas in Black and White flashcards have a lot of the same opinions too.

Installation

pandas-vet is a plugin for flake8. If you don't have flake8 already, it will install automatically when you install pandas-vet.

The plugin is on PyPI and can be installed with:

pip install pandas-vet

It can also be installed with conda:

conda install -c conda-forge pandas-vet

pandas-vet is tested under Python 3.6, 3.7, 3.8, and 3.9 as defined in our GitHub Actions

Usage

Once installed successfully in an environment that also has flake8 installed, pandas-vet should run whenever flake8 is run.

$ flake8 ...

See the flake8 docs for more information.

For a full list of implemented warnings, see the list below.

Contributing

pandas-vet is still in the very early stages. Contributions are welcome from the community on code, tests, docs, and just about anything else.

Code of Conduct

Because this project started during the PyCascades 2019 sprints, we adopt the PyCascades minimal expectation that we "Be excellent to each another". Beyond that, we follow the Python Software Foundation's Community Code of Conduct.

Steps to contributing

  1. Please submit an issue (or draft PR) first describing the types of changes you'd like to implement.

  2. Fork the repo and create a new branch for your enhancement/fix.

  3. Get a development environment set up with your favorite environment manager (conda, virtualenv, etc.).

    1. You must use at least python 3.6 to develop, for black support.

    2. You can create one from pip install -r requirements_dev.txt or, if you use Docker, you can build an image from the Dockerfile included in this repo.

    3. Once your enviroment is set up you will need to install pandas-vet in development mode. Use pip install -e . (use this if you are alreay in your virtual enviroment) or pip install -e <path> (use this one if not in the virtual enviroment and prefer to state explicitly where it is going).

  4. Write code, docs, etc.

  5. We use pytest, flake8, and black to validate our codebase. TravisCI integration will complain on pull requests if there are any failing tests or lint violations. To check these locally, run the following commands:

pytest --cov="pandas_vet"
flake8 pandas_vet setup.py tests --exclude tests/data
black --check pandas_vet setup.py tests --exclude tests/data
  1. Push to your forked repo.

  2. Submit pull request to the parent repo from your branch. Be sure to write a clear message and reference the Issue # that relates to your pull request.

  3. Feel good about giving back to open source projects.

How to add a check to the linter

  1. Write tests. At a minimum, you should have test cases where the linter should catch "bad" pandas and test cases where the linter should allow "good" pandas.

  2. Write your check function in /pandas-vet/__init__.py.

  3. Run flake8 and pytest on the linter itself (see Steps to contributing)

Contributors

PyCascades 2019 sprints team

PyCascades 2020 sprints team

Other awesome contributors

  • Earl Clark
  • Leandro Leites

List of warnings

PD001: pandas should always be imported as 'import pandas as pd'

PD002: 'inplace = True' should be avoided; it has inconsistent behavior

PD003: '.isna' is preferred to '.isnull'; functionality is equivalent

PD004: '.notna' is preferred to '.notnull'; functionality is equivalent

PD005: Use arithmetic operator instead of method

PD006: Use comparison operator instead of method

PD007: '.ix' is deprecated; use more explicit '.loc' or '.iloc'

PD008: Use '.loc' instead of '.at'. If speed is important, use numpy.

PD009: Use '.iloc' instead of '.iat'. If speed is important, use numpy.

PD010 '.pivot_table' is preferred to '.pivot' or '.unstack'; provides same functionality

PD011 Use '.array' or '.to_array()' instead of '.values'; 'values' is ambiguous

PDO12 '.read_csv' is preferred to '.read_table'; provides same functionality

PD013 '.melt' is preferred to '.stack'; provides same functionality

PD015 Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

Very Opinionated Warnings

These warnings are turned off by default. To enable them, add the -annoy flag to your command, e.g.,

$ flake8 --annoy my_file.py

PD901 'df' is a bad variable name. Be kinder to your future self.

Issues
  • PD007, PD008, PD009 should not use node.value.attr

    PD007, PD008, PD009 should not use node.value.attr

    When flake8 runs check_for_ix, check_for_at, or check_for_iat, it raises AttributeError: 'Name' object has no attribute 'attr'

    This seems to indicate that node.value returns a 'Name' object and that node.value.attr should be changed. Not sure if we can follow the pattern for check_for_isnull, etc. because it .ix[], .at[].

    bug 
    opened by deppen8 6
  • Conda and pip install (0.2.2) not showing plugins with flake8 --version; 0.2.1 works

    Conda and pip install (0.2.2) not showing plugins with flake8 --version; 0.2.1 works

    Installing pandas-vet with pip or conda on Windows or WSL results in flake8 --version returning

    3.7.9 () CPython 3.7.3 on Windows
    3.7.9 () CPython 3.8.2 on Linux
    

    Expected behavior

    1. Make a new env
    2. pip install flake8 pandas-vet==0.2.2
    flake8 --version
    3.7.9 (flake8-pandas-vet: 0.2.1, mccabe: 0.6.1, pycodestyle: 2.5.0, pyflakes: 2.1.1) CPython 3.7.3 on Windows
    

    To Reproduce Steps to reproduce the behavior:

    1. Make a new env
    2. pip install flake8 pandas-vet or pip install flake8 pandas-vet==0.2.2
    3. flake8 --version
    4. See error

    Desktop Environment:

    • OS: Microsoft Windows [Version 10.0.18363.720]
    • Python versions tested: 3.7.3, 3.8.2
    • pandas-vet version: 0.2.2

    Additional Context Running flake8 -v --version results in:

    flake8.plugins.manager    MainProcess     65 INFO     Loading entry-points for "flake8.extension".
    flake8.plugins.manager    MainProcess     73 INFO     Loading entry-points for "flake8.report".
    flake8.plugins.manager    MainProcess     80 INFO     Loading plugin "F" from entry-point.
    flake8.plugins.manager    MainProcess    118 INFO     Loading plugin "pycodestyle.ambiguous_identifier" from entry-point
    .
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.bare_except" from entry-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.blank_lines" from entry-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.break_after_binary_operator" from entr
    y-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.break_before_binary_operator" from ent
    ry-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.comparison_negative" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.comparison_to_singleton" from entry-po
    int.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.comparison_type" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.compound_statements" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.continued_indentation" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.explicit_line_join" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.extraneous_whitespace" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.imports_on_separate_lines" from entry-
    point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.indentation" from entry-point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.maximum_doc_length" from entry-point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.maximum_line_length" from entry-point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.missing_whitespace" from entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.missing_whitespace_after_import_keywor
    d" from entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.missing_whitespace_around_operator" fr
    om entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.module_imports_on_top_of_file" from en
    try-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.python_3000_async_await_keywords" from
     entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.python_3000_backticks" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_has_key" from entry-point.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_invalid_escape_sequence" f
    rom entry-point.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_not_equal" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_raise_comma" from entry-po
    int.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.tabs_obsolete" from entry-point.
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.tabs_or_spaces" from entry-point.
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.trailing_blank_lines" from entry-point
    .
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.trailing_whitespace" from entry-point.
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.whitespace_around_comma" from entry-po
    int.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_around_keywords" from entry
    -point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_around_named_parameter_equa
    ls" from entry-point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_around_operator" from entry
    -point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_before_comment" from entry-
    point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_before_parameters" from ent
    ry-point.
    flake8.plugins.manager    MainProcess    130 INFO     Loading plugin "C90" from entry-point.
    flake8.plugins.manager    MainProcess    131 INFO     Loading plugin "PD" from entry-point.
    flake8.plugins.manager    MainProcess    147 INFO     Loading plugin "default" from entry-point.
    flake8.plugins.manager    MainProcess    151 INFO     Loading plugin "pylint" from entry-point.
    flake8.plugins.manager    MainProcess    151 INFO     Loading plugin "quiet-filename" from entry-point.
    flake8.plugins.manager    MainProcess    151 INFO     Loading plugin "quiet-nothing" from entry-point.
    
    opened by jeffchiou 4
  • Create pull-request template

    Create pull-request template

    In order to facilitate the maintenance of the change log, it will be good if we ask PRs to be structured like updates to the change log. This is part of my ongoing effort to make project management and community contributions as straightforward as possible.

    docs 
    opened by deppen8 4
  • Write AST explorer tool to facilitate creation of new 'check' functions.

    Write AST explorer tool to facilitate creation of new 'check' functions.

    Developing the check functions for each linter errors requires exploration of the AST nodes to determine the corresponding attributes to be compared against the valid code patterns. This presents a barrier to quickly implementing new linter checks that could be reduced if there were a tool that returns the appropriate AST node attributes for a specified pattern.

    The envisioned solution might utilize the following form:

    attributes = ast_explore(code_signature)
    

    where code_signature is a string representing the code pattern of interest, and attributes is a string (or list of strings) representing the composed attributes for the corresponding AST node. This string could then be appended to the AST node in the check functions:

    if node.<attribute_string> == <test_condition>:
    

    or

    for attribute in node.<attribute_string>:
    
    enhancement 
    opened by simchuck 4
  • Check for pd.merge

    Check for pd.merge

    Check for use of pd.merge function. Preferred is .merge method. Even pandas docs use .merge for the documentation of pd.merge! See flashcard.

    Give error message:

    Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

    new check 
    opened by deppen8 4
  • fix(PD011): avoid false positives for dict.values()

    fix(PD011): avoid false positives for dict.values()

    fixes https://github.com/deppen8/pandas-vet/issues/106

    The implementation consists of two steps:

    1. We have to keep a reference of the Call node before visiting children
    2. When visiting an Attribute, add some checks to make sure we raise only if we did not come from a .values() (Call)
    opened by pwoolvett 3
  • Challenging PD008: .at can be useful

    Challenging PD008: .at can be useful

    Is there a good reason to prefer .loc over .at when you need to get a single value?

    We use .at over .loc in our codebase when we want to signal to other developers that we intend to get a single value, as opposed to a Series or DataFrame.

    The warning seems to assume the developer picked .at for speed, while their intention is more likely to have picked it for correctness and clarity.

    opened by lsorber 3
  • Edit wiki with info for exploring the AST.

    Edit wiki with info for exploring the AST.

    There doesn't seem to be any way to contribute to the wiki, but I thought it would be useful to include my comments from Issue #33 for exploring the AST during development.

    I don't know how the page references and linking work within the markdown documents. I created a separate markdown file, and tried to link to this from the wiki home page.

    opened by simchuck 3
  • fix check_for_ix, check_for_at, check_for_iat checks

    fix check_for_ix, check_for_at, check_for_iat checks

    These functions now check the type of node.value. node.value can be either a Name or Attribute, which do not have matching attributes. Before you can check whether it matches the desired pattern (i.e., ix, at, iat), you need to figure out if you are working with a Name or Attribute.

    If node.value is ast.Name, use node.value.id.

    If node.value is ast.Attribute, use node.value.attr.

    Closes #44

    opened by deppen8 3
  • Implement check for use of arithmetic and comparison methods.

    Implement check for use of arithmetic and comparison methods.

    Preferred use of binary operators is recommended.

    I used loops in both the check and test functions to minimize repetition of the code, so there are not individual test results for each operator or method.

    I expect some trivial merge conflicts compared to the 'array' pull request, since code in this PR does not include the added docstrings from that previous PR.

    Closes #6

    opened by simchuck 3
  • Check for .pivot and .unstack

    Check for .pivot and .unstack

    Check for .pivot and .unstack methods. See flashcard. Give error message:

    '.pivot' and '.unstack' functionality can be achieved with just '.pivot_table'

    new check 
    opened by deppen8 3
  • PD011 - shoud be to_numpy() instead of to_array()?

    PD011 - shoud be to_numpy() instead of to_array()?

    Describe the bug for PD011 should the suggestion instead be to_numpy() instead of to_array() (given suggestion in warnings of https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.values.html)? Perhaps I am wrong on this but just wanted to bring up or least get clarification on potential difference

    opened by ksdaftari 0
  • inplace set to a variable raises exception

    inplace set to a variable raises exception

    Describe the bug raised exception

    To Reproduce Steps to reproduce the behavior:

    Have the following code in a file

    def some_function(dataFrame, in_place=False):
        return dataFrame.drop([], inplace=in_place)
    

    Expected behavior Allow flake8 to report violations and not throw exceptions.

    Screenshots Screen Shot 2021-09-11 at 11 42 54 AM

    Additional context

    bash-5.1# cat /usr/lib/python3.9/site-packages/pandas_vet/version.py 
    __version__ = "0.2.2"
    

    This is running on a docker container based on alpine:3.14.1. Same results obtained on a mac.

    Things work if we do not provide a variable:

    def some_function(dataFrame, in_place=False):
        return dataFrame.drop([], inplace=False)
    
    opened by manuel-lopez-lyb 0
  • New approach to docs with JupyterBook

    New approach to docs with JupyterBook

    I have recently started adopting JupyterBook for documenting projects and I love it. It is great for adding the things that I would like to add to pandas-vet like tutorials and mixing Markdown and reST Sphinx docs.

    It also has nice pre-defined GitHub Actions for building the docs and putting them in a branch for GitHub Pages.

    This would replace issue #70 and #87

    enhancement good first issue docs ci/cd 
    opened by deppen8 0
  • Automate releases to PyPI and conda-forge

    Automate releases to PyPI and conda-forge

    pandas-vet is available from PyPI (https://pypi.org/project/pandas-vet/) and conda-forge (https://github.com/conda-forge/pandas-vet-feedstock). I would love to automate the process that uploads a pandas-vet release to both of these places.

    This will help avoid embarrassing situations like #78

    • [ ] Automate PyPI releases
    • [ ] Automate conda-forge releases
    help wanted good first issue ci/cd 
    opened by deppen8 0
  • Add notes about disabling checks to README

    Add notes about disabling checks to README

    We should document both the general disabling/ignoring of checks as well as the per-line disabling provided by flake8 (#no-qa)

    This is a spin-off from #81

    enhancement good first issue docs 
    opened by deppen8 0
  • Add check for python functions that should be pandas methods

    Add check for python functions that should be pandas methods

    This feature request is one of the topics on Minimally Sufficient Pandas namely:

    • Builtin Python functions vs Pandas methods with the same name

    https://deppen8.github.io/pandas-bw/general/Python-funcs-vs-pandas.png

    In order to implement will need to be able to validate type, e.g. the argument inside sum, min, max, abs is a data frame.

    opened by jvano74 0
Releases(v0.2.3)
  • v0.2.3(Feb 9, 2022)

  • v0.2.1(Jul 29, 2019)

    This version contains a few small fixes. Most notably, it fixes a bug with the PD015 check.

    How to get it?

    From PyPI:

    pip install pandas-vet
    

    From conda-forge:

    conda install -c conda-forge pandas-vet
    

    [0.2.1] - 2019-07-27

    Added

    • Leandro Leites added as contributor (#66)

    Removed

    • Unnecessary commented line from setup.py (#67)

    Fixed

    • PD015 would fail if node.func.value did not have an id. Fixed with #65
    • version.py now correctly uses v0.2.x. This version file was not bumped with the last release. (#67)
    Source code(tar.gz)
    Source code(zip)
    pandas-vet-0.2.1.tar.gz(6.27 KB)
    pandas_vet-0.2.1-py3-none-any.whl(7.42 KB)
  • v0.2.0(Apr 2, 2019)

    How to get it?

    Available on PyPI at https://pypi.org/project/pandas-vet/0.2.0/

    pip install pandas-vet
    

    New warnings in v0.2.0

    PD010 '.pivot_table' is preferred to '.pivot' or '.unstack'; provides same functionality

    PD011 Use '.array' or '.to_array()' instead of '.values'; 'values' is ambiguous

    PDO12 '.read_csv' is preferred to '.read_table'; provides same functionality

    PD013 '.melt' is preferred to '.stack'; provides same functionality

    PD015 Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

    Full list of implemented warnings

    PD001: pandas should always be imported as 'import pandas as pd'

    PD002: 'inplace = True' should be avoided; it has inconsistent behavior

    PD003: '.isna' is preferred to '.isnull'; functionality is equivalent

    PD004: '.notna' is preferred to '.notnull'; functionality is equivalent

    PD005: Use arithmetic operator instead of method

    PD006: Use comparison operator instead of method

    PD007: '.ix' is deprecated; use more explicit '.loc' or '.iloc'

    PD008: Use '.loc' instead of '.at'. If speed is important, use numpy.

    PD009: Use '.iloc' instead of '.iat'. If speed is important, use numpy.

    PD010 '.pivot_table' is preferred to '.pivot' or '.unstack'; provides same functionality

    PD011 Use '.array' or '.to_array()' instead of '.values'; 'values' is ambiguous

    PDO12 '.read_csv' is preferred to '.read_table'; provides same functionality

    PD013 '.melt' is preferred to '.stack'; provides same functionality

    PD015 Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

    Source code(tar.gz)
    Source code(zip)
    pandas-vet-0.2.0.tar.gz(5.92 KB)
    pandas_vet-0.2.0-py3-none-any.whl(7.06 KB)
  • v0.1.0(Feb 27, 2019)

    How to get it?

    Available on PyPI at https://pypi.org/project/pandas-vet/0.1.0/

    List of implemented warnings

    PD001: pandas should always be imported as 'import pandas as pd'

    PD002: 'inplace = True' should be avoided; it has inconsistent behavior

    PD003: '.isna' is preferred to '.isnull'; functionality is equivalent

    PD004: '.notna' is preferred to '.notnull'; functionality is equivalent

    PD005: Use arithmetic operator instead of method

    PD006: Use comparison operator instead of method

    PD007: '.ix' is deprecated; use more explicit '.loc' or '.iloc'

    PD008: Use '.loc' instead of '.at'. If speed is important, use numpy.

    PD009: Use '.iloc' instead of '.iat'. If speed is important, use numpy.

    Source code(tar.gz)
    Source code(zip)
Owner
Jacob Deppen
Archaeologist, Data Scientist, Sports fan
Jacob Deppen
Flake8 plugin to find commented out or dead code

flake8-eradicate flake8 plugin to find commented out (or so called "dead") code. This is quite important for the project in a long run. Based on eradi

wemake.services 237 Apr 13, 2022
A plugin for Flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle.

flake8-bugbear A plugin for Flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycode

Python Code Quality Authority 713 Apr 14, 2022
❄️ A flake8 plugin to help you write better list/set/dict comprehensions.

flake8-comprehensions A flake8 plugin that helps you write better list/set/dict comprehensions. Requirements Python 3.6 to 3.9 supported. Installation

Adam Johnson 346 Apr 16, 2022
flake8 plugin that integrates isort

Flake8 meet isort Use isort to check if the imports on your python files are sorted the way you expect. Add an .isort.cfg to define how you want your

Gil Forcada Codinachs 124 Mar 25, 2022
flake8 plugin to run black for checking Python coding style

flake8-black Introduction This is an MIT licensed flake8 plugin for validating Python code style with the command line code formatting tool black. It

Peter Cock 120 Apr 12, 2022
A plugin for flake8 integrating Mypy.

flake8-mypy NOTE: THIS PROJECT IS DEAD It was created in early 2017 when Mypy performance was often insufficient for in-editor linting. The Flake8 plu

Łukasz Langa 102 Jan 29, 2022
flake8 plugin to catch useless `assert` statements

flake8-useless-assert flake8 plugin to catch useless assert statements Download or install on the PyPI page Violations Code Description Example ULA001

null 1 Feb 12, 2022
Utilities for pycharm code formatting (flake8 and black)

Pycharm External Tools Extentions to Pycharm code formatting tools. Currently supported are flake8 and black on a selected code block. Usage Flake8 [P

Haim Daniel 8 Apr 12, 2022
The official GitHub mirror of https://gitlab.com/pycqa/flake8

Flake8 Flake8 is a wrapper around these tools: PyFlakes pycodestyle Ned Batchelder's McCabe script Flake8 runs all the tools by launching the single f

Python Code Quality Authority 2k Apr 17, 2022
Flake8 extension for checking quotes in python

Flake8 Extension to lint for quotes. Major update in 2.0.0 We automatically encourage avoiding escaping quotes as per PEP 8. To disable this, use --no

Zachary Heller 136 Mar 25, 2022
Flake8 wrapper to make it nice, legacy-friendly, configurable.

THE PROJECT IS ARCHIVED Forks: https://github.com/orsinium/forks It's a Flake8 wrapper to make it cool. Lint md, rst, ipynb, and more. Shareable and r

Life4 226 Apr 2, 2022
Automated security testing using bandit and flake8.

flake8-bandit Automated security testing built right into your workflow! You already use flake8 to lint all your code for errors, ensure docstrings ar

Tyler Wince 78 Apr 8, 2022
Flake8 extension for enforcing trailing commas in python

Flake8 Extension to enforce better comma placement. Usage If you are using flake8 it's as easy as: pip install flake8-commas Now you can avoid those a

Python Code Quality Authority 127 Apr 8, 2022
Tool to automatically fix some issues reported by flake8 (forked from autoflake).

autoflake8 Introduction autoflake8 removes unused imports and unused variables from Python code. It makes use of pyflakes to do this. autoflake8 also

francisco souza 15 Apr 12, 2022
Flake8 extension to provide force-check option

flake8-force Flake8 extension to provide force-check option. When this option is enabled, flake8 performs all checks even if the target file cannot be

Kenichi Maehashi 3 Feb 15, 2022
OpenStack Hacking Style Checks. Mirror of code maintained at opendev.org.

Introduction hacking is a set of flake8 plugins that test and enforce the OpenStack StyleGuide Hacking pins its dependencies, as a new release of some

Mirrors of opendev.org/openstack 222 Mar 2, 2022
A simple program which checks Python source files for errors

Pyflakes A simple program which checks Python source files for errors. Pyflakes analyzes programs and detects various errors. It works by parsing the

Python Code Quality Authority 1.1k Apr 11, 2022
A python documentation linter which checks that the docstring description matches the definition.

Darglint A functional docstring linter which checks whether a docstring's description matches the actual function/method implementation. Darglint expe

Terrence Reilly 404 Apr 10, 2022
Mypy stubs, i.e., type information, for numpy, pandas and matplotlib

Mypy type stubs for NumPy, pandas, and Matplotlib This is a PEP-561-compliant stub-only package which provides type information for matplotlib, numpy

Predictive Analytics Lab 190 Mar 17, 2022