appium_lib 9.15.1 → 9.15.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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -15
  3. data/CHANGELOG.md +8 -0
  4. data/appium_lib.gemspec +7 -10
  5. data/docs/android_docs.md +259 -181
  6. data/docs/ios_docs.md +322 -244
  7. data/docs/ios_xcuitest.md +1 -1
  8. data/docs/w3c.md +21 -0
  9. data/lib/appium_lib/android/common/helper.rb +13 -13
  10. data/lib/appium_lib/android/element/button.rb +2 -0
  11. data/lib/appium_lib/android/element/generic.rb +2 -2
  12. data/lib/appium_lib/android/element/text.rb +2 -0
  13. data/lib/appium_lib/android/element/textfield.rb +2 -0
  14. data/lib/appium_lib/android/uiautomator2/element/button.rb +3 -0
  15. data/lib/appium_lib/android/uiautomator2/helper.rb +10 -8
  16. data/lib/appium_lib/appium.rb +4 -0
  17. data/lib/appium_lib/common/helper.rb +9 -8
  18. data/lib/appium_lib/common/multi_touch.rb +2 -0
  19. data/lib/appium_lib/common/touch_actions.rb +6 -5
  20. data/lib/appium_lib/driver.rb +72 -19
  21. data/lib/appium_lib/ios/common/helper.rb +36 -30
  22. data/lib/appium_lib/ios/element/button.rb +2 -0
  23. data/lib/appium_lib/ios/element/generic.rb +1 -0
  24. data/lib/appium_lib/ios/element/text.rb +2 -0
  25. data/lib/appium_lib/ios/element/textfield.rb +5 -2
  26. data/lib/appium_lib/ios/xcuitest/command/gestures.rb +4 -4
  27. data/lib/appium_lib/ios/xcuitest/element/button.rb +2 -0
  28. data/lib/appium_lib/ios/xcuitest/element/generic.rb +1 -0
  29. data/lib/appium_lib/ios/xcuitest/element/text.rb +2 -0
  30. data/lib/appium_lib/ios/xcuitest/element/textfield.rb +3 -0
  31. data/lib/appium_lib/ios/xcuitest/helper.rb +3 -4
  32. data/lib/appium_lib/version.rb +2 -2
  33. data/release_notes.md +10 -0
  34. metadata +39 -53
@@ -6,6 +6,7 @@ module Appium
6
6
 
7
7
  def start_element(type, attrs = [])
8
8
  return if filter && !filter.eql?(type)
9
+
9
10
  page = attrs.inject({}) do |hash, attr|
10
11
  hash[attr[0]] = attr[1] if %w(name label value hint visible).include?(attr[0])
11
12
  hash
@@ -15,19 +16,17 @@ module Appium
15
16
 
16
17
  # @private
17
18
  def _print_attr(type, name, label, value, hint, visible) # rubocop:disable Metrics/ParameterLists
19
+ puts type.to_s if name || label || value || hint || visible
20
+
18
21
  if name == label && name == value
19
- puts type.to_s if name || label || value || hint || visible
20
22
  puts " name, label, value: #{name}" if name
21
23
  elsif name == label
22
- puts type.to_s if name || label || value || hint || visible
23
24
  puts " name, label: #{name}" if name
24
25
  puts " value: #{value}" if value
25
26
  elsif name == value
26
- puts type.to_s if name || label || value || hint || visible
27
27
  puts " name, value: #{name}" if name
28
28
  puts " label: #{label}" if label
29
29
  else
30
- puts type.to_s if name || label || value || hint || visible
31
30
  puts " name: #{name}" if name
32
31
  puts " label: #{label}" if label
33
32
  puts " value: #{value}" if value
@@ -60,23 +59,23 @@ module Appium
60
59
  def page(opts = {})
61
60
  class_name = opts.is_a?(Hash) ? opts.fetch(:class, nil) : opts
62
61
 
62
+ source = get_source
63
+
63
64
  # current_context may be nil which breaks start_with
64
65
  if current_context && current_context.start_with?('WEBVIEW')
