lights 0.8.13 → 0.8.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDM3ZmNkN2M5OTJkNjVmZmYzNTBiNzVhNDdiZDJmNWYzNjYxNjA1YQ==
4
+ MTUxOTM1Yjg0NzgyMGJjZDYwMzI5NDFiYTMyMDc0ODUxODlhZjg4ZA==
5
5
  data.tar.gz: !binary |-
6
- YmJjMjVjY2M5M2MyZWFmYTIwMmIyYTE2MjZhNTQxN2JjNTBhNDAxNw==
6
+ YjllMTc5ZDJmM2Q1MjE5NzY0ZGQ5NmZhYTk1NWNjNDY4NzcwN2U2Yg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZDM1NjliNTIxYjc5MDgzYmU0OTMxMTYwZTllMmIxMjQxNTdmMTBkYjhkYjAy
10
- ZDBkZjRjMmVhZGNiODlkMGQzNDNlOTY1NDhlMjEwNWIwZDRjMmFiMjEyZDQ2
11
- ZmQ5MjM1ZjFmNmFjNmE5YTQxZmU0NGZlYWRiYjY3OTUxODA1YzQ=
9
+ YjljMjI2Yzk4MmU2OTVlMjA4OGViMzRiOGM3NDRmNmJiMDYwYjMzNTk2NDZj
10
+ NGE2MzkzMjdjNzhkMDMzZGQ2NWMyNjRkY2FjMGQxNzhkZTY1MjhkMjFkYjg0
11
+ ZWJhOWJiMDRjN2ZjZTZkMDc1N2NkNjNlYjRjOGE0YzQ5ZmFiZDE=
12
12
  data.tar.gz: !binary |-
13
- NmNhNjFmMmRlNjY5Njc2OTQzZDc2YjQ4NDRhOWQ2MDg1NmRhOWFjMDIwMjY3
14
- YWFlZDlkM2IyYWU0ODkxOTBhMmIyOGQxNWZjNGM2ZGFiM2Q3Mjg1OWFkYmRk
15
- MzE5Y2U3ZDE4ZjI5MWVlOTc0MWY3NzQ2MjZjMDRjNGQxMGJiMmQ=
13
+ MGQzM2RhYmZkZmQ3NWZiNzBmOTU3YzVlNzIyZGRkYzM2MjBkNjMyNzNiZTFj
14
+ YmFlZDI4YjgwNzMwYTllMWEzYTc0M2I4MGM5ZjcxOTQ0Mjk3ZTg1MWViZmEz
15
+ NjU3M2NmMzA4ZmFhMjc3ZmQxNmYzMTVlOTg5YmU1MzA3OWJkYjM=
data/README.md CHANGED
@@ -19,13 +19,14 @@ client = Lights.new( '192.168.x.x', 'username' )
19
19
  client.register_username
20
20
  client.request_bulb_list
21
21
  ```
22
+ See [lights-examples](https://github.com/turnerba/lights-examples) for more usage examples.
22
23
 
23
24
  CLI Quick Setup
24
25
  ----
25
26
 
26
27
  ```
27
28
  lights discover -s
28
- lights config -f --user username
29
+ lights config -f --user <username>
29
30
  lights register
30
31
  lights list
31
32
  lights on -l all
data/bin/lights CHANGED
@@ -187,37 +187,37 @@ class LightsCli
187
187
  case type
188
188
  when nil, "","lights"
189
189
  response = options[:new] ? hue.request_new_bulb_list : hue.request_bulb_list
190
- response.each{|id,value| objects << hue.request_bulb_info( id )}
190
+ objects = BulbList.new(response).list
191
191
  titles = ["ID","NAME"]
192
192
  methods = [:id,:name]
193
193
  when "sensors"
194
194
  response = options[:new] ? hue.request_new_sensor_list : hue.request_sensor_list
195
- response.each { |id,value| objects << hue.request_sensor_info( id )}
195
+ objects = SensorList.new(response).list
196
196
  titles = ["ID","NAME"]
197
197
  methods = [:id,:name]
198
198
  when "groups"
199
199
  response = hue.request_group_list
