rupower 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|