adb-sdklib 0.0.1 → 0.0.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTE3YzhiZDg1MzU4MzkxZGM1N2I5Y2IxYjIwYTgxNWQ1OWY0ZWU5NA==
4
+ ZGI1NWY1ZTRjNDdlNDFkOWU0YzNhODI4OWZlNjZhY2M5Mjg0ZTFiYQ==
5
5
  data.tar.gz: !binary |-
6
- NmM3MzE5NmZhZjQxNmI0NjkyNjRkZWY4NGFkNzQwMmViMTA3NzJiOA==
6
+ YmQ4ZTg4NTI5MWVhYWQwOWRkMWY3NGVkOTgyYWIyNDMwZDhkMDI0Yg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YTY3ODE0OTI4MzI3Mzc4YTMwNzQ3ZmY4ZTQxMTZjNjQ0YzkxNTZlNzJmNzkz
10
- NzZmM2QwYzU4NWMzN2U2MjY3MzU0ZGQwMDZhZjcyZWExMGQzNWY2YTM5MjU1
11
- ZmIwZWQyZGQyNjA4YWRhNTMyOTMxZWUwYWRjZjdjOWU4MDNjNjY=
9
+ OWYzOTZjNDM2NDNmYzI0MmZiY2M1NTliYjY2OTkxZDkzMjYwOTk3NzUzNmI5
10
+ ZWI5ZjZiYzY4M2MwZTZmZjE4NzM5ZGMyYTA2YjM0MTZmODQyZTY3YjJhYTgy
11
+ YzEyNDg1OWIwMmU3YWE5MWUwOTRlOWJiZGNhZWMxNTA1N2YzMTg=
12
12
  data.tar.gz: !binary |-
13
- MzFjYzhjYzUxNDRlNzdmOWNmNDZhODU1NzM5ZWQzN2Q5NTkzNTA0ZThjMzli
14
- MzA1ZDU4ZTA3NGE0ZDA1MWVmMTRjNGNiOWM3MDg0NDY0ZGZmODAyYmQ1MzRj
15
- NmU0YTc0NGZkYjQ2ODdkZjc0NzUxNWY5M2E5MDRhYjRhOGI0MDQ=
13
+ ZjlmZDA0YzVlMGI2NTdiMDAwMDA4ZjA5Y2U4NWQ5ZTRmYWYxOWMzZDUwODU1
14
+ ZWM0OGJjMzFmZTE1M2RmMjMxYzRjZmFlM2U4OTlkMmU1N2Q4NDcwZDMxNTYy
15
+ ODE2OWFlOGM2MjNhZTA3NWQ2NDhjNTMzNWI0NjZlZTg0ZGI4ZTg=
data/.yardopts ADDED
@@ -0,0 +1,5 @@
1
+ --title 'AdbSdkLib Documentation'
2
+ --no-private
3
+ --main=README.md
4
+ -
5
+ README.md
data/README.md CHANGED
@@ -14,19 +14,19 @@ $ gem install adb-sdklib
14
14
 
15
15
  ## Usage
16
16
 
17
- ### Adb Object
17
+ ### *Adb* object
18
18
 
19
19
  ```ruby
20
20
  require 'adb-sdklib'
21
21
  adb = AdbSdkLib::Adb.new
22
22
  # If 'adb' command-line tool isn't in your $PATH, set adb location to constructor shown as below
23
- # adb = AdbSdkLib::Adb.new(<adb location>)
23
+ # adb = AdbSdkLib::Adb.new('/path/to/adb')
24
24
 
25
25
  # Get device objects
26
26
  devices = adb.devices
27
27
  ```
28
28
 
29
- **Adb** object is wrapper of *com.android.ddmlib.AndroidDebugBridge*.
29
+ *Adb* object is wrapper of *com.android.ddmlib.AndroidDebugBridge*.
30
30
  Source code of *com.android.ddmlib.AndroidDebugBridge*:
31
31
  <https://android.googlesource.com/platform/tools/base/+/master/ddmlib/src/main/java/com/android/ddmlib/AndroidDebugBridge.java>
32
32
 
@@ -34,12 +34,14 @@ Some methods of *AndroidDebugBridge* are wrapped for Ruby.
34
34
  For remaining methods, *Adb#method_missing* is defined to call
35
35
  wrapping java object's same name method using specified parameters.
36
36
 
37
- ### Device Object
37
+ ### *Device* object
38
38
 
