appium_lib_core 3.5.0 → 3.9.0

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,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b62c59d17450d1d9c3f8ebed9ca3b3aacaa1deaf3cfe9e114699a8e8bf82460
4
- data.tar.gz: d212637f293f9545044a77acf07b4ba2209bda5a76d049ed27a354fb7514ab00
3
+ metadata.gz: 3460051d458ee50ac23d5a2d6ebf9d5404382a63740de60e2c51284db5da7418
4
+ data.tar.gz: bf58c7552b40d2461fc03bf0f06eb1845cc04c801f6bafa4e13d1f8448627c73
5
5
  SHA512:
6
- metadata.gz: 12a1336c1600c555c9c02030bd4a090d2a59569160ef6a14973077f336662a06d1d078cedcd1971f9688533d36b076b422bd92fed6d060880c6da7fdc200c50d
7
- data.tar.gz: 93072d58a034a15cf78d3e95b4f524eb0a91708529af9cfde5e4cc3bffa51c8333d3f0a38080cb96d6dfe8e39fb5af4355b33c8a73fe78f248b6e7ee1358ecb2
6
+ metadata.gz: 16368ab0315f00e08232551751422cc5cbfe89e0c0b5b046d8ac3543e5c3d3253c4a27f50cadb7b7c6209df6d06e52bcfc7861bdee3126ab44e568950301da14
7
+ data.tar.gz: e5b0b72438585da43ba935584aeb58c0c17d3ce8463b724565afaa52260a2cd6e0c8727e89f219723d3c96aac527ca70b9b8f6ee49d7ef5f0f40f42d15e6c8c9
@@ -15,7 +15,7 @@ Metrics/CyclomaticComplexity:
15
15
  Metrics/PerceivedComplexity:
16
16
  Max: 13
17
17
  Metrics/ParameterLists:
18
- Max: 6
18
+ Enabled: false
19
19
  Lint/NestedMethodDefinition:
20
20
  Enabled: false
21
21
  # TODO: Replace <<- with <<~ after dropping Ruby 2.2
@@ -42,5 +42,7 @@ Naming/MemoizedInstanceVariableName:
42
42
  Enabled: true
43
43
  Exclude:
44
44
  - test/**/*
45
+ Naming/RescuedExceptionsVariableName:
46
+ Enabled: false
45
47
  Layout/RescueEnsureAlignment:
46
48
  Enabled: false
@@ -10,6 +10,61 @@ Read `release_notes.md` for commit level details.
10
10
 
11
11
  ### Deprecations
12
12
 
