rupower 0.1.2
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/.gitignore +6 -0
- data/Gemfile +9 -0
- data/README.md +40 -0
- data/Rakefile +10 -0
- data/lib/rupower/command.rb +16 -0
- data/lib/rupower/version.rb +3 -0
- data/lib/rupower.rb +125 -0
- data/rupower.gemspec +21 -0
- data/test/acceptance/rupower_test.rb +41 -0
- data/test/fixtures/upower_battery.txt +21 -0
- data/test/fixtures/upower_line_ac.txt +7 -0
- data/test/functional/rupower_battery_test.rb +97 -0
- data/test/functional/rupower_line_ac_test.rb +40 -0
- data/test/rupower_test.rb +4 -0
- data/test/stubs/command_stub.rb +9 -0
- metadata +71 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Rupower
|
2
|
+
|
3
|
+
Ruby interface to [UPower] tool available by default on Ubuntu and Debian distros.
|
4
|
+
|
5
|
+
## Example
|
6
|
+
|
7
|
+
battery = Rupower::Battery.new
|
8
|
+
battery.serial # => 5981
|
9
|
+
battery.voltage # => 12.15 # [V]
|
10
|
+
battery.energy_rate: # => 18.97 # [W]
|
11
|
+
percentage: # => 77.36 # [%]
|
12
|
+
capacity: # => 100 # [%]
|
13
|
+
technology: # => 'lithium-ion'
|
14
|
+
|
15
|
+
See the UPower documentation for full list of parameters that can be used as methods, or look at the
|
16
|
+
acceptance tests.
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Add this to your Gemfile:
|
21
|
+
|
22
|
+
gem 'rupower'
|
23
|
+
|
24
|
+
Then run:
|
25
|
+
|
26
|
+
bundle
|
27
|
+
|
28
|
+
## Requirements
|
29
|
+
|
30
|
+
* Ruby >= 1.9.2
|
31
|
+
|
32
|
+
## Running tests
|
33
|
+
|
34
|
+
bundle exec rake test
|
35
|
+
|
36
|
+
## License
|
37
|
+
|
38
|
+
Released under the MIT license. Copyright (C) 2012 Karol Nowicki
|
39
|
+
|
40
|
+
[UPower]: http://upower.freedesktop.org
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Rupower
|
2
|
+
class Command
|
3
|
+
def battery
|
4
|
+
upower( "/org/freedesktop/UPower/devices/battery_BAT0" )
|
5
|
+
end
|
6
|
+
|
7
|
+
def line_ac
|
8
|
+
upower( "/org/freedesktop/UPower/devices/line_power_AC" )
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def upower( device )
|
13
|
+
`upower -i #{device}`
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/rupower.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require "date"
|
2
|
+
require_relative "rupower/version"
|
3
|
+
|
4
|
+
module Rupower
|
5
|
+
|
6
|
+
module Parser
|
7
|
+
VALUE = Regexp.new( /(([0-9]{1,5}([.][0-9]{1,5}){0,1}).*|((\S)+))$/ )
|
8
|
+
TIME = Regexp.new( /\s+\([\s\w]*\)/ )
|
9
|
+
NUMBER = Regexp.new( /\A[+-]?\d+?(\.\d+)?\Z/ )
|
10
|
+
UNITS = Regexp.new( /(( .{1,2})|(%))$/ )
|
11
|
+
AFTER_KEY = Regexp.new( /\s*:\s+[\s\S]+$/ )
|
12
|
+
PARAGRAPH = Regexp.new( /^\s+/ )
|
13
|
+
VALUABLE = Regexp.new( /\w+:\s+\S+/ )
|
14
|
+
end
|
15
|
+
|
16
|
+
class PowerDevice
|
17
|
+
def initialize( params = {refresh_always:true} )
|
18
|
+
@refresh_always = params[:refresh_always]
|
19
|
+
@command = params[:command] || Command.new
|
20
|
+
refresh
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_all
|
24
|
+
refresh if @refresh_always
|
25
|
+
get_hash
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def sym_gsub( sym, before, after )
|
30
|
+
sym.to_s.gsub( before, after ).to_sym
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_hash
|
34
|
+
@state.each_line.inject( {} ) do |hash, line|
|
35
|
+
key = line.gsub( Parser::AFTER_KEY, "" ).gsub( Parser::PARAGRAPH, "" ).to_sym
|
36
|
+
line[Parser::VALUABLE] ? hash.merge( key => get_value( line ) ) : hash
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_value( line )
|
41
|
+
typize( line[Parser::VALUE].gsub( Parser::UNITS, "" ) )
|
42
|
+
end
|
43
|
+
|
44
|
+
def typize( value )
|
45
|
+
res = value
|
46
|
+
res = value[/^yes$/] ? true : false if value[/^(yes|no)$/]
|
47
|
+
res = to_number( value ) if number?( value )
|
48
|
+
res = to_datetime( value ) if time?( value )
|
49
|
+
res
|
50
|
+
end
|
51
|
+
|
52
|
+
def time?( value )
|
53
|
+
value.match( Parser::TIME )
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_datetime( value )
|
57
|
+
DateTime.parse( value )
|
58
|
+
end
|
59
|
+
|
60
|
+
def number?( value )
|
61
|
+
value.match( Parser::NUMBER ) == nil ? false : true
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_number( value )
|
65
|
+
value.to_f == value.to_i ? value.to_i : value.to_f
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Battery < PowerDevice
|
70
|
+
METHODS = [:native_path, :vendor, :model, :serial, :power_supply, :updated,
|
71
|
+
:has_history, :has_statistics, :present, :rechargeable, :state,
|
72
|
+
:energy, :energy_empty, :energy_full, :energy_full_design,
|
73
|
+
:energy_rate, :voltage, :percentage, :capacity, :technology]
|
74
|
+
|
75
|
+
METHODS.each do |method|
|
76
|
+
define_method method do
|
77
|
+
p method
|
78
|
+
name_v1 = sym_gsub( method, '_', '-' )
|
79
|
+
name_v2 = sym_gsub( method, '_', ' ' )
|
80
|
+
get_all[ name_v1 ] || get_all[ name_v2 ]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def refresh()
|
85
|
+
@state = @command.battery
|
86
|
+
end
|
87
|
+
|
88
|
+
def charging?
|
89
|
+
get_all[:state]["discharging"] ? false : true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class LineAc < PowerDevice
|
94
|
+
METHODS = [:native_path, :power_supply, :updated, :has_history, :has_statistics, :online]
|
95
|
+
|
96
|
+
METHODS.each do |method|
|
97
|
+
define_method method do
|
98
|
+
p method
|
99
|
+
name_v1 = sym_gsub( method, '_', '-' )
|
100
|
+
name_v2 = sym_gsub( method, '_', ' ' )
|
101
|
+
get_all[ name_v1 ] || get_all[ name_v2 ]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def refresh
|
106
|
+
@state = @command.line_ac
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Command
|
111
|
+
def battery
|
112
|
+
upower( "/org/freedesktop/UPower/devices/battery_BAT0" )
|
113
|
+
end
|
114
|
+
|
115
|
+
def line_ac
|
116
|
+
upower( "/org/freedesktop/UPower/devices/line_power_AC" )
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
def upower( device )
|
121
|
+
`upower -i #{device}`
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
data/rupower.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "rupower/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "rupower"
|
7
|
+
s.version = Rupower::VERSION
|
8
|
+
s.authors = ["k-nowicki"]
|
9
|
+
s.email = ["karol@knowicki.pl"]
|
10
|
+
s.homepage = "https://github.com/k-nowicki/rupower"
|
11
|
+
s.summary = %q{Rupower is UPower (http://upower.freedesktop.org) interface for Ruby.}
|
12
|
+
s.description = %q{Rupower is UPower (http://upower.freedesktop.org) interface for Ruby, working for Battery and AC supply.
|
13
|
+
The main use case is to get all information providing by appropriate UPower service as parsed, hard typing hash.}
|
14
|
+
s.required_ruby_version = '>= 1.9.2'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path( "../../../lib/rupower", __FILE__ )
|
2
|
+
require 'test/unit'
|
3
|
+
require "turn"
|
4
|
+
|
5
|
+
|
6
|
+
class RupowerTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@battery = Rupower::Battery.new
|
10
|
+
@line_ac = Rupower::LineAc.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_get_all_returns_correct_hash
|
14
|
+
assert_instance_of( Hash, @battery.get_all )
|
15
|
+
assert_instance_of( Hash, @line_ac.get_all )
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_charging_returns_boolean_value
|
19
|
+
assert( @battery.charging? || !@battery.charging? )
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_battery_get_methods_returns_correct_values
|
23
|
+
assert_instance_of( Float, @battery.voltage )
|
24
|
+
assert_instance_of( String, @battery.vendor )
|
25
|
+
assert_instance_of( String, @battery.native_path )
|
26
|
+
assert_instance_of( DateTime, @battery.updated )
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_line_ac_get_methods_returns_correct_values
|
30
|
+
assert_instance_of( FalseClass, @line_ac.has_history )
|
31
|
+
assert_instance_of( String, @line_ac.native_path )
|
32
|
+
assert_instance_of( DateTime, @line_ac.updated )
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_battery_raise_no_method_error_given_invalid_method
|
36
|
+
assert_raise NoMethodError do
|
37
|
+
@battery.undefined_method
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
native-path: /sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:09/PNP0C09:00/PNP0C0A:00/power_supply/BAT0
|
2
|
+
vendor: SONY
|
3
|
+
model: 42T4795
|
4
|
+
serial: 6804
|
5
|
+
power supply: yes
|
6
|
+
updated: Sun Mar 25 22:56:15 2012 (22 seconds ago)
|
7
|
+
has history: yes
|
8
|
+
has statistics: yes
|
9
|
+
battery
|
10
|
+
present: yes
|
11
|
+
rechargeable: yes
|
12
|
+
state: fully-charged
|
13
|
+
energy: 62.9532 Wh
|
14
|
+
energy-empty: 0 Wh
|
15
|
+
energy-full: 63.8928 Wh
|
16
|
+
energy-full-design: 60.6528 Wh
|
17
|
+
energy-rate: 0 W
|
18
|
+
voltage: 12.187 V
|
19
|
+
percentage: 98.5294%
|
20
|
+
capacity: 100%
|
21
|
+
technology: lithium-ion
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.expand_path( "../../../lib/rupower", __FILE__ )
|
2
|
+
require File.expand_path( "../../stubs/command_stub", __FILE__ )
|
3
|
+
require 'test/unit'
|
4
|
+
require "turn"
|
5
|
+
|
6
|
+
|
7
|
+
class RupowerBatteryTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@battery = Rupower::Battery.new( :command => CommandStub.new )
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_native_path_returns_correct_value
|
14
|
+
assert_equal(
|
15
|
+
"/sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:09/PNP0C09:00/PNP0C0A:00/power_supply/BAT0",
|
16
|
+
@battery.native_path )
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_vendor_returns_correct_value
|
20
|
+
assert_equal( "SONY", @battery.vendor )
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_model_returns_correct_value
|
24
|
+
assert_equal( "42T4795", @battery.model )
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_serial_returns_correct_value
|
28
|
+
assert_equal( 6804, @battery.serial )
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_power_supply_returns_correct_value
|
32
|
+
assert_equal( true, @battery.power_supply )
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_updated_returns_correct_value
|
36
|
+
assert_equal( DateTime.parse("Sun Mar 25 20:12:15 2012"), @battery.updated )
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_has_history_returns_correct_value
|
40
|
+
assert_equal( true, @battery.has_history )
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_has_statistics_returns_correct_value
|
44
|
+
assert_equal( true, @battery.has_statistics )
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_present_returns_correct_value
|
48
|
+
assert_equal( true, @battery.present )
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_rechargeable_returns_correct_value
|
52
|
+
assert_equal( true, @battery.rechargeable )
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_state_returns_correct_value
|
56
|
+
assert_equal( "fully-charged", @battery.state )
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_energy_returns_correct_value
|
60
|
+
assert_equal( 62.9532, @battery.energy )
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def test_energy_empty_returns_correct_value
|
65
|
+
assert_equal( 0, @battery.energy_empty )
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_energy_full_returns_correct_value
|
69
|
+
assert_equal( 63.8928, @battery.energy_full )
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_energy_full_design_returns_correct_value
|
73
|
+
assert_equal( 60.6528, @battery.energy_full_design )
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_energy_rate_returns_correct_value
|
77
|
+
assert_equal( 0, @battery.energy_rate )
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_voltage_returns_correct_value
|
81
|
+
assert_equal( 12.187, @battery.voltage )
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_percentage_returns_correct_value
|
85
|
+
assert_equal( 98.5294, @battery.percentage )
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_capacity_returns_correct_value
|
89
|
+
assert_equal( 100, @battery.capacity )
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_technology_returns_correct_value
|
93
|
+
assert_equal( "lithium-ion", @battery.technology )
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path( "../../../lib/rupower", __FILE__ )
|
2
|
+
require 'test/unit'
|
3
|
+
require "turn"
|
4
|
+
|
5
|
+
|
6
|
+
class RupowerLineAcTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@line_ac = Rupower::LineAc.new( :command => CommandStub.new )
|
10
|
+
end
|
11
|
+
|
12
|
+
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
13
|
+
|
14
|
+
def test_native_path_returns_correct_value
|
15
|
+
assert_equal(
|
16
|
+
"/sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:09/PNP0C09:00/ACPI0003:00/power_supply/AC",
|
17
|
+
@line_ac.native_path )
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_power_supply_returns_correct_value
|
21
|
+
assert_equal( true, @line_ac.power_supply )
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_updated_returns_correct_value
|
25
|
+
assert_equal( DateTime.parse("Sat Mar 24 20:12:24 2012"), @line_ac.updated )
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_has_history_returns_correct_value
|
29
|
+
assert_equal( false, @line_ac.has_history )
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_has_statistics_returns_correct_value
|
33
|
+
assert_equal( false, @line_ac.has_statistics )
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_online_returns_correct_value
|
37
|
+
assert_equal( true, @line_ac.online )
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rupower
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- k-nowicki
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-26 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! 'Rupower is UPower (http://upower.freedesktop.org) interface for Ruby,
|
15
|
+
working for Battery and AC supply.
|
16
|
+
|
17
|
+
The main use case is to get all information providing by appropriate UPower service
|
18
|
+
as parsed, hard typing hash.'
|
19
|
+
email:
|
20
|
+
- karol@knowicki.pl
|
21
|
+
executables: []
|
22
|
+
extensions: []
|
23
|
+
extra_rdoc_files: []
|
24
|
+
files:
|
25
|
+
- .gitignore
|
26
|
+
- Gemfile
|
27
|
+
- README.md
|
28
|
+
- Rakefile
|
29
|
+
- lib/rupower.rb
|
30
|
+
- lib/rupower/command.rb
|
31
|
+
- lib/rupower/version.rb
|
32
|
+
- rupower.gemspec
|
33
|
+
- test/acceptance/rupower_test.rb
|
34
|
+
- test/fixtures/upower_battery.txt
|
35
|
+
- test/fixtures/upower_line_ac.txt
|
36
|
+
- test/functional/rupower_battery_test.rb
|
37
|
+
- test/functional/rupower_line_ac_test.rb
|
38
|
+
- test/rupower_test.rb
|
39
|
+
- test/stubs/command_stub.rb
|
40
|
+
homepage: https://github.com/k-nowicki/rupower
|
41
|
+
licenses: []
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 1.9.2
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.8.17
|
61
|
+
signing_key:
|
62
|
+
specification_version: 3
|
63
|
+
summary: Rupower is UPower (http://upower.freedesktop.org) interface for Ruby.
|
64
|
+
test_files:
|
65
|
+
- test/acceptance/rupower_test.rb
|
66
|
+
- test/fixtures/upower_battery.txt
|
67
|
+
- test/fixtures/upower_line_ac.txt
|
68
|
+
- test/functional/rupower_battery_test.rb
|
69
|
+
- test/functional/rupower_line_ac_test.rb
|
70
|
+
- test/rupower_test.rb
|
71
|
+
- test/stubs/command_stub.rb
|