huey 2.0.1 → 2.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f4c3837f65eb7ca77400cab890aa464ffa469ca
4
- data.tar.gz: e0759a7ecb3d0d038f9972cd94b67561d27640f9
3
+ metadata.gz: 426fd9b03d93002081cb9226ff446bd7a094baf6
4
+ data.tar.gz: c54af8d42bcf2bc9d673d594351f059ddbac1b48
5
5
  SHA512:
6
- metadata.gz: 0d5803ff4f5cc2471da1087578717fe400f8f8c32e972c5d3d1f9b9992a254094a39c78b8c0613ee28eb489bd9e18f3266f1adf6e0876453eb5adbf4a9cf9851
7
- data.tar.gz: f718ff168af4ca6130dfe5b7ebba7013258b82950d91cadda06d0b68ac4ec5a1a8b92ec713410bcb66622b880e9866700baa1a3ea7b023b0d1f092df1f3653fb
6
+ metadata.gz: 729bbc4e6b64c4291d4e8b0b50c4bf9af2619674e1c44a8ab30c29deaee37b6dcded0785ca6031dee37d06d950c005ecdd8c699f3b4b31204e4203ce704e37eb
7
+ data.tar.gz: ef68f85d7fe6f7d356fad8494dfd69c3192d85a96a63744d50e1681ac532f5a2b03b3537906de09519d48b30bf9614605cee0cc161bc845ff563cb74b0bf8cf6
data/Gemfile CHANGED
@@ -6,7 +6,8 @@ gem 'color-tools'
6
6
  gem 'chronic'
7
7
 
8
8
  group :development, :test do
9
+ gem 'minitest'
9
10
  gem 'timecop'
10
11
  gem 'webmock'
11
- gem 'mocha'
12
- end
12
+ gem 'mocha', require: false
13
+ end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- huey (2.0.0)
4
+ huey (2.0.1)
5
5
  chronic (>= 0.9.0)
6
6
  color (>= 1.4.1)
7
7
  eventmachine (>= 1.0.0)
@@ -22,6 +22,7 @@ GEM
22
22
  multi_xml (>= 0.5.2)
23
23
  json (1.8.1)
24
24
  metaclass (0.0.1)
25
+ minitest (5.0.8)
25
26
  mocha (0.13.1)
26
27
  metaclass (~> 0.0.1)
27
28
  multi_json (1.8.2)
@@ -41,6 +42,7 @@ DEPENDENCIES
41
42
  chronic
42
43
  color-tools
43
44
  huey!
45
+ minitest
44
46
  mocha
45
47
  rake
46
48
  timecop
@@ -14,21 +14,23 @@ You shouldn't need to initialize anything to make Huey work correctly, but if yo
14
14
 
15
15
  ```ruby
16
16
  Huey.configure do |config|
17
- # Huey now uses the Phillips Hue API to discover local bridges, but you can specify the Hue IP
18
- # manually if your Huey server is not on your local network.
17
+ # Huey now uses the Phillips Hue API to discover local bridges, but you can
18
+ # specify the Hue IP manually if your Huey server is not on your
19
+ # local network.
19
20
  config.hue_ip = '123.456.789.012'
20
21
 
21
- # SSDP is disabled by default.
22
+ # SSDP is disabled by default. Do not enable it unless you have a compelling
23
+ # reason to do so.
22
24
  config.ssdp = true
23
25
 
24
- # For discovering the Hue hub, usually you won't have to change this.
26
+ # Specify the SSDP IP. Do not use this unless you're using SSDP broadcasting
27
+ # at a non-standard IP.
25
28
  config.ssdp_ip = '239.255.255.250'
26
29
 
27
- # Also for discovering the Hue hub.
30
+ # As per the above, but for a non-standard port.
28
31
  config.ssdp_port = 1900
29
32
 
30
- # If you get constant errors about not being able to find the Hue hub and you're sure
31
- # it's connected, increase this.
33
+ # If your SSDP connections keep timing out, increase this.
32
34
  config.ssdp_ttl = 1
33
35
 
34
36
  # Change this if you don't like the included uuid.
@@ -49,25 +51,27 @@ Just like the message says, go press the link button on your Hue hub, and then r
49
51
  ### Bulbs
50
52
 
51
53
  ```ruby
52
- Huey::Bulb.all # Returns an array of your bulbs
53
-
54
54
  bulb = Huey::Bulb.find(1) # Finds the bulb with the ID of 1
55
55
  bulb = Huey::Bulb.find('Living Room') # Finds the bulb with the name 'Living Room'
56
56
 
57
- bulb.alert! # Flashes the bulb in question once and immediately, useful for checking connectivity
57
+ bulb.alert! # Flashes the bulb in question once and immediately, useful
58
+ # for checking connectivity
58
59
 
59
60
  bulb.bri = 100 # Let's dim the bulb a little bit
60
- bulb.ct = 500 # And make it a little more orange
61
-
62
- bulb.save # Apply all the changes you've made
61
+ bulb.ct = 500 # And make it a little more orange
62
+ bulb.save # Apply all the changes you've made
63
63
 
64
64
  bulb.update(bri: 100, ct: 500) # Set and save in one step
65
65
 
66
66
  bulb.rgb = '#8FF1F5' # Everyone loves aqua
67
-
68
- bulb.commit # Alias for save
67
+ bulb.commit # Alias for save
69
68
 
70
69
  bulb.reload # Refresh changes to the bulb, made perhaps with another app
70
+
71
+ Huey::Bulb.all # Returns an array of your bulbs
72
+ Huey::Bulb.all.alert! # Makes all your bulbs start flashing
73
+ Huey::Bulb.all.update(bri: 255, on: true) # Turn on all your bulbs and
74
+ # increase brightness to max
71
75
  ```
72
76
 
73
77
  Changes to the bulb only take effect when you call `save` on it. If you prefer, `save` is aliased as `commit`.
@@ -90,7 +94,9 @@ I've added in some convenience attributes as well:
90
94
 
91
95
  ### Groups
92
96
 
93
- You can also simply and sensibly create groups of bulbs.
97
+ Returned arrays of bulbs are grouped into a convenience class called `Huey::Group`. It acts like an array, but any huey-specific method you pass in will be invoked on all the bulbs.
98
+
99
+ You can also simply and sensibly create groups of bulbs yourself if you like.
94
100
 
95
101
  ```ruby
96
102
  Huey::Group.new('Living Room') # Contains all bulbs that have 'Living Room' in their name
@@ -8,9 +8,13 @@ module Huey
8
8
  attr_reader :id
9
9
 
10
10
  def self.all
11
- @all ||= Huey::Request.get['lights'].collect do |id, hash|
12
- Bulb.new(id, hash)
11
+ return @all if @all
12
+
13
+ @all = Huey::Group.new
14
+ Huey::Request.get['lights'].collect do |id, hash|
15
+ @all.bulbs << Bulb.new(id, hash)
13
16
  end
17
+ @all
14
18
  end
15
19
 
16
20
  def self.find(id)
@@ -18,7 +22,9 @@ module Huey
18
22
  end
19
23
 
20
24
  def self.find_all(id)
21
- self.all.select {|b| b.id == id || b.name.include?(id.to_s)}
25
+ group = Huey::Group.new
26
+ self.all.select {|b| b.id == id || b.name.include?(id.to_s)}.each {|b| group.bulbs << b}
27
+ group
22
28
  end
23
29
 
24
30
  def initialize(id, hash)
@@ -4,6 +4,7 @@ module Huey
4
4
 
5
5
  # A group is a collection of bulbs.
6
6
  class Group
7
+ include Enumerable
7
8
  ATTRIBUTES = Huey::Bulb::ATTRIBUTES - [:name, :reachable] + [:rgb]
8
9
  attr_accessor :bulbs, :name
9
10
 
@@ -26,6 +27,7 @@ module Huey
26
27
  end
27
28
 
28
29
  def initialize(*string_or_array)
30
+ @bulbs = []
29
31
  string_or_array = string_or_array.first if string_or_array.first.is_a?(Array)
30
32
 
31
33
  self.bulbs = if string_or_array.first.is_a?(Bulb)
@@ -35,7 +37,7 @@ module Huey
35
37
  end
36
38
 