13
+ ## [3.9.0] - 2020-05-31
14
+
15
+ ### Enhancements
16
+ - `capabilities:` is available in addition to `desired_capabilities:` and `caps:` as a capability
17
+ ```ruby
18
+ # case 1
19
+ opts = { caps: { }, appium_lib: { } }
20
+ @driver = Appium::Core.for(opts).start_driver
21
+
22
+ # case 2
23
+ opts = { capabilities: { }, appium_lib: { } }
24
+ @driver = Appium::Core.for(opts).start_driver
25
+
26
+ # case 3
27
+ opts = { desired_capabilities: { }, appium_lib: { } }
28
+ @driver = Appium::Core.for(opts).start_driver
29
+ ```
30
+
31
+ ### Bug fixes
32
+
33
+ ### Deprecations
34
+
35
+ ## [3.8.0] - 2020-05-17
36
+
37
+ ### Enhancements
38
+ - Add options for `start_recording_screen`
39
+ - `file_field_name`, `form_fields` and `headers` are available since Appium 1.18.0
40
+
41
+ ### Bug fixes
42
+ - Fix `x-idempotency-key` header to add it only in new session request (https://github.com/appium/ruby_lib_core/issues/262)
43
+
44
+ ### Deprecations
45
+
46
+ ## [3.7.0] - 2020-04-18
47
+
48
+ ### Enhancements
49
+ - Add `x-idempotency-key` header support (https://github.com/appium/appium-base-driver/pull/400)
50
+ - Can disable the header with `enable_idempotency_header: false` in `appium_lib` capability. Defaults to `true`.
51
+ - Add chrome devtools endpoint which is available chrome module in Selenium Ruby binding
52
+ - https://github.com/appium/appium-base-driver/pull/405
53
+
54
+ ### Bug fixes
55
+
56
+ ### Deprecations
57
+
58
+ ## [3.6.1, 3.6.0] - 2020-03-15
59
+
60
+ ### Enhancements
61
+ - Add screen record feature for Windows driver (https://github.com/appium/appium-windows-driver/pull/66)
62
+ - `#start_recording_screen`, `#stop_recording_screen`
63
+
64
+ ### Bug fixes
65
+
66
+ ### Deprecations
67
+
13
68
  ## [3.5.0] - 2020-01-11
14
69
 
15
70
  ### Enhancements
data/Rakefile CHANGED
@@ -56,6 +56,13 @@ namespace :test do
56
56
  t.libs << 'lib'
57
57
  t.test_files = FileList['test/unit/common/**/*_test.rb']
58
58
  end
59
+
60
+ desc('Run all Windows related unit tests in test directory')
61
+ Rake::TestTask.new(:windows) do |t|
62
+ t.libs << 'test'
63
+ t.libs << 'lib'
64
+ t.test_files = FileList['test/unit/windows/**/*_test.rb']
65
+ end
59
66
  end
60
67
  end
61
68
 
@@ -26,12 +26,12 @@ Gem::Specification.new do |spec|
26
26
  spec.add_runtime_dependency 'faye-websocket', '~> 0.10.0'
27
27
 
28
28
  spec.add_development_dependency 'bundler', '>= 1.14'
29
- spec.add_development_dependency 'rake', '~> 12.0'
29
+ spec.add_development_dependency 'rake', '~> 13.0'
30
30
  spec.add_development_dependency 'yard', '~> 0.9.11'
31
31
  spec.add_development_dependency 'minitest', '~> 5.0'
32
32
  spec.add_development_dependency 'minitest-reporters', '~> 1.1'
33
- spec.add_development_dependency 'webmock', '~> 3.4.0'
34
- spec.add_development_dependency 'rubocop', '0.61.0'
33
+ spec.add_development_dependency 'webmock', '~> 3.8.0'
34
+ spec.add_development_dependency 'rubocop', '0.68.1'
35
35
  spec.add_development_dependency 'appium_thor', '~> 1.0'
36
36
  spec.add_development_dependency 'pry'
37
37
  spec.add_development_dependency 'pry-byebug'
@@ -18,7 +18,7 @@ echo ${ANDROID_HOME}/emulator/emulator -list-avds
18
18
  echo "Starting emulator"
19
19
 
20
20
  # Start emulator in background
21
- nohup ${ANDROID_HOME}/emulator/emulator -avd testemulator -no-boot-anim -no-snapshot > /dev/null 2>&1 &
21
+ nohup ${ANDROID_HOME}/emulator/emulator -avd testemulator -accel auto -no-boot-anim -no-snapshot > /dev/null 2>&1 &
22
22
  ${ANDROID_HOME}/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
23
23
 
24
24
  ${ANDROID_HOME}/platform-tools/adb devices
@@ -1,9 +1,9 @@
1
1
  # jobs for functional test
2
2
  parameters:
3
- vmImage: 'macOS-10.14'
4
- vmImageForIOS: 'macOS-10.14' # Not sure the reason, but macOS 10.14 instance raises no info.plist error
5
- xcodeForIOS: 11.3
6
- xcodeForTVOS: 11.3
3
+ vmImage: 'macOS-10.15'
4
+ vmImageForIOS: 'macOS-10.15' # Not sure the reason, but macOS 10.14 instance raises no info.plist error
5
+ xcodeForIOS: 11.5
6
+ xcodeForTVOS: 11.5
7
7
  androidSDK: 29
8
8
  appiumVersion: 'beta'
9
9
  ignoreVersionSkip: true
@@ -213,7 +213,7 @@ module Appium
213
213
  # @driver.get_performance_data package_name: package_name, data_type: data_type, data_read_timeout: 2
214
214
  #
215
215
 
216
- # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil, video_size: nil, time_limit: '180', bit_rate: '4000000', bug_report: nil)
216
+ # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil, video_size: nil, time_limit: '180', bit_rate: '4000000', bug_report: nil)
217
217
  # @param [String] remote_path The path to the remote location, where the resulting video should be uploaded.
218
218
  # The following protocols are supported: http/https, ftp.
219
219
  # Null or empty string value (the default setting) means the content of resulting
@@ -225,6 +225,11 @@ module Appium
225
225
  # @param [String] user The name of the user for the remote authentication.
226
226
  # @param [String] pass The password for the remote authentication.
227
227
  # @param [String] method The http multipart upload method name. The 'PUT' one is used by default.
228
+ # @param [String] file_field_name The name of the form field containing the binary payload in multipart/form-data
229
+ # requests since Appium 1.18.0. Defaults to 'file'.
230
+ # @param [Array<Hash, Array<String>>] form_fields The form fields mapping in multipart/form-data requests since Appium 1.18.0.
231
+ # If any entry has the same key in this mapping, then it is going to be ignored.
232
+ # @param [Hash] headers The additional headers in multipart/form-data requests since Appium 1.18.0.
228
233
  # @param [Boolean] force_restart Whether to try to catch and upload/return the currently running screen recording
229
234
  # (+false+, the default setting on server) or ignore the result of it
230
235
  # and start a new recording immediately (+true+).
@@ -245,6 +250,8 @@ module Appium
245
250
  # @param [Boolean] bug_report Set it to +true+ in order to display additional information on the video overlay,
246
251
  # such as a timestamp, that is helpful in videos captured to illustrate bugs.
247
252
  # This option is only supported since API level 27 (Android P).
253
+ # @return [String] Base64 encoded content of the recorded media file or an empty string
254
+ # if the file has been successfully uploaded to a remote location (depends on the actual options)
248
255
  #
249
256
  # @example
250
257
  #
@@ -283,6 +290,19 @@ module Appium
283
290
  # @driver.finger_print 1
284
291
  #
285
292
 
293
+ # @!method execute_cdp(cmd, params)
294
+ # Execute Chrome Devtools protocol commands
295
+ # https://chromedevtools.github.io/devtools-protocol
296
+ #
297
+ # @param [String] cmd The name of command
298
+ # @param [Hash] params The parameter for the command as hash.
299
+ #
300
+ # @example
301
+ #
302
+ # @driver.execute_cdp 'Page.captureScreenshot', { quality: 50, format: 'jpeg' }
303
+ # @driver.execute_cdp 'Page.getResourceTree'
304
+ #
305
+
286
306
  ####
287
307
  ## class << self
288
308
  ####
@@ -391,6 +411,12 @@ module Appium
391
411
  end
392
412
  end
393
413
 
414
+ ::Appium::Core::Device.add_endpoint_method(:execute_cdp) do
415
+ def execute_cdp(cmd, **params)
416
+ execute :chrome_send_command, {}, { cmd: cmd, params: params }
417
+ end
418
+ end
419
+
394
420
  Screen.add_methods
395
421
  Performance.add_methods
396
422
  Network.add_methods
@@ -25,11 +25,13 @@ module Appium
25
25
  end
26
26
 
27
27
  ::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
28
- # rubocop:disable Metrics/ParameterLists
29
- def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil,
28
+ def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
29
+ file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil,
30
30
  video_size: nil, time_limit: '180', bit_rate: nil, bug_report: nil)
31
31
  option = ::Appium::Core::Base::Device::ScreenRecord.new(
32
- remote_path: remote_path, user: user, pass: pass, method: method, force_restart: force_restart
32
+ remote_path: remote_path, user: user, pass: pass, method: method,
33
+ file_field_name: file_field_name, form_fields: form_fields, headers: headers,
34
+ force_restart: force_restart
33
35
  ).upload_option
34
36
 
35
37
  option[:videoSize] = video_size unless video_size.nil?
@@ -44,7 +46,6 @@ module Appium
44
46
 
45
47
  execute(:start_recording_screen, {}, { options: option })
46
48
  end
47
- # rubocop:enable Metrics/ParameterLists
48
49
  end
49
50
  end
50
51
  end # module Screen
@@ -12,12 +12,20 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'securerandom'
16
+
15
17
  require_relative '../../version'
16
18
 
17
19
  module Appium
18
20
  module Core
19
21
  class Base
20
22
  module Http
23
+ module RequestHeaders
24
+ KEYS = {
25
+ idempotency: 'X-Idempotency-Key'
26
+ }.freeze
27
+ end
28
+
21
29
  class Default < Selenium::WebDriver::Remote::Http::Default
22
30
  DEFAULT_HEADERS = {
23
31
  'Accept' => CONTENT_TYPE,
@@ -26,6 +34,14 @@ module Appium
26
34
  "appium/ruby_lib_core/#{VERSION} (#{::Selenium::WebDriver::Remote::Http::Common::DEFAULT_HEADERS['User-Agent']})"
27
35
  }.freeze
28
36
 
37
+ attr_reader :additional_headers
38
+
39
+ def initialize(open_timeout: nil, read_timeout: nil)
40
+ @open_timeout = open_timeout
41
+ @read_timeout = read_timeout
42
+ @additional_headers = {}
43
+ end
44
+
29
45
  # Update <code>server_url</code> provided when ruby_lib _core created a default http client.
30
46
  # Set <code>@http</code> as nil to re-create http client for the <code>server_url</code>
31
47
  #
@@ -65,19 +81,20 @@ module Appium
65
81
  def call(verb, url, command_hash)
66
82
  url = server_url.merge(url) unless url.is_a?(URI)
67
83
  headers = DEFAULT_HEADERS.dup
84
+ headers = headers.merge @additional_headers unless @additional_headers.empty?
68
85
  headers['Cache-Control'] = 'no-cache' if verb == :get
69
86
 
70
87
  if command_hash
71
88
  payload = JSON.generate(command_hash)
72
89
  headers['Content-Length'] = payload.bytesize.to_s if [:post, :put].include?(verb)
73
-
74
- ::Appium::Logger.info(" >>> #{url} | #{payload}")
75
- ::Appium::Logger.debug(" > #{headers.inspect}")
76
90
  elsif verb == :post
77
91
  payload = '{}'
78
92
  headers['Content-Length'] = '2'
79
93
  end
80
94
 
95
+ ::Appium::Logger.info(" >>> #{url} | #{payload}")
96
+ ::Appium::Logger.info(" > #{headers.inspect}")
97
+
81
98
  request verb, url, headers, payload
82
99
  end
83
100
  end
@@ -94,7 +94,10 @@ module Appium
94
94
  gsm_voice: [:post, 'session/:session_id/appium/device/gsm_voice'],
95
95
  set_network_speed: [:post, 'session/:session_id/appium/device/network_speed'],
96
96
  set_power_capacity: [:post, 'session/:session_id/appium/device/power_capacity'],
97
- set_power_ac: [:post, 'session/:session_id/appium/device/power_ac']
97
+ set_power_ac: [:post, 'session/:session_id/appium/device/power_ac'],
98
+
99
+ # For chromium: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
100
+ chrome_send_command: [:post, 'session/:session_id/goog/cdp/execute']
98
101
  }.freeze
99
102
 
100
103
  COMMAND_IOS = {
@@ -25,7 +25,8 @@ module Appium
25
25
 
26
26
  METHOD = %w(POST PUT).freeze
27
27
 
28
- def initialize(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil)
28
+ def initialize(remote_path: nil, user: nil, pass: nil, method: 'PUT',
29
+ file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil)
29
30
  @upload_option = if remote_path.nil?
30
31
  {}
31
32
  else
@@ -36,6 +37,9 @@ module Appium
36
37
  option[:user] = user unless user.nil?
37
38
  option[:pass] = pass unless pass.nil?
38
39
  option[:method] = method
40
+ option[:fileFieldName] = file_field_name unless file_field_name.nil?
41
+ option[:formFields] = form_fields unless form_fields.nil?
42
+ option[:headers] = headers unless headers.nil?
39
43
  option
40
44
  end
41
45
 
@@ -47,9 +51,11 @@ module Appium
47
51
  end
48
52
 
49
53
  module Command
50
- def stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT')
54
+ def stop_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
55
+ file_field_name: nil, form_fields: nil, headers: nil)
51
56
  option = ::Appium::Core::Base::Device::ScreenRecord.new(
52
- remote_path: remote_path, user: user, pass: pass, method: method
57
+ remote_path: remote_path, user: user, pass: pass, method: method,
58
+ file_field_name: file_field_name, form_fields: form_fields, headers: headers
53
59
  ).upload_option
54
60
 
55
61
  params = option.empty? ? {} : { options: option }
@@ -40,7 +40,7 @@ module Appium
40
40
  :stop_recording_screen, :stop_and_save_recording_screen,
41
41
  :shake, :device_time,
42
42
  :touch_actions, :multi_touch,
43
- :execute_driver
43
+ :execute_driver, :execute_cdp
44
44
  ].each(&method(:delegate_from_appium_driver))
