From b4c72c3dd0ea98dc959c7a8e99942a4cde35fa4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veit=20R=C3=BCckert?= Date: Fri, 17 Jun 2022 16:18:10 +0200 Subject: [PATCH 1/5] add python-hosts dependency --- poetry.lock | 57 ++++++++++++++++++++++++-------------------------- pyproject.toml | 1 + 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9c775d1..534682f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -89,7 +89,7 @@ optional = false python-versions = ">=3.6" [package.dependencies] -pywin32 = {version = "304", markers = "sys_platform == \"win32\""} +pywin32 = {version = "227", markers = "sys_platform == \"win32\""} requests = ">=2.14.2,<2.18.0 || >2.18.0" websocket-client = ">=0.32.0" @@ -308,17 +308,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -[[package]] -name = "pypiwin32" -version = "223" -description = "" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pywin32 = ">=223" - [[package]] name = "python-dateutil" version = "2.8.2" @@ -330,9 +319,17 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" [package.dependencies] six = ">=1.5" +[[package]] +name = "python-hosts" +version = "1.0.3" +description = "A hosts file manager library written in python" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "pywin32" -version = "304" +version = "227" description = "Python for Window Extensions" category = "main" optional = false @@ -471,7 +468,7 @@ test = ["websockets"] [metadata] lock-version = "1.1" python-versions = "^3.8.0" -content-hash = "2535c4313b017ffb78b253c0fdb7100ddc8248c840f7fb896733251392681400" +content-hash = "7b002269a9d2cc730fec302a2c2c447ee8ed6f70b278b38e543be57ea8c7f0a3" [metadata.files] attrs = [ @@ -654,27 +651,27 @@ pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pypiwin32 = [ - {file = "pypiwin32-223-py3-none-any.whl", hash = "sha256:67adf399debc1d5d14dffc1ab5acacb800da569754fafdc576b2a039485aa775"}, - {file = "pypiwin32-223.tar.gz", hash = "sha256:71be40c1fbd28594214ecaecb58e7aa8b708eabfa0125c8a109ebd51edbd776a"}, -] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] +python-hosts = [ + {file = "python-hosts-1.0.3.tar.gz", hash = "sha256:e120178f1e6944386fe1855482b52db7251ae62ce962aa432a288625cdb2f15d"}, + {file = "python_hosts-1.0.3-py2-none-any.whl", hash = "sha256:5d0b7e0420ad9e8956ea384c1ed69008500ed566b14afd2bbf58c158d1c853e5"}, +] pywin32 = [ - {file = "pywin32-304-cp27-cp27m-win32.whl"}, - {file = "pywin32-304-cp27-cp27m-win_amd64.whl"}, - {file = "pywin32-304-cp35-cp35m-win32.whl"}, - {file = "pywin32-304-cp35-cp35m-win_amd64.whl"}, - {file = "pywin32-304-cp36-cp36m-win32.whl"}, - {file = "pywin32-304-cp36-cp36m-win_amd64.whl"}, - {file = "pywin32-304-cp37-cp37m-win32.whl"}, - {file = "pywin32-304-cp37-cp37m-win_amd64.whl"}, - {file = "pywin32-304-cp38-cp38-win32.whl"}, - {file = "pywin32-304-cp38-cp38-win_amd64.whl"}, - {file = "pywin32-304-cp39-cp39-win32.whl"}, - {file = "pywin32-304-cp39-cp39-win_amd64.whl"}, + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, diff --git a/pyproject.toml b/pyproject.toml index ba735cd..4ffd24b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ pydantic = "^1.9.0" semantic-version = "^2.9.0" GitPython = "^3.1.27" PyYAML = "^6.0" +python-hosts = "^1.0.3" [tool.poetry.dev-dependencies] From 3f18b820917513adc5e4f0f3a565f85b2ed59292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veit=20R=C3=BCckert?= Date: Fri, 17 Jun 2022 16:29:41 +0200 Subject: [PATCH 2/5] add host listing helper --- getdeck/k8s.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/getdeck/k8s.py b/getdeck/k8s.py index 7311ac0..67bbe9d 100644 --- a/getdeck/k8s.py +++ b/getdeck/k8s.py @@ -208,3 +208,12 @@ def get_ingress_display( for path in rule.http.paths: result.append((_host, path.path)) return result + + +def get_ingress_hosts(config: ClientConfiguration, namespace: str): + ingresss = config.K8S_NETWORKING_API.list_namespaced_ingress(namespace) + result = set() + for ingress in ingresss.items: + for rule in ingress.spec.rules: + result.add(rule.host) + return result From 89f194847d4498661287f1c62c5ebe391933f0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veit=20R=C3=BCckert?= Date: Fri, 1 Jul 2022 17:09:10 +0200 Subject: [PATCH 3/5] wip: Add hosts functionality --- getdeck/__main__.py | 13 +++++++++++++ getdeck/api/get.py | 7 +++++++ getdeck/api/hosts.py | 46 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 getdeck/api/hosts.py diff --git a/getdeck/__main__.py b/getdeck/__main__.py index e2d4d71..1a3525c 100644 --- a/getdeck/__main__.py +++ b/getdeck/__main__.py @@ -99,9 +99,17 @@ def check_positive(value): version_parser = action.add_parser("version") +hosts_parser = action.add_parser("hosts") +hosts_parser.add_argument("host_action", help="list/write/remove") +hosts_parser.add_argument( + "Deckfile", help="the deck.yaml location (as file, git or https)" +) + + def main(): from getdeck import configuration from getdeck.api import get_available_decks, run_deck, remove_cluster, remove_deck + from getdeck.api.hosts import run_hosts try: args = parser.parse_args() @@ -134,6 +142,11 @@ def main(): stop_cluster(args.Deckfile, ignore_cluster=args.no_cluster) elif args.action == "version": logger.info(f"Deck version: {configuration.__VERSION__}") + elif args.action == "hosts": + run_hosts( + args.Deckfile, + args.host_action, + ) else: parser.print_help() exit(0) diff --git a/getdeck/api/get.py b/getdeck/api/get.py index b08a8a8..a5596a1 100644 --- a/getdeck/api/get.py +++ b/getdeck/api/get.py @@ -103,6 +103,13 @@ def run_deck( if ingress: for path in ingress: logger.info(f"Ingress: {path[0]} -> {path[1]}") + logger.info( + f"If these ingress hosts do not resolve to localhost, you can configure them manually " + f"by executing\n" + f"'deck hosts write {deckfile_location}'.\n" + f"This command may require administrative rights, e.g. under linux" + f"'sudo -E deck hosts write {deckfile_location}'" + ) logger.info(f"Published ports are: {k8s_provider.get_ports()}") if notes := deckfile.get_deck(deck_name).notes: logger.info(notes) diff --git a/getdeck/api/hosts.py b/getdeck/api/hosts.py new file mode 100644 index 0000000..0cf9209 --- /dev/null +++ b/getdeck/api/hosts.py @@ -0,0 +1,46 @@ +import logging + +from python_hosts import Hosts, HostsEntry + +from getdeck.api import stopwatch +from getdeck.configuration import default_configuration +from getdeck.k8s import get_ingress_hosts +from getdeck.utils import read_deckfile_from_location + +logger = logging.getLogger("deck") + + +@stopwatch +def run_hosts( + deckfile_location: str, + host_action: str, + config=default_configuration, +) -> bool: + deckfile = read_deckfile_from_location(deckfile_location, config) + namespace = deckfile.get_deck().namespace or "default" + deck_hosts = get_ingress_hosts(config, namespace) + hosts = Hosts() + + if host_action == "list": + + logger.info("Ingress hosts:") + for host in deck_hosts: + logger.info(f"{host}") + + elif host_action == "remove": + logger.debug("Removing hosts from hosts file...") + for host in deck_hosts: + hosts.remove_all_matching(name=host) + hosts.write() + logger.info("Hosts have been removed from hosts file...") + + elif host_action == "write": + + logger.info("Writing hosts to hosts file...") + new_entry = HostsEntry(entry_type="ipv4", address="127.0.0.1", names=deck_hosts) + hosts.add([new_entry]) + hosts.write() + logger.info("Hosts should resolve to '127.0.0.1' now.") + + else: + logger.error(f"Unknown host action '{host_action}'") From b3316d030588c2e5385eb22395d24b33ea0a6576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veit=20R=C3=BCckert?= Date: Tue, 5 Jul 2022 09:59:14 +0200 Subject: [PATCH 4/5] wip: Add hosts functionality add automatic subprocess call add check for host resolution --- getdeck/api/get.py | 44 ++++++++++++++++++++++++++++------------ getdeck/api/hosts.py | 15 ++++++++++++++ getdeck/deckfile/file.py | 2 +- getdeck/k8s.py | 13 ++++++++++++ 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/getdeck/api/get.py b/getdeck/api/get.py index a5596a1..14827ed 100644 --- a/getdeck/api/get.py +++ b/getdeck/api/get.py @@ -1,7 +1,10 @@ import logging +import subprocess +import sys from typing import Callable from getdeck.api import stopwatch, remove +from getdeck.api.hosts import verify_all_hosts from getdeck.configuration import default_configuration logger = logging.getLogger("deck") @@ -21,8 +24,7 @@ def run_deck( from getdeck.utils import read_deckfile_from_location, ensure_cluster from kubernetes.client import V1Namespace, V1ObjectMeta from kubernetes.client.rest import ApiException - from getdeck.k8s import k8s_create_or_patch - from getdeck.k8s import get_ingress_display + from getdeck.k8s import k8s_create_or_patch, get_ingress_rules cluster_created = False if progress_callback: @@ -99,17 +101,13 @@ def run_deck( progress_callback(100) logger.info(f"All workloads from Deck {generated_deck.name} applied") - ingress = get_ingress_display(config, generated_deck.namespace) - if ingress: - for path in ingress: - logger.info(f"Ingress: {path[0]} -> {path[1]}") - logger.info( - f"If these ingress hosts do not resolve to localhost, you can configure them manually " - f"by executing\n" - f"'deck hosts write {deckfile_location}'.\n" - f"This command may require administrative rights, e.g. under linux" - f"'sudo -E deck hosts write {deckfile_location}'" - ) + ingress_rules = get_ingress_rules(config, generated_deck.namespace) + hosts = set() + if ingress_rules: + for host, path in ingress_rules: + logger.info(f"Ingress: {host} -> {path}") + hosts.add(host) + handle_hosts_resolution(deckfile_location, hosts) logger.info(f"Published ports are: {k8s_provider.get_ports()}") if notes := deckfile.get_deck(deck_name).notes: logger.info(notes) @@ -119,6 +117,26 @@ def run_deck( return True +def handle_hosts_resolution(deckfile_location, hosts): + if not verify_all_hosts(*hosts): + logger.warning("Some of your ingress hosts do not resolve to localhost.") + if sys.platform in ("linux", "linux2", "darwin"): + confirm = input( + "Do you want to write them to your local hosts file? [y/N] " + ) + if confirm.lower() in ("y", "yes"): + subprocess.call( + ["sudo", "-E", "deck", "hosts", "write", deckfile_location] + ) + else: + logger.info( + f"If these ingress hosts do not resolve to localhost, you can configure them manually " + f"by executing\n" + f"'deck hosts write {deckfile_location}'.\n" + f"with admin rights." + ) + + def _wait_ready(config, generated_deck, timeout): from getdeck.utils import wait_for_pods_ready diff --git a/getdeck/api/hosts.py b/getdeck/api/hosts.py index 0cf9209..aabe4ee 100644 --- a/getdeck/api/hosts.py +++ b/getdeck/api/hosts.py @@ -1,4 +1,5 @@ import logging +import socket from python_hosts import Hosts, HostsEntry @@ -44,3 +45,17 @@ def run_hosts( else: logger.error(f"Unknown host action '{host_action}'") + + return True + + +def verify_host(host) -> bool: + try: + ip = socket.gethostbyname(host) + except socket.gaierror: + return False + return ip == "127.0.0.1" + + +def verify_all_hosts(*hosts): + return all(verify_host(host) for host in hosts) diff --git a/getdeck/deckfile/file.py b/getdeck/deckfile/file.py index 9089a6b..2bed496 100644 --- a/getdeck/deckfile/file.py +++ b/getdeck/deckfile/file.py @@ -113,5 +113,5 @@ def get_decks(self) -> List[DeckfileDeck]: raise NotImplementedError @abstractmethod - def get_deck(self) -> DeckfileDeck: + def get_deck(self, name: str = None) -> DeckfileDeck: raise NotImplementedError diff --git a/getdeck/k8s.py b/getdeck/k8s.py index 67bbe9d..0c278b2 100644 --- a/getdeck/k8s.py +++ b/getdeck/k8s.py @@ -197,6 +197,19 @@ def convert_camel_2_snake(_string) -> str: return _string +def get_ingress_rules( + config: ClientConfiguration, namespace: str +) -> List[Tuple[str, str]]: + result = [] + ingresss = config.K8S_NETWORKING_API.list_namespaced_ingress(namespace) + for ingress in ingresss.items: + for rule in ingress.spec.rules: + _host = rule.host + for path in rule.http.paths: + result.append((_host, path.path)) + return result + + def get_ingress_display( config: ClientConfiguration, namespace: str ) -> List[Tuple[str, str]]: From 819c567341e271641e8eb07cd514ef70044ebdf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veit=20R=C3=BCckert?= Date: Fri, 29 Jul 2022 19:42:20 +0200 Subject: [PATCH 5/5] wip: Add hosts functionality Use extra "hosts" key under deck to identify hosts --- getdeck/__main__.py | 6 +- getdeck/api/get.py | 38 +++---- getdeck/api/hosts.py | 8 +- getdeck/deckfile/file.py | 1 + getdeck/k8s.py | 9 -- poetry.lock | 234 +++++++++++++++------------------------ 6 files changed, 114 insertions(+), 182 deletions(-) mode change 100644 => 100755 getdeck/__main__.py diff --git a/getdeck/__main__.py b/getdeck/__main__.py old mode 100644 new mode 100755 index 1a3525c..6c3e9a2 --- a/getdeck/__main__.py +++ b/getdeck/__main__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.10 +#!/usr/bin/env python3 import argparse import logging import os @@ -104,6 +104,9 @@ def check_positive(value): hosts_parser.add_argument( "Deckfile", help="the deck.yaml location (as file, git or https)" ) +hosts_parser.add_argument( + "--name", help="the Deck whose hosts will be considered", required=False +) def main(): @@ -146,6 +149,7 @@ def main(): run_hosts( args.Deckfile, args.host_action, + deck_name=args.name, ) else: parser.print_help() diff --git a/getdeck/api/get.py b/getdeck/api/get.py index 14827ed..eb40a34 100644 --- a/getdeck/api/get.py +++ b/getdeck/api/get.py @@ -1,6 +1,4 @@ import logging -import subprocess -import sys from typing import Callable from getdeck.api import stopwatch, remove @@ -102,12 +100,10 @@ def run_deck( logger.info(f"All workloads from Deck {generated_deck.name} applied") ingress_rules = get_ingress_rules(config, generated_deck.namespace) - hosts = set() if ingress_rules: for host, path in ingress_rules: logger.info(f"Ingress: {host} -> {path}") - hosts.add(host) - handle_hosts_resolution(deckfile_location, hosts) + handle_hosts_resolution(deckfile_location, deckfile, deck_name) logger.info(f"Published ports are: {k8s_provider.get_ports()}") if notes := deckfile.get_deck(deck_name).notes: logger.info(notes) @@ -117,24 +113,20 @@ def run_deck( return True -def handle_hosts_resolution(deckfile_location, hosts): - if not verify_all_hosts(*hosts): - logger.warning("Some of your ingress hosts do not resolve to localhost.") - if sys.platform in ("linux", "linux2", "darwin"): - confirm = input( - "Do you want to write them to your local hosts file? [y/N] " - ) - if confirm.lower() in ("y", "yes"): - subprocess.call( - ["sudo", "-E", "deck", "hosts", "write", deckfile_location] - ) - else: - logger.info( - f"If these ingress hosts do not resolve to localhost, you can configure them manually " - f"by executing\n" - f"'deck hosts write {deckfile_location}'.\n" - f"with admin rights." - ) +def handle_hosts_resolution(deckfile_location, deckfile, deck_name): + deck = deckfile.get_deck(deck_name) + deck_hosts = deck.hosts + deck_flag = " " + if deck_name: + deck_flag = f" --name {deck_name} " + if not verify_all_hosts(*deck_hosts): + logger.warning("Some of your deck hosts do not resolve to localhost.") + logger.info( + f"If these ingress hosts do not resolve to localhost, you can configure them manually " + f"by executing\n" + f"'deck hosts write{deck_flag}{deckfile_location}'.\n" + f"with admin rights." + ) def _wait_ready(config, generated_deck, timeout): diff --git a/getdeck/api/hosts.py b/getdeck/api/hosts.py index aabe4ee..1c87c5e 100644 --- a/getdeck/api/hosts.py +++ b/getdeck/api/hosts.py @@ -5,7 +5,6 @@ from getdeck.api import stopwatch from getdeck.configuration import default_configuration -from getdeck.k8s import get_ingress_hosts from getdeck.utils import read_deckfile_from_location logger = logging.getLogger("deck") @@ -15,13 +14,14 @@ def run_hosts( deckfile_location: str, host_action: str, + deck_name: str = None, config=default_configuration, ) -> bool: deckfile = read_deckfile_from_location(deckfile_location, config) - namespace = deckfile.get_deck().namespace or "default" - deck_hosts = get_ingress_hosts(config, namespace) - hosts = Hosts() + deck = deckfile.get_deck(deck_name) + deck_hosts = deck.hosts + hosts = Hosts() if host_action == "list": logger.info("Ingress hosts:") diff --git a/getdeck/deckfile/file.py b/getdeck/deckfile/file.py index 52c0b6f..4d45d14 100644 --- a/getdeck/deckfile/file.py +++ b/getdeck/deckfile/file.py @@ -75,6 +75,7 @@ class DeckfileDeck(BaseModel): name: str namespace: str = "default" notes: str = "" + hosts: List[str] = [] sources: List[ Union[ DeckfileHelmSource, diff --git a/getdeck/k8s.py b/getdeck/k8s.py index 0c278b2..afbc09f 100644 --- a/getdeck/k8s.py +++ b/getdeck/k8s.py @@ -221,12 +221,3 @@ def get_ingress_display( for path in rule.http.paths: result.append((_host, path.path)) return result - - -def get_ingress_hosts(config: ClientConfiguration, namespace: str): - ingresss = config.K8S_NETWORKING_API.list_namespaced_ingress(namespace) - result = set() - for ingress in ingresss.items: - for rule in ingress.spec.rules: - result.add(rule.host) - return result diff --git a/poetry.lock b/poetry.lock index 3cad9a0..3b67e4a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,6 @@ [[package]] name = "atomicwrites" -version = "1.4.0" +version = "1.4.1" description = "Atomic file writes." category = "dev" optional = false @@ -8,21 +8,21 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "black" -version = "22.3.0" +version = "22.6.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -33,7 +33,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -44,7 +44,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cachetools" -version = "5.1.0" +version = "5.2.0" description = "Extensible memoizing collections and decorators" category = "main" optional = false @@ -52,7 +52,7 @@ python-versions = "~=3.7" [[package]] name = "certifi" -version = "2022.5.18.1" +version = "2022.6.15" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false @@ -60,11 +60,11 @@ python-versions = ">=3.6" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -82,7 +82,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "dev" optional = false @@ -90,7 +90,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "6.4.1" +version = "6.4.2" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -171,7 +171,7 @@ toml = "*" [[package]] name = "flake8-bugbear" -version = "22.4.25" +version = "22.7.1" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." category = "dev" optional = false @@ -208,7 +208,7 @@ gitdb = ">=4.0.1,<5" [[package]] name = "google-auth" -version = "2.6.6" +version = "2.9.1" description = "Google Authentication Library" category = "main" optional = false @@ -222,6 +222,7 @@ six = ">=1.9.0" [package.extras] aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] +enterprise_cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] @@ -436,6 +437,14 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" [package.dependencies] six = ">=1.5" +[[package]] +name = "python-hosts" +version = "1.0.3" +description = "A hosts file manager library written in python" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "pywin32" version = "227" @@ -454,21 +463,21 @@ python-versions = ">=3.6" [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" @@ -487,7 +496,7 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rsa" -version = "4.8" +version = "4.9" description = "Pure-Python RSA implementation" category = "main" optional = false @@ -498,7 +507,7 @@ pyasn1 = ">=0.1.3" [[package]] name = "semantic-version" -version = "2.9.0" +version = "2.10.0" description = "A library implementing the 'SemVer' scheme." category = "main" optional = false @@ -542,7 +551,7 @@ python-versions = ">=3.7" [[package]] name = "typing-extensions" -version = "4.2.0" +version = "4.3.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -550,11 +559,11 @@ python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.11" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] @@ -563,7 +572,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "websocket-client" -version = "1.3.2" +version = "1.3.3" description = "WebSocket client for Python with low level API options" category = "main" optional = false @@ -577,109 +586,58 @@ test = ["websockets"] [metadata] lock-version = "1.1" python-versions = "^3.8.0" -content-hash = "d7249ee573173ddf207141ed74249771a7abbb589ca42bd8f2bd956681f964d1" +content-hash = "541ae1d854520fcc41a8e39933cd30cecc55e8671210aa17f20dfc0834236409" [metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] +atomicwrites = [] +attrs = [] black = [ - {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, - {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, - {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, - {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, - {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, - {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, - {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, - {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, - {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, - {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, - {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, - {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, - {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, - {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, - {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, - {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, - {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, - {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, - {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, - {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, - {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, + {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, + {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, + {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, + {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, + {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, + {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, + {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, + {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, + {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, + {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, + {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, + {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, + {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, + {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, + {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, + {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, + {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, ] cachetools = [ - {file = "cachetools-5.1.0-py3-none-any.whl", hash = "sha256:4ebbd38701cdfd3603d1f751d851ed248ab4570929f2d8a7ce69e30c420b141c"}, - {file = "cachetools-5.1.0.tar.gz", hash = "sha256:8b3b8fa53f564762e5b221e9896798951e7f915513abf2ba072ce0f07f3f5a98"}, + {file = "cachetools-5.2.0-py3-none-any.whl", hash = "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db"}, + {file = "cachetools-5.2.0.tar.gz", hash = "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757"}, ] certifi = [ - {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"}, - {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"}, + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, ] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -coverage = [ - {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"}, - {file = "coverage-6.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ce1b258493cbf8aec43e9b50d89982346b98e9ffdfaae8ae5793bc112fb0068"}, - {file = "coverage-6.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c4e737f60c6936460c5be330d296dd5b48b3963f48634c53b3f7deb0f34ec4"}, - {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84e65ef149028516c6d64461b95a8dbcfce95cfd5b9eb634320596173332ea84"}, - {file = "coverage-6.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f69718750eaae75efe506406c490d6fc5a6161d047206cc63ce25527e8a3adad"}, - {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e57816f8ffe46b1df8f12e1b348f06d164fd5219beba7d9433ba79608ef011cc"}, - {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:01c5615d13f3dd3aa8543afc069e5319cfa0c7d712f6e04b920431e5c564a749"}, - {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ab269400706fab15981fd4bd5080c56bd5cc07c3bccb86aab5e1d5a88dc8f4"}, - {file = "coverage-6.4.1-cp310-cp310-win32.whl", hash = "sha256:a7f3049243783df2e6cc6deafc49ea123522b59f464831476d3d1448e30d72df"}, - {file = "coverage-6.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ee2ddcac99b2d2aec413e36d7a429ae9ebcadf912946b13ffa88e7d4c9b712d6"}, - {file = "coverage-6.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb73e0011b8793c053bfa85e53129ba5f0250fdc0392c1591fd35d915ec75c46"}, - {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106c16dfe494de3193ec55cac9640dd039b66e196e4641fa8ac396181578b982"}, - {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f4f3df85aa39da00fd3ec4b5abeb7407e82b68c7c5ad181308b0e2526da5d4"}, - {file = "coverage-6.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:961e2fb0680b4f5ad63234e0bf55dfb90d302740ae9c7ed0120677a94a1590cb"}, - {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cec3a0f75c8f1031825e19cd86ee787e87cf03e4fd2865c79c057092e69e3a3b"}, - {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:129cd05ba6f0d08a766d942a9ed4b29283aff7b2cccf5b7ce279d50796860bb3"}, - {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bf5601c33213d3cb19d17a796f8a14a9eaa5e87629a53979a5981e3e3ae166f6"}, - {file = "coverage-6.4.1-cp37-cp37m-win32.whl", hash = "sha256:269eaa2c20a13a5bf17558d4dc91a8d078c4fa1872f25303dddcbba3a813085e"}, - {file = "coverage-6.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f02cbbf8119db68455b9d763f2f8737bb7db7e43720afa07d8eb1604e5c5ae28"}, - {file = "coverage-6.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ffa9297c3a453fba4717d06df579af42ab9a28022444cae7fa605af4df612d54"}, - {file = "coverage-6.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:145f296d00441ca703a659e8f3eb48ae39fb083baba2d7ce4482fb2723e050d9"}, - {file = "coverage-6.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d44996140af8b84284e5e7d398e589574b376fb4de8ccd28d82ad8e3bea13"}, - {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bd9a6fc18aab8d2e18f89b7ff91c0f34ff4d5e0ba0b33e989b3cd4194c81fd9"}, - {file = "coverage-6.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3384f2a3652cef289e38100f2d037956194a837221edd520a7ee5b42d00cc605"}, - {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b3e07152b4563722be523e8cd0b209e0d1a373022cfbde395ebb6575bf6790d"}, - {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1480ff858b4113db2718848d7b2d1b75bc79895a9c22e76a221b9d8d62496428"}, - {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:865d69ae811a392f4d06bde506d531f6a28a00af36f5c8649684a9e5e4a85c83"}, - {file = "coverage-6.4.1-cp38-cp38-win32.whl", hash = "sha256:664a47ce62fe4bef9e2d2c430306e1428ecea207ffd68649e3b942fa8ea83b0b"}, - {file = "coverage-6.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:26dff09fb0d82693ba9e6231248641d60ba606150d02ed45110f9ec26404ed1c"}, - {file = "coverage-6.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9c80df769f5ec05ad21ea34be7458d1dc51ff1fb4b2219e77fe24edf462d6df"}, - {file = "coverage-6.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39ee53946bf009788108b4dd2894bf1349b4e0ca18c2016ffa7d26ce46b8f10d"}, - {file = "coverage-6.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b66caa62922531059bc5ac04f836860412f7f88d38a476eda0a6f11d4724f4"}, - {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd180ed867e289964404051a958f7cccabdeed423f91a899829264bb7974d3d3"}, - {file = "coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3"}, - {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8c08da0bd238f2970230c2a0d28ff0e99961598cb2e810245d7fc5afcf1254e8"}, - {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d42c549a8f41dc103a8004b9f0c433e2086add8a719da00e246e17cbe4056f72"}, - {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:309ce4a522ed5fca432af4ebe0f32b21d6d7ccbb0f5fcc99290e71feba67c264"}, - {file = "coverage-6.4.1-cp39-cp39-win32.whl", hash = "sha256:fdb6f7bd51c2d1714cea40718f6149ad9be6a2ee7d93b19e9f00934c0f2a74d9"}, - {file = "coverage-6.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:342d4aefd1c3e7f620a13f4fe563154d808b69cccef415415aece4c786665397"}, - {file = "coverage-6.4.1-pp36.pp37.pp38-none-any.whl", hash = "sha256:4803e7ccf93230accb928f3a68f00ffa80a88213af98ed338a57ad021ef06815"}, - {file = "coverage-6.4.1.tar.gz", hash = "sha256:4321f075095a096e70aff1d002030ee612b65a205a0a0f5b815280d5dc58100c"}, -] -coveralls = [ - {file = "coveralls-3.3.1-py2.py3-none-any.whl", hash = "sha256:f42015f31d386b351d4226389b387ae173207058832fbf5c8ec4b40e27b16026"}, - {file = "coveralls-3.3.1.tar.gz", hash = "sha256:b32a8bb5d2df585207c119d6c01567b81fba690c9c10a753bfe27a335bfc43ea"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] +coverage = [] +coveralls = [] docker = [ {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, @@ -695,10 +653,7 @@ flake8-black = [ {file = "flake8-black-0.2.5.tar.gz", hash = "sha256:fb6372cc90da129eec492989485a4f99d976f41d4072536470c18e0da0164724"}, {file = "flake8_black-0.2.5-py3-none-any.whl", hash = "sha256:022744ef1513f9a0b748c65ae2a81024d71b992c88f48212187a3fdbb4988943"}, ] -flake8-bugbear = [ - {file = "flake8-bugbear-22.4.25.tar.gz", hash = "sha256:f7c080563fca75ee6b205d06b181ecba22b802babb96b0b084cc7743d6908a55"}, - {file = "flake8_bugbear-22.4.25-py3-none-any.whl", hash = "sha256:ec374101cddf65bd7a96d393847d74e58d3b98669dbf9768344c39b6290e8bd6"}, -] +flake8-bugbear = [] gitdb = [ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, @@ -707,10 +662,7 @@ gitpython = [ {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, ] -google-auth = [ - {file = "google-auth-2.6.6.tar.gz", hash = "sha256:1ba4938e032b73deb51e59c4656a00e0939cf0b1112575099f136babb4563312"}, - {file = "google_auth-2.6.6-py2.py3-none-any.whl", hash = "sha256:349ac49b18b01019453cc99c11c92ed772739778c92f184002b7ab3a5b7ac77d"}, -] +google-auth = [] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, @@ -834,14 +786,15 @@ pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] -pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, -] +pytest = [] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] +python-hosts = [ + {file = "python-hosts-1.0.3.tar.gz", hash = "sha256:e120178f1e6944386fe1855482b52db7251ae62ce962aa432a288625cdb2f15d"}, + {file = "python_hosts-1.0.3-py2-none-any.whl", hash = "sha256:5d0b7e0420ad9e8956ea384c1ed69008500ed566b14afd2bbf58c158d1c853e5"}, +] pywin32 = [ {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, @@ -892,21 +845,15 @@ pyyaml = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-oauthlib = [ {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, ] -rsa = [ - {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, - {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, -] -semantic-version = [ - {file = "semantic_version-2.9.0-py2.py3-none-any.whl", hash = "sha256:db2504ab37902dd2c9876ece53567aa43a5b2a417fbe188097b2048fff46da3d"}, - {file = "semantic_version-2.9.0.tar.gz", hash = "sha256:abf54873553e5e07a6fd4d5f653b781f5ae41297a493666b59dcf214006a12b2"}, -] +rsa = [] +semantic-version = [] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -924,14 +871,11 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, -] -urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, + {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, ] +urllib3 = [] websocket-client = [ - {file = "websocket-client-1.3.2.tar.gz", hash = "sha256:50b21db0058f7a953d67cc0445be4b948d7fc196ecbeb8083d68d94628e4abf6"}, - {file = "websocket_client-1.3.2-py3-none-any.whl", hash = "sha256:722b171be00f2b90e1d4fb2f2b53146a536ca38db1da8ff49c972a4e1365d0ef"}, + {file = "websocket-client-1.3.3.tar.gz", hash = "sha256:d58c5f284d6a9bf8379dab423259fe8f85b70d5fa5d2916d5791a84594b122b1"}, + {file = "websocket_client-1.3.3-py3-none-any.whl", hash = "sha256:5d55652dc1d0b3c734f044337d929aaf83f4f9138816ec680c1aefefb4dc4877"}, ]