better_rest 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +1 -2
- data/better_rest.gemspec +2 -2
- data/lib/better_rest.rb +84 -6
- data/public/main.css +9 -2
- data/views/index.erb +53 -30
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eec73eed2d71fd24e5ef1a6380ba9b96c0c3cc86
|
4
|
+
data.tar.gz: d31fae1445848a5ceac23ea96fecdcd53f707291
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4de8bf79426d9fcd5fde7879d08fbd9c9fcd324431e0dad4b9d1e6d691069693aea5123c4b90d008000e04f8985eccf1b7901377076d1b1123ec5e44f1aefef2
|
7
|
+
data.tar.gz: 70c11e61852ad401b97063cac090335b6a7aa075c88347e8d9423ea5c269616dc290080a5da19112547d8f4715f2d91f1389b2fab38d95dffaf76622530153e1
|
data/README.md
CHANGED
data/better_rest.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "better_rest"
|
3
|
-
s.version = "0.2.
|
3
|
+
s.version = "0.2.1"
|
4
4
|
s.licenses = ['MIT']
|
5
5
|
s.summary = "REST Test Client"
|
6
6
|
s.date = "2014-12-13"
|
7
|
-
s.description = "
|
7
|
+
s.description = "Configurable REST API test client accessible via your browser"
|
8
8
|
s.authors = ["Jason Willems"]
|
9
9
|
s.email = ["jason@willems.ca"]
|
10
10
|
s.homepage = "https://github.com/at1as/BetteR"
|
data/lib/better_rest.rb
CHANGED
@@ -24,6 +24,7 @@ configure do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
BETTER_SIGNATURE = "BetteR - https://github.com/at1as/BetteR"
|
27
|
+
API_VERSION = 1.0
|
27
28
|
|
28
29
|
|
29
30
|
# Return default values
|
@@ -32,7 +33,7 @@ get '/?' do
|
|
32
33
|
@times = ["1", "2", "5", "10"]
|
33
34
|
@header_hash = {"" => ""}
|
34
35
|
@follow, @verbose, @ssl, @log_requests = true, true, false, false
|
35
|
-
@timeout_interval =
|
36
|
+
@timeout_interval = 2
|
36
37
|
|
37
38
|
erb :index
|
38
39
|
end
|
@@ -96,14 +97,20 @@ post '/request' do
|
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
|
-
#
|
100
|
+
# Response parameters return to View
|
100
101
|
@response_body = {}
|
101
102
|
request.options[:url] = request.url
|
102
103
|
@response_body['request_options'] = JSON.pretty_generate(request.options)
|
103
|
-
|
104
|
+
|
105
|
+
# Return message OK can be confused with 200 OK
|
106
|
+
@response_body['return_msg'] = ''
|
107
|
+
unless response.return_code.upcase.to_s == 'OK'
|
108
|
+
@response_body['return_msg'] = response.return_code.upcase
|
109
|
+
end
|
110
|
+
|
104
111
|
@response_body['return_code'] = response.code
|
105
112
|
@response_body['return_time'] = response.time
|
106
|
-
@response_body['return_body'] = response.body.force_encoding('
|
113
|
+
@response_body['return_body'] = response.body.force_encoding('ISO-8859-1')
|
107
114
|
@response_body['return_headers'] = response.response_headers
|
108
115
|
|
109
116
|
@response_body.to_json
|
@@ -214,10 +221,23 @@ get '/logs/:log' do
|
|
214
221
|
end
|
215
222
|
|
216
223
|
|
224
|
+
# Delete log
|
225
|
+
delete '/logs/:log' do
|
226
|
+
if File.exists? "logs/#{params[:log]}.log"
|
227
|
+
File.delete("logs/#{params[:log]}.log")
|
228
|
+
else
|
229
|
+
return 404
|
230
|
+
end
|
231
|
+
200
|
232
|
+
end
|
233
|
+
|
234
|
+
|
217
235
|
# Upload file
|
218
|
-
# Clear directory writing file
|
219
236
|
post '/upload' do
|
237
|
+
|
238
|
+
# Clear directory before writing file
|
220
239
|
FileUtils.rm_rf(Dir.glob('tmp/*'))
|
240
|
+
|
221
241
|
unless request.body.nil?
|
222
242
|
File.open('tmp/' + params[:file][:filename], 'w') do |f|
|
223
243
|
f.write(params[:file][:tempfile].read)
|
@@ -227,6 +247,63 @@ post '/upload' do
|
|
227
247
|
end
|
228
248
|
|
229
249
|
|
250
|
+
# Import from POSTMAN Collection
|
251
|
+
post '/import' do
|
252
|
+
|
253
|
+
# Clear tmp directory before writing file
|
254
|
+
FileUtils.rm_rf(Dir.glob('tmp/*'))
|
255
|
+
|
256
|
+
# Save File
|
257
|
+
unless request.body.nil?
|
258
|
+
File.open('tmp/postman_import.json', 'w') do |f|
|
259
|
+
f.write(params[:file][:tempfile].read)
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
# Read File
|
264
|
+
if File.exists? "tmp/postman_import.json"
|
265
|
+
stored_collection = JSON.parse File.read("tmp/postman_import.json") rescue return 500
|
266
|
+
|
267
|
+
# Data dump of multiple collections
|
268
|
+
if stored_collection['collections']
|
269
|
+
stored_collection = stored_collection['collections']
|
270
|
+
# Single collection
|
271
|
+
else
|
272
|
+
stored_collection = [stored_collection]
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
# Extract File information
|
277
|
+
stored_collection.each do |collection|
|
278
|
+
new_collection = {}
|
279
|
+
|
280
|
+
collection['requests'].each do |request|
|
281
|
+
request_details = {}
|
282
|
+
request_details['name'] = request['name']
|
283
|
+
request_details['collection'] = collection['name']
|
284
|
+
request_details['url'] = request['url']
|
285
|
+
request_details['request'] = request['method']
|
286
|
+
request_details['headers'] = request['headers']
|
287
|
+
request_details['payload'] = request['data']
|
288
|
+
request_details['quantity'] = 1
|
289
|
+
|
290
|
+
new_collection[request['name']] = request_details
|
291
|
+
end
|
292
|
+
|
293
|
+
# Write file
|
294
|
+
begin
|
295
|
+
File.open("requests/#{collection['name']}.json", 'w') do |f|
|
296
|
+
f.write(new_collection.to_json)
|
297
|
+
end
|
298
|
+
rescue
|
299
|
+
return 500
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
200
|
304
|
+
end
|
305
|
+
|
306
|
+
|
230
307
|
# Defaults to main page
|
231
308
|
not_found do
|
232
309
|
redirect '/'
|
@@ -238,7 +315,8 @@ get '/env' do
|
|
238
315
|
<<-ENDRESPONSE
|
239
316
|
Ruby: #{RUBY_VERSION} <br/>
|
240
317
|
Rack: #{Rack::VERSION} <br/>
|
241
|
-
Sinatra: #{Sinatra::VERSION}
|
318
|
+
Sinatra: #{Sinatra::VERSION} <br/>
|
319
|
+
API: v#{API_VERSION}
|
242
320
|
ENDRESPONSE
|
243
321
|
end
|
244
322
|
|
data/public/main.css
CHANGED
@@ -10,7 +10,7 @@ h1 {
|
|
10
10
|
}
|
11
11
|
h2 {
|
12
12
|
font-size: 15px;
|
13
|
-
margin-top:
|
13
|
+
margin-top: 16px;
|
14
14
|
color: red;
|
15
15
|
display: inline-block;
|
16
16
|
}
|
@@ -96,7 +96,6 @@ ul li:hover ul {
|
|
96
96
|
/* Classes */
|
97
97
|
.container{
|
98
98
|
max-width:700px;
|
99
|
-
margin:2px auto 2px auto;
|
100
99
|
}
|
101
100
|
.width13{
|
102
101
|
width:13%;
|
@@ -269,6 +268,9 @@ ul li:hover ul {
|
|
269
268
|
padding-left:40px;
|
270
269
|
padding-right:40px;
|
271
270
|
}
|
271
|
+
.navbar-nav>li>a {
|
272
|
+
line-height:1.2;
|
273
|
+
}
|
272
274
|
|
273
275
|
|
274
276
|
/* By ID */
|
@@ -292,6 +294,11 @@ ul li:hover ul {
|
|
292
294
|
border:none;
|
293
295
|
box-shadow:none;
|
294
296
|
}
|
297
|
+
#importfile{
|
298
|
+
width:100%;
|
299
|
+
border:none;
|
300
|
+
box-shadow:none;
|
301
|
+
}
|
295
302
|
#backdrop{
|
296
303
|
background: rgba(0, 0, 0, 0.6);
|
297
304
|
position: fixed;
|
data/views/index.erb
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
<!-- BRANDING -->
|
19
19
|
<li style="float:left">
|
20
|
-
<h1>BetteR — REST API Test Client</h1>
|
20
|
+
<h1 style="margin-top:16px">BetteR — REST API Test Client</h1>
|
21
21
|
</li>
|
22
22
|
|
23
23
|
<!-- DROPDOWN MENU -->
|
@@ -30,6 +30,7 @@
|
|
30
30
|
<li onclick="savedRequestList()"><a>Load Request</a></li>
|
31
31
|
<li onclick="modalToggle('variables-modal')"><a>Variables</a></li>
|
32
32
|
<li onclick="modalToggle('file-upload-modal')"><a>File Upload</a></li>
|
33
|
+
<li onclick="modalToggle('import-modal')"><a>Import</a></li>
|
33
34
|
<li onclick="logsList()"><a>Logs</a></li>
|
34
35
|
<li onclick="quit()"><a>Quit</a></li>
|
35
36
|
</ul>
|
@@ -235,6 +236,23 @@
|
|
235
236
|
</div>
|
236
237
|
|
237
238
|
|
239
|
+
<!-- IMPORT MODAL -->
|
240
|
+
<div id="import-modal" class="centered" tabindex="-1" role="dialog" style="display:none; z-index:11" onclick="returnFalse(event)">
|
241
|
+
<div class="modal-content" style="padding-left:15px; padding-right:15px;">
|
242
|
+
<h4 style="text-align:center"><strong>Import from POSTMAN</strong></h4>
|
243
|
+
<hr>
|
244
|
+
<div class="modal-body">
|
245
|
+
<form id="import_form" method="post" action="/import" enctype="multipart/form-data">
|
246
|
+
<input type="file" id="importfile" name="importfile">
|
247
|
+
<div style="margin-top:25px; margin-bottom:5px; text-align:center">
|
248
|
+
<input type="submit" id="import_submit" class="btn btn-block btn-simple" style="width:140px; margin-left:auto; margin-right:auto;" value="Import">
|
249
|
+
</div>
|
250
|
+
</form>
|
251
|
+
</div>
|
252
|
+
</div>
|
253
|
+
</div>
|
254
|
+
|
255
|
+
|
238
256
|
<!-- SAVE REQUEST MODAL -->
|
239
257
|
<div id="save-modal" class="centered" tabindex="-1" role="dialog" style="display:none; z-index:11" onclick="returnFalse(event)">
|
240
258
|
<div class="modal-content" style="padding-left:15px; padding-right:15px;">
|
@@ -376,15 +394,6 @@
|
|
376
394
|
return body;
|
377
395
|
}
|
378
396
|
|
379
|
-
// TODO
|
380
|
-
/* Upload file for request */
|
381
|
-
function uploadFile() {
|
382
|
-
var vFD = new FormData(document.getElementById('datavalue'));
|
383
|
-
|
384
|
-
var client = new XMLHttpRequest();
|
385
|
-
client.open('POST', 'upload');
|
386
|
-
client.send(vFD);
|
387
|
-
}
|
388
397
|
|
389
398
|
/* Prepare and then send the request */
|
390
399
|
function sendRequest() {
|
@@ -510,6 +519,7 @@
|
|
510
519
|
|
511
520
|
if (client.status == 200) {
|
512
521
|
modalToggle('load-modal');
|
522
|
+
clearFile();
|
513
523
|
populateView(JSON.parse(client.responseText));
|
514
524
|
} else {
|
515
525
|
console.log('Unknown Error: GET ' + url + ' failed');
|
@@ -645,6 +655,7 @@
|
|
645
655
|
|
646
656
|
|
647
657
|
/* Retrieve a list of all log entries */
|
658
|
+
/* TODO: Add Log Deletion */
|
648
659
|
function logsList(){
|
649
660
|
var url = '/logs';
|
650
661
|
var client = new XMLHttpRequest();
|
@@ -666,9 +677,14 @@
|
|
666
677
|
for (j=0; j<log_list.length; j++) {
|
667
678
|
var log_item = document.createElement('a');
|
668
679
|
var item_txt = document.createTextNode(log_list[j]);
|
680
|
+
//var close = document.createElement('span');
|
681
|
+
//var entry_container = document.createElement('div');
|
682
|
+
|
669
683
|
log_item.href = '/logs/' + log_list[j];
|
670
684
|
log_item.className = 'logNodes';
|
671
685
|
log_item.appendChild(item_txt);
|
686
|
+
//close.innerHTML = 'x';
|
687
|
+
//close.setAttribute('onclick', deleteLog(log_list[j]));
|
672
688
|
document.getElementById('logsdata').appendChild(log_item);
|
673
689
|
}
|
674
690
|
} else {
|
@@ -693,6 +709,7 @@
|
|
693
709
|
document.getElementById('save-modal').style.display = 'none';
|
694
710
|
document.getElementById('load-modal').style.display = 'none';
|
695
711
|
document.getElementById('file-upload-modal').style.display = 'none';
|
712
|
+
document.getElementById('import-modal').style.display = 'none';
|
696
713
|
document.getElementById('variables-modal').style.display = 'none';
|
697
714
|
document.getElementById('logs-modal').style.display = 'none';
|
698
715
|
}
|
@@ -849,8 +866,6 @@
|
|
849
866
|
document.getElementById('usr').value = '';
|
850
867
|
document.getElementById('pwd').value = '';
|
851
868
|
document.getElementById('payload').value = '';
|
852
|
-
document.getElementById('varKey').value = '';
|
853
|
-
document.getElementById('varValue').value = '';
|
854
869
|
document.getElementById('payload').style.height = '100px';
|
855
870
|
|
856
871
|
if (document.getElementById('resultsBody')) {
|
@@ -868,6 +883,8 @@
|
|
868
883
|
while (headerfieldsAll.firstChild) {
|
869
884
|
headerfieldsAll.removeChild(headerfieldsAll.firstChild);
|
870
885
|
}
|
886
|
+
document.getElementById('requestTime').innerHTML = '';
|
887
|
+
document.getElementById('returnCode').innerHTML = '';
|
871
888
|
clearFile();
|
872
889
|
}
|
873
890
|
|
@@ -894,21 +911,6 @@
|
|
894
911
|
}
|
895
912
|
}
|
896
913
|
|
897
|
-
function setHeight() {
|
898
|
-
var payloadHeight = document.getElementById('payload').style.height;
|
899
|
-
document.getElementById('payloadHeight').value = payloadHeight;
|
900
|
-
if (document.getElementById('resultsBody').style.display != 'none'){
|
901
|
-
var resHeight = document.getElementById('resultsBody').style.height;
|
902
|
-
}
|
903
|
-
if (document.getElementById('results-req-head').style.display != 'none') {
|
904
|
-
var resHeight = document.getElementById('results-req-head').style.height;
|
905
|
-
}
|
906
|
-
if (document.getElementById('results-resp-head').style.display != 'none') {
|
907
|
-
var resHeight = document.getElementById('results-req-head').style.height;
|
908
|
-
}
|
909
|
-
document.getElementById('responseHeight').value = resHeight;
|
910
|
-
}
|
911
|
-
|
912
914
|
|
913
915
|
/* Shut down server and then reload page */
|
914
916
|
function quit(){
|
@@ -969,7 +971,30 @@
|
|
969
971
|
}
|
970
972
|
|
971
973
|
|
972
|
-
/*
|
974
|
+
/* Import from POSTMAN */
|
975
|
+
document.getElementById('import_form').onsubmit = function(event) {
|
976
|
+
event.preventDefault();
|
977
|
+
|
978
|
+
var data_store = document.getElementById('importfile');
|
979
|
+
var form = new FormData();
|
980
|
+
form.append('file', data_store.files[0]);
|
981
|
+
|
982
|
+
var client = new XMLHttpRequest();
|
983
|
+
|
984
|
+
client.onreadystatechange = function() {
|
985
|
+
if (client.readyState == 4 && client.status == 200) {
|
986
|
+
modalHideAll();
|
987
|
+
} else if (client.readyState == 4) {
|
988
|
+
console.log('Error importing POSTMAN file');
|
989
|
+
}
|
990
|
+
}
|
991
|
+
|
992
|
+
client.open('POST', '/import', true);
|
993
|
+
client.send(form);
|
994
|
+
}
|
995
|
+
|
996
|
+
|
997
|
+
/* Upload file */
|
973
998
|
document.getElementById('upload_form').onsubmit = function(event) {
|
974
999
|
event.preventDefault();
|
975
1000
|
|
@@ -981,13 +1006,11 @@
|
|
981
1006
|
|
982
1007
|
client.onreadystatechange = function() {
|
983
1008
|
if (client.readyState == 4 && client.status == 200) {
|
984
|
-
var height = document.getElementById('payload').offsetHeight;
|
985
1009
|
var filename = document.getElementById('datafile').files[0].name;
|
986
1010
|
|
987
1011
|
document.getElementById('payload').style.display = 'none';
|
988
1012
|
document.getElementById('filename').style.display = '';
|
989
1013
|
document.getElementById('clear-file').style.display = '';
|
990
|
-
document.getElementById('filename').height = height;
|
991
1014
|
document.getElementById('filename').innerHTML = filename;
|
992
1015
|
|
993
1016
|
modalHideAll();
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: better_rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Willems
|
@@ -10,7 +10,7 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2014-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
13
|
+
description: Configurable REST API test client accessible via your browser
|
14
14
|
email:
|
15
15
|
- jason@willems.ca
|
16
16
|
executables:
|