nexmo-oas-renderer 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +1 -0
  3. data/.github/workflows/push-docker-publish.yml +19 -0
  4. data/.gitignore +6 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +135 -0
  7. data/.travis.yml +9 -0
  8. data/CHANGELOG.md +58 -0
  9. data/CONTRIBUTING.md +46 -0
  10. data/Dockerfile +6 -0
  11. data/Gemfile +6 -0
  12. data/Gemfile.lock +248 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +103 -0
  15. data/Rakefile +2 -0
  16. data/bin/console +14 -0
  17. data/bin/setup +8 -0
  18. data/exe/nexmo-oas-renderer +5 -0
  19. data/lib/nexmo/oas/engine.rb +11 -0
  20. data/lib/nexmo/oas/renderer.rb +13 -0
  21. data/lib/nexmo/oas/renderer/app.rb +201 -0
  22. data/lib/nexmo/oas/renderer/config.ru +9 -0
  23. data/lib/nexmo/oas/renderer/config/code_languages.yml +138 -0
  24. data/lib/nexmo/oas/renderer/config/dynamic_content.yml +1 -0
  25. data/lib/nexmo/oas/renderer/decorators/response_parser_decorator.rb +55 -0
  26. data/lib/nexmo/oas/renderer/helpers/navigation.rb +66 -0
  27. data/lib/nexmo/oas/renderer/helpers/render.rb +25 -0
  28. data/lib/nexmo/oas/renderer/helpers/summary.rb +33 -0
  29. data/lib/nexmo/oas/renderer/helpers/url.rb +19 -0
  30. data/lib/nexmo/oas/renderer/presenters/api_specification.rb +54 -0
  31. data/lib/nexmo/oas/renderer/presenters/endpoint.rb +21 -0
  32. data/lib/nexmo/oas/renderer/presenters/groups.rb +39 -0
  33. data/lib/nexmo/oas/renderer/presenters/navigation.rb +26 -0
  34. data/lib/nexmo/oas/renderer/presenters/open_api_specification.rb +62 -0
  35. data/lib/nexmo/oas/renderer/presenters/request_body_raw.rb +141 -0
  36. data/lib/nexmo/oas/renderer/presenters/response_format.rb +29 -0
  37. data/lib/nexmo/oas/renderer/presenters/response_tab/link.rb +36 -0
  38. data/lib/nexmo/oas/renderer/presenters/response_tab/panel.rb +45 -0
  39. data/lib/nexmo/oas/renderer/presenters/response_tabs.rb +58 -0
  40. data/lib/nexmo/oas/renderer/presenters/versions.rb +51 -0
  41. data/lib/nexmo/oas/renderer/public/500.html +66 -0
  42. data/lib/nexmo/oas/renderer/public/assets/images/brands/android.svg +1 -0
  43. data/lib/nexmo/oas/renderer/public/assets/images/brands/curl.svg +1 -0
  44. data/lib/nexmo/oas/renderer/public/assets/images/brands/dotnet.svg +1 -0
  45. data/lib/nexmo/oas/renderer/public/assets/images/brands/ios.svg +1 -0
  46. data/lib/nexmo/oas/renderer/public/assets/images/brands/java.svg +1 -0
  47. data/lib/nexmo/oas/renderer/public/assets/images/brands/javascript.svg +1 -0
  48. data/lib/nexmo/oas/renderer/public/assets/images/brands/node.svg +1 -0
  49. data/lib/nexmo/oas/renderer/public/assets/images/brands/php.svg +1 -0
  50. data/lib/nexmo/oas/renderer/public/assets/images/brands/python.svg +11 -0
  51. data/lib/nexmo/oas/renderer/public/assets/images/brands/ruby.svg +1 -0
  52. data/lib/nexmo/oas/renderer/public/assets/images/lost.svg +37 -0
  53. data/lib/nexmo/oas/renderer/public/assets/javascripts/components/format.js +47 -0
  54. data/lib/nexmo/oas/renderer/public/assets/javascripts/nexmo-oas-renderer.js +65 -0
  55. data/lib/nexmo/oas/renderer/public/assets/javascripts/popper.min.js +5 -0
  56. data/lib/nexmo/oas/renderer/public/assets/javascripts/prism.js +22 -0
  57. data/lib/nexmo/oas/renderer/public/assets/javascripts/tooltip.min.js +5 -0
  58. data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.accordion.js +307 -0
  59. data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.core.js +230 -0
  60. data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.modal.js +300 -0
  61. data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.tabs.js +143 -0
  62. data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.tooltip.js +76 -0
  63. data/lib/nexmo/oas/renderer/public/assets/stylesheets/nexmo-oas-renderer.css +287 -0
  64. data/lib/nexmo/oas/renderer/public/assets/stylesheets/nexmo-oas-renderer.css.map +7 -0
  65. data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/api.scss +341 -0
  66. data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/mediaqueries.scss +48 -0
  67. data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/style.scss +6 -0
  68. data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/themes/dark.scss +89 -0
  69. data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/themes/light.scss +68 -0
  70. data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/variables.scss +91 -0
  71. data/lib/nexmo/oas/renderer/public/assets/stylesheets/volta-prism.min.css +1 -0
  72. data/lib/nexmo/oas/renderer/public/assets/stylesheets/volta.min.css +1 -0
  73. data/lib/nexmo/oas/renderer/public/assets/symbol/volta-icons.svg +1 -0
  74. data/lib/nexmo/oas/renderer/public/favicon.ico +0 -0
  75. data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.eot +0 -0
  76. data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.ttf +0 -0
  77. data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.woff +0 -0
  78. data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.woff2 +0 -0
  79. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.eot +0 -0
  80. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.ttf +0 -0
  81. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.woff +0 -0
  82. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.woff2 +0 -0
  83. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.eot +0 -0
  84. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.ttf +0 -0
  85. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.woff +0 -0
  86. data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.woff2 +0 -0
  87. data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.eot +0 -0
  88. data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.ttf +0 -0
  89. data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.woff +0 -0
  90. data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.woff2 +0 -0
  91. data/lib/nexmo/oas/renderer/services/oas_parser.rb +23 -0
  92. data/lib/nexmo/oas/renderer/services/open_api_definition_resolver.rb +35 -0
  93. data/lib/nexmo/oas/renderer/version.rb +9 -0
  94. data/lib/nexmo/oas/renderer/views/api/index.erb +19 -0
  95. data/lib/nexmo/oas/renderer/views/api/show.erb +1 -0
  96. data/lib/nexmo/oas/renderer/views/concepts/list/plain.html.erb +5 -0
  97. data/lib/nexmo/oas/renderer/views/layouts/_head.erb +6 -0
  98. data/lib/nexmo/oas/renderer/views/layouts/_javascripts.erb +14 -0
  99. data/lib/nexmo/oas/renderer/views/layouts/api.erb +23 -0
  100. data/lib/nexmo/oas/renderer/views/layouts/open_api.erb +12 -0
  101. data/lib/nexmo/oas/renderer/views/open_api/_auth.erb +74 -0
  102. data/lib/nexmo/oas/renderer/views/open_api/_available_endpoints.erb +25 -0
  103. data/lib/nexmo/oas/renderer/views/open_api/_callback.erb +5 -0
  104. data/lib/nexmo/oas/renderer/views/open_api/_callback_endpoint.erb +38 -0
  105. data/lib/nexmo/oas/renderer/views/open_api/_callbacks.erb +5 -0
  106. data/lib/nexmo/oas/renderer/views/open_api/_code_examples.erb +16 -0
  107. data/lib/nexmo/oas/renderer/views/open_api/_endpoint.erb +54 -0
  108. data/lib/nexmo/oas/renderer/views/open_api/_header.erb +71 -0
  109. data/lib/nexmo/oas/renderer/views/open_api/_model.erb +43 -0
  110. data/lib/nexmo/oas/renderer/views/open_api/_navigation.erb +68 -0
  111. data/lib/nexmo/oas/renderer/views/open_api/_parameter_groups.erb +56 -0
  112. data/lib/nexmo/oas/renderer/views/open_api/_parameters.erb +115 -0
  113. data/lib/nexmo/oas/renderer/views/open_api/_request_json.erb +4 -0
  114. data/lib/nexmo/oas/renderer/views/open_api/_request_one_of.erb +70 -0
  115. data/lib/nexmo/oas/renderer/views/open_api/_request_single.erb +53 -0
  116. data/lib/nexmo/oas/renderer/views/open_api/_requests.erb +22 -0
  117. data/lib/nexmo/oas/renderer/views/open_api/_response_description_parameters.erb +130 -0
  118. data/lib/nexmo/oas/renderer/views/open_api/_response_descriptions.erb +45 -0
  119. data/lib/nexmo/oas/renderer/views/open_api/_response_fields.erb +3 -0
  120. data/lib/nexmo/oas/renderer/views/open_api/_response_tabs.erb +18 -0
  121. data/lib/nexmo/oas/renderer/views/open_api/_responses.erb +51 -0
  122. data/lib/nexmo/oas/renderer/views/open_api/_tabbed_parameters.erb +64 -0
  123. data/lib/nexmo/oas/renderer/views/open_api/_tabbed_single_parameter.erb +56 -0
  124. data/lib/nexmo/oas/renderer/views/open_api/_webhooks.erb +30 -0
  125. data/lib/nexmo/oas/renderer/views/open_api/show.erb +26 -0
  126. data/lib/nexmo/oas/renderer/views/static/404.erb +6 -0
  127. data/nexmo-oas-renderer.gemspec +51 -0
  128. metadata +397 -0