39
39
  ```ruby
40
40
  adb = AdbSdkLib::Adb.new
41
41
  device = adb.devices.first
42
- # device = adb.devices['xxxxxx'] # get by serial number of the device.
42
+ # device = adb.devices['xxxxxx'] # get by the device's serial number.
43
+
44
+ # Display attributes
43
45
  puts <<"EOS"
44
46
  serial : #{device.serial}
45
47
  state : #{device.state}
@@ -48,16 +50,28 @@ build ver : #{device.build_version}
48
50
  api level : #{device.api_level}
49
51
  device model : #{device.device_model}
50
52
  manufacturer : #{device.manufacturer}
51
- build desc : #{device.property('ro.build.description')}
52
- battery level : #{device.battery_level}
53
53
  EOS
54
+
55
+ # Push a file to the device
56
+ device.push('local.txt', '/data/local/tmp/')
57
+
58
+ # Pull a file from the device
59
+ device.pull('/system/build.prop', '/path/to/dir/')
60
+
61
+ # Execute shell
62
+ puts device.shell('ps') # display results
63
+
64
+ device.shell('ls /data/local/tmp/') { |line| # each line
65
+ puts line
66
+ }
67
+
54
68
  ```
55
69
 
56
- **Device** object is wrapper of *com.android.ddmlib.Device*.
70
+ *Device* object is wrapper of *com.android.ddmlib.Device*.
57
71
  Source code of *com.android.ddmlib.Device*:
58
72
  <https://android.googlesource.com/platform/tools/base/+/master/ddmlib/src/main/java/com/android/ddmlib/Device.java>
59
73
 
60
- Some methods of *ddmlib.Device* are wrapped for Ruby.
74
+ Some methods of *ddmlib.Device* are wrapped for Ruby.
61
75
  For remaining methods, *Device#method_missing* is defined to call
62
76
  wrapping java object's same name method using specified parameters.
63
77
 
data/adb-sdklib.gemspec CHANGED
@@ -6,7 +6,7 @@ require 'adb_sdklib/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "adb-sdklib"
8
8
  spec.version = AdbSdkLib::VERSION
9
- spec.authors = ["yoyo"]
9
+ spec.authors = ["yoyo0906"]
10
10
  spec.email = ["yoyo0906@gmail.com"]
11
11
  spec.summary = "Android Debug Bridge (ADB) wrapper" +
12
12
  " using Android SDK Tools Library with Rjb."
data/lib/adb-sdklib.rb CHANGED
@@ -4,50 +4,107 @@ require 'adb_sdklib/common'
4
4
  require 'adb_sdklib/device'
5
5
 
6
6
  module AdbSdkLib
7
+ # List of devices.
8
+ # It can be used as Enumerable like Set, and as Hash which key
9
+ # is the serial number of the device.
10
+ class DeviceList < Hash
11
+ # @param [Enumerable] devices Device object of Java
12
+ def initialize(devices = [])
13
+ devices.each { |d| self[d.serial_number] = d }
14
+ end
15
+ # Calls block once for each device in self, passing that device as a parameter.
16
+ # If no block is given, an enumerator is returned instead.
17
+ # @return [Enumerator] if not block given
18
+ # @return [self] if block given
19
+ # @yield [device] called with each device
20
+ # @yieldparam [Device] device a device instance
21
+ def each
22
+ return self.values.each unless block_given?
23
+ self.values.each {|device| yield device }
24
+ return self
25
+ end
26
+ end
27
+
7
28
  class Adb
8
29
  include Common
9
30
 
10
- @@AndroidDebugBridge = nil
31
+ # @private
32
+ @@java_initialized = false
11
33
 
34
+ # @private
35
+ # AndroidDebugBridge class object
36
+ @@adb = nil
37
+
38
+ # Initialize Rjb and connect to ADB.
39
+ # @param [String] adb_location Location of ADB command line tool
40
+ # @param [Boolean] force_new_bridge if set true, start force new ADB server
41
+ # @raise [AdbError] If could not found ADB command line tool
12
42
  def initialize(adb_location = nil, force_new_bridge = false)
13
43
  if adb_location.nil?
14
44
  @adbpath = `which adb`.chomp!
45
+ raise AdbError, "Not found 'adb' command in $PATH" unless @adbpath
15
46
  else
16
47
  @adbpath = adb_location
48
+ raise AdbError, "Not found 'adb' command" unless @adbpath
17
49
  end