45
45
  end
46
46
 
@@ -27,16 +27,19 @@ module Appium
27
27
  autoload :Xcuitest, 'appium_lib_core/ios_xcuitest'
28
28
  end
29
29
 
30
+ autoload :Windows, 'appium_lib_core/windows'
31
+
30
32
  # This options affects only client side as <code>:appium_lib</code> key.<br>
31
33
  # Read {::Appium::Core::Driver} about each attribute
32
34
  class Options
33
35
  attr_reader :custom_url, :default_wait, :export_session, :export_session_path,
34
36
  :port, :wait_timeout, :wait_interval, :listener,
35
- :direct_connect
37
+ :direct_connect, :enable_idempotency_header
36
38
 
37
39
  def initialize(appium_lib_opts)
38
40
  @custom_url = appium_lib_opts.fetch :server_url, nil
39
41
  @default_wait = appium_lib_opts.fetch :wait, Driver::DEFAULT_IMPLICIT_WAIT
42
+ @enable_idempotency_header = appium_lib_opts.fetch :enable_idempotency_header, true
40
43
 
41
44
  # bump current session id into a particular file
42
45
  @export_session = appium_lib_opts.fetch :export_session, false
@@ -102,6 +105,13 @@ module Appium
102
105
  # @return [Appium::Core::Base::Http::Default] the http client
