All: Add docs job to publish to googleapis.dev. (#8464)


diff --git a/.repo-metadata.json b/.repo-metadata.json
new file mode 100644
index 0000000..6a5f3f5
--- /dev/null
+++ b/.repo-metadata.json
@@ -0,0 +1,9 @@
+{
+  "name": "google-api-core",
+  "name_pretty": "Google API client core library",
+  "client_documentation": "https://googleapis.dev/python/google-api-core/latest",
+  "release_level": "ga",
+  "language": "python",
+  "repo": "googleapis/google-cloud-python",
+  "distribution_name": "google-api-core"
+}
\ No newline at end of file
diff --git a/docs/auth.rst b/docs/auth.rst
new file mode 100644
index 0000000..f309a3a
--- /dev/null
+++ b/docs/auth.rst
@@ -0,0 +1,301 @@
+Authentication
+**************
+
+.. _Overview:
+
+Overview
+========
+
+*   **If you're running in Compute Engine or App Engine**,
+    authentication should "just work".
+
+*   **If you're developing locally**,
+    the easiest way to authenticate is using the `Google Cloud SDK`_:
+
+    .. code-block:: bash
+
+        $ gcloud auth application-default login
+
+    Note that this command generates credentials for client libraries. To authenticate the CLI itself, use:
+
+    .. code-block:: bash
+
+        $ gcloud auth login
+
+    Previously, ``gcloud auth login`` was used for both use cases. If
+    your ``gcloud`` installation does not support the new command,
+    please update it:
+
+    .. code-block:: bash
+
+        $ gcloud components update
+
+.. _Google Cloud SDK: http://cloud.google.com/sdk
+
+
+*   **If you're running your application elsewhere**,
+    you should download a `service account`_ JSON keyfile
+    and point to it using an environment variable:
+
+    .. code-block:: bash
+
+        $ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/keyfile.json"
+
+.. _service account: https://cloud.google.com/storage/docs/authentication#generating-a-private-key
+
+Client-Provided Authentication
+==============================
+
+Every package uses a :class:`Client <google.cloud.client.Client>`
+as a base for interacting with an API.
+For example:
+
+.. code-block:: python
+
+    from google.cloud import datastore
+    client = datastore.Client()
+
+Passing no arguments at all will "just work" if you've followed the
+instructions in the :ref:`Overview`.
+The credentials are inferred from your local environment by using
+Google `Application Default Credentials`_.
+
+.. _Application Default Credentials: https://developers.google.com/identity/protocols/application-default-credentials
+
+.. _Precedence:
+
+Credential Discovery Precedence
+-------------------------------
+
+When loading the `Application Default Credentials`_,
+the library will check for credentials in your environment by following the
+precedence outlined by :func:`google.auth.default`.
+
+Explicit Credentials
+====================
+
+The Application Default Credentials discussed above can be useful
+if your code needs to run in many different environments or
+if you just don't want authentication to be a focus in your code.
+
+However, you may want to be explicit because
+
+* your code will only run in one place
+* you may have code which needs to be run as a specific service account
+  every time (rather than with the locally inferred credentials)
+* you may want to use two separate accounts to simultaneously access data
+  from different projects
+
+In these situations, you can create an explicit
+:class:`~google.auth.credentials.Credentials` object suited to your environment.
+After creation, you can pass it directly to a :class:`Client <google.cloud.client.Client>`:
+
+.. code:: python
+
+    client = Client(credentials=credentials)
+
+.. tip::
+    To create a credentials object, follow the `google-auth-guide`_.
+
+.. _google-auth-guide: https://google-auth.readthedocs.io/en/latest/user-guide.html#service-account-private-key-files
+
+
+Google App Engine Environment
+-----------------------------
+
+To create
+:class:`credentials <google.auth.app_engine.Credentials>`
+just for Google App Engine:
+
+.. code:: python
+
+    from google.auth import app_engine
+    credentials = app_engine.Credentials()
+
+Google Compute Engine Environment
+---------------------------------
+
+To create
+:class:`credentials <google.auth.compute_engine.Credentials>`
+just for Google Compute Engine:
+
+.. code:: python
+
+    from google.auth import compute_engine
+    credentials = compute_engine.Credentials()
+
+Service Accounts
+----------------
+
+A `service account`_ is stored in a JSON keyfile.
+
+The
+:meth:`from_service_account_json() <google.cloud.client.Client.from_service_account_json>`
+factory can be used to create a :class:`Client <google.cloud.client.Client>` with
+service account credentials.
+
+For example, with a JSON keyfile:
+
+.. code:: python
+
+    client = Client.from_service_account_json('/path/to/keyfile.json')
+
+.. tip::
+
+    Previously the Google Cloud Console would issue a PKCS12/P12 key for your
+    service account. This library does not support that key format. You can
+    generate a new JSON key for the same service account from the console.
+
+User Accounts (3-legged OAuth 2.0) with a refresh token
+-------------------------------------------------------
+
+The majority of cases are intended to authenticate machines or
+workers rather than actual user accounts. However, it's also
+possible to call Google Cloud APIs with a user account via
+`OAuth 2.0`_.
+
+.. _OAuth 2.0: https://developers.google.com/identity/protocols/OAuth2
+
+.. tip::
+
+    A production application should **use a service account**,
+    but you may wish to use your own personal user account when first
+    getting started with the ``google-cloud-python`` library.
+
+The simplest way to use credentials from a user account is via
+Application Default Credentials using ``gcloud auth login``
+(as mentioned above) and :func:`google.auth.default`:
+
+.. code:: python
+
+    import google.auth
+
+    credentials, project = google.auth.default()
+
+This will still follow the :ref:`precedence <Precedence>`
+described above,
+so be sure none of the other possible environments conflict
+with your user provided credentials.
+
+Advanced users of `oauth2client`_ can also use custom flows to
+create credentials using `client secrets`_ or using a
+`webserver flow`_.
+After creation, :class:`Credentials <oauth2client.client.Credentials>`
+can be serialized with
+:meth:`to_json() <oauth2client.client.Credentials.to_json>`
+and stored in a file and then and deserialized with
+:meth:`from_json() <oauth2client.client.Credentials.from_json>`. In order
+to use ``oauth2client``'s credentials with this library, you'll need to
+`convert them`_.
+
+.. _oauth2client: https://github.com/Google/oauth2client.
+.. _client secrets: https://developers.google.com/api-client-library/python/guide/aaa_oauth#flow_from_clientsecrets
+.. _webserver flow: https://developers.google.com/api-client-library/python/guide/aaa_oauth#OAuth2WebServerFlow
+.. _convert them: http://google-auth.readthedocs.io/en/stable/user-guide.html#user-credentials
+
+Troubleshooting
+===============
+
+Setting up a Service Account
+----------------------------
+
+If your application is not running on Google Compute Engine,
+you need a `Google Developers Service Account`_.
+
+#. Visit the `Google Developers Console`_.
+
+#. Create a new project or click on an existing project.
+
+#. Navigate to **APIs & auth** > **APIs** and enable the APIs
+   that your application requires.
+
+   .. raw:: html
+
+     <img src="https://raw.githubusercontent.com/GoogleCloudPlatform/google-cloud-common/master/authentication/enable-apis.png"/>
+
+  .. note::
+
+      You may need to enable billing in order to use these services.
+
+      * **BigQuery**
+
+        * BigQuery API
+
+      * **Datastore**
+
+        * Google Cloud Datastore API
+
+      * **Pub/Sub**
+
+        * Google Cloud Pub/Sub
+
+      * **Storage**
+
+        * Google Cloud Storage
+        * Google Cloud Storage JSON API
+
+#. Navigate to **APIs & auth** > **Credentials**.
+
+   You should see a screen like one of the following:
+
+   .. raw:: html
+
+     <img src="https://raw.githubusercontent.com/GoogleCloudPlatform/google-cloud-common/master/authentication/create-new-service-account.png">
+
+   .. raw:: html
+
+     <img src="https://raw.githubusercontent.com/GoogleCloudPlatform/google-cloud-common/master/authentication/create-new-service-account-existing-keys.png">
+
+  Find the "Add credentials" drop down and select "Service account" to be
+  guided through downloading a new JSON keyfile.
+
+  If you want to re-use an existing service account,
+  you can easily generate a new keyfile.
+  Just select the account you wish to re-use,
+  and click **Generate new JSON key**:
+
+   .. raw:: html
+
+     <img src="https://raw.githubusercontent.com/GoogleCloudPlatform/google-cloud-common/master/authentication/reuse-service-account.png">
+
+.. _Google Developers Console: https://console.developers.google.com/project
+.. _Google Developers Service Account: https://developers.google.com/accounts/docs/OAuth2ServiceAccount
+
+Using Google Compute Engine
+---------------------------
+
+If your code is running on Google Compute Engine,
+using the inferred Google `Application Default Credentials`_
+will be sufficient for retrieving credentials.
+
+However, by default your credentials may not grant you
+access to the services you intend to use.
+Be sure when you `set up the GCE instance`_,
+you add the correct scopes for the APIs you want to access:
+
+* **All APIs**
+
+    * ``https://www.googleapis.com/auth/cloud-platform``
+    * ``https://www.googleapis.com/auth/cloud-platform.read-only``
+
+* **BigQuery**
+
+    * ``https://www.googleapis.com/auth/bigquery``
+    * ``https://www.googleapis.com/auth/bigquery.insertdata``
+
+* **Datastore**
+
+    * ``https://www.googleapis.com/auth/datastore``
+    * ``https://www.googleapis.com/auth/userinfo.email``
+
+* **Pub/Sub**
+
+    * ``https://www.googleapis.com/auth/pubsub``
+
+* **Storage**
+
+    * ``https://www.googleapis.com/auth/devstorage.full_control``
+    * ``https://www.googleapis.com/auth/devstorage.read_only``
+    * ``https://www.googleapis.com/auth/devstorage.read_write``
+
+.. _set up the GCE instance: https://cloud.google.com/compute/docs/authentication#using
diff --git a/docs/changelog.md b/docs/changelog.md
new file mode 120000
index 0000000..04c99a5
--- /dev/null
+++ b/docs/changelog.md
@@ -0,0 +1 @@
+../CHANGELOG.md
\ No newline at end of file
diff --git a/docs/client_info.rst b/docs/client_info.rst
new file mode 100644
index 0000000..e976b18
--- /dev/null
+++ b/docs/client_info.rst
@@ -0,0 +1,11 @@
+Client Information Helpers
+==========================
+
+.. automodule:: google.api_core.client_info
+  :members:
+  :show-inheritance:
+
+.. automodule:: google.api_core.gapic_v1.client_info
+  :members:
+  :show-inheritance:
+
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..f1f3a2c
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,366 @@
+# -*- coding: utf-8 -*-
+#
+# google-api-core documentation build configuration file
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+import shlex
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+sys.path.insert(0, os.path.abspath(".."))
+
+__version__ = "0.1.0"
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+needs_sphinx = "1.6.3"
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    "sphinx.ext.autodoc",
+    "sphinx.ext.autosummary",
+    "sphinx.ext.intersphinx",
+    "sphinx.ext.coverage",
+    "sphinx.ext.napoleon",
+    "sphinx.ext.todo",
+    "sphinx.ext.viewcode",
+]
+
+# autodoc/autosummary flags
+autoclass_content = "both"
+autodoc_default_flags = ["members"]
+autosummary_generate = True
+
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# Allow markdown includes (so releases.md can include CHANGLEOG.md)
+# http://www.sphinx-doc.org/en/master/markdown.html
+source_parsers = {".md": "recommonmark.parser.CommonMarkParser"}
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+# source_suffix = ['.rst', '.md']
+source_suffix = [".rst", ".md"]
+
+# The encoding of source files.
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = u"google-api-core"
+copyright = u"2017, Google"
+author = u"Google APIs"
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The full version, including alpha/beta/rc tags.
+release = __version__
+# The short X.Y version.
+version = ".".join(release.split(".")[0:2])
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+# today = ''
+# Else, today_fmt is used as the format for a strftime call.
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ["_build"]
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "sphinx"
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+# keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = True
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = "alabaster"
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+    "description": "Google Cloud Client Libraries for Python",
+    "github_user": "googleapis",
+    "github_repo": "google-cloud-python",
+    "github_banner": True,
+    "font_family": "'Roboto', Georgia, sans",
+    "head_font_family": "'Roboto', Georgia, serif",
+    "code_font_family": "'Roboto Mono', 'Consolas', monospace",
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+# html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+# html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+# html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+# html_static_path = []
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+# html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+# html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+# html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+# html_domain_indices = True
+
+# If false, no index is generated.
+# html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+# html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+# html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+# html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+# html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+# html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "google-api-core-doc"
+
+# -- Options for warnings ------------------------------------------------------
+
+
+suppress_warnings = [
+    # Temporarily suppress this to avoid "more than one target found for
+    # cross-reference" warning, which are intractable for us to avoid while in
+    # a mono-repo.
+    # See https://github.com/sphinx-doc/sphinx/blob
+    # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843
+    "ref.python"
+]
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+    # The paper size ('letterpaper' or 'a4paper').
+    #'papersize': 'letterpaper',
+    # The font size ('10pt', '11pt' or '12pt').
+    #'pointsize': '10pt',
+    # Additional stuff for the LaTeX preamble.
+    #'preamble': '',
+    # Latex figure (float) alignment
+    #'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+    (
+        master_doc,
+        "google-api-core.tex",
+        u"google-api-core Documentation",
+        author,
+        "manual",
+    )
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# latex_use_parts = False
+
+# If true, show page references after internal links.
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+# latex_appendices = []
+
+# If false, no module index is generated.
+# latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (
+        master_doc,
+        "google-api-core",
+        u"google-api-core Documentation",
+        [author],
+        1,
+    )
+]
+
+# If true, show URL addresses after external links.
+# man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (
+        master_doc,
+        "google-api-core",
+        u"google-api-core Documentation",
+        author,
+        "google-api-core",
+        "GAPIC library for the {metadata.shortName} v1beta1 service",
+        "APIs",
+    )
+]
+
+# Documents to append as an appendix to all manuals.
+# texinfo_appendices = []
+
+# If false, no module index is generated.
+# texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+# texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+# texinfo_no_detailmenu = False
+
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {
+    "python": ("http://python.readthedocs.org/en/latest/", None),
+    "gax": ("https://gax-python.readthedocs.org/en/latest/", None),
+    "google-auth": ("https://google-auth.readthedocs.io/en/stable", None),
+    "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None),
+    "google.api_core": (
+        "https://googleapis.github.io/google-cloud-python/latest",
+        None,
+    ),
+    "grpc": ("https://grpc.io/grpc/python/", None),
+    "requests": ("http://docs.python-requests.org/en/master/", None),
+    "fastavro": ("https://fastavro.readthedocs.io/en/stable/", None),
+    "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
+}
+
+
+# Napoleon settings
+napoleon_google_docstring = True
+napoleon_numpy_docstring = True
+napoleon_include_private_with_doc = False
+napoleon_include_special_with_doc = True
+napoleon_use_admonition_for_examples = False
+napoleon_use_admonition_for_notes = False
+napoleon_use_admonition_for_references = False
+napoleon_use_ivar = False
+napoleon_use_param = True
+napoleon_use_rtype = True
diff --git a/docs/exceptions.rst b/docs/exceptions.rst
new file mode 100644
index 0000000..d671f4e
--- /dev/null
+++ b/docs/exceptions.rst
@@ -0,0 +1,6 @@
+Exceptions
+==========
+
+.. automodule:: google.api_core.exceptions
+  :members:
+  :show-inheritance:
diff --git a/docs/helpers.rst b/docs/helpers.rst
new file mode 100644
index 0000000..6f72df9
--- /dev/null
+++ b/docs/helpers.rst
@@ -0,0 +1,26 @@
+Helpers
+=======
+
+
+General Helpers
+---------------
+
+.. automodule:: google.api_core.general_helpers
+  :members:
+  :show-inheritance:
+
+
+Datetime Helpers
+----------------
+
+.. automodule:: google.api_core.datetime_helpers
+  :members:
+  :show-inheritance:
+
+
+gRPC Helpers
+------------
+
+.. automodule:: google.api_core.grpc_helpers
+  :members:
+  :show-inheritance:
diff --git a/docs/iam.rst b/docs/iam.rst
new file mode 100644
index 0000000..bb80ae3
--- /dev/null
+++ b/docs/iam.rst
@@ -0,0 +1,7 @@
+Identity and Access Management
+==============================
+
+.. automodule:: google.api_core.iam
+  :members:
+  :show-inheritance:
+  :member-order: bysource
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..112bb30
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,28 @@
+The ``google-cloud-core`` package contains helpers common to all
+``google-cloud-*`` packages. In an attempt to reach a stable API,
+much of the functionality has been split out into this package,
+``google-api-core``.
+
+Core
+====
+
+.. toctree::
+    auth
+    client_info
+    exceptions
+    helpers
+    iam
+    operation
+    operations_client
+    page_iterator
+    path_template
+    retry
+    timeout
+
+Changelog
+~~~~~~~~~
+
+.. toctree::
+    :maxdepth: 2
+
+    changelog
diff --git a/docs/operation.rst b/docs/operation.rst
new file mode 100644
index 0000000..c5e6766
--- /dev/null
+++ b/docs/operation.rst
@@ -0,0 +1,6 @@
+Long-Running Operations
+=======================
+
+.. automodule:: google.api_core.operation
+  :members:
+  :show-inheritance:
diff --git a/docs/operations_client.rst b/docs/operations_client.rst
new file mode 100644
index 0000000..be466d3
--- /dev/null
+++ b/docs/operations_client.rst
@@ -0,0 +1,6 @@
+Long-Running Operations Client
+==============================
+
+.. automodule:: google.api_core.operations_v1
+  :members:
+  :show-inheritance:
diff --git a/docs/page_iterator.rst b/docs/page_iterator.rst
new file mode 100644
index 0000000..28842da
--- /dev/null
+++ b/docs/page_iterator.rst
@@ -0,0 +1,6 @@
+Page Iterators
+==============
+
+.. automodule:: google.api_core.page_iterator
+  :members:
+  :show-inheritance:
diff --git a/docs/path_template.rst b/docs/path_template.rst
new file mode 100644
index 0000000..220779e
--- /dev/null
+++ b/docs/path_template.rst
@@ -0,0 +1,6 @@
+Path Templates
+==============
+
+.. automodule:: google.api_core.path_template
+  :members:
+  :show-inheritance:
diff --git a/docs/retry.rst b/docs/retry.rst
new file mode 100644
index 0000000..23a7d70
--- /dev/null
+++ b/docs/retry.rst
@@ -0,0 +1,6 @@
+Retry
+=====
+
+.. automodule:: google.api_core.retry
+  :members:
+  :show-inheritance:
diff --git a/docs/timeout.rst b/docs/timeout.rst
new file mode 100644
index 0000000..943d425
--- /dev/null
+++ b/docs/timeout.rst
@@ -0,0 +1,6 @@
+Timeout
+=======
+
+.. automodule:: google.api_core.timeout
+  :members:
+  :show-inheritance:
diff --git a/noxfile.py b/noxfile.py
index 06e78c1..5e70db2 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -14,6 +14,7 @@
 
 from __future__ import absolute_import
 import os
+import shutil
 
 # https://github.com/google/importlab/issues/25
 import nox  # pytype: disable=import-error
@@ -103,3 +104,26 @@
     session.install("coverage", "pytest-cov")
     session.run("coverage", "report", "--show-missing", "--fail-under=100")
     session.run("coverage", "erase")
+
+
+@nox.session(python="3.7")
+def docs(session):
+    """Build the docs for this library."""
+
+    session.install(".", "grpcio >= 1.8.2", "grpcio-gcp >= 0.2.2")
+    session.install("-e", ".")
+    session.install("sphinx", "alabaster", "recommonmark")
+
+    shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True)
+    session.run(
+        "sphinx-build",
+        "-W",  # warnings as errors
+        "-T",  # show full traceback on exception
+        "-N",  # no colors
+        "-b",
+        "html",
+        "-d",
+        os.path.join("docs", "_build", "doctrees", ""),
+        os.path.join("docs", ""),
+        os.path.join("docs", "_build", "html", ""),
+    )
\ No newline at end of file