DefStream 0.1.13__tar.gz → 0.1.15__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 (171) hide show
  1. defstream-0.1.13/.github/ISSUE_TEMPLATE/feature_request.yml → defstream-0.1.15/.github/ISSUE_TEMPLATE/01.feature.yml +5 -2
  2. defstream-0.1.13/.github/ISSUE_TEMPLATE/bug_report.yml → defstream-0.1.15/.github/ISSUE_TEMPLATE/02.bug.yml +4 -1
  3. defstream-0.1.15/.github/ISSUE_TEMPLATE/03.fix.yml +57 -0
  4. defstream-0.1.15/.github/ISSUE_TEMPLATE/04.task.yml +40 -0
  5. {defstream-0.1.13 → defstream-0.1.15}/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  6. {defstream-0.1.13 → defstream-0.1.15}/.github/workflows/ci.yml +68 -82
  7. {defstream-0.1.13 → defstream-0.1.15}/.gitignore +0 -4
  8. {defstream-0.1.13 → defstream-0.1.15}/DefStream.egg-info/PKG-INFO +486 -13
  9. defstream-0.1.15/DefStream.egg-info/SOURCES.txt +166 -0
  10. defstream-0.1.15/DefStream.egg-info/requires.txt +6 -0
  11. {defstream-0.1.13 → defstream-0.1.15}/PKG-INFO +486 -13
  12. {defstream-0.1.13 → defstream-0.1.15}/README.en.md +552 -13
  13. {defstream-0.1.13 → defstream-0.1.15}/README.md +483 -10
  14. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/IMPLEMENTS.md +5 -5
  15. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/README.md +2 -2
  16. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/10/IMPLEMENTS.md +3 -3
  17. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/13/README.md +1 -1
  18. defstream-0.1.15/issues/fix/21/IMPLEMENTS.md +38 -0
  19. defstream-0.1.15/issues/fix/21/ISSUE.md +17 -0
  20. defstream-0.1.15/issues/fix/21/README.md +44 -0
  21. defstream-0.1.15/issues/fix/21/REQUIREMENTS.md +68 -0
  22. defstream-0.1.15/issues/fix/25/IMPLEMENTS.md +61 -0
  23. defstream-0.1.15/issues/fix/25/ISSUE.md +13 -0
  24. defstream-0.1.15/issues/fix/25/README.md +38 -0
  25. defstream-0.1.15/issues/fix/25/REQUIREMENTS.md +107 -0
  26. defstream-0.1.15/issues/fix/25/TASK.md +38 -0
  27. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/IMPLEMENTS.md +1 -1
  28. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/6/IMPLEMENTS.md +2 -2
  29. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/6/README.md +1 -1
  30. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/6/REQUIREMENTS.md +3 -3
  31. defstream-0.1.15/issues/task/18/IMPLEMENTS.md +96 -0
  32. defstream-0.1.15/issues/task/18/README.md +37 -0
  33. defstream-0.1.15/issues/task/18/REQUIREMENTS.md +59 -0
  34. defstream-0.1.15/samples/Broker/RabbitMQ/Sample.RPC.py +188 -0
  35. defstream-0.1.15/samples/Broker/RabbitMQ/Sample.Stream.py +102 -0
  36. defstream-0.1.15/samples/Broker/RabbitMQ/Sample.py +146 -0
  37. defstream-0.1.15/samples/Broker/Redis/Sample.Stream.py +87 -0
  38. defstream-0.1.15/samples/Broker/Redis/Sample.py +76 -0
  39. {defstream-0.1.13 → defstream-0.1.15}/setup.py +2 -2
  40. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Configuration.py +48 -0
  41. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Connection.py +542 -0
  42. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Consumer.py +359 -0
  43. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Event.py +127 -0
  44. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Exchange.py +278 -0
  45. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Policies.py +9 -0
  46. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Queue.py +319 -0
  47. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Serializer.py +61 -0
  48. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Stream.py +179 -0
  49. defstream-0.1.15/src/Broker/Implements/RabbitMQ/Subscription.py +74 -0
  50. defstream-0.1.15/src/Broker/Implements/RabbitMQ/__init__.py +47 -0
  51. defstream-0.1.15/src/Broker/Implements/Redis/Configuration.py +59 -0
  52. defstream-0.1.15/src/Broker/Implements/Redis/Connection.py +265 -0
  53. defstream-0.1.15/src/Broker/Implements/Redis/Consumer.py +364 -0
  54. defstream-0.1.15/src/Broker/Implements/Redis/Event.py +191 -0
  55. defstream-0.1.15/src/Broker/Implements/Redis/Queue.py +284 -0
  56. defstream-0.1.15/src/Broker/Implements/Redis/Serializer.py +48 -0
  57. defstream-0.1.15/src/Broker/Implements/Redis/Subscription.py +46 -0
  58. defstream-0.1.15/src/Broker/Implements/Redis/__init__.py +29 -0
  59. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Common.py +2 -3
  60. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/__init__.py +2 -2
  61. defstream-0.1.15/tests/test_broker_packaging.py +108 -0
  62. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_logging.py +2 -2
  63. defstream-0.1.15/tests/test_rabbitmq_broker_methods.py +139 -0
  64. defstream-0.1.15/tests/test_rabbitmq_integration.py +143 -0
  65. defstream-0.1.15/tests/test_rabbitmq_logging.py +489 -0
  66. defstream-0.1.15/tests/test_rabbitmq_priorities.py +442 -0
  67. defstream-0.1.15/tests/test_rabbitmq_rpc.py +417 -0
  68. defstream-0.1.15/tests/test_rabbitmq_rpc_integration.py +240 -0
  69. defstream-0.1.15/tests/test_rabbitmq_worker.py +301 -0
  70. defstream-0.1.15/tests/test_redis.py +292 -0
  71. defstream-0.1.15/tests/test_redis_integration.py +322 -0
  72. defstream-0.1.15/tests/test_redis_logging.py +336 -0
  73. defstream-0.1.15/tests/test_redis_release_workflow.py +398 -0
  74. defstream-0.1.15/tests/test_release_workflow.py +469 -0
  75. defstream-0.1.15/tests/test_validator_patterns.py +48 -0
  76. defstream-0.1.13/.github/PULL_REQUEST_TEMPLATE/hotfix.md +0 -34
  77. defstream-0.1.13/DefStream.egg-info/SOURCES.txt +0 -115
  78. defstream-0.1.13/DefStream.egg-info/requires.txt +0 -6
  79. {defstream-0.1.13 → defstream-0.1.15}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  80. {defstream-0.1.13 → defstream-0.1.15}/DefStream.egg-info/dependency_links.txt +0 -0
  81. {defstream-0.1.13 → defstream-0.1.15}/DefStream.egg-info/top_level.txt +0 -0
  82. {defstream-0.1.13 → defstream-0.1.15}/LICENSE +0 -0
  83. {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/IMPLEMENTS.md +0 -0
  84. {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/ISSUE.md +0 -0
  85. {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/README.md +0 -0
  86. {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/REQUIREMENTS.md +0 -0
  87. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/IMPLEMENTS.md +0 -0
  88. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/README.md +0 -0
  89. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/REQUIREMENTS.md +0 -0
  90. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/TASK.md +0 -0
  91. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/ci.refs.json +0 -0
  92. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/REQUIREMENTS.md +0 -0
  93. {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/ci.refs.json +0 -0
  94. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/10/README.md +0 -0
  95. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/10/REQUIREMENTS.md +0 -0
  96. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/README.md +0 -0
  97. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/REQUIREMENTS.md +0 -0
  98. {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/ci.refs.json +0 -0
  99. {defstream-0.1.13/sample → defstream-0.1.15/samples}/Broker/Sample.py +0 -0
  100. {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/RabbitMQ/Client.py +0 -0
  101. {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/RabbitMQ/Tasks.py +0 -0
  102. {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/RabbitMQ/Worker.py +0 -0
  103. {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/Redis/Sample.py +0 -0
  104. {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/Sample.py +0 -0
  105. {defstream-0.1.13 → defstream-0.1.15}/setup.cfg +0 -0
  106. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Configuration.py +0 -0
  107. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Connection.py +0 -0
  108. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Consumer.py +0 -0
  109. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Errors.py +0 -0
  110. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Event.py +0 -0
  111. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Implements/__init__.py +0 -0
  112. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Policies.py +0 -0
  113. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Priority.py +0 -0
  114. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Protocol.py +0 -0
  115. {defstream-0.1.13 → defstream-0.1.15}/src/Broker/__init__.py +0 -0
  116. {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/DataObject.py +0 -0
  117. {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/Types.py +0 -0
  118. {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/Value.py +0 -0
  119. {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/__init__.py +0 -0
  120. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extension.py +0 -0
  121. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Console.html +0 -0
  122. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Console.py +0 -0
  123. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Dashboard.html +0 -0
  124. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Dashboard.py +0 -0
  125. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/HealthCheck.py +0 -0
  126. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Metrics.py +0 -0
  127. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Specifications.py +0 -0
  128. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/__init__.py +0 -0
  129. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Inspector.py +0 -0
  130. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Response.py +0 -0
  131. {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/__init__.py +0 -0
  132. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Pattern.py +0 -0
  133. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Array.py +0 -0
  134. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Compare.py +0 -0
  135. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Condition.py +0 -0
  136. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/DataObject.py +0 -0
  137. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/DateTime.py +0 -0
  138. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Number.py +0 -0
  139. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Object.py +0 -0
  140. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Size.py +0 -0
  141. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/String.py +0 -0
  142. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Type.py +0 -0
  143. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Validate.py +0 -0
  144. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Validator.py +0 -0
  145. {defstream-0.1.13 → defstream-0.1.15}/src/Validator/__init__.py +0 -0
  146. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Executor.py +0 -0
  147. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Message.py +0 -0
  148. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Pool.py +0 -0
  149. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Run.py +0 -0
  150. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Specification.py +0 -0
  151. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Startup.py +0 -0
  152. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Worker.py +0 -0
  153. {defstream-0.1.13 → defstream-0.1.15}/src/Worker/__init__.py +0 -0
  154. {defstream-0.1.13 → defstream-0.1.15}/src/__init__.py +0 -0
  155. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_dashboard.py +0 -0
  156. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_dashboard_ui.cjs +0 -0
  157. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_descriptor.py +0 -0
  158. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_inspector.py +0 -0
  159. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_inspector_console.py +0 -0
  160. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_inspector_logging.py +0 -0
  161. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_lifecycle_hooks.py +0 -0
  162. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_pool_callbacks.py +0 -0
  163. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_process_signals.py +0 -0
  164. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_protocol_contracts.py +0 -0
  165. /defstream-0.1.13/test/test_release_workflow.py → /defstream-0.1.15/tests/test_rabbitmq_release_workflow.py +0 -0
  166. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_runner_hooks.py +0 -0
  167. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_specifications.py +0 -0
  168. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_task_messages.py +0 -0
  169. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_task_priorities.py +0 -0
  170. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_worker.py +0 -0
  171. {defstream-0.1.13/test → defstream-0.1.15/tests}/test_worker_startup.py +0 -0
@@ -1,6 +1,9 @@
1
1
  name: 기능 제안
2
- description: DefStream에 추가하거나 개선할 기능을 제안합니다.
3
- title: "[기능 제안] "
2
+ description: 추가하거나 개선할 기능을 제안합니다.
3
+ labels:
4
+ - feature
5
+ projects:
6
+ - yong5eon/7
4
7
  body:
5
8
  - type: markdown
6
9
  attributes:
@@ -1,6 +1,9 @@
1
1
  name: 버그/오류 제보
2
2
  description: 예상과 다르게 동작하거나 오류가 발생하는 문제를 제보합니다.
3
- title: "[버그] "
3
+ labels:
4
+ - bug
5
+ projects:
6
+ - yong5eon/7
4
7
  body:
5
8
  - type: markdown
6
9
  attributes:
@@ -0,0 +1,57 @@
1
+ name: 변경 제안
2
+ description: 일반 변경이나 핫픽스의 목적과 범위를 정리합니다.
3
+ labels:
4
+ - fix
5
+ projects:
6
+ - yong5eon/7
7
+ body:
8
+ - type: markdown
9
+ attributes:
10
+ value: >
11
+ 일반 변경이나 긴급 수정이 필요한 핫픽스를 제안할 때 사용해 주세요.
12
+ 재현 가능한 기존 결함은 버그/오류 제보 양식을 이용해 주세요.
13
+ - type: dropdown
14
+ id: change_type
15
+ attributes:
16
+ label: 변경 유형
17
+ description: 제안하는 변경의 성격을 선택해 주세요.
18
+ options:
19
+ - 일반 변경
20
+ - 핫픽스
21
+ validations:
22
+ required: true
23
+ - type: textarea
24
+ id: purpose
25
+ attributes:
26
+ label: 변경 목적
27
+ description: 왜 이 변경이 필요한지, 해결하려는 불편이나 상황을 설명해 주세요.
28
+ validations:
29
+ required: true
30
+ - type: textarea
31
+ id: proposed_changes
32
+ attributes:
33
+ label: 제안하는 변경 내용
34
+ description: 무엇을 어떻게 바꾸면 좋을지 적어 주세요.
35
+ validations:
36
+ required: true
37
+ - type: textarea
38
+ id: scope
39
+ attributes:
40
+ label: 영향 범위
41
+ description: 영향을 받는 기능, 사용자, 호환성 또는 설정을 알고 있다면 적어 주세요.
42
+ validations:
43
+ required: false
44
+ - type: textarea
45
+ id: hotfix_context
46
+ attributes:
47
+ label: 긴급 수정 정보
48
+ description: 핫픽스인 경우 긴급한 이유, 영향받는 버전 및 임시 대응 방법을 적어 주세요.
49
+ validations:
50
+ required: false
51
+ - type: textarea
52
+ id: acceptance_criteria
53
+ attributes:
54
+ label: 완료 기준
55
+ description: 변경이 완료되었다고 판단할 수 있는 조건이나 검증 방법을 적어 주세요.
56
+ validations:
57
+ required: false
@@ -0,0 +1,40 @@
1
+ name: 작업 제안
2
+ description: 리소스 변경, 문서화 등 소스 코드 변경이 아닌 작업을 정리합니다.
3
+ labels:
4
+ - task
5
+ projects:
6
+ - yong5eon/7
7
+ body:
8
+ - type: markdown
9
+ attributes:
10
+ value: >
11
+ 리소스 변경, 문서 작성·정리 등 소스 코드를 변경하지 않는 작업에 사용해 주세요.
12
+ 기능 추가, 버그 제보 또는 소스 코드 변경은 해당 이슈 양식을 이용해 주세요.
13
+ - type: textarea
14
+ id: purpose
15
+ attributes:
16
+ label: 작업 목적
17
+ description: 이 작업이 필요한 이유와 기대하는 효과를 설명해 주세요.
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: scope
22
+ attributes:
23
+ label: 작업 내용 및 대상
24
+ description: 수행할 작업과 대상 리소스, 문서 또는 경로를 적어 주세요.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: acceptance_criteria
29
+ attributes:
30
+ label: 완료 기준
31
+ description: 작업이 완료되었다고 판단할 수 있는 결과물이나 확인 방법을 적어 주세요.
32
+ validations:
33
+ required: true
34
+ - type: textarea
35
+ id: additional
36
+ attributes:
37
+ label: 관련 자료 및 주의사항
38
+ description: 참고 링크, 관련 이슈, 사전 준비나 주의사항이 있다면 적어 주세요.
39
+ validations:
40
+ required: false
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 변경 유형
6
6
 
7
- - [ ] 버그 수정
7
+ - [ ] 버그 수정 및 일반 변경, 핫픽스 처리
8
8
  - [ ] 기능 추가
9
9
  - [ ] 호환성에 영향을 주는 변경
10
10
  - [ ] 문서 또는 예제 변경
@@ -30,9 +30,7 @@ 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 }}
33
+ test_required: ${{ steps.test_paths.outputs.required }}
36
34
  steps:
37
35
  - uses: actions/checkout@v7
38
36
  with:
@@ -42,6 +40,28 @@ jobs:
42
40
  uses: actions/setup-python@v7
43
41
  with:
44
42
  python-version: '3.13'
43
+ - name: Detect test-relevant changes
44
+ id: test_paths
45
+ run: |
46
+ python - <<'PY'
47
+ from json import loads
48
+ from os import environ
49
+ from pathlib import Path
50
+ from subprocess import check_output
51
+
52
+ required = True
53
+ if environ['GITHUB_EVENT_NAME'] == 'pull_request':
54
+ event = loads(Path(environ['GITHUB_EVENT_PATH']).read_text(encoding='utf-8'))
55
+ base = event['pull_request']['base']['sha']
56
+ changed = check_output([
57
+ 'git', 'diff', '--name-only', '--no-renames', '-z',
58
+ f'{base}...{environ["GITHUB_SHA"]}', '--', 'samples/', 'src/', 'tests/', 'setup.py', '.github/workflows/ci.yml',
59
+ ])
60
+ required = bool(changed)
61
+ with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
62
+ output.write(f'required={str(required).lower()}\n')
63
+ print(f'Test-relevant changes: {required}')
64
+ PY
45
65
  - name: Check complete push range and plan version
46
66
  id: changes
47
67
  env:
@@ -175,43 +195,6 @@ jobs:
175
195
  with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
176
196
  output.write(f'branch={branch}\n')
177
197
  PY
178
- - name: Resolve dependency refs
179
- id: refs
180
- env:
181
- BRANCH: ${{ steps.changelog.outputs.branch }}
182
- run: |
183
- python - <<'PY'
184
- from json import loads
185
- from os import environ
186
- from pathlib import Path
187
- from subprocess import check_output, run
188
-
189
- head = environ['GITHUB_SHA']
190
- path = f'issues/{environ["BRANCH"]}/ci.refs.json'
191
- entry = check_output(['git', 'ls-tree', head, '--', path]).decode().split()
192
- refs = {}
193
- if entry:
194
- if entry[0] not in ('100644', '100755'):
195
- raise ValueError(f'Dependency refs must be a regular file: {path}')
196
- refs = loads(check_output(['git', 'show', f'{head}:{path}']).decode('utf-8'))
197
- else:
198
- print(f'{path} not found: dependency refs default to master')
199
- projects = {
200
- 'DefStream': 'core_ref',
201
- 'DefStream-RabbitMQ': 'rabbitmq_ref',
202
- 'DefStream-Redis': 'redis_ref',
203
- }
204
- if not isinstance(refs, dict) or refs.keys() - projects.keys():
205
- raise ValueError(f'Expected an object with only supported project names: {path}')
206
- with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
207
- for project, key in projects.items():
208
- ref = refs.get(project, 'master')
209
- if not isinstance(ref, str) or not ref or ref.startswith('-'):
210
- raise ValueError(f'Invalid dependency ref for {project}: {ref!r}')
211
- run(['git', 'check-ref-format', '--allow-onelevel', ref], check=True)
212
- output.write(f'{key}={ref}\n')
213
- print(f'{project} dependency ref: {ref}')
214
- PY
215
198
  - name: Preserve customer release notes
216
199
  uses: actions/upload-artifact@v7
217
200
  with:
@@ -224,6 +207,7 @@ jobs:
224
207
  test:
225
208
  name: Test Python ${{ matrix.python }}
226
209
  needs: changes
210
+ if: needs.changes.outputs.test_required == 'true'
227
211
  runs-on: ubuntu-latest
228
212
  timeout-minutes: 25
229
213
  strategy:
@@ -231,7 +215,7 @@ jobs:
231
215
  matrix:
232
216
  python: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
233
217
  env:
234
- PROJECT: ${{ github.event.repository.name }}
218
+ PROJECT: DefStream
235
219
  DEFSTREAM_RABBITMQ_TESTS: '1'
236
220
  DEFSTREAM_REDIS_TESTS: '1'
237
221
  services:
@@ -261,30 +245,11 @@ jobs:
261
245
  - name: Check out core
262
246
  uses: actions/checkout@v7
263
247
  with:
264
- repository: yong5eon/DefStream
265
- ref: ${{ github.event.repository.name == 'DefStream' && github.sha || needs.changes.outputs.core_ref }}
248
+ ref: ${{ github.sha }}
266
249
  path: packages/DefStream
267
250
  fetch-depth: 0
268
251
  persist-credentials: false
269
252
 
270
- - name: Check out RabbitMQ adapter
271
- uses: actions/checkout@v7
272
- with:
273
- repository: yong5eon/DefStream-RabbitMQ
274
- ref: ${{ github.event.repository.name == 'DefStream-RabbitMQ' && github.sha || needs.changes.outputs.rabbitmq_ref }}
275
- path: packages/DefStream-RabbitMQ
276
- fetch-depth: 0
277
- persist-credentials: false
278
-
279
- - name: Check out Redis adapter
280
- uses: actions/checkout@v7
281
- with:
282
- repository: yong5eon/DefStream-Redis
283
- ref: ${{ github.event.repository.name == 'DefStream-Redis' && github.sha || needs.changes.outputs.redis_ref }}
284
- path: packages/DefStream-Redis
285
- fetch-depth: 0
286
- persist-credentials: false
287
-
288
253
  - name: Set up Python
289
254
  uses: actions/setup-python@v7
290
255
  with:
@@ -305,7 +270,7 @@ jobs:
305
270
  from re import fullmatch
306
271
 
307
272
  project = environ['PROJECT']
308
- if project not in ('DefStream', 'DefStream-RabbitMQ', 'DefStream-Redis'):
273
+ if project != 'DefStream':
309
274
  raise ValueError(f'Unexpected project: {project}')
310
275
  if environ['RELEASE_BUILD'] != 'true':
311
276
  print('Test-only build: using the existing Git-derived development version.')
@@ -329,23 +294,17 @@ jobs:
329
294
  NEW_VERSION: ${{ needs.changes.outputs.new_version }}
330
295
  WHEEL_BUILD: ${{ needs.changes.outputs.build }}
331
296
  run: |
332
- mkdir -p dist dependency-wheels
333
- for name in DefStream DefStream-RabbitMQ DefStream-Redis; do
334
- if [ "$name" = "$PROJECT" ]; then
335
- if [ "$RELEASE_BUILD" = "true" ]; then
336
- if [ "$NEW_VERSION" = "true" ]; then
337
- SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --outdir "$GITHUB_WORKSPACE/dist" "packages/$name"
338
- else
339
- SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --wheel --outdir "$GITHUB_WORKSPACE/dist" "packages/$name"
340
- fi
341
- python -m wheel tags --build "$WHEEL_BUILD" --remove dist/*.whl
342
- else
343
- python -m build --outdir "$GITHUB_WORKSPACE/dist" "packages/$name"
344
- 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
345
301
  else
346
- 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
347
303
  fi
348
- 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
349
308
  python -m twine check --strict dist/*
350
309
 
351
310
  - name: Normalize source archive timestamps
@@ -375,27 +334,54 @@ jobs:
375
334
  path.write_bytes(buffer.getvalue())
376
335
  PY
377
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
+
378
366
  - name: Install built wheels into a clean environment
379
367
  run: |
380
368
  python -m venv "$RUNNER_TEMP/installed"
381
- "$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]"
382
370
  "$RUNNER_TEMP/installed/bin/python" -m pip check
383
371
 
384
372
  - name: Test installed package
385
373
  run: |
386
374
  cd "$RUNNER_TEMP"
387
375
  "$RUNNER_TEMP/installed/bin/python" -m unittest discover \
388
- -s "$GITHUB_WORKSPACE/packages/$PROJECT/test" -p 'test_*.py' -v
376
+ -s "$GITHUB_WORKSPACE/packages/DefStream/tests" -p 'test_*.py' -v
389
377
 
390
378
  - name: Set up Node for core UI tests
391
- if: env.PROJECT == 'DefStream'
392
379
  uses: actions/setup-node@v7
393
380
  with:
394
381
  node-version: '22'
395
382
 
396
383
  - name: Test core UI
397
- if: env.PROJECT == 'DefStream'
398
- run: node --test packages/DefStream/test/test_dashboard_ui.cjs
384
+ run: node --test packages/DefStream/tests/test_dashboard_ui.cjs
399
385
 
400
386
  - name: Preserve verified release distributions
401
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