ErisPulse 2.2.0.dev1__tar.gz → 2.2.1__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.
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/tools/merge_md.py +32 -44
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/tools/update-api-docs.py +18 -16
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/workflows/auto-tag-release.yml +2 -14
- {erispulse-2.2.0.dev1/docs → erispulse-2.2.1}/CHANGELOG.md +91 -1
- erispulse-2.2.1/CONTRIBUTING.md +107 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/PKG-INFO +31 -52
- erispulse-2.2.1/README.md +117 -0
- erispulse-2.2.1/devs/test_cmd.py +419 -0
- erispulse-2.2.1/docs/README.md +70 -0
- erispulse-2.2.0.dev1/docs/AIDocs/ErisPulse-ModuleDev.md → erispulse-2.2.1/docs/ai/AIDocs/ErisPulse-AdapterDev.md +2975 -1603
- {erispulse-2.2.0.dev1/docs → erispulse-2.2.1/docs/ai}/AIDocs/ErisPulse-Full.md +2213 -1613
- erispulse-2.2.1/docs/ai/AIDocs/ErisPulse-ModuleDev.md +1693 -0
- erispulse-2.2.1/docs/ai/README.md +25 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/Event/__init__.md +7 -5
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/Event/base.md +29 -34
- erispulse-2.2.1/docs/api/ErisPulse/Core/Event/command.md +154 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/Event/exceptions.md +10 -10
- erispulse-2.2.1/docs/api/ErisPulse/Core/Event/message.md +101 -0
- erispulse-2.2.1/docs/api/ErisPulse/Core/Event/meta.md +100 -0
- erispulse-2.2.1/docs/api/ErisPulse/Core/Event/notice.md +118 -0
- erispulse-2.2.1/docs/api/ErisPulse/Core/Event/request.md +82 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/adapter.md +74 -74
- erispulse-2.2.1/docs/api/ErisPulse/Core/config.md +44 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/env.md +2 -2
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/erispulse_config.md +2 -2
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/exceptions.md +27 -2
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/logger.md +33 -33
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/module.md +31 -31
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/module_registry.md +40 -40
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/router.md +28 -28
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/Core/storage.md +64 -64
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/__init__.md +58 -58
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/api/ErisPulse/__main__.md +133 -133
- erispulse-2.2.1/docs/core/README.md +21 -0
- erispulse-2.2.1/docs/core/adapters.md +107 -0
- erispulse-2.2.1/docs/core/best-practices.md +326 -0
- erispulse-2.2.0.dev1/docs/CLI.md → erispulse-2.2.1/docs/core/cli.md +13 -94
- erispulse-2.2.1/docs/core/concepts.md +38 -0
- erispulse-2.2.1/docs/core/event-system.md +274 -0
- erispulse-2.2.1/docs/core/modules.md +321 -0
- erispulse-2.2.1/docs/development/README.md +44 -0
- erispulse-2.2.0.dev1/docs/Development/Adapter.md → erispulse-2.2.1/docs/development/adapter.md +3 -7
- erispulse-2.2.0.dev1/docs/Development/Module.md → erispulse-2.2.1/docs/development/module.md +11 -6
- erispulse-2.2.0.dev1/docs/PlatformFeatures.md → erispulse-2.2.1/docs/platform-features.md +5 -162
- erispulse-2.2.1/docs/standards/README.md +19 -0
- erispulse-2.2.0.dev1/docs/AdapterStandards/APIResponse.md → erispulse-2.2.1/docs/standards/api-response.md +1 -1
- erispulse-2.2.0.dev1/docs/AdapterStandards/EventConversion.md → erispulse-2.2.1/docs/standards/event-conversion.md +1 -1
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/packages.json +15 -1
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/pyproject.toml +2 -2
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/__init__.py +10 -7
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/base.py +30 -37
- erispulse-2.2.1/src/ErisPulse/Core/Event/command.py +470 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/message.py +43 -12
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/meta.py +42 -11
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/notice.py +51 -11
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/request.py +33 -11
- erispulse-2.2.0.dev1/README.md +0 -138
- erispulse-2.2.0.dev1/devs/test_cmd.py +0 -124
- erispulse-2.2.0.dev1/docs/AIDocs/ErisPulse-AdapterDev.md +0 -4285
- erispulse-2.2.0.dev1/docs/AIDocs/ErisPulse-Core.md +0 -4146
- erispulse-2.2.0.dev1/docs/AdapterStandards/README.md +0 -3
- erispulse-2.2.0.dev1/docs/Development/README.md +0 -3
- erispulse-2.2.0.dev1/docs/StyleGuide/DocstringSpec.md +0 -95
- erispulse-2.2.0.dev1/docs/StyleGuide/README.md +0 -5
- erispulse-2.2.0.dev1/docs/UseCore.md +0 -485
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/Event/cmd.md +0 -93
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/Event/manager.md +0 -96
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/Event/message.md +0 -69
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/Event/meta.md +0 -69
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/Event/notice.md +0 -78
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/Event/request.md +0 -60
- erispulse-2.2.0.dev1/docs/api/ErisPulse/Core/config.md +0 -17
- erispulse-2.2.0.dev1/src/ErisPulse/Core/Event/cmd.py +0 -210
- erispulse-2.2.0.dev1/src/ErisPulse/Core/Event/manager.py +0 -127
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/ISSUE_TEMPLATE/module_submission.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/assets/docs/install_pip.gif +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/assets/erispulse_logo.png +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/scripts/update_packages.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/workflows/auto-update-packages.yml +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.github/workflows/pypi-publish.yml +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.gitignore +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.python-version +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/.worker/worker.js +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/CODE_OF_CONDUCT.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/LICENSE +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/SECURITY.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/devs/test.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/devs/test_adapter.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/devs/test_event.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/devs/test_files/test.docx +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/devs/test_files/test.jpg +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/devs/test_files/test.mp4 +0 -0
- /erispulse-2.2.0.dev1/docs/AIModuleGeneration.md → /erispulse-2.2.1/docs/ai/module-generation.md +0 -0
- /erispulse-2.2.0.dev1/docs/Development/CLI.md → /erispulse-2.2.1/docs/development/cli.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/docs/quick-start.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-adapter/LICENSE +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-adapter/MyAdapter/Core.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-adapter/MyAdapter/__init__.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-adapter/README.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-adapter/pyproject.toml +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-cli-module/LICENSE +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-cli-module/README.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-cli-module/my_cli_module/__init__.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-cli-module/my_cli_module/cli.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-cli-module/pyproject.toml +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-module/LICENSE +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-module/MyModule/Core.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-module/MyModule/__init__.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-module/README.md +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/examples/example-module/pyproject.toml +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/scripts/install/install.ps1 +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/scripts/install/install.sh +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/Event/exceptions.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/__init__.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/adapter.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/config.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/env.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/erispulse_config.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/exceptions.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/logger.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/module.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/module_registry.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/router.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/Core/storage.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/__init__.py +0 -0
- {erispulse-2.2.0.dev1 → erispulse-2.2.1}/src/ErisPulse/__main__.py +0 -0
|
@@ -92,7 +92,6 @@ def merge_api_docs(api_dir, output_file):
|
|
|
92
92
|
try:
|
|
93
93
|
with open(file_path, 'r', encoding='utf-8') as infile:
|
|
94
94
|
content = infile.read()
|
|
95
|
-
# 移除原有标题,因为我们已经添加了
|
|
96
95
|
lines = content.split('\n')
|
|
97
96
|
if lines and lines[0].startswith('# '):
|
|
98
97
|
content = '\n'.join(lines[1:])
|
|
@@ -110,12 +109,16 @@ def generate_full_document():
|
|
|
110
109
|
# 要合并的文件
|
|
111
110
|
files_to_merge = [
|
|
112
111
|
{"path": "docs/quick-start.md", "description": "快速开始指南"},
|
|
113
|
-
{"path": "docs/
|
|
114
|
-
{"path": "docs/
|
|
115
|
-
{"path": "docs/
|
|
116
|
-
{"path": "docs/
|
|
117
|
-
{"path": "docs/
|
|
118
|
-
{"path": "docs/
|
|
112
|
+
{"path": "docs/platform-features.md", "description": "平台功能说明"},
|
|
113
|
+
{"path": "docs/core/concepts.md", "description": "核心概念"},
|
|
114
|
+
{"path": "docs/core/modules.md", "description": "核心模块"},
|
|
115
|
+
{"path": "docs/core/adapters.md", "description": "适配器系统"},
|
|
116
|
+
{"path": "docs/core/event-system.md", "description": "事件系统"},
|
|
117
|
+
{"path": "docs/core/best-practices.md", "description": "最佳实践"},
|
|
118
|
+
{"path": "docs/development/module.md", "description": "模块开发指南"},
|
|
119
|
+
{"path": "docs/development/adapter.md", "description": "适配器开发指南"},
|
|
120
|
+
{"path": "docs/standards/api-response.md", "description": "API响应标准"},
|
|
121
|
+
{"path": "docs/standards/event-conversion.md", "description": "事件转换标准"},
|
|
119
122
|
]
|
|
120
123
|
|
|
121
124
|
# 过滤不存在的文件
|
|
@@ -123,7 +126,7 @@ def generate_full_document():
|
|
|
123
126
|
if len(existing_files) != len(files_to_merge):
|
|
124
127
|
print(f"警告: {len(files_to_merge) - len(existing_files)} 个文件不存在,已跳过")
|
|
125
128
|
|
|
126
|
-
output_file = "docs/AIDocs/ErisPulse-Full.md"
|
|
129
|
+
output_file = "docs/ai/AIDocs/ErisPulse-Full.md"
|
|
127
130
|
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
|
128
131
|
|
|
129
132
|
merge_md_files(output_file, existing_files, "完整开发文档")
|
|
@@ -131,65 +134,51 @@ def generate_full_document():
|
|
|
131
134
|
|
|
132
135
|
print(f"完整文档生成完成,已保存到: {output_file}")
|
|
133
136
|
|
|
134
|
-
def generate_core_document():
|
|
135
|
-
print("正在生成核心功能文档...")
|
|
136
|
-
|
|
137
|
-
files_to_merge = [
|
|
138
|
-
{"path": "docs/quick-start.md", "description": "快速开始指南"},
|
|
139
|
-
{"path": "docs/UseCore.md", "description": "核心功能使用说明"},
|
|
140
|
-
{"path": "docs/PlatformFeatures.md", "description": "平台功能说明"},
|
|
141
|
-
]
|
|
142
|
-
|
|
143
|
-
# 过滤不存在的文件
|
|
144
|
-
existing_files = [f for f in files_to_merge if os.path.exists(f['path'])]
|
|
145
|
-
|
|
146
|
-
output_file = "docs/AIDocs/ErisPulse-Core.md"
|
|
147
|
-
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
|
148
|
-
|
|
149
|
-
merge_md_files(output_file, existing_files, "核心功能文档")
|
|
150
|
-
# 合并API文档
|
|
151
|
-
merge_api_docs("docs/api", output_file)
|
|
152
|
-
|
|
153
|
-
print(f"核心功能文档生成完成,已保存到: {output_file}")
|
|
154
|
-
|
|
155
137
|
def generate_dev_documents():
|
|
156
138
|
print("正在生成开发文档...")
|
|
157
139
|
|
|
158
140
|
# 模块开发文档
|
|
159
141
|
module_files = [
|
|
160
142
|
{"path": "docs/quick-start.md", "description": "快速开始指南"},
|
|
161
|
-
{"path": "docs/
|
|
162
|
-
{"path": "docs/
|
|
163
|
-
{"path": "docs/
|
|
143
|
+
{"path": "docs/core/concepts.md", "description": "基础架构和设计理念"},
|
|
144
|
+
{"path": "docs/core/modules.md", "description": "核心模块"},
|
|
145
|
+
{"path": "docs/core/adapters.md", "description": "适配器"},
|
|
146
|
+
{"path": "docs/core/event-system.md", "description": "事件系统"},
|
|
147
|
+
{"path": "docs/platform-features.md", "description": "平台功能说明"},
|
|
148
|
+
{"path": "docs/standards/event-conversion.md", "description": "标准事件的定义"},
|
|
149
|
+
{"path": "docs/standards/api-response.md", "description": "api响应的格式" },
|
|
164
150
|
]
|
|
165
151
|
|
|
166
152
|
# 过滤不存在的文件
|
|
167
153
|
existing_module_files = [f for f in module_files if os.path.exists(f['path'])]
|
|
168
154
|
|
|
169
|
-
module_output = "docs/AIDocs/ErisPulse-ModuleDev.md"
|
|
155
|
+
module_output = "docs/ai/AIDocs/ErisPulse-ModuleDev.md"
|
|
170
156
|
os.makedirs(os.path.dirname(module_output), exist_ok=True)
|
|
171
157
|
merge_md_files(module_output, existing_module_files, "模块开发文档")
|
|
172
|
-
|
|
173
|
-
merge_api_docs("docs/api", module_output)
|
|
174
|
-
|
|
158
|
+
|
|
175
159
|
print(f"模块开发文档生成完成,已保存到: {module_output}")
|
|
176
160
|
|
|
177
161
|
# 适配器开发文档
|
|
178
|
-
adapter_files
|
|
162
|
+
adapter_files = [
|
|
179
163
|
{"path": "docs/quick-start.md", "description": "快速开始指南"},
|
|
180
|
-
{"path": "docs/
|
|
181
|
-
{"path": "docs/
|
|
182
|
-
{"path": "docs/
|
|
183
|
-
{"path": "docs/
|
|
164
|
+
{"path": "docs/platform-features.md", "description": "平台功能说明"},
|
|
165
|
+
{"path": "docs/core/concepts.md", "description": "核心概念"},
|
|
166
|
+
{"path": "docs/core/modules.md", "description": "核心模块"},
|
|
167
|
+
{"path": "docs/core/adapters.md", "description": "适配器系统"},
|
|
168
|
+
{"path": "docs/core/event-system.md", "description": "事件系统"},
|
|
169
|
+
{"path": "docs/core/best-practices.md", "description": "最佳实践"},
|
|
170
|
+
{"path": "docs/development/module.md", "description": "模块开发指南"},
|
|
171
|
+
{"path": "docs/development/adapter.md", "description": "适配器开发指南"},
|
|
172
|
+
{"path": "docs/standards/api-response.md", "description": "API响应标准"},
|
|
173
|
+
{"path": "docs/standards/event-conversion.md", "description": "事件转换标准"},
|
|
184
174
|
]
|
|
185
175
|
|
|
186
176
|
# 过滤不存在的文件
|
|
187
177
|
existing_adapter_files = [f for f in adapter_files if os.path.exists(f['path'])]
|
|
188
178
|
|
|
189
|
-
adapter_output = "docs/AIDocs/ErisPulse-AdapterDev.md"
|
|
179
|
+
adapter_output = "docs/ai/AIDocs/ErisPulse-AdapterDev.md"
|
|
190
180
|
os.makedirs(os.path.dirname(adapter_output), exist_ok=True)
|
|
191
181
|
merge_md_files(adapter_output, existing_adapter_files, "适配器开发文档")
|
|
192
|
-
# 合并API文档
|
|
193
182
|
merge_api_docs("docs/api", adapter_output)
|
|
194
183
|
|
|
195
184
|
print(f"适配器开发文档生成完成,已保存到: {adapter_output}")
|
|
@@ -219,7 +208,6 @@ def generate_custom_document(title, files, api_dirs, output_path):
|
|
|
219
208
|
if __name__ == "__main__":
|
|
220
209
|
try:
|
|
221
210
|
generate_full_document()
|
|
222
|
-
generate_core_document()
|
|
223
211
|
generate_dev_documents()
|
|
224
212
|
print("所有文档生成完成")
|
|
225
213
|
except Exception as e:
|
|
@@ -117,11 +117,9 @@ def parse_python_file(file_path: str) -> Tuple[Optional[str], List[Dict], List[D
|
|
|
117
117
|
# 处理类定义
|
|
118
118
|
if isinstance(node, ast.ClassDef):
|
|
119
119
|
class_doc = ast.get_docstring(node)
|
|
120
|
-
processed_class_doc = process_docstring(class_doc) if class_doc else
|
|
120
|
+
processed_class_doc = process_docstring(class_doc) if class_doc else ""
|
|
121
121
|
|
|
122
|
-
|
|
123
|
-
continue
|
|
124
|
-
|
|
122
|
+
# 不管类有没有文档,都要处理其中的方法
|
|
125
123
|
methods = []
|
|
126
124
|
# 提取类方法
|
|
127
125
|
for item in node.body:
|
|
@@ -129,7 +127,7 @@ def parse_python_file(file_path: str) -> Tuple[Optional[str], List[Dict], List[D
|
|
|
129
127
|
method_doc = ast.get_docstring(item)
|
|
130
128
|
processed_method_doc = process_docstring(method_doc) if method_doc else None
|
|
131
129
|
|
|
132
|
-
if processed_method_doc:
|
|
130
|
+
if processed_method_doc: # 只有方法有文档才添加
|
|
133
131
|
# 获取函数签名
|
|
134
132
|
args = []
|
|
135
133
|
defaults = dict(zip([arg.arg for arg in item.args.args][-len(item.args.defaults):], item.args.defaults)) if item.args.defaults else {}
|
|
@@ -159,12 +157,14 @@ def parse_python_file(file_path: str) -> Tuple[Optional[str], List[Dict], List[D
|
|
|
159
157
|
bases = [ast.unparse(base) for base in node.bases] if node.bases else []
|
|
160
158
|
class_signature = f"class {node.name}({', '.join(bases)})" if bases else f"class {node.name}"
|
|
161
159
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
# 只有类有文档或者有方法时才添加类
|
|
161
|
+
if processed_class_doc or methods:
|
|
162
|
+
classes.append({
|
|
163
|
+
"name": node.name,
|
|
164
|
+
"signature": class_signature,
|
|
165
|
+
"doc": processed_class_doc,
|
|
166
|
+
"methods": methods
|
|
167
|
+
})
|
|
168
168
|
|
|
169
169
|
# 处理函数定义
|
|
170
170
|
elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
|
|
@@ -243,11 +243,13 @@ def generate_markdown(module_path: str, module_doc: Optional[str],
|
|
|
243
243
|
if classes:
|
|
244
244
|
content.append("## 类列表\n")
|
|
245
245
|
for cls in classes:
|
|
246
|
+
# 如果类没有文档,显示默认信息
|
|
247
|
+
class_doc = cls['doc'] if cls['doc'] else f"{cls['name']} 类提供相关功能。"
|
|
246
248
|
content.append(f"""### `{cls['signature']}`
|
|
247
249
|
|
|
248
|
-
{
|
|
250
|
+
{class_doc}
|
|
249
251
|
|
|
250
|
-
""")
|
|
252
|
+
""")
|
|
251
253
|
|
|
252
254
|
# 类方法
|
|
253
255
|
if cls["methods"]:
|
|
@@ -256,10 +258,10 @@ def generate_markdown(module_path: str, module_doc: Optional[str],
|
|
|
256
258
|
async_marker = "async " if method["is_async"] else ""
|
|
257
259
|
content.append(f"""##### {async_marker}`{method['signature']}`
|
|
258
260
|
|
|
259
|
-
{method['doc']}
|
|
261
|
+
{method['doc']}
|
|
260
262
|
|
|
261
|
-
---
|
|
262
|
-
""")
|
|
263
|
+
---
|
|
264
|
+
""")
|
|
263
265
|
|
|
264
266
|
# 文档尾部
|
|
265
267
|
content.append(f"<sub>文档最后更新于 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</sub>")
|
|
@@ -5,7 +5,7 @@ permissions:
|
|
|
5
5
|
|
|
6
6
|
on:
|
|
7
7
|
push:
|
|
8
|
-
branches: [main]
|
|
8
|
+
branches: [main, Pre-Release/v2]
|
|
9
9
|
|
|
10
10
|
jobs:
|
|
11
11
|
auto-tag-and-release:
|
|
@@ -96,18 +96,6 @@ jobs:
|
|
|
96
96
|
changelog="$changelog\n\n"
|
|
97
97
|
fi
|
|
98
98
|
|
|
99
|
-
# 贡献信息
|
|
100
|
-
changelog="${changelog}### 🧙♀️ 魔法贡献者\n\n"
|
|
101
|
-
while IFS= read -r contributor; do
|
|
102
|
-
escaped_contributor=$(echo "$contributor" | sed 's/>/\>/g' | sed 's/</\</g')
|
|
103
|
-
changelog="${changelog}- ${escaped_contributor}\n"
|
|
104
|
-
done <<< "$contributors"
|
|
105
|
-
|
|
106
|
-
changelog="${changelog}\n### 📜 魔法卷轴更新\n\n"
|
|
107
|
-
escaped_commit_msg=$(echo "$commit_msg" | sed 's/#/\\#/g')
|
|
108
|
-
changelog="${changelog}- 最新提交: $escaped_commit_msg (by $commit_author, $commit_short)\n"
|
|
109
|
-
changelog="${changelog}- 变更文件: ${{ steps.changed_files.outputs.files }}\n"
|
|
110
|
-
|
|
111
99
|
if ! git rev-parse "$tag_name" >/dev/null 2>&1; then
|
|
112
100
|
echo "🎀🎀 施加新的魔法印记..."
|
|
113
101
|
git tag "$tag_name"
|
|
@@ -126,4 +114,4 @@ jobs:
|
|
|
126
114
|
--prerelease=$is_dev
|
|
127
115
|
echo "✨ 已发布新的魔法版本 $tag_name"
|
|
128
116
|
fi
|
|
129
|
-
|
|
117
|
+
|
|
@@ -3,13 +3,103 @@
|
|
|
3
3
|
所有版本更新遵循 [语义化版本控制](https://semver.org/lang/zh-CN/) 规范。
|
|
4
4
|
|
|
5
5
|
> **如何阅读本日志**
|
|
6
|
-
>
|
|
6
|
+
> 每个版本分为 "新增"/"变更"/"修复"/"移除"/"废弃" 等部分。建议开发者在升级前先阅读对应版本的 Breaking Change 和修复内容。
|
|
7
7
|
|
|
8
8
|
> **贡献日志**
|
|
9
9
|
> 如需为新版本添加日志,请在对应版本号下补充内容,并注明日期和主要贡献者。
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
## 规则
|
|
14
|
+
|
|
15
|
+
### 必须包含的信息
|
|
16
|
+
1. **贡献者信息**:每项变更必须标明贡献者,格式为 `@Github用户名`
|
|
17
|
+
2. **变更类型**:明确标识变更类型(新增/变更/修复/移除/废弃等)
|
|
18
|
+
3. **日期信息**:版本发布日期采用 `YYYY/MM/DD` 格式
|
|
19
|
+
|
|
20
|
+
### 示例格式
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
## [version] - 2025/08/20
|
|
24
|
+
> 开发版本
|
|
25
|
+
|
|
26
|
+
### 新增
|
|
27
|
+
|
|
28
|
+
- By [贡献者](https://github.com/贡献者)
|
|
29
|
+
- `模块名` 模块新增功能描述:
|
|
30
|
+
- 具体功能点1
|
|
31
|
+
- 具体功能点2
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## [2.2.1] - 2025/08/19
|
|
37
|
+
|
|
38
|
+
> 正式发布
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## [2.2.1-dev.0] - 2025/08/18
|
|
43
|
+
|
|
44
|
+
### 新增
|
|
45
|
+
|
|
46
|
+
- @wsu2059q
|
|
47
|
+
- `Event.command` 模块新增交互式命令支持:
|
|
48
|
+
- 添加 `wait_reply` 方法,支持命令处理器等待用户回复并进行交互
|
|
49
|
+
- 支持设置提示消息、超时时间、验证函数和回调函数
|
|
50
|
+
- 提供优雅的多轮对话命令实现机制
|
|
51
|
+
- `Event` 模块增强事件处理器管理功能:
|
|
52
|
+
- 为所有事件子模块(command、message、notice、request、meta)每种装饰器添加对应的处理器注销方法
|
|
53
|
+
- 支持通过装饰器注册的事件处理器可以被取消注册
|
|
54
|
+
|
|
55
|
+
### 变更
|
|
56
|
+
- @wsu2059q
|
|
57
|
+
- 重构 `Event` 模块内部实现:
|
|
58
|
+
- 优化事件处理器的存储和查找机制,提高效率
|
|
59
|
+
- 遵循 ErisPulse 注释风格规范,完善所有事件处理模块的注释
|
|
60
|
+
|
|
61
|
+
### 修复
|
|
62
|
+
- @wsu2059q
|
|
63
|
+
- 修复命令处理器注销时未能清理相关配置的缺陷
|
|
64
|
+
- 修复 `wait_reply` 功能在并发情况下的潜在竞争条件问题
|
|
65
|
+
- 修复事件处理器重复注册导致事件被多次处理的问题:
|
|
66
|
+
- 优化 `BaseEventHandler` 类,确保每个事件类型只向适配器注册一次处理器
|
|
67
|
+
- 防止使用多个 `@message` 等装饰器时事件被重复触发多次的问题
|
|
68
|
+
- 提高事件处理效率,避免不必要的重复处理
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## [2.2.0] - 2025/08/18
|
|
73
|
+
|
|
74
|
+
> 正式发布
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## [2.2.0-dev.2] - 2025/08/18
|
|
79
|
+
|
|
80
|
+
### 新增
|
|
81
|
+
- 添加 `Event` 模块更多功能:
|
|
82
|
+
- 命令支持权限检查功能,可通过 `permission` 参数设置权限检查函数
|
|
83
|
+
- 命令支持隐藏功能,可通过 `hidden` 参数控制命令在帮助中是否显示
|
|
84
|
+
- 命令支持更灵活的别名配置,可通过 `aliases` 参数设置额外别名
|
|
85
|
+
- 命令帮助系统增强,支持显示隐藏命令选项
|
|
86
|
+
- 添加命令执行错误和权限拒绝的自动消息反馈机制
|
|
87
|
+
- `Event` 模块配置增强:
|
|
88
|
+
- 添加 `allow_space_prefix` 配置项,支持 "/ command" 格式的命令
|
|
89
|
+
|
|
90
|
+
### 变更
|
|
91
|
+
- 重构 `Event` 模块设计:
|
|
92
|
+
- 移除 `event_manager` 模块,避免与 `adapter` 模块功能重复
|
|
93
|
+
- 简化中间件系统,移除全局和局部中间件以避免复杂性
|
|
94
|
+
- 用户应通过 `adapter` 模块进行事件的发送和接收
|
|
95
|
+
- 优化 `Event` 模块注释和文档,遵循 ErisPulse 注释风格规范
|
|
96
|
+
|
|
97
|
+
### 修复
|
|
98
|
+
- 修复命令处理中的一些潜在错误处理问题
|
|
99
|
+
- 修复命令别名处理逻辑中的边界情况
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
13
103
|
## [2.2.0-dev.1] - 2025/08/17
|
|
14
104
|
|
|
15
105
|
### 新增
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# 项目贡献指南
|
|
2
|
+
|
|
3
|
+
## 分支管理规范
|
|
4
|
+
|
|
5
|
+
### 分支结构
|
|
6
|
+
- **main**: 主分支,存放稳定可发布的代码
|
|
7
|
+
- **Develop/v2**: 开发主分支,所有功能分支最终合并至此
|
|
8
|
+
- **Pre-Release/v2**: 预发布分支,用于版本发布前的测试
|
|
9
|
+
- **feature/***: 功能开发分支,按功能命名
|
|
10
|
+
- **Archive/v1**: 归档分支,存放旧版本代码
|
|
11
|
+
|
|
12
|
+
## 代码注释规范
|
|
13
|
+
|
|
14
|
+
### 模块级文档注释
|
|
15
|
+
```python
|
|
16
|
+
"""
|
|
17
|
+
[模块名称]
|
|
18
|
+
[模块功能描述]
|
|
19
|
+
|
|
20
|
+
{!--< tips >!--}
|
|
21
|
+
重要使用说明或注意事项
|
|
22
|
+
{!--< /tips >!--}
|
|
23
|
+
"""
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 方法注释
|
|
27
|
+
#### 基本格式
|
|
28
|
+
```python
|
|
29
|
+
def func(param1: type1, param2: type2) -> return_type:
|
|
30
|
+
"""
|
|
31
|
+
[功能描述]
|
|
32
|
+
|
|
33
|
+
:param param1: [类型1] [参数描述1]
|
|
34
|
+
:param param2: [类型2] [参数描述2]
|
|
35
|
+
:return: [返回类型] [返回描述]
|
|
36
|
+
"""
|
|
37
|
+
pass
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
#### 完整格式(适用于复杂方法)
|
|
41
|
+
```python
|
|
42
|
+
def complex_func(param1: type1, param2: type2 = None) -> Tuple[type1, type2]:
|
|
43
|
+
"""
|
|
44
|
+
[功能详细描述]
|
|
45
|
+
[可包含多行描述]
|
|
46
|
+
|
|
47
|
+
:param param1: [类型1] [参数描述1]
|
|
48
|
+
:param param2: [类型2] [可选参数描述2] (默认: None)
|
|
49
|
+
|
|
50
|
+
:return:
|
|
51
|
+
type1: [返回参数1描述]
|
|
52
|
+
type2: [返回参数2描述]
|
|
53
|
+
|
|
54
|
+
:raises ErrorType: [错误描述]
|
|
55
|
+
"""
|
|
56
|
+
pass
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 特殊标签
|
|
60
|
+
| 标签格式 | 作用 | 示例 |
|
|
61
|
+
|---------|------|------|
|
|
62
|
+
| `{!--< internal-use >!--}` | 标记为内部使用 | `{!--< internal-use >!--}` |
|
|
63
|
+
| `{!--< ignore >!--}` | 忽略此方法 | `{!--< ignore >!--}` |
|
|
64
|
+
| `{!--< deprecated >!--}` | 标记为过时方法 | `{!--< deprecated >!--} 请使用new_func()代替` |
|
|
65
|
+
| `{!--< experimental >!--}` | 标记为实验性功能 | `{!--< experimental >!--} 可能不稳定` |
|
|
66
|
+
| `{!--< tips >!--}...{!--< /tips >!--}` | 多行提示内容 | `{!--< tips >!--}\n重要提示内容\n{!--< /tips >!--}` |
|
|
67
|
+
|
|
68
|
+
## 贡献流程
|
|
69
|
+
|
|
70
|
+
1. **Fork仓库**
|
|
71
|
+
- 首先fork主仓库到您的个人账户
|
|
72
|
+
|
|
73
|
+
2. **创建个人分支**
|
|
74
|
+
- 从`Develop/v2`创建功能分支,命名规范:
|
|
75
|
+
- `feature/描述性名称` (如`feature/wsu2059q`)
|
|
76
|
+
|
|
77
|
+
3. **开发工作**
|
|
78
|
+
- 在功能分支上进行开发
|
|
79
|
+
- 保持提交信息清晰明确
|
|
80
|
+
- 按照注释规范添加文档注释
|
|
81
|
+
- 提交前确保已经在ChangeLog中添加描述
|
|
82
|
+
- 定期从`Develop/v2`拉取更新
|
|
83
|
+
|
|
84
|
+
4. **提交Pull Request**
|
|
85
|
+
- 开发完成后,向`Develop/v2`提交PR
|
|
86
|
+
- 在PR模板中勾选对应选项或添加详情信息
|
|
87
|
+
|
|
88
|
+
5. **代码审查**
|
|
89
|
+
- 确保代码符合注释规范
|
|
90
|
+
- 检查特殊标签使用是否正确
|
|
91
|
+
|
|
92
|
+
6. **合并到Develop/v2**
|
|
93
|
+
- 审查通过后,代码将被合并
|
|
94
|
+
|
|
95
|
+
7. **发布流程**
|
|
96
|
+
- `Develop/v2` → `Pre-Release/v2` 进行测试
|
|
97
|
+
- 测试通过后发布到`main`分支
|
|
98
|
+
|
|
99
|
+
## 注意事项
|
|
100
|
+
|
|
101
|
+
- 请勿直接向`main`或`Pre-Release/v2`分支提交代码
|
|
102
|
+
- 所有公开API方法必须包含完整注释
|
|
103
|
+
- 内部方法应添加`{!--< internal-use >!--}`标签
|
|
104
|
+
- 过时方法需标记并提供替代方案
|
|
105
|
+
- 如有疑问,请联系 `support@erisdev.com` 或 云湖群ID 635409929
|
|
106
|
+
|
|
107
|
+
感谢您的贡献!
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ErisPulse
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.1
|
|
4
4
|
Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
|
|
5
5
|
Author-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
|
|
6
6
|
License: MIT License
|
|
@@ -52,7 +52,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
52
52
|
Classifier: Programming Language :: Python :: 3.12
|
|
53
53
|
Classifier: Programming Language :: Python :: 3.13
|
|
54
54
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
55
|
-
Requires-Python: >=3.
|
|
55
|
+
Requires-Python: >=3.10
|
|
56
56
|
Requires-Dist: aiohttp
|
|
57
57
|
Requires-Dist: colorama
|
|
58
58
|
Requires-Dist: fastapi>=0.116.1
|
|
@@ -71,43 +71,31 @@ Description-Content-Type: text/markdown
|
|
|
71
71
|
|
|
72
72
|

|
|
73
73
|
|
|
74
|
-
[](https://pypi.org/project/ErisPulse/)
|
|
75
75
|
[](https://pypi.org/project/ErisPulse/)
|
|
76
|
+
[](https://socket.dev/pypi/package/ErisPulse)
|
|
76
77
|
|
|
77
|
-
##
|
|
78
|
+
## 文档资源
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
[
|
|
82
|
-
[
|
|
83
|
-
|
|
84
|
-
## 模块市场
|
|
85
|
-
|
|
86
|
-
[](https://www.erisdev.com/#market)
|
|
87
|
-
[](https://erispulse.pages.dev/#market)
|
|
88
|
-
[](https://erispulse.github.io/#market)
|
|
89
|
-
[](https://erispulse.netlify.app/#market)
|
|
90
|
-
|
|
91
|
-
---
|
|
80
|
+
| 平台 | 主站点 | 备用站点 |
|
|
81
|
+
|------|--------|---------|
|
|
82
|
+
| 文档 | [erisdev.com](https://www.erisdev.com/#docs) | [Cloudflare](https://erispulse.pages.dev/#docs) • [GitHub](https://erispulse.github.io/#docs) • [Netlify](https://erispulse.netlify.app/#docs) |
|
|
83
|
+
| 模块市场 | [erisdev.com](https://www.erisdev.com/#market) | [Cloudflare](https://erispulse.pages.dev/#market) • [GitHub](https://erispulse.github.io/#market) • [Netlify](https://erispulse.netlify.app/#market) |
|
|
92
84
|
|
|
93
85
|
## 核心特性
|
|
94
86
|
|
|
95
87
|
| 特性 | 描述 |
|
|
96
88
|
|:-----|:-----|
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
102
|
-
|
|
103
|
-
---
|
|
89
|
+
| 异步架构 | 完全基于 async/await 的异步设计 |
|
|
90
|
+
| 模块化系统 | 灵活的插件和模块管理 |
|
|
91
|
+
| 热重载 | 开发时自动重载,无需重启 |
|
|
92
|
+
| 错误管理 | 统一的错误处理和报告系统 |
|
|
93
|
+
| 配置管理 | 灵活的配置存储和访问 |
|
|
104
94
|
|
|
105
95
|
## 快速开始
|
|
106
96
|
|
|
107
97
|
### 一键安装脚本
|
|
108
98
|
|
|
109
|
-
我们提供了一键安装脚本,支持所有主流平台:
|
|
110
|
-
|
|
111
99
|
#### Windows (PowerShell):
|
|
112
100
|
|
|
113
101
|
```powershell
|
|
@@ -120,30 +108,30 @@ irm https://get.erisdev.com/install.ps1 -OutFile install.ps1; powershell -Execut
|
|
|
120
108
|
curl -sSL https://get.erisdev.com/install.sh | tee install.sh >/dev/null && chmod +x install.sh && ./install.sh
|
|
121
109
|
```
|
|
122
110
|
|
|
123
|
-
|
|
111
|
+
## 开发与测试
|
|
124
112
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
### 1. 克隆项目并进入目录
|
|
113
|
+
### 1. 克隆项目
|
|
128
114
|
|
|
129
115
|
```bash
|
|
130
116
|
git clone -b Develop/v2 https://github.com/ErisPulse/ErisPulse.git
|
|
131
117
|
cd ErisPulse
|
|
132
118
|
```
|
|
133
119
|
|
|
134
|
-
### 2.
|
|
120
|
+
### 2. 环境搭建
|
|
121
|
+
|
|
122
|
+
使用 uv 同步项目环境:
|
|
135
123
|
|
|
136
124
|
```bash
|
|
137
125
|
uv sync
|
|
138
126
|
|
|
139
|
-
#
|
|
140
|
-
source .venv/bin/activate
|
|
127
|
+
# 激活虚拟环境
|
|
128
|
+
source .venv/bin/activate # macOS/Linux
|
|
141
129
|
# Windows: .venv\Scripts\activate
|
|
142
130
|
```
|
|
143
131
|
|
|
144
|
-
|
|
132
|
+
说明: ErisPulse 使用 Python 3.13 开发,但兼容 Python 3.10+
|
|
145
133
|
|
|
146
|
-
### 3.
|
|
134
|
+
### 3. 安装依赖
|
|
147
135
|
|
|
148
136
|
```bash
|
|
149
137
|
uv pip install -e .
|
|
@@ -161,7 +149,7 @@ python -c "from ErisPulse import sdk; sdk.init()"
|
|
|
161
149
|
|
|
162
150
|
### 5. 运行测试
|
|
163
151
|
|
|
164
|
-
我们提供了一个交互式测试脚本,可以帮助您快速验证SDK
|
|
152
|
+
我们提供了一个交互式测试脚本,可以帮助您快速验证SDK功能(于开发中):
|
|
165
153
|
|
|
166
154
|
```bash
|
|
167
155
|
uv run devs/test.py
|
|
@@ -174,34 +162,25 @@ uv run devs/test.py
|
|
|
174
162
|
- 工具函数测试
|
|
175
163
|
- 适配器功能测试
|
|
176
164
|
|
|
177
|
-
### 6. 开发模式 (热重载)
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
epsdk run your_script.py --reload
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
165
|
## 贡献指南
|
|
186
166
|
|
|
187
167
|
我们欢迎各种形式的贡献,包括但不限于:
|
|
188
168
|
|
|
189
|
-
1.
|
|
169
|
+
1. 报告问题
|
|
190
170
|
在 [GitHub Issues](https://github.com/ErisPulse/ErisPulse/issues) 提交bug报告
|
|
191
171
|
|
|
192
|
-
2.
|
|
172
|
+
2. 功能请求
|
|
193
173
|
通过 [社区讨论](https://github.com/ErisPulse/ErisPulse/discussions) 提出新想法
|
|
194
174
|
|
|
195
|
-
3.
|
|
196
|
-
提交 Pull Request 前请阅读我们的 [代码风格](docs/StyleGuide/DocstringSpec.md)
|
|
175
|
+
3. 代码贡献
|
|
176
|
+
提交 Pull Request 前请阅读我们的 [代码风格](docs/StyleGuide/DocstringSpec.md) 以及 [贡献指南](CONTRIBUTING.md)
|
|
197
177
|
|
|
198
|
-
4.
|
|
178
|
+
4. 文档改进
|
|
199
179
|
帮助完善文档和示例代码
|
|
200
180
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
[加入社区讨论 →](https://github.com/ErisPulse/ErisPulse/discussions)
|
|
181
|
+
[加入社区讨论](https://github.com/ErisPulse/ErisPulse/discussions)
|
|
204
182
|
|
|
205
183
|
---
|
|
206
184
|
|
|
207
185
|
[](https://starchart.cc/ErisPulse/ErisPulse)
|
|
186
|
+
|