try_api 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5b8fa8a7f2811330a6ac1362824c445de902f602
4
- data.tar.gz: 70944c967fa3e8c284e4b49c5271baaac3cf40cd
3
+ metadata.gz: b641b5c9910f77e6b1e5d868f239beb51c0ec683
4
+ data.tar.gz: 7f0ea527339f494fb08251956aeee9e587b86c40
5
5
  SHA512:
6
- metadata.gz: 6851d5ddf01c733fc46a2cd9798d316b91e0820f000e9755379ba95d678cbae0777c980cabca9f43ae3caa983889e28c9add865c4e529bacee5ac2a8d5b22ff8
7
- data.tar.gz: 2ddc4f85d016d8c62a26420d9ad32f7a73e6fce8213093fbfdf905765fa20c4506f4693dfe80d7d2b17558513e3ffa0b76f3acf410e090509c7606ebc0eb157c
6
+ metadata.gz: 6b9d29e9eaaae990098ad0b101d9495aaa6697aeb13de00ed11262d619f58bc71cc4a5339103e085d31c23871eeab860ca91f01954f3202dd05a803bb36fee45
7
+ data.tar.gz: 8a75f8800385d097391acccf07438f4b6719266148820bef3aa39e58c88329a5955da1c2c67d36603b6ebda05a93c37b826bd846d861eacb8d5d160fe8a1dc36
@@ -3,6 +3,7 @@
3
3
  #= require try_api/paramsarray.directive
4
4
  #= require try_api/image.directive
5
5
  #= require try_api/url.directive
6
+ #= require try_api/scrollspy.directive
6
7
 
7
8
  $ ->
8
9
  $('pre code').each (i, block) ->
@@ -28,9 +29,11 @@ $ ->
28
29
  TryApiApp = angular.module('TryApiApp', [
29
30
  'ui.bootstrap'
30
31
  'ngAnimate'
32
+ 'ngCookies'
31
33
  'TryApi'
32
34
  'angular-ladda'
33
35
  'hljs'
36
+ 'tryApiScrollSpy.directives'
34
37
  ])
