AXElements 1.0.0.alpha11 → 1.0.0.beta
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/History.markdown +11 -1
- data/README.markdown +10 -8
- data/Rakefile +1 -1
- data/lib/accessibility/dsl.rb +5 -2
- data/lib/accessibility/factory.rb +134 -78
- data/lib/accessibility/qualifier.rb +2 -0
- data/lib/accessibility/system_info.rb +82 -17
- data/lib/accessibility/translator.rb +17 -17
- data/lib/accessibility/version.rb +1 -1
- data/lib/ax/application.rb +11 -16
- data/lib/ax/element.rb +21 -34
- data/lib/ax/systemwide.rb +2 -2
- data/lib/ax_elements.rb +7 -1
- data/lib/ax_elements/active_support_selections.rb +10 -0
- data/lib/ax_elements/mri.rb +57 -0
- data/lib/ax_elements/nsarray_compat.rb +97 -17
- data/rakelib/gem.rake +12 -3
- data/rakelib/test.rake +0 -6
- data/test/helper.rb +10 -20
- data/test/integration/accessibility/test_dsl.rb +6 -14
- data/test/integration/accessibility/test_enumerators.rb +0 -1
- data/test/integration/accessibility/test_graph.rb +1 -0
- data/test/integration/accessibility/test_qualifier.rb +2 -2
- data/test/integration/ax/test_application.rb +2 -2
- data/test/sanity/accessibility/test_factory.rb +2 -2
- data/test/sanity/accessibility/test_pretty_printer.rb +2 -2
- data/test/sanity/ax/test_application.rb +1 -1
- data/test/sanity/ax/test_element.rb +2 -2
- data/test/sanity/ax_elements/test_nsobject_inspect.rb +4 -2
- metadata +28 -36
- data/ext/accessibility/core/core.c +0 -26
- data/lib/accessibility/core.rb +0 -943
- data/lib/accessibility/highlighter.rb +0 -86
- data/lib/accessibility/statistics.rb +0 -57
- data/lib/ax_elements/core_graphics_workaround.rb +0 -7
- data/lib/ax_elements/vendor/inflection_data.rb +0 -66
- data/lib/ax_elements/vendor/inflections.rb +0 -176
- data/lib/ax_elements/vendor/inflector.rb +0 -306
- data/lib/minitest/ax_elements.rb +0 -180
- data/lib/rspec/expectations/ax_elements.rb +0 -234
- data/test/integration/accessibility/test_core.rb +0 -18
- data/test/integration/minitest/test_ax_elements.rb +0 -89
- data/test/integration/rspec/expectations/test_ax_elements.rb +0 -102
- data/test/sanity/accessibility/test_highlighter.rb +0 -56
- data/test/sanity/accessibility/test_statistics.rb +0 -57
- data/test/sanity/minitest/test_ax_elements.rb +0 -17
- data/test/sanity/rspec/expectations/test_ax_elements.rb +0 -15
- data/test/test_core.rb +0 -454
data/History.markdown
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# 1.0.0
|
2
2
|
|
3
|
+
* AXElements can now run on MRI as well as MacRuby
|
4
|
+
|
5
|
+
* Added `NSScreen.wakeup` to the `NSScreen` class to wake up sleeping displays
|
3
6
|
* Added `Accessibility::SystemInfo` for getting information about the running system
|
7
|
+
- Added a `Battery` module for querying information about the battery status
|
4
8
|
* Added `DSL#record` to run a screen recording of the given block (actual video!)
|
5
9
|
* Added `Application.frontmost_application`
|
6
10
|
* Added `Application.menu_bar_owner`
|
@@ -11,8 +15,14 @@
|
|
11
15
|
* Added `SystemWide.desktop`
|
12
16
|
* Added History.markdown to track notable changes
|
13
17
|
|
14
|
-
*
|
18
|
+
* Moved MiniTest extensions to their own repository/gem [minitest-ax\_elements](https://github.com/AXElements/minitest-ax_elements)
|
19
|
+
* Moved RSpec extensions to their own repository/gem [rspec-ax\_elements](https://github.com/AXElements/rspec-ax_elements)
|
20
|
+
|
21
|
+
* Ported `mouse.rb` to C and moved code to [mouse](https://github.com/AXElements/mouse)
|
22
|
+
* Ported `core.rb` to C and moved code to [accessibility\_core](https://github.com/AXElements/accessibility_core)
|
23
|
+
* Ported `screen_recorder.rb` to C and moved code to [screen\_recorder](https://github.com/AXElements/screen_recorder)
|
15
24
|
|
25
|
+
* Deprecate `AX::DOCK` constant, use `AX::Application.dock` instead
|
16
26
|
* Remove `Accessibility.application_with_bundle_identifier`; use `AX::Application.new` instead
|
17
27
|
* Remove `Accessibility.application_with_name; use `AX::Application.new` instead
|
18
28
|
* Remove `DSL#subtree_for`; use `Element#inspect_subtree` instead
|
data/README.markdown
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# AXElements
|
1
|
+
# AXElements
|
2
2
|
|
3
3
|
AXElements is a DSL abstraction built on top of the Mac OS X
|
4
4
|
Accessibility and CGEvent APIs that allows code to be written in a
|
@@ -64,8 +64,10 @@ The code from the demo video is right here:
|
|
64
64
|
|
65
65
|
## Getting Setup
|
66
66
|
|
67
|
-
You will need a MacRuby nightly build for
|
68
|
-
|
67
|
+
You will need Ruby 1.9.3 or a MacRuby nightly build for
|
68
|
+
installation. You can get help installing Ruby 1.9.3 from the
|
69
|
+
[Ruby Website](http://www.ruby-lang.org), or help installing MacRuby
|
70
|
+
from the
|
69
71
|
[Setup MacRuby](https://github.com/MacRuby/MacRuby/wiki/Setting-up-MacRuby)
|
70
72
|
guide on Github.
|
71
73
|
|
@@ -95,11 +97,11 @@ Once all the setup is finished, you can start up AXElements in IRB:
|
|
95
97
|
irb -rubygems -rax_elements
|
96
98
|
```
|
97
99
|
|
98
|
-
__NOTE__: If you are not using RVM,
|
99
|
-
instead of `rake`, and `macirb` instead of `irb`,
|
100
|
-
need to add `sudo` to your command when you install
|
101
|
-
are not using RVM with MacRuby, but have RVM
|
102
|
-
disable it like so:
|
100
|
+
__NOTE__: If you are not using RVM, but are using MacRuby, then you
|
101
|
+
should use `macrake` instead of `rake`, and `macirb` instead of `irb`,
|
102
|
+
etc.. You may also need to add `sudo` to your command when you install
|
103
|
+
the gem. If you are not using RVM with MacRuby, but have RVM
|
104
|
+
installed, remember to disable it like so:
|
103
105
|
|
104
106
|
```bash
|
105
107
|
rvm use system
|
data/Rakefile
CHANGED
data/lib/accessibility/dsl.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
require 'active_support/core_ext/object/blank'
|
4
|
+
|
3
5
|
require 'mouse'
|
4
6
|
require 'ax/element'
|
5
7
|
require 'ax/application'
|
@@ -8,6 +10,8 @@ require 'ax/scroll_area'
|
|
8
10
|
require 'ax/menu'
|
9
11
|
require 'accessibility'
|
10
12
|
require 'accessibility/enumerators'
|
13
|
+
require 'accessibility/highlighter'
|
14
|
+
|
11
15
|
|
12
16
|
##
|
13
17
|
# DSL methods for AXElements.
|
@@ -129,7 +133,7 @@ module Accessibility::DSL
|
|
129
133
|
# The normal way to raise an exception.
|
130
134
|
def raise *args
|
131
135
|
arg = args.first
|
132
|
-
arg.kind_of?(AX::Element) ? arg.perform(:raise) :
|
136
|
+
arg.kind_of?(AX::Element) ? arg.perform(:raise) : Kernel.raise(*args)
|
133
137
|
end
|
134
138
|
|
135
139
|
##
|
@@ -625,7 +629,6 @@ module Accessibility::DSL
|
|
625
629
|
# @option opts [NSColor] :colour (NSColor.magentaColor)
|
626
630
|
# @return [Accessibility::Highlighter]
|
627
631
|
def highlight obj, opts = {}
|
628
|
-
require 'accessibility/highlighter'
|
629
632
|
Accessibility::Highlighter.new obj.bounds, opts
|
630
633
|
end
|
631
634
|
|
@@ -1,92 +1,27 @@
|
|
1
1
|
require 'accessibility/core'
|
2
2
|
require 'accessibility/translator'
|
3
|
-
require 'accessibility/statistics'
|
4
3
|
|
5
4
|
##
|
6
5
|
# Namespace container for all the accessibility objects.
|
7
6
|
module AX; class Element; end end
|
8
7
|
|
9
8
|
|
10
|
-
|
11
|
-
# Extensions to {Accessibility::Element} for the high level abstraction.
|
12
|
-
# These extensions only make sense in the context of the high level API
|
13
|
-
# and it requires knowledge of both layers, so the code has been placed
|
14
|
-
# in its own file.
|
15
|
-
module Accessibility::Element
|
16
|
-
|
17
|
-
##
|
18
|
-
# @todo Should we handle cases where a subrole has a value of
|
19
|
-
# 'Unknown'? What is the performance impact?
|
20
|
-
#
|
21
|
-
# Wrap the low level wrapper with the appropriate high level wrapper.
|
22
|
-
# This involves determining the proper class in the {AX} namespace,
|
23
|
-
# possibly creating it on demand, and then instantiating the class to
|
24
|
-
# wrap the low level object.
|
25
|
-
#
|
26
|
-
# Some code paths have been unrolled for efficiency. Don't hate player,
|
27
|
-
# hate the game.
|
28
|
-
#
|
29
|
-
# @return [AX::Element]
|
30
|
-
def to_ruby
|
31
|
-
type = AXValueGetType(self)
|
32
|
-
if type.zero?
|
33
|
-
to_element
|
34
|
-
else
|
35
|
-
to_box type
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def to_element
|
42
|
-
STATS.increment :Factory
|
43
|
-
if roll = self.role
|
44
|
-
roll = TRANSLATOR.unprefix roll
|
45
|
-
if attributes.include? KAXSubroleAttribute
|
46
|
-
subroll = self.subrole
|
47
|
-
# Some objects claim to have a subrole but return nil
|
48
|
-
if subroll
|
49
|
-
class_for2(TRANSLATOR.unprefix(subroll), roll).new self
|
50
|
-
else
|
51
|
-
class_for(roll).new self
|
52
|
-
end
|
53
|
-
else
|
54
|
-
class_for(roll).new self
|
55
|
-
end
|
56
|
-
else # failsafe in case object dies before we get the role
|
57
|
-
AX::Element.new self
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def to_box type
|
62
|
-
STATS.increment :Unwrap
|
63
|
-
ptr = Pointer.new BOX_TYPES[type]
|
64
|
-
AXValueGetValue(self, type, ptr)
|
65
|
-
ptr.value.to_ruby
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
private
|
9
|
+
class << AX
|
70
10
|
|
71
11
|
##
|
72
12
|
# @private
|
73
13
|
#
|
74
|
-
#
|
14
|
+
# Mutex to make sure we only create one class at a time.
|
75
15
|
#
|
76
|
-
# @return [
|
77
|
-
|
16
|
+
# @return [Mutex]
|
17
|
+
MUTEX = Mutex.new
|
78
18
|
|
79
19
|
##
|
80
20
|
# @private
|
81
21
|
#
|
82
|
-
#
|
22
|
+
# Find the class for a given role
|
83
23
|
#
|
84
|
-
#
|
85
|
-
CREATE_QUEUE = Dispatch::Queue.new 'com.marketcircle.axelements.create'
|
86
|
-
|
87
|
-
##
|
88
|
-
# Find the class for a given role. If the class does not exist it will
|
89
|
-
# be created.
|
24
|
+
# If the class does not exist it will be created.
|
90
25
|
#
|
91
26
|
# @param role [#to_s]
|
92
27
|
# @return [Class]
|
@@ -99,8 +34,11 @@ module Accessibility::Element
|
|
99
34
|
end
|
100
35
|
|
101
36
|
##
|
102
|
-
#
|
103
|
-
#
|
37
|
+
# @private
|
38
|
+
#
|
39
|
+
# Find the class for a given subrole and role
|
40
|
+
#
|
41
|
+
# If the class does not exist it will be created on demand.
|
104
42
|
#
|
105
43
|
# @param subrole [#to_s]
|
106
44
|
# @param role [#to_s]
|
@@ -114,13 +52,15 @@ module Accessibility::Element
|
|
114
52
|
end
|
115
53
|
|
116
54
|
##
|
117
|
-
#
|
118
|
-
#
|
55
|
+
# @private
|
56
|
+
#
|
57
|
+
# Create a class in the {AX} namespace that has {AX::Element} as the
|
58
|
+
# superclass
|
119
59
|
#
|
120
60
|
# @param name [#to_s]
|
121
61
|
# @return [Class]
|
122
62
|
def create_class name
|
123
|
-
|
63
|
+
MUTEX.synchronize do
|
124
64
|
# re-check now that we are in the critical section
|
125
65
|
@klass = if AX.const_defined? name, false
|
126
66
|
AX.const_get name
|
@@ -133,8 +73,10 @@ module Accessibility::Element
|
|
133
73
|
end
|
134
74
|
|
135
75
|
##
|
76
|
+
# @private
|
77
|
+
#
|
136
78
|
# Create a new class in the {AX} namesapce that has the given
|
137
|
-
# `superklass` as the superclass
|
79
|
+
# `superklass` as the superclass
|
138
80
|
#
|
139
81
|
# @param name [#to_s]
|
140
82
|
# @param superklass [#to_s]
|
@@ -143,7 +85,7 @@ module Accessibility::Element
|
|
143
85
|
unless AX.const_defined? superklass, false
|
144
86
|
create_class superklass
|
145
87
|
end
|
146
|
-
|
88
|
+
MUTEX.synchronize do
|
147
89
|
# re-check now that we are in the critical section
|
148
90
|
@klass = if AX.const_defined? name, false
|
149
91
|
AX.const_get name
|
@@ -156,3 +98,117 @@ module Accessibility::Element
|
|
156
98
|
end
|
157
99
|
|
158
100
|
end
|
101
|
+
|
102
|
+
|
103
|
+
if on_macruby?
|
104
|
+
|
105
|
+
##
|
106
|
+
# Extensions to {Accessibility::Element} for the higher level abstractions
|
107
|
+
#
|
108
|
+
# These extensions only make sense in the context of the high level API
|
109
|
+
# but needs to be applied on the lower level class, so the code has been
|
110
|
+
# placed in its own file.
|
111
|
+
module Accessibility::Element
|
112
|
+
|
113
|
+
##
|
114
|
+
# @todo Should we handle cases where a subrole has a value of
|
115
|
+
# 'Unknown'? What is the performance impact?
|
116
|
+
#
|
117
|
+
# Wrap the low level wrapper with the appropriate high level wrapper.
|
118
|
+
# This involves determining the proper class in the {AX} namespace,
|
119
|
+
# possibly creating it on demand, and then instantiating the class to
|
120
|
+
# wrap the low level object.
|
121
|
+
#
|
122
|
+
# Some code paths have been unrolled for efficiency. Don't hate player,
|
123
|
+
# hate the game.
|
124
|
+
#
|
125
|
+
# @return [AX::Element]
|
126
|
+
def to_ruby
|
127
|
+
type = AXValueGetType(self)
|
128
|
+
if type.zero?
|
129
|
+
to_element
|
130
|
+
else
|
131
|
+
to_box type
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
##
|
139
|
+
# @private
|
140
|
+
#
|
141
|
+
# Reference to the singleton instance of the translator.
|
142
|
+
#
|
143
|
+
# @return [Accessibility::Translator]
|
144
|
+
TRANSLATOR = Accessibility::Translator.instance
|
145
|
+
|
146
|
+
def to_box type
|
147
|
+
ptr = Pointer.new ValueWrapper::BOX_TYPES[type]
|
148
|
+
AXValueGetValue(self, type, ptr)
|
149
|
+
ptr.value.to_ruby
|
150
|
+
end
|
151
|
+
|
152
|
+
def to_element
|
153
|
+
if roll = self.role
|
154
|
+
roll = TRANSLATOR.unprefix roll
|
155
|
+
if attributes.include? KAXSubroleAttribute
|
156
|
+
subroll = self.subrole
|
157
|
+
# Some objects claim to have a subrole but return nil
|
158
|
+
if subroll
|
159
|
+
AX.class_for2(TRANSLATOR.unprefix(subroll), roll).new self
|
160
|
+
else
|
161
|
+
AX.class_for(roll).new self
|
162
|
+
end
|
163
|
+
else
|
164
|
+
AX.class_for(roll).new self
|
165
|
+
end
|
166
|
+
else # failsafe in case object dies before we get the role
|
167
|
+
AX::Element.new self
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
else
|
175
|
+
|
176
|
+
|
177
|
+
##
|
178
|
+
# `AXElements` extensions to the `Accessibility::Element` class
|
179
|
+
class Accessibility::Element
|
180
|
+
|
181
|
+
##
|
182
|
+
# Override the default `#to_ruby` so that proper classes are
|
183
|
+
# chosen for each object.
|
184
|
+
#
|
185
|
+
# @return [AX::Element]
|
186
|
+
def to_ruby
|
187
|
+
if roll = self.role
|
188
|
+
roll = TRANSLATOR.unprefix roll
|
189
|
+
if attributes.include? KAXSubroleAttribute
|
190
|
+
subroll = self.subrole
|
191
|
+
# Some objects claim to have a subrole but return nil
|
192
|
+
if subroll
|
193
|
+
AX.class_for2(TRANSLATOR.unprefix(subroll), roll).new self
|
194
|
+
else
|
195
|
+
AX.class_for(roll).new self
|
196
|
+
end
|
197
|
+
else
|
198
|
+
AX.class_for(roll).new self
|
199
|
+
end
|
200
|
+
else # failsafe in case object dies before we get the role
|
201
|
+
AX::Element.new self
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
##
|
206
|
+
# @private
|
207
|
+
#
|
208
|
+
# Reference to the singleton instance of the translator.
|
209
|
+
#
|
210
|
+
# @return [Accessibility::Translator]
|
211
|
+
TRANSLATOR = Accessibility::Translator.instance
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'accessibility/version'
|
2
|
+
require 'accessibility/extras'
|
2
3
|
|
3
4
|
##
|
4
5
|
# Interface for collecting some simple information about the system.
|
@@ -11,17 +12,30 @@ require 'accessibility/version'
|
|
11
12
|
module Accessibility::SystemInfo
|
12
13
|
extend self
|
13
14
|
|
15
|
+
##
|
16
|
+
# The name the machine uses for Bonjour
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
#
|
20
|
+
# Accessibility::SystemInfo.name
|
21
|
+
# # => "ferrous"
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
def name
|
25
|
+
NSHost.currentHost.localizedName
|
26
|
+
end
|
27
|
+
|
14
28
|
##
|
15
29
|
# All hostnames that the system responds to
|
16
30
|
#
|
17
31
|
# @example
|
18
32
|
#
|
19
|
-
# Accessibility::SystemInfo.hostnames
|
33
|
+
# Accessibility::SystemInfo.hostnames
|
20
34
|
# # => ["ferrous.local", "localhost"]
|
21
35
|
#
|
22
36
|
# @return [Array<String>]
|
23
37
|
def hostnames
|
24
|
-
|
38
|
+
NSHost.currentHost.names
|
25
39
|
end
|
26
40
|
|
27
41
|
##
|
@@ -46,7 +60,7 @@ module Accessibility::SystemInfo
|
|
46
60
|
#
|
47
61
|
# @return [Array<String>]
|
48
62
|
def addresses
|
49
|
-
|
63
|
+
NSHost.currentHost.addresses
|
50
64
|
end
|
51
65
|
|
52
66
|
##
|
@@ -67,7 +81,7 @@ module Accessibility::SystemInfo
|
|
67
81
|
#
|
68
82
|
# @example
|
69
83
|
#
|
70
|
-
# Accessibility::SystemInfo.ipv6_addresses
|
84
|
+
# Accessibility::SystemInfo.ipv6_addresses
|
71
85
|
# # => ["fe80::6aa8:6dff:fe20:822%en1", "fe80::1%lo0", "::1"]
|
72
86
|
#
|
73
87
|
# @return [Array<String>]
|
@@ -86,7 +100,7 @@ module Accessibility::SystemInfo
|
|
86
100
|
def model
|
87
101
|
@model ||= `sysctl hw.model`.split.last.chomp
|
88
102
|
end
|
89
|
-
|
103
|
+
|
90
104
|
##
|
91
105
|
# OS X version string
|
92
106
|
#
|
@@ -96,7 +110,7 @@ module Accessibility::SystemInfo
|
|
96
110
|
#
|
97
111
|
# @return [String]
|
98
112
|
def osx_version
|
99
|
-
|
113
|
+
NSProcessInfo.processInfo.operatingSystemVersionString
|
100
114
|
end
|
101
115
|
|
102
116
|
##
|
@@ -108,7 +122,7 @@ module Accessibility::SystemInfo
|
|
108
122
|
#
|
109
123
|
# @return [Float]
|
110
124
|
def uptime
|
111
|
-
|
125
|
+
NSProcessInfo.processInfo.systemUptime
|
112
126
|
end
|
113
127
|
|
114
128
|
##
|
@@ -122,7 +136,7 @@ module Accessibility::SystemInfo
|
|
122
136
|
#
|
123
137
|
# @return [Fixnum]
|
124
138
|
def num_processors
|
125
|
-
|
139
|
+
NSProcessInfo.processInfo.processorCount
|
126
140
|
end
|
127
141
|
|
128
142
|
##
|
@@ -134,7 +148,7 @@ module Accessibility::SystemInfo
|
|
134
148
|
#
|
135
149
|
# @return [Fixnum]
|
136
150
|
def num_active_processors
|
137
|
-
|
151
|
+
NSProcessInfo.processInfo.activeProcessorCount
|
138
152
|
end
|
139
153
|
|
140
154
|
##
|
@@ -146,20 +160,71 @@ module Accessibility::SystemInfo
|
|
146
160
|
#
|
147
161
|
# @return [Fixnum]
|
148
162
|
def total_ram
|
149
|
-
|
163
|
+
NSProcessInfo.processInfo.physicalMemory
|
150
164
|
end
|
151
165
|
alias_method :ram, :total_ram
|
152
166
|
|
167
|
+
##
|
168
|
+
# Return the current state of the battery
|
169
|
+
#
|
170
|
+
# @example
|
171
|
+
#
|
172
|
+
# battery_state # => :charged
|
173
|
+
# # unplug AC cord
|
174
|
+
# battery_state # => :discharging
|
175
|
+
# # plug AC cord back in after several minutes
|
176
|
+
# battery_state # => :charging
|
177
|
+
#
|
178
|
+
# # try this method when you have no battery
|
179
|
+
# battery_state # => :not_installed
|
180
|
+
#
|
181
|
+
# @return [Symbol]
|
182
|
+
def battery_state
|
183
|
+
Battery.state
|
184
|
+
end
|
153
185
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
186
|
+
##
|
187
|
+
# Returns the charge percentage of the battery (if present)
|
188
|
+
#
|
189
|
+
# A special value of `-1.0` is returned if you have no battery.
|
190
|
+
#
|
191
|
+
# @example
|
192
|
+
#
|
193
|
+
# battery_charge_level # => 1.0
|
194
|
+
# # unplug AC cord and wait a couple of minutes
|
195
|
+
# battery_charge_level # => 0.99
|
196
|
+
#
|
197
|
+
# # if you have no battery
|
198
|
+
# battery_charge_level # => -1.0
|
199
|
+
#
|
200
|
+
# @return [Float]
|
201
|
+
def battery_charge_level
|
202
|
+
Battery.level
|
158
203
|
end
|
204
|
+
alias_method :battery_level, :battery_charge_level
|
159
205
|
|
160
|
-
|
161
|
-
|
206
|
+
##
|
207
|
+
# Return an estimate on the number of minutes until the battery is drained
|
208
|
+
#
|
209
|
+
# A special value of `0` indicates that the battery is not discharging.
|
210
|
+
# You should really only call this after you know that the battery is
|
211
|
+
# discharging by calling {#battery_state} and having `:discharging` returned.
|
212
|
+
#
|
213
|
+
# A special value of `-1` is returned when the estimate is in flux and
|
214
|
+
# cannot be accurately estimated.
|
215
|
+
#
|
216
|
+
# @example
|
217
|
+
#
|
218
|
+
# # AC cord plugged in
|
219
|
+
# battery_life_estimate # => 0
|
220
|
+
# # unplug AC cord
|
221
|
+
# battery_life_estimate # => -1
|
222
|
+
# # wait a few minutes
|
223
|
+
# battery_life_estimate # => 423
|
224
|
+
#
|
225
|
+
# @return [Fixnum]
|
226
|
+
def battery_life_estimate
|
227
|
+
Battery.time_to_empty
|
162
228
|
end
|
163
229
|
|
164
230
|
end
|
165
|
-
|