Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/sheets_v4.spreadsheets.developerMetadata.html b/docs/dyn/sheets_v4.spreadsheets.developerMetadata.html
new file mode 100644
index 0000000..8956b2e
--- /dev/null
+++ b/docs/dyn/sheets_v4.spreadsheets.developerMetadata.html
@@ -0,0 +1,411 @@
+<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="sheets_v4.html">Google Sheets API</a> . <a href="sheets_v4.spreadsheets.html">spreadsheets</a> . <a href="sheets_v4.spreadsheets.developerMetadata.html">developerMetadata</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#get">get(spreadsheetId, metadataId, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns the developer metadata with the specified ID.</p>
+<p class="toc_element">
+  <code><a href="#search">search(spreadsheetId, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns all developer metadata matching the specified DataFilter.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="get">get(spreadsheetId, metadataId, x__xgafv=None)</code>
+  <pre>Returns the developer metadata with the specified ID.
+The caller must specify the spreadsheet ID and the developer metadata's
+unique metadataId.
+
+Args:
+  spreadsheetId: string, The ID of the spreadsheet to retrieve metadata from. (required)
+  metadataId: integer, The ID of the developer metadata to retrieve. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Developer metadata associated with a location or object in a spreadsheet.
+      # Developer metadata may be used to associate arbitrary data with various
+      # parts of a spreadsheet and will remain associated at those locations as they
+      # move around and the spreadsheet is edited.  For example, if developer
+      # metadata is associated with row 5 and another row is then subsequently
+      # inserted above row 5, that original metadata will still be associated with
+      # the row it was first associated with (what is now row 6). If the associated
+      # object is deleted its metadata is deleted too.
+    "metadataId": 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
+        # specified when metadata is created, otherwise one will be randomly
+        # generated and assigned. Must be positive.
+    "metadataValue": "A String", # Data associated with the metadata's key.
+    "location": { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
+      "locationType": "A String", # The type of location this object represents.  This field is read-only.
+      "dimensionRange": { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
+          # a dimension. The specified DimensionRange must represent a single row
+          # or column; it cannot be unbounded or span multiple rows or columns.
+          # All indexes are zero-based.
+          # Indexes are half open: the start index is inclusive
+          # and the end index is exclusive.
+          # Missing indexes indicate the range is unbounded on that side.
+        "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
+        "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
+        "sheetId": 42, # The sheet this span is on.
+        "dimension": "A String", # The dimension of the span.
+      },
+      "spreadsheet": True or False, # True when metadata is associated with an entire spreadsheet.
+      "sheetId": 42, # The ID of the sheet when metadata is associated with an entire sheet.
+    },
+    "visibility": "A String", # The metadata visibility.  Developer metadata must always have a visibility
+        # specified.
+    "metadataKey": "A String", # The metadata key. There may be multiple metadata in a spreadsheet with the
+        # same key.  Developer metadata must always have a key specified.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="search">search(spreadsheetId, body, x__xgafv=None)</code>
+  <pre>Returns all developer metadata matching the specified DataFilter.
+If the provided DataFilter represents a DeveloperMetadataLookup object,
+this will return all DeveloperMetadata entries selected by it. If the
+DataFilter represents a location in a spreadsheet, this will return all
+developer metadata associated with locations intersecting that region.
+
+Args:
+  spreadsheetId: string, The ID of the spreadsheet to retrieve metadata from. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # A request to retrieve all developer metadata matching the set of specified
+      # criteria.
+    "dataFilters": [ # The data filters describing the criteria used to determine which
+        # DeveloperMetadata entries to return.  DeveloperMetadata matching any of the
+        # specified filters will be included in the response.
+      { # Filter that describes what data should be selected or returned from a
+          # request.
+        "developerMetadataLookup": { # Selects DeveloperMetadata that matches all of the specified fields.  For # Selects data associated with the developer metadata matching the criteria
+            # described by this DeveloperMetadataLookup.
+            # example, if only a metadata ID is specified this considers the
+            # DeveloperMetadata with that particular unique ID. If a metadata key is
+            # specified, this considers all developer metadata with that key.  If a
+            # key, visibility, and location type are all specified, this considers all
+            # developer metadata with that key and visibility that are associated with a
+            # location of that type.  In general, this
+            # selects all DeveloperMetadata that matches the intersection of all the
+            # specified fields; any field or combination of fields may be specified.
+          "metadataLocation": { # A location where metadata may be associated in a spreadsheet. # Limits the selected developer metadata to those entries associated with
+              # the specified location.  This field either matches exact locations or all
+              # intersecting locations according the specified
+              # locationMatchingStrategy.
+            "locationType": "A String", # The type of location this object represents.  This field is read-only.
+            "dimensionRange": { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
+                # a dimension. The specified DimensionRange must represent a single row
+                # or column; it cannot be unbounded or span multiple rows or columns.
+                # All indexes are zero-based.
+                # Indexes are half open: the start index is inclusive
+                # and the end index is exclusive.
+                # Missing indexes indicate the range is unbounded on that side.
+              "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
+              "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
+              "sheetId": 42, # The sheet this span is on.
+              "dimension": "A String", # The dimension of the span.
+            },
+            "spreadsheet": True or False, # True when metadata is associated with an entire spreadsheet.
+            "sheetId": 42, # The ID of the sheet when metadata is associated with an entire sheet.
+          },
+          "metadataValue": "A String", # Limits the selected developer metadata to that which has a matching
+              # DeveloperMetadata.metadata_value.
+          "locationMatchingStrategy": "A String", # Determines how this lookup matches the location.  If this field is
+              # specified as EXACT, only developer metadata associated on the exact
+              # location specified is matched.  If this field is specified to INTERSECTING,
+              # developer metadata associated on intersecting locations is also
+              # matched.  If left unspecified, this field assumes a default value of
+              # INTERSECTING.
+              # If this field is specified, a metadataLocation
+              # must also be specified.
+          "locationType": "A String", # Limits the selected developer metadata to those entries which are
+              # associated with locations of the specified type.  For example, when this
+              # field is specified as ROW this lookup
+              # only considers developer metadata associated on rows.  If the field is left
+              # unspecified, all location types are considered.  This field cannot be
+              # specified as SPREADSHEET when
+              # the locationMatchingStrategy
+              # is specified as INTERSECTING or when the
+              # metadataLocation is specified as a
+              # non-spreadsheet location: spreadsheet metadata cannot intersect any other
+              # developer metadata location.  This field also must be left unspecified when
+              # the locationMatchingStrategy
+              # is specified as EXACT.
+          "metadataId": 42, # Limits the selected developer metadata to that which has a matching
+              # DeveloperMetadata.metadata_id.
+          "visibility": "A String", # Limits the selected developer metadata to that which has a matching
+              # DeveloperMetadata.visibility.  If left unspecified, all developer
+              # metadata visibile to the requesting project is considered.
+          "metadataKey": "A String", # Limits the selected developer metadata to that which has a matching
+              # DeveloperMetadata.metadata_key.
+        },
+        "a1Range": "A String", # Selects data that matches the specified A1 range.
+        "gridRange": { # A range on a sheet. # Selects data that matches the range described by the GridRange.
+            # All indexes are zero-based.
+            # Indexes are half open, e.g the start index is inclusive
+            # and the end index is exclusive -- [start_index, end_index).
+            # Missing indexes indicate the range is unbounded on that side.
+            #
+            # For example, if `"Sheet1"` is sheet ID 0, then:
+            #
+            #   `Sheet1!A1:A1 == sheet_id: 0,
+            #                   start_row_index: 0, end_row_index: 1,
+            #                   start_column_index: 0, end_column_index: 1`
+            #
+            #   `Sheet1!A3:B4 == sheet_id: 0,
+            #                   start_row_index: 2, end_row_index: 4,
+            #                   start_column_index: 0, end_column_index: 2`
+            #
+            #   `Sheet1!A:B == sheet_id: 0,
+            #                 start_column_index: 0, end_column_index: 2`
+            #
+            #   `Sheet1!A5:B == sheet_id: 0,
+            #                  start_row_index: 4,
+            #                  start_column_index: 0, end_column_index: 2`
+            #
+            #   `Sheet1 == sheet_id:0`
+            #
+            # The start index must always be less than or equal to the end index.
+            # If the start index equals the end index, then the range is empty.
+            # Empty ranges are typically not meaningful and are usually rendered in the
+            # UI as `#REF!`.
+          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
+          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
+          "sheetId": 42, # The sheet this range is on.
+          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
+          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
+        },
+      },
+    ],
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A reply to a developer metadata search request.
+    "matchedDeveloperMetadata": [ # The metadata matching the criteria of the search request.
+      { # A developer metadata entry and the data filters specified in the original
+          # request that matched it.
+        "dataFilters": [ # All filters matching the returned developer metadata.
+          { # Filter that describes what data should be selected or returned from a
+              # request.
+            "developerMetadataLookup": { # Selects DeveloperMetadata that matches all of the specified fields.  For # Selects data associated with the developer metadata matching the criteria
+                # described by this DeveloperMetadataLookup.
+                # example, if only a metadata ID is specified this considers the
+                # DeveloperMetadata with that particular unique ID. If a metadata key is
+                # specified, this considers all developer metadata with that key.  If a
+                # key, visibility, and location type are all specified, this considers all
+                # developer metadata with that key and visibility that are associated with a
+                # location of that type.  In general, this
+                # selects all DeveloperMetadata that matches the intersection of all the
+                # specified fields; any field or combination of fields may be specified.
+              "metadataLocation": { # A location where metadata may be associated in a spreadsheet. # Limits the selected developer metadata to those entries associated with
+                  # the specified location.  This field either matches exact locations or all
+                  # intersecting locations according the specified
+                  # locationMatchingStrategy.
+                "locationType": "A String", # The type of location this object represents.  This field is read-only.
+                "dimensionRange": { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
+                    # a dimension. The specified DimensionRange must represent a single row
+                    # or column; it cannot be unbounded or span multiple rows or columns.
+                    # All indexes are zero-based.
+                    # Indexes are half open: the start index is inclusive
+                    # and the end index is exclusive.
+                    # Missing indexes indicate the range is unbounded on that side.
+                  "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
+                  "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
+                  "sheetId": 42, # The sheet this span is on.
+                  "dimension": "A String", # The dimension of the span.
+                },
+                "spreadsheet": True or False, # True when metadata is associated with an entire spreadsheet.
+                "sheetId": 42, # The ID of the sheet when metadata is associated with an entire sheet.
+              },
+              "metadataValue": "A String", # Limits the selected developer metadata to that which has a matching
+                  # DeveloperMetadata.metadata_value.
+              "locationMatchingStrategy": "A String", # Determines how this lookup matches the location.  If this field is
+                  # specified as EXACT, only developer metadata associated on the exact
+                  # location specified is matched.  If this field is specified to INTERSECTING,
+                  # developer metadata associated on intersecting locations is also
+                  # matched.  If left unspecified, this field assumes a default value of
+                  # INTERSECTING.
+                  # If this field is specified, a metadataLocation
+                  # must also be specified.
+              "locationType": "A String", # Limits the selected developer metadata to those entries which are
+                  # associated with locations of the specified type.  For example, when this
+                  # field is specified as ROW this lookup
+                  # only considers developer metadata associated on rows.  If the field is left
+                  # unspecified, all location types are considered.  This field cannot be
+                  # specified as SPREADSHEET when
+                  # the locationMatchingStrategy
+                  # is specified as INTERSECTING or when the
+                  # metadataLocation is specified as a
+                  # non-spreadsheet location: spreadsheet metadata cannot intersect any other
+                  # developer metadata location.  This field also must be left unspecified when
+                  # the locationMatchingStrategy
+                  # is specified as EXACT.
+              "metadataId": 42, # Limits the selected developer metadata to that which has a matching
+                  # DeveloperMetadata.metadata_id.
+              "visibility": "A String", # Limits the selected developer metadata to that which has a matching
+                  # DeveloperMetadata.visibility.  If left unspecified, all developer
+                  # metadata visibile to the requesting project is considered.
+              "metadataKey": "A String", # Limits the selected developer metadata to that which has a matching
+                  # DeveloperMetadata.metadata_key.
+            },
+            "a1Range": "A String", # Selects data that matches the specified A1 range.
+            "gridRange": { # A range on a sheet. # Selects data that matches the range described by the GridRange.
+                # All indexes are zero-based.
+                # Indexes are half open, e.g the start index is inclusive
+                # and the end index is exclusive -- [start_index, end_index).
+                # Missing indexes indicate the range is unbounded on that side.
+                #
+                # For example, if `"Sheet1"` is sheet ID 0, then:
+                #
+                #   `Sheet1!A1:A1 == sheet_id: 0,
+                #                   start_row_index: 0, end_row_index: 1,
+                #                   start_column_index: 0, end_column_index: 1`
+                #
+                #   `Sheet1!A3:B4 == sheet_id: 0,
+                #                   start_row_index: 2, end_row_index: 4,
+                #                   start_column_index: 0, end_column_index: 2`
+                #
+                #   `Sheet1!A:B == sheet_id: 0,
+                #                 start_column_index: 0, end_column_index: 2`
+                #
+                #   `Sheet1!A5:B == sheet_id: 0,
+                #                  start_row_index: 4,
+                #                  start_column_index: 0, end_column_index: 2`
+                #
+                #   `Sheet1 == sheet_id:0`
+                #
+                # The start index must always be less than or equal to the end index.
+                # If the start index equals the end index, then the range is empty.
+                # Empty ranges are typically not meaningful and are usually rendered in the
+                # UI as `#REF!`.
+              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
+              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
+              "sheetId": 42, # The sheet this range is on.
+              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
+              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
+            },
+          },
+        ],
+        "developerMetadata": { # Developer metadata associated with a location or object in a spreadsheet. # The developer metadata matching the specified filters.
+            # Developer metadata may be used to associate arbitrary data with various
+            # parts of a spreadsheet and will remain associated at those locations as they
+            # move around and the spreadsheet is edited.  For example, if developer
+            # metadata is associated with row 5 and another row is then subsequently
+            # inserted above row 5, that original metadata will still be associated with
+            # the row it was first associated with (what is now row 6). If the associated
+            # object is deleted its metadata is deleted too.
+          "metadataId": 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
+              # specified when metadata is created, otherwise one will be randomly
+              # generated and assigned. Must be positive.
+          "metadataValue": "A String", # Data associated with the metadata's key.
+          "location": { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
+            "locationType": "A String", # The type of location this object represents.  This field is read-only.
+            "dimensionRange": { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
+                # a dimension. The specified DimensionRange must represent a single row
+                # or column; it cannot be unbounded or span multiple rows or columns.
+                # All indexes are zero-based.
+                # Indexes are half open: the start index is inclusive
+                # and the end index is exclusive.
+                # Missing indexes indicate the range is unbounded on that side.
+              "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
+              "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
+              "sheetId": 42, # The sheet this span is on.
+              "dimension": "A String", # The dimension of the span.
+            },
+            "spreadsheet": True or False, # True when metadata is associated with an entire spreadsheet.
+            "sheetId": 42, # The ID of the sheet when metadata is associated with an entire sheet.
+          },
+          "visibility": "A String", # The metadata visibility.  Developer metadata must always have a visibility
+              # specified.
+          "metadataKey": "A String", # The metadata key. There may be multiple metadata in a spreadsheet with the
+              # same key.  Developer metadata must always have a key specified.
+        },
+      },
+    ],
+  }</pre>
+</div>
+
+</body></html>
\ No newline at end of file