Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve extensiblity for SwaggerGenerator #1241

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
| :mega: ATTENTION for cloning source code |
|--------------|
git clone --recursive
or
git submodule update --init swagger-ui
------------------------------------------------------

| :mega: Calling for Maintainers |
|--------------|
| With the introduction of [ASP.NET Core](https://www.asp.net/core), I've now shifted my focus to the Core-specific project - [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore). That will be receiving most of my (already limited) personal time, and so I won't have the capacity to maintain this one at a sufficient rate. Still, I'd love to see it live on and am seeking one or two "core" contributors / maintainers to help out. Ideally, these would be people who have already contributed through PRs and understand the inner workings and overall design. Once signed-up, we can agree on an approach that works - ultimately, I want to remove myself as the bottleneck to merging PRs and getting fresh Nugets published. If you're interested, please let me know by adding a comment [here](https://github.com/domaindrivendev/Swashbuckle/issues/1053) |
Expand Down
6 changes: 3 additions & 3 deletions Swashbuckle.Core/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Swashbuckle.Core")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

Expand All @@ -32,6 +32,6 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("5.6.0")]
8 changes: 7 additions & 1 deletion Swashbuckle.Core/Swagger/SwaggerGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace Swashbuckle.Swagger
{
public class SwaggerGenerator : ISwaggerProvider
{
private readonly IApiExplorer _apiExplorer;
private IApiExplorer _apiExplorer;
private readonly JsonSerializerSettings _jsonSerializerSettings;
private readonly IDictionary<string, Info> _apiVersions;
private readonly SwaggerGeneratorOptions _options;
Expand All @@ -29,6 +29,12 @@ public SwaggerGenerator(
_options = options ?? new SwaggerGeneratorOptions();
}

public IApiExplorer ApiExplorer
{
get { return _apiExplorer; }
set { _apiExplorer = value; }
}

public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
{
var schemaRegistry = new SchemaRegistry(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(function () {
var DiscoveryUrlSelector = Backbone.View.extend({
render: function() {
render: function () {
// Don't re-render on subsequent reloads
var defaultVal = this.$el.val()
if (this.$el.prop('tagName') != 'SELECT') {
Expand All @@ -13,7 +13,7 @@
.css('font-size', '0.9em');

var rootUrl = this.options.rootUrl;
_.each(this.options.discoveryPaths, function(path) {
_.each(this.options.discoveryPaths, function (path) {
var option = $('<option>' + rootUrl + "/" + path + '</option>');
select.append(option);
});
Expand Down
285 changes: 141 additions & 144 deletions Swashbuckle.Core/SwaggerUi/CustomAssets/index.html
Original file line number Diff line number Diff line change
@@ -1,153 +1,150 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>%(DocumentTitle)</title>
<link rel="icon" type="image/png" href="images/favicon-32x32-png" sizes="32x32" />
<link rel="icon" type="image/png" href="images/favicon-16x16-png" sizes="16x16" />
<link href='css/typography-css' media='screen' rel='stylesheet' type='text/css'/>
<link href='css/reset-css' media='screen' rel='stylesheet' type='text/css'/>
<link href='css/screen-css' media='screen' rel='stylesheet' type='text/css'/>
<link href='css/reset-css' media='print' rel='stylesheet' type='text/css'/>
<link href='css/print-css' media='print' rel='stylesheet' type='text/css'/>
%(StylesheetIncludes)

<script src='lib/object-assign-pollyfill-js' type='text/javascript'></script>
<script src='lib/jquery-1-8-0-min-js' type='text/javascript'></script>
<script src='lib/jquery-slideto-min-js' type='text/javascript'></script>
<script src='lib/jquery-wiggle-min-js' type='text/javascript'></script>
<script src='lib/jquery-ba-bbq-min-js' type='text/javascript'></script>
<script src='lib/handlebars-4-0-5-js' type='text/javascript'></script>
<script src='lib/lodash-min-js' type='text/javascript'></script>
<script src='lib/backbone-min-js' type='text/javascript'></script>
<script src='swagger-ui-min-js' type='text/javascript'></script>
<script src='lib/highlight-9-1-0-pack-js' type='text/javascript'></script>
<script src='lib/highlight-9-1-0-pack_extended-js' type='text/javascript'></script>
<script src='lib/jsoneditor-min-js' type='text/javascript'></script>
<script src='lib/marked-js' type='text/javascript'></script>
<script src='lib/swagger-oauth-js' type='text/javascript'></script>

<!-- Some basic translations -->
<!-- <script src='lang/translator.js' type='text/javascript'></script> -->
<!-- <script src='lang/ru.js' type='text/javascript'></script> -->
<!-- <script src='lang/en.js' type='text/javascript'></script> -->

<script type="text/javascript">
$(function () {

// Get Swashbuckle config into JavaScript
function arrayFrom(configString) {
return (configString !== "") ? configString.split('|') : [];
}

function stringOrNullFrom(configString) {
return (configString !== "null") ? configString : null;
}

window.swashbuckleConfig = {
rootUrl: '%(RootUrl)',
discoveryPaths: arrayFrom('%(DiscoveryPaths)'),
validatorUrl: stringOrNullFrom('%(ValidatorUrl)'),
customScripts: arrayFrom('%(CustomScripts)'),
docExpansion: '%(DocExpansion)',
supportedSubmitMethods: arrayFrom('%(SupportedSubmitMethods)'),
oAuth2Enabled: ('%(OAuth2Enabled)' == 'true'),
oAuth2ClientId: '%(OAuth2ClientId)',
oAuth2ClientSecret: '%(OAuth2ClientSecret)',
oAuth2Realm: '%(OAuth2Realm)',
oAuth2AppName: '%(OAuth2AppName)',
oAuth2ScopeSeperator: '%(OAuth2ScopeSeperator)',
oAuth2AdditionalQueryStringParams: JSON.parse('%(OAuth2AdditionalQueryStringParams)'),
apiKeyName: '%(ApiKeyName)',
apiKeyIn: '%(ApiKeyIn)'
};

hljs.configure({
highlightSizeThreshold: 5000
});

// Pre load translate...
if(window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}
window.swaggerUi = new SwaggerUi({
url: swashbuckleConfig.rootUrl + "/" + swashbuckleConfig.discoveryPaths[0],
dom_id: "swagger-ui-container",
supportedSubmitMethods: swashbuckleConfig.supportedSubmitMethods,
onComplete: function(swaggerApi, swaggerUi){
if (typeof initOAuth == "function" && swashbuckleConfig.oAuth2Enabled) {
initOAuth({
clientId: swashbuckleConfig.oAuth2ClientId,
clientSecret: swashbuckleConfig.oAuth2ClientSecret,
realm: swashbuckleConfig.oAuth2Realm,
appName: swashbuckleConfig.oAuth2AppName,
scopeSeparator: swashbuckleConfig.oAuth2ScopeSeperator,
additionalQueryStringParams: swashbuckleConfig.oAuth2AdditionalQueryStringParams
<meta charset="UTF-8">
<title>Swagger UI</title>
<link rel="icon" type="image/png" href="images/favicon-32x32-png" sizes="32x32" />
<link rel="icon" type="image/png" href="images/favicon-16x16-png" sizes="16x16" />
<link href='css/typography-css' media='screen' rel='stylesheet' type='text/css' />
<link href='css/reset-css' media='screen' rel='stylesheet' type='text/css' />
<link href='css/screen-css' media='screen' rel='stylesheet' type='text/css' />
<link href='css/reset-css' media='print' rel='stylesheet' type='text/css' />
<link href='css/print-css' media='print' rel='stylesheet' type='text/css' />
%(StylesheetIncludes)

<script src='lib/jquery-1-8-0-min-js' type='text/javascript'></script>
<script src='lib/jquery-slideto-min-js' type='text/javascript'></script>
<script src='lib/jquery-wiggle-min-js' type='text/javascript'></script>
<script src='lib/jquery-ba-bbq-min-js' type='text/javascript'></script>
<script src='lib/handlebars-2-0-0-js' type='text/javascript'></script>
<script src='lib/underscore-min-js' type='text/javascript'></script>
<script src='lib/backbone-min-js' type='text/javascript'></script>
<script src='swagger-ui-js' type='text/javascript'></script>
<script src='lib/highlight-7-3-pack-js' type='text/javascript'></script>
<script src='lib/marked-js' type='text/javascript'></script>
<script src='lib/swagger-oauth-js' type='text/javascript'></script>

<!--%(RootUrl)-->

<!-- Some basic translations -->
<!-- <script src='lang/translator.js' type='text/javascript'></script> -->
<!-- <script src='lang/ru.js' type='text/javascript'></script> -->
<!-- <script src='lang/en.js' type='text/javascript'></script> -->

<script type="text/javascript">
$(function () {
var url = window.location.search.match(/url=([^&]+)/);
if (url && url.length > 1) {
url = decodeURIComponent(url[1]);
} else {
url = "http://petstore.swagger.io/v2/swagger.json";
}

// Get Swashbuckle config into JavaScript
function arrayFrom(configString) {
return (configString !== "") ? configString.split('|') : [];
}

function stringOrNullFrom(configString) {
return (configString !== "null") ? configString : null;
}

window.swashbuckleConfig = {
rootUrl: '%(RootUrl)',
discoveryPaths: arrayFrom('%(DiscoveryPaths)'),
validatorUrl: stringOrNullFrom('%(ValidatorUrl)'),
customScripts: arrayFrom('%(CustomScripts)'),
docExpansion: '%(DocExpansion)',
supportedSubmitMethods: arrayFrom('%(SupportedSubmitMethods)'),
oAuth2Enabled: ('%(OAuth2Enabled)' == 'true'),
oAuth2ClientId: '%(OAuth2ClientId)',
oAuth2ClientSecret: '%(OAuth2ClientSecret)',
oAuth2Realm: '%(OAuth2Realm)',
oAuth2AppName: '%(OAuth2AppName)',
oAuth2ScopeSeperator: '%(OAuth2ScopeSeperator)',
oAuth2AdditionalQueryStringParams: JSON.parse('%(OAuth2AdditionalQueryStringParams)'),
apiKeyName: '%(ApiKeyName)',
apiKeyIn: '%(ApiKeyIn)'
};

// Pre load translate...
if (window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}
window.swaggerUi = new SwaggerUi({
url: swashbuckleConfig.rootUrl + "/" + swashbuckleConfig.discoveryPaths[0],
dom_id: "swagger-ui-container",
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
onComplete: function (swaggerApi, swaggerUi) {
if (typeof initOAuth == "function") {
initOAuth({
clientId: "your-client-id",
clientSecret: "your-client-secret",
realm: "your-realms",
appName: "your-app-name",
scopeSeparator: ","
});
}

if (window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}

$('pre code').each(function (i, e) {
hljs.highlightBlock(e)
});

addApiKeyAuthorization();
},
onFailure: function (data) {
log("Unable to Load SwaggerUI");
},
docExpansion: "none",
apisSorter: "alpha",
showRequestHeaders: false
});
}

if(window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}

addApiKeyAuthorization();

window.swaggerApi = swaggerApi;
_.each(swashbuckleConfig.customScripts, function (script) {
$.getScript(script);
});
},
onFailure: function(data) {
log("Unable to Load SwaggerUI");
},
docExpansion: swashbuckleConfig.docExpansion,
jsonEditor: false,
apisSorter: null, // default to server
defaultModelRendering: 'schema',
showRequestHeaders: false,
oauth2RedirectUrl: window.location.href.replace('index', 'o2c-html').split('#')[0]
});

if (window.swashbuckleConfig.validatorUrl !== '')
window.swaggerUi.options.validatorUrl = window.swashbuckleConfig.validatorUrl;

function addApiKeyAuthorization() {
var key = $('#input_apiKey')[0].value;
if (key && key.trim() != "") {
if (swashbuckleConfig.apiKeyIn === "query") {
key = encodeURIComponent(key);
}
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(swashbuckleConfig.apiKeyName, key, swashbuckleConfig.apiKeyIn);
window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
log("added key " + key);
}
}
$('#input_apiKey').change(addApiKeyAuthorization);

window.swaggerUi.load();

function log() {
if ('console' in window) {
console.log.apply(console, arguments);
}
}
});
</script>

function addApiKeyAuthorization() {
var key = encodeURIComponent($('#input_apiKey')[0].value);
if (key && key.trim() != "") {
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("api_key", key, "query");
window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
log("added key " + key);
}
}

$('#input_apiKey').change(addApiKeyAuthorization);

// if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
/*
var apiKey = "myApiKeyXXXX123456789";
$('#input_apiKey').val(apiKey);
*/

window.swaggerUi.load();

function log() {
if ('console' in window) {
console.log.apply(console, arguments);
}
}
});
</script>
</head>

<body class="swagger-section">
<div id='header'>
<div class="swagger-ui-wrap">
<a id="logo" href="http://swagger.io"><img class="logo__img" alt="swagger" height="30" width="30" src="images/logo_small-png" /><span class="logo__title">swagger</span></a>
<form id='api_selector'>
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text" /></div>
<div class='input'><a id="explore" class="header__btn" href="#" data-sw-translate>Explore</a></div>
</form>
</div>
</div>

<div id="message-bar" class="swagger-ui-wrap" data-sw-translate>&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
<div id='header'>
<div class="swagger-ui-wrap">
<a id="logo" href="http://swagger.io">swagger</a>
<form id='api_selector'>
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text" /></div>
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text" /></div>
<div class='input'><a id="explore" href="#" data-sw-translate>Explore</a></div>
</form>
</div>
</div>

<div id="message-bar" class="swagger-ui-wrap" data-sw-translate>&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</html>
Loading