103
106
  attr_reader :http_client
104
107
 
108
+ # Return if adding 'x-idempotency-key' header is enabled for each new session request.
109
+ # Following commands should not have the key.
110
+ # The key is unique for each http client instance. Defaults to <code>true</code>
111
+ # https://github.com/appium/appium-base-driver/pull/400
112
+ # @return [Bool]
113
+ attr_reader :enable_idempotency_header
114
+
105
115
  # Device type to request from the appium server
106
116
  # @return [Symbol] :android and :ios, for example
107
117
  attr_reader :device
@@ -112,11 +122,11 @@ module Appium
112
122
  attr_reader :automation_name
113
123
 
114
124
  # Custom URL for the selenium server. If set this attribute, ruby_lib_core try to handshake to the custom url.<br>
115
- # Defaults to false. Then try to connect to <code>http://127.0.0.1:#{port}/wd/hub<code>.
125
+ # Defaults to false. Then try to connect to <code>http://127.0.0.1:#{port}/wd/hub</code>.
116
126
  # @return [String]
117
127
  attr_reader :custom_url
118
128
 
119
- # Export session id to textfile in /tmp for 3rd party tools. False bu default.
129
+ # Export session id to textfile in /tmp for 3rd party tools. False by default.
120
130
  # @return [Boolean]
121
131
  attr_reader :export_session
122
132
  # @return [String] By default, session id is exported in '/tmp/appium_lib_session'
@@ -172,7 +182,9 @@ module Appium
172
182
 
173
183
  # Creates a new driver and extend particular methods
174
184
  # @param [Hash] opts A options include capabilities for the Appium Server and for the client.
175
- # @option opts [Hash] :caps Appium capabilities. Prior than :desired_capabilities
185
+ # @option opts [Hash] :caps Appium capabilities.
186
+ # @option opts [Hash] :capabilities The same as :caps.
187
+ # This param is for compatibility with Selenium WebDriver format
176
188
  # @option opts [Hash] :desired_capabilities The same as :caps.
177
189
  # This param is for compatibility with Selenium WebDriver format
178
190
  # @option opts [Appium::Core::Options] :appium_lib Capabilities affect only ruby client
@@ -185,8 +197,8 @@ module Appium
185
197
  #
186
198
  # # format 1
187
199
  # @core = Appium::Core.for caps: {...}, appium_lib: {...}
188
- # # format 2. 'desired_capabilities:' is also available instead of 'caps:'. Either is fine.
189
- # @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", desired_capabilities: {...}, appium_lib: {...}
200
+ # # format 2. 'capabilities:' or 'desired_capabilities:' is also available instead of 'caps:'.
201
+ # @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", capabilities: {...}, appium_lib: {...}
190
202
  # # format 3. 'appium_lib: {...}' can be blank
191
203
  # @core = Appium::Core.for url: "http://127.0.0.1:8080/wd/hub", desired_capabilities: {...}
192
204
  #
@@ -216,9 +228,9 @@ module Appium
216
228
  # @core.start_driver # Connect to 'http://127.0.0.1:8080/wd/hub' because of 'port: 8080'
217
229
  #
218
230
  # # Start iOS driver with .zip file over HTTP
219
- # # 'desired_capabilities:' is also available instead of 'caps:'. Either is fine.
231
+ # # 'desired_capabilities:' or 'capabilities:' is also available instead of 'caps:'. Either is fine.
220
232
  # opts = {
221
- # desired_capabilities: {
233
+ # capabilities: {
222
234
  # platformName: :ios,
223
235
  # platformVersion: '11.0',
224
236
  # deviceName: 'iPhone Simulator',
@@ -340,9 +352,17 @@ module Appium
340
352
  http_client_ops: { http_client: nil, open_timeout: 999_999, read_timeout: 999_999 })
341
353
  @custom_url ||= server_url || "http://127.0.0.1:#{@port}/wd/hub"
342
354
 
343
- create_http_client http_client: http_client_ops.delete(:http_client),
344
- open_timeout: http_client_ops.delete(:open_timeout),
345
- read_timeout: http_client_ops.delete(:read_timeout)
355
+ @http_client = get_http_client http_client: http_client_ops.delete(:http_client),
356
+ open_timeout: http_client_ops.delete(:open_timeout),
357
+ read_timeout: http_client_ops.delete(:read_timeout)
358
+
359
+ if @enable_idempotency_header
360
+ if @http_client.instance_variable_defined? :@additional_headers
361
+ @http_client.additional_headers[Appium::Core::Base::Http::RequestHeaders::KEYS[:idempotency]] = SecureRandom.uuid
362
+ else
363
+ ::Appium::Logger.warn 'No additional_headers attribute in this http client instance'
364
+ end
365
+ end
346
366
 