18
- raise AdbError, "Not found 'adb' command in $PATH" unless @adbpath
19
-
20
- # load AndroidDebugBridge
21
- libpath = File.expand_path('../tools/lib/', File.dirname(@adbpath))
22
50
 
23
- if @@AndroidDebugBridge.nil?
24
- load_jar("#{libpath}/ddmlib.jar")
25
- @@AndroidDebugBridge = Rjb::import('com.android.ddmlib.AndroidDebugBridge')
26
- @@AndroidDebugBridge.initIfNeeded(false)
51
+ # load jar files
52
+ unless @@java_initialized
53
+ load_sdk_tools_jar(['ddmlib.jar'])
54
+ # Hide logs to be output to the console.
55
+ ddm = Rjb::import('com.android.ddmlib.DdmPreferences')
56
+ ddm.setLogLevel('assert')
57
+ @@java_initialized = true
27
58
  at_exit { Adb.terminate }
28
59
  end
60
+ if @@adb.nil?
61
+ @@adb = Rjb::import('com.android.ddmlib.AndroidDebugBridge')
62
+ @@adb.initIfNeeded(false)
63
+ end
29
64
 
30
- @adb = @@AndroidDebugBridge.createBridge(@adbpath, force_new_bridge)
65
+ @adb = @@adb.createBridge(@adbpath, force_new_bridge)
31
66
  10.times { |i|
32
67
  break if @adb.connected?
33
68
  sleep(0.25)
34
69
  }
35
70
  raise AdbError, 'Connect adb error (timeout)' unless @adb.connected?
71
+
72
+ @devices = DeviceList.new
36
73
  end
37
74
 
75
+ # Terminate ADB connection.
76
+ # This method will be called automatically when exiting ruby.
77
+ # @return [self] self
38
78
  def self.terminate
39
- unless @@AndroidDebugBridge.nil?
40
- @@AndroidDebugBridge.terminate
41
- @@AndroidDebugBridge = nil
79
+ unless @@adb.nil?
80
+ @@adb.terminate
81
+ @@adb = nil
42
82
  end
83
+ self
43
84
  end
44
85
 
86
+ # Get devices attached with ADB.
87
+ # @return [DeviceList] List of devices
45
88
  def devices
46
- devices = @adb.devices.map { |d| Device.new(d) }
47
- class << devices
48
- def [](serial); self.find { |d| d.serial_number == serial } end
89
+ devices = @adb.devices.map { |d|
90
+ serial = d.serial_number
91
+ (@devices.has_key?(serial) && same_jobject?(@devices[serial].jobject, d)) \
92
+ ? @devices[serial] : Device.new(d)
93
+ }
94
+ @devices = DeviceList.new(devices)
95
+ return @devices
96
+ end
97
+
98
+ private
99
+
100
+ # @private
101
+ def load_sdk_tools_jar(libs)
102
+ libpath = File.expand_path('../tools/lib/', File.dirname(@adbpath))
103
+ libs.each do |lib|
104
+ lib = "#{libpath}/#{lib}"
105
+ raise AdbError, "Not found #{lib}" unless File.exist?(lib)
106
+ Rjb::add_jar(lib)
49
107
  end
50
- return devices
51
108
  end
52
109
  end
53
110
  end
@@ -2,14 +2,79 @@
2
2
  require 'rjb'
3
3
 
4
4
  module AdbSdkLib
5
+ # ADB error
5
6
  class AdbError < StandardError; end
7
+
8
+ # Error on java
9
+ class SdkLibError < StandardError
10
+ # @return [String] error message
11
+ attr_reader :error_message
12
+ # @return [String] exception class name on Java
13
+ attr_reader :exception_name
14
+ # @return [String] class name
15
+ attr_reader :class_name
16
+ # @return [String] method name
17
+ attr_reader :method_name
18
+
19
+ # @param [String] message error message
20
+ # @param [String] exception_name exception class name on Java
21
+ # @param [String] class_name class name
22
+ # @param [String] method_name method name
23
+ def initialize(message, exception_name, class_name, method_name)
24
+ super("#{message} (#{exception_name}) - [#{class_name}##{method_name}()]")
25
+ @error_message = message
26
+ @exception_name = exception_name
27
+ @class_name = class_name
28
+ @method_name = method_name
29
+ end
30
+ end
6
31
 
