spaces 0.52.0.dev3__tar.gz → 0.52.0.dev4__tar.gz

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.
Files changed (74) hide show
  1. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/PKG-INFO +1 -1
  2. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/pyproject.toml +1 -1
  3. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/context.py +5 -5
  4. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/gradio.py +3 -3
  5. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/middleware.py +4 -4
  6. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/wrappers.py +2 -2
  7. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/README.md +0 -0
  8. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/__init__.py +0 -0
  9. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/__init__.py +0 -0
  10. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/asgiref/__init__.py +0 -0
  11. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/asgiref/typing.py +0 -0
  12. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/codefind/LICENSE +0 -0
  13. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/codefind/__init__.py +0 -0
  14. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/codefind/registry.py +0 -0
  15. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/codefind/version.py +0 -0
  16. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/LICENSE +0 -0
  17. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/__init__.py +0 -0
  18. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/codetools.py +0 -0
  19. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/parse.py +0 -0
  20. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/register.py +0 -0
  21. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/utils.py +0 -0
  22. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/jurigged/version.py +0 -0
  23. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/LICENSE +0 -0
  24. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/__init__.py +0 -0
  25. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/abc.py +0 -0
  26. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/codegen.py +0 -0
  27. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/core.py +0 -0
  28. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/dependent.py +0 -0
  29. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/medley.py +0 -0
  30. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/mro.py +0 -0
  31. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/py.typed +0 -0
  32. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/recode.py +0 -0
  33. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/signatures.py +0 -0
  34. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/typemap.py +0 -0
  35. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/types.py +0 -0
  36. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/utils.py +0 -0
  37. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/ovld/version.py +0 -0
  38. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sse_starlette/LICENSE +0 -0
  39. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sse_starlette/__init__.py +0 -0
  40. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sse_starlette/event.py +0 -0
  41. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sse_starlette/py.typed +0 -0
  42. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sse_starlette/sse.py +0 -0
  43. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sseclient/LICENSE +0 -0
  44. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/_vendor/sseclient/__init__.py +0 -0
  45. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/config.py +0 -0
  46. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/reloading/__init__.py +0 -0
  47. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/reloading/client.py +0 -0
  48. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/reloading/server.py +0 -0
  49. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/reloading/types.py +0 -0
  50. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/reloading/types.ts +0 -0
  51. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/utils.py +0 -0
  52. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/__init__.py +0 -0
  53. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/api.py +0 -0
  54. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/client.py +0 -0
  55. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/config.py +0 -0
  56. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/configs.json +0 -0
  57. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/decorator.py +0 -0
  58. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/elf.py +0 -0
  59. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/lifecycle.py +0 -0
  60. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/mmap.py +0 -0
  61. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/__init__.py +0 -0
  62. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/aoti.py +0 -0
  63. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/bitsandbytes.py +0 -0
  64. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/bitsandbytes_legacy.py +0 -0
  65. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/cudart.py +0 -0
  66. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/packing.py +0 -0
  67. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/patching.py +0 -0
  68. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/patching_legacy.py +0 -0
  69. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/static.py +0 -0
  70. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/types.py +0 -0
  71. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/torch/utils.py +0 -0
  72. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/tqdm.py +0 -0
  73. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/types.py +0 -0
  74. {spaces-0.52.0.dev3 → spaces-0.52.0.dev4}/spaces/zero/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaces
3
- Version: 0.52.0.dev3
3
+ Version: 0.52.0.dev4
4
4
  Summary: Utilities for Hugging Face Spaces
5
5
  Author: Charles Bensimon
6
6
  Author-email: Charles Bensimon <charles@huggingface.co>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "spaces"
3
- version = "0.52.0.dev3"
3
+ version = "0.52.0.dev4"
4
4
  description = "Utilities for Hugging Face Spaces"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.15"
@@ -4,6 +4,7 @@
4
4
  from contextlib import contextmanager
5
5
  from contextvars import ContextVar
6
6
  from typing import Callable
7
+ from typing import Iterable
7
8
  from typing import Literal
8
9
  from typing import TypedDict
9
10
  from uuid import UUID
@@ -66,7 +67,7 @@ class ZeroGPUContext:
66
67
  worker_contextualizer: Callable[[], Picklable[Callable[[], None]]] | None = None,
67
68
  disconnect_detector: Callable[[], bool] | None = None,
68
69
  connection_state: ConnectionState | None = None,
69
- server_port: int | None = None,
70
+ server_ports: Iterable[int] | None = None,
70
71
  headers: dict[str, str] | None = None,
