Валидация OpenAPI / Swagger по адресу https://docs.discourse.org/openapi.json

Кажется, swagger по адресу https://docs.discourse.org/openapi.json невалиден.

Сценарий воспроизведения:

Через несколько секунд возникает 142 ошибки валидации.

Не могу прикрепить файл, но ошибка похожа на:

Структурная ошибка в paths./categories.json.post.responses.200.content.application/json.schema.properties.category.properties.name.description
должно быть строкой
Перейти к строке 184
Структурная ошибка в paths./categories.json.post.responses.200.content.application/json.schema.properties.category.properties.color.description
должно быть строкой
Перейти к строке 187
Структурная ошибка в paths./categories.json.post.responses.200.content.application/json.schema.properties.category.properties.text_color.description
должно быть строкой
Перейти к строке 190
... ещё ...

Есть ли доступная альтернативная (валидная) спецификация swagger?

Предлагаемый патч

Ниже представлен предлагаемый патч на данный момент.

Сводка
diff --git "a/discourse-swagger-original.json" "b/discourse-swagger.json"
index f9267f5d0..dcebe3fd8 100644
--- "a/discourse-swagger-original.json"
+++ "b/discourse-swagger.json"
@@ -578,8 +578,8 @@
                         },
                         "available_groups": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
@@ -1196,8 +1196,8 @@
                     },
                     "actions_summary": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "type": "object"
                       }
@@ -1788,8 +1788,8 @@
                               },
                               "actions_summary": {
                                 "type": "array",
-                                "uniqueItems": null,
-                                "minItems": null,
+                                "uniqueItems": false,
+                                "minItems": 0,
                                 "items": {
                                   "type": "object"
                                 }
@@ -1885,8 +1885,8 @@
                         },
                         "stream": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
@@ -1899,14 +1899,14 @@
                     },
                     "timeline_lookup": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "properties": {
                           "0": {
                             "type": "array",
                             "uniqueItems": true,
-                            "minItems": null,
+                            "minItems": 0,
                             "items": {
                               "type": "object"
                             }
@@ -3621,8 +3621,8 @@
                   "properties": {
                     "user_badges": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "type": "object"
                       }
@@ -3798,8 +3798,8 @@
                         },
                         "featured_user_badge_ids": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
@@ -3864,8 +3864,8 @@
                   "properties": {
                     "user_badges": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "type": "object"
                       }
@@ -4041,8 +4041,8 @@
                         },
                         "featured_user_badge_ids": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
@@ -4734,8 +4734,8 @@
                           },
                           "posters": {
                             "type": "array",
-                            "uniqueItems": null,
-                            "minItems": null,
+                            "uniqueItems": false,
+                            "minItems": 0,
                             "items": {
                               "type": "object"
                             }
@@ -4745,16 +4745,16 @@
                     },
                     "users": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "type": "object"
                       }
                     },
                     "categories": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "type": "object"
                       }
@@ -4773,24 +4773,24 @@
                         },
                         "post_ids": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
                         },
                         "user_ids": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
                         },
                         "category_ids": {
                           "type": "array",
-                          "uniqueItems": null,
-                          "minItems": null,
+                          "uniqueItems": false,
+                          "minItems": 0,
                           "items": {
                             "type": "object"
                           }
@@ -6406,8 +6406,8 @@
                     },
                     "owners": {
                       "type": "array",
-                      "uniqueItems": null,
-                      "minItems": null,
+                      "uniqueItems": false,
+                      "minItems": 0,
                       "items": {
                         "type": "object"
                       }
@@ -7241,8 +7241,8 @@
                           },
                           "choices": {
                             "type": "array",
-                            "uniqueItems": null,
-                            "minItems": null,
+                            "uniqueItems": false,
+                            "minItems": 0,
                             "items": {
                               "type": "object"
                             }
1 лайк

Спасибо, что подняли этот вопрос.

Нет, это единственный доступный файл спецификации.

Я внес множество изменений для переноса документации со Swagger 2.0 на OpenAPI 3.0 в этом коммите:

но, похоже, что некоторые моменты были упущены или это могут быть новые изменения в спецификации.

Я только что снова проверил с помощью инструмента командной строки openapi-cli на наличие ошибок и смог воспроизвести аналогичные ошибки, как на сайте Swagger:

blake@pop-os ~/code/discourse_api_docs (master) $ npx @redocly/openapi-cli lint openapi.json
...
❌ Проверка не пройдена: 647 ошибок и 579 предупреждений.

Выглядит хорошо. Если вы хотите отправить правку с этими исправлениями, мы будем очень рады, но я также могу помочь устранить некоторые из этих проблем.

4 лайка

Пожалуйста. Спасибо за готовность рассмотреть вклад.

Наш SQL-движок использует API в качестве коннектора к Discourse, и этот коннектор основан на Swagger, а не написан вручную, однако мы всё ещё тестируем функционал. Мы можем столкнуться с проблемами, такими как нарушения ограничений по длине, типу данных и возможности NULL.

Я с радостью подготовлю патч, но подожду несколько дней, чтобы команда могла более тщательно протестировать предложенные изменения. Иначе я займу много вашего времени при низкой эффективности.

Спасибо!

3 лайка

Запрос на слияние отправлен. Возможно, последуют дополнительные изменения, так как мы фактически пытаемся запустить систему, например, добавив значения таблицы ссылок, как показано ниже.

3 лайка

Просто закрываю эту тему. Отправленный PR был закрыт после обсуждения.

Однако я добавил коммит, который исправил проблемы с переносами строк:

Также хотел отметить, что мы в настоящее время переводим документацию по API на более тесную интеграцию с кодовой базой Discourse (discourse/spec/requests/api at main · discourse/discourse · GitHub) с помощью инструмента под названием rswag, который может автоматически генерировать файл спецификации OpenAPI в формате JSON. Я знаю, что в текущей документации есть некоторые проблемы с линтингом, но считаю, что наши усилия лучше направить на завершение перехода к rswag, что поможет нам решить многие из этих проблем.

5 лайков

Отлично это слышать! Мы не можем работать с файлами типа *.yaml или подобными, но при появлении нового Swagger-файла необходимо провести тщательное тестирование и сертификацию: пожалуйста, сообщите мне об этом.

1 лайк