chore: sync skill to v2.2.1
- NW 7.40 E2E-verified compatibility matrix in SKILL.md - DDIC fixes: include namespace, tabletype exists check, DDIC delete lock Accept - New commands: clone, enhancement, history, unit-test - 665 tests, 96% coverage
This commit is contained in:
+42
-3
@@ -14,6 +14,10 @@ class ObjectTypeConfig:
|
||||
collection_uri: str
|
||||
create_content_type: str
|
||||
has_source: bool = True
|
||||
# 存在性检查专用端点模板;为 None 时回退到 obj_uri_template。
|
||||
# 个别类型(如 tabletype)的 obj_uri 是 VIT 端点,对任意名称都返回 200,
|
||||
# 无法区分存在/不存在,因此存在性检查需走标准 DDIC 端点。
|
||||
exists_uri_template: str | None = None
|
||||
|
||||
def format_obj_uri(self, name: str, **kwargs: str) -> str:
|
||||
return self.obj_uri_template.format(name=name, **kwargs)
|
||||
@@ -23,6 +27,11 @@ class ObjectTypeConfig:
|
||||
return None
|
||||
return self.src_uri_template.format(name=name, **kwargs)
|
||||
|
||||
def format_exists_uri(self, name: str, **kwargs: str) -> str:
|
||||
"""格式化存在性检查端点。无专用模板时回退到 obj_uri_template。"""
|
||||
template = self.exists_uri_template or self.obj_uri_template
|
||||
return template.format(name=name, **kwargs)
|
||||
|
||||
def format_collection_uri(self, **kwargs: str) -> str:
|
||||
return self.collection_uri.format(**kwargs)
|
||||
|
||||
@@ -125,6 +134,8 @@ TABLETYPE = _register(ObjectTypeConfig(
|
||||
collection_uri="/sap/bc/adt/ddic/tabletypes",
|
||||
create_content_type="application/vnd.sap.adt.ddic.tabletypes.v1+xml",
|
||||
has_source=False,
|
||||
# VIT obj_uri 对任意名称都返回 200,存在性检查必须走 DDIC 端点
|
||||
exists_uri_template="/sap/bc/adt/ddic/tabletypes/{name}",
|
||||
))
|
||||
|
||||
INCLUDE = _register(ObjectTypeConfig(
|
||||
@@ -139,9 +150,30 @@ INCLUDE = _register(ObjectTypeConfig(
|
||||
CDSVIEW = _register(ObjectTypeConfig(
|
||||
key="cdsview",
|
||||
label="CDS视图(CDS VIEW)",
|
||||
obj_uri_template="/sap/bc/adt/dds/ddl/sources/{name}",
|
||||
src_uri_template="/sap/bc/adt/dds/ddl/sources/{name}/content",
|
||||
collection_uri="/sap/bc/adt/dds/ddl/sources",
|
||||
# 与 commands/cds.py 和 client/_ddic.py 保持一致:/ddic/ddlsources(NW 7.40 验证可用)
|
||||
obj_uri_template="/sap/bc/adt/ddic/ddlsources/{name}",
|
||||
src_uri_template="/sap/bc/adt/ddic/ddlsources/{name}/source/main",
|
||||
collection_uri="/sap/bc/adt/ddic/ddlsources",
|
||||
create_content_type="text/plain",
|
||||
))
|
||||
|
||||
DCL = _register(ObjectTypeConfig(
|
||||
key="dcl",
|
||||
label="访问控制(DCL)",
|
||||
# CDS Access Control,端点 /ddic/dclsources(参考 docs/dev/adt-endpoint-reference.md)
|
||||
obj_uri_template="/sap/bc/adt/ddic/dclsources/{name}",
|
||||
src_uri_template="/sap/bc/adt/ddic/dclsources/{name}/source/main",
|
||||
collection_uri="/sap/bc/adt/ddic/dclsources",
|
||||
create_content_type="text/plain",
|
||||
))
|
||||
|
||||
DDLX = _register(ObjectTypeConfig(
|
||||
key="ddlX",
|
||||
label="元数据扩展(DDLX)",
|
||||
# Metadata Extension,端点 /ddic/metadataextensions(参考 docs/dev/adt-endpoint-reference.md)
|
||||
obj_uri_template="/sap/bc/adt/ddic/metadataextensions/{name}",
|
||||
src_uri_template="/sap/bc/adt/ddic/metadataextensions/{name}/source/main",
|
||||
collection_uri="/sap/bc/adt/ddic/metadataextensions",
|
||||
create_content_type="text/plain",
|
||||
))
|
||||
|
||||
@@ -201,6 +233,9 @@ class ParsedName:
|
||||
src_uri: str | None
|
||||
display_name: str
|
||||
file_base: str
|
||||
# 存在性检查专用端点;默认与 obj_uri 相同。tabletype 等类型的 obj_uri
|
||||
# 不能用于存在性检查,需走标准 DDIC 端点。
|
||||
exists_uri: str = ""
|
||||
|
||||
|
||||
def parse_object_name(name: str, obj_type: str) -> ParsedName:
|
||||
@@ -221,9 +256,11 @@ def parse_object_name(name: str, obj_type: str) -> ParsedName:
|
||||
src_uri=cfg.format_src_uri(fm.lower(), group=group.lower()),
|
||||
display_name=name,
|
||||
file_base=fm.lower(),
|
||||
exists_uri=cfg.format_exists_uri(fm.lower(), group=group.lower()),
|
||||
)
|
||||
|
||||
# VIT 端点需要大写名称以返回完整元数据;去掉前导 /
|
||||
# 但 VIT 对存在性检查无效(任意名称都返回 200),exists_uri 走 DDIC 端点(小写名)
|
||||
if obj_type == "tabletype":
|
||||
clean = name.lstrip("/")
|
||||
name_upper = clean.upper()
|
||||
@@ -232,6 +269,7 @@ def parse_object_name(name: str, obj_type: str) -> ParsedName:
|
||||
src_uri=cfg.format_src_uri(name_upper),
|
||||
display_name=clean,
|
||||
file_base=clean.lower(),
|
||||
exists_uri=cfg.format_exists_uri(clean.lower()),
|
||||
)
|
||||
|
||||
name_lower = name.lower()
|
||||
@@ -240,4 +278,5 @@ def parse_object_name(name: str, obj_type: str) -> ParsedName:
|
||||
src_uri=cfg.format_src_uri(name_lower),
|
||||
display_name=name,
|
||||
file_base=name_lower,
|
||||
exists_uri=cfg.format_exists_uri(name_lower),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user