347
367
  begin
348
368
  # included https://github.com/SeleniumHQ/selenium/blob/43f8b3f66e7e01124eff6a5805269ee441f65707/rb/lib/selenium/webdriver/remote/driver.rb#L29
@@ -362,6 +382,11 @@ module Appium
362
382
  raise "ERROR: Unable to connect to Appium. Is the server running on #{@custom_url}?"
363
383
  end
364
384
 
385
+ if @http_client.instance_variable_defined? :@additional_headers
386
+ # We only need the key for a new session request. Should remove it for other following commands.
387
+ @http_client.additional_headers.delete Appium::Core::Base::Http::RequestHeaders::KEYS[:idempotency]
388
+ end
389
+
365
390
  # If "automationName" is set only server side, this method set "automationName" attribute into @automation_name.
366
391
  # Since @automation_name is set only client side before start_driver is called.
367
392
  set_automation_name_if_nil
@@ -373,12 +398,14 @@ module Appium
373
398
 
374
399
  private
375
400
 
376
- def create_http_client(http_client: nil, open_timeout: nil, read_timeout: nil)
377
- @http_client = http_client || Appium::Core::Base::Http::Default.new
401
+ def get_http_client(http_client: nil, open_timeout: nil, read_timeout: nil)
402
+ client = http_client || Appium::Core::Base::Http::Default.new
378
403
 
379
404
  # open_timeout and read_timeout are explicit wait.
380
- @http_client.open_timeout = open_timeout if open_timeout
381
- @http_client.read_timeout = read_timeout if read_timeout
405
+ client.open_timeout = open_timeout if open_timeout
406
+ client.read_timeout = read_timeout if read_timeout
407
+
408
+ client
382
409
  end
383
410
 
384
411
  # Ignore setting default wait if the target driver has no implementation
@@ -475,25 +502,24 @@ module Appium
475
502
  when :android
476
503
  case automation_name
477
504
  when :espresso
478
- ::Appium::Core::Android::Espresso::Bridge.for(self)
505
+ ::Appium::Core::Android::Espresso::Bridge.for self
479
506
  when :uiautomator2
480
- ::Appium::Core::Android::Uiautomator2::Bridge.for(self)
507
+ ::Appium::Core::Android::Uiautomator2::Bridge.for self
481
508
  else # default and UiAutomator
482
- ::Appium::Core::Android::Uiautomator1::Bridge.for(self)
509
+ ::Appium::Core::Android::Uiautomator1::Bridge.for self
483
510
  end
484
511
  when :ios, :tvos
485
512
  case automation_name
486
513
  when :xcuitest
487
- ::Appium::Core::Ios::Xcuitest::Bridge.for(self)
514
+ ::Appium::Core::Ios::Xcuitest::Bridge.for self
488
515
  else # default and UIAutomation
489
- ::Appium::Core::Ios::Uiautomation::Bridge.for(self)
516
+ ::Appium::Core::Ios::Uiautomation::Bridge.for self
490
517
  end
491
518
  when :mac
492
519
  # no Mac specific extentions
493
520
  ::Appium::Logger.debug('mac')
494
521
  when :windows
495
- # no windows specific extentions
496
- ::Appium::Logger.debug('windows')
522
+ ::Appium::Core::Windows::Bridge.for self
497
523
  when :tizen
498
524
  # https://github.com/Samsung/appium-tizen-driver
499
525
  ::Appium::Logger.debug('tizen')
@@ -517,7 +543,10 @@ module Appium
517
543
  def validate_keys(opts)
518
544
  flatten_ops = flatten_hash_keys(opts)
519
545
 
520
- raise Error::NoCapabilityError unless opts.member?(:caps) || opts.member?(:desired_capabilities)
546
+ # FIXME: Remove 'desired_capabilities' in the next major Selenium update
547
+ unless opts.member?(:caps) || opts.member?(:capabilities) || opts.member?(:desired_capabilities)
548
+ raise Error::NoCapabilityError
549
+ end
521
550
 
522
551
  if !opts.member?(:appium_lib) && flatten_ops.member?(:appium_lib)
523
552
  raise Error::CapabilityStructureError, 'Please check the value of appium_lib in the capability'
@@ -538,7 +567,8 @@ module Appium
538
567
 
539
568
  # @private
540
569
  def get_caps(opts)
541
- Core::Base::Capabilities.create_capabilities(opts[:caps] || opts[:desired_capabilities] || {})
570
+ # FIXME: Remove 'desired_capabilities' in the next major Selenium update
571
+ Core::Base::Capabilities.create_capabilities(opts[:caps] || opts[:capabilities] || opts[:desired_capabilities] || {})
542
572
  end
543
573
 
544
574
  # @private
@@ -569,6 +599,7 @@ module Appium
569
599
  opts = Options.new appium_lib_opts
570
600
 
571
601
  @custom_url ||= opts.custom_url # Keep existence capability if it's already provided
602
+ @enable_idempotency_header = opts.enable_idempotency_header
572
603
 
573
604
  @default_wait = opts.default_wait
574
605
 
@@ -51,7 +51,7 @@ module Appium
51
51
  #
52
52
 
53
53
  # @since Appium 1.9.1
54
- # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: nil, force_restart: nil, video_type: 'mjpeg', video_fps: nil, time_limit: '180', video_quality: 'medium', video_scale: nil, video_filters: nil, pixel_format: nil)
54
+ # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil, video_type: 'mjpeg', video_fps: nil, time_limit: '180', video_quality: nil, video_scale: nil, video_filters: nil, pixel_format: nil)
55
55
  #
56
56
  # Record the display of devices running iOS Simulator since Xcode 9 or real devices since iOS 11
