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 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: