DefStream 0.1.14__tar.gz → 0.1.16__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 (173) hide show
  1. {defstream-0.1.14 → defstream-0.1.16}/.github/workflows/ci.yml +45 -87
  2. {defstream-0.1.14 → defstream-0.1.16}/.gitignore +0 -4
  3. {defstream-0.1.14 → defstream-0.1.16}/DefStream.egg-info/PKG-INFO +487 -14
  4. {defstream-0.1.14 → defstream-0.1.16}/DefStream.egg-info/SOURCES.txt +51 -5
  5. defstream-0.1.16/DefStream.egg-info/requires.txt +6 -0
  6. {defstream-0.1.14 → defstream-0.1.16}/PKG-INFO +487 -14
  7. {defstream-0.1.14 → defstream-0.1.16}/README.en.md +499 -11
  8. {defstream-0.1.14 → defstream-0.1.16}/README.md +484 -11
  9. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/8/REQUIREMENTS.md +3 -3
  10. defstream-0.1.16/issues/fix/24/IMPLEMENTS.md +25 -0
  11. defstream-0.1.16/issues/fix/24/ISSUE.md +14 -0
  12. defstream-0.1.16/issues/fix/24/README.md +7 -0
  13. defstream-0.1.16/issues/fix/24/REQUIREMENTS.md +48 -0
  14. defstream-0.1.16/issues/fix/25/IMPLEMENTS.md +61 -0
  15. defstream-0.1.16/issues/fix/25/ISSUE.md +13 -0
  16. defstream-0.1.16/issues/fix/25/README.md +38 -0
  17. defstream-0.1.16/issues/fix/25/REQUIREMENTS.md +107 -0
  18. defstream-0.1.16/issues/fix/25/TASK.md +38 -0
  19. defstream-0.1.16/samples/Broker/RabbitMQ/Sample.RPC.py +188 -0
  20. defstream-0.1.16/samples/Broker/RabbitMQ/Sample.Stream.py +102 -0
  21. defstream-0.1.16/samples/Broker/RabbitMQ/Sample.py +146 -0
  22. defstream-0.1.16/samples/Broker/Redis/Sample.Stream.py +87 -0
  23. defstream-0.1.16/samples/Broker/Redis/Sample.py +76 -0
  24. {defstream-0.1.14 → defstream-0.1.16}/samples/Worker/RabbitMQ/Worker.py +5 -5
  25. {defstream-0.1.14 → defstream-0.1.16}/samples/Worker/Redis/Sample.py +5 -5
  26. {defstream-0.1.14 → defstream-0.1.16}/setup.py +3 -3
  27. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Configuration.py +48 -0
  28. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Connection.py +542 -0
  29. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Consumer.py +359 -0
  30. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Event.py +127 -0
  31. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Exchange.py +278 -0
  32. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Policies.py +9 -0
  33. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Queue.py +319 -0
  34. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Serializer.py +61 -0
  35. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Stream.py +179 -0
  36. defstream-0.1.16/src/Broker/Implements/RabbitMQ/Subscription.py +74 -0
  37. defstream-0.1.16/src/Broker/Implements/RabbitMQ/__init__.py +47 -0
  38. defstream-0.1.16/src/Broker/Implements/Redis/Configuration.py +59 -0
  39. defstream-0.1.16/src/Broker/Implements/Redis/Connection.py +265 -0
  40. defstream-0.1.16/src/Broker/Implements/Redis/Consumer.py +364 -0
  41. defstream-0.1.16/src/Broker/Implements/Redis/Event.py +191 -0
  42. defstream-0.1.16/src/Broker/Implements/Redis/Queue.py +284 -0
  43. defstream-0.1.16/src/Broker/Implements/Redis/Serializer.py +48 -0
  44. defstream-0.1.16/src/Broker/Implements/Redis/Subscription.py +46 -0
  45. defstream-0.1.16/src/Broker/Implements/Redis/__init__.py +29 -0
  46. defstream-0.1.14/src/Inspector/Extensions/HealthCheck.py → defstream-0.1.16/src/Inspector/Extensions/Ping.py +8 -8
  47. defstream-0.1.14/src/Inspector/Extensions/Dashboard.html → defstream-0.1.16/src/Inspector/Extensions/Status.html +2 -2
  48. defstream-0.1.14/src/Inspector/Extensions/Dashboard.py → defstream-0.1.16/src/Inspector/Extensions/Status.py +13 -13
  49. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Extensions/__init__.py +4 -4
  50. defstream-0.1.16/tests/test_broker_packaging.py +108 -0
  51. {defstream-0.1.14 → defstream-0.1.16}/tests/test_inspector.py +21 -21
  52. {defstream-0.1.14 → defstream-0.1.16}/tests/test_inspector_logging.py +4 -4
  53. defstream-0.1.16/tests/test_rabbitmq_broker_methods.py +139 -0
  54. defstream-0.1.16/tests/test_rabbitmq_integration.py +143 -0
  55. defstream-0.1.16/tests/test_rabbitmq_logging.py +489 -0
  56. defstream-0.1.16/tests/test_rabbitmq_priorities.py +442 -0
  57. defstream-0.1.16/tests/test_rabbitmq_release_workflow.py +398 -0
  58. defstream-0.1.16/tests/test_rabbitmq_rpc.py +417 -0
  59. defstream-0.1.16/tests/test_rabbitmq_rpc_integration.py +240 -0
  60. defstream-0.1.16/tests/test_rabbitmq_worker.py +301 -0
  61. defstream-0.1.16/tests/test_redis.py +292 -0
  62. defstream-0.1.16/tests/test_redis_integration.py +322 -0
  63. defstream-0.1.16/tests/test_redis_logging.py +336 -0
  64. defstream-0.1.16/tests/test_redis_release_workflow.py +398 -0
  65. {defstream-0.1.14 → defstream-0.1.16}/tests/test_release_workflow.py +13 -4
  66. defstream-0.1.14/tests/test_dashboard.py → defstream-0.1.16/tests/test_status.py +30 -17
  67. defstream-0.1.14/tests/test_dashboard_ui.cjs → defstream-0.1.16/tests/test_status_ui.cjs +2 -2
  68. defstream-0.1.14/DefStream.egg-info/requires.txt +0 -6
  69. {defstream-0.1.14 → defstream-0.1.16}/.github/ISSUE_TEMPLATE/01.feature.yml +0 -0
  70. {defstream-0.1.14 → defstream-0.1.16}/.github/ISSUE_TEMPLATE/02.bug.yml +0 -0
  71. {defstream-0.1.14 → defstream-0.1.16}/.github/ISSUE_TEMPLATE/03.fix.yml +0 -0
  72. {defstream-0.1.14 → defstream-0.1.16}/.github/ISSUE_TEMPLATE/04.task.yml +0 -0
  73. {defstream-0.1.14 → defstream-0.1.16}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  74. {defstream-0.1.14 → defstream-0.1.16}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  75. {defstream-0.1.14 → defstream-0.1.16}/DefStream.egg-info/dependency_links.txt +0 -0
  76. {defstream-0.1.14 → defstream-0.1.16}/DefStream.egg-info/top_level.txt +0 -0
  77. {defstream-0.1.14 → defstream-0.1.16}/LICENSE +0 -0
  78. {defstream-0.1.14 → defstream-0.1.16}/issues/bug/16/IMPLEMENTS.md +0 -0
  79. {defstream-0.1.14 → defstream-0.1.16}/issues/bug/16/ISSUE.md +0 -0
  80. {defstream-0.1.14 → defstream-0.1.16}/issues/bug/16/README.md +0 -0
  81. {defstream-0.1.14 → defstream-0.1.16}/issues/bug/16/REQUIREMENTS.md +0 -0
  82. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/1/IMPLEMENTS.md +0 -0
  83. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/1/README.md +0 -0
  84. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/1/REQUIREMENTS.md +0 -0
  85. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/1/TASK.md +0 -0
  86. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/1/ci.refs.json +0 -0
  87. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/8/IMPLEMENTS.md +0 -0
  88. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/8/README.md +0 -0
  89. {defstream-0.1.14 → defstream-0.1.16}/issues/feature/8/ci.refs.json +0 -0
  90. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/10/IMPLEMENTS.md +0 -0
  91. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/10/README.md +0 -0
  92. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/10/REQUIREMENTS.md +0 -0
  93. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/13/README.md +0 -0
  94. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/21/IMPLEMENTS.md +0 -0
  95. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/21/ISSUE.md +0 -0
  96. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/21/README.md +0 -0
  97. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/21/REQUIREMENTS.md +0 -0
  98. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/3/IMPLEMENTS.md +0 -0
  99. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/3/README.md +0 -0
  100. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/3/REQUIREMENTS.md +0 -0
  101. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/3/ci.refs.json +0 -0
  102. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/6/IMPLEMENTS.md +0 -0
  103. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/6/README.md +0 -0
  104. {defstream-0.1.14 → defstream-0.1.16}/issues/fix/6/REQUIREMENTS.md +0 -0
  105. {defstream-0.1.14 → defstream-0.1.16}/issues/task/18/IMPLEMENTS.md +0 -0
  106. {defstream-0.1.14 → defstream-0.1.16}/issues/task/18/README.md +0 -0
  107. {defstream-0.1.14 → defstream-0.1.16}/issues/task/18/REQUIREMENTS.md +0 -0
  108. {defstream-0.1.14 → defstream-0.1.16}/samples/Broker/Sample.py +0 -0
  109. {defstream-0.1.14 → defstream-0.1.16}/samples/Worker/RabbitMQ/Client.py +0 -0
  110. {defstream-0.1.14 → defstream-0.1.16}/samples/Worker/RabbitMQ/Tasks.py +0 -0
  111. {defstream-0.1.14 → defstream-0.1.16}/samples/Worker/Sample.py +0 -0
  112. {defstream-0.1.14 → defstream-0.1.16}/setup.cfg +0 -0
  113. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Configuration.py +0 -0
  114. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Connection.py +0 -0
  115. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Consumer.py +0 -0
  116. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Errors.py +0 -0
  117. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Event.py +0 -0
  118. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Implements/__init__.py +0 -0
  119. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Policies.py +0 -0
  120. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Priority.py +0 -0
  121. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/Protocol.py +0 -0
  122. {defstream-0.1.14 → defstream-0.1.16}/src/Broker/__init__.py +0 -0
  123. {defstream-0.1.14 → defstream-0.1.16}/src/Descriptor/DataObject.py +0 -0
  124. {defstream-0.1.14 → defstream-0.1.16}/src/Descriptor/Types.py +0 -0
  125. {defstream-0.1.14 → defstream-0.1.16}/src/Descriptor/Value.py +0 -0
  126. {defstream-0.1.14 → defstream-0.1.16}/src/Descriptor/__init__.py +0 -0
  127. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Extension.py +0 -0
  128. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Extensions/Console.html +0 -0
  129. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Extensions/Console.py +0 -0
  130. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Extensions/Metrics.py +0 -0
  131. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Extensions/Specifications.py +0 -0
  132. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Inspector.py +0 -0
  133. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/Response.py +0 -0
  134. {defstream-0.1.14 → defstream-0.1.16}/src/Inspector/__init__.py +0 -0
  135. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Pattern.py +0 -0
  136. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Array.py +0 -0
  137. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Common.py +0 -0
  138. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Compare.py +0 -0
  139. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Condition.py +0 -0
  140. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/DataObject.py +0 -0
  141. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/DateTime.py +0 -0
  142. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Number.py +0 -0
  143. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Object.py +0 -0
  144. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Size.py +0 -0
  145. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/String.py +0 -0
  146. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/Type.py +0 -0
  147. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Patterns/__init__.py +0 -0
  148. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Validate.py +0 -0
  149. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/Validator.py +0 -0
  150. {defstream-0.1.14 → defstream-0.1.16}/src/Validator/__init__.py +0 -0
  151. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Executor.py +0 -0
  152. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Message.py +0 -0
  153. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Pool.py +0 -0
  154. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Run.py +0 -0
  155. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Specification.py +0 -0
  156. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Startup.py +0 -0
  157. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/Worker.py +0 -0
  158. {defstream-0.1.14 → defstream-0.1.16}/src/Worker/__init__.py +0 -0
  159. {defstream-0.1.14 → defstream-0.1.16}/src/__init__.py +0 -0
  160. {defstream-0.1.14 → defstream-0.1.16}/tests/test_descriptor.py +0 -0
  161. {defstream-0.1.14 → defstream-0.1.16}/tests/test_inspector_console.py +0 -0
  162. {defstream-0.1.14 → defstream-0.1.16}/tests/test_lifecycle_hooks.py +0 -0
  163. {defstream-0.1.14 → defstream-0.1.16}/tests/test_logging.py +0 -0
  164. {defstream-0.1.14 → defstream-0.1.16}/tests/test_pool_callbacks.py +0 -0
  165. {defstream-0.1.14 → defstream-0.1.16}/tests/test_process_signals.py +0 -0
  166. {defstream-0.1.14 → defstream-0.1.16}/tests/test_protocol_contracts.py +0 -0
  167. {defstream-0.1.14 → defstream-0.1.16}/tests/test_runner_hooks.py +0 -0
  168. {defstream-0.1.14 → defstream-0.1.16}/tests/test_specifications.py +0 -0
  169. {defstream-0.1.14 → defstream-0.1.16}/tests/test_task_messages.py +0 -0
  170. {defstream-0.1.14 → defstream-0.1.16}/tests/test_task_priorities.py +0 -0
  171. {defstream-0.1.14 → defstream-0.1.16}/tests/test_validator_patterns.py +0 -0
  172. {defstream-0.1.14 → defstream-0.1.16}/tests/test_worker.py +0 -0
  173. {defstream-0.1.14 → defstream-0.1.16}/tests/test_worker_startup.py +0 -0
