RLS: 0.23.0
# Release Checklist

This template can be copied into the RLS issue for a release and checked off as you go.

## Pre-Release

- [x] Open a pre-release issue and mention related parties. (A few weeks before release) with this template.
- [x] Clear the bug queue
- [x] Run an ASV: `cd asv_bench; asv continuous -f 1.1 $(git describe --abbrev=0)..HEAD``
- [ ] Review deprecations from previous releases [here](https://github.com/pandas-dev/pandas/issues/6581)
- [ ] Review experimental features from previous releases [here](https://github.com/pandas-dev/pandas/issues/5049)
- [ ] Clean up release.rst (contributors and stats will be done later)
- [ ] Clean up whatsnew.rst
- [ ]  Run a full doc build and make sure everything is clean
  ```
  ./make.py clean; ./make.py; ./make.py zip_html;  ./make.py latex_forced
  ```
    + [ ] Check the output, check whatsnew and release.rst for formatting errors.
- [ ] run ``build_dist.sh``, uninstall cython and make a test install of the tarball to ensure
  cython is not required for installation from tarball/pypi (now also part of travis scripts, but check).
- [ ] Ensure you have SSH access to `pandas.pydata.org` (@TomAugspurger or [Andy Terrel](http://github.com/aterrel) should be able to get you an account).
- [ ] Ensure you have upload rights to PyPI (Wes or Jeff)
- [ ] Ensure you have commit rights on github.com/macPython/pandas-wheels/ and github.com/conda-forge/pandas-feedstock

## Release Candidate

These are items that must be done for an RC. See the respective sections for details.

- [ ] [Tag the Release](#tag-the-release)
- [ ] [Release on Github](#release-on-github)
- [ ] [Build Wheels](#build-binary-distributions)
- [ ] RC Conda Packages (waiting on conda-forge for full solution)
- [ ] [Upload to PyPI](#upload-to-PyPI)
- [ ] [Build the Docs](#build-and-upload-the-docs)
- [ ] [Update the Website](#update-the-website)
- [ ] [Announce](#announce)

### RC Conda Packages

Conda-forge doesn't support release candidates yet. We build them ourselves.

- [ ] Setup Windows Environment
- [ ] Setup Linux Environment

## The Release

### Final Pre-Release

To be done just before tagging the commit. This is optional for release-candidates.

- [x] Call a hold on master in the pre-release issue before you start.
- [x] Finalize the documentation by running the
    + [x] Run `scripts/announce.py` and add to `release.rst`
    + [x] Update the release date in `release.rst` and `whatsnew/<version>.rst`
- [ ] Commit the doc changes


### Tag the Release

- [x] Create an empty commit: `git commit --allow-empty -m 'RLS: v0.20.0'`
    + For Release-Candidates, it's `-m 'RLS: v0.20.0.rc2'`
- [x] Create the tag: `git tag -a v0.20.0` -m "Version 0.20.0"

### Test the Release

Some local sanity tests before pushing, making the release official

- [x] Build the release
  + Conda:
```
# build a conda package
conda build ./conda.recipe --numpy 1.11 --python 2.7 -q --output

# fresh conda env
conda create -n pandas_0.18.2_test python=2.7 pandas nose

# build and install into that env
conda install -n pandas_0.18.2_test pandas --use-local

# switch to that env & test
source activate pandas_0.18.2_test
import pandas as pd
pd.test()
```
  + Pip

```
# build the wheel
python setup.py bdist_wheel

# activate another environment
workon pandas-test
pip uninstall -y pandas
pip install <path/to/wheel>
python -c "import pandas; pandas.test()"
```
- [x] Build the docs. Check the version number and release notes

### Push the Release

This is where things become final. **No going back once the tagged commit is pushed**

- [x] Push the release
    + Major release: `git push upstream master --follow-tags`
    + Maintenance:   `git push upstream 0.20.x --follow-tags` 
  
### Build Source Distribution

- [x] `git clean -xdf pandas && python setup.py cython && python setup.py sdist --formats=gztar` (TODO: update build_dist.sh to handle maintenance branches)

### Release on Github

- [x] Draft a new release [here](https://github.com/pandas-dev/pandas/releases/new)
- [ ] If this is an RC, check the box saying it's a pre-release
- [x] Upload the `pandas-<version>.tar.gz` from the previous step as a "binary"
- [x] Generate the SHA256 for the release with `openssl dgst -sha256 dist/pandas-<version>.tar.gz`
  We use the SHA from our .tar.gz since the one auto-generated by Github isn't stable if the release page
  is later modified.

### Build Binary Distributions

Windows wheels are built automatically by Christoph Gohlke.

- [x] Open a PR for Mac and Linux wheels to update the `BUILD_COMMIT` [here](https://github.com/MacPython/pandas-wheels/blob/master/.travis.yml)
- [x] *Final Release Only* Open a PR for the [pandas-feedstock](https://github.com/conda-forge/pandas-feedstock)
    + [ ] Update the version
    + [ ] Update the SHA256
    + [ ] Set the build number 5to 0

### Download Binary Distributions

Conda-Forge is handled automatically. We handle wheels.

- [x] Windows wheels from [here](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pandas)
- [x] Mac / Linux wheels with `python scripts/fetch_wheels.py`, from [here](http://wheels.scipy.org/)

### Upload to PyPI

**Upload the source and wheels simultaneously**. Uploading just the source may break some users'
workflows, if they trigger an update but don't have a C-complier

- [ ] Assuming you've downloaded everything to `dist`: `twine upload dist/*`
- [ ] You may want to hide the release until the docs are up and announcement is sent out

### Build and Upload the Docs

- [x] Build and upload
```
cd docs;
./make.py clean; ./make.py; ./make.py zip_html;  ./make.py latex_forced
python make.py upload_previous 0.20.2
```

- [x] Update stable symlink: `ln -sfn version/0.22.0 stable`
- [x] Update the minor symlink: `ln -sfn 0.22.0 0.22`

## Update the Website

- [x] clone the repo: ``https://github.com/pandas-dev/pandas-website.git``
- [x] *major only*: Move `latest.rst` to `previous.rst`
- [x] Update `latest.rst`
- [x] Update `releases.json` and `pre_release.json` (if RC, add to pre_release.json, else make it blank)
- [x] Update `_themes/pydata/layout.html` to have the most recent minor release of each major version
- [x] commit and push
- [x] build: `make html`
- [x] upload: `make upload`  (this requires an SSH key for the docs server)
- [ ] Verify the cheatsheets at `/Pandas_Cheet_Sheet.{pdf,pptx}` are up to date (TODO: automate)
- [x] Verify it updated (maybe in an incognito browser to avoid caching)

## Announce 

- [x] Make sure everything is in place
  - [x] pypi binaries for windows, mac wheels, source
  - [x] docs built and published
  - [x] website updated
- [ ] Send an ANN to the mailing list. include links to both release notes and whatsnew.
- send announcements to pydata@googlegroups.com, numpy-discussion@scipy.org, python-announce-list@python.org, scipy-user@scipy.org, pandas-dev@python.org

** Final Version**
  * [0.20.3](https://groups.google.com/d/msg/pydata/DNm4EjBHFq0/zessb6VUBAAJ)
  * [0.20.2](https://groups.google.com/d/msg/pydata/EklxoMXYYmU/HUOj8CeHAwAJ)
  * [0.20.1](https://groups.google.com/d/msg/pydata/N_D_3NQc_XI/5RP9bbsFBgAJ)
  * [0.19.2](https://groups.google.com/d/msg/pydata/-EhcScH5HBU/FWpIfs6RDwAJ)
  * [0.19.1](https://groups.google.com/d/msg/pydata/46op7I7NESc/qorGKhh5CAAJ)
  * [0.19.0](https://groups.google.com/forum/#!topic/pydata/czhBNkQZGFA)
  * [0.18.1](https://groups.google.com/forum/#!topic/pydata/VCvVVI0dKOM)
  * [0.18.0](https://groups.google.com/forum/#!topic/pydata/VXPVa4QVVMI)
  * [0.17.1](https://groups.google.com/forum/#!topic/pydata/dyZsC4SiolQ)
  * [0.17.0](https://groups.google.com/forum/#!topic/pydata/2nUh2UenY_o)
  * [0.16.2](https://groups.google.com/forum/#!topic/pydata/slgCenzHrZU)
  * [0.16.1](https://groups.google.com/forum/#!topic/pydata/rc9sZV81RtU)
  * [0.16.0](https://groups.google.com/forum/#!topic/pydata/4KKZFpxS_4o)
  * [0.15.2](https://groups.google.com/forum/#!topic/pydata/A48I-Mu6RUk)
  * [0.15.1](https://groups.google.com/forum/#!topic/pydata/NDY11PDTL9w)
  * [0.15.0](https://groups.google.com/forum/#!topic/pydata/6tG903k02KU)
  * [0.14.1](https://groups.google.com/forum/#!topic/pydata/kTDutuXEBs0)
  * [0.14.0](https://groups.google.com/forum/#!topic/pydata/wHM435aVjUw)
  * [0.13.1](https://groups.google.com/forum/#!topic/pydata/bp8bioTbDWM)
  * [0.13.0](https://groups.google.com/forum/#!searchin/pydata/ANN/pydata/7RT82JwDmbg/Pdw3MssGN3gJ)
  * [0.11.0](https://groups.google.com/forum/#!searchin/pydata/pandas$20release/pydata/g-8q58WZNvs/La7b5FvPP04J)

** Release Candidates **

  * [0.20.0rc1](https://groups.google.com/d/msg/pydata/je6H3GvVzng/v9JLLIm-AQAJ)
  * [0.18rc2](https://groups.google.com/forum/#!topic/pydata/XiyF7kpozqk)
  * [0.18rc1](https://groups.google.com/forum/#!topic/pydata/izaTcjLmY1g)
  * [0.17rc2](https://groups.google.com/forum/#!topic/pydata/k03SQiBG3jc)
  * [0.17rc1](https://groups.google.com/forum/#!topic/pydata/xeJWmewJboA)
  * [0.16rc1](https://groups.google.com/forum/#!topic/pydata/IahnI8gYD8o)
  * [0.15rc1](https://groups.google.com/forum/#!topic/pydata/36tu9MYhYmA)
  * [0.14rc1](http://groups.google.com/forum/#!topic/pydata/Bx8oiSAZwOc)
  * [0.13rc1](http://groups.google.com/forum/#!searchin/pydata/pandas00.13.00release/pydata/OHutLByJvK0/_Y6pD66eefwJ)

## Start the next release cycle

**Only after a major release**

When finishing a major release we have a few extra steps to ensure that
the development version is always ahead of the backports version.

- [x] Create a backports branch off the release commmit, e.g. `git checkout -b 0.20.x master`
- [x] Push that to upstream: `git push -u upstream 0.20.x`
- [ ] Switch back to master and make a new commit to start the next cycle
    - `git checkout master`
    - `git commit --allow-empty -m 'DEV: Start 0.21 cycle'`
    - `git tag -a v0.21.0.dev0 -m 'Version 0.21.0 start'`
    - `git push upstream master --follow-tags`
- [x] Ensure that a whatsnew file is available for the next major and minor releases

## Finish

- [x] Close the Milestone on github
- [x] Close the RLS issue

Miscellany I haven't gotten to yet.

#### Update documentation
- Get commits since last release:  
  `git log v0.18.1.. --format='%an#%s' | grep -v Merge > commits`
- Include a summary by contributor in release notes (`release.rst`):  
  `cat commits | gawk -F '#' '{ print "- " $1 }' | sort | uniq`
- Run [release_stats.sh](https://github.com/pandas-dev/pandas/blob/master/release_stats.sh) to get number of contributors and commits.
- In release notes/whatsnew, update release date.
- Update release notes (`release.rst` with highlights of whatsnew).


---

Tracking issue for 0.23.0

- Open issues/PRs: https://github.com/pandas-dev/pandas/milestones/0.23.0. It's still a big list, so we should do some cleaning on this to identify the important remaining ones
- What is needed for ExtensionArray before releasing: https://github.com/pandas-dev/pandas/issues/19696 (let's keep that part of the discussion there)

(edited the milestone target date from end of March to end of April)

cc @pandas-dev/pandas-core