From 4c45fc5f36a5b9ccbad9604a8272d6419bd6c7af Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:22:15 +0000 Subject: [PATCH 1/9] refactor: remove legacy command fallbacks in Applications extension --- appium/webdriver/extensions/applications.py | 171 ++++++-------------- 1 file changed, 49 insertions(+), 122 deletions(-) diff --git a/appium/webdriver/extensions/applications.py b/appium/webdriver/extensions/applications.py index ca2a3022..e96b88b0 100644 --- a/appium/webdriver/extensions/applications.py +++ b/appium/webdriver/extensions/applications.py @@ -13,17 +13,13 @@ # limitations under the License. from typing import Any, Dict, Union -from selenium.common.exceptions import InvalidArgumentException, UnknownMethodException from typing_extensions import Self from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands from appium.protocols.webdriver.can_execute_scripts import CanExecuteScripts -from appium.protocols.webdriver.can_remember_extension_presence import CanRememberExtensionPresence -from ..mobilecommand import MobileCommand as Command - -class Applications(CanExecuteCommands, CanExecuteScripts, CanRememberExtensionPresence): +class Applications(CanExecuteCommands, CanExecuteScripts): def background_app(self, seconds: int) -> Self: """Puts the application in the background on the device for a certain duration. @@ -37,11 +33,7 @@ def background_app(self, seconds: int) -> Self: """ ext_name = 'mobile: backgroundApp' args = {'seconds': seconds} - try: - self.assert_extension_exists(ext_name).execute_script(ext_name, args) - except UnknownMethodException: - # TODO: Remove the fallback - self.mark_extension_absence(ext_name).execute(Command.BACKGROUND, args) + self.execute_script(ext_name, args) return self def is_app_installed(self, bundle_id: str) -> bool: @@ -54,22 +46,13 @@ def is_app_installed(self, bundle_id: str) -> bool: `True` if app is installed """ ext_name = 'mobile: isAppInstalled' - try: - return self.assert_extension_exists(ext_name).execute_script( - ext_name, - { - 'bundleId': bundle_id, - 'appId': bundle_id, - }, - ) - except (UnknownMethodException, InvalidArgumentException): - # TODO: Remove the fallback - return self.mark_extension_absence(ext_name).execute( - Command.IS_APP_INSTALLED, - { - 'bundleId': bundle_id, - }, - )['value'] + return self.execute_script( + ext_name, + { + 'bundleId': bundle_id, + 'appId': bundle_id, + }, + ) def install_app(self, app_path: str, **options: Any) -> Self: """Install the application found at `app_path` on the device. @@ -92,21 +75,14 @@ def install_app(self, app_path: str, **options: Any) -> Self: Union['WebDriver', 'Applications']: Self instance """ ext_name = 'mobile: installApp' - try: - self.assert_extension_exists(ext_name).execute_script( - 'mobile: installApp', - { - 'app': app_path, - 'appPath': app_path, - **(options or {}), - }, - ) - except (UnknownMethodException, InvalidArgumentException): - # TODO: Remove the fallback - data: Dict[str, Any] = {'appPath': app_path} - if options: - data.update({'options': options}) - self.mark_extension_absence(ext_name).execute(Command.INSTALL_APP, data) + self.execute_script( + ext_name, + { + 'app': app_path, + 'appPath': app_path, + **(options or {}), + }, + ) return self def remove_app(self, app_id: str, **options: Any) -> Self: @@ -125,21 +101,14 @@ def remove_app(self, app_id: str, **options: Any) -> Self: Union['WebDriver', 'Applications']: Self instance """ ext_name = 'mobile: removeApp' - try: - self.assert_extension_exists(ext_name).execute_script( - ext_name, - { - 'appId': app_id, - 'bundleId': app_id, - **(options or {}), - }, - ) - except (UnknownMethodException, InvalidArgumentException): - # TODO: Remove the fallback - data: Dict[str, Any] = {'appId': app_id} - if options: - data.update({'options': options}) - self.mark_extension_absence(ext_name).execute(Command.REMOVE_APP, data) + self.execute_script( + ext_name, + { + 'appId': app_id, + 'bundleId': app_id, + **(options or {}), + }, + ) return self def terminate_app(self, app_id: str, **options: Any) -> bool: @@ -156,21 +125,14 @@ def terminate_app(self, app_id: str, **options: Any) -> bool: True if the app has been successfully terminated """ ext_name = 'mobile: terminateApp' - try: - return self.assert_extension_exists(ext_name).execute_script( - ext_name, - { - 'appId': app_id, - 'bundleId': app_id, - **(options or {}), - }, - ) - except (UnknownMethodException, InvalidArgumentException): - # TODO: Remove the fallback - data: Dict[str, Any] = {'appId': app_id} - if options: - data.update({'options': options}) - return self.mark_extension_absence(ext_name).execute(Command.TERMINATE_APP, data)['value'] + return self.execute_script( + ext_name, + { + 'appId': app_id, + 'bundleId': app_id, + **(options or {}), + }, + ) def activate_app(self, app_id: str) -> Self: """Activates the application if it is not running @@ -183,17 +145,13 @@ def activate_app(self, app_id: str) -> Self: Union['WebDriver', 'Applications']: Self instance """ ext_name = 'mobile: activateApp' - try: - self.assert_extension_exists(ext_name).execute_script( - ext_name, - { - 'appId': app_id, - 'bundleId': app_id, - }, - ) - except (UnknownMethodException, InvalidArgumentException): - # TODO: Remove the fallback - self.mark_extension_absence(ext_name).execute(Command.ACTIVATE_APP, {'appId': app_id}) + self.execute_script( + ext_name, + { + 'appId': app_id, + 'bundleId': app_id, + }, + ) return self def query_app_state(self, app_id: str) -> int: @@ -207,22 +165,13 @@ def query_app_state(self, app_id: str) -> int: class for more details. """ ext_name = 'mobile: queryAppState' - try: - return self.assert_extension_exists(ext_name).execute_script( - ext_name, - { - 'appId': app_id, - 'bundleId': app_id, - }, - ) - except (UnknownMethodException, InvalidArgumentException): - # TODO: Remove the fallback - return self.mark_extension_absence(ext_name).execute( - Command.QUERY_APP_STATE, - { - 'appId': app_id, - }, - )['value'] + return self.execute_script( + ext_name, + { + 'appId': app_id, + 'bundleId': app_id, + }, + ) def app_strings(self, language: Union[str, None] = None, string_file: Union[str, None] = None) -> Dict[str, str]: """Returns the application strings from the device for the specified @@ -241,29 +190,7 @@ def app_strings(self, language: Union[str, None] = None, string_file: Union[str, data['language'] = language if string_file is not None: data['stringFile'] = string_file - return self.assert_extension_exists(ext_name).execute_script(ext_name, data) + return self.execute_script(ext_name, data) def _add_commands(self) -> None: - self.command_executor.add_command(Command.BACKGROUND, 'POST', '/session/$sessionId/appium/app/background') - self.command_executor.add_command( - Command.IS_APP_INSTALLED, - 'POST', - '/session/$sessionId/appium/device/app_installed', - ) - self.command_executor.add_command(Command.INSTALL_APP, 'POST', '/session/$sessionId/appium/device/install_app') - self.command_executor.add_command(Command.REMOVE_APP, 'POST', '/session/$sessionId/appium/device/remove_app') - self.command_executor.add_command( - Command.TERMINATE_APP, - 'POST', - '/session/$sessionId/appium/device/terminate_app', - ) - self.command_executor.add_command( - Command.ACTIVATE_APP, - 'POST', - '/session/$sessionId/appium/device/activate_app', - ) - self.command_executor.add_command( - Command.QUERY_APP_STATE, - 'POST', - '/session/$sessionId/appium/device/app_state', - ) + pass From fe2af6fa1923817a5ec084b3aa77f6e455ef9e65 Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:23:46 +0000 Subject: [PATCH 2/9] refactor: remove legacy command fallbacks in Applications extension From 1c42a09a009abb0584e613a589a5e65ad63e05d0 Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:24:39 +0000 Subject: [PATCH 3/9] refactor: remove legacy command fallbacks in Applications extension From 6fd2d5c1d2d8da6cef11d12ea2f8ccb5daaf57a0 Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:25:42 +0000 Subject: [PATCH 4/9] refactor: remove legacy command fallbacks in applications extension From e4289c4ceffeaa28eda47f9e39988a600400586f Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Sun, 28 Jun 2026 20:40:18 +0000 Subject: [PATCH 5/9] refactor: remove legacy command fallbacks in applications extension From 2dd24bc7834f6c529dc09a5e958a0dd090cd3106 Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Sun, 28 Jun 2026 20:56:16 +0000 Subject: [PATCH 6/9] refactor: remove legacy command fallbacks in applications extension --- .github/workflows/functional-test.yml | 14 ++++----- .github/workflows/lock-update.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/unit-test.yml | 4 +-- uv.lock | 42 +++++++++++++-------------- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/.github/workflows/functional-test.yml b/.github/workflows/functional-test.yml index c21e3d85..f97afc9a 100644 --- a/.github/workflows/functional-test.yml +++ b/.github/workflows/functional-test.yml @@ -35,7 +35,7 @@ jobs: PREBUILT_WDA_PATH: ${{ github.workspace }}/wda/WebDriverAgentRunner-Runner.app steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Install Node.js uses: actions/setup-node@v6 @@ -81,7 +81,7 @@ jobs: python-version: 3.14 - name: Cache uv modules - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | ~/.cache/uv @@ -127,7 +127,7 @@ jobs: ARCH: x86 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-java@v5 with: @@ -165,7 +165,7 @@ jobs: sudo udevadm trigger --name-match=kvm - name: AVD cache - uses: actions/cache@v5 + uses: actions/cache@v6 id: avd-cache with: path: | @@ -190,7 +190,7 @@ jobs: python-version: 3.14 - name: Cache uv modules - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | ~/.cache/uv @@ -251,7 +251,7 @@ jobs: steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-java@v5 if: matrix.e2e-tests == 'flutter-android' @@ -306,7 +306,7 @@ jobs: log_file: appium-${{ matrix.e2e-tests }}.log - name: Cache uv modules - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | ~/.cache/uv diff --git a/.github/workflows/lock-update.yml b/.github/workflows/lock-update.yml index 05b94d39..552acc46 100644 --- a/.github/workflows/lock-update.yml +++ b/.github/workflows/lock-update.yml @@ -15,7 +15,7 @@ jobs: if: github.actor == 'dependabot[bot]' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: token: ${{ secrets.GITHUB_TOKEN }} ref: ${{ github.head_ref }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index afa4b574..5646ab89 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,7 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Set up Python uses: actions/setup-python@v6 diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index ae07d6c1..0f473527 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -14,13 +14,13 @@ jobs: matrix: python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Cache uv modules - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | ~/.cache/uv diff --git a/uv.lock b/uv.lock index e541ddf7..0577c34b 100644 --- a/uv.lock +++ b/uv.lock @@ -1617,27 +1617,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, - { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, - { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, - { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, - { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, - { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, - { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, - { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, - { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, - { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, - { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, +version = "0.15.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" }, + { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" }, + { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" }, + { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" }, + { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" }, + { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" }, + { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" }, + { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" }, + { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" }, ] [[package]] From 5f664c9c23d592adee6174633b127f7c7b68df31 Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Sun, 28 Jun 2026 21:01:15 +0000 Subject: [PATCH 7/9] refactor: remove legacy command fallbacks in applications extension From c06e60c5f9dff675c295dd529b0a3fc359e512c0 Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Sun, 28 Jun 2026 21:40:42 +0000 Subject: [PATCH 8/9] refactor(applications): remove legacy fallback logic From 050478ca5792c35c0f0a1f1327ff6eb40f44e36c Mon Sep 17 00:00:00 2001 From: Dor-bl <59066376+Dor-bl@users.noreply.github.com> Date: Sun, 28 Jun 2026 22:26:54 +0000 Subject: [PATCH 9/9] refactor(applications): remove legacy fallback logic