DefStream 0.1.12__tar.gz → 0.1.14__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.14/.github/ISSUE_TEMPLATE/01.feature.yml +39 -0
- defstream-0.1.14/.github/ISSUE_TEMPLATE/02.bug.yml +64 -0
- defstream-0.1.14/.github/ISSUE_TEMPLATE/03.fix.yml +57 -0
- defstream-0.1.14/.github/ISSUE_TEMPLATE/04.task.yml +40 -0
- defstream-0.1.14/.github/ISSUE_TEMPLATE/config.yml +1 -0
- defstream-0.1.14/.github/PULL_REQUEST_TEMPLATE.md +24 -0
- {defstream-0.1.12 → defstream-0.1.14}/.github/workflows/ci.yml +30 -2
- {defstream-0.1.12 → defstream-0.1.14}/.gitignore +2 -4
- {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/PKG-INFO +6 -6
- {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/SOURCES.txt +42 -24
- {defstream-0.1.12 → defstream-0.1.14}/PKG-INFO +6 -6
- {defstream-0.1.12 → defstream-0.1.14}/README.en.md +59 -8
- {defstream-0.1.12 → defstream-0.1.14}/README.md +5 -5
- defstream-0.1.14/issues/bug/16/IMPLEMENTS.md +32 -0
- defstream-0.1.14/issues/bug/16/ISSUE.md +19 -0
- defstream-0.1.14/issues/bug/16/README.md +12 -0
- defstream-0.1.14/issues/bug/16/REQUIREMENTS.md +25 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/IMPLEMENTS.md +5 -5
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/README.md +2 -2
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/10/IMPLEMENTS.md +3 -3
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/13/README.md +1 -1
- defstream-0.1.14/issues/fix/21/IMPLEMENTS.md +38 -0
- defstream-0.1.14/issues/fix/21/ISSUE.md +17 -0
- defstream-0.1.14/issues/fix/21/README.md +44 -0
- defstream-0.1.14/issues/fix/21/REQUIREMENTS.md +68 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/IMPLEMENTS.md +1 -1
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/6/IMPLEMENTS.md +2 -2
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/6/README.md +1 -1
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/6/REQUIREMENTS.md +3 -3
- defstream-0.1.14/issues/task/18/IMPLEMENTS.md +96 -0
- defstream-0.1.14/issues/task/18/README.md +37 -0
- defstream-0.1.14/issues/task/18/REQUIREMENTS.md +59 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Console.py +4 -3
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Common.py +2 -3
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/__init__.py +2 -2
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_inspector_console.py +56 -2
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_logging.py +2 -2
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_release_workflow.py +62 -0
- defstream-0.1.14/tests/test_validator_patterns.py +48 -0
- {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/dependency_links.txt +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/requires.txt +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/top_level.txt +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/LICENSE +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/IMPLEMENTS.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/README.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/REQUIREMENTS.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/TASK.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/ci.refs.json +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/REQUIREMENTS.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/ci.refs.json +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/10/README.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/10/REQUIREMENTS.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/README.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/REQUIREMENTS.md +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/ci.refs.json +0 -0
- {defstream-0.1.12/sample → defstream-0.1.14/samples}/Broker/Sample.py +0 -0
- {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/RabbitMQ/Client.py +0 -0
- {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/RabbitMQ/Tasks.py +0 -0
- {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/RabbitMQ/Worker.py +0 -0
- {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/Redis/Sample.py +0 -0
- {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/Sample.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/setup.cfg +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/setup.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Configuration.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Connection.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Consumer.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Errors.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Event.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Implements/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Policies.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Priority.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Protocol.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Broker/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/DataObject.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/Types.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/Value.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extension.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Console.html +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Dashboard.html +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Dashboard.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/HealthCheck.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Metrics.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Specifications.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Inspector.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Response.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Pattern.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Array.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Compare.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Condition.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/DataObject.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/DateTime.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Number.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Object.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Size.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/String.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Type.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Validate.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Validator.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Validator/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Executor.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Message.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Pool.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Run.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Specification.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Startup.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Worker.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/Worker/__init__.py +0 -0
- {defstream-0.1.12 → defstream-0.1.14}/src/__init__.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_dashboard.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_dashboard_ui.cjs +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_descriptor.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_inspector.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_inspector_logging.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_lifecycle_hooks.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_pool_callbacks.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_process_signals.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_protocol_contracts.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_runner_hooks.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_specifications.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_task_messages.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_task_priorities.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_worker.py +0 -0
- {defstream-0.1.12/test → defstream-0.1.14/tests}/test_worker_startup.py +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: 기능 제안
|
|
2
|
+
description: 추가하거나 개선할 기능을 제안합니다.
|
|
3
|
+
labels:
|
|
4
|
+
- feature
|
|
5
|
+
projects:
|
|
6
|
+
- yong5eon/7
|
|
7
|
+
body:
|
|
8
|
+
- type: markdown
|
|
9
|
+
attributes:
|
|
10
|
+
value: >
|
|
11
|
+
해결하려는 문제와 제안하는 사용 경험을 중심으로 작성해 주세요.
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: problem
|
|
14
|
+
attributes:
|
|
15
|
+
label: 해결하려는 문제
|
|
16
|
+
description: 현재 어떤 불편이나 제약이 있는지 설명해 주세요.
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: proposal
|
|
21
|
+
attributes:
|
|
22
|
+
label: 제안하는 해결 방법
|
|
23
|
+
description: 원하는 기능과 기대하는 동작을 설명해 주세요.
|
|
24
|
+
validations:
|
|
25
|
+
required: true
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: alternatives
|
|
28
|
+
attributes:
|
|
29
|
+
label: 고려한 대안
|
|
30
|
+
description: 고려한 다른 방법이나 우회 방법이 있다면 적어 주세요.
|
|
31
|
+
validations:
|
|
32
|
+
required: false
|
|
33
|
+
- type: textarea
|
|
34
|
+
id: additional
|
|
35
|
+
attributes:
|
|
36
|
+
label: 추가 정보
|
|
37
|
+
description: 예제, 참고 자료 등 제안의 맥락을 이해하는 데 도움이 되는 정보를 적어 주세요.
|
|
38
|
+
validations:
|
|
39
|
+
required: false
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: 버그/오류 제보
|
|
2
|
+
description: 예상과 다르게 동작하거나 오류가 발생하는 문제를 제보합니다.
|
|
3
|
+
labels:
|
|
4
|
+
- bug
|
|
5
|
+
projects:
|
|
6
|
+
- yong5eon/7
|
|
7
|
+
body:
|
|
8
|
+
- type: markdown
|
|
9
|
+
attributes:
|
|
10
|
+
value: >
|
|
11
|
+
재현 가능한 버그를 제보해 주세요. 로그나 설정을 첨부할 때 토큰, 비밀번호,
|
|
12
|
+
개인정보 등 민감한 정보는 반드시 삭제해 주세요.
|
|
13
|
+
- type: input
|
|
14
|
+
id: version
|
|
15
|
+
attributes:
|
|
16
|
+
label: 버전
|
|
17
|
+
description: 사용 중인 버전 또는 커밋을 입력해 주세요.
|
|
18
|
+
placeholder: 예) 0.1.12
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: expected
|
|
23
|
+
attributes:
|
|
24
|
+
label: 기대한 동작
|
|
25
|
+
description: 어떤 결과를 기대했는지 설명해 주세요.
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: actual
|
|
30
|
+
attributes:
|
|
31
|
+
label: 실제 동작
|
|
32
|
+
description: 실제로 발생한 결과를 설명해 주세요. 오류가 표시되면 메시지도 포함해 주세요.
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
35
|
+
- type: textarea
|
|
36
|
+
id: reproduction
|
|
37
|
+
attributes:
|
|
38
|
+
label: 재현 방법
|
|
39
|
+
description: 문제를 재현하는 단계나 최소 코드 예제를 작성해 주세요.
|
|
40
|
+
placeholder: |
|
|
41
|
+
1. 다음 설정으로 Worker를 시작합니다.
|
|
42
|
+
2. 특정 메시지를 전달합니다.
|
|
43
|
+
3. 오류가 발생합니다.
|
|
44
|
+
validations:
|
|
45
|
+
required: true
|
|
46
|
+
- type: textarea
|
|
47
|
+
id: environment
|
|
48
|
+
attributes:
|
|
49
|
+
label: 실행 환경
|
|
50
|
+
description: Python 버전, 운영체제, 브로커 및 관련 어댑터 버전을 입력해 주세요.
|
|
51
|
+
placeholder: |
|
|
52
|
+
- Python:
|
|
53
|
+
- 운영체제:
|
|
54
|
+
- 브로커:
|
|
55
|
+
- 어댑터:
|
|
56
|
+
validations:
|
|
57
|
+
required: true
|
|
58
|
+
- type: textarea
|
|
59
|
+
id: additional
|
|
60
|
+
attributes:
|
|
61
|
+
label: 추가 정보
|
|
62
|
+
description: 관련 로그나 스크린샷 등 문제 파악에 도움이 되는 정보를 적어 주세요.
|
|
63
|
+
validations:
|
|
64
|
+
required: false
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## 변경 내용
|
|
2
|
+
|
|
3
|
+
<!-- 무엇을 왜 변경했는지 간단히 요약해 주세요. -->
|
|
4
|
+
|
|
5
|
+
## 변경 유형
|
|
6
|
+
|
|
7
|
+
- [ ] 버그 수정 및 일반 변경, 핫픽스 처리
|
|
8
|
+
- [ ] 기능 추가
|
|
9
|
+
- [ ] 호환성에 영향을 주는 변경
|
|
10
|
+
- [ ] 문서 또는 예제 변경
|
|
11
|
+
- [ ] 기타
|
|
12
|
+
|
|
13
|
+
## 검증
|
|
14
|
+
|
|
15
|
+
<!-- 실행한 테스트와 결과를 작성해 주세요. 테스트를 실행하지 않았다면 사유를 적어 주세요. -->
|
|
16
|
+
|
|
17
|
+
- [ ] 관련 테스트를 실행했습니다.
|
|
18
|
+
- [ ] 문서와 예제를 확인했습니다.
|
|
19
|
+
|
|
20
|
+
## 확인 사항
|
|
21
|
+
|
|
22
|
+
- [ ] 변경 범위가 요청 사항에 한정되어 있습니다.
|
|
23
|
+
- [ ] 공개 API나 기존 동작에 영향을 주는 경우 변경 내용과 마이그레이션 방법을 설명했습니다.
|
|
24
|
+
- [ ] 민감 정보나 불필요한 디버깅 코드를 포함하지 않았습니다.
|
|
@@ -33,6 +33,7 @@ jobs:
|
|
|
33
33
|
core_ref: ${{ steps.refs.outputs.core_ref }}
|
|
34
34
|
rabbitmq_ref: ${{ steps.refs.outputs.rabbitmq_ref }}
|
|
35
35
|
redis_ref: ${{ steps.refs.outputs.redis_ref }}
|
|
36
|
+
test_required: ${{ steps.test_paths.outputs.required }}
|
|
36
37
|
steps:
|
|
37
38
|
- uses: actions/checkout@v7
|
|
38
39
|
with:
|
|
@@ -42,6 +43,28 @@ jobs:
|
|
|
42
43
|
uses: actions/setup-python@v7
|
|
43
44
|
with:
|
|
44
45
|
python-version: '3.13'
|
|
46
|
+
- name: Detect test-relevant changes
|
|
47
|
+
id: test_paths
|
|
48
|
+
run: |
|
|
49
|
+
python - <<'PY'
|
|
50
|
+
from json import loads
|
|
51
|
+
from os import environ
|
|
52
|
+
from pathlib import Path
|
|
53
|
+
from subprocess import check_output
|
|
54
|
+
|
|
55
|
+
required = True
|
|
56
|
+
if environ['GITHUB_EVENT_NAME'] == 'pull_request':
|
|
57
|
+
event = loads(Path(environ['GITHUB_EVENT_PATH']).read_text(encoding='utf-8'))
|
|
58
|
+
base = event['pull_request']['base']['sha']
|
|
59
|
+
changed = check_output([
|
|
60
|
+
'git', 'diff', '--name-only', '--no-renames', '-z',
|
|
61
|
+
f'{base}...{environ["GITHUB_SHA"]}', '--', 'samples/', 'src/', 'tests/', 'setup.py',
|
|
62
|
+
])
|
|
63
|
+
required = bool(changed)
|
|
64
|
+
with Path(environ['GITHUB_OUTPUT']).open('a', encoding='utf-8') as output:
|
|
65
|
+
output.write(f'required={str(required).lower()}\n')
|
|
66
|
+
print(f'Test-relevant changes: {required}')
|
|
67
|
+
PY
|
|
45
68
|
- name: Check complete push range and plan version
|
|
46
69
|
id: changes
|
|
47
70
|
env:
|
|
@@ -224,6 +247,7 @@ jobs:
|
|
|
224
247
|
test:
|
|
225
248
|
name: Test Python ${{ matrix.python }}
|
|
226
249
|
needs: changes
|
|
250
|
+
if: needs.changes.outputs.test_required == 'true'
|
|
227
251
|
runs-on: ubuntu-latest
|
|
228
252
|
timeout-minutes: 25
|
|
229
253
|
strategy:
|
|
@@ -384,8 +408,12 @@ jobs:
|
|
|
384
408
|
- name: Test installed package
|
|
385
409
|
run: |
|
|
386
410
|
cd "$RUNNER_TEMP"
|
|
411
|
+
test_directory=test
|
|
412
|
+
if [ "$PROJECT" = "DefStream" ]; then
|
|
413
|
+
test_directory=tests
|
|
414
|
+
fi
|
|
387
415
|
"$RUNNER_TEMP/installed/bin/python" -m unittest discover \
|
|
388
|
-
-s "$GITHUB_WORKSPACE/packages/$PROJECT
|
|
416
|
+
-s "$GITHUB_WORKSPACE/packages/$PROJECT/$test_directory" -p 'test_*.py' -v
|
|
389
417
|
|
|
390
418
|
- name: Set up Node for core UI tests
|
|
391
419
|
if: env.PROJECT == 'DefStream'
|
|
@@ -395,7 +423,7 @@ jobs:
|
|
|
395
423
|
|
|
396
424
|
- name: Test core UI
|
|
397
425
|
if: env.PROJECT == 'DefStream'
|
|
398
|
-
run: node --test packages/DefStream/
|
|
426
|
+
run: node --test packages/DefStream/tests/test_dashboard_ui.cjs
|
|
399
427
|
|
|
400
428
|
- name: Preserve verified release distributions
|
|
401
429
|
if: needs.changes.outputs.release == 'true' && matrix.python == '3.13'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DefStream
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.14
|
|
4
4
|
Summary: Synchronous message processing with pluggable broker adapters
|
|
5
5
|
Home-page: https://github.com/yong5eon/DefStream
|
|
6
6
|
Author: Heo Yongseon
|
|
@@ -109,8 +109,8 @@ ProcessPool은 `spawn` 자식 프로세스를 사용하므로 부모의 핸들
|
|
|
109
109
|
자식도 로그를 출력하려면 import 가능한 `PoolSetup` 구현에서 같은 설정을 적용하고
|
|
110
110
|
`ProcessPool(..., setups=...)`로 전달하세요. 자식 초기화 훅이 실행되기 전의 DEBUG·INFO는
|
|
111
111
|
그 설정으로 수신할 수 없습니다.
|
|
112
|
-
[RabbitMQ 작업 예제의 LoggingSetup](./
|
|
113
|
-
[부모·자식 설정 예제](./
|
|
112
|
+
[RabbitMQ 작업 예제의 LoggingSetup](./samples/Worker/RabbitMQ/Tasks.py)과
|
|
113
|
+
[부모·자식 설정 예제](./samples/Worker/RabbitMQ/Worker.py)를 참고하세요.
|
|
114
114
|
기존 애플리케이션에서는 이미 설정한 핸들러를 반복 추가하지 않도록 초기화 위치를 관리해야 합니다.
|
|
115
115
|
|
|
116
116
|
## 설치
|
|
@@ -671,9 +671,9 @@ Console의 `broker` 인자는 `DefStream.Broker.BrokerFactory` 계약을 사용
|
|
|
671
671
|
|
|
672
672
|
## 예제와 라이선스
|
|
673
673
|
|
|
674
|
-
- [브로커 없이 실행하는 Worker 예제](./
|
|
675
|
-
- [RabbitMQ Worker·RPC 클라이언트 예제](./
|
|
676
|
-
- [Redis Worker 예제](./
|
|
674
|
+
- [브로커 없이 실행하는 Worker 예제](./samples/Worker/Sample.py)
|
|
675
|
+
- [RabbitMQ Worker·RPC 클라이언트 예제](./samples/Worker/RabbitMQ)
|
|
676
|
+
- [Redis Worker 예제](./samples/Worker/Redis/Sample.py)
|
|
677
677
|
- [릴리즈와 변경 내역](https://github.com/yong5eon/DefStream/releases)
|
|
678
678
|
|
|
679
679
|
GNU GPL v3 라이선스를 사용합니다. 자세한 조건은 [LICENSE](./LICENSE)를 확인하세요.
|
|
@@ -3,12 +3,22 @@ LICENSE
|
|
|
3
3
|
README.en.md
|
|
4
4
|
README.md
|
|
5
5
|
setup.py
|
|
6
|
+
.github/PULL_REQUEST_TEMPLATE.md
|
|
7
|
+
.github/ISSUE_TEMPLATE/01.feature.yml
|
|
8
|
+
.github/ISSUE_TEMPLATE/02.bug.yml
|
|
9
|
+
.github/ISSUE_TEMPLATE/03.fix.yml
|
|
10
|
+
.github/ISSUE_TEMPLATE/04.task.yml
|
|
11
|
+
.github/ISSUE_TEMPLATE/config.yml
|
|
6
12
|
.github/workflows/ci.yml
|
|
7
13
|
DefStream.egg-info/PKG-INFO
|
|
8
14
|
DefStream.egg-info/SOURCES.txt
|
|
9
15
|
DefStream.egg-info/dependency_links.txt
|
|
10
16
|
DefStream.egg-info/requires.txt
|
|
11
17
|
DefStream.egg-info/top_level.txt
|
|
18
|
+
issues/bug/16/IMPLEMENTS.md
|
|
19
|
+
issues/bug/16/ISSUE.md
|
|
20
|
+
issues/bug/16/README.md
|
|
21
|
+
issues/bug/16/REQUIREMENTS.md
|
|
12
22
|
issues/feature/1/IMPLEMENTS.md
|
|
13
23
|
issues/feature/1/README.md
|
|
14
24
|
issues/feature/1/REQUIREMENTS.md
|
|
@@ -22,6 +32,10 @@ issues/fix/10/IMPLEMENTS.md
|
|
|
22
32
|
issues/fix/10/README.md
|
|
23
33
|
issues/fix/10/REQUIREMENTS.md
|
|
24
34
|
issues/fix/13/README.md
|
|
35
|
+
issues/fix/21/IMPLEMENTS.md
|
|
36
|
+
issues/fix/21/ISSUE.md
|
|
37
|
+
issues/fix/21/README.md
|
|
38
|
+
issues/fix/21/REQUIREMENTS.md
|
|
25
39
|
issues/fix/3/IMPLEMENTS.md
|
|
26
40
|
issues/fix/3/README.md
|
|
27
41
|
issues/fix/3/REQUIREMENTS.md
|
|
@@ -29,12 +43,15 @@ issues/fix/3/ci.refs.json
|
|
|
29
43
|
issues/fix/6/IMPLEMENTS.md
|
|
30
44
|
issues/fix/6/README.md
|
|
31
45
|
issues/fix/6/REQUIREMENTS.md
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
issues/task/18/IMPLEMENTS.md
|
|
47
|
+
issues/task/18/README.md
|
|
48
|
+
issues/task/18/REQUIREMENTS.md
|
|
49
|
+
samples/Broker/Sample.py
|
|
50
|
+
samples/Worker/Sample.py
|
|
51
|
+
samples/Worker/RabbitMQ/Client.py
|
|
52
|
+
samples/Worker/RabbitMQ/Tasks.py
|
|
53
|
+
samples/Worker/RabbitMQ/Worker.py
|
|
54
|
+
samples/Worker/Redis/Sample.py
|
|
38
55
|
src/__init__.py
|
|
39
56
|
src/Broker/Configuration.py
|
|
40
57
|
src/Broker/Connection.py
|
|
@@ -86,21 +103,22 @@ src/Worker/Specification.py
|
|
|
86
103
|
src/Worker/Startup.py
|
|
87
104
|
src/Worker/Worker.py
|
|
88
105
|
src/Worker/__init__.py
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
tests/test_dashboard.py
|
|
107
|
+
tests/test_dashboard_ui.cjs
|
|
108
|
+
tests/test_descriptor.py
|
|
109
|
+
tests/test_inspector.py
|
|
110
|
+
tests/test_inspector_console.py
|
|
111
|
+
tests/test_inspector_logging.py
|
|
112
|
+
tests/test_lifecycle_hooks.py
|
|
113
|
+
tests/test_logging.py
|
|
114
|
+
tests/test_pool_callbacks.py
|
|
115
|
+
tests/test_process_signals.py
|
|
116
|
+
tests/test_protocol_contracts.py
|
|
117
|
+
tests/test_release_workflow.py
|
|
118
|
+
tests/test_runner_hooks.py
|
|
119
|
+
tests/test_specifications.py
|
|
120
|
+
tests/test_task_messages.py
|
|
121
|
+
tests/test_task_priorities.py
|
|
122
|
+
tests/test_validator_patterns.py
|
|
123
|
+
tests/test_worker.py
|
|
124
|
+
tests/test_worker_startup.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DefStream
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.14
|
|
4
4
|
Summary: Synchronous message processing with pluggable broker adapters
|
|
5
5
|
Home-page: https://github.com/yong5eon/DefStream
|
|
6
6
|
Author: Heo Yongseon
|
|
@@ -109,8 +109,8 @@ ProcessPool은 `spawn` 자식 프로세스를 사용하므로 부모의 핸들
|
|
|
109
109
|
자식도 로그를 출력하려면 import 가능한 `PoolSetup` 구현에서 같은 설정을 적용하고
|
|
110
110
|
`ProcessPool(..., setups=...)`로 전달하세요. 자식 초기화 훅이 실행되기 전의 DEBUG·INFO는
|
|
111
111
|
그 설정으로 수신할 수 없습니다.
|
|
112
|
-
[RabbitMQ 작업 예제의 LoggingSetup](./
|
|
113
|
-
[부모·자식 설정 예제](./
|
|
112
|
+
[RabbitMQ 작업 예제의 LoggingSetup](./samples/Worker/RabbitMQ/Tasks.py)과
|
|
113
|
+
[부모·자식 설정 예제](./samples/Worker/RabbitMQ/Worker.py)를 참고하세요.
|
|
114
114
|
기존 애플리케이션에서는 이미 설정한 핸들러를 반복 추가하지 않도록 초기화 위치를 관리해야 합니다.
|
|
115
115
|
|
|
116
116
|
## 설치
|
|
@@ -671,9 +671,9 @@ Console의 `broker` 인자는 `DefStream.Broker.BrokerFactory` 계약을 사용
|
|
|
671
671
|
|
|
672
672
|
## 예제와 라이선스
|
|
673
673
|
|
|
674
|
-
- [브로커 없이 실행하는 Worker 예제](./
|
|
675
|
-
- [RabbitMQ Worker·RPC 클라이언트 예제](./
|
|
676
|
-
- [Redis Worker 예제](./
|
|
674
|
+
- [브로커 없이 실행하는 Worker 예제](./samples/Worker/Sample.py)
|
|
675
|
+
- [RabbitMQ Worker·RPC 클라이언트 예제](./samples/Worker/RabbitMQ)
|
|
676
|
+
- [Redis Worker 예제](./samples/Worker/Redis/Sample.py)
|
|
677
677
|
- [릴리즈와 변경 내역](https://github.com/yong5eon/DefStream/releases)
|
|
678
678
|
|
|
679
679
|
GNU GPL v3 라이선스를 사용합니다. 자세한 조건은 [LICENSE](./LICENSE)를 확인하세요.
|
|
@@ -27,15 +27,66 @@ Configure execution, acknowledgements, failure policies, and monitoring without
|
|
|
27
27
|
- [Lifecycle hooks](#lifecycle-hooks)
|
|
28
28
|
- [Request/reply contracts and validation](#requestreply-contracts-and-validation)
|
|
29
29
|
- [Health checks and task console](#health-checks-and-task-console)
|
|
30
|
+
- [Logging](#logging)
|
|
30
31
|
- [Broker selection and operational considerations](#broker-selection-and-operational-considerations)
|
|
31
32
|
- [Examples and license](#examples-and-license)
|
|
32
33
|
|
|
33
|
-
##
|
|
34
|
+
## Logging
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
DefStream records messages through standard `logging` without configuring handlers,
|
|
37
|
+
formatters, or levels. Select the sources your application needs. The samples
|
|
38
|
+
output only the `Sample` and `DefStream` logger hierarchies, replacing their
|
|
39
|
+
`print()` calls with logging. The Worker's existing startup banner is still
|
|
40
|
+
printed regardless of logging configuration.
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
from logging import DEBUG, Filter, Formatter, StreamHandler, getLogger
|
|
44
|
+
|
|
45
|
+
sources = (Filter('Sample'), Filter('DefStream'))
|
|
46
|
+
handler = StreamHandler()
|
|
47
|
+
handler.setFormatter(Formatter(
|
|
48
|
+
'%(asctime)s %(processName)s %(name)s %(levelname)s %(message)s'
|
|
49
|
+
))
|
|
50
|
+
handler.addFilter(lambda record: any(source.filter(record) for source in sources))
|
|
51
|
+
root = getLogger()
|
|
52
|
+
root.setLevel(DEBUG)
|
|
53
|
+
root.addHandler(handler)
|
|
54
|
+
|
|
55
|
+
logger = getLogger('Sample')
|
|
56
|
+
logger.info('Application started')
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Apply filters to the **handler**, not the root logger. `Filter('DefStream')`
|
|
60
|
+
includes `DefStream` and names below `DefStream.`, but not `DefStreamExtra`.
|
|
61
|
+
This configuration is an example for a standalone application; it does not change
|
|
62
|
+
output from other handlers already installed. To receive only broker logs, select
|
|
63
|
+
`DefStream.Broker.Implements.RabbitMQ` or `DefStream.Broker.Implements.Redis`
|
|
64
|
+
instead of `DefStream`.
|
|
65
|
+
|
|
66
|
+
- The class member `logger` uses `DefStream.Worker`, `DefStream.Run`,
|
|
67
|
+
`DefStream.Executor`, `DefStream.Pool`, `DefStream.ThreadPool`, and
|
|
68
|
+
`DefStream.ProcessPool`.
|
|
69
|
+
- Shared Pool methods also use the concrete pool's logger member. User subclasses
|
|
70
|
+
inherit the default name and can explicitly override `logger`.
|
|
71
|
+
- Inspector, Server, and RequestHandler share `DefStream.Inspector`.
|
|
72
|
+
HTTP request receipt is DEBUG; response status and transmission results are INFO.
|
|
73
|
+
Extension-specific logs use `DefStream.Inspector.Extensions.<extension name>`.
|
|
74
|
+
- Normal per-message processing is DEBUG, lifecycle events are INFO, events
|
|
75
|
+
requiring attention are WARNING, and processing failures are ERROR.
|
|
76
|
+
Bodies, results, and credentials are excluded from the default log context.
|
|
77
|
+
- Without any handlers, Python's `lastResort` may write WARNING and higher to
|
|
78
|
+
stderr. Do not put sensitive values in user exception messages: failure
|
|
79
|
+
tracebacks include those messages.
|
|
80
|
+
|
|
81
|
+
ProcessPool uses `spawn` child processes, so parent handlers are not automatically
|
|
82
|
+
inherited. To receive child logs, apply the same configuration in an importable
|
|
83
|
+
`PoolSetup` implementation and pass it through `ProcessPool(..., setups=...)`.
|
|
84
|
+
That configuration cannot capture DEBUG and INFO logs emitted before the child
|
|
85
|
+
setup hook runs. See
|
|
86
|
+
[LoggingSetup in the RabbitMQ task example](./samples/Worker/RabbitMQ/Tasks.py)
|
|
87
|
+
and the [parent/child configuration example](./samples/Worker/RabbitMQ/Worker.py).
|
|
88
|
+
In existing applications, choose the initialization location carefully to avoid
|
|
89
|
+
adding the same handlers repeatedly.
|
|
39
90
|
|
|
40
91
|
## Installation
|
|
41
92
|
|
|
@@ -610,9 +661,9 @@ For a class-based factory, you can inherit `BrokerFactory` and implement `__call
|
|
|
610
661
|
|
|
611
662
|
## Examples and license
|
|
612
663
|
|
|
613
|
-
- [Worker without an external broker](./
|
|
614
|
-
- [RabbitMQ Worker and RPC client](./
|
|
615
|
-
- [Redis Worker](./
|
|
664
|
+
- [Worker without an external broker](./samples/Worker/Sample.py)
|
|
665
|
+
- [RabbitMQ Worker and RPC client](./samples/Worker/RabbitMQ)
|
|
666
|
+
- [Redis Worker](./samples/Worker/Redis/Sample.py)
|
|
616
667
|
- [Releases and change history](https://github.com/yong5eon/DefStream/releases)
|
|
617
668
|
|
|
618
669
|
Licensed under GNU GPL v3. See [LICENSE](./LICENSE) for the terms.
|
|
@@ -76,8 +76,8 @@ ProcessPool은 `spawn` 자식 프로세스를 사용하므로 부모의 핸들
|
|
|
76
76
|
자식도 로그를 출력하려면 import 가능한 `PoolSetup` 구현에서 같은 설정을 적용하고
|
|
77
77
|
`ProcessPool(..., setups=...)`로 전달하세요. 자식 초기화 훅이 실행되기 전의 DEBUG·INFO는
|
|
78
78
|
그 설정으로 수신할 수 없습니다.
|
|
79
|
-
[RabbitMQ 작업 예제의 LoggingSetup](./
|
|
80
|
-
[부모·자식 설정 예제](./
|
|
79
|
+
[RabbitMQ 작업 예제의 LoggingSetup](./samples/Worker/RabbitMQ/Tasks.py)과
|
|
80
|
+
[부모·자식 설정 예제](./samples/Worker/RabbitMQ/Worker.py)를 참고하세요.
|
|
81
81
|
기존 애플리케이션에서는 이미 설정한 핸들러를 반복 추가하지 않도록 초기화 위치를 관리해야 합니다.
|
|
82
82
|
|
|
83
83
|
## 설치
|
|
@@ -638,9 +638,9 @@ Console의 `broker` 인자는 `DefStream.Broker.BrokerFactory` 계약을 사용
|
|
|
638
638
|
|
|
639
639
|
## 예제와 라이선스
|
|
640
640
|
|
|
641
|
-
- [브로커 없이 실행하는 Worker 예제](./
|
|
642
|
-
- [RabbitMQ Worker·RPC 클라이언트 예제](./
|
|
643
|
-
- [Redis Worker 예제](./
|
|
641
|
+
- [브로커 없이 실행하는 Worker 예제](./samples/Worker/Sample.py)
|
|
642
|
+
- [RabbitMQ Worker·RPC 클라이언트 예제](./samples/Worker/RabbitMQ)
|
|
643
|
+
- [Redis Worker 예제](./samples/Worker/Redis/Sample.py)
|
|
644
644
|
- [릴리즈와 변경 내역](https://github.com/yong5eon/DefStream/releases)
|
|
645
645
|
|
|
646
646
|
GNU GPL v3 라이선스를 사용합니다. 자세한 조건은 [LICENSE](./LICENSE)를 확인하세요.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Inspector Console 사용자 지정 Task 이름 버그 수정 기록
|
|
2
|
+
|
|
3
|
+
## 구현 개요
|
|
4
|
+
|
|
5
|
+
[요구사항 명세서](./REQUIREMENTS.md)에 따라 Inspector Console이 작업 목록과
|
|
6
|
+
동일한 작업 ID를 사용해 등록된 Task를 찾고, 잘못된 요청의 구체적인 원인을
|
|
7
|
+
경고 로그에서 확인할 수 있도록 수정했다.
|
|
8
|
+
|
|
9
|
+
## 주요 변경
|
|
10
|
+
|
|
11
|
+
- `Console.execute()`의 Task 검색과 중복 검사를 모두 `task.__name__`에서
|
|
12
|
+
`task.name` 비교로 변경했다. 작업 이름을 사용자 지정한 경우에도
|
|
13
|
+
Specifications 문서와 Console UI가 전달하는 ID로 올바른 Task를 식별한다.
|
|
14
|
+
- 잘못된 입력을 거부하는 경고 로그에 예외 종류와 예외 메시지를 함께 기록한다.
|
|
15
|
+
- `test_inspector_console.py`에 사용자 지정 ID의 발행 성공, 중복 ID 거부,
|
|
16
|
+
미등록 ID의 오류 로그 내용을 확인하는 회귀 테스트를 추가했다.
|
|
17
|
+
- RabbitMQ·Redis 실서버 테스트의 요청 ID도 실제 등록된 하위 Task의 `Live.name`을
|
|
18
|
+
사용하도록 했다. 클래스의 `__name__`(`Live`)와 Worker에 등록하는 유효 작업
|
|
19
|
+
이름은 같다고 가정할 수 없으며, 이전의 하드코딩은 요청을 400으로 거부하게 했다.
|
|
20
|
+
|
|
21
|
+
## 검증
|
|
22
|
+
|
|
23
|
+
DefStream 테스트 디렉터리에서 Python 3.12.10으로 다음 명령을 실행했다.
|
|
24
|
+
|
|
25
|
+
```powershell
|
|
26
|
+
$env:PYTHONIOENCODING = 'utf-8'
|
|
27
|
+
..\..\.venv\Scripts\python.exe -m unittest test_inspector_console test_inspector_logging
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Inspector Console 및 로깅 관련 테스트 28개가 통과했고, 선택 통합 테스트 2개는
|
|
31
|
+
건너뛰었다. 변경된 두 Python 파일의 `compile()` 문법 검사와
|
|
32
|
+
`git diff --check`도 통과했다. 브로커 실서버 통합 검증은 수행하지 않았다.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Inspector Console에서 사용자 지정 Task 이름으로 요청 시 큐 발행 전에 거부됨
|
|
2
|
+
|
|
3
|
+
## 버전
|
|
4
|
+
|
|
5
|
+
0.1.12
|
|
6
|
+
|
|
7
|
+
## 내용
|
|
8
|
+
|
|
9
|
+
Inspector Console이 Task 목록에 표시하는 이름과 실제 Task를 찾는 기준이 다릅니다.
|
|
10
|
+
|
|
11
|
+
Specifications.document()은 task.name을 작업 ID로 사용합니다. Console UI는 이 ID를 선택해 요청을 보내지만, Console.execute()는 등록된 작업을 찾을 때 task.__name__과 요청의 task 값을 비교합니다.
|
|
12
|
+
|
|
13
|
+
예를 들어 Orbis Split은 Split.name이 ETL.OBS.Split이고 Split.__name__은 Split입니다. 따라서 UI에서 선택한 작업 ID ETL.OBS.Split과 Console의 비교 값 Split이 일치하지 않아 Unknown registered task 오류가 발생합니다. 이 검사는 브로커에 연결하거나 메시지를 발행하기 전에 수행되므로 요청은 큐에 도달하지 않습니다.
|
|
14
|
+
|
|
15
|
+
또한 Console 경고 로그에는 구체적인 오류 메시지 대신 예외 종류만 기록되어 원인을 파악하기 어렵습니다.
|
|
16
|
+
|
|
17
|
+
기대 동작: Console이 Task 목록을 만들 때와 동일하게 task.name을 기준으로 작업을 찾아야 합니다. 중복 여부 검사도 같은 기준을 사용해야 합니다.
|
|
18
|
+
|
|
19
|
+
실제 동작: Console이 task.__name__을 기준으로 작업을 찾아 사용자 지정 이름을 사용하는 Task를 거부합니다.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Inspector Console 사용자 지정 Task 이름 처리
|
|
2
|
+
|
|
3
|
+
Inspector Console이 작업 목록에 표시한 ID로 Task를 찾도록 수정했습니다.
|
|
4
|
+
따라서 `ETL.OBS.Split`처럼 클래스 이름과 다른 사용자 지정 Task 이름으로도
|
|
5
|
+
요청을 보낼 수 있습니다. 동일한 작업 ID가 중복 등록된 경우에는 모호한 작업
|
|
6
|
+
실행을 막기 위해 요청을 거부합니다.
|
|
7
|
+
|
|
8
|
+
잘못된 요청은 기존처럼 거부되며, 경고 로그에 예외 종류와 구체적인 원인이 함께
|
|
9
|
+
기록됩니다.
|
|
10
|
+
|
|
11
|
+
세부 내용은 [요구사항 명세서](./REQUIREMENTS.md)와
|
|
12
|
+
[구현 및 검증 기록](./IMPLEMENTS.md)을 참고하세요.
|