37
39
  @attributes_to_write = {}
38
- Huey::Group.all << self
40
+ Huey::Group.all << self unless self.bulbs.nil? || self.bulbs.empty?
39
41
  self
40
42
  end
41
43
 
@@ -46,21 +48,27 @@ module Huey
46
48
  end
47
49
 
48
50
  def save
49
- response = bulbs.collect {|b| b.update(@attributes_to_write)}
51
+ response = self.collect {|b| b.update(@attributes_to_write)}
50
52
  @attributes_to_write = {}
51
53
  response
52
54
  end
53
55
  alias :commit :save
54
56
 
55
57
  def update(attrs)
56
- bulbs.collect {|b| b.update(attrs)}
58
+ self.collect {|b| b.update(attrs)}
59
+ end
60
+
61
+ def each(&block)
62
+ bulbs.each {|b| block.call(b)}
57
63
  end
58
64
 
59
65
  def method_missing(meth, *args, &block)
60
66
  if !self.bulbs.empty? && self.bulbs.first.respond_to?(meth)
61
67
  h = {}
62
- bulbs.each {|b| h[b.id] = b.send(meth, *args, &block)}
68
+ self.each {|b| h[b.id] = b.send(meth, *args, &block)}
63
69
  h
70
+ elsif self.bulbs.respond_to?(meth)
71
+ bulbs.send(meth, *args, &block)
64
72
  else
65
73
  super
66
74
  end
@@ -1,3 +1,3 @@
1
1
  module Huey
2
- VERSION = "2.0.1"
2
+ VERSION = "2.1.0"
3
3
  end
@@ -1,10 +1,11 @@
1
- require 'test/unit'
2
- require 'webmock/test_unit'
3
- require "mocha/setup"
1
+ require 'minitest/autorun'
2
+ require 'webmock/minitest'
4
3
  require 'timecop'
5
4
  require 'huey'
5
+ require "mocha/setup"
6
+
6
7
 
7
- class Test::Unit::TestCase
8
+ class MiniTest::Test
8
9
  def setup
9
10
  super
10
11
  # Prevent real connections to the hub
@@ -1,10 +1,11 @@
1
1
  require 'test_helper'
2
2
 
3
- class BulbTest < Test::Unit::TestCase
3
+ class BulbTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
7
7
  @bulb = init_bulb
8
+ Huey::Bulb.instance_variable_set(:@all, nil)
8
9
  end
9
10
 
10
11
  def test_initializes_bulb_from_hash
@@ -86,9 +87,11 @@ class BulbTest < Test::Unit::TestCase
86
87
  end
87
88
 
88
89
  def test_refresh_state
89
- response = light_response('2', 'Bedroom').values.first
90
- response['state'].merge!('on' => true)
91
- Huey::Request.expects(:get).once.returns(response)
90
+ off_response = light_response('2', 'Bedroom').values.first
91
+ Huey::Request.expects(:get).with(nil).once.returns('lights' => {'2' => off_response})
92
+ on_response = light_response('2', 'Bedroom').values.first
93
+ on_response['state'].merge!('on' => true)
94
+ Huey::Request.expects(:get).with("lights/2").once.returns(on_response)
92
95
 
93
96
  @bulb = Huey::Bulb.find(2)
94
97
  assert_equal false, @bulb.on
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class EventTest < Test::Unit::TestCase
3
+ class EventTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class GroupTest < Test::Unit::TestCase
3
+ class GroupTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
@@ -48,6 +48,12 @@ class GroupTest < Test::Unit::TestCase
48
48
  assert_equal g, Huey::Group.find('Living Room')
49
49
  end
50
50
 
51
+ def test_not_included_in_all_if_empty
52
+ g = Huey::Group.new
53
+
54
+ assert !Huey::Group.all.include?(g)
55
+ end
56
+
51
57
  def test_delegates_save_to_bulbs
52
58
  @group = Huey::Group.new(@bulb1, @bulb2, @bulb3)
53
59
 
@@ -85,4 +91,30 @@ class GroupTest < Test::Unit::TestCase
85
91
 
86
92
  assert_equal @group.bri, {1=>127, 2=>127, 3=>127}
87
93
  end
