http_sim 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,295 @@
1
+ window.whatInput = (function() {
2
+
3
+ 'use strict';
4
+
5
+ /*
6
+ ---------------
7
+ variables
8
+ ---------------
9
+ */
10
+
11
+ // array of actively pressed keys
12
+ var activeKeys = [];
13
+
14
+ // cache document.body
15
+ var body;
16
+
17
+ // boolean: true if touch buffer timer is running
18
+ var buffer = false;
19
+
20
+ // the last used input type
21
+ var currentInput = null;
22
+
23
+ // `input` types that don't accept text
24
+ var nonTypingInputs = [
25
+ 'button',
26
+ 'checkbox',
27
+ 'file',
28
+ 'image',
29
+ 'radio',
30
+ 'reset',
31
+ 'submit'
32
+ ];
33
+
34
+ // detect version of mouse wheel event to use
35
+ // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
36
+ var mouseWheel = detectWheel();
37
+
38
+ // list of modifier keys commonly used with the mouse and
39
+ // can be safely ignored to prevent false keyboard detection
40
+ var ignoreMap = [
41
+ 16, // shift
42
+ 17, // control
43
+ 18, // alt
44
+ 91, // Windows key / left Apple cmd
45
+ 93 // Windows menu / right Apple cmd
46
+ ];
47
+
48
+ // mapping of events to input types
49
+ var inputMap = {
50
+ 'keydown': 'keyboard',
51
+ 'keyup': 'keyboard',
52
+ 'mousedown': 'mouse',
53
+ 'mousemove': 'mouse',
54
+ 'MSPointerDown': 'pointer',
55
+ 'MSPointerMove': 'pointer',
56
+ 'pointerdown': 'pointer',
57
+ 'pointermove': 'pointer',
58
+ 'touchstart': 'touch'
59
+ };
60
+
61
+ // add correct mouse wheel event mapping to `inputMap`
62
+ inputMap[detectWheel()] = 'mouse';
63
+
64
+ // array of all used input types
65
+ var inputTypes = [];
66
+
67
+ // mapping of key codes to a common name
68
+ var keyMap = {
69
+ 9: 'tab',
70
+ 13: 'enter',
71
+ 16: 'shift',
72
+ 27: 'esc',
73
+ 32: 'space',
74
+ 37: 'left',
75
+ 38: 'up',
76
+ 39: 'right',
77
+ 40: 'down'
78
+ };
79
+
80
+ // map of IE 10 pointer events
81
+ var pointerMap = {
82
+ 2: 'touch',
83
+ 3: 'touch', // treat pen like touch
84
+ 4: 'mouse'
85
+ };
86
+
87
+ // touch buffer timer
88
+ var timer;
89
+
90
+
91
+ /*
92
+ ---------------
93
+ functions
94
+ ---------------
95
+ */
96
+
97
+ // allows events that are also triggered to be filtered out for `touchstart`
98
+ function eventBuffer() {
99
+ clearTimer();
100
+ setInput(event);
101
+
102
+ buffer = true;
103
+ timer = window.setTimeout(function() {
104
+ buffer = false;
105
+ }, 650);
106
+ }
107
+
108
+ function bufferedEvent(event) {
109
+ if (!buffer) setInput(event);
110
+ }
111
+
112
+ function unBufferedEvent(event) {
113
+ clearTimer();
114
+ setInput(event);
115
+ }
116
+
117
+ function clearTimer() {
118
+ window.clearTimeout(timer);
119
+ }
120
+
121
+ function setInput(event) {
122
+ var eventKey = key(event);
123
+ var value = inputMap[event.type];
124
+ if (value === 'pointer') value = pointerType(event);
125
+
126
+ // don't do anything if the value matches the input type already set
127
+ if (currentInput !== value) {
128
+ var eventTarget = target(event);
129
+ var eventTargetNode = eventTarget.nodeName.toLowerCase();
130
+ var eventTargetType = (eventTargetNode === 'input') ? eventTarget.getAttribute('type') : null;
131
+
132
+ if (
133
+ (// only if the user flag to allow typing in form fields isn't set
134
+ !body.hasAttribute('data-whatinput-formtyping') &&
135
+
136
+ // only if currentInput has a value
137
+ currentInput &&
138
+
139
+ // only if the input is `keyboard`
140
+ value === 'keyboard' &&
141
+
142
+ // not if the key is `TAB`
143
+ keyMap[eventKey] !== 'tab' &&
144
+
145
+ // only if the target is a form input that accepts text
146
+ (
147
+ eventTargetNode === 'textarea' ||
148
+ eventTargetNode === 'select' ||
149
+ (eventTargetNode === 'input' && nonTypingInputs.indexOf(eventTargetType) < 0)
150
+ )) || (
151
+ // ignore modifier keys
152
+ ignoreMap.indexOf(eventKey) > -1
153
+ )
154
+ ) {
155
+ // ignore keyboard typing
156
+ } else {
157
+ switchInput(value);
158
+ }
159
+ }
160
+
161
+ if (value === 'keyboard') logKeys(eventKey);
162
+ }
163
+
164
+ function switchInput(string) {
165
+ currentInput = string;
166
+ body.setAttribute('data-whatinput', currentInput);
167
+
168
+ if (inputTypes.indexOf(currentInput) === -1) inputTypes.push(currentInput);
169
+ }
170
+
171
+ function key(event) {
172
+ return (event.keyCode) ? event.keyCode : event.which;
173
+ }
174
+
175
+ function target(event) {
176
+ return event.target || event.srcElement;
177
+ }
178
+
179
+ function pointerType(event) {
180
+ if (typeof event.pointerType === 'number') {
181
+ return pointerMap[event.pointerType];
182
+ } else {
183
+ return (event.pointerType === 'pen') ? 'touch' : event.pointerType; // treat pen like touch
184
+ }
185
+ }
186
+
187
+ // keyboard logging
188
+ function logKeys(eventKey) {
189
+ if (activeKeys.indexOf(keyMap[eventKey]) === -1 && keyMap[eventKey]) activeKeys.push(keyMap[eventKey]);
190
+ }
191
+
192
+ function unLogKeys(event) {
193
+ var eventKey = key(event);
194
+ var arrayPos = activeKeys.indexOf(keyMap[eventKey]);
195
+
196
+ if (arrayPos !== -1) activeKeys.splice(arrayPos, 1);
197
+ }
198
+
199
+ function bindEvents() {
200
+ body = document.body;
201
+
202
+ // pointer events (mouse, pen, touch)
203
+ if (window.PointerEvent) {
204
+ body.addEventListener('pointerdown', bufferedEvent);
205
+ body.addEventListener('pointermove', bufferedEvent);
206
+ } else if (window.MSPointerEvent) {
207
+ body.addEventListener('MSPointerDown', bufferedEvent);
208
+ body.addEventListener('MSPointerMove', bufferedEvent);
209
+ } else {
210
+
211
+ // mouse events
212
+ body.addEventListener('mousedown', bufferedEvent);
213
+ body.addEventListener('mousemove', bufferedEvent);
214
+
215
+ // touch events
216
+ if ('ontouchstart' in window) {
217
+ body.addEventListener('touchstart', eventBuffer);
218
+ }
219
+ }
220
+
221
+ // mouse wheel
222
+ body.addEventListener(mouseWheel, bufferedEvent);
223
+
224
+ // keyboard events
225
+ body.addEventListener('keydown', unBufferedEvent);
226
+ body.addEventListener('keyup', unBufferedEvent);
227
+ document.addEventListener('keyup', unLogKeys);
228
+ }
229
+
230
+
231
+ /*
232
+ ---------------
233
+ utilities
234
+ ---------------
235
+ */
236
+
237
+ // detect version of mouse wheel event to use
238
+ // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
239
+ function detectWheel() {
240
+ return mouseWheel = 'onwheel' in document.createElement('div') ?
241
+ 'wheel' : // Modern browsers support "wheel"
242
+
243
+ document.onmousewheel !== undefined ?
244
+ 'mousewheel' : // Webkit and IE support at least "mousewheel"
245
+ 'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox
246
+ }
247
+
248
+
249
+ /*
250
+ ---------------
251
+ init
252
+
253
+ don't start script unless browser cuts the mustard,
254
+ also passes if polyfills are used
255
+ ---------------
256
+ */
257
+
258
+ if (
259
+ 'addEventListener' in window &&
260
+ Array.prototype.indexOf
261
+ ) {
262
+
263
+ // if the dom is already ready already (script was placed at bottom of <body>)
264
+ if (document.body) {
265
+ bindEvents();
266
+
267
+ // otherwise wait for the dom to load (script was placed in the <head>)
268
+ } else {
269
+ document.addEventListener('DOMContentLoaded', bindEvents);
270
+ }
271
+ }
272
+
273
+
274
+ /*
275
+ ---------------
276
+ api
277
+ ---------------
278
+ */
279
+
280
+ return {
281
+
282
+ // returns string: the current input type
283
+ ask: function() { return currentInput; },
284
+
285
+ // returns array: currently pressed keys
286
+ keys: function() { return activeKeys; },
287
+
288
+ // returns array: all the detected input types
289
+ types: function() { return inputTypes; },
290
+
291
+ // accepts string: manually set the input type
292
+ set: switchInput
293
+ };
294
+
295
+ }());
@@ -1,12 +1,11 @@
1
1
  <html>
