mirror of
https://github.com/pre-commit/pre-commit-hooks.git
synced 2026-04-06 03:56:54 +00:00
Merge remote-tracking branch 'upstream/master' into mixed-line-ending
This commit is contained in:
commit
55658c4bbc
47 changed files with 923 additions and 302 deletions
|
|
@ -10,6 +10,8 @@ omit =
|
||||||
get-git-lfs.py
|
get-git-lfs.py
|
||||||
|
|
||||||
[report]
|
[report]
|
||||||
|
show_missing = True
|
||||||
|
skip_covered = True
|
||||||
exclude_lines =
|
exclude_lines =
|
||||||
# Have to re-enable the standard pragma
|
# Have to re-enable the standard pragma
|
||||||
\#\s*pragma: no cover
|
\#\s*pragma: no cover
|
||||||
|
|
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -2,7 +2,7 @@
|
||||||
*.iml
|
*.iml
|
||||||
*.py[co]
|
*.py[co]
|
||||||
.*.sw[a-z]
|
.*.sw[a-z]
|
||||||
.cache/
|
.cache
|
||||||
.coverage
|
.coverage
|
||||||
.idea
|
.idea
|
||||||
.project
|
.project
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
sha: v0.8.0
|
sha: v0.9.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
|
|
@ -13,16 +13,20 @@
|
||||||
- id: requirements-txt-fixer
|
- id: requirements-txt-fixer
|
||||||
- id: flake8
|
- id: flake8
|
||||||
- repo: https://github.com/pre-commit/pre-commit
|
- repo: https://github.com/pre-commit/pre-commit
|
||||||
sha: v0.12.2
|
sha: v0.15.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: validate_config
|
- id: validate_config
|
||||||
- id: validate_manifest
|
- id: validate_manifest
|
||||||
- repo: https://github.com/asottile/reorder_python_imports
|
- repo: https://github.com/asottile/reorder_python_imports
|
||||||
sha: v0.3.1
|
sha: v0.3.5
|
||||||
hooks:
|
hooks:
|
||||||
- id: reorder-python-imports
|
- id: reorder-python-imports
|
||||||
language_version: python2.7
|
language_version: python2.7
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
sha: v1.0.0
|
sha: v1.1.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: pyupgrade
|
||||||
|
- repo: https://github.com/asottile/add-trailing-comma
|
||||||
|
sha: v0.5.1
|
||||||
|
hooks:
|
||||||
|
- id: add-trailing-comma
|
||||||
|
|
|
||||||
|
|
@ -3,126 +3,194 @@
|
||||||
description: "Runs autopep8 over python source. If you configure additional arguments you'll want to at least include -i."
|
description: "Runs autopep8 over python source. If you configure additional arguments you'll want to at least include -i."
|
||||||
entry: autopep8-wrapper
|
entry: autopep8-wrapper
|
||||||
language: python
|
language: python
|
||||||
files: \.py$
|
types: [python]
|
||||||
args: [-i]
|
args: [-i]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
name: Check for added large files
|
name: Check for added large files
|
||||||
description: Prevent giant files from being committed
|
description: Prevent giant files from being committed
|
||||||
entry: check-added-large-files
|
entry: check-added-large-files
|
||||||
language: python
|
language: python
|
||||||
# Match all files
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-ast
|
- id: check-ast
|
||||||
name: Check python ast
|
name: Check python ast
|
||||||
description: Simply check whether the files parse as valid python.
|
description: Simply check whether the files parse as valid python.
|
||||||
entry: check-ast
|
entry: check-ast
|
||||||
language: python
|
language: python
|
||||||
files: '\.py$'
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-byte-order-marker
|
- id: check-byte-order-marker
|
||||||
name: Check for byte-order marker
|
name: Check for byte-order marker
|
||||||
description: Forbid files which have a UTF-8 byte-order marker
|
description: Forbid files which have a UTF-8 byte-order marker
|
||||||
entry: check-byte-order-marker
|
entry: check-byte-order-marker
|
||||||
language: python
|
language: python
|
||||||
files: '\.py$'
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-case-conflict
|
- id: check-case-conflict
|
||||||
name: Check for case conflicts
|
name: Check for case conflicts
|
||||||
description: Check for files that would conflict in case-insensitive filesystems
|
description: Check for files that would conflict in case-insensitive filesystems
|
||||||
entry: check-case-conflict
|
entry: check-case-conflict
|
||||||
language: python
|
language: python
|
||||||
# Match all files
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-docstring-first
|
- id: check-docstring-first
|
||||||
name: Check docstring is first
|
name: Check docstring is first
|
||||||
description: Checks a common error of defining a docstring after code.
|
description: Checks a common error of defining a docstring after code.
|
||||||
entry: check-docstring-first
|
entry: check-docstring-first
|
||||||
language: python
|
language: python
|
||||||
files: \.py$
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: check-executables-have-shebangs
|
||||||
|
name: Check that executables have shebangs
|
||||||
|
description: Ensures that (non-binary) executables have a shebang.
|
||||||
|
entry: check-executables-have-shebangs
|
||||||
|
language: python
|
||||||
|
types: [text, executable]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-json
|
- id: check-json
|
||||||
name: Check JSON
|
name: Check JSON
|
||||||
description: This hook checks json files for parseable syntax.
|
description: This hook checks json files for parseable syntax.
|
||||||
entry: check-json
|
entry: check-json
|
||||||
language: python
|
language: python
|
||||||
files: \.json$
|
types: [json]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: pretty-format-json
|
- id: pretty-format-json
|
||||||
name: Pretty format JSON
|
name: Pretty format JSON
|
||||||
description: This hook sets a standard for formatting JSON files.
|
description: This hook sets a standard for formatting JSON files.
|
||||||
entry: pretty-format-json
|
entry: pretty-format-json
|
||||||
language: python
|
language: python
|
||||||
files: \.json$
|
types: [json]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-merge-conflict
|
- id: check-merge-conflict
|
||||||
name: Check for merge conflicts
|
name: Check for merge conflicts
|
||||||
description: Check for files that contain merge conflict strings.
|
description: Check for files that contain merge conflict strings.
|
||||||
entry: check-merge-conflict
|
entry: check-merge-conflict
|
||||||
language: python
|
language: python
|
||||||
# Match all files
|
types: [text]
|
||||||
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-symlinks
|
- id: check-symlinks
|
||||||
name: Check for broken symlinks
|
name: Check for broken symlinks
|
||||||
description: Checks for symlinks which do not point to anything.
|
description: Checks for symlinks which do not point to anything.
|
||||||
entry: check-symlinks
|
entry: check-symlinks
|
||||||
language: python
|
language: python
|
||||||
# Match all files
|
types: [symlink]
|
||||||
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-xml
|
- id: check-xml
|
||||||
name: Check Xml
|
name: Check Xml
|
||||||
description: This hook checks xml files for parseable syntax.
|
description: This hook checks xml files for parseable syntax.
|
||||||
entry: check-xml
|
entry: check-xml
|
||||||
language: python
|
language: python
|
||||||
files: \.xml$
|
types: [xml]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
name: Check Yaml
|
name: Check Yaml
|
||||||
description: This hook checks yaml files for parseable syntax.
|
description: This hook checks yaml files for parseable syntax.
|
||||||
entry: check-yaml
|
entry: check-yaml
|
||||||
language: python
|
language: python
|
||||||
files: \.(yaml|yml|eyaml)$
|
types: [yaml]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: debug-statements
|
- id: debug-statements
|
||||||
name: Debug Statements (Python)
|
name: Debug Statements (Python)
|
||||||
description: This hook checks that debug statements (pdb, ipdb, pudb) are not imported on commit.
|
description: This hook checks that debug statements (pdb, ipdb, pudb) are not imported on commit.
|
||||||
entry: debug-statement-hook
|
entry: debug-statement-hook
|
||||||
language: python
|
language: python
|
||||||
files: \.py$
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: detect-aws-credentials
|
- id: detect-aws-credentials
|
||||||
name: Detect AWS Credentials
|
name: Detect AWS Credentials
|
||||||
description: Detects *your* aws credentials from the aws cli credentials file
|
description: Detects *your* aws credentials from the aws cli credentials file
|
||||||
entry: detect-aws-credentials
|
entry: detect-aws-credentials
|
||||||
language: python
|
language: python
|
||||||
|
types: [text]
|
||||||
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: detect-private-key
|
- id: detect-private-key
|
||||||
name: Detect Private Key
|
name: Detect Private Key
|
||||||
description: Detects the presence of private keys
|
description: Detects the presence of private keys
|
||||||
entry: detect-private-key
|
entry: detect-private-key
|
||||||
language: python
|
language: python
|
||||||
|
types: [text]
|
||||||
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: double-quote-string-fixer
|
- id: double-quote-string-fixer
|
||||||
name: Fix double quoted strings
|
name: Fix double quoted strings
|
||||||
description: This hook replaces double quoted strings with single quoted strings
|
description: This hook replaces double quoted strings with single quoted strings
|
||||||
entry: double-quote-string-fixer
|
entry: double-quote-string-fixer
|
||||||
language: python
|
language: python
|
||||||
files: \.py$
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
name: Fix End of Files
|
name: Fix End of Files
|
||||||
description: Ensures that a file is either empty, or ends with one newline.
|
description: Ensures that a file is either empty, or ends with one newline.
|
||||||
entry: end-of-file-fixer
|
entry: end-of-file-fixer
|
||||||
language: python
|
language: python
|
||||||
files: \.(asciidoc|adoc|coffee|cpp|css|c|ejs|erb|groovy|h|haml|hh|hpp|hxx|html|in|j2|jade|json|js|less|markdown|md|ml|mli|pp|py|rb|rs|R|scala|scss|sh|slim|tex|tmpl|ts|txt|yaml|yml)$
|
types: [text]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: file-contents-sorter
|
||||||
|
name: File Contents Sorter
|
||||||
|
description: Sort the lines in specified files (defaults to alphabetical). You must provide list of target files as input in your .pre-commit-config.yaml file.
|
||||||
|
entry: file-contents-sorter
|
||||||
|
language: python
|
||||||
|
files: '^$'
|
||||||
- id: fix-encoding-pragma
|
- id: fix-encoding-pragma
|
||||||
name: Fix python encoding pragma
|
name: Fix python encoding pragma
|
||||||
language: python
|
language: python
|
||||||
entry: fix-encoding-pragma
|
entry: fix-encoding-pragma
|
||||||
description: 'Add # -*- coding: utf-8 -*- to the top of python files'
|
description: 'Add # -*- coding: utf-8 -*- to the top of python files'
|
||||||
files: \.py$
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: flake8
|
- id: flake8
|
||||||
name: Flake8
|
name: Flake8
|
||||||
description: This hook runs flake8.
|
description: This hook runs flake8.
|
||||||
entry: flake8
|
entry: flake8
|
||||||
language: python
|
language: python
|
||||||
files: \.py$
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: forbid-new-submodules
|
- id: forbid-new-submodules
|
||||||
name: Forbid new submodules
|
name: Forbid new submodules
|
||||||
language: python
|
language: python
|
||||||
entry: forbid-new-submodules
|
entry: forbid-new-submodules
|
||||||
description: Prevent addition of new git submodules
|
description: Prevent addition of new git submodules
|
||||||
|
# for backward compatibility
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: mixed-line-ending
|
- id: mixed-line-ending
|
||||||
name: Mixed line ending
|
name: Mixed line ending
|
||||||
language: python
|
language: python
|
||||||
|
|
@ -139,23 +207,37 @@
|
||||||
name: "Don't commit to branch"
|
name: "Don't commit to branch"
|
||||||
entry: no-commit-to-branch
|
entry: no-commit-to-branch
|
||||||
language: python
|
language: python
|
||||||
files: .*
|
|
||||||
always_run: true
|
always_run: true
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: pyflakes
|
- id: pyflakes
|
||||||
name: Pyflakes (DEPRECATED, use flake8)
|
name: Pyflakes (DEPRECATED, use flake8)
|
||||||
description: This hook runs pyflakes. (This is deprecated, use flake8).
|
description: This hook runs pyflakes. (This is deprecated, use flake8).
|
||||||
entry: pyflakes
|
entry: pyflakes
|
||||||
language: python
|
language: python
|
||||||
files: \.py$
|
types: [python]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: requirements-txt-fixer
|
- id: requirements-txt-fixer
|
||||||
name: Fix requirements.txt
|
name: Fix requirements.txt
|
||||||
description: Sorts entries in requirements.txt
|
description: Sorts entries in requirements.txt
|
||||||
entry: requirements-txt-fixer
|
entry: requirements-txt-fixer
|
||||||
language: python
|
language: python
|
||||||
files: requirements.*\.txt$
|
files: requirements.*\.txt$
|
||||||
|
- id: sort-simple-yaml
|
||||||
|
name: Sort simple YAML files
|
||||||
|
language: python
|
||||||
|
entry: sort-simple-yaml
|
||||||
|
description: Sorts simple YAML files which consist only of top-level keys, preserving comments and blocks.
|
||||||
|
files: '^$'
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
name: Trim Trailing Whitespace
|
name: Trim Trailing Whitespace
|
||||||
description: This hook trims trailing whitespace.
|
description: This hook trims trailing whitespace.
|
||||||
entry: trailing-whitespace-fixer
|
entry: trailing-whitespace-fixer
|
||||||
language: python
|
language: python
|
||||||
files: \.(asciidoc|adoc|coffee|cpp|css|c|ejs|erb|groovy|h|haml|hh|hpp|hxx|html|in|j2|jade|json|js|less|markdown|md|ml|mli|pp|py|rb|rs|R|scala|scss|sh|slim|tex|tmpl|ts|txt|yaml|yml)$
|
types: [text]
|
||||||
|
# for backward compatibility
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
|
|
||||||
14
CHANGELOG
14
CHANGELOG
|
|
@ -1,3 +1,17 @@
|
||||||
|
0.9.1
|
||||||
|
=====
|
||||||
|
- Add `check-executables-have-shebangs` hook.
|
||||||
|
|
||||||
|
0.9.0
|
||||||
|
=====
|
||||||
|
- Add `sort-simple-yaml` hook
|
||||||
|
- Fix `requirements-txt-fixer` for empty files
|
||||||
|
- Add `file-contents-sorter` hook for sorting flat files
|
||||||
|
- `check-merge-conflict` now recognizes rebase conflicts
|
||||||
|
- Metadata now uses `types` (and therefore requires pre-commit 0.15.0). This
|
||||||
|
allows the text processing hooks to match *all* text files (and to match
|
||||||
|
files which would only be classifiable by their shebangs).
|
||||||
|
|
||||||
0.8.0
|
0.8.0
|
||||||
=====
|
=====
|
||||||
- Add flag allowing missing keys to `detect-aws-credentials`
|
- Add flag allowing missing keys to `detect-aws-credentials`
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ See also: https://github.com/pre-commit/pre-commit
|
||||||
Add this to your `.pre-commit-config.yaml`
|
Add this to your `.pre-commit-config.yaml`
|
||||||
|
|
||||||
- repo: git://github.com/pre-commit/pre-commit-hooks
|
- repo: git://github.com/pre-commit/pre-commit-hooks
|
||||||
sha: v0.8.0 # Use the ref you want to point at
|
sha: v0.9.1 # Use the ref you want to point at
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
# - id: ...
|
# - id: ...
|
||||||
|
|
@ -25,7 +25,8 @@ Add this to your `.pre-commit-config.yaml`
|
||||||
|
|
||||||
- `autopep8-wrapper` - Runs autopep8 over python source.
|
- `autopep8-wrapper` - Runs autopep8 over python source.
|
||||||
- Ignore PEP 8 violation types with `args: ['-i', '--ignore=E000,...']` or
|
- Ignore PEP 8 violation types with `args: ['-i', '--ignore=E000,...']` or
|
||||||
through configuration of the `[pep8]` section in setup.cfg / tox.ini.
|
through configuration of the `[pycodestyle]` section in
|
||||||
|
setup.cfg / tox.ini.
|
||||||
- `check-added-large-files` - Prevent giant files from being committed.
|
- `check-added-large-files` - Prevent giant files from being committed.
|
||||||
- Specify what is "too large" with `args: ['--maxkb=123']` (default=500kB).
|
- Specify what is "too large" with `args: ['--maxkb=123']` (default=500kB).
|
||||||
- `check-ast` - Simply check whether files parse as valid python.
|
- `check-ast` - Simply check whether files parse as valid python.
|
||||||
|
|
@ -34,6 +35,8 @@ Add this to your `.pre-commit-config.yaml`
|
||||||
case-insensitive filesystem like MacOS HFS+ or Windows FAT.
|
case-insensitive filesystem like MacOS HFS+ or Windows FAT.
|
||||||
- `check-docstring-first` - Checks for a common error of placing code before
|
- `check-docstring-first` - Checks for a common error of placing code before
|
||||||
the docstring.
|
the docstring.
|
||||||
|
- `check-executables-have-shebangs` - Checks that non-binary executables have a
|
||||||
|
proper shebang.
|
||||||
- `check-json` - Attempts to load all json files to verify syntax.
|
- `check-json` - Attempts to load all json files to verify syntax.
|
||||||
- `check-merge-conflict` - Check for files that contain merge conflict strings.
|
- `check-merge-conflict` - Check for files that contain merge conflict strings.
|
||||||
- `check-symlinks` - Checks for symlinks which do not point to anything.
|
- `check-symlinks` - Checks for symlinks which do not point to anything.
|
||||||
|
|
@ -51,6 +54,7 @@ Add this to your `.pre-commit-config.yaml`
|
||||||
with single quoted strings.
|
with single quoted strings.
|
||||||
- `end-of-file-fixer` - Makes sure files end in a newline and only a newline.
|
- `end-of-file-fixer` - Makes sure files end in a newline and only a newline.
|
||||||
- `fix-encoding-pragma` - Add `# -*- coding: utf-8 -*-` to the top of python files.
|
- `fix-encoding-pragma` - Add `# -*- coding: utf-8 -*-` to the top of python files.
|
||||||
|
- `file-contents-sorter` - Sort the lines in specified files (defaults to alphabetical). You must provide list of target files as input to it. Note that this hook WILL remove blank lines and does NOT respect any comments.
|
||||||
- To remove the coding pragma pass `--remove` (useful in a python3-only codebase)
|
- To remove the coding pragma pass `--remove` (useful in a python3-only codebase)
|
||||||
- `flake8` - Run flake8 on your python files.
|
- `flake8` - Run flake8 on your python files.
|
||||||
- `forbid-new-submodules` - Prevent addition of new git submodules.
|
- `forbid-new-submodules` - Prevent addition of new git submodules.
|
||||||
|
|
@ -72,6 +76,7 @@ Add this to your `.pre-commit-config.yaml`
|
||||||
- `--no-sort-keys` - when autofixing, retain the original key ordering (instead of sorting the keys)
|
- `--no-sort-keys` - when autofixing, retain the original key ordering (instead of sorting the keys)
|
||||||
- `--top-keys comma,separated,keys` - Keys to keep at the top of mappings.
|
- `--top-keys comma,separated,keys` - Keys to keep at the top of mappings.
|
||||||
- `requirements-txt-fixer` - Sorts entries in requirements.txt
|
- `requirements-txt-fixer` - Sorts entries in requirements.txt
|
||||||
|
- `sort-simple-yaml` - Sorts simple YAML files which consist only of top-level keys, preserving comments and blocks.
|
||||||
- `trailing-whitespace` - Trims trailing whitespace.
|
- `trailing-whitespace` - Trims trailing whitespace.
|
||||||
- Markdown linebreak trailing spaces preserved for `.md` and`.markdown`;
|
- Markdown linebreak trailing spaces preserved for `.md` and`.markdown`;
|
||||||
use `args: ['--markdown-linebreak-ext=txt,text']` to add other extensions,
|
use `args: ['--markdown-linebreak-ext=txt,text']` to add other extensions,
|
||||||
|
|
|
||||||
267
hooks.yaml
267
hooks.yaml
|
|
@ -1,128 +1,135 @@
|
||||||
- id: autopep8-wrapper
|
- id: autopep8-wrapper
|
||||||
name: autopep8 wrapper
|
language: system
|
||||||
description: "Runs autopep8 over python source. If you configure additional arguments you'll want to at least include -i."
|
name: upgrade-your-pre-commit-version
|
||||||
entry: autopep8-wrapper
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.py$
|
minimum_pre_commit_version: 0.15.0
|
||||||
args: [-i]
|
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
name: Check for added large files
|
language: system
|
||||||
description: Prevent giant files from being committed
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-added-large-files
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
# Match all files
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-ast
|
- id: check-ast
|
||||||
name: Check python ast
|
language: system
|
||||||
description: Simply check whether the files parse as valid python.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-ast
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: '\.py$'
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-byte-order-marker
|
- id: check-byte-order-marker
|
||||||
name: Check for byte-order marker
|
language: system
|
||||||
description: Forbid files which have a UTF-8 byte-order marker
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-byte-order-marker
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: '\.py$'
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-case-conflict
|
- id: check-case-conflict
|
||||||
name: Check for case conflicts
|
language: system
|
||||||
description: Check for files that would conflict in case-insensitive filesystems
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-case-conflict
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
# Match all files
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-docstring-first
|
- id: check-docstring-first
|
||||||
name: Check docstring is first
|
language: system
|
||||||
description: Checks a common error of defining a docstring after code.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-docstring-first
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.py$
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: check-executables-have-shebangs
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-json
|
- id: check-json
|
||||||
name: Check JSON
|
language: system
|
||||||
description: This hook checks json files for parseable syntax.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-json
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.json$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: pretty-format-json
|
- id: pretty-format-json
|
||||||
name: Pretty format JSON
|
language: system
|
||||||
description: This hook sets a standard for formatting JSON files.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: pretty-format-json
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.json$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-merge-conflict
|
- id: check-merge-conflict
|
||||||
name: Check for merge conflicts
|
language: system
|
||||||
description: Check for files that contain merge conflict strings.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-merge-conflict
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
# Match all files
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-symlinks
|
- id: check-symlinks
|
||||||
name: Check for broken symlinks
|
language: system
|
||||||
description: Checks for symlinks which do not point to anything.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-symlinks
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
# Match all files
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-xml
|
- id: check-xml
|
||||||
name: Check Xml
|
language: system
|
||||||
description: This hook checks xml files for parseable syntax.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-xml
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.xml$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
name: Check Yaml
|
language: system
|
||||||
description: This hook checks yaml files for parseable syntax.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: check-yaml
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.(yaml|yml|eyaml)$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: debug-statements
|
- id: debug-statements
|
||||||
name: Debug Statements (Python)
|
language: system
|
||||||
description: This hook checks that debug statements (pdb, ipdb, pudb) are not imported on commit.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: debug-statement-hook
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.py$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: detect-aws-credentials
|
- id: detect-aws-credentials
|
||||||
name: Detect AWS Credentials
|
language: system
|
||||||
description: Detects *your* aws credentials from the aws cli credentials file
|
name: upgrade-your-pre-commit-version
|
||||||
entry: detect-aws-credentials
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: detect-private-key
|
- id: detect-private-key
|
||||||
name: Detect Private Key
|
language: system
|
||||||
description: Detects the presence of private keys
|
name: upgrade-your-pre-commit-version
|
||||||
entry: detect-private-key
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: double-quote-string-fixer
|
- id: double-quote-string-fixer
|
||||||
name: Fix double quoted strings
|
language: system
|
||||||
description: This hook replaces double quoted strings with single quoted strings
|
name: upgrade-your-pre-commit-version
|
||||||
entry: double-quote-string-fixer
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
|
||||||
files: \.py$
|
|
||||||
- id: end-of-file-fixer
|
|
||||||
name: Fix End of Files
|
|
||||||
description: Ensures that a file is either empty, or ends with one newline.
|
|
||||||
entry: end-of-file-fixer
|
|
||||||
language: python
|
|
||||||
files: \.(asciidoc|adoc|coffee|cpp|css|c|ejs|erb|groovy|h|haml|hh|hpp|hxx|html|in|j2|jade|json|js|less|markdown|md|ml|mli|pp|py|rb|rs|R|scala|scss|sh|slim|tex|tmpl|ts|txt|yaml|yml)$
|
|
||||||
- id: fix-encoding-pragma
|
|
||||||
name: Fix python encoding pragma
|
|
||||||
language: python
|
|
||||||
entry: fix-encoding-pragma
|
|
||||||
description: 'Add # -*- coding: utf-8 -*- to the top of python files'
|
|
||||||
files: \.py$
|
|
||||||
- id: flake8
|
|
||||||
name: Flake8
|
|
||||||
description: This hook runs flake8.
|
|
||||||
entry: flake8
|
|
||||||
language: python
|
|
||||||
files: \.py$
|
|
||||||
- id: forbid-new-submodules
|
|
||||||
name: Forbid new submodules
|
|
||||||
language: python
|
|
||||||
entry: forbid-new-submodules
|
|
||||||
description: Prevent addition of new git submodules
|
|
||||||
files: ''
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: file-contents-sorter
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: fix-encoding-pragma
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: flake8
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: forbid-new-submodules
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: mixed-line-ending
|
- id: mixed-line-ending
|
||||||
name: Mixed line ending
|
name: Mixed line ending
|
||||||
language: python
|
language: python
|
||||||
|
|
@ -130,32 +137,38 @@
|
||||||
description: Replaces or checks mixed line ending
|
description: Replaces or checks mixed line ending
|
||||||
files: ''
|
files: ''
|
||||||
- id: name-tests-test
|
- id: name-tests-test
|
||||||
name: Tests should end in _test.py
|
language: system
|
||||||
description: This verifies that test files are named correctly
|
name: upgrade-your-pre-commit-version
|
||||||
entry: name-tests-test
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: tests/.+\.py$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: no-commit-to-branch
|
- id: no-commit-to-branch
|
||||||
name: "Don't commit to branch"
|
language: system
|
||||||
entry: no-commit-to-branch
|
name: upgrade-your-pre-commit-version
|
||||||
language: python
|
entry: upgrade-your-pre-commit-version
|
||||||
files: .*
|
files: ''
|
||||||
always_run: true
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: pyflakes
|
- id: pyflakes
|
||||||
name: Pyflakes (DEPRECATED, use flake8)
|
language: system
|
||||||
description: This hook runs pyflakes. (This is deprecated, use flake8).
|
name: upgrade-your-pre-commit-version
|
||||||
entry: pyflakes
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.py$
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: requirements-txt-fixer
|
- id: requirements-txt-fixer
|
||||||
name: Fix requirements.txt
|
language: system
|
||||||
description: Sorts entries in requirements.txt
|
name: upgrade-your-pre-commit-version
|
||||||
entry: requirements-txt-fixer
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: requirements.*\.txt$
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
- id: sort-simple-yaml
|
||||||
|
language: system
|
||||||
|
name: upgrade-your-pre-commit-version
|
||||||
|
entry: upgrade-your-pre-commit-version
|
||||||
|
files: ''
|
||||||
|
minimum_pre_commit_version: 0.15.0
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
name: Trim Trailing Whitespace
|
language: system
|
||||||
description: This hook trims trailing whitespace.
|
name: upgrade-your-pre-commit-version
|
||||||
entry: trailing-whitespace-fixer
|
entry: upgrade-your-pre-commit-version
|
||||||
language: python
|
files: ''
|
||||||
files: \.(asciidoc|adoc|coffee|cpp|css|c|ejs|erb|groovy|h|haml|hh|hpp|hxx|html|in|j2|jade|json|js|less|markdown|md|ml|mli|pp|py|rb|rs|R|scala|scss|sh|slim|tex|tmpl|ts|txt|yaml|yml)$
|
minimum_pre_commit_version: 0.15.0
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ def main(argv=None):
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'filenames', nargs='*',
|
'filenames', nargs='*',
|
||||||
help='Filenames pre-commit believes are changed.'
|
help='Filenames pre-commit believes are changed.',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--maxkb', type=int, default=500,
|
'--maxkb', type=int, default=500,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import ast
|
import ast
|
||||||
import os.path
|
import platform
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
|
@ -14,19 +14,19 @@ def check_ast(argv=None):
|
||||||
parser.add_argument('filenames', nargs='*')
|
parser.add_argument('filenames', nargs='*')
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
_, interpreter = os.path.split(sys.executable)
|
|
||||||
|
|
||||||
retval = 0
|
retval = 0
|
||||||
for filename in args.filenames:
|
for filename in args.filenames:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ast.parse(open(filename, 'rb').read(), filename=filename)
|
ast.parse(open(filename, 'rb').read(), filename=filename)
|
||||||
except SyntaxError:
|
except SyntaxError:
|
||||||
print('{}: failed parsing with {}:'.format(
|
print('{}: failed parsing with {} {}:'.format(
|
||||||
filename, interpreter,
|
filename,
|
||||||
|
platform.python_implementation(),
|
||||||
|
sys.version.partition(' ')[0],
|
||||||
))
|
))
|
||||||
print('\n{}'.format(
|
print('\n{}'.format(
|
||||||
' ' + traceback.format_exc().replace('\n', '\n ')
|
' ' + traceback.format_exc().replace('\n', '\n '),
|
||||||
))
|
))
|
||||||
retval = 1
|
retval = 1
|
||||||
return retval
|
return retval
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ def main(argv=None):
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'filenames', nargs='*',
|
'filenames', nargs='*',
|
||||||
help='Filenames pre-commit believes are changed.'
|
help='Filenames pre-commit believes are changed.',
|
||||||
)
|
)
|
||||||
|
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
from __future__ import print_function
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
|
@ -30,7 +31,7 @@ def check_docstring_first(src, filename='<unknown>'):
|
||||||
'{}:{} Multiple module docstrings '
|
'{}:{} Multiple module docstrings '
|
||||||
'(first docstring on line {}).'.format(
|
'(first docstring on line {}).'.format(
|
||||||
filename, sline, found_docstring_line,
|
filename, sline, found_docstring_line,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
return 1
|
return 1
|
||||||
elif found_code_line is not None:
|
elif found_code_line is not None:
|
||||||
|
|
@ -38,7 +39,7 @@ def check_docstring_first(src, filename='<unknown>'):
|
||||||
'{}:{} Module docstring appears after code '
|
'{}:{} Module docstring appears after code '
|
||||||
'(code seen on line {}).'.format(
|
'(code seen on line {}).'.format(
|
||||||
filename, sline, found_code_line,
|
filename, sline, found_code_line,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
40
pre_commit_hooks/check_executables_have_shebangs.py
Normal file
40
pre_commit_hooks/check_executables_have_shebangs.py
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
"""Check that executable text files have a shebang."""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import pipes
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def check_has_shebang(path):
|
||||||
|
with open(path, 'rb') as f:
|
||||||
|
first_bytes = f.read(2)
|
||||||
|
|
||||||
|
if first_bytes != b'#!':
|
||||||
|
print(
|
||||||
|
'{path}: marked executable but has no (or invalid) shebang!\n'
|
||||||
|
" If it isn't supposed to be executable, try: chmod -x {quoted}\n"
|
||||||
|
' If it is supposed to be executable, double-check its shebang.'.format(
|
||||||
|
path=path,
|
||||||
|
quoted=pipes.quote(path),
|
||||||
|
),
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
|
parser.add_argument('filenames', nargs='*')
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
retv = 0
|
||||||
|
|
||||||
|
for filename in args.filenames:
|
||||||
|
retv |= check_has_shebang(filename)
|
||||||
|
|
||||||
|
return retv
|
||||||
|
|
@ -7,7 +7,7 @@ CONFLICT_PATTERNS = [
|
||||||
b'<<<<<<< ',
|
b'<<<<<<< ',
|
||||||
b'======= ',
|
b'======= ',
|
||||||
b'=======\n',
|
b'=======\n',
|
||||||
b'>>>>>>> '
|
b'>>>>>>> ',
|
||||||
]
|
]
|
||||||
WARNING_MSG = 'Merge conflict string "{0}" found in {1}:{2}'
|
WARNING_MSG = 'Merge conflict string "{0}" found in {1}:{2}'
|
||||||
|
|
||||||
|
|
@ -15,7 +15,11 @@ WARNING_MSG = 'Merge conflict string "{0}" found in {1}:{2}'
|
||||||
def is_in_merge():
|
def is_in_merge():
|
||||||
return (
|
return (
|
||||||
os.path.exists(os.path.join('.git', 'MERGE_MSG')) and
|
os.path.exists(os.path.join('.git', 'MERGE_MSG')) and
|
||||||
os.path.exists(os.path.join('.git', 'MERGE_HEAD'))
|
(
|
||||||
|
os.path.exists(os.path.join('.git', 'MERGE_HEAD')) or
|
||||||
|
os.path.exists(os.path.join('.git', 'rebase-apply')) or
|
||||||
|
os.path.exists(os.path.join('.git', 'rebase-merge'))
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ class ImportStatementParser(ast.NodeVisitor):
|
||||||
def visit_ImportFrom(self, node):
|
def visit_ImportFrom(self, node):
|
||||||
if node.module in DEBUG_STATEMENTS:
|
if node.module in DEBUG_STATEMENTS:
|
||||||
self.debug_import_statements.append(
|
self.debug_import_statements.append(
|
||||||
DebugStatement(node.module, node.lineno, node.col_offset)
|
DebugStatement(node.module, node.lineno, node.col_offset),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ def check_file_for_debug_statements(filename):
|
||||||
debug_statement.line,
|
debug_statement.line,
|
||||||
debug_statement.col,
|
debug_statement.col,
|
||||||
debug_statement.name,
|
debug_statement.name,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ def get_aws_credential_files_from_env():
|
||||||
files = set()
|
files = set()
|
||||||
for env_var in (
|
for env_var in (
|
||||||
'AWS_CONFIG_FILE', 'AWS_CREDENTIAL_FILE', 'AWS_SHARED_CREDENTIALS_FILE',
|
'AWS_CONFIG_FILE', 'AWS_CREDENTIAL_FILE', 'AWS_SHARED_CREDENTIALS_FILE',
|
||||||
'BOTO_CONFIG'
|
'BOTO_CONFIG',
|
||||||
):
|
):
|
||||||
if env_var in os.environ:
|
if env_var in os.environ:
|
||||||
files.add(os.environ[env_var])
|
files.add(os.environ[env_var])
|
||||||
|
|
@ -23,7 +23,7 @@ def get_aws_secrets_from_env():
|
||||||
"""Extract AWS secrets from environment variables."""
|
"""Extract AWS secrets from environment variables."""
|
||||||
keys = set()
|
keys = set()
|
||||||
for env_var in (
|
for env_var in (
|
||||||
'AWS_SECRET_ACCESS_KEY', 'AWS_SECURITY_TOKEN', 'AWS_SESSION_TOKEN'
|
'AWS_SECRET_ACCESS_KEY', 'AWS_SECURITY_TOKEN', 'AWS_SESSION_TOKEN',
|
||||||
):
|
):
|
||||||
if env_var in os.environ:
|
if env_var in os.environ:
|
||||||
keys.add(os.environ[env_var])
|
keys.add(os.environ[env_var])
|
||||||
|
|
@ -50,7 +50,7 @@ def get_aws_secrets_from_file(credentials_file):
|
||||||
for section in parser.sections():
|
for section in parser.sections():
|
||||||
for var in (
|
for var in (
|
||||||
'aws_secret_access_key', 'aws_security_token',
|
'aws_secret_access_key', 'aws_security_token',
|
||||||
'aws_session_token'
|
'aws_session_token',
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
keys.add(parser.get(section, var))
|
keys.add(parser.get(section, var))
|
||||||
|
|
@ -93,13 +93,13 @@ def main(argv=None):
|
||||||
help=(
|
help=(
|
||||||
'Location of additional AWS credential files from which to get '
|
'Location of additional AWS credential files from which to get '
|
||||||
'secret keys from'
|
'secret keys from'
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--allow-missing-credentials',
|
'--allow-missing-credentials',
|
||||||
dest='allow_missing_credentials',
|
dest='allow_missing_credentials',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='Allow hook to pass when no credentials are detected.'
|
help='Allow hook to pass when no credentials are detected.',
|
||||||
)
|
)
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ def main(argv=None):
|
||||||
print(
|
print(
|
||||||
'No AWS keys were found in the configured credential files and '
|
'No AWS keys were found in the configured credential files and '
|
||||||
'environment variables.\nPlease ensure you have the correct '
|
'environment variables.\nPlease ensure you have the correct '
|
||||||
'setting for --credentials-file'
|
'setting for --credentials-file',
|
||||||
)
|
)
|
||||||
return 2
|
return 2
|
||||||
|
|
||||||
|
|
|
||||||
52
pre_commit_hooks/file_contents_sorter.py
Normal file
52
pre_commit_hooks/file_contents_sorter.py
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
"""
|
||||||
|
A very simple pre-commit hook that, when passed one or more filenames
|
||||||
|
as arguments, will sort the lines in those files.
|
||||||
|
|
||||||
|
An example use case for this: you have a deploy-whitelist.txt file
|
||||||
|
in a repo that contains a list of filenames that is used to specify
|
||||||
|
files to be included in a docker container. This file has one filename
|
||||||
|
per line. Various users are adding/removing lines from this file; using
|
||||||
|
this hook on that file should reduce the instances of git merge
|
||||||
|
conflicts and keep the file nicely ordered.
|
||||||
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
PASS = 0
|
||||||
|
FAIL = 1
|
||||||
|
|
||||||
|
|
||||||
|
def sort_file_contents(f):
|
||||||
|
before = list(f)
|
||||||
|
after = sorted([line.strip(b'\n\r') for line in before if line.strip()])
|
||||||
|
|
||||||
|
before_string = b''.join(before)
|
||||||
|
after_string = b'\n'.join(after) + b'\n'
|
||||||
|
|
||||||
|
if before_string == after_string:
|
||||||
|
return PASS
|
||||||
|
else:
|
||||||
|
f.seek(0)
|
||||||
|
f.write(after_string)
|
||||||
|
f.truncate()
|
||||||
|
return FAIL
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('filenames', nargs='+', help='Files to sort')
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
retv = PASS
|
||||||
|
|
||||||
|
for arg in args.filenames:
|
||||||
|
with open(arg, 'rb+') as file_obj:
|
||||||
|
ret_for_file = sort_file_contents(file_obj)
|
||||||
|
|
||||||
|
if ret_for_file:
|
||||||
|
print('Sorting {}'.format(arg))
|
||||||
|
|
||||||
|
retv |= ret_for_file
|
||||||
|
|
||||||
|
return retv
|
||||||
|
|
@ -15,7 +15,8 @@ def is_on_branch(protected):
|
||||||
def main(argv=[]):
|
def main(argv=[]):
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-b', '--branch', default='master', help='branch to disallow commits to')
|
'-b', '--branch', default='master', help='branch to disallow commits to',
|
||||||
|
)
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
return int(is_on_branch(args.branch))
|
return int(is_on_branch(args.branch))
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,7 @@ def pretty_format_json(argv=None):
|
||||||
except simplejson.JSONDecodeError:
|
except simplejson.JSONDecodeError:
|
||||||
print(
|
print(
|
||||||
"Input File {} is not a valid JSON, consider using check-json"
|
"Input File {} is not a valid JSON, consider using check-json"
|
||||||
.format(json_file)
|
.format(json_file),
|
||||||
)
|
)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,10 @@ from __future__ import print_function
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
PASS = 0
|
||||||
|
FAIL = 1
|
||||||
|
|
||||||
|
|
||||||
class Requirement(object):
|
class Requirement(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
@ -30,21 +34,25 @@ class Requirement(object):
|
||||||
|
|
||||||
def fix_requirements(f):
|
def fix_requirements(f):
|
||||||
requirements = []
|
requirements = []
|
||||||
before = []
|
before = tuple(f)
|
||||||
after = []
|
after = []
|
||||||
|
|
||||||
for line in f:
|
before_string = b''.join(before)
|
||||||
before.append(line)
|
|
||||||
|
|
||||||
# If the most recent requirement object has a value, then it's time to
|
# If the file is empty (i.e. only whitespace/newlines) exit early
|
||||||
# start building the next requirement object.
|
if before_string.strip() == b'':
|
||||||
|
return PASS
|
||||||
|
|
||||||
|
for line in before:
|
||||||
|
# If the most recent requirement object has a value, then it's
|
||||||
|
# time to start building the next requirement object.
|
||||||
if not len(requirements) or requirements[-1].value is not None:
|
if not len(requirements) or requirements[-1].value is not None:
|
||||||
requirements.append(Requirement())
|
requirements.append(Requirement())
|
||||||
|
|
||||||
requirement = requirements[-1]
|
requirement = requirements[-1]
|
||||||
|
|
||||||
# If we see a newline before any requirements, then this is a top of
|
# If we see a newline before any requirements, then this is a
|
||||||
# file comment.
|
# top of file comment.
|
||||||
if len(requirements) == 1 and line.strip() == b'':
|
if len(requirements) == 1 and line.strip() == b'':
|
||||||
if len(requirement.comments) and requirement.comments[0].startswith(b'#'):
|
if len(requirement.comments) and requirement.comments[0].startswith(b'#'):
|
||||||
requirement.value = b'\n'
|
requirement.value = b'\n'
|
||||||
|
|
@ -56,20 +64,18 @@ def fix_requirements(f):
|
||||||
requirement.value = line
|
requirement.value = line
|
||||||
|
|
||||||
for requirement in sorted(requirements):
|
for requirement in sorted(requirements):
|
||||||
for comment in requirement.comments:
|
after.extend(requirement.comments)
|
||||||
after.append(comment)
|
|
||||||
after.append(requirement.value)
|
after.append(requirement.value)
|
||||||
|
|
||||||
before_string = b''.join(before)
|
|
||||||
after_string = b''.join(after)
|
after_string = b''.join(after)
|
||||||
|
|
||||||
if before_string == after_string:
|
if before_string == after_string:
|
||||||
return 0
|
return PASS
|
||||||
else:
|
else:
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
f.write(after_string)
|
f.write(after_string)
|
||||||
f.truncate()
|
f.truncate()
|
||||||
return 1
|
return FAIL
|
||||||
|
|
||||||
|
|
||||||
def fix_requirements_txt(argv=None):
|
def fix_requirements_txt(argv=None):
|
||||||
|
|
@ -77,7 +83,7 @@ def fix_requirements_txt(argv=None):
|
||||||
parser.add_argument('filenames', nargs='*', help='Filenames to fix')
|
parser.add_argument('filenames', nargs='*', help='Filenames to fix')
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
retv = 0
|
retv = PASS
|
||||||
|
|
||||||
for arg in args.filenames:
|
for arg in args.filenames:
|
||||||
with open(arg, 'rb+') as file_obj:
|
with open(arg, 'rb+') as file_obj:
|
||||||
|
|
|
||||||
123
pre_commit_hooks/sort_simple_yaml.py
Executable file
123
pre_commit_hooks/sort_simple_yaml.py
Executable file
|
|
@ -0,0 +1,123 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
"""Sort a simple YAML file, keeping blocks of comments and definitions
|
||||||
|
together.
|
||||||
|
|
||||||
|
We assume a strict subset of YAML that looks like:
|
||||||
|
|
||||||
|
# block of header comments
|
||||||
|
# here that should always
|
||||||
|
# be at the top of the file
|
||||||
|
|
||||||
|
# optional comments
|
||||||
|
# can go here
|
||||||
|
key: value
|
||||||
|
key: value
|
||||||
|
|
||||||
|
key: value
|
||||||
|
|
||||||
|
In other words, we don't sort deeper than the top layer, and might corrupt
|
||||||
|
complicated YAML files.
|
||||||
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
QUOTES = ["'", '"']
|
||||||
|
|
||||||
|
|
||||||
|
def sort(lines):
|
||||||
|
"""Sort a YAML file in alphabetical order, keeping blocks together.
|
||||||
|
|
||||||
|
:param lines: array of strings (without newlines)
|
||||||
|
:return: sorted array of strings
|
||||||
|
"""
|
||||||
|
# make a copy of lines since we will clobber it
|
||||||
|
lines = list(lines)
|
||||||
|
new_lines = parse_block(lines, header=True)
|
||||||
|
|
||||||
|
for block in sorted(parse_blocks(lines), key=first_key):
|
||||||
|
if new_lines:
|
||||||
|
new_lines.append('')
|
||||||
|
new_lines.extend(block)
|
||||||
|
|
||||||
|
return new_lines
|
||||||
|
|
||||||
|
|
||||||
|
def parse_block(lines, header=False):
|
||||||
|
"""Parse and return a single block, popping off the start of `lines`.
|
||||||
|
|
||||||
|
If parsing a header block, we stop after we reach a line that is not a
|
||||||
|
comment. Otherwise, we stop after reaching an empty line.
|
||||||
|
|
||||||
|
:param lines: list of lines
|
||||||
|
:param header: whether we are parsing a header block
|
||||||
|
:return: list of lines that form the single block
|
||||||
|
"""
|
||||||
|
block_lines = []
|
||||||
|
while lines and lines[0] and (not header or lines[0].startswith('#')):
|
||||||
|
block_lines.append(lines.pop(0))
|
||||||
|
return block_lines
|
||||||
|
|
||||||
|
|
||||||
|
def parse_blocks(lines):
|
||||||
|
"""Parse and return all possible blocks, popping off the start of `lines`.
|
||||||
|
|
||||||
|
:param lines: list of lines
|
||||||
|
:return: list of blocks, where each block is a list of lines
|
||||||
|
"""
|
||||||
|
blocks = []
|
||||||
|
|
||||||
|
while lines:
|
||||||
|
if lines[0] == '':
|
||||||
|
lines.pop(0)
|
||||||
|
else:
|
||||||
|
blocks.append(parse_block(lines))
|
||||||
|
|
||||||
|
return blocks
|
||||||
|
|
||||||
|
|
||||||
|
def first_key(lines):
|
||||||
|
"""Returns a string representing the sort key of a block.
|
||||||
|
|
||||||
|
The sort key is the first YAML key we encounter, ignoring comments, and
|
||||||
|
stripping leading quotes.
|
||||||
|
|
||||||
|
>>> print(test)
|
||||||
|
# some comment
|
||||||
|
'foo': true
|
||||||
|
>>> first_key(test)
|
||||||
|
'foo'
|
||||||
|
"""
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith('#'):
|
||||||
|
continue
|
||||||
|
if any(line.startswith(quote) for quote in QUOTES):
|
||||||
|
return line[1:]
|
||||||
|
return line
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('filenames', nargs='*', help='Filenames to fix')
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
retval = 0
|
||||||
|
|
||||||
|
for filename in args.filenames:
|
||||||
|
with open(filename, 'r+') as f:
|
||||||
|
lines = [line.rstrip() for line in f.readlines()]
|
||||||
|
new_lines = sort(lines)
|
||||||
|
|
||||||
|
if lines != new_lines:
|
||||||
|
print("Fixing file `{filename}`".format(filename=filename))
|
||||||
|
f.seek(0)
|
||||||
|
f.write("\n".join(new_lines) + "\n")
|
||||||
|
f.truncate()
|
||||||
|
retval = 1
|
||||||
|
|
||||||
|
return retval
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
exit(main())
|
||||||
|
|
@ -11,7 +11,7 @@ def validate_files(argv=None):
|
||||||
parser.add_argument('filenames', nargs='*')
|
parser.add_argument('filenames', nargs='*')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--django', default=False, action='store_true',
|
'--django', default=False, action='store_true',
|
||||||
help='Use Django-style test naming pattern (test*.py)'
|
help='Use Django-style test naming pattern (test*.py)',
|
||||||
)
|
)
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
|
@ -27,8 +27,8 @@ def validate_files(argv=None):
|
||||||
retcode = 1
|
retcode = 1
|
||||||
print(
|
print(
|
||||||
'{} does not match pattern "{}"'.format(
|
'{} does not match pattern "{}"'.format(
|
||||||
filename, test_name_pattern
|
filename, test_name_pattern,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return retcode
|
return retcode
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ def fix_trailing_whitespace(argv=None):
|
||||||
const=[],
|
const=[],
|
||||||
default=argparse.SUPPRESS,
|
default=argparse.SUPPRESS,
|
||||||
dest='markdown_linebreak_ext',
|
dest='markdown_linebreak_ext',
|
||||||
help='Do not preserve linebreak spaces in Markdown'
|
help='Do not preserve linebreak spaces in Markdown',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--markdown-linebreak-ext',
|
'--markdown-linebreak-ext',
|
||||||
|
|
@ -45,7 +45,7 @@ def fix_trailing_whitespace(argv=None):
|
||||||
default=['md,markdown'],
|
default=['md,markdown'],
|
||||||
metavar='*|EXT[,EXT,...]',
|
metavar='*|EXT[,EXT,...]',
|
||||||
nargs='?',
|
nargs='?',
|
||||||
help='Markdown extensions (or *) for linebreak spaces'
|
help='Markdown extensions (or *) for linebreak spaces',
|
||||||
)
|
)
|
||||||
parser.add_argument('filenames', nargs='*', help='Filenames to fix')
|
parser.add_argument('filenames', nargs='*', help='Filenames to fix')
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
@ -69,7 +69,7 @@ def fix_trailing_whitespace(argv=None):
|
||||||
parser.error(
|
parser.error(
|
||||||
"bad --markdown-linebreak-ext extension '{}' (has . / \\ :)\n"
|
"bad --markdown-linebreak-ext extension '{}' (has . / \\ :)\n"
|
||||||
" (probably filename; use '--markdown-linebreak-ext=EXT')"
|
" (probably filename; use '--markdown-linebreak-ext=EXT')"
|
||||||
.format(ext)
|
.format(ext),
|
||||||
)
|
)
|
||||||
|
|
||||||
return_code = 0
|
return_code = 0
|
||||||
|
|
|
||||||
9
setup.py
9
setup.py
|
|
@ -6,7 +6,7 @@ setup(
|
||||||
name='pre_commit_hooks',
|
name='pre_commit_hooks',
|
||||||
description='Some out-of-the-box hooks for pre-commit.',
|
description='Some out-of-the-box hooks for pre-commit.',
|
||||||
url='https://github.com/pre-commit/pre-commit-hooks',
|
url='https://github.com/pre-commit/pre-commit-hooks',
|
||||||
version='0.8.0',
|
version='0.9.1',
|
||||||
|
|
||||||
author='Anthony Sottile',
|
author='Anthony Sottile',
|
||||||
author_email='asottile@umich.edu',
|
author_email='asottile@umich.edu',
|
||||||
|
|
@ -24,9 +24,9 @@ setup(
|
||||||
|
|
||||||
packages=find_packages(exclude=('tests*', 'testing*')),
|
packages=find_packages(exclude=('tests*', 'testing*')),
|
||||||
install_requires=[
|
install_requires=[
|
||||||
# quickfix to prevent pep8 conflicts
|
# quickfix to prevent pycodestyle conflicts
|
||||||
'flake8!=2.5.3',
|
'flake8!=2.5.3',
|
||||||
'autopep8>=1.1',
|
'autopep8>=1.3',
|
||||||
'pyyaml',
|
'pyyaml',
|
||||||
'simplejson',
|
'simplejson',
|
||||||
'six',
|
'six',
|
||||||
|
|
@ -39,6 +39,7 @@ setup(
|
||||||
'check-byte-order-marker = pre_commit_hooks.check_byte_order_marker:main',
|
'check-byte-order-marker = pre_commit_hooks.check_byte_order_marker:main',
|
||||||
'check-case-conflict = pre_commit_hooks.check_case_conflict:main',
|
'check-case-conflict = pre_commit_hooks.check_case_conflict:main',
|
||||||
'check-docstring-first = pre_commit_hooks.check_docstring_first:main',
|
'check-docstring-first = pre_commit_hooks.check_docstring_first:main',
|
||||||
|
'check-executables-have-shebangs = pre_commit_hooks.check_executables_have_shebangs:main',
|
||||||
'check-json = pre_commit_hooks.check_json:check_json',
|
'check-json = pre_commit_hooks.check_json:check_json',
|
||||||
'check-merge-conflict = pre_commit_hooks.check_merge_conflict:detect_merge_conflict',
|
'check-merge-conflict = pre_commit_hooks.check_merge_conflict:detect_merge_conflict',
|
||||||
'check-symlinks = pre_commit_hooks.check_symlinks:check_symlinks',
|
'check-symlinks = pre_commit_hooks.check_symlinks:check_symlinks',
|
||||||
|
|
@ -49,6 +50,7 @@ setup(
|
||||||
'detect-private-key = pre_commit_hooks.detect_private_key:detect_private_key',
|
'detect-private-key = pre_commit_hooks.detect_private_key:detect_private_key',
|
||||||
'double-quote-string-fixer = pre_commit_hooks.string_fixer:main',
|
'double-quote-string-fixer = pre_commit_hooks.string_fixer:main',
|
||||||
'end-of-file-fixer = pre_commit_hooks.end_of_file_fixer:end_of_file_fixer',
|
'end-of-file-fixer = pre_commit_hooks.end_of_file_fixer:end_of_file_fixer',
|
||||||
|
'file-contents-sorter = pre_commit_hooks.file_contents_sorter:main',
|
||||||
'fix-encoding-pragma = pre_commit_hooks.fix_encoding_pragma:main',
|
'fix-encoding-pragma = pre_commit_hooks.fix_encoding_pragma:main',
|
||||||
'forbid-new-submodules = pre_commit_hooks.forbid_new_submodules:main',
|
'forbid-new-submodules = pre_commit_hooks.forbid_new_submodules:main',
|
||||||
'mixed-line-ending = pre_commit_hooks.mixed_line_ending:mixed_line_ending',
|
'mixed-line-ending = pre_commit_hooks.mixed_line_ending:mixed_line_ending',
|
||||||
|
|
@ -56,6 +58,7 @@ setup(
|
||||||
'no-commit-to-branch = pre_commit_hooks.no_commit_to_branch:main',
|
'no-commit-to-branch = pre_commit_hooks.no_commit_to_branch:main',
|
||||||
'pretty-format-json = pre_commit_hooks.pretty_format_json:pretty_format_json',
|
'pretty-format-json = pre_commit_hooks.pretty_format_json:pretty_format_json',
|
||||||
'requirements-txt-fixer = pre_commit_hooks.requirements_txt_fixer:fix_requirements_txt',
|
'requirements-txt-fixer = pre_commit_hooks.requirements_txt_fixer:fix_requirements_txt',
|
||||||
|
'sort-simple-yaml = pre_commit_hooks.sort_simple_yaml:main',
|
||||||
'trailing-whitespace-fixer = pre_commit_hooks.trailing_whitespace_fixer:fix_trailing_whitespace',
|
'trailing-whitespace-fixer = pre_commit_hooks.trailing_whitespace_fixer:fix_trailing_whitespace',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,4 @@ aws_secret_access_key = z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb
|
||||||
aws_access_key_id = AKIAJIMMINYCRICKET0A
|
aws_access_key_id = AKIAJIMMINYCRICKET0A
|
||||||
aws_secret_access_key = ixswosj8gz3wuik405jl9k3vdajsnxfhnpui38ez
|
aws_secret_access_key = ixswosj8gz3wuik405jl9k3vdajsnxfhnpui38ez
|
||||||
[test]
|
[test]
|
||||||
aws_session_token = foo
|
aws_session_token = foo
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,4 @@
|
||||||
[production]
|
[production]
|
||||||
aws_access_key_id = AKIAVOGONSVOGONS0042
|
aws_access_key_id = AKIAVOGONSVOGONS0042
|
||||||
aws_secret_access_key = z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb
|
aws_secret_access_key = z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb
|
||||||
aws_session_token = foo
|
aws_session_token = foo
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# file with an AWS session token
|
# file with an AWS session token
|
||||||
[production]
|
[production]
|
||||||
aws_session_token = foo
|
aws_session_token = foo
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,6 @@ def test_main_failing(tmpdir, input_src, expected_ret, output_src):
|
||||||
|
|
||||||
def test_respects_config_file(tmpdir):
|
def test_respects_config_file(tmpdir):
|
||||||
with tmpdir.as_cwd():
|
with tmpdir.as_cwd():
|
||||||
tmpdir.join('setup.cfg').write('[pep8]\nignore=E221')
|
tmpdir.join('setup.cfg').write('[pycodestyle]\nignore=E221')
|
||||||
tmpdir.join('test.py').write('print(1 + 2)\n')
|
tmpdir.join('test.py').write('print(1 + 2)\n')
|
||||||
assert main(['test.py', '-i', '-v']) == 0
|
assert main(['test.py', '-i', '-v']) == 0
|
||||||
|
|
|
||||||
|
|
@ -81,12 +81,7 @@ def test_allows_gitlfs(temp_git_dir): # pragma: no cover
|
||||||
with temp_git_dir.as_cwd():
|
with temp_git_dir.as_cwd():
|
||||||
# Work around https://github.com/github/git-lfs/issues/913
|
# Work around https://github.com/github/git-lfs/issues/913
|
||||||
cmd_output(
|
cmd_output(
|
||||||
'git',
|
'git', 'commit', '--no-gpg-sign', '--allow-empty', '-m', 'foo',
|
||||||
'commit',
|
|
||||||
'--no-gpg-sign',
|
|
||||||
'--allow-empty',
|
|
||||||
'-m',
|
|
||||||
'foo',
|
|
||||||
)
|
)
|
||||||
cmd_output('git', 'lfs', 'install')
|
cmd_output('git', 'lfs', 'install')
|
||||||
temp_git_dir.join('f.py').write('a' * 10000)
|
temp_git_dir.join('f.py').write('a' * 10000)
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ TESTS = (
|
||||||
'"foo"\n',
|
'"foo"\n',
|
||||||
1,
|
1,
|
||||||
'{filename}:2 Module docstring appears after code '
|
'{filename}:2 Module docstring appears after code '
|
||||||
'(code seen on line 1).\n'
|
'(code seen on line 1).\n',
|
||||||
),
|
),
|
||||||
# Test double docstring
|
# Test double docstring
|
||||||
(
|
(
|
||||||
|
|
@ -28,7 +28,7 @@ TESTS = (
|
||||||
'"fake docstring"\n',
|
'"fake docstring"\n',
|
||||||
1,
|
1,
|
||||||
'{filename}:3 Multiple module docstrings '
|
'{filename}:3 Multiple module docstrings '
|
||||||
'(first docstring on line 1).\n'
|
'(first docstring on line 1).\n',
|
||||||
),
|
),
|
||||||
# Test multiple lines of code above
|
# Test multiple lines of code above
|
||||||
(
|
(
|
||||||
|
|
|
||||||
39
tests/check_executables_have_shebangs_test.py
Normal file
39
tests/check_executables_have_shebangs_test.py
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from pre_commit_hooks.check_executables_have_shebangs import main
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'content', (
|
||||||
|
b'#!/bin/bash\nhello world\n',
|
||||||
|
b'#!/usr/bin/env python3.6',
|
||||||
|
b'#!python',
|
||||||
|
'#!☃'.encode('UTF-8'),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_has_shebang(content, tmpdir):
|
||||||
|
path = tmpdir.join('path')
|
||||||
|
path.write(content, 'wb')
|
||||||
|
assert main((path.strpath,)) == 0
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'content', (
|
||||||
|
b'',
|
||||||
|
b' #!python\n',
|
||||||
|
b'\n#!python\n',
|
||||||
|
b'python\n',
|
||||||
|
'☃'.encode('UTF-8'),
|
||||||
|
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_bad_shebang(content, tmpdir, capsys):
|
||||||
|
path = tmpdir.join('path')
|
||||||
|
path.write(content, 'wb')
|
||||||
|
assert main((path.strpath,)) == 1
|
||||||
|
_, stderr = capsys.readouterr()
|
||||||
|
assert stderr.startswith('{}: marked executable but'.format(path.strpath))
|
||||||
|
|
@ -4,11 +4,13 @@ from pre_commit_hooks.check_json import check_json
|
||||||
from testing.util import get_resource_path
|
from testing.util import get_resource_path
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('bad_json.notjson', 1),
|
('filename', 'expected_retval'), (
|
||||||
('bad_json_latin1.nonjson', 1),
|
('bad_json.notjson', 1),
|
||||||
('ok_json.json', 0),
|
('bad_json_latin1.nonjson', 1),
|
||||||
))
|
('ok_json.json', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_check_json(capsys, filename, expected_retval):
|
def test_check_json(capsys, filename, expected_retval):
|
||||||
ret = check_json([get_resource_path(filename)])
|
ret = check_json([get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ def f1_is_a_conflict_file(tmpdir):
|
||||||
'child\n'
|
'child\n'
|
||||||
'=======\n'
|
'=======\n'
|
||||||
'parent\n'
|
'parent\n'
|
||||||
'>>>>>>>'
|
'>>>>>>>',
|
||||||
) or f1.startswith(
|
) or f1.startswith(
|
||||||
'<<<<<<< HEAD\n'
|
'<<<<<<< HEAD\n'
|
||||||
'child\n'
|
'child\n'
|
||||||
|
|
@ -53,7 +53,15 @@ def f1_is_a_conflict_file(tmpdir):
|
||||||
'||||||| merged common ancestors\n'
|
'||||||| merged common ancestors\n'
|
||||||
'=======\n'
|
'=======\n'
|
||||||
'parent\n'
|
'parent\n'
|
||||||
'>>>>>>>'
|
'>>>>>>>',
|
||||||
|
) or f1.startswith(
|
||||||
|
# .gitconfig with [pull] rebase = preserve causes a rebase which
|
||||||
|
# flips parent / child
|
||||||
|
'<<<<<<< HEAD\n'
|
||||||
|
'parent\n'
|
||||||
|
'=======\n'
|
||||||
|
'child\n'
|
||||||
|
'>>>>>>>',
|
||||||
)
|
)
|
||||||
assert os.path.exists(os.path.join('.git', 'MERGE_MSG'))
|
assert os.path.exists(os.path.join('.git', 'MERGE_MSG'))
|
||||||
yield
|
yield
|
||||||
|
|
@ -85,7 +93,7 @@ def repository_is_pending_merge(tmpdir):
|
||||||
repo2_f2.write('child\n')
|
repo2_f2.write('child\n')
|
||||||
cmd_output('git', 'add', '--', repo2_f2.strpath)
|
cmd_output('git', 'add', '--', repo2_f2.strpath)
|
||||||
cmd_output('git', 'commit', '--no-gpg-sign', '-m', 'clone commit2')
|
cmd_output('git', 'commit', '--no-gpg-sign', '-m', 'clone commit2')
|
||||||
cmd_output('git', 'pull', '--no-commit')
|
cmd_output('git', 'pull', '--no-commit', '--no-rebase')
|
||||||
# We should end up in a pending merge
|
# We should end up in a pending merge
|
||||||
assert repo2_f1.read() == 'parent\n'
|
assert repo2_f1.read() == 'parent\n'
|
||||||
assert repo2_f2.read() == 'child\n'
|
assert repo2_f2.read() == 'child\n'
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,12 @@ from testing.util import get_resource_path
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail(os.name == 'nt', reason='No symlink support on windows')
|
@pytest.mark.xfail(os.name == 'nt', reason='No symlink support on windows')
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('broken_symlink', 1),
|
('filename', 'expected_retval'), (
|
||||||
('working_symlink', 0),
|
('broken_symlink', 1),
|
||||||
))
|
('working_symlink', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_check_symlinks(filename, expected_retval):
|
def test_check_symlinks(filename, expected_retval):
|
||||||
ret = check_symlinks([get_resource_path(filename)])
|
ret = check_symlinks([get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,12 @@ from pre_commit_hooks.check_xml import check_xml
|
||||||
from testing.util import get_resource_path
|
from testing.util import get_resource_path
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('bad_xml.notxml', 1),
|
('filename', 'expected_retval'), (
|
||||||
('ok_xml.xml', 0),
|
('bad_xml.notxml', 1),
|
||||||
))
|
('ok_xml.xml', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_check_xml(filename, expected_retval):
|
def test_check_xml(filename, expected_retval):
|
||||||
ret = check_xml([get_resource_path(filename)])
|
ret = check_xml([get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,12 @@ from pre_commit_hooks.check_yaml import check_yaml
|
||||||
from testing.util import get_resource_path
|
from testing.util import get_resource_path
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('bad_yaml.notyaml', 1),
|
('filename', 'expected_retval'), (
|
||||||
('ok_yaml.yaml', 0),
|
('bad_yaml.notyaml', 1),
|
||||||
))
|
('ok_yaml.yaml', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_check_yaml(filename, expected_retval):
|
def test_check_yaml(filename, expected_retval):
|
||||||
ret = check_yaml([get_resource_path(filename)])
|
ret = check_yaml([get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
|
||||||
|
|
@ -10,30 +10,36 @@ from testing.util import get_resource_path
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def ast_with_no_debug_imports():
|
def ast_with_no_debug_imports():
|
||||||
return ast.parse("""
|
return ast.parse(
|
||||||
|
"""
|
||||||
import foo
|
import foo
|
||||||
import bar
|
import bar
|
||||||
import baz
|
import baz
|
||||||
from foo import bar
|
from foo import bar
|
||||||
""")
|
""",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def ast_with_debug_import_form_1():
|
def ast_with_debug_import_form_1():
|
||||||
return ast.parse("""
|
return ast.parse(
|
||||||
|
"""
|
||||||
|
|
||||||
import ipdb; ipdb.set_trace()
|
import ipdb; ipdb.set_trace()
|
||||||
|
|
||||||
""")
|
""",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def ast_with_debug_import_form_2():
|
def ast_with_debug_import_form_2():
|
||||||
return ast.parse("""
|
return ast.parse(
|
||||||
|
"""
|
||||||
|
|
||||||
from pudb import set_trace; set_trace()
|
from pudb import set_trace; set_trace()
|
||||||
|
|
||||||
""")
|
""",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_returns_no_debug_statements(ast_with_no_debug_imports):
|
def test_returns_no_debug_statements(ast_with_no_debug_imports):
|
||||||
|
|
@ -46,7 +52,7 @@ def test_returns_one_form_1(ast_with_debug_import_form_1):
|
||||||
visitor = ImportStatementParser()
|
visitor = ImportStatementParser()
|
||||||
visitor.visit(ast_with_debug_import_form_1)
|
visitor.visit(ast_with_debug_import_form_1)
|
||||||
assert visitor.debug_import_statements == [
|
assert visitor.debug_import_statements == [
|
||||||
DebugStatement('ipdb', 3, 0)
|
DebugStatement('ipdb', 3, 0),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -54,7 +60,7 @@ def test_returns_one_form_2(ast_with_debug_import_form_2):
|
||||||
visitor = ImportStatementParser()
|
visitor = ImportStatementParser()
|
||||||
visitor.visit(ast_with_debug_import_form_2)
|
visitor.visit(ast_with_debug_import_form_2)
|
||||||
assert visitor.debug_import_statements == [
|
assert visitor.debug_import_statements == [
|
||||||
DebugStatement('pudb', 3, 0)
|
DebugStatement('pudb', 3, 0),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,16 +21,16 @@ from testing.util import get_resource_path
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
'AWS_DUMMY_KEY': '/foo', 'AWS_CONFIG_FILE': '/bar',
|
'AWS_DUMMY_KEY': '/foo', 'AWS_CONFIG_FILE': '/bar',
|
||||||
'AWS_CREDENTIAL_FILE': '/baz'
|
'AWS_CREDENTIAL_FILE': '/baz',
|
||||||
},
|
},
|
||||||
{'/bar', '/baz'}
|
{'/bar', '/baz'},
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
'AWS_CONFIG_FILE': '/foo', 'AWS_CREDENTIAL_FILE': '/bar',
|
'AWS_CONFIG_FILE': '/foo', 'AWS_CREDENTIAL_FILE': '/bar',
|
||||||
'AWS_SHARED_CREDENTIALS_FILE': '/baz'
|
'AWS_SHARED_CREDENTIALS_FILE': '/baz',
|
||||||
},
|
},
|
||||||
{'/foo', '/bar', '/baz'}
|
{'/foo', '/bar', '/baz'},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -51,7 +51,7 @@ def test_get_aws_credentials_file_from_env(env_vars, values):
|
||||||
({'AWS_DUMMY_KEY': 'foo', 'AWS_SECRET_ACCESS_KEY': 'bar'}, {'bar'}),
|
({'AWS_DUMMY_KEY': 'foo', 'AWS_SECRET_ACCESS_KEY': 'bar'}, {'bar'}),
|
||||||
(
|
(
|
||||||
{'AWS_SECRET_ACCESS_KEY': 'foo', 'AWS_SECURITY_TOKEN': 'bar'},
|
{'AWS_SECRET_ACCESS_KEY': 'foo', 'AWS_SECURITY_TOKEN': 'bar'},
|
||||||
{'foo', 'bar'}
|
{'foo', 'bar'},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -66,19 +66,21 @@ def test_get_aws_secrets_from_env(env_vars, values):
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
'aws_config_with_secret.ini',
|
'aws_config_with_secret.ini',
|
||||||
{'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb'}
|
{'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb'},
|
||||||
),
|
),
|
||||||
('aws_config_with_session_token.ini', {'foo'}),
|
('aws_config_with_session_token.ini', {'foo'}),
|
||||||
('aws_config_with_secret_and_session_token.ini',
|
(
|
||||||
{'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb', 'foo'}),
|
'aws_config_with_secret_and_session_token.ini',
|
||||||
|
{'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb', 'foo'},
|
||||||
|
),
|
||||||
(
|
(
|
||||||
'aws_config_with_multiple_sections.ini',
|
'aws_config_with_multiple_sections.ini',
|
||||||
{
|
{
|
||||||
'7xebzorgm5143ouge9gvepxb2z70bsb2rtrh099e',
|
'7xebzorgm5143ouge9gvepxb2z70bsb2rtrh099e',
|
||||||
'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb',
|
'z2rpgs5uit782eapz5l1z0y2lurtsyyk6hcfozlb',
|
||||||
'ixswosj8gz3wuik405jl9k3vdajsnxfhnpui38ez',
|
'ixswosj8gz3wuik405jl9k3vdajsnxfhnpui38ez',
|
||||||
'foo'
|
'foo',
|
||||||
}
|
},
|
||||||
),
|
),
|
||||||
('aws_config_without_secrets.ini', set()),
|
('aws_config_without_secrets.ini', set()),
|
||||||
('nonsense.txt', set()),
|
('nonsense.txt', set()),
|
||||||
|
|
@ -121,7 +123,7 @@ def test_non_existent_credentials(mock_secrets_env, mock_secrets_file, capsys):
|
||||||
mock_secrets_file.return_value = set()
|
mock_secrets_file.return_value = set()
|
||||||
ret = main((
|
ret = main((
|
||||||
get_resource_path('aws_config_without_secrets.ini'),
|
get_resource_path('aws_config_without_secrets.ini'),
|
||||||
"--credentials-file=testing/resources/credentailsfilethatdoesntexist"
|
"--credentials-file=testing/resources/credentailsfilethatdoesntexist",
|
||||||
))
|
))
|
||||||
assert ret == 2
|
assert ret == 2
|
||||||
out, _ = capsys.readouterr()
|
out, _ = capsys.readouterr()
|
||||||
|
|
@ -141,6 +143,6 @@ def test_non_existent_credentials_with_allow_flag(mock_secrets_env, mock_secrets
|
||||||
ret = main((
|
ret = main((
|
||||||
get_resource_path('aws_config_without_secrets.ini'),
|
get_resource_path('aws_config_without_secrets.ini'),
|
||||||
"--credentials-file=testing/resources/credentailsfilethatdoesntexist",
|
"--credentials-file=testing/resources/credentailsfilethatdoesntexist",
|
||||||
"--allow-missing-credentials"
|
"--allow-missing-credentials",
|
||||||
))
|
))
|
||||||
assert ret == 0
|
assert ret == 0
|
||||||
|
|
|
||||||
33
tests/file_contents_sorter_test.py
Normal file
33
tests/file_contents_sorter_test.py
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from pre_commit_hooks.file_contents_sorter import FAIL
|
||||||
|
from pre_commit_hooks.file_contents_sorter import main
|
||||||
|
from pre_commit_hooks.file_contents_sorter import PASS
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
('input_s', 'expected_retval', 'output'),
|
||||||
|
(
|
||||||
|
(b'', FAIL, b'\n'),
|
||||||
|
(b'lonesome\n', PASS, b'lonesome\n'),
|
||||||
|
(b'missing_newline', FAIL, b'missing_newline\n'),
|
||||||
|
(b'newline\nmissing', FAIL, b'missing\nnewline\n'),
|
||||||
|
(b'missing\nnewline', FAIL, b'missing\nnewline\n'),
|
||||||
|
(b'alpha\nbeta\n', PASS, b'alpha\nbeta\n'),
|
||||||
|
(b'beta\nalpha\n', FAIL, b'alpha\nbeta\n'),
|
||||||
|
(b'C\nc\n', PASS, b'C\nc\n'),
|
||||||
|
(b'c\nC\n', FAIL, b'C\nc\n'),
|
||||||
|
(b'mag ical \n tre vor\n', FAIL, b' tre vor\nmag ical \n'),
|
||||||
|
(b'@\n-\n_\n#\n', FAIL, b'#\n-\n@\n_\n'),
|
||||||
|
(b'extra\n\n\nwhitespace\n', FAIL, b'extra\nwhitespace\n'),
|
||||||
|
(b'whitespace\n\n\nextra\n', FAIL, b'extra\nwhitespace\n'),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_integration(input_s, expected_retval, output, tmpdir):
|
||||||
|
path = tmpdir.join('file.txt')
|
||||||
|
path.write_binary(input_s)
|
||||||
|
|
||||||
|
output_retval = main([path.strpath])
|
||||||
|
|
||||||
|
assert path.read_binary() == output
|
||||||
|
assert output_retval == expected_retval
|
||||||
|
|
@ -56,7 +56,7 @@ def test_integration_remove_ok(tmpdir):
|
||||||
b'# -*- coding: utf-8 -*-\n'
|
b'# -*- coding: utf-8 -*-\n'
|
||||||
b'foo = "bar"\n'
|
b'foo = "bar"\n'
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
def test_ok_inputs(input_str):
|
def test_ok_inputs(input_str):
|
||||||
bytesio = io.BytesIO(input_str)
|
bytesio = io.BytesIO(input_str)
|
||||||
|
|
@ -100,7 +100,7 @@ def test_ok_inputs(input_str):
|
||||||
(b'#!/usr/bin/env python\n', b''),
|
(b'#!/usr/bin/env python\n', b''),
|
||||||
(b'#!/usr/bin/env python\n#coding: utf8\n', b''),
|
(b'#!/usr/bin/env python\n#coding: utf8\n', b''),
|
||||||
(b'#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n', b''),
|
(b'#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n', b''),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
def test_not_ok_inputs(input_str, output):
|
def test_not_ok_inputs(input_str, output):
|
||||||
bytesio = io.BytesIO(input_str)
|
bytesio = io.BytesIO(input_str)
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,14 @@ from pre_commit_hooks.forbid_new_submodules import main
|
||||||
def git_dir_with_git_dir(tmpdir):
|
def git_dir_with_git_dir(tmpdir):
|
||||||
with tmpdir.as_cwd():
|
with tmpdir.as_cwd():
|
||||||
cmd_output('git', 'init', '.')
|
cmd_output('git', 'init', '.')
|
||||||
cmd_output('git', 'commit', '-m', 'init', '--allow-empty')
|
cmd_output(
|
||||||
|
'git', 'commit', '-m', 'init', '--allow-empty', '--no-gpg-sign',
|
||||||
|
)
|
||||||
cmd_output('git', 'init', 'foo')
|
cmd_output('git', 'init', 'foo')
|
||||||
with tmpdir.join('foo').as_cwd():
|
cmd_output(
|
||||||
cmd_output('git', 'commit', '-m', 'init', '--allow-empty')
|
'git', 'commit', '-m', 'init', '--allow-empty', '--no-gpg-sign',
|
||||||
|
cwd=tmpdir.join('foo').strpath,
|
||||||
|
)
|
||||||
yield
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,43 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
def test_hooks_yaml_same_contents():
|
|
||||||
legacy_contents = io.open('hooks.yaml').read()
|
def _assert_parseable_in_old_pre_commit(hooks):
|
||||||
contents = io.open('.pre-commit-hooks.yaml').read()
|
for hook in hooks:
|
||||||
assert legacy_contents == contents
|
assert {'id', 'name', 'entry', 'files', 'language'} <= set(hook)
|
||||||
|
|
||||||
|
|
||||||
|
def test_legacy_hooks():
|
||||||
|
with io.open('hooks.yaml') as legacy_file:
|
||||||
|
legacy = yaml.load(legacy_file.read())
|
||||||
|
with io.open('.pre-commit-hooks.yaml') as hooks_file:
|
||||||
|
hooks = yaml.load(hooks_file.read())
|
||||||
|
|
||||||
|
# The same set of hooks should be defined in both files
|
||||||
|
new_hook_ids = {hook['id'] for hook in hooks}
|
||||||
|
legacy_hook_ids = {hook['id'] for hook in legacy}
|
||||||
|
assert new_hook_ids == legacy_hook_ids
|
||||||
|
|
||||||
|
# Both files should be parseable by pre-commit<0.15.0
|
||||||
|
_assert_parseable_in_old_pre_commit(legacy)
|
||||||
|
_assert_parseable_in_old_pre_commit(hooks)
|
||||||
|
|
||||||
|
# The legacy file should force upgrading
|
||||||
|
for hook in legacy:
|
||||||
|
del hook['id']
|
||||||
|
assert hook == {
|
||||||
|
'language': 'system',
|
||||||
|
'name': 'upgrade-your-pre-commit-version',
|
||||||
|
'entry': 'upgrade-your-pre-commit-version',
|
||||||
|
'files': '',
|
||||||
|
'minimum_pre_commit_version': '0.15.0',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Each hook should require a new version if it uses types
|
||||||
|
for hook in hooks:
|
||||||
|
if 'types' in hook:
|
||||||
|
assert hook['minimum_pre_commit_version'] == '0.15.0'
|
||||||
|
|
|
||||||
|
|
@ -17,35 +17,41 @@ def test_parse_indent():
|
||||||
parse_indent('-2')
|
parse_indent('-2')
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('not_pretty_formatted_json.json', 1),
|
('filename', 'expected_retval'), (
|
||||||
('unsorted_pretty_formatted_json.json', 1),
|
('not_pretty_formatted_json.json', 1),
|
||||||
('non_ascii_pretty_formatted_json.json', 1),
|
('unsorted_pretty_formatted_json.json', 1),
|
||||||
('pretty_formatted_json.json', 0),
|
('non_ascii_pretty_formatted_json.json', 1),
|
||||||
))
|
('pretty_formatted_json.json', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_pretty_format_json(filename, expected_retval):
|
def test_pretty_format_json(filename, expected_retval):
|
||||||
ret = pretty_format_json([get_resource_path(filename)])
|
ret = pretty_format_json([get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('not_pretty_formatted_json.json', 1),
|
('filename', 'expected_retval'), (
|
||||||
('unsorted_pretty_formatted_json.json', 0),
|
('not_pretty_formatted_json.json', 1),
|
||||||
('non_ascii_pretty_formatted_json.json', 1),
|
('unsorted_pretty_formatted_json.json', 0),
|
||||||
('pretty_formatted_json.json', 0),
|
('non_ascii_pretty_formatted_json.json', 1),
|
||||||
))
|
('pretty_formatted_json.json', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_unsorted_pretty_format_json(filename, expected_retval):
|
def test_unsorted_pretty_format_json(filename, expected_retval):
|
||||||
ret = pretty_format_json(['--no-sort-keys', get_resource_path(filename)])
|
ret = pretty_format_json(['--no-sort-keys', get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('filename', 'expected_retval'), (
|
@pytest.mark.parametrize(
|
||||||
('not_pretty_formatted_json.json', 1),
|
('filename', 'expected_retval'), (
|
||||||
('unsorted_pretty_formatted_json.json', 1),
|
('not_pretty_formatted_json.json', 1),
|
||||||
('non_ascii_pretty_formatted_json.json', 1),
|
('unsorted_pretty_formatted_json.json', 1),
|
||||||
('pretty_formatted_json.json', 1),
|
('non_ascii_pretty_formatted_json.json', 1),
|
||||||
('tab_pretty_formatted_json.json', 0),
|
('pretty_formatted_json.json', 1),
|
||||||
))
|
('tab_pretty_formatted_json.json', 0),
|
||||||
|
),
|
||||||
|
)
|
||||||
def test_tab_pretty_format_json(filename, expected_retval):
|
def test_tab_pretty_format_json(filename, expected_retval):
|
||||||
ret = pretty_format_json(['--indent', '\t', get_resource_path(filename)])
|
ret = pretty_format_json(['--indent', '\t', get_resource_path(filename)])
|
||||||
assert ret == expected_retval
|
assert ret == expected_retval
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,41 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from pre_commit_hooks.requirements_txt_fixer import FAIL
|
||||||
from pre_commit_hooks.requirements_txt_fixer import fix_requirements_txt
|
from pre_commit_hooks.requirements_txt_fixer import fix_requirements_txt
|
||||||
|
from pre_commit_hooks.requirements_txt_fixer import PASS
|
||||||
from pre_commit_hooks.requirements_txt_fixer import Requirement
|
from pre_commit_hooks.requirements_txt_fixer import Requirement
|
||||||
|
|
||||||
# Input, expected return value, expected output
|
|
||||||
TESTS = (
|
@pytest.mark.parametrize(
|
||||||
(b'foo\nbar\n', 1, b'bar\nfoo\n'),
|
('input_s', 'expected_retval', 'output'),
|
||||||
(b'bar\nfoo\n', 0, b'bar\nfoo\n'),
|
(
|
||||||
(b'#comment1\nfoo\n#comment2\nbar\n', 1, b'#comment2\nbar\n#comment1\nfoo\n'),
|
(b'', PASS, b''),
|
||||||
(b'#comment1\nbar\n#comment2\nfoo\n', 0, b'#comment1\nbar\n#comment2\nfoo\n'),
|
(b'\n', PASS, b'\n'),
|
||||||
(b'#comment\n\nfoo\nbar\n', 1, b'#comment\n\nbar\nfoo\n'),
|
(b'foo\nbar\n', FAIL, b'bar\nfoo\n'),
|
||||||
(b'#comment\n\nbar\nfoo\n', 0, b'#comment\n\nbar\nfoo\n'),
|
(b'bar\nfoo\n', PASS, b'bar\nfoo\n'),
|
||||||
(b'\nfoo\nbar\n', 1, b'bar\n\nfoo\n'),
|
(b'#comment1\nfoo\n#comment2\nbar\n', FAIL, b'#comment2\nbar\n#comment1\nfoo\n'),
|
||||||
(b'\nbar\nfoo\n', 0, b'\nbar\nfoo\n'),
|
(b'#comment1\nbar\n#comment2\nfoo\n', PASS, b'#comment1\nbar\n#comment2\nfoo\n'),
|
||||||
(b'pyramid==1\npyramid-foo==2\n', 0, b'pyramid==1\npyramid-foo==2\n'),
|
(b'#comment\n\nfoo\nbar\n', FAIL, b'#comment\n\nbar\nfoo\n'),
|
||||||
(b'ocflib\nDjango\nPyMySQL\n', 1, b'Django\nocflib\nPyMySQL\n'),
|
(b'#comment\n\nbar\nfoo\n', PASS, b'#comment\n\nbar\nfoo\n'),
|
||||||
(b'-e git+ssh://git_url@tag#egg=ocflib\nDjango\nPyMySQL\n', 1, b'Django\n-e git+ssh://git_url@tag#egg=ocflib\nPyMySQL\n'),
|
(b'\nfoo\nbar\n', FAIL, b'bar\n\nfoo\n'),
|
||||||
|
(b'\nbar\nfoo\n', PASS, b'\nbar\nfoo\n'),
|
||||||
|
(b'pyramid==1\npyramid-foo==2\n', PASS, b'pyramid==1\npyramid-foo==2\n'),
|
||||||
|
(b'ocflib\nDjango\nPyMySQL\n', FAIL, b'Django\nocflib\nPyMySQL\n'),
|
||||||
|
(
|
||||||
|
b'-e git+ssh://git_url@tag#egg=ocflib\nDjango\nPyMySQL\n',
|
||||||
|
FAIL,
|
||||||
|
b'Django\n-e git+ssh://git_url@tag#egg=ocflib\nPyMySQL\n',
|
||||||
|
),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(('input_s', 'expected_retval', 'output'), TESTS)
|
|
||||||
def test_integration(input_s, expected_retval, output, tmpdir):
|
def test_integration(input_s, expected_retval, output, tmpdir):
|
||||||
path = tmpdir.join('file.txt')
|
path = tmpdir.join('file.txt')
|
||||||
path.write_binary(input_s)
|
path.write_binary(input_s)
|
||||||
|
|
||||||
assert fix_requirements_txt([path.strpath]) == expected_retval
|
output_retval = fix_requirements_txt([path.strpath])
|
||||||
|
|
||||||
assert path.read_binary() == output
|
assert path.read_binary() == output
|
||||||
|
assert output_retval == expected_retval
|
||||||
|
|
||||||
|
|
||||||
def test_requirement_object():
|
def test_requirement_object():
|
||||||
|
|
|
||||||
120
tests/sort_simple_yaml_test.py
Normal file
120
tests/sort_simple_yaml_test.py
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from pre_commit_hooks.sort_simple_yaml import first_key
|
||||||
|
from pre_commit_hooks.sort_simple_yaml import main
|
||||||
|
from pre_commit_hooks.sort_simple_yaml import parse_block
|
||||||
|
from pre_commit_hooks.sort_simple_yaml import parse_blocks
|
||||||
|
from pre_commit_hooks.sort_simple_yaml import sort
|
||||||
|
|
||||||
|
RETVAL_GOOD = 0
|
||||||
|
RETVAL_BAD = 1
|
||||||
|
TEST_SORTS = [
|
||||||
|
(
|
||||||
|
['c: true', '', 'b: 42', 'a: 19'],
|
||||||
|
['b: 42', 'a: 19', '', 'c: true'],
|
||||||
|
RETVAL_BAD,
|
||||||
|
),
|
||||||
|
|
||||||
|
(
|
||||||
|
['# i am', '# a header', '', 'c: true', '', 'b: 42', 'a: 19'],
|
||||||
|
['# i am', '# a header', '', 'b: 42', 'a: 19', '', 'c: true'],
|
||||||
|
RETVAL_BAD,
|
||||||
|
),
|
||||||
|
|
||||||
|
(
|
||||||
|
['# i am', '# a header', '', 'already: sorted', '', 'yup: i am'],
|
||||||
|
['# i am', '# a header', '', 'already: sorted', '', 'yup: i am'],
|
||||||
|
RETVAL_GOOD,
|
||||||
|
),
|
||||||
|
|
||||||
|
(
|
||||||
|
['# i am', '# a header'],
|
||||||
|
['# i am', '# a header'],
|
||||||
|
RETVAL_GOOD,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('bad_lines,good_lines,retval', TEST_SORTS)
|
||||||
|
def test_integration_good_bad_lines(tmpdir, bad_lines, good_lines, retval):
|
||||||
|
file_path = os.path.join(tmpdir.strpath, 'foo.yaml')
|
||||||
|
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
f.write("\n".join(bad_lines) + "\n")
|
||||||
|
|
||||||
|
assert main([file_path]) == retval
|
||||||
|
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
assert [line.rstrip() for line in f.readlines()] == good_lines
|
||||||
|
|
||||||
|
|
||||||
|
def test_parse_header():
|
||||||
|
lines = ['# some header', '# is here', '', 'this is not a header']
|
||||||
|
assert parse_block(lines, header=True) == ['# some header', '# is here']
|
||||||
|
assert lines == ['', 'this is not a header']
|
||||||
|
|
||||||
|
lines = ['this is not a header']
|
||||||
|
assert parse_block(lines, header=True) == []
|
||||||
|
assert lines == ['this is not a header']
|
||||||
|
|
||||||
|
|
||||||
|
def test_parse_block():
|
||||||
|
# a normal block
|
||||||
|
lines = ['a: 42', 'b: 17', '', 'c: 19']
|
||||||
|
assert parse_block(lines) == ['a: 42', 'b: 17']
|
||||||
|
assert lines == ['', 'c: 19']
|
||||||
|
|
||||||
|
# a block at the end
|
||||||
|
lines = ['c: 19']
|
||||||
|
assert parse_block(lines) == ['c: 19']
|
||||||
|
assert lines == []
|
||||||
|
|
||||||
|
# no block
|
||||||
|
lines = []
|
||||||
|
assert parse_block(lines) == []
|
||||||
|
assert lines == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_parse_blocks():
|
||||||
|
# normal blocks
|
||||||
|
lines = ['a: 42', 'b: 17', '', 'c: 19']
|
||||||
|
assert parse_blocks(lines) == [['a: 42', 'b: 17'], ['c: 19']]
|
||||||
|
assert lines == []
|
||||||
|
|
||||||
|
# a single block
|
||||||
|
lines = ['a: 42', 'b: 17']
|
||||||
|
assert parse_blocks(lines) == [['a: 42', 'b: 17']]
|
||||||
|
assert lines == []
|
||||||
|
|
||||||
|
# no blocks
|
||||||
|
lines = []
|
||||||
|
assert parse_blocks(lines) == []
|
||||||
|
assert lines == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_first_key():
|
||||||
|
# first line
|
||||||
|
lines = ['a: 42', 'b: 17', '', 'c: 19']
|
||||||
|
assert first_key(lines) == 'a: 42'
|
||||||
|
|
||||||
|
# second line
|
||||||
|
lines = ['# some comment', 'a: 42', 'b: 17', '', 'c: 19']
|
||||||
|
assert first_key(lines) == 'a: 42'
|
||||||
|
|
||||||
|
# second line with quotes
|
||||||
|
lines = ['# some comment', '"a": 42', 'b: 17', '', 'c: 19']
|
||||||
|
assert first_key(lines) == 'a": 42'
|
||||||
|
|
||||||
|
# no lines
|
||||||
|
lines = []
|
||||||
|
assert first_key(lines) is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('bad_lines,good_lines,_', TEST_SORTS)
|
||||||
|
def test_sort(bad_lines, good_lines, _):
|
||||||
|
assert sort(bad_lines) == good_lines
|
||||||
|
|
@ -22,16 +22,20 @@ TESTS = (
|
||||||
# Docstring
|
# Docstring
|
||||||
('""" Foo """', '""" Foo """', 0),
|
('""" Foo """', '""" Foo """', 0),
|
||||||
(
|
(
|
||||||
textwrap.dedent("""
|
textwrap.dedent(
|
||||||
|
"""
|
||||||
x = " \\
|
x = " \\
|
||||||
foo \\
|
foo \\
|
||||||
"\n
|
"\n
|
||||||
"""),
|
""",
|
||||||
textwrap.dedent("""
|
),
|
||||||
|
textwrap.dedent(
|
||||||
|
"""
|
||||||
x = ' \\
|
x = ' \\
|
||||||
foo \\
|
foo \\
|
||||||
'\n
|
'\n
|
||||||
"""),
|
""",
|
||||||
|
),
|
||||||
1,
|
1,
|
||||||
),
|
),
|
||||||
('"foo""bar"', "'foo''bar'", 1),
|
('"foo""bar"', "'foo''bar'", 1),
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ def test_markdown_linebreak_ext_opt(filename, input_s, output, tmpdir):
|
||||||
path = tmpdir.join(filename)
|
path = tmpdir.join(filename)
|
||||||
path.write(input_s)
|
path.write(input_s)
|
||||||
ret = fix_trailing_whitespace((
|
ret = fix_trailing_whitespace((
|
||||||
'--markdown-linebreak-ext=TxT', path.strpath
|
'--markdown-linebreak-ext=TxT', path.strpath,
|
||||||
))
|
))
|
||||||
assert ret == 1
|
assert ret == 1
|
||||||
assert path.read() == output
|
assert path.read() == output
|
||||||
|
|
|
||||||
4
tox.ini
4
tox.ini
|
|
@ -1,7 +1,7 @@
|
||||||
[tox]
|
[tox]
|
||||||
project = pre_commit_hooks
|
project = pre_commit_hooks
|
||||||
# These should match the travis env list
|
# These should match the travis env list
|
||||||
envlist = py27,py34,py35,pypy
|
envlist = py27,py35,py36,pypy
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
deps = -rrequirements-dev.txt
|
deps = -rrequirements-dev.txt
|
||||||
|
|
@ -14,7 +14,7 @@ setenv =
|
||||||
commands =
|
commands =
|
||||||
coverage erase
|
coverage erase
|
||||||
coverage run -m pytest {posargs:tests}
|
coverage run -m pytest {posargs:tests}
|
||||||
coverage report --show-missing --fail-under 100
|
coverage report --fail-under 100
|
||||||
pre-commit install -f --install-hooks
|
pre-commit install -f --install-hooks
|
||||||
pre-commit run --all-files
|
pre-commit run --all-files
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue