lackie 0.1.6 → 0.1.7
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.
- data/lib/lackie.rb +1 -1
- data/lib/lackie/javascript/surrender.js +53 -47
- data/lib/lackie/rack/middleware.rb +25 -5
- data/spec/lackie/rack/middleware_spec.rb +48 -10
- metadata +7 -7
data/lib/lackie.rb
CHANGED
@@ -8,12 +8,9 @@ Lackie = {
|
|
8
8
|
return;
|
9
9
|
}
|
10
10
|
Lackie.get("/yield", function(body) {
|
11
|
-
|
12
|
-
Lackie.reload();
|
13
|
-
return;
|
14
|
-
}
|
11
|
+
var json = JSON.parse(body);
|
15
12
|
Lackie.wip = true;
|
16
|
-
Lackie.execute(
|
13
|
+
Lackie.execute(json.command, json.id);
|
17
14
|
});
|
18
15
|
},
|
19
16
|
|
@@ -24,20 +21,25 @@ Lackie = {
|
|
24
21
|
});
|
25
22
|
},
|
26
23
|
|
27
|
-
execute: function(command) {
|
24
|
+
execute: function(command, id) {
|
25
|
+
if (command.indexOf('Lackie.reload()') == 0) {
|
26
|
+
Lackie.reload(id);
|
27
|
+
return;
|
28
|
+
}
|
29
|
+
|
28
30
|
var result;
|
29
31
|
try {
|
30
|
-
result = {
|
32
|
+
result = { id: id, value: eval(command) };
|
31
33
|
}
|
32
34
|
catch(e) {
|
33
|
-
result = {
|
35
|
+
result = { id: id, error: e.toString() };
|
34
36
|
}
|
35
37
|
Lackie.result(result);
|
36
38
|
},
|
37
39
|
|
38
|
-
reload: function() {
|
40
|
+
reload: function(id) {
|
39
41
|
Lackie.enabled = false;
|
40
|
-
Lackie.post("/result", '{ "value": "reloading" }', function() {
|
42
|
+
Lackie.post("/result", '{ "id": ' + id + ', "value": "reloading" }', function() {
|
41
43
|
window.location.reload(true);
|
42
44
|
});
|
43
45
|
},
|
@@ -51,32 +53,50 @@ Lackie = {
|
|
51
53
|
},
|
52
54
|
|
53
55
|
get: function(path, bodyCallback) {
|
54
|
-
Lackie.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
return;
|
56
|
+
var xhReq = Lackie.createXMLHttpRequest();
|
57
|
+
function readyStateChange() {
|
58
|
+
if (xhReq.readyState != 4) {
|
59
|
+
return;
|
59
60
|
}
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
var body = xhReq.responseText;
|
62
|
+
var status = xhReq.status;
|
63
|
+
Lackie.disposeXMLHttpRequest(xhReq);
|
64
|
+
if (status == 200) {
|
65
|
+
bodyCallback(body);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
xhReq.open("GET", Lackie.url(path), true);
|
69
|
+
xhReq.onreadystatechange = readyStateChange;
|
70
|
+
xhReq.send(null);
|
64
71
|
},
|
65
|
-
|
66
|
-
post: function(path,
|
67
|
-
Lackie.
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
return;
|
72
|
+
|
73
|
+
post: function(path, json, callback) {
|
74
|
+
var xhReq = Lackie.createXMLHttpRequest();
|
75
|
+
function readyStateChange() {
|
76
|
+
if (xhReq.readyState != 4) {
|
77
|
+
return;
|
72
78
|
}
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
79
|
+
var status = xhReq.status;
|
80
|
+
Lackie.disposeXMLHttpRequest(xhReq);
|
81
|
+
if (status == 200) {
|
82
|
+
callback();
|
83
|
+
}
|
84
|
+
}
|
85
|
+
xhReq.open("POST", Lackie.url(path), true);
|
86
|
+
xhReq.setRequestHeader("Content-type", "application/json");
|
87
|
+
xhReq.setRequestHeader("Content-length", json.length);
|
88
|
+
xhReq.setRequestHeader("Connection", "close");
|
89
|
+
xhReq.onreadystatechange = readyStateChange;
|
90
|
+
xhReq.send(json);
|
91
|
+
},
|
92
|
+
|
93
|
+
|
94
|
+
disposeXMLHttpRequest: function(xhReq) {
|
95
|
+
try {
|
96
|
+
if (typeof xhReq.destroy == 'function') {
|
97
|
+
xhReq.destroy();
|
98
|
+
}
|
99
|
+
} catch(e) {}
|
80
100
|
},
|
81
101
|
|
82
102
|
createXMLHttpRequest: function() {
|
@@ -89,20 +109,6 @@ Lackie = {
|
|
89
109
|
throw new Error("XMLHttpRequest not supported");
|
90
110
|
},
|
91
111
|
|
92
|
-
usingAjax: function(callback) {
|
93
|
-
var xhReq = Lackie.createXMLHttpRequest();
|
94
|
-
try {
|
95
|
-
callback(xhReq);
|
96
|
-
}
|
97
|
-
finally {
|
98
|
-
try {
|
99
|
-
if (typeof xhReq.destroy == 'function')
|
100
|
-
xhReq.destroy();
|
101
|
-
delete xhReq;
|
102
|
-
} catch(e) {}
|
103
|
-
}
|
104
|
-
},
|
105
|
-
|
106
112
|
url: function(path) {
|
107
113
|
var now = new Date();
|
108
114
|
return Lackie.baseUrl + path + '?' + now.getTime().toString();
|
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'lackie/javascript'
|
2
|
+
require 'lackie/rack/logger'
|
2
3
|
|
3
4
|
module Lackie
|
4
5
|
module Rack
|
5
6
|
class Middleware
|
6
|
-
def initialize(app)
|
7
|
-
@app = app
|
7
|
+
def initialize(app, logger=NilLogger.new)
|
8
|
+
@app, @logger = app, logger
|
8
9
|
@command = nil
|
9
10
|
@result = nil
|
10
11
|
@surrender = Lackie::JavaScript::Surrender.new
|
12
|
+
@command_id = 0
|
11
13
|
end
|
12
14
|
|
13
15
|
def call(env)
|
@@ -20,13 +22,15 @@ module Lackie
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def surrender(request)
|
23
|
-
|
25
|
+
@logger.log("surrendered to #{request.user_agent}")
|
24
26
|
js(@surrender.script)
|
25
27
|
end
|
26
28
|
|
27
29
|
def eval(request)
|
28
30
|
@result = nil
|
29
31
|
@command = request.body.read.to_s
|
32
|
+
@command_id += 1
|
33
|
+
@logger.log("eval " + command_json(@command))
|
30
34
|
plain("OK")
|
31
35
|
end
|
32
36
|
|
@@ -36,7 +40,7 @@ module Lackie
|
|
36
40
|
else
|
37
41
|
cmd = @command
|
38
42
|
@command = nil
|
39
|
-
js(cmd)
|
43
|
+
js(command_json(cmd))
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
@@ -50,6 +54,10 @@ module Lackie
|
|
50
54
|
|
51
55
|
private
|
52
56
|
|
57
|
+
def command_json(cmd)
|
58
|
+
{ :command => cmd, :id => @command_id }.to_json
|
59
|
+
end
|
60
|
+
|
53
61
|
def get_result(request)
|
54
62
|
if @result.nil?
|
55
63
|
not_found
|
@@ -61,7 +69,15 @@ module Lackie
|
|
61
69
|
end
|
62
70
|
|
63
71
|
def set_result(request)
|
64
|
-
|
72
|
+
begin
|
73
|
+
r = JSON.parse(request.body.read.to_s)
|
74
|
+
rescue
|
75
|
+
return bad_request
|
76
|
+
end
|
77
|
+
if r['id'].to_i == @command_id
|
78
|
+
@result = r.to_json
|
79
|
+
@logger.log("result #{@result}")
|
80
|
+
end
|
65
81
|
plain("OK")
|
66
82
|
end
|
67
83
|
|
@@ -84,6 +100,10 @@ module Lackie
|
|
84
100
|
def not_found
|
85
101
|
[404, {'Content-Type' => 'text/plain'}, ['Not Found']]
|
86
102
|
end
|
103
|
+
|
104
|
+
def bad_request
|
105
|
+
[400, {'Content-Type' => 'text/plain'}, ['Bad Request']]
|
106
|
+
end
|
87
107
|
end
|
88
108
|
end
|
89
109
|
end
|
@@ -5,14 +5,14 @@ module Lackie
|
|
5
5
|
module Rack
|
6
6
|
describe Middleware do
|
7
7
|
before do
|
8
|
-
Lackie::JavaScript::Surrender.
|
8
|
+
Lackie::JavaScript::Surrender.stub!(:new).and_return(mock("surrender", :script => "yowzer"))
|
9
9
|
@app = mock("app")
|
10
10
|
@env = mock("env")
|
11
11
|
@middleware = Middleware.new(@app)
|
12
12
|
end
|
13
13
|
|
14
14
|
def request(options)
|
15
|
-
@request = mock("Request: #{options.inspect}", options)
|
15
|
+
@request = mock("Request: #{options.inspect}", options.merge(:user_agent => "some-user-agent"))
|
16
16
|
::Rack::Request.stub!(:new).with(@env).and_return(@request)
|
17
17
|
@middleware.call(@env)
|
18
18
|
end
|
@@ -42,19 +42,45 @@ module Lackie
|
|
42
42
|
end
|
43
43
|
|
44
44
|
describe "POST /lackie/eval with the body 'foo()'" do
|
45
|
-
describe "
|
45
|
+
describe "then GET /lackie/yield" do
|
46
46
|
it "returns 'foo()' as the response body" do
|
47
47
|
post("/lackie/eval", "foo()")
|
48
|
-
get("/lackie/yield").should == [200, {"Content-Type"=>"text/javascript"},
|
48
|
+
get("/lackie/yield").should == [200, {"Content-Type"=>"text/javascript"},
|
49
|
+
['{"command":"foo()","id":1}'] ]
|
49
50
|
end
|
50
51
|
|
51
|
-
describe "
|
52
|
-
it "returns
|
52
|
+
describe "then GET /lackie/yield" do
|
53
|
+
it "returns not found" do
|
53
54
|
post("/lackie/eval", "foo()")
|
54
55
|
get("/lackie/yield")
|
55
56
|
get("/lackie/yield").should == [404, {"Content-Type"=>"text/plain"}, ["Not Found"]]
|
56
57
|
end
|
57
58
|
end
|
59
|
+
|
60
|
+
describe "then POST /lackie/eval with the body 'bar()'" do
|
61
|
+
describe "then POST /lackie/result with the body 'foo-result'" do
|
62
|
+
describe "then GET /lackie/result" do
|
63
|
+
it "returns 404 not found" do
|
64
|
+
post("/lackie/eval", "foo()")
|
65
|
+
post("/lackie/eval", "bar()")
|
66
|
+
post("/lackie/result", { :id => 1, :value => "foo-result" }.to_json)
|
67
|
+
get("/lackie/result").should == [404, {'Content-Type' => 'text/plain'}, ["Not Found"]]
|
68
|
+
end
|
69
|
+
describe "then POST /lackie/result with the body 'bar-result'" do
|
70
|
+
describe "then GET /lackie/result" do
|
71
|
+
it "returns the value 'bar-result'" do
|
72
|
+
post("/lackie/eval", "foo()")
|
73
|
+
post("/lackie/eval", "bar()")
|
74
|
+
post("/lackie/result", { :id => 1, :value => "foo-result" }.to_json)
|
75
|
+
post("/lackie/result", { :id => 2, :value => "bar-result" }.to_json)
|
76
|
+
result_body = JSON.parse(get("/lackie/result").last.first)
|
77
|
+
result_body["value"].should == "bar-result"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
58
84
|
end
|
59
85
|
end
|
60
86
|
|
@@ -64,11 +90,23 @@ module Lackie
|
|
64
90
|
end
|
65
91
|
end
|
66
92
|
|
67
|
-
describe "POST /lackie/result with
|
68
|
-
describe "
|
93
|
+
describe "POST /lackie/result with valid json in the body" do
|
94
|
+
describe "then GET /lackie/result" do
|
69
95
|
it "gets 'bar' as the response body" do
|
70
|
-
post("/lackie/
|
71
|
-
|
96
|
+
post("/lackie/eval", "happy")
|
97
|
+
json_string = { :value => "go lucky", :id => 1 }.to_json
|
98
|
+
post("/lackie/result", json_string)
|
99
|
+
result_body = JSON.parse(get("/lackie/result").last.first)
|
100
|
+
result_body["id"].should == 1
|
101
|
+
result_body["value"].should == "go lucky"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "POST /lackie/result with invalid json in the body" do
|
107
|
+
describe "then GET /lackie/result" do
|
108
|
+
it "returns 400 Bad Request" do
|
109
|
+
post("/lackie/result", "crunch").should == [400, {"Content-Type"=>'text/plain'}, ["Bad Request"]]
|
72
110
|
end
|
73
111
|
end
|
74
112
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lackie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 21
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 7
|
10
|
+
version: 0.1.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Josh Chisholm
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-28 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -194,10 +194,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
194
|
requirements: []
|
195
195
|
|
196
196
|
rubyforge_project:
|
197
|
-
rubygems_version: 1.
|
197
|
+
rubygems_version: 1.4.1
|
198
198
|
signing_key:
|
199
199
|
specification_version: 3
|
200
|
-
summary: lackie-0.1.
|
200
|
+
summary: lackie-0.1.7
|
201
201
|
test_files:
|
202
202
|
- features/remote_control.feature
|
203
203
|
- features/step_definitions/lackie_steps.rb
|