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.
Files changed (126) hide show
  1. defstream-0.1.14/.github/ISSUE_TEMPLATE/01.feature.yml +39 -0
  2. defstream-0.1.14/.github/ISSUE_TEMPLATE/02.bug.yml +64 -0
  3. defstream-0.1.14/.github/ISSUE_TEMPLATE/03.fix.yml +57 -0
  4. defstream-0.1.14/.github/ISSUE_TEMPLATE/04.task.yml +40 -0
  5. defstream-0.1.14/.github/ISSUE_TEMPLATE/config.yml +1 -0
  6. defstream-0.1.14/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  7. {defstream-0.1.12 → defstream-0.1.14}/.github/workflows/ci.yml +30 -2
  8. {defstream-0.1.12 → defstream-0.1.14}/.gitignore +2 -4
  9. {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/PKG-INFO +6 -6
  10. {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/SOURCES.txt +42 -24
  11. {defstream-0.1.12 → defstream-0.1.14}/PKG-INFO +6 -6
  12. {defstream-0.1.12 → defstream-0.1.14}/README.en.md +59 -8
  13. {defstream-0.1.12 → defstream-0.1.14}/README.md +5 -5
  14. defstream-0.1.14/issues/bug/16/IMPLEMENTS.md +32 -0
  15. defstream-0.1.14/issues/bug/16/ISSUE.md +19 -0
  16. defstream-0.1.14/issues/bug/16/README.md +12 -0
  17. defstream-0.1.14/issues/bug/16/REQUIREMENTS.md +25 -0
  18. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/IMPLEMENTS.md +5 -5
  19. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/README.md +2 -2
  20. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/10/IMPLEMENTS.md +3 -3
  21. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/13/README.md +1 -1
  22. defstream-0.1.14/issues/fix/21/IMPLEMENTS.md +38 -0
  23. defstream-0.1.14/issues/fix/21/ISSUE.md +17 -0
  24. defstream-0.1.14/issues/fix/21/README.md +44 -0
  25. defstream-0.1.14/issues/fix/21/REQUIREMENTS.md +68 -0
  26. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/IMPLEMENTS.md +1 -1
  27. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/6/IMPLEMENTS.md +2 -2
  28. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/6/README.md +1 -1
  29. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/6/REQUIREMENTS.md +3 -3
  30. defstream-0.1.14/issues/task/18/IMPLEMENTS.md +96 -0
  31. defstream-0.1.14/issues/task/18/README.md +37 -0
  32. defstream-0.1.14/issues/task/18/REQUIREMENTS.md +59 -0
  33. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Console.py +4 -3
  34. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Common.py +2 -3
  35. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/__init__.py +2 -2
  36. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_inspector_console.py +56 -2
  37. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_logging.py +2 -2
  38. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_release_workflow.py +62 -0
  39. defstream-0.1.14/tests/test_validator_patterns.py +48 -0
  40. {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/dependency_links.txt +0 -0
  41. {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/requires.txt +0 -0
  42. {defstream-0.1.12 → defstream-0.1.14}/DefStream.egg-info/top_level.txt +0 -0
  43. {defstream-0.1.12 → defstream-0.1.14}/LICENSE +0 -0
  44. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/IMPLEMENTS.md +0 -0
  45. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/README.md +0 -0
  46. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/REQUIREMENTS.md +0 -0
  47. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/TASK.md +0 -0
  48. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/1/ci.refs.json +0 -0
  49. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/REQUIREMENTS.md +0 -0
  50. {defstream-0.1.12 → defstream-0.1.14}/issues/feature/8/ci.refs.json +0 -0
  51. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/10/README.md +0 -0
  52. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/10/REQUIREMENTS.md +0 -0
  53. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/README.md +0 -0
  54. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/REQUIREMENTS.md +0 -0
  55. {defstream-0.1.12 → defstream-0.1.14}/issues/fix/3/ci.refs.json +0 -0
  56. {defstream-0.1.12/sample → defstream-0.1.14/samples}/Broker/Sample.py +0 -0
  57. {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/RabbitMQ/Client.py +0 -0
  58. {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/RabbitMQ/Tasks.py +0 -0
  59. {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/RabbitMQ/Worker.py +0 -0
  60. {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/Redis/Sample.py +0 -0
  61. {defstream-0.1.12/sample → defstream-0.1.14/samples}/Worker/Sample.py +0 -0
  62. {defstream-0.1.12 → defstream-0.1.14}/setup.cfg +0 -0
  63. {defstream-0.1.12 → defstream-0.1.14}/setup.py +0 -0
  64. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Configuration.py +0 -0
  65. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Connection.py +0 -0
  66. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Consumer.py +0 -0
  67. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Errors.py +0 -0
  68. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Event.py +0 -0
  69. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Implements/__init__.py +0 -0
  70. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Policies.py +0 -0
  71. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Priority.py +0 -0
  72. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/Protocol.py +0 -0
  73. {defstream-0.1.12 → defstream-0.1.14}/src/Broker/__init__.py +0 -0
  74. {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/DataObject.py +0 -0
  75. {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/Types.py +0 -0
  76. {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/Value.py +0 -0
  77. {defstream-0.1.12 → defstream-0.1.14}/src/Descriptor/__init__.py +0 -0
  78. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extension.py +0 -0
  79. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Console.html +0 -0
  80. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Dashboard.html +0 -0
  81. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Dashboard.py +0 -0
  82. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/HealthCheck.py +0 -0
  83. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Metrics.py +0 -0
  84. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/Specifications.py +0 -0
  85. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Extensions/__init__.py +0 -0
  86. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Inspector.py +0 -0
  87. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/Response.py +0 -0
  88. {defstream-0.1.12 → defstream-0.1.14}/src/Inspector/__init__.py +0 -0
  89. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Pattern.py +0 -0
  90. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Array.py +0 -0
  91. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Compare.py +0 -0
  92. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Condition.py +0 -0
  93. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/DataObject.py +0 -0
  94. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/DateTime.py +0 -0
  95. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Number.py +0 -0
  96. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Object.py +0 -0
  97. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Size.py +0 -0
  98. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/String.py +0 -0
  99. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Patterns/Type.py +0 -0
  100. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Validate.py +0 -0
  101. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/Validator.py +0 -0
  102. {defstream-0.1.12 → defstream-0.1.14}/src/Validator/__init__.py +0 -0
  103. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Executor.py +0 -0
  104. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Message.py +0 -0
  105. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Pool.py +0 -0
  106. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Run.py +0 -0
  107. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Specification.py +0 -0
  108. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Startup.py +0 -0
  109. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/Worker.py +0 -0
  110. {defstream-0.1.12 → defstream-0.1.14}/src/Worker/__init__.py +0 -0
  111. {defstream-0.1.12 → defstream-0.1.14}/src/__init__.py +0 -0
  112. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_dashboard.py +0 -0
  113. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_dashboard_ui.cjs +0 -0
  114. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_descriptor.py +0 -0
  115. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_inspector.py +0 -0
  116. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_inspector_logging.py +0 -0
  117. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_lifecycle_hooks.py +0 -0
  118. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_pool_callbacks.py +0 -0
  119. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_process_signals.py +0 -0
  120. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_protocol_contracts.py +0 -0
  121. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_runner_hooks.py +0 -0
  122. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_specifications.py +0 -0
  123. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_task_messages.py +0 -0
  124. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_task_priorities.py +0 -0
  125. {defstream-0.1.12/test → defstream-0.1.14/tests}/test_worker.py +0 -0
  126. {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/test" -p 'test_*.py' -v
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/test/test_dashboard_ui.cjs
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'
@@ -53,10 +53,8 @@ tmp/
53
53
  .git/
54
54
 
55
55
  # GitHub specific files
56
- .github/
57
- !/.github/
58
- /.github/*
59
- !/.github/workflows/
56
+ .github/instructions
57
+ .github/instructions/
60
58
 
61
59
  # GitLab specific files
62
60
  .gitlab/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DefStream
3
- Version: 0.1.12
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](./sample/Worker/RabbitMQ/Tasks.py)과
113
- [부모·자식 설정 예제](./sample/Worker/RabbitMQ/Worker.py)를 참고하세요.
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 예제](./sample/Worker/Sample.py)
675
- - [RabbitMQ Worker·RPC 클라이언트 예제](./sample/Worker/RabbitMQ)
676
- - [Redis Worker 예제](./sample/Worker/Redis/Sample.py)
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
- sample/Broker/Sample.py
33
- sample/Worker/Sample.py
34
- sample/Worker/RabbitMQ/Client.py
35
- sample/Worker/RabbitMQ/Tasks.py
36
- sample/Worker/RabbitMQ/Worker.py
37
- sample/Worker/Redis/Sample.py
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
- test/test_dashboard.py
90
- test/test_dashboard_ui.cjs
91
- test/test_descriptor.py
92
- test/test_inspector.py
93
- test/test_inspector_console.py
94
- test/test_inspector_logging.py
95
- test/test_lifecycle_hooks.py
96
- test/test_logging.py
97
- test/test_pool_callbacks.py
98
- test/test_process_signals.py
99
- test/test_protocol_contracts.py
100
- test/test_release_workflow.py
101
- test/test_runner_hooks.py
102
- test/test_specifications.py
103
- test/test_task_messages.py
104
- test/test_task_priorities.py
105
- test/test_worker.py
106
- test/test_worker_startup.py
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.12
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](./sample/Worker/RabbitMQ/Tasks.py)과
113
- [부모·자식 설정 예제](./sample/Worker/RabbitMQ/Worker.py)를 참고하세요.
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 예제](./sample/Worker/Sample.py)
675
- - [RabbitMQ Worker·RPC 클라이언트 예제](./sample/Worker/RabbitMQ)
676
- - [Redis Worker 예제](./sample/Worker/Redis/Sample.py)
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
- 샘플은 `Sample` 및 `DefStream` 계층만 출력하며, ProcessPool 자식은 별도 setup 훅으로
37
- 출력을 설정합니다. Worker의 시작 배너는 유지됩니다.
38
- 로거 이름, 선택 수신, 예외 메시지 주의사항과 프로세스 설정은 [로깅 안내](./README.md#로깅)를 참고하세요.
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](./sample/Worker/Sample.py)
614
- - [RabbitMQ Worker and RPC client](./sample/Worker/RabbitMQ)
615
- - [Redis Worker](./sample/Worker/Redis/Sample.py)
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](./sample/Worker/RabbitMQ/Tasks.py)과
80
- [부모·자식 설정 예제](./sample/Worker/RabbitMQ/Worker.py)를 참고하세요.
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 예제](./sample/Worker/Sample.py)
642
- - [RabbitMQ Worker·RPC 클라이언트 예제](./sample/Worker/RabbitMQ)
643
- - [Redis Worker 예제](./sample/Worker/Redis/Sample.py)
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)을 참고하세요.