Compare commits

...
18 Commits
Author SHA1 Message Date
Tony Tam 356ae491aa fixed duplicate model, updated example name 2012-11-27 16:03:54 -08:00
Tony Tam 7bc8109e88 re-merged #96 2012-11-27 15:04:12 -08:00
Tony Tam 3fd37c3ef6 Merge pull request #102 from sequielo/patch-1
Update src/main/javascript/doc.js
2012-11-27 13:48:06 -08:00
Tony Tam 586c6d6292 Merge pull request #103 from pose/xml-pretty-print
Adding XML pretty printing to responses
2012-11-27 13:47:51 -08:00
Alberto Pose 12bdd38406 Adding fallback to XML when JSON response parsing fails. 2012-11-27 18:24:32 -03:00
sequielo 369b639329 Update src/main/javascript/doc.js
fixed #101: expand operations for resource when resource paramenter is an empty string.
2012-11-27 00:14:47 -02:00
Tony Tam 3f9ed33f7f added missing files per #100 2012-11-26 13:47:34 -08:00
Tony Tam d1bffc8fb4 manual merge of #97 2012-11-25 21:52:30 -08:00
Tony Tam 55f0c1a2f8 Merge pull request #95 from pose/json-response-pretty-print
Adding JSON sample UI to response
2012-11-25 21:10:52 -08:00
Tony Tam 03e21019d2 Merge pull request #94 from pose/titles-fix
Small change to signature titles
2012-11-25 21:10:16 -08:00
Tony Tam 75fd46ef21 Merge pull request #96 from pose/operation-nonce
Adding operation number to create a unique href for the <a/> tag.
2012-11-25 21:09:40 -08:00
Alberto Pose 75ff471425 Adding operation number to create a unique href for the <a/> tag. 2012-11-22 17:45:40 -03:00
Alberto Pose dd1b2219b8 Adding JSON sample UI to response 2012-11-21 13:20:09 -03:00
Alberto Pose f5cfee8296 Small improvements to some titles 2012-11-21 11:50:05 -03:00
Ayush Gupta a1337cf118 coffeescript compiled swagger.js for #91 2012-11-20 14:36:16 +05:30
Ayush Gupta 2bc67cbcae Merge pull request #91 from predicador37/master
Fixes Issue  #68 in a generic way for any param with any regex
2012-11-20 01:04:08 -08:00
predicador37 30886478d4 fixes https://github.com/wordnik/swagger-core/issues/68 in a generic way. Should work with all params. 2012-11-20 09:28:03 +01:00
Ayush Gupta fc320397e9 fix from https://github.com/wordnik/swagger-core/issues/68 2012-11-20 12:04:10 +05:30
14 changed files with 202 additions and 32 deletions
+1
View File
@@ -11,6 +11,7 @@ sourceFiles = [
'view/StatusCodeView'
'view/ParameterView'
'view/SignatureView'
'view/ContentTypeView'
]
+7 -4
View File
@@ -255,7 +255,7 @@
_results = [];
for (_i = 0, _len = ops.length; _i < _len; _i++) {
o = ops[_i];
op = new SwaggerOperation(o.nickname, resource_path, o.httpMethod, o.parameters, o.summary, o.notes, o.responseClass, o.errorResponses, this);
op = new SwaggerOperation(o.nickname, resource_path, o.httpMethod, o.parameters, o.summary, o.notes, o.responseClass, o.errorResponses, this, o.supportedContentTypes);
this.operations[op.nickname] = op;
_results.push(this.operationsArray.push(op));
}
@@ -413,7 +413,7 @@
SwaggerOperation = (function() {
function SwaggerOperation(nickname, path, httpMethod, parameters, summary, notes, responseClass, errorResponses, resource) {
function SwaggerOperation(nickname, path, httpMethod, parameters, summary, notes, responseClass, errorResponses, resource, supportedContentTypes) {
var parameter, v, _i, _j, _len, _len1, _ref, _ref1, _ref2,
_this = this;
this.nickname = nickname;
@@ -425,6 +425,7 @@
this.responseClass = responseClass;
this.errorResponses = errorResponses;
this.resource = resource;
this.supportedContentTypes = supportedContentTypes;
this["do"] = __bind(this["do"], this);
if (this.nickname == null) {
@@ -445,6 +446,7 @@
}
if (this.responseClass != null) {
this.responseClassSignature = this.getSignature(this.responseClass, this.resource.models);
this.responseSampleJSON = this.getSampleJSON(this.responseClass, this.resource.models);
}
this.errorResponses = this.errorResponses || [];
_ref1 = this.parameters;
@@ -562,7 +564,7 @@
};
SwaggerOperation.prototype.urlify = function(args, includeApiKey) {
var param, queryParams, url, _i, _len, _ref;
var param, queryParams, reg, url, _i, _len, _ref;
if (includeApiKey == null) {
includeApiKey = true;
}
@@ -572,7 +574,8 @@
param = _ref[_i];
if (param.paramType === 'path') {
if (args[param.name]) {
url = url.replace("{" + param.name + "}", encodeURIComponent(args[param.name]));
reg = new RegExp('\{' + param.name + '[^\}]*\}', 'gi');
url = url.replace(reg, encodeURIComponent(args[param.name]));
delete args[param.name];
} else {
throw "" + param.name + " is a required path param.";
@@ -0,0 +1,19 @@
class ContentTypeView extends Backbone.View
initialize: ->
render: ->
template = @template()
$(@el).html(template(@model))
@isParam = @model.isParam
if @isParam
$('label[for=contentType]', $(@el)).text('Parameter content type:')
else
$('label[for=contentType]', $(@el)).text('Response Content Type')
@
template: ->
Handlebars.templates.content_type
@@ -14,6 +14,24 @@ class OperationView extends Backbone.View
$(@el).html(Handlebars.templates.operation(@model))
if @model.responseClassSignature and @model.responseClassSignature != 'string'
signatureModel =
sampleJSON: @model.responseSampleJSON
isParam: false
signature: @model.responseClassSignature
responseSignatureView = new SignatureView({model: signatureModel, tagName: 'div'})
$('.model-signature', $(@el)).append responseSignatureView.render().el
else
$('.model-signature', $(@el)).html(@model.responseClass)
contentTypeModel =
isParam: false
supportedContentTypes: @model.supportedContentTypes
contentTypeView = new ContentTypeView({model: contentTypeModel})
$('.content-type', $(@el)).append contentTypeView.render().el
# Render each parameter
@addParameter param for param in @model.parameters
@@ -106,6 +124,15 @@ class OperationView extends Backbone.View
obj.contentType = "application/json" if (obj.type.toLowerCase() == "post" or obj.type.toLowerCase() == "put" or obj.type.toLowerCase() == "patch")
obj.contentType = false if isFileUpload
paramContentTypeField = $("td select[name=contentType]", $(@el)).val()
if paramContentTypeField
obj.contentType = paramContentTypeField
responseContentTypeField = $('.content > .content-type > div > select[name=contentType]', $(@el)).val()
if responseContentTypeField
obj.headers = if obj.headers? then obj.headers else {}
obj.headers.accept = responseContentTypeField
jQuery.ajax(obj)
false
# $.getJSON(invocationUrl, (r) => @showResponse(r)).complete((r) => @showCompleteStatus(r)).error (r) => @showErrorStatus(r)
@@ -120,7 +147,7 @@ class OperationView extends Backbone.View
# Show response from server
showResponse: (response) ->
prettyJson = JSON.stringify(response, null, "\t").replace(/\n/g, "<br>")
$(".response_body", $(@el)).html prettyJson
$(".response_body", $(@el)).html escape(prettyJson)
# Show error from server
@@ -131,12 +158,74 @@ class OperationView extends Backbone.View
showCompleteStatus: (data) ->
@showStatus data
# Adapted from http://stackoverflow.com/a/2893259/454004
formatXml: (xml) ->
reg = /(>)(<)(\/*)/g
wsexp = /[ ]*(.*)[ ]+\n/g
contexp = /(<.+>)(.+\n)/g
xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2')
pad = 0
formatted = ''
lines = xml.split('\n')
indent = 0
lastType = 'other'
# 4 types of tags - single, closing, opening, other (text, doctype, comment) - 4*4 = 16 transitions
transitions =
'single->single': 0
'single->closing': -1
'single->opening': 0
'single->other': 0
'closing->single': 0
'closing->closing': -1
'closing->opening': 0
'closing->other': 0
'opening->single': 1
'opening->closing': 0
'opening->opening': 1
'opening->other': 1
'other->single': 0
'other->closing': -1
'other->opening': 0
'other->other': 0
for ln in lines
do (ln) ->
types =
# is this line a single tag? ex. <br />
single: Boolean(ln.match(/<.+\/>/))
# is this a closing tag? ex. </a>
closing: Boolean(ln.match(/<\/.+>/))
# is this even a tag (that's not <!something>)
opening: Boolean(ln.match(/<[^!?].*>/))
[type] = (key for key, value of types when value)
type = if type is undefined then 'other' else type
fromTo = lastType + '->' + type
lastType = type
padding = ''
indent += transitions[fromTo]
padding = (' ' for j in [0...(indent)]).join('')
if fromTo == 'opening->closing'
#substr removes line break (\n) from prev loop
formatted = formatted.substr(0, formatted.length - 1) + ln + '\n'
else
formatted += padding + ln + '\n'
formatted
# puts the response data in UI
showStatus: (data) ->
try
response_body = '<pre class="json"><code>' + JSON.stringify(JSON.parse(data.responseText), null, 2) + "</code></pre>"
code = $('<code />').text(JSON.stringify(JSON.parse(data.responseText), null, 2))
pre = $('<pre class="json" />').append(code)
catch error
response_body = "<span style='color:red'>&nbsp;&nbsp;&nbsp;[unable to parse as json; raw response below]</span><br><pre>" + data.responseText + "</pre>"
code = $('<code />').text(@formatXml(data.responseText))
pre = $('<pre class="xml" />').append(code)
response_body = pre
$(".response_code", $(@el)).html "<pre>" + data.status + "</pre>"
$(".response_body", $(@el)).html response_body
$(".response_headers", $(@el)).html "<pre>" + data.getAllResponseHeaders() + "</pre>"
@@ -146,5 +235,5 @@ class OperationView extends Backbone.View
hljs.highlightBlock($('.response_body', $(@el))[0])
toggleOperationContent: ->
elem = $('#' + @model.resourceName + "_" + @model.nickname + "_" + @model.httpMethod + "_content");
elem = $('#' + @model.resourceName + "_" + @model.nickname + "_" + @model.httpMethod + "_" + @model.number + "_content")
if elem.is(':visible') then Docs.collapseOperation(elem) else Docs.expandOperation(elem)
@@ -8,11 +8,23 @@ class ParameterView extends Backbone.View
template = @template()
$(@el).html(template(@model))
signatureModel =
sampleJSON: @model.sampleJSON
isParam: true
signature: @model.signature
if @model.sampleJSON
signatureView = new SignatureView({model: @model, tagName: 'div'})
$('.model-signature', $(@el)).append signatureView.render().el
signatureView = new SignatureView({model: signatureModel, tagName: 'div'})
$('.model-signature', $(@el)).append signatureView.render().el
else
$('.model-signature', $(@el)).html(@model.signature)
$('.model-signature', $(@el)).html(@model.signature)
contentTypeModel =
isParam: true
supportedContentTypes: @model.supportedContentTypes
contentTypeView = new ContentTypeView({model: contentTypeModel})
$('.content-type', $(@el)).append contentTypeView.render().el
@
@@ -4,11 +4,18 @@ class ResourceView extends Backbone.View
render: ->
$(@el).html(Handlebars.templates.resource(@model))
@number = 0
# Render each operation
@addOperation operation for operation in @model.operationsArray
@
addOperation: (operation) ->
operation.number = @number
# Render an operation and add it to operations li
operationView = new OperationView({model: operation, tagName: 'li', className: 'endpoint'})
$('.endpoints', $(@el)).append operationView.render().el
$('.endpoints', $(@el)).append operationView.render().el
@number++
@@ -13,6 +13,11 @@ class SignatureView extends Backbone.View
@switchToDescription()
@isParam = @model.isParam
if @isParam
$('.notice', $(@el)).text('Click to set as parameter value')
@
template: ->
@@ -36,8 +41,11 @@ class SignatureView extends Backbone.View
# handler for snippet to text area
snippetToTextArea: (e) ->
e?.preventDefault()
textArea = $('textarea', $(@el.parentNode.parentNode.parentNode))
if $.trim(textArea.val()) == ''
if @isParam
e?.preventDefault()
textArea = $('textarea', $(@el.parentNode.parentNode.parentNode))
if $.trim(textArea.val()) == ''
textArea.val(@model.sampleJSON)
+9
View File
@@ -1579,3 +1579,12 @@ body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operatio
pre code {
background: none;
}
.content > .content-type > div > label {
clear: both;
display: block;
color: #0F6AB4;
font-size: 1.1em;
margin: 0;
padding: 15px 0 5px 0px;
}
+10
View File
@@ -126,6 +126,11 @@ var Docs = {
// Expand resource
expandEndpointListForResource: function(resource) {
var resource = Docs.escapeResourceName(resource);
if (resource == '') {
$('.resource ul.endpoints').slideDown();
return;
}
$('li#resource_' + resource).addClass('active');
var elem = $('li#resource_' + resource + ' ul.endpoints');
@@ -144,6 +149,11 @@ var Docs = {
expandOperationsForResource: function(resource) {
// Make sure the resource container is open..
Docs.expandEndpointListForResource(resource);
if (resource == '') {
$('.resource ul.endpoints li.operation div.content').slideDown();
return;
}
$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {
Docs.expandOperation($(this));
@@ -0,0 +1,8 @@
{{#if supportedContentTypes}}
<label for="contentType"></label>
<select name="contentType">
{{#each supportedContentTypes}}
<option value="{{{this}}}">{{{this}}}</option>
{{/each}}
</select>
{{/if}}
+7 -7
View File
@@ -1,22 +1,22 @@
<ul class='operations' >
<li class='{{httpMethod}} operation' id='{{resourceName}}_{{nickname}}_{{httpMethod}}'>
<li class='{{httpMethod}} operation' id='{{resourceName}}_{{nickname}}_{{httpMethod}}_{{number}}'>
<div class='heading'>
<h3>
<span class='http_method'>
<a href='#!/{{resourceName}}/{{nickname}}_{{httpMethod}}' class="toggleOperation">{{httpMethod}}</a>
<a href='#!/{{resourceName}}/{{nickname}}_{{httpMethod}}_{{number}}' class="toggleOperation">{{httpMethod}}</a>
</span>
<span class='path'>
<a href='#!/{{resourceName}}/{{nickname}}_{{httpMethod}}' class="toggleOperation">{{path}}</a>
<a href='#!/{{resourceName}}/{{nickname}}_{{httpMethod}}_{{number}}' class="toggleOperation">{{path}}</a>
</span>
</h3>
<ul class='options'>
<li>
<a href='#!/{{resourceName}}/{{nickname}}_{{httpMethod}}' class="toggleOperation">{{{summary}}}</a>
<a href='#!/{{resourceName}}/{{nickname}}_{{httpMethod}}_{{number}}' class="toggleOperation">{{{summary}}}</a>
</li>
</ul>
</div>
<div class='content' id='{{resourceName}}_{{nickname}}_{{httpMethod}}_content' style='display:none'>
<div class='content' id='{{resourceName}}_{{nickname}}_{{httpMethod}}_{{number}}_content' style='display:none'>
{{#if notes}}
<h4>Implementation Notes</h4>
<p>{{{notes}}}</p>
@@ -24,7 +24,7 @@
{{#if responseClass}}
<h4>Response Class</h4>
{{#if responseClassSignature}}
<p><span class="model-signature">{{{responseClassSignature}}}</span></p>
<p><span class="model-signature"></span></p>
{{else}}
<p>{{{responseClass}}}</p>
{{/if}}
@@ -81,4 +81,4 @@
</div>
</div>
</li>
</ul>
</ul>
+5 -3
View File
@@ -8,20 +8,22 @@
{{#if defaultValue}}
<textarea class='body-textarea' name='{{name}}'>{{defaultValue}}</textarea>
{{else}}
<textarea class='body-textarea' name='{{name}}'></textarea>
<textarea class='body-textarea' name='{{name}}'></textarea>
<br />
<div class="content-type" />
{{/if}}
{{/if}}
{{else}}
{{#if defaultValue}}
<input minlength='0' name='{{name}}' placeholder='' type='text' value='{{defaultValue}}'/>
{{else}}
<input minlength='0' name='{{name}}' placeholder='' type='text' value=''/>
<input minlength='0' name='{{name}}' placeholder='' type='text' value=''/>
{{/if}}
{{/if}}
</td>
<td>{{{description}}}</td>
<td>
<span class="model-signature"></span>
<span class="model-signature"></span>
</td>
+6 -4
View File
@@ -7,7 +7,9 @@
{{#if defaultValue}}
<textarea class='body-textarea' placeholder='(required)' name='{{name}}'>{{defaultValue}}</textarea>
{{else}}
<textarea class='body-textarea' placeholder='(required)' name='{{name}}'></textarea>
<textarea class='body-textarea' placeholder='(required)' name='{{name}}'></textarea>
<br />
<div class="content-type" />
{{/if}}
{{/if}}
{{else}}
@@ -15,14 +17,14 @@
<input class='required' type='file' name='{{name}}'/>
{{else}}
{{#if defaultValue}}
<input class='required' minlength='1' name='{{name}}' placeholder='(required)' type='text' value='{{defaultValue}}'/>
<input class='required' minlength='1' name='{{name}}' placeholder='(required)' type='text' value='{{defaultValue}}'/>
{{else}}
<input class='required' minlength='1' name='{{name}}' placeholder='(required)' type='text' value=''/>
<input class='required' minlength='1' name='{{name}}' placeholder='(required)' type='text' value=''/>
{{/if}}
{{/if}}
{{/if}}
</td>
<td>
<strong>{{{description}}}</strong>
<strong>{{{description}}}</strong>
</td>
<td><span class="model-signature"></span></td>
+3 -3
View File
@@ -1,7 +1,7 @@
<div>
<ul class="signature-nav">
<li><a class="description-link" href="#">Description</a></li>
<li><a class="snippet-link" href="#">Snippet</a></li>
<li><a class="description-link" href="#">Model</a></li>
<li><a class="snippet-link" href="#">Model Schema</a></li>
</ul>
<div>
@@ -12,7 +12,7 @@
<div class="snippet">
<pre><code>{{sampleJSON}}</code></pre>
<small>Click to set as parameter value</small>
<small class="notice"></small>
</div>
</div>