summaryrefslogtreecommitdiff
path: root/python-vulture.spec
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-03-09 18:02:05 +0000
committerCoprDistGit <infra@openeuler.org>2023-03-09 18:02:05 +0000
commite64b6fe4bb5ed95d364f644c7fe6824310d38036 (patch)
tree6acb0379dfb376edfa05eda9649472a4f93ff9a5 /python-vulture.spec
parent42a6a22f4bfa4bcfc9acd151c96a40e71a29ac27 (diff)
automatic import of python-vulture
Diffstat (limited to 'python-vulture.spec')
-rw-r--r--python-vulture.spec2023
1 files changed, 2023 insertions, 0 deletions
diff --git a/python-vulture.spec b/python-vulture.spec
new file mode 100644
index 0000000..e76a1ec
--- /dev/null
+++ b/python-vulture.spec
@@ -0,0 +1,2023 @@
+%global _empty_manifest_terminate_build 0
+Name: python-vulture
+Version: 2.7
+Release: 1
+Summary: Find dead code
+License: MIT
+URL: https://github.com/jendrikseipp/vulture
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/de/ff/196ca63becc5faf5586202ab6e30102322adeea538bb45549d97ed38225d/vulture-2.7.tar.gz
+BuildArch: noarch
+
+Requires: python3-toml
+
+%description
+# Vulture - Find dead code
+
+![CI:Test](https://github.com/jendrikseipp/vulture/workflows/CI/badge.svg)
+[![Codecov Badge](https://codecov.io/gh/jendrikseipp/vulture/branch/main/graphs/badge.svg)](https://codecov.io/gh/jendrikseipp/vulture?branch=main)
+
+Vulture finds unused code in Python programs. This is useful for
+cleaning up and finding errors in large code bases. If you run Vulture
+on both your library and test suite you can find untested code.
+
+Due to Python's dynamic nature, static code analyzers like Vulture are
+likely to miss some dead code. Also, code that is only called implicitly
+may be reported as unused. Nonetheless, Vulture can be a very helpful
+tool for higher code quality.
+
+## Features
+
+* fast: uses static code analysis
+* tested: tests itself and has complete test coverage
+* complements pyflakes and has the same output syntax
+* sorts unused classes and functions by size with `--sort-by-size`
+* supports Python \>= 3.6
+
+## Installation
+
+ $ pip install vulture
+
+## Usage
+
+ $ vulture myscript.py # or
+ $ python3 -m vulture myscript.py
+ $ vulture myscript.py mypackage/
+ $ vulture myscript.py --min-confidence 100 # Only report 100% dead code.
+
+The provided arguments may be Python files or directories. For each
+directory Vulture analyzes all contained
+<span class="title-ref">\*.py</span> files.
+
+After you have found and deleted dead code, run Vulture again, because
+it may discover more dead code.
+
+## Types of unused code
+
+In addition to finding unused functions, classes, etc., Vulture can detect
+unreachable code. Each chunk of dead code is assigned a *confidence value*
+between 60% and 100%, where a value of 100% signals that it is certain that the
+code won't be executed. Values below 100% are *very rough* estimates (based on
+the type of code chunk) for how likely it is that the code is unused.
+
+| Code type | Confidence value |
+| ------------------- | -- |
+| function/method/class argument, unreachable code | 100% |
+| import | 90% |
+| attribute, class, function, method, property, variable | 60% |
+
+You can use the `--min-confidence` flag to set the minimum confidence
+for code to be reported as unused. Use `--min-confidence 100` to only
+report code that is guaranteed to be unused within the analyzed files.
+
+## Handling false positives
+
+When Vulture incorrectly reports chunks of code as unused, you have
+several options for suppressing the false positives. If fixing your false
+positives could benefit other users as well, please file an issue report.
+
+#### Whitelists
+
+The recommended option is to add used code that is reported as unused to a
+Python module and add it to the list of scanned paths. To obtain such a
+whitelist automatically, pass `--make-whitelist` to Vulture:
+
+ $ vulture mydir --make-whitelist > whitelist.py
+ $ vulture mydir whitelist.py
+
+Note that the resulting `whitelist.py` file will contain valid Python
+syntax, but for Python to be able to *run* it, you will usually have to
+make some modifications.
+
+We collect whitelists for common Python modules and packages in
+`vulture/whitelists/` (pull requests are welcome).
+
+#### Ignoring files
+
+If you want to ignore a whole file or directory, use the `--exclude` parameter
+(e.g., `--exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"`). The
+exclude patterns are matched against absolute paths.
+
+#### Flake8 noqa comments
+
+<!-- Hide noqa docs until we decide whether we want to support it.
+Another way of ignoring errors is to annotate the line causing the false
+positive with `# noqa: <ERROR_CODE>` in a trailing comment (e.g., `#
+noqa: V103`). The `ERROR_CODE` specifies what kind of dead code to
+ignore (see the table below for the list of error codes). In case no
+error code is specified, Vulture ignores all results for the line.
+(Note that the line number for decorated objects is the line number of
+the first decorator.)
+-->
+
+For compatibility with [flake8](https://flake8.pycqa.org/), Vulture
+supports the [F401 and
+F841](https://flake8.pycqa.org/en/latest/user/error-codes.html) error
+codes for ignoring unused imports (`# noqa: F401`) and unused local
+variables (`# noqa: F841`). However, we recommend using whitelists instead
+of `noqa` comments, since `noqa` comments add visual noise to the code and
+make it harder to read.
+
+#### Ignoring names
+
+You can use `--ignore-names foo*,ba[rz]` to let Vulture ignore all names
+starting with `foo` and the names `bar` and `baz`. Additionally, the
+`--ignore-decorators` option can be used to ignore functions decorated
+with the given decorator. This is helpful for example in Flask projects,
+where you can use `--ignore-decorators "@app.route"` to ignore all
+functions with the `@app.route` decorator.
+
+We recommend using whitelists instead of `--ignore-names` or
+`--ignore-decorators` whenever possible, since whitelists are
+automatically checked for syntactic correctness when passed to Vulture
+and often you can even pass them to your Python interpreter and let it
+check that all whitelisted code actually still exists in your project.
+
+#### Marking unused variables
+
+There are situations where you can't just remove unused variables, e.g.,
+in function signatures. The recommended solution is to use the `del`
+keyword as described in the
+[PyLint manual](http://pylint-messages.wikidot.com/messages:w0613) and on
+[StackOverflow](https://stackoverflow.com/a/14836005):
+
+```python
+def foo(x, y):
+ del y
+ return x + 3
+```
+
+Vulture will also ignore all variables that start with an underscore, so
+you can use `_x, y = get_pos()` to mark unused tuple assignments or
+function arguments, e.g., `def foo(x, _y)`.
+
+#### Minimum confidence
+
+Raise the minimum [confidence value](#types-of-unused-code) with the `--min-confidence` flag.
+
+#### Unreachable code
+
+If Vulture complains about code like `if False:`, you can use a Boolean
+flag `debug = False` and write `if debug:` instead. This makes the code
+more readable and silences Vulture.
+
+#### Forward references for type annotations
+
+See [#216](https://github.com/jendrikseipp/vulture/issues/216). For
+example, instead of `def foo(arg: "Sequence"): ...`, we recommend using
+
+``` python
+from __future__ import annotations
+
+def foo(arg: Sequence):
+ ...
+```
+
+if you're using Python 3.7+.
+
+
+## Configuration
+
+You can also store command line arguments in `pyproject.toml` under the
+`tool.vulture` section. Simply remove leading dashes and replace all
+remaining dashes with underscores.
+
+Options given on the command line have precedence over options in
+`pyproject.toml`.
+
+Example Config:
+
+``` toml
+[tool.vulture]
+exclude = ["*file*.py", "dir/"]
+ignore_decorators = ["@app.route", "@require_*"]
+ignore_names = ["visit_*", "do_*"]
+make_whitelist = true
+min_confidence = 80
+paths = ["myscript.py", "mydir"]
+sort_by_size = true
+verbose = true
+```
+
+## Version control integration
+
+You can use a [pre-commit](https://pre-commit.com/#install) hook to run
+Vulture before each commit. For this, install pre-commit and add the
+following to the `.pre-commit-config.yaml` file in your repository:
+
+```yaml
+repos:
+ - repo: https://github.com/jendrikseipp/vulture
+ rev: 'v2.3' # or any later Vulture version
+ hooks:
+ - id: vulture
+```
+
+Then run `pre-commit install`. Finally, create a `pyproject.toml` file
+in your repository and specify all files that Vulture should check under
+`[tool.vulture] --> paths` (see above).
+
+## How does it work?
+
+Vulture uses the `ast` module to build abstract syntax trees for all
+given files. While traversing all syntax trees it records the names of
+defined and used objects. Afterwards, it reports the objects which have
+been defined, but not used. This analysis ignores scopes and only takes
+object names into account.
+
+Vulture also detects unreachable code by looking for code after
+`return`, `break`, `continue` and `raise` statements, and by searching
+for unsatisfiable `if`- and `while`-conditions.
+
+## Sort by size
+
+When using the `--sort-by-size` option, Vulture sorts unused code by its
+number of lines. This helps developers prioritize where to look for dead
+code first.
+
+## Examples
+
+Consider the following Python script (`dead_code.py`):
+
+``` python
+import os
+
+class Greeter:
+ def greet(self):
+ print("Hi")
+
+def hello_world():
+ message = "Hello, world!"
+ greeter = Greeter()
+ func_name = "greet"
+ greet_func = getattr(greeter, func_name)
+ greet_func()
+
+if __name__ == "__main__":
+ hello_world()
+```
+
+Calling :
+
+ $ vulture dead_code.py
+
+results in the following output:
+
+ dead_code.py:1: unused import 'os' (90% confidence)
+ dead_code.py:4: unused function 'greet' (60% confidence)
+ dead_code.py:8: unused variable 'message' (60% confidence)
+
+Vulture correctly reports `os` and `message` as unused but it fails to
+detect that `greet` is actually used. The recommended method to deal
+with false positives like this is to create a whitelist Python file.
+
+**Preparing whitelists**
+
+In a whitelist we simulate the usage of variables, attributes, etc. For
+the program above, a whitelist could look as follows:
+
+``` python
+# whitelist_dead_code.py
+from dead_code import Greeter
+Greeter.greet
+```
+
+Alternatively, you can pass `--make-whitelist` to Vulture and obtain an
+automatically generated whitelist.
+
+Passing both the original program and the whitelist to Vulture
+
+ $ vulture dead_code.py whitelist_dead_code.py
+
+makes Vulture ignore the `greet` method:
+
+ dead_code.py:1: unused import 'os' (90% confidence)
+ dead_code.py:8: unused variable 'message' (60% confidence)
+
+<!-- Hide noqa docs until we decide whether we want to support it.
+**Using "# noqa"**
+
+```python
+import os # noqa
+
+class Greeter: # noqa: V102
+ def greet(self): # noqa: V103
+ print("Hi")
+```
+
+## Error codes
+
+For compatibility with [flake8](https://flake8.pycqa.org/), Vulture
+supports the [F401 and
+F841](https://flake8.pycqa.org/en/latest/user/error-codes.html) error
+codes.
+
+| Error codes | Description |
+| ----------- | ----------------- |
+| V101 | Unused attribute |
+| V102 | Unused class |
+| V103 | Unused function |
+| V104, F401 | Unused import |
+| V105 | Unused property |
+| V106 | Unused method |
+| V107, F841 | Unused variable |
+| V201 | Unreachable code |
+
+-->
+
+## Exit codes
+
+| Exit code | Description |
+| --------- | ------------------------------------------------------------- |
+| 0 | No dead code found |
+| 1 | Dead code found |
+| 1 | Invalid input (file missing, syntax error, wrong encoding) |
+| 2 | Invalid command line arguments |
+
+## Similar programs
+
+ - [pyflakes](https://pypi.org/project/pyflakes/) finds unused imports
+ and unused local variables (in addition to many other programmatic
+ errors).
+ - [coverage](https://pypi.org/project/coverage/) finds unused code
+ more reliably than Vulture, but requires all branches of the code to
+ actually be run.
+ - [uncalled](https://pypi.org/project/uncalled/) finds dead code by
+ using the abstract syntax tree (like Vulture), regular expressions,
+ or both.
+ - [dead](https://pypi.org/project/dead/) finds dead code by using the
+ abstract syntax tree (like Vulture).
+
+## Participate
+
+Please visit <https://github.com/jendrikseipp/vulture> to report any
+issues or to make pull requests.
+
+ - Contributing guide:
+ [CONTRIBUTING.md](https://github.com/jendrikseipp/vulture/blob/main/CONTRIBUTING.md)
+ - Release notes:
+ [CHANGELOG.md](https://github.com/jendrikseipp/vulture/blob/main/CHANGELOG.md)
+ - Roadmap:
+ [TODO.md](https://github.com/jendrikseipp/vulture/blob/main/TODO.md)
+
+
+# 2.7 (2023-01-08)
+
+* Ignore `setup_module()`, `teardown_module()`, etc. in pytest `test_*.py` files (Jendrik Seipp).
+* Add whitelist for `socketserver.TCPServer.allow_reuse_address` (Ben Elliston).
+* Clarify that `--exclude` patterns are matched against absolute paths (Jendrik Seipp, #260).
+* Fix example in README file (Jendrik Seipp, #272).
+
+# 2.6 (2022-09-19)
+
+* Add basic `match` statement support (kreathon, #276, #291).
+
+# 2.5 (2022-07-03)
+
+* Mark imports in `__all__` as used (kreathon, #172, #282).
+* Add whitelist for `pint.UnitRegistry.default_formatter` (Ben Elliston, #258).
+
+# 2.4 (2022-05-19)
+
+* Print absolute filepaths as relative again (as in version 2.1 and before)
+ if they are below the current directory (The-Compiler, #246).
+* Run tests and add PyPI trove for Python 3.10 (chayim, #266).
+* Allow using the `del` keyword to mark unused variables (sshishov, #279).
+
+# 2.3 (2021-01-16)
+
+* Add [pre-commit](https://pre-commit.com) hook (Clément Robert, #244).
+
+# 2.2 (2021-01-15)
+
+* Only parse format strings when being used with `locals()` (jingw, #225).
+* Don't override paths in pyproject.toml with empty CLI paths (bcbnz, #228).
+* Run continuous integration tests for Python 3.9 (ju-sh, #232).
+* Use pathlib internally (ju-sh, #226).
+
+# 2.1 (2020-08-19)
+
+* Treat `getattr/hasattr(obj, "constant_string", ...)` as a reference to
+ `obj.constant_string` (jingw, #219).
+* Fix false positives when assigning to `x.some_name` but reading via
+ `some_name`, at the cost of potential false negatives (jingw, #221).
+* Allow reading options from `pyproject.toml` (Michel Albert, #164, #215).
+
+# 2.0 (2020-08-11)
+
+* Parse `# type: ...` comments if on Python 3.8+ (jingw, #220).
+* Bump minimum Python version to 3.6 (Jendrik Seipp, #218). The last
+ Vulture release that supports Python 2.7 and Python 3.5 is version 1.6.
+* Consider all files under `test` or `tests` directories test files
+ (Jendrik Seipp).
+* Ignore `logging.Logger.propagate` attribute (Jendrik Seipp).
+
+# 1.6 (2020-07-28)
+
+* Differentiate between functions and methods (Jendrik Seipp, #112, #209).
+* Move from Travis to GitHub actions (RJ722, #211).
+
+# 1.5 (2020-05-24)
+
+* Support flake8 "noqa" error codes F401 (unused import) and F841 (unused
+ local variable) (RJ722, #195).
+* Detect unreachable code in conditional expressions
+ (Agathiyan Bragadeesh, #178).
+
+# 1.4 (2020-03-30)
+
+* Ignore unused import statements in `__init__.py` (RJ722, #192).
+* Report first decorator's line number for unused decorated objects on
+ Python 3.8+ (RJ722, #200).
+* Check code with black and pyupgrade.
+
+# 1.3 (2020-02-03)
+
+* Detect redundant 'if' conditions without 'else' blocks.
+* Add whitelist for `string.Formatter` (Joseph Bylund, #183).
+
+# 1.2 (2019-11-22)
+
+* Fix tests for Python 3.8 (#166).
+* Use new `Constant` AST node under Python 3.8+ (#175).
+* Add test for f-strings (#177).
+* Add whitelist for `logging` module.
+
+# 1.1 (2019-09-23)
+
+* Add `sys.excepthook` to `sys` whitelist.
+* Add whitelist for `ctypes` module.
+* Check that type annotations are parsed and type comments are ignored
+ (thanks @kx-chen).
+* Support checking files with BOM under Python 2.7 (#170).
+
+# 1.0 (2018-10-23)
+
+* Add `--ignore-decorators` flag (thanks @RJ722).
+* Add whitelist for `threading` module (thanks @andrewhalle).
+
+# 0.29 (2018-07-31)
+
+* Add `--ignore-names` flag for ignoring names matching the given glob
+ patterns (thanks @RJ722).
+
+# 0.28 (2018-07-05)
+
+* Add `--make-whitelist` flag for reporting output in whitelist format
+ (thanks @RJ722).
+* Ignore case of `--exclude` arguments on Windows.
+* Add `*-test.py` to recognized test file patterns.
+* Add `failureException`, `longMessage` and `maxDiff` to `unittest`
+ whitelist.
+* Refer to actual objects rather than their mocks in default
+ whitelists (thanks @RJ722).
+* Don't import any Vulture modules in setup.py (thanks @RJ722).
+
+# 0.27 (2018-06-05)
+
+* Report `while (True): ... else: ...` as unreachable (thanks @RJ722).
+* Use `argparse` instead of `optparse`.
+* Whitelist Mock.return\_value and Mock.side\_effect in unittest.mock
+ module.
+* Drop support for Python 2.6 and 3.3.
+* Improve documentation and test coverage (thanks @RJ722).
+
+# 0.26 (2017-08-28)
+
+* Detect `async` function definitions (thanks @RJ722).
+* Add `Item.get_report()` method (thanks @RJ722).
+* Move method for finding Python modules out of Vulture class.
+
+# 0.25 (2017-08-15)
+
+* Detect unsatisfiable statements containing `and`, `or` and `not`.
+* Use filenames and line numbers as tie-breakers when sorting by size.
+* Store first and last line numbers in Item objects.
+* Pass relevant options directly to `scavenge()` and `report()`.
+
+# 0.24 (2017-08-14)
+
+* Detect unsatisfiable `while`-conditions (thanks @RJ722).
+* Detect unsatisfiable `if`- and `else`-conditions (thanks @RJ722).
+* Handle null bytes in source code.
+
+# 0.23 (2017-08-10)
+
+* Add `--min-confidence` flag (thanks @RJ722).
+
+# 0.22 (2017-08-04)
+
+* Detect unreachable code after `return`, `break`, `continue` and
+ `raise` (thanks @RJ722).
+* Parse all variable and attribute names in new format strings.
+* Extend ast whitelist.
+
+# 0.21 (2017-07-26)
+
+* If an unused item is defined multiple times, report it multiple
+ times.
+* Make size estimates for function calls more accurate.
+* Create wheel files for Vulture (thanks @RJ722).
+
+# 0.20 (2017-07-26)
+
+* Report unused tuple assignments as dead code.
+* Report attribute names that have the same names as variables as dead
+ code.
+* Let Item class inherit from `object` (thanks @RJ722).
+* Handle names imported as aliases like all other used variable names.
+* Rename Vulture.used\_vars to Vulture.used\_names.
+* Use function for determining which imports to ignore.
+* Only try to import each whitelist file once.
+* Store used names and used attributes in sets instead of lists.
+* Fix estimating the size of code containing ellipses (...).
+* Refactor and simplify code.
+
+# 0.19 (2017-07-20)
+
+* Don't ignore <span class="title-ref">\_\_foo</span> variable names.
+* Use separate methods for determining whether to ignore classes and
+ functions.
+* Only try to find a whitelist for each defined import once (thanks
+ @roivanov).
+* Fix finding the last child for many types of AST nodes.
+
+# 0.18 (2017-07-17)
+
+* Make <span class="title-ref">--sort-by-size</span> faster and more
+ accurate (thanks @RJ722).
+
+# 0.17 (2017-07-17)
+
+* Add <span class="title-ref">get\_unused\_code()</span> method.
+* Return with exit code 1 when syntax errors are found or files can't
+ be read.
+
+# 0.16 (2017-07-12)
+
+* Differentiate between unused classes and functions (thanks @RJ722).
+* Add --sort-by-size option (thanks @jackric and @RJ722).
+* Count imports as used if they are accessed as module attributes.
+
+# 0.15 (2017-07-04)
+
+* Automatically include whitelists based on imported modules (thanks
+ @RJ722).
+* Add --version parameter (thanks @RJ722).
+* Add appveyor tests for testing on Windows (thanks @RJ722).
+
+# 0.14 (2017-04-06)
+
+* Add stub whitelist file for Python standard library (thanks @RJ722)
+* Ignore class names starting with "Test" in "test\_" files (thanks
+ @thisch).
+* Ignore "test\_" functions only in "test\_" files.
+
+# 0.13 (2017-03-06)
+
+* Ignore star-imported names since we cannot detect whether they are
+ used.
+* Move repository to GitHub.
+
+# 0.12 (2017-01-05)
+
+* Detect unused imports.
+* Use tokenize.open() on Python \>= 3.2 for reading input files,
+ assume UTF-8 encoding on older Python versions.
+
+# 0.11 (2016-11-27)
+
+* Use the system's default encoding when reading files.
+* Report syntax errors instead of aborting.
+
+# 0.10 (2016-07-14)
+
+* Detect unused function and method arguments (issue #15).
+* Detect unused \*args and \*\*kwargs parameters.
+* Change license from GPL to MIT.
+
+# 0.9 (2016-06-29)
+
+* Don't flag attributes as unused if they are used as global variables
+ in another module (thanks Florian Bruhin).
+* Don't consider "True" and "False" variable names.
+* Abort with error message when invoked on .pyc files.
+
+# 0.8.1 (2015-09-28)
+
+* Fix code for Python 3.
+
+# 0.8 (2015-09-28)
+
+* Do not flag names imported with "import as" as dead code (thanks Tom
+ Terrace).
+
+# 0.7 (2015-09-26)
+
+* Exit with exitcode 1 if path on commandline can't be found.
+* Test vulture with vulture using a whitelist module for false
+ positives.
+* Add tests that run vulture as a script.
+* Add "python setup.py test" command for running tests.
+* Add support for tox.
+* Raise test coverage to 100%.
+* Remove ez\_setup.py.
+
+# 0.6 (2014-09-06)
+
+* Ignore function names starting with "test\_".
+* Parse variable names in new format strings (e.g. "This is
+ {x}".format(x="nice")).
+* Only parse alphanumeric variable names in format strings and ignore
+ types.
+* Abort with exit code 1 on syntax errors.
+* Support installation under Windows by using setuptools (thanks
+ Reuben Fletcher-Costin).
+
+# 0.5 (2014-05-09)
+
+* If dead code is found, exit with 1.
+
+# 0.4.1 (2013-09-17)
+
+* Only warn if a path given on the command line cannot be found.
+
+# 0.4 (2013-06-23)
+
+* Ignore unused variables starting with an underscore.
+* Show warning for syntax errors instead of aborting directly.
+* Print warning if a file cannot be found.
+
+# 0.3 (2012-03-19)
+
+* Add support for python3
+* Report unused attributes
+* Find tuple assignments in comprehensions
+* Scan files given on the command line even if they don't end with .py
+
+# 0.2 (2012-03-18)
+
+* Only format nodes in verbose mode (gives 4x speedup).
+
+# 0.1 (2012-03-17)
+
+* First release.
+
+
+%package -n python3-vulture
+Summary: Find dead code
+Provides: python-vulture
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-vulture
+# Vulture - Find dead code
+
+![CI:Test](https://github.com/jendrikseipp/vulture/workflows/CI/badge.svg)
+[![Codecov Badge](https://codecov.io/gh/jendrikseipp/vulture/branch/main/graphs/badge.svg)](https://codecov.io/gh/jendrikseipp/vulture?branch=main)
+
+Vulture finds unused code in Python programs. This is useful for
+cleaning up and finding errors in large code bases. If you run Vulture
+on both your library and test suite you can find untested code.
+
+Due to Python's dynamic nature, static code analyzers like Vulture are
+likely to miss some dead code. Also, code that is only called implicitly
+may be reported as unused. Nonetheless, Vulture can be a very helpful
+tool for higher code quality.
+
+## Features
+
+* fast: uses static code analysis
+* tested: tests itself and has complete test coverage
+* complements pyflakes and has the same output syntax
+* sorts unused classes and functions by size with `--sort-by-size`
+* supports Python \>= 3.6
+
+## Installation
+
+ $ pip install vulture
+
+## Usage
+
+ $ vulture myscript.py # or
+ $ python3 -m vulture myscript.py
+ $ vulture myscript.py mypackage/
+ $ vulture myscript.py --min-confidence 100 # Only report 100% dead code.
+
+The provided arguments may be Python files or directories. For each
+directory Vulture analyzes all contained
+<span class="title-ref">\*.py</span> files.
+
+After you have found and deleted dead code, run Vulture again, because
+it may discover more dead code.
+
+## Types of unused code
+
+In addition to finding unused functions, classes, etc., Vulture can detect
+unreachable code. Each chunk of dead code is assigned a *confidence value*
+between 60% and 100%, where a value of 100% signals that it is certain that the
+code won't be executed. Values below 100% are *very rough* estimates (based on
+the type of code chunk) for how likely it is that the code is unused.
+
+| Code type | Confidence value |
+| ------------------- | -- |
+| function/method/class argument, unreachable code | 100% |
+| import | 90% |
+| attribute, class, function, method, property, variable | 60% |
+
+You can use the `--min-confidence` flag to set the minimum confidence
+for code to be reported as unused. Use `--min-confidence 100` to only
+report code that is guaranteed to be unused within the analyzed files.
+
+## Handling false positives
+
+When Vulture incorrectly reports chunks of code as unused, you have
+several options for suppressing the false positives. If fixing your false
+positives could benefit other users as well, please file an issue report.
+
+#### Whitelists
+
+The recommended option is to add used code that is reported as unused to a
+Python module and add it to the list of scanned paths. To obtain such a
+whitelist automatically, pass `--make-whitelist` to Vulture:
+
+ $ vulture mydir --make-whitelist > whitelist.py
+ $ vulture mydir whitelist.py
+
+Note that the resulting `whitelist.py` file will contain valid Python
+syntax, but for Python to be able to *run* it, you will usually have to
+make some modifications.
+
+We collect whitelists for common Python modules and packages in
+`vulture/whitelists/` (pull requests are welcome).
+
+#### Ignoring files
+
+If you want to ignore a whole file or directory, use the `--exclude` parameter
+(e.g., `--exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"`). The
+exclude patterns are matched against absolute paths.
+
+#### Flake8 noqa comments
+
+<!-- Hide noqa docs until we decide whether we want to support it.
+Another way of ignoring errors is to annotate the line causing the false
+positive with `# noqa: <ERROR_CODE>` in a trailing comment (e.g., `#
+noqa: V103`). The `ERROR_CODE` specifies what kind of dead code to
+ignore (see the table below for the list of error codes). In case no
+error code is specified, Vulture ignores all results for the line.
+(Note that the line number for decorated objects is the line number of
+the first decorator.)
+-->
+
+For compatibility with [flake8](https://flake8.pycqa.org/), Vulture
+supports the [F401 and
+F841](https://flake8.pycqa.org/en/latest/user/error-codes.html) error
+codes for ignoring unused imports (`# noqa: F401`) and unused local
+variables (`# noqa: F841`). However, we recommend using whitelists instead
+of `noqa` comments, since `noqa` comments add visual noise to the code and
+make it harder to read.
+
+#### Ignoring names
+
+You can use `--ignore-names foo*,ba[rz]` to let Vulture ignore all names
+starting with `foo` and the names `bar` and `baz`. Additionally, the
+`--ignore-decorators` option can be used to ignore functions decorated
+with the given decorator. This is helpful for example in Flask projects,
+where you can use `--ignore-decorators "@app.route"` to ignore all
+functions with the `@app.route` decorator.
+
+We recommend using whitelists instead of `--ignore-names` or
+`--ignore-decorators` whenever possible, since whitelists are
+automatically checked for syntactic correctness when passed to Vulture
+and often you can even pass them to your Python interpreter and let it
+check that all whitelisted code actually still exists in your project.
+
+#### Marking unused variables
+
+There are situations where you can't just remove unused variables, e.g.,
+in function signatures. The recommended solution is to use the `del`
+keyword as described in the
+[PyLint manual](http://pylint-messages.wikidot.com/messages:w0613) and on
+[StackOverflow](https://stackoverflow.com/a/14836005):
+
+```python
+def foo(x, y):
+ del y
+ return x + 3
+```
+
+Vulture will also ignore all variables that start with an underscore, so
+you can use `_x, y = get_pos()` to mark unused tuple assignments or
+function arguments, e.g., `def foo(x, _y)`.
+
+#### Minimum confidence
+
+Raise the minimum [confidence value](#types-of-unused-code) with the `--min-confidence` flag.
+
+#### Unreachable code
+
+If Vulture complains about code like `if False:`, you can use a Boolean
+flag `debug = False` and write `if debug:` instead. This makes the code
+more readable and silences Vulture.
+
+#### Forward references for type annotations
+
+See [#216](https://github.com/jendrikseipp/vulture/issues/216). For
+example, instead of `def foo(arg: "Sequence"): ...`, we recommend using
+
+``` python
+from __future__ import annotations
+
+def foo(arg: Sequence):
+ ...
+```
+
+if you're using Python 3.7+.
+
+
+## Configuration
+
+You can also store command line arguments in `pyproject.toml` under the
+`tool.vulture` section. Simply remove leading dashes and replace all
+remaining dashes with underscores.
+
+Options given on the command line have precedence over options in
+`pyproject.toml`.
+
+Example Config:
+
+``` toml
+[tool.vulture]
+exclude = ["*file*.py", "dir/"]
+ignore_decorators = ["@app.route", "@require_*"]
+ignore_names = ["visit_*", "do_*"]
+make_whitelist = true
+min_confidence = 80
+paths = ["myscript.py", "mydir"]
+sort_by_size = true
+verbose = true
+```
+
+## Version control integration
+
+You can use a [pre-commit](https://pre-commit.com/#install) hook to run
+Vulture before each commit. For this, install pre-commit and add the
+following to the `.pre-commit-config.yaml` file in your repository:
+
+```yaml
+repos:
+ - repo: https://github.com/jendrikseipp/vulture
+ rev: 'v2.3' # or any later Vulture version
+ hooks:
+ - id: vulture
+```
+
+Then run `pre-commit install`. Finally, create a `pyproject.toml` file
+in your repository and specify all files that Vulture should check under
+`[tool.vulture] --> paths` (see above).
+
+## How does it work?
+
+Vulture uses the `ast` module to build abstract syntax trees for all
+given files. While traversing all syntax trees it records the names of
+defined and used objects. Afterwards, it reports the objects which have
+been defined, but not used. This analysis ignores scopes and only takes
+object names into account.
+
+Vulture also detects unreachable code by looking for code after
+`return`, `break`, `continue` and `raise` statements, and by searching
+for unsatisfiable `if`- and `while`-conditions.
+
+## Sort by size
+
+When using the `--sort-by-size` option, Vulture sorts unused code by its
+number of lines. This helps developers prioritize where to look for dead
+code first.
+
+## Examples
+
+Consider the following Python script (`dead_code.py`):
+
+``` python
+import os
+
+class Greeter:
+ def greet(self):
+ print("Hi")
+
+def hello_world():
+ message = "Hello, world!"
+ greeter = Greeter()
+ func_name = "greet"
+ greet_func = getattr(greeter, func_name)
+ greet_func()
+
+if __name__ == "__main__":
+ hello_world()
+```
+
+Calling :
+
+ $ vulture dead_code.py
+
+results in the following output:
+
+ dead_code.py:1: unused import 'os' (90% confidence)
+ dead_code.py:4: unused function 'greet' (60% confidence)
+ dead_code.py:8: unused variable 'message' (60% confidence)
+
+Vulture correctly reports `os` and `message` as unused but it fails to
+detect that `greet` is actually used. The recommended method to deal
+with false positives like this is to create a whitelist Python file.
+
+**Preparing whitelists**
+
+In a whitelist we simulate the usage of variables, attributes, etc. For
+the program above, a whitelist could look as follows:
+
+``` python
+# whitelist_dead_code.py
+from dead_code import Greeter
+Greeter.greet
+```
+
+Alternatively, you can pass `--make-whitelist` to Vulture and obtain an
+automatically generated whitelist.
+
+Passing both the original program and the whitelist to Vulture
+
+ $ vulture dead_code.py whitelist_dead_code.py
+
+makes Vulture ignore the `greet` method:
+
+ dead_code.py:1: unused import 'os' (90% confidence)
+ dead_code.py:8: unused variable 'message' (60% confidence)
+
+<!-- Hide noqa docs until we decide whether we want to support it.
+**Using "# noqa"**
+
+```python
+import os # noqa
+
+class Greeter: # noqa: V102
+ def greet(self): # noqa: V103
+ print("Hi")
+```
+
+## Error codes
+
+For compatibility with [flake8](https://flake8.pycqa.org/), Vulture
+supports the [F401 and
+F841](https://flake8.pycqa.org/en/latest/user/error-codes.html) error
+codes.
+
+| Error codes | Description |
+| ----------- | ----------------- |
+| V101 | Unused attribute |
+| V102 | Unused class |
+| V103 | Unused function |
+| V104, F401 | Unused import |
+| V105 | Unused property |
+| V106 | Unused method |
+| V107, F841 | Unused variable |
+| V201 | Unreachable code |
+
+-->
+
+## Exit codes
+
+| Exit code | Description |
+| --------- | ------------------------------------------------------------- |
+| 0 | No dead code found |
+| 1 | Dead code found |
+| 1 | Invalid input (file missing, syntax error, wrong encoding) |
+| 2 | Invalid command line arguments |
+
+## Similar programs
+
+ - [pyflakes](https://pypi.org/project/pyflakes/) finds unused imports
+ and unused local variables (in addition to many other programmatic
+ errors).
+ - [coverage](https://pypi.org/project/coverage/) finds unused code
+ more reliably than Vulture, but requires all branches of the code to
+ actually be run.
+ - [uncalled](https://pypi.org/project/uncalled/) finds dead code by
+ using the abstract syntax tree (like Vulture), regular expressions,
+ or both.
+ - [dead](https://pypi.org/project/dead/) finds dead code by using the
+ abstract syntax tree (like Vulture).
+
+## Participate
+
+Please visit <https://github.com/jendrikseipp/vulture> to report any
+issues or to make pull requests.
+
+ - Contributing guide:
+ [CONTRIBUTING.md](https://github.com/jendrikseipp/vulture/blob/main/CONTRIBUTING.md)
+ - Release notes:
+ [CHANGELOG.md](https://github.com/jendrikseipp/vulture/blob/main/CHANGELOG.md)
+ - Roadmap:
+ [TODO.md](https://github.com/jendrikseipp/vulture/blob/main/TODO.md)
+
+
+# 2.7 (2023-01-08)
+
+* Ignore `setup_module()`, `teardown_module()`, etc. in pytest `test_*.py` files (Jendrik Seipp).
+* Add whitelist for `socketserver.TCPServer.allow_reuse_address` (Ben Elliston).
+* Clarify that `--exclude` patterns are matched against absolute paths (Jendrik Seipp, #260).
+* Fix example in README file (Jendrik Seipp, #272).
+
+# 2.6 (2022-09-19)
+
+* Add basic `match` statement support (kreathon, #276, #291).
+
+# 2.5 (2022-07-03)
+
+* Mark imports in `__all__` as used (kreathon, #172, #282).
+* Add whitelist for `pint.UnitRegistry.default_formatter` (Ben Elliston, #258).
+
+# 2.4 (2022-05-19)
+
+* Print absolute filepaths as relative again (as in version 2.1 and before)
+ if they are below the current directory (The-Compiler, #246).
+* Run tests and add PyPI trove for Python 3.10 (chayim, #266).
+* Allow using the `del` keyword to mark unused variables (sshishov, #279).
+
+# 2.3 (2021-01-16)
+
+* Add [pre-commit](https://pre-commit.com) hook (Clément Robert, #244).
+
+# 2.2 (2021-01-15)
+
+* Only parse format strings when being used with `locals()` (jingw, #225).
+* Don't override paths in pyproject.toml with empty CLI paths (bcbnz, #228).
+* Run continuous integration tests for Python 3.9 (ju-sh, #232).
+* Use pathlib internally (ju-sh, #226).
+
+# 2.1 (2020-08-19)
+
+* Treat `getattr/hasattr(obj, "constant_string", ...)` as a reference to
+ `obj.constant_string` (jingw, #219).
+* Fix false positives when assigning to `x.some_name` but reading via
+ `some_name`, at the cost of potential false negatives (jingw, #221).
+* Allow reading options from `pyproject.toml` (Michel Albert, #164, #215).
+
+# 2.0 (2020-08-11)
+
+* Parse `# type: ...` comments if on Python 3.8+ (jingw, #220).
+* Bump minimum Python version to 3.6 (Jendrik Seipp, #218). The last
+ Vulture release that supports Python 2.7 and Python 3.5 is version 1.6.
+* Consider all files under `test` or `tests` directories test files
+ (Jendrik Seipp).
+* Ignore `logging.Logger.propagate` attribute (Jendrik Seipp).
+
+# 1.6 (2020-07-28)
+
+* Differentiate between functions and methods (Jendrik Seipp, #112, #209).
+* Move from Travis to GitHub actions (RJ722, #211).
+
+# 1.5 (2020-05-24)
+
+* Support flake8 "noqa" error codes F401 (unused import) and F841 (unused
+ local variable) (RJ722, #195).
+* Detect unreachable code in conditional expressions
+ (Agathiyan Bragadeesh, #178).
+
+# 1.4 (2020-03-30)
+
+* Ignore unused import statements in `__init__.py` (RJ722, #192).
+* Report first decorator's line number for unused decorated objects on
+ Python 3.8+ (RJ722, #200).
+* Check code with black and pyupgrade.
+
+# 1.3 (2020-02-03)
+
+* Detect redundant 'if' conditions without 'else' blocks.
+* Add whitelist for `string.Formatter` (Joseph Bylund, #183).
+
+# 1.2 (2019-11-22)
+
+* Fix tests for Python 3.8 (#166).
+* Use new `Constant` AST node under Python 3.8+ (#175).
+* Add test for f-strings (#177).
+* Add whitelist for `logging` module.
+
+# 1.1 (2019-09-23)
+
+* Add `sys.excepthook` to `sys` whitelist.
+* Add whitelist for `ctypes` module.
+* Check that type annotations are parsed and type comments are ignored
+ (thanks @kx-chen).
+* Support checking files with BOM under Python 2.7 (#170).
+
+# 1.0 (2018-10-23)
+
+* Add `--ignore-decorators` flag (thanks @RJ722).
+* Add whitelist for `threading` module (thanks @andrewhalle).
+
+# 0.29 (2018-07-31)
+
+* Add `--ignore-names` flag for ignoring names matching the given glob
+ patterns (thanks @RJ722).
+
+# 0.28 (2018-07-05)
+
+* Add `--make-whitelist` flag for reporting output in whitelist format
+ (thanks @RJ722).
+* Ignore case of `--exclude` arguments on Windows.
+* Add `*-test.py` to recognized test file patterns.
+* Add `failureException`, `longMessage` and `maxDiff` to `unittest`
+ whitelist.
+* Refer to actual objects rather than their mocks in default
+ whitelists (thanks @RJ722).
+* Don't import any Vulture modules in setup.py (thanks @RJ722).
+
+# 0.27 (2018-06-05)
+
+* Report `while (True): ... else: ...` as unreachable (thanks @RJ722).
+* Use `argparse` instead of `optparse`.
+* Whitelist Mock.return\_value and Mock.side\_effect in unittest.mock
+ module.
+* Drop support for Python 2.6 and 3.3.
+* Improve documentation and test coverage (thanks @RJ722).
+
+# 0.26 (2017-08-28)
+
+* Detect `async` function definitions (thanks @RJ722).
+* Add `Item.get_report()` method (thanks @RJ722).
+* Move method for finding Python modules out of Vulture class.
+
+# 0.25 (2017-08-15)
+
+* Detect unsatisfiable statements containing `and`, `or` and `not`.
+* Use filenames and line numbers as tie-breakers when sorting by size.
+* Store first and last line numbers in Item objects.
+* Pass relevant options directly to `scavenge()` and `report()`.
+
+# 0.24 (2017-08-14)
+
+* Detect unsatisfiable `while`-conditions (thanks @RJ722).
+* Detect unsatisfiable `if`- and `else`-conditions (thanks @RJ722).
+* Handle null bytes in source code.
+
+# 0.23 (2017-08-10)
+
+* Add `--min-confidence` flag (thanks @RJ722).
+
+# 0.22 (2017-08-04)
+
+* Detect unreachable code after `return`, `break`, `continue` and
+ `raise` (thanks @RJ722).
+* Parse all variable and attribute names in new format strings.
+* Extend ast whitelist.
+
+# 0.21 (2017-07-26)
+
+* If an unused item is defined multiple times, report it multiple
+ times.
+* Make size estimates for function calls more accurate.
+* Create wheel files for Vulture (thanks @RJ722).
+
+# 0.20 (2017-07-26)
+
+* Report unused tuple assignments as dead code.
+* Report attribute names that have the same names as variables as dead
+ code.
+* Let Item class inherit from `object` (thanks @RJ722).
+* Handle names imported as aliases like all other used variable names.
+* Rename Vulture.used\_vars to Vulture.used\_names.
+* Use function for determining which imports to ignore.
+* Only try to import each whitelist file once.
+* Store used names and used attributes in sets instead of lists.
+* Fix estimating the size of code containing ellipses (...).
+* Refactor and simplify code.
+
+# 0.19 (2017-07-20)
+
+* Don't ignore <span class="title-ref">\_\_foo</span> variable names.
+* Use separate methods for determining whether to ignore classes and
+ functions.
+* Only try to find a whitelist for each defined import once (thanks
+ @roivanov).
+* Fix finding the last child for many types of AST nodes.
+
+# 0.18 (2017-07-17)
+
+* Make <span class="title-ref">--sort-by-size</span> faster and more
+ accurate (thanks @RJ722).
+
+# 0.17 (2017-07-17)
+
+* Add <span class="title-ref">get\_unused\_code()</span> method.
+* Return with exit code 1 when syntax errors are found or files can't
+ be read.
+
+# 0.16 (2017-07-12)
+
+* Differentiate between unused classes and functions (thanks @RJ722).
+* Add --sort-by-size option (thanks @jackric and @RJ722).
+* Count imports as used if they are accessed as module attributes.
+
+# 0.15 (2017-07-04)
+
+* Automatically include whitelists based on imported modules (thanks
+ @RJ722).
+* Add --version parameter (thanks @RJ722).
+* Add appveyor tests for testing on Windows (thanks @RJ722).
+
+# 0.14 (2017-04-06)
+
+* Add stub whitelist file for Python standard library (thanks @RJ722)
+* Ignore class names starting with "Test" in "test\_" files (thanks
+ @thisch).
+* Ignore "test\_" functions only in "test\_" files.
+
+# 0.13 (2017-03-06)
+
+* Ignore star-imported names since we cannot detect whether they are
+ used.
+* Move repository to GitHub.
+
+# 0.12 (2017-01-05)
+
+* Detect unused imports.
+* Use tokenize.open() on Python \>= 3.2 for reading input files,
+ assume UTF-8 encoding on older Python versions.
+
+# 0.11 (2016-11-27)
+
+* Use the system's default encoding when reading files.
+* Report syntax errors instead of aborting.
+
+# 0.10 (2016-07-14)
+
+* Detect unused function and method arguments (issue #15).
+* Detect unused \*args and \*\*kwargs parameters.
+* Change license from GPL to MIT.
+
+# 0.9 (2016-06-29)
+
+* Don't flag attributes as unused if they are used as global variables
+ in another module (thanks Florian Bruhin).
+* Don't consider "True" and "False" variable names.
+* Abort with error message when invoked on .pyc files.
+
+# 0.8.1 (2015-09-28)
+
+* Fix code for Python 3.
+
+# 0.8 (2015-09-28)
+
+* Do not flag names imported with "import as" as dead code (thanks Tom
+ Terrace).
+
+# 0.7 (2015-09-26)
+
+* Exit with exitcode 1 if path on commandline can't be found.
+* Test vulture with vulture using a whitelist module for false
+ positives.
+* Add tests that run vulture as a script.
+* Add "python setup.py test" command for running tests.
+* Add support for tox.
+* Raise test coverage to 100%.
+* Remove ez\_setup.py.
+
+# 0.6 (2014-09-06)
+
+* Ignore function names starting with "test\_".
+* Parse variable names in new format strings (e.g. "This is
+ {x}".format(x="nice")).
+* Only parse alphanumeric variable names in format strings and ignore
+ types.
+* Abort with exit code 1 on syntax errors.
+* Support installation under Windows by using setuptools (thanks
+ Reuben Fletcher-Costin).
+
+# 0.5 (2014-05-09)
+
+* If dead code is found, exit with 1.
+
+# 0.4.1 (2013-09-17)
+
+* Only warn if a path given on the command line cannot be found.
+
+# 0.4 (2013-06-23)
+
+* Ignore unused variables starting with an underscore.
+* Show warning for syntax errors instead of aborting directly.
+* Print warning if a file cannot be found.
+
+# 0.3 (2012-03-19)
+
+* Add support for python3
+* Report unused attributes
+* Find tuple assignments in comprehensions
+* Scan files given on the command line even if they don't end with .py
+
+# 0.2 (2012-03-18)
+
+* Only format nodes in verbose mode (gives 4x speedup).
+
+# 0.1 (2012-03-17)
+
+* First release.
+
+
+%package help
+Summary: Development documents and examples for vulture
+Provides: python3-vulture-doc
+%description help
+# Vulture - Find dead code
+
+![CI:Test](https://github.com/jendrikseipp/vulture/workflows/CI/badge.svg)
+[![Codecov Badge](https://codecov.io/gh/jendrikseipp/vulture/branch/main/graphs/badge.svg)](https://codecov.io/gh/jendrikseipp/vulture?branch=main)
+
+Vulture finds unused code in Python programs. This is useful for
+cleaning up and finding errors in large code bases. If you run Vulture
+on both your library and test suite you can find untested code.
+
+Due to Python's dynamic nature, static code analyzers like Vulture are
+likely to miss some dead code. Also, code that is only called implicitly
+may be reported as unused. Nonetheless, Vulture can be a very helpful
+tool for higher code quality.
+
+## Features
+
+* fast: uses static code analysis
+* tested: tests itself and has complete test coverage
+* complements pyflakes and has the same output syntax
+* sorts unused classes and functions by size with `--sort-by-size`
+* supports Python \>= 3.6
+
+## Installation
+
+ $ pip install vulture
+
+## Usage
+
+ $ vulture myscript.py # or
+ $ python3 -m vulture myscript.py
+ $ vulture myscript.py mypackage/
+ $ vulture myscript.py --min-confidence 100 # Only report 100% dead code.
+
+The provided arguments may be Python files or directories. For each
+directory Vulture analyzes all contained
+<span class="title-ref">\*.py</span> files.
+
+After you have found and deleted dead code, run Vulture again, because
+it may discover more dead code.
+
+## Types of unused code
+
+In addition to finding unused functions, classes, etc., Vulture can detect
+unreachable code. Each chunk of dead code is assigned a *confidence value*
+between 60% and 100%, where a value of 100% signals that it is certain that the
+code won't be executed. Values below 100% are *very rough* estimates (based on
+the type of code chunk) for how likely it is that the code is unused.
+
+| Code type | Confidence value |
+| ------------------- | -- |
+| function/method/class argument, unreachable code | 100% |
+| import | 90% |
+| attribute, class, function, method, property, variable | 60% |
+
+You can use the `--min-confidence` flag to set the minimum confidence
+for code to be reported as unused. Use `--min-confidence 100` to only
+report code that is guaranteed to be unused within the analyzed files.
+
+## Handling false positives
+
+When Vulture incorrectly reports chunks of code as unused, you have
+several options for suppressing the false positives. If fixing your false
+positives could benefit other users as well, please file an issue report.
+
+#### Whitelists
+
+The recommended option is to add used code that is reported as unused to a
+Python module and add it to the list of scanned paths. To obtain such a
+whitelist automatically, pass `--make-whitelist` to Vulture:
+
+ $ vulture mydir --make-whitelist > whitelist.py
+ $ vulture mydir whitelist.py
+
+Note that the resulting `whitelist.py` file will contain valid Python
+syntax, but for Python to be able to *run* it, you will usually have to
+make some modifications.
+
+We collect whitelists for common Python modules and packages in
+`vulture/whitelists/` (pull requests are welcome).
+
+#### Ignoring files
+
+If you want to ignore a whole file or directory, use the `--exclude` parameter
+(e.g., `--exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"`). The
+exclude patterns are matched against absolute paths.
+
+#### Flake8 noqa comments
+
+<!-- Hide noqa docs until we decide whether we want to support it.
+Another way of ignoring errors is to annotate the line causing the false
+positive with `# noqa: <ERROR_CODE>` in a trailing comment (e.g., `#
+noqa: V103`). The `ERROR_CODE` specifies what kind of dead code to
+ignore (see the table below for the list of error codes). In case no
+error code is specified, Vulture ignores all results for the line.
+(Note that the line number for decorated objects is the line number of
+the first decorator.)
+-->
+
+For compatibility with [flake8](https://flake8.pycqa.org/), Vulture
+supports the [F401 and
+F841](https://flake8.pycqa.org/en/latest/user/error-codes.html) error
+codes for ignoring unused imports (`# noqa: F401`) and unused local
+variables (`# noqa: F841`). However, we recommend using whitelists instead
+of `noqa` comments, since `noqa` comments add visual noise to the code and
+make it harder to read.
+
+#### Ignoring names
+
+You can use `--ignore-names foo*,ba[rz]` to let Vulture ignore all names
+starting with `foo` and the names `bar` and `baz`. Additionally, the
+`--ignore-decorators` option can be used to ignore functions decorated
+with the given decorator. This is helpful for example in Flask projects,
+where you can use `--ignore-decorators "@app.route"` to ignore all
+functions with the `@app.route` decorator.
+
+We recommend using whitelists instead of `--ignore-names` or
+`--ignore-decorators` whenever possible, since whitelists are
+automatically checked for syntactic correctness when passed to Vulture
+and often you can even pass them to your Python interpreter and let it
+check that all whitelisted code actually still exists in your project.
+
+#### Marking unused variables
+
+There are situations where you can't just remove unused variables, e.g.,
+in function signatures. The recommended solution is to use the `del`
+keyword as described in the
+[PyLint manual](http://pylint-messages.wikidot.com/messages:w0613) and on
+[StackOverflow](https://stackoverflow.com/a/14836005):
+
+```python
+def foo(x, y):
+ del y
+ return x + 3
+```
+
+Vulture will also ignore all variables that start with an underscore, so
+you can use `_x, y = get_pos()` to mark unused tuple assignments or
+function arguments, e.g., `def foo(x, _y)`.
+
+#### Minimum confidence
+
+Raise the minimum [confidence value](#types-of-unused-code) with the `--min-confidence` flag.
+
+#### Unreachable code
+
+If Vulture complains about code like `if False:`, you can use a Boolean
+flag `debug = False` and write `if debug:` instead. This makes the code
+more readable and silences Vulture.
+
+#### Forward references for type annotations
+
+See [#216](https://github.com/jendrikseipp/vulture/issues/216). For
+example, instead of `def foo(arg: "Sequence"): ...`, we recommend using
+
+``` python
+from __future__ import annotations
+
+def foo(arg: Sequence):
+ ...
+```
+
+if you're using Python 3.7+.
+
+
+## Configuration
+
+You can also store command line arguments in `pyproject.toml` under the
+`tool.vulture` section. Simply remove leading dashes and replace all
+remaining dashes with underscores.
+
+Options given on the command line have precedence over options in
+`pyproject.toml`.
+
+Example Config:
+
+``` toml
+[tool.vulture]
+exclude = ["*file*.py", "dir/"]
+ignore_decorators = ["@app.route", "@require_*"]
+ignore_names = ["visit_*", "do_*"]
+make_whitelist = true
+min_confidence = 80
+paths = ["myscript.py", "mydir"]
+sort_by_size = true
+verbose = true
+```
+
+## Version control integration
+
+You can use a [pre-commit](https://pre-commit.com/#install) hook to run
+Vulture before each commit. For this, install pre-commit and add the
+following to the `.pre-commit-config.yaml` file in your repository:
+
+```yaml
+repos:
+ - repo: https://github.com/jendrikseipp/vulture
+ rev: 'v2.3' # or any later Vulture version
+ hooks:
+ - id: vulture
+```
+
+Then run `pre-commit install`. Finally, create a `pyproject.toml` file
+in your repository and specify all files that Vulture should check under
+`[tool.vulture] --> paths` (see above).
+
+## How does it work?
+
+Vulture uses the `ast` module to build abstract syntax trees for all
+given files. While traversing all syntax trees it records the names of
+defined and used objects. Afterwards, it reports the objects which have
+been defined, but not used. This analysis ignores scopes and only takes
+object names into account.
+
+Vulture also detects unreachable code by looking for code after
+`return`, `break`, `continue` and `raise` statements, and by searching
+for unsatisfiable `if`- and `while`-conditions.
+
+## Sort by size
+
+When using the `--sort-by-size` option, Vulture sorts unused code by its
+number of lines. This helps developers prioritize where to look for dead
+code first.
+
+## Examples
+
+Consider the following Python script (`dead_code.py`):
+
+``` python
+import os
+
+class Greeter:
+ def greet(self):
+ print("Hi")
+
+def hello_world():
+ message = "Hello, world!"
+ greeter = Greeter()
+ func_name = "greet"
+ greet_func = getattr(greeter, func_name)
+ greet_func()
+
+if __name__ == "__main__":
+ hello_world()
+```
+
+Calling :
+
+ $ vulture dead_code.py
+
+results in the following output:
+
+ dead_code.py:1: unused import 'os' (90% confidence)
+ dead_code.py:4: unused function 'greet' (60% confidence)
+ dead_code.py:8: unused variable 'message' (60% confidence)
+
+Vulture correctly reports `os` and `message` as unused but it fails to
+detect that `greet` is actually used. The recommended method to deal
+with false positives like this is to create a whitelist Python file.
+
+**Preparing whitelists**
+
+In a whitelist we simulate the usage of variables, attributes, etc. For
+the program above, a whitelist could look as follows:
+
+``` python
+# whitelist_dead_code.py
+from dead_code import Greeter
+Greeter.greet
+```
+
+Alternatively, you can pass `--make-whitelist` to Vulture and obtain an
+automatically generated whitelist.
+
+Passing both the original program and the whitelist to Vulture
+
+ $ vulture dead_code.py whitelist_dead_code.py
+
+makes Vulture ignore the `greet` method:
+
+ dead_code.py:1: unused import 'os' (90% confidence)
+ dead_code.py:8: unused variable 'message' (60% confidence)
+
+<!-- Hide noqa docs until we decide whether we want to support it.
+**Using "# noqa"**
+
+```python
+import os # noqa
+
+class Greeter: # noqa: V102
+ def greet(self): # noqa: V103
+ print("Hi")
+```
+
+## Error codes
+
+For compatibility with [flake8](https://flake8.pycqa.org/), Vulture
+supports the [F401 and
+F841](https://flake8.pycqa.org/en/latest/user/error-codes.html) error
+codes.
+
+| Error codes | Description |
+| ----------- | ----------------- |
+| V101 | Unused attribute |
+| V102 | Unused class |
+| V103 | Unused function |
+| V104, F401 | Unused import |
+| V105 | Unused property |
+| V106 | Unused method |
+| V107, F841 | Unused variable |
+| V201 | Unreachable code |
+
+-->
+
+## Exit codes
+
+| Exit code | Description |
+| --------- | ------------------------------------------------------------- |
+| 0 | No dead code found |
+| 1 | Dead code found |
+| 1 | Invalid input (file missing, syntax error, wrong encoding) |
+| 2 | Invalid command line arguments |
+
+## Similar programs
+
+ - [pyflakes](https://pypi.org/project/pyflakes/) finds unused imports
+ and unused local variables (in addition to many other programmatic
+ errors).
+ - [coverage](https://pypi.org/project/coverage/) finds unused code
+ more reliably than Vulture, but requires all branches of the code to
+ actually be run.
+ - [uncalled](https://pypi.org/project/uncalled/) finds dead code by
+ using the abstract syntax tree (like Vulture), regular expressions,
+ or both.
+ - [dead](https://pypi.org/project/dead/) finds dead code by using the
+ abstract syntax tree (like Vulture).
+
+## Participate
+
+Please visit <https://github.com/jendrikseipp/vulture> to report any
+issues or to make pull requests.
+
+ - Contributing guide:
+ [CONTRIBUTING.md](https://github.com/jendrikseipp/vulture/blob/main/CONTRIBUTING.md)
+ - Release notes:
+ [CHANGELOG.md](https://github.com/jendrikseipp/vulture/blob/main/CHANGELOG.md)
+ - Roadmap:
+ [TODO.md](https://github.com/jendrikseipp/vulture/blob/main/TODO.md)
+
+
+# 2.7 (2023-01-08)
+
+* Ignore `setup_module()`, `teardown_module()`, etc. in pytest `test_*.py` files (Jendrik Seipp).
+* Add whitelist for `socketserver.TCPServer.allow_reuse_address` (Ben Elliston).
+* Clarify that `--exclude` patterns are matched against absolute paths (Jendrik Seipp, #260).
+* Fix example in README file (Jendrik Seipp, #272).
+
+# 2.6 (2022-09-19)
+
+* Add basic `match` statement support (kreathon, #276, #291).
+
+# 2.5 (2022-07-03)
+
+* Mark imports in `__all__` as used (kreathon, #172, #282).
+* Add whitelist for `pint.UnitRegistry.default_formatter` (Ben Elliston, #258).
+
+# 2.4 (2022-05-19)
+
+* Print absolute filepaths as relative again (as in version 2.1 and before)
+ if they are below the current directory (The-Compiler, #246).
+* Run tests and add PyPI trove for Python 3.10 (chayim, #266).
+* Allow using the `del` keyword to mark unused variables (sshishov, #279).
+
+# 2.3 (2021-01-16)
+
+* Add [pre-commit](https://pre-commit.com) hook (Clément Robert, #244).
+
+# 2.2 (2021-01-15)
+
+* Only parse format strings when being used with `locals()` (jingw, #225).
+* Don't override paths in pyproject.toml with empty CLI paths (bcbnz, #228).
+* Run continuous integration tests for Python 3.9 (ju-sh, #232).
+* Use pathlib internally (ju-sh, #226).
+
+# 2.1 (2020-08-19)
+
+* Treat `getattr/hasattr(obj, "constant_string", ...)` as a reference to
+ `obj.constant_string` (jingw, #219).
+* Fix false positives when assigning to `x.some_name` but reading via
+ `some_name`, at the cost of potential false negatives (jingw, #221).
+* Allow reading options from `pyproject.toml` (Michel Albert, #164, #215).
+
+# 2.0 (2020-08-11)
+
+* Parse `# type: ...` comments if on Python 3.8+ (jingw, #220).
+* Bump minimum Python version to 3.6 (Jendrik Seipp, #218). The last
+ Vulture release that supports Python 2.7 and Python 3.5 is version 1.6.
+* Consider all files under `test` or `tests` directories test files
+ (Jendrik Seipp).
+* Ignore `logging.Logger.propagate` attribute (Jendrik Seipp).
+
+# 1.6 (2020-07-28)
+
+* Differentiate between functions and methods (Jendrik Seipp, #112, #209).
+* Move from Travis to GitHub actions (RJ722, #211).
+
+# 1.5 (2020-05-24)
+
+* Support flake8 "noqa" error codes F401 (unused import) and F841 (unused
+ local variable) (RJ722, #195).
+* Detect unreachable code in conditional expressions
+ (Agathiyan Bragadeesh, #178).
+
+# 1.4 (2020-03-30)
+
+* Ignore unused import statements in `__init__.py` (RJ722, #192).
+* Report first decorator's line number for unused decorated objects on
+ Python 3.8+ (RJ722, #200).
+* Check code with black and pyupgrade.
+
+# 1.3 (2020-02-03)
+
+* Detect redundant 'if' conditions without 'else' blocks.
+* Add whitelist for `string.Formatter` (Joseph Bylund, #183).
+
+# 1.2 (2019-11-22)
+
+* Fix tests for Python 3.8 (#166).
+* Use new `Constant` AST node under Python 3.8+ (#175).
+* Add test for f-strings (#177).
+* Add whitelist for `logging` module.
+
+# 1.1 (2019-09-23)
+
+* Add `sys.excepthook` to `sys` whitelist.
+* Add whitelist for `ctypes` module.
+* Check that type annotations are parsed and type comments are ignored
+ (thanks @kx-chen).
+* Support checking files with BOM under Python 2.7 (#170).
+
+# 1.0 (2018-10-23)
+
+* Add `--ignore-decorators` flag (thanks @RJ722).
+* Add whitelist for `threading` module (thanks @andrewhalle).
+
+# 0.29 (2018-07-31)
+
+* Add `--ignore-names` flag for ignoring names matching the given glob
+ patterns (thanks @RJ722).
+
+# 0.28 (2018-07-05)
+
+* Add `--make-whitelist` flag for reporting output in whitelist format
+ (thanks @RJ722).
+* Ignore case of `--exclude` arguments on Windows.
+* Add `*-test.py` to recognized test file patterns.
+* Add `failureException`, `longMessage` and `maxDiff` to `unittest`
+ whitelist.
+* Refer to actual objects rather than their mocks in default
+ whitelists (thanks @RJ722).
+* Don't import any Vulture modules in setup.py (thanks @RJ722).
+
+# 0.27 (2018-06-05)
+
+* Report `while (True): ... else: ...` as unreachable (thanks @RJ722).
+* Use `argparse` instead of `optparse`.
+* Whitelist Mock.return\_value and Mock.side\_effect in unittest.mock
+ module.
+* Drop support for Python 2.6 and 3.3.
+* Improve documentation and test coverage (thanks @RJ722).
+
+# 0.26 (2017-08-28)
+
+* Detect `async` function definitions (thanks @RJ722).
+* Add `Item.get_report()` method (thanks @RJ722).
+* Move method for finding Python modules out of Vulture class.
+
+# 0.25 (2017-08-15)
+
+* Detect unsatisfiable statements containing `and`, `or` and `not`.
+* Use filenames and line numbers as tie-breakers when sorting by size.
+* Store first and last line numbers in Item objects.
+* Pass relevant options directly to `scavenge()` and `report()`.
+
+# 0.24 (2017-08-14)
+
+* Detect unsatisfiable `while`-conditions (thanks @RJ722).
+* Detect unsatisfiable `if`- and `else`-conditions (thanks @RJ722).
+* Handle null bytes in source code.
+
+# 0.23 (2017-08-10)
+
+* Add `--min-confidence` flag (thanks @RJ722).
+
+# 0.22 (2017-08-04)
+
+* Detect unreachable code after `return`, `break`, `continue` and
+ `raise` (thanks @RJ722).
+* Parse all variable and attribute names in new format strings.
+* Extend ast whitelist.
+
+# 0.21 (2017-07-26)
+
+* If an unused item is defined multiple times, report it multiple
+ times.
+* Make size estimates for function calls more accurate.
+* Create wheel files for Vulture (thanks @RJ722).
+
+# 0.20 (2017-07-26)
+
+* Report unused tuple assignments as dead code.
+* Report attribute names that have the same names as variables as dead
+ code.
+* Let Item class inherit from `object` (thanks @RJ722).
+* Handle names imported as aliases like all other used variable names.
+* Rename Vulture.used\_vars to Vulture.used\_names.
+* Use function for determining which imports to ignore.
+* Only try to import each whitelist file once.
+* Store used names and used attributes in sets instead of lists.
+* Fix estimating the size of code containing ellipses (...).
+* Refactor and simplify code.
+
+# 0.19 (2017-07-20)
+
+* Don't ignore <span class="title-ref">\_\_foo</span> variable names.
+* Use separate methods for determining whether to ignore classes and
+ functions.
+* Only try to find a whitelist for each defined import once (thanks
+ @roivanov).
+* Fix finding the last child for many types of AST nodes.
+
+# 0.18 (2017-07-17)
+
+* Make <span class="title-ref">--sort-by-size</span> faster and more
+ accurate (thanks @RJ722).
+
+# 0.17 (2017-07-17)
+
+* Add <span class="title-ref">get\_unused\_code()</span> method.
+* Return with exit code 1 when syntax errors are found or files can't
+ be read.
+
+# 0.16 (2017-07-12)
+
+* Differentiate between unused classes and functions (thanks @RJ722).
+* Add --sort-by-size option (thanks @jackric and @RJ722).
+* Count imports as used if they are accessed as module attributes.
+
+# 0.15 (2017-07-04)
+
+* Automatically include whitelists based on imported modules (thanks
+ @RJ722).
+* Add --version parameter (thanks @RJ722).
+* Add appveyor tests for testing on Windows (thanks @RJ722).
+
+# 0.14 (2017-04-06)
+
+* Add stub whitelist file for Python standard library (thanks @RJ722)
+* Ignore class names starting with "Test" in "test\_" files (thanks
+ @thisch).
+* Ignore "test\_" functions only in "test\_" files.
+
+# 0.13 (2017-03-06)
+
+* Ignore star-imported names since we cannot detect whether they are
+ used.
+* Move repository to GitHub.
+
+# 0.12 (2017-01-05)
+
+* Detect unused imports.
+* Use tokenize.open() on Python \>= 3.2 for reading input files,
+ assume UTF-8 encoding on older Python versions.
+
+# 0.11 (2016-11-27)
+
+* Use the system's default encoding when reading files.
+* Report syntax errors instead of aborting.
+
+# 0.10 (2016-07-14)
+
+* Detect unused function and method arguments (issue #15).
+* Detect unused \*args and \*\*kwargs parameters.
+* Change license from GPL to MIT.
+
+# 0.9 (2016-06-29)
+
+* Don't flag attributes as unused if they are used as global variables
+ in another module (thanks Florian Bruhin).
+* Don't consider "True" and "False" variable names.
+* Abort with error message when invoked on .pyc files.
+
+# 0.8.1 (2015-09-28)
+
+* Fix code for Python 3.
+
+# 0.8 (2015-09-28)
+
+* Do not flag names imported with "import as" as dead code (thanks Tom
+ Terrace).
+
+# 0.7 (2015-09-26)
+
+* Exit with exitcode 1 if path on commandline can't be found.
+* Test vulture with vulture using a whitelist module for false
+ positives.
+* Add tests that run vulture as a script.
+* Add "python setup.py test" command for running tests.
+* Add support for tox.
+* Raise test coverage to 100%.
+* Remove ez\_setup.py.
+
+# 0.6 (2014-09-06)
+
+* Ignore function names starting with "test\_".
+* Parse variable names in new format strings (e.g. "This is
+ {x}".format(x="nice")).
+* Only parse alphanumeric variable names in format strings and ignore
+ types.
+* Abort with exit code 1 on syntax errors.
+* Support installation under Windows by using setuptools (thanks
+ Reuben Fletcher-Costin).
+
+# 0.5 (2014-05-09)
+
+* If dead code is found, exit with 1.
+
+# 0.4.1 (2013-09-17)
+
+* Only warn if a path given on the command line cannot be found.
+
+# 0.4 (2013-06-23)
+
+* Ignore unused variables starting with an underscore.
+* Show warning for syntax errors instead of aborting directly.
+* Print warning if a file cannot be found.
+
+# 0.3 (2012-03-19)
+
+* Add support for python3
+* Report unused attributes
+* Find tuple assignments in comprehensions
+* Scan files given on the command line even if they don't end with .py
+
+# 0.2 (2012-03-18)
+
+* Only format nodes in verbose mode (gives 4x speedup).
+
+# 0.1 (2012-03-17)
+
+* First release.
+
+
+%prep
+%autosetup -n vulture-2.7
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-vulture -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Thu Mar 09 2023 Python_Bot <Python_Bot@openeuler.org> - 2.7-1
+- Package Spec generated