Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/classroom_v1.courses.topics.html b/docs/dyn/classroom_v1.courses.topics.html
new file mode 100644
index 0000000..6bcd8d7
--- /dev/null
+++ b/docs/dyn/classroom_v1.courses.topics.html
@@ -0,0 +1,380 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="classroom_v1.html">Google Classroom API</a> . <a href="classroom_v1.courses.html">courses</a> . <a href="classroom_v1.courses.topics.html">topics</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#create">create(courseId, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a topic.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(courseId, id, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a topic.</p>
+<p class="toc_element">
+  <code><a href="#get">get(courseId, id, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns a topic.</p>
+<p class="toc_element">
+  <code><a href="#list">list(courseId, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns the list of topics that the requester is permitted to view.</p>
+<p class="toc_element">
+  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
+<p class="toc_element">
+  <code><a href="#patch">patch(courseId, id, body, updateMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates one or more fields of a topic.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="create">create(courseId, body, x__xgafv=None)</code>
+  <pre>Creates a topic.
+
+This method returns the following error codes:
+
+* `PERMISSION_DENIED` if the requesting user is not permitted to access the
+requested course, create a topic in the requested course,
+or for access errors.
+* `INVALID_ARGUMENT` if the request is malformed.
+* `NOT_FOUND` if the requested course does not exist.
+
+Args:
+  courseId: string, Identifier of the course.
+This identifier can be either the Classroom-assigned identifier or an
+alias. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Topic created by a teacher for the course
+    "courseId": "A String", # Identifier of the course.
+        # 
+        # Read-only.
+    "topicId": "A String", # Unique identifier for the topic.
+        # 
+        # Read-only.
+    "updateTime": "A String", # The time the topic was last updated by the system.
+        # 
+        # Read-only.
+    "name": "A String", # The name of the topic, generated by the user.
+        # Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+        # consecutive whitespaces will be collapsed into one inside the name. The
+        # result must be a non-empty string. Topic names are case sensitive, and must
+        # be no longer than 100 characters.
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Topic created by a teacher for the course
+      "courseId": "A String", # Identifier of the course.
+          #
+          # Read-only.
+      "topicId": "A String", # Unique identifier for the topic.
+          #
+          # Read-only.
+      "updateTime": "A String", # The time the topic was last updated by the system.
+          #
+          # Read-only.
+      "name": "A String", # The name of the topic, generated by the user.
+          # Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+          # consecutive whitespaces will be collapsed into one inside the name. The
+          # result must be a non-empty string. Topic names are case sensitive, and must
+          # be no longer than 100 characters.
+    }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(courseId, id, x__xgafv=None)</code>
+  <pre>Deletes a topic.
+
+This method returns the following error codes:
+
+* `PERMISSION_DENIED` if the requesting user is not allowed to delete the
+requested topic or for access errors.
+* `FAILED_PRECONDITION` if the requested topic has already been
+deleted.
+* `NOT_FOUND` if no course or topic exists with the requested ID.
+
+Args:
+  courseId: string, Identifier of the course.
+This identifier can be either the Classroom-assigned identifier or an
+alias. (required)
+  id: string, Identifier of the topic to delete. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A generic empty message that you can re-use to avoid defining duplicated
+      # empty messages in your APIs. A typical example is to use it as the request
+      # or the response type of an API method. For instance:
+      #
+      #     service Foo {
+      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+      #     }
+      #
+      # The JSON representation for `Empty` is empty JSON object `{}`.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(courseId, id, x__xgafv=None)</code>
+  <pre>Returns a topic.
+
+This method returns the following error codes:
+
+* `PERMISSION_DENIED` if the requesting user is not permitted to access the
+requested course or topic, or for access errors.
+* `INVALID_ARGUMENT` if the request is malformed.
+* `NOT_FOUND` if the requested course or topic does not exist.
+
+Args:
+  courseId: string, Identifier of the course. (required)
+  id: string, Identifier of the topic. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Topic created by a teacher for the course
+      "courseId": "A String", # Identifier of the course.
+          #
+          # Read-only.
+      "topicId": "A String", # Unique identifier for the topic.
+          #
+          # Read-only.
+      "updateTime": "A String", # The time the topic was last updated by the system.
+          #
+          # Read-only.
+      "name": "A String", # The name of the topic, generated by the user.
+          # Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+          # consecutive whitespaces will be collapsed into one inside the name. The
+          # result must be a non-empty string. Topic names are case sensitive, and must
+          # be no longer than 100 characters.
+    }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(courseId, pageSize=None, pageToken=None, x__xgafv=None)</code>
+  <pre>Returns the list of topics that the requester is permitted to view.
+
+This method returns the following error codes:
+
+* `PERMISSION_DENIED` if the requesting user is not permitted to access
+the requested course or for access errors.
+* `INVALID_ARGUMENT` if the request is malformed.
+* `NOT_FOUND` if the requested course does not exist.
+
+Args:
+  courseId: string, Identifier of the course.
+This identifier can be either the Classroom-assigned identifier or an
+alias. (required)
+  pageSize: integer, Maximum number of items to return. Zero or unspecified indicates that the
+server may assign a maximum.
+
+The server may return fewer than the specified number of results.
+  pageToken: string, nextPageToken
+value returned from a previous
+list call,
+indicating that the subsequent page of results should be returned.
+
+The list request
+must be otherwise identical to the one that resulted in this token.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response when listing topics.
+    "nextPageToken": "A String", # Token identifying the next page of results to return. If empty, no further
+        # results are available.
+    "topic": [ # Topic items that match the request.
+      { # Topic created by a teacher for the course
+          "courseId": "A String", # Identifier of the course.
+              #
+              # Read-only.
+          "topicId": "A String", # Unique identifier for the topic.
+              #
+              # Read-only.
+          "updateTime": "A String", # The time the topic was last updated by the system.
+              #
+              # Read-only.
+          "name": "A String", # The name of the topic, generated by the user.
+              # Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+              # consecutive whitespaces will be collapsed into one inside the name. The
+              # result must be a non-empty string. Topic names are case sensitive, and must
+              # be no longer than 100 characters.
+        },
+    ],
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
+  <pre>Retrieves the next page of results.
+
+Args:
+  previous_request: The request for the previous page. (required)
+  previous_response: The response from the request for the previous page. (required)
+
+Returns:
+  A request object that you can call 'execute()' on to request the next
+  page. Returns None if there are no more items in the collection.
+    </pre>
+</div>
+
+<div class="method">
+    <code class="details" id="patch">patch(courseId, id, body, updateMask=None, x__xgafv=None)</code>
+  <pre>Updates one or more fields of a topic.
+
+This method returns the following error codes:
+
+* `PERMISSION_DENIED` if the requesting developer project did not create
+the corresponding topic or for access errors.
+* `INVALID_ARGUMENT` if the request is malformed.
+* `NOT_FOUND` if the requested course or topic does not exist
+
+Args:
+  courseId: string, Identifier of the course.
+This identifier can be either the Classroom-assigned identifier or an
+alias. (required)
+  id: string, Identifier of the topic. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Topic created by a teacher for the course
+    "courseId": "A String", # Identifier of the course.
+        # 
+        # Read-only.
+    "topicId": "A String", # Unique identifier for the topic.
+        # 
+        # Read-only.
+    "updateTime": "A String", # The time the topic was last updated by the system.
+        # 
+        # Read-only.
+    "name": "A String", # The name of the topic, generated by the user.
+        # Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+        # consecutive whitespaces will be collapsed into one inside the name. The
+        # result must be a non-empty string. Topic names are case sensitive, and must
+        # be no longer than 100 characters.
+  }
+
+  updateMask: string, Mask that identifies which fields on the topic to update.
+This field is required to do an update. The update fails if invalid
+fields are specified. If a field supports empty values, it can be cleared
+by specifying it in the update mask and not in the Topic object. If a
+field that does not support empty values is included in the update mask and
+not set in the Topic object, an `INVALID_ARGUMENT` error will be
+returned.
+
+The following fields may be specified:
+
+* `name`
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Topic created by a teacher for the course
+      "courseId": "A String", # Identifier of the course.
+          #
+          # Read-only.
+      "topicId": "A String", # Unique identifier for the topic.
+          #
+          # Read-only.
+      "updateTime": "A String", # The time the topic was last updated by the system.
+          #
+          # Read-only.
+      "name": "A String", # The name of the topic, generated by the user.
+          # Leading and trailing whitespaces, if any, will be trimmed. Also, multiple
+          # consecutive whitespaces will be collapsed into one inside the name. The
+          # result must be a non-empty string. Topic names are case sensitive, and must
+          # be no longer than 100 characters.
+    }</pre>
+</div>
+
+</body></html>
\ No newline at end of file