lackie 0.1.0 → 0.1.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.
- data/features/remote_control.feature +11 -3
- data/features/support/example_app/app.html +1 -1
- data/lackie.gemspec +1 -0
- data/lib/lackie/javascript/surrender.js +11 -2
- data/lib/lackie/rack/middleware.rb +8 -3
- data/lib/lackie/remote_control.rb +22 -2
- data/lib/lackie.rb +1 -1
- data/spec/lackie/rack/middleware_spec.rb +1 -1
- data/spec/lackie/remote_control_spec.rb +10 -0
- metadata +21 -5
@@ -3,10 +3,18 @@ Feature: Remote Control
|
|
3
3
|
As a client
|
4
4
|
I want to surrender applications as javascript lackies
|
5
5
|
|
6
|
-
Scenario: Remote Execution
|
6
|
+
Scenario Outline: Remote Execution
|
7
7
|
Given I have surrendered my web page as a lackie
|
8
|
-
When I tell the lackie to execute "
|
9
|
-
Then I should see a result with the value "
|
8
|
+
When I tell the lackie to execute "<command>"
|
9
|
+
Then I should see a result with the value "<result>"
|
10
|
+
|
11
|
+
Examples:
|
12
|
+
|
13
|
+
| command | result |
|
14
|
+
| 1 + 1 | 2 |
|
15
|
+
| 2 + 2 | 4 |
|
16
|
+
| 'foo' | foo |
|
17
|
+
| document.title | Lackie Example App |
|
10
18
|
|
11
19
|
Scenario: Remote Execution Error
|
12
20
|
Given I have surrendered my web page as a lackie
|
data/lackie.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_development_dependency 'cucumber', '~> 0.10.0'
|
19
19
|
s.add_development_dependency 'mongrel', '~> 1.1.5'
|
20
20
|
s.add_development_dependency 'relevance-rcov', '~> 0.9.2.1'
|
21
|
+
s.add_development_dependency 'selenium-webdriver', '~> 0.1.2'
|
21
22
|
|
22
23
|
s.rubygems_version = "1.3.7"
|
23
24
|
s.files = `git ls-files`.split("\n")
|
@@ -1,4 +1,7 @@
|
|
1
1
|
Lackie = {
|
2
|
+
wip: false,
|
3
|
+
enabled: true,
|
4
|
+
|
2
5
|
createXMLHttpRequest: function() {
|
3
6
|
try { return new XMLHttpRequest(); } catch(e) {}
|
4
7
|
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
|
@@ -6,9 +9,13 @@ Lackie = {
|
|
6
9
|
},
|
7
10
|
|
8
11
|
yield: function() {
|
12
|
+
if (Lackie.wip || !Lackie.enabled) {
|
13
|
+
return;
|
14
|
+
}
|
9
15
|
var xhReq = Lackie.createXMLHttpRequest();
|
10
16
|
function readyStateChange() {
|
11
|
-
if (xhReq.readyState != 4) { return; }
|
17
|
+
if (xhReq.readyState != 4 || xhReq.status==404) { return; }
|
18
|
+
Lackie.wip = true;
|
12
19
|
try {
|
13
20
|
Lackie.execute(xhReq.responseText);
|
14
21
|
}
|
@@ -32,6 +39,7 @@ Lackie = {
|
|
32
39
|
xhReq.setRequestHeader("Content-length", params.length);
|
33
40
|
xhReq.setRequestHeader("Connection", "close");
|
34
41
|
xhReq.send(params);
|
42
|
+
Lackie.wip = false;
|
35
43
|
},
|
36
44
|
|
37
45
|
execute: function(command) {
|
@@ -53,6 +61,7 @@ Lackie = {
|
|
53
61
|
return message;
|
54
62
|
}
|
55
63
|
}
|
64
|
+
|
56
65
|
if (window) {
|
57
|
-
window.setInterval(Lackie.yield,
|
66
|
+
window.setInterval(Lackie.yield, 400);
|
58
67
|
}
|
@@ -4,6 +4,7 @@ module Lackie
|
|
4
4
|
module Rack
|
5
5
|
class Middleware
|
6
6
|
def initialize(app)
|
7
|
+
#puts "MIDDLEWARE CREATED"
|
7
8
|
@app = app
|
8
9
|
@command = nil
|
9
10
|
@result = nil
|
@@ -31,9 +32,13 @@ module Lackie
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def yield(request)
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
if @command.nil?
|
36
|
+
not_found
|
37
|
+
else
|
38
|
+
cmd = @command
|
39
|
+
@command = nil
|
40
|
+
js(cmd)
|
41
|
+
end
|
37
42
|
end
|
38
43
|
|
39
44
|
def result(request)
|
@@ -20,13 +20,19 @@ module Lackie
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def send_command(command)
|
23
|
-
|
23
|
+
url = "http://#{@host}:#{@port}/lackie/eval"
|
24
|
+
begin
|
25
|
+
RestClient.post(url, command)
|
26
|
+
rescue => e
|
27
|
+
raise ConnectionError.new(url, e)
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
def poll_for_result(command)
|
27
32
|
body = nil
|
28
33
|
@poller.await("result of command:\n#{command}") do
|
29
34
|
body = retrieve_result_body
|
35
|
+
!body.nil?
|
30
36
|
end
|
31
37
|
parse_result(body)
|
32
38
|
end
|
@@ -41,11 +47,25 @@ module Lackie
|
|
41
47
|
|
42
48
|
def parse_result(body)
|
43
49
|
parsed_body = JSON.parse(body)
|
44
|
-
|
50
|
+
if parsed_body.include?("error")
|
51
|
+
raise RemoteExecutionError.new(parsed_body["error"])
|
52
|
+
end
|
45
53
|
return parsed_body["value"]
|
46
54
|
end
|
47
55
|
end
|
48
56
|
|
57
|
+
class ConnectionError < RuntimeError
|
58
|
+
def initialize(url, inner)
|
59
|
+
@url = url
|
60
|
+
@inner = inner
|
61
|
+
end
|
62
|
+
|
63
|
+
def message
|
64
|
+
"Failed to send command to #{@url} - " +
|
65
|
+
"have you started a lackie server?\n#{@inner.message}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
49
69
|
class RemoteExecutionError < RuntimeError
|
50
70
|
end
|
51
71
|
end
|
data/lib/lackie.rb
CHANGED
@@ -52,7 +52,7 @@ module Lackie
|
|
52
52
|
it "returns '' as the response body" do
|
53
53
|
post("/lackie/eval", "foo()")
|
54
54
|
get("/lackie/yield")
|
55
|
-
get("/lackie/yield").should == [
|
55
|
+
get("/lackie/yield").should == [404, {"Content-Type"=>"text/plain"}, ["Not Found"]]
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -42,5 +42,15 @@ module Lackie
|
|
42
42
|
RestClient.should_receive(:get).and_return(mock("response", :body => '{"error":"oops"}'))
|
43
43
|
lambda { @rc.log("oops") }.should raise_error("oops")
|
44
44
|
end
|
45
|
+
|
46
|
+
it "reports a useful error when sending a command fails" do
|
47
|
+
RestClient.should_receive(:post).with("http://host:555/lackie/eval", 'foo').and_raise "oops"
|
48
|
+
begin
|
49
|
+
@rc.exec("foo")
|
50
|
+
fail "never raised"
|
51
|
+
rescue => e
|
52
|
+
e.message.should =~ /have you started a lackie server?/
|
53
|
+
end
|
54
|
+
end
|
45
55
|
end
|
46
56
|
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:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
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:
|
18
|
+
date: 2011-01-02 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -115,6 +115,22 @@ dependencies:
|
|
115
115
|
version: 0.9.2.1
|
116
116
|
type: :development
|
117
117
|
version_requirements: *id006
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: selenium-webdriver
|
120
|
+
prerelease: false
|
121
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 31
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
- 1
|
130
|
+
- 2
|
131
|
+
version: 0.1.2
|
132
|
+
type: :development
|
133
|
+
version_requirements: *id007
|
118
134
|
description: Automates remote applications using an HTTP middleman
|
119
135
|
email: joshuachisholm@gmail.com
|
120
136
|
executables: []
|
@@ -182,7 +198,7 @@ rubyforge_project:
|
|
182
198
|
rubygems_version: 1.3.7
|
183
199
|
signing_key:
|
184
200
|
specification_version: 3
|
185
|
-
summary: lackie-0.1.
|
201
|
+
summary: lackie-0.1.1
|
186
202
|
test_files:
|
187
203
|
- features/remote_control.feature
|
188
204
|
- features/step_definitions/lackie_steps.rb
|