200
- response.each {|id,value| objects << hue.request_group_info( id )}
200
+ objects = GroupList.new(response).list
201
201
  titles = ["ID","NAME","LIGHTS"]
202
202
  methods = [:id,:name,:lights]
203
203
  when "scenes"
204
204
  response = hue.request_scene_list
205
- response.each {|id,value| objects << Scene.new(id,value)}
205
+ objects = SceneList.new(response).list
206
206
  titles = ["ID","NAME","LIGHTS"]
207
207
  methods = [:id,:name,:lights]
208
208
  when "users"
209
209
  response = hue.request_config
210
- response["whitelist"].each {|id,value| objects << User.new(id,value)}
210
+ objects = UserList.new(response["whitelist"]).list
211
211
  titles = ["ID","NAME","CREATE DATE","LAST USE DATE"]
212
212
  methods = [:id,:name,:create_date,:last_use_date]
213
213
  when "rules"
214
214
  response = hue.request_rules
215
- response.each {|id,value| objects << Rule.new(id,value)}
215
+ objects = RuleList.new(response).list
216
216
  titles = ["ID","NAME"]
217
217
  methods = [:id,:name]
218
218
  when "schedules"
219
219
  response = hue.request_schedules
220
- response.each {|id,value| objects << Schedule.new(id,value)}
220
+ objects = ScheduleList.new(response).list
221
221
  titles = ["ID","NAME","TIME","SCENE","STATUS"]
222
222
  methods = [:id,:name,:time,:scene,:status]
223
223
  when "datastore"
@@ -306,10 +306,6 @@ class LightsCli
306
306
  puts "Must specify a state to set."
307
307
  bad_args = true
308
308
  end
309
- if !options[:lights] && !options[:groups]
310
- puts "Must specify which lights/groups to control."
311
- bad_args = true
312
- end
313
309
  if (options[:hue] || options[:saturation]) \
314
310
  && options[:ct]
315
311
  puts "Cannot set both color temperature and hue/saturation."
@@ -357,9 +353,11 @@ class LightsCli
357
353
  end
358
354
 
359
355
  if options[:lights]
360
- set_bulb_state(s,options[:lights])
356
+ set_bulb_state(s,options[:lights])
361
357
  elsif options[:groups]
362
358
  set_group_state(s,options[:groups])
359
+ else
360
+ set_group_state(s,[0])
363
361
  end
364
362
  end
365
363
 
@@ -398,10 +396,7 @@ private
398
396
  opts.on("-l", "--lights 1,2,...N", Array, "Which lights to control"){|l| options[:lights]=l}
399
397
  end.parse!
400
398
 
401
- if !options[:lights]
402
- puts "Must specify which lights to control."
403
- exit 1
404
- end
399
+ options[:lights] = ["all"] if !options[:lights]
405
400
 
406
401
  s = BulbState.new
407
402
  s.on = is_on
data/lib/lights/bridge.rb CHANGED
@@ -1,8 +1,10 @@
1
- class Bridge
1
+ require 'lights/hobject'
2
2
 
3
- attr_reader :id, :ip, :name, :mac
3
+ class Bridge < HObject
4
4
 
5
+ attr_reader :id, :ip, :name, :mac
5
6
  def initialize(data = {})
7
+ super
6
8
  @id = data["id"]
7
9
  @ip = data["internalipaddress"]
8
10
  @mac = data["macaddress"]
data/lib/lights/bulb.rb CHANGED
@@ -1,17 +1,15 @@
1
1
  require 'lights/bulbstate'
2
+ require 'lights/hobject'
2
3
 
3
- class Bulb
4
-
5
- attr_reader :id, :name, :type, :swversion,
6
- :state
7
-
4
+ class Bulb < HObject
5
+ attr_reader :id, :name, :type, :swversion, :state
8
6
  def initialize(id,data = {})
7
+ super(data)
9
8
  @id = id
10
9
  @name = data["name"]
11
10
  @type = data["type"]
12
11
  @swversion = data["swversion"]
13
12
  @state = BulbState.new data["state"]
14
- @data = data
15
13
  end
16
14
 
17
15
  def data
