Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
3 tasks done
sshumaker opened this issue Jun 27, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@sshumaker
Copy link

sshumaker commented Jun 27, 2024

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

  • I have searched the issues for duplicates.
  • I have shown the entire traceback, if possible.
  • I have verified this issue occurs on the latest prelease of betterproto which can be installed using pip install -U --pre betterproto, if possible.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants