## pigar
[![](https://img.shields.io/github/actions/workflow/status/damnever/pigar/ci.yml?branch=main&style=flat-square)](https://github.com/damnever/pigar/actions) [![](https://img.shields.io/pypi/v/pigar.svg?style=flat-square)](https://pypi.org/project/pigar)
- Generating requirements.txt for Python project.
- Handling the difference between different Python versions.
- Jupyter notebook (`*.ipynb`) support.
- Including the import statements/magic from ``exec``/``eval``/``importlib``, doctest of docstring, etc.
- Searching ditributions(packages) by the top level import/module names.
- Checking the latest versions of requirements.
**NOTE**: [Pipenv or other tools](https://packaging.python.org/tutorials/managing-dependencies/#managing-dependencies) is recommended for improving your development flow.
### Installation
`pigar` can run on Python 3.7+.
To install it with `pip`, use:
```
[sudo] pip install pigar
```
To install it with ``conda``, use:
```
conda install -c conda-forge pigar
```
To get the newest code from GitHub:
```
pip install git+https://github.com/damnever/pigar.git@[main or other branch] --upgrade
```
### Usage
- `pigar` can consider most kinds of complicated situations(see [FAQ](#faq)). For example, `pigar v1` has [py2_requirements.txt](https://github.com/damnever/pigar/blob/c68d372fba4a6f98228ec3cf8e273f59d68d0e3c/py2_requirements.txt) and [py3_requirements.txt](https://github.com/damnever/pigar/blob/c68d372fba4a6f98228ec3cf8e273f59d68d0e3c/py3_requirements.txt) for different Python versions.
```
# Generate requirements.txt for current directory.
$ pigar generate
# Generating requirements.txt for given directory in given file.
$ pigar gen -f ../dev-requirements.txt ../
```
`pigar gen --with-referenced-comments` can list all files which referenced the package/distribution(the line numbers for Jupyter notebook may be a bit confusing), for example:
```
# project/foo.py: 2,3
# project/bar/baz.py: 2,7,8,9
foobar == 3.3.3
```
If the requirements.txt is overwritten, ``pigar`` will show the difference between the old and the new, use `--dont-show-differences` to disable it.
**NOTE**, `pigar` will search the packages/distributions in local environment first, then it will do further analysis and search missing packages/distributions on PyPI.
See also: [EXPERIMENTAL FEATURES](https://github.com/damnever/pigar#experimental-features).
- If you do not know the import name that belongs to a specific distribution (more generally, does `Import Error: xxx` drive you crazy?), such as `bs4` which may come from `beautifulsoup4` or `MySQLdb` which could come from `mysql-python`, try searching for it:
```
$ pigar search bs4 MySQLdb
```
- Checking for the latest version:
```
# Specify a requirements file.
$ pigar check -f ./requirements.txt
# Or, you can let pigar searching all *requirements.txt in the current directory
# level by itself.
$ pigar check
```
- More:
TIP: `pigar` accepts a prefix for a command, such as `pigar gen`, `pigar c`.
```
pigar --help
```
### EXPERIMENTAL FEATURES
- `requirement-annotations`
Some packages may require optional packages/distributions to be installed depending on your usage. To make `pigar` a little bit more useful, use `pigar generate --enable-feature requirement-annotations` in conjunction with comments following the format below:
```python
import foo # pigar: required-imports=import_name_bar,import_name_baz
import foo # pigar: required-packages=package-name-bar,package-name-baz # Extra comments are allowed.
foo(features=['bar', 'baz']) # pigar: required-distributions=package-name-bar,package-name-baz
```
If you find the comment intrusive, you can extract those comments into a separate Python file and delete it as needed, for example, 'pigar_annotations.py'.
### FAQ
<details>
<summary>
Is `pigar` a dependency management tool?
</summary>
**No.** I've thought about this many times, but there is too much dirty work to be done to make `pigar`'s way reliable.
I like the way `pigar` does the job, but sadly, `pigar` does a bad job of managing dependencies, `pigar` is more like a tool to assist an old project to migrate to a new development workflow.
</details>
<details>
<summary>
(1) Why does `pigar` show multiple packages/distributions for the same import name?
(2) Why does `pigar` generate different packages/distributions for the same import name in different environment?
</summary>
`pigar` can not handle those situations gracefully, you may need to remove the duplicate packages in requirements.txt manually, or select one of them when `pigar` asks you.
Install the required packages/distributions(remove others) in local environment should fix it as well.
Related issues: [#32](https://github.com/damnever/pigar/issues/32), [#68](https://github.com/damnever/pigar/issues/68), [#75](https://github.com/damnever/pigar/issues/75#issuecomment-605639825).
</details>
<details>
<summary>
Why can't `pigar` find the packages/distributions that have not been explicit import?
</summary>
Some frameworks may use some magic to import the modules for users automatically, and `pigar` can not handle it, you may need to fix it manually or use the [EXPERIMENTAL FEATURES](https://github.com/damnever/pigar#experimental-features).
Related issues: [#33](https://github.com/damnever/pigar/issues/33), [#103](https://github.com/damnever/pigar/issues/103)
</details>
### More
`pigar` does not use regular expressions in such a violent way. Instead, it uses AST, which is a better method for extracting imported names from arguments of `exec`/`eval`/`importlib`, doctest of docstring, etc. However, `pigar` can not solve all the tricky problems, see [FAQ](https://github.com/damnever/pigar#faq).
Also, `pigar` can detect the difference between different Python versions. For example, you can find `concurrent.futures` from the Python 3.2 standard library, but you will need install `futures` in earlier versions of Python to get `concurrent.futures`, this is not a hardcode.
If you have any issues or suggestions, [please submit an issue on GitHub](https://github.com/damnever/pigar/issues). [**All contributions are appreciated!**](https://github.com/damnever/pigar/graphs/contributors)
### LICENSE
[The BSD 3-Clause License](https://github.com/damnever/pigar/blob/master/LICENSE)
Raw data
{
"_id": null,
"home_page": null,
"name": "pigar",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "requirements.txt, automation, tool, module-search",
"author": null,
"author_email": "damnever <the.xcdong@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/79/e2/f0e651f1523311c4091c6c26a8e7c674b4651de6ecf0c041414c80801797/pigar-2.1.6.tar.gz",
"platform": null,
"description": "## pigar\n\n[![](https://img.shields.io/github/actions/workflow/status/damnever/pigar/ci.yml?branch=main&style=flat-square)](https://github.com/damnever/pigar/actions) [![](https://img.shields.io/pypi/v/pigar.svg?style=flat-square)](https://pypi.org/project/pigar)\n\n\n- Generating requirements.txt for Python project.\n - Handling the difference between different Python versions.\n - Jupyter notebook (`*.ipynb`) support.\n - Including the import statements/magic from ``exec``/``eval``/``importlib``, doctest of docstring, etc.\n- Searching ditributions(packages) by the top level import/module names.\n- Checking the latest versions of requirements.\n\n**NOTE**: [Pipenv or other tools](https://packaging.python.org/tutorials/managing-dependencies/#managing-dependencies) is recommended for improving your development flow.\n\n\n### Installation\n\n`pigar` can run on Python 3.7+.\n\nTo install it with `pip`, use:\n```\n[sudo] pip install pigar\n```\nTo install it with ``conda``, use:\n```\nconda install -c conda-forge pigar\n```\nTo get the newest code from GitHub:\n```\npip install git+https://github.com/damnever/pigar.git@[main or other branch] --upgrade\n```\n\n### Usage\n\n- `pigar` can consider most kinds of complicated situations(see [FAQ](#faq)). For example, `pigar v1` has [py2_requirements.txt](https://github.com/damnever/pigar/blob/c68d372fba4a6f98228ec3cf8e273f59d68d0e3c/py2_requirements.txt) and [py3_requirements.txt](https://github.com/damnever/pigar/blob/c68d372fba4a6f98228ec3cf8e273f59d68d0e3c/py3_requirements.txt) for different Python versions.\n\n ```\n # Generate requirements.txt for current directory.\n $ pigar generate\n\n # Generating requirements.txt for given directory in given file.\n $ pigar gen -f ../dev-requirements.txt ../\n ```\n\n `pigar gen --with-referenced-comments` can list all files which referenced the package/distribution(the line numbers for Jupyter notebook may be a bit confusing), for example:\n ```\n # project/foo.py: 2,3\n # project/bar/baz.py: 2,7,8,9\n foobar == 3.3.3\n ```\n\n If the requirements.txt is overwritten, ``pigar`` will show the difference between the old and the new, use `--dont-show-differences` to disable it.\n\n **NOTE**, `pigar` will search the packages/distributions in local environment first, then it will do further analysis and search missing packages/distributions on PyPI.\n\n See also: [EXPERIMENTAL FEATURES](https://github.com/damnever/pigar#experimental-features).\n\n- If you do not know the import name that belongs to a specific distribution (more generally, does `Import Error: xxx` drive you crazy?), such as `bs4` which may come from `beautifulsoup4` or `MySQLdb` which could come from `mysql-python`, try searching for it:\n\n ```\n $ pigar search bs4 MySQLdb\n ```\n\n- Checking for the latest version:\n\n ```\n # Specify a requirements file.\n $ pigar check -f ./requirements.txt\n\n # Or, you can let pigar searching all *requirements.txt in the current directory\n # level by itself.\n $ pigar check\n ```\n\n- More:\n\n TIP: `pigar` accepts a prefix for a command, such as `pigar gen`, `pigar c`.\n ```\n pigar --help\n ```\n\n\n### EXPERIMENTAL FEATURES\n\n- `requirement-annotations`\n\n Some packages may require optional packages/distributions to be installed depending on your usage. To make `pigar` a little bit more useful, use `pigar generate --enable-feature requirement-annotations` in conjunction with comments following the format below:\n ```python\n import foo # pigar: required-imports=import_name_bar,import_name_baz\n import foo # pigar: required-packages=package-name-bar,package-name-baz # Extra comments are allowed.\n foo(features=['bar', 'baz']) # pigar: required-distributions=package-name-bar,package-name-baz\n ```\n If you find the comment intrusive, you can extract those comments into a separate Python file and delete it as needed, for example, 'pigar_annotations.py'.\n\n\n### FAQ\n\n<details>\n <summary>\n Is `pigar` a dependency management tool?\n </summary>\n\n**No.** I've thought about this many times, but there is too much dirty work to be done to make `pigar`'s way reliable.\n\nI like the way `pigar` does the job, but sadly, `pigar` does a bad job of managing dependencies, `pigar` is more like a tool to assist an old project to migrate to a new development workflow.\n</details>\n\n<details>\n <summary>\n (1) Why does `pigar` show multiple packages/distributions for the same import name?\n\n (2) Why does `pigar` generate different packages/distributions for the same import name in different environment?\n </summary>\n\n`pigar` can not handle those situations gracefully, you may need to remove the duplicate packages in requirements.txt manually, or select one of them when `pigar` asks you.\nInstall the required packages/distributions(remove others) in local environment should fix it as well.\n\nRelated issues: [#32](https://github.com/damnever/pigar/issues/32), [#68](https://github.com/damnever/pigar/issues/68), [#75](https://github.com/damnever/pigar/issues/75#issuecomment-605639825).\n</details>\n\n<details>\n <summary>\n Why can't `pigar` find the packages/distributions that have not been explicit import?\n </summary>\n\nSome frameworks may use some magic to import the modules for users automatically, and `pigar` can not handle it, you may need to fix it manually or use the [EXPERIMENTAL FEATURES](https://github.com/damnever/pigar#experimental-features).\n\nRelated issues: [#33](https://github.com/damnever/pigar/issues/33), [#103](https://github.com/damnever/pigar/issues/103)\n</details>\n\n\n### More\n\n`pigar` does not use regular expressions in such a violent way. Instead, it uses AST, which is a better method for extracting imported names from arguments of `exec`/`eval`/`importlib`, doctest of docstring, etc. However, `pigar` can not solve all the tricky problems, see [FAQ](https://github.com/damnever/pigar#faq).\n\nAlso, `pigar` can detect the difference between different Python versions. For example, you can find `concurrent.futures` from the Python 3.2 standard library, but you will need install `futures` in earlier versions of Python to get `concurrent.futures`, this is not a hardcode.\n\nIf you have any issues or suggestions, [please submit an issue on GitHub](https://github.com/damnever/pigar/issues). [**All contributions are appreciated!**](https://github.com/damnever/pigar/graphs/contributors)\n\n\n### LICENSE\n\n[The BSD 3-Clause License](https://github.com/damnever/pigar/blob/master/LICENSE)\n",
"bugtrack_url": null,
"license": "BSD 3-Clause License",
"summary": "A tool to generate requirements.txt for Python project.",
"version": "2.1.6",
"project_urls": {
"Documentation": "https://github.com/damnever/pigar",
"Source": "https://github.com/damnever/pigar"
},
"split_keywords": [
"requirements.txt",
" automation",
" tool",
" module-search"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8e51888692a1085c109acdbcdd38634d61c68cef35e9ad39a57cad1f0fa73cf4",
"md5": "b92adfedbdb0d644919b1b6cacf5c31c",
"sha256": "cf4d9e2f69fd94e3bba714639da9eac21e1691b50a137b9b2eb7eb746516c466"
},
"downloads": -1,
"filename": "pigar-2.1.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b92adfedbdb0d644919b1b6cacf5c31c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 29732660,
"upload_time": "2024-07-10T04:37:02",
"upload_time_iso_8601": "2024-07-10T04:37:02.742775Z",
"url": "https://files.pythonhosted.org/packages/8e/51/888692a1085c109acdbcdd38634d61c68cef35e9ad39a57cad1f0fa73cf4/pigar-2.1.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "79e2f0e651f1523311c4091c6c26a8e7c674b4651de6ecf0c041414c80801797",
"md5": "38243d2678e18015ef6f303b148843b5",
"sha256": "a524cd7b9aa67efba3a403988e4630676b05831fcbcb7ecaa01377e88abb5e96"
},
"downloads": -1,
"filename": "pigar-2.1.6.tar.gz",
"has_sig": false,
"md5_digest": "38243d2678e18015ef6f303b148843b5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 29476150,
"upload_time": "2024-07-10T04:37:06",
"upload_time_iso_8601": "2024-07-10T04:37:06.137943Z",
"url": "https://files.pythonhosted.org/packages/79/e2/f0e651f1523311c4091c6c26a8e7c674b4651de6ecf0c041414c80801797/pigar-2.1.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-10 04:37:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "damnever",
"github_project": "pigar",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pigar"
}