testcentricity_mobile 4.0.7 → 4.0.8

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: fa7ae2f538647efddd759d3958b2def1c3dd73cb68772a23310397c49e23b556
4
- data.tar.gz: 15a31c256250cbaa3670a467469e3386c0467883facb23026b662a383ac81722
3
+ metadata.gz: 1ce3b763ec417328c83163d601d7c7ae3beb499c7033ce65c3afc9204949f561
4
+ data.tar.gz: 82b625a3e675c295dca2b21a04330f68b7ee38f5939b3c82a2af35aa9a5a12aa
5
5
  SHA512:
6
- metadata.gz: 1b1b5323763138cce0d95a8b0b2dc142dfce8f39c4d45cacc13bfc5a7420d49d0b16a766108421dbc25d9c9043c22131257434347f7a44cac3839569337fcd3c
7
- data.tar.gz: e1004a41f10e1983e94d2dd659aa0abd3543227ac6e831b931f20eafd21133fc456ee7bff85eddf869cddad92a58a2d3e2f85fbbb58bf1a956191d1ef6b12cdd
6
+ metadata.gz: 761a2aa1a5bdebd8dde858e83f8a8fb966d36d63da741e31f80c4cc46443665f2d399edc7b7f9c2bf124821129369f39c078c050883a0f3984c8ab84ae54f28d
7
+ data.tar.gz: 03310a90555a41b1966a68fa027000b1ca08434d8f29b65536443b42d7025010e395ac2ae5fbc4f109afa69475153a4e4189d1ac519ef3167c98a463179bae9a
data/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
4
 
5
+ ## [4.0.8] - 03-JUNE-2024
6
+
7
+ ### Fixed
8
+
9
+ * When testing using locally hosted iOS simulators or physical devices, and when not passing an options hash to specify
10
+ desired capabilities, the `AppiumConnect.initialize_appium` method now correctly sets the following XCUItest capabilities:
11
+ * `appium:webviewConnectTimeout` capability is now correctly specified as an `Integer`
12
+ * `appium:maxTypingFrequency` set to 15 keystrokes per minute to resolve an issue where characters are intermittently
13
+ dropped during text entry by `AppUIElement.set`, `AppUIElement.send_keys`, or `BaseScreenSectionObject.populate_data_fields`
14
+ methods.
15
+ * `AppList.list_item` attribute now defaults to `XCUIElementTypeOther`class for iOS/iPadOS platform and `android.view.ViewGroup`
16
+ class for Android platform.
17
+
18
+ ### Changed
19
+
20
+ * Updated `appium_lib` gem to version 15.1.0.
21
+ * Updated `appium_lib_core` gem to version 9.1.1.
22
+ * Updated `selenium-webdriver` gem to version 4.21.1.
23
+
24
+
5
25
  ## [4.0.7] - 05-MAY-2024
6
26
 
7
27
  ### Added
data/README.md CHANGED
@@ -492,6 +492,7 @@ Single `AppUIElement` declarations have the following format:
492
492
  - `xpath:`
493
493
  - `predicate:` (iOS only)
494
494
  - `class_chain:` (iOS only)
495
+ - `uiautomator:` (Android only)
495
496
  - `css:` (WebViews in hybrid apps only).
496
497
  * The `locator_identifier` is the value or attribute that uniquely and unambiguously identifies the `AppUIElement`.
497
498
 
@@ -606,10 +607,10 @@ The optional `wait_time` parameter is used to specify the time (in seconds) to w
606
607
  viable for data entry (the `AppUIElement` must be visible and enabled) before entering the associated data value. This
607
608
  option is useful in situations where entering data, or setting the state of a `AppUIElement` might cause other `AppUIElements`
608
609
  to become visible or active. Specifying a wait_time value ensures that the subsequent `AppUIElements` will be ready to
609
- be interacted with as states are changed. If the wait time is `nil`, then the wait time will be 5 seconds.
610
+ be interacted with as states are changed. If the wait time is `nil`, then the default wait time will be 5 seconds.
610
611
 
611
612
  If any of the specified UI elements are not currently visible, the `populate_data_fields` method will attempt to scroll
