Giter Club home page Giter Club logo

pyquotes's Introduction

pyquotes Tests

Single quotes are superior. And if you disagree, there's an option for this as well.

In any case, quotes should be consistent throughout the codebase, and not rely on tools like black that reformat everything. Of course using those tools is perfectly fine if you want this behavior, but sometimes you just want to avoid discussing the quote style during PR reviews).

Installation

Install pyquotes using pip:

$ pip install pyquotes

Usage

$ pyquotes --help
Usage: pyquotes [OPTIONS] FILES...

  A tool that ensures consistent string quotes in your Python code.

  When passing a directory, all *.py files inside will be processed
  recursively.

  If any files needed changes, it exits with a non-zero status code.

Options:
  -V, --version                 Show the version and exit.
  -h, --help                    Show this message and exit.
  -D, --double-quotes           Prefer double quotes.
  -q, --quiet                   Do not output which files have been
                                reformatted.

  -v, --verbose                 Be more verbose and show all files being
                                processed.

  -d, --diff                    Only show diffs without updating files.
  -c, --check-only, --check     Only check files without updating them.
  --exclude PATTERN             Exclude files/directories matching this
                                pattern. Can be used multiple times. Replaces
                                the built-in excludes. Does not apply to
                                explicitly-specified files.

  -X, --extend-exclude PATTERN  Exclude files/directories matching this
                                pattern. Can be used multiple times. Extends
                                the built-in excludes. Does not apply to
                                explicitly-specified files.

Use --diff or --check-only if you want to run this script in CI (usually using flake8-quotes as explained below is the better choice though).

Configuration

exclude, extend-exclude and double-quotes can be configured via the following files (looked up in this order, the first one containing settings is used):

  • .pyquotes.cfg - ConfigParser format, settings or pyquotes section
  • setup.cfg - ConfigParser format, pyquotes or tool:pyquotes section
  • pyproject.toml - TOML format, tool.pyquotes section

Parsing pyproject.toml requires toml to be installed; a warning is emitted if the file exists and no config is found elsewhere and toml is missing.

Note that exclude should not be used in most cases; unless you really need to whitelist something that's excluded by default.

setup.cfg

[pyquotes]
double-quotes = false
extend-exclude =
    htmlcov
    .vscode

The same format can be used in .pyquotes.cfg as well.

pyproject.toml

[tool.pyquotes]
double-quotes = false
extend-exclude = ['htmlcov', '.vscode']

flake8

If you use flake8, you may want to install flake8-quotes to also get warnings if the code currently has incorrect quotes. You can use the following options if you want single quotes:

[flake8]
inline-quotes = single
multiline-quotes = single
docstring-quotes = double
avoid-escape = true

Note that flake8-quotes is completely independent from this tool, so inconsistencies are possible. Please open an issue if you discover any such cases.

pyquotes's People

Contributors

thiefmaster avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

pyquotes's Issues

Parsing error

OS: Windows 10 21H2
Python: Python 3.10.4

Steps:

  • pip install pyquotes

example.py

'''
Example File
'''

A = "This is a test string."
B = 'This is a test string.'
C = "This isn't a test string, or is it?"
D = f"{A}{B}{C}"
E = f'{A}{B}{C}'
  • pyquotes example.py
  • pyquotes --check example.py
  • pyquotes -D example.py
  • pyquotes -D --check example.py

All fail with the error

  File "C:\Python310\lib\site-packages\parso\python\tree.py", line 86, in get_doc_node
    c = simple_stmt.parent.children
AttributeError: 'NoneType' object has no attribute 'children'

If a print('Hello, World!') is added to the file, it behaves as expected.

Thank you for your time, this library has saved my many hours.

Encoding issue

OS: Windows 10 21H2
Python: Python 3.10.4

Steps:

  • pip install pyquotes

example.py (file is saved as UTF-8 with/without a BOM)

print('こんにちは世界')
  • pyquotes example.py
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 11: character maps to <undefined>

If read_text() and write_text() are replaced with read_bytes() and write_bytes() equivalents, the quote processing is fixed (not tested on Linux). Although, additional new lines are erroneously added, I haven't had a chance to look into why.

Thank you for your time, this library has saved my many hours.

click dependency not bounded

OS: Windows 10 21H2
Python: Python 3.10.4

Steps:

  • pip install "click<7"
  • pip install pyquotes

example.py

print("Hello, World!")

pyquotes --check example.py
pyquotes -D --check example.py

Both fail with the error

  File "C:\Python310\lib\site-packages\pyquotes\settings.py", line 96, in __init__
    super().__init__(**settings, project_root=project_root)
TypeError: _Config.__init__() got an unexpected keyword argument 'check'

This is resolved when using click>=8.

Thank you for your time, this library has saved my many hours.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.