feat: bgRFC/FM 支撑能力 + ADT 后缀剥离与 CLAS 激活修复(B1 配套)
新增能力: - remote-enable 子命令:设置函数模块处理类型为远程启用(bgRFC/RFC 执行体必需)。 实现要点均按实机验证:PUT fmodule:processingType="rfc"(枚举值仅小写 rfc 有效, remoteEnabled/remote/RFC 等均 400);lockHandle 走 query 参数(放 header 报 ParameterNotFound);PUT 后 GET 复核回显;DDIC 结构参数才可远程启用(类本地类型 报"针对 RFC 不允许使用类或接口的类型")。 - create --type functiongroup 透传 --package / --corr_nr(此前 package 被静默写成 $TMP, 导致函数组无法归目标包)。 修复: - activate 请求体补重复引用:ADT CLAS 激活端点对 objectReferences 只有 1 个引用时 返回 HTTP 200 + 空 body 且不执行激活;引用数 ≥2 才真正激活(同对象重复亦可)。 - scanner 剥离 ADT 文件后缀(xxx.clas.abap 解析错误)。 守卫测试: - tests/unit/test_bgrfc_support.py(17 例):函数组 package 透传、processingType 助手、 remote-enable 命令(含 lockHandle 走 query/小写 rfc/错误透传/复核失配判失败)、 函数 URI 组装不得用组名冒充模块名。 - test_activate.py 增加激活请求体引用数守卫;test_repo_guards.py 增加后缀剥离守卫。 测试:tests/unit 676 + tests/test_sapcli.py 69 = 745 全绿 (PYTHONPATH=assets python -m unittest discover -s tests/unit -t tests)
This commit is contained in:
@@ -79,6 +79,43 @@ SRC_DIR = "src"
|
||||
# ADT 式函数模块文件名分隔符:<fugr>.fugr.<fm>.abap
|
||||
FUNC_ADT_SEP = ".fugr."
|
||||
|
||||
# ADT/abapGit 风格的**对象类型后缀**(`<name>.<suffix>.abap`)。
|
||||
# 来源:ADT 链接格式与 abapGit 序列化——项目仓命名规范(如 ABAP_Integrated
|
||||
# 《命名规范》§4)即按此写文件名,故扫描器必须剥掉后缀才能得到对象名。
|
||||
# 仅剥与所在目录 obj_type 匹配的那一个后缀,避免误伤含点的对象名。
|
||||
ADT_TYPE_SUFFIX: dict[str, str] = {
|
||||
"class": "clas",
|
||||
"interface": "intf",
|
||||
"report": "prog",
|
||||
"domain": "doma",
|
||||
"dataelement": "dtel",
|
||||
"table": "tabl",
|
||||
"structure": "stru",
|
||||
"tabletype": "ttyp",
|
||||
"include": "cinc",
|
||||
"cdsview": "ddls",
|
||||
"messageclass": "msag",
|
||||
"searchhelp": "shlp",
|
||||
"lockobject": "enqu",
|
||||
"dcl": "dcls",
|
||||
"ddlX": "ddlx",
|
||||
}
|
||||
|
||||
|
||||
def _strip_adt_suffix(base: str, obj_type: str) -> str:
|
||||
"""剥掉 ADT 类型后缀(`zcl_demo.clas` → `zcl_demo`)。
|
||||
|
||||
只在该类型有约定后缀、且文件名确实以 `.<该后缀>` 结尾时剥,
|
||||
其余情况原样返回(含点的对象名不受影响)。
|
||||
"""
|
||||
suffix = ADT_TYPE_SUFFIX.get(obj_type)
|
||||
if not suffix:
|
||||
return base
|
||||
tail = "." + suffix
|
||||
if base.lower().endswith(tail) and len(base) > len(tail):
|
||||
return base[: -len(tail)]
|
||||
return base
|
||||
|
||||
|
||||
@dataclass
|
||||
class ScannedObject:
|
||||
@@ -176,7 +213,7 @@ def _scan_flat_directory(
|
||||
if not os.path.isfile(os.path.join(dir_path, filename)):
|
||||
continue
|
||||
|
||||
obj_name = filename[:-5].upper() # 去掉 .abap,转大写
|
||||
obj_name = _strip_adt_suffix(filename[:-5], obj_type).upper() # 去 .abap + ADT 类型后缀
|
||||
_add(results, seen, obj_name, obj_type, _rel(rel_prefix, dir_name, filename))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user