lifx 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 328ec4e4baf7ab42dc06ee0b0c7b7ae751eb58cb
4
- data.tar.gz: adbb24f3dbf7e2c3bfd02d28d19d1f7272c1ae68
3
+ metadata.gz: f5454b2eb54cd767b3967cf5a6846ec306522599
4
+ data.tar.gz: 43f84ba663f3beece220825ca095d59417f6ab78
5
5
  SHA512:
6
- metadata.gz: 1db446d2f25add2a0d822c727f3ed0ef9a4c273b937bf09e8b3018728396535892e0ac4b756740b44db1b8de2e2592b41846e875f500323069e05878483961ce
7
- data.tar.gz: 377409d24f13ff4600d7505b11e58ba6afde843c7df135b3c3bebe3d95a8d8b17606f7fe41dc4a80fd6a90d71cbec318574a4a450a7fabde896da3cf712fecf2
6
+ metadata.gz: 918213bcae91fd85b24f90b5db998b46e9064dbcecf8ac6929bfcd9a697c5511c8ca0efac5e87570274db43491a0b499584fa45fdf15e8b712b0b5a2272622ef
7
+ data.tar.gz: a198a724a716d6444cdca5ba117d633ddc94c030dff4b3d31f49166740ec5009e6dda07dcda9760dcd5a5083426c48fee60515daaf582d90e9b6188aee112e71
data/CHANGES.md ADDED
@@ -0,0 +1,7 @@
1
+ # 0.4.4
2
+
3
+ - Fix SO_REUSEPORT issue on older Linux kernels.
4
+
5
+ # 0.4.3
6
+
7
+ - Initial public release
data/README.md CHANGED
@@ -13,6 +13,7 @@ This gem is in an early beta state. Expect breaking API changes.
13
13
 
14
14
  * Ruby 2.1.1
15
15
  * Bundler
16
+ * Tested on OS X Mavericks, but should work other *nix platforms. Please file an issue if you have any problems.
16
17
 
17
18
  ## Installation
18
19
 
@@ -33,7 +33,7 @@ module LIFX
33
33
  @listener = Thread.new do
34
34
  reader = UDPSocket.new
35
35
  reader.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
36
- reader.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
36
+ reader.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true) if Socket.const_defined?('SO_REUSEPORT')
37
37
  reader.bind(ip, port)
38
38
  loop do
39
39
  begin
data/lib/lifx/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module LIFX
2
- VERSION = "0.4.3"
2
+ VERSION = "0.4.4"
3
3
  end
data/spec/color_spec.rb CHANGED
@@ -3,42 +3,23 @@ require 'spec_helper'
3
3
  module LIFX
4
4
  describe Color do
5
5
  let(:default_kelvin) { 3500 }
6
+
6
7
  describe '.rgb' do
7
8
  context 'translating from RGB' do
8
- it 'translates red correctly' do
9
- c = Color.rgb(255, 0, 0)
10
- c.to_a.should == [0, 1, 1, default_kelvin]
11
- end
12
-
13
- it 'translates yellow correctly' do
14
- c = Color.rgb(255, 255, 0)
15
- c.to_a.should == [60, 1, 1, default_kelvin]
16
- end
17
-
18
- it 'translates green correctly' do
19
- c = Color.rgb(0, 255, 0)
20
- c.to_a.should == [120, 1, 1, default_kelvin]
21
- end
22
-
23
- it 'translates cyan correctly' do
24
- c = Color.rgb(0, 255, 255)
25
- c.to_a.should == [180, 1, 1, default_kelvin]
26
- end
27
-
28
- it 'translates blue correctly' do
29
- c = Color.rgb(0, 0, 255)
30
- c.to_a.should == [240, 1, 1, default_kelvin]
9
+ shared_examples 'translating color' do |name, rgb, expected|
10
+ it "translates #{name} correctly" do
11
+ translation = Color.rgb(*rgb).to_a
12
+ expect(translation).to eq [*expected, default_kelvin]
13
+ end
31
14
  end
32
15
 