65
- s = get_source
66
66
  parser = @android_html_parser ||= Nokogiri::HTML::SAX::Parser.new(Appium::Common::HTMLElements.new)
67
67
  parser.document.reset
68
68
  parser.document.filter = class_name
69
- parser.parse s
69
+ parser.parse source
70
70
  result = parser.document.result
71
71
  puts result
72
72
  result
73
73
  else
74
- s = get_source
75
74
  parser = Nokogiri::XML::SAX::Parser.new(UITestElementsPrinter.new)
76
75
  if class_name
77
76
  parser.document.filter = class_name.is_a?(Symbol) ? class_name.to_s : class_name
78
77
  end
79
- parser.parse s
78
+ parser.parse source
80
79
  nil
81
80
  end
82
81
  end
@@ -94,6 +93,7 @@ module Appium
94
93
  # @return [Element]
95
94
  def ele_index(class_name, index)
96
95
  raise 'Index must be >= 1' unless index == 'last()' || (index.is_a?(Integer) && index >= 1)
96
+
97
97
  elements = tags(class_name)
98
98
 
99
99
  if index == 'last()'
@@ -105,6 +105,7 @@ module Appium
105
105
  end
106
106
 
107
107
  raise _no_such_element if result.nil?
108
+
108
109
  result
109
110
  end
110
111
 
@@ -147,6 +148,7 @@ module Appium
147
148
  def find_ele_by_predicate(class_name: '*', value:)
148
149
  elements = find_eles_by_predicate(class_name: class_name, value: value)
149
150
  raise _no_such_element if elements.empty?
151
+
150
152
  elements.first
151
153
  end
152
154
 
@@ -156,12 +158,12 @@ module Appium
156
158
  # @param class_name [String] the tag name to match
157
159
  # @return [Array<Element>]
158
160
  def find_eles_by_predicate(class_name: '*', value:)
159
- predicate = if class_name == '*'
160
- %(name ==[c] "#{value}" || label ==[c] "#{value}" || value ==[c] "#{value}")
161
- else
162
- %(type == "#{class_name}" && ) +
163
- %((name ==[c] "#{value}" || label ==[c] "#{value}" || value ==[c] "#{value}"))
164
- end
161
+ predicate = if class_name == '*'
162
+ %(name ==[c] "#{value}" || label ==[c] "#{value}" || value ==[c] "#{value}")
163
+ else
164
+ %(type == "#{class_name}" && ) +
165
+ %((name ==[c] "#{value}" || label ==[c] "#{value}" || value ==[c] "#{value}"))
166
+ end
165
167
  @driver.find_elements :predicate, predicate
166
168
  end
167
169
 
@@ -192,6 +194,7 @@ module Appium
192
194
  def find_ele_by_predicate_include(class_name: '*', value:)
193
195
  elements = find_eles_by_predicate_include(class_name: class_name, value: value)
194
196
  raise _no_such_element if elements.empty?
197
+
195
198
  elements.first
196
199
  end
197
200
 
@@ -280,17 +283,17 @@ module Appium
280
283
  # @return [String]
281
284
  def string_visible_contains(element, value)
282
285
  contains = {
283
- target: value,
284
- substring: true,
286
+ target: value,
287
+ substring: true,
285
288
  insensitive: true
286
289
  }
287
290
 
288
291
  {
289
- typeArray: [element],
292
+ typeArray: [element],
290
293
  onlyVisible: true,
291
- name: contains,
292
- label: contains,
293
- value: contains
294
+ name: contains,
295
+ label: contains,
296
+ value: contains
294
297
  }
295
298
  end
296
299
 
@@ -319,17 +322,17 @@ module Appium
319
322
  # @return [String]
320
323
  def string_visible_exact(element, value)
321
324
  exact = {
322
- target: value,
323
- substring: false,
325
+ target: value,
326
+ substring: false,
324
327
  insensitive: false
325
328
  }
326
329
 