71
72
  ):
72
73
  self.exception_mapper = exception_mapper or exception_mapper_default
@@ -74,7 +75,7 @@ class ZeroGPUContext:
74
75
  self.worker_contextualizer = worker_contextualizer or WorkerContextualizerDefault
75
76
  self.disconnect_detector = disconnect_detector
76
77
  self.connection_state = connection_state
77
- self.server_port = server_port
78
+ self.server_ports = set(server_ports) if server_ports is not None else set()
78
79
  self.headers = headers or {}
79
80
 
80
81
  def exception(
@@ -108,9 +109,8 @@ class ZeroGPUContext:
108
109
  def success(self, title: str, message: str):
109
110
  self.log_emitter(ZeroGPULog(title=title, message=message, level='success'))
110
111
 
111
- def server_ports(self):
112
- res = {self.server_port} if self.server_port is not None else set()
113
- return res | set(GlobalContext.server_ports.values())
112
+ def get_server_ports(self):
113
+ return self.server_ports | set(GlobalContext.server_ports.values())
114
114
 
115
115
  def disconnected(self):
116
116
  if self.disconnect_detector is not None:
@@ -24,7 +24,7 @@ from .context import ZeroGPULog
24
24
  from .lifecycle import zerogpu_mode_enabled
25
25
  from .lifecycle import zerogpu_startup
26
26
  from .middleware import ASGIScope
27
- from .middleware import get_server_port
27
+ from .middleware import get_server_ports
28
28
  from .middleware import ZeroGPUMiddleware
29
29
 
30
30
 
@@ -68,7 +68,7 @@ def error(title: str, message: str): # pragma: no cover
68
68
  return gr.Error(message, **kwargs)
69
69
 
70
70
 
71
- def log_emitter(log: ZeroGPULog):
71
+ def log_emitter(log: ZeroGPULog): # pragma: no cover
72
72
  return info(
73
73
  title=log['title'],
74
74
  message=log['message'],
@@ -130,7 +130,7 @@ def get_zerogpu_context():
130
130
  log_emitter=log_emitter,
131
131
  worker_contextualizer=WorkerContextualizer,
132
132
  disconnect_detector=disconnect_detector,
133
- server_port=get_server_port(scope) if scope is not None else None,
133
+ server_ports=get_server_ports(scope) if scope is not None else None,
134
134
  headers={key.lower(): value for key, value in dict(getattr(request, 'headers', {})).items()},
135
135
  )
136
136
 
@@ -87,18 +87,18 @@ class ZeroGPUMiddleware:
87
87
  worker_contextualizer=self.worker_contextualizer,
88
88
  disconnect_detector=self.disconnect_detector,
89
89
  connection_state=connection_state,
90
- server_port=get_server_port(asgi_scope),
90
+ server_ports=get_server_ports(asgi_scope),
91
91
  headers=_decode_headers(asgi_scope.get('headers', [])),
92
92
  )):
93
93
  await asgi_app(asgi_scope, wrapped_receive, asgi_send)
94
94
 
95
95
 
96
- def get_server_port(scope: ASGIScope):
96
+ def get_server_ports(scope: ASGIScope):
97
97
  match scope.get('server'):
98
98
  case (_, int() as port):
99
- return port
99
+ return {port}
100
100
  case _: # pragma: no cover
101
- return None
101
+ return set()
102
102
 
103
103
 
104
104
  def _decode_headers(headers: Iterable[tuple[bytes, bytes]]):
@@ -188,7 +188,7 @@ def regular_function_wrapper(
188
188
  assert worker.arg_queue.empty()
189
189
  assert worker.res_queue.empty()
190
190
  else:
191
- worker = Worker(worker_loop, allow_token, nvidia_uuid, ctx.server_ports())
191
+ worker = Worker(worker_loop, allow_token, nvidia_uuid, ctx.get_server_ports())
192
192
 
193
193
  worker_context_setup = ctx.worker_contextualizer()
194
194
 
@@ -315,7 +315,7 @@ def generator_function_wrapper(
315
315
  assert worker.arg_queue.empty()
316
316
  assert worker.res_queue.empty()
317
317
  else:
318
- worker = Worker(worker_loop, allow_token, nvidia_uuid, ctx.server_ports())
318
+ worker = Worker(worker_loop, allow_token, nvidia_uuid, ctx.get_server_ports())
319
319
 
320
320
  worker_context_setup = ctx.worker_contextualizer()
321
321
 
File without changes