@@ -22,9 +20,5 @@ class Bulb
22
20
  data["state"] = @state.data if !@state.data.empty?
23
21
  data
24
22
  end
25
-
26
- def to_json(options={})
27
- data.to_json
28
- end
29
23
  end
30
24
 
@@ -1,22 +1,9 @@
1
1
  require 'lights/bulb'
2
+ require 'lights/list'
2
3
 
3
- class BulbList
4
-
5
- attr_reader :bulbs
4
+ class BulbList < List
6
5
  def initialize(data = {})
7
- @bulbs = []
8
- data.each{|id,value| @bulbs << Bulb.new(id,value)} if data
9
- @data = data
10
- end
11
-
12
- def data
13
- data = @data
14
- @bulbs.each {|b| data[b.id] = b.data} if @bulbs
15
- data
16
- end
17
-
18
- def to_json(options={})
19
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << Bulb.new(id,value)} if data
20
8
  end
21
9
  end
22
-
@@ -1,4 +1,6 @@
1
- class BulbState
1
+ require 'lights/hobject'
2
+
3
+ class BulbState < HObject
2
4
 
3
5
  MAX_CT = 500
4
6
  MIN_CT = 153
@@ -42,7 +44,8 @@ class BulbState
42
44
  :alert, :effect, :color_mode,
43
45
  :reachable, :transition_time
44
46
  def initialize( data = {} )
45
- data = {} if data == nil
47
+ data = {} if data == nil
48
+ super
46
49
  @on = data["on"]
47
50
  set_bri data["bri"]
48
51
  set_hue data["hue"]
@@ -54,7 +57,6 @@ class BulbState
54
57
  set_color_mode data["colormode"]
55
58
  @reachable = data["reachable"]
56
59
  set_transition_time data["transitiontime"]
57
- @data = data
58
60
  end
59
61
 
60
62
  def color_mode=(value) set_color_mode(value) end
@@ -184,9 +186,5 @@ class BulbState
184
186
  data["transitiontime"] = @transition_time if @transition_time
185
187
  data
186
188
  end
187
-
188
- def to_json(options={})
189
- data.to_json
190
- end
191
189
  end
192
190
 
@@ -1,10 +1,12 @@
1
- class Command
1
+ require 'lights/hobject'
2
+
3
+ class Command < HObject
2
4
  attr_reader :address, :method, :body
3
5
  def initialize(data = {})
6
+ super
4
7
  @address = data["address"]
5
8
  @body = data["body"]
6
9
  @method = data["method"]
7
- @data = data
8
10
  end
9
11
 
10
12
  def data
@@ -14,10 +16,5 @@ class Command
14
16
  data["method"] = @method if @method
15
17
  data
16
18
  end
17
-
18
- def to_json(options={})
19
- data.to_json
20
- end
21
19
  end
22
20
 
23
-
data/lib/lights/config.rb CHANGED
@@ -1,14 +1,13 @@
1
1
  require 'lights/userlist'
2
+ require 'lights/hobject'
2
3
 
3
- class HueConfig
4
-
4
+ class HueConfig < HObject
5
5
  attr_reader :name, :swversion, :whitelist
6
-
7
6
  def initialize(data = {})
7
+ super
8
8
  @name = data["name"]
9
9
  @swversion = data["swversion"]
10
10
  @whitelist = UserList.new(data["whitelist"])
11
- @data = data
12
11
  end
13
12
 
14
13
  def data
@@ -18,9 +17,5 @@ class HueConfig
18
17
  data["whitelist"] = @whitelist.data if !@whitelist.data.empty?
19
18
  data
20
19
  end
21
-
22
- def to_json(options={})
23
- data.to_json
24
- end
25
20
  end
26
21
 
@@ -5,13 +5,13 @@ require 'lights/scenelist'
5
5
  require 'lights/rulelist'
6
6
  require 'lights/schedulelist'
7
7
  require 'lights/sensorlist'
8
+ require 'lights/hobject'
8
9
 
9
- class Datastore
10
-
10
+ class Datastore < HObject
11
11
  attr_reader :lights, :groups, :config, :rules,
12
12
  :scenes, :schedules, :sensors
13
13
  def initialize(data = {})
