如何在python-sphinx conf.py中动态移除可追溯关系

0 投票
1 回答
32 浏览
提问于 2025-04-12 19:50

我正在使用一个叫做 traceability 的插件,它是为 python-sphinx 设计的:sphinx traceability plugin

我的测试有以下的 .rst 文档:

@rst
  .. item:: TST-Example
     :applicable_to: PRD-ALL
@endrst

我想把 PRD-ALL 转换成一个预定义产品的列表,比如 PRD-A PRD-B。所以我在考虑把这个逻辑加到插件提供的 traceability_callback_per_item 回调函数里面:

def traceability_callback_per_item(name, collection):
    item = collection.get_item(name)

    if name.startswith('TST-'):
        applicable_to = list(item.iter_targets('applicable_to'))

        if 'PRD-ALL' in applicable_to:
            collection.add_relation(item.identifier, 'applicable_to', 'PRD-A')
            collection.add_relation(item.identifier, 'applicable_to', 'PRD-B')

            # remove PRD-ALL from 'applicable_to' relation:
            # HOW?

我试过:

item.remove_targets('PRD-ALL', explicit=True, implicit=True, relations=['applicable_to'])

但是我得到了一个警告:

WARNING: No automatic reverse relation: TST-Example applicable_to PRD-ALL

这个警告导致构建失败,因为它是故意用 -W 选项运行的。

有什么想法吗?

1 个回答

0

最后我找到了解决办法,可能不是最“正确”的方式,但确实有效:

# remove TST --> PRD relation
item.remove_targets('PRD-ALL', explicit=True, implicit=True,
                    relations=['applicable_to'])

# remove PRD --> TST relation
prod_item = collection.get_item('PRD-ALL')
prod_item.remove_targets(item.identifier, explicit=True, implicit=True,
                         relations=['covered_by'])

请注意,covered_by 是在 traceability_relations 这个全局变量中指定的:

traceability_relationships = {
    # ...
    'applicable_to': 'covered_by'
}

撰写回答