@@ -0,0 +1,56 @@
1
+ <% callback = false if callback.nil? %>
2
+
3
+ <% if endpoint.parameters.select { |p| p.in == 'header'}.any? %>
4
+ <h4>Header Parameters</h4>
5
+ <%= erb :'open_api/_parameters', locals: { parameters: endpoint.parameters.select { |p| p.in == 'header' }, callback: callback } %>
6
+ <% end %>
7
+
8
+ <% if endpoint.path_parameters.any? %>
9
+ <h4>Path Parameters</h4>
10
+ <%= erb :'open_api/_parameters', locals: { parameters: endpoint.path_parameters, callback: callback } %>
11
+ <% end %>
12
+
13
+ <% if endpoint.query_parameters.any? %>
14
+ <h4>Query Parameter</h4>
15
+ <%= erb :'open_api/_parameters', locals: { parameters: endpoint.query_parameters, callback: callback } %>
16
+ <% end %>
17
+
18
+ <% if endpoint.request_body %>
19
+ <% format = endpoint.request_body.formats[0] %>
20
+ <h4>
21
+ Request body
22
+ <span class="Vlt-badge Vlt-badge--blue"><%= format %></span>
23
+ </h4>
24
+
25
+ <% if endpoint.request_body.description %>
26
+ <%= endpoint.request_body.description.render_markdown %>
27
+ <% end %>
28
+
29
+ <% unless endpoint.request_body.exhibits_one_of_multiple_schemas?(format) %>
30
+
31
+ <%
32
+ # @mheap: This is hacky handling for allOf, but it works for now
33
+ # We probably want real allOf support in OasParser, but that's more time than I have right now
34
+ allOf = endpoint.request_body.content[format]['schema']['allOf']
35
+ if allOf
36
+ params = endpoint.request_body.handle_all_of(allOf)
37
+ else
38
+ params = endpoint.request_body.properties_for_format(format)
39
+ end
40
+ if params
41
+ %>
42
+
43
+ <%= erb :'open_api/_parameters', locals: { endpoint:endpoint, parameters: params, callback: callback } %>
44
+ <% end %>
45
+ <% else %>
46
+
47
+ <%
48
+ # This can likely be better done as a presenter, but it works for now
49
+ schema = endpoint.request_body.content[format]['schema']['oneOf']
50
+ %>
51
+ <%= erb :'open_api/_tabbed_parameters', locals: { body: endpoint.request_body, schema: schema, format: format, callback: callback } %>
52
+ <%
53
+ end
54
+ end
55
+ %>
56
+
@@ -0,0 +1,115 @@
1
+ <%
2
+ model = false if model.nil?
3
+ callback = false if callback.nil?
4
+ format = nil if format.nil?
5
+
6
+ unless defined?(parent)
7
+ parent = ""
8
+ else
9
+ parent = "#{parent}."
10
+ end
11
+
12
+ isOneOf = false unless defined?(isOneOf)
13
+ %>
14
+
15
+ <% parameters.each do |parameter| %>
16
+
17
+ <div class="oas-grid">
18
+ <div class="oas-parameter-name <%= !parent.blank? ? 'oas-parameter-name-nested' : '' %>">
19
+ <% if parent.blank? %>
20
+ <b><%= parameter.name %></b>
21
+ <% else %>
22
+ <div class="Vlt-tooltip Vlt-tooltip--top" title="<%= parent %><%= parameter.name %>">
23
+ <b><%= parameter.name %></b>
24
+ </div>
25
+ <% end %>
26
+
27
+ <% if @specification.formats.any? %>
28
+ <% if @specification.formats.include?('text/xml') %>
29
+ <span class="js-format" data-format="text/xml">
30
+ <% if parameter.is_xml_attribute? %>
31
+ | <span class="xml-flag">Attribute</span>
32
+ <% end %>
33
+
34
+ <% if parameter.is_xml_text? %>
35
+ | <span class="xml-flag">Value</span>
36
+ <% end %>
37
+ </span>
38
+ <% end %>
39
+ <% end %>
40
+ </div>
41
+ <div class="oas-parameter-description">
42
+
43
+ <div class="oas-parameter-meta">
44
+ <em>
45
+ <%= parameter.type %>
46
+ <% if parameter.format %>
47
+ (<%= parameter.format %>)
48
+ <% end %>
49
+
50
+ <% if parameter.array? %>
51
+ <% if parameter.items && parameter.items['type'] %>
52
+ of <%= (parameter.items['type']) %>s
53
+ <% end %>
54
+ <% end %>
55
+ </em>
56
+
57
+ <% if parameter.required and parameter.type %>|<% end %>
58
+ <% if parameter.required %>
59
+ <span class="constraint">Required</span>
60
+ <% end %>
61
+
62
+ <% if parameter.minimum || parameter.raw['minLength'] %>
63
+ | <span class="constraint">Min:</span> <%= parameter.minimum || parameter.raw['minLength'] %>
64
+ <% end %>
65
+ <% if parameter.maximum || parameter.raw['maxLength'] %>
66
+ | <span class="constraint">Max:</span> <%= parameter.maximum || parameter.raw['maxLength'] %>
67
+ <% end %>
68
+ </div>
69
+
70
+ <%= (parameter.description || parameter.schema['description'] || '').render_markdown %>
71
+
72
+ <% if parameter.enum %>
73
+ <small class="Vlt-grey-dark">
74
+ <%= (callback || model) ? "One of:" : "Must be one of:" %>
75
+ <%= parameter_values(parameter.enum) %>
76
+ </small>
77
+ <% end %>
78
+
79
+
80
+ </div>
81
+
82
+ <% if parameter.array? && parameter.items && parameter.items['oneOf'] %>
83
+
84
+ <%
85
+ # Handle specific case - an array that contains a oneOf
86
+ params = parameter.items['oneOf'].map do |p|
87
+ p['format'] = parameter.format
88
+ OasParser::Parameter.new(self, p)
89
+ end
90
+
91
+ %>
92
+ <div class="oas-parameter-nested">
93
+ <%= erb :'open_api/_tabbed_single_parameter', locals: { parent: "#{parameter.name}[]", parameters: params, format: format, callback: callback } %>
94
+ </div>
95
+
96
+ <% end %>
97
+
98
+ <% if parameter.array? && parameter.items && !parameter.items['oneOf'] %>
99
+ <%
100
+ # mheap: We only want to recurse if there are example properties in the array definition
101
+ if parameter.items['type'] && parameter.items['type'] == 'object' && parameter.items['properties']
102
+ %>
103
+ <div class="oas-parameter-nested">
104
+ <%= erb :'open_api/_parameters', locals: { parent: "#{parent}#{parameter.name}[]", parameters: parameter.properties, model: model, format: format, callback: callback } %>
105
+ </div>
106
+ <% end %>
107
+ <% end %>
108
+ <% if parameter.properties && parameter.object? && parameter.properties.size.positive? %>
109
+ <div class="oas-parameter-nested">
110
+ <%= erb :'open_api/_parameters', locals: { parent: "#{parent}#{parameter.name}", parameters: parameter.properties, model: model, format: format, callback: callback } %>
111
+ </div>
112
+ <% end %>
113
+ </div>
114
+ <% end %>
115
+
@@ -0,0 +1,4 @@
1
+ <% output = Nexmo::OAS::Renderer::Presenters::RequestBodyRaw.new(parameters) %>
2
+
3
+ <h4>Example Request</h4>
4
+ <pre class="highlight javascript" style="white-space: pre-wrap"><code><%= output.to_json %></code></pre>
@@ -0,0 +1,70 @@
1
+ <%
2
+ body = endpoint.request_body
3
+
4
+ # If we're calling this recursively (a oneOf a oneOf) then schema is passed in
5
+ # rather than pulling it from the body
6
+ schema ||= endpoint.request_body.content[format]['schema']['oneOf']
7
+
8
+ # Handle any cases where the top level of the oneOf is an allOf
9
+ schemas = schema.map do |s|
10
+ if s['allOf']
11
+ newSchema = body.handle_all_of(s)
12
+ s.each do |k,v|
13
+ newSchema[k] = v
14
+ end
15
+
16
+ next newSchema
17
+ end
18
+ s
19
+ end
20
+
21
+ panels = []
22
+
23
+ schemas.each_with_index do |schema, index|
24
+ if schema['properties']
25
+ schema['properties'] = schema['properties'].map do |name, definition|
26
+ # Sometimes we get in to a weird situation where we already have a Property
27
+ next name if name.instance_of?(OasParser::Property)
28
+ OasParser::Property.new(self, schema, name, definition)
29
+ end
30
+ .sort_by do |prop|
31
+ prop.required ? -1 : 1
32
+ end
33
+ end
34
+
35
+ subtitle = schema['title'] || schema['description']
36
+
37
+ if defined?(parent)
38
+ subtitle = "#{parent} &raquo; #{subtitle}"
39
+ end
40
+
41
+ panels.push({
42
+ 'title' => subtitle,
43
+ 'description' => schema['title'] || schema['description'],
44
+ 'parameters' => schema['properties'],
45
+ 'oneOf' => schema['oneOf'],
46
+ 'x-tab-id' => schema['x-tab-id'] || schema['title'].parameterize,
47
+ 'active' => index == 0
48
+ })
49
+ end
50
+ %>
51
+
52
+ <div class="Vlt-tabs js-format" data-format="<%= format %>">
53
+ <div class="Vlt-tabs__header" style="display:none;" role="tablist" aria-label="Responses">
54
+ <% panels.each do |panel| %>
55
+ <span data-tab-link="<%= panel['x-tab-id'] %>" class="Vlt-tabs__link <%= panel['active'] ? 'Vlt-tabs__link_active' : '' %>">
56
+ </span>
57
+ <% end %>
58
+ </div>
59
+ <div class="Vlt-tabs__content">
60
+ <% panels.each do |panel| %>
61
+ <div class="Vlt-tabs__panel <%= panel['active'] ? 'Vlt-tabs__panel_active' : '' %>">
62
+ <% unless panel['oneOf'] %>
63
+ <%= erb :'open_api/_request_single', locals: { title: title, subtitle: panel['title'], endpoint: endpoint, params: panel['parameters'], format: format } %>
64
+ <% else %>
65
+ <%= erb :'open_api/_request_one_of', locals: { title: title, parent: panel['title'], endpoint: endpoint, schema: panel['oneOf'], format: format } %>
66
+ <% end %>
67
+ </div>
68
+ <% end %>
69
+ </div>
70
+ </div>
@@ -0,0 +1,53 @@
1
+ <%
2
+ renderer = Nexmo::OAS::Renderer::Presenters::RequestBodyRaw
3
+ params ||= endpoint.request_body.properties_for_format(format)
4
+
5
+ requests = []
6
+
7
+ # Only show the required fields tab if there are any required fields
8
+ required_params = params.select do |param|
9
+ param.required
10
+ end
11
+
12
+ requests.push(
13
+ {
14
+ 'title' => 'Required Fields Only',
15
+ 'id' => 'required-only',
16
+ 'value' => renderer.new(params, { 'required_only' => true }, endpoint)
17
+ }) if required_params.any?
18
+
19
+ # Always show the all fields tab
20
+ requests.push(
21
+ {
22
+ 'title' => 'All Fields',
23
+ 'id' => 'all-fields',
24
+ 'value' => renderer.new(params, { 'required_only' => false }, endpoint)
25
+ }
26
+ )
27
+
28
+ # Remove the "required only" option if the two request bodies are identical
29
+ unique_requests = requests.map { |r| r['value'].to_format('application/json') }.to_set.size
30
+ requests.shift if (unique_requests == 1 && requests.size != unique_requests)
31
+
32
+ title = "Example Request" unless title
33
+ if defined?(subtitle)
34
+ title = "#{title} &raquo; #{subtitle}"
35
+ end
36
+
37
+ %>
38
+
39
+ <h4 class="Vlt-grey-light"><%= title %></h4>
40
+ <div class="Vlt-tabs">
41
+ <div class="Vlt-tabs__header" role="tablist" aria-label="Responses">
42
+ <% requests.each_with_index do |request, index| %>
43
+ <div role='tab' tabindex="-1" data-tab-link="<%= request['id'] %>" class="<%= index === 0 ? 'Vlt-tabs__link_active' : '' %> Vlt-tabs__link tab-sync"><%= request['title'] %></div>
44
+ <% end %>
45
+ </div>
46
+ <div class="Vlt-tabs__content">
47
+ <% requests.each_with_index do |request, index| %>
48
+ <div role='tabpanel' class="Vlt-js-tabs__panel <%= index === 0 ? 'Vlt-tabs__panel_active' : '' %>">
49
+ <pre class="<%= format == 'application/json' ? 'language-json' : 'language-shell' %> Vlt-prism--copy-disabled <%= @theme_light ? 'Vlt-prism--dark' : '' %>"><code><%= request['value'].to_format(format) %></code></pre>
50
+ </div>
51
+ <% end %>
52
+ </div>
53
+ </div>
@@ -0,0 +1,22 @@
1
+ <%
2
+ return unless endpoint.request_body
3
+ return if endpoint.request_body.raw['x-hide-request']
4
+ title = defined?(title) ? title : nil
5
+
6
+ renderer = Nexmo::OAS::Renderer::Presenters::RequestBodyRaw
7
+
8
+ # The first format defined is preferred. This is usually application/json
9
+ format = endpoint.request_body.formats[0]
10
+ %>
11
+
12
+ <%
13
+ if endpoint.request_body.exhibits_one_of_multiple_schemas?(format)
14
+ %>
15
+ <%= erb :'open_api/_request_one_of', locals: { endpoint: endpoint, format: format, title: title } %>
16
+
17
+ <% else %>
18
+ <%= erb :'open_api/_request_single', locals: { endpoint: endpoint, format: format, title: title} %>
19
+ <%
20
+ end
21
+ %>
22
+
@@ -0,0 +1,130 @@
1
+ <%
2
+ # @mheap: This is hacky handling for allOf, but it works for now
3
+ allOf = schema['allOf']
4
+ if allOf
5
+ schema = allOf.reduce { |a,b| a.deep_merge(b) }
6
+ end
7
+ %>
8
+
9
+ <%
10
+ # If it's an array, look at the items for the response schema as all items within
11
+ # the array are expected to be identical
12
+ schema = schema['items'] if schema['type'] == 'array'
13
+ %>
14
+
15
+ <% if schema['properties'] %>
16
+ <% parentField = parentField ? "#{parentField}." : '' %>
17
+ <% schema['properties'].each do |key, parameter| %>
18
+ <%
19
+ next if key == '_links'
20
+ next if parameter['x-skip-response-description']
21
+ parent = "#{endpoint.method}_#{endpoint.path.path.gsub("/", "_")[1..-1]}" unless parent
22
+ responseFieldId = parent + "_" + key
23
+ %>
24
+ <div class="oas-grid">
25
+ <div id="<%= responseFieldId %>" class="oas-parameter-name <%= !parentField.blank? ? 'oas-parameter-name-nested' : '' %>">
26
+ <% if parentField.blank? %>
27
+ <b><%= key %></b>
28
+ <% else %>
29
+ <div class="Vlt-tooltip Vlt-tooltip--top" title="<%= parentField %><%= key %>">
30
+ <b><%= key %></b>
31
+ </div>
32
+ <% end %>
33
+ </div>
34
+
35
+ <div class="oas-parameter-description">
36
+ <div class="oas-parameter-meta">
37
+ <%= parameter['type'] %>
38
+ <% if parameter['type'] == 'array' %>
39
+ <% if parameter['items'] && parameter['items']['type'] %>
40
+ of <%= (parameter['items']['type']) %>s
41
+ <% end %>
42
+ <% end %>
43
+ </div>
44
+
45
+ <%= (parameter['description'] || '' ).render_markdown %>
46
+
47
+ <% if parameter['enum'] %>
48
+ <small class="Vlt-grey-dark">
49
+ One of:
50
+ <%= parameter_values(parameter['enum']) %>
51
+ </small>
52
+ <% end %>
53
+
54
+ </div>
55
+
56
+
57
+ <% arrayMarker = "" %>
58
+ <% if parameter['items'] # If this is an array, we need to show the structure of the children %>
59
+ <% arrayMarker = "[]" %>
60
+ <% if parameter['items']['oneOf'] || parameter['items']['anyOf'] # If it's a oneOf/anyOf, we need tabs! %>
61
+ <%
62
+
63
+ if parameter['items']['oneOf']
64
+ qualifier = 'one'
65
+ lookupKey = 'oneOf'
66
+ else
67
+ qualifier = 'any'
68
+ lookupKey = 'anyOf'
69
+ end
70
+
71
+ schemas = parameter['items'][lookupKey].map do |item|
72
+ if item['allOf']
73
+ item = item.deep_merge(item['allOf'].reduce { |a,b| a.deep_merge(b) })
74
+ item.delete('allOf')
75
+ end
76
+ item
77
+ end
78
+ %>
79
+ <% else %>
80
+ <% parameter['properties'] = parameter['items']['properties'] %>
81
+ <% end %>
82
+ <% end %>
83
+
84
+ <%
85
+ schemas = [parameter]
86
+ %>
87
+
88
+ <% if schemas %>
89
+ <% needs_tabs = schemas.size > 1 %>
90
+ <% if needs_tabs %>
91
+ <div class="Vlt-callout Vlt-callout--shoutout">
92
+ <i></i>
93
+ <div class="Vlt-callout__content">
94
+ This array contains <strong><%= qualifier %></strong> of the following objects:
95
+ </div>
96
+ </div>
97
+ <div class="Vlt-tabs js-format">
98
+ <div class="Vlt-tabs__header Vlt-tabs__header--bordered" role="tablist" aria-label="Responses">
99
+ <% schemas.each_with_index do |schema, index| %>
100
+ <div
101
+ class="Vlt-tabs__link <%= index == 0 ? 'Vlt-tabs__link_active' : '' %> <%= schema['x-tab-id'] ? "tab-sync" : '' %>"
102
+ <% if schema['x-tab-id'] %>
103
+ data-tab-link="<%= schema['x-tab-id'] %>"
104
+ <% end %>
105
+ >
106
+ <%= schema['description'] %>
107
+ </div>
108
+ <% end %>
109
+ </div>
110
+ <div class="Vlt-tabs__content">
111
+ <% end %>
112
+
113
+ <% schemas.each_with_index do |value, index| %>
114
+ <div class="Vlt-tabs__panel <%= index == 0 ? 'Vlt-tabs__panel_active' : '' %>">
115
+ <div class="oas-parameter-nested">
116
+ <%= erb :'open_api/_response_description_parameters', locals: { endpoint: endpoint, schema: value, parent: responseFieldId, parentField: "#{parentField}#{key}#{arrayMarker}" } %>
117
+ </div>
118
+ </div>
119
+ <% end %>
120
+
121
+ <% if needs_tabs %>
122
+ </div>
123
+ </div>
124
+ <% end %>
125
+ <% end %>
126
+ </div>
127
+ <% end %>
128
+ <% end %>
129
+
130
+