57
57
  # (ffmpeg utility is required: 'brew install ffmpeg').
@@ -68,6 +68,11 @@ module Appium
68
68
  # @param [String] user The name of the user for the remote authentication.
69
69
  # @param [String] pass The password for the remote authentication.
70
70
  # @param [String] method The http multipart upload method name. The 'PUT' one is used by default.
71
+ # @param [String] file_field_name The name of the form field containing the binary payload in multipart/form-data
72
+ # requests since Appium 1.18.0. Defaults to 'file'.
73
+ # @param [Array<Hash, Array<String>>] form_fields The form fields mapping in multipart/form-data requests since Appium 1.18.0.
74
+ # If any entry has the same key in this mapping, then it is going to be ignored.
75
+ # @param [Hash] headers The additional headers in multipart/form-data requests since Appium 1.18.0.
71
76
  # @param [Boolean] force_restart Whether to try to catch and upload/return the currently running screen recording
72
77
  # (+false+, the default setting on server) or ignore the result of it
73
78
  # and start a new recording immediately (+true+).
@@ -91,6 +96,8 @@ module Appium
91
96
  # - https://www.reddit.com/r/linux4noobs/comments/671z6b/width_not_divisible_by_2_error_when_using_ffmpeg/
92
97
  # @param [String] pixel_format Output pixel format. Run +ffmpeg -pix_fmts+ to list possible values.
93
98
  # For Quicktime compatibility, set to "yuv420p" along with videoType: "libx264".
99
+ # @return [String] Base64 encoded content of the recorded media file or an empty string
100
+ # if the file has been successfully uploaded to a remote location (depends on the actual options)
94
101
  #
95
102
  # @example
96
103
  #
@@ -32,9 +32,11 @@ module Appium
32
32
 
33
33
  ::Appium::Core::Device.add_endpoint_method(:get_performance_record) do
34
34
  def get_performance_record(save_file_path: './performance', profile_name: 'Activity Monitor',
35
- remote_path: nil, user: nil, pass: nil, method: 'PUT')
35
+ remote_path: nil, user: nil, pass: nil, method: 'PUT',
36
+ file_field_name: nil, form_fields: nil, headers: nil)
36
37
  option = ::Appium::Core::Base::Device::ScreenRecord.new(
37
- remote_path: remote_path, user: user, pass: pass, method: method
38
+ remote_path: remote_path, user: user, pass: pass, method: method,
39
+ file_field_name: file_field_name, form_fields: form_fields, headers: headers
38
40
  ).upload_option
39
41
 
40
42
  option[:profileName] = profile_name
@@ -20,18 +20,20 @@ module Appium
20
20
  module Screen
21
21
  def self.add_methods
22
22
  ::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
23
- # rubocop:disable Metrics/ParameterLists
24
- def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil,
25
- video_type: 'mjpeg', time_limit: '180', video_quality: 'medium',
23
+ def start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT',
24
+ file_field_name: nil, form_fields: nil, headers: nil, force_restart: nil,
25
+ video_type: 'mjpeg', time_limit: '180', video_quality: nil,
26
26
  video_fps: nil, video_scale: nil, video_filters: nil, pixel_format: nil)
27
27
  option = ::Appium::Core::Base::Device::ScreenRecord.new(
28
- remote_path: remote_path, user: user, pass: pass, method: method, force_restart: force_restart
28
+ remote_path: remote_path, user: user, pass: pass, method: method,
29
+ file_field_name: file_field_name, form_fields: form_fields, headers: headers,
30
+ force_restart: force_restart
29
31
  ).upload_option
30
32
 
31
33
  option[:videoType] = video_type
32
34
  option[:timeLimit] = time_limit
33
- option[:videoQuality] = video_quality
34
35
 
36
+ option[:videoQuality] = video_quality unless video_quality.nil?
35
37
  option[:videoFps] = video_fps unless video_fps.nil?
36
38
  option[:videoScale] = video_scale unless video_scale.nil?
37
39
  option[:videoFilters] = video_filters unless video_filters.nil?
@@ -39,7 +41,6 @@ module Appium
39
41
 
40
42
  execute(:start_recording_screen, {}, { options: option })
41
43
  end
42
- # rubocop:enable Metrics/ParameterLists
43
44
  end
44
45
  end
45
46
  end # module Screen
@@ -14,7 +14,7 @@
14
14
 
15
15
  module Appium
16
16
  module Core
17
- VERSION = '3.5.0' unless defined? ::Appium::Core::VERSION
18
- DATE = '2020-01-11' unless defined? ::Appium::Core::DATE
17
+ VERSION = '3.9.0' unless defined? ::Appium::Core::VERSION
18
+ DATE = '2020-05-31' unless defined? ::Appium::Core::DATE
19
19
  end
