precis-cli 0.1.3__py3-none-any.whl

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 (442) hide show
  1. app/__init__.py +16 -0
  2. app/api/__init__.py +32 -0
  3. app/api/dependencies.py +185 -0
  4. app/api/main.py +301 -0
  5. app/api/middleware/__init__.py +34 -0
  6. app/api/middleware/exception_handler.py +126 -0
  7. app/api/middleware/request_logging.py +97 -0
  8. app/api/middleware/token_auth.py +215 -0
  9. app/api/models/__init__.py +151 -0
  10. app/api/models/connection_rules.py +98 -0
  11. app/api/models/files.py +99 -0
  12. app/api/models/full_validation.py +554 -0
  13. app/api/models/project.py +117 -0
  14. app/api/models/projects.py +80 -0
  15. app/api/models/schema.py +121 -0
  16. app/api/models/v2_responses.py +46 -0
  17. app/api/models/validation.py +303 -0
  18. app/api/models/workspace.py +118 -0
  19. app/api/routers/__init__.py +56 -0
  20. app/api/routers/ai/__init__.py +36 -0
  21. app/api/routers/ai/chat.py +243 -0
  22. app/api/routers/ai/generate.py +156 -0
  23. app/api/routers/ai/hardware.py +199 -0
  24. app/api/routers/ai/jobs.py +544 -0
  25. app/api/routers/ai/migrate.py +471 -0
  26. app/api/routers/ai/models.py +352 -0
  27. app/api/routers/ai/ollama.py +108 -0
  28. app/api/routers/ai/providers.py +491 -0
  29. app/api/routers/ai/router.py +44 -0
  30. app/api/routers/ai/stream.py +281 -0
  31. app/api/routers/ai/utils.py +182 -0
  32. app/api/routers/core/__init__.py +34 -0
  33. app/api/routers/core/connection_rules.py +188 -0
  34. app/api/routers/core/data_sources.py +374 -0
  35. app/api/routers/core/regex.py +333 -0
  36. app/api/routers/core/reporting.py +263 -0
  37. app/api/routers/files/__init__.py +24 -0
  38. app/api/routers/files/ops.py +179 -0
  39. app/api/routers/files/transfer.py +101 -0
  40. app/api/routers/preview/__init__.py +35 -0
  41. app/api/routers/preview/content_mode.py +264 -0
  42. app/api/routers/preview/header_row.py +154 -0
  43. app/api/routers/preview/models.py +81 -0
  44. app/api/routers/preview/path_mode.py +440 -0
  45. app/api/routers/preview/router.py +30 -0
  46. app/api/routers/project/__init__.py +61 -0
  47. app/api/routers/project/base.py +111 -0
  48. app/api/routers/project/constraint.py +345 -0
  49. app/api/routers/project/full_config.py +411 -0
  50. app/api/routers/project/full_config_writer.py +327 -0
  51. app/api/routers/project/helpers.py +167 -0
  52. app/api/routers/project/inspection_fix.py +330 -0
  53. app/api/routers/project/manifest.py +605 -0
  54. app/api/routers/project/models.py +177 -0
  55. app/api/routers/project/pattern.py +268 -0
  56. app/api/routers/project/regex.py +358 -0
  57. app/api/routers/project/scanner.py +157 -0
  58. app/api/routers/project/schema.py +567 -0
  59. app/api/routers/project/schema_helpers.py +149 -0
  60. app/api/routers/project/settings.py +399 -0
  61. app/api/routers/project/template.py +325 -0
  62. app/api/routers/project/validation.py +227 -0
  63. app/api/routers/project/view.py +177 -0
  64. app/api/routers/project/workspaces.py +167 -0
  65. app/api/routers/projects/__init__.py +25 -0
  66. app/api/routers/projects/create.py +121 -0
  67. app/api/routers/projects/open.py +103 -0
  68. app/api/routers/projects/scan.py +100 -0
  69. app/api/routers/validation/__init__.py +39 -0
  70. app/api/routers/validation/common.py +263 -0
  71. app/api/routers/validation/content_mode.py +401 -0
  72. app/api/routers/validation/history.py +235 -0
  73. app/api/routers/validation/inline_mode.py +196 -0
  74. app/api/routers/validation/path_mode.py +314 -0
  75. app/api/routers/validation/router.py +51 -0
  76. app/api/services/full_validation_response_builder.py +412 -0
  77. app/api/services/io_error_messages.py +41 -0
  78. app/api/services/preview_service.py +248 -0
  79. app/cli/__init__.py +18 -0
  80. app/cli/__main__.py +30 -0
  81. app/cli/shared_services/__init__.py +42 -0
  82. app/cli/shared_services/config_ops.py +581 -0
  83. app/cli/shared_services/generation_ops.py +160 -0
  84. app/cli/shared_services/project_ops.py +288 -0
  85. app/cli/shell/__init__.py +48 -0
  86. app/cli/shell/commands/__init__.py +63 -0
  87. app/cli/shell/commands/ai/__init__.py +260 -0
  88. app/cli/shell/commands/ai/chat.py +331 -0
  89. app/cli/shell/commands/ai/delete.py +165 -0
  90. app/cli/shell/commands/ai/diff.py +70 -0
  91. app/cli/shell/commands/ai/display.py +428 -0
  92. app/cli/shell/commands/ai/executor.py +225 -0
  93. app/cli/shell/commands/ai/executor_utils.py +271 -0
  94. app/cli/shell/commands/ai/generate.py +285 -0
  95. app/cli/shell/commands/ai/interaction.py +262 -0
  96. app/cli/shell/commands/ai/migrate.py +281 -0
  97. app/cli/shell/commands/ai/resolver.py +224 -0
  98. app/cli/shell/commands/ai/status.py +101 -0
  99. app/cli/shell/commands/ai/switch.py +158 -0
  100. app/cli/shell/commands/ai/utils.py +52 -0
  101. app/cli/shell/commands/base.py +343 -0
  102. app/cli/shell/commands/config/__init__.py +131 -0
  103. app/cli/shell/commands/config/base.py +80 -0
  104. app/cli/shell/commands/config/check.py +246 -0
  105. app/cli/shell/commands/config/edit.py +148 -0
  106. app/cli/shell/commands/config/get.py +111 -0
  107. app/cli/shell/commands/config/init.py +123 -0
  108. app/cli/shell/commands/config/inspect.py +164 -0
  109. app/cli/shell/commands/config/list.py +104 -0
  110. app/cli/shell/commands/config/set.py +119 -0
  111. app/cli/shell/commands/config/show.py +150 -0
  112. app/cli/shell/commands/exit.py +67 -0
  113. app/cli/shell/commands/help.py +104 -0
  114. app/cli/shell/commands/infer_schema.py +156 -0
  115. app/cli/shell/commands/open.py +201 -0
  116. app/cli/shell/commands/project.py +215 -0
  117. app/cli/shell/commands/provider.py +619 -0
  118. app/cli/shell/commands/system.py +170 -0
  119. app/cli/shell/commands/validate.py +455 -0
  120. app/cli/shell/completer.py +231 -0
  121. app/cli/shell/config_storage.py +191 -0
  122. app/cli/shell/exceptions.py +90 -0
  123. app/cli/shell/formatter.py +371 -0
  124. app/cli/shell/interactive_menu.py +348 -0
  125. app/cli/shell/main.py +286 -0
  126. app/cli/shell/parser.py +266 -0
  127. app/cli/start.py +180 -0
  128. app/cli_main.py +52 -0
  129. app/mcp_server.py +311 -0
  130. app/shared/core/__init__.py +18 -0
  131. app/shared/core/app_version.py +59 -0
  132. app/shared/core/config/__init__.py +119 -0
  133. app/shared/core/config/server.py +193 -0
  134. app/shared/core/data_source/__init__.py +106 -0
  135. app/shared/core/data_source/loader.py +348 -0
  136. app/shared/core/data_source/loaders/__init__.py +213 -0
  137. app/shared/core/data_source/loaders/base.py +215 -0
  138. app/shared/core/data_source/loaders/converter.py +337 -0
  139. app/shared/core/data_source/loaders/csv_loader.py +252 -0
  140. app/shared/core/data_source/loaders/excel_loader.py +666 -0
  141. app/shared/core/data_source/loaders/extractor.py +268 -0
  142. app/shared/core/data_source/loaders/json_loader.py +354 -0
  143. app/shared/core/data_source/loaders/registry.py +88 -0
  144. app/shared/core/data_source/loaders/sql_loader.py +313 -0
  145. app/shared/core/data_source/loaders/strategies/__init__.py +100 -0
  146. app/shared/core/data_source/loaders/strategies/array_parser.py +277 -0
  147. app/shared/core/data_source/loaders/strategies/lines_parser.py +355 -0
  148. app/shared/core/data_source/loaders/strategies/object_parser.py +278 -0
  149. app/shared/core/data_source/schema_info.py +50 -0
  150. app/shared/core/data_source/specs/__init__.py +128 -0
  151. app/shared/core/data_source/specs/base.py +258 -0
  152. app/shared/core/data_source/specs/csv_source.py +137 -0
  153. app/shared/core/data_source/specs/excel_source.py +141 -0
  154. app/shared/core/data_source/specs/file_base.py +252 -0
  155. app/shared/core/data_source/specs/json_source.py +226 -0
  156. app/shared/core/data_source/specs/sql_source.py +161 -0
  157. app/shared/core/encoding.py +36 -0
  158. app/shared/core/io/__init__.py +24 -0
  159. app/shared/core/io/yaml.py +379 -0
  160. app/shared/core/manifest_schema/__init__.py +52 -0
  161. app/shared/core/manifest_schema/types.py +99 -0
  162. app/shared/core/manifest_schema/version.py +175 -0
  163. app/shared/core/patterns/__init__.py +24 -0
  164. app/shared/core/patterns/loader.py +134 -0
  165. app/shared/core/patterns/writer.py +244 -0
  166. app/shared/core/project/__init__.py +47 -0
  167. app/shared/core/project/constraint/builders/__init__.py +50 -0
  168. app/shared/core/project/constraint/builders/base.py +100 -0
  169. app/shared/core/project/constraint/builders/composite.py +77 -0
  170. app/shared/core/project/constraint/builders/conditional.py +67 -0
  171. app/shared/core/project/constraint/builders/foreign_key.py +53 -0
  172. app/shared/core/project/constraint/builders/registry.py +64 -0
  173. app/shared/core/project/constraint/builders/scripted.py +51 -0
  174. app/shared/core/project/constraint/builders/single_column.py +86 -0
  175. app/shared/core/project/constraint/builders/unique.py +53 -0
  176. app/shared/core/project/constraint/factory.py +170 -0
  177. app/shared/core/project/constraint/reader.py +214 -0
  178. app/shared/core/project/constraint/registry.py +233 -0
  179. app/shared/core/project/constraint/types/__init__.py +63 -0
  180. app/shared/core/project/constraint/types/constraint_file.py +261 -0
  181. app/shared/core/project/constraint/types/refs.py +460 -0
  182. app/shared/core/project/constraint/types.py +28 -0
  183. app/shared/core/project/constraint/writer.py +181 -0
  184. app/shared/core/project/loader/__init__.py +56 -0
  185. app/shared/core/project/loader/loader.py +30 -0
  186. app/shared/core/project/loader/loader_parts/config_inspector.py +137 -0
  187. app/shared/core/project/loader/loader_parts/embedded_constraints.py +224 -0
  188. app/shared/core/project/loader/loader_parts/file_loaders.py +58 -0
  189. app/shared/core/project/loader/loader_parts/inspection_ids.py +85 -0
  190. app/shared/core/project/loader/loader_parts/inspector_helpers.py +312 -0
  191. app/shared/core/project/loader/loader_parts/inspector_id_checks.py +274 -0
  192. app/shared/core/project/loader/loader_parts/inspector_reference_checks.py +690 -0
  193. app/shared/core/project/loader/loader_parts/inspector_uniqueness_checks.py +286 -0
  194. app/shared/core/project/loader/loader_parts/loading_error_messages.py +298 -0
  195. app/shared/core/project/loader/loader_parts/main.py +432 -0
  196. app/shared/core/project/loader/loader_parts/path_validation.py +117 -0
  197. app/shared/core/project/loader/loader_parts/runtime.py +125 -0
  198. app/shared/core/project/loader/types.py +246 -0
  199. app/shared/core/project/manifest/coverage.py +391 -0
  200. app/shared/core/project/manifest/reader.py +260 -0
  201. app/shared/core/project/manifest/types.py +91 -0
  202. app/shared/core/project/manifest/types_parts/__init__.py +60 -0
  203. app/shared/core/project/manifest/types_parts/constants.py +40 -0
  204. app/shared/core/project/manifest/types_parts/data_source.py +68 -0
  205. app/shared/core/project/manifest/types_parts/info.py +59 -0
  206. app/shared/core/project/manifest/types_parts/manifest.py +294 -0
  207. app/shared/core/project/manifest/types_parts/refs.py +153 -0
  208. app/shared/core/project/manifest/types_parts/settings.py +92 -0
  209. app/shared/core/project/manifest/types_parts/settings_file_processing.py +64 -0
  210. app/shared/core/project/manifest/types_parts/settings_script_security.py +78 -0
  211. app/shared/core/project/manifest/types_parts/settings_validation.py +83 -0
  212. app/shared/core/project/manifest/types_parts/template.py +66 -0
  213. app/shared/core/project/manifest/writer.py +262 -0
  214. app/shared/core/project/manual_data/__init__.py +27 -0
  215. app/shared/core/project/manual_data/types.py +75 -0
  216. app/shared/core/project/regex/reader.py +197 -0
  217. app/shared/core/project/regex/types.py +405 -0
  218. app/shared/core/project/regex/writer.py +123 -0
  219. app/shared/core/project/schema/reader.py +170 -0
  220. app/shared/core/project/schema/types.py +47 -0
  221. app/shared/core/project/schema/types_parts/__init__.py +36 -0
  222. app/shared/core/project/schema/types_parts/column.py +174 -0
  223. app/shared/core/project/schema/types_parts/column_utils.py +72 -0
  224. app/shared/core/project/schema/types_parts/constraint.py +165 -0
  225. app/shared/core/project/schema/types_parts/schema_id.py +66 -0
  226. app/shared/core/project/schema/types_parts/source.py +255 -0
  227. app/shared/core/project/schema/types_parts/source_options.py +347 -0
  228. app/shared/core/project/schema/types_parts/table.py +230 -0
  229. app/shared/core/project/schema/writer.py +139 -0
  230. app/shared/core/project/schema_ref_check.py +95 -0
  231. app/shared/core/project/template/__init__.py +27 -0
  232. app/shared/core/project/template/expander.py +263 -0
  233. app/shared/core/project/template/reader.py +120 -0
  234. app/shared/core/project/template/types.py +114 -0
  235. app/shared/core/project/transform/reader.py +76 -0
  236. app/shared/core/project/transform/types.py +116 -0
  237. app/shared/core/project/transform/writer.py +84 -0
  238. app/shared/core/pydantic_messages.py +59 -0
  239. app/shared/core/reporter/__init__.py +46 -0
  240. app/shared/core/reporter/reporter.py +220 -0
  241. app/shared/core/reporter/reporters/__init__.py +65 -0
  242. app/shared/core/reporter/reporters/base.py +188 -0
  243. app/shared/core/reporter/reporters/dingtalk_app_reporter.py +274 -0
  244. app/shared/core/reporter/reporters/email_reporter.py +271 -0
  245. app/shared/core/reporter/reporters/feishu_app_reporter.py +467 -0
  246. app/shared/core/reporter/reporters/local_file_reporter.py +208 -0
  247. app/shared/core/reporter/reporters/wecom_app_reporter.py +268 -0
  248. app/shared/core/utils/__init__.py +18 -0
  249. app/shared/core/utils/path_utils.py +60 -0
  250. app/shared/core/utils/regex_extract.py +113 -0
  251. app/shared/domain/__init__.py +114 -0
  252. app/shared/domain/constraints/__init__.py +76 -0
  253. app/shared/domain/constraints/allowed_values.py +211 -0
  254. app/shared/domain/constraints/base.py +141 -0
  255. app/shared/domain/constraints/charset.py +337 -0
  256. app/shared/domain/constraints/composite.py +174 -0
  257. app/shared/domain/constraints/condition_registry.py +130 -0
  258. app/shared/domain/constraints/conditional.py +629 -0
  259. app/shared/domain/constraints/date_logic.py +731 -0
  260. app/shared/domain/constraints/foreign_key.py +261 -0
  261. app/shared/domain/constraints/key_normalization.py +56 -0
  262. app/shared/domain/constraints/not_null.py +185 -0
  263. app/shared/domain/constraints/range.py +360 -0
  264. app/shared/domain/constraints/regex.py +218 -0
  265. app/shared/domain/constraints/scripted.py +276 -0
  266. app/shared/domain/constraints/unique.py +233 -0
  267. app/shared/domain/data_engine.py +384 -0
  268. app/shared/domain/data_types.py +113 -0
  269. app/shared/domain/data_types_parts/__init__.py +67 -0
  270. app/shared/domain/data_types_parts/base.py +204 -0
  271. app/shared/domain/data_types_parts/composite.py +250 -0
  272. app/shared/domain/data_types_parts/expression.py +202 -0
  273. app/shared/domain/data_types_parts/extracted.py +106 -0
  274. app/shared/domain/data_types_parts/json_types.py +234 -0
  275. app/shared/domain/data_types_parts/scalars.py +719 -0
  276. app/shared/domain/data_types_parts/sequence.py +129 -0
  277. app/shared/domain/dataset_schema.py +48 -0
  278. app/shared/domain/eval_sandbox.py +63 -0
  279. app/shared/domain/expression_system.py +366 -0
  280. app/shared/domain/regex_flags.py +53 -0
  281. app/shared/domain/schema/builder.py +223 -0
  282. app/shared/domain/schema/models.py +339 -0
  283. app/shared/domain/transforms/__init__.py +28 -0
  284. app/shared/domain/transforms/aggregate.py +141 -0
  285. app/shared/domain/transforms/base.py +171 -0
  286. app/shared/domain/transforms/cast_type.py +120 -0
  287. app/shared/domain/transforms/concat.py +103 -0
  288. app/shared/domain/transforms/conditional_assign.py +114 -0
  289. app/shared/domain/transforms/date_format.py +81 -0
  290. app/shared/domain/transforms/digits.py +77 -0
  291. app/shared/domain/transforms/drop_duplicates.py +94 -0
  292. app/shared/domain/transforms/fill_na.py +94 -0
  293. app/shared/domain/transforms/filter_rows.py +97 -0
  294. app/shared/domain/transforms/lookup.py +78 -0
  295. app/shared/domain/transforms/lower_case.py +70 -0
  296. app/shared/domain/transforms/map_value.py +90 -0
  297. app/shared/domain/transforms/math_expr.py +112 -0
  298. app/shared/domain/transforms/modulo.py +82 -0
  299. app/shared/domain/transforms/regex_extract.py +103 -0
  300. app/shared/domain/transforms/registry.py +95 -0
  301. app/shared/domain/transforms/replace.py +88 -0
  302. app/shared/domain/transforms/sort_rows.py +94 -0
  303. app/shared/domain/transforms/string_split.py +84 -0
  304. app/shared/domain/transforms/strip.py +73 -0
  305. app/shared/domain/transforms/substring.py +92 -0
  306. app/shared/domain/transforms/upper_case.py +70 -0
  307. app/shared/domain/transforms/weighted_sum.py +104 -0
  308. app/shared/domain/validation_constraints.py +69 -0
  309. app/shared/services/__init__.py +62 -0
  310. app/shared/services/ai/__init__.py +48 -0
  311. app/shared/services/ai/agent/__init__.py +40 -0
  312. app/shared/services/ai/agent/chat_tools/__init__.py +47 -0
  313. app/shared/services/ai/agent/chat_tools/apply_actions.py +592 -0
  314. app/shared/services/ai/agent/chat_tools/ask_user.py +237 -0
  315. app/shared/services/ai/agent/chat_tools/read_canvas.py +140 -0
  316. app/shared/services/ai/agent/chat_tools/read_project.py +160 -0
  317. app/shared/services/ai/agent/chat_tools/read_table.py +301 -0
  318. app/shared/services/ai/agent/chat_tools/schemas.py +105 -0
  319. app/shared/services/ai/agent/chat_tools/validate_table.py +131 -0
  320. app/shared/services/ai/agent/executor.py +554 -0
  321. app/shared/services/ai/agent/memory.py +256 -0
  322. app/shared/services/ai/agent/planner.py +282 -0
  323. app/shared/services/ai/agent/tool_registry.py +296 -0
  324. app/shared/services/ai/agent/tools/__init__.py +32 -0
  325. app/shared/services/ai/agent/tools/config_generate.py +133 -0
  326. app/shared/services/ai/agent/tools/config_refine.py +109 -0
  327. app/shared/services/ai/agent/tools/config_validate.py +403 -0
  328. app/shared/services/ai/agent/tools/merge_results.py +136 -0
  329. app/shared/services/ai/agent/tools/plan_chunks.py +79 -0
  330. app/shared/services/ai/agent/tools/script_parse.py +359 -0
  331. app/shared/services/ai/agent/types.py +138 -0
  332. app/shared/services/ai/chat_agent_runner.py +596 -0
  333. app/shared/services/ai/chat_orchestrator.py +725 -0
  334. app/shared/services/ai/failure_messages.py +65 -0
  335. app/shared/services/ai/job_storage.py +274 -0
  336. app/shared/services/ai/migrate_service.py +550 -0
  337. app/shared/services/ai/streaming/__init__.py +65 -0
  338. app/shared/services/ai/streaming/event_journal.py +197 -0
  339. app/shared/services/ai/streaming/orchestrator.py +262 -0
  340. app/shared/services/ai/streaming/pending_interaction_store.py +227 -0
  341. app/shared/services/ai/streaming/sse_response.py +148 -0
  342. app/shared/services/ai/streaming/types.py +73 -0
  343. app/shared/services/ai/types.py +213 -0
  344. app/shared/services/ai/utils.py +322 -0
  345. app/shared/services/diff/config_diff.py +320 -0
  346. app/shared/services/hardware.py +237 -0
  347. app/shared/services/llm/__init__.py +62 -0
  348. app/shared/services/llm/actions/__init__.py +42 -0
  349. app/shared/services/llm/actions/_canvas_validator.py +147 -0
  350. app/shared/services/llm/actions/_constraint_validator.py +401 -0
  351. app/shared/services/llm/actions/_regex_validator.py +85 -0
  352. app/shared/services/llm/actions/_schema_validator.py +82 -0
  353. app/shared/services/llm/actions/_settings_validator.py +76 -0
  354. app/shared/services/llm/actions/_transform_validator.py +78 -0
  355. app/shared/services/llm/actions/action_handlers.py +400 -0
  356. app/shared/services/llm/actions/action_parser.py +63 -0
  357. app/shared/services/llm/actions/action_processor.py +468 -0
  358. app/shared/services/llm/actions/action_validator.py +311 -0
  359. app/shared/services/llm/actions/diff_compute.py +195 -0
  360. app/shared/services/llm/actions/regex_handlers.py +284 -0
  361. app/shared/services/llm/actions/registry.py +336 -0
  362. app/shared/services/llm/actions/schema_handlers.py +335 -0
  363. app/shared/services/llm/actions/settings_handlers.py +180 -0
  364. app/shared/services/llm/actions/specs.py +259 -0
  365. app/shared/services/llm/actions/transform_handlers.py +279 -0
  366. app/shared/services/llm/actions/validation_types.py +147 -0
  367. app/shared/services/llm/cache/__init__.py +18 -0
  368. app/shared/services/llm/cache/response_cache.py +80 -0
  369. app/shared/services/llm/chat/__init__.py +35 -0
  370. app/shared/services/llm/chat/chat_system_prompt.py +561 -0
  371. app/shared/services/llm/chat/response_parser.py +296 -0
  372. app/shared/services/llm/config/__init__.py +45 -0
  373. app/shared/services/llm/config/crypto.py +135 -0
  374. app/shared/services/llm/config/loader.py +258 -0
  375. app/shared/services/llm/config/models.py +202 -0
  376. app/shared/services/llm/config/presets.py +128 -0
  377. app/shared/services/llm/config_generator.py +163 -0
  378. app/shared/services/llm/constraints/__init__.py +41 -0
  379. app/shared/services/llm/constraints/constraint_builder.py +177 -0
  380. app/shared/services/llm/constraints/constraint_deletion.py +84 -0
  381. app/shared/services/llm/constraints/constraint_id.py +174 -0
  382. app/shared/services/llm/constraints/frontend_instructions.py +333 -0
  383. app/shared/services/llm/constraints/inline_batch.py +279 -0
  384. app/shared/services/llm/discovery/__init__.py +35 -0
  385. app/shared/services/llm/discovery/scanner.py +181 -0
  386. app/shared/services/llm/generation/__init__.py +42 -0
  387. app/shared/services/llm/generation/agent_wiring.py +156 -0
  388. app/shared/services/llm/generation/config_builder.py +386 -0
  389. app/shared/services/llm/generation/errors.py +36 -0
  390. app/shared/services/llm/generation/existing_config.py +99 -0
  391. app/shared/services/llm/generation/profiler.py +279 -0
  392. app/shared/services/llm/generation/prompt_builder.py +199 -0
  393. app/shared/services/llm/generation/response_parser.py +144 -0
  394. app/shared/services/llm/generation/service.py +622 -0
  395. app/shared/services/llm/models.py +104 -0
  396. app/shared/services/llm/providers/__init__.py +48 -0
  397. app/shared/services/llm/providers/base.py +310 -0
  398. app/shared/services/llm/providers/cached_provider.py +90 -0
  399. app/shared/services/llm/providers/ollama.py +498 -0
  400. app/shared/services/llm/providers/openai.py +334 -0
  401. app/shared/services/llm/providers/registry.py +108 -0
  402. app/shared/services/llm/schema_resolver.py +141 -0
  403. app/shared/services/llm/suggestion_utils.py +219 -0
  404. app/shared/services/llm/validate_executor.py +163 -0
  405. app/shared/services/llm/yaml_io.py +406 -0
  406. app/shared/services/preview/__init__.py +18 -0
  407. app/shared/services/preview/loader.py +145 -0
  408. app/shared/services/preview/path_validation.py +138 -0
  409. app/shared/services/project_loader.py +57 -0
  410. app/shared/services/schema_inference.py +260 -0
  411. app/shared/services/schema_runtime_builder.py +120 -0
  412. app/shared/services/validation/__init__.py +52 -0
  413. app/shared/services/validation/chunked_loader.py +509 -0
  414. app/shared/services/validation/dag/__init__.py +35 -0
  415. app/shared/services/validation/dag/builder.py +141 -0
  416. app/shared/services/validation/dag/executor.py +225 -0
  417. app/shared/services/validation/dag/sorter.py +77 -0
  418. app/shared/services/validation/data_loader.py +231 -0
  419. app/shared/services/validation/engine.py +446 -0
  420. app/shared/services/validation/executor.py +1030 -0
  421. app/shared/services/validation/extractors.py +266 -0
  422. app/shared/services/validation/history.py +209 -0
  423. app/shared/services/validation/json_payload.py +136 -0
  424. app/shared/services/validation/loader.py +152 -0
  425. app/shared/services/validation/memory_monitor.py +179 -0
  426. app/shared/services/validation/postprocess.py +208 -0
  427. app/shared/services/validation/progress.py +64 -0
  428. app/shared/services/validation/report_export.py +222 -0
  429. app/shared/services/validation/resolver.py +180 -0
  430. app/shared/services/validation/service.py +418 -0
  431. app/shared/services/validation/types.py +238 -0
  432. app/shared/services/validation/validators/__init__.py +36 -0
  433. app/shared/services/validation/validators/adapter.py +182 -0
  434. app/shared/services/validation/validators/base.py +332 -0
  435. app/shared/services/validation/validators/composite.py +233 -0
  436. app/shared/services/validation/validators/date_logic.py +276 -0
  437. app/start_server.py +133 -0
  438. precis_cli-0.1.3.dist-info/METADATA +180 -0
  439. precis_cli-0.1.3.dist-info/RECORD +442 -0
  440. precis_cli-0.1.3.dist-info/WHEEL +5 -0
  441. precis_cli-0.1.3.dist-info/entry_points.txt +4 -0
  442. precis_cli-0.1.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,260 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Copyright 2026 Precis Team
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ """
17
+ @fileoverview 项目清单读取模块
18
+
19
+ 功能概述:
20
+ - 从 project.precis.yaml 文件读取项目清单配置
21
+ - 提供清单文件的加载、解析和校验功能
22
+ - 支持批量加载多个约束配置文件
23
+
24
+ 架构设计:
25
+ - 单一职责: 仅负责清单文件读取,不涉及写入逻辑
26
+ - 依赖注入: 使用 YAML 读取工具进行文件解析
27
+ - 类型安全: 使用 Pydantic 模型验证确保清单格式正确
28
+
29
+ 输入示例:
30
+ # project.precis.yaml
31
+ version: 2
32
+ project:
33
+ id: my-project
34
+ name: My Project
35
+ schemas:
36
+ - id: users
37
+ path: schemas/users.schema.yaml
38
+
39
+ 输出示例:
40
+ manifest = load_manifest("project.precis.yaml")
41
+ print(manifest.project.name)
42
+ """
43
+
44
+ from __future__ import annotations
45
+
46
+ from pathlib import Path
47
+ from typing import TYPE_CHECKING
48
+
49
+ from app.shared.core.io.yaml import read_yaml
50
+
51
+ from .types import ProjectManifest
52
+
53
+ if TYPE_CHECKING:
54
+ from .types import ProjectManifest
55
+
56
+
57
+ def load_manifest(manifest_path: str | Path) -> ProjectManifest:
58
+ """
59
+ @methoddesc 从 project.precis.yaml 文件加载项目清单。
60
+
61
+ ============================================================================
62
+ 配置文件示例 (本函数处理的配置文件长这样)
63
+ ============================================================================
64
+ 本函数处理以下格式的 project.precis.yaml 文件:
65
+
66
+ ```yaml
67
+ # ============================================================
68
+ # Precis 项目清单文件 (project.precis.yaml)
69
+ # ============================================================
70
+ # 这是项目的入口文件,记录所有配置文件的索引引用
71
+ # 通过此文件,系统可以定位项目中所有的 schema、constraint 和 regex 配置
72
+
73
+ # 配置版本号,固定为 2
74
+ version: 2
75
+
76
+ # 项目基本信息
77
+ project:
78
+ id: my-data-project # 项目唯一标识符(系统内部使用)
79
+ name: My Data Project # 项目展示名称(UI 显示使用)
80
+
81
+ # 项目设置(所有可选字段都有默认值)
82
+ settings:
83
+ validation: # 校验行为设置
84
+ auto_validate: true # 配置变更时自动执行校验
85
+ strict_mode: false # 非严格模式(发现错误继续校验)
86
+ error_handling: continue # 错误处理策略:continue/report/stop
87
+ timeout_seconds: 30 # 单次校验超时时间(秒)
88
+ batch_max_files: 100 # 批量校验最大文件数
89
+ file_processing: # 文件处理设置
90
+ default_encoding: utf-8 # 默认文件编码
91
+ csv_delimiter: "," # CSV 分隔符
92
+ script_security: # 脚本安全设置
93
+ allow_eval: false # 禁止 eval() 函数
94
+ allow_exec: false # 禁止 exec() 函数
95
+ sandbox_mode: true # 启用沙箱模式
96
+ timeout_seconds: 10 # 脚本执行超时时间(秒)
97
+
98
+ # Schema 文件索引列表
99
+ schemas:
100
+ - id: users # 表 ID(必须与 schema 文件内的 id 一致)
101
+ path: schemas/users.schema.yaml # 相对于 manifest 所在目录的路径
102
+ - id: orders
103
+ path: schemas/orders.schema.yaml
104
+
105
+ # Constraint 文件索引列表
106
+ constraints:
107
+ - id: unique_user_email
108
+ path: constraints/unique_user_email.constraint.yaml
109
+
110
+ # Regex 节点文件索引列表
111
+ regex_nodes:
112
+ - id: phone_number
113
+ path: regex_nodes/phone_number.regex.yaml
114
+
115
+ # Patterns 目录路径
116
+ patterns_dir: patterns
117
+ ```
118
+
119
+ ============================================================================
120
+ 业务场景 (什么情况下会调用这个函数)
121
+ ============================================================================
122
+ - 场景1: CLI 启动数据校验
123
+ 用户在命令行执行 `precis validate --project ./my-project` 启动数据校验。
124
+ 系统自动在项目目录查找 project.precis.yaml 文件,调用 load_manifest 读取并解析该文件。
125
+
126
+ - 场景2: 前端加载项目配置
127
+ 用户在前端打开一个已存在的项目。
128
+ 前端发送请求到后端获取项目配置,后端调用 load_manifest 读取项目清单,
129
+ 将 ProjectManifest 对象序列化为 JSON 返回给前端。
130
+
131
+ - 场景3: 项目初始化向导
132
+ 用户创建新项目时,系统会创建一个默认的 project.precis.yaml 文件,
133
+ 然后调用 load_manifest 验证配置文件是否有效。
134
+
135
+ ============================================================================
136
+ 数据流 (输入如何变成输出)
137
+ ============================================================================
138
+ 输入参数:
139
+ - manifest_path: str | Path,项目清单文件路径
140
+ 示例值: "./my-project/project.precis.yaml" 或 Path("project.precis.yaml")
141
+
142
+ 处理步骤:
143
+ ┌─────────────────────────────────────────────────────────────┐
144
+ │ Step 1: 参数标准化 │
145
+ ├─────────────────────────────────────────────────────────────┤
146
+ │ 输入: 字符串或 Path 对象 │
147
+ │ 操作: 使用 Path() 构造函数转换为 Path 对象 │
148
+ │ 确保跨平台兼容性,统一处理路径格式 │
149
+ │ 输出: Path 对象 │
150
+ │ 示例: │
151
+ │ 输入: "./my-project/project.precis.yaml" (str) │
152
+ │ 处理: Path("./my-project/project.precis.yaml") │
153
+ │ 输出: Path("./my-project/project.precis.yaml") │
154
+ └─────────────────────────────────────────────────────────────┘
155
+
156
+ ┌─────────────────────────────────────────────────────────────┐
157
+ │ Step 2: 文件存在性检查 │
158
+ ├─────────────────────────────────────────────────────────────┤
159
+ │ 输入: Path 对象 │
160
+ │ 操作: 使用 path.exists() 方法检查文件是否存在 │
161
+ │ 快速失败,避免后续无效的 I/O 操作 │
162
+ │ 输出: 布尔值(存在为 True,不存在为 False) │
163
+ │ 示例: │
164
+ │ 输入: Path("./my-project/project.precis.yaml") │
165
+ │ 处理: Path("./my-project/project.precis.yaml").exists() │
166
+ │ 输出: True (如果文件存在) │
167
+ │ 异常: │
168
+ │ - 不存在: 抛出 ValueError("manifest 文件不存在: ...") │
169
+ └─────────────────────────────────────────────────────────────┘
170
+
171
+ ┌─────────────────────────────────────────────────────────────┐
172
+ │ Step 3: YAML 解析 │
173
+ ├─────────────────────────────────────────────────────────────┤
174
+ │ 输入: Path 对象 │
175
+ │ 操作: 调用 read_yaml() 读取 YAML 文件内容 │
176
+ │ 返回包含所有配置项的字典对象 │
177
+ │ 输出: Dict[str, Any] - 原始配置字典 │
178
+ │ 示例: │
179
+ │ 输入: Path("project.precis.yaml") │
180
+ │ 处理: read_yaml(Path("project.precis.yaml")) │
181
+ │ 输出: {"version": 2, "project": {...}, "schemas": []} │
182
+ └─────────────────────────────────────────────────────────────┘
183
+
184
+ ┌─────────────────────────────────────────────────────────────┐
185
+ │ Step 4: Pydantic 模型验证 │
186
+ ├─────────────────────────────────────────────────────────────┤
187
+ │ 输入: Dict[str, Any] - 原始配置字典 │
188
+ │ 操作: 使用 ProjectManifest.model_validate() 验证数据 │
189
+ │ 自动执行类型检查、必填字段验证、格式校验等 │
190
+ │ 输出: ProjectManifest 对象 │
191
+ │ 示例: │
192
+ │ 输入: {"version": 2, "project": {"id": "test"}} │
193
+ │ 处理: ProjectManifest.model_validate(字典) │
194
+ │ 输出: ProjectManifest(version=2, project=ProjectInfo(...)) │
195
+ │ 验证内容: │
196
+ │ - version 必须是整数 2 │
197
+ │ - project 必须是包含 id 和 name 的对象 │
198
+ │ - settings 会被赋予默认值(如果省略) │
199
+ │ - schemas/constraints/regex_nodes 中的 ID 必须唯一 │
200
+ └─────────────────────────────────────────────────────────────┘
201
+
202
+ ┌─────────────────────────────────────────────────────────────┐
203
+ │ Step 5: 异常包装(验证失败时) │
204
+ ├─────────────────────────────────────────────────────────────┤
205
+ │ 输入: 验证异常 │
206
+ │ 操作: 将验证异常包装为 ValueError,添加文件路径信息 │
207
+ │ 便于调用方定位问题 │
208
+ │ 输出: ValueError 异常 │
209
+ │ 示例: │
210
+ │ 输入: ValidationError (Pydantic 验证错误) │
211
+ │ 处理: raise ValueError(f"manifest 校验失败: {path}\n{e}")│
212
+ │ 输出: ValueError("manifest 校验失败: project.precis.yaml\n...") │
213
+ └─────────────────────────────────────────────────────────────┘
214
+
215
+ 最终输出: ProjectManifest - 验证通过的项目清单对象
216
+ 示例:
217
+ manifest = load_manifest("./my-project/project.precis.yaml")
218
+ print(manifest.project.name) # 输出: My Data Project
219
+ print(len(manifest.schemas)) # 输出: 2
220
+ print(manifest.settings.validation.auto_validate) # 输出: True
221
+
222
+ ============================================================================
223
+ 异常处理 (可能出什么问题)
224
+ ============================================================================
225
+ | 异常类型 | 触发条件 | 处理方式 |
226
+ |---------|---------|---------|
227
+ | ValueError | manifest 文件不存在 | 检查文件路径是否正确 |
228
+ | ValueError | YAML 格式错误(如缩进错误)| 使用 YAML 格式检查工具验证文件 |
229
+ | ValueError | 必填字段缺失(如 project 字段)| 补全缺失的必填字段 |
230
+ | ValueError | 类型错误(如 version 不是整数)| 检查字段类型是否正确 |
231
+ | ValueError | ID 重复(schemas/constraints/regex_nodes)| 检查并移除重复的 ID |
232
+
233
+ :param manifest_path: 清单文件路径,支持字符串或 Path 对象
234
+ :return: ProjectManifest - 验证通过的项目清单对象
235
+ :raises ValueError: 文件不存在或格式校验失败时抛出
236
+
237
+ 示例:
238
+ >>> manifest = load_manifest("./my-project/project.precis.yaml")
239
+ >>> print(manifest.project.name)
240
+ 'My Data Project'
241
+ >>> print(f"Found {len(manifest.schemas)} schemas")
242
+ 'Found 5 schemas'
243
+ """
244
+ # Step 1: 参数标准化 - 将输入转换为 Path 对象,确保统一处理
245
+ path = Path(manifest_path)
246
+
247
+ # Step 2: 文件存在性检查 - 快速失败,避免后续无效的 I/O 操作
248
+ if not path.exists():
249
+ raise ValueError(f"manifest 文件不存在: {manifest_path}")
250
+
251
+ # Step 3: YAML 解析 - 读取原始配置文件内容,返回字典结构
252
+ raw = read_yaml(path)
253
+
254
+ # Step 4: Pydantic 模型验证 - 确保配置符合预期的数据结构
255
+ # 自动执行类型检查、必填字段验证、格式校验等
256
+ try:
257
+ return ProjectManifest.model_validate(raw)
258
+ except Exception as e:
259
+ # Step 5: 异常包装 - 添加文件路径上下文,便于问题定位
260
+ raise ValueError(f"manifest 校验失败: {manifest_path}\n{e}") from e
@@ -0,0 +1,91 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Copyright 2026 Precis Team
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ """
17
+ @fileoverview 项目清单类型统一导出模块
18
+
19
+ 功能概述:
20
+ - 从 types_parts 各子模块聚合导出项目清单相关类型
21
+ - 提供 V2 版本别名(如 ProjectManifestV2)以保持版本兼容
22
+
23
+ 架构设计:
24
+ - 聚合导出模式: 将分散在 types_parts 中的类型集中暴露
25
+ - 版本别名: 通过 ProjectManifestV2 = ProjectManifest 等映射降低上层迁移成本
26
+
27
+ 输入示例:
28
+ from app.shared.core.project.manifest.types import ProjectManifestV2, SchemaRefV2
29
+
30
+ 输出示例:
31
+ manifest = ProjectManifestV2(version=2, project=ProjectInfo(id="demo", name="Demo"))
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ from app.shared.core.project.manifest.types_parts.constants import V2_VERSION
37
+ from app.shared.core.project.manifest.types_parts.data_source import DataSourceRef
38
+ from app.shared.core.project.manifest.types_parts.info import ProjectInfo
39
+ from app.shared.core.project.manifest.types_parts.manifest import ProjectManifest
40
+ from app.shared.core.project.manifest.types_parts.refs import (
41
+ ConstraintRef,
42
+ ManualDataRef,
43
+ RegexRef,
44
+ SchemaRef,
45
+ TransformRef,
46
+ )
47
+ from app.shared.core.project.manifest.types_parts.settings import ProjectSettings
48
+ from app.shared.core.project.manifest.types_parts.settings_file_processing import FileProcessingSettings
49
+ from app.shared.core.project.manifest.types_parts.settings_script_security import ScriptSecuritySettings
50
+ from app.shared.core.project.manifest.types_parts.settings_validation import ValidationSettings
51
+
52
+ ProjectManifestV2 = ProjectManifest
53
+ ProjectInfoV2 = ProjectInfo
54
+ SchemaRefV2 = SchemaRef
55
+ ConstraintRefV2 = ConstraintRef
56
+ RegexNodeRefV2 = RegexRef
57
+ TransformRefV2 = TransformRef
58
+ DataSourceRefV2 = DataSourceRef
59
+ ManualDataRefV2 = ManualDataRef
60
+ ValidationSettingsV2 = ValidationSettings
61
+ FileProcessingSettingsV2 = FileProcessingSettings
62
+ ScriptSecuritySettingsV2 = ScriptSecuritySettings
63
+ ProjectSettingsV2 = ProjectSettings
64
+
65
+ __all__ = [
66
+ "ConstraintRef",
67
+ "ConstraintRefV2",
68
+ "DataSourceRef",
69
+ "DataSourceRefV2",
70
+ "FileProcessingSettings",
71
+ "FileProcessingSettingsV2",
72
+ "ManualDataRef",
73
+ "ManualDataRefV2",
74
+ "ProjectInfo",
75
+ "ProjectInfoV2",
76
+ "ProjectManifest",
77
+ "ProjectManifestV2",
78
+ "ProjectSettings",
79
+ "ProjectSettingsV2",
80
+ "RegexNodeRefV2",
81
+ "RegexRef",
82
+ "SchemaRef",
83
+ "SchemaRefV2",
84
+ "TransformRef",
85
+ "TransformRefV2",
86
+ "ScriptSecuritySettings",
87
+ "ScriptSecuritySettingsV2",
88
+ "V2_VERSION",
89
+ "ValidationSettings",
90
+ "ValidationSettingsV2",
91
+ ]
@@ -0,0 +1,60 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Copyright 2026 Precis Team
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ """
17
+ @fileoverview 项目清单子类型聚合导出模块
18
+
19
+ 功能概述:
20
+ - 集中导出项目清单各组成部分的类型定义
21
+ - 简化上层模块对 types_parts 的导入路径
22
+
23
+ 架构设计:
24
+ - 扁平化导出: 将多层类型统一暴露为一级符号
25
+ - 向后兼容: __all__ 明确控制公开接口
26
+
27
+ 输入示例:
28
+ from app.shared.core.project.manifest.types_parts import ProjectManifest, SchemaRef, ProjectSettings
29
+
30
+ 输出示例:
31
+ manifest = ProjectManifest(version=2, project=ProjectInfo(id="demo", name="Demo"))
32
+ """
33
+
34
+ from app.shared.core.project.manifest.types_parts.constants import V2_VERSION
35
+ from app.shared.core.project.manifest.types_parts.data_source import DataSourceRef
36
+ from app.shared.core.project.manifest.types_parts.info import ProjectInfo
37
+ from app.shared.core.project.manifest.types_parts.manifest import ProjectManifest
38
+ from app.shared.core.project.manifest.types_parts.refs import ConstraintRef, ManualDataRef, RegexRef, SchemaRef
39
+ from app.shared.core.project.manifest.types_parts.settings import ProjectSettings
40
+ from app.shared.core.project.manifest.types_parts.settings_file_processing import FileProcessingSettings
41
+ from app.shared.core.project.manifest.types_parts.settings_script_security import ScriptSecuritySettings
42
+ from app.shared.core.project.manifest.types_parts.settings_validation import ValidationSettings
43
+ from app.shared.core.project.manifest.types_parts.template import TemplateInstanceRef, TemplateRef
44
+
45
+ __all__ = [
46
+ "ConstraintRef",
47
+ "DataSourceRef",
48
+ "FileProcessingSettings",
49
+ "ManualDataRef",
50
+ "ProjectInfo",
51
+ "ProjectManifest",
52
+ "ProjectSettings",
53
+ "RegexRef",
54
+ "SchemaRef",
55
+ "ScriptSecuritySettings",
56
+ "TemplateInstanceRef",
57
+ "TemplateRef",
58
+ "ValidationSettings",
59
+ "V2_VERSION",
60
+ ]
@@ -0,0 +1,40 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Copyright 2026 Precis Team
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ """
17
+ @fileoverview Manifest 常量定义模块
18
+
19
+ 功能概述:
20
+ - 定义 manifest 相关的常量值
21
+ - 当前仅包含版本号常量
22
+ - 未来版本升级时在此添加新常量
23
+
24
+ 架构设计:
25
+ - 版本号: V2_VERSION = 2
26
+ - 集中管理: 所有 manifest 相关常量统一放在此模块
27
+ - 未来版本升级时在此添加新常量
28
+
29
+ 输入示例:
30
+ 从其他模块导入版本号常量
31
+ from app.shared.core.project.manifest.types_parts.constants import V2_VERSION
32
+
33
+ 输出示例:
34
+ print(V2_VERSION) # 输出: 2
35
+ """
36
+
37
+ # 当前支持的 manifest 配置版本号
38
+ # 版本号用于区分不同版本的配置格式,确保兼容性
39
+ # 当配置格式发生重大变更时,需要增加版本号
40
+ V2_VERSION = 2
@@ -0,0 +1,68 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Copyright 2026 Precis Team
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ """
17
+ @fileoverview 数据源配置类型定义模块
18
+
19
+ 功能概述:
20
+ - 定义项目数据源的引用结构
21
+ - 支持多数据源配置,便于扩展
22
+
23
+ 架构设计:
24
+ - DataSourceRef: 单个数据源的引用定义
25
+ - 支持多种路径模式:相对路径、绝对路径
26
+
27
+ 使用场景:
28
+ - 全量校验时,后端根据此配置自动查找数据文件
29
+ - 支持多数据源目录配置
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ from pydantic import BaseModel, Field
35
+
36
+
37
+ class DataSourceRef(BaseModel):
38
+ """@classdesc 数据源引用配置
39
+
40
+ 用于在 manifest.yaml 中定义数据源的位置。
41
+ 支持多种路径模式,方便项目迁移和共享。
42
+
43
+ 字段说明:
44
+ - id: 数据源唯一标识符
45
+ - path: 数据源目录路径
46
+ - mode: 路径模式,'relative' 表示相对于项目目录,'absolute' 表示绝对路径
47
+ - description: 数据源描述(可选)
48
+
49
+ 示例:
50
+ # 相对路径模式(推荐,便于项目迁移)
51
+ data_sources:
52
+ - id: primary
53
+ path: data
54
+ mode: relative
55
+ description: 主数据目录
56
+
57
+ # 绝对路径模式
58
+ data_sources:
59
+ - id: external
60
+ path: /mnt/data/external
61
+ mode: absolute
62
+ description: 外部数据源
63
+ """
64
+
65
+ id: str = Field(..., description="数据源唯一标识符")
66
+ path: str = Field(..., description="数据源目录路径")
67
+ mode: str = Field("relative", description="路径模式: 'relative' 或 'absolute'")
68
+ description: str | None = Field(None, description="数据源描述(可选)")
@@ -0,0 +1,59 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ #
3
+ # Copyright 2026 Precis Team
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ """
17
+ @fileoverview 项目信息类型定义模块
18
+
19
+ 功能概述:
20
+ - 定义项目的基本信息结构
21
+ - 包括项目 ID 和展示名称
22
+
23
+ 架构设计:
24
+ - 轻量级模型: 仅包含必要的基本信息
25
+ - 必需字段: id 和 name 都是必填的
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ from pydantic import BaseModel, Field
31
+
32
+
33
+ class ProjectInfo(BaseModel):
34
+ """@classdesc 项目基本信息
35
+
36
+ 用于在 manifest.yaml 中定义项目的基本信息。
37
+
38
+ 字段说明:
39
+ - id: 项目的稳定标识符,用于系统内部引用(不应改变)
40
+ - name: 项目的展示名称,用于 UI 显示
41
+ - description: 项目描述(可选)
42
+
43
+ 示例:
44
+ # manifest.yaml 中的定义
45
+ project:
46
+ id: user-management
47
+ name: 用户管理系统
48
+ description: 管理公司用户数据
49
+
50
+ # 对应的 Python 对象
51
+ ProjectInfo(id="user-management", name="用户管理系统", description="...")
52
+ """
53
+
54
+ id: str = Field(..., description="项目 ID(稳定标识)")
55
+ name: str = Field(..., description="项目展示名称")
56
+ # 回归: manifest 类型 docstring 的示例一直包含 description,模型却曾缺失该字段——
57
+ # 任何 manifest 重写(PUT manifest/schema/settings 等)都会把用户手写的
58
+ # description 从磁盘上静默抹掉。恢复为可选字段以保全 roundtrip。
59
+ description: str | None = Field(None, description="项目描述(可选)")