33
- it 'translates white correctly' do
34
- c = Color.rgb(255, 255, 255)
35
- c.to_a.should == [0, 0, 1, default_kelvin]
36
- end
37
-
38
- it 'translates black correctly' do
39
- c = Color.rgb(0, 0, 0)
40
- c.to_a.should == [0, 0, 0, default_kelvin]
41
- end
16
+ it_behaves_like 'translating color', 'red', [255, 0, 0], [0, 1, 1]
17
+ it_behaves_like 'translating color', 'yellow', [255, 255, 0], [60, 1, 1]
18
+ it_behaves_like 'translating color', 'green', [0, 255, 0], [120, 1, 1]
19
+ it_behaves_like 'translating color', 'cyan', [0, 255, 255], [180, 1, 1]
20
+ it_behaves_like 'translating color', 'blue', [0, 0, 255], [240, 1, 1]
21
+ it_behaves_like 'translating color', 'white', [255, 255, 255], [0, 0, 1]
22
+ it_behaves_like 'translating color', 'black', [0, 0, 0], [0, 0, 0]
42
23
  end
43
24
  end
44
25
  end
@@ -2,30 +2,26 @@ require 'spec_helper'
2
2
 
3
3
  module LIFX
4
4
  describe GatewayConnection do
5
- subject do
6
- GatewayConnection.new
7
- end
5
+ subject(:gateway) { GatewayConnection.new }
8
6
 
9
- let(:message) { double(Message).tap { |m| m.stub(:is_a?).and_return(true); m.stub(:pack) } }
7
+ let(:message) { double(Message, is_a?: true, pack: '') }
10
8
  let(:ip) { '127.0.0.1' }
11
- let(:port) { 35003 }
9
+ let(:port) { 35_003 }
12
10
 
13
- after do
14
- subject.close
15
- end
11
+ after { gateway.close }
16
12
 
17
13
  context 'write queue resiliency' do
18
14
  it 'does not send if there is no available connection' do
19
- expect(subject).to_not receive(:actually_write)
20
- subject.write(message)
21
- expect { subject.flush(timeout: 0.5) }.to raise_error(Timeout::Error)
15
+ expect(gateway).to_not receive(:actually_write)
16
+ gateway.write(message)
17
+ expect { gateway.flush(timeout: 0.5) }.to raise_error(Timeout::Error)
22
18
  end
23
-
19
+
24
20
  it 'pushes message back into queue if unable to write' do
25
- subject.connect_udp(ip, port)
26
- expect(subject).to receive(:actually_write).and_return(false, true)
27
- subject.write(message)
28
- subject.flush
21
+ gateway.connect_udp(ip, port)
22
+ expect(gateway).to receive(:actually_write).and_return(false, true)
23
+ gateway.write(message)
24
+ gateway.flush
29
25
  end
30
26
  end
31
27
  end
@@ -3,35 +3,35 @@ require 'spec_helper'
3
3
  module LIFX
4
4
  describe Client, integration: true do
5
5
  describe '#sync' do
6
+ let(:minimum_lights) { 3 }
7
+ let(:udp) { Transport::UDP.new('0.0.0.0', 56_750) }
8
+ let(:white) { Color.white(brightness: 0.5) }
9
+
6
10
  it 'schedules sending all messages to be executed at the same time' do
7
- if lights.count < 3
8
- pending "This test requires 3 or more lights tagged under Test"
11
+ if lights.count < minimum_lights
12
+ pending 'This test requires 3 or more lights tagged under Test'
9
13
  return
10
14
  end
11
15
 
12
- lifx.discover! do
13
- lights.count >= 3
14
- end
16
+ lifx.discover! { lights.count >= minimum_lights }
15
17
 
16
- white = LIFX::Color.white(brightness: 0.5)
17
18
  lights.set_color(white, duration: 0)
18
19
  sleep 1
19
20
 
20
- udp = Transport::UDP.new('0.0.0.0', 56750)
21
21
  msgs = []
22
22
  udp.add_observer(self) do |message:, ip:, transport:|
23
23
  msgs << message if message.payload.is_a?(Protocol::Light::SetWaveform)
24
24
  end
25
25
  udp.listen
26
26
 
27
- delay = lifx.sync do
27
+ lifx.sync do
28
28
  lights.each do |light|
29
29
  light.pulse(LIFX::Color.hsb(rand(360), 1, 1), period: 1)
30
30
  end
31
31
  end
32
32
 
33
- msgs.count.should == lights.count
34
- msgs.map(&:at_time).uniq.count.should == 1
33
+ expect(msgs.count).to eq lights.count
34
+ expect(msgs.map(&:at_time).uniq.count).to eq 1
35
35
 
36
36
  flush
37
37
  end
@@ -3,41 +3,41 @@ require 'spec_helper'
3
3
  module LIFX
4
4
  describe Light, integration: true do
5
5
  describe '#set_power' do
6
- it "sets the power of the light asynchronously" do
6
+ it 'sets the power of the light asynchronously' do
7
7
  light.set_power(0)
8
- wait { light.off?.should == true }
8
+ wait { expect(light).to be_off }
9
9
  light.set_power(1)
10
- wait { light.on?.should == true }
10
+ wait { expect(light).to be_on }
11
11
  end
12
12
  end
13
13
 
14
14
  describe '#set_power!' do
15
- it "sets the power of the light synchronously" do
15
+ it 'sets the power of the light synchronously' do
16
16
  light.set_power!(0)
17
- light.off?.should == true
17
+ expect(light).to be_off
18
18
  light.set_power!(1)
19
- light.on?.should == true
19
+ expect(light).to be_on
20
20
  end
21
21
  end
22
22
 
23
23
  describe '#set_color' do
24
- it "sets the color of the light asynchronously" do
25
- color = Color.hsb(rand(360), rand, rand)
24
+ let(:color) { Color.hsb(rand(360), rand, rand) }
25
+
26
+ it 'sets the color of the light asynchronously' do
26
27
  light.set_color(color, duration: 0)
27
28
  sleep 1
28
29
  light.refresh
29
- wait { light.color.should == color }
30
+ wait { expect(light.color).to eq color }
30
31
  end
31
32
  end
32
33
 
33
34
  describe '#set_label' do
34
- it "sets the label of the light synchronously" do
35
- label = light.label.sub(/\d+|$/, rand(100).to_s)
35
+ let(:label) { light.label.sub(/\d+|$/, rand(100).to_s) }
36
+
37
+ it 'sets the label of the light synchronously' do
36
38
  light.set_label(label)
37
- light.label.should == label
39
+ expect(light.label).to eq label
38
40
  end
39
41
  end
40
-
41
-
42
42
  end
43
43
  end
@@ -1,31 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module LIFX
4
- describe "tags", integration: true do
5
- it 'Clearing, setting and using tags' do
4
+ describe 'tags', integration: true do
5
+ let(:color) { Color.hsb(rand(360), 0.3, 0.3) }
6
+
7
+ specify 'Clearing, setting and using tags' do
6
8
  light.add_tag('Foo')
7
- light.tags.should include('Foo')
9
+ expect(light.tags).to include('Foo')
8
10
 
9
11
  test_tag = lights.with_tag('Foo')
10
12
  test_tag.turn_on
11
- color = Color.hsb(rand(360), 0.3, 0.3)
12
- test_tag.set_color(color, duration: 0)
13
+ test_tag.set_color(color, duration: 0)
13
14
  flush
14
15
  sleep 1 # Set messages are scheduled 250ms if no at_time is set
15
- # It also returns the current light state rather than the final state
16
+ # It also returns the current light state rather than the
17
+ # final state
16
18
  light.refresh
17
- wait { light.color.should == color }
19
+ wait { expect(light.color).to eq color }
18
20
 
19
21
  light.remove_tag('Foo')
20
- wait { light.tags.should_not include('Foo') }
22
+ wait { expect(light.tags).not_to include('Foo') }
21
23
  end
22
24
 
23
25
  it 'deletes tags when no longer assigned to a light' do
24
26
  light.add_tag('TempTag')
25
27
  light.remove_tag('TempTag')
26
- lifx.unused_tags.should include('TempTag')
28
+ expect(lifx.unused_tags).to include('TempTag')
27
29
  lifx.purge_unused_tags!
28
- lifx.unused_tags.should be_empty
30
+ expect(lifx.unused_tags).to be_empty
29
31
  end
30
32
  end
31
33
  end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ module LIFX
