All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Versions suffixed with
b*
are inbeta
and can be installed withpip install --pre betterproto
.
-
Breaking: Support
Pydantic
v2 and dropping support for v1 #588 -
Breaking: The attempting to access an unset
oneof
now raises anAttributeError
field. To see how to accessoneof
fields now, refer to #558 and README.md. -
Breaking: A custom
Enum
has been implemented to match the behaviour of being an open set. Any checks forisinstance(enum_member, enum.Enum)
andissubclass(EnumSubclass, enum.Enum)
will now returnFalse
. This change also has the side effect of preventing any passthrough ofEnum
members (i.e.Foo.RED.GREEN
doesn't work any more). See #293 for more info, this fixed many bugs related toEnum
handling. -
Add support for
pickle
methods #535 -
Add support for
Struct
andValue
types #551 -
Add support for
Rich
package for pretty printing #508 -
Improve performance of serializing / de-serializing messages #545
-
Improve the handling of message name collisions with typing by allowing the method / type of imports to be configured. Refer to #582 and README.md.
-
Fix roundtrip parsing of
datetime
s #534 -
Fix accessing unset optional fields #523
-
Fix
Message
equality comparison #513 -
Fix behaviour with long comment messages #532
-
Add a warning when calling a deprecated message #596
-
Breaking: the minimum Python version has been bumped to
3.7
#444 -
Support generating Pydantic dataclasses. Pydantic dataclasses are are drop-in replacement for dataclasses in the standard library that additionally supports validation. Pass
--python_betterproto_opt=pydantic_dataclasses
to enable this feature. Refer to #406 and README.md for more information. -
Added support for
@generated
marker #382 -
Pull down the
include_default_values
argument toto_json()
#405 -
Pythonize input_type name in py_input_message #436
-
Widen
from_dict()
to accept anyMapping
#451 -
Replace
pkg_resources
withimportlib
#462 -
Fix typechecker compatiblity checks in server streaming methods #413
-
Fix "empty-valued" repeated fields not being serialised #417
-
Fix
dict
encoding for timezone-awaredatetimes
#468 -
Fix
to_pydict()
serialization for optional fields #495 -
Handle empty value objects properly #481
-
Breaking: Client and Service Stubs no longer pack and unpack the input message fields as parameters #331
Update your client calls and server handlers as follows:
Clients before:
response = await service.echo(value="hello", extra_times=1)
Clients after:
response = await service.echo(EchoRequest(value="hello", extra_times=1))
Servers before:
async def echo(self, value: str, extra_times: int) -> EchoResponse: ...
Servers after:
async def echo(self, echo_request: EchoRequest) -> EchoResponse: # Use echo_request.value # Use echo_request.extra_times ...
-
Add
to/from_pydict()
forMessage
#203 -
Format field comments also as docstrings #304
-
Implement
__deepcopy__
forMessage
#339 -
Run isort on compiled code #355
-
Expose timeout, deadline and metadata parameters from grpclib #352
-
Make
Message.__getattribute__
invisible to type checkers #359 -
Fix map field edge-case #254
-
Fix message text in
NotImplementedError
#325 -
Fix
Message.from_dict()
in the presence of optional datetime fields #329 -
Support Jinja2 3.0 to prevent version conflicts #330
-
Fix overwriting top level
__init__.py
#337 -
Remove deprecation warnings when fields are initialised with non-default values #348
-
Ensure nested class names are converted to PascalCase #353
-
Fix
Message.to_dict()
mutating the underlying Message #378 -
Fix some parameters being missing from services #381
-
Breaking: the minimum Python version has been bumped to
3.6.2
-
Always add
AsyncIterator
to imports if there are services #264 -
Allow parsing of messages from
ByteStrings
#266 -
Add support for proto3 optional #281
-
Fix compilation of fields with names identical to builtin types #294
-
Fix default values for enum service args #299
-
Generate grpclib service stubs #170
-
Add __version__ attribute to package #134
-
Use betterproto generated messages in the plugin #161
-
Sort the list of sources in generated file headers #164
-
Micro-optimization: use tuples instead of lists for conditions #228
-
Improve datestring parsing #213
-
Fix serialization of repeated fields with empty messages #180
-
Fix compilation of fields named 'bytes' or 'str' #226
-
Fix json serialization of infinite and nan floats/doubles #215
-
Fix template bug resulting in empty __post_init__ methods #162
-
Fix serialization of zero-value messages in a oneof group #176
-
Fix missing typing and datetime imports #183
-
Fix code generation for empty services #222
-
Fix Message.to_dict and from_dict handling of repeated timestamps and durations #211
-
Fix incorrect routes in generated client when service is not in a package #177
-
Add support for deprecated message and fields #126
-
Add support for recursive messages #130
-
Add support for
bool(Message)
#142 -
Improve keyword sanitisation for generated code #137
-
Fix missing serialized_on_wire when message contains only lists #81
-
Fix circular dependencies #100
-
Fix to_dict enum fields when numbering is not consecutive #102
-
Fix argument generation for stub methods when using
import
with proto definition #103 -
Fix missing async/await keywords when casing #104
-
Fix mutable default arguments in generated code #105
-
Fix serialisation of default values in oneofs when calling to_dict() or to_json() #110
-
Fix static type checking for grpclib client #124
-
Fix python3.6 compatibility issue with dataclasses #124
-
Fix handling of trailer-only responses #127
-
Refactor plugin.py to use modular dataclasses in tree-like structure to represent parsed data #121
-
Refactor template compilation logic #136
-
Replace use of platform provided protoc with development dependency on grpcio-tools #107
-
Switch to using
poe
frommake
to manage project development tasks #118 -
Improve CI platform coverage #128
Several bugfixes and improvements required or will require small breaking changes, necessitating a new version.
2.0.0
will be released once the interface is stable.
-
Add support for gRPC and stream-stream #83
-
Switch from
pipenv
topoetry
for development #75 -
Fix two packages with the same name suffix should not cause naming conflict #25
-
Fix Import child package from root #57
-
Fix Import child package from package #58
-
Fix Import parent package from child package #59
-
Fix Import root package from child package #60
-
Fix Import root package from root #61
-
Fix ALL_CAPS message fields are parsed incorrectly. #11
1.2.5 - 2020-04-27
- Add .j2 suffix to python template names to avoid confusing certain build tools #72
1.2.4 - 2020-04-26
- Enforce utf-8 for reading the readme in setup.py #67
- Only import types from grpclib when type checking #52
- Improve performance of serialize/deserialize by caching type information of fields in class #46
- Support using Google's wrapper types as RPC output values #40
- Fixes issue where protoc did not recognize plugin.py as win32 application #38
- Fix services using non-pythonified field names #34
- Add ability to provide metadata, timeout & deadline args to requests #32
1.2.3 - 2020-04-15
- Exclude empty lists from
to_dict
by default #16 - Add
include_default_values
parameter forto_dict
#12 - Fix class names being prepended with duplicates when using protocol buffers that are nested more than once #21
- Add support for python 3.6 #30
1.2.2 - 2020-01-09
- Mention lack of Proto 2 support in README.
- Fix serialization of constructor parameters #10
- Fix
casing
parameter propagation #7
1.2.1 - 2019-10-29
- Fix comment indentation bug in rendered gRPC methods.
1.2.0 - 2019-10-28
- Generated code output auto-formatting via Black
- Simplified gRPC helper functions
1.1.0 - 2019-10-27
- Better JSON casing support
- Handle field names which clash with Python reserved words
- Better handling of default values from type introspection
- Support for Google Duration & Timestamp types
- Support for Google wrapper types
- Documentation updates
1.0.1 - 2019-10-22
- README to the PyPI details page
1.0.0 - 2019-10-22
- Initial release