..
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

===============
Developer Guide
===============

This page is for people who wish to contribute code to this project.

Developer Setup
---------------
Check out the source from head, switch to the source code's root directory, then run:
  python setup.py develop
  
That will set up this project's src directory in the easy-install.pth file in site-packages.

Release Process
---------------

Checklist:
 #. All newly-added code has a unit test
 #. All tests pass cleanly (or have good reasons for not passing)
 #. Change setup.cfg to have the appropriate tag ('dev', for example, or '' for a stable release)
 #. Change setup.py to have the appropriate version number
 #. Inline comments updated with changes
 #. Sphinx doc updated with changes
 #. Docs build cleanly
     .. code-block:: bash

        cd src/doc/src/
        make html

 #. pep8 runs without much complaint
     .. code-block:: bash

        pep8 --ignore=E501,W601 --repeat model.py

 #. pylint runs without much complaint
     .. code-block:: bash

        pylint --disable-msg=C0103,R0904,R0913,C0301,W0511 cmislibtest.py

 #. All changes checked in
 #. Tag the release using 'cmislib-[release num]-RC[x]'
 #. Use the release script to build the release artifacts
     .. code-block:: bash

        cd dist
        ./release.sh -u jpotts@apache.org

    This will do a 'setup.py bdist sdist' and will then sign all artifacts.

    Note that the artifacts will be named without 'RC[x]'. These are the same artifacts that will be distributed if the vote passes.

 #. Copy files to the Apache server under ~/public_html/chemistry/cmislib/[release num]
 #. Start vote. Send an email to dev@chemistry.apache.org announcing the vote, highlighting the changes, pointing to the tagged source, and referencing the artifacts that have been copied to the Apache server.
 #. After 72 hours, if the vote passes, continue, otherwise address issues and start over
 #. Copy the files to the appropriate Apache dist directory, which is /www/www.apache.org/dist/chemistry/cmislib/[release num]
 #. Rename the RC tag in source code control
 #. Update the cmislib home page with download links to the new release
 #. Upload files to Pypi
 #. Check the `cheesecake <http://pycheesecake.org/>`_ score
     .. code-block:: bash

        python cheesecake_index --name=cmislib