612
- the UI object in view on the vertical axis (down, then up).
613
+ the UI object into view on the vertical axis (scrolls down until found, then scrolls up if not found).
613
614
  ```ruby
614
615
  def enter_data(user_data)
615
616
  fields = {
@@ -642,8 +643,8 @@ containing key/hash pairs of UI elements and their properties or attributes to b
642
643
  verify_ui_states(ui)
643
644
  ```
644
645
  The `verify_ui_states` method automatically scrolls UI elements that are expected to be visible into view. Auto-scrolling
645
- only occurs on the vertical axis (down, then up). Setting the `auto_scroll` parameter to `false` prevents automatic scrolling
646
- from occurring.
646
+ only occurs on the vertical axis (scrolls down until found, then scrolls up if not found). Setting the `auto_scroll` parameter
647
+ to `false` prevents automatic scrolling from occurring.
647
648
 
648
649
  The `verify_ui_states` method queues up any exceptions that occur while verifying each object's properties until all
649
650
  `AppUIElements`and their properties have been checked, and then posts any exceptions encountered upon completion. Posted
@@ -678,6 +679,15 @@ The `verify_ui_states` method supports the following property/state pairs:
678
679
 
679
680
  :checked Boolean
680
681
 
682
+ **Radio Buttons:**
683
+
684
+ :selected Boolean
685
+
686
+ **Lists and SelectLists**
687
+
688
+ :items Array of Strings
689
+ :itemcount Integer
690
+
681
691
  #### Comparison States
682
692
 
683
693
  The `verify_ui_states` method supports comparison states using property/comparison state pairs:
@@ -829,6 +839,195 @@ Baseline translation strings are stored in `.yml` files in the `config/locales/`
829
839
  └── README.md
830
840
 
831
841
 
