Index: third_party/protobuf/python/google/protobuf/internal/type_checkers.py |
diff --git a/third_party/protobuf/python/google/protobuf/internal/type_checkers.py b/third_party/protobuf/python/google/protobuf/internal/type_checkers.py |
index f20e526a06d0465714dd442a058d018c38ca0757..2b3cd4de4c26926c67423059d584c85f788f65d9 100755 |
--- a/third_party/protobuf/python/google/protobuf/internal/type_checkers.py |
+++ b/third_party/protobuf/python/google/protobuf/internal/type_checkers.py |
@@ -1,6 +1,6 @@ |
# Protocol Buffers - Google's data interchange format |
# Copyright 2008 Google Inc. All rights reserved. |
-# https://developers.google.com/protocol-buffers/ |
+# http://code.google.com/p/protobuf/ |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions are |
@@ -28,10 +28,6 @@ |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-#PY25 compatible for GAE. |
-# |
-# Copyright 2008 Google Inc. All Rights Reserved. |
- |
"""Provides type checking routines. |
This module defines type checking utilities in the forms of dictionaries: |
@@ -49,9 +45,6 @@ TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization |
__author__ = 'robinson@google.com (Will Robinson)' |
-import sys ##PY25 |
-if sys.version < '2.6': bytes = str ##PY25 |
-from google.protobuf.internal import api_implementation |
from google.protobuf.internal import decoder |
from google.protobuf.internal import encoder |
from google.protobuf.internal import wire_format |
@@ -59,29 +52,22 @@ from google.protobuf import descriptor |
_FieldDescriptor = descriptor.FieldDescriptor |
-def SupportsOpenEnums(field_descriptor): |
- return field_descriptor.containing_type.syntax == "proto3" |
-def GetTypeChecker(field): |
+def GetTypeChecker(cpp_type, field_type): |
"""Returns a type checker for a message field of the specified types. |
Args: |
- field: FieldDescriptor object for this field. |
+ cpp_type: C++ type of the field (see descriptor.py). |
+ field_type: Protocol message field type (see descriptor.py). |
Returns: |
An instance of TypeChecker which can be used to verify the types |
of values assigned to a field of the specified type. |
""" |
- if (field.cpp_type == _FieldDescriptor.CPPTYPE_STRING and |
- field.type == _FieldDescriptor.TYPE_STRING): |
+ if (cpp_type == _FieldDescriptor.CPPTYPE_STRING and |
+ field_type == _FieldDescriptor.TYPE_STRING): |
return UnicodeValueChecker() |
- if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: |
- if SupportsOpenEnums(field): |
- # When open enums are supported, any int32 can be assigned. |
- return _VALUE_CHECKERS[_FieldDescriptor.CPPTYPE_INT32] |
- else: |
- return EnumValueChecker(field.enum_type) |
- return _VALUE_CHECKERS[field.cpp_type] |
+ return _VALUE_CHECKERS[cpp_type] |
# None of the typecheckers below make any attempt to guard against people |
@@ -99,15 +85,10 @@ class TypeChecker(object): |
self._acceptable_types = acceptable_types |
def CheckValue(self, proposed_value): |
- """Type check the provided value and return it. |
- |
- The returned value might have been normalized to another type. |
- """ |
if not isinstance(proposed_value, self._acceptable_types): |
message = ('%.1024r has type %s, but expected one of: %s' % |
(proposed_value, type(proposed_value), self._acceptable_types)) |
raise TypeError(message) |
- return proposed_value |
# IntValueChecker and its subclasses perform integer type-checks |
@@ -123,62 +104,28 @@ class IntValueChecker(object): |
raise TypeError(message) |
if not self._MIN <= proposed_value <= self._MAX: |
raise ValueError('Value out of range: %d' % proposed_value) |
- # We force 32-bit values to int and 64-bit values to long to make |
- # alternate implementations where the distinction is more significant |
- # (e.g. the C++ implementation) simpler. |
- proposed_value = self._TYPE(proposed_value) |
- return proposed_value |
- |
- def DefaultValue(self): |
- return 0 |
- |
- |
-class EnumValueChecker(object): |
- |
- """Checker used for enum fields. Performs type-check and range check.""" |
- |
- def __init__(self, enum_type): |
- self._enum_type = enum_type |
- |
- def CheckValue(self, proposed_value): |
- if not isinstance(proposed_value, (int, long)): |
- message = ('%.1024r has type %s, but expected one of: %s' % |
- (proposed_value, type(proposed_value), (int, long))) |
- raise TypeError(message) |
- if proposed_value not in self._enum_type.values_by_number: |
- raise ValueError('Unknown enum value: %d' % proposed_value) |
- return proposed_value |
- |
- def DefaultValue(self): |
- return self._enum_type.values[0].number |
class UnicodeValueChecker(object): |
- """Checker used for string fields. |
- |
- Always returns a unicode value, even if the input is of type str. |
- """ |
+ """Checker used for string fields.""" |
def CheckValue(self, proposed_value): |
- if not isinstance(proposed_value, (bytes, unicode)): |
+ if not isinstance(proposed_value, (str, unicode)): |
message = ('%.1024r has type %s, but expected one of: %s' % |
- (proposed_value, type(proposed_value), (bytes, unicode))) |
+ (proposed_value, type(proposed_value), (str, unicode))) |
raise TypeError(message) |
- # If the value is of type 'bytes' make sure that it is valid UTF-8 data. |
- if isinstance(proposed_value, bytes): |
+ # If the value is of type 'str' make sure that it is in 7-bit ASCII |
+ # encoding. |
+ if isinstance(proposed_value, str): |
try: |
- proposed_value = proposed_value.decode('utf-8') |
+ unicode(proposed_value, 'ascii') |
except UnicodeDecodeError: |
- raise ValueError('%.1024r has type bytes, but isn\'t valid UTF-8 ' |
- 'encoding. Non-UTF-8 strings must be converted to ' |
+ raise ValueError('%.1024r has type str, but isn\'t in 7-bit ASCII ' |
+ 'encoding. Non-ASCII strings must be converted to ' |
'unicode objects before being added.' % |
(proposed_value)) |
- return proposed_value |
- |
- def DefaultValue(self): |
- return u"" |
class Int32ValueChecker(IntValueChecker): |
@@ -186,25 +133,21 @@ class Int32ValueChecker(IntValueChecker): |
# efficient. |
_MIN = -2147483648 |
_MAX = 2147483647 |
- _TYPE = int |
class Uint32ValueChecker(IntValueChecker): |
_MIN = 0 |
_MAX = (1 << 32) - 1 |
- _TYPE = int |
class Int64ValueChecker(IntValueChecker): |
_MIN = -(1 << 63) |
_MAX = (1 << 63) - 1 |
- _TYPE = long |
class Uint64ValueChecker(IntValueChecker): |
_MIN = 0 |
_MAX = (1 << 64) - 1 |
- _TYPE = long |
# Type-checkers for all scalar CPPTYPEs. |
@@ -218,7 +161,8 @@ _VALUE_CHECKERS = { |
_FieldDescriptor.CPPTYPE_FLOAT: TypeChecker( |
float, int, long), |
_FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int), |
- _FieldDescriptor.CPPTYPE_STRING: TypeChecker(bytes), |
+ _FieldDescriptor.CPPTYPE_ENUM: Int32ValueChecker(), |
+ _FieldDescriptor.CPPTYPE_STRING: TypeChecker(str), |
} |