7
- module Common
8
- def load_jar(lib)
9
- raise AdbError, "Not found #{lib}" unless File.exist?(lib)
10
- Rjb::load(lib)
32
+ # @private
33
+ class CommandCapture
34
+ def initialize(line_receiver = nil)
35
+ @output = ''
36
+ @line_receiver = line_receiver
37
+ end
38
+
39
+ # Override
40
+ def addOutput(data, offset, length)
41
+ out = data[offset..(offset + length - 1)] # -1 for ¥x00
42
+ @output << out.force_encoding('UTF-8')
43
+ unless @line_receiver.nil?
44
+ lines = @output.split("\n")
45
+ @output = (@output[-1] != "\n") ? lines.pop : ''
46
+ lines.each { |line|
47
+ @line_receiver.call(line.chomp)
48
+ }
49
+ end
50
+ end
51
+
52
+ # Override
53
+ def flush
54
+ if !@line_receiver.nil? && !@output.empty?
55
+ @line_receiver.call(@output)
56
+ @output = ''
57
+ end
11
58
  end
12
59
 
60
+ # Override
61
+ def isCancelled; false end
62
+
63
+ def to_s; @output end
64
+ end
65
+
66
+ # @private
67
+ module Common
68
+ # @private
69
+ System = Rjb::import('java.lang.System')
70
+
71
+ # Inspects whether two objects are the same of Java instance.
72
+ def same_jobject?(obj1, obj2)
73
+ System.identityHashCode(obj1) \
74
+ == System.identityHashCode(obj2)
75
+ end
76
+
77
+ # Converts Java Map object to Ruby Hash object.
13
78
  def convert_map_to_hash(object, &block)
14
79
  hash = Hash.new
15
80
  i = object.entrySet.iterator
@@ -27,7 +92,7 @@ module AdbSdkLib
27
92
  hash
28
93
  end
29
94
 
30
- module_function(:load_jar, :convert_map_to_hash)
95
+ module_function(:same_jobject?, :convert_map_to_hash)
31
96
  end
32
97
  end
33
98
 
@@ -1,61 +1,218 @@
1
1
  # coding: utf-8
2
2
  require 'adb_sdklib/common'
3
+ require 'fileutils'
3
4
 
4
5
  module AdbSdkLib
6
+
7
+ # One of android device attached to host through ADB.
8
+ #
9
+ # This is a wrapper of com.android.ddmlib.Device object in Java.
5
10
  class Device
6
11
  include Common
7
12
 
13
+ # @param [Rjb::Rjb_JavaProxy] device Rjb proxy object of com.android.ddmlib.Device
8
14
  def initialize(device)
9
15
  unless device.instance_of?(Rjb::Rjb_JavaProxy) &&
10
- device.getClass.getCanonicalName == 'com.android.ddmlib.Device'
16
+ device._classname == 'com.android.ddmlib.Device'
11
17
  raise TypeError, "Parameter is not com.android.ddmlib.Device class"
12
18
  end
19
+ class << device
20
+ def call_java_method(method_name, *args)
21
+ rjb_method_missing(method_name, *args)
22
+ rescue => e
23
+ raise SdkLibError.new(e.message, e.class.to_s, self._classname, method_name)
24
+ end
25
+ alias_method :rjb_method_missing, :method_missing
26
+ alias_method :method_missing, :call_java_method
27
+ end
13
28
  @device = device
14
29
  end
15
30
 
