cubevis 1.0.52__py3-none-any.whl → 1.0.56__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
cubevis/__version__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '1.0.52'
1
+ __version__ = '1.0.56'
@@ -1,56 +1,91 @@
1
+ from cubevis.utils import is_colab
1
2
  import websockets
2
3
  import http
3
- from websockets.http import Headers
4
+ from websockets.http11 import Response # Available in newer versions
4
5
 
5
6
  log_path = "/content/package_debug.txt"
6
7
 
7
- class ColabWebSocketServerProtocol(websockets.WebSocketServerProtocol):
8
- async def process_request(self, path, request_headers):
9
- is_upgrade = "upgrade" in request_headers.get("Connection", "").lower()
8
+ try:
9
+ # Modern implementation (v14+)
10
+ from websockets.server import ServerConnection as BaseConnection
11
+ IS_LEGACY = False
12
+ except ImportError:
13
+ # Legacy implementation (<v14)
14
+ from websockets.server import WebSocketServerProtocol as BaseConnection
15
+ IS_LEGACY = True
16
+
17
+ class ColabWebSocketServerProtocol(BaseConnection):
18
+ def __init__(self, *args, **kwargs):
19
+ with open(log_path, "a") as f:
20
+ print(f"ColabWebSocketServerProtocol.__init__ Initializing Protocol with args={args} kwargs={kwargs}", file=f)
21
+ super().__init__(*args, **kwargs)
22
+
23
+ async def process_request(self, *args):
24
+ """Handle both old (path, headers) and new (request) signatures."""
25
+ if IS_LEGACY:
26
+ path, request_headers = args
27
+ request_method = getattr(self, "request_method", "GET")
28
+ else:
29
+ # Modern version passes (request) as the only arg
30
+ request = args[0]
31
+ path = request.path
32
+ request_headers = request.headers
33
+ request_method = request.method
10
34
 
11
- # Get the request method
12
- request_method = self.request_method
13
- with open(log_file_path, "w") as f:
14
- print(f"Handling request method: {request_method}", file=f)
35
+ with open(log_path, "a") as f:
36
+ print(f"ColabWebSocketServerProtocol.process_request: request_header={request_header} request_method={request_method}", file=f)
37
+
38
+ # Logic for CORS/OPTIONS remains similar, but response format differs
39
+ is_upgrade = "upgrade" in request_headers.get("Connection", "").lower()
15
40
 
16
41
  if not is_upgrade:
17
- response_headers = Headers()
18
42
  origin = request_headers.get("Origin")
19
-
43
+ headers = {"Content-Type": "text/plain", "Connection": "close"}
20
44
  if origin:
21
- response_headers["Access-Control-Allow-Origin"] = origin
22
- response_headers["Access-Control-Allow-Credentials"] = "true"
23
- # Add necessary headers for the OPTIONS preflight response
24
- response_headers["Access-Control-Allow-Methods"] = "GET, OPTIONS"
25
- response_headers["Access-Control-Allow-Headers"] = "Content-Type, Authorization"
45
+ headers.update({
46
+ "Access-Control-Allow-Origin": origin,
47
+ "Access-Control-Allow-Credentials": "true",
48
+ })
26
49
 
27
- response_headers["Content-Type"] = "text/plain"
28
- response_headers["Connection"] = "close"
29
-
30
- # If it is an OPTIONS request, return 204 No Content immediately
31
50
  if request_method == "OPTIONS":
32
- return http.HTTPStatus.NO_CONTENT, response_headers, b"" # 204 Status and empty body
33
-
34
- # If it is a GET request (the priming fetch), return 200 OK
51
+ return self._format_response(http.HTTPStatus.NO_CONTENT, headers, b"")
35
52
  if request_method == "GET":
36
- return http.HTTPStatus.OK, response_headers, b"OK"
53
+ return self._format_response(http.HTTPStatus.OK, headers, b"OK")
37
54
 
38
- # Proceed with standard WS handshake
39
55
  return None
40
56
 
57
+ def _format_response(self, status, headers, body):
58
+ """Helper to return the correct type based on version."""
59
+ if IS_LEGACY:
60
+ # Legacy expects (status, headers, body)
61
+ return status, headers, body
62
+ else:
63
+ # Modern expects a Response object or self.respond call
64
+ return self.respond(status, body, headers)
65
+
41
66
  def create_ws_server(callback, ip_address, port):
42
67
  """
43
- Uniform wrapper for creating a WebSocket server.
68
+ Uniform wrapper for creating a WebSocket server supporting all versions.
44
69
  """
45
- if is_colab( ):
46
- with open(log_file_path, "w") as f:
47
- print( f'''websocket startup: {ip_address}/{port} (bind IP 0.0.0.0)
48
- with websockets.serve( callback, "0.0.0.0", {port}, origins=None, create_protocol={ColabWebSocketServerProtocol} )"''' , file=f)
49
- return websockets.serve( callback,
50
- "0.0.0.0",
51
- port,
52
- origins=None,
53
- create_protocol=ColabWebSocketServerProtocol # This bypasses the strict check
54
- )
70
+ # Prepare base arguments
71
+ kwargs = {
72
+ "ws_handler": callback, # In newer versions 'callback' is the first positional or 'ws_handler'
73
+ "host": "0.0.0.0" if is_colab() else ip_address,
74
+ "port": port,
75
+ "origins": None
76
+ }
77
+
78
+ # Inject the custom protocol class using the correct version-specific key
79
+ if IS_LEGACY:
80
+ kwargs["create_protocol"] = ColabWebSocketServerProtocol
55
81
  else:
