feat: 支持 v2 插件、独立前端和签名制品发布 (#130)

* feat: 支持 v2 插件、原生扩展与签名发布

* fix: 修复测试

* feat: 增强宿主 SDK、运行观测与制品维护能力

* feat: 增强文件传输、配置观测与本地开发能力

* feat: 支持 SSE 实时事件流并完善开发脚手架

* feat: 完善长连接鉴权复核与关闭回收

* feat: 增强生命周期与任务关闭可靠性

* feat: 收紧健康检查契约并补齐前端与真实网络验收

* feat: 增加SDK溯源与离线更新工具并验证跨版本兼容

* feat: 增加持久化业务示例与受控 Python 交付

* feat: 增加统一运行诊断与多worker状态观测

* feat: 增加固定目标发布等待与自动验收

* fix: 修复多环境插件部署前缀与代理配置不一致

* fix: 修复测试
This commit is contained in:
insistence
2026-10-09 23:49:45 +08:00
committed by GitHub
parent a89aec54aa
commit 4bd83bc7cd
287 changed files with 41945 additions and 331 deletions
@@ -0,0 +1,55 @@
import re
from pathlib import Path
import pytest
from sqlalchemy import CheckConstraint
from sqlalchemy.dialects import mysql, postgresql
from sqlalchemy.schema import CreateTable
from plugins.core.lifecycle.script import PluginLifecycleScriptHelper
from plugins.core.management.entity.do.release_models import SysPluginArtifact, SysPluginRelease, SysPluginWorker
SQL_ROOT = Path(__file__).resolve().parents[2] / 'sql'
@pytest.mark.parametrize(
('initial', 'time_type'),
[
('ruoyi-fastapi.sql', 'datetime(3)'),
('ruoyi-fastapi-pg.sql', 'timestamp(3) with time zone'),
],
)
def test_initial_release_schema_matches_models(initial: str, time_type: str) -> None:
initialization = (SQL_ROOT / initial).read_text(encoding='utf-8')
statements = PluginLifecycleScriptHelper.split_sql_statements(initialization)
for table in (SysPluginArtifact.__table__, SysPluginRelease.__table__, SysPluginWorker.__table__):
table_statements = [
statement
for statement in statements
if re.match(rf'CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS\s+{table.name}\s*\(', statement, re.IGNORECASE)
]
assert len(table_statements) == 1
ddl = table_statements[0].lower()
normalized_ddl = ' '.join(ddl.split())
assert time_type in ddl
for column in table.columns:
assert re.search(rf'^\s*{column.name}\s+\w+', ddl, re.MULTILINE)
primary_keys = ', '.join(column.name for column in table.primary_key.columns)
assert f'primary key ({primary_keys})' in normalized_ddl
for constraint in table.constraints:
if isinstance(constraint, CheckConstraint):
assert f'constraint {constraint.name} check ({constraint.sqltext})' in normalized_ddl
for index in table.indexes:
columns = ', '.join(column.name for column in index.columns)
if initial == 'ruoyi-fastapi-pg.sql':
assert f'create index if not exists {index.name} on {table.name} ({columns})' in statements
else:
assert f'key {index.name} ({columns})' in normalized_ddl
@pytest.mark.parametrize('dialect', [mysql.dialect(), postgresql.dialect()])
def test_release_orm_schema_compiles_for_supported_database_dialects(dialect: object) -> None:
for model in (SysPluginArtifact, SysPluginRelease, SysPluginWorker):
ddl = str(CreateTable(model.__table__).compile(dialect=dialect))
assert model.__tablename__ in ddl
assert 'PRIMARY KEY' in ddl