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.

Comments
  • 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
  • Improve contributor experience

    Improve contributor experience

    Is your feature request related to a problem? Please describe. I really like this project, and I want to contribute, but there are some roadblocks in the way. Getting the project setup on my local machine had some issues:

    • Python 3.10 not supported. That is my default python, so it would be helpful if it was supported
    • Outdated dependencies. pytest and black are both pinned to old version that have issues. I suggest moving to poetry for dependecy handling instead
    • manual style checks. I'd much rather have a predefined pre-commit check to run black, flake8, pytest etc, instead of finding the exact commands in the readme before committing.

    This is not meant to be one big complaint. This project is really useful to me, so thanks for building it.

    opened by KPLauritzen 0
  • Change recommendation from .array/.to_array() to .to_numpy()

    Change recommendation from .array/.to_array() to .to_numpy()

    Please complete this template for all pull requests to pandas-vet. It will help us to review the PR faster. Also, this format is based on Keep a Changelog and will help keep the change log accurate and up-to-date.

    Related issues

    • #113

    This PR does the following:

    Added

    • None

    Changed

    • Change PD011 recommendation from .array and .to_array() to .to_numpy()

    Deprecated

    • None

    Removed

    • None

    Fixed

    • None

    Security

    • None

    Closes #113

    opened by KPLauritzen 0
  • 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
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
Code audit tool for python.

Pylama Code audit tool for Python and JavaScript. Pylama wraps these tools: pycodestyle (formerly pep8) © 2012-2013, Florent Xicluna; pydocstyle (form

Kirill Klenov 967 Jan 07, 2023
Collection of awesome Python types, stubs, plugins, and tools to work with them.

Awesome Python Typing Collection of awesome Python types, stubs, plugins, and tools to work with them. Contents Static type checkers Dynamic type chec

TypedDjango 1.2k Jan 04, 2023
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 27 Sep 08, 2022
mypy plugin for loguru

loguru-mypy A fancy plugin to boost up your logging with loguru mypy compatibility logoru-mypy should be compatible with mypy=0.770. Currently there

Tomasz Trębski 13 Nov 02, 2022
Easy saving and switching between multiple KDE configurations.

Konfsave Konfsave is a config manager. That is, it allows you to save, back up, and easily switch between different (per-user) system configurations.

42 Sep 25, 2022
Tool for pinpointing circular imports in Python. Find cyclic imports in any project

Pycycle: Find and fix circular imports in python projects Pycycle is an experimental project that aims to help python developers fix their circular de

Vadim Kravcenko 311 Dec 15, 2022
Pylint plugin for improving code analysis for when using Django

pylint-django About pylint-django is a Pylint plugin for improving code analysis when analysing code using Django. It is also used by the Prospector t

Python Code Quality Authority 544 Jan 06, 2023
Reference implementation of sentinels for the Python stdlib

Sentinels This is a reference implementation of a utility for the definition of sentinel values in Python. This also includes a draft PEP for the incl

Tal Einat 22 Aug 27, 2022
An enhanced version of the Python typing library.

typingplus An enhanced version of the Python typing library that always uses the latest version of typing available, regardless of which version of Py

Contains 6 Mar 26, 2021
docstring style checker

pydocstyle - docstring style checker pydocstyle is a static analysis tool for checking compliance with Python docstring conventions. pydocstyle suppor

Python Code Quality Authority 982 Jan 03, 2023
Pyright extension for coc.nvim

coc-pyright Pyright extension for coc.nvim Install :CocInstall coc-pyright Note: Pyright may not work as expected if can't detect project root correct

Heyward Fann 1.1k Jan 02, 2023
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 224 Jan 05, 2023
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 9 Oct 29, 2022
:sparkles: Surface lint errors during code review

✨ Linty Fresh ✨ Keep your codebase sparkly clean with the power of LINT! Linty Fresh parses lint errors and report them back to GitHub as comments on

Lyft 183 Dec 18, 2022
Flashcards - A flash card application with 2 optional command line arguments

Flashcards A flash card application with 2 optional command line arguments impor

Özgür Yildirim 2 Jul 15, 2022
A plugin for Flake8 that provides specializations for type hinting stub files

flake8-pyi A plugin for Flake8 that provides specializations for type hinting stub files, especially interesting for linting typeshed. Functionality A

Łukasz Langa 58 Jan 04, 2023
Flake8 Type Annotation Checking

flake8-annotations flake8-annotations is a plugin for Flake8 that detects the absence of PEP 3107-style function annotations and PEP 484-style type co

S. Co1 118 Jan 05, 2023
A static-analysis bot for Github

Imhotep, the peaceful builder. What is it? Imhotep is a tool which will comment on commits coming into your repository and check for syntactic errors

Justin Abrahms 221 Nov 10, 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.2k Dec 30, 2022
PEP-484 typing stubs for SQLAlchemy 1.4 and SQLAlchemy 2.0

SQLAlchemy 2 Stubs These are PEP-484 typing stubs for SQLAlchemy 1.4 and 2.0. They are released concurrently along with a Mypy extension which is desi

SQLAlchemy 139 Dec 30, 2022