labull-framework 1.0.0__tar.gz → 1.0.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.
Files changed (57) hide show
  1. {labull_framework-1.0.0/labull_framework.egg-info → labull_framework-1.0.1}/PKG-INFO +4 -3
  2. {labull_framework-1.0.0 → labull_framework-1.0.1}/README-pypi.md +3 -2
  3. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/env.py +6 -3
  4. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/deepcheck.py +14 -4
  5. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/devkit.py +182 -55
  6. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/export.py +1240 -1214
  7. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/sdk.py +7 -3
  8. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/validate.py +2292 -2042
  9. labull_framework-1.0.1/labull_framework/management/commands/labull_requires.py +193 -0
  10. {labull_framework-1.0.0 → labull_framework-1.0.1/labull_framework.egg-info}/PKG-INFO +4 -3
  11. {labull_framework-1.0.0 → labull_framework-1.0.1}/pyproject.toml +1 -1
  12. labull_framework-1.0.0/labull_framework/management/commands/labull_requires.py +0 -86
  13. {labull_framework-1.0.0 → labull_framework-1.0.1}/LICENSE +0 -0
  14. {labull_framework-1.0.0 → labull_framework-1.0.1}/MANIFEST.in +0 -0
  15. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/__init__.py +0 -0
  16. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/admin.py +0 -0
  17. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/apps.py +0 -0
  18. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/auth/__init__.py +0 -0
  19. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/auth/backend.py +0 -0
  20. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/auth/bootstrap.py +0 -0
  21. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/auth/sso.py +0 -0
  22. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/auth/views.py +0 -0
  23. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/__init__.py +0 -0
  24. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/data.py +0 -0
  25. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/gitinfo.py +0 -0
  26. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/shape_ast.py +0 -0
  27. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/static/canvas.css +0 -0
  28. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/static/canvas.js +0 -0
  29. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/static/page.html +0 -0
  30. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/canvas/views.py +0 -0
  31. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/jsonio.py +0 -0
  32. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/__init__.py +0 -0
  33. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/blockpackage.py +0 -0
  34. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/dispatch.py +0 -0
  35. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/health.py +0 -0
  36. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/parallel.py +0 -0
  37. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/registry.py +0 -0
  38. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/service.py +0 -0
  39. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/subproc.py +0 -0
  40. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/magic_block/views.py +0 -0
  41. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/management/__init__.py +0 -0
  42. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/management/commands/__init__.py +0 -0
  43. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/management/commands/labull_contract.py +0 -0
  44. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/migrations/0001_initial.py +0 -0
  45. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/migrations/0002_remove_magicblock_prev_files_and_more.py +0 -0
  46. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/migrations/0003_magicblock_tags.py +0 -0
  47. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/migrations/0004_magicblock_detail.py +0 -0
  48. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/migrations/__init__.py +0 -0
  49. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/models.py +0 -0
  50. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/settings.py +0 -0
  51. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/urls.py +0 -0
  52. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework/virtual.py +0 -0
  53. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework.egg-info/SOURCES.txt +0 -0
  54. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework.egg-info/dependency_links.txt +0 -0
  55. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework.egg-info/requires.txt +0 -0
  56. {labull_framework-1.0.0 → labull_framework-1.0.1}/labull_framework.egg-info/top_level.txt +0 -0
  57. {labull_framework-1.0.0 → labull_framework-1.0.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labull-framework
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Labull Framework: a pluggable Django app with Authing OIDC login and magic blocks
5
5
  Author: Labull Framework
6
6
  License-Expression: MIT
@@ -95,7 +95,7 @@ CORS_ORIGIN=http://localhost:5173
95
95
  |---|---|
96
96
  | **谁是管理员** | 配 `BOOTSTRAP_ADMIN_WORK_IDS=工号,工号` —— 它是**声明式**的名单:启动时名单里的人补上 `is_staff`,**名单之外的一律清掉**(没配就是"一个管理员都没有")。它不碰 `is_superuser`,所以别拿超管当后门 |
97
97
  | **看数据模型那一页** | 设 `LABULL_SCHEMA_CANVAS=on`,浏览器打开 `/` |
98
- | **让块的依赖声明拦住保存** | 设 `LABULL_REQUIRES=error`(默认 `warn`:判据照跑、**只提示不拦保存**;`off` 整段不跑) |
98
+ | **块的依赖声明不许"用了却没声明"** | 它是**默认**行为(`LABULL_REQUIRES=error`,1.0.1 起):代码里用了没声明的东西 ⇒ 拦住保存。⚠️ 升级前先在项目里跑一遍 `python manage.py labull_requires --write` 把存量块扫得到的声明补进库;`warn`(只提示不拦)与 `off`(整段不跑)都要**显式**写 |
99
99
  | **导出一份模型形状** | `python manage.py labull_contract --out .labull/contract.json` |
100
100
 
101
101
  ## magic block
@@ -107,7 +107,8 @@ CORS_ORIGIN=http://localhost:5173
107
107
  ├─ index.open.html 入口(必备)
108
108
  ├─ magic-block.open.yaml 清单(必备):`id` / `module` / `name` / `brief` 四个键必填
109
109
  │ + `requires`(依赖声明:用了哪些模型 / pip 包 / settings 键 / `BLOCK_*`)可选
110
- ├─ README.open.md **业务功能说明**(Markdown,可选):这一段的家就是这份文件,不在清单里
110
+ ├─ README.open.md **业务功能说明**(Markdown):这一段的家就是这份文件,不在清单里
111
+ │ (**每个块都会有一份** —— 导出时无条件铺,没写就是空文件)
111
112
  ├─ requires.open.yaml 依赖声明的**草稿**(导出铺下来的:正文进清单的 `requires`,注释是扫代码的建议)
112
113
  ├─ 任意 js / css
113
114
  ├─ excluded/_* 你自己的地盘(测试 / 草稿):**照样进库,执行时忽略**
@@ -67,7 +67,7 @@ CORS_ORIGIN=http://localhost:5173
67
67
  |---|---|
68
68
  | **谁是管理员** | 配 `BOOTSTRAP_ADMIN_WORK_IDS=工号,工号` —— 它是**声明式**的名单:启动时名单里的人补上 `is_staff`,**名单之外的一律清掉**(没配就是"一个管理员都没有")。它不碰 `is_superuser`,所以别拿超管当后门 |
69
69
  | **看数据模型那一页** | 设 `LABULL_SCHEMA_CANVAS=on`,浏览器打开 `/` |
70
- | **让块的依赖声明拦住保存** | 设 `LABULL_REQUIRES=error`(默认 `warn`:判据照跑、**只提示不拦保存**;`off` 整段不跑) |
70
+ | **块的依赖声明不许"用了却没声明"** | 它是**默认**行为(`LABULL_REQUIRES=error`,1.0.1 起):代码里用了没声明的东西 ⇒ 拦住保存。⚠️ 升级前先在项目里跑一遍 `python manage.py labull_requires --write` 把存量块扫得到的声明补进库;`warn`(只提示不拦)与 `off`(整段不跑)都要**显式**写 |
71
71
  | **导出一份模型形状** | `python manage.py labull_contract --out .labull/contract.json` |
72
72
 
73
73
  ## magic block
@@ -79,7 +79,8 @@ CORS_ORIGIN=http://localhost:5173
79
79
  ├─ index.open.html 入口(必备)
80
80
  ├─ magic-block.open.yaml 清单(必备):`id` / `module` / `name` / `brief` 四个键必填
81
81
  │ + `requires`(依赖声明:用了哪些模型 / pip 包 / settings 键 / `BLOCK_*`)可选
82
- ├─ README.open.md **业务功能说明**(Markdown,可选):这一段的家就是这份文件,不在清单里
82
+ ├─ README.open.md **业务功能说明**(Markdown):这一段的家就是这份文件,不在清单里
83
+ │ (**每个块都会有一份** —— 导出时无条件铺,没写就是空文件)
83
84
  ├─ requires.open.yaml 依赖声明的**草稿**(导出铺下来的:正文进清单的 `requires`,注释是扫代码的建议)
84
85
  ├─ 任意 js / css
85
86
  ├─ excluded/_* 你自己的地盘(测试 / 草稿):**照样进库,执行时忽略**
@@ -201,11 +201,14 @@ ENV_ITEMS: tuple[EnvItem, ...] = (
201
201
  group='平台开关',
202
202
  ),
203
203
  # 🔴 依赖声明(`requires`)那一层的开关(名字的真源在 `magic_block/sdk.py`):
204
- # 默认 `warn` —— 存量块的清单里一个声明都没有,一上线就硬报错等于让每个块集体停用。
204
+ # 默认 `error`(1.0.1 起)—— "先警告、后强制"里的**后强制**已经落地了。
205
+ # ⚠️ 代价如实说:库里那些**还没声明**的存量块会集体判不合格(全部停用),
206
+ # 所以升级前先用 `manage.py labull_requires --write` 把扫得到的声明批量补进库
207
+ # (那条命令就是为这个默认值而存在的:它是这条路上唯一的恢复口)。
205
208
  EnvItem(
206
209
  name=BLOCK_REQUIRES,
207
- brief='块「依赖声明」(requires)那一层的开关:off 整段不跑 / warn(默认)只提示不拦 / error 变成硬判据',
208
- hint=f'{BLOCK_REQUIRES}=error',
210
+ brief='块「依赖声明」(requires)那一层的开关:off 整段不跑 / warn 只提示不拦(要显式写)/ error(默认)变成硬判据',
211
+ hint=f'{BLOCK_REQUIRES}=warn',
209
212
  group='平台开关',
210
213
  ),
211
214
  # 🔴 体检那条链一次开几个口子(名字的真源在 `magic_block/parallel.py` 的 `ENV_WORKERS`)。
@@ -509,6 +509,9 @@ def _any_probe_note():
509
509
  # 走,所以不额外起进程;`LABULL_REQUIRES=off` 时父进程根本不递(整段不跑)。
510
510
  # 🔴 **"代码用了却没声明"不在这里**(那一半是纯 `ast`,落在 `validate.check_requires`):
511
511
  # 两半分开放,是因为这一半要运行环境、那一半不要 —— 混在一起会让"没 Django 时连静态判据都没跑"。
512
+ # 🔴 **分档不在这里**(`warn` / `error` 是父进程的事,而 `LABULL_REQUIRES` 的默认档
513
+ # 1.0.1 起是 `error`;`warn` 要显式写):这一层只报"事实",落位由 `_requires_check()` 按
514
+ # 父进程递进来的 `mode` 做 —— 分档只有一处判据(`validate.requires_mode()`),两处各判一次迟早漂。
512
515
 
513
516
  _REQUIRES = _GIVEN.get('requires') if isinstance(_GIVEN.get('requires'), dict) else None
514
517
 
@@ -589,8 +592,8 @@ def _model_of(path):
589
592
  def _requires_hard():
590
593
  """"声明了但它不存在"的逐条报文(**确定**的那一档)。
591
594
 
592
- ⚠️ 这里**不分档**(`warn` / `error` 是父进程的事):这一层只报"事实",
593
- 分档只有一处判据(`validate.requires_mode()`),两处各判一次迟早漂。
595
+ ⚠️ 这里**不分档**(`warn` / `error` 是父进程的事,默认档见 `validate.requires_mode()`):
596
+ 这一层只报"事实",而分档只有一处判据,两处各判一次迟早漂。
594
597
  """
595
598
  import importlib
596
599
  from importlib import metadata
@@ -659,9 +662,11 @@ def _requires_hard():
659
662
 
660
663
 
661
664
  def _requires_check():
662
- """跑一遍依赖声明的"存不存在",并按开关落位(`warn` ⇒ 只进备注)。
665
+ """跑一遍依赖声明的"存不存在",并按开关落位(`error` ⇒ 硬判据;`warn` ⇒ 只进备注)。
663
666
 
664
667
  ⚠️ 判据自己崩了**不算这个块的错**(软失败口径见文件头):只记一句说明。
668
+ ⚠️ 兜底值与 `validate.requires_mode()` 的默认档**必须同一个**(1.0.1 起是 `error`):
669
+ 写 `warn` 的话,一份没有 `mode` 键的 payload 会悄悄退回 1.0.0 的旧行为。
665
670
  """
666
671
  if not _REQUIRES:
667
672
  return
@@ -673,7 +678,7 @@ def _requires_check():
673
678
  return
674
679
  if not hard:
675
680
  return
676
- if str(_REQUIRES.get('mode') or 'warn') == 'error':
681
+ if str(_REQUIRES.get('mode') or 'error') == 'error':
677
682
  for message in hard:
678
683
  _STATIC.append(_issue('requires', message))
679
684
  return
@@ -809,6 +814,11 @@ def _value_model(node, imports):
809
814
  model = _manager_of(func.value)
810
815
  if model is None and isinstance(func.value, ast.Call):
811
816
  model = _value_model(func.value, imports) # 链子的里层必须自己也是"查这批 / 查一行"
817
+ # 🔴 这一行与 `validate._manager_model()` 是**同一个口径**(那一份也是"一个循环同时剥
818
+ # `Call` 与 `Attribute`、中间夹着 Call 也照样往左走")。两处**必须一起改** ——
819
+ # 一份真源做不到:那边是 `%` 拼出来的子进程模板字符串,这边是普通函数。
820
+ # 只改一边的症状:`surface` 草稿与深检对同一个模型各说一套(用户截图报的漏建议
821
+ # `StockTransaction.log_event` 就是 `_manager_model` 那一侧停了、这一侧没停)。
812
822
  if model is None:
813
823
  return None
814
824
  # 🔴 "查一批"也算(`for row in OrderRow.objects.all()` 里的 iter 就是这一句):