@mcp-abap-adt / adt-strategies
自从adt-clients 36.0.0 下面每个电话都打给32个成员之一 采取
options.headers(create,update,updateMetadata,delete,checkDeletion,check,activate其他的列在 请求自己的标头)传递请求自己的Accept/Content-Type对。 在这些样本中headers代表那一对,anIAdtHeaders({ accept, contentType });成员准确地发送它。
的阅读和结论 @mcp-abap-adt/adt-clients:
一个ADT的答案变成了什么,以及它是否是一个失败-来自记录
ADT的答案。
为什么这是一个单独的包
adt-clients 解释 没有什么. 每个成员提出一个ADT请求
响应SAP发送的文档,除非您使用
阅读;它不评判任何东西,除非你通过 analyse 有了电话。这是
深思熟虑:你想要文件的哪一部分,以及答案是否为
失败,取决于你接触的对象类型和你在做什么
适合你的图书馆可能不适合别人。
这给那些还没有意见的人留下了很大的空白。这个包裹装满了
它有一个观点,作为一个整体陈述,建立在证据而不是品味的基础上。
自 adt-clients 23.0.0它持有 每一个 阅读和裁决,图书馆
用于单独应用:传输树,搜索命中,版本提要,
单元测试运行id, abapGit存储库,ATC和分析器形状,
包删除和发布判决。 迁移- 23. - md
将每个旧行为映射到替代它的策略。
两个轴,两个力矩。 一、 结果 当你建立一个
实现-结果集中每个成员一个槽 adt-clients 出口
对于它(transportDocuments, utilDocuments,……)。一个 错误 给出了策略
随着每一次呼唤,as options.analyse:
import { transportDocuments } from '@mcp-abap-adt/adt-clients';
import {
analyseDeletion,
transportSearchConfigurations,
transportTree,
} from '@mcp-abap-adt/adt-strategies';
const requests = client.getRequest({
...transportDocuments,
list: transportTree,
searchConfigurations: transportSearchConfigurations,
});
await client.getPackage().delete({ packageName: 'ZPKG' }, { headers, analyse: analyseDeletion });
import { analyseActivation, asItCame } from '@mcp-abap-adt/adt-strategies';
const answer = await client
.getClass()
.activate({ className: 'ZCL_X' }, { headers, analyse: analyseActivation });
if (!answer.ok) {
for (const message of answer.getError().messages) {
console.error(`[${message.type}] ${message.text}`);
}
}
为什么不能是一个规则
ADT没有单一的说不的方式。从录音中
corpus/adt/ (answers/ 和 debugger/)在此存储库的adt-clients目录下:
| “没有” | 到达, | 形状 |
|---|---|---|
| 激活没有发生 | 200 | <chkl:messages> 与 <msg type="E"> |
| 对象从未被检查过 | 200 | chkrun:status="notProcessed" |
| 检查发现一个错误 | 200 | <chkrun:checkMessage type="E"> |
| 删除被拒绝了 | 200 | del:isDeleted="false" |
| 该对象不能被删除 | 200 | del:isDeletable="false" |
| 取名称(DDL,功能组) | 200 | <SEVERITY>ERROR</SEVERITY> |
| 取名称(类、域、表) | 400 | <exc:exception> |
| 锁定,缺席,未锁定写 | 403 / 404 / 423 | <exc:exception> |
一起读最后三行。问一个端点家庭的问题, 根据对象类型有两种回答方式。一项与地位密切相关的规则 沉默地错过第一个,并报告一个已取的名字为空闲。
里面有什么?
误差轴。 每个文档表单都有一个策略
analyseActivation, analyseCheck, analyseDeletion, analyseValidation,
analyseUnitTest, analyseException, analysePublication,
analyseCdsTestDoubles - - - - - - analyseAny,它在根元素上进行分派
当表格事先不知道,并且为一个问题构建了五个:
analyseMessageClassMessage(msgno), analyseObjectProperties, analyseUnitTestStart,
analysePublicationLock, analyseDebuggeeEnd, analyseDebuggerFreed 和
analyseUnsupportedStatus(statuses, what).
每个人回答一个。 IAdtMessageFailure:合同的 IAdtError 加上每
文档中的消息,已规范化。SAP以三种方式表达了其严重性,并进行了传播
一个T100键正好在其中一个表单中;读数会使来电者变平
匹配 type === 'E' 不需要知道他们用的是哪艘航母。
为什么一项战略会这么说
其中有几个问题的存在是因为SAP解决了一些问题,而不是它的意思
一个 403 要忽略的服务绑定的LOCK
(analysePublicationLock),内心的拒绝 200 (analysePublication,
analyseActivation, analyseDeletion). 为什么 analysePublicationLock Exists是in
ERRATA.md -在这个包裹中发货,并保存在广告客户在
文档/使用/ ERRATA.md.
整个表面
| 出口 | 它是什么? |
|---|---|
analyseActivation | <chkl:messages> ——一个 <msg type="E"> 是判决, activationExecuted="false" 不是 |
analyseCheck | <chkrun:checkRunReports> -首先是状态,然后是消息 |
analyseDeletion | del:isDeleted 和 del:isDeletable 在一个 200, 每一个 del:message,每个都有其严重性,T100键从其长文本链接中读取 |
analyseValidation | 姓名受理:二家答一身,三家答一身份 |
analyseUnitTest | aunit:runResult -对失败的方法发出警告 |
analyseException | <exc:exception>无论它到达哪里 |
analysePublication | 服务绑定的发布任务: <SEVERITY> 在一个 200 |
analysePublicationLock | 在发布或取消发布之前,服务绑定的LOCK 403 (编辑器持有绑定)没有失败,锁返回时没有句柄;每一次拒绝 analyseException. 打电话的人想要 403 阻止他们通过 analyseException 而不是 |
analyseDebuggeeEnd | ABAP调试步骤或终止; 500 AdiFailed 子类型 debuggeeEnded 或者 terminateDebuggee 被调试进程是否按要求结束,没有失败-结果是命名子类型的文档;每一次拒绝 analyseException |
analyseDebuggerFreed | terminateDebugger:一个 500 担任 text/plain 或者使用空体,没有ADT异常文档,调试器释放自己的会话,没有失败;其他一切(a) 500 与异常文档(或充当其他任何东西,其他状态,连接失败,不是字符串的主体)一样 analyseException |
analyseCdsTestDoubles | CDS测试——双重检查 |
analyseMessageClassMessage(msgno) | 类回答不是存在的消息:没有消息的类文档和根本不是消息类文档(空,不是XML,是另一个文档)的回答将被拒绝 ADT_OBJECT_NOT_FOUND (从0.14.0第二个也是) |
analyseObjectProperties | 一个 200 从 getUtils().getObjectProperties 被描述的对象不是一个否定的答案吗 opr:objectProperties 文档控股 opr:object (空的,不是XML,是另一个文档,如登录页面)被拒绝 ADT_OBJECT_NOT_FOUND (因为0.15.0) |
analyseUnitTestStart | 已启动的运行,其答案不包含运行id |
analyseUnsupportedStatus(statuses, what) | 重命名一个 404/405/501……为 UNSUPPORTED_OPERATION -一个没有资源的系统,与拒绝分开 |
analyseAny | 在事先不知道表单的情况下,对根元素进行分派 |
readActivationRefusal, readCheckRunRefusal, readDeletionRefusal, readValidationRefusal, readUnitTestRefusal, readExceptionRefusal, readPublicationRefusal, readCdsTestDoublesRefusal, readMessageClassMessageAbsence, readObjectPropertiesAbsence, readAdtRefusal | 下面的读数-纯函数在一个文件上,回答 AdtRefusal 或者 null |
readExceptionSubType | 子类型为 exc:exception 名称(com.sap.adt.communicationFramework.subType),或 undefined |
isIndeterminateWalkAnswer | 表示无法读取空节点结构:空包和不存在的包回答相同 |
AdtMessage, AdtRefusal, IAdtMessageFailure | 这些产生的形状 |
结果轴 -每一个 IResultStrategy 对于an的一个槽 adt-clients
结果集:
| 出口 | 它填充槽 | 答案 |
|---|---|---|
asItCame, rawOf | 任何 | 答案不变; answer.data 作为文本 |
transportTree, transportCreated, transportSearchConfigurations, transportObjectEntries | getRequest: list; created/createdTask; searchConfigurations; objects | ITransportTree, ICreatedTransport, ITransportSearchConfiguration[], ITransportObjectEntry[] |
objectVersions | 任何版本类型: versions | IObjectVersion[] |
unitTestRunId | AdtExecutor.getClassTestRunner: run | 运行id,从标题ADT放入 |
featureToggleRuntimeState, featureToggleCheckState | getFeatureToggle: runtimeState, checkState | 两个州 |
utilSearchHits, utilNamedItems, utilNodeContents, utilInactiveObjects, utilActivationRunId, utilWhereUsedReferences | getUtils: search, types, node, inactive, activation, whereUsed | 解析形状; readSearchHits, readNamedItems, readNodeStructure, extractRunId 下面是纯函数吗 |
abapGitRepos, abapGitErrorLog, abapGitExternalRepo | AdtAbapGitClient: repos, errorLog, externalRepo | IAbapGitRepo[] (与 repositoryId, pullLink, logLink)、日志条目、分支 |
atcSystemCheckVariant, atcWorklistId, atcStartedRun, atcWaitingRun, atcRunStatus | getAtc: checkVariant, worklist, startedRun, waitingRun, runStatus | 变体,工作列表id,运行 |
profilerTraceEntries, profilerHitList, profilerStatements, profilerDbAccesses, compareRecordedAt | getProfiler: list, hitlist, statements, dbAccesses | 跟踪条目和三个视图;按记录的时间排序 |
traceSchedulingTypes, traceSchedulingRequests, traceSchedulingProfilerId | 执行者: types, requests, scheduled | 目录,请求,侧写员的身份 |
feedDescriptors, feedVariants, feedEntries, feedSystemMessages, feedGatewayErrors, feedGatewayErrorDetail | getFeeds | 原子饲料,收到 |
从答案中读出的代码是an IAdtAnsweredObject (因为0.16.0)。这个
从答案中获取类型代码的读数 readSearchHits /
utilSearchHits, readNodeStructure / utilNodeContents,
utilInactiveObjects, utilWhereUsedReferences 还有跟踪读数程序
的ADT类型表查找一次
@mcp-abap-adt/interfaces-adt (每一种变体:答案不说明是哪一种
释放发送它)和回答 { type: AdtTypeCode } 对于一个代码,一个表保存,
{ unknownType: string } -文本与ADT发送的完全一样-对于任何其他。
answeredObject(text) 对于读取代码本身的消费者来说,这是查找吗?
import { answeredObject } from '@mcp-abap-adt/adt-strategies';
const object = answeredObject('CLAS/OC');
if (object.type !== undefined) {
// a code of the tables: act on it
} else {
console.warn(`not a code the library serves: ${object.unknownType}`);
}
在表单已知的地方使用命名策略。 analyseAny 答案 null
对于一个它不能识别的文件 null 这里的意思是“不失败”——所以
一个没有人写过阅读材料的表格被认为是成功的。
A阅读答案 null 两种不同的东西:非文本的文件
拒绝,和一份文件的形式不是它写的。一个需要的来电者
区分调用特定的读取而不是调度程序。
所有的结果读数都不是默认值。 adt-clients 回答了
文档;塑造它是消费者的决定-哪些领域,什么目的-
这些都是按名称提供给想要图书馆形状的消费者
用来强加大多数读数都回答了一个它们不能回答的文件的空形状
阅读-判断文件是 analyse老师的工作,而不是阅读。两个扔的时候
文档没有 tm:root: transportTree 和 transportCreated,因为
空树或空请求将报告不存在的内容。 adt-clients 让读取异常以自身的形式出现。
违约是如何合理的
每一种策略都要根据它所依据的记录答案进行测试 和 必须把它同记录在案的成功区分开来。这种配对就是 要点:在大多数这些端点上,拒绝和成功共享一个状态,所以 如果读数同时指向两个方向,那么它看起来是正确的,但什么也没有识别出来。
没有SAP系统。语料库是固定装置。
表的一行在第一次写的时候是错的——一个表被列出来了
在验证下,语料库在第一次运行时拒绝了它:一个表回答
400 对于例外文档,则不是 <SEVERITY>ERROR</SEVERITY>. 这就是
此包的参数在一行中。
执照
lgpl - 3.0。