1
- from typing import Dict , List , Union
1
+ import copy
2
2
from uuid import uuid4
3
3
4
4
import y_py as Y
5
5
from ypy_websocket .websocket_server import YDoc
6
6
7
+ from .utils import cast_all
8
+
7
9
8
10
class YBaseDoc :
9
11
def __init__ (self , ydoc : YDoc ):
@@ -96,9 +98,10 @@ def source(self):
96
98
97
99
@source .setter
98
100
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" ] = [
102
105
{
103
106
"cell_type" : "code" ,
104
107
"execution_count" : None ,
@@ -122,7 +125,7 @@ def source(self, value):
122
125
123
126
# initialize document
124
127
ycells = []
125
- for cell in value ["cells" ]:
128
+ for cell in nb ["cells" ]:
126
129
cell_source = cell ["source" ]
127
130
if cell_source :
128
131
ytext = Y .YText (cell_source )
@@ -137,9 +140,9 @@ def source(self, value):
137
140
138
141
if ycells :
139
142
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" ])
143
146
with self ._ydoc .begin_transaction () as t :
144
147
for ytext in ytexts_to_clear :
145
148
ytext .delete (t , 0 , 1 )
@@ -153,18 +156,3 @@ def observe(self, callback):
153
156
self ._subscriptions [cell ] = cell .observe (callback )
154
157
self ._subscriptions [self ._ycells ] = self ._ycells .observe (callback )
155
158
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