cubevis 1.0.56__py3-none-any.whl → 1.0.57__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.56'
1
+ __version__ = '1.0.57'
@@ -1,91 +1,80 @@
1
1
  from cubevis.utils import is_colab
2
2
  import websockets
3
3
  import http
4
- from websockets.http11 import Response # Available in newer versions
4
+ import asyncio
5
+ try:
6
+ from websockets.http11 import Response
7
+ except ImportError:
8
+ Response = None # Fallback for very old versions
5
9
 
6
10
  log_path = "/content/package_debug.txt"
7
11
 
8
12
  try:
9
- # Modern implementation (v14+)
10
13
  from websockets.server import ServerConnection as BaseConnection
11
14
  IS_LEGACY = False
12
15
  except ImportError:
13
- # Legacy implementation (<v14)
14
16
  from websockets.server import WebSocketServerProtocol as BaseConnection
15
17
  IS_LEGACY = True
16
18
 
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)
19
+ def universal_process_request(*args):
20
+ """
21
+ Handles CORS priming.
22
+ Legacy signature: (path, request_headers)
23
+ Modern signature: (request)
24
+ """
25
+ if IS_LEGACY:
26
+ # Legacy passes: (path, headers)
27
+ path, headers = args[0], args[1]
28
+ method = "GET"
29
+ else:
30
+ request = args[0]
31
+ path, headers, method = request.path, request.headers, request.method
22
32
 
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
33
+ with open(log_path, "a") as f:
34
+ f.write(f"Top-level process_request: {method} {path}\n")
34
35
 
35
- with open(log_path, "a") as f:
36
- print(f"ColabWebSocketServerProtocol.process_request: request_header={request_header} request_method={request_method}", file=f)
36
+ is_upgrade = "upgrade" in headers.get("Connection", "").lower()
37
37
 
38
- # Logic for CORS/OPTIONS remains similar, but response format differs
39
- is_upgrade = "upgrade" in request_headers.get("Connection", "").lower()
38
+ if not is_upgrade:
39
+ origin = headers.get("Origin", "*")
40
+ resp_headers = {
41
+ "Content-Type": "text/plain",
42
+ "Connection": "close",
43
+ "Access-Control-Allow-Origin": origin,
44
+ "Access-Control-Allow-Credentials": "true",
45
+ "Access-Control-Allow-Methods": "GET, OPTIONS, POST",
46
+ "Access-Control-Allow-Headers": "Content-Type, Authorization, X-Requested-With",
47
+ }
40
48
 
41
- if not is_upgrade:
42
- origin = request_headers.get("Origin")
43
- headers = {"Content-Type": "text/plain", "Connection": "close"}
44
- if origin:
45
- headers.update({
46
- "Access-Control-Allow-Origin": origin,
47
- "Access-Control-Allow-Credentials": "true",
48
- })
49
+ if method == "OPTIONS":
50
+ return (http.HTTPStatus.NO_CONTENT, resp_headers, b"") if IS_LEGACY else Response(http.HTTPStatus.NO_CONTENT, "No Content", resp_headers)
49
51
 
50
- if request_method == "OPTIONS":
51
- return self._format_response(http.HTTPStatus.NO_CONTENT, headers, b"")
52
- if request_method == "GET":
53
- return self._format_response(http.HTTPStatus.OK, headers, b"OK")
52
+ if method == "GET":
53
+ return (http.HTTPStatus.OK, resp_headers, b"OK") if IS_LEGACY else Response(http.HTTPStatus.OK, "OK", resp_headers)
54
54
 
55
- return None
55
+ return None
56
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)
57
+ class ColabWebSocketServerProtocol(BaseConnection):
58
+ def __init__(self, *args, **kwargs):
59
+ with open(log_path, "a") as f:
60
+ f.write(f"ColabWebSocketServerProtocol.__init__ constructed\n")
61
+ super().__init__(*args, **kwargs)
65
62
 
66
63
  def create_ws_server(callback, ip_address, port):
67
- """
68
- Uniform wrapper for creating a WebSocket server supporting all versions.
69
- """
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,
64
+ host = "0.0.0.0" if is_colab() else ip_address
65
+
66
+ # Pass everything. websockets.serve ignores unknown kwargs.
67
+ conf = {
68
+ "host": host,
74
69
  "port": port,
75
- "origins": None
70
+ "origins": None,
71
+ "process_request": universal_process_request,
72
+ "create_connection": ColabWebSocketServerProtocol,
73
+ "create_protocol": ColabWebSocketServerProtocol
76
74
  }
77
75
 
78
- # Inject the custom protocol class using the correct version-specific key
79
- if IS_LEGACY:
80
- kwargs["create_protocol"] = ColabWebSocketServerProtocol
81
- else:
82
- kwargs["create_connection"] = ColabWebSocketServerProtocol
83
-
84
76
  if is_colab():
85
77
  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")
78
+ f.write(f"Websocket startup: {host}:{port} | Mode: {'Legacy' if IS_LEGACY else 'Modern'}\n")
89
79
 
90
- # Use **kwargs to bypass signature differences between library versions
91
- return websockets.serve(**kwargs)
80
+ return websockets.serve(callback, **conf)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cubevis
3
- Version: 1.0.56
3
+ Version: 1.0.57
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=uUGjgekjD5zpV4R3YiNO0q-txZb4OTjIaxL9vcq-XKE,3617
58
+ cubevis/bokeh/sources/transport/__init__.py,sha256=3GndkyA6IjBpzmyTdWcv57wjIhaWbwdw4S7YRCmPf_g,2711
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=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,,
131
+ cubevis/__version__.py,sha256=EUC4hHKVVCOux1CoHox94dqZjOBLxEP5FyomwB3-pmo,22
132
+ cubevis-1.0.57.dist-info/WHEEL,sha256=B19PGBCYhWaz2p_UjAoRVh767nYQfk14Sn4TpIZ-nfU,87
133
+ cubevis-1.0.57.dist-info/METADATA,sha256=p1UD-wQzS8TN3K6wX6jc-oQIDVPJI4TMy5tclx16IrE,2632
134
+ cubevis-1.0.57.dist-info/licenses/LICENSE,sha256=IMF9i4xIpgCADf0U-V1cuf9HBmqWQd3qtI3FSuyW4zE,26526
135
+ cubevis-1.0.57.dist-info/RECORD,,