2
2
  <head>
3
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
4
-
5
- <!-- Optional theme -->
6
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
7
-
8
- <!-- Latest compiled and minified JavaScript -->
9
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
3
+ <link rel="stylesheet" href="/assets/css/foundation.min.css">
4
+ <link rel="stylesheet" href="/assets/css/app.css">
5
+ <script src="/assets/js/vendor/jquery.js"></script>
6
+ <script src="/assets/js/vendor/foundation.min.js"></script>
7
+ <script src="/assets/js/vendor/what-input.js"></script>
8
+ <script src="/assets/js/app.js"></script>
10
9
  </head>
11
10
  <body>
12
11
  <h2>Requests for: <%= endpoint.method %> <%= endpoint.path %></h2>
@@ -1,23 +1,54 @@
1
1
  <html>
2
2
  <head>
3
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
3
+ <link rel="stylesheet" href="/assets/css/foundation.min.css">
4
+ <link rel="stylesheet" href="/assets/css/app.css">
5
+ <script src="/assets/js/vendor/jquery.js"></script>
6
+ <script src="/assets/js/vendor/foundation.min.js"></script>
7
+ <script src="/assets/js/vendor/what-input.js"></script>
8
+ <script src="/assets/js/app.js"></script>
4
9
 
5
- <!-- Optional theme -->
6
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
10
+ <style>
11
+ .current {
12
+ height: 30%;
13
+ }
7
14
 