94
+
95
+ def test_implements_each
96
+ @group = Huey::Group.new(@bulb1, @bulb2, @bulb3)
97
+
98
+ [@bulb1, @bulb2, @bulb3].each do |bulb|
99
+ Huey::Request.expects(:put).with("lights/#{bulb.id}/state", body: MultiJson.dump({on: true, bri: 101})).once.returns(true)
100
+ end
101
+
102
+
103
+ @group.each {|bulb| bulb.update(on: true, bri: 101)}
104
+
105
+ [@bulb1, @bulb2, @bulb3].each do |bulb|
106
+ assert_equal true, bulb.on
107
+ assert_equal 101, bulb.bri
108
+ end
109
+ end
110
+
111
+ def test_includes_enumerable
112
+ @group = Huey::Group.new(@bulb1, @bulb2, @bulb3)
113
+
114
+ [@bulb1, @bulb2, @bulb3].each do |bulb|
115
+ Huey::Request.expects(:put).with("lights/#{bulb.id}/state", body: MultiJson.dump({on: true, bri: 102})).once.returns(true)
116
+ end
117
+
118
+ assert_equal [true, true, true], @group.collect {|bulb| bulb.update(on: true, bri: 102)}
119
+ end
88
120
  end
@@ -1,17 +1,21 @@
1
1
  require 'test_helper'
2
2
 
3
- class PortalTest < Test::Unit::TestCase
3
+ class PortalTest < MiniTest::Test
4
+ def setup
5
+ super
6
+ Huey::Portal.instance_variable_set(:@hue_ip, nil)
7
+ end
4
8
 
5
9
  def test_gets_local_bridge_ip
6
- stub_request(:get, 'http://www.meethue.com/api/nupnp').to_return(body: MultiJson.dump([{"id" => "001788fffe0931a2", "internalipaddress" => "192.168.123.123", "macaddress" => "00:17:88:09:31:a2"}]), headers: {"Content-Type" => 'application/json'})
10
+ stub_request(:get, 'http://www.meethue.com/api/nupnp').to_return(body: MultiJson.dump([{"id" => "001788fffe0931a2", "internalipaddress" => "192.168.123.123", "macaddress" => "00:17:88:09:31:a2"}]), headers: {"Content-Type" => 'application/json'}).times(2)
7
11
 
8
12
  assert_equal Huey::Portal.hue_ip, '192.168.123.123'
9
13
 
10
14
  assert_requested :get, 'http://www.meethue.com/api/nupnp'
11
15
  end
12
16
 
13
- def test_does_not_find_local_bride
14
- stub_request(:get, 'http://www.meethue.com/api/nupnp').to_return(body: MultiJson.dump([]), headers: {"Content-Type" => 'application/json'})
17
+ def test_does_not_find_local_bridge
18
+ stub_request(:get, 'http://www.meethue.com/api/nupnp').to_return(body: MultiJson.dump([]), headers: {"Content-Type" => 'application/json'}).times(2)
15
19
 
16
20
  assert_raises Huey::Errors::CouldNotFindHue do
17
21
  Huey::Portal.hue_ip
@@ -1,10 +1,11 @@
1
1
  require 'test_helper'
2
2
 
3
- class RequestTest < Test::Unit::TestCase
3
+ class RequestTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  super
7
7
  set_hue_ip('0.0.0.0')
8
+ Huey::Config.hue_port = 80
8
9
  end
9
10
 
10
11
  [:get, :post, :put, :delete].each do |m|
@@ -48,7 +49,7 @@ class RequestTest < Test::Unit::TestCase
48
49
  Huey::Config.hue_ip = nil
49
50
  end
50
51
 
51
- def test_uses_configured_ip_
52
+ def test_uses_configured_ip
52
53
  Huey::Config.hue_port = 12345
53
54
 
54
55
  stub_request(:any, "http://0.0.0.0:12345/api/0123456789abdcef0123456789abcdef/")
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class SSDPTest < Test::Unit::TestCase
3
+ class SSDPTest < MiniTest::Test
4
4
 
5
5
  def setup
6
6
  Huey::SSDP.instance_variable_set(:@hue_ip, nil)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: huey
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Veraticus