saal 0.2.24 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -78,7 +78,7 @@ class TestChartData < Test::Unit::TestCase
78
78
  Time.utc(2012, 3, 25, 23, 59, 59),
79
79
  ["0"]+(2..23).map{|s| s.to_s}+["0"],
80
80
  Time.utc(2012, 3, 25, 23, 59, 59),
81
- "_changing_timezone_test","Europe/Lisbon")
81
+ "_changing_timezone_test2","Europe/Lisbon")
82
82
 
83
83
  assert_alignment_interval(24, :hours, Time.utc(2010, 12, 29, 16, 0, 0),
84
84
  Time.utc(2010, 12, 30, 15, 59, 59),
@@ -16,7 +16,6 @@ class TestChart < Test::Unit::TestCase
16
16
 
17
17
  def test_average
18
18
  name = 'week'
19
- defs = @defs[name]
20
19
  chart = @charts.find(name)
21
20
  assert_equal ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'], chart.periodnames
22
21
  chart.sensors.each {|s| s.mock_set(:average => 1)}
@@ -31,7 +30,6 @@ class TestChart < Test::Unit::TestCase
31
30
 
32
31
  def test_min_max_avg_1arity
33
32
  name = 'week'
34
- defs = @defs[name]
35
33
  chart = @charts.find(name)
36
34
  assert_equal ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'], chart.periodnames
37
35
  v = {:minimum => 1.0, :maximum => 2.0, :average => 1.5}
@@ -43,7 +41,6 @@ class TestChart < Test::Unit::TestCase
43
41
 
44
42
  def test_min_max_0arity
45
43
  name = 'week'
46
- defs = @defs[name]
47
44
  chart = @charts.find(name)
48
45
  assert_equal ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'], chart.periodnames
49
46
  v = {:minimum => 1.0, :maximum => 2.0, :average => 1.5}
@@ -18,7 +18,7 @@ class TestDaemon < Test::Unit::TestCase
18
18
  end
19
19
 
20
20
  db_test_query("SELECT * FROM sensor_reads") do |res|
21
- assert res.num_rows > 0, "No sensor reads in DB"
21
+ assert res.count > 0, "No sensor reads in DB"
22
22
  end
23
23
  end
24
24
 
@@ -38,7 +38,7 @@ class TestDaemon < Test::Unit::TestCase
38
38
  end
39
39
 
40
40
  db_test_query("SELECT * FROM sensor_reads") do |res|
41
- assert res.num_rows == 0
41
+ assert res.count == 0
42
42
  end
43
43
  end
44
44
  end
@@ -9,8 +9,11 @@ class TestFileStore < Test::Unit::TestCase
9
9
  @dbstore.write(:test_sensor, test_time, test_value)
10
10
 
11
11
  db_test_query("SELECT * FROM sensor_reads") do |res|
12
- assert_equal 1, res.num_rows
13
- assert_equal ["test_sensor", test_time.to_s, test_value.to_s], res.fetch_row
12
+ assert_equal 1, res.count
13
+ row = res.first
14
+ assert_equal "test_sensor", row["sensor"]
15
+ assert_equal test_time, row["date"].to_i
16
+ assert_equal test_value, row["value"].to_f
14
17
  end
15
18
  end
16
19
 
@@ -0,0 +1,39 @@
1
+ {
2
+
3
+ "CurrentState": {
4
+
5
+ "Output": [
6
+
7
+ <% (1..16).each do |num| %>
8
+ <% state = outlets[num] %>
9
+ <% val = state == "ON" ? "1" : "0" %>
10
+ <% if num < 16 %>
11
+ {"Name": "RELAY<%= num %>", "Value": "<%= val %>"},
12
+ <% else %>
13
+ {"Name": "RELAY<%= num %>", "Value": "<%= val %>"}
14
+ <% end %>
15
+ <% end %>
16
+
17
+ ],
18
+
19
+ "Auto-reboot": {
20
+
21
+ "RebootsNumber": "0",
22
+
23
+ "LastReboot": "-"
24
+
25
+ },
26
+
27
+ "Device": {
28
+
29
+ "Name": "SMARTDEN_IP-16R",
30
+
31
+ "MAC": "E8:EA:DA:AA:AA:AA"
32
+
33
+ }
34
+
35
+ }
36
+
37
+ }
38
+
39
+
@@ -0,0 +1,212 @@
1
+ require File.dirname(__FILE__)+'/test_helper.rb'
2
+ require 'webrick'
3
+ require 'benchmark'
4
+
5
+ class TestDenkoviRelay < Test::Unit::TestCase
6
+ def setup
7
+ @@serv_num ||= 0
8
+ @@serv_num += 1
9
+
10
+ @og=SAAL::Denkovi::OutletGroup.new(service_opts)
11
+ @vals={1=>"OFF",2=>"OFF",3=>"ON",4=>"OFF",5=>"ON",6=>"ON",7=>"ON",8=>"OFF",
12
+ 9=>"OFF",10=>"OFF",11=>"ON",12=>"OFF",13=>"ON",14=>"ON",15=>"ON",16=>"OFF"}
13
+ @rvals={1=>"ON",2=>"ON",3=>"OFF",4=>"ON",5=>"OFF",6=>"OFF",7=>"OFF",8=>"ON",
14
+ 9=>"ON",10=>"ON",11=>"OFF",12=>"ON",13=>"OFF",14=>"OFF",15=>"OFF",16=>"ON"}
15
+
16
+ defs = YAML::load(File.new(TEST_SENSORS_DENKOVI_FILE))
17
+ @pass = defs["group1"]["denkovi"]["pass"]
18
+ defs['group1']['denkovi']['port'] = service_opts[:port]
19
+ tempfile = Tempfile.new('denkovi_test_yml')
20
+ File.open(tempfile.path,'w') {|f| f.write(YAML::dump defs)}
21
+ @test_sensors_denkovi_file = tempfile.path
22
+ end
23
+
24
+ def service_opts
25
+ base_opts = {:host => 'localhost', :pass =>"somepass"}
26
+ base_opts.merge(:port => 3333+@@serv_num)
27
+ end
28
+
29
+ class BasicServing < WEBrick::HTTPServlet::AbstractServlet
30
+ def self.get_instance(config, opts)
31
+ new(opts)
32
+ end
33
+ def initialize(opts)
34
+ @html = opts[:html]
35
+ @pass = opts[:pass]
36
+ @status = opts[:status] || 200
37
+ @feedback = opts[:feedback] || {}
38
+ @sleep = opts[:sleep] || 0
39
+ end
40
+ def do_GET(req, res)
41
+ sleep @sleep
42
+ @feedback[:uris] ||= []
43
+ @feedback[:uris] << req.request_uri.to_s
44
+ @feedback[:uri] = req.request_uri.to_s
45
+ @feedback[:nrequests] = (@feedback[:nrequests]||0)+1
46
+ res.body = @html
47
+ res.status = @status
48
+ res['Content-Type'] = "text/html"
49
+ end
50
+ end
51
+
52
+ def with_webrick(opts)
53
+ opts = service_opts.merge(opts)
54
+
55
+ Socket.do_not_reverse_lookup = true # Speed up startup
56
+ log = WEBrick::Log.new($stderr, WEBrick::Log::ERROR)
57
+ access_log = [[log, WEBrick::AccessLog::COMBINED_LOG_FORMAT]]
58
+ s = WEBrick::HTTPServer.new(:Port => opts[:port],
59
+ :Logger => log,
60
+ :AccessLog => access_log)
61
+ s.mount('/', BasicServing, opts.merge(:feedback => (f = {})))
62
+
63
+ thread = Thread.new do
64
+ s.start
65
+ end
66
+ while s.status != :Running; sleep 0.1; end # Make sure the server is up
67
+ yield f
68
+ s.shutdown
69
+ thread.exit
70
+ end
71
+
72
+ def create_current_state_json(hash)
73
+ outlets = hash
74
+ erb = ERB.new(File.open(File.dirname(__FILE__)+'/denkovi.json.erb').read)
75
+ erb.result(binding)
76
+ end
77
+
78
+ def assert_path(path, uri)
79
+ assert_equal "http://localhost:#{service_opts[:port]}"+path, uri
80
+ end
81
+
82
+ def test_read_state
83
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
84
+ @vals.each do |num, state|
85
+ assert_equal state, @og.state(num)
86
+ assert_path "/current_state.json?pw=#{@pass}", feedback[:uri]
87
+ end
88
+ end
89
+ end
90
+
91
+ def test_set_state
92
+ with_webrick(:html=>create_current_state_json(@rvals)) do |feedback|
93
+ @vals.each do |num, state|
94
+ newstate = state == "ON" ? "OFF" : "ON"
95
+ val = {"ON" => "1", "OFF" => "0"}[newstate]
96
+ assert @og.set_state(num,newstate), "State change not working"
97
+ assert_path "/current_state.json?pw=#{@pass}&Relay#{num}=#{val}", feedback[:uri]
98
+ end
99
+ end
100
+ end
101
+
102
+ def test_enumerate_sensors
103
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
104
+ assert_equal((1..16).map{|i| "name#{i.to_s.rjust(2, "0")}"}, sensors.map{|s| s.name}.sort)
105
+ assert_equal((1..16).map{|i| "description#{i.to_s.rjust(2, "0")}"}, sensors.map{|s| s.description}.sort)
106
+ end
107
+
108
+ def test_sensor_type
109
+ SAAL::Sensors.new(TEST_SENSORS_DENKOVI_FILE, TEST_DBCONF).each do |s|
110
+ assert_equal :onoff, s.sensor_type
111
+ end
112
+ end
113
+
114
+ def test_read_sensors
115
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
116
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
117
+ @vals.each do |num, state|
118
+ value = state == "ON" ? 1.0 : 0.0
119
+ assert_equal value, sensors.send('name'+num.to_s.rjust(2, "0")).read
120
+ assert_path "/current_state.json?pw=#{@pass}", feedback[:uri]
121
+ end
122
+ assert_equal 1, feedback[:nrequests], "denkovi request caching not working"
123
+ end
124
+ end
125
+
126
+ def test_set_sensors
127
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
128
+ with_webrick(:html=>create_current_state_json(@rvals)) do |feedback|
129
+ @vals.each do |num, state|
130
+ newval = state == "ON" ? 0.0 : 1.0
131
+ newstate = state == "ON" ? "OFF" : "ON"
132
+ assert_equal newval, sensors.send('name'+num.to_s.rjust(2, "0")).write(newval),
133
+ "State change not working"
134
+ val = {"ON" => "1", "OFF" => "0"}[newstate]
135
+ assert_path "/current_state.json?pw=#{@pass}&Relay#{num}=#{val}", feedback[:uris][-2]
136
+ assert_path "/current_state.json?pw=#{@pass}", feedback[:uris][-1]
137
+ end
138
+ end
139
+ end
140
+
141
+ # Test that write invalidates any caching
142
+ def test_write_read_sensors
143
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
144
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
145
+ @vals.each do |num, state|
146
+ sensors.send('name'+num.to_s.rjust(2, "0")).write(0.0)
147
+ sensors.send('name'+num.to_s.rjust(2, "0")).read
148
+ end
149
+ assert_equal 32, feedback[:nrequests], "denkovi caching too much"
150
+ end
151
+ end
152
+
153
+ # Test that the cache times out
154
+ def test_cache_invalidation
155
+ _sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
156
+ @og.cache_timeout = 0.1
157
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
158
+ @og.state(1)
159
+ sleep 0.2
160
+ @og.state(1)
161
+ assert_equal 2, feedback[:nrequests], "denkovi caching not invalidating"
162
+ end
163
+ end
164
+
165
+ def test_failed_connection
166
+ @vals.each do |num, state|
167
+ assert_equal nil, @og.state(num)
168
+ assert !@og.set_state(num,"ON"), "State change working without a server?!"
169
+ end
170
+ end
171
+
172
+ def test_failed_request
173
+ with_webrick(:html=>create_current_state_json(@vals),:status=>404) do |feedback|
174
+ @vals.each do |num, state|
175
+ assert_equal nil, @og.state(num)
176
+ assert !@og.set_state(num,"ON"), "State change working without a server?!"
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_fast_open_timeout
182
+ #FIXME: Find a way to make this test address more generic
183
+ @og=SAAL::Denkovi::OutletGroup.new(service_opts.merge(:host => "10.254.254.254",
184
+ :timeout=>0.1))
185
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
186
+ time = Benchmark.measure do
187
+ @vals.each do |num, state|
188
+ assert_equal nil, @og.state(num), "Read not timing out?"
189
+ assert !@og.set_state(num,"ON"), "State change not timing out?"
190
+ end
191
+ end
192
+ total_time = @og.timeout*2*@vals.keys.size
193
+ assert time.total < total_time
194
+ "Doing the reads took too long, are we really timing out?"
195
+ end
196
+ end
197
+
198
+ def test_fast_read_timeout
199
+ @og=SAAL::Denkovi::OutletGroup.new(service_opts.merge(:timeout=>0.1))
200
+ with_webrick(:html=>create_current_state_json(@vals),:sleep=>10) do |feedback|
201
+ time = Benchmark.measure do
202
+ @vals.each do |num, state|
203
+ assert_equal nil, @og.state(num), "Read not timing out?"
204
+ assert !@og.set_state(num,"ON"), "State change not timing out?"
205
+ end
206
+ end
207
+ total_time = @og.timeout*2*@vals.keys.size
208
+ assert time.total < total_time
209
+ "Doing the reads took too long, are we really timing out?"
210
+ end
211
+ end
212
+ end
@@ -151,7 +151,7 @@ class TestDINRelay < Test::Unit::TestCase
151
151
 
152
152
  # Test that the cache times out
153
153
  def test_cache_invalidation
154
- sensors = SAAL::Sensors.new(@test_sensors_dinrelay_file, TEST_DBCONF)
154
+ _sensors = SAAL::Sensors.new(@test_sensors_dinrelay_file, TEST_DBCONF)
155
155
  @og.cache_timeout = 0.1
156
156
  with_webrick(:html=>create_index_html(@vals)) do |feedback|
157
157
  @og.state(1)
@@ -67,11 +67,11 @@ class TestSensors < Test::Unit::TestCase
67
67
  end
68
68
 
69
69
  db_test_query("SELECT * FROM sensor_reads") do |res|
70
- assert_equal 1, res.num_rows
71
- row = res.fetch_row
72
- assert_equal "fake_temp", row[0]
73
- assert_in_delta Time.now.utc.to_i, row[1].to_i, 100
74
- assert_instance_of Float, row[2].to_f
70
+ assert_equal 1, res.count
71
+ row = res.first
72
+ assert_equal "fake_temp", row["sensor"]
73
+ assert_in_delta Time.now.utc.to_i, row["date"].to_i, 100
74
+ assert_instance_of Float, row["value"].to_f
75
75
  end
76
76
  end
77
77
  end
@@ -1,4 +1,4 @@
1
1
  host: localhost
2
- user: sensor_reads
3
- pass: password
4
- db: sensor_reads_test
2
+ username: sensor_reads
3
+ password: password
4
+ database: sensor_reads_test
@@ -0,0 +1,39 @@
1
+ group1:
2
+ denkovi:
3
+ host: localhost
4
+ port: 33333
5
+ pass: somepass
6
+ outlets:
7
+ 1: name01
8
+ 2: name02
9
+ 3: name03
10
+ 4: name04
11
+ 5: name05
12
+ 6: name06
13
+ 7: name07
14
+ 8: name08
15
+ 9: name09
16
+ 10: name10
17
+ 11: name11
18
+ 12: name12
19
+ 13: name13
20
+ 14: name14
21
+ 15: name15
22
+ 16: name16
23
+ descriptions:
24
+ 1: description01
25
+ 2: description02
26
+ 3: description03
27
+ 4: description04
28
+ 5: description05
29
+ 6: description06
30
+ 7: description07
31
+ 8: description08
32
+ 9: description09
33
+ 10: description10
34
+ 11: description11
35
+ 12: description12
36
+ 13: description13
37
+ 14: description14
38
+ 15: description15
39
+ 16: description16
@@ -6,6 +6,7 @@ require File.dirname(__FILE__)+'/../lib/saal.rb'
6
6
  class Test::Unit::TestCase
7
7
  TEST_SENSORS_FILE = File.dirname(__FILE__)+'/test_sensors.yml'
8
8
  TEST_SENSORS_DINRELAY_FILE = File.dirname(__FILE__)+'/test_dinrelay_sensors.yml'
9
+ TEST_SENSORS_DENKOVI_FILE = File.dirname(__FILE__)+'/test_denkovi_sensors.yml'
9
10
  TEST_SENSOR_CLEANUPS_FILE = File.dirname(__FILE__)+'/test_sensor_cleanups.yml'
10
11
  TEST_NONEXIST_SENSOR_FILE = File.dirname(__FILE__)+'/nonexistant_sensor.yml'
11
12
  TEST_CHARTS_FILE = File.dirname(__FILE__)+'/test_charts.yml'
@@ -29,8 +30,7 @@ class Test::Unit::TestCase
29
30
  end
30
31
 
31
32
  def db_test_query(query)
32
- db = Mysql.new(TEST_DBOPTS['host'],TEST_DBOPTS['user'],
33
- TEST_DBOPTS['pass'],TEST_DBOPTS['db'])
33
+ db = Mysql2::Client.new(TEST_DBOPTS)
34
34
  res = db.query(query)
35
35
  yield res
36
36
  db.close
@@ -1,7 +1,7 @@
1
1
  fake_temp:
2
2
  name: "A fake temperature sensor"
3
3
  onewire:
4
- serial: /10.4AEC29CDBAAB/temperature
4
+ serial: /10.67C6697351FF/temperature
5
5
 
6
6
  non_existant:
7
7
  name: "A non-existant sensor"
metadata CHANGED
@@ -1,63 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.24
5
- prerelease:
4
+ version: 0.3.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Pedro Côrte-Real
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-11-23 00:00:00.000000000 Z
11
+ date: 2020-12-28 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ownet
16
- requirement: &74238440 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 0.2.1
19
+ version: '0.2'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *74238440
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mysql2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.5'
25
41
  - !ruby/object:Gem::Dependency
26
42
  name: nokogiri
27
- requirement: &74238180 !ruby/object:Gem::Requirement
28
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
29
44
  requirements:
30
- - - ! '>='
45
+ - - "~>"
31
46
  - !ruby/object:Gem::Version
32
- version: '0'
47
+ version: '1.8'
33
48
  type: :runtime
34
49
  prerelease: false
35
- version_requirements: *74238180
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
36
55
  - !ruby/object:Gem::Dependency
37
- name: mysql
38
- requirement: &74237790 !ruby/object:Gem::Requirement
39
- none: false
56
+ name: net-http-digest_auth
57
+ requirement: !ruby/object:Gem::Requirement
40
58
  requirements:
41
- - - ! '>='
59
+ - - "~>"
42
60
  - !ruby/object:Gem::Version
43
- version: '0'
61
+ version: '1.4'
44
62
  type: :runtime
45
63
  prerelease: false
46
- version_requirements: *74237790
47
- description: ! "A daemon and libraries to create an abstraction layer that interfaces
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.4'
69
+ description: "A daemon and libraries to create an abstraction layer that interfaces
48
70
  with \nsensors and actuators, recording their state, responding to requests \nfor
49
71
  current and historical values, and allowing changes of state.\n"
50
72
  email: pedro@pedrocr.net
51
73
  executables:
52
- - saal_chart~
53
74
  - dinrelaystatus
54
- - saal_readall
55
- - saal_dump_database
56
- - saal_daemon
57
- - saal_chart
58
- - saal_daemon~
59
75
  - dinrelayset
60
76
  - saal_import_mysql
77
+ - saal_dump_database
78
+ - saal_readall
79
+ - saal_denkovi_relays
80
+ - saal_chart
81
+ - saal_daemon
82
+ - saal_envoy_generate_config
83
+ - saal_envoy_read
61
84
  extensions: []
62
85
  extra_rdoc_files:
63
86
  - README.rdoc
@@ -72,7 +95,10 @@ files:
72
95
  - bin/dinrelaystatus
73
96
  - bin/saal_chart
74
97
  - bin/saal_daemon
98
+ - bin/saal_denkovi_relays
75
99
  - bin/saal_dump_database
100
+ - bin/saal_envoy_generate_config
101
+ - bin/saal_envoy_read
76
102
  - bin/saal_import_mysql
77
103
  - bin/saal_readall
78
104
  - lib/chart.rb
@@ -80,7 +106,10 @@ files:
80
106
  - lib/charts.rb
81
107
  - lib/daemon.rb
82
108
  - lib/dbstore.rb
109
+ - lib/denkovi.rb
83
110
  - lib/dinrelay.rb
111
+ - lib/envoy.rb
112
+ - lib/http.rb
84
113
  - lib/outliercache.rb
85
114
  - lib/owsensor.rb
86
115
  - lib/saal.rb
@@ -92,6 +121,8 @@ files:
92
121
  - test/charts_test.rb
93
122
  - test/daemon_test.rb
94
123
  - test/dbstore_test.rb
124
+ - test/denkovi.json.erb
125
+ - test/denkovi_test.rb
95
126
  - test/dinrelay.html.erb
96
127
  - test/dinrelay_test.rb
97
128
  - test/nonexistant_sensor.yml
@@ -100,38 +131,36 @@ files:
100
131
  - test/sensors_test.rb
101
132
  - test/test_charts.yml
102
133
  - test/test_db.yml
134
+ - test/test_denkovi_sensors.yml
103
135
  - test/test_dinrelay_sensors.yml
104
136
  - test/test_helper.rb
105
137
  - test/test_sensor_cleanups.yml
106
138
  - test/test_sensors.yml
107
- - bin/saal_chart~
108
- - bin/saal_daemon~
109
139
  homepage: https://github.com/pedrocr/saal
110
- licenses: []
111
- post_install_message:
140
+ licenses:
141
+ - LGPL-2.1
142
+ metadata: {}
143
+ post_install_message:
112
144
  rdoc_options:
113
- - -S
114
- - -w 2
115
- - -N
116
- - -c utf8
145
+ - "-S"
146
+ - "-w 2"
147
+ - "-N"
148
+ - "-c utf8"
117
149
  require_paths:
118
150
  - lib
119
151
  required_ruby_version: !ruby/object:Gem::Requirement
120
- none: false
121
152
  requirements:
122
- - - ! '>='
153
+ - - ">="
123
154
  - !ruby/object:Gem::Version
124
155
  version: '0'
125
156
  required_rubygems_version: !ruby/object:Gem::Requirement
126
- none: false
127
157
  requirements:
128
- - - ! '>='
158
+ - - ">="
129
159
  - !ruby/object:Gem::Version
130
160
  version: '0'
131
161
  requirements: []
132
- rubyforge_project:
133
- rubygems_version: 1.8.11
134
- signing_key:
162
+ rubygems_version: 3.1.2
163
+ signing_key:
135
164
  specification_version: 2
136
165
  summary: Thin abstraction layer for interfacing and recording sensors (currently onewire)
137
166
  and actuators (currently dinrelay)
@@ -141,6 +170,7 @@ test_files:
141
170
  - test/charts_test.rb
142
171
  - test/daemon_test.rb
143
172
  - test/dbstore_test.rb
173
+ - test/denkovi_test.rb
144
174
  - test/dinrelay_test.rb
145
175
  - test/outliercache_test.rb
146
176
  - test/sensor_test.rb