protobuf.wkt
Protobuf Well-Known types.
Any
Bases: Message[_AnyFields], AnyMixin
Any contains an arbitrary serialized protocol buffer message along with a
URL that describes the type of the serialized message.
In its binary encoding, an Any is an ordinary message; but in other wire
forms like JSON, it has a special encoding. The format of the type URL is
described on the type_url field.
Protobuf APIs provide utilities to interact with Any values:
- A 'pack' operation accepts a message and constructs a generic
Anywrapper around it. - An 'unpack' operation reads the content of an
Anymessage, either into an existing message or a new one. Unpack operations must check the type of the value they unpack against the declaredtype_url. - An 'is' operation decides whether an
Anycontains a message of the given type, i.e. whether it can 'unpack' that type.
The JSON format representation of an Any follows one of these cases:
- For types without special-cased JSON encodings, the JSON format
representation of the
Anyis the same as that of the message, with an additional@typefield which contains the type URL. - For types with special-cased JSON encodings (typically called 'well-known'
types, listed in https://protobuf.dev/programming-guides/json/#any), the
JSON format representation has a key
@typewhich contains the type URL and a keyvaluewhich contains the JSON-serialized value.
The text format representation of an Any is like a message with one field
whose name is the type URL in brackets. For example, an Any containing a
foo.Bar message may be written [type.googleapis.com/foo.Bar] { a: 2 }.
Attributes:
| Name | Type | Description |
|---|---|---|
type_url |
str
|
Identifies the type of the serialized Protobuf message with a URI reference consisting of a prefix ending in a slash and the fully-qualified type name. Example: type.googleapis.com/google.protobuf.StringValue This string must contain at least one The prefix is arbitrary and Protobuf implementations are expected to
simply strip off everything up to and including the last All type URL strings must be legal URI references with the additional
restriction (for the text format) that the content of the reference
must consist only of alphanumeric characters, percent-encoded escapes, and
characters in the following set (not including the outer backticks):
In the original design of |
value |
bytes
|
unpack
unpack(type_info: DescMessage) -> Message | None
unpack(type_info: type[T]) -> T | None
Unpacks the message the Any represents.
Returns:
| Type | Description |
|---|---|
T | None
|
The unpacked message, or None if the Any is empty or does not contain the type given by schema. |
FileDescriptorProto
FileDescriptorProto(
*,
name=None,
package=None,
dependency=None,
public_dependency=None,
weak_dependency=None,
option_dependency=None,
message_type=None,
enum_type=None,
service=None,
extension=None,
options=None,
source_code_info=None,
syntax=None,
edition=None,
)
Bases: Message[_FileDescriptorProtoFields]
Describes a complete .proto file.
Attributes:
| Name | Type | Description |
|---|---|---|
name |
str
|
|
package |
str
|
|
dependency |
list[str]
|
|
public_dependency |
list[int]
|
|
weak_dependency |
list[int]
|
|
option_dependency |
list[str]
|
|
message_type |
list[DescriptorProto]
|
|
enum_type |
list[EnumDescriptorProto]
|
|
service |
list[ServiceDescriptorProto]
|
|
extension |
list[FieldDescriptorProto]
|
|
options |
FileOptions | None
|
|
source_code_info |
SourceCodeInfo | None
|
|
syntax |
str
|
The syntax of the proto file. The supported values are "proto2", "proto3", and "editions". If |
edition |
Edition
|
FileDescriptorSet
Bases: Message[_FileDescriptorSetFields], FileDescriptorSetMixin
The protocol compiler can output a FileDescriptorSet containing the .proto files it parses.
Attributes:
| Name | Type | Description |
|---|---|---|
file |
list[FileDescriptorProto]
|
Duration
Bases: Message[_DurationFields], DurationMixin
A Duration represents a signed, fixed-length span of time represented as a count of seconds and fractions of seconds at nanosecond resolution. It is independent of any calendar and concepts like "day" or "month". It is related to Timestamp in that the difference between two Timestamp values is a Duration and it can be added or subtracted from a Timestamp. Range is approximately +-10,000 years.
Examples
Example 1: Compute Duration from two Timestamps in pseudo code.
Timestamp start = ...;
Timestamp end = ...;
Duration duration = ...;
duration.seconds = end.seconds - start.seconds;
duration.nanos = end.nanos - start.nanos;
if (duration.seconds < 0 && duration.nanos > 0) {
duration.seconds += 1;
duration.nanos -= 1000000000;
} else if (duration.seconds > 0 && duration.nanos < 0) {
duration.seconds -= 1;
duration.nanos += 1000000000;
}
Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
Timestamp start = ...;
Duration duration = ...;
Timestamp end = ...;
end.seconds = start.seconds + duration.seconds;
end.nanos = start.nanos + duration.nanos;
if (end.nanos < 0) {
end.seconds -= 1;
end.nanos += 1000000000;
} else if (end.nanos >= 1000000000) {
end.seconds += 1;
end.nanos -= 1000000000;
}
Example 3: Compute Duration from datetime.timedelta in Python.
td = datetime.timedelta(days=3, minutes=10)
duration = Duration()
duration.FromTimedelta(td)
JSON Mapping
In JSON format, the Duration type is encoded as a string rather than an object, where the string ends in the suffix "s" (indicating seconds) and is preceded by the number of seconds, with nanoseconds expressed as fractional seconds. For example, 3 seconds with 0 nanoseconds should be encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should be expressed in JSON format as "3.000000001s", and 3 seconds and 1 microsecond should be expressed in JSON format as "3.000001s".
Attributes:
| Name | Type | Description |
|---|---|---|
seconds |
int
|
|
nanos |
int
|
Signed fractions of a second at nanosecond resolution of the span
of time. Durations less than one second are represented with a 0
|
to_nanos
to_seconds
from_seconds
classmethod
Empty
Bases: Message[_EmptyFields]
A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:
service Foo {
rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
}
FieldMask
Bases: Message[_FieldMaskFields]
FieldMask represents a set of symbolic field paths, for example:
paths: "f.a"
paths: "f.b.d"
Here f represents a field in some root message, a and b
fields in the message found in f, and d a field found in the
message in f.b.
Field masks are used to specify a subset of fields that should be returned by a get operation or modified by an update operation. Field masks also have a custom JSON encoding (see below).
Field Masks in Projections
When used in the context of a projection, a response message or sub-message is filtered by the API to only contain those fields as specified in the mask. For example, if the mask in the previous example is applied to a response message as follows:
f {
a : 22
b {
d : 1
x : 2
}
y : 13
}
z: 8
The result will not contain specific values for fields x,y and z (their value will be set to the default, and omitted in proto text output):
f {
a : 22
b {
d : 1
}
}
A repeated field is not allowed except at the last position of a paths string.
If a FieldMask object is not present in a get operation, the operation applies to all fields (as if a FieldMask of all fields had been specified).
Note that a field mask does not necessarily apply to the top-level response message. In case of a REST get operation, the field mask applies directly to the response, but in case of a REST list operation, the mask instead applies to each individual message in the returned resource list. In case of a REST custom method, other definitions may be used. Where the mask applies will be clearly documented together with its declaration in the API. In any case, the effect on the returned resource/resources is required behavior for APIs.
Field Masks in Update Operations
A field mask in update operations specifies which fields of the targeted resource are going to be updated. The API is required to only change the values of the fields as specified in the mask and leave the others untouched. If a resource is passed in to describe the updated values, the API ignores the values of all fields not covered by the mask.
If a repeated field is specified for an update operation, new values will
be appended to the existing repeated field in the target resource. Note that
a repeated field is only allowed in the last position of a paths string.
If a sub-message is specified in the last position of the field mask for an update operation, then new value will be merged into the existing sub-message in the target resource.
For example, given the target message:
f {
b {
d: 1
x: 2
}
c: [1]
}
And an update message:
f {
b {
d: 10
}
c: [2]
}
then if the field mask is:
paths: ["f.b", "f.c"]
then the result will be:
f {
b {
d: 10
x: 2
}
c: [1, 2]
}
An implementation may provide options to override this default behavior for repeated and message fields.
Note that libraries which implement FieldMask resolution have various different behaviors in the face of empty masks or the special "*" mask. When implementing a service you should confirm these cases have the appropriate behavior in the underlying FieldMask library that you desire, and you may need to special case those cases in your application code if the underlying field mask library behavior differs from your intended service semantics.
Update methods implementing https://google.aip.dev/134 - MUST support the special value * meaning "full replace" - MUST treat an omitted field mask as "replace fields which are present".
Other methods implementing https://google.aip.dev/157 - SHOULD support the special value "*" to mean "get all". - MUST treat an omitted field mask to mean "get all", unless otherwise documented.
Considerations for HTTP REST
The HTTP kind of an update operation which uses a field mask must be set to PATCH instead of PUT in order to satisfy HTTP semantics (PUT must only be used for full updates).
JSON Encoding of Field Masks
In JSON, a field mask is encoded as a single string where paths are separated by a comma. Fields name in each path are converted to/from lower-camel naming conventions.
As an example, consider the following message declarations:
message Profile {
User user = 1;
Photo photo = 2;
}
message User {
string display_name = 1;
string address = 2;
}
In proto a field mask for Profile may look as such:
mask {
paths: "user.display_name"
paths: "photo"
}
In JSON, the same mask is represented as below:
{
mask: "user.displayName,photo"
}
Field Masks and Oneof Fields
Field masks treat fields in oneofs just as regular fields. Consider the following message:
message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}
The field mask can be:
mask {
paths: "name"
}
Or:
mask {
paths: "sub_message"
}
Note that oneof type names ("test_oneof" in this case) cannot be used in paths.
Field Mask Verification
The implementation of any API method which has a FieldMask type field in the
request should verify the included field paths, and return an
INVALID_ARGUMENT error if any path is unmappable.
Attributes:
| Name | Type | Description |
|---|---|---|
paths |
list[str]
|
ListValue
NullValue
Bases: Enum
Represents a JSON null.
NullValue is a sentinel, using an enum with only one value to represent
the null value for the Value type union.
A field of type NullValue with any value other than 0 is considered
invalid. Most ProtoJSON serializers will emit a Value with a null_value
set as a JSON null regardless of the integer value, and so will round trip
to a 0 value.
Attributes:
| Name | Type | Description |
|---|---|---|
NULL_VALUE |
Struct
Bases: Message[_StructFields], StructMixin
Represents a JSON object.
An unordered key-value map, intending to perfectly capture the semantics of a JSON object. This enables parsing any arbitrary JSON payload as a message field in ProtoJSON format.
This follows RFC 8259 guidelines for interoperable JSON: notably this type
cannot represent large Int64 values or NaN/Infinity numbers,
since the JSON format generally does not support those values in its number
type.
If you do not intend to parse arbitrary JSON into your message, a custom typed message should be preferred instead of using this type.
Attributes:
| Name | Type | Description |
|---|---|---|
fields |
dict[str, Value]
|
from_python
classmethod
to_python
Convert this Struct to a Python dict.
Examples:
Value
Bases: Message[_ValueFields], ValueMixin
Represents a JSON value.
Value represents a dynamically typed value which can be either
null, a number, a string, a boolean, a recursive struct value, or a
list of values. A producer of value is expected to set one of these
variants. Absence of any variant is an invalid state.
Attributes:
| Name | Type | Description |
|---|---|---|
kind |
Oneof[Literal['null_value'], NullValue] | Oneof[Literal['number_value'], float] | Oneof[Literal['string_value'], str] | Oneof[Literal['bool_value'], bool] | Oneof[Literal['struct_value'], Struct] | Oneof[Literal['list_value'], ListValue] | None
|
from_python
classmethod
Create a Value from a Python value.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
value
|
ValueTypeParam
|
The Python value to convert. |
required |
Returns:
| Type | Description |
|---|---|
Self
|
A Value representing the given Python value. |
Raises:
| Type | Description |
|---|---|
TypeError
|
If the value is of an unsupported type, including |
Examples:
>>> from protobuf.wkt import Value
>>> Value.from_python(None)
Value(kind=Oneof(field='null_value', value=NullValue.NULL_VALUE))
>>> Value.from_python(True)
Value(kind=Oneof(field='bool_value', value=True))
>>> Value.from_python(2)
Value(kind=Oneof(field='number_value', value=2.0))
>>> Value.from_python(3.14)
Value(kind=Oneof(field='number_value', value=3.14))
>>> Value.from_python("hello")
Value(kind=Oneof(field='string_value', value='hello'))
>>> Value.from_python([1, "foo"])
Value(kind=Oneof(field='list_value', value=ListValue(values=[Value(kind=Oneof(field='number_value', value=1.0)), Value(kind=Oneof(field='string_value', value='foo'))])))
>>> Value.from_python({"a": 1, "b": "bear"})
Value(kind=Oneof(field='struct_value', value=Struct(fields={'a': Value(kind=Oneof(field='number_value', value=1.0)), 'b': Value(kind=Oneof(field='string_value', value='bear'))})))
to_python
Convert this Value to a Python value.
Examples:
>>> from protobuf import Oneof
>>> from protobuf.wkt import ListValue, NullValue, Struct, Value
>>> Value(
... kind=Oneof(field="null_value", value=NullValue.NULL_VALUE)
... ).to_python()
>>> Value(kind=Oneof(field="bool_value", value=True)).to_python()
True
>>> Value(kind=Oneof(field="number_value", value=3.14)).to_python()
3.14
>>> Value(kind=Oneof(field="string_value", value="hello")).to_python()
'hello'
>>> Value(
... kind=Oneof(
... field="list_value",
... value=ListValue(
... values=[
... Value(kind=Oneof(field="number_value", value=1.0)),
... Value(kind=Oneof(field="string_value", value="foo")),
... ]
... ),
... )
... ).to_python()
[1.0, 'foo']
>>> Value(
... kind=Oneof(
... field="struct_value",
... value=Struct(
... fields={
... "a": Value(kind=Oneof(field="number_value", value=1.0)),
... "b": Value(
... kind=Oneof(field="string_value", value="bear")
... ),
... }
... ),
... )
... ).to_python()
{'a': 1.0, 'b': 'bear'}
Timestamp
Bases: Message[_TimestampFields], TimestampMixin
A Timestamp represents a point in time independent of any time zone or local calendar, encoded as a count of seconds and fractions of seconds at nanosecond resolution. The count is relative to an epoch at UTC midnight on January 1, 1970, in the proleptic Gregorian calendar which extends the Gregorian calendar backwards to year one.
All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap second table is needed for interpretation, using a 24-hour linear smear.
The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By restricting to that range, we ensure that we can convert to and from RFC 3339 date strings.
Examples
Example 1: Compute Timestamp from POSIX time().
Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
Example 2: Compute Timestamp from POSIX gettimeofday().
struct timeval tv;
gettimeofday(&tv, NULL);
Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);
Example 3: Compute Timestamp from Win32 GetSystemTimeAsFileTime().
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
// A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
Timestamp timestamp;
timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
Example 4: Compute Timestamp from Java System.currentTimeMillis().
long millis = System.currentTimeMillis();
Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
.setNanos((int) ((millis % 1000) * 1000000)).build();
Example 5: Compute Timestamp from Java Instant.now().
Instant now = Instant.now();
Timestamp timestamp =
Timestamp.newBuilder().setSeconds(now.getEpochSecond())
.setNanos(now.getNano()).build();
Example 6: Compute Timestamp from current time in Python.
timestamp = Timestamp()
timestamp.GetCurrentTime()
JSON Mapping
In JSON format, the Timestamp type is encoded as a string in the RFC 3339 format. That is, the format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" where {year} is always expressed using four digits while {month}, {day}, {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone is required. A ProtoJSON serializer should always use UTC (as indicated by "Z") when printing the Timestamp type and a ProtoJSON parser should be able to accept both UTC and other timezones (as indicated by an offset).
For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past 01:30 UTC on January 15, 2017.
In JavaScript, one can convert a Date object to this format using the
standard
toISOString()
method. In Python, a standard datetime.datetime object can be converted
to this format using
strftime with
the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
the Joda Time's ISODateTimeFormat.dateTime() to obtain a formatter capable of generating timestamps in this format.
Attributes:
| Name | Type | Description |
|---|---|---|
seconds |
int
|
|
nanos |
int
|
Non-negative fractions of a second at nanosecond resolution. This field is the nanosecond portion of the duration, not an alternative to seconds. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be between 0 and 999,999,999 inclusive. |
from_datetime
classmethod
Create from the given datetime.
Examples:
>>> from datetime import datetime, timezone, timedelta
>>> from protobuf.wkt import Timestamp
>>> Timestamp.from_datetime(datetime(1970, 1, 1, tzinfo=timezone.utc))
Timestamp()
>>> Timestamp.from_datetime(
... datetime(1970, 1, 1, 0, 0, 10, tzinfo=timezone.utc)
... )
Timestamp(seconds=10)
>>> Timestamp.from_datetime(
... datetime(
... 1970, 1, 1, tzinfo=timezone(timedelta(hours=5, minutes=30))
... )
... )
Timestamp(seconds=-19800)
to_datetime
Convert to a UTC datetime with timezone set.
Note that the upper half of the very last microsecond in the valid range of a Timestamp is not representable as a datetime and will raise an OverflowError.
To convert to a different timezone, use datetime.astimezone() on the result.
Examples:
>>> from datetime import timezone, timedelta
>>> from protobuf.wkt import Timestamp
>>> Timestamp(seconds=10).to_datetime()
datetime.datetime(1970, 1, 1, 0, 0, 10, tzinfo=datetime.timezone.utc)
>>> Timestamp(seconds=10).to_datetime().astimezone(
... timezone(timedelta(hours=5, minutes=30))
... )
datetime.datetime(1970, 1, 1, 5, 30, 10, tzinfo=datetime.timezone(datetime.timedelta(seconds=19800)))
to_nanos
to_seconds
Convert to a number of seconds since Unix epoch 1970-01-01T00:00:00Z.
Parts of a second are expressed as fractional values.
Examples:
from_seconds
classmethod
Create a new Timestamp from a timestamp expressed in seconds since Unix epoch 1970-01-01T00:00:00Z.
Parts of a second are expressed as fractional values.
Examples: