|  | Contributing | 
|  | ============ | 
|  |  | 
|  | #. **Please sign one of the contributor license agreements below.** | 
|  | #. Fork the repo, develop and test your code changes, add docs. | 
|  | #. Make sure that your commit messages clearly describe the changes. | 
|  | #. Send a pull request. | 
|  |  | 
|  | Here are some guidelines for hacking on ``google-auth-library-python``. | 
|  |  | 
|  | Making changes | 
|  | -------------- | 
|  |  | 
|  | A few notes on making changes to ``google-auth-library-python``. | 
|  |  | 
|  | - If you've added a new feature or modified an existing feature, be sure to | 
|  | add or update any applicable documentation in docstrings and in the | 
|  | documentation (in ``docs/``). You can re-generate the reference documentation | 
|  | using ``nox -s docgen``. | 
|  |  | 
|  | - The change must work fully on the following CPython versions: | 
|  | 3.6, 3.7, 3.8, 3.9, 3.10 across macOS, Linux, and Windows. | 
|  |  | 
|  | - The codebase *must* have 100% test statement coverage after each commit. | 
|  | You can test coverage via ``nox -e cover``. | 
|  |  | 
|  | Testing changes | 
|  | --------------- | 
|  |  | 
|  | To test your changes, run unit tests with ``nox``:: | 
|  |  | 
|  | $ nox -s unit | 
|  |  | 
|  |  | 
|  | Running system tests | 
|  | -------------------- | 
|  |  | 
|  | You can run the system tests with ``nox``:: | 
|  |  | 
|  | $ nox -f system_tests/noxfile.py | 
|  |  | 
|  | To run a single session, specify it with ``nox -s``:: | 
|  |  | 
|  | $ nox -f system_tests/noxfile.py -s service_account | 
|  |  | 
|  | First, set the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` to a valid service account. | 
|  | See `Creating and Managing Service Account Keys`_ for how to obtain a service account. | 
|  |  | 
|  | Project and Credentials Setup | 
|  | ------------------------------- | 
|  |  | 
|  | Enable the IAM Service Account Credentials API on the project. | 
|  |  | 
|  | To run system tests locally, you will need to set up a data directory :: | 
|  |  | 
|  | $ mkdir system_tests/data | 
|  |  | 
|  | Your directory should look like this. Follow the instructions below for creating each file. :: | 
|  |  | 
|  | system_tests/ | 
|  | data/ | 
|  | authorized_user.json | 
|  | impersonated_service_account.json | 
|  | service_account.json | 
|  |  | 
|  |  | 
|  | ``authorized_user.json`` | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | Use the `gcloud CLI`_ to get an authorized user file :: | 
|  |  | 
|  | $ gcloud auth application-default login --scopes=https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/cloud-platform,openid | 
|  |  | 
|  | You will see something like:: | 
|  |  | 
|  | Credentials saved to file: [/usr/local/home/.config/gcloud/application_default_credentials.json] | 
|  |  | 
|  | Copy the contents of the file to ``authorized_user.json``. | 
|  |  | 
|  | Open the IAM page of the Google Cloud Console. Grant the user the `Service Account Token Creator Role`. | 
|  | This will allow the user to impersonate service accounts on the project. | 
|  |  | 
|  | .. _gcloud CLI: https://cloud.google.com/sdk/gcloud/ | 
|  |  | 
|  |  | 
|  | ``service_account.json`` | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | Follow `Creating and Managing Service Account Keys`_ to create a service account. | 
|  |  | 
|  | Copy the credentials file to ``service_account.json``. | 
|  |  | 
|  | Grant the account associated with ``service_account.json`` the following roles. | 
|  |  | 
|  | - App Engine Admin (for App Engine tests) | 
|  | - Service Account Token Creator (for impersonated credentials and workload identity federation tests) | 
|  | - Pub/Sub Viewer (for gRPC tests) | 
|  | - Storage Object Viewer (for impersonated credentials tests) | 
|  | - DNS Viewer (for workload identity federation tests) | 
|  | - GCE Storage Bucket Admin (for downscoping tests) | 
|  |  | 
|  | ``impersonated_service_account.json`` | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | Follow `Creating and Managing Service Account Keys`_ to create a service account. | 
|  |  | 
|  | Copy the credentials file to ``impersonated_service_account.json``. | 
|  |  | 
|  | .. _Creating and Managing Service Account Keys: https://cloud.google.com/iam/docs/creating-managing-service-account-keys | 
|  |  | 
|  | ``setup_external_accounts`` | 
|  | ~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | In order to run the workload identity federation tests, you will need to set up | 
|  | a Workload Identity Pool, as well as attach relevant policy bindings for this | 
|  | new resource to our service account. To do this, make sure you have IAM Workload | 
|  | Identity Pool Admin and Security Admin permissions, and then run: | 
|  |  | 
|  | $ ./scripts/setup_external_accounts.sh | 
|  |  | 
|  | and then use the output to replace the variables near | 
|  | the top of system_tests/system_tests_sync/test_external_accounts.py | 
|  |  | 
|  | App Engine System Tests | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | To run the App Engine tests, you wil need to deploy a default App Engine service. | 
|  | If you already have a default service associated with your project, you can skip this step. | 
|  |  | 
|  | Edit ``app.yaml`` so ``service`` is ``default`` instead of ``google-auth-system-tests``. | 
|  | From ``system_tests/app_engine_test_app`` run the following commands :: | 
|  |  | 
|  | $ pip install --target lib -r requirements.txt | 
|  | $ gcloud app deploy -q app.yaml | 
|  |  | 
|  | After the app is deployed, change ``service`` in ``app.yaml`` back to ``google-auth-system-tests``. | 
|  | You can now run the App Engine tests: :: | 
|  |  | 
|  | $ nox -f system_tests/noxfile.py -s app_engine | 
|  |  | 
|  | Compute Engine Tests | 
|  | ^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | These tests cannot be run locally and will be skipped if they are run outside of Google Compute Engine. | 
|  |  | 
|  | grpc Tests | 
|  | ^^^^^^^^^^^^ | 
|  |  | 
|  | These tests use the Pub/Sub API. Grant the service account specified by `GOOGLE_APPLICATION_CREDENTIALS` | 
|  | permissions to list topics. The service account should have at least `roles/pubsub.viewer`. | 
|  |  | 
|  | Coding Style | 
|  | ------------ | 
|  |  | 
|  | This library is PEP8 & Pylint compliant. Our Pylint config is defined at | 
|  | ``pylintrc`` for package code and ``pylintrc.tests`` for test code. Use | 
|  | ``nox`` to check for non-compliant code:: | 
|  |  | 
|  | $ nox -s lint | 
|  |  | 
|  | Documentation Coverage and Building HTML Documentation | 
|  | ------------------------------------------------------ | 
|  |  | 
|  | If you fix a bug, and the bug requires an API or behavior modification, all | 
|  | documentation in this package which references that API or behavior must be | 
|  | changed to reflect the bug fix, ideally in the same commit that fixes the bug | 
|  | or adds the feature. | 
|  |  | 
|  | To build and review docs use  ``nox``:: | 
|  |  | 
|  | $ nox -s docs | 
|  |  | 
|  | The HTML version of the docs will be built in ``docs/_build/html`` | 
|  |  | 
|  | Versioning | 
|  | ---------- | 
|  |  | 
|  | This library follows `Semantic Versioning`_. | 
|  |  | 
|  | .. _Semantic Versioning: http://semver.org/ | 
|  |  | 
|  | It is currently in major version zero (``0.y.z``), which means that anything | 
|  | may change at any time and the public API should not be considered | 
|  | stable. | 
|  |  | 
|  | Contributor License Agreements | 
|  | ------------------------------ | 
|  |  | 
|  | Before we can accept your pull requests you'll need to sign a Contributor License Agreement (CLA): | 
|  |  | 
|  | - **If you are an individual writing original source code** and **you own the intellectual property**, then you'll need to sign an `individual CLA <https://developers.google.com/open-source/cla/individual>`__. | 
|  | - **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://developers.google.com/open-source/cla/corporate>`__. | 
|  |  | 
|  | You can sign these electronically (just scroll to the bottom). After that, we'll be able to accept your pull requests. |