• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Contributing
2============
3
41.  **Please sign one of the contributor license agreements [below][6].**
51.  [File an issue][9] to notify the maintainers about what you're working on.
61.  [Fork the repo][10], develop and [test][11] your code changes, add docs.
71.  Make sure that your commit messages clearly describe the changes.
81.  [Send][12] a pull request.
9
10Here are some guidelines for hacking on `oauth2client`.
11
12Before writing code, file an issue
13----------------------------------
14
15Use the [issue tracker][7] to start the discussion. It is possible that someone
16else is already working on your idea, your approach is not quite right, or that
17the functionality exists already. The ticket you file in the issue tracker will
18be used to hash that all out.
19
20Fork `oauth2client`
21-------------------
22
23We will use GitHub's mechanism for [forking][8] repositories and making pull
24requests. Fork the repository, and make your changes in the forked repository.
25
26Include tests
27-------------
28
29Be sure to add the relevant tests before making the pull request. Docs will be
30updated automatically when we merge to `master`, but you should also build
31the docs yourself via `tox -e docs` and make sure they're readable.
32
33Make the pull request
34---------------------
35
36Once you have made all your changes, tests, and updated the documentation,
37make a pull request to move everything back into the main `oauth2client`
38repository. Be sure to reference the original issue in the pull request.
39Expect some back-and-forth with regards to style and compliance of these
40rules. In particular:
41* `oauth2client` follows the [Google Python Style Guide][GooglePythonStyle].
42* Follow [these guidelines][GitCommitRules] when authoring your commit message.
43
44Using a Development Checkout
45----------------------------
46
47You’ll have to create a development environment to hack on
48`oauth2client`, using a Git checkout:
49
50-   While logged into your GitHub account, navigate to the `oauth2client`
51    [repo][1] on GitHub.
52-   Fork and clone the `oauth2client` repository to your GitHub account
53    by clicking the "Fork" button.
54-   Clone your fork of `oauth2client` from your GitHub account to your
55    local computer, substituting your account username and specifying
56    the destination as `hack-on-oauth2client`. For example:
57
58    ```bash
59    $ cd ${HOME}
60    $ git clone git@github.com:USERNAME/oauth2client.git hack-on-oauth2client
61    $ cd hack-on-oauth2client
62    $ # Configure remotes such that you can pull changes from the oauth2client
63    $ # repository into your local repository.
64    $ git remote add upstream https://github.com:google/oauth2client
65    $ # fetch and merge changes from upstream into master
66    $ git fetch upstream
67    $ git merge upstream/master
68    ```
69
70Now your local repo is set up such that you will push changes to your
71GitHub repo, from which you can submit a pull request.
72
73-   Create a virtualenv in which to install `oauth2client`:
74
75    ```bash
76    $ cd ~/hack-on-oauth2client
77    $ virtualenv -ppython2.7 env
78    ```
79
80    Note that very old versions of virtualenv (virtualenv versions
81    below, say, 1.10 or thereabouts) require you to pass a
82    `--no-site-packages` flag to get a completely isolated environment.
83
84    You can choose which Python version you want to use by passing a
85    `-p` flag to `virtualenv`. For example, `virtualenv -ppython2.7`
86    chooses the Python 2.7 interpreter to be installed.
87
88    From here on in within these instructions, the
89    `~/hack-on-oauth2client/env` virtual environment you created above will be
90    referred to as `$VENV`. To use the instructions in the steps that
91    follow literally, use the `export VENV=~/hack-on-oauth2client/env`
92    command.
93
94-   Install `oauth2client` from the checkout into the virtualenv using
95    `setup.py develop`. Running `setup.py develop` **must** be done while
96    the current working directory is the `oauth2client` checkout
97    directory:
98
99    ```bash
100    $ cd ~/hack-on-oauth2client
101    $ $VENV/bin/python setup.py develop
102    ```
103
104Running Tests
105--------------
106
107-   To run all tests for `oauth2client` on a single Python version, run
108    `nosetests` from your development virtualenv (See
109    **Using a Development Checkout** above).
110
111-   To run the full set of `oauth2client` tests on all platforms, install
112    [`tox`][2] into a system Python.  The `tox` console script will be
113    installed into the scripts location for that Python.  While in the
114    `oauth2client` checkout root directory (it contains `tox.ini`),
115    invoke the `tox` console script.  This will read the `tox.ini` file and
116    execute the tests on multiple Python versions and platforms; while it runs,
117    it creates a virtualenv for each version/platform combination.  For
118    example:
119
120    ```bash
121    $ sudo pip install tox
122    $ cd ~/hack-on-oauth2client
123    $ tox
124    ```
125
126-   In order to run the `pypy` environment (in `tox`) you'll need at
127    least version 2.6 of `pypy` installed. See the [docs][13] for
128    more information.
129
130-   **Note** that `django` related tests are turned off for Python 2.6
131    and 3.3. This is because `django` dropped support for
132    [2.6 in `django==1.7`][14] and for [3.3 in `django==1.9`][15].
133
134Running System Tests
135--------------------
136
137-   To run system tests you can execute:
138
139    ```bash
140    $ tox -e system-tests
141    $ tox -e system-tests3
142    ```
143
144    This alone will not run the tests. You'll need to change some local
145    auth settings and download some service account configuration files
146    from your project to run all the tests.
147
148-   System tests will be run against an actual project and so you'll need to
149    provide some environment variables to facilitate this.
150
151    -   `OAUTH2CLIENT_TEST_JSON_KEY_PATH`: The path to a service account JSON
152        key file; see `tests/data/gcloud/application_default_credentials.json`
153        as an example. Such a file can be downloaded directly from the
154        developer's console by clicking "Generate new JSON key". See private
155        key [docs][3] for more details.
156    -   `OAUTH2CLIENT_TEST_P12_KEY_PATH`: The path to a service account
157        P12/PKCS12 key file. You can download this in the same way as a JSON
158        key, just select "P12 Key" as your "Key type" when downloading.
159    -   `OAUTH2CLIENT_TEST_P12_KEY_EMAIL`: The service account email
160        corresponding to the P12/PKCS12 key file.
161    -   `OAUTH2CLIENT_TEST_USER_KEY_PATH`: The path to a JSON key file for a
162        user. If this is not set, the file created by running
163        `gcloud auth login` will be used. See
164        `tests/data/gcloud/application_default_credentials_authorized_user.json`
165        for an example.
166    -   `OAUTH2CLIENT_TEST_USER_KEY_EMAIL`: The user account email
167        corresponding to the user JSON key file.
168
169-   Examples of these can be found in `scripts/local_test_setup.sample`. We
170    recommend copying this to `scripts/local_test_setup`, editing the values
171    and sourcing them into your environment:
172
173    ```bash
174    $ source scripts/local_test_setup
175    ```
176
177Contributor License Agreements
178------------------------------
179
180Before we can accept your pull requests you'll need to sign a Contributor
181License Agreement (CLA):
182
183-   **If you are an individual writing original source code** and **you own
184    the intellectual property**, then you'll need to sign an
185    [individual CLA][4].
186-   **If you work for a company that wants to allow you to contribute your
187    work**, then you'll need to sign a [corporate CLA][5].
188
189You can sign these electronically (just scroll to the bottom). After that,
190we'll be able to accept your pull requests.
191
192[1]: https://github.com/google/oauth2client
193[2]: https://tox.readthedocs.io/en/latest/
194[3]: https://cloud.google.com/storage/docs/authentication#generating-a-private-key
195[4]: https://developers.google.com/open-source/cla/individual
196[5]: https://developers.google.com/open-source/cla/corporate
197[6]: #contributor-license-agreements
198[7]: https://github.com/google/oauth2client/issues
199[8]: https://help.github.com/articles/fork-a-repo/
200[9]: #before-writing-code-file-an-issue
201[10]: #fork-oauth2client
202[11]: #include-tests
203[12]: #make-the-pull-request
204[13]: https://oauth2client.readthedocs.io/en/latest/#using-pypy
205[14]: https://docs.djangoproject.com/en/1.7/faq/install/#what-python-version-can-i-use-with-django
206[15]: https://docs.djangoproject.com/en/1.9/faq/install/#what-python-version-can-i-use-with-django
207[GooglePythonStyle]: https://google.github.io/styleguide/pyguide.html
208[GitCommitRules]: http://chris.beams.io/posts/git-commit/#seven-rules
209