4
+ describe LightCollection do
5
+ subject(:collection) { LightCollection.new(context: double) }
6
+
7
+ describe '#with_id' do
8
+ it 'returns a Light with matching id' do
9
+ light = double(Light, id: 'id')
10
+ collection.stub(lights: [light])
11
+ expect(collection.with_id('id')).to eq light
12
+ end
13
+
14
+ it 'returns nil when none matches' do
15
+ light = double(Light, id: 'id')
16
+ collection.stub(lights: [light])
17
+ ret = collection.with_id('wrong id')
18
+ expect(ret).to eq nil
19
+ end
20
+ end
21
+
22
+ describe '#with_label' do
23
+ it 'returns a Light with matching label' do
24
+ light = double(Light, label: 'label')
25
+ collection.stub(lights: [light])
26
+ expect(collection.with_label('label')).to eq light
27
+ end
28
+
29
+ it 'returns nil' do
30
+ light = double(Light, label: 'label')
31
+ collection.stub(lights: [light])
32
+ ret = collection.with_label('wrong label')
33
+ expect(ret).to eq nil
34
+ end
35
+ end
36
+ end
37
+ end
data/spec/message_spec.rb CHANGED
@@ -2,53 +2,58 @@ require 'spec_helper'
2
2
 
3
3
  describe LIFX::Message do
4
4
  context 'unpacking' do
5
- let(:data) { "\x39\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x6c\x69\x66\x78\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\xac\x0d\xc8\x00\x00\x00\x00\x00\x80\x3f\x00\x00\x00".b }
5
+ let(:data) do
6
+ "\x39\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31" \
7
+ "\x6c\x69\x66\x78\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00" \
8
+ "\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\xac\x0d\xc8\x00\x00\x00\x00" \
9
+ "\x00\x80\x3f\x00\x00\x00".b
10
+ end
6
11
  let(:msg) { LIFX::Message.unpack(data) }
7
12
 
8
13
  it 'unpacks without errors' do
9
- msg.should_not be_nil
14
+ expect(msg).not_to be_nil
10
15
  end
11
16
 
12
17
  it 'returns the correct frame data' do
13
- msg.msg_size.should == 57
14
- msg.protocol.should == 1024
15
- msg.addressable?.should == true
18
+ expect(msg.msg_size).to eq 57
19
+ expect(msg.protocol).to eq 1024
20
+ expect(msg).to be_addressable
16
21
  end
17
22
 
18
23
  it 'returns the correct address data' do
19
- msg.raw_site.should == '1lifx1'
20
- msg.raw_target.should == "\x00" * 8
24
+ expect(msg.raw_site).to eq '1lifx1'
25
+ expect(msg.raw_target).to eq "\x00" * 8
21
26
  end
22
27
 
23
28
  it 'has correct ProtocolPath data' do
24
- msg.path.should be_instance_of(LIFX::ProtocolPath)
25
- msg.path.site_id.should == '316c69667831'
26
- msg.path.tag_ids.should == []
27
- msg.path.device_id.should == nil
29
+ expect(msg.path).to be_a(LIFX::ProtocolPath)
30
+ expect(msg.path.site_id).to eq '316c69667831'
31
+ expect(msg.path.tag_ids).to eq []
32
+ expect(msg.path.device_id).to be_nil
28
33
  end
29
34
 
30
35
  it 'returns the correct metadata' do
31
- msg.at_time.should == 0
32
- msg.type.should == 103
36
+ expect(msg.at_time).to eq 0
37
+ expect(msg.type).to eq 103
33
38
  end
34
39
 
35
40
  let(:payload) { msg.payload }
36
41
  it 'returns the payload' do
37
- payload.class.should == LIFX::Protocol::Light::SetWaveform
38
- payload.stream.should == 0
39
- payload.transient.should be_true
40
- payload.color.hue.should == 0
41
- payload.color.saturation.should == 65535
42
- payload.color.brightness.should == 65535
43
- payload.color.kelvin.should == 3500
44
- payload.period.should == 200
45
- payload.cycles.should == 1.0
46
- payload.duty_cycle.should == 0
47
- payload.waveform.should == 0
42
+ expect(payload.class).to eq LIFX::Protocol::Light::SetWaveform
43
+ expect(payload.stream).to eq 0
44
+ expect(payload.transient).to be_true
45
+ expect(payload.color.hue).to eq 0
46
+ expect(payload.color.saturation).to eq 65_535
47
+ expect(payload.color.brightness).to eq 65_535
48
+ expect(payload.color.kelvin).to eq 3_500
49
+ expect(payload.period).to eq 200
50
+ expect(payload.cycles).to eq 1.0
51
+ expect(payload.duty_cycle).to eq 0
52
+ expect(payload.waveform).to eq 0
48
53
  end
49
54
 
50
55
  it 'repacks to the same data' do