14
- @data = {}
14
+ super
15
15
  @lights = BulbList.new(data["lights"])
16
16
  @groups = GroupList.new(data["groups"])
17
17
  @config = HueConfig.new(data["config"])
@@ -22,13 +22,13 @@ class Datastore
22
22
  end
23
23
 
24
24
  def all
25
- @lights.bulbs + \
26
- @groups.groups + \
25
+ @lights.list + \
26
+ @groups.list + \
27
27
  [@config] + \
28
- @schedules.schedules + \
29
- @scenes.scenes + \
30
- @rules.rules + \
31
- @sensors.sensors
28
+ @schedules.list + \
29
+ @scenes.list + \
30
+ @rules.list + \
31
+ @sensors.list
32
32
  end
33
33
 
34
34
  def data
@@ -42,9 +42,5 @@ class Datastore
42
42
  data["sensors"] = @sensors.data if !@sensors.data.empty?
43
43
  data
44
44
  end
45
-
46
- def to_json(options={})
47
- data.to_json
48
- end
49
45
  end
50
46
 
data/lib/lights/group.rb CHANGED
@@ -1,19 +1,16 @@
1
- class Group
1
+ require 'lights/hobject'
2
2
 
3
- attr_reader :id, :data, :name, :lights
4
- attr_writer :name, :lights
3
+ class Group < HObject
4
+ attr_reader :id, :data, :name, :lights, :action
5
+ attr_writer :name, :lights, :action
5
6
  def initialize( id = nil, data = {} )
7
+ super(data)
6
8
  @id = id
7
- @data = data
8
9
  @action = BulbState.new(data["action"])
9
10
  @name = data["name"]
10
11
  @lights = data["lights"]
11
12
  end
12
13
 
13
- def action
14
- @action.data
15
- end
16
-
17
14
  def data
18
15
  data = @data
19
16
  data["name"] = @name if @name
@@ -21,8 +18,4 @@ class Group
21
18
  data["action"] = @action.data if @action.data != {}
22
19
  data
23
20
  end
24
-
25
- def to_json(options={})
26
- data.to_json
27
- end
28
21
  end
@@ -1,22 +1,10 @@
1
1
  require 'lights/group'
2
+ require 'lights/list'
2
3
 
3
- class GroupList
4
-
5
- attr_reader :groups
4
+ class GroupList < List
6
5
  def initialize(data = {})
7
- @groups = []
8
- data.each{|id,value| @groups << Group.new(id,value)} if data
9
- @data = data
10
- end
11
-
12
- def data
13
- data = @data
14
- @groups.each {|g| data[g.id] = g.data} if @groups
15
- data
16
- end
17
-
18
- def to_json(options={})
19
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << Group.new(id,value)} if data
20
8
  end
21
9
  end
22
10
 
@@ -0,0 +1,10 @@
1
+ class HObject
2
+ def initialize(data={})
3
+ @data = data
4
+ end
5
+
6
+ def to_json(options={})
7
+ data.to_json
8
+ end
9
+ end
10
+
@@ -0,0 +1,22 @@
1
+ require 'forwardable'
2
+
3
+ require 'lights/hobject'
4
+
5
+ class List < HObject
6
+ include Enumerable
7
+ extend Forwardable
8
+ def_delegators :@list, :each, :<< ,:+
9
+
10
+ attr_reader :list
11
+ def initialize(data = {})
12
+ super
13
+ @list = []
14
+ end
15
+
16
+ def data
17
+ data = @data
18
+ @list.each {|b| data[b.id] = b.data} if @list
19
+ data
20
+ end
21
+ end
22
+
data/lib/lights/rule.rb CHANGED
@@ -1,9 +1,10 @@
1
- class Rule
1
+ require 'lights/hobject'
2
2
 
3
+ class Rule < HObject
3
4
  attr_reader :id, :data, :name
4
5
  def initialize( id = nil, data = {} )
6
+ super(data)
5
7
  @id = id
6
- @data = data
7
8
  @name = data["name"]
8
9
  end
9
10
 
@@ -12,8 +13,4 @@ class Rule
12
13
  data["name"] = @name if @name
13
14
  data
