Перебор Swagger YAML-файла для динамического создания списка свойств - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь создать сценарий, который может принимать файл swagger yml (например, petstore.yaml) и генерировать список используемых «атрибутов» из файла.

Это включает в себя синтаксический анализ yaml, а затем итерацию по всем элементам в объекте json для получения необходимых данных.Я собираюсь обойти все пути для определения правильных ответов, но сейчас я просто хочу отфильтровать все определения, указанные в файле yaml, а затем для каждого определения вывести список свойств.

образец файла yamlможет быть загружен здесь

в конце дня, я хотел бы сгенерировать строку для каждого атрибута, которая показывает что-то вроде

<filename>~Pet~id~integer~int64
<filename>~Pet~name~string~
<filename>~Pet~tag~string~

для этого, янеобходимо найти узел «определения», и итерации по всем подузлам, чтобы прочитать информацию.

Я изо всех сил пытаюсь получить правильную логику для файла в стиле yaml. Ниже приведен мой рабочий код.

Мне кажется, что я слишком усложнил итеративный цикл (может быть, лучше было бы использовать регулярное выражение?

index.html

<code><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <title>Read YAML</title>
        </script><script src='https://cdnjs.cloudflare.com/ajax/libs/js-yaml/3.13.1/js-yaml.min.js'>            
    </script>
    <body>
        <input type="file" id="file-input" />
        <h3>Contents of the file:</h3>
        <pre id="file-content">
var yaml = window.jsyaml;

1 Ответ

1 голос
/ 17 июня 2019

У меня мало времени, поэтому я оставлю это здесь.Это не так хорошо, как есть, но я надеюсь, что это поможет вам.

Так что я сделал рекурсивную функцию для итерации по объектам.Функция принимает объект и префикс.Префикс будет использоваться для печати деталей.Префиксы исключения используются, чтобы не показывать определенные имена полей, а типы исключения - не печатать определенные типы.Переберите поля объекта, формат, тип, описание и все, что вы хотите перехватить.По завершении зацикливания полей объекта проверьте, заполнено ли поле типа.Если это так, зарегистрируйте детали параметра.

var body = '';
var mystring = '' 
function readSingleFile(e) {
    var file = e.target.files[0];
    if (!file) {
      return;
    }
    var reader = new FileReader();
    reader.onload = function(e) {
      var contents = e.target.result;
      displayContents(contents);
    };
    reader.readAsText(file);
}

function displayContents(contents) {
      console.log('---contents---')
      console.log(contents)
      var element = document.getElementById('file-content');
      console.log('---element----')
      console.log(element)
      var doc = yaml.load(contents);
      console.log('---doc')
      console.log(doc)
      // Process the file.
      // Process only the definitions section of the file
      var definition = doc.definitions
      console.log('---definition---')
      console.log (definition) ;

    processContents2(doc.definitions)

    function processContents2(obj, prefix) {
        const excludePrefixes = ['properties']
        const excludeTypes = ['object', 'array']
        let format = ''
        let type = ''
        let description = ''
        let count = 0;
        for (var field in obj) {
            if (typeof obj[field] === 'object') {
                processContents2(obj[field], (prefix || '') + (excludePrefixes.indexOf(field) === -1 ? '~' + field : ''))
            } else {
                if (field === 'format') {
                    format = obj[field]
                } else if (field === 'type') {
                    type = obj[field]
                } else if (field === 'description') {
                    description = obj[field]
                }
            }
        }
        if (type && (excludeTypes.indexOf(type) === -1)) {
            console.log((prefix || '') + '~' + type  + (description ? '~' + description : '') + (format ? '~' + format : ''))
        } 
      }

      document.getElementById('output').innerHTML = body;
 }

document.getElementById('file-input')
  .addEventListener('change', readSingleFile, false);
...