mopr 0.0.69.dev0__tar.gz → 0.0.71.dev10__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 (207) hide show
  1. mopr-0.0.71.dev10/.gitee/ISSUE_TEMPLATE/config.yml +8 -0
  2. mopr-0.0.71.dev10/.gitee/ISSUE_TEMPLATE/proposal.yml +92 -0
  3. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-windows/settings.json +2 -1
  4. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/AGENTS.md +39 -3
  5. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/BUILDING.md +34 -14
  6. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/CHANGELOG.md +456 -1
  7. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/CONTRIBUTING.md +22 -2
  8. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/MANIFEST.in +4 -0
  9. {mopr-0.0.69.dev0/mopr.egg-info → mopr-0.0.71.dev10}/PKG-INFO +3 -2
  10. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/README.md +2 -1
  11. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/THIRD_PARTY_NOTICES.md +1 -1
  12. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/__init__.py +52 -4
  13. mopr-0.0.71.dev10/base/crc32.md +116 -0
  14. mopr-0.0.71.dev10/base/crc32.py +46 -0
  15. mopr-0.0.71.dev10/base/crc32_test.py +50 -0
  16. mopr-0.0.71.dev10/base/cron.md +338 -0
  17. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/cron.py +114 -7
  18. mopr-0.0.71.dev10/base/cron_test.py +274 -0
  19. mopr-0.0.71.dev10/base/language.md +172 -0
  20. mopr-0.0.71.dev10/base/language.py +201 -0
  21. mopr-0.0.71.dev10/base/language_test.py +142 -0
  22. mopr-0.0.71.dev10/base/region.md +166 -0
  23. mopr-0.0.71.dev10/base/region.py +129 -0
  24. mopr-0.0.71.dev10/base/region_test.py +112 -0
  25. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/strings.md +10 -10
  26. mopr-0.0.71.dev10/base/time.md +264 -0
  27. mopr-0.0.71.dev10/base/time.py +519 -0
  28. mopr-0.0.71.dev10/base/time_test.py +352 -0
  29. mopr-0.0.71.dev10/benchmark/README.md +65 -0
  30. mopr-0.0.71.dev10/benchmark/micro/README.md +140 -0
  31. mopr-0.0.71.dev10/benchmark/micro/crc32_macos_arm64.md +248 -0
  32. mopr-0.0.71.dev10/benchmark/micro/ringbuffer_macos_arm64.md +211 -0
  33. mopr-0.0.71.dev10/benchmark/micro/ringbuffer_windows_amd64.md +146 -0
  34. mopr-0.0.71.dev10/benchmark/micro/wal_macos_arm64.md +359 -0
  35. mopr-0.0.71.dev10/benchmark/micro/wal_windows_amd64.md +546 -0
  36. mopr-0.0.71.dev10/finance/exchange/README.md +202 -0
  37. mopr-0.0.71.dev10/finance/exchange/__init__.py +46 -0
  38. mopr-0.0.71.dev10/finance/exchange/authority.py +178 -0
  39. mopr-0.0.71.dev10/finance/exchange/exchange.py +447 -0
  40. mopr-0.0.71.dev10/finance/exchange/institution.py +216 -0
  41. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/README.md +90 -44
  42. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/__init__.py +35 -8
  43. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/allratestoday.py +1 -1
  44. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/bcd.py +38 -30
  45. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/bog.py +47 -41
  46. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/cfets.py +64 -64
  47. mopr-0.0.71.dev10/finance/forex/ecb.py +693 -0
  48. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/fed.py +54 -52
  49. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/forex.py +441 -140
  50. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/hkma.py +49 -43
  51. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/official_source.py +2 -2
  52. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/xof.py +42 -32
  53. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10/mopr.egg-info}/PKG-INFO +3 -2
  54. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/mopr.egg-info/SOURCES.txt +30 -9
  55. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/mopr.egg-info/entry_points.txt +1 -1
  56. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/mopr.egg-info/scm_file_list.json +49 -60
  57. mopr-0.0.71.dev10/mopr.egg-info/scm_version.json +8 -0
  58. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/pyproject.toml +1 -1
  59. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/python/_version.py +3 -3
  60. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/ringbuffer.md +11 -7
  61. mopr-0.0.71.dev10/storage/__init__.py +22 -0
  62. mopr-0.0.71.dev10/storage/wal.md +360 -0
  63. mopr-0.0.71.dev10/storage/wal.py +1099 -0
  64. mopr-0.0.71.dev10/storage/wal_test.py +916 -0
  65. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/__init__.py +1 -1
  66. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/handlers/java.py +6 -6
  67. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/__init__.py +6 -5
  68. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/cli.py +2 -2
  69. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/core.py +6 -9
  70. mopr-0.0.71.dev10/tools/license_header/handlers/__init__.py +83 -0
  71. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/handlers/base.py +17 -4
  72. mopr-0.0.71.dev10/tools/license_header/handlers/css.py +50 -0
  73. mopr-0.0.71.dev10/tools/license_header/handlers/html.py +82 -0
  74. mopr-0.0.71.dev10/tools/license_header/handlers/javascript.py +22 -0
  75. mopr-0.0.71.dev10/tools/license_header/handlers/typescript.py +23 -0
  76. mopr-0.0.71.dev10/tools/license_header/handlers/vue.py +29 -0
  77. mopr-0.0.71.dev10/tools/run_module.py +354 -0
  78. mopr-0.0.69.dev0/base/cron.md +0 -255
  79. mopr-0.0.69.dev0/base/region.md +0 -107
  80. mopr-0.0.69.dev0/base/region.py +0 -62
  81. mopr-0.0.69.dev0/base/time.py +0 -143
  82. mopr-0.0.69.dev0/benchmark/README.md +0 -36
  83. mopr-0.0.69.dev0/distributed/id/FileStateStore.java +0 -148
  84. mopr-0.0.69.dev0/distributed/id/Generator.java +0 -49
  85. mopr-0.0.69.dev0/distributed/id/HLC.java +0 -158
  86. mopr-0.0.69.dev0/distributed/id/Id.java +0 -81
  87. mopr-0.0.69.dev0/distributed/id/Option.java +0 -60
  88. mopr-0.0.69.dev0/distributed/id/PersistentState.java +0 -38
  89. mopr-0.0.69.dev0/distributed/id/StateStore.java +0 -13
  90. mopr-0.0.69.dev0/finance/exchange/README.md +0 -102
  91. mopr-0.0.69.dev0/finance/exchange/__init__.py +0 -26
  92. mopr-0.0.69.dev0/finance/exchange/exchange.py +0 -230
  93. mopr-0.0.69.dev0/mopr.egg-info/scm_version.json +0 -8
  94. mopr-0.0.69.dev0/quant1x.png +0 -0
  95. mopr-0.0.69.dev0/storage/__init__.py +0 -11
  96. mopr-0.0.69.dev0/tools/license_header/handlers/__init__.py +0 -55
  97. mopr-0.0.69.dev0/tools/run_module.py +0 -139
  98. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.clang-format +0 -0
  99. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.clang-tidy +0 -0
  100. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.clangd +0 -0
  101. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.editorconfig +0 -0
  102. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.gitattributes +0 -0
  103. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.githooks/commit-msg +0 -0
  104. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.gitignore +0 -0
  105. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-default/settings.json +0 -0
  106. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-default/tasks.json +0 -0
  107. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-macos/settings.json +0 -0
  108. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-macos/tasks.json +0 -0
  109. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-windows/launch.json +0 -0
  110. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/.vscode-windows/tasks.json +0 -0
  111. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/LICENSE +0 -0
  112. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/dataclass_utils.py +0 -0
  113. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/environment.py +0 -0
  114. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/filesystem.py +0 -0
  115. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/mmap.md +0 -0
  116. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/mmap.py +0 -0
  117. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/mmap_test.py +0 -0
  118. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/strings.py +0 -0
  119. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/timestamp.md +0 -0
  120. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/timestamp.py +0 -0
  121. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/base/types.py +0 -0
  122. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/benchmark/macro/README.md +0 -0
  123. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/benchmark/regression/README.md +0 -0
  124. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/benchmark/stability/README.md +0 -0
  125. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/__init__.py +0 -0
  126. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/README.md +0 -0
  127. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/__init__.py +0 -0
  128. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/generator.py +0 -0
  129. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/hlc.py +0 -0
  130. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/id.py +0 -0
  131. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/option.py +0 -0
  132. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/queue.py +0 -0
  133. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/state_store.py +0 -0
  134. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/distributed/id/tests.py +0 -0
  135. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/README.md +0 -0
  136. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/__init__.py +0 -0
  137. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/charsets.py +0 -0
  138. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/csv.md +0 -0
  139. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/csv.py +0 -0
  140. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/json.md +0 -0
  141. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/yaml.md +0 -0
  142. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/encoding/yaml.py +0 -0
  143. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/__init__.py +0 -0
  144. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/exchange/data/ISO10383_MIC.csv +0 -0
  145. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/exchange/data/mic_codes.txt +0 -0
  146. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/data/cfets_cny_1994_2005.csv +0 -0
  147. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/exchange_rate_api.py +0 -0
  148. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/finance/forex/yahoo.py +0 -0
  149. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/log/__init__.py +0 -0
  150. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/log/core.py +0 -0
  151. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/machine/__init__.py +0 -0
  152. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/machine/id.py +0 -0
  153. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/mopr.egg-info/dependency_links.txt +0 -0
  154. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/mopr.egg-info/requires.txt +0 -0
  155. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/mopr.egg-info/top_level.txt +0 -0
  156. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/python/__init__.py +0 -0
  157. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/__init__.py +0 -0
  158. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/once.md +0 -0
  159. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/once.py +0 -0
  160. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/once_test.py +0 -0
  161. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/ringbuffer.py +0 -0
  162. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/ringbuffer_test.py +0 -0
  163. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/scheduler.md +0 -0
  164. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/runtime/scheduler.py +0 -0
  165. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/README.md +0 -0
  166. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/__init__.py +0 -0
  167. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/audit/README.md +0 -0
  168. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/README.md +0 -0
  169. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/__init__.py +0 -0
  170. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/authorize.py +0 -0
  171. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/catalog.py +0 -0
  172. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/credential.py +0 -0
  173. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/credential_test.py +0 -0
  174. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/errors.py +0 -0
  175. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/model.py +0 -0
  176. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/principal.py +0 -0
  177. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/rbac_test.py +0 -0
  178. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/session.py +0 -0
  179. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/session_test.py +0 -0
  180. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/spi.py +0 -0
  181. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/token.py +0 -0
  182. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/auth/token_test.py +0 -0
  183. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/security/compliance/README.md +0 -0
  184. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/setup.cfg +0 -0
  185. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/spec/api.md +0 -0
  186. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/spec/behavior.md +0 -0
  187. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/storage/storage.md +0 -0
  188. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/storage/storage.py +0 -0
  189. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/__main__.py +0 -0
  190. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/__init__.py +0 -0
  191. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/__main__.py +0 -0
  192. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/cli.py +0 -0
  193. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/handlers/__init__.py +0 -0
  194. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/handlers/cpp.py +0 -0
  195. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/handlers/go.py +0 -0
  196. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/handlers/python.py +0 -0
  197. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/handlers/rust.py +0 -0
  198. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/notices.py +0 -0
  199. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/report.py +0 -0
  200. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_audit/todo.py +0 -0
  201. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/__main__.py +0 -0
  202. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/handlers/cpp.py +0 -0
  203. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/handlers/go.py +0 -0
  204. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/handlers/java.py +0 -0
  205. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/handlers/python.py +0 -0
  206. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/handlers/rust.py +0 -0
  207. {mopr-0.0.69.dev0 → mopr-0.0.71.dev10}/tools/license_header/project_meta.py +0 -0
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: 提案流程与判定阈值(docs/proposals/README.md)
4
+ url: https://gitee.com/quant1x/mopr/blob/master/docs/proposals/README.md
5
+ about: 什么该走提案、编号与状态机、公示期与裁决规则
6
+ - name: 协作规范(CONTRIBUTING.md)
7
+ url: https://gitee.com/quant1x/mopr/blob/master/CONTRIBUTING.md
8
+ about: 命名与数据契约、文档与 AI 协同、Spec 驱动工作流、提交信息规范
@@ -0,0 +1,92 @@
1
+ name: 提案(RFC)
2
+ description: 提出跨语言语义 / 契约变更的提案(判定阈值与流程见 docs/proposals/README.md)
3
+ title: "提案:"
4
+ labels: ["proposal"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ 提交前请先看 [docs/proposals/README.md](https://gitee.com/quant1x/mopr/blob/master/docs/proposals/README.md) 的判定阈值:**跨语言语义 / 契约变更**才走提案,缺陷修复、单语言重构、纯文档改动请直接提 PR。
10
+ 本 Issue 只收摘要,完整设计落在 `docs/proposals/<本 Issue 号>-<kebab-title>.md`(用 [0000-template.md](https://gitee.com/quant1x/mopr/blob/master/docs/proposals/0000-template.md))。
11
+ - type: textarea
12
+ id: summary
13
+ attributes:
14
+ label: 摘要
15
+ description: 一句话说清要改什么、为什么现在提
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: motivation
20
+ attributes:
21
+ label: 动机与现状落差
22
+ description: 现状如何、落差如何被感知、不改的代价(方案另在提案文件里展开)
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: decisions
27
+ attributes:
28
+ label: 待决策项
29
+ description: 需要在提案中定案的开放问题,一条一行;未定案不得开工
30
+ placeholder: |
31
+ - tzdata 来源
32
+ - tzdata 缺失时的降级语义(报错 / 退回静态值)
33
+ validations:
34
+ required: true
35
+ - type: dropdown
36
+ id: kind
37
+ attributes:
38
+ label: 变更类型
39
+ options:
40
+ - 跨语言语义 / 接口变更
41
+ - 契约或数据字段命名变更
42
+ - 引入外部依赖 / 改变模块依赖现状
43
+ - 标杆实现替换
44
+ - 其它(在摘要中说明)
45
+ validations:
46
+ required: true
47
+ - type: input
48
+ id: languages
49
+ attributes:
50
+ label: 影响语言
51
+ description: 按语义顺序用半角逗号分隔,如 python,c++,rust,go
52
+ placeholder: python,c++,rust,go
53
+ validations:
54
+ required: true
55
+ - type: textarea
56
+ id: matrix
57
+ attributes:
58
+ label: 跨语言落地矩阵(摘要)
59
+ description: 逐语言写新增 / 变更符号与依赖变化;完整表落在提案文件第 6 节
60
+ placeholder: |
61
+ - Python(spec):
62
+ - C++(生产):
63
+ - Rust(扩展):
64
+ - Go(扩展):
65
+ validations:
66
+ required: true
67
+ - type: input
68
+ id: modules
69
+ attributes:
70
+ label: 关联模块与文档
71
+ placeholder: base/region(base/region.md §8.1)
72
+ validations:
73
+ required: true
74
+ - type: input
75
+ id: doc
76
+ attributes:
77
+ label: 提案文档路径
78
+ description: 取到本 Issue 号后改名并填此路径(编号即本 Issue 号)
79
+ placeholder: docs/proposals/<本 Issue 号>-xxx.md
80
+ validations:
81
+ required: false
82
+ - type: checkboxes
83
+ id: precheck
84
+ attributes:
85
+ label: 提交前自检
86
+ options:
87
+ - label: 已确认不属于"直接提 PR"的情形(单语言重构 / 缺陷修复 / 纯文档 / 单模块无争议新增)
88
+ required: true
89
+ - label: 已查看 docs/proposals/README.md §8 的现存提案清单,无重复提案
90
+ required: true
91
+ - label: 已知悉公示期为 7 天,且"无异议不等于采纳"
92
+ required: true
@@ -6,5 +6,6 @@
6
6
  "args": ["-NoExit", "-Command", "chcp 65001 > $null"]
7
7
  }
8
8
  },
9
- "terminal.integrated.defaultProfile.windows": "PowerShell"
9
+ "terminal.integrated.defaultProfile.windows": "PowerShell",
10
+ "python-envs.defaultEnvManager": "ms-python.python:pyenv"
10
11
  }
@@ -10,7 +10,7 @@ mopr 是单仓多语言库(monolibrary),同一语义将来可能有多种
10
10
  | --- | --- | --- |
11
11
  | Python | 3.12+ | 3.12.x |
12
12
  | C++ | C++20 | GCC 13+ / Clang 17+ / MSVC 14.3+ |
13
- | Rust | 1.98.0+ | 2024 edition |
13
+ | Rust | 1.98.1+ | 2024 edition |
14
14
  | Go | 1.27+ | 1.27.x |
15
15
  | Java | 8+ | `pom.xml` 的 `java.version`(JDK 8 及以上) |
16
16
 
@@ -30,6 +30,7 @@ mopr 同一语义的多语言实现遵循固定的**角色与演进顺序**,
30
30
 
31
31
  - 文档、注释与 API 对照表描述语言时,遵循 `python → c++ → rust → go` 的演进顺序;**不得先入为主地以 C++ 为全部语言的语义源头**(反例:文档开头写"以 C++ 为基准 / 参考实现")。语义判断以 Python(spec)为准绳。
32
32
  - 跨语言差异处理先从 Python(spec)侧定案,再推广至 C++(生产)与 Rust/Go(扩展);若 Python 缺少某能力而其他语言已有,应先补 Python spec。
33
+ - 同名语义的**命名与定名顺序**遵循 [「C++ 命名空间与头文件宏约定」](#c-命名空间与头文件宏约定)中的 snake_case 优先条款:语义名以 Python 为准,能蛇形的语言一律蛇形,Go / Java 保留本语言字形并在模块文档登记对应关系。
33
34
  - 语言最低版本表(上文)与 README.md「语言与版本要求」不因角色调整而改变。
34
35
 
35
36
  ## 文件命名与物理命名空间约定
@@ -62,6 +63,24 @@ mopr 同一语义的多语言实现遵循固定的**角色与演进顺序**,
62
63
  - `.cpp`、`tests/`、`benchmark/` 等不随安装分发的文件可用仓库根相对路径(构建期由 `$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>` 提供 include 根)。
63
64
  - 使用方包含安装后的头文件写 `<mopr/<模块>/<头文件>.h>`(如 `<mopr/runtime/once.h>`)。
64
65
 
66
+ ## C++ 字符串处理复用约定
67
+
68
+ - **写任何处理 `std::string` / `char` 的函数前,先查 `base/strings.h` 是否已有实现**;已有则一律复用,禁止在调用方(含各模块头文件内部)另写一份等价实现。
69
+ - 常用对照(同目录头文件写 `#include "strings.h"`,其他目录写相对路径):
70
+
71
+ | 需求 | 复用对象 |
72
+ | --- | --- |
73
+ | 切分(字符/子串分隔符) | `strings::split(str, delimiter, ignoreEmpty)`(token 会自动 `trim`) |
74
+ | 去首尾空白 / 去引号 | `strings::trim`、`strings::trim_view`、`strings::remove_quotes` |
75
+ | 大小写转换 | `strings::to_upper` / `strings::to_lower`(`std::string` 与 `std::string_view`)、`strings::to_upper(char)` / `to_lower(char)` |
76
+ | 全部替换 | `strings::replace_all` |
77
+ | 字符串 → 数值(要求整串消费) | `strings::try_parse<T>(str, out)`;允许失败取默认值时用 `strings::from_string<T>` |
78
+ | 数值 → 字符串 | `strings::to_string(value)` |
79
+ | 拼接 | `strings::join` |
80
+
81
+ - 只有 `strings.h` 确实没有对应能力时(如位串渲染、base64 等编解码)才在本地实现,并在注释中说明为何不复用。
82
+ - 复用 `strings.cpp` 中定义的函数(`split` / `replace_all` / `join` / `to_string` 重载等)会引入对 mopr 库的链接依赖,同一库内的头文件可接受(`encoding/csv.h` 即此用法);若某头文件必须保持「仅头文件、零链接依赖」,则改用 `strings.h` 中 `inline` 的实现。
83
+
65
84
  ## C++ 命名空间与头文件宏约定
66
85
 
67
86
  - **命名空间**:以项目名 `mopr` 为根,**仓库根路径下的子目录为第二级**,多级目录依次下探:
@@ -73,16 +92,33 @@ mopr 同一语义的多语言实现遵循固定的**角色与演进顺序**,
73
92
  - `encoding/csv.h` → `MOPR_ENCODING_CSV_H`;`encoding/charsets.h` → `MOPR_ENCODING_CHARSETS_H`;
74
93
  - `distributed/id/hlc.h` → `MOPR_DISTRIBUTED_ID_HLC_H`;`base/strings.h` → `MOPR_BASE_STRINGS_H`。
75
94
  - 守卫宏与 `#pragma once` 并存;`#endif` 行以注释回写宏名(如 `#endif // MOPR_ENCODING_CSV_H`)。
95
+ - **平台宏一律走 `base/feature_detection.h`**:C++ 侧**禁止**裸写 `_WIN32` / `__linux__` / `__APPLE__` / `_MSC_VER` / `__clang__` / `__aarch64__` / `_M_X64` 等编译器与平台原生宏,改用该头带 `MOPR_` 前缀的检测宏(`MOPR_OS_IS_WINDOWS` / `MOPR_OS_IS_LINUX` / `MOPR_OS_IS_APPLE` / `MOPR_COMPILER_IS_MSVC` / `MOPR_COMPILER_IS_CLANG` / `MOPR_COMPILER_IS_GNU_LIKE` / `MOPR_CPU_IS_X86_64` / `MOPR_CPU_IS_ARM_64` / `MOPR_ENDIAN_LITTLE` 等)。`base/feature_detection.h` 是全仓**唯一**允许裸写原生宏的文件(它必须,否则无从检测);编译期能定的放这里,运行期收敛(函数包装)放 `base/platform.h`。理由:无前缀的 `OS_IS_*` / `TARGET_*` / `FORCE_INLINE` 与 Boost、Qt 等第三方存在撞名风险,且未定义宏在 `#if` 中静默求值为 0——拼错不报错、只会静默走错分支。
96
+ - 替换既有裸宏须逐处确认语义等价,**不可机械替换**:`defined(__GNUC__) && !defined(_MSC_VER)`(GNU 扩展属性是否可用)**不能**写成 `MOPR_COMPILER_IS_GCC`(会漏掉 clang,且在 clang-cl 下语义相反),应写 `MOPR_COMPILER_IS_GNU_LIKE`;只判 `MOPR_CPU_IS_ARM_64` 而漏掉编译器判断,会让 MSVC ARM64 误入 GNU 内联汇编分支。
76
97
  - 新增公共头文件一律遵循上述规则。既有不合规处按模块逐个收敛(`runtime::*` → `mopr::runtime::*`、`base/filesystem.h` 的 `filesystem` → `mopr::base::filesystem`、`base/except.h` 的 `quant1x` → `mopr::base`、`base/mmap.h` 的全局 `file_mmap` / `mmap_open` / `mmap_flush` / `mmap_close` → `mopr::base` 内的 `MmapHandle` / `mmap_open` / `mmap_flush` / `mmap_close`),不做一次性大范围改名。
77
98
  - **公开符号命名跨语言一致**(同一语义在各语言同名,便于跨语言对照与回溯):
78
- - **公开函数名一致**:Python 与 C++ 使用同一函数名(如 Python `mmap_open` ↔ C++ `mmap_open`),不因语言差异改名;Rust / Go 沿用本语言惯例的,须在模块文档的 API 对照表中给出对应关系。
99
+ - **snake_case 优先(铁律)**:只要目标语言允许小写蛇形,公开函数名就**必须**用 snake_case,**不得**用驼峰(lowerCamel / PascalCase)。此处"跨语言一致"指**语义名一致**,不是字形一致——**禁止**拿"要与某语言同名"当作 Python / C++ 保留驼峰的理由:
100
+ - Python(spec)与 C++(生产实现)一律 snake_case:`get_quarter_by_date` / `get_quarter_day` / `mmap_open`;
101
+ - Rust 同样 snake_case;
102
+ - Go / Java 受语言与生态规范限制无法小写蛇形(Go 导出标识符须大写开头,Java 方法为 lowerCamel),保留 PascalCase / lowerCamel,但语义名须与 Python / C++ **逐词对应**,并在模块文档的 API 对照表中登记对应关系(Go `GetQuarterByDate` ↔ Python / C++ `get_quarter_by_date`、Go `GetQuarterDay` ↔ `get_quarter_day`);
103
+ - 反例(禁止):C++ 写 `GetQuarterByDate` 并声称"与 Go 同名";正确写法是 `get_quarter_by_date`,与 Go 的 `GetQuarterByDate` 语义对应。
104
+ - **语义名以 Python(spec)为准**:新语义先在 Python 定名,C++ / Rust / Go / Java 沿用其语义名,不在后续语言里另起名字;若某能力只在非 spec 语言存在,先补 Python spec 再推广(见「语言角色与演进顺序」)。
105
+ - **类型名不受此条约束**:类名 / 句柄类型 / RAII 类沿用各语言惯例(PascalCase,如 `MmapHandle` / `MappedMemory`),跨语言同名,见下文条款。
79
106
  - **函数名带模块前缀时不套同名命名空间**:函数名已含模块前缀(如 `mmap_`)时,C++ 侧不再套一层同名命名空间——`mmap_open` 直接位于 `mopr::base`,而非 `mopr::base::mmap::mmap_open`(同风格参考 `base/region.h` 的 `region_currency` / `region_timezone`)。
80
107
  - **公开结构体 typedef 统一 `mopr_` 前缀**:结构体标签与 typedef 用同名风格,如 `typedef struct mopr_xxx mopr_xxx_t;`;但跨语言共享的**句柄类型除外**——句柄跨语言同名,C++ 侧直接定义 `struct MmapHandle`(与 Python / Rust / Go 的 `MmapHandle` 一字不差),不套 `mopr_xxx_t` 风格。
81
108
  - **句柄类型不得命名 `File`**:句柄承载的是映射而不是文件(文件句柄只是其内部成员之一),`File` 会与 `os.File` / 文件流混淆;跨语言统一用 `MmapHandle`(C++ 为 `struct MmapHandle`)。
82
109
  - **句柄操作遵循语言惯例**:Python / Rust / Go 用句柄方法(`flush` / `close`、`Flush` / `Close`),C++ 句柄是 POD,用同名自由函数(`mmap_flush` / `mmap_close`)与之一一对应。
83
110
  - **同一语义可同时提供「公开 API + RAII 类」两层**:第一层为跨平台公开 API(如 `mmap_open` / `mmap_flush` / `mmap_close` + 句柄),资源由调用方显式管理;第二层为跨语言同名的 RAII 类(如 `MappedMemory`:`MappedMemory.open` 打开,析构 / `Drop` / `with` / `defer` 自动释放)。两层共用同一实现、语义必须一致,区别仅在释放时机;模块文档须给出两层对照表(示例见 `base/mmap.md`「1. 分层与命名」)。
84
111
  - **RAII 类名不得与模块名重复**:类名不叫 `mmap` / `Mmap`(与模块名、包名重复,且易被误读为句柄),统一用其语义名(如 `MappedMemory`),并跨语言同名;句柄另用 `XxxHandle`(如 `MmapHandle`,四语言同名,C++ 亦为 `struct MmapHandle`)。
85
- - 已知遗留(需按模块逐一评估,勿批量替换):`base/common.h` 的全局 typedef 与常量(`i8` / `u8` / … 为标量别名、非结构体 typedef,不适用 `mopr_` 前缀约定),`base/format.h` 的全局探测模板与 `std::vector` 的 `operator<<`(依赖 ADL / 非限定查找,移入命名空间会导致使用方找不到),`tests/` 下 `*_test_types` 等测试辅助命名空间。
112
+ - 已知遗留(需按模块逐一评估,勿批量替换):`base/types.h` 的跨语言标量别名(`i8` / `u8` / … 为逐字符对齐 Rust 原生整型名而保留,是标量别名、非结构体 typedef,不适用 `mopr_` 前缀约定;由原 `base/common.h` 的全局 typedef 收敛而来,仅用于有 `.rs` 对照实现的模块,勿把现有 `int64_t` 批量改写为 `i64`),`base/format.h` 的全局探测模板与 `std::vector` 的 `operator<<`(依赖 ADL / 非限定查找,移入命名空间会导致使用方找不到),`tests/` 下 `*_test_types` 等测试辅助命名空间。
113
+
114
+ ## 测试规范
115
+
116
+ 系统级/底层组件(持久化、状态机、并发控制、底层资源管理等)的测试须遵循 [docs/system-component-testing-spec.md](docs/system-component-testing-spec.md):
117
+
118
+ - 覆盖六个维度:API 契约与边界防御、状态机生命周期、崩溃一致性与故障注入(**必选**)、不变量与属性测试、并发竞态、性能资源;
119
+ - 测试以**不变量 (Invariants)** 为准绳,防御性优先于验证性,重点验证"失败时是否保持状态一致";
120
+ - 崩溃模拟必须用**进程级终止**(`os._exit` / `abort` / `kill -9`),不得用语言层异常或优雅退出替代;
121
+ - 每个用例环境绝对隔离(独立临时目录/端口/内存空间),不依赖执行顺序。
86
122
 
87
123
  ## git 提交规范
88
124
 
@@ -10,7 +10,7 @@ mopr 是单仓多语言库(monolibrary),同一语义提供 Python、C++、
10
10
  | C++ | 仓库根 `main.cpp`,`base/`、`runtime/`、`distributed/id/` 的 `*.cpp/*.h` | Conan 2 + CMake(当前构建主线) |
11
11
  | Rust | 仓库根 `Cargo.toml` / `lib.rs` / `main.rs`,`runtime/`、`distributed/` 的 `*.rs` | Cargo |
12
12
  | Go | `base/`、`runtime/`、`distributed/` 的 `*.go` | `go build ./...`(模块内多包,无独立 main) |
13
- | Java | `distributed/id/*.java`,测试/基准 `tests/runtime/*.java` | Maven(`mvn test` 运行 JUnit 5 测试/基准)/ javac |
13
+ | Java | `distributed/id/*.java`,基准 `benchmark/micro/*.java` | Maven(`mvn test` 单元测试;`mvn -Pbench test` 运行 JUnit 5 基准)/ javac |
14
14
 
15
15
  ## 1. Python 构建
16
16
 
@@ -32,7 +32,7 @@ python -m mopr.log.core # 模块方式运行 (打印日
32
32
 
33
33
  也可不切换目录,显式挂载 `PYTHONPATH`:`$env:PYTHONPATH = "<仓库根>"; python -m mopr.log.core`。已 `pip install .` 的环境无此目录要求,常规导入即可。
34
34
 
35
- 内置工具 `tools/`(`tools/license_header`、`tools/license_audit`)自洽、无跨子包相对导入,仓库根可直接顶层运行;等价于安装后的 `mopr.tools.*`(console script 为 `license-header`):
35
+ 内置工具 `tools/`(`tools/license_header`、`tools/license_audit`)自洽、无跨子包相对导入,仓库根可直接顶层运行;等价于安装后的 `mopr.tools.*`(console script 为 `mopr-license-header`):
36
36
 
37
37
  ```powershell
38
38
  python -m tools.license_header # 仓库根 (源码形态)
@@ -490,7 +490,7 @@ use mopr::distributed;
490
490
 
491
491
  #### 3.5.2 安装
492
492
 
493
- 前置:Rust 工具链可用(`cargo --version` 不低于本仓基线 1.98.0+,见 AGENTS.md)。三个外部工具都是 cargo 子命令插件,统一经 `cargo install` 编译安装到 `%USERPROFILE%\.cargo\bin`(rustup 通常已将该目录写入 PATH,新装后重开终端生效):
493
+ 前置:Rust 工具链可用(`cargo --version` 不低于本仓基线 1.98.1+,见 AGENTS.md)。三个外部工具都是 cargo 子命令插件,统一经 `cargo install` 编译安装到 `%USERPROFILE%\.cargo\bin`(rustup 通常已将该目录写入 PATH,新装后重开终端生效):
494
494
 
495
495
  ```powershell
496
496
  cargo install --locked cargo-deny
@@ -561,7 +561,7 @@ cargo cyclonedx -f json --spec-version 1.5 # 指定规范版本(支持 1.3 /
561
561
 
562
562
  ## 4. Java 构建
563
563
 
564
- Java 实现位于 `distributed/id/*.java`,测试/基准代码位于根目录 `tests/runtime/*.java`,与其它语言实现相互独立:不混入 Rust crate,也不参与 C++ 的 CMake/Conan 构建。
564
+ Java 实现位于 `distributed/id/*.java`,基准代码位于基准套件目录 `benchmark/micro/*.java`(见 `benchmark/README.md`),与其它语言实现相互独立:不混入 Rust crate,也不参与 C++ 的 CMake/Conan 构建。单元测试与基准的编译/运行方式见 4.3。
565
565
 
566
566
  ### 4.1 编译
567
567
 
@@ -585,20 +585,40 @@ javac distributed\id\*.java
585
585
  java -cp build\java\classes io.github.quant1x.mopr.distributed.id.Generator
586
586
  ```
587
587
 
588
- ### 4.3 测试与基准(JUnit 5)
588
+ ### 4.3 单元测试与基准
589
589
 
590
- 根目录 `tests/runtime/LMAXDisruptorBenchmark.java` 是 Java 侧吞吐基准(LMAX
591
- Disruptor 环形缓冲对照,`@Test` 方法通过 JUnit 5 执行),声明于
592
- `pom.xml <dependencies>` 的 dev/test 依赖为 `junit-jupiter` 5.8.2 与
593
- `com.lmax:disruptor` 3.4.4(仅测试/基准使用,不随 `mopr` jar 分发的运行时;
594
- 许可证与归档见 6 与 `THIRD_PARTY_NOTICES.md`「Java」节)。pom.xml 的
595
- surefire `<includes>` 已追加 `**/*Benchmark.java`(默认只收集 `*Test*` 命名),
596
- 运行全部测试/基准:
590
+ **单元测试**以 `tests/` 为测试源根(与 C++ / JS 测试同处跨语言测试目录),surefire 按
591
+ 默认命名 `Test*` / `*Test` / `*Tests` / `*TestCase` 收集:
597
592
 
598
593
  ```powershell
599
594
  mvn test
600
595
  ```
601
596
 
597
+ **Java 基准**(`benchmark/micro/ringbuffer_LMAXDisruptorBenchmark.java`,LMAX Disruptor
598
+ 环形缓冲吞吐对照,场景参数与测量口径对齐 C++/Rust/Go 的 Vyukov MPMC 基准,`@Test`
599
+ 方法通过 JUnit 5 执行)与 C++ / Rust / Go 基准同处基准套件目录 `benchmark/`(见
600
+ `benchmark/README.md`),但**不参与默认构建**:`benchmark/` 不是测试源根,默认
601
+ `mvn test` 既不编译也不运行它,需要时用 `-Pbench` profile 显式开启:
602
+
603
+ ```powershell
604
+ mvn -Pbench test # tests/ 单元测试 + benchmark/ 基准
605
+ mvn -Pbench test-compile # 只编译基准(校验基准代码不腐烂)
606
+ mvn -Pbench -Dtest=ringbuffer_LMAXDisruptorBenchmark test # 只跑基准
607
+ ```
608
+
609
+ 隔离手段(JMH 等基准框架隔离的通用做法;本项目基准为手写 JUnit 5,未引入 JMH):
610
+
611
+ - **源隔离**:`-Pbench` 用 `build-helper-maven-plugin` 把 `benchmark/` 追加为「附加测试源根」
612
+ (`tests/` 仍是测试源根),基准类只落在 `build/java/test-classes`;主编译
613
+ (`default-compile`)、sources 与 javadoc 插件均排除 `benchmark/**` 与 `tests/**`
614
+ —— 基准源码不随 `mopr` jar / sources jar / javadoc jar 分发;
615
+ - **依赖隔离**:声明于 `pom.xml <dependencies>` 的 `junit-jupiter` 5.8.2 与
616
+ `com.lmax:disruptor` 3.4.4 均标注 `<scope>test</scope>`,不进入 `mopr` jar,也不会作为
617
+ compile 依赖写进发布 pom 传递给下游(许可证与归档见 6 与 `THIRD_PARTY_NOTICES.md`「Java」节);
618
+ - **执行隔离**:默认 surefire 只收集单元测试命名;`-Pbench` 的 profile 配置完整列出
619
+ 「单元测试命名 + `**/*Benchmark.java`」(profile 的 `includes` 会替换而非追加默认列表,
620
+ 故需完整声明),保证一次跑齐单元测试与基准。
621
+
602
622
  ## 5. Go 构建
603
623
 
604
624
  > Go 实现为模块内多包形态(无独立可执行入口),代码位于 `base/`、`runtime/`、`distributed/` 下的 `*.go`(`go.mod`:`module github.com/quant1x/mopr`);与 Python、C++(当前构建主线)、Rust、Java 各语言构建相互独立,不共享发布包。
@@ -647,7 +667,7 @@ Go 侧唯一运行时第三方依赖为 `golang.org/x/sys` v0.47.0(声明于 `
647
667
  - `third_party/licenses/`:许可证全文归档,按语言拆分 `third_party/licenses/python/`、`third_party/licenses/cpp/`、`third_party/licenses/rust/`、`third_party/licenses/go/`、`third_party/licenses/java/`;
648
668
  - `tools/license_audit/`:第三方依赖声明生成工具(`mopr.tools.license_audit`,仅 Python 标准库,仓库根执行),按语言子模块扫描依赖并刷新上述文件;
649
669
  - `THIRD_PARTY_TODO.md`(仓库根,运行期生成):每次审计收尾把机器无法自动确定的事项(缺失许可证文本、新增组件版权/主页、许可类型未标注等)写入待办清单;无待办自动删除,不随版本控制(见 `.gitignore`),发布前必须清零;
650
- - Python 运行时第三方依赖目前仅 loguru(声明于 `pyproject.toml [project].dependencies`):`python` 子命令核验声明与源码 import 交叉核对,并把许可证文本归档到 `third_party/licenses/python/`;Java 主代码(`distributed/id/`)仅 import JDK 内置包、`mopr` jar 运行时无第三方依赖,其 dev/test 依赖 junit-jupiter/disruptor(仅被 `tests/` 基准代码引用)由 `java` 子命令按源码引用证据推定角色并归档到 `third_party/licenses/java/`;Java 的 Maven 插件与 Python 的构建工具(build-system.requires)仅构建期使用,不随产物分发。
670
+ - Python 运行时第三方依赖目前仅 loguru(声明于 `pyproject.toml [project].dependencies`):`python` 子命令核验声明与源码 import 交叉核对,并把许可证文本归档到 `third_party/licenses/python/`;Java 主代码(`distributed/id/`)仅 import JDK 内置包、`mopr` jar 运行时无第三方依赖,其 dev/test 依赖 junit-jupiter/disruptor(仅被 `benchmark/` 基准代码引用)由 `java` 子命令按源码引用证据推定角色并归档到 `third_party/licenses/java/`;Java 的 Maven 插件与 Python 的构建工具(build-system.requires)仅构建期使用,不随产物分发。
651
671
 
652
672
  ### 6.1 文件与生成工具
653
673
 
@@ -657,7 +677,7 @@ Go 侧唯一运行时第三方依赖为 `golang.org/x/sys` v0.47.0(声明于 `
657
677
  | `cpp`(`tools/license_audit/handlers/cpp.py`) | `conan graph info` 解析依赖图(含 `tool_requires` 等闭包节点),把各组件许可证文件导出到 `third_party/licenses/cpp/<name>-<version>/` | 本机 conan 缓存(依赖需已解析 / 缓存,全程离线,不访问网络) |
658
678
  | `rust`(`tools/license_audit/handlers/rust.py`) | 解析 Rust 完整依赖闭包(基于 `Cargo.lock`,含传递依赖),自动刷新 `THIRD_PARTY_NOTICES.md` 的直接依赖表与闭包机器区段,并把各 crate 的许可证文件复制到 `third_party/licenses/rust/<crate>-<version>/` | 本地 cargo registry 源码缓存(先 `cargo build` / `cargo fetch` 即有) |
659
679
  | `go`(`tools/license_audit/handlers/go.py`) | go-licenses 的 `csv` / `save`:把各模块 `LICENSE` 文本归档到 `third_party/licenses/go/<模块路径>/` | Go 工具链 + go-licenses(PATH / GOBIN 找不到时自动 `go install github.com/google/go-licenses@latest`) |
660
- | `java`(`tools/license_audit/handlers/java.py`) | 解析 `pom.xml` 的 `<dependencies>`(Maven property 已展开),按源码引用证据推定角色:主代码(`base/`/`runtime/`/`distributed/`)引用的 compile/runtime 依赖为 direct,`tests/` 引用的(或 test/provided scope)为 dev/test;两类均从各构件 jar 内提取 LICENSE/COPYING/NOTICE 条目归档到 `third_party/licenses/java/<artifactId>-<version>/`(jar 内无许可证文本且无人工补录时按缺失待处理);并扫描主代码与测试代码 import 提示未声明的第三方引用。当前声明的 dev/test 依赖:junit-jupiter 5.8.2(EPL-2.0,jar 内 `META-INF/LICENSE.md`)与 disruptor 3.4.4(Apache-2.0,jar 未随附许可证文件,已按官方全文人工补录) | 本机 maven 仓库 `~/.m2/repository`(依赖需已 `mvn test` / `mvn dependency:resolve`) |
680
+ | `java`(`tools/license_audit/handlers/java.py`) | 解析 `pom.xml` 的 `<dependencies>`(Maven property 已展开),按源码引用证据推定角色:主代码(`base/`/`runtime/`/`distributed/`)引用的 compile/runtime 依赖为 direct,`benchmark/` 基准代码引用的(或 test/provided scope)为 dev/test;两类均从各构件 jar 内提取 LICENSE/COPYING/NOTICE 条目归档到 `third_party/licenses/java/<artifactId>-<version>/`(jar 内无许可证文本且无人工补录时按缺失待处理);并扫描主代码与测试代码 import 提示未声明的第三方引用。当前声明的 dev/test 依赖:junit-jupiter 5.8.2(EPL-2.0,jar 内 `META-INF/LICENSE.md`)与 disruptor 3.4.4(Apache-2.0,jar 未随附许可证文件,已按官方全文人工补录) | 本机 maven 仓库 `~/.m2/repository`(依赖需已 `mvn test` / `mvn dependency:resolve`) |
661
681
 
662
682
  ### 6.2 运行示例(均为仓库根执行)
663
683