python-betterproto icon indicating copy to clipboard operation
python-betterproto copied to clipboard

Deepcopy incorrectly sets the 'active' oneof field to last field in structure (breaking which_one_of)

Open sshumaker opened this issue 1 year ago • 0 comments

Summary

When calling deepcopy on a proto, the oneOf field state gets overwritten.

Reproduction Steps

  1. Create a simple proto with two one_of fields.
  2. set the first field
  3. Call which_one_of which will return the first field
  4. Call deepcopy on the proto
  5. check which_one_of again.
  6. The second field is returned.

The implementation of deepcopy does this:

        for name in self._betterproto.sorted_field_names:
            value = self.__raw_get(name)
            if value is not PLACEHOLDER:
                kwargs[name] = deepcopy(value)

And of course, setattr sets the current group by field, which overwrites this.

one option is to simply make deepcopy one_of aware, using oneof_field_by_group, default initializing the nonset fields and adding them to a set, and then only iterating over the names that aren't in the set using the overall loop above.

Expected Results

We preserve the correct one_of field

Actual Results

The second one_of field is set.

System Information

libprotoc 3.21.12 Python 3.11.9 Name: betterproto Version: 2.0.0b6 Summary: A better Protobuf / gRPC generator & library Home-page: https://github.com/danielgtaylor/python-betterproto Author: Daniel G. Taylor Author-email: [email protected] License: MIT Location: /usr/local/lib/python3.11/site-packages Requires: grpclib, python-dateutil Required-by:

Checklist

  • [X] I have searched the issues for duplicates.
  • [X] I have shown the entire traceback, if possible.
  • [X] I have verified this issue occurs on the latest prelease of betterproto which can be installed using pip install -U --pre betterproto, if possible.

sshumaker avatar Jun 27 '24 22:06 sshumaker