8
- <!-- Latest compiled and minified JavaScript -->
9
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
10
- </head>
11
- <body>
12
- <h2>Response for: <%= endpoint.method %> <%= endpoint.path %></h2>
15
+ .current div {
16
+ height: 100%;
17
+ padding-bottom: 20px;
18
+ }
13
19
 
14
- <div><%= endpoint.response %></div>
20
+ pre {
21
+ background-color: lightgray;
22
+ border: 1px solid gray;
23
+ border-radius: 1px;
24
+ padding: 5px;
25
+ }
15
26
 
16
- <h2>Change response</h2>
27
+ form {
28
+ height: 70%;
29
+ }
17
30
 
18
- <form action="<%= endpoint.path %>/response" method="post">
19
- <textarea name="response"></textarea>
20
- <input type="submit">
31
+ form textarea {
32
+ height: 50%;
33
+ }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <div class="row current">
38
+ <div class="medium-12">
39
+ <h2>Response for: <%= endpoint.method %> <%= endpoint.path %></h2>
40
+ <pre><%= endpoint.response %></pre>
41
+ </div>
42
+ </div>
43
+ <form>
44
+ <div class="row">
45
+ <div class="medium-12 columns">
46
+ <label>Change response
47
+ <textarea name="response" placeholder="Drop your data here!"></textarea>
48
+ </label>
49
+ <input type="submit" class="button" value="Submit">
50
+ </div>
51
+ </div>
21
52
  </form>
22
53
  </body>
23
54
  </html>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_sim
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean de Klerk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-02 00:00:00.000000000 Z
11
+ date: 2016-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -99,8 +99,17 @@ files:
99
99
  - Rakefile
100
100
  - example.rb
101
101
  - http_sim.gemspec
102
+ - lib/endpoint.rb
102
103
  - lib/http_sim.rb
103
104
  - lib/index.html.erb
105
+ - lib/public/assets/css/app.css
106
+ - lib/public/assets/css/foundation.css
107
+ - lib/public/assets/css/foundation.min.css
108
+ - lib/public/assets/js/app.js
109
+ - lib/public/assets/js/vendor/foundation.js
110
+ - lib/public/assets/js/vendor/foundation.min.js
111
+ - lib/public/assets/js/vendor/jquery.js
112
+ - lib/public/assets/js/vendor/what-input.js
104
113
  - lib/request.html.erb
105
114
  - lib/response.html.erb
106
115
  - spec/features/register_endpoint_spec.rb