qiskit/.github/CONTRIBUTING.rst

473 lines
18 KiB
ReStructuredText

Contributing
============
**We appreciate all kinds of help, so thank you!**
Contributing to the project
---------------------------
You can contribute in many ways to this project.
Issue reporting
~~~~~~~~~~~~~~~
This is a good point to start, when you find a problem please add
it to the `issue tracker <https://github.com/Qiskit/qiskit-terra/issues>`_.
The ideal report should include the steps to reproduce it.
Doubts solving
~~~~~~~~~~~~~~
To help less advanced users is another wonderful way to start. You can
help us close some opened issues. This kind of tickets should be
labeled as ``question``.
Improvement proposal
~~~~~~~~~~~~~~~~~~~~
If you have an idea for a new feature please open a ticket labeled as
``enhancement``. If you could also add a piece of code with the idea
or a partial implementation it would be awesome.
Contributor License Agreement
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We'd love to accept your code! Before we can, we have to get a few legal
requirements sorted out. By signing a contributor license agreement (CLA), we
ensure that the community is free to use your contributions.
When you contribute to the Qiskit Terra project with a new pull request, a bot will
evaluate whether you have signed the CLA. If required, the bot will comment on
the pull request, including a link to accept the agreement. The
`individual CLA <https://qiskit.org/license/qiskit-cla.pdf>`_ document is
available for review as a PDF.
NOTE: If you work for a company that wants to allow you to contribute your work,
then you'll need to sign a `corporate CLA <https://qiskit.org/license/qiskit-corporate-cla.pdf>`_
and email it to us at qiskit@us.ibm.com.
Good first contributions
~~~~~~~~~~~~~~~~~~~~~~~~
You are welcome to contribute wherever in the code you want to, of course, but
we recommend taking a look at the "Good first contribution" label into the
issues and pick one. We would love to mentor you!
Doc
~~~
Review the parts of the documentation regarding the new changes and update it
if it's needed.
Pull requests
~~~~~~~~~~~~~
We use `GitHub pull requests <https://help.github.com/articles/about-pull-requests>`_
to accept the contributions.
A friendly reminder! We'd love to have a previous discussion about the best way to
implement the feature/bug you are contributing with. This is a good way to
improve code quality in our beloved Qiskit!, so remember to file a new Issue before
starting to code for a solution.
So after having discussed the best way to land your changes into the codebase,
you are ready to start coding (yay!). We have two options here:
1. You think your implementation doesn't introduce a lot of code, right?. Ok,
no problem, you are all set to create the PR once you have finished coding.
We are waiting for it!
2. Your implementation does introduce many things in the codebase. That sounds
great! Thanks!. In this case you can start coding and create a PR with the
word: **[WIP]** as a prefix of the description. This means "Work In
Progress", and allow reviewers to make micro reviews from time to time
without waiting for the big and final solution... otherwise, it would make
reviewing and coming changes pretty difficult to accomplish. The reviewer
will remove the **[WIP]** prefix from the description once the PR is ready
to merge.
Pull request checklist
""""""""""""""""""""""
When submitting a pull request and you feel it is ready for review, please
double check that:
* the code follows the code style of the project. For convenience, you can
execute ``make style`` and ``make lint`` locally, which will print potential
style warnings and fixes.
* the documentation has been updated accordingly. In particular, if a function
or class has been modified during the PR, please update the docstring
accordingly.
* your contribution passes the existing tests, and if developing a new feature,
that you have added new tests that cover those changes.
* you add a new line to the ``CHANGELOG.rst`` file, in the ``UNRELEASED``
section, with the title of your pull request and its identifier (for example,
"``Replace OldComponent with FluxCapacitor (#123)``".
Commit messages
"""""""""""""""
Please follow the next rules for the commit messages:
- It should include a reference to the issue ID in the first line of the commit,
**and** a brief description of the issue, so everybody knows what this ID
actually refers to without wasting to much time on following the link to the
issue.
- It should provide enough information for a reviewer to understand the changes
and their relation to the rest of the code.
A good example:
.. code-block:: text
Issue #190: Short summary of the issue
* One of the important changes
* Another important change
Code
----
This section include some tips that will help you to push source code.
Dependencies
~~~~~~~~~~~~
Our build system is based on CMake, so we need to have `CMake 3.5 or higher <https://cmake.org/>`_
installed. As we will deal with languages that build native binaries, we will
need to have installed any of the `supported CMake build tools <https://cmake.org/cmake/help/v3.5/manual/cmake-generators.7.html>`_.
On Linux and Mac, we recommend installing GNU g++ 6.1 or higher, on Windows
we only support `MinGW64 <http://mingw-w64.org>`_ at the moment.
Note that a prerequiste for the C++ toolchain is that C++14 must be supported.
For the python code, we need some libraries that can be installed in this way:
.. code:: sh
# Depending on the system and setup to append "sudo -H" before could be needed.
pip install -U -r requirements.txt
pip install -U -r requirements-dev.txt
Building
~~~~~~~~
The preferred way CMake is meant to be used, is by setting up an "out of source" build.
So in order to build our native code, we have to follow these steps:
Linux and Mac
.. code::
qiskit-terra$ mkdir out
qiskit-terra$ cd out
qiskit-terra/out$ cmake ..
qiskit-terra/out$ make
Windows
.. code::
C:\..\> mkdir out
C:\..\> cd out
C:\..\out> cmake -DUSER_LIB_PATH=C:\path\to\mingw64\lib\libpthreads.a -G "MinGW Makefiles" ..
C:\..\out> make
As you can see, the Windows cmake command invocation is slightly different from
the Linux and Mac version, this is because we need to provide CMake with some
more info about where to find libphreads.a for later building. Furthermore,
we are forcing CMake to generate MingGW makefiles, because we don't support
other toolchain at the moment.
Useful CMake flags
~~~~~~~~~~~~~~~~~~
There are some useful flags that can be set during cmake command invocation and
will help you change some default behavior. To make use of them, you just need to
pass them right after ``-D`` cmake argument. Example:
.. code::
qiskit-terra/out$ cmake -DUSEFUL_FLAG=Value ..
Flags:
USER_LIB_PATH
This flag tells CMake to look for libraries that are needed by some of the native
components to be built, but they are not in a common place where CMake could find
it automatically.
Values: An absolute path with file included.
Default: No value.
Example: ``cmake -DUSER_LIB_PATH=C:\path\to\mingw64\lib\libpthreads.a ..``
STATIC_LINKING
Tells the build system whether to create static versions of the programs being built or not.
Notes: On MacOS static linking is not fully working for all versions of GNU G++/Clang
compilers, so enable this flag in this platform could cause errors.
Values: True|False
Default: False
Example: ``cmake -DSTATIC_LINKING=True ..``
CMAKE_BUILD_TYPE
Tells the build system to create executables/libraries for debugging purposes
or highly optimized binaries ready for distribution.
Values: Debug|Release
Default: "Release"
Example: ``cmake -DCMAKE_BUILD_TYPE="Debug" ..``
ENABLE_TARGETS_NON_PYTHON
We can enable or disable non-python code generation by setting this flag to True or False
respectively. This is mostly used in our CI systems so they can launch some fast tests
for the Python code (which is currently a majority).
Values: True|False
Default: True
Example: ``cmake -DENABLE_TARGETS_NON_PYTHON=True ..``
ENABLE_TARGETS_QA
We can enable or disable QA stuff (lintering, styling and testing) by setting this flag to
True or False respectively. This is mostly used in our CI systems so they can run light
stages pretty fast, and fail fast if they found any issues within the code.
Values: True|False
Default: True
Example: ``cmake -DENABLE_TARGETS_QA=True ..``
WHEEL_TAG
This is used to force platform specific tag name generation when creating wheels package
for Pypi.
Values: "-pWhateverTagName"
Default: No value.
Example: ``cmake -DWHEEL_TAG="-pmanylinux1_x86_64" ..``
Test
~~~~
New features often imply changes in the existent tests or new ones are
needed. Once they're updated/added run this be sure they keep passing.
For executing the tests, a ``make test`` target is available.
The execution of the tests (both via the make target and during manual invocation)
takes into account the ``LOG_LEVEL`` environment variable. If present, a ``.log``
file will be created on the test directory with the output of the log calls, which
will also be printed to stdout. You can adjust the verbosity via the content
of that variable, for example:
Linux and Mac:
.. code-block:: bash
$ cd out
out$ LOG_LEVEL="DEBUG" ARGS="-V" make test
Windows:
.. code-block:: bash
$ cd out
C:\..\out> set LOG_LEVEL="DEBUG"
C:\..\out> set ARGS="-V"
C:\..\out> make test
For executing a simple python test manually, we don't need to change the directory
to ``out``, just run this command:
Linux and Mac:
.. code-block:: bash
$ LOG_LEVEL=INFO python -m unittest test/python/test_circuit.py
Windows:
.. code-block:: bash
C:\..\> set LOG_LEVEL="INFO"
C:\..\> python -m unittest test/python/test_circuit.py
Note many of the tests will not be executed unless you have setup an IBMQ
account. To set this up please go to this
`page <https://quantumexperience.ng.bluemix.net/qx/account/advanced>`_ and
register an account.
By default, and if there is no user credentials available, the tests that
require online access are run with recorded (mocked) information. This is, the
remote requests are replayed from a ``test/cassettes`` and not real HTTP
requests is generated. If user credentials are found, in that cases it use them
to make the network requests.
How and which tests are executed is controlled by a environment variable
``QISKIT_TESTS``. The options are (where ``uc_available = True`` if the user
credentials are available, and ``False`` otherwise):
+-------------------+--------------------------------------------------------------------------------------------------------------------+-----------------------+--------------------------------------------------+
| Option | Description | Default | If ``True``, forces |
+===================+====================================================================================================================+=======================+==================================================+
| ``skip_online`` | Skips tests that require remote requests (also, no mocked information is used). Does not require user credentials. | ``False`` | ``rec = False`` |
+-------------------+--------------------------------------------------------------------------------------------------------------------+-----------------------+--------------------------------------------------+
| ``mock_online`` | It runs the online tests using mocked information. Does not require user credentials. | ``not uc_available`` | ``skip_online = False`` |
+-------------------+--------------------------------------------------------------------------------------------------------------------+-----------------------+--------------------------------------------------+
| ``run_slow`` | It runs tests tagged as *slow*. | ``False`` | |
+-------------------+--------------------------------------------------------------------------------------------------------------------+-----------------------+--------------------------------------------------+
| ``rec`` | It records the remote requests. It requires user credentials. | ``False`` | ``skip_online = False`` |
| | | | ``run_slow = False`` |
+-------------------+--------------------------------------------------------------------------------------------------------------------+-----------------------+--------------------------------------------------+
It is possible to provide more than one option separated with commas.
The order of precedence in the options is right to left. For example,
``QISKIT_TESTS=skip_online,rec`` will set the options as
``skip_online == False`` and ``rec == True``.
Style guide
~~~~~~~~~~~
Please submit clean code and please make effort to follow existing conventions
in order to keep it as readable as possible. We use
`Pylint <https://www.pylint.org>`_ and `PEP
8 <https://www.python.org/dev/peps/pep-0008>`_ style guide: to ensure
your changes respect the style guidelines, run the next commands:
All platforms:
.. code:: sh
$> cd out
out$> make lint
out$> make style
Development cycle
-----------------
Our development cycle is straightforward, we define a roadmap with milestones
for releases, and features that we want to include in these releases. The
roadmap is not public at the moment, but it's a committed project in our
community and we are working to make parts of it public in a way that can be
beneficial for everyone. Whenever a new release is close to be launched, we'll
announce it and detail what has changed since the latest version.
The channels we'll use to announce new releases are still being discussed, but
for now you can `follow us <https://twitter.com/qiskit>`_ on Twitter!
Branch model
~~~~~~~~~~~~
There are two main branches in the repository:
- ``master``
- This is the development branch.
- Next release is going to be developed here. For example, if the current
latest release version is r1.0.3, the master branch version will point to
r1.1.0 (or r2.0.0).
- You should expect this branch to be updated very frequently.
- Even though we are always doing our best to not push code that breaks
things, is more likely to eventually push code that breaks something...
we will fix it ASAP, promise :).
- This should not be considered as a stable branch to use in production
environments.
- The API of Qiskit could change without prior notice.
- ``stable``
- This is our stable release branch.
- It's always synchronized with the latest distributed package, as for now,
the package you can download from pip.
- The code in this branch is well tested and should be free of errors
(unfortunately sometimes it's not).
- This is a stable branch (as the name suggest), meaning that you can expect
stable software ready for production environments.
- All the tags from the release versions are created from this branch.
Release cycle
~~~~~~~~~~~~~
From time to time, we will release brand new versions of Qiskit Terra. These
are well-tested versions of the software.
When the time for a new release has come, we will:
1. Merge the ``master`` branch with the ``stable`` branch.
2. Create a new tag with the version number in the ``stable`` branch.
3. Crate and distribute the pip package.
4. Change the ``master`` version to the next release version.
5. Announce the new version to the world!
The ``stable`` branch should only receive changes in the form of bug fixes, so the
third version number (the maintenance number: [major].[minor].[maintenance])
will increase on every new change.
What version should I use: development or stable?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It depends on your needs as a user.
If you want to use Qiskit Terra for building circuits for applications or research then we recommend
that you should be using the stable version. However, to simplify this the latest stable version
can be installed using Pip.
.. code:: sh
$ pip install qiskit
If you found out that the release version doesn't fit your needs, and you are
thinking about extending the functionality of Qiskit Terra, you are more likely to
use the ``master`` branch and thinking seriously about contributing with us :).
Please clone the distribution and set up the code as described above. To get the examples working
try
.. code:: sh
$ pip install -e .
and then you can run them with
.. code:: sh
$ python examples/python/using_qiskit_core_level_0.py
Documentation
-------------
The documentation for the element of Qiskit is in the ``doc`` directory. The
documentation for the Qiskit Terra is auto-generated from python
docstrings using `Sphinx <http://www.sphinx-doc.org>`_ for generating the
documentation. Please follow `Google's Python Style
Guide <https://google.github.io/styleguide/pyguide.html?showone=Comments#Comments>`_
for docstrings. A good example of the style can also be found with
`sphinx's napolean converter
documentation <http://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html>`_.
You can see the rendered documentation for the stable version of Qiskit Terra at
the `landing page <https://qiskit.org/terra>`_.
To generate the documentation, we need to invoke CMake first in order to generate
all specific files for our current platform.
See the previous *Building* section for details on how to run CMake.
Once CMake is invoked, all configuration files are in place, so we can build the
documentation running this command:
All platforms:
.. code:: sh
$> cd out
doc$> make doc