hue 0.2.0 → 0.3.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/lib/hue/errors.rb CHANGED
@@ -2,33 +2,47 @@ module Hue
2
2
  class Error < StandardError; end
3
3
 
4
4
  class UnauthorizedUser < Error; end
5
+
5
6
  class InvalidJSON < Error; end
7
+
6
8
  class ResourceNotAvailable < Error; end
9
+
7
10
  class MethodNotAvailable < Error; end
11
+
8
12
  class MissingBody < Error; end
13
+
9
14
  class ParameterNotAvailable < Error; end
15
+
10
16
  class InvalidValueForParameter < Error; end
17
+
11
18
  class ParameterNotModifiable < Error; end
19
+
12
20
  class InternalError < Error; end
21
+
13
22
  class LinkButtonNotPressed < Error; end
23
+
14
24
  class ParameterNotModifiableWhileOff < ParameterNotModifiable; end
25
+
15
26
  class TooManyGroups < Error; end
27
+
16
28
  class GroupTooFull < Error; end
17
29
 
18
30
  class InvalidUsername < Error; end
31
+
19
32
  class UnknownError < Error; end
33
+
20
34
  class NoBridgeFound < Error; end
21
35
 
22
36
  # Status code to exception map
23
37
  ERROR_MAP = {
24
- 1 => Hue::UnauthorizedUser,
25
- 2 => Hue::InvalidJSON,
26
- 3 => Hue::ResourceNotAvailable,
27
- 4 => Hue::MethodNotAvailable,
28
- 5 => Hue::MissingBody,
29
- 6 => Hue::ParameterNotAvailable,
30
- 7 => Hue::InvalidValueForParameter,
31
- 8 => Hue::ParameterNotModifiable,
38
+ 1 => Hue::UnauthorizedUser,
39
+ 2 => Hue::InvalidJSON,
40
+ 3 => Hue::ResourceNotAvailable,
41
+ 4 => Hue::MethodNotAvailable,
42
+ 5 => Hue::MissingBody,
43
+ 6 => Hue::ParameterNotAvailable,
44
+ 7 => Hue::InvalidValueForParameter,
45
+ 8 => Hue::ParameterNotModifiable,
32
46
  901 => Hue::InternalError,
33
47
  101 => Hue::LinkButtonNotPressed,
34
48
  201 => Hue::ParameterNotModifiableWhileOff,
data/lib/hue/group.rb CHANGED
@@ -11,19 +11,19 @@ module Hue
11
11
  attr_reader :bridge
12
12
 
13
13
  # A unique, editable name given to the group.
14
- attr_accessor :name
14
+ attr_reader :name
15
15
 
16
16
  # Hue of the group. This is a wrapping value between 0 and 65535.
17
17
  # Both 0 and 65535 are red, 25500 is green and 46920 is blue.
18
18
  attr_accessor :hue
19
19
 
20
- # Saturation of the group. 255 is the most saturated (colored)
20
+ # Saturation of the group. 254 is the most saturated (colored)
21
21
  # and 0 is the least saturated (white).
22
22
  attr_accessor :saturation
23
23
 
24
24
  # Brightness of the group. This is a scale from the minimum
25
25
  # brightness the group is capable of, 0, to the maximum capable
26
- # brightness, 255. Note a brightness of 0 is not off.
26
+ # brightness, 254. Note a brightness of 0 is not off.
27
27
  attr_accessor :brightness
28
28
 
29
29
  # The x coordinate of a color in CIE color space. Between 0 and 1.
@@ -58,16 +58,14 @@ module Hue
58
58
  end
59
59
 
60
60
  def lights
61
- @lights ||= begin
62
- @light_ids.map do |light_id|
63
- @client.light(light_id)
64
- end
61
+ @lights ||= @light_ids.map do |light_id|
62
+ @client.light(light_id)
65
63
  end
66
64
  end
67
65
 
68
66
  def name=(name)
69
- resp = set_group_state({:name => name})
70
- @name = new? ? name : resp[0]['success']["/groups/#{id}/name"]
67
+ resp = set_group_state({name: name})
68
+ @name = new? ? name : resp[0]["success"]["/groups/#{id}/name"]
71
69
  end
72
70
 
73
71
  def lights=(light_ids)
@@ -78,17 +76,17 @@ module Hue
78
76
  @light_ids = light_ids.uniq
79
77
  @lights = nil # resets the memoization
80
78
 
81
- set_group_state({:lights => @light_ids})
79
+ set_group_state({lights: @light_ids})
82
80
  end
83
81
 
84
82
  def scene=(scene)
85
83
  scene_id = scene.is_a?(Scene) ? scene.id : scene
86
- set_group_state({:scene => scene_id})
84
+ set_group_state({scene: scene_id})
87
85
  end
88
86
 
89
87
  def <<(light_id)
90
88
  @light_ids << light_id
91
- set_group_state({:lights => @light_ids})
89
+ set_group_state({lights: @light_ids})
92
90
  end
93
91
  alias_method :add_light, :<<
94
92
 
@@ -120,8 +118,8 @@ module Hue
120
118
 
121
119
  def create!
122
120
  body = {
123
- :name => @name,
124
- :lights => @light_ids,
121
+ name: @name,
122
+ lights: @light_ids
125
123
  }
126
124
 
127
125
  uri = URI.parse("http://#{@bridge.ip}/api/#{@client.username}/groups")
@@ -129,7 +127,7 @@ module Hue
129
127
  response = http.request_post(uri.path, JSON.dump(body))
130
128
  json = JSON(response.body)
131
129
 
132
- @id = json[0]['success']['id']
130
+ @id = json[0]["success"]["id"]
133
131
  end
134
132
 
135
133
  def destroy!
@@ -137,7 +135,7 @@ module Hue
137
135
  http = Net::HTTP.new(uri.host)
138
136
  response = http.delete(uri.path)
139
137
  json = JSON(response.body)
140
- @id = nil if json[0]['success']
138
+ @id = nil if json[0]["success"]
141
139
  end
142
140
 
143
141
  def new?
@@ -147,22 +145,22 @@ module Hue
147
145
  private
148
146
 
149
147
  GROUP_KEYS_MAP = {
150
- :name => :name,
151
- :light_ids => :lights,
152
- :type => :type,
153
- :state => :action
148
+ name: :name,
149
+ light_ids: :lights,
150
+ type: :type,
151
+ state: :action
154
152
  }
155
153
 
156
154
  STATE_KEYS_MAP = {
157
- :on => :on,
158
- :brightness => :bri,
159
- :hue => :hue,
160
- :saturation => :sat,
161
- :xy => :xy,
162
- :color_temperature => :ct,
163
- :alert => :alert,
164
- :effect => :effect,
165
- :color_mode => :colormode,
155
+ on: :on,
156
+ brightness: :bri,
157
+ hue: :hue,
158
+ saturation: :sat,
159
+ xy: :xy,
160
+ color_temperature: :ct,
161
+ alert: :alert,
162
+ effect: :effect,
163
+ color_mode: :colormode
166
164
  }
167
165
 
168
166
  def unpack(data)
@@ -170,7 +168,7 @@ module Hue
170
168
 
171
169
  unless new?
172
170
  unpack_hash(@state, STATE_KEYS_MAP)
173
- @x, @y = @state['xy']
171
+ @x, @y = @state["xy"]
174
172
  end
175
173
  end
176
174
 
data/lib/hue/light.rb CHANGED
@@ -3,9 +3,6 @@ module Hue
3
3
  include TranslateKeys
4
4
  include EditableState
5
5
 
6
- HUE_RANGE = 0..65535
7
- SATURATION_RANGE = 0..255
8
- BRIGHTNESS_RANGE = 0..255
9
6
  COLOR_TEMPERATURE_RANGE = 153..500
10
7
 
11
8
  # Unique identification number.
@@ -15,19 +12,19 @@ module Hue
15
12
  attr_reader :bridge
16
13
 
17
14
  # A unique, editable name given to the light.
18
- attr_accessor :name
15
+ attr_reader :name
19
16
 
20
17
  # Hue of the light. This is a wrapping value between 0 and 65535.
21
18
  # Both 0 and 65535 are red, 25500 is green and 46920 is blue.
22
19
  attr_reader :hue
23
20
 
24
- # Saturation of the light. 255 is the most saturated (colored)
21
+ # Saturation of the light. 254 is the most saturated (colored)
25
22
  # and 0 is the least saturated (white).
26
23
  attr_reader :saturation
27
24
 
28
25
  # Brightness of the light. This is a scale from the minimum
29
26
  # brightness the light is capable of, 0, to the maximum capable
30
- # brightness, 255. Note a brightness of 0 is not off.
27
+ # brightness, 254. Note a brightness of 0 is not off.
31
28
  attr_reader :brightness
32
29
 
33
30
  # The x coordinate of a color in CIE color space. Between 0 and 1.
@@ -84,6 +81,15 @@ module Hue
84
81
  # Reserved for future functionality.
85
82
  attr_reader :point_symbol
86
83
 
84
+ # The unique ID of the light.
85
+ attr_reader :uid
86
+
87
+ # The hash of capabilities of the light
88
+ attr_reader :capabilities
89
+
90
+ # The config hash
91
+ attr_reader :config
92
+
87
93
  def initialize(client, bridge, id, hash)
88
94
  @client = client
89
95
  @bridge = bridge
@@ -92,21 +98,21 @@ module Hue
92
98
  end
93
99
 
94
100
  def name=(new_name)
95
- unless (1..32).include?(new_name.length)
96
- raise InvalidValueForParameter, 'name must be between 1 and 32 characters.'
101
+ unless (1..32).cover?(new_name.length)
102
+ raise InvalidValueForParameter, "name must be between 1 and 32 characters."
97
103
  end
98
104
 
99
105
  body = {
100
- :name => new_name
106
+ name: new_name
101
107
  }
102
108
 
103
109
  uri = URI.parse(base_url)
104
110
  http = Net::HTTP.new(uri.host)
105
111
  response = http.request_put(uri.path, JSON.dump(body))
106
112
  response = JSON(response.body).first
107
- if response['success']
113
+ if response["success"]
108
114
  @name = new_name
109
- # else
115
+ # else
110
116
  # TODO: Error
111
117
  end
112
118
  end
@@ -115,7 +121,7 @@ module Hue
115
121
  # always returns true, functionality will be added in a future
116
122
  # patch.
117
123
  def reachable?
118
- @state['reachable']
124
+ @state["reachable"]
119
125
  end
120
126
 
121
127
  # @param transition The duration of the transition from the light’s current
@@ -126,7 +132,7 @@ module Hue
126
132
  body = translate_keys(attributes, STATE_KEYS_MAP)
127
133
 
128
134
  # Add transition
129
- body.merge!({:transitiontime => transition}) if transition
135
+ body[:transitiontime] = transition if transition
130
136
 
131
137
  uri = URI.parse("#{base_url}/state")
132
138
  http = Net::HTTP.new(uri.host)
@@ -140,34 +146,37 @@ module Hue
140
146
  unpack(json)
141
147
  end
142
148
 
143
- private
149
+ private
144
150
 
145
151
  KEYS_MAP = {
146
- :state => :state,
147
- :type => :type,
148
- :name => :name,
149
- :model => :modelid,
150
- :software_version => :swversion,
151
- :point_symbol => :pointsymbol
152
+ state: :state,
153
+ type: :type,
154
+ name: :name,
155
+ model: :modelid,
156
+ software_version: :swversion,
157
+ point_symbol: :pointsymbol,
158
+ uid: :uniqueid,
159
+ capabilities: :capabilities,
160
+ config: :config
152
161
  }
153
162
 
154
163
  STATE_KEYS_MAP = {
155
- :on => :on,
156
- :brightness => :bri,
157
- :hue => :hue,
158
- :saturation => :sat,
159
- :xy => :xy,
160
- :color_temperature => :ct,
161
- :alert => :alert,
162
- :effect => :effect,
163
- :color_mode => :colormode,
164
- :reachable => :reachable,
164
+ on: :on,
165
+ brightness: :bri,
166
+ hue: :hue,
167
+ saturation: :sat,
168
+ xy: :xy,
169
+ color_temperature: :ct,
170
+ alert: :alert,
171
+ effect: :effect,
172
+ color_mode: :colormode,
173
+ reachable: :reachable
165
174
  }
166
175
 
167
176
  def unpack(hash)
168
177
  unpack_hash(hash, KEYS_MAP)
169
178
  unpack_hash(@state, STATE_KEYS_MAP)
170
- @x, @y = @state['xy']
179
+ @x, @y = @state["xy"]
171
180
  end
172
181
 
173
182
  def base_url
data/lib/hue/scene.rb CHANGED
@@ -24,19 +24,17 @@ module Hue
24
24
  end
25
25
 
26
26
  def lights
27
- @lights ||= begin
28
- @light_ids.map do |light_id|
29
- @client.light(light_id)
30
- end
27
+ @lights ||= @light_ids.map do |light_id|
28
+ @client.light(light_id)
31
29
  end
32
30
  end
33
31
 
34
32
  private
35
33
 
36
34
  SCENE_KEYS_MAP = {
37
- :name => :name,
38
- :light_ids => :lights,
39
- :active => :active,
35
+ name: :name,
36
+ light_ids: :lights,
37
+ active: :active
40
38
  }
41
39
 
42
40
  def unpack(data)
@@ -14,7 +14,7 @@ module Hue
14
14
  map.each do |local_key, remote_key|
15
15
  value = hash[remote_key.to_s]
16
16
  next unless value
17
- instance_variable_set("@#{local_key}", value)
17
+ instance_variable_set(:"@#{local_key}", value)
18
18
  end
19
19
  end
20
20
  end
data/lib/hue/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hue
2
- VERSION = '0.2.0'
2
+ VERSION = "0.3.1"
3
3
  end
data/lib/hue.rb CHANGED
@@ -1,12 +1,12 @@
1
- require 'hue/version'
2
- require 'hue/errors'
3
- require 'hue/client'
4
- require 'hue/bridge'
5
- require 'hue/editable_state'
6
- require 'hue/translate_keys'
7
- require 'hue/light'
8
- require 'hue/group'
9
- require 'hue/scene'
1
+ require "hue/version"
2
+ require "hue/errors"
3
+ require "hue/client"
4
+ require "hue/bridge"
5
+ require "hue/editable_state"
6
+ require "hue/translate_keys"
7
+ require "hue/light"
8
+ require "hue/group"
9
+ require "hue/scene"
10
10
 
11
11
  module Hue
12
12
  USERNAME_RANGE = 10..40
@@ -0,0 +1,26 @@
1
+ require "test_helper"
2
+
3
+ class ClientTest < Minitest::Test
4
+ def before_setup
5
+ super
6
+
7
+ stub_request(:get, "https://discovery.meethue.com/")
8
+ .to_return(body: '[{"id":"ffa57b3b257200065704","internalipaddress":"192.168.0.1"},{"id":"63c2fc01391276a319f9","internalipaddress":"192.168.0.2"}]')
9
+
10
+ stub_request(:get, %r{http://192.168.0.1/api}).to_return(body: '[{"success":true}]')
11
+ stub_request(:get, %r{http://192.168.0.1/api/*}).to_return(body: '[{"success":true}]')
12
+ stub_request(:get, %r{http://192.168.0.2/api/*}).to_return(body: '[{"success":true}]')
13
+ end
14
+
15
+ def test_with_bridge_id
16
+ client = Hue::Client.new(use_mdns: false)
17
+ client.stub :find_bridge_id, "63c2fc01391276a319f9" do
18
+ assert_equal "63c2fc01391276a319f9", client.bridge.id
19
+ end
20
+ end
21
+
22
+ def test_without_bridge_id
23
+ client = Hue::Client.new(use_mdns: false)
24
+ assert_equal "ffa57b3b257200065704", client.bridge.id
25
+ end
26
+ end
@@ -0,0 +1,44 @@
1
+ require "test_helper"
2
+
3
+ class LightTest < Minitest::Test
4
+ def before_setup
5
+ super
6
+
7
+ stub_request(:get, "https://discovery.meethue.com/")
8
+ .to_return(body: '[{"internalipaddress":"localhost"}]')
9
+
10
+ stub_request(:get, %r{http://localhost/api/*}).to_return(body: '[{"success":true}]')
11
+ stub_request(:post, "http://localhost/api").to_return(body: '[{"success":{"username":"ruby"}}]')
12
+ stub_request(:put, %r{http://localhost/api*}).to_return(body: "[{}]")
13
+ end
14
+
15
+ %w[on hue saturation brightness color_temperature alert effect].each do |attribute|
16
+ define_method :"test_setting_#{attribute}" do
17
+ client = Hue::Client.new(use_mdns: false)
18
+ light = Hue::Light.new(client, client.bridge, 0, {"state" => {}})
19
+
20
+ light.send(:"#{attribute}=", 24)
21
+ assert_requested :put, %r{http://localhost/api/.*/lights/0}
22
+ end
23
+ end
24
+
25
+ def test_toggle_while_off
26
+ client = Hue::Client.new(use_mdns: false)
27
+ light = Hue::Light.new(client, client.bridge, 0, {"state" => {}})
28
+ assert_equal false, light.on?
29
+
30
+ light.toggle!
31
+ assert_requested :put, %r{http://localhost/api/.*/lights/0}
32
+ assert_equal true, light.on?
33
+ end
34
+
35
+ def test_toggle_while_on
36
+ client = Hue::Client.new(use_mdns: false)
37
+ light = Hue::Light.new(client, client.bridge, 0, {"state" => {"on" => true}})
38
+ assert_equal true, light.on?
39
+
40
+ light.toggle!
41
+ assert_requested :put, %r{http://localhost/api/.*/lights/0}
42
+ assert_equal false, light.on?
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require "hue"
3
+
4
+ require "minitest"
5
+ require "webmock/minitest"
6
+ require "minitest/autorun"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Soffes
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-05 00:00:00.000000000 Z
11
+ date: 2024-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -39,21 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: log_switch
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '='
46
- - !ruby/object:Gem::Version
47
- version: 0.4.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '='
53
- - !ruby/object:Gem::Version
54
- version: 0.4.0
55
- - !ruby/object:Gem::Dependency
56
- name: curb
42
+ name: color_conversion
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ">="
@@ -66,50 +52,23 @@ dependencies:
66
52
  - - ">="
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 3.2.0
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 3.2.0
83
- - !ruby/object:Gem::Dependency
84
- name: webmock
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
55
  description: Work with Philips Hue light bulbs.
98
56
  email:
99
57
  - sam@soff.es
100
58
  executables:
59
+ - console
101
60
  - hue
102
61
  extensions: []
103
62
  extra_rdoc_files: []
104
63
  files:
64
+ - ".github/workflows/main.yml"
105
65
  - ".gitignore"
106
- - ".rspec"
107
- - Contributing.markdown
66
+ - ".ruby-version"
108
67
  - Gemfile
109
68
  - LICENSE
69
+ - README.md
110
70
  - Rakefile
111
- - Readme.markdown
112
- - Todo.markdown
71
+ - bin/console
113
72
  - bin/hue
114
73
  - hue.gemspec
115
74
  - lib/hue.rb
@@ -123,13 +82,14 @@ files:
123
82
  - lib/hue/scene.rb
124
83
  - lib/hue/translate_keys.rb
125
84
  - lib/hue/version.rb
126
- - spec/hue/light_spec.rb
127
- - spec/spec_helper.rb
85
+ - test/hue/client_test.rb
86
+ - test/hue/light_test.rb
87
+ - test/test_helper.rb
128
88
  homepage: https://github.com/soffes/hue
129
89
  licenses:
130
90
  - MIT
131
91
  metadata: {}
132
- post_install_message:
92
+ post_install_message:
133
93
  rdoc_options: []
134
94
  require_paths:
135
95
  - lib
@@ -137,18 +97,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
97
  requirements:
138
98
  - - ">="
139
99
  - !ruby/object:Gem::Version
140
- version: 1.9.3
100
+ version: 2.1.0
141
101
  required_rubygems_version: !ruby/object:Gem::Requirement
142
102
  requirements:
143
103
  - - ">="
144
104
  - !ruby/object:Gem::Version
145
105
  version: '0'
146
106
  requirements: []
147
- rubyforge_project:
148
- rubygems_version: 2.5.1
149
- signing_key:
107
+ rubygems_version: 3.4.22
108
+ signing_key:
150
109
  specification_version: 4
151
110
  summary: Work with Philips Hue light bulbs from Ruby.
152
- test_files:
153
- - spec/hue/light_spec.rb
154
- - spec/spec_helper.rb
111
+ test_files: []
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper
@@ -1,19 +0,0 @@
1
- ## Submitting a Pull Request
2
-
3
- 1. [Fork the repository.][fork]
4
- 2. [Create a topic branch.][branch]
5
- 3. Add tests for your unimplemented feature or bug fix.
6
- 4. Run `bundle exec rake`. If your tests pass, return to step 3.
7
- 5. Implement your feature or bug fix.
8
- 6. Run `bundle exec rake`. If your tests fail, return to step 5.
9
- 7. Run `open coverage/index.html`. If your changes are not completely covered
10
- by your tests, return to step 3.
11
- 8. Add documentation for your feature or bug fix.
12
- 9. Run `bundle exec rake doc`. If your changes are not 100% documented, go
13
- back to step 8.
14
- 10. Add, commit, and push your changes.
15
- 11. [Submit a pull request.][pr]
16
-
17
- [fork]: http://help.github.com/fork-a-repo/
18
- [branch]: http://learn.github.com/p/branching.html
19
- [pr]: http://help.github.com/send-pull-requests/
data/Todo.markdown DELETED
@@ -1,8 +0,0 @@
1
- # To Do
2
-
3
- * RGB translation
4
- * Hex translation
5
- * Scheduling
6
- * Effects
7
- * User management
8
- * Configuration
@@ -1,24 +0,0 @@
1
- RSpec.describe Hue::Light do
2
- %w{on hue saturation brightness color_temperature alert effect}.each do |attribute|
3
- before do
4
- stub_request(:get, "https://www.meethue.com/api/nupnp").
5
- to_return(:body => '[{"internalipaddress":"localhost"}]')
6
-
7
- stub_request(:get, %r{http://localhost/api/*}).
8
- to_return(:body => '[{"success":true}]')
9
-
10
- stub_request(:put, %r{http://localhost/api*}).
11
- to_return(:body => '[{}]')
12
- end
13
-
14
- describe "##{attribute}=" do
15
- it "PUTs the new attribute value" do
16
- client = Hue::Client.new
17
- light = Hue::Light.new(client, client.bridge, 0, {"state" => {}})
18
-
19
- light.send("#{attribute}=", 24)
20
- expect(a_request(:put, %r{http://localhost/api/.*/lights/0})).to have_been_made
21
- end
22
- end
23
- end
24
- end