Удалить поле из спецификации YAML OpenAPI - PullRequest
1 голос
/ 26 апреля 2019

Мне нужно удалить поле tags из каждого из методов в моей спецификации OpenAPI.Спецификация должна быть в формате YAML, так как преобразование в JSON вызывает проблемы позже при публикации.

Я не смог найти готовый инструмент для этого, и мои навыки программирования недостаточны.Я пробовал Python с ruamel.yaml, но ничего не смог достичь.

Я открыт для любых предложений, как к этому подойти - репозиторий с готовым инструментом где-то, подсказка, что попробовать в Python ..У меня нет собственных идей.

Может быть, регулярное выражение, которое перехватывает все случаи всех экземпляров tags, поэтому я могу выполнить поиск и заменить на Python, заменяя их ничем?Похоже, пустые строки не нарушают движок публикации.

Вот пример YAML (я знаю, что это неправильная спецификация, просто хочу показать, где в YAML tags сидит)

openapi: 3.0.0
info:
  title: ""
  description: ""
paths:
  /endpoint
    get:
      tags:
        - 
          tag1
        - 
          tag3
    #rest of GET definition
    post:
      tags:
        - tag2
  /anotherEndpoint
    post:
      tags:
        - tag1

Мне нужно полностью избавиться от всех tags массивов (а не просто сделать их пустыми)

1 Ответ

0 голосов
/ 26 апреля 2019

Я не уверен, почему вы ничего не смогли достичь с помощью Python + ruamel.yaml.Предполагая, что ваша спецификация находится в файле input.yaml:

import sys
from pathlib import Path
import ruamel.yaml

in_file = Path('input.yaml')
out_file = Path('output.yaml')

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.preserve_quotes = True
data = yaml.load(in_file)

# if you only have the three instances of 'tags', you can hard-code them:
# del data['paths']['/endpoint']['get']['tags']
# del data['paths']['/endpoint']['post']['tags']
# del data['paths']['/anotherEndpoint']['post']['tags']

# generic recursive removal of any key names 'tags' in the datastructure:
def rm_tags(d):
    if isinstance(d, dict):
        if 'tags' in d:
            del d['tags']
        for k in d:
            rm_tags(d[k])
    elif isinstance(d, list):
        for item in d:
            rm_tags(item)

rm_tags(data)

yaml.dump(data, out_file)

, который дает как output.yaml:

openapi: 3.0.0
info:
    title: ""
    description: ""
paths:
    /endpoint:
        get: {}
        post: {}
    /anotherEndpoint:
        post: {}

Вы можете записать обратно data в input.yaml, если вам нужночто.

Обратите внимание, что обычно комментарий #rest of GET definition сохраняется, но не сейчас, поскольку он ассоциируется во время загрузки с ключом перед ним, и этот ключ удаляется.

...