.. _pypi_relase: ============================= Packaging the pysteps project ============================= The `Python Package Index `_ (PyPI) is a software repository for the Python programming language. PyPI helps you find and install software developed and shared by the Python community. The following guide to package pysteps was adapted from the `PyPI `_ official documentation. Generating the source distribution ================================== The first step is to generate a `source distribution (sdist) `_ for the pysteps library. These are archives that are uploaded to the `Package Index `_ and can be installed by pip. To create the sdist package we need the **setuptools** package installed. Then, from the root folder of the pysteps source run:: python setup.py sdist Once this command is completed, it should generate a tar.gz (source archive) file the **dist** directory:: dist/ pysteps-a.b.c.tar.gz where a.b.c denote the version number. Uploading the source distribution to the archive ================================================ The last step is to upload your package to the `Python Package Index `_. **Important** Before we actually upload the distribution to the Python Index, we will test it in `Test PyPI `_. Test PyPI is a separate instance of the package index that allows us to try the distribution without affecting the real index (PyPi). Because TestPyPI has a separate database from the actual PyPI, you’ll need a separate user account for specifically for TestPyPI. You can register your account in https://test.pypi.org/account/register/. Once you are registered, you can use `twine `_ to upload the distribution packages. Alternatively, the package can be uploaded manually from the **Test PyPI** page. If Twine is not installed, you can install it by running ``pip install twine`` or ``conda install twine``. Test PyPI ^^^^^^^^^ To upload the recently created source distribution (**dist/pysteps-a.b.c.tar.gz**) under the **dist** directory run:: twine upload --repository-url https://test.pypi.org/legacy/ dist/pysteps-a.b.c.tar.gz where a.b.c denote the version number. You will be prompted for the username and password you registered with Test PyPI. After the command completes, you should see output similar to this:: Uploading distributions to https://test.pypi.org/legacy/ Enter your username: [your username] Enter your password: Uploading pysteps-a.b.c.tar.gz 100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s] Once uploaded your package should be viewable on TestPyPI, for example, https://test.pypi.org/project/pysteps Test the uploaded package ------------------------- Before uploading the package to the official `Python Package Index `_, test that the package can be installed using pip. Automatic test ^^^^^^^^^^^^^^ The simplest way to hat the package can be installed using pip is using tox and the tox-conda plugin (conda needed). To install these packages activate your conda development environment and run:: conda install -c conda-forge tox tox-conda Then, to test the installation in a minimal and an environment with all the dependencies (full env), run:: tox -r -e pypi_test # Test the installation in a minimal env tox -r -e pypi_test_full # Test the installation in an full env Manual test ^^^^^^^^^^^ To manually test the installation on new environment, create a copy of the basic development environment using the `environment_dev.yml `_ file in the root folder of the pysteps project:: conda env create -f environment_dev.yml -n pysteps_test Then we activate the environment:: source activate pysteps_test or:: conda activate pysteps_test If the environment pysteps_test was already created, remove any version of pysteps already installed:: pip uninstall pysteps Now, install the pysteps package from test.pypi.org. Since not all the dependecies are available in the Test PyPI repository, we need to add the official repo as an extra index to pip. By doing so, pip will look first in the Test PyPI index and then in the official PyPI:: pip install --no-cache-dir --index-url https://test.pypi.org/simple/ --extra-index-url=https://pypi.org/simple/ pysteps To test that the installation was successful, from a folder different than the pysteps source, run:: pytest --pyargs pysteps If any test didn't pass, check the sources or consider creating a new release fixing those bugs. Upload package to PyPi ---------------------- Once the `sdist `_ package was tested, we can safely upload it to the Official PyPi repository with:: twine upload dist/pysteps-a.b.c.tar.gz Now, **pysteps** can be installed by simply running:: pip install pysteps As an extra sanity measure, it is recommended to test the pysteps package installed from the Official PyPi repository (instead of the test PyPi). Automatic test ^^^^^^^^^^^^^^ Similarly to the `Test the uploaded package`_ section, to test the installation from PyPI in a clean environment, run:: tox -r -e pypi Manual test ^^^^^^^^^^^ Follow test instructions in `Test PyPI`_ section.