16
- def serial; @device.serial_number end
17
- def state; @device.state.toString.to_sym end
18
- def online?; @device.online? end
19
- def emulator?; @device.emulator? end
20
- def offline?; @device.offline? end
21
- def bootloader?; @device.bootloader? end
22
- def reboot(into=nil) @device.reboot(into) end
23
- def property_count; @device.property_count end
24
- def property(prop); @device.property(prop) end
31
+ # @!attribute [r] jobject
32
+ # @return [Rjb::Rjb_JavaProxy] Wrapper of com.android.ddmlib.Device object.
33
+ def jobject; @device end
34
+
35
+ # @!attribute [r] serial
36
+ # @return [String] the serial number of the device.
37
+ def serial; @device.getSerialNumber end
38
+
39
+ # @!attribute [r] state
40
+ # @return [Symbol] the state of the device.
41
+ # (:BOOTLOADER, :OFFLINE, :ONLINE, :RECOVERY)
42
+ def state; @device.getState.toString.to_sym end
43
+
44
+ # @!attribute [r] online?
45
+ # @return [Boolean] true if the device is ready.
46
+ def online?; @device.isOnline end
47
+
48
+ # @!attribute [r] emulator?
49
+ # @return [Boolean] true if the device is an emulator.
50
+ def emulator?; @device.isEmulator end
51
+
52
+ # @!attribute [r] offline?
53
+ # @return [Boolean] true if the device is offline.
54
+ def offline?; @device.isOffline end
55
+
56
+ # @!attribute [r] bootloader?
57
+ # @return [Boolean] true if the device is in bootloader mode.
58
+ def bootloader?; @device.isBootloader end
59
+
60
+ # Reboot the device
61
+ # @param [String, nil] into the bootloader name to reboot into,
62
+ # or nil to just reboot the device
63
+ # @return [self]
64
+ def reboot(into=nil) @device.reboot(into); self end
65
+
66
+ # Returns the property count.
67
+ # @return [Integer] the number of property for this device.
68
+ def property_count; @device.getPropertyCount end
69
+
70
+ # Returns a property value.
71
+ # @param [String] name the name of the value to return.
72
+ # @return [String, nil] the value or nil if the property does not exist.
73
+ def property(name); @device.getProperty(name) end
74
+
75
+ # Returns the device properties. It contains the whole output of 'getprop'
76
+ # @return [Hash<String, String>] the device properties
25
77
  def properties
26
- convert_map_to_hash(@device.properties) { |hash, key, value|
78
+ convert_map_to_hash(@device.getProperties) do |hash, key, value|
27
79
  hash[key.toString] = value.toString
28
- }
80
+ end
29
81
  end
30
- def build_version; @device.property(@device.PROP_BUILD_VERSION) end
31
- def api_level; @device.property(@device.PROP_BUILD_API_LEVEL) end
32
- def build_codename; @device.property(@device.PROP_BUILD_CODENAME) end
33
- def device_model; @device.property(@device.PROP_DEVICE_MODEL) end
34
- def device_manufacturer; @device.property(@device.PROP_DEVICE_MANUFACTURER) end
35
- def debuggable; @device.property(@device.PROP_DEBUGGABLE) end
36
-
37
- def battery_level(freshness_ms=nil)
82
+
83
+ # the build version of the android on the device.
84
+ # (same as output of 'getprop ro.build.version.release')
85
+ # @!attribute [r] build_version
86
+ # @return [String] the build version of the android.
87
+ def build_version; property(@device.PROP_BUILD_VERSION) end
88
+
89
+ # the API level of the android on the device.
90
+ # (same as output of 'getprop ro.build.version.sdk')
91
+ # @!attribute [r] api_level
92
+ # @return [String] the API level.
93
+ def api_level; property(@device.PROP_BUILD_API_LEVEL) end
94
+
95
+ # the build code name of the android on the device.
96
+ # @!attribute [r] build_codename
97
+ # (same as output of 'getprop ro.build.version.codename')
98
+ # @return [String] the build code name.
99
+ def build_codename; property(@device.PROP_BUILD_CODENAME) end
100
+
101
+ # the product model of the device.
102
+ # (same as output of 'getprop ro.product.model')
103
+ # @!attribute [r] device_model
104
+ # @return [String] the device model.
105
+ def device_model; property(@device.PROP_DEVICE_MODEL) end
106
+
107
+ # the product manufacturer of the device.
108
+ # (same as output of 'getprop ro.product.manufacturer')
109
+ # @!attribute [r] device_manufacturer
110
+ # @return [String] the product manufacturer.
111
+ def device_manufacturer; property(@device.PROP_DEVICE_MANUFACTURER) end
112
+
113
+ # the device debuggable.
114
+ # (same as output of 'getprop ro.debuggable')
115
+ # @!attribute [r] debuggable
116
+ # @return [String] the device debuggable.
117
+ def debuggable; property(@device.PROP_DEBUGGABLE) end
118
+
119
+ # Returns the battery level.
120
+ # @param [Integer] freshness_ms freshness time (milliseconds).
121
+ # @return [Integer] the battery level.
122
+ def battery_level(freshness_ms = nil)
38
123
  if freshness_ms.nil?
39
- @device.battery_level.int_value
124
+ @device.getBatteryLevel.intValue
40
125
  else
41
- @device.battery_level(freshness_ms).int_value
126
+ @device.getBatteryLevel(freshness_ms).intValue
42
127
  end
43
128
  end
44
129
 
