Development

Setup

For local development, install dependencies and an editable version of Pymagicc from a clone or download of the Pymagicc repository with

make venv
./venv/bin/pip install --editable .

Running the tests

To run the tests run

./venv/bin/pytest tests --verbose

To skip tests which run MAGICC and take longer use

./venv/bin/pytest tests --skip-slow

To get a test coverage report, run

./venv/bin/pytest --cov

Conventions

Style

To unify coding style, allowing us to focus more on writing useful code and less time worrying about formatting, black is used.

To format the files in pymagicc and tests as well as setup.py run

make black

Csvs

In our miscellaneous csv’s, for example the definitional csv’s, we follow the following conventions to make our lives easier:

  • column names are all lower case, with underscores as separators (i.e. no spaces)

Dependencies

A user of pymagicc should be able to pip install and run all of our notebooks. This means that all of the libraries for running notebooks should be explicit dependencies, rather than being included in an extras requirement. Whilst this means that we have more dependencies, it makes it easier for end users and avoids extremely cryptic import errors.

Building the documentation

The docs use Sphinx and can be rebuilt locally in docs/builds/html/ with

make docs

Contributing

Please report issues or discuss feature requests on Pymagicc’s issue tracker.

You can also contact the pymagicc authors via email: mailto:rob.g@web.de,zebedee.nicholls@climate-energy-college.org

Releasing

To release a new version of Pymagicc, there are a number of steps which need to be taken.

Firstly, ensure that all formatting is correct by running make black and make flake8. Make any changes which they require/recommend.

Next make sure all the tests are passing. You can run the tests with make test. Then make sure all the notebooks are passing their tests. The notebook tests can be run with make test-notebooks.

Having passed all the formatting and tests locally, you should then push the changes and ensure that all the code passes CI.

Next all the documentation should be checked and updated where necessary. This includes ensuring that the Changelog contains all major changes.

Then the next version number needs to be chosen. We follow Semantic versioning, this means that we have versions which are in the format “vMajor.Minor.Patch”. We then increment the:

  • ‘Major’ when we make backwards-incompatible API changes

  • ‘Minor’ when we add functionality in a backwards-compatible way

  • ‘Patch’ when we make backwards-compatible bug fixes

Having performed all these steps, tag the new release with git tag vX.Y.Z. Push all the changes to GitHub with

git push origin master --tags

Then, a new version can be released on PyPI (see notes below about setting up PyPI and test releases) with (getting setup instructions can be found here)

make publish-on-pypi

To test the released version, one can run

make test-pypi-install

to install Pymagicc in a temporary directory and print its version number.

To ensure the latest Pymagicc version can run in the Mybinder notebook click the “Launch Binder” link in the Readme on GitHub. This build might take a while. The Binder notebook will install the latest version available on PyPI.

Finally, the new version needs to be turned into a release. This requires visiting https://github.com/openscm/pymagicc/releases, pressing ‘Draft a new release’, choosing the tag you just pushed, filling out the form and pressing ‘Publish release’. Having done these steps, the package will be automatically archived on Zenodo.

Setting up PyPI

To setup an account with PyPI that will work with our Makefile, follow the ‘Register for PyPI’ section of this guide. We repeat the key details here.

You must first register for PyPI and the test PyPI sites at https://pypi.org/account/register/ and https://test.pypi.org/account/register/ respectively. Then, in your home directory you need to create a file called .pypirc which has the following information.

[distutils]
index-servers=
    testpypi
    pypi

[testpypi]
repository = https://testpypi.python.org/pypi
username = name_of_the_user
password = hunter2  # optional, otherwise you have to type it everytime

[pypi]
repository = https://pypi.python.org/pypi
username = name_of_the_user
password = hunter2  # optional, otherwise you have to type it everytime

Test release

To test publishing on PyPI’s testing instance it is possible to use the publish-on-testpypi and test-testpypi-install tasks. Versions uploaded there should be deleted after testing.