327
330
  {
328
- typeArray: [element],
331
+ typeArray: [element],
329
332
  onlyVisible: true,
330
- name: exact,
331
- label: exact,
332
- value: exact
333
+ name: exact,
334
+ label: exact,
335
+ value: exact
333
336
  }
334
337
  end
335
338
 
@@ -359,6 +362,7 @@ module Appium
359
362
  def _all_pred(opts)
360
363
  predicate = opts[:predicate]
361
364
  raise 'predicate must be provided' unless predicate
365
+
362
366
  visible = opts.fetch :visible, true
363
367
  %($.mainApp().getAllWithPredicate("#{predicate}", #{visible});)
364
368
  end
@@ -386,10 +390,11 @@ module Appium
386
390
 
387
391
  def _validate_object(*objects)
388
392
  raise 'objects must be an array' unless objects.is_a? Array
393
+
389
394
  objects.each do |obj|
390
395
  next unless obj # obj may be nil. if so, ignore.
391
396
 
392
- valid_keys = [:target, :substring, :insensitive]
397
+ valid_keys = %i[target substring insensitive]
393
398
  unknown_keys = obj.keys - valid_keys
394
399
  raise "Unknown keys: #{unknown_keys}" unless unknown_keys.empty?
395
400
 
@@ -434,7 +439,7 @@ module Appium
434
439
  # }
435
440
  #
436
441
  def _by_json(opts)
437
- valid_keys = [:typeArray, :onlyFirst, :onlyVisible, :name, :label, :value]
442
+ valid_keys = %i(typeArray onlyFirst onlyVisible name label value)
438
443
  unknown_keys = opts.keys - valid_keys
439
444
  raise "Unknown keys: #{unknown_keys}" unless unknown_keys.empty?
440
445
 
@@ -468,7 +473,7 @@ module Appium
468
473
  JS
469
474
 
470
475
  res = execute_script element_or_elements_by_type
471
- res ? res : raise(Appium::Ios::CommandError, 'mainWindow is nil')
476
+ res || raise(Appium::Ios::CommandError, 'mainWindow is nil')
472
477
  end
473
478
 
474
479
  # For Appium(automation name), not XCUITest
@@ -491,8 +496,9 @@ module Appium
491
496
  # see eles_by_json
492
497
  def ele_by_json(opts)
493
498
  opts[:onlyFirst] = true
494
- result = _by_json(opts).first
499
+ result = _by_json(opts).first
495
500
  raise _no_such_element if result.nil?
501
+
496
502
  result
497
503
  end
498
504
  end # module Ios
@@ -16,6 +16,7 @@ module Appium
16
16
  def button(value)
17
17
  # return button at index.
18
18
  return ele_index button_class, value if value.is_a? Numeric
19
+
19
20
  ele_by_json_visible_contains button_class, value
20
21
  end
21
22
 
@@ -25,6 +26,7 @@ module Appium
25
26
  # @return [Array<UIAButton|XCUIElementTypeButton>]
26
27
  def buttons(value = false)
27
28
  return tags button_class unless value
29
+
28
30
  eles_by_json_visible_contains button_class, value
29
31
  end
30
32
 
@@ -33,6 +33,7 @@ module Appium
33
33
  def raise_error_if_no_element(element)
34
34
  error_message = 'An element could not be located on the page using the given search parameters.'
35
35
  raise(::Selenium::WebDriver::Error::NoSuchElementError, error_message) if element.nil?
36
+
36
37
  element
37
38
  end
38
39
 
@@ -15,6 +15,7 @@ module Appium
15
15
  # @return [UIAStaticText|XCUIElementTypeStaticText]
16
16
  def text(value)
17
17
  return ele_index static_text_class, value if value.is_a? Numeric
18
+
18
19
  ele_by_json_visible_contains static_text_class, value
19
20
  end
20
21
 
@@ -24,6 +25,7 @@ module Appium
24
25
  # @return [Array<UIAStaticText|XCUIElementTypeStaticText>]
25
26
  def texts(value = false)
26
27
  return tags static_text_class unless value
28
+
27
29
  eles_by_json_visible_contains static_text_class, value
28
30
  end
29
31
 
@@ -25,11 +25,12 @@ module Appium
25
25
  if value.is_a? Numeric
26
26
  index = value
27
27
  raise "#{index} is not a valid index. Must be >= 1" if index <= 0
28
+
28
29
  index -= 1 # eles_by_json and _textfields_with_predicate is 0 indexed.
29
30
  result = eles_by_json(_textfield_visible)[index]
30
31
  raise _no_such_element if result.nil?
31
- return result
32
32
 
33
+ return result
33
34
  end
34
35
 
35
36
  ele_by_json _textfield_contains_string value
@@ -41,6 +42,7 @@ module Appium
41
42
  # @return [Array<TextField>]
42
43
  def textfields(value = false)
43
44
  return eles_by_json _textfield_visible unless value
45
+
44
46
  eles_by_json _textfield_contains_string value
45
47
  end
46
48
 
@@ -55,6 +57,7 @@ module Appium
55
57
  def last_textfield
56
58
  result = eles_by_json(_textfield_visible).last
57
59
  raise _no_such_element if result.nil?
60
+
58
61
  result
59
62
  end
60
63
 
@@ -82,7 +85,7 @@ module Appium
82
85
  # Appium
83
86
  def _textfield_exact_string(value)
84
87
  exact = { target: value, substring: false, insensitive: false }
85
- exact_obj = { name: exact, label: exact, value: exact }
88
+ exact_obj = { name: exact, label: exact, value: exact }
86
89
  _textfield_visible.merge(exact_obj)
87
90
  end
88
91
 
@@ -36,7 +36,7 @@ module Appium
36
36
  predicate_string: nil)
37
37
  return 'Set "up", "down", "left" or "right" for :direction' unless %w(up down left right).include?(direction)
38
38
 
39
- args = { direction: direction }
39
+ args = { direction: direction }
40
40
  args[:element] = element.ref if element
41
41
  args[:distance] = distance if distance
42
42
  args[:name] = name if name
@@ -68,7 +68,7 @@ module Appium
68
68
  # double_tap x: 100, y: 100
69
69
  # double_tap element: find_element(:accessibility_id, "some item")
70
70
  # ```
71
- def double_tap(x: nil, y: nil, element: nil)
71
+ def double_tap(x: nil, y: nil, element: nil) # rubocop:disable Naming/UncommunicativeMethodParamName
72
72
  return 'Set x, y or element' if (x.nil? || y.nil?) && element.nil?
73
73
 
74
74
  args = element.nil? ? { x: x, y: y } : { element: element.ref }
@@ -85,7 +85,7 @@ module Appium
85
85
  # touch_and_hold x: 100, y: 100, duration: 2.0
86
86
  # touch_and_hold element: find_element(:accessibility_id, "some item")
87
87
  # ```
88
- def touch_and_hold(x: nil, y: nil, element: nil, duration: 1.0)
88
+ def touch_and_hold(x: nil, y: nil, element: nil, duration: 1.0) # rubocop:disable Naming/UncommunicativeMethodParamName
89
89
  return 'Set x, y or element' if (x.nil? || y.nil?) && element.nil?
90
90
 
91
91
  args = element.nil? ? { x: x, y: y } : { element: element.ref }
@@ -113,7 +113,7 @@ module Appium
113
113
  # tap x: 100, y: 100
114
114
  # tap x: 100, y: 100, element: find_element(:accessibility_id, "some item")
115
115
  # ```
116
- def tap(x:, y:, element: nil)
116
+ def tap(x:, y:, element: nil) # rubocop:disable Naming/UncommunicativeMethodParamName
117
117
  args = { x: x, y: y }
118
118
  args[:element] = element.ref if element
119
119
  @driver.execute_script 'mobile: tap', args
@@ -17,6 +17,7 @@ module Appium
17
17
  def button(value)
18
18
  # return button at index.
19
19
  return ele_index button_class, value if value.is_a? Numeric
20
+
20
21
  raise_error_if_no_element buttons(value).first
21
22
  end
22
23
 
@@ -26,6 +27,7 @@ module Appium
26
27
  # @return [Array<UIAButton|XCUIElementTypeButton>]
27
28
  def buttons(value = false)
28
29
  return tags button_class unless value
30
+
29
31
  elements = find_eles_by_predicate_include(class_name: button_class, value: value)
30
32
  select_visible_elements elements
31
33
  end
@@ -37,6 +37,7 @@ module Appium
37
37
  def raise_error_if_no_element(element)
38
38
  error_message = 'An element could not be located on the page using the given search parameters.'
39
39
  raise(::Selenium::WebDriver::Error::NoSuchElementError, error_message) if element.nil?
40
+
40
41
  element
41
42
  end
42
43
 
@@ -16,6 +16,7 @@ module Appium
16
16
  # @return [UIAStaticText|XCUIElementTypeStaticText]
17
17
  def text(value)
18
18
  return ele_index static_text_class, value if value.is_a? Numeric
19
+
19
20
  raise_error_if_no_element texts(value).first
20
21
  end
21
22
 
@@ -25,6 +26,7 @@ module Appium
25
26
  # @return [Array<UIAStaticText|XCUIElementTypeStaticText>]
26
27
  def texts(value = false)
27
28
  return tags static_text_class unless value
29
+
28
30
  elements = find_eles_by_predicate_include(class_name: static_text_class, value: value)
29
31
  select_visible_elements elements
30
32
  end
@@ -24,9 +24,11 @@ module Appium
24
24
  if value.is_a? Numeric
25
25
  index = value
26
26
  raise "#{index} is not a valid index. Must be >= 1" if index <= 0
27
+
27
28
  index -= 1 # eles_by_json and _textfields_with_predicate is 0 indexed.
28
29
  result = _textfields_with_predicate[index]
29
30
  raise _no_such_element if result.nil?
31
+
30
32
  return result
31
33
 
32
34
  end
@@ -56,6 +58,7 @@ module Appium
56
58
  def last_textfield
57
59
  result = _textfields_with_predicate.last
58
60
  raise _no_such_element if result.nil?
61
+
59
62
  result
60
63
  end
61
64
 
@@ -26,6 +26,7 @@ module Appium
26
26
  def last_ele(class_name)
27
27
  visible_elements = tags class_name
28
28
  raise _no_such_element if visible_elements.empty?
29
+
29
30
  visible_elements.last
30
31
  end
31
32
 
@@ -59,8 +60,7 @@ module Appium
59
60
  c_names = class_names.map { |class_name| %(type == "#{class_name}") }.join(' || ')
60
61
 
61
62
  predicate = if value
62
- %((#{c_names}) && ) +
63
- %((name contains[c] "#{value}" || label contains[c] "#{value}" || value contains[c] "#{value}"))
63
+ %((#{c_names}) && (name contains[c] "#{value}" || label contains[c] "#{value}" || value contains[c] "#{value}")) # rubocop:disable Metrics/LineLength
64
64
  else
65
65
  c_names
66
66
  end
@@ -82,8 +82,7 @@ module Appium
82
82
  c_names = class_names.map { |class_name| %(type == "#{class_name}") }.join(' || ')
83
83
 
84
84
  predicate = if value
85
- %((#{c_names}) && ) +
86
- %((name ==[c] "#{value}" || label ==[c] "#{value}" || value ==[c] "#{value}"))
85
+ %((#{c_names}) && (name ==[c] "#{value}" || label ==[c] "#{value}" || value ==[c] "#{value}"))
87
86
  else
88
87
  c_names
89
88
  end
@@ -1,5 +1,5 @@
1
1
  module Appium
2
2
  # Version and Date are defined on the 'Appium' module, not 'Appium::Common'
3
- VERSION = '9.15.1'.freeze unless defined? ::Appium::VERSION
4
- DATE = '2018-08-27'.freeze unless defined? ::Appium::DATE
3
+ VERSION = '9.15.2'.freeze unless defined? ::Appium::VERSION
4
+ DATE = '2018-11-07'.freeze unless defined? ::Appium::DATE
5
5
  end
@@ -1,3 +1,13 @@
1
+ #### v9.15.1 2018-08-27
2
+
3
+ - [14d1835](https://github.com/appium/ruby_lib/commit/14d1835fc2d8385af5b8b4489d6b6bb077e510e4) [Release 9 15 1 (#817)](https://github.com/appium/ruby_lib/issues/817)
4
+ - [5f6c18e](https://github.com/appium/ruby_lib/commit/5f6c18ed9774fe027ee748e812ff91ee6d15a130) [Add extend core (#816)](https://github.com/appium/ruby_lib/issues/816)
5
+ - [c6e5321](https://github.com/appium/ruby_lib/commit/c6e532186b7552212ba61ab2e351dba247a35312) [Tweak gemspec (#814)](https://github.com/appium/ruby_lib/issues/814)
6
+ - [2864eec](https://github.com/appium/ruby_lib/commit/2864eec1d05fb69a461c37e4295f159aebe406ca) [add tests and tweak helpers which handle xml (#813)](https://github.com/appium/ruby_lib/issues/813)
7
+ - [e04afe9](https://github.com/appium/ruby_lib/commit/e04afe92dbe6ea38773c234deb97cb4a7f8ffdd2) [Revert "Use ::REXML::Document by default in CountElements (#811)" (#812)](https://github.com/appium/ruby_lib/issues/811)
8
+ - [1dcc665](https://github.com/appium/ruby_lib/commit/1dcc6650974a57369cc6b087b577cc1146bdaa1f) [Use ::REXML::Document by default in CountElements (#811)](https://github.com/appium/ruby_lib/issues/811)
9
+
10
+
1
11
  #### v9.15.0 2018-08-10
2
12
 
3
13
  - [b09ea84](https://github.com/appium/ruby_lib/commit/b09ea848cc595d8d3ef6494e0a26770521b9432c) [Release 9 15 0 (#810)](https://github.com/appium/ruby_lib/issues/810)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appium_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.15.1
4
+ version: 9.15.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - code@bootstraponline.com
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-27 00:00:00.000000000 Z
12
+ date: 2018-11-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: appium_lib_core
@@ -25,20 +25,6 @@ dependencies:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: 2.0.0
28
- - !ruby/object:Gem::Dependency
29
- name: tomlrb
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - "~>"
33
- - !ruby/object:Gem::Version
34
- version: '1.1'
35
- type: :runtime
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "~>"
40
- - !ruby/object:Gem::Version
41
- version: '1.1'
42
28
  - !ruby/object:Gem::Dependency
43
29
  name: nokogiri
44
30
  requirement: !ruby/object:Gem::Requirement
@@ -60,137 +46,137 @@ dependencies:
60
46
  - !ruby/object:Gem::Version
61
47
  version: 1.8.1
62
48
  - !ruby/object:Gem::Dependency
63
- name: posix-spawn
49
+ name: tomlrb
64
50
  requirement: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '0.3'
69
- type: :development
54
+ version: '1.1'
55
+ type: :runtime
70
56
  prerelease: false
71
57
  version_requirements: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '0.3'
61
+ version: '1.1'
76
62
  - !ruby/object:Gem::Dependency
77
- name: hashdiff
63
+ name: fakefs
78
64
  requirement: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: 0.2.2
68
+ version: 0.13.0
83
69
  type: :development
84
70
  prerelease: false
85
71
  version_requirements: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: 0.2.2
75
+ version: 0.13.0
90
76
  - !ruby/object:Gem::Dependency
91
- name: spec
77
+ name: hashdiff
92
78
  requirement: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '5.3'
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- version: 5.3.4
82
+ version: 0.3.7
100
83
  type: :development
101
84
  prerelease: false
102
85
  version_requirements: !ruby/object:Gem::Requirement
103
86
  requirements:
104
87
  - - "~>"
105
88
  - !ruby/object:Gem::Version
106
- version: '5.3'
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: 5.3.4
89
+ version: 0.3.7
110
90
  - !ruby/object:Gem::Dependency
111
- name: fakefs
91
+ name: posix-spawn
112
92
  requirement: !ruby/object:Gem::Requirement
113
93
  requirements:
114
94
  - - "~>"
115
95
  - !ruby/object:Gem::Version
116
- version: 0.6.7
96
+ version: '0.3'
117
97
  type: :development
118
98
  prerelease: false
119
99
  version_requirements: !ruby/object:Gem::Requirement
120
100
  requirements:
121
101
  - - "~>"
122
102
  - !ruby/object:Gem::Version
123
- version: 0.6.7
103
+ version: '0.3'
124
104
  - !ruby/object:Gem::Dependency
125
- name: rake
105
+ name: pry
126
106
  requirement: !ruby/object:Gem::Requirement
127
107
  requirements:
128
- - - "~>"
108
+ - - ">="
129
109
  - !ruby/object:Gem::Version
130
- version: '12.0'
110
+ version: '0'
131
111
  type: :development
132
112
  prerelease: false
133
113
  version_requirements: !ruby/object:Gem::Requirement
134
114
  requirements:
135
- - - "~>"
115
+ - - ">="
136
116
  - !ruby/object:Gem::Version
137
- version: '12.0'
117
+ version: '0'
138
118
  - !ruby/object:Gem::Dependency
139
- name: yard
119
+ name: rake
140
120
  requirement: !ruby/object:Gem::Requirement
141
121
  requirements:
142
122
  - - "~>"
143
123
  - !ruby/object:Gem::Version
144
- version: 0.9.11
124
+ version: '12.0'
145
125
  type: :development
146
126
  prerelease: false
147
127
  version_requirements: !ruby/object:Gem::Requirement
148
128
  requirements:
149
129
  - - "~>"
150
130
  - !ruby/object:Gem::Version
151
- version: 0.9.11
131
+ version: '12.0'
152
132
  - !ruby/object:Gem::Dependency
153
133
  name: rubocop
154
134
  requirement: !ruby/object:Gem::Requirement
155
135
  requirements:
156
136
  - - "~>"
157
137
  - !ruby/object:Gem::Version
158
- version: 0.46.0
138
+ version: 0.60.0
159
139
  type: :development
160
140
  prerelease: false
161
141
  version_requirements: !ruby/object:Gem::Requirement
162
142
  requirements:
163
143
  - - "~>"
164
144
  - !ruby/object:Gem::Version
165
- version: 0.46.0
145
+ version: 0.60.0
166
146
  - !ruby/object:Gem::Dependency
167
- name: rainbow
147
+ name: spec
168
148
  requirement: !ruby/object:Gem::Requirement
169
149
  requirements:
170
150
  - - "~>"
171
151
  - !ruby/object:Gem::Version
172
- version: 2.1.0
152
+ version: '5.3'
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 5.3.4
173
156
  type: :development
174
157
  prerelease: false
175
158
  version_requirements: !ruby/object:Gem::Requirement
176
159
  requirements:
177
160
  - - "~>"
178
161
  - !ruby/object:Gem::Version
179
- version: 2.1.0
162
+ version: '5.3'
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 5.3.4
180
166
  - !ruby/object:Gem::Dependency
181
- name: pry
167
+ name: yard
182
168
  requirement: !ruby/object:Gem::Requirement
183
169
  requirements:
184
- - - ">="
170
+ - - "~>"
185
171
  - !ruby/object:Gem::Version
186
- version: '0'
172
+ version: 0.9.11
187
173
  type: :development
188
174
  prerelease: false
189
175
  version_requirements: !ruby/object:Gem::Requirement
190
176
  requirements:
191
- - - ">="
177
+ - - "~>"
192
178
  - !ruby/object:Gem::Version
193
- version: '0'
179
+ version: 0.9.11
194
180
  description: Ruby library for Appium.
195
181
  email:
196
182
  - code@bootstraponline.com