{# The following line is a lie. BUT! Once jinja2 is done with it, it will
    become truth! #}
.. This file is automatically generated. Do not edit this file directly.

{{product.name}} Python Samples
===============================================================================

.. image:: https://gstatic.com/cloudssh/images/open-btn.png
   :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor={{folder}}/README.rst


This directory contains samples for {{product.name}}. {{product.description}}

{{description}}

.. _{{product.name}}: {{product.url}}

{% if required_api_url %}
To run the sample, you need to enable the API at: {{required_api_url}}
{% endif %}

{% if required_role %}
To run the sample, you need to have `{{required_role}}` role.
{% endif %}

{{other_required_steps}}

{% if setup %}
Setup
-------------------------------------------------------------------------------

{% for section in setup %}

{% include section + '.tmpl.rst' %}

{% endfor %}
{% endif %}

{% if samples %}
Samples
-------------------------------------------------------------------------------

{% for sample in samples %}
{{sample.name}}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

{% if not sample.hide_cloudshell_button %}
.. image:: https://gstatic.com/cloudssh/images/open-btn.png
   :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor={{folder}}/{{sample.file}},{{folder}}/README.rst
{% endif %}


{{sample.description}}

To run this sample:

.. code-block:: bash

    $ python {{sample.file}}
{% if sample.show_help %}

    {{get_help(sample.file)|indent}}
{% endif %}


{% endfor %}
{% endif %}

{% if cloud_client_library %}

The client library
-------------------------------------------------------------------------------

This sample uses the `Google Cloud Client Library for Python`_.
You can read the documentation for more details on API usage and use GitHub
to `browse the source`_ and  `report issues`_.

.. _Google Cloud Client Library for Python:
    https://googlecloudplatform.github.io/google-cloud-python/
.. _browse the source:
    https://github.com/GoogleCloudPlatform/google-cloud-python
.. _report issues:
    https://github.com/GoogleCloudPlatform/google-cloud-python/issues

{% endif %}

.. _Google Cloud SDK: https://cloud.google.com/sdk/