51
- msg.pack.should == data
56
+ expect(msg.pack).to eq data
52
57
  end
53
58
  end
54
59
 
@@ -72,42 +77,50 @@ describe LIFX::Message do
72
77
  context 'passed in via hash' do
73
78
  let(:msg) do
74
79
  LIFX::Message.new({
75
- path: LIFX::ProtocolPath.new(tagged: false, raw_target: "abcdefgh"),
80
+ path: LIFX::ProtocolPath.new(tagged: false, raw_target: 'abcdefgh'),
76
81
  at_time: 9001,
77
82
  payload: LIFX::Protocol::Wifi::SetAccessPoint.new(
78
83
  interface: 1,
79
- ssid: "who let the dogs out",
80
- pass: "woof, woof, woof woof!",
84
+ ssid: 'who let the dogs out',
85
+ pass: 'woof, woof, woof woof!',
81
86
  security: 1
82
87
  )
83
88
  })
84
89
  end
90
+ # let(:unpacked) { LIFX::Message.unpack(msg.pack) }
85
91
 
86
92
  it 'sets the size' do
87
- msg.msg_size.should == 134
93
+ expect(msg.msg_size).to eq 134
88
94
  end
89
95
 
90
96
  it 'packs correctly' do
91
- msg.pack.should == "\x86\x00\x00\x14\x00\x00\x00\x00abcdefgh\x00\x00\x00\x00\x00\x00\x00\x00)#\x00\x00\x00\x00\x00\x001\x01\x00\x00\x01who let the dogs out\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00woof, woof, woof woof!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01".b
92
- unpacked = LIFX::Message.unpack(msg.pack)
93
- msg.protocol.should == 1024
94
- msg.path.tagged?.should == false
95
- msg.addressable?.should == true
96
- msg.path.raw_target.should == 'abcdefgh'
97
- msg.at_time.should == 9001
98
- msg.type.should == 305
99
- msg.payload.class.should == LIFX::Protocol::Wifi::SetAccessPoint
100
- msg.payload.interface.should == 1
101
- msg.payload.ssid.should == "who let the dogs out"
102
- msg.payload.pass.should == "woof, woof, woof woof!"
103
- msg.payload.security.should == 1
97
+ expect(msg.pack).to eq "\x86\x00\x00\x14\x00\x00\x00\x00abcdefgh\x00" \
98
+ "\x00\x00\x00\x00\x00\x00\x00)#\x00\x00\x00" \
99
+ "\x00\x00\x001\x01\x00\x00\x01who let the " \
100
+ "dogs out\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
101
+ "\x00\x00\x00woof, woof, woof woof!\x00\x00" \
102
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
103
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
104
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
105
+ "\x00\x00\x00\x00\x00\x00\x00\x01".b
106
+ expect(msg.protocol).to eq 1024
107
+ expect(msg.path).not_to be_tagged
108
+ expect(msg).to be_addressable
109
+ expect(msg.path.raw_target).to eq 'abcdefgh'
110
+ expect(msg.at_time).to eq 9001
111
+ expect(msg.type).to eq 305
112
+ expect(msg.payload.class).to eq LIFX::Protocol::Wifi::SetAccessPoint
113
+ expect(msg.payload.interface).to eq 1
114
+ expect(msg.payload.ssid).to eq 'who let the dogs out'
115
+ expect(msg.payload.pass).to eq 'woof, woof, woof woof!'
116
+ expect(msg.payload.security).to eq 1
104
117
  end
105
118
  end
106
119
 
107
120
  context 'packing with tags' do
108
121
  let(:msg) do
109
122
  LIFX::Message.new({
110
- path: LIFX::ProtocolPath.new(tag_ids: [0,1]),
123
+ path: LIFX::ProtocolPath.new(tag_ids: [0, 1]),
111
124
  at_time: 9001,
112
125
  payload: LIFX::Protocol::Device::GetTime.new
113
126
  })
@@ -116,19 +129,22 @@ describe LIFX::Message do
116
129
  let(:unpacked) { LIFX::Message.unpack(msg.pack) }
117
130
 
118
131
  it 'packs the tag correctly' do
119
- msg.pack.should == "$\x00\x004\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)#\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00".b
132
+ expect(msg.pack).to eq "$\x00\x004\x00\x00\x00\x00\x03\x00\x00\x00" \
133
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
134
+ "\x00)#\x00\x00\x00\x00\x00\x00\x04\x00\x00" \
135
+ "\x00".b
120
136
  end