20
20
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'windows/device'
16
+ require_relative 'windows/bridge'
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Appium
16
+ module Core
17
+ module Windows
18
+ module Bridge
19
+ def self.for(target)
20
+ target.extend Appium::Core::Windows::Device
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'device/screen'
16
+
17
+ module Appium
18
+ module Core
19
+ module Windows
20
+ module Device
21
+ extend Forwardable
22
+
23
+ # rubocop:disable Metrics/LineLength
24
+
25
+ # @since Appium 1.18.0
26
+ # @!method start_recording_screen(remote_path: nil, user: nil, pass: nil, method: 'PUT', force_restart: nil, time_limit: nil, fps: nil, preset: nil, video_filter: nil, capture_clicks: nil, capture_cursor: nil, audio_input: nil)
27
+ #
28
+ # Record the display in background while the automated test is running.
29
+ # This method requires FFMPEG (https://www.ffmpeg.org/download.html) to be installed and present in PATH.
30
+ # The resulting video uses H264 codec and is ready to be played by media players built-in into web browsers.
31
+ #
32
+ # @param [Boolean] force_restart Whether to stop existing recording process forcefully and start a new recording process.
33
+ # @param [String] time_limit Recording time. 600 seconds is by default.
34
+ # @param [Number|String] fps The count of frames per second in the resulting video.
35
+ # Increasing fps value also increases the size of the resulting
36
+ # video file and the CPU usage. Defaults to 15.
37
+ # @param [String] preset A preset is a collection of options that will provide a certain encoding speed to compression ratio.
38
+ # A slower preset will provide better compression (compression is quality per filesize).
39
+ # This means that, for example, if you target a certain file size or constant bit rate, you will
40
+ # achieve better quality with a slower preset. Read https://trac.ffmpeg.org/wiki/Encode/H.264
41
+ # for more details.
42
+ # One of the supported encoding presets. Possible values are:
43
+ # - ultrafast
44
+ # - superfast
45
+ # - veryfast (default)
46
+ # - faster
47
+ # - fast
48
+ # - medium
49
+ # - slow
50
+ # - slower
51
+ # - veryslow
52
+ # @param [String] video_filter The video filter spec to apply for ffmpeg.
53
+ # See https://trac.ffmpeg.org/wiki/FilteringGuide for more details on the possible values.
54
+ # Example: Set it to +scale=ifnot(gte(iw\,1024)\,iw\,1024):-2+ in order to limit the video width
55
+ # to 1024px. The height will be adjusted automatically to match the actual screen aspect ratio.
56
+ # @param [Bool] capture_cursor Whether to capture the mouse cursor while recording the screen.
57
+ # Disabled by default.
58
+ # @param [Bool] capture_clicks Whether to capture the click gestures while recording the screen.
59
+ # Disabled by default.
60
+ # @param [String] audio_input If provided then the given audio input will be used to record the computer audio
61
+ # along with the desktop video. The list of available devices could be retrieved using
62
+ # +ffmpeg -list_devices true -f dshow -i dummy+ command.
63
+ # @return [String] Base64 encoded content of the recorded media file
64
+ #
65
+ # @example
66
+ #
67
+ # @driver.start_recording_screen
68
+ # @driver.start_recording_screen video_filter: 'scale=ifnot(gte(iw\,1024)\,iw\,1024):-2'
69
+ # @driver.start_recording_screen capture_cursor: true, capture_clicks: true, time_limit: '260'
70
+ #
71
+
72
+ # rubocop:enable Metrics/LineLength
73
+
74
+ ####
75
+ ## class << self
76
+ ####
77
+
78
+ class << self
79
+ def extended(_mod)
80
+ Screen.add_methods
81
+ end
82
+ end # class << self
83
+ end # module Device
84
+ end # module Windows
85
+ end # module Core
86
+ end # module Appium
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Appium
16
+ module Core
17
+ module Windows
18
+ module Device
19
+ module Screen
20
+ def self.add_methods
21
+ ::Appium::Core::Device.add_endpoint_method(:start_recording_screen) do
22
+ def start_recording_screen(force_restart: nil, time_limit: nil,
23
+ fps: nil, preset: nil, video_filter: nil,
24
+ capture_clicks: nil, capture_cursor: nil, audio_input: nil)
25
+ option = {}
26
+ option[:forceRestart] = force_restart unless force_restart.nil?
27
+ option[:timeLimit] = time_limit unless time_limit.nil?
28
+ option[:fps] = fps unless fps.nil?
29
+ option[:preset] = preset unless preset.nil?
30
+ option[:videoFilter] = video_filter unless video_filter.nil?
31
+ option[:captureClicks] = capture_clicks unless capture_clicks.nil?
32
+ option[:captureCursor] = capture_cursor unless capture_cursor.nil?
33
+ option[:audioInput] = audio_input unless audio_input.nil?
34
+
35
+ execute(:start_recording_screen, {}, { options: option })
36
+ end
37
+ end
38
+ end
39
+ end # module Screen
40
+ end # module Device
41
+ end # module Windows
42
+ end # module Core
43
+ end # module Appium
@@ -1,3 +1,50 @@
1
+ #### v3.9.0 2020-05-31
2
+
3
+ - [f306188](https://github.com/appium/ruby_lib_core/commit/f306188102222088fbd31b0b9249c6a39ddd074f) Release 3.9.0
4
+ - [30c6529](https://github.com/appium/ruby_lib_core/commit/30c65299e4dffb9a2cea8b7a11b27cfcba294707) ci: run with Xcode 11.5 (#265)
5
+ - [a10f2d1](https://github.com/appium/ruby_lib_core/commit/a10f2d15ef83e9ce7003b88ec1c0923c922974ea) feat: allow :capabilities as argument (#266)
6
+
7
+
8
+ #### v3.8.0 2020-05-17
9
+
10
+ - [8986a54](https://github.com/appium/ruby_lib_core/commit/8986a5400d6a3575b7413f15bb61de09af2ec789) Release 3.8.0
11
+ - [2379f9a](https://github.com/appium/ruby_lib_core/commit/2379f9a69b43e8c2d2b584ac1e56d3a1aea5e85b) refactor: move idempotency in driver (#264)
12
+ - [8103619](https://github.com/appium/ruby_lib_core/commit/8103619313328064df516e7094e2c8a6e1e9719c) fix: x-idempotency-key only for a new session (#263)
13
+ - [971f912](https://github.com/appium/ruby_lib_core/commit/971f912a6b4d8e28896d146939c9e5b86dd4b1e0) feat: Add options for start_recording_screen (#261)
14
+ - [11f840a](https://github.com/appium/ruby_lib_core/commit/11f840a2945b0376bb3ad762e9b2eefd0aace3b4) ci: add wait
15
+ - [4931f4e](https://github.com/appium/ruby_lib_core/commit/4931f4e318e94f9253edd649757f5c774c3404a7) ci: tweak flaky case
16
+ - [cb6ef1a](https://github.com/appium/ruby_lib_core/commit/cb6ef1a74dae7200952630076dd58af6bb9500ec) Merge branch 'master' of github.com:appium/ruby_lib_core
17
+ - [9117de2](https://github.com/appium/ruby_lib_core/commit/9117de2674f018cfe8e10d9dadc188af846e6be4) ci: relax tests for uia2
18
+
19
+
20
+ #### v3.7.0 2020-04-18
21
+
22
+ - [5ffe630](https://github.com/appium/ruby_lib_core/commit/5ffe630e670943c6f6f60c0e331cdab4685e31c7) Release 3.7.0
23
+ - [e561c8d](https://github.com/appium/ruby_lib_core/commit/e561c8db5b00f1132391f8ea79133c295d39a90b) feat: Add chrome devtools endpoints (#260)
24
+ - [73cf85f](https://github.com/appium/ruby_lib_core/commit/73cf85fd6ab5bdfb9df7833a713b8d4df3e51a70) test: add w3c send_keys action
25
+ - [b1c36fa](https://github.com/appium/ruby_lib_core/commit/b1c36fa538c145326dc50f49ab4d738478e5e0ac) fix typo
26
+ - [350ba7b](https://github.com/appium/ruby_lib_core/commit/350ba7bdafd567dabc9bd54ab1476740c6f54a20) feat: Add x idempotency header (#259)
27
+ - [94f16d8](https://github.com/appium/ruby_lib_core/commit/94f16d83909a2fb6111d281a00c0b911a00bb23c) ci: bump to Xcode 11.4 and iOS 13.4 (#257)
28
+ - [53b7191](https://github.com/appium/ruby_lib_core/commit/53b7191b89e61d11b06628d710a13dac5ca9dfaf) ci: add -accel auto
29
+
30
+
31
+ #### v3.6.1 2020-03-16
32
+
33
+ - [46a2277](https://github.com/appium/ruby_lib_core/commit/46a2277e792cc583c9978db3ebd548bfee343942) Release 3.6.1
34
+ - [2e28b32](https://github.com/appium/ruby_lib_core/commit/2e28b3205e83358e0aaba79d844c30ac7e29917d) fix: Tweak screen option (#256)
35
+
36
+
37
+ #### v3.6.0 2020-03-15
38
+
39
+ - [260d45e](https://github.com/appium/ruby_lib_core/commit/260d45e28a36e99e3dedbe8d41e2703c4d3fbdc8) Release 3.6.0
40
+ - [e67abd5](https://github.com/appium/ruby_lib_core/commit/e67abd53d188f0a77adb15882dd2151b1c0132e8) feat: add Windows screen record (#255)
41
+ - [164fd72](https://github.com/appium/ruby_lib_core/commit/164fd7205944a06055427000b7371311f9dc20a3) ci: Bump ci macOS version (#254)
42
+ - [7200f25](https://github.com/appium/ruby_lib_core/commit/7200f255bc5eb74a8fe8b3667db1c004a55092cf) update rubocop yml
43
+ - [2fe8c0a](https://github.com/appium/ruby_lib_core/commit/2fe8c0ae01fa3fd2653cd83415f512931adac655) Update webmock requirement from ~> 3.4.0 to ~> 3.8.0 (#253)
44
+ - [32dc172](https://github.com/appium/ruby_lib_core/commit/32dc17289f5c130b7f949bfca415e10fa4fe87d7) Update rubocop requirement from = 0.61.0 to = 0.68.1 (#251)
45
+ - [7b4402e](https://github.com/appium/ruby_lib_core/commit/7b4402e3c59d3cfee600c6375494eecb2c7c6ddf) Update rake requirement from ~> 12.0 to ~> 13.0 (#252)
46
+
47
+
1
48
  #### v3.5.0 2020-01-11
2
49
 
3
50
  - [79174fd](https://github.com/appium/ruby_lib_core/commit/79174fd6821398eacc32a897c1161140087b11e6) Release 3.5.0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appium_lib_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.0
4
+ version: 3.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuaki MATSUO
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-10 00:00:00.000000000 Z
11
+ date: 2020-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: selenium-webdriver
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '12.0'
67
+ version: '13.0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '12.0'
74
+ version: '13.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: yard
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -120,28 +120,28 @@ dependencies:
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: 3.4.0
123
+ version: 3.8.0
124
124
  type: :development
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
- version: 3.4.0
130
+ version: 3.8.0
131
131
  - !ruby/object:Gem::Dependency
132
132
  name: rubocop
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - '='
136
136
  - !ruby/object:Gem::Version
137
- version: 0.61.0
137
+ version: 0.68.1
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - '='
143
143
  - !ruby/object:Gem::Version
144
- version: 0.61.0
144
+ version: 0.68.1
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: appium_thor
147
147
  requirement: !ruby/object:Gem::Requirement
@@ -314,6 +314,10 @@ files:
314
314
  - lib/appium_lib_core/ios_xcuitest.rb
315
315
  - lib/appium_lib_core/patch.rb
316
316
  - lib/appium_lib_core/version.rb
317
+ - lib/appium_lib_core/windows.rb
318
+ - lib/appium_lib_core/windows/bridge.rb
319
+ - lib/appium_lib_core/windows/device.rb
320
+ - lib/appium_lib_core/windows/device/screen.rb
317
321
  - release_notes.md
318
322
  - script/commands.rb
319
323
  homepage: https://github.com/appium/ruby_lib_core/
@@ -335,7 +339,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
339
  - !ruby/object:Gem::Version
336
340
  version: '0'
337
341
  requirements: []
338
- rubygems_version: 3.0.3
342
+ rubygems_version: 3.0.1
339
343
  signing_key:
340
344
  specification_version: 4
341
345
  summary: Minimal Ruby library for Appium.