@@ -30,9 +30,6 @@ jobs:
30
30
  build: ${{ steps.changes.outputs.build }}
31
31
  new_version: ${{ steps.changes.outputs.new_version }}
32
32
  tag: ${{ steps.changes.outputs.tag }}
33
- core_ref: ${{ steps.refs.outputs.core_ref }}
34
- rabbitmq_ref: ${{ steps.refs.outputs.rabbitmq_ref }}
35
- redis_ref: ${{ steps.refs.outputs.redis_ref }}
36
33
  test_required: ${{ steps.test_paths.outputs.required }}
37
34
  steps:
38
35
  - uses: actions/checkout@v7
@@ -58,7 +55,7 @@ jobs:
58
55
  base = event['pull_request']['base']['sha']
59
56
  changed = check_output([
60
57
  'git', 'diff', '--name-only', '--no-renames', '-z',
61
- f'{base}...{environ["GITHUB_SHA"]}', '--', 'samples/', 'src/', 'tests/', 'setup.py',
58
+ f'{base}...{environ["GITHUB_SHA"]}', '--', 'samples/', 'src/', 'tests/', 'setup.py', '.github/workflows/ci.yml',
62
59
  ])
63
60
  required = bool(changed)
64
61
  with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
@@ -198,43 +195,6 @@ jobs:
198
195
  with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