14
15
  end
15
-
16
- def to_json(options={})
17
- data.to_json
18
- end
19
16
  end
@@ -1,22 +1,10 @@
1
1
  require 'lights/rule'
2
+ require 'lights/list'
2
3
 
3
- class RuleList
4
-
5
- attr_reader :rules
4
+ class RuleList < List
6
5
  def initialize(data = {})
7
- @rules = []
8
- data.each{|id,value| @rules << Rule.new(id,value)} if data
9
- @data = data
10
- end
11
-
12
- def data
13
- data = @data
14
- @rules.each {|b| data[b.id] = b.data} if @rules
15
- data
16
- end
17
-
18
- def to_json(options={})
19
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << Rule.new(id,value)} if data
20
8
  end
21
9
  end
22
10
 
data/lib/lights/scene.rb CHANGED
@@ -1,8 +1,9 @@
1
- class Scene
1
+ require 'lights/hobject'
2
2
 
3
+ class Scene < HObject
3
4
  attr_reader :id, :name, :active, :lights
4
-
5
5
  def initialize(id,data = {})
6
+ super(data)
6
7
  @id = id
7
8
  @name = data["name"]
8
9
  @active = data["active"]
@@ -16,9 +17,5 @@ class Scene
16
17
  data["lights"] = @lights if @lights
17
18
  data
18
19
  end
19
-
20
- def to_json(options={})
21
- data.to_json
22
- end
23
20
  end
24
21
 
@@ -1,22 +1,10 @@
1
1
  require 'lights/scene'
2
+ require 'lights/list'
2
3
 
3
- class SceneList
4
-
5
- attr_reader :scenes
4
+ class SceneList < List
6
5
  def initialize(data = {})
7
- @scenes = []
8
- data.each{|id,value| @scenes << Scene.new(id,value)} if data
9
- @data = data
10
- end
11
-
12
- def data
13
- data = @data
14
- @scenes.each {|b| data[b.id] = b.data} if @scenes
15
- data
16
- end
17
-
18
- def to_json(options={})
19
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << Scene.new(id,value)} if data
20
8
  end
21
9
  end
22
10
 
@@ -1,14 +1,15 @@
1
1
  require 'lights/command'
2
+ require 'lights/hobject'
2
3
 
3
- class Schedule
4
+ class Schedule < HObject
4
5
  attr_reader :id, :name, :time, :status
5
6
  def initialize(id,data = {})
7
+ super(data)
6
8
  @id = id
7
9
  @name = data["name"]
8
10
  @time = data["time"]
9
11
  @status = data["status"]
10
12
  @command = Command.new(data["command"])
11
- @data = data
12
13
  end
13
14
 
14
15
  def scene
@@ -23,9 +24,5 @@ class Schedule
23
24
  data["command"] = @command.data if !@command.data.empty?
24
25
  data
25
26
  end
26
-
27
- def to_json(options={})
28
- data.to_json
29
- end
30
27
  end
31
28
 
@@ -1,22 +1,10 @@
1
1
  require 'lights/schedule'
2
+ require 'lights/list'
2
3
 
3
- class ScheduleList
4
-
5
- attr_reader :schedules
4
+ class ScheduleList < List
6
5
  def initialize(data = {})
7
- @schedules = []
8
- data.each{|id,value| @schedules << Schedule.new(id,value)} if data
9
- @data = data
10
- end
11
-
12
- def data
13
- data = @data
14
- @schedules.each {|s| data[s.id] = s.data} if @schedules
15
- data
16
- end
17
-
18
- def to_json(options={})
19
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << Schedule.new(id,value)} if data
20
8
  end
21
9
  end
22
10
 
data/lib/lights/sensor.rb CHANGED
@@ -1,7 +1,7 @@
1
- class SensorState
2
- attr_reader :data, :last_updated
1
+ class SensorState < HObject
2
+ attr_reader :last_updated
3
3
  def initialize(data)
4
- @data = data
4
+ super
5
5
  @last_updated = data["lastupdated"]
6
6
  end
7
7
 
@@ -10,17 +10,13 @@ class SensorState
10
10
  data["lastupdated"] = @last_updated if @last_updated
