blinky 0.0.1 → 0.0.2
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/README.rdoc +23 -7
- data/VERSION +1 -1
- data/blinky.gemspec +31 -39
- data/lib/blinky.rb +21 -27
- data/lib/blinky/light.rb +23 -0
- data/lib/blinky/light_factory.rb +19 -0
- data/spec/acceptance_spec.rb +150 -0
- data/spec/blinky_spec.rb +23 -114
- data/spec/fixtures/device_recipes/fragile_engineering/wretched.rb +8 -0
- data/spec/light_factory_spec.rb +64 -0
- data/spec/light_spec.rb +52 -0
- metadata +13 -17
- data/.gitignore +0 -21
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= blinky
|
2
2
|
|
3
|
-
blinky helps you see the light - get a build light up and running in a few minutes.
|
3
|
+
blinky helps you see the light - plug and play set up for build lights - get a build light up and running in a few minutes.
|
4
4
|
|
5
5
|
== Why blinky?
|
6
6
|
|
@@ -19,10 +19,7 @@ Plug in your USB light, and then do something like this
|
|
19
19
|
require 'rubygems'
|
20
20
|
require 'blinky'
|
21
21
|
|
22
|
-
blinky = Blinky.new
|
23
|
-
|
24
|
-
You can also manipulate the light directly
|
25
|
-
|
22
|
+
blinky = Blinky.new
|
26
23
|
blinky.success!
|
27
24
|
blinky.failure!
|
28
25
|
blinky.building!
|
@@ -77,10 +74,29 @@ Plug in your light and then do this:
|
|
77
74
|
require 'blinky'
|
78
75
|
|
79
76
|
blinky = Blinky.new
|
80
|
-
blinky.watch_test_server
|
77
|
+
blinky.light.watch_test_server
|
81
78
|
|
82
79
|
Watch the pretty lights!
|
83
|
-
|
80
|
+
|
81
|
+
== What if I have more than one light?
|
82
|
+
|
83
|
+
Want to plug in more than one light on the same machine?
|
84
|
+
|
85
|
+
require 'rubygems'
|
86
|
+
require 'blinky'
|
87
|
+
|
88
|
+
blinky = Blinky.new
|
89
|
+
light_one = blinky.lights[0]
|
90
|
+
light_two = blinky.lights[1]
|
91
|
+
|
92
|
+
Not sure which light is which?
|
93
|
+
|
94
|
+
# make light_one flash
|
95
|
+
light_one.where_are_you?
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
84
100
|
== How do I contribute support for more lights
|
85
101
|
|
86
102
|
COMING SOON
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/blinky.gemspec
CHANGED
@@ -1,63 +1,55 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{blinky}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Perryn Fowler"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-15}
|
13
13
|
s.description = %q{plug and play support for USB build status indicators}
|
14
14
|
s.email = %q{perryn.fowler@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
|
17
|
+
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"blinky.gemspec",
|
26
|
+
"lib/blinky.rb",
|
27
|
+
"lib/blinky/light.rb",
|
28
|
+
"lib/blinky/light_factory.rb",
|
29
|
+
"lib/blinky/no_supported_devices_found.rb",
|
30
|
+
"lib/ci_server_plugins/test_server_plugin.rb",
|
31
|
+
"lib/device_recipes/delcom_engineering/visual_indicator_gen_one.rb",
|
32
|
+
"lib/device_recipes/delcom_engineering/visual_indicator_gen_two.rb",
|
33
|
+
"lib/plugins.rb",
|
34
|
+
"lib/recipes.rb",
|
35
|
+
"notes.txt",
|
36
|
+
"spec/acceptance_spec.rb",
|
37
|
+
"spec/blinky_spec.rb",
|
38
|
+
"spec/ci_server_plugins/test_server_plugin_spec.rb",
|
39
|
+
"spec/fixtures/ci_server_plugins/mock_ci_server.rb",
|
40
|
+
"spec/fixtures/device_recipes/aenima_engineering/model_462.rb",
|
41
|
+
"spec/fixtures/device_recipes/aenima_engineering/model_eulogy.rb",
|
42
|
+
"spec/fixtures/device_recipes/fragile_engineering/wretched.rb",
|
43
|
+
"spec/fixtures/plugins.rb",
|
44
|
+
"spec/fixtures/recipes.rb",
|
45
|
+
"spec/light_factory_spec.rb",
|
46
|
+
"spec/light_spec.rb",
|
47
|
+
"spec/spec_helper.rb"
|
44
48
|
]
|
45
49
|
s.homepage = %q{http://github.com/perryn/blinky}
|
46
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
47
50
|
s.require_paths = ["lib"]
|
48
51
|
s.rubygems_version = %q{1.3.7}
|
49
52
|
s.summary = %q{helps you see the light}
|
50
|
-
s.test_files = [
|
51
|
-
"spec/blinky_spec.rb",
|
52
|
-
"spec/ci_server_plugins/test_server_plugin_spec.rb",
|
53
|
-
"spec/fixtures/ci_server_plugins/mock_ci_server.rb",
|
54
|
-
"spec/fixtures/device_recipes/aenima_engineering/model_462.rb",
|
55
|
-
"spec/fixtures/device_recipes/aenima_engineering/model_eulogy.rb",
|
56
|
-
"spec/fixtures/device_recipes/fragile_engineering/wretched.rb",
|
57
|
-
"spec/fixtures/plugins.rb",
|
58
|
-
"spec/fixtures/recipes.rb",
|
59
|
-
"spec/spec_helper.rb"
|
60
|
-
]
|
61
53
|
|
62
54
|
if s.respond_to? :specification_version then
|
63
55
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
data/lib/blinky.rb
CHANGED
@@ -2,6 +2,8 @@ $:.unshift(File.dirname(__FILE__))
|
|
2
2
|
|
3
3
|
require 'usb'
|
4
4
|
require 'blinky/no_supported_devices_found'
|
5
|
+
require 'blinky/light'
|
6
|
+
require 'blinky/light_factory'
|
5
7
|
|
6
8
|
module Blinky
|
7
9
|
|
@@ -12,40 +14,32 @@ module Blinky
|
|
12
14
|
class Blinky
|
13
15
|
|
14
16
|
def initialize(path = File.dirname(__FILE__))
|
15
|
-
|
17
|
+
|
16
18
|
Dir["#{path}/device_recipes/**/*.rb"].each { |f| require(f) }
|
19
|
+
@recipes = Hash.new({})
|
20
|
+
instance_eval(File.read("#{path}/recipes.rb"))
|
21
|
+
|
17
22
|
Dir["#{path}/ci_server_plugins/**/*.rb"].each { |f| require(f) }
|
18
|
-
@recipes = Hash.new(:default => {})
|
19
23
|
@plugins = []
|
20
|
-
instance_eval(File.read("#{path}/recipes.rb"))
|
21
24
|
instance_eval(File.read("#{path}/plugins.rb"))
|
22
|
-
|
23
|
-
@plugins
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
matching_recipe = @recipes[device.idVendor][device.idProduct]
|
33
|
-
if matching_recipe
|
34
|
-
self.extend(matching_recipe)
|
35
|
-
@handle = device.usb_open
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
raise NoSupportedDevicesFound.new found_devices unless @handle
|
25
|
+
|
26
|
+
@lights = LightFactory.detect_lights(@plugins, @recipes)
|
27
|
+
end
|
28
|
+
|
29
|
+
def lights
|
30
|
+
@lights
|
31
|
+
end
|
32
|
+
|
33
|
+
def light
|
34
|
+
@lights.first
|
40
35
|
end
|
41
36
|
|
42
37
|
def recipe recipe_module, details
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
38
|
+
if @recipes[details[:usb_vendor_id]].empty?
|
39
|
+
@recipes[details[:usb_vendor_id]] = {details[:usb_product_id] => recipe_module}
|
40
|
+
else
|
41
|
+
@recipes[details[:usb_vendor_id]][details[:usb_product_id]] = recipe_module
|
42
|
+
end
|
49
43
|
end
|
50
44
|
|
51
45
|
def plugin plugin_module
|
data/lib/blinky/light.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Blinky
|
2
|
+
class Light
|
3
|
+
|
4
|
+
def initialize device_handle, recipe, plugins
|
5
|
+
@handle = device_handle
|
6
|
+
self.extend(recipe)
|
7
|
+
plugins.each do |plugin|
|
8
|
+
self.extend(plugin)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def where_are_you?
|
13
|
+
5.times do
|
14
|
+
failure!
|
15
|
+
sleep(0.5)
|
16
|
+
success!
|
17
|
+
sleep(0.5)
|
18
|
+
end
|
19
|
+
off!
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Blinky
|
2
|
+
class LightFactory
|
3
|
+
|
4
|
+
def self.detect_lights plugins, recipes
|
5
|
+
lights = []
|
6
|
+
found_devices = []
|
7
|
+
USB.devices.each do |device|
|
8
|
+
found_devices << device
|
9
|
+
matching_recipe = recipes[device.idVendor][device.idProduct]
|
10
|
+
if matching_recipe
|
11
|
+
lights << Light.new(device.usb_open, matching_recipe, plugins)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
raise NoSupportedDevicesFound.new found_devices if lights.empty?
|
15
|
+
lights
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/spec_helper')
|
2
|
+
|
3
|
+
module Blinky
|
4
|
+
describe "Blinky" do
|
5
|
+
|
6
|
+
describe "that has a supported device connected" do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@supported_device = OpenStruct.new(:idVendor => 0x2000, :idProduct => 0x2222)
|
10
|
+
self.connected_devices = [
|
11
|
+
OpenStruct.new(:idVendor => 0x1234, :idProduct => 0x5678),
|
12
|
+
@supported_device,
|
13
|
+
OpenStruct.new(:idVendor => 0x5678, :idProduct => 0x1234)
|
14
|
+
]
|
15
|
+
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "will provide a single light" do
|
19
|
+
@blinky.light.should_not be_nil
|
20
|
+
@blinky.lights.length.should == 1
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can provide a light that can control the device" do
|
24
|
+
@supported_device.should_receive(:indicate_success)
|
25
|
+
@blinky.light.success!
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can provide a light that can show where it is" do
|
29
|
+
@supported_device.should_receive(:indicate_failure).ordered
|
30
|
+
@supported_device.should_receive(:indicate_success).ordered
|
31
|
+
@supported_device.should_receive(:indicate_failure).ordered
|
32
|
+
@supported_device.should_receive(:indicate_success).ordered
|
33
|
+
@supported_device.should_receive(:indicate_failure).ordered
|
34
|
+
@supported_device.should_receive(:indicate_success).ordered
|
35
|
+
@supported_device.should_receive(:indicate_failure).ordered
|
36
|
+
@supported_device.should_receive(:indicate_success).ordered
|
37
|
+
@supported_device.should_receive(:indicate_failure).ordered
|
38
|
+
@supported_device.should_receive(:indicate_success).ordered
|
39
|
+
@supported_device.should_receive(:turn_off).ordered
|
40
|
+
|
41
|
+
@blinky.light.where_are_you?
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "that supports two devices from the same vendor" do
|
47
|
+
|
48
|
+
it "can provide a light that can control the first device" do
|
49
|
+
supported_device_one = OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x1111)
|
50
|
+
self.connected_devices = [supported_device_one]
|
51
|
+
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
52
|
+
supported_device_one.should_receive(:indicate_success)
|
53
|
+
@blinky.light.success!
|
54
|
+
end
|
55
|
+
|
56
|
+
it "can provide a light that can control the second device" do
|
57
|
+
supported_device_two = OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x2222)
|
58
|
+
self.connected_devices = [supported_device_two]
|
59
|
+
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
60
|
+
supported_device_two.should_receive(:indicate_success)
|
61
|
+
@blinky.light.success!
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "that has no supported devices connected" do
|
66
|
+
|
67
|
+
before(:each) do
|
68
|
+
@devices = [
|
69
|
+
OpenStruct.new(:idVendor => 0x1234, :idProduct => 0x5678),
|
70
|
+
OpenStruct.new(:idVendor => 0x5678, :idProduct => 0x1234)
|
71
|
+
]
|
72
|
+
self.connected_devices= @devices
|
73
|
+
end
|
74
|
+
|
75
|
+
it "will complain" do
|
76
|
+
exception = Exception.new("foo")
|
77
|
+
NoSupportedDevicesFound.should_receive(:new).with(@devices).and_return(exception)
|
78
|
+
lambda{Blinky.new("#{File.dirname(__FILE__)}/fixtures")}.should raise_error("foo")
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "that has no supported devices connected - but does have one from the same vendor" do
|
84
|
+
|
85
|
+
before(:each) do
|
86
|
+
@devices = [
|
87
|
+
OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x5678),
|
88
|
+
OpenStruct.new(:idVendor => 0x5678, :idProduct => 0x1234)
|
89
|
+
]
|
90
|
+
self.connected_devices= @devices
|
91
|
+
end
|
92
|
+
|
93
|
+
it "will complain" do
|
94
|
+
exception = Exception.new("foo")
|
95
|
+
NoSupportedDevicesFound.should_receive(:new).with(@devices).and_return(exception)
|
96
|
+
lambda{Blinky.new("#{File.dirname(__FILE__)}/fixtures")}.should raise_error("foo")
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "that has two supported devices connected" do
|
102
|
+
|
103
|
+
before(:each) do
|
104
|
+
@supported_device_one = OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x1111)
|
105
|
+
@supported_device_two = OpenStruct.new(:idVendor => 0x2000, :idProduct => 0x2222)
|
106
|
+
|
107
|
+
self.connected_devices = [
|
108
|
+
OpenStruct.new(:idVendor => 0x1234, :idProduct => 0x5678),
|
109
|
+
@supported_device_one,
|
110
|
+
@supported_device_two
|
111
|
+
]
|
112
|
+
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
113
|
+
end
|
114
|
+
|
115
|
+
it "will provide two lights" do
|
116
|
+
@blinky.light.should_not be_nil
|
117
|
+
@blinky.lights.length.should == 2
|
118
|
+
end
|
119
|
+
|
120
|
+
it "can provide lights that can control thedevices" do
|
121
|
+
@supported_device_one.should_receive(:indicate_success)
|
122
|
+
@supported_device_two.should_receive(:indicate_success)
|
123
|
+
@blinky.lights[0].success!
|
124
|
+
@blinky.lights[1].success!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "that provides a light that is asked to watch a supported CI server" do
|
129
|
+
|
130
|
+
before(:each) do
|
131
|
+
self.connected_devices = [OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x1111)]
|
132
|
+
@light = Blinky.new("#{File.dirname(__FILE__)}/fixtures").light
|
133
|
+
end
|
134
|
+
|
135
|
+
it "can receive call backs from the server" do
|
136
|
+
@light.should_receive(:notify_build_status)
|
137
|
+
@light.watch_mock_ci_server
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
def connected_devices= devices
|
143
|
+
devices.each do |device|
|
144
|
+
device.stub!(:usb_open).and_return(device)
|
145
|
+
end
|
146
|
+
USB.stub!(:devices).and_return(devices)
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
data/spec/blinky_spec.rb
CHANGED
@@ -1,123 +1,32 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '/spec_helper')
|
2
|
+
Dir["#{File.dirname(__FILE__)}/fixtures/device_recipes/**/*.rb"].each { |f| require(f) }
|
3
|
+
Dir["#{File.dirname(__FILE__)}/fixtures/ci_server_plugins/**/*.rb"].each { |f| require(f) }
|
2
4
|
|
3
5
|
module Blinky
|
4
6
|
describe "Blinky" do
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
]
|
15
|
-
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
16
|
-
end
|
17
|
-
|
18
|
-
it "can call recipe methods on the device" do
|
19
|
-
@supported_device.should_receive(:indicate_success)
|
20
|
-
@blinky.success!
|
21
|
-
end
|
22
|
-
|
8
|
+
it "will construct a light factory with the available plugins and recipes" do
|
9
|
+
expected_plugins = [MockCiServer]
|
10
|
+
expected_recipes = {
|
11
|
+
0x1000 => { 0x2222 => AenimaEngineering::ModelEulogy, 0x1111 => AenimaEngineering::Model462 },
|
12
|
+
0x2000 => { 0x2222 => FragileEngineering::ModelWretched }
|
13
|
+
}
|
14
|
+
LightFactory.should_receive(:detect_lights).with( expected_plugins, expected_recipes).and_return([])
|
15
|
+
Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
23
16
|
end
|
24
17
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
self.connected_devices = [supported_device_two]
|
38
|
-
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
39
|
-
supported_device_two.should_receive(:indicate_success)
|
40
|
-
@blinky.success!
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe "that has no supported devices connected" do
|
45
|
-
|
46
|
-
before(:each) do
|
47
|
-
@devices = [
|
48
|
-
OpenStruct.new(:idVendor => 0x1234, :idProduct => 0x5678),
|
49
|
-
OpenStruct.new(:idVendor => 0x5678, :idProduct => 0x1234)
|
50
|
-
]
|
51
|
-
self.connected_devices= @devices
|
52
|
-
end
|
53
|
-
|
54
|
-
it "will complain" do
|
55
|
-
exception = Exception.new("foo")
|
56
|
-
NoSupportedDevicesFound.should_receive(:new).with(@devices).and_return(exception)
|
57
|
-
lambda{Blinky.new("#{File.dirname(__FILE__)}/fixtures")}.should raise_error("foo")
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
describe "that has no supported devices connected - but does have one from the same vendor" do
|
63
|
-
|
64
|
-
before(:each) do
|
65
|
-
@devices = [
|
66
|
-
OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x5678),
|
67
|
-
OpenStruct.new(:idVendor => 0x5678, :idProduct => 0x1234)
|
68
|
-
]
|
69
|
-
self.connected_devices= @devices
|
70
|
-
end
|
71
|
-
|
72
|
-
it "will complain" do
|
73
|
-
exception = Exception.new("foo")
|
74
|
-
NoSupportedDevicesFound.should_receive(:new).with(@devices).and_return(exception)
|
75
|
-
lambda{Blinky.new("#{File.dirname(__FILE__)}/fixtures")}.should raise_error("foo")
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
describe "that has two supported devices connected" do
|
81
|
-
|
82
|
-
before(:each) do
|
83
|
-
@supported_device_one = OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x1111)
|
84
|
-
@supported_device_two = OpenStruct.new(:idVendor => 0x2000, :idProduct => 0x2222)
|
85
|
-
|
86
|
-
self.connected_devices = [
|
87
|
-
OpenStruct.new(:idVendor => 0x1234, :idProduct => 0x5678),
|
88
|
-
@supported_device_one,
|
89
|
-
@supported_device_two
|
90
|
-
]
|
91
|
-
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
92
|
-
end
|
93
|
-
|
94
|
-
it "will choose the second device" do
|
95
|
-
@supported_device_one.should_not_receive(:indicate_success)
|
96
|
-
@supported_device_two.should_receive(:indicate_success)
|
97
|
-
@blinky.success!
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "that is asked to watch a supported CI server" do
|
102
|
-
|
103
|
-
before(:each) do
|
104
|
-
self.connected_devices = [OpenStruct.new(:idVendor => 0x1000, :idProduct => 0x1111)]
|
105
|
-
@blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
106
|
-
end
|
107
|
-
|
108
|
-
it "can receive call backs from the server" do
|
109
|
-
@blinky.should_receive(:notify_build_status)
|
110
|
-
@blinky.watch_mock_ci_server
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
def connected_devices= devices
|
116
|
-
devices.each do |device|
|
117
|
-
device.stub!(:usb_open).and_return(device)
|
118
|
-
end
|
119
|
-
USB.stub!(:devices).and_return(devices)
|
18
|
+
it "will make lights from the light factory available" do
|
19
|
+
expected_plugins = [MockCiServer]
|
20
|
+
expected_recipes = {
|
21
|
+
0x1000 => { 0x2222 => AenimaEngineering::ModelEulogy, 0x1111 => AenimaEngineering::Model462 },
|
22
|
+
0x2000 => { 0x2222 => FragileEngineering::ModelWretched }
|
23
|
+
}
|
24
|
+
lights = ["light one", "light two"]
|
25
|
+
LightFactory.should_receive(:detect_lights).and_return(lights)
|
26
|
+
blinky = Blinky.new("#{File.dirname(__FILE__)}/fixtures")
|
27
|
+
|
28
|
+
blinky.lights.should eql lights
|
29
|
+
blinky.light.should == "light one"
|
120
30
|
end
|
121
|
-
|
122
|
-
end
|
31
|
+
end
|
123
32
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/spec_helper')
|
2
|
+
|
3
|
+
module Blinky
|
4
|
+
|
5
|
+
module RecipeOne
|
6
|
+
end
|
7
|
+
|
8
|
+
module RecipeTwo
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "LightFactory" do
|
12
|
+
|
13
|
+
before do
|
14
|
+
|
15
|
+
@device_one = OpenStruct.new(:idVendor => 0x1234, :idProduct => 0x5678)
|
16
|
+
@device_two = OpenStruct.new(:idVendor => 0x5678, :idProduct => 0x1234)
|
17
|
+
@connected_devices = [@device_one, @device_two]
|
18
|
+
self.connected_devices = @connected_devices
|
19
|
+
|
20
|
+
@plugins = [MockCiPlugin]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "will build a light for each connected device for which we have a recipe" do
|
24
|
+
recipes = Hash.new({})
|
25
|
+
recipes[0x1234] = {0x5678 => RecipeOne}
|
26
|
+
recipes[0x5678] = {0x1234 => RecipeTwo}
|
27
|
+
|
28
|
+
Light.should_receive(:new).with(@device_one, RecipeOne , @plugins).and_return("light one")
|
29
|
+
Light.should_receive(:new).with(@device_two, RecipeTwo , @plugins).and_return("light two")
|
30
|
+
|
31
|
+
lights = LightFactory.detect_lights(@plugins, recipes)
|
32
|
+
lights.should include "light one"
|
33
|
+
lights.should include "light two"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "will not build a light for a connected device for which we have no recipe" do
|
37
|
+
recipes = Hash.new({})
|
38
|
+
recipes[0x1234] = {0x5678 => RecipeOne}
|
39
|
+
|
40
|
+
Light.stub!(:new).and_return("no recipe light")
|
41
|
+
Light.should_receive(:new).with(@device_one, RecipeOne , @plugins).and_return("light one")
|
42
|
+
|
43
|
+
lights = LightFactory.detect_lights(@plugins, recipes)
|
44
|
+
lights.should eql ["light one"]
|
45
|
+
end
|
46
|
+
|
47
|
+
it "will complain if there are no connected lights for which we have a recipe" do
|
48
|
+
recipes = Hash.new({})
|
49
|
+
recipes[0x9999] = {0x9999 => RecipeOne}
|
50
|
+
|
51
|
+
exception = Exception.new("foo")
|
52
|
+
NoSupportedDevicesFound.should_receive(:new).with(@connected_devices).and_return(exception)
|
53
|
+
lambda{LightFactory.detect_lights(@plugins, recipes)}.should raise_error("foo")
|
54
|
+
end
|
55
|
+
|
56
|
+
def connected_devices= devices
|
57
|
+
devices.each do |device|
|
58
|
+
device.stub!(:usb_open).and_return(device)
|
59
|
+
end
|
60
|
+
USB.stub!(:devices).and_return(devices)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
data/spec/light_spec.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/spec_helper')
|
2
|
+
|
3
|
+
module Blinky
|
4
|
+
|
5
|
+
module TestEngineering
|
6
|
+
module TestModel
|
7
|
+
def success!
|
8
|
+
@handle.indicate_success
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module MockCiPlugin
|
14
|
+
def watch_mock_ci_server
|
15
|
+
notify_build_status
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module AnotherMockCiPlugin
|
20
|
+
def watch_another_mock_ci_server
|
21
|
+
notify_a_different_build_status
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
describe "Light" do
|
27
|
+
|
28
|
+
describe "that has been constructed with a device, a device recipe, and some CI plugins" do
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
@supported_device = OpenStruct.new(:idVendor => 0x2000, :idProduct => 0x2222)
|
32
|
+
@light = Light.new(@supported_device, TestEngineering::TestModel, [MockCiPlugin, AnotherMockCiPlugin ] )
|
33
|
+
end
|
34
|
+
|
35
|
+
it "can call recipe methods on the device" do
|
36
|
+
@supported_device.should_receive(:indicate_success)
|
37
|
+
@light.success!
|
38
|
+
end
|
39
|
+
|
40
|
+
it "can receive call back methods defined in a plugins" do
|
41
|
+
@light.should_receive(:notify_build_status)
|
42
|
+
@light.watch_mock_ci_server
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can receive call backs from a server via another plugin" do
|
46
|
+
@light.should_receive(:notify_a_different_build_status)
|
47
|
+
@light.watch_another_mock_ci_server
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blinky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Perryn Fowler
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-15 00:00:00 +10:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -59,13 +59,14 @@ extra_rdoc_files:
|
|
59
59
|
- README.rdoc
|
60
60
|
files:
|
61
61
|
- .document
|
62
|
-
- .gitignore
|
63
62
|
- LICENSE
|
64
63
|
- README.rdoc
|
65
64
|
- Rakefile
|
66
65
|
- VERSION
|
67
66
|
- blinky.gemspec
|
68
67
|
- lib/blinky.rb
|
68
|
+
- lib/blinky/light.rb
|
69
|
+
- lib/blinky/light_factory.rb
|
69
70
|
- lib/blinky/no_supported_devices_found.rb
|
70
71
|
- lib/ci_server_plugins/test_server_plugin.rb
|
71
72
|
- lib/device_recipes/delcom_engineering/visual_indicator_gen_one.rb
|
@@ -73,6 +74,7 @@ files:
|
|
73
74
|
- lib/plugins.rb
|
74
75
|
- lib/recipes.rb
|
75
76
|
- notes.txt
|
77
|
+
- spec/acceptance_spec.rb
|
76
78
|
- spec/blinky_spec.rb
|
77
79
|
- spec/ci_server_plugins/test_server_plugin_spec.rb
|
78
80
|
- spec/fixtures/ci_server_plugins/mock_ci_server.rb
|
@@ -81,14 +83,16 @@ files:
|
|
81
83
|
- spec/fixtures/device_recipes/fragile_engineering/wretched.rb
|
82
84
|
- spec/fixtures/plugins.rb
|
83
85
|
- spec/fixtures/recipes.rb
|
86
|
+
- spec/light_factory_spec.rb
|
87
|
+
- spec/light_spec.rb
|
84
88
|
- spec/spec_helper.rb
|
85
89
|
has_rdoc: true
|
86
90
|
homepage: http://github.com/perryn/blinky
|
87
91
|
licenses: []
|
88
92
|
|
89
93
|
post_install_message:
|
90
|
-
rdoc_options:
|
91
|
-
|
94
|
+
rdoc_options: []
|
95
|
+
|
92
96
|
require_paths:
|
93
97
|
- lib
|
94
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -116,13 +120,5 @@ rubygems_version: 1.3.7
|
|
116
120
|
signing_key:
|
117
121
|
specification_version: 3
|
118
122
|
summary: helps you see the light
|
119
|
-
test_files:
|
120
|
-
|
121
|
-
- spec/ci_server_plugins/test_server_plugin_spec.rb
|
122
|
-
- spec/fixtures/ci_server_plugins/mock_ci_server.rb
|
123
|
-
- spec/fixtures/device_recipes/aenima_engineering/model_462.rb
|
124
|
-
- spec/fixtures/device_recipes/aenima_engineering/model_eulogy.rb
|
125
|
-
- spec/fixtures/device_recipes/fragile_engineering/wretched.rb
|
126
|
-
- spec/fixtures/plugins.rb
|
127
|
-
- spec/fixtures/recipes.rb
|
128
|
-
- spec/spec_helper.rb
|
123
|
+
test_files: []
|
124
|
+
|