842
+ ### Working With Custom AppUIElements
843
+
844
+ #### Vertical Scrolling ListView
845
+
846
+ `AppUIElements` like ListViews (`AppList` class) are typically made up of multiple composite UI component types, which will
847
+ be different for iOS vs. Android mobile platforms. Below is an example of the vertical scrolling ListView implementations
848
+ for a cross-platform application implemented using React Native (iOS version on the left, Android version on the right).
849
+ Each ListView contains 30 items:
850
+
851
+ ![Vertical Scrolling ListView](https://raw.githubusercontent.com/TestCentricity/testcentricity_mobile/main/.github/images/ListViews.png "Vertical Scrolling ListViews")
852
+
853
+ While the iOS and Android ListViews appear to be identical in the app, performing an inspection of each application's GUI
854
+ using Appium Inspector reveals differences in the object hierarchy as depicted below (iOS version on left, Android version
855
+ on the right):
856
+
857
+ ![Vertical Scrolling ListView Hierarchy](https://raw.githubusercontent.com/TestCentricity/testcentricity_mobile/main/.github/images/ListHeirarchy.png "Vertical Scrolling ListView Hierarchy")
858
+
859
+ The inspection of the ListView object hierarchy reveals that for the iOS version of the app, list items are made up of
860
+ `XCUIElementTypeOther` objects, and that for the Android version of the app, list items are made up of `android.view.ViewGroup`
861
+ objects.
862
+
863
+ The other, more notable difference is that while the iOS inspection shows all 30 list items, only 13 list items are shown
864
+ in the inspection of the Android app, which corresponds to the list items that are visible on the Android device screen.
865
+ When testing Android apps using the `UiAutomator2` driver for Appium, UI objects that are not displayed on screen cannot
866
+ be detected by Appium Inspector or by Appium based frameworks until the objects are scrolled into view.
867
+
868
+ The `AppList.define_list_elements` method provides a means of specifying the objects that make up the list item components
869
+ of an `AppList` control, and the axis in which scrolling of the list items occurs. The method accepts a hash that can contain
870
+ up to two key-value pairs. Valid key designators are `:list_item`and `:scrolling`. The `AppList.define_list_elements` method
871
+ is typically called in the `initialize` method of the `ScreenObject` or `ScreenSection` that contains the associated `AppList`
872
+ control.
873
+
874
+ The code snippets below demonstrate the use of the `AppList.define_list_elements` method in the `CloudListScreen` screen
875
+ object's `initialize` method to define the list item components that make up the Clouds vertical scrolling ListView from
876
+ the above examples. It is not necessary to specify the scroll axis in the code below, as `:vertical` is the default scroll
877
+ axis that is set when instantiating an `AppList` element.
878
+
879
+ iOS Cloud List `ScreenObject`
880
+ ```ruby
881
+ class CloudListScreen < ScreenObject
882
+ trait(:screen_name) { 'Cloud List' }
883
+ trait(:screen_locator) { { class_chain: '**/XCUIElementTypeWindow/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther' } }
884
+
885
+ # Cloud List screen UI elements
886
+ list :cloud_list, { class_chain: '**/XCUIElementTypeScrollView/XCUIElementTypeOther' }
887
+
888
+ def initialize
889
+ super
890
+ # define the list item element for the Cloud list object
891
+ list_spec = { list_item: { class: 'XCUIElementTypeOther' } }
892
+ cloud_list.define_list_elements(list_spec)
893
+ end
894
+ end
895
+ ```
896
+
897
+ Android CloudListScreen `ScreenObject`
898
+ ```ruby
899
+ class CloudListScreen < ScreenObject
900
+ trait(:screen_name) { 'Cloud List' }
901
+ trait(:screen_locator) { { xpath: '//android.widget.FrameLayout[@resource-id="android:id/content"]/android.view.ViewGroup' } }
902
+
903
+ # Cloud List screen UI elements
904
+ list :cloud_list, { xpath: '//android.widget.ScrollView/android.view.ViewGroup' }
905
+
906
+ def initialize
907
+ super
908
+ # define the list item element for the Cloud list object
909
+ list_spec = { list_item: { class: 'android.view.ViewGroup' } }
910
+ cloud_list.define_list_elements(list_spec)
911
+ end
912
+ end
913
+ ```
914
+
915
+
916
+ #### Horizontal Scrolling ListView
917
+
918
+ Below is an example of a horizontal scrolling "Carousel" style ListView implementations on the Swipe screen of a cross-platform
919
+ application. Each ListView contains 6 list items.
920
+
921
+ ![Horizontal Scrolling Carousel ListView](https://raw.githubusercontent.com/TestCentricity/testcentricity_mobile/main/.github/images/Carousel.png "Horizontal Scrolling Carousel ListViews")
922
+
923
+ While the iOS and Android ListViews appear to be identical in the app, performing an inspection of each application's GUI
924
+ using Appium Inspector reveals differences in the object hierarchy as depicted below (iOS version on left, Android version
925
+ on the right):
926
+
927
+ ![Horizontal Scrolling Carousel Hierarchy](https://raw.githubusercontent.com/TestCentricity/testcentricity_mobile/main/.github/images/CarouselHierarchy.png "Horizontal Scrolling Carousel Hierarchy")
928
+
929
+ As in the previous example for the vertical scrolling ListView, the inspection of the Carousel ListView object hierarchy
930
+ reveals that for the iOS version of the app, list items are again made up of `XCUIElementTypeOther` objects, and that for
931
+ the Android version of the app, list items are again made up of `android.view.ViewGroup` objects.
932
+
933
+ As in the previous examples, the iOS inspection shows all 6 list items, while only 2 list items are shown in the inspection
934
+ of the Android app, which corresponds to the list items that are visible on the Android device screen.
935
+
936
+ The code snippets below demonstrate the use of the `AppList.define_list_elements` method in the `SwipeScreen` screen object's
937
+ `initialize` method to define the scroll axis and list item components that make up the Carousel horizontal scrolling ListView
938
+ from the above examples.
939
+
940
+ iOS Swipe `ScreenObject`
941
+ ```ruby
942
+ class SwipeScreen < ScreenObject
943
+ trait(:screen_name) { 'Swipe' }
944
+ trait(:screen_locator) { { accessibility_id: 'Swipe-screen' } }
945
+
946
+ # Swipe screen UI elements
947
+ list :carousel_list, { accessibility_id: 'Carousel' }
948
+
949
+ def initialize
950
+ super
951
+ # define the list item element for the Carousel list object
952
+ list_spec = {
953
+ list_item: { xpath: '//XCUIElementTypeOther[contains(@name, "__CAROUSEL_ITEM_")]' },
954
+ scrolling: :horizontal
955
+ }
956
+ carousel_list.define_list_elements(list_spec)
957
+ end
958
+ end
959
+ ```
960
+
961
+ Android Swipe `ScreenObject`
962
+ ```ruby
963
+ class SwipeScreen < ScreenObject
964
+ trait(:screen_name) { 'Swipe' }
965
+ trait(:screen_locator) { { accessibility_id: 'Swipe-screen' } }
966
+
967
+ # Swipe screen UI elements
968
+ list :carousel_list, { accessibility_id: 'Carousel' }
969
+
970
+ def initialize
971
+ super
972
+ # define the list item element for the Carousel list object
973
+ list_spec = {
974
+ list_item: { xpath: '//android.view.ViewGroup[contains(@resource-id, "__CAROUSEL_ITEM_")]' },
975
+ scrolling: :horizontal
976
+ }
977
+ carousel_list.define_list_elements(list_spec)
978
+ end
979
+ end
980
+ ```
981
+
982
+
983
+ #### Popup and PickerWheel Style ListViews
984
+
985
+ Below is an example of a PickerWheel (iOS) and Popup (Android) style ListView implementations on the Form Components screen
986
+ of a cross-platform application.
987
+
988
+ ![PickerWheel and Popup ListViews](https://raw.githubusercontent.com/TestCentricity/testcentricity_mobile/main/.github/images/Popup_Picker.png "PickerWheel and Popup ListViews")
989
+
990
+ Performing an inspection of each application's GUI using Appium Inspector reveals differences in the object hierarchy as
991
+ depicted below (iOS version on left, Android version on the right):
992
+
993
+ ![PickerWheel and Popup ListView Hierarchy](https://raw.githubusercontent.com/TestCentricity/testcentricity_mobile/main/.github/images/PopupHeirarchy.png "PickerWheel and Popup ListView Hierarchy")
994
+
995
+ The inspection of the PickerWheel and Popup ListView object hierarchies reveals that for the iOS version of the app, list
996
+ items are again made up of `XCUIElementTypeOther` objects, and that for the Android version of the app, list items are made
997
+ up of `android.widget.CheckedTextView` objects.
998
+
999
+ However, `XCUIElementTypePickerWheel` controls present testability challenges with Appium, as the `XCUIElementTypeOther`
1000
+ objects that comprise the individual list items cannot be reliably interacted with or validated. When inspecting each of
1001
+ the `XCUIElementTypeOther` list items of the `XCUIElementTypePickerWheel` control, there are no `text`, `accessibility_id`,
1002
+ `label`, or `value` element attributes available which could be used to determine whether the correct caption strings are
1003
+ displayed for each list item. The `AppList.get_item_count` or `get_list_items` methods do not support `XCUIElementTypePickerWheel`
1004
+ controls, and will raise an exception if called for such a control.
1005
+
1006
+ For the Android version of the app, the `android.widget.CheckedTextView` list items can be interacted with and validated,
1007
+ as the `text` element attribute for each list item are visible in the inspection.
1008
+
1009
+ The code snippet below demonstrate the use of the `AppList.define_list_elements` method in the `FormScreen` screen object's
1010
+ `initialize` method to define the list item components that make up the Android Popup style ListView from the above example.
1011
+
1012
+ Android FormScreen `ScreenObject`
1013
+ ```ruby
1014
+ class FormScreen < ScreenObject
1015
+ trait(:screen_name) { 'Form' }
1016
+ trait(:screen_locator) { { accessibility_id: 'Forms-screen' } }
1017
+
1018
+ # Form screen UI elements
1019
+ list :drop_down_menu, { id: 'com.wdiodemoapp:id/select_dialog_listview' }
1020
+
1021
+ def initialize
1022
+ super
1023
+ # define the list item element for the drop-down list object
1024
+ list_spec = { list_item: { class: 'android.widget.CheckedTextView' } }
1025
+ drop_down_menu.define_list_elements(list_spec)
1026
+ end
1027
+ end
1028
+ ```
1029
+
1030
+
832
1031
  ---
833
1032
  ## Instantiating ScreenObjects and Utilizing the ScreenManager
834
1033
 
@@ -868,7 +1067,7 @@ scenarios are executed:
868
1067
  include WorldScreens
869
1068
  WorldPages.instantiate_screen_objects
870
1069
  ```
871
- **NOTE:** If you intend to use the `WorldScreens`, you must define a `screen_name` trait for each of the `ScreenObjects`
1070
+ **NOTE:** If you intend to use the `ScreenManager`, you must define a `screen_name` trait for each of the `ScreenObjects`
872
1071
  to be registered.
873
1072
 
874
1073
 
@@ -1005,7 +1204,7 @@ endpoint is used.
1005
1204
  You can run your automated tests on locally hosted iOS simulators or physically connected devices using Appium and XCode
1006
1205
  on macOS. You must install Appium, XCode, and the iOS version-specific device simulators for XCode. Information about
1007
1206
  Appium setup and configuration requirements with the XCUITest driver for testing on physically connected iOS devices can
1008
- be found on [this page](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md). Refer to [this page](https://appium.github.io/appium-xcuitest-driver/5.12/capabilities/) for information regarding specifying Appium capabilities that are
1207
+ be found on [this page](https://github.com/appium/appium-xcuitest-driver/blob/master/docs/preparation/real-device-config.md). Refer to [this page](https://appium.github.io/appium-xcuitest-driver/5.12/capabilities/) for information regarding specifying Appium capabilities that are
1009
1208
  specific to the XCUITest driver.
1010
1209
 
1011
1210
  ##### Local iOS Simulators or Physical Devices using Environment Variables
@@ -439,7 +439,11 @@ module TestCentricity
439
439
  caps[:'appium:appActivity'] = ENV['APP_ACTIVITY'] if ENV['APP_ACTIVITY']
440
440
  caps[:'appium:appPackage'] = ENV['APP_PACKAGE'] if ENV['APP_PACKAGE']
441
441
  caps[:'appium:forceSimulatorSoftwareKeyboardPresence'] = ENV['SHOW_SIM_KEYBOARD'] if ENV['SHOW_SIM_KEYBOARD']
442
- caps[:'appium:webviewConnectTimeout'] = '90000'
442
+ if Environ.is_ios?
443
+ caps[:'appium:webviewConnectTimeout'] = 90000
444
+ caps[:'appium:maxTypingFrequency'] = 15
445
+ caps[:'appium:respectSystemAlerts'] = true
446
+ end
443
447
 
444
448
  if ENV['BUNDLE_ID']
445
449
  caps[:'appium:bundleId'] = ENV['BUNDLE_ID']
@@ -379,36 +379,34 @@ module TestCentricity
379
379
  url = if deep_link.include?("://")
380
380
  deep_link
381
381
  elsif !Environ.current.deep_link_prefix.blank?
382
- link_url = "#{Environ.current.deep_link_prefix}://#{deep_link}"
383
- # deeplink handler for Android devices
384
- if Environ.is_android?
385
- Environ.appium_driver.execute_script('mobile:deepLink', { url: link_url, package: Environ.current.android_app_id })
386
- verify_screen_exists
387
- return
388
- else
389
- link_url
390
- end
382
+ "#{Environ.current.deep_link_prefix}://#{deep_link}"
383
+ end
384
+
385
+ if Environ.is_android?
386
+ Environ.appium_driver.execute_script('mobile:deepLink', { url: url, package: Environ.current.android_app_id })
387
+ elsif Environ.is_ios?
388
+ if Environ.is_device? && Environ.device_os_version.to_f < 16.4
389
+ # launch Safari browser on iOS real device if iOS version is below 16.4
390
+ Environ.appium_driver.execute_script('mobile: launchApp', { bundleId: 'com.apple.mobilesafari' })
391
+ unless Environ.appium_driver.is_keyboard_shown
392
+ begin
393
+ # attempt to find and click URL button on iOS 15 Safari browser
394
+ find_element(:accessibility_id, 'TabBarItemTitle').click
395
+ rescue
396
+ # fall back to URL button on iOS 14 Safari browser
397
+ find_element(:xpath, '//XCUIElementTypeButton[@name="URL"]').click
391
398
  end
392
- # deeplink handler for iOS devices
393
- if Environ.is_ios? && Environ.is_device? && Environ.device_os_version.to_f < 16.4
394
- # launch Safari browser on iOS real device if iOS version is below 16.4
395
- Environ.appium_driver.execute_script('mobile: launchApp', { bundleId: 'com.apple.mobilesafari' })
396
- unless Environ.appium_driver.is_keyboard_shown
397
- begin
398
- # attempt to find and click URL button on iOS 15 Safari browser
399
- find_element(:accessibility_id, 'TabBarItemTitle').click
400
- rescue
401
- # fall back to URL button on iOS 14 Safari browser
402
- find_element(:xpath, '//XCUIElementTypeButton[@name="URL"]').click
403
399
  end
400
+ # enter deep-link URL
401
+ wait_for_object(:xpath, '//XCUIElementTypeTextField[@name="URL"]', 5).send_keys("#{url}\uE007")
402
+ # wait for and accept the popup modal
403
+ wait_for_object(:xpath, '//XCUIElementTypeButton[@name="Open"]', 10).click
404
+ else
405
+ # iOS version is >= 16.4 so directly load screen via deepLink
406
+ Environ.appium_driver.get(url)
404
407
  end
405
- # enter deep-link URL
406
- wait_for_object(:xpath, '//XCUIElementTypeTextField[@name="URL"]', 5).send_keys("#{url}\uE007")
407
- # wait for and accept the popup modal
408
- wait_for_object(:xpath, '//XCUIElementTypeButton[@name="Open"]', 10).click
409
408
  else
410
- # iOS version is >= 16.4 so directly load screen via Selenium WebDriver
411
- Environ.appium_driver.get(url)
409
+ raise "#{Environ.device_os} is not supported"
412
410
  end
413
411
  verify_screen_exists
414
412
  end
@@ -8,9 +8,16 @@ module TestCentricity
8
8
  def initialize(name, parent, locator, context)
9
9
  super
10
10
  @type = :list
11
- @list_item = nil
12
- @scrolling = :vertical
13
11
  @item_objects = nil
12
+ @scrolling = :vertical
13
+ @list_item = case Environ.device_os
14
+ when :ios
15
+ { class: 'XCUIElementTypeOther' }
16
+ when :android
17
+ { class: 'android.view.ViewGroup' }
18
+ else
19
+ nil
20
+ end
14
21
  end
15
22
 
16
23
  def define_list_elements(element_spec)
@@ -163,9 +170,9 @@ module TestCentricity
163
170
  def get_list_item_locator
164
171
  if @list_item.nil?
165
172
  if Environ.device_os == :ios
166
- define_list_elements({ :list_item => { class: 'XCUIElementTypeCell' } } )
173
+ define_list_elements({ :list_item => { class: 'XCUIElementTypeOther' } } )
167
174
  else
168
- define_list_elements({ :list_item => { class: 'android.widget.FrameLayout' } } )
175
+ define_list_elements({ :list_item => { class: 'android.view.ViewGroup' } } )
169
176
  end
170
177
  end
171
178
  @list_item
@@ -1,3 +1,3 @@
1
1
  module TestCentricityMobile
2
- VERSION = '4.0.7'
2
+ VERSION = '4.0.8'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: testcentricity_mobile
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.7
4
+ version: 4.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - A.J. Mrozinski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-03 00:00:00.000000000 Z
11
+ date: 2024-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 15.0.0
131
+ version: 15.1.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 15.0.0
138
+ version: 15.1.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: childprocess
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -212,14 +212,14 @@ dependencies:
212
212
  requirements:
213
213
  - - '='
214
214
  - !ruby/object:Gem::Version
215
- version: 4.20.1
215
+ version: 4.21.1
216
216
  type: :runtime
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - '='
221
221
  - !ruby/object:Gem::Version
222
- version: 4.20.1
222
+ version: 4.21.1
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: test-unit
225
225
  requirement: !ruby/object:Gem::Requirement