=========================== Philosophy of this Tutorial =========================== We aim to nudge scientist--developers toward good practices and standard tools, to help small- and medium-sized projects start off on the right foot. Keeping in mind that too much development infrastructure can be overwhelming to those who haven't yet encountered the need for it, we stop short of recommending the *full* stack of tools used by large scientific Python projects. This is an opinionated tutorial. We guide readers toward certain tools and conventions. We do not always mention alternatives and their respective trade-offs because we want to avoid overwhelming beginners with too many decisions. Our choices are based on the current consensus in the scientific Python community and the personal experience of the authors. The Tools, and the Problems They Solve -------------------------------------- .. Note: The bolded items here are intentionally not links. These things are easy enough to Google if people want to know more, and I'd like to avoid scaring anyone off by making them feel like they need to review the project home pages for each of these projects before proceeding. * **Python 3** has been around since 2008, and it gained real traction in the scientific Python ecosystem around 2014. It offers `many benefits for scientific applications `_. Python 2 will reach its end-of-life (no new security updates) in 2020. Some projects still support both 2 and 3, but many have already dropped support for Python 2 in new releases or `publicly stated their plans to do so `_. This cookiecutter focuses on Python 3 only. * **Pip** is the official Python package manager, and it can install packages either from code on your local machine or by downloading them from the Python Package Index (PyPI). * **Git** is a version control system that has become the consensus choice. It is used by virtually all of the major scientific Python projects, including Python itself. * **GitHub** is a website, owned by Microsoft, for hosting git repositories and discussion between contributors and users. * **Cookiecutter** is a tool for generating a directory of files from a template. We will use it to generate the boilerplate scaffolding of a Python project and various configuration files without necessarily understanding all the details up front. * **PyTest** is a framework for writing code that tests other Python code. There are several such frameworks, but pytest has emerged as the favorite, and major projects like numpy have switched from older systems to pytest. * **Flake8** is a tool for inspecting code for likely mistakes (such as a variable that is defined but never used) and/or inconsitent style. This tool is right "on the line" as far as what we would recommend for beginners. Your mileage may vary, and so the tutorial includes clear instructions for ommitting this piece. * **Travis-CI** is an online service, free for open-source projects, that speeds software development by checking out your code on a fresh, clean server, installing your software, running the tests, and reporting the results. This helps you ensure that your code will work on your colleague’s computer---that it doesn’t accidentally depend on some local detail of your machine. It also creates a clear, public record of whether the tests passed or failed, so if things are accidentally broken (say, while you are on vacation) you can trace when the breaking change occurred. * **RestructuredText** (``.rst``) is a markup language, like HTML. It is designed for writing software documentation. It is used by almost all scientific Python projects, large and small. * **Sphinx** is a documentation-publishing tool that renders RestructuredText into HTML, PDF, LaTeX, and other useful formats. It also inspects Python code to extract information (e.g. the list of functions in a module and the arguments they expect) from which it can automatically generate documentation. Extensions for sphinx provide additional functionality, some of which we cover in this tutorial. * **GitHub Pages** is a free service for publishing static websites. It is suitable for publishing the documentation generated by sphinx.