pypa-hatch/COMMANDS.rst

877 lines
23 KiB
ReStructuredText

Commands
--------
For your convenience, anything after a ``--`` will be treated as arguments.
.. contents:: **Table of Contents**
:backlinks: none
``config``
^^^^^^^^^^
Locates, updates, or restores the config file.
.. code-block:: bash
$ hatch config
Settings location: /home/ofek/.local/share/hatch/settings.json
..
**Options:**
*-u/--update*
Updates the config file with any new fields.
*--restore*
Restores the config file to default settings.
``new``
^^^^^^^
Creates a new Python project.
Values from your config file such as ``name`` and ``pyversions`` will be used
to help populate fields. You can also specify things like the readme format
and which CI service files to create. All options override the config file.
By default a virtual env will be created in the project directory and will
install the project locally so any edits will auto-update the installation.
You can also locally install the created project in other virtual envs using
the --env option.
Here is an example using an unmodified config file:
.. code-block:: bash
$ hatch new -ne my-app
Created project `my-app`
$ tree --dirsfirst my-app
my-app
├── my_app
│   └── __init__.py
├── tests
│   └── __init__.py
├── LICENSE-APACHE
├── LICENSE-MIT
├── MANIFEST.in
├── README.rst
├── requirements.txt
├── setup.py
└── tox.ini
2 directories, 8 files
..
**Arguments:**
*name*
The desired name of package.
..
**Options:**
*-ne/--no-env*
Disables the creation of a dedicated virtual env.
*-py/--python*
A named Python path to use when creating a virtual
env. This overrides --pypath.
*-pp/--pypath*
An absolute path to a Python executable to use when
creating a virtual env.
*-g/--global-packages*
Gives created virtual envs access to the global site-packages.
*-e/--env*
Forward-slash-separated list of named virtual envs to be
installed in. Will create any that don't already exist.
*--basic*
Disables third-party services and readme badges.
*--cli*
Creates a ``cli.py`` in the package directory and an entry point in
``setup.py`` pointing to the properly named function within. Also, a
``__main__.py`` is created so it can be invoked via ``python -m pkg_name``.
*-l/--licenses*
Comma-separated list of licenses to use.
*-i/--interactive*
Invokes interactive mode.
``init``
^^^^^^^^
Same as ``new`` but the project target is the current directory.
``grow``
^^^^^^^^
Increments a project's version number using semantic versioning.
Valid choices for the part are ``major``, ``minor``, ``patch``
(``fix`` alias), ``pre``, and ``build``.
The path to the project is derived in the following order:
1. The optional argument, which should be the name of a package
that was installed via ``hatch install -l`` or ``pip install -e``.
2. The --local flag.
3. The option --path, which can be a relative or absolute path.
4. The current directory.
If the path is a file, it will be the target. Otherwise, the path, and
every top level directory within, will be checked for a ``__version__.py``,
``__about__.py``, and ``__init__.py``, in that order. The first encounter of
a ``__version__`` variable that also appears to equal a version string will
be updated. Probable package paths will be given precedence.
The default tokens for the prerelease and build parts, *rc* and *build*
respectively, can be altered via the options ``--pre`` and ``--build``, or
the config entry ``semver``.
.. code-block:: bash
$ git clone -q https://github.com/requests/requests && cd requests
$ hatch grow build
Updated /home/ofek/requests/requests/__version__.py
2.18.4 -> 2.18.4+build.1
$ hatch grow fix
Updated /home/ofek/requests/requests/__version__.py
2.18.4+build.1 -> 2.18.5
$ hatch grow pre
Updated /home/ofek/requests/requests/__version__.py
2.18.5 -> 2.18.5-rc.1
$ hatch grow minor
Updated /home/ofek/requests/requests/__version__.py
2.18.5-rc.1 -> 2.19.0
$ hatch grow major
Updated /home/ofek/requests/requests/__version__.py
2.19.0 -> 3.0.0
..
**Arguments:**
*part*
The part of version to bump.
*package*
The editable package to target (optional).
..
**Options:**
*-l/--local*
Shortcut to select the only available local (editable) package. If
there are multiple, an error will be raised.
*-p/--path*
A relative or absolute path to a project or file.
*--pre*
The token to use for ``pre`` part, overriding the config file. Default: *rc*
*--build*
The token to use for ``build`` part, overriding the config file. Default: *build*
``test``
^^^^^^^^
.. image:: https://raw.githubusercontent.com/ofek/visuals/master/hatch/commands/test.gif
:alt: Example test run
Runs tests using ``pytest``, optionally checking coverage.
The path is derived in the following order:
1. The optional argument, which should be the name of a package
that was installed via ``hatch install -l`` or ``pip install -e``.
2. The --local flag.
3. The option --path, which can be a relative or absolute path.
4. The current directory.
If the path points to a package, it should have a ``tests`` directory.
If a project is detected but there is no dedicated virtual env, it
will be created and any dev requirements will be installed in it.
.. code-block:: bash
$ git clone https://github.com/ofek/privy && cd privy
$ hatch test -c
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0
rootdir: /home/ofek/privy, inifile:
plugins: xdist-1.20.0, mock-1.6.2, httpbin-0.0.7, forked-0.2, cov-2.5.1
collected 10 items
tests/test_privy.py ..........
====================== 10 passed in 4.34 seconds =======================
Tests completed, checking coverage...
Name Stmts Miss Branch BrPart Cover Missing
-----------------------------------------------------------------
privy/__init__.py 1 0 0 0 100%
privy/core.py 30 0 0 0 100%
privy/utils.py 13 0 4 0 100%
tests/__init__.py 0 0 0 0 100%
tests/test_privy.py 57 0 0 0 100%
-----------------------------------------------------------------
TOTAL 101 0 4 0 100%
..
**Arguments:**
*package*
The editable package to target (optional).
..
**Options:**
*-l/--local*
Shortcut to select the only available local (editable) package. If
there are multiple, an error will be raised.
*-p/--path*
A relative or absolute path to a project or test directory.
*-c/--cov*
Computes, then outputs coverage after testing.
*-m/--merge*
If --cov, coverage will run using --parallel-mode and combine the results.
*-ta/--test-args*
Pass through to ``pytest``, overriding defaults. Example: ``hatch test -ta "-k test_core.py -vv"``
*-ca/--cov-args*
Pass through to ``coverage run``, overriding defaults. Example: ``hatch test -ca "--timid --pylib"``
*-g/--global*
Uses the ``pytest`` and ``coverage`` shipped with Hatch instead of environment-aware modules.
This is useful if you just want to run a quick test without installing these again in a
virtual env. Keep in mind these will be the Python 3 versions.
*-nd/--no-detect*
Does not run the tests inside a project's dedicated virtual env.
``pypath``
^^^^^^^^^^
Names an absolute path to a Python executable. You can also modify
these in the config file entry ``pypaths``.
Hatch can then use these paths by name when creating virtual envs, building
packages, etc.
.. code-block:: bash
$ hatch pypath -l
There are no saved Python paths. Add one via `hatch pypath NAME PATH`.
$ hatch pypath py2 /usr/bin/python
Successfully saved Python `py2` located at `/usr/bin/python`.
$ hatch pypath py3 /usr/bin/python3
Successfully saved Python `py3` located at `/usr/bin/python3`.
$ hatch pypath -l
py2 -> /usr/bin/python
py3 -> /usr/bin/python3
..
**Arguments:**
*name*
The desired name of the Python path.
*path*
An absolute path to a Python executable.
..
**Options:**
*-l/--list*
Shows available Python paths.
``env``
^^^^^^^
Creates a new virtual env that can later be utilized with the ``shell`` command.
.. code-block:: bash
$ hatch pypath -l
py2 -> /usr/bin/python
py3 -> /usr/bin/python3
$ hatch env -l
No virtual environments found in /home/ofek/.virtualenvs. To create one do `hatch env NAME`.
$ hatch env my-app
Already using interpreter /usr/bin/python3
Successfully saved virtual env `my-app` to `/home/ofek/.virtualenvs/my-app`.
$ hatch env -py py2 old
Successfully saved virtual env `old` to `/home/ofek/.virtualenvs/old`.
$ hatch env -pp ~/pypy3/bin/pypy fast
Successfully saved virtual env `fast` to `/home/ofek/.virtualenvs/fast`.
$ hatch env -ll
Virtual environments found in /home/ofek/.virtualenvs:
fast ->
Version: 3.5.3
Implementation: PyPy
my-app ->
Version: 3.5.2
Implementation: CPython
old ->
Version: 2.7.12
Implementation: CPython
..
**Arguments:**
*name*
The desired name of the virtual environment.
..
**Options:**
*-py/--python*
The named Python path to use. This overrides --pypath.
*-pp/--pypath*
An absolute path to a Python executable.
*-g/--global-packages*
Gives the virtual environment access to the global site-packages.
*-c/--clone*
Specifies an existing virtual env to clone. (Experimental)
*-r/--restore*
Attempts to make all virtual envs in the venvs directory usable by fixing the
executable paths in scripts and removing all compiled ``*.pyc`` files. (Experimental)
*-v/--verbose*
Increases verbosity.
*-l/--list*
Shows available virtual envs. Can stack up to 3 times to show more info.
``shed``
^^^^^^^^
Removes named Python paths or virtual environments.
.. code-block:: bash
$ hatch pypath -l
py2 -> /usr/bin/python
py3 -> /usr/bin/python3
invalid -> :\/:
$ hatch env -ll
Virtual environments found in /home/ofek/.virtualenvs:
duplicate ->
Version: 3.5.2
Implementation: CPython
fast ->
Version: 3.5.3
Implementation: PyPy
my-app ->
Version: 3.5.2
Implementation: CPython
old ->
Version: 2.7.12
Implementation: CPython
$ hatch shed -p invalid -e duplicate/old
Successfully removed Python path named `invalid`.
Successfully removed virtual env named `duplicate`.
Successfully removed virtual env named `old`.
..
**Options:**
*-p/-py/--pypath*
Forward-slash-separated list of named Python paths.
*-e/--env*
Forward-slash-separated list of named virtual envs.
``shell``
^^^^^^^^^
Activates or sends a command to a virtual environment. A default shell
name (or command) can be specified in the config file entry ``shell`` or the
environment variable ``SHELL``. If there is no entry, env var, nor shell
option provided, a system default will be used: ``cmd`` on Windows, ``bash``
otherwise.
Any arguments provided after the first will be sent to the virtual env as
a command without activating it. If there is only the env without args,
it will be activated similarly to how you are accustomed. The name of
the virtual env to use must be omitted if using the --temp env option.
If no env is chosen, this will attempt to detect a project and activate
its virtual env. To run a command in a project's virtual env, use ``.`` as
the env name.
Activation will not do anything to your current shell, but will rather
spawn a subprocess to avoid any unwanted strangeness occurring in your
current environment. If you would like to learn more about the benefits
of this approach, be sure to read `<https://gist.github.com/datagrok/2199506>`_.
To leave a virtual env, type ``exit``, or you can do ``Ctrl+D`` on non-Windows
machines.
``use`` is an alias for this command.
Activation:
.. code-block:: bash
$ hatch env -ll
Virtual environments found in `/home/ofek/.virtualenvs`:
fast ->
Version: 3.5.3
Implementation: PyPy
my-app ->
Version: 3.5.2
Implementation: CPython
old ->
Version: 2.7.12
Implementation: CPython
$ which python
/usr/bin/python
$ hatch shell my-app
(my-app) $ which python
/home/ofek/.virtualenvs/my-app/bin/python
Commands:
.. code-block:: bash
$ hatch shell my-app pip list --format=columns
Package Version
---------- -------
pip 9.0.1
setuptools 36.3.0
wheel 0.29.0
$ hatch shell my-app hatch install -q requests six
$ hatch shell my-app pip list --format=columns
Package Version
---------- -----------
certifi 2017.7.27.1
chardet 3.0.4
idna 2.6
pip 9.0.1
requests 2.18.4
setuptools 36.3.0
six 1.10.0
urllib3 1.22
wheel 0.29.0
Temporary env:
.. code-block:: bash
$ hatch shell -t
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /tmp/tmpzg73untp/Ihqd/bin/python3
Also creating executable in /tmp/tmpzg73untp/Ihqd/bin/python
Installing setuptools, pip, wheel...done.
$ which python
/tmp/tmpzg73untp/Ihqd/bin/python
..
**Arguments:**
*env_name*
The name of the desired virtual environment to use.
*command*
The command to send to the virtual environment (optional).
..
**Options:**
*-s/--shell*
The name of shell to use e.g. ``bash``. If the shell name is not
supported, e.g. ``bash -O``, it will be treated as a command and
no custom prompt will be provided. This overrides the config file
entry ``shell``.
*-t/--temp*
Use a new temporary virtual env.
*-py/--python*
A named Python path to use when creating a temporary virtual
env. This overrides --pypath.
*-pp/--pypath*
An absolute path to a Python executable to use when creating
a temporary virtual env.
*-g/--global-packages*
Gives created virtual envs access to the global site-packages.
``clean``
^^^^^^^^^
Removes a project's build artifacts.
The path to the project is derived in the following order:
1. The optional argument, which should be the name of a package
that was installed via ``hatch install -l`` or ``pip install -e``.
2. The --local flag.
3. The option --path, which can be a relative or absolute path.
4. The current directory.
All ``*.pyc``/``*.pyd``/``*.pyo`` files and ``__pycache__`` directories will be removed.
Additionally, the following patterns will be removed from the root of the path:
``.cache``, ``.coverage``, ``.eggs``, ``.tox``, ``build``, ``dist``, and ``*.egg-info``.
If the path was derived from the optional package argument, the pattern
``*.egg-info`` will not be applied so as to not break that installation.
..
**Arguments:**
*package*
The editable package to target (optional).
..
**Options:**
*-l/--local*
Shortcut to select the only available local (editable) package. If
there are multiple, an error will be raised.
*-p/--path*
A relative or absolute path to a project.
*-c/--compiled-only*
Removes only .pyc files.
*-nd/--no-detect*
Disables the detection of a project's dedicated virtual env. By default,
it will not be considered.
*-v/--verbose*
Shows removed paths.
``build``
^^^^^^^^^
Builds a project, producing a source distribution and a wheel.
The path to the project is derived in the following order:
1. The optional argument, which should be the name of a package
that was installed via ``hatch install -l`` or ``pip install -e``.
2. The --local flag.
3. The option --path, which can be a relative or absolute path.
4. The current directory.
The path must contain a ``setup.py`` file.
..
**Arguments:**
*package*
The editable package to target (optional).
..
**Options:**
*-l/--local*
Shortcut to select the only available local (editable) package. If
there are multiple, an error will be raised.
*-p/--path*
A relative or absolute path to a project.
*-py/--python*
The named Python path to use. This overrides --pypath.
*-pp/--pypath*
An absolute path to a Python executable.
*-u/--universal*
Indicates compatibility with both Python 2 and 3.
*-n/--name*
Forces a particular platform name, e.g. linux_x86_64.
*-d/--build-dir*
A relative or absolute path to the desired build directory.
*-c/--clean*
Removes build artifacts before building.
*-v/--verbose*
Increases verbosity.
``release``
^^^^^^^^^^^
Uploads all files in a directory to PyPI using Twine.
The path to the build directory is derived in the following order:
1. The optional argument, which should be the name of a package
that was installed via ``hatch install -l`` or ``pip install -e``.
2. The --local flag.
3. The option --path, which can be a relative or absolute path.
4. The current directory. If the current directory has a ``dist``
directory, that will be used instead.
If the path was derived from the optional package argument, the
files must be in a directory named ``dist``.
The PyPI username can be saved in the config file entry ``pypi_username``.
If the ``TWINE_PASSWORD`` environment variable is not set, a hidden prompt
will be provided for the password.
..
**Arguments:**
*package*
The editable package to target (optional).
..
**Options:**
*-l/--local*
Shortcut to select the only available local (editable) package. If
there are multiple, an error will be raised.
*-p/--path*
A relative or absolute path to a build directory.
*-u/--username*
The PyPI username to use.
*-t/--test*
Uses the test version of PyPI.
*-s/--strict*
Aborts if a distribution already exists.
``install``
^^^^^^^^^^^
If the option --env is supplied, the install will be applied using
that named virtual env. Unless the option --global is selected, the
install will only affect the current user. Of course, this will have
no effect if a virtual env is in use. The desired name of the admin
user can be set with the ``_DEFAULT_ADMIN_`` environment variable.
With no packages selected, this will install using a ``setup.py`` in the
current directory.
If no --env is chosen, this will attempt to detect a project and use its
virtual env before resorting to the default pip. No project detection
will occur if a virtual env is active.
..
**Arguments:**
*packages*
The packages to install (optional).
..
**Options:**
*-nd/--no-detect*
Disables the use of a project's dedicated virtual env. This is useful if
you need to be in a project root but wish to not target its virtual env.
*-e/--env*
The named virtual env to use.
*-l/--local*
Corresponds to ``pip``'s --editable option, allowing a local package to be
automatically updated when modifications are made.
*-g/--global*
Installs globally, rather than on a per-user basis. This has no effect if
a virtual env is in use.
*--admin*
When --global is selected, this assumes admin rights are already enabled
and therefore sudo/runas will not be used.
*-q/--quiet*
Decreases verbosity.
``uninstall``
^^^^^^^^^^^^^
If the option --env is supplied, the uninstall will be applied using
that named virtual env. Unless the option --global is selected, the
uninstall will only affect the current user. Of course, this will have
no effect if a virtual env is in use. The desired name of the admin
user can be set with the ``_DEFAULT_ADMIN_`` environment variable.
With no packages selected, this will uninstall using a ``requirements.txt``
or a dev version of that in the current directory.
If no --env is chosen, this will attempt to detect a project and use its
virtual env before resorting to the default pip. No project detection
will occur if a virtual env is active.
..
**Arguments:**
*packages*
The packages to uninstall (optional).
..
**Options:**
*-nd/--no-detect*
Disables the use of a project's dedicated virtual env. This is useful if
you need to be in a project root but wish to not target its virtual env.
*-e/--env*
The named virtual env to use.
*-g/--global*
Uninstalls globally, rather than on a per-user basis. This has no effect if
a virtual env is in use.
*--admin*
When --global is selected, this assumes admin rights are already enabled
and therefore sudo/runas will not be used.
*-d/--dev*
When locating a requirements file, only use the dev version.
*-y/--yes*
Confirms the intent to uninstall without a prompt.
*-q/--quiet*
Decreases verbosity.
``update``
^^^^^^^^^^
If the option --env is supplied, the update will be applied using
that named virtual env. Unless the option --global is selected, the
update will only affect the current user. Of course, this will have
no effect if a virtual env is in use. The desired name of the admin
user can be set with the ``_DEFAULT_ADMIN_`` environment variable.
When performing a global update, your system may use an older version
of pip that is incompatible with some features such as --eager. To
force the use of these features, use --force.
With no packages nor options selected, this will update packages by looking
for a ``requirements.txt`` or a dev version of that in the current directory.
If no --env is chosen, this will attempt to detect a project and use its
virtual env before resorting to the default pip. No project detection
will occur if a virtual env is active.
To update this tool, use the --self flag. All other methods of updating will
ignore ``hatch``. See: `<https://github.com/pypa/pip/issues/1299>`_
..
**Arguments:**
*packages*
The packages to update (optional).
..
**Options:**
*-nd/--no-detect*
Disables the use of a project's dedicated virtual env. This is useful if
you need to be in a project root but wish to not target its virtual env.
*-e/--env*
The named virtual env to use.
*--eager*
Updates all dependencies regardless of whether they still satisfy the
new parent requirements. See: `<https://github.com/pypa/pip/pull/3972>`_
*--all*
Updates all currently installed packages. The packages ``pip``,
``setuptools``, and ``wheel`` are excluded.
*--infra*
Updates only the packages ``pip``, ``setuptools``, and ``wheel``.
*-g/--global*
Updates globally, rather than on a per-user basis. This has no effect if
a virtual env is in use.
*--admin*
When --global is selected, this assumes admin rights are already enabled
and therefore sudo/runas will not be used.
*-f/--force*
Forces the use of newer features in global updates.
*-d/--dev*
When locating a requirements file, only use the dev version.
*-m/--module*
Invokes ``pip`` as a module instead of directly, i.e. ``python -m pip``.
*--self*
Updates ``hatch`` itself.
*-q/--quiet*
Decreases verbosity.
``conda``
^^^^^^^^^
Installs Miniconda `<https://conda.io/docs/glossary.html#miniconda-glossary>`_
..
**Options:**
*-f/--force*
Proceed through errors and even if Conda is already installed.
*--head/--tail*
Adds Conda to the head or tail (default) of the user PATH.
*--install-only*
Does not modify the user PATH.
*--show*
Does nothing but show what would be added to the user PATH.