From 45bd13eb3756149161261197660da87fd8018ed6 Mon Sep 17 00:00:00 2001 From: Jake Benilov Date: Thu, 23 Jun 2022 12:07:08 +0100 Subject: [PATCH 1/3] Introduce an enum-based schema into the petstore example --- example/source/pets.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/example/source/pets.yml b/example/source/pets.yml index 818e14fb..54820ee5 100644 --- a/example/source/pets.yml +++ b/example/source/pets.yml @@ -93,10 +93,19 @@ components: type: string tag: type: string + status: + $ref: "#/components/schemas/PetStatus" Pets: type: array items: $ref: "#/components/schemas/Pet" + PetStatus: + type: string + description: pet status in the store + enum: + - pending + - available + - sold Error: required: - code From 52d890b2731f5c1e858fb8ba77991c51b39e71a7 Mon Sep 17 00:00:00 2001 From: Jake Benilov Date: Thu, 23 Jun 2022 16:16:35 +0100 Subject: [PATCH 2/3] Extend renderer spec to cover schema generation --- spec/api_reference/renderer_spec.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/spec/api_reference/renderer_spec.rb b/spec/api_reference/renderer_spec.rb index 30b48998..913ea8c9 100644 --- a/spec/api_reference/renderer_spec.rb +++ b/spec/api_reference/renderer_spec.rb @@ -79,5 +79,26 @@ expect(rendered).to have_css("div#server-list>p>strong", text: "Development") expect(rendered).to have_css("div#server-list>p>strong>p>em", text: "Development") end + + it "renders a schema" do + @spec["components"] = { + "schemas": { + "Pet": { + "properties": { + "id": { "type": "integer", "format": "int64" }, + }, + }, + }, + } + document = Openapi3Parser.load(@spec) + + render = described_class.new(@app, document) + rendered = render.api_full(document.info, document.servers) + + rendered = Capybara::Node::Simple.new(rendered) + expect(rendered).to have_css("h2#schemas", text: "Schemas") + expect(rendered).to have_css("h3#schema-pet", text: "Pet") + expect(rendered).to have_css("table.schema-pet", text: "id") + end end end From e3dc6b15806654fc99d16884a5956f833da76239 Mon Sep 17 00:00:00 2001 From: Jake Benilov Date: Thu, 23 Jun 2022 17:12:47 +0100 Subject: [PATCH 3/3] Support for schemas with enums If a schema provides an list of enum values, generate them as a (sorted) list --- .../api_reference/templates/schema.html.erb | 8 +++++++ spec/api_reference/renderer_spec.rb | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/govuk_tech_docs/api_reference/templates/schema.html.erb b/lib/govuk_tech_docs/api_reference/templates/schema.html.erb index 051f43d6..8747e2cb 100644 --- a/lib/govuk_tech_docs/api_reference/templates/schema.html.erb +++ b/lib/govuk_tech_docs/api_reference/templates/schema.html.erb @@ -27,3 +27,11 @@ <% end %> +<% if schema.enum %> +

This schema can be any one of the following <%= schema.type.pluralize %>:

+
    +<% schema.enum.sort.each do |value| %> +
  • <%= value %>
  • +<% end %> +
+<% end %> diff --git a/spec/api_reference/renderer_spec.rb b/spec/api_reference/renderer_spec.rb index 913ea8c9..745279ff 100644 --- a/spec/api_reference/renderer_spec.rb +++ b/spec/api_reference/renderer_spec.rb @@ -100,5 +100,26 @@ expect(rendered).to have_css("h3#schema-pet", text: "Pet") expect(rendered).to have_css("table.schema-pet", text: "id") end + + it "renders an enum schema" do + @spec["components"] = { + "schemas": { + "Pet": { + "type": "string", + "enum": %w[pending available sold], + }, + }, + } + document = Openapi3Parser.load(@spec) + + render = described_class.new(@app, document) + rendered = render.api_full(document.info, document.servers) + + rendered = Capybara::Node::Simple.new(rendered) + expect(rendered).to have_css("h3#schema-pet", text: "Pet") + expect(rendered).to have_css(".schema-pet-enum", text: "pending") + expect(rendered).to have_css(".schema-pet-enum", text: "available") + expect(rendered).to have_css(".schema-pet-enum", text: "sold") + end end end