Index: tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/extra_types.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/extra_types.py b/tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/extra_types.py |
deleted file mode 100644 |
index 68fc7160fe94bcf4f9ac130f5fec5882ea079ed3..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/apitools/apitools/base/py/extra_types.py |
+++ /dev/null |
@@ -1,294 +0,0 @@ |
-#!/usr/bin/env python |
-"""Extra types understood by apitools. |
- |
-This file will be replaced by a .proto file when we switch to proto2 |
-from protorpc. |
-""" |
- |
-import collections |
-import datetime |
-import json |
-import numbers |
- |
-from protorpc import message_types |
-from protorpc import messages |
-from protorpc import protojson |
-import six |
- |
-from apitools.base.py import encoding |
-from apitools.base.py import exceptions |
-from apitools.base.py import util |
- |
-__all__ = [ |
- 'DateField', |
- 'DateTimeMessage', |
- 'JsonArray', |
- 'JsonObject', |
- 'JsonValue', |
- 'JsonProtoEncoder', |
- 'JsonProtoDecoder', |
-] |
- |
-# We import from protorpc. |
-# pylint:disable=invalid-name |
-DateTimeMessage = message_types.DateTimeMessage |
-# pylint:enable=invalid-name |
- |
- |
-class DateField(messages.Field): |
- |
- """Field definition for Date values.""" |
- |
- # We insert our own metaclass here to avoid letting ProtoRPC |
- # register this as the default field type for strings. |
- # * since ProtoRPC does this via metaclasses, we don't have any |
- # choice but to use one ourselves |
- # * since a subclass's metaclass must inherit from its superclass's |
- # metaclass, we're forced to have this hard-to-read inheritance. |
- # |
- # pylint: disable=invalid-name |
- class __metaclass__(messages.Field.__metaclass__): |
- |
- def __init__(cls, name, bases, dct): |
- super(messages.Field.__metaclass__, cls).__init__(name, bases, dct) |
- # pylint: enable=invalid-name |
- |
- VARIANTS = frozenset([messages.Variant.STRING]) |
- DEFAULT_VARIANT = messages.Variant.STRING |
- type = datetime.date |
- |
- |
-def _ValidateJsonValue(json_value): |
- entries = [(f, json_value.get_assigned_value(f.name)) |
- for f in json_value.all_fields()] |
- assigned_entries = [(f, value) |
- for f, value in entries if value is not None] |
- if len(assigned_entries) != 1: |
- raise exceptions.InvalidDataError( |
- 'Malformed JsonValue: %s' % json_value) |
- |
- |
-def _JsonValueToPythonValue(json_value): |
- """Convert the given JsonValue to a json string.""" |
- util.Typecheck(json_value, JsonValue) |
- _ValidateJsonValue(json_value) |
- if json_value.is_null: |
- return None |
- entries = [(f, json_value.get_assigned_value(f.name)) |
- for f in json_value.all_fields()] |
- assigned_entries = [(f, value) |
- for f, value in entries if value is not None] |
- field, value = assigned_entries[0] |
- if not isinstance(field, messages.MessageField): |
- return value |
- elif field.message_type is JsonObject: |
- return _JsonObjectToPythonValue(value) |
- elif field.message_type is JsonArray: |
- return _JsonArrayToPythonValue(value) |
- |
- |
-def _JsonObjectToPythonValue(json_value): |
- util.Typecheck(json_value, JsonObject) |
- return dict([(prop.key, _JsonValueToPythonValue(prop.value)) for prop |
- in json_value.properties]) |
- |
- |
-def _JsonArrayToPythonValue(json_value): |
- util.Typecheck(json_value, JsonArray) |
- return [_JsonValueToPythonValue(e) for e in json_value.entries] |
- |
- |
-_MAXINT64 = 2 << 63 - 1 |
-_MININT64 = -(2 << 63) |
- |
- |
-def _PythonValueToJsonValue(py_value): |
- """Convert the given python value to a JsonValue.""" |
- if py_value is None: |
- return JsonValue(is_null=True) |
- if isinstance(py_value, bool): |
- return JsonValue(boolean_value=py_value) |
- if isinstance(py_value, six.string_types): |
- return JsonValue(string_value=py_value) |
- if isinstance(py_value, numbers.Number): |
- if isinstance(py_value, six.integer_types): |
- if _MININT64 < py_value < _MAXINT64: |
- return JsonValue(integer_value=py_value) |
- return JsonValue(double_value=float(py_value)) |
- if isinstance(py_value, dict): |
- return JsonValue(object_value=_PythonValueToJsonObject(py_value)) |
- if isinstance(py_value, collections.Iterable): |
- return JsonValue(array_value=_PythonValueToJsonArray(py_value)) |
- raise exceptions.InvalidDataError( |
- 'Cannot convert "%s" to JsonValue' % py_value) |
- |
- |
-def _PythonValueToJsonObject(py_value): |
- util.Typecheck(py_value, dict) |
- return JsonObject( |
- properties=[ |
- JsonObject.Property(key=key, value=_PythonValueToJsonValue(value)) |
- for key, value in py_value.items()]) |
- |
- |
-def _PythonValueToJsonArray(py_value): |
- return JsonArray(entries=list(map(_PythonValueToJsonValue, py_value))) |
- |
- |
-class JsonValue(messages.Message): |
- |
- """Any valid JSON value.""" |
- # Is this JSON object `null`? |
- is_null = messages.BooleanField(1, default=False) |
- |
- # Exactly one of the following is provided if is_null is False; none |
- # should be provided if is_null is True. |
- boolean_value = messages.BooleanField(2) |
- string_value = messages.StringField(3) |
- # We keep two numeric fields to keep int64 round-trips exact. |
- double_value = messages.FloatField(4, variant=messages.Variant.DOUBLE) |
- integer_value = messages.IntegerField(5, variant=messages.Variant.INT64) |
- # Compound types |
- object_value = messages.MessageField('JsonObject', 6) |
- array_value = messages.MessageField('JsonArray', 7) |
- |
- |
-class JsonObject(messages.Message): |
- |
- """A JSON object value. |
- |
- Messages: |
- Property: A property of a JsonObject. |
- |
- Fields: |
- properties: A list of properties of a JsonObject. |
- """ |
- |
- class Property(messages.Message): |
- |
- """A property of a JSON object. |
- |
- Fields: |
- key: Name of the property. |
- value: A JsonValue attribute. |
- """ |
- key = messages.StringField(1) |
- value = messages.MessageField(JsonValue, 2) |
- |
- properties = messages.MessageField(Property, 1, repeated=True) |
- |
- |
-class JsonArray(messages.Message): |
- |
- """A JSON array value.""" |
- entries = messages.MessageField(JsonValue, 1, repeated=True) |
- |
- |
-_JSON_PROTO_TO_PYTHON_MAP = { |
- JsonArray: _JsonArrayToPythonValue, |
- JsonObject: _JsonObjectToPythonValue, |
- JsonValue: _JsonValueToPythonValue, |
-} |
-_JSON_PROTO_TYPES = tuple(_JSON_PROTO_TO_PYTHON_MAP.keys()) |
- |
- |
-def _JsonProtoToPythonValue(json_proto): |
- util.Typecheck(json_proto, _JSON_PROTO_TYPES) |
- return _JSON_PROTO_TO_PYTHON_MAP[type(json_proto)](json_proto) |
- |
- |
-def _PythonValueToJsonProto(py_value): |
- if isinstance(py_value, dict): |
- return _PythonValueToJsonObject(py_value) |
- if (isinstance(py_value, collections.Iterable) and |
- not isinstance(py_value, six.string_types)): |
- return _PythonValueToJsonArray(py_value) |
- return _PythonValueToJsonValue(py_value) |
- |
- |
-def _JsonProtoToJson(json_proto, unused_encoder=None): |
- return json.dumps(_JsonProtoToPythonValue(json_proto)) |
- |
- |
-def _JsonToJsonProto(json_data, unused_decoder=None): |
- return _PythonValueToJsonProto(json.loads(json_data)) |
- |
- |
-def _JsonToJsonValue(json_data, unused_decoder=None): |
- result = _PythonValueToJsonProto(json.loads(json_data)) |
- if isinstance(result, JsonValue): |
- return result |
- elif isinstance(result, JsonObject): |
- return JsonValue(object_value=result) |
- elif isinstance(result, JsonArray): |
- return JsonValue(array_value=result) |
- else: |
- raise exceptions.InvalidDataError( |
- 'Malformed JsonValue: %s' % json_data) |
- |
- |
-# pylint:disable=invalid-name |
-JsonProtoEncoder = _JsonProtoToJson |
-JsonProtoDecoder = _JsonToJsonProto |
-# pylint:enable=invalid-name |
-encoding.RegisterCustomMessageCodec( |
- encoder=JsonProtoEncoder, decoder=_JsonToJsonValue)(JsonValue) |
-encoding.RegisterCustomMessageCodec( |
- encoder=JsonProtoEncoder, decoder=JsonProtoDecoder)(JsonObject) |
-encoding.RegisterCustomMessageCodec( |
- encoder=JsonProtoEncoder, decoder=JsonProtoDecoder)(JsonArray) |
- |
- |
-def _EncodeDateTimeField(field, value): |
- result = protojson.ProtoJson().encode_field(field, value) |
- return encoding.CodecResult(value=result, complete=True) |
- |
- |
-def _DecodeDateTimeField(unused_field, value): |
- result = protojson.ProtoJson().decode_field( |
- message_types.DateTimeField(1), value) |
- return encoding.CodecResult(value=result, complete=True) |
- |
- |
-encoding.RegisterFieldTypeCodec(_EncodeDateTimeField, _DecodeDateTimeField)( |
- message_types.DateTimeField) |
- |
- |
-def _EncodeInt64Field(field, value): |
- """Handle the special case of int64 as a string.""" |
- capabilities = [ |
- messages.Variant.INT64, |
- messages.Variant.UINT64, |
- ] |
- if field.variant not in capabilities: |
- return encoding.CodecResult(value=value, complete=False) |
- |
- if field.repeated: |
- result = [str(x) for x in value] |
- else: |
- result = str(value) |
- return encoding.CodecResult(value=result, complete=True) |
- |
- |
-def _DecodeInt64Field(unused_field, value): |
- # Don't need to do anything special, they're decoded just fine |
- return encoding.CodecResult(value=value, complete=False) |
- |
-encoding.RegisterFieldTypeCodec(_EncodeInt64Field, _DecodeInt64Field)( |
- messages.IntegerField) |
- |
- |
-def _EncodeDateField(field, value): |
- """Encoder for datetime.date objects.""" |
- if field.repeated: |
- result = [d.isoformat() for d in value] |
- else: |
- result = value.isoformat() |
- return encoding.CodecResult(value=result, complete=True) |
- |
- |
-def _DecodeDateField(unused_field, value): |
- date = datetime.datetime.strptime(value, '%Y-%m-%d').date() |
- return encoding.CodecResult(value=date, complete=True) |
- |
-encoding.RegisterFieldTypeCodec(_EncodeDateField, _DecodeDateField)(DateField) |