45
- def method_missing(action, *args)
46
- return @device.__send__(action, *args)
130
+ # Executes a shell command on the device, and receives the result.
131
+ # @!method shell(command)
132
+ # @return [String, self]
133
+ # @overload shell(command)
134
+ # @param [String] command the command to execute
135
+ # @return [String] all results of the command.
136
+ # @overload shell(command)
137
+ # @param [String] command the command to execute
138
+ # @return [self] self
139
+ # @yield [line]
140
+ # @yieldparam [String] line each line of results of the command.
141
+ def shell(command, &block)
142
+ capture = CommandCapture.new(block_given? ? block : nil)
143
+ receiver = Rjb::bind(capture, 'com.android.ddmlib.IShellOutputReceiver')
144
+ @device.executeShellCommand(command.to_s, receiver)
145
+ block_given? ? self : capture.to_s
146
+ end
147
+
148
+ # Pushes a file to the device.
149
+ #
150
+ # If *remotefile* path ends with '/', complements by the basename of
151
+ # *localfile*.
152
+ # @example
153
+ # device = AdbSdkLib::Adb.new.devices.first
154
+ # device.push('path/to/local.txt', '/data/local/tmp/remote.txt')
155
+ # device.push('path/to/file.txt', '/data/local/tmp/') # uses file.txt
156
+ # @param [String] localfile the name of the local file to send
157
+ # @param [String] remotefile the name of the remote file or directory
158
+ # on the device
159
+ # @return [self] self
160
+ # @raise [ArgumentError] If *localfile* is not found
161
+ def push(localfile, remotefile)
162
+ raise ArgumentError, "Not found #{localfile}" unless File.exist?(localfile)
163
+ if remotefile.end_with?('/')
164
+ remotefile = "#{remotefile}#{File.basename(localfile)}"
165
+ end
166
+ @device.pushFile(localfile, remotefile)
167
+ self
47
168
  end
48
169
 
49
- def to_s
50
- "Android: ID:#{self.serial}"
170
+ # Pulls a file from the device.
171
+ #
172
+ # If *localfile* path ends with '/', complements by the basename of
173
+ # *remotefile*.
174
+ # @example
175
+ # device = AdbSdkLib::Adb.new.devices.first
176
+ # device.pull('/data/local/tmp/remote.txt', 'path/to/local.txt')
177
+ # device.pull('/data/local/tmp/file.txt', 'path/to/dir/') # uses file.txt
178
+ # @param [String] remotefile the name of the remote file on the device to get
179
+ # @param [String] localfile the name of the local file or directory
180
+ # @return [self] self
181
+ def pull(remotefile, localfile)
182
+ if localfile.end_with?('/') || File.directory?(localfile)
183
+ localdir = localfile.chomp('/')
184
+ localfilename = nil
185
+ else
186
+ localdir = File.dirname(localfile)
187
+ localfilename = File.basename(localfile)
188
+ end
189
+ unless File.exist?(localdir)
190
+ FileUtils.mkdir_p(localdir)
191
+ end
192
+
193
+ localfilename = File.basename(remotefile) if localfilename.nil?
194
+ @device.pullFile(remotefile, "#{localdir}/#{localfilename}")
195
+ self
51
196
  end
52
197
 
53
- def inspect
54
- "#<AdbSdkLib::Device:#{self.serial}>"
198
+ # Calls wrapping java object's same name method with arguments.
199
+ # @param [String] method_name method name to call
200
+ # @param [Array] args arguments
201
+ # @return [Object] result of the method call
202
+ def method_missing(method_name, *args)
203
+ return @device.__send__(method_name, *args)
55
204
  end
56
205
 
206
+ # Converts self to string.
207
+ # @return [String] convert to string
208
+ def to_s; "Android:#{self.serial}" end
209
+
210
+ # Returns the human-readable formatted information.
211
+ # @return [String] the human-readable formatted information
212
+ def inspect; "#<AdbSdkLib::Device:#{self.serial}>" end
213
+
57
214
  private
215
+ # @private
58
216
  def to_ary; nil end
59
217
  end
60
218
  end
61
-
@@ -1,3 +1,3 @@
1
1
  module AdbSdkLib
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adb-sdklib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - yoyo
7
+ - yoyo0906
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-17 00:00:00.000000000 Z
11
+ date: 2014-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rjb
@@ -61,6 +61,7 @@ extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
63
  - .gitignore
64
+ - .yardopts
64
65
  - Gemfile
65
66
  - LICENSE.txt
66
67
  - README.md