sf-queue-sdk 0.5.0b45__tar.gz → 0.5.0b47__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 (31) hide show
  1. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/.gitignore +1 -0
  2. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/PKG-INFO +1 -1
  3. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/pyproject.toml +1 -1
  4. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/__init__.py +1 -1
  5. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/email/v1/email_pb2.py +3 -3
  6. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/prompt_ingest/v1/prompt_ingest_pb2.py +3 -3
  7. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/tool_assignment/v1/tool_assignment_pb2.py +3 -3
  8. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/topic_assignment/v1/topic_assignment_pb2.py +3 -3
  9. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/document_upload_queue.py +8 -4
  10. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/tests/test_idempotency.py +29 -5
  11. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/README.md +0 -0
  12. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/client.py +0 -0
  13. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/__init__.py +0 -0
  14. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/email/v1/email_pb2.pyi +0 -0
  15. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/prompt_ingest/v1/prompt_ingest_pb2.pyi +0 -0
  16. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/tool_assignment/v1/tool_assignment_pb2.pyi +0 -0
  17. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/generated/queue/topic_assignment/v1/topic_assignment_pb2.pyi +0 -0
  18. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/query.py +0 -0
  19. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/__init__.py +0 -0
  20. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/base_queue.py +0 -0
  21. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/document_notes_queue.py +0 -0
  22. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/document_persist_queue.py +0 -0
  23. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/email_queue.py +0 -0
  24. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/pdf_to_image_queue.py +0 -0
  25. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/prompt_ingest_queue.py +0 -0
  26. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/recommendation_queue.py +0 -0
  27. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/tool_assignment_queue.py +0 -0
  28. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/queues/topic_assignment_queue.py +0 -0
  29. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/redis_client.py +0 -0
  30. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/sanitize.py +0 -0
  31. {sf_queue_sdk-0.5.0b45 → sf_queue_sdk-0.5.0b47}/queue_sdk/types.py +0 -0
@@ -66,3 +66,4 @@ scripts/mp3-results/
66
66
  scripts/studyset/.env
67
67
  scripts/studyset/downloads/
68
68
  scripts/failed-files/
69
+ benchmark-results/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sf-queue-sdk
3
- Version: 0.5.0b45
3
+ Version: 0.5.0b47
4
4
  Summary: Python SDK for sf-queue - Redis-based queue system
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: redis>=5.0.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sf-queue-sdk"
3
- version = "0.5.0b45"
3
+ version = "0.5.0b47"
4
4
  description = "Python SDK for sf-queue - Redis-based queue system"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  """sf-queue Python SDK - Redis-based queue system."""
2
2
 
3
- __version__ = "0.5.0b45"
3
+ __version__ = "0.5.0b47"
4
4
 
5
5
  from queue_sdk.client import QueueClient
6
6
  from queue_sdk.query import QueryClient
@@ -2,7 +2,7 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # NO CHECKED-IN PROTOBUF GENCODE
4
4
  # source: queue/email/v1/email.proto
5
- # Protobuf Python Version: 7.36.0
5
+ # Protobuf Python Version: 7.35.1
6
6
  """Generated protocol buffer code."""
7
7
  from google.protobuf import descriptor as _descriptor
8
8
  from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
12
12
  _runtime_version.ValidateProtobufRuntimeVersion(
13
13
  _runtime_version.Domain.PUBLIC,
14
14
  7,
15
- 36,
16
- 0,
15
+ 35,
16
+ 1,
17
17
  '',
18
18
  'queue/email/v1/email.proto'
19
19
  )
@@ -2,7 +2,7 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # NO CHECKED-IN PROTOBUF GENCODE
4
4
  # source: queue/prompt_ingest/v1/prompt_ingest.proto
5
- # Protobuf Python Version: 7.36.0
5
+ # Protobuf Python Version: 7.35.1
6
6
  """Generated protocol buffer code."""
7
7
  from google.protobuf import descriptor as _descriptor
8
8
  from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
12
12
  _runtime_version.ValidateProtobufRuntimeVersion(
13
13
  _runtime_version.Domain.PUBLIC,
14
14
  7,
15
- 36,
16
- 0,
15
+ 35,
16
+ 1,
17
17
  '',
18
18
  'queue/prompt_ingest/v1/prompt_ingest.proto'
19
19
  )
@@ -2,7 +2,7 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # NO CHECKED-IN PROTOBUF GENCODE
4
4
  # source: queue/tool_assignment/v1/tool_assignment.proto
5
- # Protobuf Python Version: 7.36.0
5
+ # Protobuf Python Version: 7.35.1
6
6
  """Generated protocol buffer code."""
