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.
- defstream-0.1.13/.github/ISSUE_TEMPLATE/feature_request.yml → defstream-0.1.15/.github/ISSUE_TEMPLATE/01.feature.yml +5 -2
- defstream-0.1.13/.github/ISSUE_TEMPLATE/bug_report.yml → defstream-0.1.15/.github/ISSUE_TEMPLATE/02.bug.yml +4 -1
- defstream-0.1.15/.github/ISSUE_TEMPLATE/03.fix.yml +57 -0
- defstream-0.1.15/.github/ISSUE_TEMPLATE/04.task.yml +40 -0
- {defstream-0.1.13 → defstream-0.1.15}/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- {defstream-0.1.13 → defstream-0.1.15}/.github/workflows/ci.yml +68 -82
- {defstream-0.1.13 → defstream-0.1.15}/.gitignore +0 -4
- {defstream-0.1.13 → defstream-0.1.15}/DefStream.egg-info/PKG-INFO +486 -13
- defstream-0.1.15/DefStream.egg-info/SOURCES.txt +166 -0
- defstream-0.1.15/DefStream.egg-info/requires.txt +6 -0
- {defstream-0.1.13 → defstream-0.1.15}/PKG-INFO +486 -13
- {defstream-0.1.13 → defstream-0.1.15}/README.en.md +552 -13
- {defstream-0.1.13 → defstream-0.1.15}/README.md +483 -10
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/IMPLEMENTS.md +5 -5
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/README.md +2 -2
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/10/IMPLEMENTS.md +3 -3
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/13/README.md +1 -1
- defstream-0.1.15/issues/fix/21/IMPLEMENTS.md +38 -0
- defstream-0.1.15/issues/fix/21/ISSUE.md +17 -0
- defstream-0.1.15/issues/fix/21/README.md +44 -0
- defstream-0.1.15/issues/fix/21/REQUIREMENTS.md +68 -0
- defstream-0.1.15/issues/fix/25/IMPLEMENTS.md +61 -0
- defstream-0.1.15/issues/fix/25/ISSUE.md +13 -0
- defstream-0.1.15/issues/fix/25/README.md +38 -0
- defstream-0.1.15/issues/fix/25/REQUIREMENTS.md +107 -0
- defstream-0.1.15/issues/fix/25/TASK.md +38 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/IMPLEMENTS.md +1 -1
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/6/IMPLEMENTS.md +2 -2
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/6/README.md +1 -1
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/6/REQUIREMENTS.md +3 -3
- defstream-0.1.15/issues/task/18/IMPLEMENTS.md +96 -0
- defstream-0.1.15/issues/task/18/README.md +37 -0
- defstream-0.1.15/issues/task/18/REQUIREMENTS.md +59 -0
- defstream-0.1.15/samples/Broker/RabbitMQ/Sample.RPC.py +188 -0
- defstream-0.1.15/samples/Broker/RabbitMQ/Sample.Stream.py +102 -0
- defstream-0.1.15/samples/Broker/RabbitMQ/Sample.py +146 -0
- defstream-0.1.15/samples/Broker/Redis/Sample.Stream.py +87 -0
- defstream-0.1.15/samples/Broker/Redis/Sample.py +76 -0
- {defstream-0.1.13 → defstream-0.1.15}/setup.py +2 -2
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Configuration.py +48 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Connection.py +542 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Consumer.py +359 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Event.py +127 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Exchange.py +278 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Policies.py +9 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Queue.py +319 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Serializer.py +61 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Stream.py +179 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/Subscription.py +74 -0
- defstream-0.1.15/src/Broker/Implements/RabbitMQ/__init__.py +47 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Configuration.py +59 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Connection.py +265 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Consumer.py +364 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Event.py +191 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Queue.py +284 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Serializer.py +48 -0
- defstream-0.1.15/src/Broker/Implements/Redis/Subscription.py +46 -0
- defstream-0.1.15/src/Broker/Implements/Redis/__init__.py +29 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Common.py +2 -3
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/__init__.py +2 -2
- defstream-0.1.15/tests/test_broker_packaging.py +108 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_logging.py +2 -2
- defstream-0.1.15/tests/test_rabbitmq_broker_methods.py +139 -0
- defstream-0.1.15/tests/test_rabbitmq_integration.py +143 -0
- defstream-0.1.15/tests/test_rabbitmq_logging.py +489 -0
- defstream-0.1.15/tests/test_rabbitmq_priorities.py +442 -0
- defstream-0.1.15/tests/test_rabbitmq_rpc.py +417 -0
- defstream-0.1.15/tests/test_rabbitmq_rpc_integration.py +240 -0
- defstream-0.1.15/tests/test_rabbitmq_worker.py +301 -0
- defstream-0.1.15/tests/test_redis.py +292 -0
- defstream-0.1.15/tests/test_redis_integration.py +322 -0
- defstream-0.1.15/tests/test_redis_logging.py +336 -0
- defstream-0.1.15/tests/test_redis_release_workflow.py +398 -0
- defstream-0.1.15/tests/test_release_workflow.py +469 -0
- defstream-0.1.15/tests/test_validator_patterns.py +48 -0
- defstream-0.1.13/.github/PULL_REQUEST_TEMPLATE/hotfix.md +0 -34
- defstream-0.1.13/DefStream.egg-info/SOURCES.txt +0 -115
- defstream-0.1.13/DefStream.egg-info/requires.txt +0 -6
- {defstream-0.1.13 → defstream-0.1.15}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/DefStream.egg-info/dependency_links.txt +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/DefStream.egg-info/top_level.txt +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/LICENSE +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/IMPLEMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/ISSUE.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/README.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/bug/16/REQUIREMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/IMPLEMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/README.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/REQUIREMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/TASK.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/1/ci.refs.json +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/REQUIREMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/feature/8/ci.refs.json +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/10/README.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/10/REQUIREMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/README.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/REQUIREMENTS.md +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/issues/fix/3/ci.refs.json +0 -0
- {defstream-0.1.13/sample → defstream-0.1.15/samples}/Broker/Sample.py +0 -0
- {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/RabbitMQ/Client.py +0 -0
- {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/RabbitMQ/Tasks.py +0 -0
- {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/RabbitMQ/Worker.py +0 -0
- {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/Redis/Sample.py +0 -0
- {defstream-0.1.13/sample → defstream-0.1.15/samples}/Worker/Sample.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/setup.cfg +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Configuration.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Connection.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Consumer.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Errors.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Event.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Implements/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Policies.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Priority.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/Protocol.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Broker/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/DataObject.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/Types.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/Value.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Descriptor/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extension.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Console.html +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Console.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Dashboard.html +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Dashboard.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/HealthCheck.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Metrics.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/Specifications.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Extensions/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Inspector.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/Response.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Inspector/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Pattern.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Array.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Compare.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Condition.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/DataObject.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/DateTime.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Number.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Object.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Size.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/String.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Patterns/Type.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Validate.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/Validator.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Validator/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Executor.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Message.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Pool.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Run.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Specification.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Startup.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/Worker.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/Worker/__init__.py +0 -0
- {defstream-0.1.13 → defstream-0.1.15}/src/__init__.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_dashboard.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_dashboard_ui.cjs +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_descriptor.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_inspector.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_inspector_console.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_inspector_logging.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_lifecycle_hooks.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_pool_callbacks.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_process_signals.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_protocol_contracts.py +0 -0
- /defstream-0.1.13/test/test_release_workflow.py → /defstream-0.1.15/tests/test_rabbitmq_release_workflow.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_runner_hooks.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_specifications.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_task_messages.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_task_priorities.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_worker.py +0 -0
- {defstream-0.1.13/test → defstream-0.1.15/tests}/test_worker_startup.py +0 -0
|
@@ -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
|
|
@@ -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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
|
333
|
-
|
|
334
|
-
if [ "$
|
|
335
|
-
|
|
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/
|
|
302
|
+
SETUPTOOLS_SCM_PRETEND_VERSION="$RELEASE_VERSION" python -m build --wheel --outdir "$GITHUB_WORKSPACE/dist" packages/DefStream
|
|
347
303
|
fi
|
|
348
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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'
|