File tree Expand file tree Collapse file tree 2 files changed +29
-0
lines changed Expand file tree Collapse file tree 2 files changed +29
-0
lines changed Original file line number Diff line number Diff line change 8
8
import typing
9
9
from abc import ABC
10
10
from base64 import b64decode , b64encode
11
+ from copy import deepcopy
11
12
from datetime import datetime , timedelta , timezone
12
13
from dateutil .parser import isoparse
13
14
from typing import (
@@ -717,6 +718,14 @@ def __bool__(self) -> bool:
717
718
for field_name in self ._betterproto .meta_by_field_name
718
719
)
719
720
721
+ def __deepcopy__ (self : T , _ : Any = {}) -> T :
722
+ kwargs = {}
723
+ for name in self ._betterproto .sorted_field_names :
724
+ value = self .__raw_get (name )
725
+ if value is not PLACEHOLDER :
726
+ kwargs [name ] = deepcopy (value )
727
+ return self .__class__ (** kwargs ) # type: ignore
728
+
720
729
@property
721
730
def _betterproto (self ) -> ProtoClassMetadata :
722
731
"""
Original file line number Diff line number Diff line change 1
1
from dataclasses import dataclass
2
+ from copy import copy , deepcopy
2
3
from datetime import datetime
3
4
from inspect import Parameter , signature
4
5
from typing import Dict , List , Optional
@@ -485,3 +486,22 @@ def test_service_argument__expected_parameter():
485
486
do_thing_request_parameter = sig .parameters ["do_thing_request" ]
486
487
assert do_thing_request_parameter .default is Parameter .empty
487
488
assert do_thing_request_parameter .annotation == "DoThingRequest"
489
+
490
+
491
+ def test_copyability ():
492
+ @dataclass
493
+ class Spam (betterproto .Message ):
494
+ foo : bool = betterproto .bool_field (1 )
495
+ bar : int = betterproto .int32_field (2 )
496
+ baz : List [str ] = betterproto .string_field (3 )
497
+
498
+ spam = Spam (bar = 12 , baz = ["hello" ])
499
+ copied = copy (spam )
500
+ assert spam == copied
501
+ assert spam is not copied
502
+ assert spam .baz is copied .baz
503
+
504
+ deepcopied = deepcopy (spam )
505
+ assert spam == deepcopied
506
+ assert spam is not deepcopied
507
+ assert spam .baz is not deepcopied .baz
You can’t perform that action at this time.
0 commit comments