7
7
  from google.protobuf import descriptor as _descriptor
8
8
  from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
12
12
  _runtime_version.ValidateProtobufRuntimeVersion(
13
13
  _runtime_version.Domain.PUBLIC,
14
14
  7,
15
- 36,
16
- 0,
15
+ 35,
16
+ 1,
17
17
  '',
18
18
  'queue/tool_assignment/v1/tool_assignment.proto'
19
19
  )
@@ -2,7 +2,7 @@
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # NO CHECKED-IN PROTOBUF GENCODE
4
4
  # source: queue/topic_assignment/v1/topic_assignment.proto
5
- # Protobuf Python Version: 7.36.0
5
+ # Protobuf Python Version: 7.35.1
6
6
  """Generated protocol buffer code."""
7
7
  from google.protobuf import descriptor as _descriptor
8
8
  from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
12
12
  _runtime_version.ValidateProtobufRuntimeVersion(
13
13
  _runtime_version.Domain.PUBLIC,
14
14
  7,
15
- 36,
16
- 0,
15
+ 35,
16
+ 1,
17
17
  '',
18
18
  'queue/topic_assignment/v1/topic_assignment.proto'
19
19
  )
@@ -9,7 +9,7 @@ from queue_sdk.queues.base_queue import BaseQueue
9
9
  from queue_sdk.redis_client import status_key
10
10
  from queue_sdk.types import DocumentUploadStatus, SendResult
11
11
 
12
- STATUS_TTL_SECONDS = 3600
12
+ STATUS_TTL_SECONDS = 7200
13
13
 
14
14
 
15
15
  class DocumentUploadQueue(BaseQueue):
@@ -137,7 +137,7 @@ class DocumentUploadQueue(BaseQueue):
137
137
  """Write the initial queued status hash after enqueuing."""
138
138
  key = status_key(self._environment, self._queue_name, request_id)
139
139
  now = datetime.now(timezone.utc).isoformat()
140
- self._redis.hset(key, mapping={
140
+ initial_status = {
141
141
  "status": "queued",
142
142
  "step": "",
143
143
  "stepNumber": "0",
@@ -148,8 +148,12 @@ class DocumentUploadQueue(BaseQueue):
148
148
  "startedAt": "",
149
149
  "updatedAt": now,
150
150
  "error": "",
151
- })
152
- self._redis.expire(key, STATUS_TTL_SECONDS)
151
+ }
152
+ pipe = self._redis.pipeline(transaction=False)
153
+ for field, value in initial_status.items():
154
+ pipe.hsetnx(key, field, value)
155
+ pipe.expire(key, STATUS_TTL_SECONDS)
156
+ pipe.execute()
153
157
 
154
158
  @staticmethod
155
159
  def _build_payload(
@@ -5,6 +5,31 @@ import unittest
5
5
  from queue_sdk.queues.document_upload_queue import DocumentUploadQueue
6
6
 
7
7
 
8
+ class FakePipeline:
9
+ def __init__(self, redis: "FakeRedis") -> None:
10
+ self.redis = redis
11
+ self.operations: list[tuple[str, tuple[object, ...]]] = []
12
+
13
+ def hsetnx(self, *args: object) -> "FakePipeline":
14
+ self.operations.append(("hsetnx", args))
15
+ return self
16
+
17
+ def expire(self, *args: object) -> "FakePipeline":
18
+ self.operations.append(("expire", args))
19
+ return self
20
+
21
+ def execute(self) -> None:
22
+ hsetnx_count = sum(
23
+ operation == "hsetnx"
24
+ for operation, _ in self.operations
25
+ )
26
+ if hsetnx_count != 10:
27
+ raise AssertionError("unexpected initial status field count")
28
+ if self.operations[-1][1][1] != 7200:
29
+ raise AssertionError("unexpected status TTL")
30
+ self.redis.status_writes += 1
31
+
32
+
8
33
  class FakeRedis:
9
34
  """Redis test double for the idempotent enqueue script."""
10
35
 
@@ -49,11 +74,10 @@ class FakeRedis:
49
74
 
50
75
  return [request_id, 1]
51
76
 
52
- def hset(self, *_args: object, **_kwargs: object) -> None:
53
- self.status_writes += 1
54
-
55
- def expire(self, *_args: object, **_kwargs: object) -> None:
56
- pass
77
+ def pipeline(self, *, transaction: bool) -> FakePipeline:
78
+ if transaction:
79
+ raise AssertionError("status initialization should not use a transaction")
80
+ return FakePipeline(self)
57
81
 
58
82
 
59
83
  def send_upload(