121
137
 
122
138
  it 'sets tagged' do
123
- unpacked.path.tagged?.should == true
139
+ expect(unpacked.path).to be_tagged
124
140
  end
125
141
 
126
142
  it 'sets tags' do
127
- unpacked.path.tag_ids.should == [0, 1]
143
+ expect(unpacked.path.tag_ids).to eq [0, 1]
128
144
  end
129
145
 
130
146
  it 'device should be nil' do
131
- unpacked.path.device_id.should == nil
147
+ expect(unpacked.path.device_id).to be_nil
132
148
  end
133
149
  end
134
150
 
@@ -144,19 +160,21 @@ describe LIFX::Message do
144
160
  let(:unpacked) { LIFX::Message.unpack(msg.pack) }
145
161
 
146
162
  it 'packs the tag correctly' do
147
- msg.pack.should == "$\x00\x00\x14\x00\x00\x00\x00\x01#Eg\x89\xAB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)#\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00".b
163
+ expect(msg.pack).to eq "$\x00\x00\x14\x00\x00\x00\x00\x01#Eg\x89\xAB" \
164
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)#" \
165
+ "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00".b
148
166
  end
149
167
 
150
168
  it 'sets tagged to false' do
151
- unpacked.path.tagged?.should == false
169
+ expect(unpacked.path).not_to be_tagged
152
170
  end
153
171
 
154
172
  it 'sets device' do
155
- unpacked.path.device_id.should == '0123456789ab'
173
+ expect(unpacked.path.device_id).to eq '0123456789ab'
156
174
  end
157
175
 
158
176
  it 'tags should be nil' do
159
- unpacked.path.tag_ids.should == nil
177
+ expect(unpacked.path.tag_ids).to be_nil
160
178
  end
161
179
  end
162
180
  end
@@ -3,47 +3,49 @@ require 'spec_helper'
3
3
  module LIFX
4
4
  describe ProtocolPath do
5
5
  describe 'initializing from raw data' do
6
+ subject do
7
+ ProtocolPath.new(raw_site: '1lifx1', raw_target: target, tagged: tagged)
8
+ end
9
+
6
10
  context 'device target' do
7
- subject do
8
- ProtocolPath.new(raw_site: "1lifx1", raw_target: "\xAB\xCD\xEF\x12\x34\x56\x00\x00", tagged: false)
9
- end
11
+ let(:target) { "\xAB\xCD\xEF\x12\x34\x56\x00\x00" }
12
+ let(:tagged) { false }
10
13
 
11
14
  it 'returns site_id in hex' do
12
- subject.site_id.should == "316c69667831"
15
+ expect(subject.site_id).to eq '316c69667831'
13
16
  end
14
17
 
15
18
  it 'returns device_id in hex' do
16
- subject.device_id.should == 'abcdef123456'
19
+ expect(subject.device_id).to eq 'abcdef123456'
17
20
  end
18
21
 
19
22
  it 'returns tagged as false' do
20
- subject.tagged?.should be_false
23
+ expect(subject).not_to be_tagged
21
24
  end
22
25
 
23
26
  it 'returns nil for tag_ids' do
24
- subject.tag_ids.should == nil
27
+ expect(subject.tag_ids).to be_nil
25
28
  end
26
29
  end
27
30
 
28
31
  context 'tagged target' do
29
- subject do
30
- ProtocolPath.new(raw_site: "1lifx1", raw_target: "\x03\x00\x00\x00\x00\x00\x00\x00", tagged: true)
31
- end
32
+ let(:target) { "\x03\x00\x00\x00\x00\x00\x00\x00" }
33
+ let(:tagged) { true }
32
34
 
33
35
  it 'returns site_id in hex' do
34
- subject.site_id.should == "316c69667831"
36
+ expect(subject.site_id).to eq '316c69667831'
35
37
  end
36
38
 
37
39
  it 'returns device_id as nil' do
38
- subject.device_id.should == nil
40
+ expect(subject.device_id).to be_nil
39
41
  end
40
42
 
41
43
  it 'returns tagged as true' do
42
- subject.tagged?.should be_true
44
+ expect(subject).to be_tagged
43
45
  end
44
46
 
45
47
  it 'returns the tag_ids' do
46
- subject.tag_ids.should == [0, 1]
48
+ expect(subject.tag_ids).to eq [0, 1]
47
49
  end
48
50
  end
49
51
  end
@@ -51,11 +53,11 @@ module LIFX
51
53
  describe 'initializing from strings' do
52
54
  context 'device target' do
53
55
  subject do
54
- ProtocolPath.new(site_id: "316c69667831", device_id: 'abcdef123456')
56
+ ProtocolPath.new(site_id: '316c69667831', device_id: 'abcdef123456')
55
57
  end
56
58
 
57
59
  it 'sets raw_site correctly' do
58
- subject.raw_site.should == "1lifx1"
60
+ expect(subject.raw_site).to eq '1lifx1'
59
61
  end
60
62
 
61
63
  it 'sets raw_target correctly' do
@@ -69,41 +71,37 @@ module LIFX
69
71
 
70
72
  context 'tagged target' do
71
73
  subject do
72
- ProtocolPath.new(site_id: "316c69667831", tag_ids: [0, 1])
74
+ ProtocolPath.new(site_id: '316c69667831', tag_ids: [0, 1])
73
75
  end
74
76
 
75
77
  it 'sets raw_site properly' do
76
- subject.raw_site.should == "1lifx1"
78
+ expect(subject.raw_site).to eq '1lifx1'
77
79
  end
78
80
 
79
81
  it 'sets raw_target correctly' do
80
- subject.raw_target.should == "\x03\x00\x00\x00\x00\x00\x00\x00".b
82
+ expect(subject.raw_target).to eq "\x03\x00\x00\x00\x00\x00\x00\x00".b
81
83
  end
82
84
 
83
85
  it 'returns tagged as true' do
84
- subject.tagged?.should be_true
86
+ expect(subject).to be_tagged
85
87
  end
86
88
  end
87
89
 
88
90
  context 'tagged target with no site' do
89
- subject do
90
- ProtocolPath.new(tagged: true)
91
- end
91
+ subject { ProtocolPath.new(tagged: true) }
92
92
 
93
93
  it 'raw_site should be null string' do
94
- subject.raw_site.should == "\x00\x00\x00\x00\x00\x00".b
94
+ expect(subject.raw_site).to eq "\x00\x00\x00\x00\x00\x00".b
95
95
  end
96
96
 
97
97
  it 'sets raw_target correctly' do
98
- subject.raw_target.should == "\x00\x00\x00\x00\x00\x00\x00\x00".b
98
+ expect(subject.raw_target).to eq "\x00\x00\x00\x00\x00\x00\x00\x00".b
99
99
  end
100
100
 
101
101
  it 'returns tagged as true' do
102
- subject.tagged?.should be_true
102
+ expect(subject).to be_tagged
103
103
  end
104
104
  end
105
-
106
105
  end
107
-
108
106
  end
109
- end
107
+ end
@@ -3,19 +3,20 @@ require 'spec_helper'
3
3
  module LIFX
4
4
  describe RoutingManager do
5
5
  describe '#tags_for_device_id' do
6
- subject do
7
- RoutingManager.new(context: double)
8
- end
6
+ subject(:manager) { RoutingManager.new(context: double) }
9
7
 
10
8
  before do
11
- subject.tag_table.update_table(site_id: 'site', tag_id: 0, label: 'Some label')
12
- subject.tag_table.update_table(site_id: 'site', tag_id: 1, label: 'Another label')
13
- subject.tag_table.update_table(site_id: 'site', tag_id: 2, label: 'Much label')
14
- subject.routing_table.update_table(site_id: 'site', device_id: 'device', tag_ids: [0,2])
9
+ ['Some label', 'Another label', 'Much label'].each_with_index do |lbl, i|
10
+ manager.tag_table.update_table(site_id: 'site', tag_id: i, label: lbl)
11
+ end
12
+
13
+ manager.routing_table
14
+ .update_table(site_id: 'site', device_id: 'device', tag_ids: [0, 2])
15
15
  end
16
16
 
17
17
  it 'resolves tags' do
18
- subject.tags_for_device_id('device').should == ['Some label', 'Much label']
18
+ tags = manager.tags_for_device_id('device')
19
+ expect(tags).to eq ['Some label', 'Much label']
19
20
  end
20
21
  end
21
22
  end
data/spec/spec_helper.rb CHANGED
@@ -41,12 +41,9 @@ shared_context 'integration', integration: true do
41
41
  let(:light) { lights.first }
42
42
  end
43
43
 
44
- if ENV['DEBUG']
45
- LIFX::Config.logger = Yell.new(STDERR)
46
- end
44
+ LIFX::Config.logger = Yell.new(STDERR) if ENV['DEBUG']
47
45
 
48
46
  RSpec.configure do |config|
49
47
  config.formatter = 'documentation'
50
48
  config.color = true
51
49
  end
52
-
@@ -1,38 +1,40 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe LIFX::Transport::UDP do
4
- let(:port) { 45828 }
5
- subject do
6
- LIFX::Transport::UDP.new('localhost', port)
7
- end
4
+ subject(:udp) { LIFX::Transport::UDP.new(host, port) }
5
+
6
+ let(:host) { 'localhost' }
7
+ let(:message) { double }
8
+ let(:port) { 45_828 }
8
9
 
9
10
  describe '#write' do
10
- let(:message) { double }
11
11
  let(:payload) { double }
12
+
12
13
  it 'writes a Message to specified host' do
13
- message.should_receive(:pack).and_return(payload)
14
- UDPSocket.any_instance.should_receive(:send).with(payload, 0, 'localhost', port)
15
- subject.write(message)
14
+ expect(message).to receive(:pack).and_return(payload)
15
+ expect_any_instance_of(UDPSocket).to receive(:send)
16
+ .with(payload, 0, host, port)
17
+ udp.write(message)
16
18
  end
17
19
  end
18
20
 
19
21
  describe '#listen' do
20
22
  let(:raw_message) { 'some binary data' }
21
- let(:message) { double }
22
23
  let(:socket) { UDPSocket.new }
23
24
 
24
25
  it 'listens to the specified socket data, unpacks it and notifies observers' do
25
26
  messages = []
26
- subject.add_observer(self) do |message:, ip:, transport:|
27
+ udp.add_observer(self) do |message:, ip:, transport:|
27
28
  messages << message
28
29
  end
29
- subject.listen
30
+ udp.listen
30
31
 
31
- LIFX::Message.should_receive(:unpack).with(raw_message).and_return(message)
32
- socket.send(raw_message, 0, 'localhost', port)
32
+ expect(LIFX::Message).to receive(:unpack)
33
+ .with(raw_message)
34
+ .and_return(message)
35
+ socket.send(raw_message, 0, host, port)
33
36
  sleep 0.01
34
- messages.should include(message)
37
+ expect(messages).to include(message)
35
38
  end
36
-
37
39
  end
38
40
  end
@@ -6,9 +6,9 @@ describe LIFX::Transport do
6
6
 
7
7
  describe 'initialize' do
8
8
  it 'takes an host and port' do
9
- transport = LIFX::Transport.new('127.0.0.1', 31337)
10
- transport.host.should == '127.0.0.1'
11
- transport.port.should == 31337
9
+ transport = LIFX::Transport.new('127.0.0.1', 31_337)
10
+ expect(transport.host).to eq '127.0.0.1'
11
+ expect(transport.port).to eq 31_337
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lifx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jack Chen (chendo)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-24 00:00:00.000000000 Z
11
+ date: 2014-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
@@ -118,6 +118,7 @@ extra_rdoc_files: []
118
118
  files:
119
119
  - ".gitignore"
120
120
  - ".yardopts"
121
+ - CHANGES.md
121
122
  - Gemfile
122
123
  - LICENSE.txt
123
124
  - README.md
@@ -177,6 +178,7 @@ files:
177
178
  - spec/integration/client_spec.rb
178
179
  - spec/integration/light_spec.rb
179
180
  - spec/integration/tags_spec.rb
181
+ - spec/light_collection_spec.rb
180
182
  - spec/message_spec.rb
181
183
  - spec/protocol_path_spec.rb
182
184
  - spec/routing_manager_spec.rb
@@ -215,6 +217,7 @@ test_files:
215
217
  - spec/integration/client_spec.rb
216
218
  - spec/integration/light_spec.rb
217
219
  - spec/integration/tags_spec.rb
220
+ - spec/light_collection_spec.rb
218
221
  - spec/message_spec.rb
219
222
  - spec/protocol_path_spec.rb
220
223
  - spec/routing_manager_spec.rb