56
- return websockets.serve( callback, ip_address, port )
82
+ kwargs["create_connection"] = ColabWebSocketServerProtocol
83
+
84
+ if is_colab():
85
+ with open(log_path, "a") as f:
86
+ f.write(f"Websocket startup: {kwargs['host']}:{port}\n")
87
+ f.write(f"Using class: {ColabWebSocketServerProtocol.__name__}\n")
88
+ f.write(f"Version mode: {'Legacy' if IS_LEGACY else 'Modern'}\n")
89
+
90
+ # Use **kwargs to bypass signature differences between library versions
91
+ return websockets.serve(**kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cubevis
3
- Version: 1.0.52
3
+ Version: 1.0.56
4
4
  Summary: visualization toolkit and apps for casa
5
5
  License: LGPL
6
6
  Author-email: Darrell Schiebel <darrell@schiebel.us>,Pam Harris <pharris@nrao.edu>
@@ -55,7 +55,7 @@ cubevis/bokeh/sources/_image_data_source.py,sha256=5sEWdfqoMk08HQ0JWg6bHJ34dWmph
55
55
  cubevis/bokeh/sources/_image_pipe.py,sha256=pQ05VynLuJbedGja7aXDbVXFkOYbdMceOuOEj-QuluQ,28692
56
56
  cubevis/bokeh/sources/_spectra_data_source.py,sha256=qL1IOjSefWlycaqS4Pz5EHwg-1EwCVmNwxysP9lxDeM,2451
57
57
  cubevis/bokeh/sources/_updatable_data_source.py,sha256=mjV1u3ZpRE5KCHtZA4tV1JxMf09Ifh4elSWlf6jNXQo,10985
58
- cubevis/bokeh/sources/transport/__init__.py,sha256=XqzCpN6zvwQGOE_Y7MvLIiZMElxZnxa3__ifhr5oE5I,2431
58
+ cubevis/bokeh/sources/transport/__init__.py,sha256=uUGjgekjD5zpV4R3YiNO0q-txZb4OTjIaxL9vcq-XKE,3617
59
59
  cubevis/bokeh/state/__init__.py,sha256=PZ2-7I5XHkMTc-vguYarYCYSJ1pKyEYnSAFa-n8AuTE,1826
60
60
  cubevis/bokeh/state/_current.py,sha256=owPMQTme5SBYvIVP3Q4y9hpWHPmyhLHsS2O0sCAAqqo,967
61
61
  cubevis/bokeh/state/_initialize.py,sha256=eX06VU1KyTEyoFiAdPBA_XucCKFEgNImv1qVXfXaIkE,12881
@@ -128,8 +128,8 @@ cubevis/utils/_pkgs.py,sha256=mu2CCzndmJZYP81UkFhxveW_CisWLUvagJVolHOEVgM,2294
128
128
  cubevis/utils/_regions.py,sha256=TdAg4ZUUyhg3nFmX9_KLboqmc0LkyOdEW8M1WDR5Udk,1669
129
129
  cubevis/utils/_static.py,sha256=rN-sqXNqQ5R2M3wmPHU1GPP5OTyyWQlUPRuimCrht-g,2347
130
130
  cubevis/utils/_tiles.py,sha256=A9W1X61VOhBMTOKXVajzOIoiV2FBdO5N2SFB9SUpDOo,7336
131
- cubevis/__version__.py,sha256=vkQb1ceaEbldzWt1_XgBPzjkDQeeVWFlJPshnx5v1OQ,22
132
- cubevis-1.0.52.dist-info/WHEEL,sha256=B19PGBCYhWaz2p_UjAoRVh767nYQfk14Sn4TpIZ-nfU,87
133
- cubevis-1.0.52.dist-info/METADATA,sha256=1EOdvakK1r99OsUebAMHRGuv_oLdT_eXf7gIri0RQKY,2632
134
- cubevis-1.0.52.dist-info/licenses/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
135
- cubevis-1.0.52.dist-info/RECORD,,
131
+ cubevis/__version__.py,sha256=lqlVQQ_gocyEuutkglCnPPwmDKRFeMb8iiOua0uSROg,22
132
+ cubevis-1.0.56.dist-info/WHEEL,sha256=B19PGBCYhWaz2p_UjAoRVh767nYQfk14Sn4TpIZ-nfU,87
133
+ cubevis-1.0.56.dist-info/METADATA,sha256=XSNwuSVQWfJiNvGq-XeMzZcaAyr84PRQOC0sIBCGRtY,2632
134
+ cubevis-1.0.56.dist-info/licenses/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
135
+ cubevis-1.0.56.dist-info/RECORD,,