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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e391c09a3930c6c9f2d5bdcc35aedf4296109aad
4
- data.tar.gz: 944d0e611bc34c43717109678ec441b4e8ff2aab
3
+ metadata.gz: eec73eed2d71fd24e5ef1a6380ba9b96c0c3cc86
4
+ data.tar.gz: d31fae1445848a5ceac23ea96fecdcd53f707291
5
5
  SHA512:
6
- metadata.gz: c38a7f7355728f3dec51213ac23dc4c29ad5cb8bdd478a9ccdf671a6eb5e715d15201f3fcb5466a4332471d2331877eb5ea48c9345441820d3fac6ac333e44e3
7
- data.tar.gz: 2e51051265116b638ddd25bea50ad1fbb761b81d1555011e8146aa8e7cdbbb115c31d51780deac028d3b239df5336d221aa80b77534bae90bce687ca579ba29e
6
+ metadata.gz: 4de8bf79426d9fcd5fde7879d08fbd9c9fcd324431e0dad4b9d1e6d691069693aea5123c4b90d008000e04f8985eccf1b7901377076d1b1123ec5e44f1aefef2
7
+ data.tar.gz: 70c11e61852ad401b97063cac090335b6a7aa075c88347e8d9423ea5c269616dc290080a5da19112547d8f4715f2d91f1389b2fab38d95dffaf76622530153e1
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  .DS_Store
2
+ .gem
2
3
  requests
3
4
  logs
4
5
  tmp
data/README.md CHANGED
@@ -26,9 +26,8 @@ See Gemfile for dependencies
26
26
 
27
27
  ### TODO
28
28
 
29
- * POSTMAN import
30
29
  * OAuth/OAuth2 support
31
30
  * Update current deprecated Basic/Digest Auth method
32
31
  * Download to file
33
32
  * Support more than one variable
34
- * Delete logs
33
+ * Delete logs (front-end)
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.0"
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 = "A Configurable REST API test client accessible via your browser"
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 = 1
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
- # View response parameters
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
- @response_body['return_msg'] = response.return_code.upcase
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('UTF-8')
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: 18px;
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 &mdash; REST API Test Client</h1>
20
+ <h1 style="margin-top:16px">BetteR &mdash; 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
- /* Upload form data without form submit */
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.0
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: A Configurable REST API test client accessible via your browser
13
+ description: Configurable REST API test client accessible via your browser
14
14
  email:
15
15
  - jason@willems.ca
16
16
  executables: