better_rest 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|