better_rest 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/better_rest.gemspec +10 -10
- data/lib/better_rest.rb +30 -7
- data/public/main.css +23 -4
- data/views/index.erb +44 -15
- 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: bfaa3bbcd0d6672673e20e65445adf86c73f5a6e
|
4
|
+
data.tar.gz: 12f00f9fe9fde98badb210259983162dad385666
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 141d47a6c68f753520bbc8f84b21bcc3d2e8e9be62ac10bf9e0c03d80a6c1fd3b28c0e012383b186cfad111b27bccd704e2b859b91a7917b54b9fe453ffdfe68
|
7
|
+
data.tar.gz: 179de131c5a8df2f23d95dbe4dae2df4f692090a564957a0d0acf31d1122e382a6a3adc4026512606f3f6c041c617f4b59c754eda385fe1afd887d46705c60a5
|
data/better_rest.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
s.name
|
3
|
-
s.version
|
4
|
-
s.licenses
|
5
|
-
s.summary
|
6
|
-
s.date
|
7
|
-
s.description
|
8
|
-
s.authors
|
9
|
-
s.email
|
10
|
-
s.homepage
|
11
|
-
s.files
|
2
|
+
s.name = "better_rest"
|
3
|
+
s.version = "0.2.3"
|
4
|
+
s.licenses = ['MIT']
|
5
|
+
s.summary = "REST Test Client"
|
6
|
+
s.date = "2015-02-01"
|
7
|
+
s.description = "Configurable REST API test client accessible via your browser"
|
8
|
+
s.authors = ["Jason Willems"]
|
9
|
+
s.email = ["jason@willems.ca"]
|
10
|
+
s.homepage = "https://github.com/at1as/BetteR"
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
12
|
s.executables << 'better_rest'
|
13
13
|
end
|
data/lib/better_rest.rb
CHANGED
@@ -8,8 +8,16 @@ require 'sinatra'
|
|
8
8
|
require 'typhoeus'
|
9
9
|
require 'json'
|
10
10
|
|
11
|
+
set :environment, :development
|
11
12
|
set :public_dir, File.expand_path('../../public', __FILE__)
|
12
13
|
set :views, File.expand_path('../../views', __FILE__)
|
14
|
+
set :bind, '0.0.0.0'
|
15
|
+
|
16
|
+
configure :development do
|
17
|
+
enable :logging, :dump_errors, :raise_errors
|
18
|
+
end
|
19
|
+
set :show_exceptions, true if development?
|
20
|
+
|
13
21
|
|
14
22
|
helpers do
|
15
23
|
include Rack::Utils
|
@@ -17,9 +25,12 @@ helpers do
|
|
17
25
|
|
18
26
|
def parse_cookies(cookies)
|
19
27
|
cookie_hash = {}
|
20
|
-
|
21
|
-
|
22
|
-
|
28
|
+
cookies_list = [*cookies]
|
29
|
+
cookies_list.each do |cookie|
|
30
|
+
cookie.split('; ').each do |c|
|
31
|
+
key, value = c.split('=', 2)
|
32
|
+
cookie_hash[key] = value
|
33
|
+
end
|
23
34
|
end
|
24
35
|
cookie_hash.to_json
|
25
36
|
end
|
@@ -135,7 +146,7 @@ post '/request' do
|
|
135
146
|
end
|
136
147
|
|
137
148
|
# Write cookie to file
|
138
|
-
if response.headers_hash['set-cookie']
|
149
|
+
if @cookies && response.headers_hash['set-cookie']
|
139
150
|
cookies = parse_cookies(response.headers_hash['set-cookie'])
|
140
151
|
File.open('cookiejar', 'w') { |file| file.write(cookies) }
|
141
152
|
end
|
@@ -161,7 +172,7 @@ post '/request' do
|
|
161
172
|
@response_body['return_body'] = response.body.force_encoding('ISO-8859-1')
|
162
173
|
end
|
163
174
|
|
164
|
-
@response_body['return_headers'] = response.response_headers
|
175
|
+
@response_body['return_headers'] = response.response_headers.force_encoding('ISO-8859-1')
|
165
176
|
|
166
177
|
@response_body.to_json
|
167
178
|
end
|
@@ -276,7 +287,18 @@ get '/logs/:log' do
|
|
276
287
|
end
|
277
288
|
|
278
289
|
|
279
|
-
# Delete
|
290
|
+
# Delete logs
|
291
|
+
delete '/logs' do
|
292
|
+
logs = Dir["logs/*.log"]
|
293
|
+
|
294
|
+
logs.each do |log|
|
295
|
+
File.delete(log)
|
296
|
+
end
|
297
|
+
200
|
298
|
+
end
|
299
|
+
|
300
|
+
|
301
|
+
# Delete log entry
|
280
302
|
delete '/logs/:log' do
|
281
303
|
log = "logs/#{params[:log]}.log"
|
282
304
|
|
@@ -375,7 +397,8 @@ get '/env' do
|
|
375
397
|
Ruby: #{RUBY_VERSION} <br/>
|
376
398
|
Rack: #{Rack::VERSION} <br/>
|
377
399
|
Sinatra: #{Sinatra::VERSION} <br/>
|
378
|
-
API: v#{API_VERSION}
|
400
|
+
API: v#{API_VERSION} <br/>
|
401
|
+
Env: #{settings.environment}
|
379
402
|
ENDRESPONSE
|
380
403
|
end
|
381
404
|
|
data/public/main.css
CHANGED
@@ -98,7 +98,7 @@ ul li:hover ul {
|
|
98
98
|
|
99
99
|
/* Classes */
|
100
100
|
.container{
|
101
|
-
max-width:
|
101
|
+
max-width:720px;
|
102
102
|
}
|
103
103
|
.width13{
|
104
104
|
width:13%;
|
@@ -264,18 +264,30 @@ ul li:hover ul {
|
|
264
264
|
.semi-bold{
|
265
265
|
font-weight:500;
|
266
266
|
}
|
267
|
+
.logEntry{
|
268
|
+
text-align:center;
|
269
|
+
padding-top:4px;
|
270
|
+
padding-bottom:4px;
|
271
|
+
}
|
267
272
|
.logNodes{
|
268
|
-
display:block;
|
273
|
+
display:inline-block;
|
269
274
|
text-align:center;
|
270
275
|
margin-right:auto;
|
271
276
|
margin-left:auto;
|
272
|
-
padding-left:40px;
|
273
277
|
padding-right:40px;
|
274
278
|
}
|
275
279
|
.navbar-nav>li>a {
|
276
280
|
line-height:1.2;
|
277
281
|
}
|
278
|
-
|
282
|
+
.headerContainer{
|
283
|
+
margin-bottom:2px;
|
284
|
+
}
|
285
|
+
.float-red:hover{
|
286
|
+
color:red;
|
287
|
+
}
|
288
|
+
.form-control{
|
289
|
+
height: 32px;
|
290
|
+
}
|
279
291
|
|
280
292
|
/* By ID */
|
281
293
|
#add{
|
@@ -366,6 +378,13 @@ ul li:hover ul {
|
|
366
378
|
#logs-modal{
|
367
379
|
width:400px;
|
368
380
|
}
|
381
|
+
#clearAllLogs{
|
382
|
+
margin-left:auto;
|
383
|
+
margin-right:auto;
|
384
|
+
margin-top:15px;
|
385
|
+
width:100%;
|
386
|
+
text-align:center;
|
387
|
+
}
|
369
388
|
|
370
389
|
|
371
390
|
/* Tooltips */
|
data/views/index.erb
CHANGED
@@ -105,9 +105,9 @@
|
|
105
105
|
<div class="box" id="headers">
|
106
106
|
<div id="headerfieldsAll">
|
107
107
|
<% @header_hash.each_with_index do |(key, value), index| %>
|
108
|
-
<div id="headerfields<%= index %>"
|
109
|
-
<input type="text" value="<%=key%>" name="key
|
110
|
-
<input type="text" value="<%=value%>" name="value
|
108
|
+
<div id="headerfields<%= index %>" class="headerContainer" >
|
109
|
+
<input type="text" value="<%=key%>" name="key" id="key<%=index%>" placeholder=" Name" class="key form-control head-input" autocomplete="off"/>
|
110
|
+
<input type="text" value="<%=value%>" name="value" id="value<%=index%>" placeholder=" Value" class="value form-control head-input" autocomplete="off"/>
|
111
111
|
|
112
112
|
<button id="close<%= index %>" tabindex="-1" type="button" class="close" onclick="removeRow(this)">
|
113
113
|
<span style="line-height:inherit" aria-hidden="true">×</span>
|
@@ -299,6 +299,9 @@
|
|
299
299
|
<hr>
|
300
300
|
<div class="modal-body">
|
301
301
|
<div id="logsdata"></div>
|
302
|
+
<div id="clearAllLogs">
|
303
|
+
<div class="btn btn-simple" style="width:200px" onclick="deleteAllLogs()">Delete All</div>
|
304
|
+
</div>
|
302
305
|
</div>
|
303
306
|
</div>
|
304
307
|
</div>
|
@@ -664,8 +667,28 @@
|
|
664
667
|
}
|
665
668
|
|
666
669
|
|
670
|
+
/* delete log from list */
|
671
|
+
function deleteLog(button_id){
|
672
|
+
var log_name = button_id.getAttribute('name');
|
673
|
+
|
674
|
+
var url = '/logs/' + log_name;
|
675
|
+
var client = new XMLHttpRequest();
|
676
|
+
|
677
|
+
client.onreadystatechange = function() {
|
678
|
+
if (client.readyState == 4 && client.status == 200) {
|
679
|
+
modalHideAll();
|
680
|
+
logsList();
|
681
|
+
} else if (client.readyState == 4) {
|
682
|
+
console.log('Unknown Error: DELETE ' + log_name + ' failed');
|
683
|
+
}
|
684
|
+
}
|
685
|
+
|
686
|
+
client.open('DELETE', url, true);
|
687
|
+
client.send();
|
688
|
+
}
|
689
|
+
|
690
|
+
|
667
691
|
/* Retrieve a list of all log entries */
|
668
|
-
/* TODO: Add Log Deletion */
|
669
692
|
function logsList(){
|
670
693
|
var url = '/logs';
|
671
694
|
var client = new XMLHttpRequest();
|
@@ -687,15 +710,21 @@
|
|
687
710
|
for (j=0; j<log_list.length; j++) {
|
688
711
|
var log_item = document.createElement('a');
|
689
712
|
var item_txt = document.createTextNode(log_list[j]);
|
690
|
-
|
691
|
-
|
713
|
+
var close = document.createElement('span');
|
714
|
+
var entry_container = document.createElement('div');
|
692
715
|
|
693
716
|
log_item.href = '/logs/' + log_list[j];
|
694
717
|
log_item.className = 'logNodes';
|
695
718
|
log_item.appendChild(item_txt);
|
696
|
-
|
697
|
-
|
698
|
-
|
719
|
+
close.innerHTML = 'x';
|
720
|
+
close.className = 'float-red';
|
721
|
+
close.setAttribute('onclick', 'deleteLog(this)');
|
722
|
+
close.setAttribute('name', log_list[j]);
|
723
|
+
|
724
|
+
entry_container.className = 'logEntry';
|
725
|
+
entry_container.appendChild(log_item);
|
726
|
+
entry_container.appendChild(close);
|
727
|
+
document.getElementById('logsdata').appendChild(entry_container);
|
699
728
|
}
|
700
729
|
} else {
|
701
730
|
console.log('Unknown Error: GET ' + logs + ' failed');
|
@@ -781,12 +810,12 @@
|
|
781
810
|
var header_val = document.createElement('input');
|
782
811
|
var close_btn = document.createElement('button');
|
783
812
|
|
784
|
-
input_container.type
|
785
|
-
input_container.
|
786
|
-
input_container.
|
813
|
+
input_container.type = 'div';
|
814
|
+
input_container.id = 'headerfields' + clickCount;
|
815
|
+
input_container.className = 'headerContainer';
|
787
816
|
|
788
817
|
header_key.type = 'text';
|
789
|
-
header_key.name = 'key'
|
818
|
+
header_key.name = 'key';
|
790
819
|
header_key.id = 'key' + clickCount;
|
791
820
|
header_key.className = 'key form-control head-input';
|
792
821
|
header_key.placeholder = ' Name';
|
@@ -795,10 +824,10 @@
|
|
795
824
|
header_key.value = header_key.value.replace('key', 'key' + clickCount);
|
796
825
|
|
797
826
|
/* Not sure why this is necessary. But it is */
|
798
|
-
header_key.style = 'margin-right:9px';
|
827
|
+
//header_key.style = 'margin-right:9px';
|
799
828
|
|
800
829
|
header_val.type = 'text';
|
801
|
-
header_val.name = 'value'
|
830
|
+
header_val.name = 'value';
|
802
831
|
header_val.id = 'value' + clickCount;
|
803
832
|
header_val.className = 'value form-control head-input';
|
804
833
|
header_val.placeholder = ' Value';
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Willems
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Configurable REST API test client accessible via your browser
|
14
14
|
email:
|