From 5dc303d9a4f0cbe7b2f5055d3b991e0dcd533381 Mon Sep 17 00:00:00 2001 From: Kevin Deldycke Date: Mon, 25 Apr 2022 17:42:25 +0400 Subject: [PATCH] Add support for zypper Closes #566. --- .github/labels-extra.json | 5 + .github/workflows/labeller-content-based.yaml | 7 +- .github/workflows/labeller-file-based.yaml | 6 +- .github/workflows/tests.yaml | 7 + changelog.md | 1 + docs/meta_package_manager.managers.rst | 8 + meta_package_manager/managers/zypper.py | 260 ++++++++++++++++++ .../tests/test_cli_install.py | 1 + meta_package_manager/tests/test_pool.py | 2 +- poetry.lock | 160 +++++------ pyproject.toml | 2 + readme.md | 48 ++-- 12 files changed, 402 insertions(+), 105 deletions(-) create mode 100644 meta_package_manager/managers/zypper.py diff --git a/.github/labels-extra.json b/.github/labels-extra.json index 4c073e583..fa0c6432c 100644 --- a/.github/labels-extra.json +++ b/.github/labels-extra.json @@ -89,6 +89,11 @@ "color": "#bfdadc", "description": "vscode" }, + { + "name": "📦 manager: zypper", + "color": "#bfdadc", + "description": "zypper" + }, { "name": "🔌 bar-plugin", "color": "#fef2c0", diff --git a/.github/workflows/labeller-content-based.yaml b/.github/workflows/labeller-content-based.yaml index 3b86c0210..bb6654ca8 100644 --- a/.github/workflows/labeller-content-based.yaml +++ b/.github/workflows/labeller-content-based.yaml @@ -154,8 +154,13 @@ jobs: "keywords": ["vscode"]}, {"labels": [ + "📦 manager: zypper", "🖥 platform: Linux"], - "keywords": ["linux", "ubuntu", "debian"]}, + "keywords": ["zypper"]}, + + {"labels": [ + "🖥 platform: Linux"], + "keywords": ["linux", "ubuntu", "debian", "suse", "opensuse", "arch", "gentoo"]}, {"labels": [ "🖥 platform: macOS"], diff --git a/.github/workflows/labeller-file-based.yaml b/.github/workflows/labeller-file-based.yaml index 7be3221f6..2811ae388 100644 --- a/.github/workflows/labeller-file-based.yaml +++ b/.github/workflows/labeller-file-based.yaml @@ -88,4 +88,8 @@ jobs: "📦 manager: vscode": - meta_package_manager/managers/vscode* - - meta_package_manager/tests/*vscode* \ No newline at end of file + - meta_package_manager/tests/*vscode* + + "📦 manager: zypper": + - meta_package_manager/managers/zypper* + - meta_package_manager/tests/*zypper* \ No newline at end of file diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 780e7b3cb..8b18fb2d0 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -165,6 +165,13 @@ jobs: run: | sudo apt install --yes dnf + # Zypper + - name: Linux - Install Zypper + # XXX Zypper has been added in Ubuntu 20.04, not before. + if: matrix.os == 'ubuntu-20.04' + run: | + sudo apt install --yes zypper + # Snap - name: Linux - Upgrade Snapd if: runner.os == 'Linux' diff --git a/changelog.md b/changelog.md index 0d53441dc..c6b800799 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,7 @@ This version is not released yet and is under active development. ``` +- \[zypper\] Add `zypper` support for Suse and OpenSuse. Closes {issue}`566`. - \[emerge\] Add `emerge` support. - \[steamcmd\] Add `steamcmd` support. Refs {issue}`10`. - \[bar-plugin\] Add new `DEFAULT_FONT` and `MONOSPACE_FONT` variable. diff --git a/docs/meta_package_manager.managers.rst b/docs/meta_package_manager.managers.rst index 0b5bfce13..290ee485b 100644 --- a/docs/meta_package_manager.managers.rst +++ b/docs/meta_package_manager.managers.rst @@ -140,6 +140,14 @@ meta\_package\_manager.managers.yarn module :undoc-members: :show-inheritance: +meta\_package\_manager.managers.zypper module +--------------------------------------------- + +.. automodule:: meta_package_manager.managers.zypper + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/meta_package_manager/managers/zypper.py b/meta_package_manager/managers/zypper.py new file mode 100644 index 000000000..5bc870b20 --- /dev/null +++ b/meta_package_manager/managers/zypper.py @@ -0,0 +1,260 @@ +# Copyright Kevin Deldycke and contributors. +# All Rights Reserved. +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import re +from itertools import groupby +from operator import itemgetter + +import xmltodict +from click_extra.platform import LINUX + +from ..base import PackageManager +from ..version import parse_version + + +class Zypper(PackageManager): + """ + Documentation: + - https://en.opensuse.org/Portal:Zypper + - https://documentation.suse.com/smart/linux/html/concept-zypper/index.html + - https://opensuse.github.io/openSUSE-docs-revamped-temp/zypper/ + + See other command equivalences at: https://wiki.archlinux.org/title/Pacman/Rosetta + """ + + platforms = frozenset({LINUX}) + + requirement = "1.14.0" + + pre_args = ("--no-color", "--no-abbrev", "--non-interactive", "--no-cd", "--no-refresh") + + version_regex = r"zypper\s+(?P\S+)" + """ + .. code-block:: shell-session + + ► zypper --version + zypper 1.14.11 + """ + + def _search(self, *args): + """Utility method to parse and interpret results of the ``zypper search`` command. + + This is reused by the ``installed`` and ``search`` operations. + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout search --details --type package [*args] + + + Loading repository data... + Reading installed packages... + + + + + + + + + + + + + + + (...) + + + + """ + output = self.run_cli( + "--xmlout", + "search", + # --details is the only option that is providing the package's version... + "--details", + # ...but comes with duplicate results due to source packages, different arch and old releases. + # So we filters them out to only keep proper packages. + "--type", "package", + # Additional search arguments. + *args, + ) + + package_list = xmltodict.parse(output).get('stream', {}).get('search-result', {}).get('solvable-list', {}).get('solvable', []) + + # Group packages by ID. + key_func = itemgetter('@name') + + # Skip old packages reported in the results as 'other-version'. + fresh_packages = sorted( + (p for p in package_list if p.get('@status') != 'other-version'), + key=key_func + ) + + # Returns the highest version for a package ID among all repositories and arch variations. + for key, group in groupby(fresh_packages, key_func): + yield { + 'id': key, + 'version': max((parse_version(p['@edition']) for p in group)) + } + + @property + def installed(self): + """Fetch installed packages. + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout search --details --type package --installed-only + """ + installed = {} + + for package in self._search("--installed-only"): + package_id = package['id'] + installed[package_id] = { + "id": package_id, + "name": package_id, + "installed_version": package['version'], + } + + return installed + + @property + def outdated(self): + """Fetch outdated packages. + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout list-updates + + + Loading repository data... + Reading installed packages... + + + + Fast, scalable revision control system + + Blah blah blah... + + + + + (...) + + + + """ + outdated = {} + + output = self.run_cli("--xmlout", "list-updates") + + package_list = xmltodict.parse(output).get('stream', {}).get('update-status', {}).get('update-list', {}).get('update', []) + + for package in package_list: + package_id = package['@name'] + outdated[package_id] = { + "id": package_id, + "name": package_id, + "latest_version": parse_version(package['@edition']), + "installed_version": parse_version(package['@edition-old']), + } + return outdated + + def search(self, query, extended, exact): + """Fetch matching packages. + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout search --details --type package kopete + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout search --details --type package --search-description kopete + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout search --details --type package --match-exact kopete + + .. code-block:: shell-session + + ► zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh --xmlout search --details --type package --search-description --match-exact kopete + """ + matches = {} + + search_param = [] + if extended: + search_param.append("--search-description") + if exact: + search_param.append("--match-exact") + + for package in self._search(*search_param, query): + package_id = package['id'] + matches[package_id] = { + "id": package_id, + "name": package_id, + "installed_version": package['version'], + } + + return matches + + def install(self, package_id): + """Install one package. + + .. code-block:: shell-session + + ► sudo zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh install kopete + """ + return self.run_cli("install", package_id, sudo=True) + + def upgrade_cli(self, package_id=None): + """Generates the CLI to upgrade all packages (default) or only the one provided as parameter. + + .. code-block:: shell-session + + ► sudo zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh update + + .. code-block:: shell-session + + ► sudo zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh update kopete + """ + return self.build_cli("update", package_id, sudo=True) + + def sync(self): + """Sync package metadata. + + .. code-block:: shell-session + + ► sudo zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh refresh + """ + self.run_cli("refresh", sudo=True) + + def cleanup(self): + """Removes things we don't need anymore. + + .. code-block:: shell-session + + ► sudo zypper --no-color --no-abbrev --non-interactive --no-cd --no-refresh clean + """ + self.run_cli("clean", sudo=True) diff --git a/meta_package_manager/tests/test_cli_install.py b/meta_package_manager/tests/test_cli_install.py index 78f942e22..edf517011 100644 --- a/meta_package_manager/tests/test_cli_install.py +++ b/meta_package_manager/tests/test_cli_install.py @@ -62,6 +62,7 @@ def test_no_package_id(self, invoke): "steamcmd": "", "vscode": "tamasfe.even-better-toml", "yarn": "markdown", + "zypper": "git", } assert set(PACKAGE_IDS) == set(pool.all_manager_ids) diff --git a/meta_package_manager/tests/test_pool.py b/meta_package_manager/tests/test_pool.py index 54c5adeeb..e93a4f0ae 100644 --- a/meta_package_manager/tests/test_pool.py +++ b/meta_package_manager/tests/test_pool.py @@ -25,7 +25,7 @@ def test_manager_count(): """Check all implemented package managers are accounted for, and unique.""" - assert len(pool) == 20 + assert len(pool) == 21 assert len(pool) == len(pool.all_manager_ids) assert pool.all_manager_ids == tuple(sorted(set(pool))) diff --git a/poetry.lock b/poetry.lock index eda2d9b37..1e48bff74 100644 --- a/poetry.lock +++ b/poetry.lock @@ -433,11 +433,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pygments" -version = "2.11.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pyparsing" @@ -548,7 +548,7 @@ python-versions = ">=3.6" [[package]] name = "regex" -version = "2022.3.15" +version = "2022.4.24" description = "Alternative regular expression module, to replace re." category = "main" optional = false @@ -856,7 +856,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "cc9ede5eb0d480c5dc8240481cf6b32c98b2145f25df06b673031c2149230760" +content-hash = "f9c1c6d418316d006d09c44b59f1328decc82a8044a7b29ad5f4aa525667c8ee" [metadata.files] alabaster = [ @@ -1112,8 +1112,8 @@ py = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pyparsing = [ {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, @@ -1179,80 +1179,80 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] regex = [ - {file = "regex-2022.3.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42eb13b93765c6698a5ab3bcd318d8c39bb42e5fa8a7fcf7d8d98923f3babdb1"}, - {file = "regex-2022.3.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9beb03ff6fe509d6455971c2489dceb31687b38781206bcec8e68bdfcf5f1db2"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0a5a1fdc9f148a8827d55b05425801acebeeefc9e86065c7ac8b8cc740a91ff"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb374a2a4dba7c4be0b19dc7b1adc50e6c2c26c3369ac629f50f3c198f3743a4"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c33ce0c665dd325200209340a88438ba7a470bd5f09f7424e520e1a3ff835b52"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04c09b9651fa814eeeb38e029dc1ae83149203e4eeb94e52bb868fadf64852bc"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab5d89cfaf71807da93c131bb7a19c3e19eaefd613d14f3bce4e97de830b15df"}, - {file = "regex-2022.3.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e2630ae470d6a9f8e4967388c1eda4762706f5750ecf387785e0df63a4cc5af"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:df037c01d68d1958dad3463e2881d3638a0d6693483f58ad41001aa53a83fcea"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:940570c1a305bac10e8b2bc934b85a7709c649317dd16520471e85660275083a"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7f63877c87552992894ea1444378b9c3a1d80819880ae226bb30b04789c0828c"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3e265b388cc80c7c9c01bb4f26c9e536c40b2c05b7231fbb347381a2e1c8bf43"}, - {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:058054c7a54428d5c3e3739ac1e363dc9347d15e64833817797dc4f01fb94bb8"}, - {file = "regex-2022.3.15-cp310-cp310-win32.whl", hash = "sha256:76435a92e444e5b8f346aed76801db1c1e5176c4c7e17daba074fbb46cb8d783"}, - {file = "regex-2022.3.15-cp310-cp310-win_amd64.whl", hash = "sha256:174d964bc683b1e8b0970e1325f75e6242786a92a22cedb2a6ec3e4ae25358bd"}, - {file = "regex-2022.3.15-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e1d8ed9e61f37881c8db383a124829a6e8114a69bd3377a25aecaeb9b3538f8"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b52771f05cff7517f7067fef19ffe545b1f05959e440d42247a17cd9bddae11b"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673f5a393d603c34477dbad70db30025ccd23996a2d0916e942aac91cc42b31a"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8923e1c5231549fee78ff9b2914fad25f2e3517572bb34bfaa3aea682a758683"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764e66a0e382829f6ad3bbce0987153080a511c19eb3d2f8ead3f766d14433ac"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd00859291658fe1fda48a99559fb34da891c50385b0bfb35b808f98956ef1e7"}, - {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa2ce79f3889720b46e0aaba338148a1069aea55fda2c29e0626b4db20d9fcb7"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:34bb30c095342797608727baf5c8aa122406aa5edfa12107b8e08eb432d4c5d7"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:25ecb1dffc5e409ca42f01a2b2437f93024ff1612c1e7983bad9ee191a5e8828"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:aa5eedfc2461c16a092a2fabc5895f159915f25731740c9152a1b00f4bcf629a"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:7d1a6e403ac8f1d91d8f51c441c3f99367488ed822bda2b40836690d5d0059f5"}, - {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3e4d710ff6539026e49f15a3797c6b1053573c2b65210373ef0eec24480b900b"}, - {file = "regex-2022.3.15-cp36-cp36m-win32.whl", hash = "sha256:0100f0ded953b6b17f18207907159ba9be3159649ad2d9b15535a74de70359d3"}, - {file = "regex-2022.3.15-cp36-cp36m-win_amd64.whl", hash = "sha256:f320c070dea3f20c11213e56dbbd7294c05743417cde01392148964b7bc2d31a"}, - {file = "regex-2022.3.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fc8c7958d14e8270171b3d72792b609c057ec0fa17d507729835b5cff6b7f69a"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ca6dcd17f537e9f3793cdde20ac6076af51b2bd8ad5fe69fa54373b17b48d3c"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0214ff6dff1b5a4b4740cfe6e47f2c4c92ba2938fca7abbea1359036305c132f"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a98ae493e4e80b3ded6503ff087a8492db058e9c68de371ac3df78e88360b374"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b1cc70e31aacc152a12b39245974c8fccf313187eead559ee5966d50e1b5817"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4829db3737480a9d5bfb1c0320c4ee13736f555f53a056aacc874f140e98f64"}, - {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:303b15a3d32bf5fe5a73288c316bac5807587f193ceee4eb6d96ee38663789fa"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:dc7b7c16a519d924c50876fb152af661a20749dcbf653c8759e715c1a7a95b18"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ce3057777a14a9a1399b81eca6a6bfc9612047811234398b84c54aeff6d536ea"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:48081b6bff550fe10bcc20c01cf6c83dbca2ccf74eeacbfac240264775fd7ecf"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dcbb7665a9db9f8d7642171152c45da60e16c4f706191d66a1dc47ec9f820aed"}, - {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c155a1a80c5e7a8fa1d9bb1bf3c8a953532b53ab1196092749bafb9d3a7cbb60"}, - {file = "regex-2022.3.15-cp37-cp37m-win32.whl", hash = "sha256:04b5ee2b6d29b4a99d38a6469aa1db65bb79d283186e8460542c517da195a8f6"}, - {file = "regex-2022.3.15-cp37-cp37m-win_amd64.whl", hash = "sha256:797437e6024dc1589163675ae82f303103063a0a580c6fd8d0b9a0a6708da29e"}, - {file = "regex-2022.3.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8afcd1c2297bc989dceaa0379ba15a6df16da69493635e53431d2d0c30356086"}, - {file = "regex-2022.3.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0066a6631c92774391f2ea0f90268f0d82fffe39cb946f0f9c6b382a1c61a5e5"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8248f19a878c72d8c0a785a2cd45d69432e443c9f10ab924c29adda77b324ae"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d1f3ea0d1924feb4cf6afb2699259f658a08ac6f8f3a4a806661c2dfcd66db1"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:794a6bc66c43db8ed06698fc32aaeaac5c4812d9f825e9589e56f311da7becd9"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d1445824944e642ffa54c4f512da17a953699c563a356d8b8cbdad26d3b7598"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f553a1190ae6cd26e553a79f6b6cfba7b8f304da2071052fa33469da075ea625"}, - {file = "regex-2022.3.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:75a5e6ce18982f0713c4bac0704bf3f65eed9b277edd3fb9d2b0ff1815943327"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f16cf7e4e1bf88fecf7f41da4061f181a6170e179d956420f84e700fb8a3fd6b"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dad3991f0678facca1a0831ec1ddece2eb4d1dd0f5150acb9440f73a3b863907"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:491fc754428514750ab21c2d294486223ce7385446f2c2f5df87ddbed32979ae"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6504c22c173bb74075d7479852356bb7ca80e28c8e548d4d630a104f231e04fb"}, - {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01c913cf573d1da0b34c9001a94977273b5ee2fe4cb222a5d5b320f3a9d1a835"}, - {file = "regex-2022.3.15-cp38-cp38-win32.whl", hash = "sha256:029e9e7e0d4d7c3446aa92474cbb07dafb0b2ef1d5ca8365f059998c010600e6"}, - {file = "regex-2022.3.15-cp38-cp38-win_amd64.whl", hash = "sha256:947a8525c0a95ba8dc873191f9017d1b1e3024d4dc757f694e0af3026e34044a"}, - {file = "regex-2022.3.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:591d4fba554f24bfa0421ba040cd199210a24301f923ed4b628e1e15a1001ff4"}, - {file = "regex-2022.3.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9809404528a999cf02a400ee5677c81959bc5cb938fdc696b62eb40214e3632"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f08a7e4d62ea2a45557f561eea87c907222575ca2134180b6974f8ac81e24f06"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a86cac984da35377ca9ac5e2e0589bd11b3aebb61801204bd99c41fac516f0d"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:286908cbe86b1a0240a867aecfe26a439b16a1f585d2de133540549831f8e774"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b7494df3fdcc95a1f76cf134d00b54962dd83189520fd35b8fcd474c0aa616d"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b1ceede92400b3acfebc1425937454aaf2c62cd5261a3fabd560c61e74f6da3"}, - {file = "regex-2022.3.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0317eb6331146c524751354ebef76a7a531853d7207a4d760dfb5f553137a2a4"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c144405220c5ad3f5deab4c77f3e80d52e83804a6b48b6bed3d81a9a0238e4c"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5b2e24f3ae03af3d8e8e6d824c891fea0ca9035c5d06ac194a2700373861a15c"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f2c53f3af011393ab5ed9ab640fa0876757498aac188f782a0c620e33faa2a3d"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:060f9066d2177905203516c62c8ea0066c16c7342971d54204d4e51b13dfbe2e"}, - {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:530a3a16e57bd3ea0dff5ec2695c09632c9d6c549f5869d6cf639f5f7153fb9c"}, - {file = "regex-2022.3.15-cp39-cp39-win32.whl", hash = "sha256:78ce90c50d0ec970bd0002462430e00d1ecfd1255218d52d08b3a143fe4bde18"}, - {file = "regex-2022.3.15-cp39-cp39-win_amd64.whl", hash = "sha256:c5adc854764732dbd95a713f2e6c3e914e17f2ccdc331b9ecb777484c31f73b6"}, - {file = "regex-2022.3.15.tar.gz", hash = "sha256:0a7b75cc7bb4cc0334380053e4671c560e31272c9d2d5a6c4b8e9ae2c9bd0f82"}, + {file = "regex-2022.4.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f86aef546add4ff1202e1f31e9bb54f9268f17d996b2428877283146bf9bc013"}, + {file = "regex-2022.4.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e944268445b5694f5d41292c9228f0ca46d5a32a67f195d5f8547c1f1d91f4bc"}, + {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8da3145f4b72f7ce6181c804eaa44cdcea313c8998cdade3d9e20a8717a9cb"}, + {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fd464e547dbabf4652ca5fe9d88d75ec30182981e737c07b3410235a44b9939"}, + {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:071bcb625e890f28b7c4573124a6512ea65107152b1d3ca101ce33a52dad4593"}, + {file = "regex-2022.4.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c2de7f32fa87d04d40f54bce3843af430697aba51c3a114aa62837a0772f219"}, + {file = "regex-2022.4.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a07e8366115069f26822c47732122ab61598830a69f5629a37ea8881487c107"}, + {file = "regex-2022.4.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d1c1fbe69eba3ee253c107e71749cdbb4776db93d674bc0d5e28f30300734"}, + {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:af1e687ffab18a75409e5e5d6215b6ccd41a5a1a0ea6ce9665e01253f737a0d3"}, + {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:165cc75cfa5aa0f12adb2ac6286330e7229a06dc0e6c004ec35da682b5b89579"}, + {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3e35c50b27f36176c792738cb9b858523053bc495044d2c2b44db24376b266f1"}, + {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:43ee0df35925ae4b0cc6ee3f60b73369e559dd2ac40945044da9394dd9d3a51d"}, + {file = "regex-2022.4.24-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58521abdab76583bd41ef47e5e2ddd93b32501aee4ee8cee71dee10a45ba46b1"}, + {file = "regex-2022.4.24-cp310-cp310-win32.whl", hash = "sha256:275afc7352982ee947fc88f67a034b52c78395977b5fc7c9be15f7dc95b76f06"}, + {file = "regex-2022.4.24-cp310-cp310-win_amd64.whl", hash = "sha256:253f858a0255cd91a0424a4b15c2eedb12f20274f85731b0d861c8137e843065"}, + {file = "regex-2022.4.24-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:85b7ee4d0c7a46296d884f6b489af8b960c4291d76aea4b22fd4fbe05e6ec08e"}, + {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0da7ef160d4f3eb3d4d3e39a02c3c42f7dbcfce62c81f784cc99fc7059765f"}, + {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f2e2cef324ca9355049ee1e712f68e2e92716eba24275e6767b9bfa15f1f478"}, + {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6165e737acb3bea3271372e8aa5ebe7226c8a8e8da1b94af2d6547c5a09d689d"}, + {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f6bd8178cce5bb56336722d5569d19c50bba5915a69a2050c497fb921e7cb0f"}, + {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45b761406777a681db0c24686178532134c937d24448d9e085279b69e9eb7da4"}, + {file = "regex-2022.4.24-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dfbadb7b74d95f72f9f9dbf9778f7de92722ab520a109ceaf7927461fa85b10"}, + {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9913bcf730eb6e9b441fb176832eea9acbebab6035542c7c89d90c803f5cd3be"}, + {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:68aed3fb0c61296bd6d234f558f78c51671f79ccb069cbcd428c2eea6fee7a5b"}, + {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8e7d33f93cdd01868327d834d0f5bb029241cd293b47d51b96814dec27fc9b4b"}, + {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:82b7fc67e49fdce671bdbec1127189fc979badf062ce6e79dc95ef5e07a8bf92"}, + {file = "regex-2022.4.24-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c36906a7855ec33a9083608e6cd595e4729dab18aeb9aad0dd0b039240266239"}, + {file = "regex-2022.4.24-cp36-cp36m-win32.whl", hash = "sha256:b2df3ede85d778c949d9bd2a50237072cee3df0a423c91f5514f78f8035bde87"}, + {file = "regex-2022.4.24-cp36-cp36m-win_amd64.whl", hash = "sha256:dffd9114ade73137ab2b79a8faf864683dbd2dbbb6b23a305fbbd4cbaeeb2187"}, + {file = "regex-2022.4.24-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a0ef57cccd8089b4249eebad95065390e56c04d4a92c51316eab4131bca96a9"}, + {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12af15b6edb00e425f713160cfd361126e624ec0de86e74f7cad4b97b7f169b3"}, + {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f271d0831d8ebc56e17b37f9fa1824b0379221d1238ae77c18a6e8c47f1fdce"}, + {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37903d5ca11fa47577e8952d2e2c6de28553b11c70defee827afb941ab2c6729"}, + {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b747cef8e5dcdaf394192d43a0c02f5825aeb0ecd3d43e63ae500332ab830b0"}, + {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:582ea06079a03750b5f71e20a87cd99e646d796638b5894ff85987ebf5e04924"}, + {file = "regex-2022.4.24-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6daa189db9104787ff1fd7a7623ce017077aa59eaac609d0d25ba95ed251a0"}, + {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7dbc96419ef0fb6ac56626014e6d3a345aeb8b17a3df8830235a88626ffc8d84"}, + {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0fb6cb16518ac7eff29d1e0b0cce90275dfae0f17154165491058c31d58bdd1d"}, + {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bea61de0c688198e3d9479344228c7accaa22a78b58ec408e41750ebafee6c08"}, + {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:46cbc5b23f85e94161b093dba1b49035697cf44c7db3c930adabfc0e6d861b95"}, + {file = "regex-2022.4.24-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:50b77622016f03989cd06ecf6b602c7a6b4ed2e3ce04133876b041d109c934ee"}, + {file = "regex-2022.4.24-cp37-cp37m-win32.whl", hash = "sha256:2bde99f2cdfd6db1ec7e02d68cadd384ffe7413831373ea7cc68c5415a0cb577"}, + {file = "regex-2022.4.24-cp37-cp37m-win_amd64.whl", hash = "sha256:66fb765b2173d90389384708e3e1d3e4be1148bd8d4d50476b1469da5a2f0229"}, + {file = "regex-2022.4.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:709396c0c95b95045fac89b94f997410ff39b81a09863fe21002f390d48cc7d3"}, + {file = "regex-2022.4.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a608022f4593fc67518c6c599ae5abdb03bb8acd75993c82cd7a4c8100eff81"}, + {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb7107faf0168de087f62a2f2ed00f9e9da12e0b801582b516ddac236b871cda"}, + {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aabc28f7599f781ddaeac168d0b566d0db82182cc3dcf62129f0a4fc2927b811"}, + {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92ad03f928675ca05b79d3b1d3dfc149e2226d57ed9d57808f82105d511d0212"}, + {file = "regex-2022.4.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ba3c304a4a5d8112dbd30df8b3e4ef59b4b07807957d3c410d9713abaee9a8"}, + {file = "regex-2022.4.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2acf5c66fbb62b5fe4c40978ddebafa50818f00bf79d60569d9762f6356336e"}, + {file = "regex-2022.4.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c4d9770e579eb11b582b2e2fd19fa204a15cb1589ae73cd4dcbb63b64f3e828"}, + {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:02543d6d5c32d361b7cc468079ba4cddaaf4a6544f655901ba1ff9d8e3f18755"}, + {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:73ed1b06abadbf6b61f6033a07c06f36ec0ddca117e41ef2ac37056705e46458"}, + {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3241db067a7f69da57fba8bca543ac8a7ca415d91e77315690202749b9fdaba1"}, + {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d128e278e5e554c5c022c7bed410ca851e00bacebbb4460de546a73bc53f8de4"}, + {file = "regex-2022.4.24-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1d53835922cd0f9b74b2742453a444865a70abae38d12eb41c59271da66f38d"}, + {file = "regex-2022.4.24-cp38-cp38-win32.whl", hash = "sha256:f2a5d9f612091812dee18375a45d046526452142e7b78c4e21ab192db15453d5"}, + {file = "regex-2022.4.24-cp38-cp38-win_amd64.whl", hash = "sha256:a850f5f369f1e3b6239da7fb43d1d029c1e178263df671819889c47caf7e4ff3"}, + {file = "regex-2022.4.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bedb3d01ad35ea1745bdb1d57f3ee0f996f988c98f5bbae9d068c3bb3065d210"}, + {file = "regex-2022.4.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8bf867ba71856414a482e4b683500f946c300c4896e472e51d3db8dfa8dc8f32"}, + {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b415b82e5be7389ec5ee7ee35431e4a549ea327caacf73b697c6b3538cb5c87f"}, + {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dae5affbb66178dad6c6fd5b02221ca9917e016c75ee3945e9a9563eb1fbb6f"}, + {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e65580ae3137bce712f505ec7c2d700aef0014a3878c4767b74aff5895fc454f"}, + {file = "regex-2022.4.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e9e983fc8e0d4d5ded7caa5aed39ca2cf6026d7e39801ef6f0af0b1b6cd9276"}, + {file = "regex-2022.4.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad3a770839aa456ff9a9aa0e253d98b628d005a3ccb37da1ff9be7c84fee16"}, + {file = "regex-2022.4.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed625205f5f26984382b68e4cbcbc08e6603c9e84c14b38457170b0cc71c823b"}, + {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c4fdf837666f7793a5c3cfa2f2f39f03eb6c7e92e831bc64486c2f547580c2b3"}, + {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ed26c3d2d62c6588e0dad175b8d8cc0942a638f32d07b80f92043e5d73b7db67"}, + {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f89d26e50a4c7453cb8c415acd09e72fbade2610606a9c500a1e48c43210a42d"}, + {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:97af238389cb029d63d5f2d931a7e8f5954ad96e812de5faaed373b68e74df86"}, + {file = "regex-2022.4.24-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:be392d9cd5309509175a9d7660dc17bf57084501108dbff0c5a8bfc3646048c3"}, + {file = "regex-2022.4.24-cp39-cp39-win32.whl", hash = "sha256:bcc6f7a3a95119c3568c572ca167ada75f8319890706283b9ba59b3489c9bcb3"}, + {file = "regex-2022.4.24-cp39-cp39-win_amd64.whl", hash = "sha256:5b9c7b6895a01204296e9523b3e12b43e013835a9de035a783907c2c1bc447f0"}, + {file = "regex-2022.4.24.tar.gz", hash = "sha256:92183e9180c392371079262879c6532ccf55f808e6900df5d9f03c9ca8807255"}, ] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, diff --git a/pyproject.toml b/pyproject.toml index 974e10168..596e51e4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,7 @@ keywords = [ 'xbar', 'swiftbar', 'yarn', + 'zypper', ] classifiers = [ # See: https://pypi.org/pypi?%3Aaction=list_classifiers @@ -80,6 +81,7 @@ click-extra = "^2.1.0" tabulate = { extras = ["widechars"], version = "^0.8.9" } tomli = { version = "^2.0.1", python = "< 3.11" } tomli_w = "^1.0.0" +xmltodict = "^0.12.0" [tool.poetry.dev-dependencies] bump2version = "^1.0.1" diff --git a/readme.md b/readme.md index d71857768..63bd958f6 100644 --- a/readme.md +++ b/readme.md @@ -73,6 +73,7 @@ ______________________________________________________________________ | [`steamcmd`](https://developer.valvesoftware.com/wiki/SteamCMD) | None | 🍎 | 🐧 | 🪟 | | | | ✓ | ✓ | | | | [`vscode`](https://code.visualstudio.com) | 1.60.0 | 🍎 | 🐧 | 🪟 | ✓ | | ✓ | ✓ | | | | | [`yarn`](https://yarnpkg.com) | 1.21.0 | 🍎 | 🐧 | 🪟 | ✓ | ✓ | ✓ | ✓ | ✓ | | ✓ | +| [`zypper`](https://en.opensuse.org/Portal:Zypper) | 1.14.0 | | 🐧 | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ## Quickstart @@ -93,28 +94,31 @@ in this case): ```shell-session $ mpm --all-managers managers -╭────────────────────┬──────────┬────────────────┬───────────────────────────┬────────────┬──────────╮ -│ Package manager │ ID │ Supported │ CLI │ Executable │ Version │ -├────────────────────┼──────────┼────────────────┼───────────────────────────┼────────────┼──────────┤ -│ Atom's apm │ apm │ ✓ │ ✓ /usr/local/bin/apm │ ✓ │ ✓ 2.6.2 │ -│ APT │ apt │ ✘ Linux only │ ✓ /usr/bin/apt │ ✓ │ ✘ │ -│ Linux Mint's apt │ apt-mint │ ✘ Linux only │ ✓ /usr/bin/apt │ ✓ │ ✘ │ -│ Homebrew Formulae │ brew │ ✓ │ ✓ /usr/local/bin/brew │ ✓ │ ✓ 3.2.16 │ -│ Homebrew Cask │ cask │ ✓ │ ✓ /usr/local/bin/brew │ ✓ │ ✓ 3.2.16 │ -│ Chocolatey │ choco │ ✘ Windows only │ ✘ choco not found │ │ │ -│ PHP's Composer │ composer │ ✓ │ ✓ /usr/local/bin/composer │ ✓ │ ✓ 2.1.8 │ -│ DNF │ dnf │ ✘ Linux only │ ✘ dnf not found │ │ │ -│ Flatpak │ flatpak │ ✘ Linux only │ ✘ flatpak not found │ │ │ -│ Ruby Gems │ gem │ ✓ │ ✓ /usr/bin/gem │ ✓ │ ✓ 3.0.3 │ -│ Mac AppStore │ mas │ ✓ │ ✓ /usr/local/bin/mas │ ✓ │ ✓ 1.8.3 │ -│ Node's npm │ npm │ ✓ │ ✓ /usr/local/bin/npm │ ✓ │ ✓ 7.24.0 │ -│ OPKG │ opkg │ ✘ Linux only │ ✘ opkg not found │ │ │ -│ Pacman │ pacman │ ✘ Linux only │ ✘ pacman not found │ │ │ -│ Pip │ pip │ ✓ │ ✓ /usr/local/bin/python3 │ ✓ │ ✓ 21.2.4 │ -│ Snap │ snap │ ✘ Linux only │ ✘ snap not found │ │ │ -│ Visual Studio Code │ vscode │ ✓ │ ✓ /usr/local/bin/code │ ✓ │ ✓ 1.61.0 │ -│ Node's yarn │ yarn │ ✓ │ ✘ yarn not found │ │ │ -╰────────────────────┴──────────┴────────────────┴───────────────────────────┴────────────┴──────────╯ +╭────────────────────┬──────────┬────────────────┬───────────────────────────┬────────────┬──────────────╮ +│ Package manager │ ID │ Supported │ CLI │ Executable │ Version │ +├────────────────────┼──────────┼────────────────┼───────────────────────────┼────────────┼──────────────┤ +│ Atom's apm │ apm │ ✓ │ ✓ /usr/local/bin/apm │ ✓ │ ✓ 2.6.2 │ +│ APT │ apt │ ✘ Linux only │ ✓ /usr/bin/apt │ ✓ │ ✘ │ +│ Linux Mint's apt │ apt-mint │ ✘ Linux only │ ✓ /usr/bin/apt │ ✓ │ ✘ │ +│ Homebrew Formulae │ brew │ ✓ │ ✓ /usr/local/bin/brew │ ✓ │ ✓ 3.2.16 │ +│ Homebrew Cask │ cask │ ✓ │ ✓ /usr/local/bin/brew │ ✓ │ ✓ 3.2.16 │ +│ Chocolatey │ choco │ ✘ Windows only │ ✘ choco not found │ │ │ +│ PHP's Composer │ composer │ ✓ │ ✓ /usr/local/bin/composer │ ✓ │ ✓ 2.1.8 │ +│ DNF │ dnf │ ✘ Linux only │ ✘ dnf not found │ │ │ +│ Emerge │ emerge │ ✘ Linux only │ ✘ emerge not found │ │ │ +│ Flatpak │ flatpak │ ✘ Linux only │ ✘ flatpak not found │ │ │ +│ Ruby Gems │ gem │ ✓ │ ✓ /usr/bin/gem │ ✓ │ ✓ 3.0.3 │ +│ Mac AppStore │ mas │ ✓ │ ✓ /usr/local/bin/mas │ ✓ │ ✓ 1.8.3 │ +│ Node's npm │ npm │ ✓ │ ✓ /usr/local/bin/npm │ ✓ │ ✓ 7.24.0 │ +│ OPKG │ opkg │ ✘ Linux only │ ✘ opkg not found │ │ │ +│ Pacman │ pacman │ ✘ Linux only │ ✘ pacman not found │ │ │ +│ Pip │ pip │ ✓ │ ✓ /usr/local/bin/python3 │ ✓ │ ✓ 21.2.4 │ +│ Snap │ snap │ ✘ Linux only │ ✘ snap not found │ │ │ +│ SteamCMD │ steamcmd │ ✓ │ ✓ /opt/local/bin/steamcmd │ ✓ │ ✓ 1648077083 │ +│ Visual Studio Code │ vscode │ ✓ │ ✓ /usr/local/bin/code │ ✓ │ ✓ 1.61.0 │ +│ Node's yarn │ yarn │ ✓ │ ✘ yarn not found │ │ │ +│ Zypper │ zypper │ ✘ Linux only │ ✘ zypper not found │ │ │ +╰────────────────────┴──────────┴────────────────┴───────────────────────────┴────────────┴──────────────╯ ``` ## List installed packages