199
196
  output.write(f'branch={branch}\n')
200
197
  PY
201
- - name: Resolve dependency refs
202
- id: refs
203
- env:
204
- BRANCH: ${{ steps.changelog.outputs.branch }}
205
- run: |
206
- python - <<'PY'
207
- from json import loads
208
- from os import environ
209
- from pathlib import Path
210
- from subprocess import check_output, run
211
-
212
- head = environ['GITHUB_SHA']
213
- path = f'issues/{environ["BRANCH"]}/ci.refs.json'
214
- entry = check_output(['git', 'ls-tree', head, '--', path]).decode().split()
215
- refs = {}
216
- if entry:
217
- if entry[0] not in ('100644', '100755'):
218
- raise ValueError(f'Dependency refs must be a regular file: {path}')
219
- refs = loads(check_output(['git', 'show', f'{head}:{path}']).decode('utf-8'))
220
- else:
221
- print(f'{path} not found: dependency refs default to master')
222
- projects = {
223
- 'DefStream': 'core_ref',
224
- 'DefStream-RabbitMQ': 'rabbitmq_ref',
225
- 'DefStream-Redis': 'redis_ref',
226
- }
227
- if not isinstance(refs, dict) or refs.keys() - projects.keys():
228
- raise ValueError(f'Expected an object with only supported project names: {path}')
229
- with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
230
- for project, key in projects.items():
231
- ref = refs.get(project, 'master')
232
- if not isinstance(ref, str) or not ref or ref.startswith('-'):
233
- raise ValueError(f'Invalid dependency ref for {project}: {ref!r}')
234
- run(['git', 'check-ref-format', '--allow-onelevel', ref], check=True)
235
- output.write(f'{key}={ref}\n')
236
- print(f'{project} dependency ref: {ref}')
237
- PY
238
198
  - name: Preserve customer release notes
