appium_lib_core 3.5.0 → 3.9.0

Sign up to get free protection for your applications and to get access to all the features.
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.