35
38
  TryApiApp.config [
36
39
  '$httpProvider'
@@ -49,8 +52,9 @@ TryApiApp.controller 'HomeController', [
49
52
  '$scope'
50
53
  '$timeout'
51
54
  '$sce'
52
- '$http'
53
- ($scope, $timeout, $sce, $http) ->
55
+ '$http',
56
+ '$cookies'
57
+ ($scope, $timeout, $sce, $http, $cookies) ->
54
58
 
55
59
 
56
60
  $scope.getHtml = (html) ->
@@ -73,6 +77,64 @@ TryApiApp.controller 'HomeController', [
73
77
  $scope.global_headers = {}
74
78
  $scope.params = []
75
79
 
80
+ $scope.methodSubmit = (method) ->
81
+ method.pending = true
82
+ headers = {'Content-Type': undefined}
83
+
84
+ $.each method.headers, (i)->
85
+ header = this
86
+ headers[header.name] = header.value
87
+
88
+ path = method.submit_path
89
+
90
+ switch method.method.toLowerCase()
91
+ when 'post'
92
+ fd = new FormData
93
+ fd.append 'a', 'a' # TODO sending empty array causes EOFError
94
+
95
+ $.each method.parameters, (i) ->
96
+ $scope.addParameterToForm fd, this
97
+
98
+ $http.post path, fd,
99
+ transformRequest: angular.identity
100
+ headers: headers
101
+ .success method.response_handler
102
+ .error method.response_handler
103
+ when 'delete'
104
+ url = ''
105
+
106
+ $.each method.parameters, (i) ->
107
+ url = $scope.addParameterToUrl(url, this)
108
+
109
+ $http.delete path + '?' + url,
110
+ transformRequest: angular.identity
111
+ headers: headers
112
+ .success method.response_handler
113
+ .error method.response_handler
114
+ when 'get'
115
+ url = ''
116
+
117
+ $.each method.parameters, (i) ->
118
+ url = $scope.addParameterToUrl(url, this)
119
+
120
+ $http.get path + '?' + url,
121
+ transformRequest: angular.identity
122
+ headers: headers
123
+ .success method.response_handler
124
+ .error method.response_handler
125
+ when 'put'
126
+ fd = new FormData
127
+ fd.append 'a', 'a' # TODO sending empty array causes EOFError
128
+
129
+ $.each method.parameters, (i) ->
130
+ $scope.addParameterToForm fd, this
131
+
132
+ $http.put path, fd,
133
+ transformRequest: angular.identity
134
+ headers: headers
135
+ .success method.response_handler
136
+ .error method.response_handler
137
+
76
138
  $http.get('/developers/projects.json').success (data) -> # TODO this should depends from app routes
77
139
  $scope.project = data.project
78
140
  $.each $scope.project.menu_items, () ->
@@ -91,60 +153,54 @@ TryApiApp.controller 'HomeController', [
91
153
  headers: JSON.stringify(config.headers, null, 2)
92
154
  status: status
93
155
 
94
- method.submit = ->
95
- method.pending = true
96
- headers = {'Content-Type': undefined}
97
-
98
- $.each method.headers, (i)->
99
- header = this
100
- headers[header.name] = header.value
101
-
102
- path = $scope.project.host + ':' + $scope.project.port + '/' + method.submit_path
103
-
104
- switch method.method.toLowerCase()
105
- when 'post'
106
- fd = new FormData
107
- fd.append 'a', 'a' # TODO sending empty array causes EOFError
108
-
109
- $.each method.parameters, (i) ->
110
- $scope.addParameterToForm fd, this
111
-
112
- $http.post path, fd,
113
- transformRequest: angular.identity
114
- headers: headers
115
- .success method.response_handler
116
- .error method.response_handler
117
- when 'delete'
118
- $http.delete path,
119
- transformRequest: angular.identity
120
- headers: headers
121
- .success method.response_handler
122
- .error method.response_handler
123
- when 'get'
124
- fd = ''
125
-
126
- $.each method.parameters, (i) ->
127
- parameter = this
128
- if parameter.value
129
- fd = fd + parameter.name + '=' + parameter.value + '&'
130
-
131
- $http.get path + '?' + fd,
132
- transformRequest: angular.identity
133
- headers: headers
134
- .success method.response_handler
135
- .error method.response_handler
136
- when 'put'
137
- fd = new FormData
138
- fd.append 'a', 'a' # TODO sending empty array causes EOFError
139
-
140
- $.each method.parameters, (i) ->
141
- $scope.addParameterToForm fd, this
142
-
143
- $http.put path, fd,
144
- transformRequest: angular.identity
145
- headers: headers
146
- .success method.response_handler
147
- .error method.response_handler
156
+ switch method.method.toLowerCase()
157
+ when 'web_socket'
158
+ method.submit = ->
159
+ $.each method.cookies, (i) ->
160
+ $cookies.put(this.name, this.value)
161
+
162
+ method.pending = true
163
+ method.connected = false
164
+ method.response = {data: []}
165
+
166
+ if 'WebSocket' of window
167
+ method.ws = new WebSocket('ws://' + $scope.project.endpoint + '/' + method.submit_path)
168
+
169
+ method.ws.onopen = ->
170
+ $scope.$apply ->
171
+ method.pending = false
172
+ method.response.data.push('Connected')
173
+ method.ws.send(JSON.stringify({command: "subscribe", identifier: JSON.stringify(method.identifier)}))
174
+ method.response.data.push('Subscribed to ' + JSON.stringify(method.identifier))
175
+ method.connected = true
176
+
177
+ method.ws.onmessage = (evt) ->
178
+ $scope.$apply ->
179
+ if(JSON.parse(evt.data).type != 'ping')
180
+ method.response.data.push(evt.data)
181
+
182
+ method.ws.onclose = ->
183
+ $scope.$apply ->
184
+ method.pending = false
185
+ method.connected = false
186
+ method.response.data.push('Disconnected')
187
+
188
+ else
189
+ method.response.data.push('WebSocket NOT supported by your Browser!')
190
+
191
+ method.speak = ->
192
+ method.ws.send JSON.stringify({
193
+ command: "message",
194
+ data: JSON.stringify({ message: method.message, action: 'speak'})
195
+ identifier: JSON.stringify(method.identifier)
196
+ })
197
+ method.message = ''
198
+ else
199
+ method.submit = ->
200
+ $scope.methodSubmit(method)
201
+ .error (data, status, headers, config) ->
202
+ if status = 422
203
+ alert data.error
148
204
 
149
205
  $scope.addParameterToForm = (form, parameter) -> # TODO implement multidimentional parameters
150
206
  if parameter.type == 'array'
@@ -165,4 +221,25 @@ TryApiApp.controller 'HomeController', [
165
221
  else
166
222
  if parameter.value
167
223
  form.append parameter.name, parameter.value || ''
224
+
225
+ $scope.addParameterToUrl = (url, parameter) ->
226
+ if parameter.type == 'array'
227
+ $.each parameter.values, ->
228
+ value = this
229
+ $.each value, ->
230
+ subparameter = this
231
+ switch subparameter.type
232
+ when 'boolean'
233
+ url = url + parameter.name + '[]' + (subparameter.name || '') + '=' + (subparameter.value || false) + '&'
234
+ else
235
+ if subparameter.value
236
+ url = url + parameter.name + '[]' + (subparameter.name || '') + '=' + subparameter.value + '&'
237
+ else
238
+ switch parameter.type
239
+ when 'boolean'
240
+ url = url + parameter.name + '=' + (parameter.value || false) + '&'
241
+ else
242
+ if parameter.value
243
+ url = url + parameter.name + '=' + parameter.value + '&'
244
+ return url
168
245
  ]
@@ -18,7 +18,7 @@ angular.module('TryApi').directive 'param', [
18
18
  template: '' +
19
19
  '<div class="col-md-4 text-right" ng-if=\'parameter.type != "array"\'>' +
20
20
  ' <b>{{ parameter.name }}</b>' +
21
- ' <span class="text-muted label label-warning">{{ parameter.type }}</span>' +
21
+ ' <span class="label label-success">{{ parameter.type }}</span>' +
22
22
  '</div>' +
23
23
  '<div class="col-md-8" ng-if=\'parameter.type != "array"\'>' +
24
24
  ' <div ng-switch="parameter.type">' +
@@ -40,7 +40,7 @@ angular.module('TryApi').directive 'param', [
40
40
  ' <div class="row">' +
41
41
  ' <div class="col-md-4 text-right">' +
42
42
  ' <b>{{ parameter.name }}</b>' +
43
- ' <span class="text-muted label label-warning">{{ parameter.type }}</span>' +
43
+ ' <span class="label label-success">{{ parameter.type }}</span>' +
44
44
  ' </div>' +
45
45
  ' <div class="col-md-8">' +
46
46
  ' <div class="text-muted small" ng-bind-html="getHtml(parameter.description)"></div>' +
@@ -9,6 +9,9 @@ angular.module('TryApi').directive 'paramsarray', [
9
9
  scope.addItem = ()->
10
10
  scope.parameter.values.push jQuery.extend(true, {}, scope.parameter.parameters)
11
11
 
12
+ scope.deleteItem = (index)->
13
+ scope.parameter.values.splice(index, 1)
14
+
12
15
  return {
13
16
  link: link
14
17
  restrict: 'A'
@@ -16,9 +19,12 @@ angular.module('TryApi').directive 'paramsarray', [
16
19
  scope:
17
20
  parameter: '=ngModel'
18
21
  template: '' +
19
- '<div ng-repeat="value in parameter.values track by $index" style="border: 1px solid lightgray; margin: 1px 1px 1px 10px">' +
22
+ '<div class="try-api-array-item" ng-repeat="value in parameter.values track by $index">' +
20
23
  ' <div params ng-model="value"></div>' +
24
+ ' <div class="try-api-array-item-close" ng-click="deleteItem($index)"><i class="fa fa-close"></i></div>' +
21
25
  '</div>' +
22
- '<a class="btn btn-success btn-xs" ng-click="addItem()">+</a>'
26
+ '<div class="try-api-array-item try-api-array-item-add" ng-click="addItem()">' +
27
+ ' <a>Add</a>' +
28
+ '</div>'
23
29
  }
24
30
  ]
@@ -0,0 +1,88 @@
1
+ // From https://github.com/quanghoc/angular-bootstrap-scrollspy
2
+
3
+ 'use strict';
4
+
5
+ angular.module('tryApiScrollSpy.directives', [])
6
+
7
+ .directive("scrollTo", ["$window", function($window){
8
+ return {
9
+ restrict : "AC",
10
+ compile : function(){
11
+
12
+ function scrollInto(elementId) {
13
+ if(!elementId) $window.scrollTo(0, 0);
14
+ //check if an element can be found with id attribute
15
+ var el = document.getElementById(elementId);
16
+ if(el) el.scrollIntoView();
17
+ }
18
+
19
+ return function(scope, element, attr) {
20
+ element.bind("click", function(event){
21
+ scrollInto(attr.scrollTo);
22
+ });
23
+ };
24
+ }
25
+ };
26
+ }])
27
+
28
+ .directive('scrollSpy', ['$window', '$timeout', '$rootScope', function($window, $timeout, $rootScope) {
29
+ var targets,
30
+ spies = [];
31
+
32
+ var refresh = function(attrs) {
33
+ var slice = Array.prototype.slice;
34
+
35
+ $timeout(function() {
36
+ targets = $(attrs.target).find('.second-level-menu-items li');
37
+ slice.call(targets).forEach(function(el) {
38
+ var spy = $(el.querySelector('a').getAttribute('href'));
39
+
40
+ if (spy.length > 0) {
41
+ spies.push(spy);
42
+ }
43
+ });
44
+ }, 1000);
45
+ };
46
+
47
+ var activate = function(scope, $element, attrs) {
48
+ $(attrs.target + ' .active').removeClass('active');
49
+ $element.addClass('active');
50
+ };
51
+
52
+ var process = function(scope, element, attrs) {
53
+ var windowHeight = $window.innerHeight,
54
+ windowTop = $window.scrollY,
55
+ $activeTarget;
56
+
57
+ spies.map(function(item, index) {
58
+ var pos = item.offset().top - windowTop;
59
+
60
+ if (pos < windowHeight) {
61
+ $activeTarget = targets.eq(index);
62
+ }
63
+ });
64
+
65
+ // console.log($activeTarget);
66
+ activate(scope, $activeTarget, attrs);
67
+ };
68
+
69
+ return {
70
+ link: function(scope, element, attrs) {
71
+ targets = [];
72
+ spies = [];
73
+
74
+ refresh(attrs);
75
+
76
+ angular.element($window).bind("scroll", function() {
77
+ process(scope, element, attrs);
78
+ scope.$apply();
79
+ });
80
+
81
+ // When DOM changes, refresh with a broadcast like this $rootScope.$broadcast('scrollspy.refresh');
82
+ $rootScope.$on('scrollspy.refresh', function() {
83
+ refresh(attrs);
84
+ });
85
+
86
+ }
87
+ }
88
+ }]);
@@ -76,7 +76,7 @@ body
76
76
 
77
77
  &-menu
78
78
  .active > a
79
- color: #0099e5
79
+ color: #19B698
80
80
 
81
81
  padding: 10px
82
82
 
@@ -258,7 +258,22 @@ body
258
258
  .ladda-button
259
259
  padding: 5px 8px
260
260
 
261
-
261
+ .try-api-array-item
262
+ border: 1px solid #e9e9e9
263
+ margin: 1px 1px 1px 10px
264
+ position: relative
265
+ padding-right: 30px
266
+ &-add
267
+ cursor: pointer
268
+ text-align: center
269
+ a
270
+ color: #19B698
271
+ &-close
272
+ color: #19B698
273
+ position: absolute
274
+ top: 8px
275
+ right: 6px
276
+ cursor: pointer
262
277
 
263
278
  .droppable-area
264
279
  border: 2px dashed transparent
@@ -318,3 +333,6 @@ body
318
333
  width: 15px
319
334
  height: 15px
320
335
  cursor: pointer
336
+
337
+ .label-success
338
+ background-color: #19B698
@@ -3,7 +3,11 @@ class TryApi::ApplicationController < ActionController::Base
3
3
 
4
4
  rescue_from Exception do |exception|
5
5
  @message = exception.message
6
- render template: 'try_api/pages/config_file_not_found'
6
+ begin
7
+ render template: 'try_api/pages/config_file_not_found'
8
+ rescue Exception => e
9
+ render json: {error: exception.message}, status: 422
10
+ end
7
11
  end
8
12
 
9
13
  end
@@ -35,17 +35,20 @@ module TryApi
35
35
  end
36
36
  end
37
37
 
38
- attr_accessor :id
39
38
  typesafe_accessor :parent, TryApi::Base
40
- @@instances_count = 0
39
+ attr_accessor :id
41
40
 
42
- def to_json
41
+ def to_json(id = 1)
42
+ self.id = id
43
43
  result = {}
44
44
 
45
45
  self.instance_variables.each do |i|
46
46
  value = self.instance_variable_get(i)
47
47
  if value.instance_of?(Array)
48
- result[i.to_s.delete('@')] = value.map(&:to_json)
48
+ result[i.to_s.delete('@')] = value.map do |v|
49
+ id += 1
50
+ v.to_json(id)
51
+ end
49
52
  else
50
53
  if i == :@parent
51
54
 
@@ -55,7 +58,6 @@ module TryApi
55
58
  end
56
59
  end
57
60
 
58
- result.merge!({id: self.id})
59
61
  result.with_indifferent_access
60
62
  end
61
63
 
@@ -64,7 +66,6 @@ module TryApi
64
66
  end
65
67
 
66
68
  def initialize(hash)
67
- self.id = @@instances_count += 1
68
69
  result_hash = {}
69
70
  hash.to_h.each do |k, v|
70
71
  if k.to_s == 'include!'
@@ -0,0 +1,7 @@
1
+ module TryApi
2
+ class Cookie < TryApi::Base
3
+ typesafe_accessor :name, String
4
+ typesafe_accessor :description, String
5
+ typesafe_accessor :global, Boolean, default: false
6
+ end
7
+ end
@@ -56,8 +56,8 @@ module TryApi
56
56
  end
57
57
  end
58
58
 
59
- def to_json
60
- super.merge color: color, description: description, isCollapsed: true
59
+ def to_json(id)
60
+ super(id).merge color: color, description: description, isCollapsed: true
61
61
  end
62
62
  end
63
63
  end
@@ -4,12 +4,15 @@ module TryApi
4
4
  typesafe_accessor :description, String
5
5
  typesafe_accessor :parameters, Array, items_type: TryApi::Parameter
6
6
  typesafe_accessor :headers, Array, items_type: TryApi::Header
7
+ typesafe_accessor :cookies, Array, items_type: TryApi::Cookie
7
8
  typesafe_accessor :path, String
8
9
  typesafe_accessor :method, String
9
10
  typesafe_accessor :example_responses, Array, items_type: TryApi::ExampleResponse
11
+ typesafe_accessor :api_prefix, String
12
+ typesafe_accessor :identifier, Hash
10
13
 
11
- def to_json
12
- super.merge local_path: local_path, full_path: full_path
14
+ def to_json(id)
15
+ super(id).merge local_path: local_path, full_path: full_path
13
16
  end
14
17
 
15
18
  def full_path
@@ -17,7 +20,7 @@ module TryApi
17
20
  end
18
21
 
19
22
  def local_path
20
- "/#{ self.project.api_prefix }#{ self.path }"
23
+ "/#{ self.api_prefix || self.project.api_prefix }#{ self.path }"
21
24
  end
22
25
  end
23
26
  end
@@ -15,6 +15,7 @@
15
15
  <script src="https://cdnjs.cloudflare.com/ajax/libs/spin.js/2.3.2/spin.min.js"></script>
16
16
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Ladda/1.0.0/ladda.min.js"></script>
17
17
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ladda/0.4.2/angular-ladda.min.js"></script>
18
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-cookies.min.js"></script>
18
19
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css"/>
19
20
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css"/>
20
21
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/styles/atelier-savanna-dark.min.css"/>
@@ -23,7 +24,7 @@
23
24
  <%= stylesheet_link_tag "try_api/application", :media => "all", :async => false %>
24
25
  <%= javascript_include_tag "try_api/application", :media => "all", :async => false %>
25
26
  </head>
26
- <body data-spy="scroll" data-target="#tryApiScrollspy" ng-app="TryApiApp" ng-controller="HomeController">
27
+ <body style="position: relative" scroll-spy='' data-target="#tryApiScrollspy" ng-app="TryApiApp" ng-controller="HomeController">
27
28
  <%= yield %>
28
29
  </body>
29
30
  </html>
@@ -1,12 +1,16 @@
1
1
  <div class="try-api-sidebar">
2
- <div class="try-api-sidebar-header"><b>{{ project.name }}</b> API</div>
3
- <div class="try-api-sidebar-menu-container" id="tryApiScrollspy">
4
- <ul class="try-api-sidebar-menu try-api-sidebar-menu-items nav">
5
- <li class="try-api-sidebar-menu-item" ng-repeat="menu_item in project.menu_items track by menu_item.id"><a
6
- href="{{ '#section' + menu_item.id }}">{{ menu_item.title }}</a>
2
+ <div class="try-api-sidebar-header">
3
+ <b>{{ project.name }}</b>
4
+ API
5
+ </div>
6
+ <div class="try-api-sidebar-menu-container">
7
+ <ul class="try-api-sidebar-menu try-api-sidebar-menu-items nav" id="tryApiScrollspy">
8
+ <li class="try-api-sidebar-menu-item" ng-repeat="menu_item in project.menu_items track by menu_item.id">
9
+ <a href="{{ '#section' + menu_item.id }}">{{ menu_item.title }}</a>
7
10
  <ul class="second-level-menu-items nav" ng-show="menu_item.methods">
8
- <li ng-repeat="method in menu_item.methods track by method.id"><a
9
- href="{{ '#section' + menu_item.id + method.id }}">{{ method.title }}</a></li>
11
+ <li ng-repeat="method in menu_item.methods track by method.id">
12
+ <a href="{{ '#section' + menu_item.id + method.id }}">{{ method.title }}</a>
13
+ </li>
10
14
  </ul>
11
15
  </li>
12
16
  </ul>
@@ -14,7 +18,9 @@
14
18
  </div>
15
19
  <div class="try-api-container">
16
20
  <div class="row method is-flex">
17
- <div class="col-md-6 method-try"><h2 class="method-try-heading">{{ project.name }}</h2></div>
21
+ <div class="col-md-6 method-try">
22
+ <h2 class="method-try-heading">{{ project.name }}</h2>
23
+ </div>
18
24
  <div class="col-md-6 method-example">API endpoint
19
25
  <div class="method-example-code">{{ project.endpoint }}</div>
20
26
  </div>
@@ -31,13 +37,13 @@
31
37
  <div ng-bind-html="getHtml(method.description)"></div>
32
38
  </div>
33
39
  </div>
34
- <div class="row method is-flex" id="{{ method.description ? '' : ('section' + menu_item.id + method.id) }}">
40
+ <div class="row method is-flex" id="{{ method.description ? '' : ('section' + menu_item.id + method.id) }}" ng-if="method.method != 'web_socket'">
35
41
  <div class="col-md-6 method-try"><h4>{{ method.title }}</h4>
36
42
  <h4>
37
- <div class="label label-info">{{ method.method }}</div>
43
+ <span class="label label-success" style="text-transform: uppercase">{{ method.method }}</span>
38
44
  <span url=true ng-model="method.submit_path" pattern="method.local_path"></span>
39
45
  </h4>
40
- <div ng-if="method.headers.length &gt; 0"><label>Headers:</label>
46
+ <div ng-if="method.headers.length > 0"><label>Headers:</label>
41
47
  <div class="row parameter" ng-repeat="header in method.headers">
42
48
  <div class="col-md-4 text-right"><b>{{header.name }}</b></div>
43
49
  <div class="col-md-8"><input ng-model="header.value" type="text"/>
@@ -47,7 +53,7 @@
47
53
  </div>
48
54
  </div>
49
55
  </div>
50
- <div ng-if="method.parameters.length &gt; 0"><label>Parameters:</label>
56
+ <div ng-if="method.parameters.length > 0"><label>Parameters:</label>
51
57
  <div ng-model="method.parameters" params=""></div>
52
58
  </div>
53
59
  <br/>
@@ -85,6 +91,52 @@
85
91
  </div>
86
92
  </div>
87
93
  </div>
94
+ <div class="row method is-flex" id="{{ method.description ? '' : ('section' + menu_item.id + method.id) }}" ng-if="method.method == 'web_socket'">
95
+ <div class="col-md-12 method-try"><h4>{{ method.title }}</h4>
96
+ <h4>
97
+ <span class="label label-success" style="text-transform: uppercase">{{ method.method }}</span>
98
+ <span url=true ng-model="method.submit_path" pattern="method.local_path"></span>
99
+ </h4>
100
+ <div ng-if="method.cookies.length > 0"><label>Identifier:</label>
101
+ <div class="row parameter">
102
+ <div class="col-md-4 text-right"></div>
103
+ <div class="col-md-8">
104
+ {{ method.identifier }}
105
+ </div>
106
+ </div>
107
+ </div>
108
+ <div ng-if="method.cookies.length > 0"><label>Cookies:</label>
109
+ <div class="row parameter" ng-repeat="cookie in method.cookies">
110
+ <div class="col-md-4 text-right"><b>{{cookie.name }}</b></div>
111
+ <div class="col-md-8">
112
+ <input ng-model="cookie.value" type="text"/>
113
+ <div class="text-muted small">
114
+ <div ng-trust-html="getHtml(cookie.description)"></div>
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ <br/>
120
+ <div class="method-example-code" id="method.response">
121
+ <div ng-repeat="data_row in method.response.data track by $index">
122
+ {{ data_row }}
123
+ </div>
124
+ </div>
125
+ <br/>
126
+ <div class="text-right progress-demo">
127
+ <button class="btn btn-success ladda-button" data-color="mint" data-style="expand-right" ladda="method.pending" ng-click="method.submit()" sata-size="s" ng-hide="method.connected">
128
+ <span class="ladda-label">Connect</span><span class="ladda-spinner"></span>
129
+ <div class="ladda-progress" style="width: 100px"></div>
130
+ </button>
131
+ <textarea ng-model="method.message" placeholder="message" ng-show="method.connected" style="width: 300px"></textarea>
132
+ <button class="btn btn-success ladda-button" data-color="mint" data-style="expand-right" ladda="method.pending" ng-click="method.speak()" sata-size="s" ng-show="method.connected">
133
+ <span class="ladda-label">Speak</span><span class="ladda-spinner"></span>
134
+ <div class="ladda-progress" style="width: 100px"></div>
135
+ </button>
136
+ </div>
137
+ <br/>
138
+ </div>
139
+ </div>
88
140
  </div>
89
141
  </div>
90
142
  <div class="row method is-flex">
@@ -1,3 +1,3 @@
1
1
  module TryApi
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: try_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mykhaylo Skubenych
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-20 00:00:00.000000000 Z
11
+ date: 2016-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -39,6 +39,7 @@ files:
39
39
  - app/assets/javascripts/try_api/param.directive.js.coffee
40
40
  - app/assets/javascripts/try_api/params.directive.js.coffee
41
41
  - app/assets/javascripts/try_api/paramsarray.directive.js.coffee
42
+ - app/assets/javascripts/try_api/scrollspy.directive.js
42
43
  - app/assets/javascripts/try_api/url.directive.js.coffee
43
44
  - app/assets/stylesheets/try_api/application.css.sass
44
45
  - app/controllers/try_api/application_controller.rb
@@ -47,6 +48,7 @@ files:
47
48
  - app/helpers/try_api/application_helper.rb
48
49
  - app/models/try_api/base.rb
49
50
  - app/models/try_api/config_parser.rb
51
+ - app/models/try_api/cookie.rb
50
52
  - app/models/try_api/example_response.rb
51
53
  - app/models/try_api/header.rb
52
54
  - app/models/try_api/menu_item.rb