239
199
  uses: actions/upload-artifact@v7
240
200
  with:
@@ -255,7 +215,7 @@ jobs:
255
215
  matrix:
256
216
  python: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
257
217
  env:
258
- PROJECT: ${{ github.event.repository.name }}
218
+ PROJECT: DefStream
259
219
  DEFSTREAM_RABBITMQ_TESTS: '1'
260
220
  DEFSTREAM_REDIS_TESTS: '1'
261
221
  services:
@@ -285,30 +245,11 @@ jobs:
285
245
  - name: Check out core
286
246
  uses: actions/checkout@v7
287
247
  with:
288
- repository: yong5eon/DefStream
289
- ref: ${{ github.event.repository.name == 'DefStream' && github.sha || needs.changes.outputs.core_ref }}
248
+ ref: ${{ github.sha }}
290
249
  path: packages/DefStream
291
250
  fetch-depth: 0
292
251
  persist-credentials: false
293
252
 
294
- - name: Check out RabbitMQ adapter
295
- uses: actions/checkout@v7
296
- with:
297
- repository: yong5eon/DefStream-RabbitMQ
298
- ref: ${{ github.event.repository.name == 'DefStream-RabbitMQ' && github.sha || needs.changes.outputs.rabbitmq_ref }}
299
- path: packages/DefStream-RabbitMQ
300
- fetch-depth: 0
301
- persist-credentials: false
302
-
303
- - name: Check out Redis adapter
304
- uses: actions/checkout@v7
305
- with:
306
- repository: yong5eon/DefStream-Redis
307
- ref: ${{ github.event.repository.name == 'DefStream-Redis' && github.sha || needs.changes.outputs.redis_ref }}
308
- path: packages/DefStream-Redis
309
- fetch-depth: 0
310
- persist-credentials: false
311
-
312
253
  - name: Set up Python