11
11
  data
12
12
  end
13
-
14
- def to_json(options={})
15
- data.to_json
16
- end
17
13
  end
18
14
 
19
15
  class TapState < SensorState
20
16
  attr_reader :button_event
21
17
  def initialize(data)
22
- @button_event = data["button_event"]
23
18
  super
19
+ @button_event = data["button_event"]
24
20
  end
25
21
 
26
22
  def data
@@ -28,17 +24,13 @@ class TapState < SensorState
28
24
  data["button_event"] = @button_event if @button_event
29
25
  data
30
26
  end
31
-
32
- def to_json(options={})
33
- data.to_json
34
- end
35
27
  end
36
28
 
37
- class Sensor
29
+ class Sensor < HObject
38
30
  attr_reader :id, :data, :name, :type, :model_id, :manufacturer_name, :unique_id, :sw_version, :state
39
31
  def initialize( id, data = {} )
32
+ super(data)
40
33
  @id = id
41
- @data = data
42
34
  @name = data["name"]
43
35
  @type = data["type"]
44
36
  @model_id = data["modelid"]
@@ -60,8 +52,4 @@ class Sensor
60
52
  data["state"] = @state.data if @state.data if !@state.data.empty?
61
53
  data
62
54
  end
63
-
64
- def to_json(options={})
65
- data.to_json
66
- end
67
55
  end
@@ -1,23 +1,10 @@
1
1
  require 'lights/sensor'
2
+ require 'lights/list'
2
3
 
3
- class SensorList
4
-
5
- attr_reader :sensors
6
-
4
+ class SensorList < List
7
5
  def initialize(data = {})
8
- @sensors = []
9
- data.each{|id,value| @sensors << Sensor.new(id,value)} if data
10
- @data = data
11
- end
12
-
13
- def data
14
- data = @data
15
- @sensors.each {|s| data[s.id] = s.data} if @sensors
16
- data
17
- end
18
-
19
- def to_json(options={})
20
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << Sensor.new(id,value)} if data
21
8
  end
22
9
  end
23
10
 
data/lib/lights/user.rb CHANGED
@@ -1,9 +1,10 @@
1
- class User
1
+ require 'lights/hobject'
2
2
 
3
+ class User < HObject
3
4
  attr_reader :id, :name, :create_date, :last_use_date
4
5
  def initialize( id, data = {} )
6
+ super(data)
5
7
  @id = id
6
- @data = data
7
8
  @name = data["name"]
8
9
  @create_date = data["create date"]
9
10
  @last_use_date = data["last use date"]
@@ -16,8 +17,4 @@ class User
16
17
  data["last use date"] = @last_use_date if @last_use_date
17
18
  data
18
19
  end
19
-
20
- def to_json(options={})
21
- data.to_json
22
- end
23
20
  end
@@ -1,22 +1,10 @@
1
1
  require 'lights/user'
2
+ require 'lights/list'
2
3
 
3
- class UserList
4
-
5
- attr_reader :users
4
+ class UserList < List
6
5
  def initialize(data = {})
7
- @users = []
8
- data.each{|id,value| @users << User.new(id,value)} if data
9
- @data = data
10
- end
11
-
12
- def data
13
- data = @data
14
- @users.each {|u| data[u.id] = u.data} if @users
15
- data
16
- end
17
-
18
- def to_json(options={})
19
- data.to_json
6
+ super
7
+ data.each{|id,value| @list << User.new(id,value)} if data
20
8
  end
21
9
  end
22
10
 
@@ -1,3 +1,3 @@
1
1
  module LightsConst
2
- VERSION = "0.8.13"
2
+ VERSION = "0.8.14"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lights
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.13
4
+ version: 0.8.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brady Turner
@@ -118,6 +118,8 @@ files:
118
118
  - lib/lights/exception.rb
119
119
  - lib/lights/group.rb
120
120
  - lib/lights/grouplist.rb
121
+ - lib/lights/hobject.rb
122
+ - lib/lights/list.rb
121
123
  - lib/lights/loggerconfig.rb
122
124
  - lib/lights/rule.rb
123
125
  - lib/lights/rulelist.rb