amy 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/views/js/amy.js ADDED
@@ -0,0 +1,301 @@
1
+ // Generated by CoffeeScript 1.6.3
2
+ (function() {
3
+ var MethodRunner, Resource, ResourceForm, Tabelle, Utils;
4
+
5
+ Tabelle = (function() {
6
+ function Tabelle() {
7
+ return;
8
+ }
9
+
10
+ Tabelle.prototype.setup = function(url) {
11
+ var request_config, self;
12
+ self = this;
13
+ request_config = {
14
+ url: url + "?date=" + (new Date()).getTime(),
15
+ type: "GET",
16
+ dataType: "json",
17
+ success: function(data) {
18
+ var config, i, resource, _ref;
19
+ $('.resources div').remove();
20
+ i = 0;
21
+ _ref = data['resources'];
22
+ for (resource in _ref) {
23
+ config = _ref[resource];
24
+ resource = self.add_resource(resource, config, i, data['base_url']);
25
+ resource.toggle();
26
+ i++;
27
+ }
28
+ self.add_resource_events(data);
29
+ return self.toggle_method_if_necessary();
30
+ },
31
+ error: function(e) {
32
+ return $('.resources div').remove();
33
+ }
34
+ };
35
+ $.ajax(request_config);
36
+ };
37
+
38
+ Tabelle.prototype.add_resource = function(name, resource, i, base_url) {
39
+ if (base_url == null) {
40
+ base_url = "";
41
+ }
42
+ resource = new Resource(name, resource, i, base_url);
43
+ resource.build();
44
+ return resource;
45
+ };
46
+
47
+ Tabelle.prototype.add_resource_events = function(data) {
48
+ var handlerIn, handlerOut;
49
+ handlerIn = function() {
50
+ $(this).css("background", "#f5f5f5");
51
+ $(this).children('div').children().css('color', 'black');
52
+ };
53
+ handlerOut = function() {
54
+ $(this).css("background", "#fff");
55
+ $(this).children('div').children().css('color', '#999');
56
+ };
57
+ $(".resource").hover(handlerIn, handlerOut);
58
+ $('.resource').click(function() {
59
+ event.stopPropagation();
60
+ $(this).next().fadeToggle();
61
+ });
62
+ };
63
+
64
+ Tabelle.prototype.toggle_method_if_necessary = function() {
65
+ var anchor, fields;
66
+ anchor = window.location.hash.replace('!', '');
67
+ anchor = anchor.replace(/\//g, "\\/");
68
+ anchor = anchor.replace(/:/g, '\\:');
69
+ fields = anchor.split('#');
70
+ $("#" + fields[1] + " + div .method." + fields[2] + " .content").fadeToggle();
71
+ $("#" + fields[1] + " + div .method." + fields[2] + " .form").fadeToggle();
72
+ $("#" + fields[1]).next().fadeToggle();
73
+ };
74
+
75
+ Tabelle.toggleMethods = function(i) {
76
+ event.stopPropagation();
77
+ $("#resource" + i).fadeToggle();
78
+ };
79
+
80
+ Tabelle.showJSON = function() {
81
+ var url;
82
+ event.stopPropagation();
83
+ url = $("#selector #key").val();
84
+ if (url) {
85
+ window.open(url, "_self");
86
+ }
87
+ };
88
+
89
+ window.toggleMethods = Tabelle.toggleMethods;
90
+
91
+ window.showJSON = Tabelle.showJSON;
92
+
93
+ return Tabelle;
94
+
95
+ })();
96
+
97
+ $(document).ready(function() {
98
+ var tabelle, url, utils;
99
+ tabelle = new Tabelle;
100
+ utils = new Utils;
101
+ utils.toggle_by_class('content');
102
+ url = utils.default_config_url();
103
+ $('#header #selector input').val(url);
104
+ tabelle.setup(url);
105
+ $('#header #explore').click(function() {
106
+ return tabelle.setup($('#header #selector input').val());
107
+ });
108
+ });
109
+
110
+ ResourceForm = (function() {
111
+ function ResourceForm(method, config) {
112
+ this.method = method;
113
+ this.config = config;
114
+ return;
115
+ }
116
+
117
+ ResourceForm.prototype.build = function() {
118
+ var html, params, _ref;
119
+ html = '';
120
+ params = this.config['params'] || [];
121
+ if ((_ref = this.method) === "get" || _ref === "options" || _ref === "head") {
122
+ html = this.add_form(params);
123
+ }
124
+ return html;
125
+ };
126
+
127
+ ResourceForm.prototype.add_form = function(params) {
128
+ var html, param, _i, _len;
129
+ html = '<form>';
130
+ for (_i = 0, _len = params.length; _i < _len; _i++) {
131
+ param = params[_i];
132
+ html += "<div class='field'>";
133
+ html += "<label>:" + param[0] + "<small>(" + param[1] + ")</small></label>";
134
+ html += "<input type='text' id='" + param[0] + "'></input>";
135
+ html += '</div>';
136
+ }
137
+ html += '<input type="button" value="Submit"></input>';
138
+ html += '</form>';
139
+ html += '<textarea class="output"></textarea>';
140
+ return html;
141
+ };
142
+
143
+ return ResourceForm;
144
+
145
+ })();
146
+
147
+ MethodRunner = (function() {
148
+ function MethodRunner(method, config, base_url, i) {
149
+ this.method = method;
150
+ this.config = config;
151
+ this.base_url = base_url;
152
+ this.i = i;
153
+ return;
154
+ }
155
+
156
+ MethodRunner.prototype.attach_to_form = function() {
157
+ var self;
158
+ self = this;
159
+ $("#resource" + this.i + " ." + this.method + " .form input[type=button]").click(function(event) {
160
+ var config, outputField, params;
161
+ params = self.scrap_params(event);
162
+ outputField = $(event.target).parent().siblings('.output');
163
+ config = self.config[self.method];
164
+ return self.execute_method(self.method.toUpperCase(), self.base_url, config, params, outputField);
165
+ });
166
+ };
167
+
168
+ MethodRunner.prototype.scrap_params = function(event) {
169
+ var fields, oid, params;
170
+ oid = $(event.target).parentsUntil(".methods");
171
+ oid = $($(oid)[oid.length - 1]).parent().prev().attr('id');
172
+ fields = $(event.target).parent().children('.field').children('input');
173
+ params = {};
174
+ $.each(fields, function(i, n) {
175
+ params[$(n).attr('id')] = $(n).val();
176
+ });
177
+ return params;
178
+ };
179
+
180
+ MethodRunner.prototype.execute_method = function(method, base_url, config, params, output) {
181
+ var ajax_call, oid, param, url;
182
+ url = "" + base_url + config['url'];
183
+ for (oid in params) {
184
+ param = params[oid];
185
+ url = url.replace(':' + oid, param);
186
+ }
187
+ ajax_call = {
188
+ type: method,
189
+ async: true,
190
+ url: url,
191
+ success: function(data) {
192
+ output.text(JSON.stringify(data));
193
+ }
194
+ };
195
+ $.ajax(ajax_call);
196
+ };
197
+
198
+ return MethodRunner;
199
+
200
+ })();
201
+
202
+ Resource = (function() {
203
+ function Resource(resource, config, i, base_url) {
204
+ this.resource = resource;
205
+ this.config = config;
206
+ this.i = i;
207
+ this.base_url = base_url;
208
+ return;
209
+ }
210
+
211
+ Resource.prototype.toggle = function() {
212
+ $("#resource" + this.i).toggle();
213
+ };
214
+
215
+ Resource.prototype.build = function() {
216
+ var data, html, method, runner, _ref;
217
+ html = this.build_html(this.resource, this.config, this.i);
218
+ $('.resources').append(html);
219
+ _ref = this.config['config'];
220
+ for (method in _ref) {
221
+ data = _ref[method];
222
+ runner = new MethodRunner(method, this.config['config'], this.base_url, this.i);
223
+ runner.attach_to_form();
224
+ }
225
+ $("#resource" + this.i + " .content").toggle();
226
+ $("#resource" + this.i + " .form").toggle();
227
+ $("#resource" + this.i + " .method .url a").click(function(event) {
228
+ $(this).parent().parent().next().next().fadeToggle();
229
+ return $(this).parent().parent().next().fadeToggle();
230
+ });
231
+ };
232
+
233
+ Resource.prototype.build_html = function(resource, config, i) {
234
+ var html;
235
+ html = "<div class='resource' id='" + resource + "'>";
236
+ html += "<div class='name'> <a href='#!" + resource + "'>" + resource + "</a> </div>";
237
+ html += "<div class='title'>" + config['title'] + "</div>";
238
+ html += "<div class='menu'> <a href='#' onclick='toggleMethods(" + i + ")'>Show/Hide</a> | <a href='#' onclick='showJSON()'>Raw</a> </div>";
239
+ html += '</div>';
240
+ html += this.add_section(resource, config['config'], config['config'], i);
241
+ return html;
242
+ };
243
+
244
+ Resource.prototype.add_section = function(resource, config, entries, i) {
245
+ var content, field, html, method, method_name;
246
+ html = "<div class='methods' id='resource" + i + "'>";
247
+ for (method in config) {
248
+ field = config[method];
249
+ method_name = method.replace(/(\d+)/g, '');
250
+ content = entries[method.toLowerCase()]['content'];
251
+ html += "<div class='method " + method_name + "'>";
252
+ html += '<div class="header">';
253
+ html += "<div class='name " + method_name + "'>" + method_name + "</div>";
254
+ html += "<div class='url'><a href='#!" + resource + "#" + (method.toLowerCase()) + "'>" + field['url'] + "</a></div>";
255
+ html += "<div class='desc'>" + field['title'] + "</div>";
256
+ html += '</div>';
257
+ html += "<div class='form'>" + (this.add_form(method.toLowerCase(), entries[method.toLowerCase()])) + "</div>";
258
+ html += "<div class='content'>" + content + "</div>";
259
+ html += "</div>";
260
+ }
261
+ html += '</div>';
262
+ return html;
263
+ };
264
+
265
+ Resource.prototype.add_form = function(method, config) {
266
+ var form;
267
+ form = new ResourceForm(method, config);
268
+ return form.build();
269
+ };
270
+
271
+ return Resource;
272
+
273
+ })();
274
+
275
+ Utils = (function() {
276
+ function Utils() {
277
+ return;
278
+ }
279
+
280
+ Utils.prototype.toggle_by_class = function(clazz) {
281
+ var elem, elems, _i, _len;
282
+ elems = document.getElementsByClassName(clazz);
283
+ for (_i = 0, _len = elems.length; _i < _len; _i++) {
284
+ elem = elems[_i];
285
+ console.log(elem);
286
+ $(elem).toggle(false);
287
+ }
288
+ };
289
+
290
+ Utils.prototype.default_config_url = function() {
291
+ var pn;
292
+ pn = window.location.pathname;
293
+ pn = pn.replace(pn.substring(pn.lastIndexOf('/') + 1, pn.length), '');
294
+ return "" + window.location.origin + pn + "data.json";
295
+ };
296
+
297
+ return Utils;
298
+
299
+ })();
300
+
301
+ }).call(this);
@@ -0,0 +1 @@
1
+ (function(){var t,e,o,n,r;n=function(){function t(){}return t.prototype.setup=function(t){var e,o;o=this,e={url:t+"?date="+(new Date).getTime(),type:"GET",dataType:"json",success:function(t){var e,n,r,i;$(".resources div").remove(),n=0,i=t.resources;for(r in i)e=i[r],r=o.add_resource(r,e,n,t.base_url),r.toggle(),n++;return o.add_resource_events(t),o.toggle_method_if_necessary()},error:function(){return $(".resources div").remove()}},$.ajax(e)},t.prototype.add_resource=function(t,o,n,r){return null==r&&(r=""),o=new e(t,o,n,r),o.build(),o},t.prototype.add_resource_events=function(){var t,e;t=function(){$(this).css("background","#f5f5f5"),$(this).children("div").children().css("color","black")},e=function(){$(this).css("background","#fff"),$(this).children("div").children().css("color","#999")},$(".resource").hover(t,e),$(".resource").click(function(){event.stopPropagation(),$(this).next().fadeToggle()})},t.prototype.toggle_method_if_necessary=function(){var t,e;t=window.location.hash.replace("!",""),t=t.replace(/\//g,"\\/"),t=t.replace(/:/g,"\\:"),e=t.split("#"),$("#"+e[1]+" + div .method."+e[2]+" .content").fadeToggle(),$("#"+e[1]+" + div .method."+e[2]+" .form").fadeToggle(),$("#"+e[1]).next().fadeToggle()},t.toggleMethods=function(t){event.stopPropagation(),$("#resource"+t).fadeToggle()},t.showJSON=function(){var t;event.stopPropagation(),t=$("#selector #key").val(),t&&window.open(t,"_self")},window.toggleMethods=t.toggleMethods,window.showJSON=t.showJSON,t}(),$(document).ready(function(){var t,e,o;t=new n,o=new r,o.toggle_by_class("content"),e=o.default_config_url(),$("#header #selector input").val(e),t.setup(e),$("#header #explore").click(function(){return t.setup($("#header #selector input").val())})}),o=function(){function t(t,e){this.method=t,this.config=e}return t.prototype.build=function(){var t,e,o;return t="",e=this.config.params||[],("get"===(o=this.method)||"options"===o||"head"===o)&&(t=this.add_form(e)),t},t.prototype.add_form=function(t){var e,o,n,r;for(e="<form>",n=0,r=t.length;r>n;n++)o=t[n],e+="<div class='field'>",e+="<label>:"+o[0]+"<small>("+o[1]+")</small></label>",e+="<input type='text' id='"+o[0]+"'></input>",e+="</div>";return e+='<input type="button" value="Submit"></input>',e+="</form>",e+='<textarea class="output"></textarea>'},t}(),t=function(){function t(t,e,o,n){this.method=t,this.config=e,this.base_url=o,this.i=n}return t.prototype.attach_to_form=function(){var t;t=this,$("#resource"+this.i+" ."+this.method+" .form input[type=button]").click(function(e){var o,n,r;return r=t.scrap_params(e),n=$(e.target).parent().siblings(".output"),o=t.config[t.method],t.execute_method(t.method.toUpperCase(),t.base_url,o,r,n)})},t.prototype.scrap_params=function(t){var e,o,n;return o=$(t.target).parentsUntil(".methods"),o=$($(o)[o.length-1]).parent().prev().attr("id"),e=$(t.target).parent().children(".field").children("input"),n={},$.each(e,function(t,e){n[$(e).attr("id")]=$(e).val()}),n},t.prototype.execute_method=function(t,e,o,n,r){var i,s,a,c;c=""+e+o.url;for(s in n)a=n[s],c=c.replace(":"+s,a);i={type:t,async:!0,url:c,success:function(t){r.text(JSON.stringify(t))}},$.ajax(i)},t}(),e=function(){function e(t,e,o,n){this.resource=t,this.config=e,this.i=o,this.base_url=n}return e.prototype.toggle=function(){$("#resource"+this.i).toggle()},e.prototype.build=function(){var e,o,n,r,i;o=this.build_html(this.resource,this.config,this.i),$(".resources").append(o),i=this.config.config;for(n in i)e=i[n],r=new t(n,this.config.config,this.base_url,this.i),r.attach_to_form();$("#resource"+this.i+" .content").toggle(),$("#resource"+this.i+" .form").toggle(),$("#resource"+this.i+" .method .url a").click(function(){return $(this).parent().parent().next().next().fadeToggle(),$(this).parent().parent().next().fadeToggle()})},e.prototype.build_html=function(t,e,o){var n;return n="<div class='resource' id='"+t+"'>",n+="<div class='name'> <a href='#!"+t+"'>"+t+"</a> </div>",n+="<div class='title'>"+e.title+"</div>",n+="<div class='menu'> <a href='#' onclick='toggleMethods("+o+")'>Show/Hide</a> | <a href='#' onclick='showJSON()'>Raw</a> </div>",n+="</div>",n+=this.add_section(t,e.config,e.config,o)},e.prototype.add_section=function(t,e,o,n){var r,i,s,a,c;s="<div class='methods' id='resource"+n+"'>";for(a in e)i=e[a],c=a.replace(/(\d+)/g,""),r=o[a.toLowerCase()].content,s+="<div class='method "+c+"'>",s+='<div class="header">',s+="<div class='name "+c+"'>"+c+"</div>",s+="<div class='url'><a href='#!"+t+"#"+a.toLowerCase()+"'>"+i.url+"</a></div>",s+="<div class='desc'>"+i.title+"</div>",s+="</div>",s+="<div class='form'>"+this.add_form(a.toLowerCase(),o[a.toLowerCase()])+"</div>",s+="<div class='content'>"+r+"</div>",s+="</div>";return s+="</div>"},e.prototype.add_form=function(t,e){var n;return n=new o(t,e),n.build()},e}(),r=function(){function t(){}return t.prototype.toggle_by_class=function(t){var e,o,n,r;for(o=document.getElementsByClassName(t),n=0,r=o.length;r>n;n++)e=o[n],console.log(e),$(e).toggle(!1)},t.prototype.default_config_url=function(){var t;return t=window.location.pathname,t=t.replace(t.substring(t.lastIndexOf("/")+1,t.length),""),""+window.location.origin+t+"data.json"},t}()}).call(this);
@@ -0,0 +1,69 @@
1
+ class ResourceForm
2
+
3
+ constructor: (method, config) ->
4
+ @method = method
5
+ @config = config
6
+ return
7
+
8
+ build: ->
9
+ html = ''
10
+ params = @config['params'] || []
11
+ if @method in ["get", "options", "head"]
12
+ html = this.add_form(params)
13
+ return html
14
+
15
+ add_form: (params) ->
16
+ html = '<form>'
17
+ for param in params
18
+ html += "<div class='field'>"
19
+ html += "<label>:#{param[0]}<small>(#{param[1]})</small></label>"
20
+ html += "<input type='text' id='#{param[0]}'></input>"
21
+ html += '</div>'
22
+ html += '<input type="button" value="Submit"></input>'
23
+ html += '</form>'
24
+ html += '<textarea class="output"></textarea>'
25
+ return html
26
+
27
+ class MethodRunner
28
+
29
+ constructor: (method, config, base_url, i) ->
30
+ @method = method
31
+ @config = config
32
+ @base_url = base_url
33
+ @i = i
34
+ return
35
+
36
+ attach_to_form: ->
37
+ self = this
38
+ $("#resource#{@i} .#{@method} .form input[type=button]").click (event) ->
39
+ params = self.scrap_params event
40
+ outputField = $(event.target).parent().siblings('.output')
41
+ config = self.config[self.method]
42
+ self.execute_method(self.method.toUpperCase(), self.base_url, config, params, outputField)
43
+ return
44
+
45
+ scrap_params: (event) ->
46
+ oid = $(event.target).parentsUntil(".methods")
47
+ oid = $($(oid)[oid.length-1]).parent().prev().attr('id')
48
+ fields = $(event.target).parent().children('.field').children('input')
49
+ params = {}
50
+ $.each fields, (i, n) ->
51
+ params[$(n).attr('id')] = $(n).val()
52
+ return
53
+ return params
54
+
55
+ execute_method: (method, base_url, config, params, output) ->
56
+ url = "#{base_url}#{config['url']}"
57
+ for oid, param of params
58
+ url = url.replace(':'+oid, param)
59
+ ajax_call =
60
+ type: method
61
+ async: true
62
+ url: url
63
+ success: (data) ->
64
+ output.text(JSON.stringify(data))
65
+ return
66
+ $.ajax ajax_call
67
+ return
68
+
69
+
@@ -0,0 +1,57 @@
1
+ class Resource
2
+
3
+ constructor: (resource, config, i, base_url) ->
4
+ @resource = resource
5
+ @config = config
6
+ @i = i
7
+ @base_url = base_url
8
+ return
9
+
10
+ toggle: ->
11
+ $("#resource#{@i}").toggle()
12
+ return
13
+
14
+ build: ->
15
+ html = this.build_html(@resource, @config, @i)
16
+ $('.resources').append(html)
17
+ for method, data of @config['config']
18
+ runner = new MethodRunner(method, @config['config'], @base_url, @i)
19
+ runner.attach_to_form()
20
+
21
+ $("#resource#{@i} .content").toggle()
22
+ $("#resource#{@i} .form").toggle()
23
+ $("#resource#{@i} .method .url a").click (event) ->
24
+ $(this).parent().parent().next().next().fadeToggle()
25
+ $(this).parent().parent().next().fadeToggle()
26
+ return
27
+
28
+ build_html: (resource, config, i) ->
29
+ html = "<div class='resource' id='#{resource}'>"
30
+ html += "<div class='name'> <a href='#!#{resource}'>#{resource}</a> </div>"
31
+ html += "<div class='title'>#{config['title']}</div>"
32
+ html += "<div class='menu'> <a href='#' onclick='toggleMethods(#{i})'>Show/Hide</a> | <a href='#' onclick='showJSON()'>Raw</a> </div>"
33
+ html += '</div>'
34
+ html += this.add_section(resource, config['config'], config['config'], i)
35
+ return html
36
+
37
+ add_section: (resource, config, entries, i) ->
38
+ html = "<div class='methods' id='resource#{i}'>"
39
+ for method, field of config
40
+ method_name = method.replace(/(\d+)/g,'')
41
+ content = entries[method.toLowerCase()]['content']
42
+ html += "<div class='method #{method_name}'>"
43
+ html += '<div class="header">'
44
+ html += "<div class='name #{method_name}'>#{method_name}</div>"
45
+ html += "<div class='url'><a href='#!#{resource}##{method.toLowerCase()}'>#{field['url']}</a></div>"
46
+ html += "<div class='desc'>#{field['title']}</div>"
47
+ html += '</div>'
48
+ html += "<div class='form'>#{this.add_form(method.toLowerCase(), entries[method.toLowerCase()])}</div>"
49
+ html += "<div class='content'>#{content}</div>"
50
+ html += "</div>"
51
+ html += '</div>'
52
+ return html
53
+
54
+ add_form: (method, config) ->
55
+ form = new ResourceForm(method, config)
56
+ return form.build()
57
+
@@ -0,0 +1,17 @@
1
+ class Utils
2
+
3
+ constructor: ->
4
+ return
5
+
6
+ toggle_by_class: (clazz) ->
7
+ elems = document.getElementsByClassName(clazz)
8
+ for elem in elems
9
+ console.log elem
10
+ $(elem).toggle(false)
11
+ return
12
+
13
+ default_config_url: ->
14
+ pn = window.location.pathname
15
+ pn = pn.replace(pn.substring(pn.lastIndexOf('/')+1, pn.length), '')
16
+ return "#{window.location.origin}#{pn}data.json"
17
+
@@ -0,0 +1,40 @@
1
+ <html>
2
+ <head>
3
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
4
+ <link rel="stylesheet" href="style/style.css" />
5
+ <script src="js/amy.js"></script>
6
+ </head>
7
+ <body>
8
+ <div id="page">
9
+ <div id="header">
10
+ <div class="title">
11
+ <h1>REST API Documentation</h1>
12
+ <h4><%= @base_url %></h4>
13
+ </div>
14
+ <form id="selector">
15
+ <input type="text" id="key"/>
16
+ <a href="#" class="button green" id="explore">Explore</a>
17
+ </form>
18
+ </div>
19
+ <div id="body">
20
+ <% unless @links.empty? %>
21
+ <div class="navmenu">
22
+ <div id="navigation_container">
23
+ <div class="rectangle">
24
+ <ul class="navigation_bar">
25
+ <li> <h3>Quick links</h3> </li>
26
+ <% @links.each do |link| %>
27
+ <li><a href="<%= "#{@base_url}#{link[1]}" %>"><%= link[0] %></a></li>
28
+ <% end %>
29
+ </ul>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ <div class="resources"></div>
35
+ <div class="footer">
36
+ [ <div class="base_url"> BASE_URL: <%= @base_url %> </div> | <div class="version"> API_VERSION: <%= @apiversion %></div> ]
37
+ </div>
38
+ </div>
39
+ </body>
40
+ </html>