313
254
  uses: actions/setup-python@v7
314
255
  with:
@@ -329,7 +270,7 @@ jobs:
329
270
  from re import fullmatch
330
271
 
331
272
  project = environ['PROJECT']
332
- if project not in ('DefStream', 'DefStream-RabbitMQ', 'DefStream-Redis'):
273
+ if project != 'DefStream':
333
274
  raise ValueError(f'Unexpected project: {project}')
334
275
  if environ['RELEASE_BUILD'] != 'true':
335
276
  print('Test-only build: using the existing Git-derived development version.')
@@ -353,23 +294,17 @@ jobs:
353
294
  NEW_VERSION: ${{ needs.changes.outputs.new_version }}
354
295
  WHEEL_BUILD: ${{ needs.changes.outputs.build }}
355
296
  run: |
356
- mkdir -p dist dependency-wheels
357
- for name in DefStream DefStream-RabbitMQ DefStream-Redis; do
358
- if [ "$name" = "$PROJECT" ]; then
359
- if [ "$RELEASE_BUILD" = "true" ]; then
360
- if [ "$NEW_VERSION" = "true" ]; then
361
- SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --outdir "$GITHUB_WORKSPACE/dist" "packages/$name"
362
- else
363
- SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --wheel --outdir "$GITHUB_WORKSPACE/dist" "packages/$name"
364
- fi
365
- python -m wheel tags --build "$WHEEL_BUILD" --remove dist/*.whl
366
- else
367
- python -m build --outdir "$GITHUB_WORKSPACE/dist" "packages/$name"
368
- fi
297
+ mkdir -p dist
298
+ if [ "$RELEASE_BUILD" = "true" ]; then
299
+ if [ "$NEW_VERSION" = "true" ]; then
300
+ SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --outdir "$GITHUB_WORKSPACE/dist" packages/DefStream
369
301
  else
370
- python -m build --outdir "$GITHUB_WORKSPACE/dependency-wheels" "packages/$name"
302
+ SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --wheel --outdir "$GITHUB_WORKSPACE/dist" packages/DefStream
371
303
  fi
372
- done
304
+ python -m wheel tags --build "$WHEEL_BUILD" --remove dist/*.whl
305
+ else
306
+ python -m build --outdir "$GITHUB_WORKSPACE/dist" packages/DefStream
307
+ fi
373
308
  python -m twine check --strict dist/*
374
309
 
375
310
  - name: Normalize source archive timestamps
@@ -399,31 +334,54 @@ jobs:
399
334
  path.write_bytes(buffer.getvalue())
400
335
  PY
401
336
 
337
+ - name: Verify optional client installations
338
+ run: |
339
+ python - <<'PY'
340
+ from os import environ
341
+ from pathlib import Path
342
+ from subprocess import run
343
+ from venv import EnvBuilder
344
+
345
+ wheel, = Path('dist').glob('*.whl')
346
+ for extra, modules in (
347
+ ('', ('DefStream', 'DefStream.Worker', 'DefStream.Inspector')),
348
+ ('RabbitMQ', ('DefStream.Broker.Implements.RabbitMQ',)),
349
+ ('Redis', ('DefStream.Broker.Implements.Redis',)),
350
+ ):
351
+ environment = Path(environ['RUNNER_TEMP'], 'optional-' + (extra or 'core'))
352
+ EnvBuilder(with_pip=True).create(environment)
353
+ python = environment / 'bin' / 'python'
354
+ package = str(wheel.resolve()) + (f'[{extra}]' if extra else '')
355
+ run([str(python), '-m', 'pip', 'install', package], check=True)
356
+ code = (
357
+ 'from importlib import import_module; from importlib.util import find_spec; '
358
+ f'assert (find_spec("pika") is not None) == {extra == "RabbitMQ"}; '
359
+ f'assert (find_spec("redis") is not None) == {extra == "Redis"}; '
360
+ f'[import_module(name) for name in {modules!r}]'
361
+ )
362
+ run([str(python), '-I', '-c', code], check=True)
363
+ run([str(python), '-m', 'pip', 'check'], check=True)
364
+ PY
365
+
402
366
  - name: Install built wheels into a clean environment
403
367
  run: |
404
368
  python -m venv "$RUNNER_TEMP/installed"
405
- "$RUNNER_TEMP/installed/bin/python" -m pip install dist/*.whl dependency-wheels/*.whl
369
+ "$RUNNER_TEMP/installed/bin/python" -m pip install "$(echo dist/*.whl)[RabbitMQ,Redis]"
406
370
  "$RUNNER_TEMP/installed/bin/python" -m pip check
407
371
 
408
372
  - name: Test installed package
409
373
  run: |
410
374
  cd "$RUNNER_TEMP"
411
- test_directory=test
412
- if [ "$PROJECT" = "DefStream" ]; then
413
- test_directory=tests
414
- fi
415
375
  "$RUNNER_TEMP/installed/bin/python" -m unittest discover \
416
- -s "$GITHUB_WORKSPACE/packages/$PROJECT/$test_directory" -p 'test_*.py' -v
376
+ -s "$GITHUB_WORKSPACE/packages/DefStream/tests" -p 'test_*.py' -v
417
377
 
418
378
  - name: Set up Node for core UI tests
419
- if: env.PROJECT == 'DefStream'
420
379
  uses: actions/setup-node@v7
421
380
  with:
422
381
  node-version: '22'
423
382
 
424
383
  - name: Test core UI
425
- if: env.PROJECT == 'DefStream'
426
- run: node --test packages/DefStream/tests/test_dashboard_ui.cjs
384
+ run: node --test packages/DefStream/tests/test_status_ui.cjs
427
385
 
428
386
  - name: Preserve verified release distributions
429
387
  if: needs.changes.outputs.release == 'true' && matrix.python == '3.13'
@@ -24,10 +24,6 @@ dist/
24
24
  *.egg
25
25
  .Python
26
26
 
27
- # Local broker adapter links
28
- /src/Broker/Implements/*
29
- !/src/Broker/Implements/__init__.py
30
-
31
27
  # Operating system files
32
28
  .DS_Store
33
29
  Thumbs.db