├── .flake8 ├── .github └── dependabot.yml ├── .gitignore ├── .pre-commit-config.yaml ├── AUTHORS ├── LICENSE ├── README.md ├── gsem ├── __init__.py ├── cli.py ├── config.py ├── extension.py └── utils.py ├── poetry.lock └── pyproject.toml /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 88 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "pip" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | 55 | # Sphinx documentation 56 | docs/_build/ 57 | 58 | # PyBuilder 59 | target/ 60 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: local 3 | hooks: 4 | - id: black 5 | name: black 6 | language: system 7 | entry: black 8 | types: [python] 9 | - repo: local 10 | hooks: 11 | - id: flake8 12 | name: flake8 13 | language: python 14 | entry: flake8 15 | types: [python] 16 | - repo: local 17 | hooks: 18 | - id: mypy 19 | name: mypy 20 | language: python 21 | entry: mypy 22 | types: [python] 23 | 24 | - repo: local 25 | hooks: 26 | - id: isort 27 | name: isort 28 | language: python 29 | entry: isort 30 | types: [python] 31 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Andriy Kogut 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Andriy Kohut 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gsem 2 | 3 | [![PyPI version](https://badge.fury.io/py/gsem.svg)](https://pypi.org/project/gsem/) 4 | 5 | *gsem* - Command line extension manager for Gnome-Shell 6 | 7 | ``` 8 | usage: gsem [-h] 9 | {ls,enabled,disabled,outdated,info,install,reinstall,uninstall,update,search,enable,disable} 10 | ... 11 | 12 | Gnome-Shell extension manager 13 | 14 | positional arguments: 15 | {ls,enabled,disabled,outdated,info,install,reinstall,uninstall,update,search,enable,disable} 16 | ls list installed extensions 17 | enabled list enabled extensions 18 | disabled list disabled extensions 19 | outdated list outdated extensions 20 | info show extension information 21 | install install extension 22 | reinstall reinstall extension 23 | uninstall uninstall extension 24 | update update extensions 25 | search search extensions 26 | enable enable extension 27 | disable disable extension 28 | 29 | optional arguments: 30 | -h, --help show this help message and exit 31 | ``` 32 | 33 | ## Installation 34 | 35 | ### User installation (recommended) 36 | Run `pip install --user gsem` 37 | 38 | Make sure you have `"$HOME/.local/bin"` in your `$PATH`. 39 | 40 | ### Global installation 41 | Run `sudo pip install gsem` 42 | 43 | ### Updating the package 44 | 45 | Run `pip install -U --user gsem` for user installation or `sudo pip install -U gsem` for global installation. 46 | 47 | ## Features: 48 | * list installed 49 | * list enabled/disabled 50 | * list outdated 51 | * extension info 52 | * search 53 | * enable/disable 54 | * install/uninstall/reinstall 55 | * update 56 | 57 | ## Contributing 58 | 59 | Development on latest python version is preferred, as of now it's 3.9. 60 | To start you'll need the following setup: 61 | 62 | Example uses pyenv to install latest python and manage virtualenv. Run the following commands from the root of the repository. 63 | 64 | ```sh 65 | pyenv install 3.9.2 # install latest python version 66 | pyenv virtualenv 3.9.2 gsem # create gsem virtual environment 67 | pyenv activate gsem # activate the venv 68 | pyenv local gsem # set local python version for the repo 69 | poetry install # install all dependencies inside the virtual environment 70 | pre-commit install # install pre-commit hooks 71 | ``` 72 | 73 | Run all the linters: 74 | ```sh 75 | pre-commit run -a 76 | ``` 77 | 78 | ## TODO: 79 | * pin 80 | -------------------------------------------------------------------------------- /gsem/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriykohut/gsem/a07424f3da40856bd045a5887f49bdf4010c954c/gsem/__init__.py -------------------------------------------------------------------------------- /gsem/cli.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from typing import Callable, Dict, List 3 | from urllib.error import HTTPError 4 | 5 | from gsem.config import API_ROOT, EXTENSION_DIR, GNOME_SHELL_VERSION 6 | from gsem.extension import Extension, ExtensionManager 7 | from gsem.utils import reload_gnome_shell 8 | 9 | 10 | def cli_args() -> argparse.ArgumentParser: 11 | """Parse command line arguments.""" 12 | parser = argparse.ArgumentParser( 13 | description="Gnome-Shell extension manager", 14 | formatter_class=argparse.ArgumentDefaultsHelpFormatter, 15 | ) 16 | commands = parser.add_subparsers(dest="cmd") 17 | commands.add_parser("ls", help="list installed extensions") 18 | commands.add_parser("enabled", help="list enabled extensions") 19 | commands.add_parser("disabled", help="list disabled extensions") 20 | commands.add_parser("outdated", help="list outdated extensions") 21 | info = commands.add_parser("info", help="show extension information") 22 | info.add_argument("uuid", help="extension uuid", metavar="UUID") 23 | info.add_argument( 24 | "-r", 25 | "--remote", 26 | help="fetch info from {}".format(API_ROOT), 27 | action="store_true", 28 | default=False, 29 | ) 30 | install = commands.add_parser("install", help="install extension") 31 | install.add_argument("uuid", help="extension uuid") 32 | install.add_argument( 33 | "--disabled", 34 | help="do not enable the extension", 35 | default=False, 36 | action="store_true", 37 | dest="disabled", 38 | ) 39 | install.add_argument( 40 | "--reload", 41 | help="Reload gnome-shell after installation", 42 | default=False, 43 | action="store_true", 44 | dest="reload", 45 | ) 46 | reinstall = commands.add_parser("reinstall", help="reinstall extension") 47 | reinstall.add_argument("uuid", help="extension uuid", metavar="UUID") 48 | uninstall = commands.add_parser("uninstall", help="uninstall extension") 49 | uninstall.add_argument("uuid", help="extension uuid", metavar="UUID") 50 | commands.add_parser("update", help="update extensions") 51 | search = commands.add_parser("search", help="search extensions") 52 | search.add_argument("term", help="search term", metavar="TERM") 53 | search.add_argument( 54 | "--shell-version", 55 | dest="shell_version", 56 | default=".".join([str(v) for v in GNOME_SHELL_VERSION]), 57 | help="Gnome Shell version", 58 | type=str, 59 | ) 60 | enable = commands.add_parser("enable", help="enable extension") 61 | enable.add_argument("uuid", help="extension uuid", metavar="UUID") 62 | disable = commands.add_parser("disable", help="disable extension") 63 | disable.add_argument("uuid", help="extensions uuid", metavar="UUID") 64 | for command in commands.choices.values(): 65 | command.formatter_class = argparse.ArgumentDefaultsHelpFormatter 66 | return parser 67 | 68 | 69 | def print_nice_list(list_: List[str]) -> None: 70 | """Nicely print list.""" 71 | length = len(list_) 72 | for index, item in enumerate(list_): 73 | if index < length - 1: 74 | print("├── {}".format(item)) 75 | else: 76 | print("└── {}".format(item)) 77 | 78 | 79 | def print_info(ext: Extension) -> None: 80 | """Print extension info.""" 81 | print(f"{ext.remote_meta['name']} - ({ext.uuid})") 82 | print() 83 | if ext.is_installed: 84 | if ext.is_outdated: 85 | print(f"outdated: {ext.version} -> {ext.remote_version}") 86 | else: 87 | print(f"up to date: {ext.version}") 88 | else: 89 | print(f"not installed: {ext.remote_version}") 90 | print() 91 | print(ext.remote_meta["description"]) 92 | 93 | 94 | def main() -> None: 95 | # TODO: This is ugly! 96 | """Main cli function.""" 97 | parser = cli_args() 98 | args = parser.parse_args() 99 | if not args.cmd: 100 | parser.print_usage() 101 | parser.exit(1) 102 | manager = ExtensionManager() 103 | list_cmd_map: Dict[str, Callable[[], List[Extension]]] = { 104 | "disabled": manager.disabled, 105 | "enabled": manager.enabled, 106 | "ls": manager.installed, 107 | "outdated": manager.outdated, 108 | "search": lambda: manager.search(args.term, args.shell_version), 109 | } 110 | if args.cmd in list_cmd_map.keys(): 111 | result = list_cmd_map[args.cmd]() 112 | if args.cmd == "outdated": 113 | print(f"{manager.ext_dir} ({len(result)})") 114 | lines = [ 115 | f"{e.meta['uuid']} {e.version} -> {e.remote_version}" for e in result 116 | ] 117 | elif args.cmd == "search": 118 | print(f"Search results for '{args.term}' ({len(result)})") 119 | lines = [ 120 | f"{e.remote_meta['uuid']} - {e.remote_meta['name']}" for e in result 121 | ] 122 | else: 123 | lines = [f"{e.uuid}@{e.version}" for e in result] 124 | print(f"{manager.ext_dir} ({len(lines)})") 125 | print_nice_list(lines) 126 | elif args.cmd == "info": 127 | try: 128 | print_info(Extension(args.uuid)) 129 | except HTTPError as err: 130 | if err.code == 404: 131 | print("Extension not found") 132 | return 133 | raise 134 | elif args.cmd == "enable": 135 | enabled = manager.enable(args.uuid) 136 | if enabled: 137 | print(f"'{args.uuid}' enabled") 138 | else: 139 | print(f"Can't enable '{args.uuid}'") 140 | elif args.cmd == "disable": 141 | disabled = manager.disable(args.uuid) 142 | if disabled: 143 | print(f"'{args.uuid}' disabled") 144 | else: 145 | print(f"Can't disable '{args.uuid}'") 146 | elif args.cmd == "install": 147 | if args.uuid in manager.installed_uuids(): 148 | print(f"'{args.uuid}' already installed") 149 | else: 150 | print(f"Installing {args.uuid} to '{EXTENSION_DIR}'") 151 | manager.install(args.uuid) 152 | if not args.disabled: 153 | print(f"Enabling '{args.uuid}'") 154 | manager.enable(args.uuid) 155 | if args.reload: 156 | print("Reloading gnome-shell...") 157 | reload_gnome_shell() 158 | elif args.cmd == "reinstall": 159 | if args.uuid not in manager.installed_uuids(): 160 | print(f"'{args.uuid}' is not installed") 161 | else: 162 | print(f"Uninstalling '{args.uuid}'") 163 | ext = Extension(args.uuid) 164 | was_enabled = ext.is_enabled 165 | manager.uninstall(args.uuid) 166 | print(f"Installing {args.uuid} to '{EXTENSION_DIR}'") 167 | manager.install(args.uuid) 168 | if was_enabled: 169 | manager.enable(args.uuid) 170 | elif args.cmd == "uninstall": 171 | if args.uuid not in manager.installed_uuids(): 172 | print(f"'{args.uuid}' is not installed") 173 | else: 174 | print(f"Uninstalling '{args.uuid}'") 175 | manager.uninstall(args.uuid) 176 | elif args.cmd == "update": 177 | outdated = manager.outdated() 178 | print(f"Extension updates available ({len(outdated)})") 179 | if outdated: 180 | lines = [f"{e.uuid} {e.version} -> {e.remote_version}" for e in outdated] 181 | print_nice_list(lines) 182 | prompt = input("Would you like to install these updates? (yes) ") 183 | if prompt.lower().strip().startswith("y"): 184 | for e in outdated: 185 | was_enabled = e.is_enabled 186 | print(f"Installing {e.uuid}@{e.remote_version} to {EXTENSION_DIR}") 187 | manager.uninstall(e.uuid) 188 | manager.install(e.uuid) 189 | if was_enabled: 190 | manager.enable(e.uuid) 191 | reload_gnome_shell() 192 | -------------------------------------------------------------------------------- /gsem/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from gsem.utils import gnome_shell_version 4 | 5 | EXTENSION_DIR = os.path.expanduser("~/.local/share/gnome-shell/extensions") 6 | GNOME_SHELL_VERSION = gnome_shell_version() 7 | 8 | API_ROOT = "https://extensions.gnome.org" 9 | API_DETAIL = f"{API_ROOT}/ajax/detail" 10 | API_SEARCH = f"{API_ROOT}/extension-query" 11 | -------------------------------------------------------------------------------- /gsem/extension.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import shutil 4 | import warnings 5 | from distutils.version import LooseVersion 6 | from typing import List, Optional, Set 7 | 8 | from gi.repository import Gio, GLib # type: ignore 9 | 10 | from gsem.config import ( 11 | API_DETAIL, 12 | API_ROOT, 13 | API_SEARCH, 14 | EXTENSION_DIR, 15 | GNOME_SHELL_VERSION, 16 | ) 17 | from gsem.utils import download_and_extract_zip, get_json_response 18 | 19 | 20 | class Extension: 21 | """Extension metadata.""" 22 | 23 | def __init__(self, uuid: str) -> None: 24 | self.uuid = uuid 25 | self._meta: Optional[dict] = None 26 | self._remote_meta: Optional[dict] = None 27 | 28 | @property 29 | def meta(self) -> dict: 30 | """Local metadata dict.""" 31 | if not self._meta: 32 | with open(os.path.join(EXTENSION_DIR, self.uuid, "metadata.json")) as f: 33 | self._meta = json.load(f) 34 | assert self._meta, f"No local metadata for {self.uuid}" 35 | return self._meta 36 | 37 | @property 38 | def remote_meta(self) -> dict: 39 | """Remote metadata dict.""" 40 | if not self._remote_meta: 41 | self._remote_meta = get_json_response( 42 | API_DETAIL, 43 | { 44 | "uuid": self.uuid, 45 | "shell_version": ".".join(str(v) for v in GNOME_SHELL_VERSION), 46 | }, 47 | ) 48 | assert self._remote_meta, f"No remote metadata for {self.uuid}" 49 | return self._remote_meta 50 | 51 | @remote_meta.setter 52 | def remote_meta(self, value: dict) -> None: 53 | self.uuid = value["uuid"] 54 | self._remote_meta = value 55 | 56 | @property 57 | def version(self) -> LooseVersion: 58 | return LooseVersion(str(self.meta["version"])) 59 | 60 | @property 61 | def remote_version(self) -> LooseVersion: 62 | return LooseVersion(str(self.remote_meta["version"])) 63 | 64 | @property 65 | def is_outdated(self) -> bool: 66 | # TODO: use https://extensions.gnome.org/update-info/?installed={%22arch-update@RaphaelRochet%22:{%22version%22:6}}&shell_version=3.18.3 # noqa 67 | return self.remote_version > self.version 68 | 69 | @property 70 | def is_enabled(self) -> bool: 71 | return self.uuid in ( 72 | Gio.Settings.new("org.gnome.shell").get_value("enabled-extensions") 73 | ) 74 | 75 | @property 76 | def is_installed(self) -> bool: 77 | try: 78 | self.meta["uuid"] 79 | return True 80 | except FileNotFoundError: 81 | return False 82 | 83 | @property 84 | def is_supported(self) -> bool: 85 | try: 86 | for f in ["description", "name", "version"]: 87 | assert f in self.meta, f'Missing field - "{f}"' 88 | return True 89 | except Exception as e: 90 | warnings.warn( 91 | f"[{self.uuid}] {e}: metadata {self.meta} - extension is not supported" 92 | ) 93 | return False 94 | 95 | 96 | class ExtensionManager: 97 | def __init__(self, ext_dir: str = EXTENSION_DIR) -> None: 98 | self.ext_dir = ext_dir 99 | 100 | def enabled_uuids(self) -> Set[str]: 101 | return set( 102 | Gio.Settings.new("org.gnome.shell").get_value("enabled-extensions") 103 | ).intersection(self.installed_uuids()) 104 | 105 | def installed_uuids(self) -> List[str]: 106 | return os.listdir(self.ext_dir) 107 | 108 | def installed(self) -> List[Extension]: 109 | installed = [] 110 | for uuid in self.installed_uuids(): 111 | ext = Extension(uuid) 112 | if ext.is_supported: 113 | installed.append(ext) 114 | return installed 115 | 116 | def enabled(self) -> List[Extension]: 117 | return [Extension(uuid) for uuid in self.enabled_uuids()] 118 | 119 | def disabled(self) -> List[Extension]: 120 | enabled_uuids = {e.uuid for e in self.enabled()} 121 | return [ 122 | Extension(uuid) 123 | for uuid in set(self.installed_uuids()).difference(enabled_uuids) 124 | ] 125 | 126 | def outdated(self) -> List[Extension]: 127 | # TODO: use https://extensions.gnome.org/update-info/?installed={%22arch-update@RaphaelRochet%22:{%22version%22:6}}&shell_version=3.18.3 # noqa 128 | return [e for e in self.installed() if e.is_outdated] 129 | 130 | @staticmethod 131 | def search(term: str, shell_version: str = "all") -> List[Extension]: 132 | query = { 133 | "shell_version": shell_version, 134 | "search": term, 135 | } 136 | response = get_json_response(API_SEARCH, query) 137 | found = [] 138 | for remote_meta in response["extensions"]: 139 | ext = Extension(remote_meta["uuid"]) 140 | ext.remote_meta = remote_meta 141 | found.append(ext) 142 | return found 143 | 144 | def enable(self, uuid: str) -> bool: 145 | if uuid in self.enabled_uuids(): 146 | return True 147 | ext = Extension(uuid) 148 | if not ext.is_installed: 149 | return False 150 | enabled_uuids = self.enabled_uuids() 151 | enabled_uuids.add(uuid) 152 | Gio.Settings("org.gnome.shell").set_value( 153 | "enabled-extensions", 154 | GLib.Variant("as", list(enabled_uuids)), 155 | ) 156 | return True 157 | 158 | def disable(self, uuid: str) -> bool: 159 | if uuid not in self.installed_uuids(): 160 | raise Exception("Not installed") 161 | enabled_uuids = self.enabled_uuids() 162 | if uuid not in enabled_uuids: 163 | return True 164 | enabled_uuids.remove(uuid) 165 | Gio.Settings("org.gnome.shell").set_value( 166 | "enabled-extensions", 167 | GLib.Variant("as", list(enabled_uuids)), 168 | ) 169 | return True 170 | 171 | @staticmethod 172 | def install(uuid: str) -> Extension: 173 | ext = Extension(uuid) 174 | download_url = API_ROOT + ext.remote_meta["download_url"] 175 | dest_dir = os.path.join(EXTENSION_DIR, uuid) 176 | download_and_extract_zip(download_url, dest_dir) 177 | return ext 178 | 179 | def uninstall(self, uuid: str) -> None: 180 | self.disable(uuid) 181 | shutil.rmtree(os.path.join(EXTENSION_DIR, uuid)) 182 | -------------------------------------------------------------------------------- /gsem/utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | import subprocess 3 | import urllib.parse 4 | import urllib.request 5 | from io import BytesIO 6 | from typing import Mapping, Tuple 7 | from zipfile import ZipFile 8 | 9 | 10 | def gnome_shell_version() -> Tuple[int, ...]: 11 | """Get Gnome Shell version number. 12 | 13 | :returns: tuple(major, minor, patch) 14 | 15 | """ 16 | cmd = subprocess.Popen(["gnome-shell", "--version"], stdout=subprocess.PIPE) 17 | version_str = cmd.communicate()[0].split()[-1] 18 | return tuple(int(i) for i in version_str.split(b".")) 19 | 20 | 21 | GNOME_SHELL_VERSION = gnome_shell_version() 22 | 23 | 24 | def get_json_response(endpoint: str, query: Mapping[str, str]) -> dict: 25 | """Returns json response. 26 | 27 | :endpoint: url string 28 | :query: query dict 29 | :returns: response dict 30 | 31 | """ 32 | query_string = urllib.parse.urlencode(query) 33 | full_url = f"{endpoint}/?{query_string}" 34 | with urllib.request.urlopen(full_url) as f: 35 | data = f.read().decode("utf-8") 36 | return json.loads(data) 37 | 38 | 39 | def download_and_extract_zip(url: str, dest: str) -> None: 40 | """Download zipfile and extract to destination dir. 41 | 42 | :url: url to download zipfile 43 | :dest: destination directory 44 | 45 | """ 46 | with urllib.request.urlopen(url) as f: 47 | data = f.read() 48 | zipfile = ZipFile(BytesIO(data)) 49 | zipfile.extractall(path=dest) 50 | 51 | 52 | def reload_gnome_shell() -> None: 53 | """Reload gnome shell.""" 54 | cmd = subprocess.Popen( 55 | "dbus-send --type=method_call --dest=org.gnome.Shell /org/gnome/Shell " 56 | "org.gnome.Shell.Eval string:'global.reexec_self()'", 57 | stdout=subprocess.PIPE, 58 | stderr=subprocess.PIPE, 59 | shell=True, 60 | ) 61 | cmd.communicate() 62 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "black" 5 | version = "23.3.0" 6 | description = "The uncompromising code formatter." 7 | category = "dev" 8 | optional = false 9 | python-versions = ">=3.7" 10 | files = [ 11 | {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, 12 | {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, 13 | {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, 14 | {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, 15 | {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, 16 | {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, 17 | {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, 18 | {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, 19 | {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, 20 | {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, 21 | {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, 22 | {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, 23 | {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, 24 | {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, 25 | {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, 26 | {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, 27 | {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, 28 | {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, 29 | {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, 30 | {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, 31 | {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, 32 | {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, 33 | {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, 34 | {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, 35 | {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, 36 | ] 37 | 38 | [package.dependencies] 39 | click = ">=8.0.0" 40 | mypy-extensions = ">=0.4.3" 41 | packaging = ">=22.0" 42 | pathspec = ">=0.9.0" 43 | platformdirs = ">=2" 44 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 45 | typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} 46 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} 47 | 48 | [package.extras] 49 | colorama = ["colorama (>=0.4.3)"] 50 | d = ["aiohttp (>=3.7.4)"] 51 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 52 | uvloop = ["uvloop (>=0.15.2)"] 53 | 54 | [[package]] 55 | name = "cfgv" 56 | version = "3.2.0" 57 | description = "Validate configuration and produce human readable error messages." 58 | category = "dev" 59 | optional = false 60 | python-versions = ">=3.6.1" 61 | files = [ 62 | {file = "cfgv-3.2.0-py2.py3-none-any.whl", hash = "sha256:32e43d604bbe7896fe7c248a9c2276447dbef840feb28fe20494f62af110211d"}, 63 | {file = "cfgv-3.2.0.tar.gz", hash = "sha256:cf22deb93d4bcf92f345a5c3cd39d3d41d6340adc60c78bbbd6588c384fda6a1"}, 64 | ] 65 | 66 | [[package]] 67 | name = "click" 68 | version = "8.1.3" 69 | description = "Composable command line interface toolkit" 70 | category = "dev" 71 | optional = false 72 | python-versions = ">=3.7" 73 | files = [ 74 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 75 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 76 | ] 77 | 78 | [package.dependencies] 79 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 80 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 81 | 82 | [[package]] 83 | name = "colorama" 84 | version = "0.4.5" 85 | description = "Cross-platform colored terminal text." 86 | category = "dev" 87 | optional = false 88 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 89 | files = [ 90 | {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, 91 | {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, 92 | ] 93 | 94 | [[package]] 95 | name = "distlib" 96 | version = "0.3.1" 97 | description = "Distribution utilities" 98 | category = "dev" 99 | optional = false 100 | python-versions = "*" 101 | files = [ 102 | {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"}, 103 | {file = "distlib-0.3.1.zip", hash = "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"}, 104 | ] 105 | 106 | [[package]] 107 | name = "filelock" 108 | version = "3.8.2" 109 | description = "A platform independent file lock." 110 | category = "dev" 111 | optional = false 112 | python-versions = ">=3.7" 113 | files = [ 114 | {file = "filelock-3.8.2-py3-none-any.whl", hash = "sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c"}, 115 | {file = "filelock-3.8.2.tar.gz", hash = "sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2"}, 116 | ] 117 | 118 | [package.extras] 119 | docs = ["furo (>=2022.9.29)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] 120 | testing = ["covdefaults (>=2.2.2)", "coverage (>=6.5)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] 121 | 122 | [[package]] 123 | name = "flake8" 124 | version = "5.0.4" 125 | description = "the modular source code checker: pep8 pyflakes and co" 126 | category = "dev" 127 | optional = false 128 | python-versions = ">=3.6.1" 129 | files = [ 130 | {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, 131 | {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, 132 | ] 133 | 134 | [package.dependencies] 135 | importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} 136 | mccabe = ">=0.7.0,<0.8.0" 137 | pycodestyle = ">=2.9.0,<2.10.0" 138 | pyflakes = ">=2.5.0,<2.6.0" 139 | 140 | [[package]] 141 | name = "identify" 142 | version = "2.1.3" 143 | description = "File identification library for Python" 144 | category = "dev" 145 | optional = false 146 | python-versions = ">=3.6.1" 147 | files = [ 148 | {file = "identify-2.1.3-py2.py3-none-any.whl", hash = "sha256:46d1816c6a4fc2d1e8758f293a5dcc1ae6404ab344179d7c1e73637bf283beb1"}, 149 | {file = "identify-2.1.3.tar.gz", hash = "sha256:ed4a05fb80e3cbd12e83c959f9ff7f729ba6b66ab8d6178850fd5cb4c1cf6c5d"}, 150 | ] 151 | 152 | [package.extras] 153 | license = ["editdistance"] 154 | 155 | [[package]] 156 | name = "importlib-metadata" 157 | version = "3.7.3" 158 | description = "Read metadata from Python packages" 159 | category = "dev" 160 | optional = false 161 | python-versions = ">=3.6" 162 | files = [ 163 | {file = "importlib_metadata-3.7.3-py3-none-any.whl", hash = "sha256:b74159469b464a99cb8cc3e21973e4d96e05d3024d337313fedb618a6e86e6f4"}, 164 | {file = "importlib_metadata-3.7.3.tar.gz", hash = "sha256:742add720a20d0467df2f444ae41704000f50e1234f46174b51f9c6031a1bd71"}, 165 | ] 166 | 167 | [package.dependencies] 168 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 169 | zipp = ">=0.5" 170 | 171 | [package.extras] 172 | docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] 173 | testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] 174 | 175 | [[package]] 176 | name = "isort" 177 | version = "5.11.5" 178 | description = "A Python utility / library to sort Python imports." 179 | category = "dev" 180 | optional = false 181 | python-versions = ">=3.7.0" 182 | files = [ 183 | {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, 184 | {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, 185 | ] 186 | 187 | [package.extras] 188 | colors = ["colorama (>=0.4.3,<0.5.0)"] 189 | pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] 190 | plugins = ["setuptools"] 191 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 192 | 193 | [[package]] 194 | name = "mccabe" 195 | version = "0.7.0" 196 | description = "McCabe checker, plugin for flake8" 197 | category = "dev" 198 | optional = false 199 | python-versions = ">=3.6" 200 | files = [ 201 | {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, 202 | {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, 203 | ] 204 | 205 | [[package]] 206 | name = "mypy" 207 | version = "1.2.0" 208 | description = "Optional static typing for Python" 209 | category = "dev" 210 | optional = false 211 | python-versions = ">=3.7" 212 | files = [ 213 | {file = "mypy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:701189408b460a2ff42b984e6bd45c3f41f0ac9f5f58b8873bbedc511900086d"}, 214 | {file = "mypy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe91be1c51c90e2afe6827601ca14353bbf3953f343c2129fa1e247d55fd95ba"}, 215 | {file = "mypy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d26b513225ffd3eacece727f4387bdce6469192ef029ca9dd469940158bc89e"}, 216 | {file = "mypy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a2d219775a120581a0ae8ca392b31f238d452729adbcb6892fa89688cb8306a"}, 217 | {file = "mypy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:2e93a8a553e0394b26c4ca683923b85a69f7ccdc0139e6acd1354cc884fe0128"}, 218 | {file = "mypy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3efde4af6f2d3ccf58ae825495dbb8d74abd6d176ee686ce2ab19bd025273f41"}, 219 | {file = "mypy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:695c45cea7e8abb6f088a34a6034b1d273122e5530aeebb9c09626cea6dca4cb"}, 220 | {file = "mypy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0e9464a0af6715852267bf29c9553e4555b61f5904a4fc538547a4d67617937"}, 221 | {file = "mypy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8293a216e902ac12779eb7a08f2bc39ec6c878d7c6025aa59464e0c4c16f7eb9"}, 222 | {file = "mypy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:f46af8d162f3d470d8ffc997aaf7a269996d205f9d746124a179d3abe05ac602"}, 223 | {file = "mypy-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:031fc69c9a7e12bcc5660b74122ed84b3f1c505e762cc4296884096c6d8ee140"}, 224 | {file = "mypy-1.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390bc685ec209ada4e9d35068ac6988c60160b2b703072d2850457b62499e336"}, 225 | {file = "mypy-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4b41412df69ec06ab141808d12e0bf2823717b1c363bd77b4c0820feaa37249e"}, 226 | {file = "mypy-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e4a682b3f2489d218751981639cffc4e281d548f9d517addfd5a2917ac78119"}, 227 | {file = "mypy-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a197ad3a774f8e74f21e428f0de7f60ad26a8d23437b69638aac2764d1e06a6a"}, 228 | {file = "mypy-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9a084bce1061e55cdc0493a2ad890375af359c766b8ac311ac8120d3a472950"}, 229 | {file = "mypy-1.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaeaa0888b7f3ccb7bcd40b50497ca30923dba14f385bde4af78fac713d6d6f6"}, 230 | {file = "mypy-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bea55fc25b96c53affab852ad94bf111a3083bc1d8b0c76a61dd101d8a388cf5"}, 231 | {file = "mypy-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:4c8d8c6b80aa4a1689f2a179d31d86ae1367ea4a12855cc13aa3ba24bb36b2d8"}, 232 | {file = "mypy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70894c5345bea98321a2fe84df35f43ee7bb0feec117a71420c60459fc3e1eed"}, 233 | {file = "mypy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a99fe1768925e4a139aace8f3fb66db3576ee1c30b9c0f70f744ead7e329c9f"}, 234 | {file = "mypy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023fe9e618182ca6317ae89833ba422c411469156b690fde6a315ad10695a521"}, 235 | {file = "mypy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d19f1a239d59f10fdc31263d48b7937c585810288376671eaf75380b074f238"}, 236 | {file = "mypy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:2de7babe398cb7a85ac7f1fd5c42f396c215ab3eff731b4d761d68d0f6a80f48"}, 237 | {file = "mypy-1.2.0-py3-none-any.whl", hash = "sha256:d8e9187bfcd5ffedbe87403195e1fc340189a68463903c39e2b63307c9fa0394"}, 238 | {file = "mypy-1.2.0.tar.gz", hash = "sha256:f70a40410d774ae23fcb4afbbeca652905a04de7948eaf0b1789c8d1426b72d1"}, 239 | ] 240 | 241 | [package.dependencies] 242 | mypy-extensions = ">=1.0.0" 243 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} 244 | typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} 245 | typing-extensions = ">=3.10" 246 | 247 | [package.extras] 248 | dmypy = ["psutil (>=4.0)"] 249 | install-types = ["pip"] 250 | python2 = ["typed-ast (>=1.4.0,<2)"] 251 | reports = ["lxml"] 252 | 253 | [[package]] 254 | name = "mypy-extensions" 255 | version = "1.0.0" 256 | description = "Type system extensions for programs checked with the mypy type checker." 257 | category = "dev" 258 | optional = false 259 | python-versions = ">=3.5" 260 | files = [ 261 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 262 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 263 | ] 264 | 265 | [[package]] 266 | name = "nodeenv" 267 | version = "1.5.0" 268 | description = "Node.js virtual environment builder" 269 | category = "dev" 270 | optional = false 271 | python-versions = "*" 272 | files = [ 273 | {file = "nodeenv-1.5.0-py2.py3-none-any.whl", hash = "sha256:5304d424c529c997bc888453aeaa6362d242b6b4631e90f3d4bf1b290f1c84a9"}, 274 | {file = "nodeenv-1.5.0.tar.gz", hash = "sha256:ab45090ae383b716c4ef89e690c41ff8c2b257b85b309f01f3654df3d084bd7c"}, 275 | ] 276 | 277 | [[package]] 278 | name = "packaging" 279 | version = "23.0" 280 | description = "Core utilities for Python packages" 281 | category = "dev" 282 | optional = false 283 | python-versions = ">=3.7" 284 | files = [ 285 | {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, 286 | {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, 287 | ] 288 | 289 | [[package]] 290 | name = "pathspec" 291 | version = "0.10.1" 292 | description = "Utility library for gitignore style pattern matching of file paths." 293 | category = "dev" 294 | optional = false 295 | python-versions = ">=3.7" 296 | files = [ 297 | {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, 298 | {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, 299 | ] 300 | 301 | [[package]] 302 | name = "platformdirs" 303 | version = "2.5.2" 304 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 305 | category = "dev" 306 | optional = false 307 | python-versions = ">=3.7" 308 | files = [ 309 | {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, 310 | {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, 311 | ] 312 | 313 | [package.extras] 314 | docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] 315 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 316 | 317 | [[package]] 318 | name = "pre-commit" 319 | version = "2.21.0" 320 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 321 | category = "dev" 322 | optional = false 323 | python-versions = ">=3.7" 324 | files = [ 325 | {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, 326 | {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, 327 | ] 328 | 329 | [package.dependencies] 330 | cfgv = ">=2.0.0" 331 | identify = ">=1.0.0" 332 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 333 | nodeenv = ">=0.11.1" 334 | pyyaml = ">=5.1" 335 | virtualenv = ">=20.10.0" 336 | 337 | [[package]] 338 | name = "pycairo" 339 | version = "1.20.0" 340 | description = "Python interface for cairo" 341 | category = "main" 342 | optional = false 343 | python-versions = ">=3.6, <4" 344 | files = [ 345 | {file = "pycairo-1.20.0-cp36-cp36m-win32.whl", hash = "sha256:e5a3433690c473e073a9917dc8f1fc7dc8b9af7b201bf372894b8ad70d960c6d"}, 346 | {file = "pycairo-1.20.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a942614923b88ae75c794506d5c426fba9c46a055d3fdd3b8db7046b75c079cc"}, 347 | {file = "pycairo-1.20.0-cp37-cp37m-win32.whl", hash = "sha256:8cfa9578b745fb9cf2915ec580c2c50ebc2da00eac2cf4c4b54b63aa19da4b77"}, 348 | {file = "pycairo-1.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:273a33c56aba724ec42fe1d8f94c86c2e2660c1277470be9b04e5113d7c5b72d"}, 349 | {file = "pycairo-1.20.0-cp38-cp38-win32.whl", hash = "sha256:2088100a099c09c5e90bf247409ce6c98f51766b53bd13f96d6aac7addaa3e66"}, 350 | {file = "pycairo-1.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:ceb1edcbeb48dabd5fbbdff2e4b429aa88ddc493d6ebafe78d94b050ac0749e2"}, 351 | {file = "pycairo-1.20.0-cp39-cp39-win32.whl", hash = "sha256:57a768f4edc8a9890d98070dd473a812ac3d046cef4bc1c817d68024dab9a9b4"}, 352 | {file = "pycairo-1.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:57166119e424d71eccdba6b318bd731bdabd17188e2ba10d4f315f7bf16ace3f"}, 353 | {file = "pycairo-1.20.0.tar.gz", hash = "sha256:5695a10cb7f9ae0d01f665b56602a845b0a8cb17e2123bfece10c2e58552468c"}, 354 | ] 355 | 356 | [[package]] 357 | name = "pycodestyle" 358 | version = "2.9.1" 359 | description = "Python style guide checker" 360 | category = "dev" 361 | optional = false 362 | python-versions = ">=3.6" 363 | files = [ 364 | {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, 365 | {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, 366 | ] 367 | 368 | [[package]] 369 | name = "pyflakes" 370 | version = "2.5.0" 371 | description = "passive checker of Python programs" 372 | category = "dev" 373 | optional = false 374 | python-versions = ">=3.6" 375 | files = [ 376 | {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, 377 | {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, 378 | ] 379 | 380 | [[package]] 381 | name = "pygobject" 382 | version = "3.44.1" 383 | description = "Python bindings for GObject Introspection" 384 | category = "main" 385 | optional = false 386 | python-versions = ">=3.7, <4" 387 | files = [ 388 | {file = "PyGObject-3.44.1.tar.gz", hash = "sha256:665fbe980c91e8b31ad78ed3f66879946948200864002d193f67eccc1d7d5d83"}, 389 | ] 390 | 391 | [package.dependencies] 392 | pycairo = ">=1.16,<2.0" 393 | 394 | [[package]] 395 | name = "pyyaml" 396 | version = "5.4.1" 397 | description = "YAML parser and emitter for Python" 398 | category = "dev" 399 | optional = false 400 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 401 | files = [ 402 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, 403 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, 404 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, 405 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, 406 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, 407 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, 408 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, 409 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, 410 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, 411 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, 412 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, 413 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, 414 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, 415 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, 416 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, 417 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, 418 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, 419 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, 420 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, 421 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, 422 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, 423 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, 424 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, 425 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, 426 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, 427 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, 428 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, 429 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, 430 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, 431 | ] 432 | 433 | [[package]] 434 | name = "tomli" 435 | version = "2.0.1" 436 | description = "A lil' TOML parser" 437 | category = "dev" 438 | optional = false 439 | python-versions = ">=3.7" 440 | files = [ 441 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 442 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 443 | ] 444 | 445 | [[package]] 446 | name = "typed-ast" 447 | version = "1.4.2" 448 | description = "a fork of Python 2 and 3 ast modules with type comment support" 449 | category = "dev" 450 | optional = false 451 | python-versions = "*" 452 | files = [ 453 | {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, 454 | {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, 455 | {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, 456 | {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, 457 | {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, 458 | {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, 459 | {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, 460 | {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, 461 | {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, 462 | {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, 463 | {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, 464 | {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, 465 | {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, 466 | {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, 467 | {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, 468 | {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, 469 | {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, 470 | {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, 471 | {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, 472 | {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, 473 | {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, 474 | {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, 475 | {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, 476 | {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, 477 | {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, 478 | {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, 479 | {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, 480 | {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, 481 | {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, 482 | {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, 483 | ] 484 | 485 | [[package]] 486 | name = "typing-extensions" 487 | version = "4.3.0" 488 | description = "Backported and Experimental Type Hints for Python 3.7+" 489 | category = "dev" 490 | optional = false 491 | python-versions = ">=3.7" 492 | files = [ 493 | {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, 494 | {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, 495 | ] 496 | 497 | [[package]] 498 | name = "virtualenv" 499 | version = "20.16.2" 500 | description = "Virtual Python Environment builder" 501 | category = "dev" 502 | optional = false 503 | python-versions = ">=3.6" 504 | files = [ 505 | {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, 506 | {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, 507 | ] 508 | 509 | [package.dependencies] 510 | distlib = ">=0.3.1,<1" 511 | filelock = ">=3.2,<4" 512 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 513 | platformdirs = ">=2,<3" 514 | 515 | [package.extras] 516 | docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] 517 | testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "packaging (>=20.0)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)"] 518 | 519 | [[package]] 520 | name = "zipp" 521 | version = "3.4.1" 522 | description = "Backport of pathlib-compatible object wrapper for zip files" 523 | category = "dev" 524 | optional = false 525 | python-versions = ">=3.6" 526 | files = [ 527 | {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, 528 | {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, 529 | ] 530 | 531 | [package.extras] 532 | docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] 533 | testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] 534 | 535 | [metadata] 536 | lock-version = "2.0" 537 | python-versions = "^3.7" 538 | content-hash = "6178dd3d4c4f53b8f6c710bfbb8411f268fe04a4606dda387bd565f06a4d1bc3" 539 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "gsem" 3 | version = "0.2.3" 4 | description = "Command line extension manager for Gnome-Shell" 5 | authors = ["Andrii Kohut "] 6 | license = "MIT" 7 | readme = "README.md" 8 | homepage = "https://github.com/andriykohut/gsem" 9 | repository = "https://github.com/andriykohut/gsem" 10 | 11 | keywords = ["gnome-shell", "gnome", "cli", "command-line-tool", "gnome-shell-extension"] 12 | classifiers = ["Topic :: Desktop Environment :: Gnome"] 13 | 14 | [tool.poetry.dependencies] 15 | python = ">=3.0" 16 | PyGObject = ">=3.0" 17 | 18 | [tool.poetry.dev-dependencies] 19 | black = "^23.3" 20 | flake8 = "^5.0.4" 21 | mypy = "^1.2" 22 | pre-commit = "^2.21.0" 23 | isort = "^5.11.5" 24 | 25 | [tool.poetry.scripts] 26 | gsem = "gsem.cli:main" 27 | 28 | [build-system] 29 | requires = ["poetry-core>=1.0.0"] 30 | build-backend = "poetry.core.masonry.api" 31 | 32 | [tool.isort] 33 | multi_line_output = 3 34 | include_trailing_comma = true 35 | force_grid_wrap = 0 36 | use_parentheses = true 37 | ensure_newline_before_comments = true 38 | line_length = 88 39 | --------------------------------------------------------------------------------