11import threading
22from datetime import timedelta
3+ from packaging import version
34from typing import Dict , Optional , Union
45
56import csp
1314except ImportError :
1415 raise ImportError ("perspective adapter requires tornado package" )
1516
16-
1717try :
18- from perspective import PerspectiveManager , Table as Table_ , View as View_ , __version__ , set_threadpool_size
18+ from perspective import Server , Table as Table_ , View as View_ , __version__ , set_threadpool_size
19+
20+ if version .parse (__version__ ) >= version .parse ("3" ):
21+ _PERSPECTIVE_3 = True
22+ elif version .parse (__version__ ) >= version .parse ("0.6.2" ):
23+ from perspective import PerspectiveManager
1924
20- MAJOR , MINOR , PATCH = map ( int , __version__ . split ( "." ))
21- if ( MAJOR , MINOR , PATCH ) < ( 0 , 6 , 2 ) :
25+ _PERSPECTIVE_3 = False
26+ else :
2227 raise ImportError ("perspective adapter requires 0.6.2 or greater of the perspective-python package" )
2328except ImportError :
2429 raise ImportError ("perspective adapter requires 0.6.2 or greater of the perspective-python package" )
2530
2631
2732# Run perspective update in a separate tornado loop
28- def perspective_thread (manager ):
33+ def perspective_thread (client ):
2934 loop = tornado .ioloop .IOLoop ()
30- manager .set_loop_callback (loop .add_callback )
35+ client .set_loop_callback (loop .add_callback )
3136 loop .start ()
3237
3338
@@ -54,7 +59,7 @@ def _apply_updates(table: object, data: {str: ts[object]}, throttle: timedelta):
5459
5560
5661@csp .node
57- def _launch_application (port : int , manager : object , stub : ts [object ]):
62+ def _launch_application (port : int , server : object , stub : ts [object ]):
5863 with csp .state ():
5964 s_app = None
6065 s_ioloop = None
@@ -63,10 +68,14 @@ def _launch_application(port: int, manager: object, stub: ts[object]):
6368 with csp .start ():
6469 from perspective import PerspectiveTornadoHandler
6570
71+ if _PERSPECTIVE_3 :
72+ handler_args = {"perspective_server" : server , "check_origin" : True }
73+ else :
74+ handler_args = {"manager" : server , "check_origin" : True }
6675 s_app = tornado .web .Application (
6776 [
6877 # create a websocket endpoint that the client Javascript can access
69- (r"/websocket" , PerspectiveTornadoHandler , { "manager" : manager , "check_origin" : True } )
78+ (r"/websocket" , PerspectiveTornadoHandler , handler_args )
7079 ],
7180 websocket_ping_interval = 15 ,
7281 )
@@ -197,20 +206,29 @@ def create_table(self, name, limit=None, index=None):
197206
198207 def _instantiate (self ):
199208 set_threadpool_size (self ._threadpool_size )
200-
201- manager = PerspectiveManager ()
202-
203- thread = threading .Thread (target = perspective_thread , kwargs = dict (manager = manager ))
209+ if _PERSPECTIVE_3 :
210+ server = Server ()
211+ client = server .new_local_client ()
212+ thread = threading .Thread (target = perspective_thread , kwargs = dict (client = client ))
213+ else :
214+ manager = PerspectiveManager ()
215+ thread = threading .Thread (target = perspective_thread , kwargs = dict (manager = manager ))
204216 thread .daemon = True
205217 thread .start ()
206218
207219 for table_name , table in self ._tables .items ():
208220 schema = {
209221 k : v .tstype .typ if not issubclass (v .tstype .typ , csp .Enum ) else str for k , v in table .columns .items ()
210222 }
211- ptable = Table (schema , limit = table .limit , index = table .index )
212- manager .host_table (table_name , ptable )
223+ if _PERSPECTIVE_3 :
224+ ptable = Table (schema , limit = table .limit , index = table .index )
225+ manager .host_table (table_name , ptable )
226+ else :
227+ ptable = client .table (schema , name = table_name , limit = table .limit , index = table .index )
213228
214229 _apply_updates (ptable , table .columns , self ._throttle )
215230
216- _launch_application (self ._port , manager , csp .const ("stub" ))
231+ if _PERSPECTIVE_3 :
232+ _launch_application (self ._port , server , csp .const ("stub" ))
233+ else :
234+ _launch_application (self ._port , manager , csp .const ("stub" ))
0 commit comments