From 62edbe12a0c5a74eacb8d87ca265a19e6d27f890 Mon Sep 17 00:00:00 2001 From: larkee Date: Tue, 24 Dec 2019 14:38:21 +1100 Subject: [PATCH 01/12] feat(spanner): add deprecation warnings; add field_mask to get_instance; add endpoint_uris to Instance proto; update timeouts; make mutations optional for commits (via synth) --- docs/_static/custom.css | 2 +- docs/_templates/layout.html | 1 + .../gapic/database_admin_client.py | 231 +++++++------- .../gapic/database_admin_client_config.py | 10 +- .../database_admin_grpc_transport.py | 26 +- .../proto/spanner_database_admin.proto | 86 +++-- .../proto/spanner_database_admin_pb2_grpc.py | 7 +- .../gapic/instance_admin_client.py | 41 ++- .../proto/spanner_instance_admin.proto | 15 + .../proto/spanner_instance_admin_pb2.py | 115 +++++-- google/cloud/spanner_v1/batch.py | 2 +- .../cloud/spanner_v1/gapic/spanner_client.py | 41 ++- .../spanner_v1/gapic/spanner_client_config.py | 8 +- google/cloud/spanner_v1/proto/spanner.proto | 300 ++++++++++-------- .../spanner_v1/proto/spanner_pb2_grpc.py | 66 ++-- google/cloud/spanner_v1/transaction.py | 2 +- synth.metadata | 12 +- .../gapic/v1/test_database_admin_client_v1.py | 106 +++---- .../gapic/v1/test_instance_admin_client_v1.py | 12 +- tests/unit/gapic/v1/test_spanner_client_v1.py | 10 +- tests/unit/test_database.py | 2 +- tests/unit/test_session.py | 14 +- 22 files changed, 636 insertions(+), 473 deletions(-) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 9a6f9f8ddc..0abaf229fc 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,4 +1,4 @@ div#python2-eol { border-color: red; border-width: medium; -} \ No newline at end of file +} \ No newline at end of file diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index de457b2c27..228529efe2 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -1,3 +1,4 @@ + {% extends "!layout.html" %} {%- block content %} {%- if theme_fixed_sidebar|lower == 'true' %} diff --git a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py index 52eaacd7dc..adaa0e6bc7 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py +++ b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py @@ -88,7 +88,12 @@ def from_service_account_file(cls, filename, *args, **kwargs): @classmethod def database_path(cls, project, instance, database): - """Return a fully-qualified database string.""" + """DEPRECATED. Return a fully-qualified database string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}/instances/{instance}/databases/{database}", project=project, @@ -98,7 +103,12 @@ def database_path(cls, project, instance, database): @classmethod def instance_path(cls, project, instance): - """Return a fully-qualified instance string.""" + """DEPRECATED. Return a fully-qualified instance string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}/instances/{instance}", project=project, @@ -218,110 +228,6 @@ def __init__( self._inner_api_calls = {} # Service calls - def list_databases( - self, - parent, - page_size=None, - retry=google.api_core.gapic_v1.method.DEFAULT, - timeout=google.api_core.gapic_v1.method.DEFAULT, - metadata=None, - ): - """ - Lists Cloud Spanner databases. - - Example: - >>> from google.cloud import spanner_admin_database_v1 - >>> - >>> client = spanner_admin_database_v1.DatabaseAdminClient() - >>> - >>> parent = client.instance_path('[PROJECT]', '[INSTANCE]') - >>> - >>> # Iterate over all results - >>> for element in client.list_databases(parent): - ... # process element - ... pass - >>> - >>> - >>> # Alternatively: - >>> - >>> # Iterate over results one page at a time - >>> for page in client.list_databases(parent).pages: - ... for element in page: - ... # process element - ... pass - - Args: - parent (str): Required. The instance whose databases should be listed. Values are of - the form ``projects//instances/``. - page_size (int): The maximum number of resources contained in the - underlying API response. If page streaming is performed per- - resource, this parameter does not affect the return value. If page - streaming is performed per-page, this determines the maximum number - of resources in a page. - retry (Optional[google.api_core.retry.Retry]): A retry object used - to retry requests. If ``None`` is specified, requests will - be retried using a default configuration. - timeout (Optional[float]): The amount of time, in seconds, to wait - for the request to complete. Note that if ``retry`` is - specified, the timeout applies to each individual attempt. - metadata (Optional[Sequence[Tuple[str, str]]]): Additional metadata - that is provided to the method. - - Returns: - A :class:`~google.api_core.page_iterator.PageIterator` instance. - An iterable of :class:`~google.cloud.spanner_admin_database_v1.types.Database` instances. - You can also iterate over the pages of the response - using its `pages` property. - - Raises: - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ - # Wrap the transport method to add retry and timeout logic. - if "list_databases" not in self._inner_api_calls: - self._inner_api_calls[ - "list_databases" - ] = google.api_core.gapic_v1.method.wrap_method( - self.transport.list_databases, - default_retry=self._method_configs["ListDatabases"].retry, - default_timeout=self._method_configs["ListDatabases"].timeout, - client_info=self._client_info, - ) - - request = spanner_database_admin_pb2.ListDatabasesRequest( - parent=parent, page_size=page_size - ) - if metadata is None: - metadata = [] - metadata = list(metadata) - try: - routing_header = [("parent", parent)] - except AttributeError: - pass - else: - routing_metadata = google.api_core.gapic_v1.routing_header.to_grpc_metadata( - routing_header - ) - metadata.append(routing_metadata) - - iterator = google.api_core.page_iterator.GRPCIterator( - client=None, - method=functools.partial( - self._inner_api_calls["list_databases"], - retry=retry, - timeout=timeout, - metadata=metadata, - ), - request=request, - items_field="databases", - request_token_field="page_token", - response_token_field="next_page_token", - ) - return iterator - def create_database( self, parent, @@ -769,7 +675,8 @@ def set_iam_policy( >>> >>> client = spanner_admin_database_v1.DatabaseAdminClient() >>> - >>> resource = client.database_path('[PROJECT]', '[INSTANCE]', '[DATABASE]') + >>> # TODO: Initialize `resource`: + >>> resource = '' >>> >>> # TODO: Initialize `policy`: >>> policy = {} @@ -854,7 +761,8 @@ def get_iam_policy( >>> >>> client = spanner_admin_database_v1.DatabaseAdminClient() >>> - >>> resource = client.database_path('[PROJECT]', '[INSTANCE]', '[DATABASE]') + >>> # TODO: Initialize `resource`: + >>> resource = '' >>> >>> response = client.get_iam_policy(resource) @@ -938,7 +846,8 @@ def test_iam_permissions( >>> >>> client = spanner_admin_database_v1.DatabaseAdminClient() >>> - >>> resource = client.database_path('[PROJECT]', '[INSTANCE]', '[DATABASE]') + >>> # TODO: Initialize `resource`: + >>> resource = '' >>> >>> # TODO: Initialize `permissions`: >>> permissions = [] @@ -1001,3 +910,107 @@ def test_iam_permissions( return self._inner_api_calls["test_iam_permissions"]( request, retry=retry, timeout=timeout, metadata=metadata ) + + def list_databases( + self, + parent, + page_size=None, + retry=google.api_core.gapic_v1.method.DEFAULT, + timeout=google.api_core.gapic_v1.method.DEFAULT, + metadata=None, + ): + """ + Lists Cloud Spanner databases. + + Example: + >>> from google.cloud import spanner_admin_database_v1 + >>> + >>> client = spanner_admin_database_v1.DatabaseAdminClient() + >>> + >>> parent = client.instance_path('[PROJECT]', '[INSTANCE]') + >>> + >>> # Iterate over all results + >>> for element in client.list_databases(parent): + ... # process element + ... pass + >>> + >>> + >>> # Alternatively: + >>> + >>> # Iterate over results one page at a time + >>> for page in client.list_databases(parent).pages: + ... for element in page: + ... # process element + ... pass + + Args: + parent (str): Required. The instance whose databases should be listed. Values are of + the form ``projects//instances/``. + page_size (int): The maximum number of resources contained in the + underlying API response. If page streaming is performed per- + resource, this parameter does not affect the return value. If page + streaming is performed per-page, this determines the maximum number + of resources in a page. + retry (Optional[google.api_core.retry.Retry]): A retry object used + to retry requests. If ``None`` is specified, requests will + be retried using a default configuration. + timeout (Optional[float]): The amount of time, in seconds, to wait + for the request to complete. Note that if ``retry`` is + specified, the timeout applies to each individual attempt. + metadata (Optional[Sequence[Tuple[str, str]]]): Additional metadata + that is provided to the method. + + Returns: + A :class:`~google.api_core.page_iterator.PageIterator` instance. + An iterable of :class:`~google.cloud.spanner_admin_database_v1.types.Database` instances. + You can also iterate over the pages of the response + using its `pages` property. + + Raises: + google.api_core.exceptions.GoogleAPICallError: If the request + failed for any reason. + google.api_core.exceptions.RetryError: If the request failed due + to a retryable error and retry attempts failed. + ValueError: If the parameters are invalid. + """ + # Wrap the transport method to add retry and timeout logic. + if "list_databases" not in self._inner_api_calls: + self._inner_api_calls[ + "list_databases" + ] = google.api_core.gapic_v1.method.wrap_method( + self.transport.list_databases, + default_retry=self._method_configs["ListDatabases"].retry, + default_timeout=self._method_configs["ListDatabases"].timeout, + client_info=self._client_info, + ) + + request = spanner_database_admin_pb2.ListDatabasesRequest( + parent=parent, page_size=page_size + ) + if metadata is None: + metadata = [] + metadata = list(metadata) + try: + routing_header = [("parent", parent)] + except AttributeError: + pass + else: + routing_metadata = google.api_core.gapic_v1.routing_header.to_grpc_metadata( + routing_header + ) + metadata.append(routing_metadata) + + iterator = google.api_core.page_iterator.GRPCIterator( + client=None, + method=functools.partial( + self._inner_api_calls["list_databases"], + retry=retry, + timeout=timeout, + metadata=metadata, + ), + request=request, + items_field="databases", + request_token_field="page_token", + response_token_field="next_page_token", + ) + return iterator diff --git a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py index 46d60f0191..90c9f796e2 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py +++ b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py @@ -17,11 +17,6 @@ } }, "methods": { - "ListDatabases": { - "timeout_millis": 30000, - "retry_codes_name": "idempotent", - "retry_params_name": "default", - }, "CreateDatabase": { "timeout_millis": 3600000, "retry_codes_name": "non_idempotent", @@ -62,6 +57,11 @@ "retry_codes_name": "non_idempotent", "retry_params_name": "default", }, + "ListDatabases": { + "timeout_millis": 60000, + "retry_codes_name": "idempotent", + "retry_params_name": "default", + }, }, } } diff --git a/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py b/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py index 7308d265ea..24eab024c6 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py +++ b/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py @@ -120,19 +120,6 @@ def channel(self): """ return self._channel - @property - def list_databases(self): - """Return the gRPC stub for :meth:`DatabaseAdminClient.list_databases`. - - Lists Cloud Spanner databases. - - Returns: - Callable: A callable which accepts the appropriate - deserialized request object and returns a - deserialized response object. - """ - return self._stubs["database_admin_stub"].ListDatabases - @property def create_database(self): """Return the gRPC stub for :meth:`DatabaseAdminClient.create_database`. @@ -262,3 +249,16 @@ def test_iam_permissions(self): deserialized response object. """ return self._stubs["database_admin_stub"].TestIamPermissions + + @property + def list_databases(self): + """Return the gRPC stub for :meth:`DatabaseAdminClient.list_databases`. + + Lists Cloud Spanner databases. + + Returns: + Callable: A callable which accepts the appropriate + deserialized request object and returns a + deserialized response object. + """ + return self._stubs["database_admin_stub"].ListDatabases diff --git a/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto b/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto index 8bd8f2c665..ea5200b4cb 100644 --- a/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto +++ b/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto @@ -34,6 +34,14 @@ option java_outer_classname = "SpannerDatabaseAdminProto"; option java_package = "com.google.spanner.admin.database.v1"; option php_namespace = "Google\\Cloud\\Spanner\\Admin\\Database\\V1"; +// The Instance resource is defined in `google.spanner.admin.instance.v1`. +// Because this is a separate, independent API (technically), we redefine +// the resource name pattern here. +option (google.api.resource_definition) = { + type: "spanner.googleapis.com/Instance" + pattern: "projects/{project}/instances/{instance}" +}; + // Cloud Spanner Database Admin API // // The Cloud Spanner Database Admin API can be used to create, drop, and @@ -58,10 +66,11 @@ service DatabaseAdmin { // have a name of the format `/operations/` and // can be used to track preparation of the database. The // [metadata][google.longrunning.Operation.metadata] field type is - // [CreateDatabaseMetadata][google.spanner.admin.database.v1.CreateDatabaseMetadata]. The - // [response][google.longrunning.Operation.response] field type is + // [CreateDatabaseMetadata][google.spanner.admin.database.v1.CreateDatabaseMetadata]. + // The [response][google.longrunning.Operation.response] field type is // [Database][google.spanner.admin.database.v1.Database], if successful. - rpc CreateDatabase(CreateDatabaseRequest) returns (google.longrunning.Operation) { + rpc CreateDatabase(CreateDatabaseRequest) + returns (google.longrunning.Operation) { option (google.api.http) = { post: "/v1/{parent=projects/*/instances/*}/databases" body: "*" @@ -87,8 +96,10 @@ service DatabaseAdmin { // the format `/operations/` and can be used to // track execution of the schema change(s). The // [metadata][google.longrunning.Operation.metadata] field type is - // [UpdateDatabaseDdlMetadata][google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata]. The operation has no response. - rpc UpdateDatabaseDdl(UpdateDatabaseDdlRequest) returns (google.longrunning.Operation) { + // [UpdateDatabaseDdlMetadata][google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata]. + // The operation has no response. + rpc UpdateDatabaseDdl(UpdateDatabaseDdlRequest) + returns (google.longrunning.Operation) { option (google.api.http) = { patch: "/v1/{database=projects/*/instances/*/databases/*}/ddl" body: "*" @@ -123,7 +134,8 @@ service DatabaseAdmin { // // Authorization requires `spanner.databases.setIamPolicy` // permission on [resource][google.iam.v1.SetIamPolicyRequest.resource]. - rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest) returns (google.iam.v1.Policy) { + rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest) + returns (google.iam.v1.Policy) { option (google.api.http) = { post: "/v1/{resource=projects/*/instances/*/databases/*}:setIamPolicy" body: "*" @@ -141,7 +153,8 @@ service DatabaseAdmin { // // Authorization requires `spanner.databases.getIamPolicy` permission on // [resource][google.iam.v1.GetIamPolicyRequest.resource]. - rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest) returns (google.iam.v1.Policy) { + rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest) + returns (google.iam.v1.Policy) { option (google.api.http) = { post: "/v1/{resource=projects/*/instances/*/databases/*}:getIamPolicy" body: "*" @@ -159,7 +172,8 @@ service DatabaseAdmin { // result in a NOT_FOUND error if the user has // `spanner.databases.list` permission on the containing Cloud // Spanner instance. Otherwise returns an empty set of permissions. - rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest) returns (google.iam.v1.TestIamPermissionsResponse) { + rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest) + returns (google.iam.v1.TestIamPermissionsResponse) { option (google.api.http) = { post: "/v1/{resource=projects/*/instances/*/databases/*}:testIamPermissions" body: "*" @@ -203,7 +217,8 @@ message Database { State state = 2; } -// The request for [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. +// The request for +// [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. message ListDatabasesRequest { // Required. The instance whose databases should be listed. // Values are of the form `projects//instances/`. @@ -219,23 +234,26 @@ message ListDatabasesRequest { int32 page_size = 3; // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.admin.database.v1.ListDatabasesResponse.next_page_token] from a - // previous [ListDatabasesResponse][google.spanner.admin.database.v1.ListDatabasesResponse]. + // [next_page_token][google.spanner.admin.database.v1.ListDatabasesResponse.next_page_token] + // from a previous + // [ListDatabasesResponse][google.spanner.admin.database.v1.ListDatabasesResponse]. string page_token = 4; } -// The response for [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. +// The response for +// [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. message ListDatabasesResponse { // Databases that matched the request. repeated Database databases = 1; // `next_page_token` can be sent in a subsequent - // [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases] call to fetch more - // of the matching databases. + // [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases] + // call to fetch more of the matching databases. string next_page_token = 2; } -// The request for [CreateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase]. +// The request for +// [CreateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase]. message CreateDatabaseRequest { // Required. The name of the instance that will serve the new database. // Values are of the form `projects//instances/`. @@ -269,7 +287,8 @@ message CreateDatabaseMetadata { }]; } -// The request for [GetDatabase][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabase]. +// The request for +// [GetDatabase][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabase]. message GetDatabaseRequest { // Required. The name of the requested database. Values are of the form // `projects//instances//databases/`. @@ -295,8 +314,8 @@ message GetDatabaseRequest { // Each batch of statements is assigned a name which can be used with // the [Operations][google.longrunning.Operations] API to monitor // progress. See the -// [operation_id][google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.operation_id] field for more -// details. +// [operation_id][google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.operation_id] +// field for more details. message UpdateDatabaseDdlRequest { // Required. The database to update. string database = 1 [ @@ -316,18 +335,20 @@ message UpdateDatabaseDdlRequest { // // Specifying an explicit operation ID simplifies determining // whether the statements were executed in the event that the - // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] call is replayed, - // or the return value is otherwise lost: the [database][google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.database] and - // `operation_id` fields can be combined to form the + // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] + // call is replayed, or the return value is otherwise lost: the + // [database][google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.database] + // and `operation_id` fields can be combined to form the // [name][google.longrunning.Operation.name] of the resulting - // [longrunning.Operation][google.longrunning.Operation]: `/operations/`. + // [longrunning.Operation][google.longrunning.Operation]: + // `/operations/`. // // `operation_id` should be unique within the database, and must be // a valid identifier: `[a-z][a-z0-9_]*`. Note that // automatically-generated operation IDs always begin with an // underscore. If the named operation already exists, - // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] returns - // `ALREADY_EXISTS`. + // [UpdateDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl] + // returns `ALREADY_EXISTS`. string operation_id = 3; } @@ -349,7 +370,8 @@ message UpdateDatabaseDdlMetadata { repeated google.protobuf.Timestamp commit_timestamps = 3; } -// The request for [DropDatabase][google.spanner.admin.database.v1.DatabaseAdmin.DropDatabase]. +// The request for +// [DropDatabase][google.spanner.admin.database.v1.DatabaseAdmin.DropDatabase]. message DropDatabaseRequest { // Required. The database to be dropped. string database = 1 [ @@ -360,7 +382,8 @@ message DropDatabaseRequest { ]; } -// The request for [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. +// The request for +// [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. message GetDatabaseDdlRequest { // Required. The database whose schema we wish to get. string database = 1 [ @@ -371,17 +394,10 @@ message GetDatabaseDdlRequest { ]; } -// The response for [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. +// The response for +// [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. message GetDatabaseDdlResponse { // A list of formatted DDL statements defining the schema of the database // specified in the request. repeated string statements = 1; } - -// The Instance resource is defined in `google.spanner.admin.instance.v1`. -// Because this is a separate, independent API (technically), we redefine -// the resource name pattern here. -option (google.api.resource_definition) = { - type: "spanner.googleapis.com/Instance" - pattern: "projects/{project}/instances/{instance}" -}; diff --git a/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py b/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py index 2491691e6b..7ea7ddb6fa 100644 --- a/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py +++ b/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py @@ -94,8 +94,8 @@ def CreateDatabase(self, request, context): have a name of the format `/operations/` and can be used to track preparation of the database. The [metadata][google.longrunning.Operation.metadata] field type is - [CreateDatabaseMetadata][google.spanner.admin.database.v1.CreateDatabaseMetadata]. The - [response][google.longrunning.Operation.response] field type is + [CreateDatabaseMetadata][google.spanner.admin.database.v1.CreateDatabaseMetadata]. + The [response][google.longrunning.Operation.response] field type is [Database][google.spanner.admin.database.v1.Database], if successful. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -116,7 +116,8 @@ def UpdateDatabaseDdl(self, request, context): the format `/operations/` and can be used to track execution of the schema change(s). The [metadata][google.longrunning.Operation.metadata] field type is - [UpdateDatabaseDdlMetadata][google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata]. The operation has no response. + [UpdateDatabaseDdlMetadata][google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata]. + The operation has no response. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") diff --git a/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py b/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py index c2c18a5840..a5bbe38642 100644 --- a/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py +++ b/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py @@ -105,7 +105,12 @@ def from_service_account_file(cls, filename, *args, **kwargs): @classmethod def instance_path(cls, project, instance): - """Return a fully-qualified instance string.""" + """DEPRECATED. Return a fully-qualified instance string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}/instances/{instance}", project=project, @@ -114,7 +119,12 @@ def instance_path(cls, project, instance): @classmethod def instance_config_path(cls, project, instance_config): - """Return a fully-qualified instance_config string.""" + """DEPRECATED. Return a fully-qualified instance_config string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}/instanceConfigs/{instance_config}", project=project, @@ -123,7 +133,12 @@ def instance_config_path(cls, project, instance_config): @classmethod def project_path(cls, project): - """Return a fully-qualified project string.""" + """DEPRECATED. Return a fully-qualified project string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}", project=project ) @@ -542,6 +557,7 @@ def list_instances( def get_instance( self, name, + field_mask=None, retry=google.api_core.gapic_v1.method.DEFAULT, timeout=google.api_core.gapic_v1.method.DEFAULT, metadata=None, @@ -561,6 +577,12 @@ def get_instance( Args: name (str): Required. The name of the requested instance. Values are of the form ``projects//instances/``. + field_mask (Union[dict, ~google.cloud.spanner_admin_instance_v1.types.FieldMask]): If field\_mask is present, specifies the subset of [][google.spanner.admin.instance.v1.Instance] fields + that should be returned. If absent, all [][google.spanner.admin.instance.v1.Instance] fields are + returned. + + If a dict is provided, it must be of the same form as the protobuf + message :class:`~google.cloud.spanner_admin_instance_v1.types.FieldMask` retry (Optional[google.api_core.retry.Retry]): A retry object used to retry requests. If ``None`` is specified, requests will be retried using a default configuration. @@ -591,7 +613,9 @@ def get_instance( client_info=self._client_info, ) - request = spanner_instance_admin_pb2.GetInstanceRequest(name=name) + request = spanner_instance_admin_pb2.GetInstanceRequest( + name=name, field_mask=field_mask + ) if metadata is None: metadata = [] metadata = list(metadata) @@ -980,7 +1004,8 @@ def set_iam_policy( >>> >>> client = spanner_admin_instance_v1.InstanceAdminClient() >>> - >>> resource = client.instance_path('[PROJECT]', '[INSTANCE]') + >>> # TODO: Initialize `resource`: + >>> resource = '' >>> >>> # TODO: Initialize `policy`: >>> policy = {} @@ -1065,7 +1090,8 @@ def get_iam_policy( >>> >>> client = spanner_admin_instance_v1.InstanceAdminClient() >>> - >>> resource = client.instance_path('[PROJECT]', '[INSTANCE]') + >>> # TODO: Initialize `resource`: + >>> resource = '' >>> >>> response = client.get_iam_policy(resource) @@ -1149,7 +1175,8 @@ def test_iam_permissions( >>> >>> client = spanner_admin_instance_v1.InstanceAdminClient() >>> - >>> resource = client.instance_path('[PROJECT]', '[INSTANCE]') + >>> # TODO: Initialize `resource`: + >>> resource = '' >>> >>> # TODO: Initialize `permissions`: >>> permissions = [] diff --git a/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto b/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto index 12b090e5d2..a437874133 100644 --- a/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto +++ b/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto @@ -397,6 +397,16 @@ message Instance { // as the string: name + "_" + value would prove problematic if we were to // allow "_" in a future release. map labels = 7; + + // Output only. The endpoint URIs based on the instance config. + // For example, instances located in a specific cloud region (or multi region) + // such as nam3, would have a nam3 specific endpoint URI. + // This URI is to be used implictly by SDK clients, with fallback to default + // URI. These endpoints are intended to optimize the network routing between + // the client and the instance's serving resources. + // If multiple endpoints are present, client may establish connections using + // any of the given URIs. + repeated string endpoint_uris = 8; } // The request for [ListInstanceConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigs]. @@ -455,6 +465,11 @@ message GetInstanceRequest { type: "spanner.googleapis.com/Instance" } ]; + + // If field_mask is present, specifies the subset of [][Instance] fields that + // should be returned. + // If absent, all [][Instance] fields are returned. + google.protobuf.FieldMask field_mask = 2; } // The request for [CreateInstance][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstance]. diff --git a/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py b/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py index d1fe569a9f..a70d64b0a8 100644 --- a/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py +++ b/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py @@ -37,7 +37,7 @@ "\n$com.google.spanner.admin.instance.v1B\031SpannerInstanceAdminProtoP\001ZHgoogle.golang.org/genproto/googleapis/spanner/admin/instance/v1;instance\252\002&Google.Cloud.Spanner.Admin.Instance.V1\312\002&Google\\Cloud\\Spanner\\Admin\\Instance\\V1" ), serialized_pb=_b( - '\nIgoogle/cloud/spanner/admin/instance_v1/proto/spanner_instance_admin.proto\x12 google.spanner.admin.instance.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x1egoogle/iam/v1/iam_policy.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a#google/longrunning/operations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xda\x01\n\x0bReplicaInfo\x12\x10\n\x08location\x18\x01 \x01(\t\x12G\n\x04type\x18\x02 \x01(\x0e\x32\x39.google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType\x12\x1f\n\x17\x64\x65\x66\x61ult_leader_location\x18\x03 \x01(\x08"O\n\x0bReplicaType\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x0e\n\nREAD_WRITE\x10\x01\x12\r\n\tREAD_ONLY\x10\x02\x12\x0b\n\x07WITNESS\x10\x03"\xd7\x01\n\x0eInstanceConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12?\n\x08replicas\x18\x03 \x03(\x0b\x32-.google.spanner.admin.instance.v1.ReplicaInfo:`\xea\x41]\n%spanner.googleapis.com/InstanceConfig\x12\x34projects/{project}/instanceConfigs/{instance_config}"\xbe\x03\n\x08Instance\x12\x0c\n\x04name\x18\x01 \x01(\t\x12:\n\x06\x63onfig\x18\x02 \x01(\tB*\xfa\x41\'\n%spanner.googleapis.com/InstanceConfig\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\x12\n\nnode_count\x18\x05 \x01(\x05\x12?\n\x05state\x18\x06 \x01(\x0e\x32\x30.google.spanner.admin.instance.v1.Instance.State\x12\x46\n\x06labels\x18\x07 \x03(\x0b\x32\x36.google.spanner.admin.instance.v1.Instance.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"7\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0c\n\x08\x43REATING\x10\x01\x12\t\n\x05READY\x10\x02:M\xea\x41J\n\x1fspanner.googleapis.com/Instance\x12\'projects/{project}/instances/{instance}"\x88\x01\n\x1aListInstanceConfigsRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t"\x82\x01\n\x1bListInstanceConfigsResponse\x12J\n\x10instance_configs\x18\x01 \x03(\x0b\x32\x30.google.spanner.admin.instance.v1.InstanceConfig\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"W\n\x18GetInstanceConfigRequest\x12;\n\x04name\x18\x01 \x01(\tB-\xe0\x41\x02\xfa\x41\'\n%spanner.googleapis.com/InstanceConfig"K\n\x12GetInstanceRequest\x12\x35\n\x04name\x18\x01 \x01(\tB\'\xe0\x41\x02\xfa\x41!\n\x1fspanner.googleapis.com/Instance"\xb9\x01\n\x15\x43reateInstanceRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x18\n\x0binstance_id\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x41\n\x08instance\x18\x03 \x01(\x0b\x32*.google.spanner.admin.instance.v1.InstanceB\x03\xe0\x41\x02"\x92\x01\n\x14ListInstancesRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x04 \x01(\t"o\n\x15ListInstancesResponse\x12=\n\tinstances\x18\x01 \x03(\x0b\x32*.google.spanner.admin.instance.v1.Instance\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"\x8f\x01\n\x15UpdateInstanceRequest\x12\x41\n\x08instance\x18\x01 \x01(\x0b\x32*.google.spanner.admin.instance.v1.InstanceB\x03\xe0\x41\x02\x12\x33\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02"N\n\x15\x44\x65leteInstanceRequest\x12\x35\n\x04name\x18\x01 \x01(\tB\'\xe0\x41\x02\xfa\x41!\n\x1fspanner.googleapis.com/Instance"\xe5\x01\n\x16\x43reateInstanceMetadata\x12<\n\x08instance\x18\x01 \x01(\x0b\x32*.google.spanner.admin.instance.v1.Instance\x12.\n\nstart_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x63\x61ncel_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xe5\x01\n\x16UpdateInstanceMetadata\x12<\n\x08instance\x18\x01 \x01(\x0b\x32*.google.spanner.admin.instance.v1.Instance\x12.\n\nstart_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x63\x61ncel_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp2\xbf\x10\n\rInstanceAdmin\x12\xcc\x01\n\x13ListInstanceConfigs\x12<.google.spanner.admin.instance.v1.ListInstanceConfigsRequest\x1a=.google.spanner.admin.instance.v1.ListInstanceConfigsResponse"8\x82\xd3\xe4\x93\x02)\x12\'/v1/{parent=projects/*}/instanceConfigs\xda\x41\x06parent\x12\xb9\x01\n\x11GetInstanceConfig\x12:.google.spanner.admin.instance.v1.GetInstanceConfigRequest\x1a\x30.google.spanner.admin.instance.v1.InstanceConfig"6\x82\xd3\xe4\x93\x02)\x12\'/v1/{name=projects/*/instanceConfigs/*}\xda\x41\x04name\x12\xb4\x01\n\rListInstances\x12\x36.google.spanner.admin.instance.v1.ListInstancesRequest\x1a\x37.google.spanner.admin.instance.v1.ListInstancesResponse"2\x82\xd3\xe4\x93\x02#\x12!/v1/{parent=projects/*}/instances\xda\x41\x06parent\x12\xa1\x01\n\x0bGetInstance\x12\x34.google.spanner.admin.instance.v1.GetInstanceRequest\x1a*.google.spanner.admin.instance.v1.Instance"0\x82\xd3\xe4\x93\x02#\x12!/v1/{name=projects/*/instances/*}\xda\x41\x04name\x12\x9c\x02\n\x0e\x43reateInstance\x12\x37.google.spanner.admin.instance.v1.CreateInstanceRequest\x1a\x1d.google.longrunning.Operation"\xb1\x01\x82\xd3\xe4\x93\x02&"!/v1/{parent=projects/*}/instances:\x01*\xda\x41\x1bparent,instance_id,instance\xca\x41\x64\n)google.spanner.admin.instance.v1.Instance\x12\x37google.spanner.admin.instance.v1.CreateInstanceMetadata\x12\x9d\x02\n\x0eUpdateInstance\x12\x37.google.spanner.admin.instance.v1.UpdateInstanceRequest\x1a\x1d.google.longrunning.Operation"\xb2\x01\x82\xd3\xe4\x93\x02/2*/v1/{instance.name=projects/*/instances/*}:\x01*\xda\x41\x13instance,field_mask\xca\x41\x64\n)google.spanner.admin.instance.v1.Instance\x12\x37google.spanner.admin.instance.v1.UpdateInstanceMetadata\x12\x93\x01\n\x0e\x44\x65leteInstance\x12\x37.google.spanner.admin.instance.v1.DeleteInstanceRequest\x1a\x16.google.protobuf.Empty"0\x82\xd3\xe4\x93\x02#*!/v1/{name=projects/*/instances/*}\xda\x41\x04name\x12\x9a\x01\n\x0cSetIamPolicy\x12".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy"O\x82\xd3\xe4\x93\x02\x37"2/v1/{resource=projects/*/instances/*}:setIamPolicy:\x01*\xda\x41\x0fresource,policy\x12\x93\x01\n\x0cGetIamPolicy\x12".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy"H\x82\xd3\xe4\x93\x02\x37"2/v1/{resource=projects/*/instances/*}:getIamPolicy:\x01*\xda\x41\x08resource\x12\xc5\x01\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse"Z\x82\xd3\xe4\x93\x02="8/v1/{resource=projects/*/instances/*}:testIamPermissions:\x01*\xda\x41\x14resource,permissions\x1ax\xca\x41\x16spanner.googleapis.com\xd2\x41\\https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/spanner.adminB\xdf\x01\n$com.google.spanner.admin.instance.v1B\x19SpannerInstanceAdminProtoP\x01ZHgoogle.golang.org/genproto/googleapis/spanner/admin/instance/v1;instance\xaa\x02&Google.Cloud.Spanner.Admin.Instance.V1\xca\x02&Google\\Cloud\\Spanner\\Admin\\Instance\\V1b\x06proto3' + '\nIgoogle/cloud/spanner/admin/instance_v1/proto/spanner_instance_admin.proto\x12 google.spanner.admin.instance.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x1egoogle/iam/v1/iam_policy.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a#google/longrunning/operations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xda\x01\n\x0bReplicaInfo\x12\x10\n\x08location\x18\x01 \x01(\t\x12G\n\x04type\x18\x02 \x01(\x0e\x32\x39.google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType\x12\x1f\n\x17\x64\x65\x66\x61ult_leader_location\x18\x03 \x01(\x08"O\n\x0bReplicaType\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x0e\n\nREAD_WRITE\x10\x01\x12\r\n\tREAD_ONLY\x10\x02\x12\x0b\n\x07WITNESS\x10\x03"\xd7\x01\n\x0eInstanceConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12?\n\x08replicas\x18\x03 \x03(\x0b\x32-.google.spanner.admin.instance.v1.ReplicaInfo:`\xea\x41]\n%spanner.googleapis.com/InstanceConfig\x12\x34projects/{project}/instanceConfigs/{instance_config}"\xd5\x03\n\x08Instance\x12\x0c\n\x04name\x18\x01 \x01(\t\x12:\n\x06\x63onfig\x18\x02 \x01(\tB*\xfa\x41\'\n%spanner.googleapis.com/InstanceConfig\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\x12\n\nnode_count\x18\x05 \x01(\x05\x12?\n\x05state\x18\x06 \x01(\x0e\x32\x30.google.spanner.admin.instance.v1.Instance.State\x12\x46\n\x06labels\x18\x07 \x03(\x0b\x32\x36.google.spanner.admin.instance.v1.Instance.LabelsEntry\x12\x15\n\rendpoint_uris\x18\x08 \x03(\t\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"7\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0c\n\x08\x43REATING\x10\x01\x12\t\n\x05READY\x10\x02:M\xea\x41J\n\x1fspanner.googleapis.com/Instance\x12\'projects/{project}/instances/{instance}"\x88\x01\n\x1aListInstanceConfigsRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t"\x82\x01\n\x1bListInstanceConfigsResponse\x12J\n\x10instance_configs\x18\x01 \x03(\x0b\x32\x30.google.spanner.admin.instance.v1.InstanceConfig\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"W\n\x18GetInstanceConfigRequest\x12;\n\x04name\x18\x01 \x01(\tB-\xe0\x41\x02\xfa\x41\'\n%spanner.googleapis.com/InstanceConfig"{\n\x12GetInstanceRequest\x12\x35\n\x04name\x18\x01 \x01(\tB\'\xe0\x41\x02\xfa\x41!\n\x1fspanner.googleapis.com/Instance\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask"\xb9\x01\n\x15\x43reateInstanceRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x18\n\x0binstance_id\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x41\n\x08instance\x18\x03 \x01(\x0b\x32*.google.spanner.admin.instance.v1.InstanceB\x03\xe0\x41\x02"\x92\x01\n\x14ListInstancesRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x04 \x01(\t"o\n\x15ListInstancesResponse\x12=\n\tinstances\x18\x01 \x03(\x0b\x32*.google.spanner.admin.instance.v1.Instance\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t"\x8f\x01\n\x15UpdateInstanceRequest\x12\x41\n\x08instance\x18\x01 \x01(\x0b\x32*.google.spanner.admin.instance.v1.InstanceB\x03\xe0\x41\x02\x12\x33\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02"N\n\x15\x44\x65leteInstanceRequest\x12\x35\n\x04name\x18\x01 \x01(\tB\'\xe0\x41\x02\xfa\x41!\n\x1fspanner.googleapis.com/Instance"\xe5\x01\n\x16\x43reateInstanceMetadata\x12<\n\x08instance\x18\x01 \x01(\x0b\x32*.google.spanner.admin.instance.v1.Instance\x12.\n\nstart_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x63\x61ncel_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xe5\x01\n\x16UpdateInstanceMetadata\x12<\n\x08instance\x18\x01 \x01(\x0b\x32*.google.spanner.admin.instance.v1.Instance\x12.\n\nstart_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x63\x61ncel_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp2\xbf\x10\n\rInstanceAdmin\x12\xcc\x01\n\x13ListInstanceConfigs\x12<.google.spanner.admin.instance.v1.ListInstanceConfigsRequest\x1a=.google.spanner.admin.instance.v1.ListInstanceConfigsResponse"8\x82\xd3\xe4\x93\x02)\x12\'/v1/{parent=projects/*}/instanceConfigs\xda\x41\x06parent\x12\xb9\x01\n\x11GetInstanceConfig\x12:.google.spanner.admin.instance.v1.GetInstanceConfigRequest\x1a\x30.google.spanner.admin.instance.v1.InstanceConfig"6\x82\xd3\xe4\x93\x02)\x12\'/v1/{name=projects/*/instanceConfigs/*}\xda\x41\x04name\x12\xb4\x01\n\rListInstances\x12\x36.google.spanner.admin.instance.v1.ListInstancesRequest\x1a\x37.google.spanner.admin.instance.v1.ListInstancesResponse"2\x82\xd3\xe4\x93\x02#\x12!/v1/{parent=projects/*}/instances\xda\x41\x06parent\x12\xa1\x01\n\x0bGetInstance\x12\x34.google.spanner.admin.instance.v1.GetInstanceRequest\x1a*.google.spanner.admin.instance.v1.Instance"0\x82\xd3\xe4\x93\x02#\x12!/v1/{name=projects/*/instances/*}\xda\x41\x04name\x12\x9c\x02\n\x0e\x43reateInstance\x12\x37.google.spanner.admin.instance.v1.CreateInstanceRequest\x1a\x1d.google.longrunning.Operation"\xb1\x01\x82\xd3\xe4\x93\x02&"!/v1/{parent=projects/*}/instances:\x01*\xda\x41\x1bparent,instance_id,instance\xca\x41\x64\n)google.spanner.admin.instance.v1.Instance\x12\x37google.spanner.admin.instance.v1.CreateInstanceMetadata\x12\x9d\x02\n\x0eUpdateInstance\x12\x37.google.spanner.admin.instance.v1.UpdateInstanceRequest\x1a\x1d.google.longrunning.Operation"\xb2\x01\x82\xd3\xe4\x93\x02/2*/v1/{instance.name=projects/*/instances/*}:\x01*\xda\x41\x13instance,field_mask\xca\x41\x64\n)google.spanner.admin.instance.v1.Instance\x12\x37google.spanner.admin.instance.v1.UpdateInstanceMetadata\x12\x93\x01\n\x0e\x44\x65leteInstance\x12\x37.google.spanner.admin.instance.v1.DeleteInstanceRequest\x1a\x16.google.protobuf.Empty"0\x82\xd3\xe4\x93\x02#*!/v1/{name=projects/*/instances/*}\xda\x41\x04name\x12\x9a\x01\n\x0cSetIamPolicy\x12".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy"O\x82\xd3\xe4\x93\x02\x37"2/v1/{resource=projects/*/instances/*}:setIamPolicy:\x01*\xda\x41\x0fresource,policy\x12\x93\x01\n\x0cGetIamPolicy\x12".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy"H\x82\xd3\xe4\x93\x02\x37"2/v1/{resource=projects/*/instances/*}:getIamPolicy:\x01*\xda\x41\x08resource\x12\xc5\x01\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse"Z\x82\xd3\xe4\x93\x02="8/v1/{resource=projects/*/instances/*}:testIamPermissions:\x01*\xda\x41\x14resource,permissions\x1ax\xca\x41\x16spanner.googleapis.com\xd2\x41\\https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/spanner.adminB\xdf\x01\n$com.google.spanner.admin.instance.v1B\x19SpannerInstanceAdminProtoP\x01ZHgoogle.golang.org/genproto/googleapis/spanner/admin/instance/v1;instance\xaa\x02&Google.Cloud.Spanner.Admin.Instance.V1\xca\x02&Google\\Cloud\\Spanner\\Admin\\Instance\\V1b\x06proto3' ), dependencies=[ google_dot_api_dot_annotations__pb2.DESCRIPTOR, @@ -106,8 +106,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=1171, - serialized_end=1226, + serialized_start=1194, + serialized_end=1249, ) _sym_db.RegisterEnumDescriptor(_INSTANCE_STATE) @@ -316,8 +316,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1124, - serialized_end=1169, + serialized_start=1147, + serialized_end=1192, ) _INSTANCE = _descriptor.Descriptor( @@ -435,6 +435,24 @@ serialized_options=None, file=DESCRIPTOR, ), + _descriptor.FieldDescriptor( + name="endpoint_uris", + full_name="google.spanner.admin.instance.v1.Instance.endpoint_uris", + index=6, + number=8, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + ), ], extensions=[], nested_types=[_INSTANCE_LABELSENTRY], @@ -447,7 +465,7 @@ extension_ranges=[], oneofs=[], serialized_start=859, - serialized_end=1305, + serialized_end=1328, ) @@ -523,8 +541,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1308, - serialized_end=1444, + serialized_start=1331, + serialized_end=1467, ) @@ -580,8 +598,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1447, - serialized_end=1577, + serialized_start=1470, + serialized_end=1600, ) @@ -621,8 +639,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1579, - serialized_end=1666, + serialized_start=1602, + serialized_end=1689, ) @@ -652,7 +670,25 @@ "\340A\002\372A!\n\037spanner.googleapis.com/Instance" ), file=DESCRIPTOR, - ) + ), + _descriptor.FieldDescriptor( + name="field_mask", + full_name="google.spanner.admin.instance.v1.GetInstanceRequest.field_mask", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + ), ], extensions=[], nested_types=[], @@ -662,8 +698,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1668, - serialized_end=1743, + serialized_start=1691, + serialized_end=1814, ) @@ -739,8 +775,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1746, - serialized_end=1931, + serialized_start=1817, + serialized_end=2002, ) @@ -834,8 +870,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=1934, - serialized_end=2080, + serialized_start=2005, + serialized_end=2151, ) @@ -891,8 +927,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=2082, - serialized_end=2193, + serialized_start=2153, + serialized_end=2264, ) @@ -948,8 +984,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=2196, - serialized_end=2339, + serialized_start=2267, + serialized_end=2410, ) @@ -989,8 +1025,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=2341, - serialized_end=2419, + serialized_start=2412, + serialized_end=2490, ) @@ -1082,8 +1118,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=2422, - serialized_end=2651, + serialized_start=2493, + serialized_end=2722, ) @@ -1175,8 +1211,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=2654, - serialized_end=2883, + serialized_start=2725, + serialized_end=2954, ) _REPLICAINFO.fields_by_name["type"].enum_type = _REPLICAINFO_REPLICATYPE @@ -1189,6 +1225,9 @@ _LISTINSTANCECONFIGSRESPONSE.fields_by_name[ "instance_configs" ].message_type = _INSTANCECONFIG +_GETINSTANCEREQUEST.fields_by_name[ + "field_mask" +].message_type = google_dot_protobuf_dot_field__mask__pb2._FIELDMASK _CREATEINSTANCEREQUEST.fields_by_name["instance"].message_type = _INSTANCE _LISTINSTANCESRESPONSE.fields_by_name["instances"].message_type = _INSTANCE _UPDATEINSTANCEREQUEST.fields_by_name["instance"].message_type = _INSTANCE @@ -1357,6 +1396,16 @@ characters being disallowed. For example, representing labels as the string: name + "*" + value would prove problematic if we were to allow "*" in a future release. + endpoint_uris: + Output only. The endpoint URIs based on the instance config. + For example, instances located in a specific cloud region (or + multi region) such as nam3, would have a nam3 specific + endpoint URI. This URI is to be used implictly by SDK clients, + with fallback to default URI. These endpoints are intended to + optimize the network routing between the client and the + instance's serving resources. If multiple endpoints are + present, client may establish connections using any of the + given URIs. """, # @@protoc_insertion_point(class_scope:google.spanner.admin.instance.v1.Instance) ), @@ -1454,6 +1503,10 @@ name: Required. The name of the requested instance. Values are of the form ``projects//instances/``. + field_mask: + If field\_mask is present, specifies the subset of + [][Instance] fields that should be returned. If absent, all + [][Instance] fields are returned. """, # @@protoc_insertion_point(class_scope:google.spanner.admin.instance.v1.GetInstanceRequest) ), @@ -1685,8 +1738,8 @@ serialized_options=_b( "\312A\026spanner.googleapis.com\322A\\https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/spanner.admin" ), - serialized_start=2886, - serialized_end=4997, + serialized_start=2957, + serialized_end=5068, methods=[ _descriptor.MethodDescriptor( name="ListInstanceConfigs", diff --git a/google/cloud/spanner_v1/batch.py b/google/cloud/spanner_v1/batch.py index 3446416c89..e62763d7fd 100644 --- a/google/cloud/spanner_v1/batch.py +++ b/google/cloud/spanner_v1/batch.py @@ -149,7 +149,7 @@ def commit(self): txn_options = TransactionOptions(read_write=TransactionOptions.ReadWrite()) response = api.commit( self._session.name, - self._mutations, + mutations=self._mutations, single_use_transaction=txn_options, metadata=metadata, ) diff --git a/google/cloud/spanner_v1/gapic/spanner_client.py b/google/cloud/spanner_v1/gapic/spanner_client.py index 91fe9b9fa1..deb2a720ac 100644 --- a/google/cloud/spanner_v1/gapic/spanner_client.py +++ b/google/cloud/spanner_v1/gapic/spanner_client.py @@ -85,7 +85,12 @@ def from_service_account_file(cls, filename, *args, **kwargs): @classmethod def database_path(cls, project, instance, database): - """Return a fully-qualified database string.""" + """DEPRECATED. Return a fully-qualified database string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}/instances/{instance}/databases/{database}", project=project, @@ -95,7 +100,12 @@ def database_path(cls, project, instance, database): @classmethod def session_path(cls, project, instance, database, session): - """Return a fully-qualified session string.""" + """DEPRECATED. Return a fully-qualified session string.""" + warnings.warn( + "Resource name helper functions are deprecated.", + PendingDeprecationWarning, + stacklevel=1, + ) return google.api_core.path_template.expand( "projects/{project}/instances/{instance}/databases/{database}/sessions/{session}", project=project, @@ -1028,9 +1038,9 @@ def execute_batch_dml( If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.spanner_v1.types.Statement` - seqno (long): Required. A per-transaction sequence number used to identify this request. This field - makes each request idempotent such that if the request is received multiple - times, at most one will succeed. + seqno (long): Required. A per-transaction sequence number used to identify this request. + This field makes each request idempotent such that if the request is + received multiple times, at most one will succeed. The sequence number must be monotonically increasing within the transaction. If a request arrives for the first time with an out-of-order @@ -1449,9 +1459,9 @@ def begin_transaction( def commit( self, session, - mutations, transaction_id=None, single_use_transaction=None, + mutations=None, retry=google.api_core.gapic_v1.method.DEFAULT, timeout=google.api_core.gapic_v1.method.DEFAULT, metadata=None, @@ -1473,19 +1483,10 @@ def commit( >>> >>> session = client.session_path('[PROJECT]', '[INSTANCE]', '[DATABASE]', '[SESSION]') >>> - >>> # TODO: Initialize `mutations`: - >>> mutations = [] - >>> - >>> response = client.commit(session, mutations) + >>> response = client.commit(session) Args: session (str): Required. The session in which the transaction to be committed is running. - mutations (list[Union[dict, ~google.cloud.spanner_v1.types.Mutation]]): The mutations to be executed when this transaction commits. All - mutations are applied atomically, in the order they appear in - this list. - - If a dict is provided, it must be of the same form as the protobuf - message :class:`~google.cloud.spanner_v1.types.Mutation` transaction_id (bytes): Commit a previously-started transaction. single_use_transaction (Union[dict, ~google.cloud.spanner_v1.types.TransactionOptions]): Execute mutations in a temporary transaction. Note that unlike commit of a previously-started transaction, commit with a temporary transaction is @@ -1497,6 +1498,12 @@ def commit( If a dict is provided, it must be of the same form as the protobuf message :class:`~google.cloud.spanner_v1.types.TransactionOptions` + mutations (list[Union[dict, ~google.cloud.spanner_v1.types.Mutation]]): The mutations to be executed when this transaction commits. All + mutations are applied atomically, in the order they appear in + this list. + + If a dict is provided, it must be of the same form as the protobuf + message :class:`~google.cloud.spanner_v1.types.Mutation` retry (Optional[google.api_core.retry.Retry]): A retry object used to retry requests. If ``None`` is specified, requests will be retried using a default configuration. @@ -1535,9 +1542,9 @@ def commit( request = spanner_pb2.CommitRequest( session=session, - mutations=mutations, transaction_id=transaction_id, single_use_transaction=single_use_transaction, + mutations=mutations, ) if metadata is None: metadata = [] diff --git a/google/cloud/spanner_v1/gapic/spanner_client_config.py b/google/cloud/spanner_v1/gapic/spanner_client_config.py index 333f72afe2..44b81c5fb9 100644 --- a/google/cloud/spanner_v1/gapic/spanner_client_config.py +++ b/google/cloud/spanner_v1/gapic/spanner_client_config.py @@ -11,18 +11,18 @@ "initial_retry_delay_millis": 250, "retry_delay_multiplier": 1.3, "max_retry_delay_millis": 32000, - "initial_rpc_timeout_millis": 360000, + "initial_rpc_timeout_millis": 3600000, "rpc_timeout_multiplier": 1.0, - "max_rpc_timeout_millis": 360000, + "max_rpc_timeout_millis": 3600000, "total_timeout_millis": 3600000, }, "streaming": { "initial_retry_delay_millis": 250, "retry_delay_multiplier": 1.3, "max_retry_delay_millis": 32000, - "initial_rpc_timeout_millis": 360000, + "initial_rpc_timeout_millis": 3600000, "rpc_timeout_multiplier": 1.0, - "max_rpc_timeout_millis": 360000, + "max_rpc_timeout_millis": 3600000, "total_timeout_millis": 3600000, }, "long_running": { diff --git a/google/cloud/spanner_v1/proto/spanner.proto b/google/cloud/spanner_v1/proto/spanner.proto index 9cdbd7881c..2ff4c8db89 100644 --- a/google/cloud/spanner_v1/proto/spanner.proto +++ b/google/cloud/spanner_v1/proto/spanner.proto @@ -38,6 +38,14 @@ option java_outer_classname = "SpannerProto"; option java_package = "com.google.spanner.v1"; option php_namespace = "Google\\Cloud\\Spanner\\V1"; +// The Database resource is defined in `google.spanner.admin.database.v1`. +// Because this is a separate, independent API (technically), we redefine +// the resource name pattern here. +option (google.api.resource_definition) = { + type: "spanner.googleapis.com/Database" + pattern: "projects/{project}/instances/{instance}/databases/{database}" +}; + // Cloud Spanner API // // The Cloud Spanner API can be used to manage sessions and execute @@ -79,7 +87,8 @@ service Spanner { // // This API can be used to initialize a session cache on the clients. // See https://goo.gl/TgSFN2 for best practices on session cache management. - rpc BatchCreateSessions(BatchCreateSessionsRequest) returns (BatchCreateSessionsResponse) { + rpc BatchCreateSessions(BatchCreateSessionsRequest) + returns (BatchCreateSessionsResponse) { option (google.api.http) = { post: "/v1/{database=projects/*/instances/*/databases/*}/sessions:batchCreate" body: "*" @@ -122,10 +131,12 @@ service Spanner { // // Operations inside read-write transactions might return `ABORTED`. If // this occurs, the application should restart the transaction from - // the beginning. See [Transaction][google.spanner.v1.Transaction] for more details. + // the beginning. See [Transaction][google.spanner.v1.Transaction] for more + // details. // // Larger result sets can be fetched in streaming fashion by calling - // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] instead. + // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] + // instead. rpc ExecuteSql(ExecuteSqlRequest) returns (ResultSet) { option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:executeSql" @@ -133,11 +144,11 @@ service Spanner { }; } - // Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the result - // set as a stream. Unlike [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there - // is no limit on the size of the returned result set. However, no - // individual row in the result set can exceed 100 MiB, and no - // column value can exceed 10 MiB. + // Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the + // result set as a stream. Unlike + // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there is no limit on + // the size of the returned result set. However, no individual row in the + // result set can exceed 100 MiB, and no column value can exceed 10 MiB. rpc ExecuteStreamingSql(ExecuteSqlRequest) returns (stream PartialResultSet) { option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:executeStreamingSql" @@ -150,13 +161,15 @@ service Spanner { // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. // // Statements are executed in sequential order. A request can succeed even if - // a statement fails. The [ExecuteBatchDmlResponse.status][google.spanner.v1.ExecuteBatchDmlResponse.status] field in the - // response provides information about the statement that failed. Clients must - // inspect this field to determine whether an error occurred. + // a statement fails. The + // [ExecuteBatchDmlResponse.status][google.spanner.v1.ExecuteBatchDmlResponse.status] + // field in the response provides information about the statement that failed. + // Clients must inspect this field to determine whether an error occurred. // // Execution stops after the first failed statement; the remaining statements // are not executed. - rpc ExecuteBatchDml(ExecuteBatchDmlRequest) returns (ExecuteBatchDmlResponse) { + rpc ExecuteBatchDml(ExecuteBatchDmlRequest) + returns (ExecuteBatchDmlResponse) { option (google.api.http) = { post: "/v1/{session=projects/*/instances/*/databases/*/sessions/*}:executeBatchDml" body: "*" @@ -165,14 +178,15 @@ service Spanner { // Reads rows from the database using key lookups and scans, as a // simple key/value style alternative to - // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. This method cannot be used to - // return a result set larger than 10 MiB; if the read matches more + // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. This method cannot be + // used to return a result set larger than 10 MiB; if the read matches more // data than that, the read fails with a `FAILED_PRECONDITION` // error. // // Reads inside read-write transactions might return `ABORTED`. If // this occurs, the application should restart the transaction from - // the beginning. See [Transaction][google.spanner.v1.Transaction] for more details. + // the beginning. See [Transaction][google.spanner.v1.Transaction] for more + // details. // // Larger result sets can be yielded in streaming fashion by calling // [StreamingRead][google.spanner.v1.Spanner.StreamingRead] instead. @@ -183,9 +197,9 @@ service Spanner { }; } - // Like [Read][google.spanner.v1.Spanner.Read], except returns the result set as a - // stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no limit on the - // size of the returned result set. However, no individual row in + // Like [Read][google.spanner.v1.Spanner.Read], except returns the result set + // as a stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no + // limit on the size of the returned result set. However, no individual row in // the result set can exceed 100 MiB, and no column value can exceed // 10 MiB. rpc StreamingRead(ReadRequest) returns (stream PartialResultSet) { @@ -196,7 +210,8 @@ service Spanner { } // Begins a new transaction. This step can often be skipped: - // [Read][google.spanner.v1.Spanner.Read], [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and + // [Read][google.spanner.v1.Spanner.Read], + // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and // [Commit][google.spanner.v1.Spanner.Commit] can begin a new transaction as a // side-effect. rpc BeginTransaction(BeginTransactionRequest) returns (Transaction) { @@ -221,13 +236,15 @@ service Spanner { body: "*" }; option (google.api.method_signature) = "session,transaction_id,mutations"; - option (google.api.method_signature) = "session,single_use_transaction,mutations"; + option (google.api.method_signature) = + "session,single_use_transaction,mutations"; } // Rolls back a transaction, releasing any locks it holds. It is a good // idea to call this for any transaction that includes one or more - // [Read][google.spanner.v1.Spanner.Read] or [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and - // ultimately decides not to commit. + // [Read][google.spanner.v1.Spanner.Read] or + // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and ultimately + // decides not to commit. // // `Rollback` returns `OK` if it successfully aborts the transaction, the // transaction was already aborted, or the transaction is not @@ -242,10 +259,11 @@ service Spanner { // Creates a set of partition tokens that can be used to execute a query // operation in parallel. Each of the returned partition tokens can be used - // by [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] to specify a subset - // of the query result to read. The same session and read-only transaction - // must be used by the PartitionQueryRequest used to create the - // partition tokens and the ExecuteSqlRequests that use the partition tokens. + // by [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] to + // specify a subset of the query result to read. The same session and + // read-only transaction must be used by the PartitionQueryRequest used to + // create the partition tokens and the ExecuteSqlRequests that use the + // partition tokens. // // Partition tokens become invalid when the session used to create them // is deleted, is idle for too long, begins a new transaction, or becomes too @@ -260,12 +278,13 @@ service Spanner { // Creates a set of partition tokens that can be used to execute a read // operation in parallel. Each of the returned partition tokens can be used - // by [StreamingRead][google.spanner.v1.Spanner.StreamingRead] to specify a subset of the read - // result to read. The same session and read-only transaction must be used by - // the PartitionReadRequest used to create the partition tokens and the - // ReadRequests that use the partition tokens. There are no ordering - // guarantees on rows returned among the returned partition tokens, or even - // within each individual StreamingRead call issued with a partition_token. + // by [StreamingRead][google.spanner.v1.Spanner.StreamingRead] to specify a + // subset of the read result to read. The same session and read-only + // transaction must be used by the PartitionReadRequest used to create the + // partition tokens and the ReadRequests that use the partition tokens. There + // are no ordering guarantees on rows returned among the returned partition + // tokens, or even within each individual StreamingRead call issued with a + // partition_token. // // Partition tokens become invalid when the session used to create them // is deleted, is idle for too long, begins a new transaction, or becomes too @@ -293,7 +312,8 @@ message CreateSessionRequest { Session session = 2; } -// The request for [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. +// The request for +// [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. message BatchCreateSessionsRequest { // Required. The database in which the new sessions are created. string database = 1 [ @@ -310,11 +330,13 @@ message BatchCreateSessionsRequest { // The API may return fewer than the requested number of sessions. If a // specific number of sessions are desired, the client can make additional // calls to BatchCreateSessions (adjusting - // [session_count][google.spanner.v1.BatchCreateSessionsRequest.session_count] as necessary). + // [session_count][google.spanner.v1.BatchCreateSessionsRequest.session_count] + // as necessary). int32 session_count = 3 [(google.api.field_behavior) = REQUIRED]; } -// The response for [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. +// The response for +// [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. message BatchCreateSessionsResponse { // The freshly created sessions. repeated Session session = 1; @@ -355,9 +377,7 @@ message GetSessionRequest { // Required. The name of the session to retrieve. string name = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; } @@ -376,7 +396,8 @@ message ListSessionsRequest { int32 page_size = 2; // If non-empty, `page_token` should contain a - // [next_page_token][google.spanner.v1.ListSessionsResponse.next_page_token] from a previous + // [next_page_token][google.spanner.v1.ListSessionsResponse.next_page_token] + // from a previous // [ListSessionsResponse][google.spanner.v1.ListSessionsResponse]. string page_token = 3; @@ -399,8 +420,8 @@ message ListSessionsResponse { repeated Session sessions = 1; // `next_page_token` can be sent in a subsequent - // [ListSessions][google.spanner.v1.Spanner.ListSessions] call to fetch more of the matching - // sessions. + // [ListSessions][google.spanner.v1.Spanner.ListSessions] call to fetch more + // of the matching sessions. string next_page_token = 2; } @@ -409,9 +430,7 @@ message DeleteSessionRequest { // Required. The name of the session to delete. string name = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; } @@ -435,9 +454,7 @@ message ExecuteSqlRequest { // Required. The session in which the SQL query should be performed. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // The transaction to use. @@ -471,7 +488,8 @@ message ExecuteSqlRequest { // It is not always possible for Cloud Spanner to infer the right SQL type // from a JSON value. For example, values of type `BYTES` and values - // of type `STRING` both appear in [params][google.spanner.v1.ExecuteSqlRequest.params] as JSON strings. + // of type `STRING` both appear in + // [params][google.spanner.v1.ExecuteSqlRequest.params] as JSON strings. // // In these cases, `param_types` can be used to specify the exact // SQL type for some or all of the SQL statement parameters. See the @@ -481,15 +499,18 @@ message ExecuteSqlRequest { // If this request is resuming a previously interrupted SQL statement // execution, `resume_token` should be copied from the last - // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the interruption. Doing this - // enables the new SQL statement execution to resume where the last one left - // off. The rest of the request parameters must exactly match the - // request that yielded this token. + // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the + // interruption. Doing this enables the new SQL statement execution to resume + // where the last one left off. The rest of the request parameters must + // exactly match the request that yielded this token. bytes resume_token = 6; // Used to control the amount of debugging information returned in - // [ResultSetStats][google.spanner.v1.ResultSetStats]. If [partition_token][google.spanner.v1.ExecuteSqlRequest.partition_token] is set, [query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode] can only - // be set to [QueryMode.NORMAL][google.spanner.v1.ExecuteSqlRequest.QueryMode.NORMAL]. + // [ResultSetStats][google.spanner.v1.ResultSetStats]. If + // [partition_token][google.spanner.v1.ExecuteSqlRequest.partition_token] is + // set, [query_mode][google.spanner.v1.ExecuteSqlRequest.query_mode] can only + // be set to + // [QueryMode.NORMAL][google.spanner.v1.ExecuteSqlRequest.QueryMode.NORMAL]. QueryMode query_mode = 7; // If present, results will be restricted to the specified partition @@ -534,7 +555,9 @@ message ExecuteBatchDmlRequest { // It is not always possible for Cloud Spanner to infer the right SQL type // from a JSON value. For example, values of type `BYTES` and values - // of type `STRING` both appear in [params][google.spanner.v1.ExecuteBatchDmlRequest.Statement.params] as JSON strings. + // of type `STRING` both appear in + // [params][google.spanner.v1.ExecuteBatchDmlRequest.Statement.params] as + // JSON strings. // // In these cases, `param_types` can be used to specify the exact // SQL type for some or all of the SQL statement parameters. See the @@ -546,9 +569,7 @@ message ExecuteBatchDmlRequest { // Required. The session in which the DML statements should be performed. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // Required. The transaction to use. Must be a read-write transaction. @@ -558,17 +579,17 @@ message ExecuteBatchDmlRequest { // transaction. TransactionSelector transaction = 2 [(google.api.field_behavior) = REQUIRED]; - // Required. The list of statements to execute in this batch. Statements are executed - // serially, such that the effects of statement `i` are visible to statement - // `i+1`. Each statement must be a DML statement. Execution stops at the - // first failed statement; the remaining statements are not executed. + // Required. The list of statements to execute in this batch. Statements are + // executed serially, such that the effects of statement `i` are visible to + // statement `i+1`. Each statement must be a DML statement. Execution stops at + // the first failed statement; the remaining statements are not executed. // // Callers must provide at least one statement. repeated Statement statements = 3 [(google.api.field_behavior) = REQUIRED]; - // Required. A per-transaction sequence number used to identify this request. This field - // makes each request idempotent such that if the request is received multiple - // times, at most one will succeed. + // Required. A per-transaction sequence number used to identify this request. + // This field makes each request idempotent such that if the request is + // received multiple times, at most one will succeed. // // The sequence number must be monotonically increasing within the // transaction. If a request arrives for the first time with an out-of-order @@ -577,38 +598,47 @@ message ExecuteBatchDmlRequest { int64 seqno = 4 [(google.api.field_behavior) = REQUIRED]; } -// The response for [ExecuteBatchDml][google.spanner.v1.Spanner.ExecuteBatchDml]. Contains a list -// of [ResultSet][google.spanner.v1.ResultSet] messages, one for each DML statement that has successfully -// executed, in the same order as the statements in the request. If a statement -// fails, the status in the response body identifies the cause of the failure. +// The response for +// [ExecuteBatchDml][google.spanner.v1.Spanner.ExecuteBatchDml]. Contains a list +// of [ResultSet][google.spanner.v1.ResultSet] messages, one for each DML +// statement that has successfully executed, in the same order as the statements +// in the request. If a statement fails, the status in the response body +// identifies the cause of the failure. // // To check for DML statements that failed, use the following approach: // -// 1. Check the status in the response message. The [google.rpc.Code][google.rpc.Code] enum +// 1. Check the status in the response message. The +// [google.rpc.Code][google.rpc.Code] enum // value `OK` indicates that all statements were executed successfully. // 2. If the status was not `OK`, check the number of result sets in the -// response. If the response contains `N` [ResultSet][google.spanner.v1.ResultSet] messages, then -// statement `N+1` in the request failed. +// response. If the response contains `N` +// [ResultSet][google.spanner.v1.ResultSet] messages, then statement `N+1` in +// the request failed. // // Example 1: // // * Request: 5 DML statements, all executed successfully. -// * Response: 5 [ResultSet][google.spanner.v1.ResultSet] messages, with the status `OK`. +// * Response: 5 [ResultSet][google.spanner.v1.ResultSet] messages, with the +// status `OK`. // // Example 2: // // * Request: 5 DML statements. The third statement has a syntax error. -// * Response: 2 [ResultSet][google.spanner.v1.ResultSet] messages, and a syntax error (`INVALID_ARGUMENT`) -// status. The number of [ResultSet][google.spanner.v1.ResultSet] messages indicates that the third -// statement failed, and the fourth and fifth statements were not executed. +// * Response: 2 [ResultSet][google.spanner.v1.ResultSet] messages, and a syntax +// error (`INVALID_ARGUMENT`) +// status. The number of [ResultSet][google.spanner.v1.ResultSet] messages +// indicates that the third statement failed, and the fourth and fifth +// statements were not executed. message ExecuteBatchDmlResponse { - // One [ResultSet][google.spanner.v1.ResultSet] for each statement in the request that ran successfully, - // in the same order as the statements in the request. Each [ResultSet][google.spanner.v1.ResultSet] does - // not contain any rows. The [ResultSetStats][google.spanner.v1.ResultSetStats] in each [ResultSet][google.spanner.v1.ResultSet] contain - // the number of rows modified by the statement. - // - // Only the first [ResultSet][google.spanner.v1.ResultSet] in the response contains valid - // [ResultSetMetadata][google.spanner.v1.ResultSetMetadata]. + // One [ResultSet][google.spanner.v1.ResultSet] for each statement in the + // request that ran successfully, in the same order as the statements in the + // request. Each [ResultSet][google.spanner.v1.ResultSet] does not contain any + // rows. The [ResultSetStats][google.spanner.v1.ResultSetStats] in each + // [ResultSet][google.spanner.v1.ResultSet] contain the number of rows + // modified by the statement. + // + // Only the first [ResultSet][google.spanner.v1.ResultSet] in the response + // contains valid [ResultSetMetadata][google.spanner.v1.ResultSetMetadata]. repeated ResultSet result_sets = 1; // If all DML statements are executed successfully, the status is `OK`. @@ -643,24 +673,23 @@ message PartitionQueryRequest { // Required. The session used to create the partitions. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // Read only snapshot transactions are supported, read/write and single use // transactions are not. TransactionSelector transaction = 2; - // Required. The query request to generate partitions for. The request will fail if - // the query is not root partitionable. The query plan of a root + // Required. The query request to generate partitions for. The request will + // fail if the query is not root partitionable. The query plan of a root // partitionable query has a single distributed union operator. A distributed // union operator conceptually divides one or more tables into multiple // splits, remotely evaluates a subquery independently on each split, and // then unions all results. // // This must not contain DML commands, such as INSERT, UPDATE, or - // DELETE. Use [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] with a + // DELETE. Use + // [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] with a // PartitionedDml transaction for large, partition-friendly DML operations. string sql = 3 [(google.api.field_behavior) = REQUIRED]; @@ -680,7 +709,8 @@ message PartitionQueryRequest { // It is not always possible for Cloud Spanner to infer the right SQL type // from a JSON value. For example, values of type `BYTES` and values - // of type `STRING` both appear in [params][google.spanner.v1.PartitionQueryRequest.params] as JSON strings. + // of type `STRING` both appear in + // [params][google.spanner.v1.PartitionQueryRequest.params] as JSON strings. // // In these cases, `param_types` can be used to specify the exact // SQL type for some or all of the SQL query parameters. See the @@ -697,9 +727,7 @@ message PartitionReadRequest { // Required. The session used to create the partitions. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // Read only snapshot transactions are supported, read/write and single use @@ -709,18 +737,24 @@ message PartitionReadRequest { // Required. The name of the table in the database to be read. string table = 3 [(google.api.field_behavior) = REQUIRED]; - // If non-empty, the name of an index on [table][google.spanner.v1.PartitionReadRequest.table]. This index is - // used instead of the table primary key when interpreting [key_set][google.spanner.v1.PartitionReadRequest.key_set] - // and sorting result rows. See [key_set][google.spanner.v1.PartitionReadRequest.key_set] for further information. + // If non-empty, the name of an index on + // [table][google.spanner.v1.PartitionReadRequest.table]. This index is used + // instead of the table primary key when interpreting + // [key_set][google.spanner.v1.PartitionReadRequest.key_set] and sorting + // result rows. See [key_set][google.spanner.v1.PartitionReadRequest.key_set] + // for further information. string index = 4; - // The columns of [table][google.spanner.v1.PartitionReadRequest.table] to be returned for each row matching - // this request. + // The columns of [table][google.spanner.v1.PartitionReadRequest.table] to be + // returned for each row matching this request. repeated string columns = 5; // Required. `key_set` identifies the rows to be yielded. `key_set` names the - // primary keys of the rows in [table][google.spanner.v1.PartitionReadRequest.table] to be yielded, unless [index][google.spanner.v1.PartitionReadRequest.index] - // is present. If [index][google.spanner.v1.PartitionReadRequest.index] is present, then [key_set][google.spanner.v1.PartitionReadRequest.key_set] instead names + // primary keys of the rows in + // [table][google.spanner.v1.PartitionReadRequest.table] to be yielded, unless + // [index][google.spanner.v1.PartitionReadRequest.index] is present. If + // [index][google.spanner.v1.PartitionReadRequest.index] is present, then + // [key_set][google.spanner.v1.PartitionReadRequest.key_set] instead names // index keys in [index][google.spanner.v1.PartitionReadRequest.index]. // // It is not an error for the `key_set` to name rows that do not @@ -756,9 +790,7 @@ message ReadRequest { // Required. The session in which the read should be performed. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // The transaction to use. If none is provided, the default is a @@ -768,24 +800,31 @@ message ReadRequest { // Required. The name of the table in the database to be read. string table = 3 [(google.api.field_behavior) = REQUIRED]; - // If non-empty, the name of an index on [table][google.spanner.v1.ReadRequest.table]. This index is - // used instead of the table primary key when interpreting [key_set][google.spanner.v1.ReadRequest.key_set] - // and sorting result rows. See [key_set][google.spanner.v1.ReadRequest.key_set] for further information. + // If non-empty, the name of an index on + // [table][google.spanner.v1.ReadRequest.table]. This index is used instead of + // the table primary key when interpreting + // [key_set][google.spanner.v1.ReadRequest.key_set] and sorting result rows. + // See [key_set][google.spanner.v1.ReadRequest.key_set] for further + // information. string index = 4; - // Required. The columns of [table][google.spanner.v1.ReadRequest.table] to be returned for each row matching - // this request. + // Required. The columns of [table][google.spanner.v1.ReadRequest.table] to be + // returned for each row matching this request. repeated string columns = 5 [(google.api.field_behavior) = REQUIRED]; // Required. `key_set` identifies the rows to be yielded. `key_set` names the - // primary keys of the rows in [table][google.spanner.v1.ReadRequest.table] to be yielded, unless [index][google.spanner.v1.ReadRequest.index] - // is present. If [index][google.spanner.v1.ReadRequest.index] is present, then [key_set][google.spanner.v1.ReadRequest.key_set] instead names - // index keys in [index][google.spanner.v1.ReadRequest.index]. - // - // If the [partition_token][google.spanner.v1.ReadRequest.partition_token] field is empty, rows are yielded - // in table primary key order (if [index][google.spanner.v1.ReadRequest.index] is empty) or index key order - // (if [index][google.spanner.v1.ReadRequest.index] is non-empty). If the [partition_token][google.spanner.v1.ReadRequest.partition_token] field is not - // empty, rows will be yielded in an unspecified order. + // primary keys of the rows in [table][google.spanner.v1.ReadRequest.table] to + // be yielded, unless [index][google.spanner.v1.ReadRequest.index] is present. + // If [index][google.spanner.v1.ReadRequest.index] is present, then + // [key_set][google.spanner.v1.ReadRequest.key_set] instead names index keys + // in [index][google.spanner.v1.ReadRequest.index]. + // + // If the [partition_token][google.spanner.v1.ReadRequest.partition_token] + // field is empty, rows are yielded in table primary key order (if + // [index][google.spanner.v1.ReadRequest.index] is empty) or index key order + // (if [index][google.spanner.v1.ReadRequest.index] is non-empty). If the + // [partition_token][google.spanner.v1.ReadRequest.partition_token] field is + // not empty, rows will be yielded in an unspecified order. // // It is not an error for the `key_set` to name rows that do not // exist in the database. Read yields nothing for nonexistent rows. @@ -798,9 +837,9 @@ message ReadRequest { // If this request is resuming a previously interrupted read, // `resume_token` should be copied from the last - // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the interruption. Doing this - // enables the new read to resume where the last read left off. The - // rest of the request parameters must exactly match the request + // [PartialResultSet][google.spanner.v1.PartialResultSet] yielded before the + // interruption. Doing this enables the new read to resume where the last read + // left off. The rest of the request parameters must exactly match the request // that yielded this token. bytes resume_token = 9; @@ -811,14 +850,13 @@ message ReadRequest { bytes partition_token = 10; } -// The request for [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction]. +// The request for +// [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction]. message BeginTransactionRequest { // Required. The session in which the transaction runs. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // Required. Options for the new transaction. @@ -830,9 +868,7 @@ message CommitRequest { // Required. The session in which the transaction to be committed is running. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // Required. The transaction in which to commit. @@ -869,19 +905,9 @@ message RollbackRequest { // Required. The session in which the transaction to roll back is running. string session = 1 [ (google.api.field_behavior) = REQUIRED, - (google.api.resource_reference) = { - type: "spanner.googleapis.com/Session" - } + (google.api.resource_reference) = { type: "spanner.googleapis.com/Session" } ]; // Required. The transaction to roll back. bytes transaction_id = 2 [(google.api.field_behavior) = REQUIRED]; } - -// The Database resource is defined in `google.spanner.admin.database.v1`. -// Because this is a separate, independent API (technically), we redefine -// the resource name pattern here. -option (google.api.resource_definition) = { - type: "spanner.googleapis.com/Database" - pattern: "projects/{project}/instances/{instance}/databases/{database}" -}; diff --git a/google/cloud/spanner_v1/proto/spanner_pb2_grpc.py b/google/cloud/spanner_v1/proto/spanner_pb2_grpc.py index 266d7bdc61..4505b75cbc 100644 --- a/google/cloud/spanner_v1/proto/spanner_pb2_grpc.py +++ b/google/cloud/spanner_v1/proto/spanner_pb2_grpc.py @@ -178,21 +178,23 @@ def ExecuteSql(self, request, context): Operations inside read-write transactions might return `ABORTED`. If this occurs, the application should restart the transaction from - the beginning. See [Transaction][google.spanner.v1.Transaction] for more details. + the beginning. See [Transaction][google.spanner.v1.Transaction] for more + details. Larger result sets can be fetched in streaming fashion by calling - [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] instead. + [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] + instead. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") def ExecuteStreamingSql(self, request, context): - """Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the result - set as a stream. Unlike [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there - is no limit on the size of the returned result set. However, no - individual row in the result set can exceed 100 MiB, and no - column value can exceed 10 MiB. + """Like [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], except returns the + result set as a stream. Unlike + [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], there is no limit on + the size of the returned result set. However, no individual row in the + result set can exceed 100 MiB, and no column value can exceed 10 MiB. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") @@ -204,9 +206,10 @@ def ExecuteBatchDml(self, request, context): [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. Statements are executed in sequential order. A request can succeed even if - a statement fails. The [ExecuteBatchDmlResponse.status][google.spanner.v1.ExecuteBatchDmlResponse.status] field in the - response provides information about the statement that failed. Clients must - inspect this field to determine whether an error occurred. + a statement fails. The + [ExecuteBatchDmlResponse.status][google.spanner.v1.ExecuteBatchDmlResponse.status] + field in the response provides information about the statement that failed. + Clients must inspect this field to determine whether an error occurred. Execution stops after the first failed statement; the remaining statements are not executed. @@ -218,14 +221,15 @@ def ExecuteBatchDml(self, request, context): def Read(self, request, context): """Reads rows from the database using key lookups and scans, as a simple key/value style alternative to - [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. This method cannot be used to - return a result set larger than 10 MiB; if the read matches more + [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql]. This method cannot be + used to return a result set larger than 10 MiB; if the read matches more data than that, the read fails with a `FAILED_PRECONDITION` error. Reads inside read-write transactions might return `ABORTED`. If this occurs, the application should restart the transaction from - the beginning. See [Transaction][google.spanner.v1.Transaction] for more details. + the beginning. See [Transaction][google.spanner.v1.Transaction] for more + details. Larger result sets can be yielded in streaming fashion by calling [StreamingRead][google.spanner.v1.Spanner.StreamingRead] instead. @@ -235,9 +239,9 @@ def Read(self, request, context): raise NotImplementedError("Method not implemented!") def StreamingRead(self, request, context): - """Like [Read][google.spanner.v1.Spanner.Read], except returns the result set as a - stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no limit on the - size of the returned result set. However, no individual row in + """Like [Read][google.spanner.v1.Spanner.Read], except returns the result set + as a stream. Unlike [Read][google.spanner.v1.Spanner.Read], there is no + limit on the size of the returned result set. However, no individual row in the result set can exceed 100 MiB, and no column value can exceed 10 MiB. """ @@ -247,7 +251,8 @@ def StreamingRead(self, request, context): def BeginTransaction(self, request, context): """Begins a new transaction. This step can often be skipped: - [Read][google.spanner.v1.Spanner.Read], [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and + [Read][google.spanner.v1.Spanner.Read], + [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and [Commit][google.spanner.v1.Spanner.Commit] can begin a new transaction as a side-effect. """ @@ -272,8 +277,9 @@ def Commit(self, request, context): def Rollback(self, request, context): """Rolls back a transaction, releasing any locks it holds. It is a good idea to call this for any transaction that includes one or more - [Read][google.spanner.v1.Spanner.Read] or [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and - ultimately decides not to commit. + [Read][google.spanner.v1.Spanner.Read] or + [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] requests and ultimately + decides not to commit. `Rollback` returns `OK` if it successfully aborts the transaction, the transaction was already aborted, or the transaction is not @@ -286,10 +292,11 @@ def Rollback(self, request, context): def PartitionQuery(self, request, context): """Creates a set of partition tokens that can be used to execute a query operation in parallel. Each of the returned partition tokens can be used - by [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] to specify a subset - of the query result to read. The same session and read-only transaction - must be used by the PartitionQueryRequest used to create the - partition tokens and the ExecuteSqlRequests that use the partition tokens. + by [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql] to + specify a subset of the query result to read. The same session and + read-only transaction must be used by the PartitionQueryRequest used to + create the partition tokens and the ExecuteSqlRequests that use the + partition tokens. Partition tokens become invalid when the session used to create them is deleted, is idle for too long, begins a new transaction, or becomes too @@ -303,12 +310,13 @@ def PartitionQuery(self, request, context): def PartitionRead(self, request, context): """Creates a set of partition tokens that can be used to execute a read operation in parallel. Each of the returned partition tokens can be used - by [StreamingRead][google.spanner.v1.Spanner.StreamingRead] to specify a subset of the read - result to read. The same session and read-only transaction must be used by - the PartitionReadRequest used to create the partition tokens and the - ReadRequests that use the partition tokens. There are no ordering - guarantees on rows returned among the returned partition tokens, or even - within each individual StreamingRead call issued with a partition_token. + by [StreamingRead][google.spanner.v1.Spanner.StreamingRead] to specify a + subset of the read result to read. The same session and read-only + transaction must be used by the PartitionReadRequest used to create the + partition tokens and the ReadRequests that use the partition tokens. There + are no ordering guarantees on rows returned among the returned partition + tokens, or even within each individual StreamingRead call issued with a + partition_token. Partition tokens become invalid when the session used to create them is deleted, is idle for too long, begins a new transaction, or becomes too diff --git a/google/cloud/spanner_v1/transaction.py b/google/cloud/spanner_v1/transaction.py index b4eb21143a..29a2e5f786 100644 --- a/google/cloud/spanner_v1/transaction.py +++ b/google/cloud/spanner_v1/transaction.py @@ -122,7 +122,7 @@ def commit(self): metadata = _metadata_with_prefix(database.name) response = api.commit( self._session.name, - self._mutations, + mutations=self._mutations, transaction_id=self._transaction_id, metadata=metadata, ) diff --git a/synth.metadata b/synth.metadata index b79fe4dbbe..3cd01cf197 100644 --- a/synth.metadata +++ b/synth.metadata @@ -1,26 +1,26 @@ { - "updateTime": "2019-10-31T15:04:36.072689Z", + "updateTime": "2019-12-24T03:07:53.081048Z", "sources": [ { "generator": { "name": "artman", - "version": "0.41.0", - "dockerImage": "googleapis/artman@sha256:75b38a3b073a7b243545f2332463096624c802bb1e56b8cb6f22ba1ecd325fa9" + "version": "0.42.3", + "dockerImage": "googleapis/artman@sha256:feed210b5723c6f524b52ef6d7740a030f2d1a8f7c29a71c5e5b4481ceaad7f5" } }, { "git": { "name": "googleapis", "remote": "https://github.com/googleapis/googleapis.git", - "sha": "c0e494ca955a4fdd9ad460a5890a354ec3a3a0ff", - "internalRef": "277673798" + "sha": "46e52fd64973e815cae61e78b14608fe7aa7b1df", + "internalRef": "286958627" } }, { "template": { "name": "python_library", "origin": "synthtool.gcp", - "version": "2019.5.2" + "version": "2019.10.17" } } ], diff --git a/tests/unit/gapic/v1/test_database_admin_client_v1.py b/tests/unit/gapic/v1/test_database_admin_client_v1.py index 166e823b37..7d5da4a18b 100644 --- a/tests/unit/gapic/v1/test_database_admin_client_v1.py +++ b/tests/unit/gapic/v1/test_database_admin_client_v1.py @@ -66,53 +66,6 @@ class CustomException(Exception): class TestDatabaseAdminClient(object): - def test_list_databases(self): - # Setup Expected Response - next_page_token = "" - databases_element = {} - databases = [databases_element] - expected_response = {"next_page_token": next_page_token, "databases": databases} - expected_response = spanner_database_admin_pb2.ListDatabasesResponse( - **expected_response - ) - - # Mock the API response - channel = ChannelStub(responses=[expected_response]) - patch = mock.patch("google.api_core.grpc_helpers.create_channel") - with patch as create_channel: - create_channel.return_value = channel - client = spanner_admin_database_v1.DatabaseAdminClient() - - # Setup Request - parent = client.instance_path("[PROJECT]", "[INSTANCE]") - - paged_list_response = client.list_databases(parent) - resources = list(paged_list_response) - assert len(resources) == 1 - - assert expected_response.databases[0] == resources[0] - - assert len(channel.requests) == 1 - expected_request = spanner_database_admin_pb2.ListDatabasesRequest( - parent=parent - ) - actual_request = channel.requests[0][1] - assert expected_request == actual_request - - def test_list_databases_exception(self): - channel = ChannelStub(responses=[CustomException()]) - patch = mock.patch("google.api_core.grpc_helpers.create_channel") - with patch as create_channel: - create_channel.return_value = channel - client = spanner_admin_database_v1.DatabaseAdminClient() - - # Setup request - parent = client.instance_path("[PROJECT]", "[INSTANCE]") - - paged_list_response = client.list_databases(parent) - with pytest.raises(CustomException): - list(paged_list_response) - def test_create_database(self): # Setup Expected Response name = "name3373707" @@ -349,7 +302,7 @@ def test_set_iam_policy(self): client = spanner_admin_database_v1.DatabaseAdminClient() # Setup Request - resource = client.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]") + resource = "resource-341064690" policy = {} response = client.set_iam_policy(resource, policy) @@ -371,7 +324,7 @@ def test_set_iam_policy_exception(self): client = spanner_admin_database_v1.DatabaseAdminClient() # Setup request - resource = client.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]") + resource = "resource-341064690" policy = {} with pytest.raises(CustomException): @@ -392,7 +345,7 @@ def test_get_iam_policy(self): client = spanner_admin_database_v1.DatabaseAdminClient() # Setup Request - resource = client.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]") + resource = "resource-341064690" response = client.get_iam_policy(resource) assert expected_response == response @@ -411,7 +364,7 @@ def test_get_iam_policy_exception(self): client = spanner_admin_database_v1.DatabaseAdminClient() # Setup request - resource = client.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]") + resource = "resource-341064690" with pytest.raises(CustomException): client.get_iam_policy(resource) @@ -431,7 +384,7 @@ def test_test_iam_permissions(self): client = spanner_admin_database_v1.DatabaseAdminClient() # Setup Request - resource = client.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]") + resource = "resource-341064690" permissions = [] response = client.test_iam_permissions(resource, permissions) @@ -453,8 +406,55 @@ def test_test_iam_permissions_exception(self): client = spanner_admin_database_v1.DatabaseAdminClient() # Setup request - resource = client.database_path("[PROJECT]", "[INSTANCE]", "[DATABASE]") + resource = "resource-341064690" permissions = [] with pytest.raises(CustomException): client.test_iam_permissions(resource, permissions) + + def test_list_databases(self): + # Setup Expected Response + next_page_token = "" + databases_element = {} + databases = [databases_element] + expected_response = {"next_page_token": next_page_token, "databases": databases} + expected_response = spanner_database_admin_pb2.ListDatabasesResponse( + **expected_response + ) + + # Mock the API response + channel = ChannelStub(responses=[expected_response]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = spanner_admin_database_v1.DatabaseAdminClient() + + # Setup Request + parent = client.instance_path("[PROJECT]", "[INSTANCE]") + + paged_list_response = client.list_databases(parent) + resources = list(paged_list_response) + assert len(resources) == 1 + + assert expected_response.databases[0] == resources[0] + + assert len(channel.requests) == 1 + expected_request = spanner_database_admin_pb2.ListDatabasesRequest( + parent=parent + ) + actual_request = channel.requests[0][1] + assert expected_request == actual_request + + def test_list_databases_exception(self): + channel = ChannelStub(responses=[CustomException()]) + patch = mock.patch("google.api_core.grpc_helpers.create_channel") + with patch as create_channel: + create_channel.return_value = channel + client = spanner_admin_database_v1.DatabaseAdminClient() + + # Setup request + parent = client.instance_path("[PROJECT]", "[INSTANCE]") + + paged_list_response = client.list_databases(parent) + with pytest.raises(CustomException): + list(paged_list_response) diff --git a/tests/unit/gapic/v1/test_instance_admin_client_v1.py b/tests/unit/gapic/v1/test_instance_admin_client_v1.py index 60f63938f9..f535723f98 100644 --- a/tests/unit/gapic/v1/test_instance_admin_client_v1.py +++ b/tests/unit/gapic/v1/test_instance_admin_client_v1.py @@ -427,7 +427,7 @@ def test_set_iam_policy(self): client = spanner_admin_instance_v1.InstanceAdminClient() # Setup Request - resource = client.instance_path("[PROJECT]", "[INSTANCE]") + resource = "resource-341064690" policy = {} response = client.set_iam_policy(resource, policy) @@ -449,7 +449,7 @@ def test_set_iam_policy_exception(self): client = spanner_admin_instance_v1.InstanceAdminClient() # Setup request - resource = client.instance_path("[PROJECT]", "[INSTANCE]") + resource = "resource-341064690" policy = {} with pytest.raises(CustomException): @@ -470,7 +470,7 @@ def test_get_iam_policy(self): client = spanner_admin_instance_v1.InstanceAdminClient() # Setup Request - resource = client.instance_path("[PROJECT]", "[INSTANCE]") + resource = "resource-341064690" response = client.get_iam_policy(resource) assert expected_response == response @@ -489,7 +489,7 @@ def test_get_iam_policy_exception(self): client = spanner_admin_instance_v1.InstanceAdminClient() # Setup request - resource = client.instance_path("[PROJECT]", "[INSTANCE]") + resource = "resource-341064690" with pytest.raises(CustomException): client.get_iam_policy(resource) @@ -509,7 +509,7 @@ def test_test_iam_permissions(self): client = spanner_admin_instance_v1.InstanceAdminClient() # Setup Request - resource = client.instance_path("[PROJECT]", "[INSTANCE]") + resource = "resource-341064690" permissions = [] response = client.test_iam_permissions(resource, permissions) @@ -531,7 +531,7 @@ def test_test_iam_permissions_exception(self): client = spanner_admin_instance_v1.InstanceAdminClient() # Setup request - resource = client.instance_path("[PROJECT]", "[INSTANCE]") + resource = "resource-341064690" permissions = [] with pytest.raises(CustomException): diff --git a/tests/unit/gapic/v1/test_spanner_client_v1.py b/tests/unit/gapic/v1/test_spanner_client_v1.py index 55610ee409..9f63d09673 100644 --- a/tests/unit/gapic/v1/test_spanner_client_v1.py +++ b/tests/unit/gapic/v1/test_spanner_client_v1.py @@ -567,15 +567,12 @@ def test_commit(self): session = client.session_path( "[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]" ) - mutations = [] - response = client.commit(session, mutations) + response = client.commit(session) assert expected_response == response assert len(channel.requests) == 1 - expected_request = spanner_pb2.CommitRequest( - session=session, mutations=mutations - ) + expected_request = spanner_pb2.CommitRequest(session=session) actual_request = channel.requests[0][1] assert expected_request == actual_request @@ -591,10 +588,9 @@ def test_commit_exception(self): session = client.session_path( "[PROJECT]", "[INSTANCE]", "[DATABASE]", "[SESSION]" ) - mutations = [] with pytest.raises(CustomException): - client.commit(session, mutations) + client.commit(session) def test_rollback(self): channel = ChannelStub() diff --git a/tests/unit/test_database.py b/tests/unit/test_database.py index f6f367e001..163036f030 100644 --- a/tests/unit/test_database.py +++ b/tests/unit/test_database.py @@ -967,7 +967,7 @@ def test_context_mgr_success(self): api.commit.assert_called_once_with( self.SESSION_NAME, - [], + mutations=[], single_use_transaction=expected_txn_options, metadata=[("google-cloud-resource-prefix", database.name)], ) diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py index a198d19ecd..98d98deaba 100644 --- a/tests/unit/test_session.py +++ b/tests/unit/test_session.py @@ -628,7 +628,7 @@ def unit_of_work(txn, *args, **kw): ) gax_api.commit.assert_called_once_with( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) @@ -675,7 +675,7 @@ def unit_of_work(txn, *args, **kw): gax_api.begin_transaction.assert_not_called() gax_api.commit.assert_called_once_with( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) @@ -745,7 +745,7 @@ def unit_of_work(txn, *args, **kw): [ mock.call( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) @@ -833,7 +833,7 @@ def unit_of_work(txn, *args, **kw): [ mock.call( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) @@ -918,7 +918,7 @@ def unit_of_work(txn, *args, **kw): ) gax_api.commit.assert_called_once_with( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) @@ -997,7 +997,7 @@ def _time(_results=[1, 1.5]): ) gax_api.commit.assert_called_once_with( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) @@ -1072,7 +1072,7 @@ def _time(_results=[1, 2, 4, 8]): [ mock.call( self.SESSION_NAME, - txn._mutations, + mutations=txn._mutations, transaction_id=TRANSACTION_ID, metadata=[("google-cloud-resource-prefix", database.name)], ) From ff1dfdde3db9e3e9c904e3b3639cff23b8d71db2 Mon Sep 17 00:00:00 2001 From: Gurov Ilya Date: Tue, 14 Jan 2020 10:45:24 +0300 Subject: [PATCH 02/12] docs(spanner): fix Instance.update() docstrings (#10106) --- google/cloud/spanner_v1/instance.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/google/cloud/spanner_v1/instance.py b/google/cloud/spanner_v1/instance.py index 583cca0055..961e0da93b 100644 --- a/google/cloud/spanner_v1/instance.py +++ b/google/cloud/spanner_v1/instance.py @@ -262,13 +262,13 @@ def update(self): .. note:: - Updates the ``display_name`` and ``node_count``. To change those - values before updating, set them via + Updates the ``display_name`` and ``node_count``. To change those + values before updating, set them via - .. code:: python + .. code:: python - instance.display_name = 'New display name' - instance.node_count = 5 + instance.display_name = 'New display name' + instance.node_count = 5 before calling :meth:`update`. From cfae63d5a8b8332f8875307283da6075a544c838 Mon Sep 17 00:00:00 2001 From: larkee <31196561+larkee@users.noreply.github.com> Date: Thu, 23 Jan 2020 15:01:14 +1100 Subject: [PATCH 03/12] fix: be permssive about merging an empty struct (#10079) --- google/cloud/spanner_v1/streamed.py | 6 ++++++ tests/unit/test_streamed.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/google/cloud/spanner_v1/streamed.py b/google/cloud/spanner_v1/streamed.py index ddb240a68a..5d1a31e931 100644 --- a/google/cloud/spanner_v1/streamed.py +++ b/google/cloud/spanner_v1/streamed.py @@ -276,6 +276,12 @@ def _merge_struct(lhs, rhs, type_): """Helper for '_merge_by_type'.""" fields = type_.struct_type.fields lhs, rhs = list(lhs.list_value.values), list(rhs.list_value.values) + + # Sanity check: If either list is empty, short-circuit. + # This is effectively a no-op. + if not len(lhs) or not len(rhs): + return Value(list_value=ListValue(values=(lhs + rhs))) + candidate_type = fields[len(lhs) - 1].type first = rhs.pop(0) if first.HasField("null_value") or candidate_type.code in _UNMERGEABLE_TYPES: diff --git a/tests/unit/test_streamed.py b/tests/unit/test_streamed.py index 64b76b6cb1..3f3a90108d 100644 --- a/tests/unit/test_streamed.py +++ b/tests/unit/test_streamed.py @@ -411,6 +411,23 @@ def test__merge_chunk_array_of_struct(self): self.assertEqual(merged, expected) self.assertIsNone(streamed._pending_chunk) + def test__merge_chunk_array_of_struct_with_empty(self): + iterator = _MockCancellableIterator() + streamed = self._make_one(iterator) + struct_type = self._make_struct_type([("name", "STRING"), ("age", "INT64")]) + FIELDS = [self._make_array_field("test", element_type=struct_type)] + streamed._metadata = self._make_result_set_metadata(FIELDS) + partial = self._make_list_value([u"Phred "]) + streamed._pending_chunk = self._make_list_value(value_pbs=[partial]) + rest = self._make_list_value([]) + chunk = self._make_list_value(value_pbs=[rest]) + + merged = streamed._merge_chunk(chunk) + + expected = self._make_list_value(value_pbs=[partial]) + self.assertEqual(merged, expected) + self.assertIsNone(streamed._pending_chunk) + def test__merge_chunk_array_of_struct_unmergeable(self): iterator = _MockCancellableIterator() streamed = self._make_one(iterator) From dbb79b0d8b0c79f6ed1772f28e4eedb9d986b108 Mon Sep 17 00:00:00 2001 From: Yoshi Automation Bot Date: Wed, 29 Jan 2020 18:08:28 -0800 Subject: [PATCH 04/12] feat(spanner): un-deprecate resource name helper functions, add 3.8 tests (via synth) (#10062) --- .../gapic/database_admin_client.py | 14 +- .../gapic/instance_admin_client.py | 21 +- .../cloud/spanner_v1/gapic/spanner_client.py | 14 +- google/cloud/spanner_v1/instance.py | 2 +- noxfile.py | 2 +- synth.metadata | 3738 ++++++++++++++++- 6 files changed, 3742 insertions(+), 49 deletions(-) diff --git a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py index adaa0e6bc7..be458bd6af 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py +++ b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py @@ -88,12 +88,7 @@ def from_service_account_file(cls, filename, *args, **kwargs): @classmethod def database_path(cls, project, instance, database): - """DEPRECATED. Return a fully-qualified database string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified database string.""" return google.api_core.path_template.expand( "projects/{project}/instances/{instance}/databases/{database}", project=project, @@ -103,12 +98,7 @@ def database_path(cls, project, instance, database): @classmethod def instance_path(cls, project, instance): - """DEPRECATED. Return a fully-qualified instance string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified instance string.""" return google.api_core.path_template.expand( "projects/{project}/instances/{instance}", project=project, diff --git a/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py b/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py index a5bbe38642..3e718898d9 100644 --- a/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py +++ b/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py @@ -105,12 +105,7 @@ def from_service_account_file(cls, filename, *args, **kwargs): @classmethod def instance_path(cls, project, instance): - """DEPRECATED. Return a fully-qualified instance string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified instance string.""" return google.api_core.path_template.expand( "projects/{project}/instances/{instance}", project=project, @@ -119,12 +114,7 @@ def instance_path(cls, project, instance): @classmethod def instance_config_path(cls, project, instance_config): - """DEPRECATED. Return a fully-qualified instance_config string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified instance_config string.""" return google.api_core.path_template.expand( "projects/{project}/instanceConfigs/{instance_config}", project=project, @@ -133,12 +123,7 @@ def instance_config_path(cls, project, instance_config): @classmethod def project_path(cls, project): - """DEPRECATED. Return a fully-qualified project string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified project string.""" return google.api_core.path_template.expand( "projects/{project}", project=project ) diff --git a/google/cloud/spanner_v1/gapic/spanner_client.py b/google/cloud/spanner_v1/gapic/spanner_client.py index deb2a720ac..124f736ed5 100644 --- a/google/cloud/spanner_v1/gapic/spanner_client.py +++ b/google/cloud/spanner_v1/gapic/spanner_client.py @@ -85,12 +85,7 @@ def from_service_account_file(cls, filename, *args, **kwargs): @classmethod def database_path(cls, project, instance, database): - """DEPRECATED. Return a fully-qualified database string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified database string.""" return google.api_core.path_template.expand( "projects/{project}/instances/{instance}/databases/{database}", project=project, @@ -100,12 +95,7 @@ def database_path(cls, project, instance, database): @classmethod def session_path(cls, project, instance, database, session): - """DEPRECATED. Return a fully-qualified session string.""" - warnings.warn( - "Resource name helper functions are deprecated.", - PendingDeprecationWarning, - stacklevel=1, - ) + """Return a fully-qualified session string.""" return google.api_core.path_template.expand( "projects/{project}/instances/{instance}/databases/{database}/sessions/{session}", project=project, diff --git a/google/cloud/spanner_v1/instance.py b/google/cloud/spanner_v1/instance.py index 961e0da93b..83a600bd10 100644 --- a/google/cloud/spanner_v1/instance.py +++ b/google/cloud/spanner_v1/instance.py @@ -270,7 +270,7 @@ def update(self): instance.display_name = 'New display name' instance.node_count = 5 - before calling :meth:`update`. + before calling :meth:`update`. :rtype: :class:`google.api_core.operation.Operation` :returns: an operation instance diff --git a/noxfile.py b/noxfile.py index a2eefbb676..7949a4e392 100644 --- a/noxfile.py +++ b/noxfile.py @@ -86,7 +86,7 @@ def default(session): ) -@nox.session(python=["2.7", "3.5", "3.6", "3.7"]) +@nox.session(python=["2.7", "3.5", "3.6", "3.7", "3.8"]) def unit(session): """Run the unit test suite.""" default(session) diff --git a/synth.metadata b/synth.metadata index 3cd01cf197..006afde137 100644 --- a/synth.metadata +++ b/synth.metadata @@ -1,19 +1,19 @@ { - "updateTime": "2019-12-24T03:07:53.081048Z", + "updateTime": "2020-01-07T13:13:43.530766Z", "sources": [ { "generator": { "name": "artman", - "version": "0.42.3", - "dockerImage": "googleapis/artman@sha256:feed210b5723c6f524b52ef6d7740a030f2d1a8f7c29a71c5e5b4481ceaad7f5" + "version": "0.43.0", + "dockerImage": "googleapis/artman@sha256:264654a37596a44b0668b8ce6ac41082d713f6ee150b3fc6425fa78cc64e4f20" } }, { "git": { "name": "googleapis", "remote": "https://github.com/googleapis/googleapis.git", - "sha": "46e52fd64973e815cae61e78b14608fe7aa7b1df", - "internalRef": "286958627" + "sha": "cb79155f596e0396dd900da93872be7066f6340d", + "internalRef": "288441307" } }, { @@ -55,5 +55,3733 @@ "config": "google/spanner/admin/database/artman_spanner_admin_database.yaml" } } + ], + "newFiles": [ + { + "path": "README.rst" + }, + { + "path": "setup.cfg" + }, + { + "path": "LICENSE" + }, + { + "path": "synth.metadata" + }, + { + "path": ".coveragerc" + }, + { + "path": ".flake8" + }, + { + "path": "CHANGELOG.md" + }, + { + "path": ".repo-metadata.json" + }, + { + "path": "setup.py" + }, + { + "path": "noxfile.py" + }, + { + "path": "synth.py" + }, + { + "path": "pylint.config.py" + }, + { + "path": "MANIFEST.in" + }, + { + "path": "docs/usage.html" + }, + { + "path": "docs/README.rst" + }, + { + "path": "docs/instance-api.rst" + }, + { + "path": "docs/batch-usage.rst" + }, + { + "path": "docs/api-reference.rst" + }, + { + "path": "docs/changelog.md" + }, + { + "path": "docs/transaction-usage.rst" + }, + { + "path": "docs/index.rst" + }, + { + "path": "docs/keyset-api.rst" + }, + { + "path": "docs/session-api.rst" + }, + { + "path": "docs/snapshot-api.rst" + }, + { + "path": "docs/advanced-session-pool-topics.rst" + }, + { + "path": "docs/database-api.rst" + }, + { + "path": "docs/streamed-api.rst" + }, + { + "path": "docs/instance-usage.rst" + }, + { + "path": "docs/client-usage.rst" + }, + { + "path": "docs/transaction-api.rst" + }, + { + "path": "docs/database-usage.rst" + }, + { + "path": "docs/snapshot-usage.rst" + }, + { + "path": "docs/batch-api.rst" + }, + { + "path": "docs/conf.py" + }, + { + "path": "docs/client-api.rst" + }, + { + "path": "docs/_static/custom.css" + }, + { + "path": "docs/_templates/layout.html" + }, + { + "path": "docs/gapic/v1/admin_database_api.rst" + }, + { + "path": "docs/gapic/v1/admin_instance_types.rst" + }, + { + "path": "docs/gapic/v1/types.rst" + }, + { + "path": "docs/gapic/v1/admin_instance_api.rst" + }, + { + "path": "docs/gapic/v1/api.rst" + }, + { + "path": "docs/gapic/v1/admin_database_types.rst" + }, + { + "path": "docs/gapic/v1/transactions.rst" + }, + { + "path": "google/__init__.py" + }, + { + "path": "google/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": "google/cloud/spanner.py" + }, + { + "path": "google/cloud/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/types.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto" + }, + { + "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/proto/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/gapic/enums.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/gapic/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/gapic/transports/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py" + }, + { + "path": "google/cloud/spanner_v1/transaction.py" + }, + { + "path": "google/cloud/spanner_v1/keyset.py" + }, + { + "path": "google/cloud/spanner_v1/streamed.py" + }, + { + "path": "google/cloud/spanner_v1/_helpers.py" + }, + { + "path": "google/cloud/spanner_v1/param_types.py" + }, + { + "path": "google/cloud/spanner_v1/batch.py" + }, + { + "path": "google/cloud/spanner_v1/pool.py" + }, + { + "path": "google/cloud/spanner_v1/instance.py" + }, + { + "path": "google/cloud/spanner_v1/types.py" + }, + { + "path": "google/cloud/spanner_v1/client.py" + }, + { + "path": "google/cloud/spanner_v1/database.py" + }, + { + "path": "google/cloud/spanner_v1/session.py" + }, + { + "path": "google/cloud/spanner_v1/__init__.py" + }, + { + "path": "google/cloud/spanner_v1/snapshot.py" + }, + { + "path": "google/cloud/spanner_v1/proto/query_plan.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/result_set_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/proto/mutation.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/mutation_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/proto/transaction_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/spanner_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/spanner_database_admin.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/spanner_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/proto/result_set_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/type_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/proto/type.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/query_plan_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/proto/spanner.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/transaction.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/spanner_instance_admin.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/mutation_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/keys_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/keys.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/type_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/result_set.proto" + }, + { + "path": "google/cloud/spanner_v1/proto/__init__.py" + }, + { + "path": "google/cloud/spanner_v1/proto/query_plan_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_v1/proto/transaction_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/proto/keys_pb2.py" + }, + { + "path": "google/cloud/spanner_v1/gapic/spanner_client_config.py" + }, + { + "path": "google/cloud/spanner_v1/gapic/enums.py" + }, + { + "path": "google/cloud/spanner_v1/gapic/spanner_client.py" + }, + { + "path": "google/cloud/spanner_v1/gapic/__init__.py" + }, + { + "path": "google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py" + }, + { + "path": "google/cloud/spanner_v1/gapic/transports/spanner.grpc.config" + }, + { + "path": "google/cloud/spanner_v1/gapic/transports/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/types.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2_grpc.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/proto/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client_config.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/gapic/enums.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/gapic/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/__init__.py" + }, + { + "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py" + }, + { + "path": "__pycache__/synth.cpython-36.pyc" + }, + { + "path": "__pycache__/noxfile.cpython-36.pyc" + }, + { + "path": "benchmark/ycsb.py" + }, + { + "path": "benchmark/bin/ycsb" + }, + { + "path": ".nox/blacken/bin/wheel" + }, + { + "path": ".nox/blacken/bin/pip" + }, + { + "path": ".nox/blacken/bin/easy_install-3.6" + }, + { + "path": ".nox/blacken/bin/activate.ps1" + }, + { + "path": ".nox/blacken/bin/activate.xsh" + }, + { + "path": ".nox/blacken/bin/python" + }, + { + "path": ".nox/blacken/bin/easy_install" + }, + { + "path": ".nox/blacken/bin/python3" + }, + { + "path": ".nox/blacken/bin/pip3.6" + }, + { + "path": ".nox/blacken/bin/activate.csh" + }, + { + "path": ".nox/blacken/bin/black" + }, + { + "path": ".nox/blacken/bin/blackd" + }, + { + "path": ".nox/blacken/bin/python-config" + }, + { + "path": ".nox/blacken/bin/activate_this.py" + }, + { + "path": ".nox/blacken/bin/activate" + }, + { + "path": ".nox/blacken/bin/activate.fish" + }, + { + "path": ".nox/blacken/bin/pip3" + }, + { + "path": ".nox/blacken/bin/python3.6" + }, + { + "path": ".nox/blacken/lib/python3.6/no-global-site-packages.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site.py" + }, + { + "path": ".nox/blacken/lib/python3.6/orig-prefix.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/stat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/base64.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/genericpath.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/ntpath.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/types.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/io.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/tarfile.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/codecs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/copyreg.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/operator.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/enum.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/warnings.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/tempfile.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/weakref.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/tokenize.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/__future__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/hashlib.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/posixpath.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/linecache.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/bisect.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/heapq.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/abc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/struct.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/keyword.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/random.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/token.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/hmac.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/site.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/locale.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/re.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/shutil.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/reprlib.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/os.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/functools.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/__pycache__/copy.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/easy_install.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blackd.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/wheelfile.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__main__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/pkginfo.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/bdist_wheel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/metadata.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/pep425tags.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/util.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/wheelfile.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/pkginfo.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/metadata.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/pep425tags.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/util.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/__main__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/pack.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/unpack.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/convert.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/unpack.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/convert.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/pack.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/LICENSE" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/entry_points.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/__main__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/retrying.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/six.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distro.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/appdirs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/ipaddress.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pyparsing.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/contextlib2.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/bar.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/counter.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/contextlib2.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/certs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/models.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/api.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/auth.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/packages.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/structures.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/help.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/help.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/uts46data.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/core.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/idnadata.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/codec.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/core.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/writer.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/core.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/parser.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/test.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/connectionpool.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/request.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/filepost.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/connection.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/_collections.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/poolmanager.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/wait.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/response.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/ssl_.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/queue.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/retry.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/connection.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/securetransport.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/socks.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/appengine.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/index.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/database.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/util.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/core.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/build.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/dirtools.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/check.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/meta.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/py31compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/tags.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/self_outdated_check.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/wheel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/exceptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/locations.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/pyproject.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/build_env.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/download.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/configuration.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/legacy_resolve.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/index.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/collector.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/main.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cache.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/pep425tags.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/git.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/versioncontrol.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/collector.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/main.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/exceptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/pep425tags.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/index.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/download.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/virtualenv.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/ui.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/models.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/encoding.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/misc.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/inject_securetransport.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/marker_files.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/unpacking.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/urls.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/subprocess.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/logging.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/typing.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/filetypes.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/glibc.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/packaging.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/hashes.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/ui.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/urls.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/logging.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/completion.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/show.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/debug.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/wheel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/list.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/freeze.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/check.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/install.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/download.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/hash.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/configuration.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/help.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/search.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/help.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/list.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/check.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/search.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/debug.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/wheel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/base.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/installed.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/base.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/legacy.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/__pycache__/legacy.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/freeze.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/prepare.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/check.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/generate_metadata.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/generate_metadata.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/constructors.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_set.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_install.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_file.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_set.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/command_context.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/parser.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/base_command.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/req_command.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/parser.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/xmlrpc.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/auth.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/session.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/cache.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/cache.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/auth.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/session.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/selection_prefs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/search_scope.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/candidate.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/index.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/target_python.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/link.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/format_control.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/target_python.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/candidate.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/site-patch.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/config.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/errors.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py27compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/gui.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_deprecation_warning.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/gui-64.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/launch.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/ssl_support.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/windows_support.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/cli-64.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/script (dev).tmpl" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/wheel.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/unicode_utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/gui-32.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_imp.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/build_meta.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/cli-32.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py31compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/lib2to3_ex.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/namespaces.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/dist.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py33compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py34compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/monkey.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/sandbox.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/extension.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/glob.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/archive_util.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/msvc.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/depends.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/dep_util.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/installer.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/package_index.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/cli.exe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/script.tmpl" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py34compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/errors.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/_imp.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/installer.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/six.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/ordered_set.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/tags.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/extern/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/saveopts.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/upload_docs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/easy_install.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/egg_info.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/sdist.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/build_py.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/register.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install_egg_info.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/upload.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/setopt.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install_lib.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/test.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/alias.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/rotate.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/develop.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/bdist_egg.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/build_clib.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/py36compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/build_ext.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install_scripts.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/dist_info.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/blackd.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/appdirs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/black.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/toml.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/entry_points.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/LICENSE.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pytree.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/PatternGrammar.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pygram.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/Grammar.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__pycache__/pygram.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__pycache__/pytree.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/conv.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/literals.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/tokenize.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/driver.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/pgen.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/token.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/grammar.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/parse.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/token.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/entry_points.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/LICENSE.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/ordered.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/encoder.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/tz.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/decoder.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/encoder.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/tz.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/ordered.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/decoder.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/LICENSE" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/zip-safe" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/entry_points.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/globals.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/core.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/exceptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/_compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/formatting.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/parser.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/_bashcomplete.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/types.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/_unicodefun.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/_textwrap.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/decorators.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/termui.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/_termui_impl.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/testing.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/_winconsole.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/decorators.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/types.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/core.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_termui_impl.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/termui.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/exceptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_bashcomplete.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/LICENSE" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/DESCRIPTION.rst" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/LICENSE.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/metadata.json" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/py31compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/six.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/extern/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/validators.pyi" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/_make.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/_version_info.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/exceptions.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/_compat.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__init__.pyi" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/_config.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/filters.pyi" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/converters.pyi" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/_funcs.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/py.typed" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/_version_info.pyi" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/converters.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/exceptions.pyi" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/validators.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/filters.py" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/filters.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_compat.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_funcs.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/exceptions.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_config.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_make.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/validators.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_version_info.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/converters.cpython-36.pyc" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/top_level.txt" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/WHEEL" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/DESCRIPTION.rst" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/METADATA" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/RECORD" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/INSTALLER" + }, + { + "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/metadata.json" + }, + { + "path": ".nox/blacken/lib/python3.6/distutils/distutils.cfg" + }, + { + "path": ".nox/blacken/lib/python3.6/distutils/__init__.py" + }, + { + "path": ".nox/blacken/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc" + }, + { + "path": "tests/_fixtures.py" + }, + { + "path": "tests/__init__.py" + }, + { + "path": "tests/unit/test_param_types.py" + }, + { + "path": "tests/unit/test_session.py" + }, + { + "path": "tests/unit/test_database.py" + }, + { + "path": "tests/unit/test_instance.py" + }, + { + "path": "tests/unit/streaming-read-acceptance-test.json" + }, + { + "path": "tests/unit/test_client.py" + }, + { + "path": "tests/unit/test_batch.py" + }, + { + "path": "tests/unit/test_pool.py" + }, + { + "path": "tests/unit/test__helpers.py" + }, + { + "path": "tests/unit/__init__.py" + }, + { + "path": "tests/unit/test_snapshot.py" + }, + { + "path": "tests/unit/test_keyset.py" + }, + { + "path": "tests/unit/test_streamed.py" + }, + { + "path": "tests/unit/test_transaction.py" + }, + { + "path": "tests/unit/gapic/v1/test_database_admin_client_v1.py" + }, + { + "path": "tests/unit/gapic/v1/test_instance_admin_client_v1.py" + }, + { + "path": "tests/unit/gapic/v1/test_spanner_client_v1.py" + }, + { + "path": "tests/system/test_system.py" + }, + { + "path": "tests/system/__init__.py" + }, + { + "path": "tests/system/utils/scrub_instances.py" + }, + { + "path": "tests/system/utils/streaming_utils.py" + }, + { + "path": "tests/system/utils/__init__.py" + }, + { + "path": "tests/system/utils/clear_streaming.py" + }, + { + "path": "tests/system/utils/populate_streaming.py" + } ] } \ No newline at end of file From ff4409fa8d5b56fddf14d9d37df9479a8587d6fc Mon Sep 17 00:00:00 2001 From: Yoshi Automation Bot Date: Thu, 30 Jan 2020 09:22:17 -0800 Subject: [PATCH 05/12] chore(spanner): bump copyright year to 2020; change docstring formatting (via synth) (#10269) --- .../gapic/database_admin_client.py | 2 +- .../spanner_admin_database_v1/gapic/enums.py | 2 +- .../database_admin_grpc_transport.py | 2 +- .../proto/spanner_database_admin_pb2.py | 12 +- .../spanner_admin_instance_v1/gapic/enums.py | 2 +- .../gapic/instance_admin_client.py | 2 +- .../instance_admin_grpc_transport.py | 2 +- .../proto/spanner_instance_admin_pb2.py | 21 +- google/cloud/spanner_v1/gapic/enums.py | 2 +- .../cloud/spanner_v1/gapic/spanner_client.py | 2 +- .../transports/spanner_grpc_transport.py | 2 +- google/cloud/spanner_v1/proto/keys_pb2.py | 6 +- google/cloud/spanner_v1/proto/mutation_pb2.py | 9 +- .../cloud/spanner_v1/proto/query_plan_pb2.py | 7 +- .../cloud/spanner_v1/proto/result_set_pb2.py | 15 +- google/cloud/spanner_v1/proto/spanner_pb2.py | 40 +- .../cloud/spanner_v1/proto/transaction_pb2.py | 11 +- google/cloud/spanner_v1/proto/type_pb2.py | 6 +- synth.metadata | 3581 +---------------- .../gapic/v1/test_database_admin_client_v1.py | 2 +- .../gapic/v1/test_instance_admin_client_v1.py | 2 +- tests/unit/gapic/v1/test_spanner_client_v1.py | 2 +- 22 files changed, 227 insertions(+), 3505 deletions(-) diff --git a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py index be458bd6af..cbb2c084cd 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py +++ b/google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_admin_database_v1/gapic/enums.py b/google/cloud/spanner_admin_database_v1/gapic/enums.py index eab6503a65..aa1a519027 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/enums.py +++ b/google/cloud/spanner_admin_database_v1/gapic/enums.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py b/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py index 24eab024c6..cd56873704 100644 --- a/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py +++ b/google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py b/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py index 2091661949..35fd22717e 100644 --- a/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py +++ b/google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py @@ -790,9 +790,9 @@ databases: Databases that matched the request. next_page_token: - ``next_page_token`` can be sent in a subsequent [ListDatabases - ][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases - ] call to fetch more of the matching databases. + \ ``next_page_token`` can be sent in a subsequent [ListDatabas + es][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabas + es] call to fetch more of the matching databases. """, # @@protoc_insertion_point(class_scope:google.spanner.admin.database.v1.ListDatabasesResponse) ), @@ -879,9 +879,9 @@ dict( DESCRIPTOR=_UPDATEDATABASEDDLREQUEST, __module__="google.cloud.spanner.admin.database_v1.proto.spanner_database_admin_pb2", - __doc__="""Enqueues the given DDL statements to be applied, in order but not - necessarily all at once, to the database schema at some point (or - points) in the future. The server checks that the statements are + __doc__="""Enqueues the given DDL statements to be applied, in order + but not necessarily all at once, to the database schema at some point + (or points) in the future. The server checks that the statements are executable (syntactically valid, name tables that exist, etc.) before enqueueing them, but they may still fail upon later execution (e.g., if a statement from another batch of statements is applied first and it diff --git a/google/cloud/spanner_admin_instance_v1/gapic/enums.py b/google/cloud/spanner_admin_instance_v1/gapic/enums.py index e029ed4918..cfb40655be 100644 --- a/google/cloud/spanner_admin_instance_v1/gapic/enums.py +++ b/google/cloud/spanner_admin_instance_v1/gapic/enums.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py b/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py index 3e718898d9..c7c4912f2a 100644 --- a/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py +++ b/google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py b/google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py index 18da775b6d..1d3c404bf6 100644 --- a/google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py +++ b/google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py b/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py index a70d64b0a8..356c47f1a0 100644 --- a/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py +++ b/google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py @@ -1304,8 +1304,9 @@ dict( DESCRIPTOR=_INSTANCECONFIG, __module__="google.cloud.spanner.admin.instance_v1.proto.spanner_instance_admin_pb2", - __doc__="""A possible configuration for a Cloud Spanner instance. Configurations - define the geographic placement of nodes and their replication. + __doc__="""A possible configuration for a Cloud Spanner instance. + Configurations define the geographic placement of nodes and their + replication. Attributes: @@ -1339,8 +1340,8 @@ ), DESCRIPTOR=_INSTANCE, __module__="google.cloud.spanner.admin.instance_v1.proto.spanner_instance_admin_pb2", - __doc__="""An isolated set of Cloud Spanner resources on which databases can be - hosted. + __doc__="""An isolated set of Cloud Spanner resources on which + databases can be hosted. Attributes: @@ -1458,9 +1459,9 @@ instance_configs: The list of requested instance configurations. next_page_token: - ``next_page_token`` can be sent in a subsequent [ListInstanceC - onfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListIns - tanceConfigs] call to fetch more of the matching instance + \ ``next_page_token`` can be sent in a subsequent [ListInstanc + eConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListI + nstanceConfigs] call to fetch more of the matching instance configurations. """, # @@protoc_insertion_point(class_scope:google.spanner.admin.instance.v1.ListInstanceConfigsResponse) @@ -1597,9 +1598,9 @@ instances: The list of requested instances. next_page_token: - ``next_page_token`` can be sent in a subsequent [ListInstances - ][google.spanner.admin.instance.v1.InstanceAdmin.ListInstances - ] call to fetch more of the matching instances. + \ ``next_page_token`` can be sent in a subsequent [ListInstanc + es][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanc + es] call to fetch more of the matching instances. """, # @@protoc_insertion_point(class_scope:google.spanner.admin.instance.v1.ListInstancesResponse) ), diff --git a/google/cloud/spanner_v1/gapic/enums.py b/google/cloud/spanner_v1/gapic/enums.py index 5f38def2b8..445abc8429 100644 --- a/google/cloud/spanner_v1/gapic/enums.py +++ b/google/cloud/spanner_v1/gapic/enums.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_v1/gapic/spanner_client.py b/google/cloud/spanner_v1/gapic/spanner_client.py index 124f736ed5..cf6aafd6b6 100644 --- a/google/cloud/spanner_v1/gapic/spanner_client.py +++ b/google/cloud/spanner_v1/gapic/spanner_client.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py b/google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py index 0d16522afb..47cedd3cc8 100644 --- a/google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py +++ b/google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/google/cloud/spanner_v1/proto/keys_pb2.py b/google/cloud/spanner_v1/proto/keys_pb2.py index 0a7966084d..9d38124847 100644 --- a/google/cloud/spanner_v1/proto/keys_pb2.py +++ b/google/cloud/spanner_v1/proto/keys_pb2.py @@ -412,9 +412,9 @@ dict( DESCRIPTOR=_KEYSET, __module__="google.cloud.spanner_v1.proto.keys_pb2", - __doc__="""``KeySet`` defines a collection of Cloud Spanner keys and/or key ranges. - All the keys are expected to be in the same table or index. The keys - need not be sorted in any particular way. + __doc__="""\ ``KeySet`` defines a collection of Cloud Spanner keys + and/or key ranges. All the keys are expected to be in the same table or + index. The keys need not be sorted in any particular way. If the same key is specified multiple times in the set (for example if two ranges, two keys, or a key and a range overlap), Cloud Spanner diff --git a/google/cloud/spanner_v1/proto/mutation_pb2.py b/google/cloud/spanner_v1/proto/mutation_pb2.py index fe96383915..db5a781f69 100644 --- a/google/cloud/spanner_v1/proto/mutation_pb2.py +++ b/google/cloud/spanner_v1/proto/mutation_pb2.py @@ -373,7 +373,8 @@ dict( DESCRIPTOR=_MUTATION_DELETE, __module__="google.cloud.spanner_v1.proto.mutation_pb2", - __doc__="""Arguments to [delete][google.spanner.v1.Mutation.delete] operations. + __doc__="""Arguments to [delete][google.spanner.v1.Mutation.delete] + operations. Attributes: @@ -390,9 +391,9 @@ ), DESCRIPTOR=_MUTATION, __module__="google.cloud.spanner_v1.proto.mutation_pb2", - __doc__="""A modification to one or more Cloud Spanner rows. Mutations can be - applied to a Cloud Spanner database by sending them in a - [Commit][google.spanner.v1.Spanner.Commit] call. + __doc__="""A modification to one or more Cloud Spanner rows. + Mutations can be applied to a Cloud Spanner database by sending them in + a [Commit][google.spanner.v1.Spanner.Commit] call. Attributes: diff --git a/google/cloud/spanner_v1/proto/query_plan_pb2.py b/google/cloud/spanner_v1/proto/query_plan_pb2.py index 8fe752ce8c..bc715b4549 100644 --- a/google/cloud/spanner_v1/proto/query_plan_pb2.py +++ b/google/cloud/spanner_v1/proto/query_plan_pb2.py @@ -470,8 +470,8 @@ dict( DESCRIPTOR=_PLANNODE_CHILDLINK, __module__="google.cloud.spanner_v1.proto.query_plan_pb2", - __doc__="""Metadata associated with a parent-child relationship appearing in a - [PlanNode][google.spanner.v1.PlanNode]. + __doc__="""Metadata associated with a parent-child relationship + appearing in a [PlanNode][google.spanner.v1.PlanNode]. Attributes: @@ -580,7 +580,8 @@ dict( DESCRIPTOR=_QUERYPLAN, __module__="google.cloud.spanner_v1.proto.query_plan_pb2", - __doc__="""Contains an ordered list of nodes appearing in the query plan. + __doc__="""Contains an ordered list of nodes appearing in the query + plan. Attributes: diff --git a/google/cloud/spanner_v1/proto/result_set_pb2.py b/google/cloud/spanner_v1/proto/result_set_pb2.py index f99728f6b9..3740450e6b 100644 --- a/google/cloud/spanner_v1/proto/result_set_pb2.py +++ b/google/cloud/spanner_v1/proto/result_set_pb2.py @@ -478,9 +478,9 @@ dict( DESCRIPTOR=_PARTIALRESULTSET, __module__="google.cloud.spanner_v1.proto.result_set_pb2", - __doc__="""Partial results from a streaming read or SQL query. Streaming reads and - SQL queries better tolerate large result sets, large rows, and large - values, but are a little trickier to consume. + __doc__="""Partial results from a streaming read or SQL query. + Streaming reads and SQL queries better tolerate large result sets, large + rows, and large values, but are a little trickier to consume. Attributes: @@ -564,8 +564,8 @@ dict( DESCRIPTOR=_RESULTSETMETADATA, __module__="google.cloud.spanner_v1.proto.result_set_pb2", - __doc__="""Metadata about a [ResultSet][google.spanner.v1.ResultSet] or - [PartialResultSet][google.spanner.v1.PartialResultSet]. + __doc__="""Metadata about a [ResultSet][google.spanner.v1.ResultSet] + or [PartialResultSet][google.spanner.v1.PartialResultSet]. Attributes: @@ -591,8 +591,9 @@ dict( DESCRIPTOR=_RESULTSETSTATS, __module__="google.cloud.spanner_v1.proto.result_set_pb2", - __doc__="""Additional statistics about a [ResultSet][google.spanner.v1.ResultSet] - or [PartialResultSet][google.spanner.v1.PartialResultSet]. + __doc__="""Additional statistics about a + [ResultSet][google.spanner.v1.ResultSet] or + [PartialResultSet][google.spanner.v1.PartialResultSet]. Attributes: diff --git a/google/cloud/spanner_v1/proto/spanner_pb2.py b/google/cloud/spanner_v1/proto/spanner_pb2.py index 9581f229f2..3415264909 100644 --- a/google/cloud/spanner_v1/proto/spanner_pb2.py +++ b/google/cloud/spanner_v1/proto/spanner_pb2.py @@ -2383,7 +2383,8 @@ dict( DESCRIPTOR=_GETSESSIONREQUEST, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The request for [GetSession][google.spanner.v1.Spanner.GetSession]. + __doc__="""The request for + [GetSession][google.spanner.v1.Spanner.GetSession]. Attributes: @@ -2401,7 +2402,8 @@ dict( DESCRIPTOR=_LISTSESSIONSREQUEST, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The request for [ListSessions][google.spanner.v1.Spanner.ListSessions]. + __doc__="""The request for + [ListSessions][google.spanner.v1.Spanner.ListSessions]. Attributes: @@ -2435,14 +2437,15 @@ dict( DESCRIPTOR=_LISTSESSIONSRESPONSE, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The response for [ListSessions][google.spanner.v1.Spanner.ListSessions]. + __doc__="""The response for + [ListSessions][google.spanner.v1.Spanner.ListSessions]. Attributes: sessions: The list of requested sessions. next_page_token: - ``next_page_token`` can be sent in a subsequent + \ ``next_page_token`` can be sent in a subsequent [ListSessions][google.spanner.v1.Spanner.ListSessions] call to fetch more of the matching sessions. """, @@ -2485,7 +2488,8 @@ ), DESCRIPTOR=_EXECUTESQLREQUEST, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The request for [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and + __doc__="""The request for + [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql]. @@ -2719,19 +2723,20 @@ dict( DESCRIPTOR=_PARTITIONOPTIONS, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""Options for a PartitionQueryRequest and PartitionReadRequest. + __doc__="""Options for a PartitionQueryRequest and + PartitionReadRequest. Attributes: partition_size_bytes: - **Note:** This hint is currently ignored by PartitionQuery and - PartitionRead requests. The desired data size for each + \ **Note:** This hint is currently ignored by PartitionQuery + and PartitionRead requests. The desired data size for each partition generated. The default for this option is currently 1 GiB. This is only a hint. The actual size of each partition may be smaller or larger than this size request. max_partitions: - **Note:** This hint is currently ignored by PartitionQuery and - PartitionRead requests. The desired maximum number of + \ **Note:** This hint is currently ignored by PartitionQuery + and PartitionRead requests. The desired maximum number of partitions to return. For example, this may be set to the number of workers available. The default for this option is currently 10,000. The maximum value is currently 200,000. This @@ -2816,7 +2821,8 @@ dict( DESCRIPTOR=_PARTITIONREADREQUEST, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The request for [PartitionRead][google.spanner.v1.Spanner.PartitionRead] + __doc__="""The request for + [PartitionRead][google.spanner.v1.Spanner.PartitionRead] Attributes: @@ -2870,7 +2876,8 @@ dict( DESCRIPTOR=_PARTITION, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""Information returned for each partition returned in a PartitionResponse. + __doc__="""Information returned for each partition returned in a + PartitionResponse. Attributes: @@ -3007,7 +3014,8 @@ dict( DESCRIPTOR=_COMMITREQUEST, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The request for [Commit][google.spanner.v1.Spanner.Commit]. + __doc__="""The request for + [Commit][google.spanner.v1.Spanner.Commit]. Attributes: @@ -3044,7 +3052,8 @@ dict( DESCRIPTOR=_COMMITRESPONSE, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The response for [Commit][google.spanner.v1.Spanner.Commit]. + __doc__="""The response for + [Commit][google.spanner.v1.Spanner.Commit]. Attributes: @@ -3063,7 +3072,8 @@ dict( DESCRIPTOR=_ROLLBACKREQUEST, __module__="google.cloud.spanner_v1.proto.spanner_pb2", - __doc__="""The request for [Rollback][google.spanner.v1.Spanner.Rollback]. + __doc__="""The request for + [Rollback][google.spanner.v1.Spanner.Rollback]. Attributes: diff --git a/google/cloud/spanner_v1/proto/transaction_pb2.py b/google/cloud/spanner_v1/proto/transaction_pb2.py index 62c21f8e77..aa83e3373c 100644 --- a/google/cloud/spanner_v1/proto/transaction_pb2.py +++ b/google/cloud/spanner_v1/proto/transaction_pb2.py @@ -548,8 +548,9 @@ dict( DESCRIPTOR=_TRANSACTIONOPTIONS_READWRITE, __module__="google.cloud.spanner_v1.proto.transaction_pb2", - __doc__="""Message type to initiate a read-write transaction. Currently this - transaction type has no options. + __doc__="""Message type to initiate a read-write transaction. + Currently this transaction type has no options. + """, # @@protoc_insertion_point(class_scope:google.spanner.v1.TransactionOptions.ReadWrite) ), @@ -561,6 +562,7 @@ DESCRIPTOR=_TRANSACTIONOPTIONS_PARTITIONEDDML, __module__="google.cloud.spanner_v1.proto.transaction_pb2", __doc__="""Message type to initiate a Partitioned DML transaction. + """, # @@protoc_insertion_point(class_scope:google.spanner.v1.TransactionOptions.PartitionedDml) ), @@ -630,8 +632,7 @@ ), DESCRIPTOR=_TRANSACTIONOPTIONS, __module__="google.cloud.spanner_v1.proto.transaction_pb2", - __doc__="""Transactions - + __doc__="""# Transactions Each session can have at most one active transaction at a time. After the active transaction is completed, the session can immediately be @@ -956,7 +957,7 @@ Attributes: id: - ``id`` may be used to identify the transaction in subsequent + \ ``id`` may be used to identify the transaction in subsequent [Read][google.spanner.v1.Spanner.Read], [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql], [Commit][google.spanner.v1.Spanner.Commit], or diff --git a/google/cloud/spanner_v1/proto/type_pb2.py b/google/cloud/spanner_v1/proto/type_pb2.py index 3e8ba25685..2ef35b36c6 100644 --- a/google/cloud/spanner_v1/proto/type_pb2.py +++ b/google/cloud/spanner_v1/proto/type_pb2.py @@ -279,8 +279,8 @@ dict( DESCRIPTOR=_TYPE, __module__="google.cloud.spanner_v1.proto.type_pb2", - __doc__="""``Type`` indicates the type of a Cloud Spanner value, as might be stored - in a table cell or returned from an SQL query. + __doc__="""\ ``Type`` indicates the type of a Cloud Spanner value, as + might be stored in a table cell or returned from an SQL query. Attributes: @@ -332,7 +332,7 @@ ), DESCRIPTOR=_STRUCTTYPE, __module__="google.cloud.spanner_v1.proto.type_pb2", - __doc__="""``StructType`` defines the fields of a + __doc__="""\ ``StructType`` defines the fields of a [STRUCT][google.spanner.v1.TypeCode.STRUCT] type. diff --git a/synth.metadata b/synth.metadata index 006afde137..2e5ff8a808 100644 --- a/synth.metadata +++ b/synth.metadata @@ -1,19 +1,20 @@ { - "updateTime": "2020-01-07T13:13:43.530766Z", + "updateTime": "2020-01-30T13:37:36.907968Z", "sources": [ { "generator": { "name": "artman", - "version": "0.43.0", - "dockerImage": "googleapis/artman@sha256:264654a37596a44b0668b8ce6ac41082d713f6ee150b3fc6425fa78cc64e4f20" + "version": "0.44.4", + "dockerImage": "googleapis/artman@sha256:19e945954fc960a4bdfee6cb34695898ab21a8cf0bac063ee39b91f00a1faec8" } }, { "git": { "name": "googleapis", "remote": "https://github.com/googleapis/googleapis.git", - "sha": "cb79155f596e0396dd900da93872be7066f6340d", - "internalRef": "288441307" + "sha": "c1246a29e22b0f98e800a536b5b0da2d933a55f2", + "internalRef": "292310790", + "log": "c1246a29e22b0f98e800a536b5b0da2d933a55f2\nUpdating v1 protos with the latest inline documentation (in comments) and config options. Also adding a per-service .yaml file.\n\nPiperOrigin-RevId: 292310790\n\nb491d07cadaae7cde5608321f913e5ca1459b32d\nRevert accidental local_repository change\n\nPiperOrigin-RevId: 292245373\n\naf3400a8cb6110025198b59a0f7d018ae3cda700\nUpdate gapic-generator dependency (prebuilt PHP binary support).\n\nPiperOrigin-RevId: 292243997\n\n341fd5690fae36f36cf626ef048fbcf4bbe7cee6\ngrafeas: v1 add resource_definition for the grafeas.io/Project and change references for Project.\n\nPiperOrigin-RevId: 292221998\n\n42e915ec2ece1cd37a590fbcd10aa2c0fb0e5b06\nUpdate the gapic-generator, protoc-java-resource-name-plugin and protoc-docs-plugin to the latest commit.\n\nPiperOrigin-RevId: 292182368\n\nf035f47250675d31492a09f4a7586cfa395520a7\nFix grafeas build and update build.sh script to include gerafeas.\n\nPiperOrigin-RevId: 292168753\n\n26ccb214b7bc4a716032a6266bcb0a9ca55d6dbb\nasset: v1p1beta1 add client config annotations and retry config\n\nPiperOrigin-RevId: 292154210\n\n974ee5c0b5d03e81a50dafcedf41e0efebb5b749\nasset: v1beta1 add client config annotations\n\nPiperOrigin-RevId: 292152573\n\ncf3b61102ed5f36b827bc82ec39be09525f018c8\n Fix to protos for v1p1beta1 release of Cloud Security Command Center\n\nPiperOrigin-RevId: 292034635\n\n4e1cfaa7c0fede9e65d64213ca3da1b1255816c0\nUpdate the public proto to support UTF-8 encoded id for CatalogService API, increase the ListCatalogItems deadline to 300s and some minor documentation change\n\nPiperOrigin-RevId: 292030970\n\n9c483584f8fd5a1b862ae07973f4cc7bb3e46648\nasset: add annotations to v1p1beta1\n\nPiperOrigin-RevId: 292009868\n\ne19209fac29731d0baf6d9ac23da1164f7bdca24\nAdd the google.rpc.context.AttributeContext message to the open source\ndirectories.\n\nPiperOrigin-RevId: 291999930\n\nae5662960573f279502bf98a108a35ba1175e782\noslogin API: move file level option on top of the file to avoid protobuf.js bug.\n\nPiperOrigin-RevId: 291990506\n\neba3897fff7c49ed85d3c47fc96fe96e47f6f684\nAdd cc_proto_library and cc_grpc_library targets for Spanner and IAM protos.\n\nPiperOrigin-RevId: 291988651\n\n8e981acfd9b97ea2f312f11bbaa7b6c16e412dea\nBeta launch for PersonDetection and FaceDetection features.\n\nPiperOrigin-RevId: 291821782\n\n994e067fae3b21e195f7da932b08fff806d70b5d\nasset: add annotations to v1p2beta1\n\nPiperOrigin-RevId: 291815259\n\n244e1d2c89346ca2e0701b39e65552330d68545a\nAdd Playable Locations service\n\nPiperOrigin-RevId: 291806349\n\n909f8f67963daf45dd88d020877fb9029b76788d\nasset: add annotations to v1beta2\n\nPiperOrigin-RevId: 291805301\n\n3c39a1d6e23c1ef63c7fba4019c25e76c40dfe19\nKMS: add file-level message for CryptoKeyPath, it is defined in gapic yaml but not\nin proto files.\n\nPiperOrigin-RevId: 291420695\n\nc6f3f350b8387f8d1b85ed4506f30187ebaaddc3\ncontaineranalysis: update v1beta1 and bazel build with annotations\n\nPiperOrigin-RevId: 291401900\n\n92887d74b44e4e636252b7b8477d0d2570cd82db\nfix: fix the location of grpc config file.\n\nPiperOrigin-RevId: 291396015\n\ne26cab8afd19d396b929039dac5d874cf0b5336c\nexpr: add default_host and method_signature annotations to CelService\n\nPiperOrigin-RevId: 291240093\n\n06093ae3952441c34ec176d1f7431b8765cec0be\nirm: fix v1alpha2 bazel build by adding missing proto imports\n\nPiperOrigin-RevId: 291227940\n\na8a2514af326e4673063f9a3c9d0ef1091c87e6c\nAdd proto annotation for cloud/irm API\n\nPiperOrigin-RevId: 291217859\n\n8d16f76de065f530d395a4c7eabbf766d6a120fd\nGenerate Memcache v1beta2 API protos and gRPC ServiceConfig files\n\nPiperOrigin-RevId: 291008516\n\n3af1dabd93df9a9f17bf3624d3b875c11235360b\ngrafeas: Add containeranalysis default_host to Grafeas service\n\nPiperOrigin-RevId: 290965849\n\nbe2663fa95e31cba67d0cd62611a6674db9f74b7\nfix(google/maps/roads): add missing opening bracket\n\nPiperOrigin-RevId: 290964086\n\nfacc26550a0af0696e0534bc9cae9df14275aa7c\nUpdating v2 protos with the latest inline documentation (in comments) and adding a per-service .yaml file.\n\nPiperOrigin-RevId: 290952261\n\ncda99c1f7dc5e4ca9b1caeae1dc330838cbc1461\nChange api_name to 'asset' for v1p1beta1\n\nPiperOrigin-RevId: 290800639\n\n94e9e90c303a820ce40643d9129e7f0d2054e8a1\nAdds Google Maps Road service\n\nPiperOrigin-RevId: 290795667\n\na3b23dcb2eaecce98c600c7d009451bdec52dbda\nrpc: new message ErrorInfo, other comment updates\n\nPiperOrigin-RevId: 290781668\n\n26420ef4e46c37f193c0fbe53d6ebac481de460e\nAdd proto definition for Org Policy v1.\n\nPiperOrigin-RevId: 290771923\n\n7f0dab8177cf371ae019a082e2512de7ac102888\nPublish Routes Preferred API v1 service definitions.\n\nPiperOrigin-RevId: 290326986\n\nad6e508d0728e1d1bca6e3f328cd562718cb772d\nFix: Qualify resource type references with \"jobs.googleapis.com/\"\n\nPiperOrigin-RevId: 290285762\n\n58e770d568a2b78168ddc19a874178fee8265a9d\ncts client library\n\nPiperOrigin-RevId: 290146169\n\naf9daa4c3b4c4a8b7133b81588dd9ffd37270af2\nAdd more programming language options to public proto\n\nPiperOrigin-RevId: 290144091\n\nd9f2bbf2df301ef84641d4cec7c828736a0bd907\ntalent: add missing resource.proto dep to Bazel build target\n\nPiperOrigin-RevId: 290143164\n\n3b3968237451d027b42471cd28884a5a1faed6c7\nAnnotate Talent API.\nAdd gRPC service config for retry.\nUpdate bazel file with google.api.resource dependency.\n\nPiperOrigin-RevId: 290125172\n\n0735b4b096872960568d1f366bfa75b7b0e1f1a3\nWeekly library update.\n\nPiperOrigin-RevId: 289939042\n\n8760d3d9a4543d7f9c0d1c7870aca08b116e4095\nWeekly library update.\n\nPiperOrigin-RevId: 289939020\n\n8607df842f782a901805187e02fff598145b0b0e\nChange Talent API timeout to 30s.\n\nPiperOrigin-RevId: 289912621\n\n908155991fe32570653bcb72ecfdcfc896642f41\nAdd Recommendations AI V1Beta1\n\nPiperOrigin-RevId: 289901914\n\n5c9a8c2bebd8b71aa66d1cc473edfaac837a2c78\nAdding no-arg method signatures for ListBillingAccounts and ListServices\n\nPiperOrigin-RevId: 289891136\n\n50b0e8286ac988b0593bd890eb31fef6ea2f5767\nlongrunning: add grpc service config and default_host annotation to operations.proto\n\nPiperOrigin-RevId: 289876944\n\n6cac27dabe51c54807b0401698c32d34998948a9\n Updating default deadline for Cloud Security Command Center's v1 APIs.\n\nPiperOrigin-RevId: 289875412\n\nd99df0d67057a233c711187e0689baa4f8e6333d\nFix: Correct spelling in C# namespace option\n\nPiperOrigin-RevId: 289709813\n\n2fa8d48165cc48e35b0c62e6f7bdade12229326c\nfeat: Publish Recommender v1 to GitHub.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289619243\n\n9118db63d1ab493a2e44a3b4973fde810a835c49\nfirestore: don't retry reads that fail with Aborted\n\nFor transaction reads that fail with ABORTED, we need to rollback and start a new transaction. Our current configuration makes it so that GAPIC retries ABORTED reads multiple times without making any progress. Instead, we should retry at the transaction level.\n\nPiperOrigin-RevId: 289532382\n\n1dbfd3fe4330790b1e99c0bb20beb692f1e20b8a\nFix bazel build\nAdd other langauges (Java was already there) for bigquery/storage/v1alpha2 api.\n\nPiperOrigin-RevId: 289519766\n\nc06599cdd7d11f8d3fd25f8d3249e5bb1a3d5d73\nInitial commit of google.cloud.policytroubleshooter API, The API helps in troubleshooting GCP policies. Refer https://cloud.google.com/iam/docs/troubleshooting-access for more information\n\nPiperOrigin-RevId: 289491444\n\nfce7d80fa16ea241e87f7bc33d68595422e94ecd\nDo not pass samples option for Artman config of recommender v1 API.\n\nPiperOrigin-RevId: 289477403\n\nef179e8c61436297e6bb124352e47e45c8c80cb1\nfix: Address missing Bazel dependency.\n\nBazel builds stopped working in 06ec6d5 because\nthe google/longrunning/operations.proto file took\nan import from google/api/client.proto, but that\nimport was not added to BUILD.bazel.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289446074\n\n8841655b242c84fd691d77d7bcf21b61044f01ff\nMigrate Data Labeling v1beta1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289446026\n\n06ec6d5d053fff299eaa6eaa38afdd36c5e2fc68\nAdd annotations to google.longrunning.v1\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289413169\n\n0480cf40be1d3cc231f4268a2fdb36a8dd60e641\nMigrate IAM Admin v1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289411084\n\n1017173e9adeb858587639af61889ad970c728b1\nSpecify a C# namespace for BigQuery Connection v1beta1\n\nPiperOrigin-RevId: 289396763\n\nb08714b378e8e5b0c4ecdde73f92c36d6303b4b6\nfix: Integrate latest proto-docs-plugin fix.\nFixes dialogflow v2\n\nPiperOrigin-RevId: 289189004\n\n51217a67e79255ee1f2e70a6a3919df082513327\nCreate BUILD file for recommender v1\n\nPiperOrigin-RevId: 289183234\n\nacacd87263c0a60e458561b8b8ce9f67c760552a\nGenerate recommender v1 API protos and gRPC ServiceConfig files\n\nPiperOrigin-RevId: 289177510\n\n9d2f7133b97720b1fa3601f6dcd30760ba6d8a1e\nFix kokoro build script\n\nPiperOrigin-RevId: 289166315\n\nc43a67530d2a47a0220cad20ca8de39b3fbaf2c5\ncloudtasks: replace missing RPC timeout config for v2beta2 and v2beta3\n\nPiperOrigin-RevId: 289162391\n\n4cefc229a9197236fc0adf02d69b71c0c5cf59de\nSynchronize new proto/yaml changes.\n\nPiperOrigin-RevId: 289158456\n\n56f263fe959c50786dab42e3c61402d32d1417bd\nCatalog API: Adding config necessary to build client libraries\n\nPiperOrigin-RevId: 289149879\n\n4543762b23a57fc3c53d409efc3a9affd47b6ab3\nFix Bazel build\nbilling/v1 and dialogflow/v2 remain broken (not bazel-related issues).\nBilling has wrong configuration, dialogflow failure is caused by a bug in documentation plugin.\n\nPiperOrigin-RevId: 289140194\n\nc9dce519127b97e866ca133a01157f4ce27dcceb\nUpdate Bigtable docs\n\nPiperOrigin-RevId: 289114419\n\n802c5c5f2bf94c3facb011267d04e71942e0d09f\nMigrate DLP to proto annotations (but not GAPIC v2).\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289102579\n\n6357f30f2ec3cff1d8239d18b707ff9d438ea5da\nRemove gRPC configuration file that was in the wrong place.\n\nPiperOrigin-RevId: 289096111\n\n360a8792ed62f944109d7e22d613a04a010665b4\n Protos for v1p1beta1 release of Cloud Security Command Center\n\nPiperOrigin-RevId: 289011995\n\na79211c20c4f2807eec524d00123bf7c06ad3d6e\nRoll back containeranalysis v1 to GAPIC v1.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288999068\n\n9e60345ba603e03484a8aaa33ce5ffa19c1c652b\nPublish Routes Preferred API v1 proto definitions.\n\nPiperOrigin-RevId: 288941399\n\nd52885b642ad2aa1f42b132ee62dbf49a73e1e24\nMigrate the service management API to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288909426\n\n6ace586805c08896fef43e28a261337fcf3f022b\ncloudtasks: replace missing RPC timeout config\n\nPiperOrigin-RevId: 288783603\n\n51d906cabee4876b12497054b15b05d4a50ad027\nImport of Grafeas from Github.\n\nUpdate BUILD.bazel accordingly.\n\nPiperOrigin-RevId: 288783426\n\n5ef42bcd363ba0440f0ee65b3c80b499e9067ede\nMigrate Recommender v1beta1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288713066\n\n94f986afd365b7d7e132315ddcd43d7af0e652fb\nMigrate Container Analysis v1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288708382\n\n7a751a279184970d3b6ba90e4dd4d22a382a0747\nRemove Container Analysis v1alpha1 (nobody publishes it).\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288707473\n\n3c0d9c71242e70474b2b640e15bb0a435fd06ff0\nRemove specious annotation from BigQuery Data Transfer before\nanyone accidentally does anything that uses it.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288701604\n\n1af307a4764bd415ef942ac5187fa1def043006f\nMigrate BigQuery Connection to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288698681\n\n08b488e0660c59842a7dee0e3e2b65d9e3a514a9\nExposing cloud_catalog.proto (This API is already available through REST)\n\nPiperOrigin-RevId: 288625007\n\na613482977e11ac09fa47687a5d1b5a01efcf794\nUpdate the OS Login v1beta API description to render better in the UI.\n\nPiperOrigin-RevId: 288547940\n\n5e182b8d9943f1b17008d69d4c7e865dc83641a7\nUpdate the OS Login API description to render better in the UI.\n\nPiperOrigin-RevId: 288546443\n\n" } }, { @@ -58,3664 +59,409 @@ ], "newFiles": [ { - "path": "README.rst" - }, - { - "path": "setup.cfg" - }, - { - "path": "LICENSE" - }, - { - "path": "synth.metadata" - }, - { - "path": ".coveragerc" - }, - { - "path": ".flake8" - }, - { - "path": "CHANGELOG.md" - }, - { - "path": ".repo-metadata.json" - }, - { - "path": "setup.py" - }, - { - "path": "noxfile.py" - }, - { - "path": "synth.py" - }, - { - "path": "pylint.config.py" - }, - { - "path": "MANIFEST.in" - }, - { - "path": "docs/usage.html" - }, - { - "path": "docs/README.rst" - }, - { - "path": "docs/instance-api.rst" - }, - { - "path": "docs/batch-usage.rst" - }, - { - "path": "docs/api-reference.rst" - }, - { - "path": "docs/changelog.md" - }, - { - "path": "docs/transaction-usage.rst" - }, - { - "path": "docs/index.rst" - }, - { - "path": "docs/keyset-api.rst" - }, - { - "path": "docs/session-api.rst" - }, - { - "path": "docs/snapshot-api.rst" - }, - { - "path": "docs/advanced-session-pool-topics.rst" - }, - { - "path": "docs/database-api.rst" - }, - { - "path": "docs/streamed-api.rst" - }, - { - "path": "docs/instance-usage.rst" - }, - { - "path": "docs/client-usage.rst" - }, - { - "path": "docs/transaction-api.rst" - }, - { - "path": "docs/database-usage.rst" - }, - { - "path": "docs/snapshot-usage.rst" - }, - { - "path": "docs/batch-api.rst" - }, - { - "path": "docs/conf.py" - }, - { - "path": "docs/client-api.rst" - }, - { - "path": "docs/_static/custom.css" - }, - { - "path": "docs/_templates/layout.html" - }, - { - "path": "docs/gapic/v1/admin_database_api.rst" - }, - { - "path": "docs/gapic/v1/admin_instance_types.rst" - }, - { - "path": "docs/gapic/v1/types.rst" - }, - { - "path": "docs/gapic/v1/admin_instance_api.rst" - }, - { - "path": "docs/gapic/v1/api.rst" - }, - { - "path": "docs/gapic/v1/admin_database_types.rst" - }, - { - "path": "docs/gapic/v1/transactions.rst" - }, - { - "path": "google/__init__.py" - }, - { - "path": "google/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": "google/cloud/spanner.py" - }, - { - "path": "google/cloud/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/types.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/enums.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/transports/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py" - }, - { - "path": "google/cloud/spanner_v1/transaction.py" - }, - { - "path": "google/cloud/spanner_v1/keyset.py" - }, - { - "path": "google/cloud/spanner_v1/streamed.py" - }, - { - "path": "google/cloud/spanner_v1/_helpers.py" - }, - { - "path": "google/cloud/spanner_v1/param_types.py" - }, - { - "path": "google/cloud/spanner_v1/batch.py" - }, - { - "path": "google/cloud/spanner_v1/pool.py" - }, - { - "path": "google/cloud/spanner_v1/instance.py" - }, - { - "path": "google/cloud/spanner_v1/types.py" - }, - { - "path": "google/cloud/spanner_v1/client.py" - }, - { - "path": "google/cloud/spanner_v1/database.py" - }, - { - "path": "google/cloud/spanner_v1/session.py" - }, - { - "path": "google/cloud/spanner_v1/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/snapshot.py" - }, - { - "path": "google/cloud/spanner_v1/proto/query_plan.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/result_set_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/mutation.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/mutation_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/transaction_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_database_admin.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/result_set_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/type_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/type.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/query_plan_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/transaction.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_instance_admin.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/mutation_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/keys_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/keys.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/type_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/result_set.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/proto/query_plan_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/transaction_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/keys_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/spanner_client_config.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/enums.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/spanner_client.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/transports/spanner.grpc.config" - }, - { - "path": "google/cloud/spanner_v1/gapic/transports/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/types.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client_config.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/enums.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py" - }, - { - "path": "__pycache__/synth.cpython-36.pyc" - }, - { - "path": "__pycache__/noxfile.cpython-36.pyc" - }, - { - "path": "benchmark/ycsb.py" - }, - { - "path": "benchmark/bin/ycsb" - }, - { - "path": ".nox/blacken/bin/wheel" - }, - { - "path": ".nox/blacken/bin/pip" - }, - { - "path": ".nox/blacken/bin/easy_install-3.6" - }, - { - "path": ".nox/blacken/bin/activate.ps1" - }, - { - "path": ".nox/blacken/bin/activate.xsh" - }, - { - "path": ".nox/blacken/bin/python" - }, - { - "path": ".nox/blacken/bin/easy_install" - }, - { - "path": ".nox/blacken/bin/python3" - }, - { - "path": ".nox/blacken/bin/pip3.6" - }, - { - "path": ".nox/blacken/bin/activate.csh" - }, - { - "path": ".nox/blacken/bin/black" - }, - { - "path": ".nox/blacken/bin/blackd" - }, - { - "path": ".nox/blacken/bin/python-config" - }, - { - "path": ".nox/blacken/bin/activate_this.py" - }, - { - "path": ".nox/blacken/bin/activate" - }, - { - "path": ".nox/blacken/bin/activate.fish" - }, - { - "path": ".nox/blacken/bin/pip3" - }, - { - "path": ".nox/blacken/bin/python3.6" - }, - { - "path": ".nox/blacken/lib/python3.6/no-global-site-packages.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site.py" - }, - { - "path": ".nox/blacken/lib/python3.6/orig-prefix.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/stat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/base64.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/genericpath.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/ntpath.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/types.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/io.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/tarfile.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/codecs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/copyreg.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/operator.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/enum.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/warnings.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/tempfile.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/weakref.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/tokenize.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/__future__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/hashlib.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/posixpath.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/linecache.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/bisect.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/heapq.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/abc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/struct.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/keyword.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/random.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/token.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/hmac.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/site.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/locale.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/re.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/shutil.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/reprlib.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/os.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/functools.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/__pycache__/copy.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/easy_install.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blackd.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/wheelfile.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__main__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/pkginfo.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/bdist_wheel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/metadata.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/pep425tags.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/util.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/wheelfile.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/pkginfo.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/metadata.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/pep425tags.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/util.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/__main__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/pack.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/unpack.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/convert.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/unpack.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/convert.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/pack.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel/cli/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/top_level.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/WHEEL" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/METADATA" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/LICENSE" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/entry_points.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/RECORD" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/black-19.3b0.dist-info/INSTALLER" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/__main__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/retrying.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/six.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distro.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/appdirs.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/ipaddress.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pyparsing.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/contextlib2.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/bar.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/counter.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/contextlib2.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/certs.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/models.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/api.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/auth.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/packages.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/structures.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/help.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/help.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/uts46data.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/core.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/idnadata.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/codec.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/core.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/writer.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/core.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/parser.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/test.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/version.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/connectionpool.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/request.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/filepost.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/connection.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/_collections.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/poolmanager.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/wait.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/response.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/ssl_.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/queue.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/retry.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/connection.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/securetransport.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/socks.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/appengine.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/index.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/database.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/version.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/util.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/core.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/build.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/dirtools.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/check.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/meta.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/py31compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/tags.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/version.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/self_outdated_check.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/wheel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/exceptions.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/locations.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/pyproject.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/build_env.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/download.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/configuration.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/legacy_resolve.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/index.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/collector.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/main.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cache.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/pep425tags.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/git.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/versioncontrol.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/collector.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/main.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/exceptions.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/pep425tags.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/index.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/download.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/virtualenv.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/ui.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/models.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/encoding.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/misc.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/inject_securetransport.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/marker_files.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/unpacking.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/urls.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/subprocess.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/logging.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/typing.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/filetypes.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/glibc.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/packaging.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/hashes.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/ui.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/urls.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/logging.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/completion.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/show.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/debug.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/wheel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/list.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/freeze.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/check.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/install.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/download.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/hash.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/configuration.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/help.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/search.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/help.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/list.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/check.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/search.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/debug.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/wheel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/base.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/installed.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/base.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/legacy.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/__pycache__/legacy.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/distributions/source/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/freeze.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/prepare.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/check.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/generate_metadata.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/generate_metadata.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/constructors.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_set.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_install.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/req_file.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_set.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/command_context.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/parser.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/base_command.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/req_command.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/parser.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/xmlrpc.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/auth.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/session.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/cache.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/cache.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/auth.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/network/__pycache__/session.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/selection_prefs.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/search_scope.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/candidate.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/index.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/target_python.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/link.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/format_control.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/target_python.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip/_internal/models/__pycache__/candidate.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/site-patch.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/config.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/errors.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py27compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/gui.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_deprecation_warning.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/gui-64.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/launch.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/ssl_support.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/windows_support.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/cli-64.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/script (dev).tmpl" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/wheel.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/unicode_utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/gui-32.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_imp.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/build_meta.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/cli-32.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py31compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/lib2to3_ex.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/namespaces.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/dist.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py33compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/py34compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/monkey.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/sandbox.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/extension.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/glob.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/version.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/archive_util.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/msvc.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/depends.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/dep_util.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/installer.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/package_index.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/cli.exe" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/script.tmpl" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py34compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/errors.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/_imp.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/installer.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/six.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/ordered_set.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/tags.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/extern/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/saveopts.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/upload_docs.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/easy_install.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/egg_info.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/sdist.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/build_py.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/register.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install_egg_info.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/upload.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/setopt.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install_lib.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/test.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/alias.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/rotate.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/develop.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/bdist_egg.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/build_clib.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/py36compat.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/build_ext.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/install_scripts.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/dist_info.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/blackd.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/appdirs.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/black.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/__pycache__/toml.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/top_level.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/WHEEL" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/METADATA" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/entry_points.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/RECORD" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/LICENSE.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/pip-19.3.1.dist-info/INSTALLER" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pytree.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/PatternGrammar.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pygram.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/Grammar.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__pycache__/pygram.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/__pycache__/pytree.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/conv.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/literals.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/tokenize.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/driver.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/pgen.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/token.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/grammar.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/parse.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/token.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/top_level.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/WHEEL" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/METADATA" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/entry_points.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/RECORD" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/LICENSE.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/wheel-0.33.6.dist-info/INSTALLER" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/ordered.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/encoder.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/__init__.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/tz.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/decoder.py" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/encoder.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/tz.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/ordered.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/decoder.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/toml/__pycache__/__init__.cpython-36.pyc" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/top_level.txt" - }, - { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/WHEEL" + "path": ".coveragerc" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/METADATA" + "path": ".flake8" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/LICENSE" + "path": ".repo-metadata.json" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt" + "path": "CHANGELOG.md" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/zip-safe" + "path": "LICENSE" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/entry_points.txt" + "path": "MANIFEST.in" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/RECORD" + "path": "README.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/setuptools-44.0.0.dist-info/INSTALLER" + "path": "benchmark/bin/ycsb" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/globals.py" + "path": "benchmark/ycsb.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/core.py" + "path": "docs/README.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/exceptions.py" + "path": "docs/_static/custom.css" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/_compat.py" + "path": "docs/_templates/layout.html" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/formatting.py" + "path": "docs/advanced-session-pool-topics.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/parser.py" + "path": "docs/api-reference.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/_bashcomplete.py" + "path": "docs/batch-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/types.py" + "path": "docs/batch-usage.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/_unicodefun.py" + "path": "docs/changelog.md" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/_textwrap.py" + "path": "docs/client-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/decorators.py" + "path": "docs/client-usage.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/termui.py" + "path": "docs/conf.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__init__.py" + "path": "docs/database-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/_termui_impl.py" + "path": "docs/database-usage.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/testing.py" + "path": "docs/gapic/v1/admin_database_api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/utils.py" + "path": "docs/gapic/v1/admin_database_types.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/_winconsole.py" + "path": "docs/gapic/v1/admin_instance_api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc" + "path": "docs/gapic/v1/admin_instance_types.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/decorators.cpython-36.pyc" + "path": "docs/gapic/v1/api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc" + "path": "docs/gapic/v1/transactions.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/types.cpython-36.pyc" + "path": "docs/gapic/v1/types.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/core.cpython-36.pyc" + "path": "docs/index.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_compat.cpython-36.pyc" + "path": "docs/instance-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc" + "path": "docs/instance-usage.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_termui_impl.cpython-36.pyc" + "path": "docs/keyset-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/termui.cpython-36.pyc" + "path": "docs/session-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/exceptions.cpython-36.pyc" + "path": "docs/snapshot-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/utils.cpython-36.pyc" + "path": "docs/snapshot-usage.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc" + "path": "docs/streamed-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc" + "path": "docs/transaction-api.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc" + "path": "docs/transaction-usage.rst" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/_bashcomplete.cpython-36.pyc" + "path": "docs/usage.html" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc" + "path": "google/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc" + "path": "google/cloud/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/top_level.txt" + "path": "google/cloud/spanner.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/WHEEL" + "path": "google/cloud/spanner_admin_database_v1/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/METADATA" + "path": "google/cloud/spanner_admin_database_v1/gapic/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/LICENSE" + "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/RECORD" + "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attrs-19.3.0.dist-info/INSTALLER" + "path": "google/cloud/spanner_admin_database_v1/gapic/enums.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/top_level.txt" + "path": "google/cloud/spanner_admin_database_v1/gapic/transports/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/WHEEL" + "path": "google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/DESCRIPTION.rst" + "path": "google/cloud/spanner_admin_database_v1/proto/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/METADATA" + "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/RECORD" + "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/LICENSE.txt" + "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/INSTALLER" + "path": "google/cloud/spanner_admin_database_v1/types.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/toml-0.10.0.dist-info/metadata.json" + "path": "google/cloud/spanner_admin_instance_v1/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt" + "path": "google/cloud/spanner_admin_instance_v1/gapic/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL" + "path": "google/cloud/spanner_admin_instance_v1/gapic/enums.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA" + "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD" + "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client_config.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt" + "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER" + "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/py31compat.py" + "path": "google/cloud/spanner_admin_instance_v1/proto/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/__init__.py" + "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc" + "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc" + "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/six.py" + "path": "google/cloud/spanner_admin_instance_v1/types.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py" + "path": "google/cloud/spanner_v1/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py" + "path": "google/cloud/spanner_v1/_helpers.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py" + "path": "google/cloud/spanner_v1/batch.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc" + "path": "google/cloud/spanner_v1/client.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc" + "path": "google/cloud/spanner_v1/database.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc" + "path": "google/cloud/spanner_v1/gapic/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc" + "path": "google/cloud/spanner_v1/gapic/enums.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py" + "path": "google/cloud/spanner_v1/gapic/spanner_client.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py" + "path": "google/cloud/spanner_v1/gapic/spanner_client_config.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py" + "path": "google/cloud/spanner_v1/gapic/transports/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py" + "path": "google/cloud/spanner_v1/gapic/transports/spanner.grpc.config" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py" + "path": "google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py" + "path": "google/cloud/spanner_v1/instance.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py" + "path": "google/cloud/spanner_v1/keyset.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py" + "path": "google/cloud/spanner_v1/param_types.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py" + "path": "google/cloud/spanner_v1/pool.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/keys.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/keys_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/keys_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/mutation.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/mutation_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/mutation_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/query_plan.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/query_plan_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/extern/__init__.py" + "path": "google/cloud/spanner_v1/proto/query_plan_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc" + "path": "google/cloud/spanner_v1/proto/result_set.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/validators.pyi" + "path": "google/cloud/spanner_v1/proto/result_set_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/_make.py" + "path": "google/cloud/spanner_v1/proto/result_set_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/_version_info.py" + "path": "google/cloud/spanner_v1/proto/spanner.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/exceptions.py" + "path": "google/cloud/spanner_v1/proto/spanner_database_admin.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/_compat.py" + "path": "google/cloud/spanner_v1/proto/spanner_instance_admin.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__init__.pyi" + "path": "google/cloud/spanner_v1/proto/spanner_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/_config.py" + "path": "google/cloud/spanner_v1/proto/spanner_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/filters.pyi" + "path": "google/cloud/spanner_v1/proto/transaction.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/converters.pyi" + "path": "google/cloud/spanner_v1/proto/transaction_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/_funcs.py" + "path": "google/cloud/spanner_v1/proto/transaction_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/py.typed" + "path": "google/cloud/spanner_v1/proto/type.proto" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/_version_info.pyi" + "path": "google/cloud/spanner_v1/proto/type_pb2.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/converters.py" + "path": "google/cloud/spanner_v1/proto/type_pb2_grpc.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__init__.py" + "path": "google/cloud/spanner_v1/session.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/exceptions.pyi" + "path": "google/cloud/spanner_v1/snapshot.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/validators.py" + "path": "google/cloud/spanner_v1/streamed.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/filters.py" + "path": "google/cloud/spanner_v1/transaction.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/filters.cpython-36.pyc" + "path": "google/cloud/spanner_v1/types.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_compat.cpython-36.pyc" + "path": "noxfile.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_funcs.cpython-36.pyc" + "path": "pylint.config.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/exceptions.cpython-36.pyc" + "path": "setup.cfg" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_config.cpython-36.pyc" + "path": "setup.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_make.cpython-36.pyc" + "path": "synth.metadata" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/validators.cpython-36.pyc" + "path": "synth.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/__init__.cpython-36.pyc" + "path": "tests/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/_version_info.cpython-36.pyc" + "path": "tests/_fixtures.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/attr/__pycache__/converters.cpython-36.pyc" + "path": "tests/system/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/top_level.txt" + "path": "tests/system/test_system.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/WHEEL" + "path": "tests/system/utils/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/DESCRIPTION.rst" + "path": "tests/system/utils/clear_streaming.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/METADATA" + "path": "tests/system/utils/populate_streaming.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/RECORD" + "path": "tests/system/utils/scrub_instances.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/INSTALLER" + "path": "tests/system/utils/streaming_utils.py" }, { - "path": ".nox/blacken/lib/python3.6/site-packages/appdirs-1.4.3.dist-info/metadata.json" + "path": "tests/unit/__init__.py" }, { - "path": ".nox/blacken/lib/python3.6/distutils/distutils.cfg" + "path": "tests/unit/gapic/v1/test_database_admin_client_v1.py" }, { - "path": ".nox/blacken/lib/python3.6/distutils/__init__.py" + "path": "tests/unit/gapic/v1/test_instance_admin_client_v1.py" }, { - "path": ".nox/blacken/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc" + "path": "tests/unit/gapic/v1/test_spanner_client_v1.py" }, { - "path": "tests/_fixtures.py" + "path": "tests/unit/streaming-read-acceptance-test.json" }, { - "path": "tests/__init__.py" + "path": "tests/unit/test__helpers.py" }, { - "path": "tests/unit/test_param_types.py" + "path": "tests/unit/test_batch.py" }, { - "path": "tests/unit/test_session.py" + "path": "tests/unit/test_client.py" }, { "path": "tests/unit/test_database.py" @@ -3724,64 +470,25 @@ "path": "tests/unit/test_instance.py" }, { - "path": "tests/unit/streaming-read-acceptance-test.json" - }, - { - "path": "tests/unit/test_client.py" + "path": "tests/unit/test_keyset.py" }, { - "path": "tests/unit/test_batch.py" + "path": "tests/unit/test_param_types.py" }, { "path": "tests/unit/test_pool.py" }, { - "path": "tests/unit/test__helpers.py" - }, - { - "path": "tests/unit/__init__.py" + "path": "tests/unit/test_session.py" }, { "path": "tests/unit/test_snapshot.py" }, - { - "path": "tests/unit/test_keyset.py" - }, { "path": "tests/unit/test_streamed.py" }, { "path": "tests/unit/test_transaction.py" - }, - { - "path": "tests/unit/gapic/v1/test_database_admin_client_v1.py" - }, - { - "path": "tests/unit/gapic/v1/test_instance_admin_client_v1.py" - }, - { - "path": "tests/unit/gapic/v1/test_spanner_client_v1.py" - }, - { - "path": "tests/system/test_system.py" - }, - { - "path": "tests/system/__init__.py" - }, - { - "path": "tests/system/utils/scrub_instances.py" - }, - { - "path": "tests/system/utils/streaming_utils.py" - }, - { - "path": "tests/system/utils/__init__.py" - }, - { - "path": "tests/system/utils/clear_streaming.py" - }, - { - "path": "tests/system/utils/populate_streaming.py" } ] } \ No newline at end of file diff --git a/tests/unit/gapic/v1/test_database_admin_client_v1.py b/tests/unit/gapic/v1/test_database_admin_client_v1.py index 7d5da4a18b..d828f8ae1c 100644 --- a/tests/unit/gapic/v1/test_database_admin_client_v1.py +++ b/tests/unit/gapic/v1/test_database_admin_client_v1.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/tests/unit/gapic/v1/test_instance_admin_client_v1.py b/tests/unit/gapic/v1/test_instance_admin_client_v1.py index f535723f98..da8dfcd8d4 100644 --- a/tests/unit/gapic/v1/test_instance_admin_client_v1.py +++ b/tests/unit/gapic/v1/test_instance_admin_client_v1.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/tests/unit/gapic/v1/test_spanner_client_v1.py b/tests/unit/gapic/v1/test_spanner_client_v1.py index 9f63d09673..a133902658 100644 --- a/tests/unit/gapic/v1/test_spanner_client_v1.py +++ b/tests/unit/gapic/v1/test_spanner_client_v1.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From e072d5dd04d58fff7f62ce19ce42e906dfd11012 Mon Sep 17 00:00:00 2001 From: larkee <31196561+larkee@users.noreply.github.com> Date: Fri, 31 Jan 2020 13:15:45 +1100 Subject: [PATCH 06/12] feat(spanner): add resource based routing implementation (#10183) * feat(spanner): implement resource routing * corrected warning message as per the PR comment * Update spanner/google/cloud/spanner_v1/database.py Add comma to warning message Co-Authored-By: skuruppu Co-authored-by: skuruppu --- google/cloud/spanner_v1/client.py | 9 +- google/cloud/spanner_v1/database.py | 47 +++++ tests/system/test_system.py | 58 +++++++ tests/unit/test_client.py | 39 ++++- tests/unit/test_database.py | 255 +++++++++++++++++++++++++++- 5 files changed, 401 insertions(+), 7 deletions(-) diff --git a/google/cloud/spanner_v1/client.py b/google/cloud/spanner_v1/client.py index b35bf19f07..264731178e 100644 --- a/google/cloud/spanner_v1/client.py +++ b/google/cloud/spanner_v1/client.py @@ -26,6 +26,7 @@ import warnings from google.api_core.gapic_v1 import client_info +import google.api_core.client_options # pylint: disable=line-too-long from google.cloud.spanner_admin_database_v1.gapic.database_admin_client import ( # noqa @@ -122,6 +123,7 @@ class Client(ClientWithProject): _instance_admin_api = None _database_admin_api = None + _endpoint_cache = {} user_agent = None _SET_PROJECT = True # Used by from_service_account_json() @@ -143,7 +145,12 @@ def __init__( project=project, credentials=credentials, _http=None ) self._client_info = client_info - self._client_options = client_options + if client_options and type(client_options) == dict: + self._client_options = google.api_core.client_options.from_dict( + client_options + ) + else: + self._client_options = client_options if user_agent is not None: warnings.warn(_USER_AGENT_DEPRECATED, DeprecationWarning, stacklevel=2) diff --git a/google/cloud/spanner_v1/database.py b/google/cloud/spanner_v1/database.py index f561ecd4fa..49abe919d5 100644 --- a/google/cloud/spanner_v1/database.py +++ b/google/cloud/spanner_v1/database.py @@ -16,12 +16,16 @@ import copy import functools +import os import re import threading +import warnings +from google.api_core.client_options import ClientOptions import google.auth.credentials from google.protobuf.struct_pb2 import Struct from google.cloud.exceptions import NotFound +from google.api_core.exceptions import PermissionDenied import six # pylint: disable=ungrouped-imports @@ -54,6 +58,19 @@ ) +_RESOURCE_ROUTING_PERMISSIONS_WARNING = ( + "The client library attempted to connect to an endpoint closer to your Cloud Spanner data " + "but was unable to do so. The client library will fall back and route requests to the endpoint " + "given in the client options, which may result in increased latency. " + "We recommend including the scope https://www.googleapis.com/auth/spanner.admin so that the " + "client library can get an instance-specific endpoint and efficiently route requests." +) + + +class ResourceRoutingPermissionsWarning(Warning): + pass + + class Database(object): """Representation of a Cloud Spanner Database. @@ -178,6 +195,36 @@ def spanner_api(self): credentials = credentials.with_scopes((SPANNER_DATA_SCOPE,)) client_info = self._instance._client._client_info client_options = self._instance._client._client_options + if ( + os.getenv("GOOGLE_CLOUD_SPANNER_ENABLE_RESOURCE_BASED_ROUTING") + == "true" + ): + endpoint_cache = self._instance._client._endpoint_cache + if self._instance.name in endpoint_cache: + client_options = ClientOptions( + api_endpoint=endpoint_cache[self._instance.name] + ) + else: + try: + api = self._instance._client.instance_admin_api + resp = api.get_instance( + self._instance.name, + field_mask={"paths": ["endpoint_uris"]}, + metadata=_metadata_with_prefix(self.name), + ) + endpoints = resp.endpoint_uris + if endpoints: + endpoint_cache[self._instance.name] = list(endpoints)[0] + client_options = ClientOptions( + api_endpoint=endpoint_cache[self._instance.name] + ) + # If there are no endpoints, use default endpoint. + except PermissionDenied: + warnings.warn( + _RESOURCE_ROUTING_PERMISSIONS_WARNING, + ResourceRoutingPermissionsWarning, + stacklevel=2, + ) self._spanner_api = SpannerClient( credentials=credentials, client_info=client_info, diff --git a/tests/system/test_system.py b/tests/system/test_system.py index abfd1297d7..ae688029b4 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -56,6 +56,9 @@ CREATE_INSTANCE = os.getenv("GOOGLE_CLOUD_TESTS_CREATE_SPANNER_INSTANCE") is not None +USE_RESOURCE_ROUTING = ( + os.getenv("GOOGLE_CLOUD_SPANNER_ENABLE_RESOURCE_BASED_ROUTING") == "true" +) if CREATE_INSTANCE: INSTANCE_ID = "google-cloud" + unique_resource_id("-") @@ -282,6 +285,61 @@ def tearDown(self): for doomed in self.to_delete: doomed.drop() + @unittest.skipUnless(USE_RESOURCE_ROUTING, "requires enabling resource routing") + def test_spanner_api_use_user_specified_endpoint(self): + # Clear cache. + Client._endpoint_cache = {} + api = Config.CLIENT.instance_admin_api + resp = api.get_instance( + Config.INSTANCE.name, field_mask={"paths": ["endpoint_uris"]} + ) + if not resp or not resp.endpoint_uris: + return # no resolved endpoint. + resolved_endpoint = resp.endpoint_uris[0] + + client = Client(client_options={"api_endpoint": resolved_endpoint}) + + instance = client.instance(Config.INSTANCE.instance_id) + temp_db_id = "temp_db" + unique_resource_id("_") + temp_db = instance.database(temp_db_id) + temp_db.spanner_api + + # No endpoint cache - Default endpoint used. + self.assertEqual(client._endpoint_cache, {}) + + @unittest.skipUnless(USE_RESOURCE_ROUTING, "requires enabling resource routing") + def test_spanner_api_use_resolved_endpoint(self): + # Clear cache. + Client._endpoint_cache = {} + api = Config.CLIENT.instance_admin_api + resp = api.get_instance( + Config.INSTANCE.name, field_mask={"paths": ["endpoint_uris"]} + ) + if not resp or not resp.endpoint_uris: + return # no resolved endpoint. + resolved_endpoint = resp.endpoint_uris[0] + + client = Client( + client_options=Config.CLIENT._client_options + ) # Use same endpoint as main client. + + instance = client.instance(Config.INSTANCE.instance_id) + temp_db_id = "temp_db" + unique_resource_id("_") + temp_db = instance.database(temp_db_id) + temp_db.spanner_api + + # Endpoint is cached - resolved endpoint used. + self.assertIn(Config.INSTANCE.name, client._endpoint_cache) + self.assertEqual( + client._endpoint_cache[Config.INSTANCE.name], resolved_endpoint + ) + + # Endpoint is cached at a class level. + self.assertIn(Config.INSTANCE.name, Config.CLIENT._endpoint_cache) + self.assertEqual( + Config.CLIENT._endpoint_cache[Config.INSTANCE.name], resolved_endpoint + ) + def test_list_databases(self): # Since `Config.INSTANCE` is newly created in `setUpModule`, the # database created in `setUpClass` here will be the only one. diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index e42031cea4..35e63bfd68 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -57,6 +57,7 @@ def _constructor_test_helper( user_agent=None, client_options=None, ): + import google.api_core.client_options from google.cloud.spanner_v1 import client as MUT kwargs = {} @@ -66,6 +67,14 @@ def _constructor_test_helper( else: expected_client_info = MUT._CLIENT_INFO + kwargs["client_options"] = client_options + if type(client_options) == dict: + expected_client_options = google.api_core.client_options.from_dict( + client_options + ) + else: + expected_client_options = client_options + client = self._make_one( project=self.PROJECT, credentials=creds, user_agent=user_agent, **kwargs ) @@ -80,7 +89,14 @@ def _constructor_test_helper( self.assertEqual(client.project, self.PROJECT) self.assertIs(client._client_info, expected_client_info) self.assertEqual(client.user_agent, user_agent) - self.assertEqual(client._client_options, client_options) + if expected_client_options is not None: + self.assertIsInstance( + client._client_options, google.api_core.client_options.ClientOptions + ) + self.assertEqual( + client._client_options.api_endpoint, + expected_client_options.api_endpoint, + ) def test_constructor_default_scopes(self): from google.cloud.spanner_v1 import client as MUT @@ -127,6 +143,27 @@ def test_constructor_credentials_wo_create_scoped(self): expected_scopes = None self._constructor_test_helper(expected_scopes, creds) + def test_constructor_custom_client_options_obj(self): + from google.api_core.client_options import ClientOptions + from google.cloud.spanner_v1 import client as MUT + + expected_scopes = (MUT.SPANNER_ADMIN_SCOPE,) + creds = _make_credentials() + self._constructor_test_helper( + expected_scopes, + creds, + client_options=ClientOptions(api_endpoint="endpoint"), + ) + + def test_constructor_custom_client_options_dict(self): + from google.cloud.spanner_v1 import client as MUT + + expected_scopes = (MUT.SPANNER_ADMIN_SCOPE,) + creds = _make_credentials() + self._constructor_test_helper( + expected_scopes, creds, client_options={"api_endpoint": "endpoint"} + ) + def test_instance_admin_api(self): from google.cloud.spanner_v1.client import SPANNER_ADMIN_SCOPE diff --git a/tests/unit/test_database.py b/tests/unit/test_database.py index 163036f030..0f4071d868 100644 --- a/tests/unit/test_database.py +++ b/tests/unit/test_database.py @@ -231,7 +231,14 @@ def test_name_property(self): self.assertEqual(database.name, expected_name) def test_spanner_api_property_w_scopeless_creds(self): + from google.cloud.spanner_admin_instance_v1.proto import ( + spanner_instance_admin_pb2 as admin_v1_pb2, + ) + client = _Client() + client.instance_admin_api.get_instance.return_value = admin_v1_pb2.Instance( + endpoint_uris=[] + ) client_info = client._client_info = mock.Mock() client_options = client._client_options = mock.Mock() credentials = client.credentials = object() @@ -241,8 +248,10 @@ def test_spanner_api_property_w_scopeless_creds(self): patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") - with patch as spanner_client: - api = database.spanner_api + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with patch as spanner_client: + api = database.spanner_api self.assertIs(api, spanner_client.return_value) @@ -250,6 +259,7 @@ def test_spanner_api_property_w_scopeless_creds(self): again = database.spanner_api self.assertIs(again, api) + client.instance_admin_api.get_instance.assert_called_once() spanner_client.assert_called_once_with( credentials=credentials, client_info=client_info, @@ -258,6 +268,9 @@ def test_spanner_api_property_w_scopeless_creds(self): def test_spanner_api_w_scoped_creds(self): import google.auth.credentials + from google.cloud.spanner_admin_instance_v1.proto import ( + spanner_instance_admin_pb2 as admin_v1_pb2, + ) from google.cloud.spanner_v1.database import SPANNER_DATA_SCOPE class _CredentialsWithScopes(google.auth.credentials.Scoped): @@ -281,16 +294,22 @@ def with_scopes(self, scopes): database = self._make_one(self.DATABASE_ID, instance, pool=pool) patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") + client.instance_admin_api.get_instance.return_value = admin_v1_pb2.Instance( + endpoint_uris=[] + ) - with patch as spanner_client: - api = database.spanner_api + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with patch as spanner_client: + api = database.spanner_api - self.assertIs(api, spanner_client.return_value) + self.assertNotIn(instance.name, client._endpoint_cache) # API instance is cached again = database.spanner_api self.assertIs(again, api) + client.instance_admin_api.get_instance.assert_called_once() self.assertEqual(len(spanner_client.call_args_list), 1) called_args, called_kw = spanner_client.call_args self.assertEqual(called_args, ()) @@ -300,6 +319,222 @@ def with_scopes(self, scopes): self.assertEqual(scoped._scopes, expected_scopes) self.assertIs(scoped._source, credentials) + def test_spanner_api_property_w_scopeless_creds_and_new_endpoint(self): + from google.cloud.spanner_admin_instance_v1.proto import ( + spanner_instance_admin_pb2 as admin_v1_pb2, + ) + + client = _Client() + client.instance_admin_api.get_instance.return_value = admin_v1_pb2.Instance( + endpoint_uris=["test1", "test2"] + ) + client_info = client._client_info = mock.Mock() + client._client_options = mock.Mock() + credentials = client.credentials = object() + instance = _Instance(self.INSTANCE_NAME, client=client) + pool = _Pool() + database = self._make_one(self.DATABASE_ID, instance, pool=pool) + + client_patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") + options_patch = mock.patch("google.cloud.spanner_v1.database.ClientOptions") + + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with options_patch as options: + with client_patch as spanner_client: + api = database.spanner_api + + self.assertIs(api, spanner_client.return_value) + self.assertIn(instance.name, client._endpoint_cache) + + # API instance is cached + again = database.spanner_api + self.assertIs(again, api) + + self.assertEqual(len(spanner_client.call_args_list), 1) + called_args, called_kw = spanner_client.call_args + self.assertEqual(called_args, ()) + self.assertEqual(called_kw["client_info"], client_info) + self.assertEqual(called_kw["credentials"], credentials) + options.assert_called_with(api_endpoint="test1") + + def test_spanner_api_w_scoped_creds_and_new_endpoint(self): + import google.auth.credentials + from google.cloud.spanner_admin_instance_v1.proto import ( + spanner_instance_admin_pb2 as admin_v1_pb2, + ) + from google.cloud.spanner_v1.database import SPANNER_DATA_SCOPE + + class _CredentialsWithScopes(google.auth.credentials.Scoped): + def __init__(self, scopes=(), source=None): + self._scopes = scopes + self._source = source + + def requires_scopes(self): # pragma: NO COVER + return True + + def with_scopes(self, scopes): + return self.__class__(scopes, self) + + expected_scopes = (SPANNER_DATA_SCOPE,) + client = _Client() + client_info = client._client_info = mock.Mock() + client._client_options = mock.Mock() + credentials = client.credentials = _CredentialsWithScopes() + instance = _Instance(self.INSTANCE_NAME, client=client) + pool = _Pool() + database = self._make_one(self.DATABASE_ID, instance, pool=pool) + + client_patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") + options_patch = mock.patch("google.cloud.spanner_v1.database.ClientOptions") + client.instance_admin_api.get_instance.return_value = admin_v1_pb2.Instance( + endpoint_uris=["test1", "test2"] + ) + + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with options_patch as options: + with client_patch as spanner_client: + api = database.spanner_api + + self.assertIs(api, spanner_client.return_value) + self.assertIn(instance.name, client._endpoint_cache) + + # API instance is cached + again = database.spanner_api + self.assertIs(again, api) + + self.assertEqual(len(spanner_client.call_args_list), 1) + called_args, called_kw = spanner_client.call_args + self.assertEqual(called_args, ()) + self.assertEqual(called_kw["client_info"], client_info) + scoped = called_kw["credentials"] + self.assertEqual(scoped._scopes, expected_scopes) + self.assertIs(scoped._source, credentials) + options.assert_called_with(api_endpoint="test1") + + def test_spanner_api_resource_routing_permissions_error(self): + from google.api_core.exceptions import PermissionDenied + + client = _Client() + client_info = client._client_info = mock.Mock() + client_options = client._client_options = mock.Mock() + client._endpoint_cache = {} + credentials = client.credentials = mock.Mock() + instance = _Instance(self.INSTANCE_NAME, client=client) + pool = _Pool() + database = self._make_one(self.DATABASE_ID, instance, pool=pool) + + patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") + client.instance_admin_api.get_instance.side_effect = PermissionDenied("test") + + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with patch as spanner_client: + api = database.spanner_api + + self.assertIs(api, spanner_client.return_value) + + # API instance is cached + again = database.spanner_api + self.assertIs(again, api) + + client.instance_admin_api.get_instance.assert_called_once() + spanner_client.assert_called_once_with( + credentials=credentials, + client_info=client_info, + client_options=client_options, + ) + + def test_spanner_api_disable_resource_routing(self): + client = _Client() + client_info = client._client_info = mock.Mock() + client_options = client._client_options = mock.Mock() + client._endpoint_cache = {} + credentials = client.credentials = mock.Mock() + instance = _Instance(self.INSTANCE_NAME, client=client) + pool = _Pool() + database = self._make_one(self.DATABASE_ID, instance, pool=pool) + + patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") + + with mock.patch("os.getenv") as getenv: + getenv.return_value = "false" + with patch as spanner_client: + api = database.spanner_api + + self.assertIs(api, spanner_client.return_value) + + # API instance is cached + again = database.spanner_api + self.assertIs(again, api) + + client.instance_admin_api.get_instance.assert_not_called() + spanner_client.assert_called_once_with( + credentials=credentials, + client_info=client_info, + client_options=client_options, + ) + + def test_spanner_api_cached_endpoint(self): + from google.cloud.spanner_admin_instance_v1.proto import ( + spanner_instance_admin_pb2 as admin_v1_pb2, + ) + + client = _Client() + client_info = client._client_info = mock.Mock() + client._client_options = mock.Mock() + client._endpoint_cache = {self.INSTANCE_NAME: "cached"} + credentials = client.credentials = mock.Mock() + instance = _Instance(self.INSTANCE_NAME, client=client) + pool = _Pool() + database = self._make_one(self.DATABASE_ID, instance, pool=pool) + + client_patch = mock.patch("google.cloud.spanner_v1.database.SpannerClient") + options_patch = mock.patch("google.cloud.spanner_v1.database.ClientOptions") + client.instance_admin_api.get_instance.return_value = admin_v1_pb2.Instance( + endpoint_uris=["test1", "test2"] + ) + + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with options_patch as options: + with client_patch as spanner_client: + api = database.spanner_api + + self.assertIs(api, spanner_client.return_value) + + # API instance is cached + again = database.spanner_api + self.assertIs(again, api) + + self.assertEqual(len(spanner_client.call_args_list), 1) + called_args, called_kw = spanner_client.call_args + self.assertEqual(called_args, ()) + self.assertEqual(called_kw["client_info"], client_info) + self.assertEqual(called_kw["credentials"], credentials) + options.assert_called_with(api_endpoint="cached") + + def test_spanner_api_resource_routing_error(self): + from google.api_core.exceptions import GoogleAPIError + + client = _Client() + client._client_info = mock.Mock() + client._client_options = mock.Mock() + client.credentials = mock.Mock() + instance = _Instance(self.INSTANCE_NAME, client=client) + pool = _Pool() + database = self._make_one(self.DATABASE_ID, instance, pool=pool) + + client.instance_admin_api.get_instance.side_effect = GoogleAPIError("test") + + with mock.patch("os.getenv") as getenv: + getenv.return_value = "true" + with self.assertRaises(GoogleAPIError): + database.spanner_api + + client.instance_admin_api.get_instance.assert_called_once() + def test___eq__(self): instance = _Instance(self.INSTANCE_NAME) pool1, pool2 = _Pool(), _Pool() @@ -1516,10 +1751,20 @@ def test_process_w_query_batch(self): ) +def _make_instance_api(): + from google.cloud.spanner_admin_instance_v1.gapic.instance_admin_client import ( + InstanceAdminClient, + ) + + return mock.create_autospec(InstanceAdminClient) + + class _Client(object): def __init__(self, project=TestDatabase.PROJECT_ID): self.project = project self.project_name = "projects/" + self.project + self._endpoint_cache = {} + self.instance_admin_api = _make_instance_api() class _Instance(object): From 55a21d97d0c863cbbbb2d973b6faa4aeba8e38bb Mon Sep 17 00:00:00 2001 From: larkee <31196561+larkee@users.noreply.github.com> Date: Sat, 1 Feb 2020 07:43:39 +1100 Subject: [PATCH 07/12] fix(spanner): fix imports for doc samples (#10283) * fix(spanner): fix imports for doc samples * Update database-usage.rst Co-authored-by: Christopher Wilcox --- docs/advanced-session-pool-topics.rst | 8 +++----- docs/batch-usage.rst | 4 ++-- docs/client-usage.rst | 12 ++++++------ docs/database-usage.rst | 2 +- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/advanced-session-pool-topics.rst b/docs/advanced-session-pool-topics.rst index b8b4e8c925..18fd7db64c 100644 --- a/docs/advanced-session-pool-topics.rst +++ b/docs/advanced-session-pool-topics.rst @@ -10,7 +10,7 @@ contract laid out in .. code-block:: python - from google.cloud.spanner.pool import AbstractSessionPool + from google.cloud.spanner import AbstractSessionPool class MyCustomPool(AbstractSessionPool): @@ -43,8 +43,7 @@ Create an instance of :class:`~google.cloud.spanner.pool.PingingPool`: .. code-block:: python - from google.cloud.spanner import Client - from google.cloud.spanner.pool import PingingPool + from google.cloud.spanner import Client, PingingPool client = Client() instance = client.instance(INSTANCE_NAME) @@ -77,8 +76,7 @@ Create an instance of .. code-block:: python - from google.cloud.spanner import Client - from google.cloud.spanner.pool import TransactionPingingPool + from google.cloud.spanner import Client, TransactionPingingPool client = Client() instance = client.instance(INSTANCE_NAME) diff --git a/docs/batch-usage.rst b/docs/batch-usage.rst index d0f38a63b2..419ca106e6 100644 --- a/docs/batch-usage.rst +++ b/docs/batch-usage.rst @@ -132,7 +132,7 @@ rows do not cause errors. .. code:: python - from google.cloud.spanner.keyset import KeySet + from google.cloud.spanner import KeySet to_delete = KeySet(keys=[ ('bharney@example.com',) @@ -165,7 +165,7 @@ if the ``with`` block exits without raising an exception. .. code:: python - from google.cloud.spanner.keyset import KeySet + from google.cloud.spanner import KeySet client = spanner.Client() instance = client.instance(INSTANCE_NAME) diff --git a/docs/client-usage.rst b/docs/client-usage.rst index f0340d3111..801c9cb135 100644 --- a/docs/client-usage.rst +++ b/docs/client-usage.rst @@ -13,8 +13,8 @@ and creating other objects: .. code:: python - from google.cloud import spanner_v1 - client = spanner_v1.Client() + from google.cloud import spanner + client = spanner.Client() Long-lived Defaults ------------------- @@ -47,15 +47,15 @@ Configuration .. code:: - >>> from google.cloud import spanner_v1 - >>> client = spanner_v1.Client() + >>> from google.cloud import spanner + >>> client = spanner.Client() or pass in ``credentials`` and ``project`` explicitly .. code:: - >>> from google.cloud import spanner_v1 - >>> client = spanner_v1.Client(project='my-project', credentials=creds) + >>> from google.cloud import spanner + >>> client = spanner.Client(project='my-project', credentials=creds) .. tip:: diff --git a/docs/database-usage.rst b/docs/database-usage.rst index 5d47d71cdc..8989501a7d 100644 --- a/docs/database-usage.rst +++ b/docs/database-usage.rst @@ -230,7 +230,7 @@ contract laid out in :class:`~google.cloud.spanner.pool.AbstractSessionPool`: .. code-block:: python - from google.cloud.pool import AbstractSessionPool + from google.cloud.spanner import AbstractSessionPool class MyCustomPool(AbstractSessionPool): From ec70ab5bd3e67bd2cd9a983439682bc527bece2f Mon Sep 17 00:00:00 2001 From: Chris Wilcox Date: Fri, 31 Jan 2020 21:11:02 +0000 Subject: [PATCH 08/12] chore: add split repo templates --- .github/CONTRIBUTING.md | 28 ++ .github/ISSUE_TEMPLATE/bug_report.md | 44 +++ .github/ISSUE_TEMPLATE/feature_request.md | 18 + .github/ISSUE_TEMPLATE/support_request.md | 7 + .github/PULL_REQUEST_TEMPLATE.md | 7 + .github/release-please.yml | 1 + .gitignore | 58 +++ .kokoro/build.sh | 39 ++ .kokoro/continuous/common.cfg | 27 ++ .kokoro/continuous/continuous.cfg | 1 + .kokoro/docs/common.cfg | 48 +++ .kokoro/docs/docs.cfg | 1 + .kokoro/presubmit/common.cfg | 27 ++ .kokoro/presubmit/presubmit.cfg | 1 + .kokoro/publish-docs.sh | 57 +++ .kokoro/release.sh | 34 ++ .kokoro/release/common.cfg | 64 ++++ .kokoro/release/release.cfg | 1 + .kokoro/trampoline.sh | 23 ++ .repo-metadata.json | 2 +- CODE_OF_CONDUCT.md | 44 +++ CONTRIBUTING.rst | 279 ++++++++++++++ LICENSE | 7 +- MANIFEST.in | 1 + docs/conf.py | 25 +- noxfile.py | 9 +- renovate.json | 5 + setup.py | 2 +- synth.metadata | 444 +--------------------- 29 files changed, 840 insertions(+), 464 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/support_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/release-please.yml create mode 100644 .gitignore create mode 100755 .kokoro/build.sh create mode 100644 .kokoro/continuous/common.cfg create mode 100644 .kokoro/continuous/continuous.cfg create mode 100644 .kokoro/docs/common.cfg create mode 100644 .kokoro/docs/docs.cfg create mode 100644 .kokoro/presubmit/common.cfg create mode 100644 .kokoro/presubmit/presubmit.cfg create mode 100755 .kokoro/publish-docs.sh create mode 100755 .kokoro/release.sh create mode 100644 .kokoro/release/common.cfg create mode 100644 .kokoro/release/release.cfg create mode 100755 .kokoro/trampoline.sh create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.rst create mode 100644 renovate.json diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..939e5341e7 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# How to Contribute + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution; +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests. + +## Community Guidelines + +This project follows [Google's Open Source Community +Guidelines](https://opensource.google.com/conduct/). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..96d9781dc8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,44 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +Thanks for stopping by to let us know something could be better! + +**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. + +Please run down the following list and make sure you've tried the usual "quick fixes": + + - Search the issues already opened: https://github.com/googleapis/python-spanner/issues + - Search the issues on our "catch-all" repository: https://github.com/googleapis/google-cloud-python + - Search StackOverflow: http://stackoverflow.com/questions/tagged/google-cloud-platform+python + +If you are still having issues, please be sure to include as much information as possible: + +#### Environment details + + - OS type and version: + - Python version: `python --version` + - pip version: `pip --version` + - `google-cloud-spanner` version: `pip show google-cloud-spanner` + +#### Steps to reproduce + + 1. ? + 2. ? + +#### Code example + +```python +# example +``` + +#### Stack trace +``` +# example +``` + +Making sure to follow these steps will guarantee the quickest resolution possible. + +Thanks! diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..6365857f33 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,18 @@ +--- +name: Feature request +about: Suggest an idea for this library + +--- + +Thanks for stopping by to let us know something could be better! + +**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. + + **Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + **Describe the solution you'd like** +A clear and concise description of what you want to happen. + **Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + **Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/support_request.md b/.github/ISSUE_TEMPLATE/support_request.md new file mode 100644 index 0000000000..9958690321 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support_request.md @@ -0,0 +1,7 @@ +--- +name: Support request +about: If you have a support contract with Google, please create an issue in the Google Cloud Support console. + +--- + +**PLEASE READ**: If you have a support contract with Google, please create an issue in the [support console](https://cloud.google.com/support/) instead of filing on GitHub. This will ensure a timely response. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..4aaf7c0398 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ +Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: +- [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/python-spanner/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea +- [ ] Ensure the tests and linter pass +- [ ] Code coverage does not decrease (if any source code was changed) +- [ ] Appropriate docs were updated (if necessary) + +Fixes # 🦕 diff --git a/.github/release-please.yml b/.github/release-please.yml new file mode 100644 index 0000000000..4507ad0598 --- /dev/null +++ b/.github/release-please.yml @@ -0,0 +1 @@ +releaseType: python diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..3fb06e09ce --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +*.py[cod] +*.sw[op] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 +__pycache__ + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.nox +.cache +.pytest_cache + + +# Mac +.DS_Store + +# JetBrains +.idea + +# VS Code +.vscode + +# emacs +*~ + +# Built documentation +docs/_build +bigquery/docs/generated + +# Virtual environment +env/ +coverage.xml + +# System test environment variables. +system_tests/local_test_setup + +# Make sure a generated file isn't accidentally committed. +pylintrc +pylintrc.test \ No newline at end of file diff --git a/.kokoro/build.sh b/.kokoro/build.sh new file mode 100755 index 0000000000..e90d82bd03 --- /dev/null +++ b/.kokoro/build.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +cd github/python-spanner + +# Disable buffering, so that the logs stream through. +export PYTHONUNBUFFERED=1 + +# Debug: show build environment +env | grep KOKORO + +# Setup service account credentials. +export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/service-account.json + +# Setup project id. +export PROJECT_ID=$(cat "${KOKORO_GFILE_DIR}/project-id.json") + +# Remove old nox +python3.6 -m pip uninstall --yes --quiet nox-automation + +# Install nox +python3.6 -m pip install --upgrade --quiet nox +python3.6 -m nox --version + +python3.6 -m nox diff --git a/.kokoro/continuous/common.cfg b/.kokoro/continuous/common.cfg new file mode 100644 index 0000000000..147ca73366 --- /dev/null +++ b/.kokoro/continuous/common.cfg @@ -0,0 +1,27 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Download resources for system tests (service account key, etc.) +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-python" + +# Use the trampoline script to run in docker. +build_file: "python-spanner/.kokoro/trampoline.sh" + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" +} +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-spanner/.kokoro/build.sh" +} diff --git a/.kokoro/continuous/continuous.cfg b/.kokoro/continuous/continuous.cfg new file mode 100644 index 0000000000..8f43917d92 --- /dev/null +++ b/.kokoro/continuous/continuous.cfg @@ -0,0 +1 @@ +# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file diff --git a/.kokoro/docs/common.cfg b/.kokoro/docs/common.cfg new file mode 100644 index 0000000000..7bc873e976 --- /dev/null +++ b/.kokoro/docs/common.cfg @@ -0,0 +1,48 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-spanner/.kokoro/trampoline.sh" + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" +} +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-spanner/.kokoro/publish-docs.sh" +} + +env_vars: { + key: "STAGING_BUCKET" + value: "docs-staging" +} + +# Fetch the token needed for reporting release status to GitHub +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "yoshi-automation-github-key" + } + } +} + +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "docuploader_service_account" + } + } +} \ No newline at end of file diff --git a/.kokoro/docs/docs.cfg b/.kokoro/docs/docs.cfg new file mode 100644 index 0000000000..8f43917d92 --- /dev/null +++ b/.kokoro/docs/docs.cfg @@ -0,0 +1 @@ +# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file diff --git a/.kokoro/presubmit/common.cfg b/.kokoro/presubmit/common.cfg new file mode 100644 index 0000000000..147ca73366 --- /dev/null +++ b/.kokoro/presubmit/common.cfg @@ -0,0 +1,27 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Download resources for system tests (service account key, etc.) +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-python" + +# Use the trampoline script to run in docker. +build_file: "python-spanner/.kokoro/trampoline.sh" + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" +} +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-spanner/.kokoro/build.sh" +} diff --git a/.kokoro/presubmit/presubmit.cfg b/.kokoro/presubmit/presubmit.cfg new file mode 100644 index 0000000000..8f43917d92 --- /dev/null +++ b/.kokoro/presubmit/presubmit.cfg @@ -0,0 +1 @@ +# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh new file mode 100755 index 0000000000..bc384fe0ce --- /dev/null +++ b/.kokoro/publish-docs.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#!/bin/bash + +set -eo pipefail + +# Disable buffering, so that the logs stream through. +export PYTHONUNBUFFERED=1 + +cd github/python-spanner + +# Remove old nox +python3.6 -m pip uninstall --yes --quiet nox-automation + +# Install nox +python3.6 -m pip install --upgrade --quiet nox +python3.6 -m nox --version + +# build docs +nox -s docs + +python3 -m pip install gcp-docuploader + +# install a json parser +sudo apt-get update +sudo apt-get -y install software-properties-common +sudo add-apt-repository universe +sudo apt-get update +sudo apt-get -y install jq + +# create metadata +python3 -m docuploader create-metadata \ + --name=$(jq --raw-output '.name // empty' .repo-metadata.json) \ + --version=$(python3 setup.py --version) \ + --language=$(jq --raw-output '.language // empty' .repo-metadata.json) \ + --distribution-name=$(python3 setup.py --name) \ + --product-page=$(jq --raw-output '.product_documentation // empty' .repo-metadata.json) \ + --github-repository=$(jq --raw-output '.repo // empty' .repo-metadata.json) \ + --issue-tracker=$(jq --raw-output '.issue_tracker // empty' .repo-metadata.json) + +cat docs.metadata + +# upload docs +python3 -m docuploader upload docs/_build/html --metadata-file docs.metadata --staging-bucket docs-staging diff --git a/.kokoro/release.sh b/.kokoro/release.sh new file mode 100755 index 0000000000..c997903c64 --- /dev/null +++ b/.kokoro/release.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#!/bin/bash + +set -eo pipefail + +# Start the releasetool reporter +python3 -m pip install gcp-releasetool +python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script + +# Ensure that we have the latest versions of Twine, Wheel, and Setuptools. +python3 -m pip install --upgrade twine wheel setuptools + +# Disable buffering, so that the logs stream through. +export PYTHONUNBUFFERED=1 + +# Move into the package, build the distribution and upload. +TWINE_PASSWORD=$(cat "${KOKORO_KEYSTORE_DIR}/73713_google_cloud_pypi_password") +cd github/python-spanner +python3 setup.py sdist bdist_wheel +twine upload --username gcloudpypi --password "${TWINE_PASSWORD}" dist/* diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg new file mode 100644 index 0000000000..05c943b0c6 --- /dev/null +++ b/.kokoro/release/common.cfg @@ -0,0 +1,64 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-spanner/.kokoro/trampoline.sh" + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-multi" +} +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-spanner/.kokoro/release.sh" +} + +# Fetch the token needed for reporting release status to GitHub +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "yoshi-automation-github-key" + } + } +} + +# Fetch PyPI password +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "google_cloud_pypi_password" + } + } +} + +# Fetch magictoken to use with Magic Github Proxy +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "releasetool-magictoken" + } + } +} + +# Fetch api key to use with Magic Github Proxy +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "magic-github-proxy-api-key" + } + } +} diff --git a/.kokoro/release/release.cfg b/.kokoro/release/release.cfg new file mode 100644 index 0000000000..8f43917d92 --- /dev/null +++ b/.kokoro/release/release.cfg @@ -0,0 +1 @@ +# Format: //devtools/kokoro/config/proto/build.proto \ No newline at end of file diff --git a/.kokoro/trampoline.sh b/.kokoro/trampoline.sh new file mode 100755 index 0000000000..e8c4251f3e --- /dev/null +++ b/.kokoro/trampoline.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2017 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eo pipefail + +python3 "${KOKORO_GFILE_DIR}/trampoline_v1.py" || ret_code=$? + +chmod +x ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh +${KOKORO_GFILE_DIR}/trampoline_cleanup.sh || true + +exit ${ret_code} diff --git a/.repo-metadata.json b/.repo-metadata.json index 05efd37f1d..f4801561e9 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -6,7 +6,7 @@ "issue_tracker": "https://issuetracker.google.com/issues?q=componentid:190851%2B%20status:open", "release_level": "ga", "language": "python", - "repo": "googleapis/google-cloud-python", + "repo": "googleapis/python-spanner", "distribution_name": "google-cloud-spanner", "api_id": "spanner.googleapis.com", "requires_billing": true diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..b3d1f60298 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,44 @@ + +# Contributor Code of Conduct + +As contributors and maintainers of this project, +and in the interest of fostering an open and welcoming community, +we pledge to respect all people who contribute through reporting issues, +posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project +a harassment-free experience for everyone, +regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, +such as physical or electronic +addresses, without explicit permission +* Other unethical or unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. +By adopting this Code of Conduct, +project maintainers commit themselves to fairly and consistently +applying these principles to every aspect of managing this project. +Project maintainers who do not follow or enforce the Code of Conduct +may be permanently removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior +may be reported by opening an issue +or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, +available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000000..e9fa887ebf --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,279 @@ +.. Generated by synthtool. DO NOT EDIT! +############ +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. (Please Read: `Faster Pull Request Reviews`_) + +.. _Faster Pull Request Reviews: https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#best-practices-for-faster-reviews + +.. contents:: Here are some guidelines for hacking on the Google Cloud Client libraries. + +*************** +Adding Features +*************** + +In order to add a feature: + +- The feature must be documented in both the API and narrative + documentation. + +- The feature must work fully on the following CPython versions: 2.7, + 3.5, 3.6, and 3.7 on both UNIX and Windows. + +- The feature must not add unnecessary dependencies (where + "unnecessary" is of course subjective, but new dependencies should + be discussed). + +**************************** +Using a Development Checkout +**************************** + +You'll have to create a development environment using a Git checkout: + +- While logged into your GitHub account, navigate to the + ``python-spanner`` `repo`_ on GitHub. + +- Fork and clone the ``python-spanner`` repository to your GitHub account by + clicking the "Fork" button. + +- Clone your fork of ``python-spanner`` from your GitHub account to your local + computer, substituting your account username and specifying the destination + as ``hack-on-python-spanner``. E.g.:: + + $ cd ${HOME} + $ git clone git@github.com:USERNAME/python-spanner.git hack-on-python-spanner + $ cd hack-on-python-spanner + # Configure remotes such that you can pull changes from the googleapis/python-spanner + # repository into your local repository. + $ git remote add upstream git@github.com:googleapis/python-spanner.git + # fetch and merge changes from upstream into master + $ git fetch upstream + $ git merge upstream/master + +Now your local repo is set up such that you will push changes to your GitHub +repo, from which you can submit a pull request. + +To work on the codebase and run the tests, we recommend using ``nox``, +but you can also use a ``virtualenv`` of your own creation. + +.. _repo: https://github.com/googleapis/python-spanner + +Using ``nox`` +============= + +We use `nox `__ to instrument our tests. + +- To test your changes, run unit tests with ``nox``:: + + $ nox -s unit-2.7 + $ nox -s unit-3.7 + $ ... + + .. note:: + + The unit tests and system tests are described in the + ``noxfile.py`` files in each directory. + +.. nox: https://pypi.org/project/nox/ + +Note on Editable Installs / Develop Mode +======================================== + +- As mentioned previously, using ``setuptools`` in `develop mode`_ + or a ``pip`` `editable install`_ is not possible with this + library. This is because this library uses `namespace packages`_. + For context see `Issue #2316`_ and the relevant `PyPA issue`_. + + Since ``editable`` / ``develop`` mode can't be used, packages + need to be installed directly. Hence your changes to the source + tree don't get incorporated into the **already installed** + package. + +.. _namespace packages: https://www.python.org/dev/peps/pep-0420/ +.. _Issue #2316: https://github.com/GoogleCloudPlatform/google-cloud-python/issues/2316 +.. _PyPA issue: https://github.com/pypa/packaging-problems/issues/12 +.. _develop mode: https://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode +.. _editable install: https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs + +***************************************** +I'm getting weird errors... Can you help? +***************************************** + +If the error mentions ``Python.h`` not being found, +install ``python-dev`` and try again. +On Debian/Ubuntu:: + + $ sudo apt-get install python-dev + +************ +Coding Style +************ + +- PEP8 compliance, with exceptions defined in the linter configuration. + If you have ``nox`` installed, you can test that you have not introduced + any non-compliant code via:: + + $ nox -s lint + +- In order to make ``nox -s lint`` run faster, you can set some environment + variables:: + + export GOOGLE_CLOUD_TESTING_REMOTE="upstream" + export GOOGLE_CLOUD_TESTING_BRANCH="master" + + By doing this, you are specifying the location of the most up-to-date + version of ``python-spanner``. The the suggested remote name ``upstream`` + should point to the official ``googleapis`` checkout and the + the branch should be the main branch on that remote (``master``). + +Exceptions to PEP8: + +- Many unit tests use a helper method, ``_call_fut`` ("FUT" is short for + "Function-Under-Test"), which is PEP8-incompliant, but more readable. + Some also use a local variable, ``MUT`` (short for "Module-Under-Test"). + +******************** +Running System Tests +******************** + +- To run system tests, you can execute:: + + $ nox -s system-3.7 + $ nox -s system-2.7 + + .. note:: + + System tests are only configured to run under Python 2.7 and + Python 3.7. For expediency, we do not run them in older versions + of Python 3. + + This alone will not run the tests. You'll need to change some local + auth settings and change some configuration in your project to + run all the tests. + +- System tests will be run against an actual project and + so you'll need to provide some environment variables to facilitate + authentication to your project: + + - ``GOOGLE_APPLICATION_CREDENTIALS``: The path to a JSON key file; + Such a file can be downloaded directly from the developer's console by clicking + "Generate new JSON key". See private key + `docs `__ + for more details. + +- Once you have downloaded your json keys, set the environment variable + ``GOOGLE_APPLICATION_CREDENTIALS`` to the absolute path of the json file:: + + $ export GOOGLE_APPLICATION_CREDENTIALS="/Users//path/to/app_credentials.json" + + +************* +Test Coverage +************* + +- The codebase *must* have 100% test statement coverage after each commit. + You can test coverage via ``nox -s cover``. + +****************************************************** +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. + +Build the docs via: + + $ nox -s docs + +******************************************** +Note About ``README`` as it pertains to PyPI +******************************************** + +The `description on PyPI`_ for the project comes directly from the +``README``. Due to the reStructuredText (``rst``) parser used by +PyPI, relative links which will work on GitHub (e.g. ``CONTRIBUTING.rst`` +instead of +``https://github.com/googleapis/python-spanner/blob/master/CONTRIBUTING.rst``) +may cause problems creating links or rendering the description. + +.. _description on PyPI: https://pypi.org/project/google-cloud-spanner + + +************************* +Supported Python Versions +************************* + +We support: + +- `Python 3.5`_ +- `Python 3.6`_ +- `Python 3.7`_ + +.. _Python 3.5: https://docs.python.org/3.5/ +.. _Python 3.6: https://docs.python.org/3.6/ +.. _Python 3.7: https://docs.python.org/3.7/ + + +Supported versions can be found in our ``noxfile.py`` `config`_. + +.. _config: https://github.com/googleapis/python-spanner/blob/master/noxfile.py + +We explicitly decided not to support `Python 2.5`_ due to `decreased usage`_ +and lack of continuous integration `support`_. + +.. _Python 2.5: https://docs.python.org/2.5/ +.. _decreased usage: https://caremad.io/2013/10/a-look-at-pypi-downloads/ +.. _support: https://blog.travis-ci.com/2013-11-18-upcoming-build-environment-updates/ + +We have `dropped 2.6`_ as a supported version as well since Python 2.6 is no +longer supported by the core development team. + +Python 2.7 support is deprecated. All code changes should maintain Python 2.7 compatibility until January 1, 2020. + +We also explicitly decided to support Python 3 beginning with version +3.5. Reasons for this include: + +- Encouraging use of newest versions of Python 3 +- Taking the lead of `prominent`_ open-source `projects`_ +- `Unicode literal support`_ which allows for a cleaner codebase that + works in both Python 2 and Python 3 + +.. _prominent: https://docs.djangoproject.com/en/1.9/faq/install/#what-python-version-can-i-use-with-django +.. _projects: http://flask.pocoo.org/docs/0.10/python3/ +.. _Unicode literal support: https://www.python.org/dev/peps/pep-0414/ +.. _dropped 2.6: https://github.com/googleapis/google-cloud-python/issues/995 + +********** +Versioning +********** + +This library follows `Semantic Versioning`_. + +.. _Semantic Versioning: http://semver.org/ + +Some packages are 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 `__. +- **If you work for a company that wants to allow you to contribute your work**, + then you'll need to sign a + `corporate CLA `__. + +You can sign these electronically (just scroll to the bottom). After that, +we'll be able to accept your pull requests. diff --git a/LICENSE b/LICENSE index d645695673..a8ee855de2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,6 @@ - - Apache License + Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -193,7 +192,7 @@ you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/MANIFEST.in b/MANIFEST.in index d2edac3734..d96120f55e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ +# Generated by synthtool. DO NOT EDIT! include README.rst LICENSE include google/cloud/spanner_v1/gapic/transports/spanner.grpc.config recursive-include google *.json *.proto diff --git a/docs/conf.py b/docs/conf.py index dd597836fb..e326daef4e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -20,7 +20,7 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath("..")) -__version__ = "0.1.0" +__version__ = "" # -- General configuration ------------------------------------------------ @@ -33,7 +33,6 @@ extensions = [ "sphinx.ext.autodoc", "sphinx.ext.autosummary", - "sphinx.ext.doctest", "sphinx.ext.intersphinx", "sphinx.ext.coverage", "sphinx.ext.napoleon", @@ -46,6 +45,7 @@ autodoc_default_flags = ["members"] autosummary_generate = True + # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] @@ -66,7 +66,7 @@ # General information about the project. project = u"google-cloud-spanner" -copyright = u"2017, Google" +copyright = u"2019, Google" author = u"Google APIs" # The version info for the project you're documenting, acts as replacement for @@ -122,6 +122,7 @@ # 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 @@ -132,9 +133,9 @@ # further. For a list of options available for each theme, see the # documentation. html_theme_options = { - "description": "Google Cloud Client Libraries for Python", + "description": "Google Cloud Client Libraries for google-cloud-spanner", "github_user": "googleapis", - "github_repo": "google-cloud-python", + "github_repo": "python-spanner", "github_banner": True, "font_family": "'Roboto', Georgia, sans", "head_font_family": "'Roboto', Georgia, serif", @@ -230,6 +231,7 @@ # -- 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 @@ -285,6 +287,7 @@ # If false, no module index is generated. # latex_domain_indices = True + # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples @@ -302,6 +305,7 @@ # 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 @@ -314,7 +318,7 @@ u"google-cloud-spanner Documentation", author, "google-cloud-spanner", - "GAPIC library for the {metadata.shortName} service", + "google-cloud-spanner Library", "APIs", ) ] @@ -331,19 +335,16 @@ # 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.dev/python/google-api-core/latest", None), + "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None), "grpc": ("https://grpc.io/grpc/python/", None), - "requests": ("https://requests.kennethreitz.org/en/stable/", 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 diff --git a/noxfile.py b/noxfile.py index 7949a4e392..413e29a7d8 100644 --- a/noxfile.py +++ b/noxfile.py @@ -23,7 +23,6 @@ import nox -LOCAL_DEPS = (os.path.join("..", "api_core"), os.path.join("..", "core")) BLACK_VERSION = "black==19.3b0" BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] @@ -38,7 +37,7 @@ def lint(session): Returns a failure if the linters find linting errors or sufficiently serious code quality issues. """ - session.install("flake8", BLACK_VERSION, *LOCAL_DEPS) + session.install("flake8", BLACK_VERSION) session.run("black", "--check", *BLACK_PATHS) session.run("flake8", "google", "tests") @@ -67,8 +66,6 @@ def lint_setup_py(session): def default(session): # Install all test dependencies, then install this package in-place. session.install("mock", "pytest", "pytest-cov") - for local_dep in LOCAL_DEPS: - session.install("-e", local_dep) session.install("-e", ".") # Run py.test against the unit tests. @@ -113,9 +110,7 @@ def system(session): # Install all test dependencies, then install this package into the # virtualenv's dist-packages. session.install("mock", "pytest") - for local_dep in LOCAL_DEPS: - session.install("-e", local_dep) - session.install("-e", "../test_utils/") + session.install("-e", ".") # Run py.test against the system tests. diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000000..4fa949311b --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base", ":preserveSemverRanges" + ] +} diff --git a/setup.py b/setup.py index b76e9f33cc..6ccb0f2193 100644 --- a/setup.py +++ b/setup.py @@ -64,7 +64,7 @@ author="Google LLC", author_email="googleapis-packages@google.com", license="Apache 2.0", - url="https://github.com/GoogleCloudPlatform/google-cloud-python", + url="https://github.com/googleapis/python-spanner", classifiers=[ release_status, "Intended Audience :: Developers", diff --git a/synth.metadata b/synth.metadata index 2e5ff8a808..19a28d2922 100644 --- a/synth.metadata +++ b/synth.metadata @@ -1,5 +1,5 @@ { - "updateTime": "2020-01-30T13:37:36.907968Z", + "updateTime": "2020-01-31T21:10:03.527484Z", "sources": [ { "generator": { @@ -12,14 +12,14 @@ "git": { "name": "googleapis", "remote": "https://github.com/googleapis/googleapis.git", - "sha": "c1246a29e22b0f98e800a536b5b0da2d933a55f2", - "internalRef": "292310790", - "log": "c1246a29e22b0f98e800a536b5b0da2d933a55f2\nUpdating v1 protos with the latest inline documentation (in comments) and config options. Also adding a per-service .yaml file.\n\nPiperOrigin-RevId: 292310790\n\nb491d07cadaae7cde5608321f913e5ca1459b32d\nRevert accidental local_repository change\n\nPiperOrigin-RevId: 292245373\n\naf3400a8cb6110025198b59a0f7d018ae3cda700\nUpdate gapic-generator dependency (prebuilt PHP binary support).\n\nPiperOrigin-RevId: 292243997\n\n341fd5690fae36f36cf626ef048fbcf4bbe7cee6\ngrafeas: v1 add resource_definition for the grafeas.io/Project and change references for Project.\n\nPiperOrigin-RevId: 292221998\n\n42e915ec2ece1cd37a590fbcd10aa2c0fb0e5b06\nUpdate the gapic-generator, protoc-java-resource-name-plugin and protoc-docs-plugin to the latest commit.\n\nPiperOrigin-RevId: 292182368\n\nf035f47250675d31492a09f4a7586cfa395520a7\nFix grafeas build and update build.sh script to include gerafeas.\n\nPiperOrigin-RevId: 292168753\n\n26ccb214b7bc4a716032a6266bcb0a9ca55d6dbb\nasset: v1p1beta1 add client config annotations and retry config\n\nPiperOrigin-RevId: 292154210\n\n974ee5c0b5d03e81a50dafcedf41e0efebb5b749\nasset: v1beta1 add client config annotations\n\nPiperOrigin-RevId: 292152573\n\ncf3b61102ed5f36b827bc82ec39be09525f018c8\n Fix to protos for v1p1beta1 release of Cloud Security Command Center\n\nPiperOrigin-RevId: 292034635\n\n4e1cfaa7c0fede9e65d64213ca3da1b1255816c0\nUpdate the public proto to support UTF-8 encoded id for CatalogService API, increase the ListCatalogItems deadline to 300s and some minor documentation change\n\nPiperOrigin-RevId: 292030970\n\n9c483584f8fd5a1b862ae07973f4cc7bb3e46648\nasset: add annotations to v1p1beta1\n\nPiperOrigin-RevId: 292009868\n\ne19209fac29731d0baf6d9ac23da1164f7bdca24\nAdd the google.rpc.context.AttributeContext message to the open source\ndirectories.\n\nPiperOrigin-RevId: 291999930\n\nae5662960573f279502bf98a108a35ba1175e782\noslogin API: move file level option on top of the file to avoid protobuf.js bug.\n\nPiperOrigin-RevId: 291990506\n\neba3897fff7c49ed85d3c47fc96fe96e47f6f684\nAdd cc_proto_library and cc_grpc_library targets for Spanner and IAM protos.\n\nPiperOrigin-RevId: 291988651\n\n8e981acfd9b97ea2f312f11bbaa7b6c16e412dea\nBeta launch for PersonDetection and FaceDetection features.\n\nPiperOrigin-RevId: 291821782\n\n994e067fae3b21e195f7da932b08fff806d70b5d\nasset: add annotations to v1p2beta1\n\nPiperOrigin-RevId: 291815259\n\n244e1d2c89346ca2e0701b39e65552330d68545a\nAdd Playable Locations service\n\nPiperOrigin-RevId: 291806349\n\n909f8f67963daf45dd88d020877fb9029b76788d\nasset: add annotations to v1beta2\n\nPiperOrigin-RevId: 291805301\n\n3c39a1d6e23c1ef63c7fba4019c25e76c40dfe19\nKMS: add file-level message for CryptoKeyPath, it is defined in gapic yaml but not\nin proto files.\n\nPiperOrigin-RevId: 291420695\n\nc6f3f350b8387f8d1b85ed4506f30187ebaaddc3\ncontaineranalysis: update v1beta1 and bazel build with annotations\n\nPiperOrigin-RevId: 291401900\n\n92887d74b44e4e636252b7b8477d0d2570cd82db\nfix: fix the location of grpc config file.\n\nPiperOrigin-RevId: 291396015\n\ne26cab8afd19d396b929039dac5d874cf0b5336c\nexpr: add default_host and method_signature annotations to CelService\n\nPiperOrigin-RevId: 291240093\n\n06093ae3952441c34ec176d1f7431b8765cec0be\nirm: fix v1alpha2 bazel build by adding missing proto imports\n\nPiperOrigin-RevId: 291227940\n\na8a2514af326e4673063f9a3c9d0ef1091c87e6c\nAdd proto annotation for cloud/irm API\n\nPiperOrigin-RevId: 291217859\n\n8d16f76de065f530d395a4c7eabbf766d6a120fd\nGenerate Memcache v1beta2 API protos and gRPC ServiceConfig files\n\nPiperOrigin-RevId: 291008516\n\n3af1dabd93df9a9f17bf3624d3b875c11235360b\ngrafeas: Add containeranalysis default_host to Grafeas service\n\nPiperOrigin-RevId: 290965849\n\nbe2663fa95e31cba67d0cd62611a6674db9f74b7\nfix(google/maps/roads): add missing opening bracket\n\nPiperOrigin-RevId: 290964086\n\nfacc26550a0af0696e0534bc9cae9df14275aa7c\nUpdating v2 protos with the latest inline documentation (in comments) and adding a per-service .yaml file.\n\nPiperOrigin-RevId: 290952261\n\ncda99c1f7dc5e4ca9b1caeae1dc330838cbc1461\nChange api_name to 'asset' for v1p1beta1\n\nPiperOrigin-RevId: 290800639\n\n94e9e90c303a820ce40643d9129e7f0d2054e8a1\nAdds Google Maps Road service\n\nPiperOrigin-RevId: 290795667\n\na3b23dcb2eaecce98c600c7d009451bdec52dbda\nrpc: new message ErrorInfo, other comment updates\n\nPiperOrigin-RevId: 290781668\n\n26420ef4e46c37f193c0fbe53d6ebac481de460e\nAdd proto definition for Org Policy v1.\n\nPiperOrigin-RevId: 290771923\n\n7f0dab8177cf371ae019a082e2512de7ac102888\nPublish Routes Preferred API v1 service definitions.\n\nPiperOrigin-RevId: 290326986\n\nad6e508d0728e1d1bca6e3f328cd562718cb772d\nFix: Qualify resource type references with \"jobs.googleapis.com/\"\n\nPiperOrigin-RevId: 290285762\n\n58e770d568a2b78168ddc19a874178fee8265a9d\ncts client library\n\nPiperOrigin-RevId: 290146169\n\naf9daa4c3b4c4a8b7133b81588dd9ffd37270af2\nAdd more programming language options to public proto\n\nPiperOrigin-RevId: 290144091\n\nd9f2bbf2df301ef84641d4cec7c828736a0bd907\ntalent: add missing resource.proto dep to Bazel build target\n\nPiperOrigin-RevId: 290143164\n\n3b3968237451d027b42471cd28884a5a1faed6c7\nAnnotate Talent API.\nAdd gRPC service config for retry.\nUpdate bazel file with google.api.resource dependency.\n\nPiperOrigin-RevId: 290125172\n\n0735b4b096872960568d1f366bfa75b7b0e1f1a3\nWeekly library update.\n\nPiperOrigin-RevId: 289939042\n\n8760d3d9a4543d7f9c0d1c7870aca08b116e4095\nWeekly library update.\n\nPiperOrigin-RevId: 289939020\n\n8607df842f782a901805187e02fff598145b0b0e\nChange Talent API timeout to 30s.\n\nPiperOrigin-RevId: 289912621\n\n908155991fe32570653bcb72ecfdcfc896642f41\nAdd Recommendations AI V1Beta1\n\nPiperOrigin-RevId: 289901914\n\n5c9a8c2bebd8b71aa66d1cc473edfaac837a2c78\nAdding no-arg method signatures for ListBillingAccounts and ListServices\n\nPiperOrigin-RevId: 289891136\n\n50b0e8286ac988b0593bd890eb31fef6ea2f5767\nlongrunning: add grpc service config and default_host annotation to operations.proto\n\nPiperOrigin-RevId: 289876944\n\n6cac27dabe51c54807b0401698c32d34998948a9\n Updating default deadline for Cloud Security Command Center's v1 APIs.\n\nPiperOrigin-RevId: 289875412\n\nd99df0d67057a233c711187e0689baa4f8e6333d\nFix: Correct spelling in C# namespace option\n\nPiperOrigin-RevId: 289709813\n\n2fa8d48165cc48e35b0c62e6f7bdade12229326c\nfeat: Publish Recommender v1 to GitHub.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289619243\n\n9118db63d1ab493a2e44a3b4973fde810a835c49\nfirestore: don't retry reads that fail with Aborted\n\nFor transaction reads that fail with ABORTED, we need to rollback and start a new transaction. Our current configuration makes it so that GAPIC retries ABORTED reads multiple times without making any progress. Instead, we should retry at the transaction level.\n\nPiperOrigin-RevId: 289532382\n\n1dbfd3fe4330790b1e99c0bb20beb692f1e20b8a\nFix bazel build\nAdd other langauges (Java was already there) for bigquery/storage/v1alpha2 api.\n\nPiperOrigin-RevId: 289519766\n\nc06599cdd7d11f8d3fd25f8d3249e5bb1a3d5d73\nInitial commit of google.cloud.policytroubleshooter API, The API helps in troubleshooting GCP policies. Refer https://cloud.google.com/iam/docs/troubleshooting-access for more information\n\nPiperOrigin-RevId: 289491444\n\nfce7d80fa16ea241e87f7bc33d68595422e94ecd\nDo not pass samples option for Artman config of recommender v1 API.\n\nPiperOrigin-RevId: 289477403\n\nef179e8c61436297e6bb124352e47e45c8c80cb1\nfix: Address missing Bazel dependency.\n\nBazel builds stopped working in 06ec6d5 because\nthe google/longrunning/operations.proto file took\nan import from google/api/client.proto, but that\nimport was not added to BUILD.bazel.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289446074\n\n8841655b242c84fd691d77d7bcf21b61044f01ff\nMigrate Data Labeling v1beta1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289446026\n\n06ec6d5d053fff299eaa6eaa38afdd36c5e2fc68\nAdd annotations to google.longrunning.v1\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289413169\n\n0480cf40be1d3cc231f4268a2fdb36a8dd60e641\nMigrate IAM Admin v1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289411084\n\n1017173e9adeb858587639af61889ad970c728b1\nSpecify a C# namespace for BigQuery Connection v1beta1\n\nPiperOrigin-RevId: 289396763\n\nb08714b378e8e5b0c4ecdde73f92c36d6303b4b6\nfix: Integrate latest proto-docs-plugin fix.\nFixes dialogflow v2\n\nPiperOrigin-RevId: 289189004\n\n51217a67e79255ee1f2e70a6a3919df082513327\nCreate BUILD file for recommender v1\n\nPiperOrigin-RevId: 289183234\n\nacacd87263c0a60e458561b8b8ce9f67c760552a\nGenerate recommender v1 API protos and gRPC ServiceConfig files\n\nPiperOrigin-RevId: 289177510\n\n9d2f7133b97720b1fa3601f6dcd30760ba6d8a1e\nFix kokoro build script\n\nPiperOrigin-RevId: 289166315\n\nc43a67530d2a47a0220cad20ca8de39b3fbaf2c5\ncloudtasks: replace missing RPC timeout config for v2beta2 and v2beta3\n\nPiperOrigin-RevId: 289162391\n\n4cefc229a9197236fc0adf02d69b71c0c5cf59de\nSynchronize new proto/yaml changes.\n\nPiperOrigin-RevId: 289158456\n\n56f263fe959c50786dab42e3c61402d32d1417bd\nCatalog API: Adding config necessary to build client libraries\n\nPiperOrigin-RevId: 289149879\n\n4543762b23a57fc3c53d409efc3a9affd47b6ab3\nFix Bazel build\nbilling/v1 and dialogflow/v2 remain broken (not bazel-related issues).\nBilling has wrong configuration, dialogflow failure is caused by a bug in documentation plugin.\n\nPiperOrigin-RevId: 289140194\n\nc9dce519127b97e866ca133a01157f4ce27dcceb\nUpdate Bigtable docs\n\nPiperOrigin-RevId: 289114419\n\n802c5c5f2bf94c3facb011267d04e71942e0d09f\nMigrate DLP to proto annotations (but not GAPIC v2).\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 289102579\n\n6357f30f2ec3cff1d8239d18b707ff9d438ea5da\nRemove gRPC configuration file that was in the wrong place.\n\nPiperOrigin-RevId: 289096111\n\n360a8792ed62f944109d7e22d613a04a010665b4\n Protos for v1p1beta1 release of Cloud Security Command Center\n\nPiperOrigin-RevId: 289011995\n\na79211c20c4f2807eec524d00123bf7c06ad3d6e\nRoll back containeranalysis v1 to GAPIC v1.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288999068\n\n9e60345ba603e03484a8aaa33ce5ffa19c1c652b\nPublish Routes Preferred API v1 proto definitions.\n\nPiperOrigin-RevId: 288941399\n\nd52885b642ad2aa1f42b132ee62dbf49a73e1e24\nMigrate the service management API to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288909426\n\n6ace586805c08896fef43e28a261337fcf3f022b\ncloudtasks: replace missing RPC timeout config\n\nPiperOrigin-RevId: 288783603\n\n51d906cabee4876b12497054b15b05d4a50ad027\nImport of Grafeas from Github.\n\nUpdate BUILD.bazel accordingly.\n\nPiperOrigin-RevId: 288783426\n\n5ef42bcd363ba0440f0ee65b3c80b499e9067ede\nMigrate Recommender v1beta1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288713066\n\n94f986afd365b7d7e132315ddcd43d7af0e652fb\nMigrate Container Analysis v1 to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288708382\n\n7a751a279184970d3b6ba90e4dd4d22a382a0747\nRemove Container Analysis v1alpha1 (nobody publishes it).\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288707473\n\n3c0d9c71242e70474b2b640e15bb0a435fd06ff0\nRemove specious annotation from BigQuery Data Transfer before\nanyone accidentally does anything that uses it.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288701604\n\n1af307a4764bd415ef942ac5187fa1def043006f\nMigrate BigQuery Connection to GAPIC v2.\n\nCommitter: @lukesneeringer\nPiperOrigin-RevId: 288698681\n\n08b488e0660c59842a7dee0e3e2b65d9e3a514a9\nExposing cloud_catalog.proto (This API is already available through REST)\n\nPiperOrigin-RevId: 288625007\n\na613482977e11ac09fa47687a5d1b5a01efcf794\nUpdate the OS Login v1beta API description to render better in the UI.\n\nPiperOrigin-RevId: 288547940\n\n5e182b8d9943f1b17008d69d4c7e865dc83641a7\nUpdate the OS Login API description to render better in the UI.\n\nPiperOrigin-RevId: 288546443\n\n" + "sha": "2717b8a1c762b26911b45ecc2e4ee01d98401b28", + "internalRef": "292555664", + "log": "2717b8a1c762b26911b45ecc2e4ee01d98401b28\nFix dataproc artman client library generation.\n\nPiperOrigin-RevId: 292555664\n\n7ac66d9be8a7d7de4f13566d8663978c9ee9dcd7\nAdd Dataproc Autoscaling API to V1.\n\nPiperOrigin-RevId: 292450564\n\n5d932b2c1be3a6ef487d094e3cf5c0673d0241dd\n- Improve documentation\n- Add a client_id field to StreamingPullRequest\n\nPiperOrigin-RevId: 292434036\n\neaff9fa8edec3e914995ce832b087039c5417ea7\nmonitoring: v3 publish annotations and client retry config\n\nPiperOrigin-RevId: 292425288\n\n70958bab8c5353870d31a23fb2c40305b050d3fe\nBigQuery Storage Read API v1 clients.\n\nPiperOrigin-RevId: 292407644\n\n7a15e7fe78ff4b6d5c9606a3264559e5bde341d1\nUpdate backend proto for Google Cloud Endpoints\n\nPiperOrigin-RevId: 292391607\n\n3ca2c014e24eb5111c8e7248b1e1eb833977c83d\nbazel: Add --flaky_test_attempts=3 argument to prevent CI failures caused by flaky tests\n\nPiperOrigin-RevId: 292382559\n\n9933347c1f677e81e19a844c2ef95bfceaf694fe\nbazel:Integrate latest protoc-java-resource-names-plugin changes (fix for PyYAML dependency in bazel rules)\n\nPiperOrigin-RevId: 292376626\n\nb835ab9d2f62c88561392aa26074c0b849fb0bd3\nasset: v1p2beta1 add client config annotations\n\n* remove unintentionally exposed RPCs\n* remove messages relevant to removed RPCs\n\nPiperOrigin-RevId: 292369593\n\n" } }, { "template": { - "name": "python_library", + "name": "python_split_library", "origin": "synthtool.gcp", "version": "2019.10.17" } @@ -56,439 +56,5 @@ "config": "google/spanner/admin/database/artman_spanner_admin_database.yaml" } } - ], - "newFiles": [ - { - "path": ".coveragerc" - }, - { - "path": ".flake8" - }, - { - "path": ".repo-metadata.json" - }, - { - "path": "CHANGELOG.md" - }, - { - "path": "LICENSE" - }, - { - "path": "MANIFEST.in" - }, - { - "path": "README.rst" - }, - { - "path": "benchmark/bin/ycsb" - }, - { - "path": "benchmark/ycsb.py" - }, - { - "path": "docs/README.rst" - }, - { - "path": "docs/_static/custom.css" - }, - { - "path": "docs/_templates/layout.html" - }, - { - "path": "docs/advanced-session-pool-topics.rst" - }, - { - "path": "docs/api-reference.rst" - }, - { - "path": "docs/batch-api.rst" - }, - { - "path": "docs/batch-usage.rst" - }, - { - "path": "docs/changelog.md" - }, - { - "path": "docs/client-api.rst" - }, - { - "path": "docs/client-usage.rst" - }, - { - "path": "docs/conf.py" - }, - { - "path": "docs/database-api.rst" - }, - { - "path": "docs/database-usage.rst" - }, - { - "path": "docs/gapic/v1/admin_database_api.rst" - }, - { - "path": "docs/gapic/v1/admin_database_types.rst" - }, - { - "path": "docs/gapic/v1/admin_instance_api.rst" - }, - { - "path": "docs/gapic/v1/admin_instance_types.rst" - }, - { - "path": "docs/gapic/v1/api.rst" - }, - { - "path": "docs/gapic/v1/transactions.rst" - }, - { - "path": "docs/gapic/v1/types.rst" - }, - { - "path": "docs/index.rst" - }, - { - "path": "docs/instance-api.rst" - }, - { - "path": "docs/instance-usage.rst" - }, - { - "path": "docs/keyset-api.rst" - }, - { - "path": "docs/session-api.rst" - }, - { - "path": "docs/snapshot-api.rst" - }, - { - "path": "docs/snapshot-usage.rst" - }, - { - "path": "docs/streamed-api.rst" - }, - { - "path": "docs/transaction-api.rst" - }, - { - "path": "docs/transaction-usage.rst" - }, - { - "path": "docs/usage.html" - }, - { - "path": "google/__init__.py" - }, - { - "path": "google/cloud/__init__.py" - }, - { - "path": "google/cloud/spanner.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/database_admin_client_config.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/enums.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/transports/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/gapic/transports/database_admin_grpc_transport.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin.proto" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/proto/spanner_database_admin_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_admin_database_v1/types.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/enums.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/instance_admin_client_config.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/gapic/transports/instance_admin_grpc_transport.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/__init__.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin.proto" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/proto/spanner_instance_admin_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_admin_instance_v1/types.py" - }, - { - "path": "google/cloud/spanner_v1/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/_helpers.py" - }, - { - "path": "google/cloud/spanner_v1/batch.py" - }, - { - "path": "google/cloud/spanner_v1/client.py" - }, - { - "path": "google/cloud/spanner_v1/database.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/enums.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/spanner_client.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/spanner_client_config.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/transports/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/gapic/transports/spanner.grpc.config" - }, - { - "path": "google/cloud/spanner_v1/gapic/transports/spanner_grpc_transport.py" - }, - { - "path": "google/cloud/spanner_v1/instance.py" - }, - { - "path": "google/cloud/spanner_v1/keyset.py" - }, - { - "path": "google/cloud/spanner_v1/param_types.py" - }, - { - "path": "google/cloud/spanner_v1/pool.py" - }, - { - "path": "google/cloud/spanner_v1/proto/__init__.py" - }, - { - "path": "google/cloud/spanner_v1/proto/keys.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/keys_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/keys_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/mutation.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/mutation_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/mutation_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/query_plan.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/query_plan_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/query_plan_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/result_set.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/result_set_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/result_set_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_database_admin.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_instance_admin.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/spanner_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/transaction.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/transaction_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/transaction_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/proto/type.proto" - }, - { - "path": "google/cloud/spanner_v1/proto/type_pb2.py" - }, - { - "path": "google/cloud/spanner_v1/proto/type_pb2_grpc.py" - }, - { - "path": "google/cloud/spanner_v1/session.py" - }, - { - "path": "google/cloud/spanner_v1/snapshot.py" - }, - { - "path": "google/cloud/spanner_v1/streamed.py" - }, - { - "path": "google/cloud/spanner_v1/transaction.py" - }, - { - "path": "google/cloud/spanner_v1/types.py" - }, - { - "path": "noxfile.py" - }, - { - "path": "pylint.config.py" - }, - { - "path": "setup.cfg" - }, - { - "path": "setup.py" - }, - { - "path": "synth.metadata" - }, - { - "path": "synth.py" - }, - { - "path": "tests/__init__.py" - }, - { - "path": "tests/_fixtures.py" - }, - { - "path": "tests/system/__init__.py" - }, - { - "path": "tests/system/test_system.py" - }, - { - "path": "tests/system/utils/__init__.py" - }, - { - "path": "tests/system/utils/clear_streaming.py" - }, - { - "path": "tests/system/utils/populate_streaming.py" - }, - { - "path": "tests/system/utils/scrub_instances.py" - }, - { - "path": "tests/system/utils/streaming_utils.py" - }, - { - "path": "tests/unit/__init__.py" - }, - { - "path": "tests/unit/gapic/v1/test_database_admin_client_v1.py" - }, - { - "path": "tests/unit/gapic/v1/test_instance_admin_client_v1.py" - }, - { - "path": "tests/unit/gapic/v1/test_spanner_client_v1.py" - }, - { - "path": "tests/unit/streaming-read-acceptance-test.json" - }, - { - "path": "tests/unit/test__helpers.py" - }, - { - "path": "tests/unit/test_batch.py" - }, - { - "path": "tests/unit/test_client.py" - }, - { - "path": "tests/unit/test_database.py" - }, - { - "path": "tests/unit/test_instance.py" - }, - { - "path": "tests/unit/test_keyset.py" - }, - { - "path": "tests/unit/test_param_types.py" - }, - { - "path": "tests/unit/test_pool.py" - }, - { - "path": "tests/unit/test_session.py" - }, - { - "path": "tests/unit/test_snapshot.py" - }, - { - "path": "tests/unit/test_streamed.py" - }, - { - "path": "tests/unit/test_transaction.py" - } ] } \ No newline at end of file From 5a137475ff51a0359e43169977c13ee1cbd0b282 Mon Sep 17 00:00:00 2001 From: Chris Wilcox Date: Fri, 31 Jan 2020 21:46:57 +0000 Subject: [PATCH 09/12] fix: add test_utils --- test_utils/credentials.json.enc | 49 ++++ .../scripts/circleci/get_tagged_package.py | 64 +++++ test_utils/scripts/circleci/twine_upload.sh | 36 +++ test_utils/scripts/get_target_packages.py | 268 ++++++++++++++++++ .../scripts/get_target_packages_kokoro.py | 98 +++++++ test_utils/scripts/run_emulator.py | 199 +++++++++++++ test_utils/scripts/update_docs.sh | 93 ++++++ test_utils/setup.py | 64 +++++ test_utils/test_utils/__init__.py | 0 test_utils/test_utils/imports.py | 38 +++ test_utils/test_utils/retry.py | 207 ++++++++++++++ test_utils/test_utils/system.py | 81 ++++++ 12 files changed, 1197 insertions(+) create mode 100644 test_utils/credentials.json.enc create mode 100644 test_utils/scripts/circleci/get_tagged_package.py create mode 100755 test_utils/scripts/circleci/twine_upload.sh create mode 100644 test_utils/scripts/get_target_packages.py create mode 100644 test_utils/scripts/get_target_packages_kokoro.py create mode 100644 test_utils/scripts/run_emulator.py create mode 100755 test_utils/scripts/update_docs.sh create mode 100644 test_utils/setup.py create mode 100644 test_utils/test_utils/__init__.py create mode 100644 test_utils/test_utils/imports.py create mode 100644 test_utils/test_utils/retry.py create mode 100644 test_utils/test_utils/system.py diff --git a/test_utils/credentials.json.enc b/test_utils/credentials.json.enc new file mode 100644 index 0000000000..f073c7e4f7 --- /dev/null +++ b/test_utils/credentials.json.enc @@ -0,0 +1,49 @@ +U2FsdGVkX1/vVm/dOEg1DCACYbdOcL+ey6+64A+DZGZVgF8Z/3skK6rpPocu6GOA +UZAqASsBH9QifDf8cKVXQXVYpYq6HSv2O0w7vOmVorZO9GYPo98s9/8XO+4ty/AU +aB6TD68frBAYv4cT/l5m7aYdzfzMTy0EOXoleZT09JYP3B5FV3KCO114FzMXGwrj +HXsR6E5SyUUlUnWPC3eD3aqmovay0gxOKYO3ZwjFK1nlbN/8q6/8nwBCf/Bg6SHV +V93pNxdolRlJev9kgKz4RN1z4jGCy5PAndhSLE82NFIs9LoAiEOU5YeMlN+Ulqus +J92nh+ptUe9a4pJGbAuveUWO7zdS1QyXvTMUcmmSfXCNm/eIQjNuu5+rHtIjWKh8 +Ilwj2w1aTfSptQEhk/kwRgFz/d11vfwJzvwTmCxO6zyOeL0VUWLqdCBGgG5As9He +/RenF8PZ1O0WbTt7fns5oTlTk/MUo+0xJ1xqvu/y45LaqqcBAnEdrWKmtM3dJHWv +ufQku+kD+83F/VwBnQdvgMHu6KZEs6LRrNo58r4QuK6fS7VCACdzxID1RM2cL7kT +6BFRlyGj1aigmjne9g9M9Jx4R+mZDpPU1WDzzG71J4qCUwaX8Dfwutuv4uiFvzwq +NUF0wLJJPtKWmtW+hnZ/fhHQGCRsOpZzFnqp6Zv7J7k6esqxMgIjfal7Djk5Acy8 +j3iVvm6CYmKMVqzL62JHYS9Ye83tzBCaR8hpnJQKgH3FSOFY8HSwrtQSIsl/hSeF +41sgnz0Y+/gkzNeU18qFk+eCZmvljyu+JK0nPYUgpOCJYVBNQpNHz5PUyiAEKhtM +IOSdjPRW1Y+Xf4RroJnLPoF24Ijwrow5LCm9hBRY6TPPMMmnIXCd23xcLJ1rMj6g +x4ZikElans+cwuc9wtbb7w01DcpTwQ1+eIV1qV+KIgpnLjRGLhZD4etobBsrwYu/ +vnIwy2QHCKENPb8sbdgp7x2mF7VSX0/7tf+9+i70EBiMzpOKBkiZhtLzm6hOBkEy +ODaWrx4lTTwbSw8Rmtf58APhPFMsjHoNsjiUoK249Y8Y2Ff4fMfqYsXu6VC1n/At +CuWYHc3EfBwFcLJS+RQB9kFk/4FygFBWq4Kj0MqoRruLbKmoGeJKH9q35W0f0NCD +j+iHt3014kMGiuyJe1UDQ6fvEihFFdHuDivFpPAXDt4PTY/WtpDhaGMx23kb54pK +jkAuxpznAB1lK3u9bGRXDasGeHIrNtIlPvgkrWHXvoBVqM7zry8TGtoxp3E3I42Z +cUfDWfB9GqVdrOwvrTzyZsl2uShRkAJaZFZj5aMyYxiptp4gM8CwWiNtOd2EwtRO +LxZX4M02PQFIqXV3FSDA0q6EwglUrTZdAlYeOEkopaKCtG31dEPOSQG3NGJAEYso +Cxm99H7970dp0OAgpNSgRbcWDbhVbQXnRzvFGqLeH6a9dQ/a8uD3s8Qm9Du/kB6d +XxTRe2OGxzcD0AgI8GClE4rIZHCLbcwuJRp0EYcN+pgY80O4U98fZ5RYpU6OYbU/ +MEiaBYFKtZtGkV6AQD568V7hHJWqc5DDfVHUQ/aeQwnKi2vnU66u+nnV2rZxXxLP ++dqeLRpul+wKa5b/Z5SfQ14Ff8s7aVyxaogGpyggyPL1vyq4KWZ6Or/wEE5hgNO4 +kBh6ht0QT1Hti8XY2JK1M+Jgbjgcg4jkHBGVqegrG1Rvcc2A4TYKwx+QMSBhyxrU +5qhROjS4lTcC42hQslMUkUwc4U/Y91XdFbOOnaAkwzI36NRYL0pmgZnYxGJZeRvr +E5foOhnOEVSFGdOkLfFh+FkWZQf56Lmn8Gg2wHE3dZTxLHibiUYfkgOr1uEosq29 +D1NstvlJURPQ0Q+8QQNWcl9nEZHMAjOmnL1hbx+QfuC6seucp+sXGzdZByMLZbvT +tG8KNL293CmyQowgf9MXToWYnwRkcvqfTaKyor2Ggze3JtoFW4t0j4DI1XPciZFX +XmfApHrzdB/bZadzxyaZ2NE0CuH9zDelwI6rz38xsN5liYnp5qmNKVCZVOHccXa6 +J8x365m5/VaaA2RrtdPqKxn8VaKy7+T690QgMXVGM4PbzQzQxHuSleklocqlP+sB +jSMXCZY+ng/i4UmRO9noiyW3UThYh0hIdMYs12EmmI9cnF/OuYZpl30fmqwV+VNM +td5B2fYvAvvsjiX60SFCn3DATP1GrPMBlZSmhhP3GYS+xrWt3Xxta9qIX2BEF1Gg +twnZZRjoULSRFUYPfJPEOfEH2UQwm84wxx/GezVE+S/RpBlatPOgCiLnNNaLfdTC +mTG9qY9elJv3GGQO8Lqgf4i8blExs05lSPk1BDhzTB6H9TLz+Ge0/l1QxKf3gPXU +aImK1azieXMXHECkdKxrzmehwu1dZ/oYOLc/OFQCETwSRoLPFOFpYUpizwmVVHR6 +uLSfRptte4ZOU3zHfpd/0+J4tkwHwEkGzsmMdqudlm7qME6upuIplyVBH8JiXzUK +n1RIH/OPmVEluAnexWRLZNdk7MrakIO4XACVbICENiYQgAIErP568An6twWEGDbZ +bEN64E3cVDTDRPRAunIhhsEaapcxpFEPWlHorxv36nMUt0R0h0bJlCu5QdzckfcX +ZrRuu1kl76ZfbSE8T0G4/rBb9gsU4Gn3WyvLIO3MgFBuxR68ZwcR8LpEUd8qp38H +NG4cxPmN1nGKo663Z+xI2Gt5up4gpl+fOt4mXqxY386rB7yHaOfElMG5TUYdrS9w +1xbbCVgeJ6zxX+NFlndG33cSAPprhw+C18eUu6ZU63WZcYFo3GfK6rs3lvYtofvE +8DxztdTidQedNVNE+63YCjhxd/cZUI5n/UpgYkr9owp7hNGJiR3tdoNLR2gcoGqL +qWhH928k2aSgF2j97LZ2OqoPCp0tUB7ho4jD2u4Ik3GLVNlCc3dCvWRvpHtDTQDv +tujESMfHUc9I2r4S/PD3bku/ABGwa977Yp1PjzJGr9RajA5is5n6GVpyynwjtKG4 +iyyITpdwpCgr8pueTBLwZnas3slmiMOog/E4PmPgctHzvC+vhQijhUtw5zSsmv0l +bZlw/mVhp5Ta7dTcLBKR8DA3m3vTbaEGkz0xpfQr7GfiSMRbJyvIw88pDK0gyTMD diff --git a/test_utils/scripts/circleci/get_tagged_package.py b/test_utils/scripts/circleci/get_tagged_package.py new file mode 100644 index 0000000000..c148b9dc23 --- /dev/null +++ b/test_utils/scripts/circleci/get_tagged_package.py @@ -0,0 +1,64 @@ +# Copyright 2016 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Helper to determine package from tag. +Get the current package directory corresponding to the Circle Tag. +""" + +from __future__ import print_function + +import os +import re +import sys + + +TAG_RE = re.compile(r""" + ^ + (?P + (([a-z]+)[_-])*) # pkg-name-with-hyphens-or-underscores (empty allowed) + ([0-9]+)\.([0-9]+)\.([0-9]+) # Version x.y.z (x, y, z all ints) + $ +""", re.VERBOSE) +TAG_ENV = 'CIRCLE_TAG' +ERROR_MSG = '%s env. var. not set' % (TAG_ENV,) +BAD_TAG_MSG = 'Invalid tag name: %s. Expected pkg-name-x.y.z' +CIRCLE_CI_SCRIPTS_DIR = os.path.dirname(__file__) +ROOT_DIR = os.path.realpath( + os.path.join(CIRCLE_CI_SCRIPTS_DIR, '..', '..', '..')) + + +def main(): + """Get the current package directory. + Prints the package directory out so callers can consume it. + """ + if TAG_ENV not in os.environ: + print(ERROR_MSG, file=sys.stderr) + sys.exit(1) + + tag_name = os.environ[TAG_ENV] + match = TAG_RE.match(tag_name) + if match is None: + print(BAD_TAG_MSG % (tag_name,), file=sys.stderr) + sys.exit(1) + + pkg_name = match.group('pkg') + if pkg_name is None: + print(ROOT_DIR) + else: + pkg_dir = pkg_name.rstrip('-').replace('-', '_') + print(os.path.join(ROOT_DIR, pkg_dir)) + + +if __name__ == '__main__': + main() diff --git a/test_utils/scripts/circleci/twine_upload.sh b/test_utils/scripts/circleci/twine_upload.sh new file mode 100755 index 0000000000..23a4738e90 --- /dev/null +++ b/test_utils/scripts/circleci/twine_upload.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Copyright 2016 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -ev + +# If this is not a CircleCI tag, no-op. +if [[ -z "$CIRCLE_TAG" ]]; then + echo "This is not a release tag. Doing nothing." + exit 0 +fi + +# H/T: http://stackoverflow.com/a/246128/1068170 +SCRIPT="$(dirname "${BASH_SOURCE[0]}")/get_tagged_package.py" +# Determine the package directory being deploying on this tag. +PKG_DIR="$(python ${SCRIPT})" + +# Ensure that we have the latest versions of Twine, Wheel, and Setuptools. +python3 -m pip install --upgrade twine wheel setuptools + +# Move into the package, build the distribution and upload. +cd ${PKG_DIR} +python3 setup.py sdist bdist_wheel +twine upload dist/* diff --git a/test_utils/scripts/get_target_packages.py b/test_utils/scripts/get_target_packages.py new file mode 100644 index 0000000000..1d51830cc2 --- /dev/null +++ b/test_utils/scripts/get_target_packages.py @@ -0,0 +1,268 @@ +# Copyright 2017 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Print a list of packages which require testing.""" + +import os +import re +import subprocess +import warnings + + +CURRENT_DIR = os.path.realpath(os.path.dirname(__file__)) +BASE_DIR = os.path.realpath(os.path.join(CURRENT_DIR, '..', '..')) +GITHUB_REPO = os.environ.get('GITHUB_REPO', 'google-cloud-python') +CI = os.environ.get('CI', '') +CI_BRANCH = os.environ.get('CIRCLE_BRANCH') +CI_PR = os.environ.get('CIRCLE_PR_NUMBER') +CIRCLE_TAG = os.environ.get('CIRCLE_TAG') +head_hash, head_name = subprocess.check_output(['git', 'show-ref', 'HEAD'] +).strip().decode('ascii').split() +rev_parse = subprocess.check_output( + ['git', 'rev-parse', '--abbrev-ref', 'HEAD'] +).strip().decode('ascii') +MAJOR_DIV = '#' * 78 +MINOR_DIV = '#' + '-' * 77 + +# NOTE: This reg-ex is copied from ``get_tagged_packages``. +TAG_RE = re.compile(r""" + ^ + (?P + (([a-z]+)-)*) # pkg-name-with-hyphens- (empty allowed) + ([0-9]+)\.([0-9]+)\.([0-9]+) # Version x.y.z (x, y, z all ints) + $ +""", re.VERBOSE) + +# This is the current set of dependencies by package. +# As of this writing, the only "real" dependency is that of error_reporting +# (on logging), the rest are just system test dependencies. +PKG_DEPENDENCIES = { + 'logging': {'pubsub'}, +} + + +def get_baseline(): + """Return the baseline commit. + + On a pull request, or on a branch, return the common parent revision + with the master branch. + + Locally, return a value pulled from environment variables, or None if + the environment variables are not set. + + On a push to master, return None. This will effectively cause everything + to be considered to be affected. + """ + + # If this is a pull request or branch, return the tip for master. + # We will test only packages which have changed since that point. + ci_non_master = (CI == 'true') and any([CI_BRANCH != 'master', CI_PR]) + + if ci_non_master: + + repo_url = 'git@github.com:GoogleCloudPlatform/{}'.format(GITHUB_REPO) + subprocess.run(['git', 'remote', 'add', 'baseline', repo_url], + stderr=subprocess.DEVNULL) + subprocess.run(['git', 'pull', 'baseline'], stderr=subprocess.DEVNULL) + + if CI_PR is None and CI_BRANCH is not None: + output = subprocess.check_output([ + 'git', 'merge-base', '--fork-point', + 'baseline/master', CI_BRANCH]) + return output.strip().decode('ascii') + + return 'baseline/master' + + # If environment variables are set identifying what the master tip is, + # use that. + if os.environ.get('GOOGLE_CLOUD_TESTING_REMOTE', ''): + remote = os.environ['GOOGLE_CLOUD_TESTING_REMOTE'] + branch = os.environ.get('GOOGLE_CLOUD_TESTING_BRANCH', 'master') + return '%s/%s' % (remote, branch) + + # If we are not in CI and we got this far, issue a warning. + if not CI: + warnings.warn('No baseline could be determined; this means tests ' + 'will run for every package. If this is local ' + 'development, set the $GOOGLE_CLOUD_TESTING_REMOTE ' + 'environment variable.') + + # That is all we can do; return None. + return None + + +def get_changed_files(): + """Return a list of files that have been changed since the baseline. + + If there is no base, return None. + """ + # Get the baseline, and fail quickly if there is no baseline. + baseline = get_baseline() + print('# Baseline commit: {}'.format(baseline)) + if not baseline: + return None + + # Return a list of altered files. + try: + return subprocess.check_output([ + 'git', 'diff', '--name-only', '{}..HEAD'.format(baseline), + ], stderr=subprocess.DEVNULL).decode('utf8').strip().split('\n') + except subprocess.CalledProcessError: + warnings.warn('Unable to perform git diff; falling back to assuming ' + 'all packages have changed.') + return None + + +def reverse_map(dict_of_sets): + """Reverse a map of one-to-many. + + So the map:: + + { + 'A': {'B', 'C'}, + 'B': {'C'}, + } + + becomes + + { + 'B': {'A'}, + 'C': {'A', 'B'}, + } + + Args: + dict_of_sets (dict[set]): A dictionary of sets, mapping + one value to many. + + Returns: + dict[set]: The reversed map. + """ + result = {} + for key, values in dict_of_sets.items(): + for value in values: + result.setdefault(value, set()).add(key) + + return result + +def get_changed_packages(file_list): + """Return a list of changed packages based on the provided file list. + + If the file list is None, then all packages should be considered to be + altered. + """ + # Determine a complete list of packages. + all_packages = set() + for file_ in os.listdir(BASE_DIR): + abs_file = os.path.realpath(os.path.join(BASE_DIR, file_)) + nox_file = os.path.join(abs_file, 'nox.py') + if os.path.isdir(abs_file) and os.path.isfile(nox_file): + all_packages.add(file_) + + # If ther is no file list, send down the full package set. + if file_list is None: + return all_packages + + # Create a set based on the list of changed files. + answer = set() + reverse_deps = reverse_map(PKG_DEPENDENCIES) + for file_ in file_list: + # Ignore root directory changes (setup.py, .gitignore, etc.). + if os.path.sep not in file_: + continue + + # Ignore changes that are not in a package (usually this will be docs). + package = file_.split(os.path.sep, 1)[0] + if package not in all_packages: + continue + + # If there is a change in core, short-circuit now and return + # everything. + if package in ('core',): + return all_packages + + # Add the package, as well as any dependencies this package has. + # NOTE: For now, dependencies only go down one level. + answer.add(package) + answer = answer.union(reverse_deps.get(package, set())) + + # We got this far without being short-circuited; return the final answer. + return answer + + +def get_tagged_package(): + """Return the package corresponding to the current tag. + + If there is not tag, will return :data:`None`. + """ + if CIRCLE_TAG is None: + return + + match = TAG_RE.match(CIRCLE_TAG) + if match is None: + return + + pkg_name = match.group('pkg') + if pkg_name == '': + # NOTE: This corresponds to the "umbrella" tag. + return + + return pkg_name.rstrip('-').replace('-', '_') + + +def get_target_packages(): + """Return a list of target packages to be run in the current build. + + If in a tag build, will run only the package(s) that are tagged, otherwise + will run the packages that have file changes in them (or packages that + depend on those). + """ + tagged_package = get_tagged_package() + if tagged_package is None: + file_list = get_changed_files() + print(MAJOR_DIV) + print('# Changed files:') + print(MINOR_DIV) + for file_ in file_list or (): + print('# {}'.format(file_)) + for package in sorted(get_changed_packages(file_list)): + yield package + else: + yield tagged_package + + +def main(): + print(MAJOR_DIV) + print('# Environment') + print(MINOR_DIV) + print('# CircleCI: {}'.format(CI)) + print('# CircleCI branch: {}'.format(CI_BRANCH)) + print('# CircleCI pr: {}'.format(CI_PR)) + print('# CircleCI tag: {}'.format(CIRCLE_TAG)) + print('# HEAD ref: {}'.format(head_hash)) + print('# {}'.format(head_name)) + print('# Git branch: {}'.format(rev_parse)) + print(MAJOR_DIV) + + packages = list(get_target_packages()) + + print(MAJOR_DIV) + print('# Target packages:') + print(MINOR_DIV) + for package in packages: + print(package) + print(MAJOR_DIV) + + +if __name__ == '__main__': + main() diff --git a/test_utils/scripts/get_target_packages_kokoro.py b/test_utils/scripts/get_target_packages_kokoro.py new file mode 100644 index 0000000000..27d3a0c940 --- /dev/null +++ b/test_utils/scripts/get_target_packages_kokoro.py @@ -0,0 +1,98 @@ +# Copyright 2017 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Print a list of packages which require testing.""" + +import pathlib +import subprocess + +import ci_diff_helper +import requests + + +def print_environment(environment): + print("-> CI environment:") + print('Branch', environment.branch) + print('PR', environment.pr) + print('In PR', environment.in_pr) + print('Repo URL', environment.repo_url) + if environment.in_pr: + print('PR Base', environment.base) + + +def get_base(environment): + if environment.in_pr: + return environment.base + else: + # If we're not in a PR, just calculate the changes between this commit + # and its parent. + return 'HEAD~1' + + +def get_changed_files_from_base(base): + return subprocess.check_output([ + 'git', 'diff', '--name-only', f'{base}..HEAD', + ], stderr=subprocess.DEVNULL).decode('utf8').strip().split('\n') + + +_URL_TEMPLATE = ( + 'https://api.github.com/repos/googleapis/google-cloud-python/pulls/' + '{}/files' +) + + +def get_changed_files_from_pr(pr): + url = _URL_TEMPLATE.format(pr) + while url is not None: + response = requests.get(url) + for info in response.json(): + yield info['filename'] + url = response.links.get('next', {}).get('url') + + +def determine_changed_packages(changed_files): + packages = [ + path.parent for path in pathlib.Path('.').glob('*/noxfile.py') + ] + + changed_packages = set() + for file in changed_files: + file = pathlib.Path(file) + for package in packages: + if package in file.parents: + changed_packages.add(package) + + return changed_packages + + +def main(): + environment = ci_diff_helper.get_config() + print_environment(environment) + base = get_base(environment) + + if environment.in_pr: + changed_files = list(get_changed_files_from_pr(environment.pr)) + else: + changed_files = get_changed_files_from_base(base) + + packages = determine_changed_packages(changed_files) + + print(f"Comparing against {base}.") + print("-> Changed packages:") + + for package in packages: + print(package) + + +main() diff --git a/test_utils/scripts/run_emulator.py b/test_utils/scripts/run_emulator.py new file mode 100644 index 0000000000..287b086406 --- /dev/null +++ b/test_utils/scripts/run_emulator.py @@ -0,0 +1,199 @@ +# Copyright 2016 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Run system tests locally with the emulator. + +First makes system calls to spawn the emulator and get the local environment +variable needed for it. Then calls the system tests. +""" + + +import argparse +import os +import subprocess + +import psutil + +from google.cloud.environment_vars import BIGTABLE_EMULATOR +from google.cloud.environment_vars import GCD_DATASET +from google.cloud.environment_vars import GCD_HOST +from google.cloud.environment_vars import PUBSUB_EMULATOR +from run_system_test import run_module_tests + + +BIGTABLE = 'bigtable' +DATASTORE = 'datastore' +PUBSUB = 'pubsub' +PACKAGE_INFO = { + BIGTABLE: (BIGTABLE_EMULATOR,), + DATASTORE: (GCD_DATASET, GCD_HOST), + PUBSUB: (PUBSUB_EMULATOR,), +} +EXTRA = { + DATASTORE: ('--no-legacy',), +} +_DS_READY_LINE = '[datastore] Dev App Server is now running.\n' +_PS_READY_LINE_PREFIX = '[pubsub] INFO: Server started, listening on ' +_BT_READY_LINE_PREFIX = '[bigtable] Cloud Bigtable emulator running on ' + + +def get_parser(): + """Get simple ``argparse`` parser to determine package. + + :rtype: :class:`argparse.ArgumentParser` + :returns: The parser for this script. + """ + parser = argparse.ArgumentParser( + description='Run google-cloud system tests against local emulator.') + parser.add_argument('--package', dest='package', + choices=sorted(PACKAGE_INFO.keys()), + default=DATASTORE, help='Package to be tested.') + return parser + + +def get_start_command(package): + """Get command line arguments for starting emulator. + + :type package: str + :param package: The package to start an emulator for. + + :rtype: tuple + :returns: The arguments to be used, in a tuple. + """ + result = ('gcloud', 'beta', 'emulators', package, 'start') + extra = EXTRA.get(package, ()) + return result + extra + + +def get_env_init_command(package): + """Get command line arguments for getting emulator env. info. + + :type package: str + :param package: The package to get environment info for. + + :rtype: tuple + :returns: The arguments to be used, in a tuple. + """ + result = ('gcloud', 'beta', 'emulators', package, 'env-init') + extra = EXTRA.get(package, ()) + return result + extra + + +def datastore_wait_ready(popen): + """Wait until the datastore emulator is ready to use. + + :type popen: :class:`subprocess.Popen` + :param popen: An open subprocess to interact with. + """ + emulator_ready = False + while not emulator_ready: + emulator_ready = popen.stderr.readline() == _DS_READY_LINE + + +def wait_ready_prefix(popen, prefix): + """Wait until the a process encounters a line with matching prefix. + + :type popen: :class:`subprocess.Popen` + :param popen: An open subprocess to interact with. + + :type prefix: str + :param prefix: The prefix to match + """ + emulator_ready = False + while not emulator_ready: + emulator_ready = popen.stderr.readline().startswith(prefix) + + +def wait_ready(package, popen): + """Wait until the emulator is ready to use. + + :type package: str + :param package: The package to check if ready. + + :type popen: :class:`subprocess.Popen` + :param popen: An open subprocess to interact with. + + :raises: :class:`KeyError` if the ``package`` is not among + ``datastore``, ``pubsub`` or ``bigtable``. + """ + if package == DATASTORE: + datastore_wait_ready(popen) + elif package == PUBSUB: + wait_ready_prefix(popen, _PS_READY_LINE_PREFIX) + elif package == BIGTABLE: + wait_ready_prefix(popen, _BT_READY_LINE_PREFIX) + else: + raise KeyError('Package not supported', package) + + +def cleanup(pid): + """Cleanup a process (including all of its children). + + :type pid: int + :param pid: Process ID. + """ + proc = psutil.Process(pid) + for child_proc in proc.children(recursive=True): + try: + child_proc.kill() + child_proc.terminate() + except psutil.NoSuchProcess: + pass + proc.terminate() + proc.kill() + + +def run_tests_in_emulator(package): + """Spawn an emulator instance and run the system tests. + + :type package: str + :param package: The package to run system tests against. + """ + # Make sure this package has environment vars to replace. + env_vars = PACKAGE_INFO[package] + + start_command = get_start_command(package) + # Ignore stdin and stdout, don't pollute the user's output with them. + proc_start = subprocess.Popen(start_command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + try: + wait_ready(package, proc_start) + env_init_command = get_env_init_command(package) + proc_env = subprocess.Popen(env_init_command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + env_status = proc_env.wait() + if env_status != 0: + raise RuntimeError(env_status, proc_env.stderr.read()) + env_lines = proc_env.stdout.read().strip().split('\n') + # Set environment variables before running the system tests. + for env_var in env_vars: + line_prefix = 'export ' + env_var + '=' + value, = [line.split(line_prefix, 1)[1] for line in env_lines + if line.startswith(line_prefix)] + os.environ[env_var] = value + run_module_tests(package, + ignore_requirements=True) + finally: + cleanup(proc_start.pid) + + +def main(): + """Main method to run this script.""" + parser = get_parser() + args = parser.parse_args() + run_tests_in_emulator(args.package) + + +if __name__ == '__main__': + main() diff --git a/test_utils/scripts/update_docs.sh b/test_utils/scripts/update_docs.sh new file mode 100755 index 0000000000..8cbab9f0da --- /dev/null +++ b/test_utils/scripts/update_docs.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# Copyright 2016 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -ev + +GH_OWNER='GoogleCloudPlatform' +GH_PROJECT_NAME='google-cloud-python' + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Function to build the docs. +function build_docs { + rm -rf docs/_build/ + rm -f docs/bigquery/generated/*.rst + # -W -> warnings as errors + # -T -> show full traceback on exception + # -N -> no color + sphinx-build \ + -W -T -N \ + -b html \ + -d docs/_build/doctrees \ + docs/ \ + docs/_build/html/ + return $? +} + +# Only update docs if we are on CircleCI. +if [[ "${CIRCLE_BRANCH}" == "master" ]] && [[ -z "${CIRCLE_PR_NUMBER}" ]]; then + echo "Building new docs on a merged commit." +elif [[ "$1" == "kokoro" ]]; then + echo "Building and publishing docs on Kokoro." +elif [[ -n "${CIRCLE_TAG}" ]]; then + echo "Building new docs on a tag (but will not deploy)." + build_docs + exit $? +else + echo "Not on master nor a release tag." + echo "Building new docs for testing purposes, but not deploying." + build_docs + exit $? +fi + +# Adding GitHub pages branch. `git submodule add` checks it +# out at HEAD. +GH_PAGES_DIR='ghpages' +git submodule add -q -b gh-pages \ + "git@github.com:${GH_OWNER}/${GH_PROJECT_NAME}" ${GH_PAGES_DIR} + +# Determine if we are building a new tag or are building docs +# for master. Then build new docs in docs/_build from master. +if [[ -n "${CIRCLE_TAG}" ]]; then + # Sphinx will use the package version by default. + build_docs +else + SPHINX_RELEASE=$(git log -1 --pretty=%h) build_docs +fi + +# Update gh-pages with the created docs. +cd ${GH_PAGES_DIR} +git rm -fr latest/ +cp -R ../docs/_build/html/ latest/ + +# Update the files push to gh-pages. +git add . +git status + +# If there are no changes, just exit cleanly. +if [[ -z "$(git status --porcelain)" ]]; then + echo "Nothing to commit. Exiting without pushing changes." + exit +fi + +# Commit to gh-pages branch to apply changes. +git config --global user.email "dpebot@google.com" +git config --global user.name "dpebot" +git commit -m "Update docs after merge to master." + +# NOTE: This may fail if two docs updates (on merges to master) +# happen in close proximity. +git push -q origin HEAD:gh-pages diff --git a/test_utils/setup.py b/test_utils/setup.py new file mode 100644 index 0000000000..8e9222a7f8 --- /dev/null +++ b/test_utils/setup.py @@ -0,0 +1,64 @@ +# Copyright 2017 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from setuptools import find_packages +from setuptools import setup + + +PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__)) + + +# NOTE: This is duplicated throughout and we should try to +# consolidate. +SETUP_BASE = { + 'author': 'Google Cloud Platform', + 'author_email': 'googleapis-publisher@google.com', + 'scripts': [], + 'url': 'https://github.com/GoogleCloudPlatform/google-cloud-python', + 'license': 'Apache 2.0', + 'platforms': 'Posix; MacOS X; Windows', + 'include_package_data': True, + 'zip_safe': False, + 'classifiers': [ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Topic :: Internet', + ], +} + + +REQUIREMENTS = [ + 'google-auth >= 0.4.0', + 'six', +] + +setup( + name='google-cloud-testutils', + version='0.24.0', + description='System test utilities for google-cloud-python', + packages=find_packages(), + install_requires=REQUIREMENTS, + python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*', + **SETUP_BASE +) diff --git a/test_utils/test_utils/__init__.py b/test_utils/test_utils/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test_utils/test_utils/imports.py b/test_utils/test_utils/imports.py new file mode 100644 index 0000000000..5991af7fc4 --- /dev/null +++ b/test_utils/test_utils/imports.py @@ -0,0 +1,38 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import mock +import six + + +def maybe_fail_import(predicate): + """Create and return a patcher that conditionally makes an import fail. + + Args: + predicate (Callable[[...], bool]): A callable that, if it returns `True`, + triggers an `ImportError`. It must accept the same arguments as the + built-in `__import__` function. + https://docs.python.org/3/library/functions.html#__import__ + + Returns: + A mock patcher object that can be used to enable patched import behavior. + """ + orig_import = six.moves.builtins.__import__ + + def custom_import(name, globals=None, locals=None, fromlist=(), level=0): + if predicate(name, globals, locals, fromlist, level): + raise ImportError + return orig_import(name, globals, locals, fromlist, level) + + return mock.patch.object(six.moves.builtins, "__import__", new=custom_import) diff --git a/test_utils/test_utils/retry.py b/test_utils/test_utils/retry.py new file mode 100644 index 0000000000..e61c001a03 --- /dev/null +++ b/test_utils/test_utils/retry.py @@ -0,0 +1,207 @@ +# Copyright 2016 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import time +from functools import wraps + +import six + +MAX_TRIES = 4 +DELAY = 1 +BACKOFF = 2 + + +def _retry_all(_): + """Retry all caught exceptions.""" + return True + + +class BackoffFailed(Exception): + """Retry w/ backoffs did not complete successfully.""" + + +class RetryBase(object): + """Base for retrying calling a decorated function w/ exponential backoff. + + :type max_tries: int + :param max_tries: Number of times to try (not retry) before giving up. + + :type delay: int + :param delay: Initial delay between retries in seconds. + + :type backoff: int + :param backoff: Backoff multiplier e.g. value of 2 will double the + delay each retry. + + :type logger: logging.Logger instance + :param logger: Logger to use. If None, print. + """ + def __init__(self, max_tries=MAX_TRIES, delay=DELAY, backoff=BACKOFF, + logger=None): + self.max_tries = max_tries + self.delay = delay + self.backoff = backoff + self.logger = logger.warning if logger else six.print_ + + +class RetryErrors(RetryBase): + """Decorator for retrying given exceptions in testing. + + :type exception: Exception or tuple of Exceptions + :param exception: The exception to check or may be a tuple of + exceptions to check. + + :type error_predicate: function, takes caught exception, returns bool + :param error_predicate: Predicate evaluating whether to retry after a + caught exception. + + :type max_tries: int + :param max_tries: Number of times to try (not retry) before giving up. + + :type delay: int + :param delay: Initial delay between retries in seconds. + + :type backoff: int + :param backoff: Backoff multiplier e.g. value of 2 will double the + delay each retry. + + :type logger: logging.Logger instance + :param logger: Logger to use. If None, print. + """ + def __init__(self, exception, error_predicate=_retry_all, + max_tries=MAX_TRIES, delay=DELAY, backoff=BACKOFF, + logger=None): + super(RetryErrors, self).__init__(max_tries, delay, backoff, logger) + self.exception = exception + self.error_predicate = error_predicate + + def __call__(self, to_wrap): + @wraps(to_wrap) + def wrapped_function(*args, **kwargs): + tries = 0 + while tries < self.max_tries: + try: + return to_wrap(*args, **kwargs) + except self.exception as caught_exception: + + if not self.error_predicate(caught_exception): + raise + + delay = self.delay * self.backoff**tries + msg = ("%s, Trying again in %d seconds..." % + (caught_exception, delay)) + self.logger(msg) + + time.sleep(delay) + tries += 1 + return to_wrap(*args, **kwargs) + + return wrapped_function + + +class RetryResult(RetryBase): + """Decorator for retrying based on non-error result. + + :type result_predicate: function, takes result, returns bool + :param result_predicate: Predicate evaluating whether to retry after a + result is returned. + + :type max_tries: int + :param max_tries: Number of times to try (not retry) before giving up. + + :type delay: int + :param delay: Initial delay between retries in seconds. + + :type backoff: int + :param backoff: Backoff multiplier e.g. value of 2 will double the + delay each retry. + + :type logger: logging.Logger instance + :param logger: Logger to use. If None, print. + """ + def __init__(self, result_predicate, + max_tries=MAX_TRIES, delay=DELAY, backoff=BACKOFF, + logger=None): + super(RetryResult, self).__init__(max_tries, delay, backoff, logger) + self.result_predicate = result_predicate + + def __call__(self, to_wrap): + @wraps(to_wrap) + def wrapped_function(*args, **kwargs): + tries = 0 + while tries < self.max_tries: + result = to_wrap(*args, **kwargs) + if self.result_predicate(result): + return result + + delay = self.delay * self.backoff**tries + msg = "%s. Trying again in %d seconds..." % ( + self.result_predicate.__name__, delay,) + self.logger(msg) + + time.sleep(delay) + tries += 1 + raise BackoffFailed() + + return wrapped_function + + +class RetryInstanceState(RetryBase): + """Decorator for retrying based on instance state. + + :type instance_predicate: function, takes instance, returns bool + :param instance_predicate: Predicate evaluating whether to retry after an + API-invoking method is called. + + :type max_tries: int + :param max_tries: Number of times to try (not retry) before giving up. + + :type delay: int + :param delay: Initial delay between retries in seconds. + + :type backoff: int + :param backoff: Backoff multiplier e.g. value of 2 will double the + delay each retry. + + :type logger: logging.Logger instance + :param logger: Logger to use. If None, print. + """ + def __init__(self, instance_predicate, + max_tries=MAX_TRIES, delay=DELAY, backoff=BACKOFF, + logger=None): + super(RetryInstanceState, self).__init__( + max_tries, delay, backoff, logger) + self.instance_predicate = instance_predicate + + def __call__(self, to_wrap): + instance = to_wrap.__self__ # only instance methods allowed + + @wraps(to_wrap) + def wrapped_function(*args, **kwargs): + tries = 0 + while tries < self.max_tries: + result = to_wrap(*args, **kwargs) + if self.instance_predicate(instance): + return result + + delay = self.delay * self.backoff**tries + msg = "%s. Trying again in %d seconds..." % ( + self.instance_predicate.__name__, delay,) + self.logger(msg) + + time.sleep(delay) + tries += 1 + raise BackoffFailed() + + return wrapped_function diff --git a/test_utils/test_utils/system.py b/test_utils/test_utils/system.py new file mode 100644 index 0000000000..590dc62a06 --- /dev/null +++ b/test_utils/test_utils/system.py @@ -0,0 +1,81 @@ +# Copyright 2014 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function +import os +import sys +import time + +import google.auth.credentials +from google.auth.environment_vars import CREDENTIALS as TEST_CREDENTIALS + + +# From shell environ. May be None. +CREDENTIALS = os.getenv(TEST_CREDENTIALS) + +ENVIRON_ERROR_MSG = """\ +To run the system tests, you need to set some environment variables. +Please check the CONTRIBUTING guide for instructions. +""" + + +class EmulatorCreds(google.auth.credentials.Credentials): + """A mock credential object. + + Used to avoid unnecessary token refreshing or reliance on the network + while an emulator is running. + """ + + def __init__(self): # pylint: disable=super-init-not-called + self.token = b'seekrit' + self.expiry = None + + @property + def valid(self): + """Would-be validity check of the credentials. + + Always is :data:`True`. + """ + return True + + def refresh(self, unused_request): # pylint: disable=unused-argument + """Off-limits implementation for abstract method.""" + raise RuntimeError('Should never be refreshed.') + + +def check_environ(): + err_msg = None + if CREDENTIALS is None: + err_msg = '\nMissing variables: ' + TEST_CREDENTIALS + elif not os.path.isfile(CREDENTIALS): + err_msg = '\nThe %s path %r is not a file.' % (TEST_CREDENTIALS, + CREDENTIALS) + + if err_msg is not None: + msg = ENVIRON_ERROR_MSG + err_msg + print(msg, file=sys.stderr) + sys.exit(1) + + +def unique_resource_id(delimiter='_'): + """A unique identifier for a resource. + + Intended to help locate resources created in particular + testing environments and at particular times. + """ + build_id = os.getenv('CIRCLE_BUILD_NUM', '') + if build_id == '': + return '%s%d' % (delimiter, 1000 * time.time()) + else: + return '%s%s%s%d' % (delimiter, build_id, delimiter, time.time()) From f9fe89a451d548ce689961234af5817bdd4dba09 Mon Sep 17 00:00:00 2001 From: Chris Wilcox Date: Fri, 31 Jan 2020 22:04:10 +0000 Subject: [PATCH 10/12] fix: noxfile exclude --- noxfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/noxfile.py b/noxfile.py index 413e29a7d8..f47872908a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -112,6 +112,7 @@ def system(session): session.install("mock", "pytest") session.install("-e", ".") + session.install("-e", "test_utils/") # Run py.test against the system tests. if system_test_exists: From 37e83a1a0bbd4486707e87d5bfe8090ecb192271 Mon Sep 17 00:00:00 2001 From: Chris Wilcox Date: Fri, 31 Jan 2020 22:18:14 +0000 Subject: [PATCH 11/12] fix: adjust coverage --- noxfile.py | 2 +- synth.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index f47872908a..200b68e04c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -129,7 +129,7 @@ def cover(session): test runs (not system test runs), and then erases coverage data. """ session.install("coverage", "pytest-cov") - session.run("coverage", "report", "--show-missing", "--fail-under=100") + session.run("coverage", "report", "--show-missing", "--fail-under=99") session.run("coverage", "erase") diff --git a/synth.py b/synth.py index b30b82114a..df4e653e05 100644 --- a/synth.py +++ b/synth.py @@ -136,8 +136,8 @@ # ---------------------------------------------------------------------------- # Add templated files # ---------------------------------------------------------------------------- -templated_files = common.py_library(unit_cov_level=97, cov_level=100) -s.move(templated_files) +templated_files = common.py_library(unit_cov_level=97, cov_level=99) +s.move(templated_files, excludes=["noxfile.py"]) # Template's MANIFEST.in does not include the needed GAPIC config file. # See PR #6928. From 74577c7f76c7846433598d20606f11a3990635b6 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2020 11:13:42 +1100 Subject: [PATCH 12/12] chore: release 1.14.0 (#2) * updated CHANGELOG.md [ci skip] * updated setup.py [ci skip] --- CHANGELOG.md | 15 +++++++++++++++ setup.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7262e58487..7785f5672c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ [1]: https://pypi.org/project/google-cloud-spanner/#history +## [1.14.0](https://www.github.com/googleapis/python-spanner/compare/v1.13.0...v1.14.0) (2020-01-31) + + +### Features + +* **spanner:** add deprecation warnings; add field_mask to get_instance; add endpoint_uris to Instance proto; update timeouts; make mutations optional for commits (via synth) ([62edbe1](https://www.github.com/googleapis/python-spanner/commit/62edbe12a0c5a74eacb8d87ca265a19e6d27f890)) +* **spanner:** add resource based routing implementation ([#10183](https://www.github.com/googleapis/python-spanner/issues/10183)) ([e072d5d](https://www.github.com/googleapis/python-spanner/commit/e072d5dd04d58fff7f62ce19ce42e906dfd11012)) +* **spanner:** un-deprecate resource name helper functions, add 3.8 tests (via synth) ([#10062](https://www.github.com/googleapis/python-spanner/issues/10062)) ([dbb79b0](https://www.github.com/googleapis/python-spanner/commit/dbb79b0d8b0c79f6ed1772f28e4eedb9d986b108)) + + +### Bug Fixes + +* be permssive about merging an empty struct ([#10079](https://www.github.com/googleapis/python-spanner/issues/10079)) ([cfae63d](https://www.github.com/googleapis/python-spanner/commit/cfae63d5a8b8332f8875307283da6075a544c838)) +* **spanner:** fix imports for doc samples ([#10283](https://www.github.com/googleapis/python-spanner/issues/10283)) ([55a21d9](https://www.github.com/googleapis/python-spanner/commit/55a21d97d0c863cbbbb2d973b6faa4aeba8e38bb)) + ## 1.13.0 11-11-2019 15:59 PST diff --git a/setup.py b/setup.py index 6ccb0f2193..cc86f650ea 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ name = "google-cloud-spanner" description = "Cloud Spanner API client library" -version = "1.13.0" +version = "1.14.0" # Should be one of: # 'Development Status :: 3 - Alpha' # 'Development Status :: 4 - Beta'