1- from typing import Dict , List , Union
1+ import copy
22from uuid import uuid4
33
44import y_py as Y
55from ypy_websocket .websocket_server import YDoc
66
7+ from .utils import cast_all
8+
79
810class YBaseDoc :
911 def __init__ (self , ydoc : YDoc ):
@@ -96,9 +98,10 @@ def source(self):
9698
9799 @source .setter
98100 def source (self , value ):
99- cast_all (value , int , float )
100- if not value ["cells" ]:
101- value ["cells" ] = [
101+ nb = copy .deepcopy (value )
102+ cast_all (nb , int , float )
103+ if not nb ["cells" ]:
104+ nb ["cells" ] = [
102105 {
103106 "cell_type" : "code" ,
104107 "execution_count" : None ,
@@ -122,7 +125,7 @@ def source(self, value):
122125
123126 # initialize document
124127 ycells = []
125- for cell in value ["cells" ]:
128+ for cell in nb ["cells" ]:
126129 cell_source = cell ["source" ]
127130 if cell_source :
128131 ytext = Y .YText (cell_source )
@@ -137,9 +140,9 @@ def source(self, value):
137140
138141 if ycells :
139142 self ._ycells .push (t , ycells )
140- self ._ymeta .set (t , "metadata" , value ["metadata" ])
141- self ._ystate .set (t , "nbformat" , value ["nbformat" ])
142- self ._ystate .set (t , "nbformatMinor" , value ["nbformat_minor" ])
143+ self ._ymeta .set (t , "metadata" , nb ["metadata" ])
144+ self ._ystate .set (t , "nbformat" , nb ["nbformat" ])
145+ self ._ystate .set (t , "nbformatMinor" , nb ["nbformat_minor" ])
143146 with self ._ydoc .begin_transaction () as t :
144147 for ytext in ytexts_to_clear :
145148 ytext .delete (t , 0 , 1 )
@@ -153,18 +156,3 @@ def observe(self, callback):
153156 self ._subscriptions [cell ] = cell .observe (callback )
154157 self ._subscriptions [self ._ycells ] = self ._ycells .observe (callback )
155158 self ._subscriptions [self ._ymeta ] = self ._ymeta .observe (callback )
156-
157-
158- def cast_all (o : Union [List , Dict ], from_type , to_type ) -> None :
159- if isinstance (o , list ):
160- for i , v in enumerate (o ):
161- if isinstance (v , from_type ):
162- o [i ] = to_type (v )
163- elif isinstance (v , (list , dict )):
164- cast_all (v , from_type , to_type )
165- elif isinstance (o , dict ):
166- for k , v in o .items ():
167- if isinstance (v , from_type ):
168- o [k ] = to_type (v )
169- elif isinstance (v , (list , dict )):
170- cast_all (v , from_type , to_type )
0 commit comments