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 ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *~
6
+ .idea/
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in battery_linux.gemspec
4
+ gemspec
5
+
6
+ group :test, :development do
7
+ gem 'rake'
8
+ gem 'turn', :require => false
9
+ end
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,10 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs += ["lib"]
6
+ t.pattern = 'test/*_test.rb'
7
+ t.verbose = true
8
+ end
9
+
10
+ task :default => :test
@@ -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
@@ -0,0 +1,3 @@
1
+ module Rupower
2
+ VERSION = "0.1.2"
3
+ 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,7 @@
1
+ native-path: /sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:09/PNP0C09:00/ACPI0003:00/power_supply/AC
2
+ power supply: yes
3
+ updated: Sat Mar 24 23:47:24 2012 (79753 seconds ago)
4
+ has history: no
5
+ has statistics: no
6
+ line-power
7
+ online: yes
@@ -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
@@ -0,0 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ #load all tests
4
+ Dir.glob( './**/*_test.rb' ).each { |test_file| require test_file }
@@ -0,0 +1,9 @@
1
+ class CommandStub
2
+ def line_ac
3
+ File.read( File.dirname( __FILE__ ) + '/../fixtures/upower_line_ac.txt' )
4
+ end
5
+
6
+ def battery
7
+ File.read( File.dirname( __FILE__ ) + '/../fixtures/upower_battery.txt' )
8
+ end
9
+ 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