From f61622c29fc6dfa6ac50c1730a22f7d46f01b9f4 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Sun, 15 Nov 2020 02:51:39 +0200 Subject: [PATCH 01/25] packages frontend tests --- tests/frontend/pages/Packages/__init__.py | 0 tests/frontend/pages/Packages/packages.py | 69 +++++++++++++++++++++++ tests/frontend/tests/test_packages.py | 55 ++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 tests/frontend/pages/Packages/__init__.py create mode 100644 tests/frontend/pages/Packages/packages.py create mode 100644 tests/frontend/tests/test_packages.py diff --git a/tests/frontend/pages/Packages/__init__.py b/tests/frontend/pages/Packages/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/frontend/pages/Packages/packages.py b/tests/frontend/pages/Packages/packages.py new file mode 100644 index 0000000000..8d1520e208 --- /dev/null +++ b/tests/frontend/pages/Packages/packages.py @@ -0,0 +1,69 @@ +from urllib.parse import urljoin +from tests.frontend.pages.base import Base +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + + +class Packages(Base): + def __init__(self, driver, *args, **kwargs): + super().__init__(self, *args, **kwargs) + self.driver = driver + self.endpoint = "/admin/#/packages" + + def load(self): + url = urljoin(self.base_url, self.endpoint) + self.driver.get(url) + + def system_packages(self): + packages = self.driver.find_elements_by_class_name("v-card__title") + system_packages = [] + for i in range(6): + system_packages.append(packages[i].text) + return system_packages + + def add_package(self, git_url): + buttons = self.driver.find_elements_by_class_name("v-btn") + add_button = [button for button in buttons if button.text == "ADD"][0] + add_button.click() + add_new_package_box = self.driver.find_elements_by_class_name("v-text-field__slot") + git_url_input = add_new_package_box[1].find_element_by_tag_name("input") + git_url_input.send_keys(git_url) + buttons = self.driver.find_elements_by_class_name("v-btn") + submit_button = [button for button in buttons if button.text == "SUBMIT"][0] + submit_button.click() + wait = WebDriverWait(self.driver, 60) + wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "v-dialog"))) + + def check_package_card(self): + + installed_packages = {} + available_packages = {} + packages_category = self.driver.find_elements_by_class_name("row") + installed_packages_cards = packages_category[1].find_elements_by_class_name("v-card") + available_packages_cards = packages_category[2].find_elements_by_class_name("v-card") + for installed_card in installed_packages_cards: + installed_package_card_name = installed_card.find_element_by_class_name("v-card__title") + installed_name = installed_package_card_name.text + installed_packages[installed_name] = installed_card + + for available_card in available_packages_cards: + available_package_card_name = available_card.find_element_by_class_name("v-card__title") + available_name = available_package_card_name.text + available_packages[available_name] = available_card + + return installed_packages, available_packages + + def delete_package(self, package_name): + installed_packages, available_packages = self.check_package_card() + for package in installed_packages.keys(): + if package == package_name: + package_card = installed_packages[package_name] + delete_icon = package_card.find_element_by_class_name("v-btn") + delete_icon.click() + break + else: + return + buttons = self.driver.find_elements_by_class_name("v-btn") + submit_button = [button for button in buttons if button.text == "SUBMIT"][0] + submit_button.click() diff --git a/tests/frontend/tests/test_packages.py b/tests/frontend/tests/test_packages.py new file mode 100644 index 0000000000..c737a815bc --- /dev/null +++ b/tests/frontend/tests/test_packages.py @@ -0,0 +1,55 @@ +import pytest +from tests.frontend.pages.Packages.packages import Packages +from tests.frontend.tests.base_tests import BaseTest + +from gevent import monkey + +monkey.patch_all(subprocess=False) + + +@pytest.mark.integration +class PackagesTests(BaseTest): + def test01_system_packages(self): + """ + Test case for checking system packages list. + **Test Scenario** + - Check the system packages list. + the package list that should be started by default with threebot server. + ['auth', 'chatflows', 'admin', 'weblibs', 'tfgrid_solutions', 'backup'] + """ + + packages = Packages(self.driver) + packages.load() + packages_list = packages.system_packages() + + self.info("Check the system packages list") + default_packages_list = ["auth", "chatflows", "admin", "weblibs", "tfgrid_solutions", "backup"] + self.assertTrue(set(default_packages_list).issubset(packages_list), "not all default packages exist") + + def test02_add_delete_package(self): + """ + Test case for installing a package and deleting it. + **Test Scenario** + - Install a package. + - Check that the package has been installed correctly. + - Delete the package. + - Check that the package has been deleted successfully. + """ + + self.info("Install a package") + packages = Packages(self.driver) + packages.load() + git_url = "https://github.com/threefoldtech/js-sdk/tree/development/jumpscale/packages/notebooks" + packages.add_package(git_url) + + self.info("Check that the package has been installed correctly") + installed_packages, available_packages = packages.check_package_card() + self.assertIn("notebooks", installed_packages.keys()) + + print(installed_packages, available_packages) + self.info("Delete the package") + packages.delete_package("notebooks") + + self.info("Check that the package has been deleted successfully") + installed_packages, available_packages = packages.check_package_card() + self.assertIn("notebooks", available_packages.keys()) From 18161966973ad748968cace0b01b7eea0df90c3e Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Sun, 6 Dec 2020 16:12:20 +0200 Subject: [PATCH 02/25] threebot deployer selenium --- .../pages/threebot_deployer/__init__.py | 0 .../threebot_deployer/threebot_deployer.py | 229 ++++++++++++++++++ .../frontend/tests/test_threebot_deployer.py | 120 +++++++++ 3 files changed, 349 insertions(+) create mode 100644 tests/frontend/pages/threebot_deployer/__init__.py create mode 100644 tests/frontend/pages/threebot_deployer/threebot_deployer.py create mode 100644 tests/frontend/tests/test_threebot_deployer.py diff --git a/tests/frontend/pages/threebot_deployer/__init__.py b/tests/frontend/pages/threebot_deployer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py new file mode 100644 index 0000000000..ceff3f2a30 --- /dev/null +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -0,0 +1,229 @@ +from jumpscale.loader import j +from urllib.parse import urljoin +from tests.frontend.pages.base import Base +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + + +class ThreebotDeployer(Base): + def __init__(self, driver, *args, **kwargs): + super().__init__(self, *args, **kwargs) + self.driver = driver + self.endpoint = "threebot_deployer" + + def load(self): + url = urljoin(self.base_url, self.endpoint) + self.driver.get(url) + + def wait(self, class_name): + wait = WebDriverWait(self.driver, 60) + wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) + + def view_an_existing_3bot_button(self): + view_my_existing_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[2] + view_my_existing_3bot_button.click() + + def switch_driver_to_iframe(self): + # switch driver to iframe + self.wait("v-progress-linear__buffer") + iframe = self.driver.find_elements_by_tag_name("iframe")[0] + self.driver.switch_to_frame(iframe) + + def click_button(self, text): + buttons = self.driver.find_elements_by_class_name("v-btn") + next_button = [button for button in buttons if button.text == text][0] + next_button.click() + + def find_correct_3bot_instance(self, action, my_3bot_instance_name): + # Find correct 3bot instance row + self.wait("v-progress-linear__buffer") + table_box = self.driver.find_element_by_class_name("v-data-table") + table = table_box.find_element_by_tag_name("table") + rows = table.find_elements_by_tag_name("tr") + + if action == "delete": + i = 2 + else: + i = 0 + for row in rows: + if row.text.split()[0] == my_3bot_instance_name: + row.find_elements_by_class_name("v-btn__content")[i].click() + break + else: + return + + def payment_process(self, wallet_name): + chat_box = self.driver.find_element_by_class_name("chat") + payment = chat_box.find_elements_by_tag_name("mb-4").text + payment_info = payment.splitlines() + destination_wallet_address = payment_info[3] + currency = payment_info[5] + reservation_ID = payment_info[7] + total_amount = payment_info[9].split()[0] + + a = getattr(j.clients.stellar, wallet_name).get_asset(currency) + j.clients.stellar.demos_wallet.transfer( + destination_wallet_address, amount=total_amount, memo_text=reservation_ID, asset=f"{a.code}:{a.issuer}" + ) + + def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): + # Deploy a new 3bot button + deploy_new_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[1] + deploy_new_3bot_button.click() + + self.wait("v-progress-linear__buffer") + + # switch driver to iframe + iframe = self.driver.find_elements_by_tag_name("iframe")[0] + self.driver.switch_to_frame(iframe) + + # Create a new 3Bot instance + chat_box = self.driver.find_element_by_class_name("chat") + create_button = chat_box.find_elements_by_class_name("v-input--selection-controls__ripple")[0] + create_button.click() + + self.click_button("NEXT") + + # ThreeBot instance Name + name_element = chat_box.find_element_by_class_name("v-text-field__slot") + name_input = name_element.find_element_by_tag_name("input") + name_input.send_keys(my_3bot_instances) + + self.click_button("NEXT") + + self.wait("progressbar") + self.wait("progressbar") + + # Choose how much resources the deployed solution will use. + # We use 1 CPU, 2GB Memory, and 2GB[SSD] in this example. + instance_resources = chat_box.find_elements_by_class_name("v-radio")[0] + instance_resources.click() + + self.click_button("NEXT") + self.click_button("NEXT") + + # Threebot recovery password + password_element = chat_box.find_element_by_class_name("v-text-field__slot") + password_input = password_element.find_element_by_tag_name("input") + password_input.send_keys(password) + + self.click_button("NEXT") + + self.wait("v-progress-circular") + + # The deployment location policy ( We here use it automatically ) + instance_location_selection = chat_box.find_elements_by_class_name("v-radio")[0] + instance_location_selection.click() + + self.click_button("NEXT") + self.wait("v-progress-circular") + self.click_button("NEXT") + + self.wait("v-progress-circular") + + self.click_button("NEXT") + + # Payment process + self.payment_process(wallet_name=wallet_name) + + self.click_button("NEXT") + self.wait("v-progress-circular") + self.click_button("NEXT") + self.wait("progressbar") + + # Threebot instance URL + threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") + threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[14] + + self.click_button("FINISH") + return threebot_instance_URL + + def view_my_3bot(self, status): + + # View an existing 3bot button + self.view_an_existing_3bot_button() + + self.wait("progressbar") + + # Select 3bot instances with certain status + my_3bot_box = self.driver.find_element_by_class_name("v-select__selections") + status_input = my_3bot_box.find_element_by_tag_name("input") + status_input.send_keys(status) + + # List 3bot instances + self.wait("v-progress-linear__buffer") + table_box = self.driver.find_element_by_class_name("v-data-table") + table = table_box.find_element_by_tag_name("table") + rows = table.find_elements_by_tag_name("tr") + + my_3bot_instances = [] + for row in rows: + my_3bot_instance = row.text.split()[0] + my_3bot_instances.append(my_3bot_instance) + + return my_3bot_instances + + def delete_threebot_instance(self, my_3bot_instance_name, password): + + # View an existing 3bot button + self.view_an_existing_3bot_button() + + # Find correct 3bot instance row + self.find_correct_3bot_instance("delete", my_3bot_instance_name=my_3bot_instance_name) + + # Destroy 3bot box + destroy_3bot = self.driver.find_element_by_class_name("v-card") + input_password = destroy_3bot.find_element_by_tag_name("input") + input_password.send_keys(password) + + # Click CONFIRM button + self.click_button("CONFIRM") + + self.wait("v-progress-linear__buffer") + + def start_stopped_3bot_instance(self, my_3bot_instance_name, password, wallet_name): + + # View an existing 3bot button + self.view_an_existing_3bot_button() + + # Find correct 3bot instance row + self.find_correct_3bot_instance("start", my_3bot_instance_name=my_3bot_instance_name) + + # switch driver to iframe + self.switch_driver_to_iframe() + + password_chat_box = self.driver.find_element_by_class_name("chat") + input_password = password_chat_box.find_element_by_tag_name("input") + input_password.send_keys(password) + + self.click_button("NEXT") + self.wait("progressbar") + + self.click_button("NEXT") + self.payment_process(wallet_name=wallet_name) + + self.click_button("NEXT") + self.wait("v-progress-linear__buffer") + + # Threebot instance URL + threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") + threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[14] + + self.click_button("FINISH") + return threebot_instance_URL + + def stop_running_3bot_instance(self, my_3bot_instance_name, password): + + # View an existing 3bot button + self.view_an_existing_3bot_button() + + # Find correct 3bot instance row + self.find_correct_3bot_instance("stop", my_3bot_instance_name=my_3bot_instance_name) + + password_chat_box = self.driver.find_element_by_class_name("v-card") + input_password = password_chat_box.find_element_by_tag_name("input") + input_password.send_keys(password) + + self.click_button("CONFIRM") + self.wait("v-progress-linear__buffer") diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py new file mode 100644 index 0000000000..84df149a88 --- /dev/null +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -0,0 +1,120 @@ +import pytest +import urllib.request +from random import randint +from tests.frontend.tests.base_tests import BaseTest +from tests.frontend.pages.wallets.wallets import Wallets +from tests.frontend.pages.threebot_deployer.threebot_deployer import ThreebotDeployer + + +@pytest.mark.integration +class ThreebotDeployerTests(BaseTest): + + wallet_name = "wallet_{}".format(randint(1, 500)) + + def setUp(self): + super().setUp() + if not hasattr(ThreebotDeployerTests, "wallet_name"): + self.wallet_name = self.random_name() + self.create_wallet(self.wallet_name) + + self.threebot_deployer = ThreebotDeployer(self.driver) + self.threebot_deployer.load() + + @classmethod + def tearDownClass(cls): + cls.delete_wallet() + super().tearDownClass() + + def test01_deploy_and_delete_3bot(self): + """ + Test case to test deploy and delete a 3bot instance + + **Test Scenario** + #. Create a wallet. + #. Create a threebot instance. + #. Check that the threebot instance has been created successfully. + #. Delete the wallet. + #. Delete the threebot instance. + #. Check that the threebot instance has been deleted successfully. + """ + self.info("Create a wallet") + + self.info("Create a threebot instance") + threebot_name = "threebot{}".format(randint(1, 1000)) + password = randint(1, 500000) + threebot_instance_url = self.threebot_deployer.deploy_new_3bot( + my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name + ) + + self.info("Check that the threebot instance has been created successfully") + self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) + + my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + self.assertIn(threebot_name, my_3bot_instances) + + self.info("Delete the wallet") + + self.info("Delete the threebot instance") + self.threebot_deployer.delete_threebot_instance(my_3bot_instances=threebot_name, password=password) + + self.info("Check that the threebot instance has been deleted successfully") + my_3bot_instances = self.threebot_deployer.view_my_3bot("DELETED") + self.assertIn(threebot_name, my_3bot_instances) + + def test02_start_and_stop_my_3bot_instance(self): + """ + Test case to test start and stop a 3bot instance + + **Test Scenario** + #. Create a wallet. + #. Create a 3bot instance. + #. Stopped the new created 3bot instance. + #. Check that the 3bot instance has been stopped successfully. + #. Start the 3bot instance. + #. Check that the 3bot instance has been started successfully. + #. Delete the 3bot instance. + #. Delete the wallet. + """ + + self.info("Create a wallet") + + self.info("Create a 3bot instance") + threebot_name = "threebot_{}".format(randint(1, 1000)) + password = randint(1, 500000) + self.threebot_deployer.deploy_new_3bot( + my_3bot_instance_name=threebot_name, password=password, wallet_name=self.wallet_name + ) + + self.info("Stopped the new created 3bot instance") + self.stop_running_3bot_instance(my_3bot_instance_name=threebot_name, password=password) + + self.info("Check that the 3bot instance has been stopped successfully") + my_3bot_instances = self.threebot_deployer.view_my_3bot("STOPPED") + self.assertIn(threebot_name, my_3bot_instances) + + self.info("Start the 3bot instance") + threebot_instance_url = self.start_stopped_3bot_instance( + my_3bot_instance_name=threebot_name, password=password, wallet_name=self.wallet_name + ) + + self.info("Check that the 3bot instance has been started successfully") + self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) + my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + self.assertIn(threebot_name, my_3bot_instances) + + self.info("Delete the 3bot instance") + self.threebot_deployer.delete_threebot_instance(my_3bot_instances=threebot_name, password=password) + + self.info("Delete the wallet") + + def create_wallet(self, wallet_name): + self.info("Create a wallet") + wallets = Wallets(self.driver) + wallets.load() + wallets.add_funded(wallet_name) + + def delete_wallet(self): + self.info("Delete the wallet") + wallets = Wallets(self.driver) + wallets.load() + wallets.delete(self.wallet_name) From d99de2d05110648dfb14f9fb3e534b185479dc92 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Sun, 6 Dec 2020 16:15:21 +0200 Subject: [PATCH 03/25] threebot deployer selenium --- tests/frontend/tests/test_threebot_deployer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 84df149a88..00fe3d4be6 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -79,7 +79,7 @@ def test02_start_and_stop_my_3bot_instance(self): self.info("Create a wallet") self.info("Create a 3bot instance") - threebot_name = "threebot_{}".format(randint(1, 1000)) + threebot_name = "threebot{}".format(randint(1, 1000)) password = randint(1, 500000) self.threebot_deployer.deploy_new_3bot( my_3bot_instance_name=threebot_name, password=password, wallet_name=self.wallet_name From bff81633e071f25a0dbc7531e8f5c785b2409e4d Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Wed, 9 Dec 2020 16:34:59 +0200 Subject: [PATCH 04/25] workloads testcases --- tests/frontend/pages/workloads/__init__.py | 0 tests/frontend/pages/workloads/workloads.py | 70 +++++++++++++++++++++ tests/frontend/tests/test_workloads.py | 32 ++++++++++ 3 files changed, 102 insertions(+) create mode 100644 tests/frontend/pages/workloads/__init__.py create mode 100644 tests/frontend/pages/workloads/workloads.py create mode 100644 tests/frontend/tests/test_workloads.py diff --git a/tests/frontend/pages/workloads/__init__.py b/tests/frontend/pages/workloads/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/frontend/pages/workloads/workloads.py b/tests/frontend/pages/workloads/workloads.py new file mode 100644 index 0000000000..48d98246e1 --- /dev/null +++ b/tests/frontend/pages/workloads/workloads.py @@ -0,0 +1,70 @@ +from jumpscale.loader import j +from urllib.parse import urljoin +from tests.frontend.pages.base import Base +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from solutions_automation.dashboard_solutions.network import NetworkDeployAutomated + + +class workloads(Base): + def __init__(self, driver, *args, **kwargs): + super().__init__(self, *args, **kwargs) + self.driver = driver + self.endpoint = "/admin/#/workloads" + + def load(self): + url = urljoin(self.base_url, self.endpoint) + self.driver.get(url) + + def wait(self, class_name): + wait = WebDriverWait(self.driver, 90) + wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) + + def click_button(self, button_type): + buttons = self.driver.find_elements_by_class_name("v-btn") + button = [button for button in buttons if button.text == button_type][0] + self.wait("progressbar") + button.click() + + def select_workload_by_ID(self, workload_ID): + # Select workloads by ID. + search_ID_box = self.driver.find_element_by_class_name("v-text-field__slot") + input_search_ID = search_ID_box.find_element_by_tag_name("input") + input_search_ID.send_keys(workload_ID) + + # Check Box wth all selected workload + ID = self.driver.find_elements_by_class_name("v-data-table__checkbox") + click_ID = ID[1].find_element_by_class_name("v-icon") + click_ID.click() + + def create_workload(self, workload_name): + test_network = NetworkDeployAutomated( + solution_name=workload_name, + type="Create", + ip_version="IPv4", + ip_select="Choose ip range for me", + ip_range="", + access_node="choose_random", + pool="choose_random", + debug=True, + ) + + test_network_dict = test_network.config + return int(test_network_dict.get("ids")[0]) + + def delete_selected_workloads(self, workload_ID): + + self.select_workload_by_ID(workload_ID) + + # Delete all selected workloads + self.click_button("DELETE SELECTED") + + # Click confirm + self.click_button("CONFIRM") + + def check_selected_workloads_status(self, workload_ID): + + self.driver.refresh() + self.select_workload_by_ID(workload_ID) + return self.driver.find_elements_by_class_name("text-start")[10].text diff --git a/tests/frontend/tests/test_workloads.py b/tests/frontend/tests/test_workloads.py new file mode 100644 index 0000000000..27092e0139 --- /dev/null +++ b/tests/frontend/tests/test_workloads.py @@ -0,0 +1,32 @@ +import pytest +from random import randint +from tests.frontend.pages.workloads.workloads import workloads +from tests.frontend.tests.base_tests import BaseTest + + +@pytest.mark.integration +class WorkloadsTests(BaseTest): + def setUp(self): + super().setUp() + self.workloads = workloads(self.driver) + self.workloads.load() + + def test01_delete_selected_workloads(self): + """ + **Test Scenario** + #. Create a workload. + #. Delete selected workload. + #. Check that selected workload has been deleted correctly. + """ + + self.info("Create a workload") + workload_name = "workload{}".format(randint(1, 500)) + workload_ID = self.workloads.create_workload(workload_name) + + self.info("Delete selected workload") + self.workloads.delete_selected_workloads(workload_ID) + + self.info("Check that selected workload has been deleted correctly") + self.workloads.load() + worklods_status = self.workloads.check_selected_workloads_status(workload_ID) + self.assertEquals(worklods_status, "DELETED") From 05369d29c1999449d63b4887b3b5dd59f2cbb660 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Wed, 9 Dec 2020 17:16:05 +0200 Subject: [PATCH 05/25] workloads testcases --- tests/frontend/tests/test_workloads.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/frontend/tests/test_workloads.py b/tests/frontend/tests/test_workloads.py index 27092e0139..359112a9cf 100644 --- a/tests/frontend/tests/test_workloads.py +++ b/tests/frontend/tests/test_workloads.py @@ -27,6 +27,5 @@ def test01_delete_selected_workloads(self): self.workloads.delete_selected_workloads(workload_ID) self.info("Check that selected workload has been deleted correctly") - self.workloads.load() worklods_status = self.workloads.check_selected_workloads_status(workload_ID) self.assertEquals(worklods_status, "DELETED") From 0be32cc1cf49f825de2060da59b14e13bdceb442 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Tue, 15 Dec 2020 11:23:33 +0200 Subject: [PATCH 06/25] workloads testcases --- tests/frontend/pages/Packages/__init__.py | 0 tests/frontend/pages/Packages/packages.py | 69 --------------------- tests/frontend/pages/workloads/workloads.py | 4 +- tests/frontend/tests/test_packages.py | 55 ---------------- 4 files changed, 3 insertions(+), 125 deletions(-) delete mode 100644 tests/frontend/pages/Packages/__init__.py delete mode 100644 tests/frontend/pages/Packages/packages.py delete mode 100644 tests/frontend/tests/test_packages.py diff --git a/tests/frontend/pages/Packages/__init__.py b/tests/frontend/pages/Packages/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/frontend/pages/Packages/packages.py b/tests/frontend/pages/Packages/packages.py deleted file mode 100644 index 8d1520e208..0000000000 --- a/tests/frontend/pages/Packages/packages.py +++ /dev/null @@ -1,69 +0,0 @@ -from urllib.parse import urljoin -from tests.frontend.pages.base import Base -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - - -class Packages(Base): - def __init__(self, driver, *args, **kwargs): - super().__init__(self, *args, **kwargs) - self.driver = driver - self.endpoint = "/admin/#/packages" - - def load(self): - url = urljoin(self.base_url, self.endpoint) - self.driver.get(url) - - def system_packages(self): - packages = self.driver.find_elements_by_class_name("v-card__title") - system_packages = [] - for i in range(6): - system_packages.append(packages[i].text) - return system_packages - - def add_package(self, git_url): - buttons = self.driver.find_elements_by_class_name("v-btn") - add_button = [button for button in buttons if button.text == "ADD"][0] - add_button.click() - add_new_package_box = self.driver.find_elements_by_class_name("v-text-field__slot") - git_url_input = add_new_package_box[1].find_element_by_tag_name("input") - git_url_input.send_keys(git_url) - buttons = self.driver.find_elements_by_class_name("v-btn") - submit_button = [button for button in buttons if button.text == "SUBMIT"][0] - submit_button.click() - wait = WebDriverWait(self.driver, 60) - wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "v-dialog"))) - - def check_package_card(self): - - installed_packages = {} - available_packages = {} - packages_category = self.driver.find_elements_by_class_name("row") - installed_packages_cards = packages_category[1].find_elements_by_class_name("v-card") - available_packages_cards = packages_category[2].find_elements_by_class_name("v-card") - for installed_card in installed_packages_cards: - installed_package_card_name = installed_card.find_element_by_class_name("v-card__title") - installed_name = installed_package_card_name.text - installed_packages[installed_name] = installed_card - - for available_card in available_packages_cards: - available_package_card_name = available_card.find_element_by_class_name("v-card__title") - available_name = available_package_card_name.text - available_packages[available_name] = available_card - - return installed_packages, available_packages - - def delete_package(self, package_name): - installed_packages, available_packages = self.check_package_card() - for package in installed_packages.keys(): - if package == package_name: - package_card = installed_packages[package_name] - delete_icon = package_card.find_element_by_class_name("v-btn") - delete_icon.click() - break - else: - return - buttons = self.driver.find_elements_by_class_name("v-btn") - submit_button = [button for button in buttons if button.text == "SUBMIT"][0] - submit_button.click() diff --git a/tests/frontend/pages/workloads/workloads.py b/tests/frontend/pages/workloads/workloads.py index 48d98246e1..8a0c642754 100644 --- a/tests/frontend/pages/workloads/workloads.py +++ b/tests/frontend/pages/workloads/workloads.py @@ -1,4 +1,3 @@ -from jumpscale.loader import j from urllib.parse import urljoin from tests.frontend.pages.base import Base from selenium.webdriver.common.by import By @@ -28,6 +27,8 @@ def click_button(self, button_type): button.click() def select_workload_by_ID(self, workload_ID): + self.wait("progressbar") + # Select workloads by ID. search_ID_box = self.driver.find_element_by_class_name("v-text-field__slot") input_search_ID = search_ID_box.find_element_by_tag_name("input") @@ -66,5 +67,6 @@ def delete_selected_workloads(self, workload_ID): def check_selected_workloads_status(self, workload_ID): self.driver.refresh() + self.wait("progressbar") self.select_workload_by_ID(workload_ID) return self.driver.find_elements_by_class_name("text-start")[10].text diff --git a/tests/frontend/tests/test_packages.py b/tests/frontend/tests/test_packages.py deleted file mode 100644 index c737a815bc..0000000000 --- a/tests/frontend/tests/test_packages.py +++ /dev/null @@ -1,55 +0,0 @@ -import pytest -from tests.frontend.pages.Packages.packages import Packages -from tests.frontend.tests.base_tests import BaseTest - -from gevent import monkey - -monkey.patch_all(subprocess=False) - - -@pytest.mark.integration -class PackagesTests(BaseTest): - def test01_system_packages(self): - """ - Test case for checking system packages list. - **Test Scenario** - - Check the system packages list. - the package list that should be started by default with threebot server. - ['auth', 'chatflows', 'admin', 'weblibs', 'tfgrid_solutions', 'backup'] - """ - - packages = Packages(self.driver) - packages.load() - packages_list = packages.system_packages() - - self.info("Check the system packages list") - default_packages_list = ["auth", "chatflows", "admin", "weblibs", "tfgrid_solutions", "backup"] - self.assertTrue(set(default_packages_list).issubset(packages_list), "not all default packages exist") - - def test02_add_delete_package(self): - """ - Test case for installing a package and deleting it. - **Test Scenario** - - Install a package. - - Check that the package has been installed correctly. - - Delete the package. - - Check that the package has been deleted successfully. - """ - - self.info("Install a package") - packages = Packages(self.driver) - packages.load() - git_url = "https://github.com/threefoldtech/js-sdk/tree/development/jumpscale/packages/notebooks" - packages.add_package(git_url) - - self.info("Check that the package has been installed correctly") - installed_packages, available_packages = packages.check_package_card() - self.assertIn("notebooks", installed_packages.keys()) - - print(installed_packages, available_packages) - self.info("Delete the package") - packages.delete_package("notebooks") - - self.info("Check that the package has been deleted successfully") - installed_packages, available_packages = packages.check_package_card() - self.assertIn("notebooks", available_packages.keys()) From e5268a223f13e1d83e33fb2c4d37d3663abb9de0 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Tue, 15 Dec 2020 16:52:56 +0200 Subject: [PATCH 07/25] workloads testcases --- tests/frontend/pages/base.py | 15 ++++++++++++++ tests/frontend/pages/workloads/workloads.py | 23 ++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/frontend/pages/base.py b/tests/frontend/pages/base.py index 3fd96d7524..d0aa0d00f1 100644 --- a/tests/frontend/pages/base.py +++ b/tests/frontend/pages/base.py @@ -1,5 +1,20 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + + class Base: base_url = "https://localhost" def __init__(self, *args, **kwargs): pass + + def wait(self, driver, class_name): + wait = WebDriverWait(driver, 180) + wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) + + def click_button(self, driver, text): + self.wait(driver, "progressbar") + buttons = driver.find_elements_by_class_name("v-btn") + next_button = [button for button in buttons if button.text == text][0] + next_button.click() diff --git a/tests/frontend/pages/workloads/workloads.py b/tests/frontend/pages/workloads/workloads.py index 8a0c642754..9ce92ef93c 100644 --- a/tests/frontend/pages/workloads/workloads.py +++ b/tests/frontend/pages/workloads/workloads.py @@ -1,8 +1,5 @@ from urllib.parse import urljoin from tests.frontend.pages.base import Base -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC from solutions_automation.dashboard_solutions.network import NetworkDeployAutomated @@ -16,18 +13,8 @@ def load(self): url = urljoin(self.base_url, self.endpoint) self.driver.get(url) - def wait(self, class_name): - wait = WebDriverWait(self.driver, 90) - wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) - - def click_button(self, button_type): - buttons = self.driver.find_elements_by_class_name("v-btn") - button = [button for button in buttons if button.text == button_type][0] - self.wait("progressbar") - button.click() - def select_workload_by_ID(self, workload_ID): - self.wait("progressbar") + self.wait(self.driver, "v-progress-linear__buffer") # Select workloads by ID. search_ID_box = self.driver.find_element_by_class_name("v-text-field__slot") @@ -55,18 +42,16 @@ def create_workload(self, workload_name): return int(test_network_dict.get("ids")[0]) def delete_selected_workloads(self, workload_ID): - self.select_workload_by_ID(workload_ID) # Delete all selected workloads - self.click_button("DELETE SELECTED") + self.click_button(self.driver, "DELETE SELECTED") # Click confirm - self.click_button("CONFIRM") + self.click_button(self.driver, "CONFIRM") def check_selected_workloads_status(self, workload_ID): - self.driver.refresh() - self.wait("progressbar") + self.wait(self.driver, "v-progress-linear__buffer") self.select_workload_by_ID(workload_ID) return self.driver.find_elements_by_class_name("text-start")[10].text From 77ab5829b546062e3e5a4fd29dcb9a80f9b1013d Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Wed, 16 Dec 2020 18:26:55 +0200 Subject: [PATCH 08/25] threebot deployer selenium --- poetry.lock | 2381 ----------------- tests/frontend/pages/Packages/__init__.py | 0 tests/frontend/pages/Packages/packages.py | 69 - tests/frontend/pages/base.py | 15 + .../threebot_deployer/threebot_deployer.py | 94 +- tests/frontend/tests/test_packages.py | 55 - .../frontend/tests/test_threebot_deployer.py | 30 +- 7 files changed, 72 insertions(+), 2572 deletions(-) delete mode 100644 poetry.lock delete mode 100644 tests/frontend/pages/Packages/__init__.py delete mode 100644 tests/frontend/pages/Packages/packages.py delete mode 100644 tests/frontend/tests/test_packages.py diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 3613176313..0000000000 --- a/poetry.lock +++ /dev/null @@ -1,2381 +0,0 @@ -[[package]] -name = "acme" -version = "1.8.0" -description = "ACME protocol implementation in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -cryptography = ">=1.2.3" -josepy = ">=1.1.0" -PyOpenSSL = ">=0.15.1" -pyrfc3339 = "*" -pytz = "*" -requests = {version = ">=2.6.0", extras = ["security"]} -requests-toolbelt = ">=0.3.0" -six = ">=1.9.0" - -[package.extras] -dev = ["pytest", "pytest-xdist", "tox"] -docs = ["Sphinx (>=1.0)", "sphinx-rtd-theme"] - -[[package]] -name = "aiohttp" -version = "3.6.2" -description = "Async http client/server framework (asyncio)" -category = "main" -optional = false -python-versions = ">=3.5.3" - -[package.dependencies] -async-timeout = ">=3.0,<4.0" -attrs = ">=17.3.0" -chardet = ">=2.0,<4.0" -idna-ssl = {version = ">=1.0", markers = "python_version < \"3.7\""} -multidict = ">=4.5,<5.0" -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.7\""} -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["aiodns", "brotlipy", "cchardet"] - -[[package]] -name = "aiohttp-sse-client" -version = "0.1.7" -description = "A Server-Sent Event python client base on aiohttp" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -aiohttp = ">=3" -attrs = "*" -multidict = "*" -yarl = "*" - -[[package]] -name = "argh" -version = "0.26.2" -description = "An unobtrusive argparse wrapper with natural syntax" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "arrow" -version = "0.15.8" -description = "Better dates & times for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -python-dateutil = "*" - -[[package]] -name = "async-timeout" -version = "3.0.1" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.5.3" - -[[package]] -name = "attrs" -version = "20.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] - -[[package]] -name = "base58" -version = "2.0.1" -description = "Base58 and Base58Check implementation" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "bcrypt" -version = "3.2.0" -description = "Modern password hashing for your software and your servers" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.1" -six = ">=1.4.1" - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - -[[package]] -name = "beaker" -version = "1.11.0" -description = "A Session and Caching library with WSGI Middleware" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -funcsigs = "*" - -[package.extras] -crypto = ["pycryptopp (>=0.5.12)"] -cryptography = ["cryptography"] -pycrypto = ["pycrypto"] -pycryptodome = ["pycryptodome"] -testsuite = ["nose", "mock", "pycryptodome", "webtest", "coverage", "cryptography", "sqlalchemy", "pymongo", "redis", "pylibmc", "python-memcached"] - -[[package]] -name = "better-exceptions" -version = "0.2.2" -description = "Pretty and helpful exceptions, automatically" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} - -[[package]] -name = "bottle" -version = "0.12.18" -description = "Fast and simple WSGI-framework for small web-applications." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "captcha" -version = "0.3" -description = "A captcha library that generates audio and image CAPTCHAs." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -Pillow = "*" - -[[package]] -name = "certbot" -version = "1.8.0" -description = "ACME client" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -acme = ">=1.6.0" -ConfigArgParse = ">=0.9.3" -configobj = "*" -cryptography = ">=1.2.3" -distro = ">=1.0.1" -josepy = ">=1.1.0" -parsedatetime = ">=1.3" -pyrfc3339 = "*" -pytz = "*" -pywin32 = {version = ">=227", markers = "sys_platform == \"win32\""} -"zope.component" = "*" -"zope.interface" = "*" - -[package.extras] -dev = ["coverage", "pytest", "pytest-cov", "pytest-xdist", "tox", "twine", "wheel"] -dev3 = ["astroid", "azure-devops", "ipdb", "mypy", "pygithub", "pylint"] -docs = ["repoze.sphinx.autointerface", "Sphinx (>=1.2)", "sphinx-rtd-theme"] - -[[package]] -name = "certbot-nginx" -version = "1.5.0" -description = "Nginx plugin for Certbot" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -acme = ">=1.4.0" -certbot = ">=1.4.0" -PyOpenSSL = "*" -pyparsing = ">=1.5.5" -"zope.interface" = "*" - -[[package]] -name = "certifi" -version = "2019.11.28" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "cffi" -version = "1.14.3" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "chardet" -version = "3.0.4" -description = "Universal encoding detector for Python 2 and 3" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "colorama" -version = "0.4.3" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "configargparse" -version = "1.2.3" -description = "A drop-in replacement for argparse that allows options to also be set via config files and/or environment variables." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -yaml = ["pyyaml"] - -[[package]] -name = "configobj" -version = "5.0.6" -description = "Config file reading, writing and validation." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[[package]] -name = "crc16" -version = "0.1.1" -description = "Library for calculating CRC16" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "cryptocompare" -version = "0.6.6" -description = "Wrapper for CryptoCompare.com" -category = "main" -optional = false -python-versions = ">=3" - -[package.dependencies] -requests = "*" - -[[package]] -name = "cryptography" -version = "3.0" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[package.dependencies] -cffi = ">=1.8,<1.11.3 || >1.11.3" -six = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -idna = ["idna (>=2.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] - -[[package]] -name = "deprecated" -version = "1.2.10" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["tox", "bumpversion (<1)", "sphinx (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"] - -[[package]] -name = "dill" -version = "0.3.2" -description = "serialize all of python" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*" - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - -[[package]] -name = "distro" -version = "1.5.0" -description = "Distro - an OS platform information API" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "dnspython" -version = "1.16.0" -description = "DNS toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -DNSSEC = ["pycryptodome", "ecdsa (>=0.13)"] -IDNA = ["idna (>=2.1)"] - -[[package]] -name = "docker" -version = "4.3.1" -description = "A Python library for the Docker Engine API." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -pywin32 = {version = "227", markers = "sys_platform == \"win32\""} -requests = ">=2.14.2,<2.18.0 || >2.18.0" -six = ">=1.4.0" -websocket-client = ">=0.32.0" - -[package.extras] -ssh = ["paramiko (>=2.4.2)"] -tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "fabric" -version = "2.5.0" -description = "High level SSH command execution" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -invoke = ">=1.3,<2.0" -paramiko = ">=2.4" - -[package.extras] -pytest = ["mock (>=2.0.0,<3.0)", "pytest (>=3.2.5,<4.0)"] -testing = ["mock (>=2.0.0,<3.0)"] - -[[package]] -name = "faker" -version = "2.0.5" -description = "Faker is a Python package that generates fake data for you." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -python-dateutil = ">=2.4" -six = ">=1.10" -text-unidecode = "1.3" - -[[package]] -name = "funcsigs" -version = "1.0.2" -description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "future" -version = "0.18.2" -description = "Clean single-source support for Python 3 and 2" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "gevent" -version = "1.4.0" -description = "Coroutine-based network library" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -cffi = {version = ">=1.11.5", markers = "sys_platform == \"win32\" and platform_python_implementation == \"CPython\""} -greenlet = {version = ">=0.4.14", markers = "platform_python_implementation == \"CPython\""} - -[package.extras] -dnspython = ["dnspython", "idna"] -doc = ["repoze.sphinx.autointerface"] -events = ["zope.event", "zope.interface"] -test = ["zope.interface", "zope.event", "requests", "objgraph", "psutil", "futures", "mock", "coverage (>=5.0a3)", "coveralls (>=1.0)"] - -[[package]] -name = "gitdb" -version = "4.0.5" -description = "Git Object Database" -category = "main" -optional = false -python-versions = ">=3.4" - -[package.dependencies] -smmap = ">=3.0.1,<4" - -[[package]] -name = "gitpython" -version = "3.1.8" -description = "Python Git Library" -category = "main" -optional = false -python-versions = ">=3.4" - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "greenlet" -version = "0.4.16" -description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "idna" -version = "2.10" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "idna-ssl" -version = "1.1.0" -description = "Patch ssl.match_hostname for Unicode(idna) domains support" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -idna = ">=2.0" - -[[package]] -name = "importlib-metadata" -version = "2.0.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] - -[[package]] -name = "importlib-resources" -version = "3.0.0" -description = "Read resources from Python packages" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -zipp = {version = ">=0.4", markers = "python_version < \"3.8\""} - -[package.extras] -docs = ["sphinx", "rst.linker", "jaraco.packaging"] - -[[package]] -name = "invoke" -version = "1.4.1" -description = "Pythonic task execution" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "jedi" -version = "0.17.2" -description = "An autocompletion tool for Python that can be used for text editors." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -parso = ">=0.7.0,<0.8.0" - -[package.extras] -qa = ["flake8 (==3.7.9)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] - -[[package]] -name = "jinja2" -version = "2.11.2" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -name = "josepy" -version = "1.4.0" -description = "JOSE protocol implementation in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -cryptography = ">=0.8" -PyOpenSSL = ">=0.13" -six = ">=1.9.0" - -[package.extras] -dev = ["pytest", "tox"] -dev3 = ["mypy"] -docs = ["Sphinx (>=1.0)", "sphinx-rtd-theme"] -tests = ["coverage (>=4.0)", "pytest-cache (>=1.0)", "pytest-cov", "flake8", "pytest-flake8 (>=0.5)", "pytest (>=2.8.0)", "mock"] - -[[package]] -name = "js-ng" -version = "11.0b10" -description = "system automation, configuration management and RPC framework" -category = "main" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -arrow = ">=0.15.7,<0.16.0" -better-exceptions = ">=0.2.2,<0.3.0" -bottle = ">=0.12.18,<0.13.0" -click = ">=7.0,<8.0" -colorama = ">=0.4.1,<0.5.0" -dill = ">=0.3.0,<0.4.0" -distro = ">=1.4,<2.0" -docker = ">=4.2.0,<5.0.0" -fabric = ">=2.4,<3.0" -faker = ">=2.0,<3.0" -gevent = "1.4.0" -GitPython = ">=3.0,<4.0" -greenlet = "0.4.16" -jinja2 = ">=2.11.1,<3.0.0" -libtmux = ">=0.8.2,<0.9.0" -loguru = ">=0.3.2,<0.4.0" -msgpack = ">=0.6.1,<0.7.0" -pdoc3 = ">=0.6.3,<0.7.0" -prompt-toolkit = "<3.0.0" -psutil = ">=5.7.0,<6.0.0" -ptpython = ">=2.0,<3.0" -pudb = ">=2019.1,<2020.0" -pycparser = ">=2.20,<3.0" -pylzma = ">=0.5.0,<0.6.0" -pynacl = "1.3.0" -pytoml = ">=0.1.21,<0.2.0" -PyYAML = ">=5.1,<6.0" -redis = ">=3.3,<4.0" -secretconf = ">=0.1.2,<0.2.0" -terminaltables = ">=3.1,<4.0" -watchdog = ">=0.9.0,<0.10.0" -Whoosh = ">=2.7.4,<3.0.0" -zipp = ">=3.1.0,<4.0.0" - -[[package]] -name = "jsonpickle" -version = "1.4.1" -description = "Python library for serializing any arbitrary object graph into JSON" -category = "main" -optional = false -python-versions = ">=2.7" - -[package.dependencies] -importlib-metadata = "*" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["coverage (<5)", "pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov", "ecdsa", "feedparser", "numpy", "pandas", "pymongo", "sqlalchemy", "enum34", "jsonlib"] -"testing.libs" = ["demjson", "simplejson", "ujson", "yajl"] - -[[package]] -name = "libtmux" -version = "0.8.3" -description = "scripting library / orm for tmux" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "loguru" -version = "0.3.2" -description = "Python logging made (stupidly) simple" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} -win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} - -[package.extras] -dev = ["codecov (>=2.0.15)", "colorama (>=0.3.4)", "flake8 (>=3.7.7)", "isort (>=4.3.20)", "tox (>=3.9.0)", "tox-travis (>=0.12)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "Sphinx (>=1.7.4)", "sphinx-autobuild (>=0.7)", "sphinx-rtd-theme (>=0.3)", "black (>=19.3b0)"] - -[[package]] -name = "mako" -version = "1.1.3" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["babel"] -lingua = ["lingua"] - -[[package]] -name = "markdown" -version = "3.2.2" -description = "Python implementation of Markdown." -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - -[package.extras] -testing = ["coverage", "pyyaml"] - -[[package]] -name = "markupsafe" -version = "1.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[[package]] -name = "minio" -version = "4.0.21" -description = "MinIO Python Library for Amazon S3 Compatible Cloud Storage for Python" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -certifi = "*" -future = "*" -python-dateutil = "*" -pytz = "*" -urllib3 = "*" - -[[package]] -name = "mnemonic" -version = "0.19" -description = "Implementation of Bitcoin BIP-0039" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "msgpack" -version = "0.6.2" -description = "MessagePack (de)serializer." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "multidict" -version = "4.7.6" -description = "multidict implementation" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "netaddr" -version = "0.7.20" -description = "A network address manipulation library for Python" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -importlib-resources = {version = "*", markers = "python_version < \"3.7\""} - -[[package]] -name = "paramiko" -version = "2.7.2" -description = "SSH2 protocol library" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" - -[package.extras] -all = ["pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "bcrypt (>=3.1.3)", "invoke (>=1.3)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["pynacl (>=1.0.1)", "bcrypt (>=3.1.3)"] -gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] - -[[package]] -name = "parsedatetime" -version = "2.6" -description = "Parse human-readable date/time text." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "parso" -version = "0.7.1" -description = "A Python Parser" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -testing = ["docopt", "pytest (>=3.0.7)"] - -[[package]] -name = "pathtools" -version = "0.1.2" -description = "File system general utilities" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pdoc3" -version = "0.6.4" -description = "Auto-generate API documentation for Python projects." -category = "main" -optional = false -python-versions = ">= 3.5" - -[package.dependencies] -mako = "*" -markdown = ">=3.0" - -[[package]] -name = "pillow" -version = "7.2.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "prompt-toolkit" -version = "2.0.10" -description = "Library for building powerful interactive command lines in Python" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[package.dependencies] -six = ">=1.9.0" -wcwidth = "*" - -[[package]] -name = "protobuf" -version = "3.13.0" -description = "Protocol Buffers" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.9" - -[[package]] -name = "psutil" -version = "5.7.2" -description = "Cross-platform lib for process and system monitoring in Python." -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] - -[[package]] -name = "ptpython" -version = "2.0.6" -description = "Python REPL build on top of prompt_toolkit" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -docopt = "*" -jedi = ">=0.9.0" -prompt-toolkit = ">=2.0.8,<2.1.0" -pygments = "*" - -[package.extras] -ptipython = ["ipython"] - -[[package]] -name = "pudb" -version = "2019.2" -description = "A full-screen, console-based Python debugger" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pygments = ">=1.0" -urwid = ">=1.1.1" - -[[package]] -name = "pycountry" -version = "19.8.18" -description = "ISO country, subdivision, language, currency and script definitions and their translations" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pycparser" -version = "2.20" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pycryptodomex" -version = "3.9.8" -description = "Cryptographic library for Python" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pygithub" -version = "1.53" -description = "Use the full Github API v3" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -deprecated = "*" -pyjwt = "*" -requests = ">=2.14.0" - -[package.extras] -integrations = ["cryptography"] - -[[package]] -name = "pygments" -version = "2.7.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pyjwkest" -version = "1.4.2" -description = "Python implementation of JWT, JWE, JWS and JWK" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -future = "*" -pycryptodomex = "*" -requests = "*" -six = "*" - -[[package]] -name = "pyjwt" -version = "1.7.1" -description = "JSON Web Token implementation in Python" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -crypto = ["cryptography (>=1.4)"] -flake8 = ["flake8", "flake8-import-order", "pep8-naming"] -test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"] - -[[package]] -name = "pylzma" -version = "0.5.0" -description = "Python bindings for the LZMA library by Igor Pavlov." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pynacl" -version = "1.3.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -cffi = ">=1.4.1" -six = "*" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"] - -[[package]] -name = "pyopenssl" -version = "19.1.0" -description = "Python wrapper module around the OpenSSL library" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -cryptography = ">=2.8" -six = ">=1.5.2" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pypng" -version = "0.0.20" -description = "Pure Python PNG image encoder/decoder" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyqrcode" -version = "1.2.1" -description = "A QR code generator written purely in Python with SVG, EPS, PNG and terminal output." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -PNG = ["pypng (>=0.0.13)"] - -[[package]] -name = "pyrfc3339" -version = "1.1" -description = "Generate and parse RFC 3339 timestamps" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pytz = "*" - -[[package]] -name = "python-dateutil" -version = "2.8.1" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-digitalocean" -version = "1.15.0" -description = "digitalocean.com API to manage Droplets and Images" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -jsonpickle = "*" -requests = "*" - -[[package]] -name = "python-http-client" -version = "3.3.1" -description = "HTTP REST client, simplified for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "python-taiga" -version = "1.0.0" -description = "Taiga python API" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pyjwkest = ">=1.0" -python-dateutil = ">=2.4" -requests = ">2.11" -six = ">=1.9" - -[[package]] -name = "pytoml" -version = "0.1.21" -description = "A parser for TOML-0.4.0" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pytz" -version = "2020.1" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pywin32" -version = "227" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "5.3.1" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "redis" -version = "3.5.3" -description = "Python client for Redis key-value store" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -hiredis = ["hiredis (>=0.1.3)"] - -[[package]] -name = "requests" -version = "2.24.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -certifi = ">=2017.4.17" -chardet = ">=3.0.2,<4" -cryptography = {version = ">=1.3.4", optional = true, markers = "extra == \"security\""} -idna = ">=2.5,<3" -pyOpenSSL = {version = ">=0.14", optional = true, markers = "extra == \"security\""} -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" - -[package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] - -[[package]] -name = "requests-toolbelt" -version = "0.9.1" -description = "A utility belt for advanced users of python-requests" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "requests-unixsocket" -version = "0.2.0" -description = "Use requests to talk HTTP via a UNIX domain socket" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=1.1" -urllib3 = ">=1.8" - -[[package]] -name = "secretconf" -version = "0.1.2" -description = "manage your secrets and configurations easily" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "sendgrid" -version = "6.4.7" -description = "Twilio SendGrid library for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -python-http-client = ">=3.2.1" -starkbank-ecdsa = ">=1.0.0" - -[[package]] -name = "six" -version = "1.15.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "smmap" -version = "3.0.4" -description = "A pure Python implementation of a sliding window memory map manager" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "starkbank-ecdsa" -version = "1.1.0" -description = "A lightweight and fast pure python ECDSA library" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "stellar-base-sseclient" -version = "0.0.21" -description = "Python client library for reading Server Sent Event streams." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=2.0.0" -six = "*" - -[[package]] -name = "stellar-sdk" -version = "2.4.1" -description = "The Python Stellar SDK library provides APIs to build transactions and connect to Horizon." -category = "main" -optional = false -python-versions = ">=3.6.0" - -[package.dependencies] -aiohttp = ">=3.5.4" -aiohttp-sse-client = ">=0.1.4,<0.2.0" -crc16 = ">=0.1.1,<0.2.0" -mnemonic = "0.19" -pynacl = ">=1.3.0,<1.4.0" -requests = ">=2.22.0" -stellar-base-sseclient = "0.0.21" -toml = ">=0.10.0,<0.11.0" - -[[package]] -name = "terminaltables" -version = "3.1.0" -description = "Generate simple tables in terminals from a nested list of strings." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "toml" -version = "0.10.1" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "typing-extensions" -version = "3.7.4.3" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "urllib3" -version = "1.25.10" -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" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "urwid" -version = "2.1.2" -description = "A full-featured console (xterm et al.) user interface library" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "watchdog" -version = "0.9.0" -description = "Filesystem events monitoring" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -argh = ">=0.24.1" -pathtools = ">=0.1.1" -PyYAML = ">=3.10" - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "websocket-client" -version = "0.57.0" -description = "WebSocket client for Python. hybi13 is supported." -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -six = "*" - -[[package]] -name = "whoosh" -version = "2.7.4" -description = "Fast, pure-Python full text indexing, search, and spell checking library." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "win32-setctime" -version = "1.0.2" -description = "A small Python utility to set file creation time on Windows" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] - -[[package]] -name = "wrapt" -version = "1.12.1" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "yarl" -version = "1.6.0" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} - -[[package]] -name = "zipp" -version = "3.2.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - -[[package]] -name = "zope.component" -version = "4.6.2" -description = "Zope Component Architecture" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -"zope.deferredimport" = ">=4.2.1" -"zope.deprecation" = ">=4.3.0" -"zope.event" = "*" -"zope.hookable" = ">=4.2.0" -"zope.interface" = ">=4.1.0" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface", "zodb"] -mintests = ["zope.configuration", "zope.i18nmessageid", "zope.testing", "zope.testrunner"] -persistentregistry = ["persistent"] -security = ["zope.location", "zope.proxy", "zope.security"] -test = ["zope.configuration", "zope.i18nmessageid", "zope.testing", "zope.testrunner", "persistent", "zope.location", "zope.proxy", "zope.security"] -zcml = ["zope.configuration", "zope.i18nmessageid"] - -[[package]] -name = "zope.deferredimport" -version = "4.3.1" -description = "zope.deferredimport allows you to perform imports names that will only be resolved when used in the code." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -"zope.proxy" = "*" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] -test = ["zope.testrunner"] - -[[package]] -name = "zope.deprecation" -version = "4.4.0" -description = "Zope Deprecation Infrastructure" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -docs = ["sphinx"] -test = ["zope.testrunner"] - -[[package]] -name = "zope.event" -version = "4.5.0" -description = "Very basic event publishing system" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -docs = ["sphinx"] -test = ["zope.testrunner"] - -[[package]] -name = "zope.hookable" -version = "5.0.1" -description = "Zope hookable" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[package.extras] -docs = ["sphinx"] -test = ["zope.testing"] -testing = ["zope.testing", "coverage"] - -[[package]] -name = "zope.interface" -version = "5.1.0" -description = "Interfaces for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] - -[[package]] -name = "zope.proxy" -version = "4.3.5" -description = "Generic Transparent Proxies" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -"zope.interface" = "*" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] -test = ["zope.security", "zope.testrunner"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.6" -content-hash = "bc70df28fd2dc41e24b957d367ae29fe323d2e7630c4d4bb35e3b4e3ee5a7d2a" - -[metadata.files] -acme = [ - {file = "acme-1.8.0-py2.py3-none-any.whl", hash = "sha256:465033830a75f98042236f50f751f6e316735473ccb4edec0c718263f6c9ba8b"}, - {file = "acme-1.8.0.tar.gz", hash = "sha256:ad8d067d14258d73ad2643439d9365913362308c04e66cc3010e39c868c5002d"}, -] -aiohttp = [ - {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, - {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, - {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, - {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, - {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, - {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, - {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, - {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, - {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, - {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, - {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, - {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, -] -aiohttp-sse-client = [ - {file = "aiohttp-sse-client-0.1.7.tar.gz", hash = "sha256:9636d02e0efc9475e46f0bf2df2d35219c7fd1118c7c4812c31474020728d763"}, - {file = "aiohttp_sse_client-0.1.7-py2.py3-none-any.whl", hash = "sha256:90704f9c7f28447b61687ab2df2340c38cfa5549ecf51c620fddf0a39fbf37ef"}, -] -argh = [ - {file = "argh-0.26.2-py2.py3-none-any.whl", hash = "sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3"}, - {file = "argh-0.26.2.tar.gz", hash = "sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"}, -] -arrow = [ - {file = "arrow-0.15.8-py2.py3-none-any.whl", hash = "sha256:271b8e05174d48e50324ed0dc5d74796c839c7e579a4f21cf1a7394665f9e94f"}, - {file = "arrow-0.15.8.tar.gz", hash = "sha256:edc31dc051db12c95da9bac0271cd1027b8e36912daf6d4580af53b23e62721a"}, -] -async-timeout = [ - {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, - {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, -] -attrs = [ - {file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"}, - {file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"}, -] -base58 = [ - {file = "base58-2.0.1-py3-none-any.whl", hash = "sha256:447adc750d6b642987ffc6d397ecd15a799852d5f6a1d308d384500243825058"}, - {file = "base58-2.0.1.tar.gz", hash = "sha256:365c9561d9babac1b5f18ee797508cd54937a724b6e419a130abad69cec5ca79"}, -] -bcrypt = [ - {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, - {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, - {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, - {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, -] -beaker = [ - {file = "Beaker-1.11.0.tar.gz", hash = "sha256:ad5d1c05027ee3be3a482ea39f8cb70339b41e5d6ace0cb861382754076d187e"}, -] -better-exceptions = [ - {file = "better_exceptions-0.2.2-py3-none-any.whl", hash = "sha256:bf79c87659bc849989d726bf0e4a2100edefe7eded112d201f54fe08467fdf63"}, - {file = "better_exceptions-0.2.2.tar.gz", hash = "sha256:c196cad849de615abb9f6eb67ca1b83f33b938818f0e2fe8fa157b22aeb7b992"}, -] -bottle = [ - {file = "bottle-0.12.18-py3-none-any.whl", hash = "sha256:43157254e88f32c6be16f8d9eb1f1d1472396a4e174ebd2bf62544854ecf37e7"}, - {file = "bottle-0.12.18.tar.gz", hash = "sha256:0819b74b145a7def225c0e83b16a4d5711fde751cd92bae467a69efce720f69e"}, -] -captcha = [ - {file = "captcha-0.3-py3-none-any.whl", hash = "sha256:1671f194da3b535fc12f6b0eb349195c7b28a6641381b2c07e31d04aa92fb6fc"}, - {file = "captcha-0.3.tar.gz", hash = "sha256:a6b28a120de0a37c44415e70225978e36b2645940133f2474c7a109b2d4683e2"}, -] -certbot = [ - {file = "certbot-1.8.0-py2.py3-none-any.whl", hash = "sha256:4bde86c53e30dc5bc0e78a0862045b053971703af727ac20c6a7da06596c7549"}, - {file = "certbot-1.8.0.tar.gz", hash = "sha256:4837c516af6543ccd10d70f1498a2113bbdf9ef9a05d3a18b1558b291a2953e4"}, -] -certbot-nginx = [ - {file = "certbot-nginx-1.5.0.tar.gz", hash = "sha256:b38f101588af6d2b8ea7c2e3334f249afbe14461a85add2f1420091d860df983"}, - {file = "certbot_nginx-1.5.0-py2.py3-none-any.whl", hash = "sha256:3d27fd02ebe15b07ce5fa9525ceeda82aa5fdc45aa064729434faff0442d1f91"}, -] -certifi = [ - {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"}, - {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"}, -] -cffi = [ - {file = "cffi-1.14.3-2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc"}, - {file = "cffi-1.14.3-2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768"}, - {file = "cffi-1.14.3-2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d"}, - {file = "cffi-1.14.3-2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1"}, - {file = "cffi-1.14.3-2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca"}, - {file = "cffi-1.14.3-2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a"}, - {file = "cffi-1.14.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c"}, - {file = "cffi-1.14.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730"}, - {file = "cffi-1.14.3-cp27-cp27m-win32.whl", hash = "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d"}, - {file = "cffi-1.14.3-cp27-cp27m-win_amd64.whl", hash = "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05"}, - {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b"}, - {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171"}, - {file = "cffi-1.14.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f"}, - {file = "cffi-1.14.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4"}, - {file = "cffi-1.14.3-cp35-cp35m-win32.whl", hash = "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d"}, - {file = "cffi-1.14.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537"}, - {file = "cffi-1.14.3-cp36-cp36m-win32.whl", hash = "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0"}, - {file = "cffi-1.14.3-cp36-cp36m-win_amd64.whl", hash = "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394"}, - {file = "cffi-1.14.3-cp37-cp37m-win32.whl", hash = "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc"}, - {file = "cffi-1.14.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9"}, - {file = "cffi-1.14.3-cp38-cp38-win32.whl", hash = "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522"}, - {file = "cffi-1.14.3-cp38-cp38-win_amd64.whl", hash = "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15"}, - {file = "cffi-1.14.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d"}, - {file = "cffi-1.14.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c"}, - {file = "cffi-1.14.3-cp39-cp39-win32.whl", hash = "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b"}, - {file = "cffi-1.14.3-cp39-cp39-win_amd64.whl", hash = "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3"}, - {file = "cffi-1.14.3.tar.gz", hash = "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591"}, -] -chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -colorama = [ - {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, - {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, -] -configargparse = [ - {file = "ConfigArgParse-1.2.3.tar.gz", hash = "sha256:edd17be986d5c1ba2e307150b8e5f5107aba125f3574dddd02c85d5cdcfd37dc"}, -] -configobj = [ - {file = "configobj-5.0.6.tar.gz", hash = "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"}, -] -crc16 = [ - {file = "crc16-0.1.1.tar.gz", hash = "sha256:c1f86aa0390f4baf07d2631b16b979580eae1d9a973a826ce45353a22ee8d396"}, - {file = "crc16-0.1.1.win32-py2.6.exe", hash = "sha256:eb47b9cec9818b684537d05552ff10404c92d9dcdd455156456b19e7423855bc"}, - {file = "crc16-0.1.1.win32-py2.7.exe", hash = "sha256:7998bb0cacb0005ba62f963540c0f7cb09e86b51f6b4e64ed5632f31a7266fa1"}, - {file = "crc16-0.1.1.win32-py3.1.exe", hash = "sha256:1439e3cc0244a4758aa2d40a31b062086c24f5602046ec2fa4356484c4b5a385"}, - {file = "crc16-0.1.1.win32-py3.2.exe", hash = "sha256:521643768ff000a7758bc1f1c5e1dc41ae64b42fa57c50e133ab083cfaf9b8f9"}, - {file = "crc16-0.1.1.win32-py3.3.exe", hash = "sha256:63db8577ce0e03b39f30071166c6667659124a65d7fcd38adffe6a34487ce6fb"}, - {file = "crc16-0.1.1.zip", hash = "sha256:1b9f697a93491ae42ed653c1e78ea25a33532afab87b513e6890975450271a01"}, -] -cryptocompare = [ - {file = "cryptocompare-0.6.6.tar.gz", hash = "sha256:981af570523ceddbd67258053340ff66048df200a070c953ad20ef08334be0da"}, -] -cryptography = [ - {file = "cryptography-3.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ab49edd5bea8d8b39a44b3db618e4783ef84c19c8b47286bf05dfdb3efb01c83"}, - {file = "cryptography-3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:124af7255ffc8e964d9ff26971b3a6153e1a8a220b9a685dc407976ecb27a06a"}, - {file = "cryptography-3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:51e40123083d2f946794f9fe4adeeee2922b581fa3602128ce85ff813d85b81f"}, - {file = "cryptography-3.0-cp27-cp27m-win32.whl", hash = "sha256:dea0ba7fe6f9461d244679efa968d215ea1f989b9c1957d7f10c21e5c7c09ad6"}, - {file = "cryptography-3.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8ecf9400d0893836ff41b6f977a33972145a855b6efeb605b49ee273c5e6469f"}, - {file = "cryptography-3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c608ff4d4adad9e39b5057de43657515c7da1ccb1807c3a27d4cf31fc923b4b"}, - {file = "cryptography-3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bec7568c6970b865f2bcebbe84d547c52bb2abadf74cefce396ba07571109c67"}, - {file = "cryptography-3.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0cbfed8ea74631fe4de00630f4bb592dad564d57f73150d6f6796a24e76c76cd"}, - {file = "cryptography-3.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a09fd9c1cca9a46b6ad4bea0a1f86ab1de3c0c932364dbcf9a6c2a5eeb44fa77"}, - {file = "cryptography-3.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ce82cc06588e5cbc2a7df3c8a9c778f2cb722f56835a23a68b5a7264726bb00c"}, - {file = "cryptography-3.0-cp35-cp35m-win32.whl", hash = "sha256:9367d00e14dee8d02134c6c9524bb4bd39d4c162456343d07191e2a0b5ec8b3b"}, - {file = "cryptography-3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:384d7c681b1ab904fff3400a6909261cae1d0939cc483a68bdedab282fb89a07"}, - {file = "cryptography-3.0-cp36-cp36m-win32.whl", hash = "sha256:4d355f2aee4a29063c10164b032d9fa8a82e2c30768737a2fd56d256146ad559"}, - {file = "cryptography-3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:45741f5499150593178fc98d2c1a9c6722df88b99c821ad6ae298eff0ba1ae71"}, - {file = "cryptography-3.0-cp37-cp37m-win32.whl", hash = "sha256:8ecef21ac982aa78309bb6f092d1677812927e8b5ef204a10c326fc29f1367e2"}, - {file = "cryptography-3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4b9303507254ccb1181d1803a2080a798910ba89b1a3c9f53639885c90f7a756"}, - {file = "cryptography-3.0-cp38-cp38-win32.whl", hash = "sha256:8713ddb888119b0d2a1462357d5946b8911be01ddbf31451e1d07eaa5077a261"}, - {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, - {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, -] -deprecated = [ - {file = "Deprecated-1.2.10-py2.py3-none-any.whl", hash = "sha256:a766c1dccb30c5f6eb2b203f87edd1d8588847709c78589e1521d769addc8218"}, - {file = "Deprecated-1.2.10.tar.gz", hash = "sha256:525ba66fb5f90b07169fdd48b6373c18f1ee12728ca277ca44567a367d9d7f74"}, -] -dill = [ - {file = "dill-0.3.2.zip", hash = "sha256:6e12da0d8e49c220e8d6e97ee8882002e624f1160289ce85ec2cc0a5246b3a2e"}, -] -distro = [ - {file = "distro-1.5.0-py2.py3-none-any.whl", hash = "sha256:df74eed763e18d10d0da624258524ae80486432cd17392d9c3d96f5e83cd2799"}, - {file = "distro-1.5.0.tar.gz", hash = "sha256:0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92"}, -] -dnspython = [ - {file = "dnspython-1.16.0-py2.py3-none-any.whl", hash = "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"}, - {file = "dnspython-1.16.0.zip", hash = "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01"}, -] -docker = [ - {file = "docker-4.3.1-py2.py3-none-any.whl", hash = "sha256:13966471e8bc23b36bfb3a6fb4ab75043a5ef1dac86516274777576bed3b9828"}, - {file = "docker-4.3.1.tar.gz", hash = "sha256:bad94b8dd001a8a4af19ce4becc17f41b09f228173ffe6a4e0355389eef142f2"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -fabric = [ - {file = "fabric-2.5.0-py2.py3-none-any.whl", hash = "sha256:160331934ea60036604928e792fa8e9f813266b098ef5562aa82b88527740389"}, - {file = "fabric-2.5.0.tar.gz", hash = "sha256:24842d7d51556adcabd885ac3cf5e1df73fc622a1708bf3667bf5927576cdfa6"}, -] -faker = [ - {file = "Faker-2.0.5-py2.py3-none-any.whl", hash = "sha256:c1d19f8c63487b4711189403f5c2e06af1dd8b5be7928f6547f5f7cddd13d917"}, - {file = "Faker-2.0.5.tar.gz", hash = "sha256:29093e61f12745150774fd05ab499e87252a4fa51ed51e45c40179e854f87925"}, -] -funcsigs = [ - {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, - {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"}, -] -future = [ - {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, -] -gevent = [ - {file = "gevent-1.4.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b7d3a285978b27b469c0ff5fb5a72bcd69f4306dbbf22d7997d83209a8ba917"}, - {file = "gevent-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:44089ed06a962a3a70e96353c981d628b2d4a2f2a75ea5d90f916a62d22af2e8"}, - {file = "gevent-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:0e1e5b73a445fe82d40907322e1e0eec6a6745ca3cea19291c6f9f50117bb7ea"}, - {file = "gevent-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:74b7528f901f39c39cdbb50cdf08f1a2351725d9aebaef212a29abfbb06895ee"}, - {file = "gevent-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0ff2b70e8e338cf13bedf146b8c29d475e2a544b5d1fe14045aee827c073842c"}, - {file = "gevent-1.4.0-cp34-cp34m-macosx_10_14_x86_64.whl", hash = "sha256:0774babec518a24d9a7231d4e689931f31b332c4517a771e532002614e270a64"}, - {file = "gevent-1.4.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d752bcf1b98174780e2317ada12013d612f05116456133a6acf3e17d43b71f05"}, - {file = "gevent-1.4.0-cp34-cp34m-win32.whl", hash = "sha256:3249011d13d0c63bea72d91cec23a9cf18c25f91d1f115121e5c9113d753fa12"}, - {file = "gevent-1.4.0-cp34-cp34m-win_amd64.whl", hash = "sha256:d1e6d1f156e999edab069d79d890859806b555ce4e4da5b6418616322f0a3df1"}, - {file = "gevent-1.4.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7d0809e2991c9784eceeadef01c27ee6a33ca09ebba6154317a257353e3af922"}, - {file = "gevent-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:14b4d06d19d39a440e72253f77067d27209c67e7611e352f79fe69e0f618f76e"}, - {file = "gevent-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:53b72385857e04e7faca13c613c07cab411480822ac658d97fd8a4ddbaf715c8"}, - {file = "gevent-1.4.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:8d9ec51cc06580f8c21b41fd3f2b3465197ba5b23c00eb7d422b7ae0380510b0"}, - {file = "gevent-1.4.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2711e69788ddb34c059a30186e05c55a6b611cb9e34ac343e69cf3264d42fe1c"}, - {file = "gevent-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:e5bcc4270671936349249d26140c267397b7b4b1381f5ec8b13c53c5b53ab6e1"}, - {file = "gevent-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9f7a1e96fec45f70ad364e46de32ccacab4d80de238bd3c2edd036867ccd48ad"}, - {file = "gevent-1.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:50024a1ee2cf04645535c5ebaeaa0a60c5ef32e262da981f4be0546b26791950"}, - {file = "gevent-1.4.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4bfa291e3c931ff3c99a349d8857605dca029de61d74c6bb82bd46373959c942"}, - {file = "gevent-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:ab4dc33ef0e26dc627559786a4fba0c2227f125db85d970abbf85b77506b3f51"}, - {file = "gevent-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:896b2b80931d6b13b5d9feba3d4eebc67d5e6ec54f0cf3339d08487d55d93b0e"}, - {file = "gevent-1.4.0-pp260-pypy_41-macosx_10_14_x86_64.whl", hash = "sha256:107f4232db2172f7e8429ed7779c10f2ed16616d75ffbe77e0e0c3fcdeb51a51"}, - {file = "gevent-1.4.0-pp260-pypy_41-win32.whl", hash = "sha256:28a0c5417b464562ab9842dd1fb0cc1524e60494641d973206ec24d6ec5f6909"}, - {file = "gevent-1.4.0.tar.gz", hash = "sha256:1eb7fa3b9bd9174dfe9c3b59b7a09b768ecd496debfc4976a9530a3e15c990d1"}, -] -gitdb = [ - {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, - {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, -] -gitpython = [ - {file = "GitPython-3.1.8-py3-none-any.whl", hash = "sha256:1858f4fd089abe92ae465f01d5aaaf55e937eca565fb2c1fce35a51b5f85c910"}, - {file = "GitPython-3.1.8.tar.gz", hash = "sha256:080bf8e2cf1a2b907634761c2eaefbe83b69930c94c66ad11b65a8252959f912"}, -] -greenlet = [ - {file = "greenlet-0.4.16-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:80cb0380838bf4e48da6adedb0c7cd060c187bb4a75f67a5aa9ec33689b84872"}, - {file = "greenlet-0.4.16-cp27-cp27m-win32.whl", hash = "sha256:df7de669cbf21de4b04a3ffc9920bc8426cab4c61365fa84d79bf97401a8bef7"}, - {file = "greenlet-0.4.16-cp27-cp27m-win_amd64.whl", hash = "sha256:1429dc183b36ec972055e13250d96e174491559433eb3061691b446899b87384"}, - {file = "greenlet-0.4.16-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5ea034d040e6ab1d2ae04ab05a3f37dbd719c4dee3804b13903d4cc794b1336e"}, - {file = "greenlet-0.4.16-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c196a5394c56352e21cb7224739c6dd0075b69dd56f758505951d1d8d68cf8a9"}, - {file = "greenlet-0.4.16-cp35-cp35m-win32.whl", hash = "sha256:1000038ba0ea9032948e2156a9c15f5686f36945e8f9906e6b8db49f358e7b52"}, - {file = "greenlet-0.4.16-cp35-cp35m-win_amd64.whl", hash = "sha256:1b805231bfb7b2900a16638c3c8b45c694334c811f84463e52451e00c9412691"}, - {file = "greenlet-0.4.16-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e5db19d4a7d41bbeb3dd89b49fc1bc7e6e515b51bbf32589c618655a0ebe0bf0"}, - {file = "greenlet-0.4.16-cp36-cp36m-win32.whl", hash = "sha256:eac2a3f659d5f41d6bbfb6a97733bc7800ea5e906dc873732e00cebb98cec9e4"}, - {file = "greenlet-0.4.16-cp36-cp36m-win_amd64.whl", hash = "sha256:7eed31f4efc8356e200568ba05ad645525f1fbd8674f1e5be61a493e715e3873"}, - {file = "greenlet-0.4.16-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:682328aa576ec393c1872615bcb877cf32d800d4a2f150e1a5dc7e56644010b1"}, - {file = "greenlet-0.4.16-cp37-cp37m-win32.whl", hash = "sha256:3a35e33902b2e6079949feed7a2dafa5ac6f019da97bd255842bb22de3c11bf5"}, - {file = "greenlet-0.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b2a984bbfc543d144d88caad6cc7ff4a71be77102014bd617bd88cfb038727"}, - {file = "greenlet-0.4.16-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d83c1d38658b0f81c282b41238092ed89d8f93c6e342224ab73fb39e16848721"}, - {file = "greenlet-0.4.16-cp38-cp38-win32.whl", hash = "sha256:e695ac8c3efe124d998230b219eb51afb6ef10524a50b3c45109c4b77a8a3a92"}, - {file = "greenlet-0.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:133ba06bad4e5f2f8bf6a0ac434e0fd686df749a86b3478903b92ec3a9c0c90b"}, - {file = "greenlet-0.4.16.tar.gz", hash = "sha256:6e06eac722676797e8fce4adb8ad3dc57a1bb3adfb0dd3fdf8306c055a38456c"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -idna-ssl = [ - {file = "idna-ssl-1.1.0.tar.gz", hash = "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"}, -] -importlib-metadata = [ - {file = "importlib_metadata-2.0.0-py2.py3-none-any.whl", hash = "sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3"}, - {file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"}, -] -importlib-resources = [ - {file = "importlib_resources-3.0.0-py2.py3-none-any.whl", hash = "sha256:d028f66b66c0d5732dae86ba4276999855e162a749c92620a38c1d779ed138a7"}, - {file = "importlib_resources-3.0.0.tar.gz", hash = "sha256:19f745a6eca188b490b1428c8d1d4a0d2368759f32370ea8fb89cad2ab1106c3"}, -] -invoke = [ - {file = "invoke-1.4.1-py2-none-any.whl", hash = "sha256:93e12876d88130c8e0d7fd6618dd5387d6b36da55ad541481dfa5e001656f134"}, - {file = "invoke-1.4.1-py3-none-any.whl", hash = "sha256:87b3ef9d72a1667e104f89b159eaf8a514dbf2f3576885b2bbdefe74c3fb2132"}, - {file = "invoke-1.4.1.tar.gz", hash = "sha256:de3f23bfe669e3db1085789fd859eb8ca8e0c5d9c20811e2407fa042e8a5e15d"}, -] -jedi = [ - {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, - {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, -] -jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, -] -josepy = [ - {file = "josepy-1.4.0-py2.py3-none-any.whl", hash = "sha256:42c5900b0627573facede884d309369ed9f2e8e8119b13e32f5114e23fed73e6"}, - {file = "josepy-1.4.0.tar.gz", hash = "sha256:c37ff4b93606e6a452b72cdb992da5e0544be12912fac01b31ddbdd61f6d5bd0"}, -] -js-ng = [ - {file = "js-ng-11.0b10.tar.gz", hash = "sha256:d90c47a13607742accb33dd97c0c7c2e8ca07fc1f20a75b7ff267b12b4210bde"}, - {file = "js_ng-11.0b10-py3-none-any.whl", hash = "sha256:4e88b2e4cb3e651aac6160b0ee5aa9bd609e988a68ca4b9c7f7d8a59c5be6979"}, -] -jsonpickle = [ - {file = "jsonpickle-1.4.1-py2.py3-none-any.whl", hash = "sha256:8919c166bac0574e3d74425c7559434062002d9dfc0ac2afa6dc746ba4a19439"}, - {file = "jsonpickle-1.4.1.tar.gz", hash = "sha256:e8d4b7cd0bd6826001a74377df1079a76ad8bae0f909282de2554164c837c8ba"}, -] -libtmux = [ - {file = "libtmux-0.8.3-py2.py3-none-any.whl", hash = "sha256:b628121f6db98e34837f78e06aa4388c1a0c53518b2336f437b023bd95798c09"}, - {file = "libtmux-0.8.3.tar.gz", hash = "sha256:a4c7379604ccdc684aa865723211184709f9a2b45511772989b5f26ad156650e"}, -] -loguru = [ - {file = "loguru-0.3.2-py3-none-any.whl", hash = "sha256:b6fad0d7aed357b5c147edcc6982606b933754338950b72d8123f48c150c5a4f"}, - {file = "loguru-0.3.2.tar.gz", hash = "sha256:e3138bfdee5f57481a2a6e078714be20f8c71ab1ff3f07f8fb1cfa25191fed2a"}, -] -mako = [ - {file = "Mako-1.1.3-py2.py3-none-any.whl", hash = "sha256:93729a258e4ff0747c876bd9e20df1b9758028946e976324ccd2d68245c7b6a9"}, - {file = "Mako-1.1.3.tar.gz", hash = "sha256:8195c8c1400ceb53496064314c6736719c6f25e7479cd24c77be3d9361cddc27"}, -] -markdown = [ - {file = "Markdown-3.2.2-py3-none-any.whl", hash = "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59"}, - {file = "Markdown-3.2.2.tar.gz", hash = "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17"}, -] -markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, -] -minio = [ - {file = "minio-4.0.21-py2.py3-none-any.whl", hash = "sha256:766c1f2eb1a6f0d1d5fd9dd3660a1246dee9f03e58c0f83903e448d116734499"}, - {file = "minio-4.0.21-py3.5.egg", hash = "sha256:c54f1f27fc821bcc949762b86a44c99bb2c873b54062a5db64b2b1665e5f3b7e"}, - {file = "minio-4.0.21.tar.gz", hash = "sha256:35643f056b4d12e053fa7d8f40d98394ed7cc4d5d44ba53c9971e7428fd58e60"}, -] -mnemonic = [ - {file = "mnemonic-0.19-py2.py3-none-any.whl", hash = "sha256:a8d78c5100acfa7df9bab6b9db7390831b0e54490934b718ff9efd68f0d731a6"}, - {file = "mnemonic-0.19.tar.gz", hash = "sha256:4e37eb02b2cbd56a0079cabe58a6da93e60e3e4d6e757a586d9f23d96abea931"}, -] -msgpack = [ - {file = "msgpack-0.6.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:774f5edc3475917cd95fe593e625d23d8580f9b48b570d8853d06cac171cd170"}, - {file = "msgpack-0.6.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a06efd0482a1942aad209a6c18321b5e22d64eb531ea20af138b28172d8f35ba"}, - {file = "msgpack-0.6.2-cp27-cp27m-win32.whl", hash = "sha256:8a3ada8401736df2bf497f65589293a86c56e197a80ae7634ec2c3150a2f5082"}, - {file = "msgpack-0.6.2-cp27-cp27m-win_amd64.whl", hash = "sha256:b8b4bd3dafc7b92608ae5462add1c8cc881851c2d4f5d8977fdea5b081d17f21"}, - {file = "msgpack-0.6.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:24149a75643aeaa81ece4259084d11b792308a6cf74e796cbb35def94c89a25a"}, - {file = "msgpack-0.6.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:757bd71a9b89e4f1db0622af4436d403e742506dbea978eba566815dc65ec895"}, - {file = "msgpack-0.6.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:32fea0ea3cd1ef820286863a6202dcfd62a539b8ec3edcbdff76068a8c2cc6ce"}, - {file = "msgpack-0.6.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:db7ff14abc73577b0bcbcf73ecff97d3580ecaa0fc8724babce21fdf3fe08ef6"}, - {file = "msgpack-0.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:187794cd1eb73acccd528247e3565f6760bd842d7dc299241f830024a7dd5610"}, - {file = "msgpack-0.6.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:b24afc52e18dccc8c175de07c1d680bdf315844566f4952b5bedb908894bec79"}, - {file = "msgpack-0.6.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:355f7fd0f90134229eaeefaee3cf42e0afc8518e8f3cd4b25f541a7104dcb8f9"}, - {file = "msgpack-0.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:76df51492bc6fa6cc8b65d09efdb67cbba3cbfe55004c3afc81352af92b4a43c"}, - {file = "msgpack-0.6.2-cp36-cp36m-win32.whl", hash = "sha256:f0f47bafe9c9b8ed03e19a100a743662dd8c6d0135e684feea720a0d0046d116"}, - {file = "msgpack-0.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:c6e5024fc0cdf7f83b6624850309ddd7e06c48a75fa0d1c5173de4d93300eb19"}, - {file = "msgpack-0.6.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:30b88c47e0cdb6062daed88ca283b0d84fa0d2ad6c273aa0788152a1c643e408"}, - {file = "msgpack-0.6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:229a0ccdc39e9b6c6d1033cd8aecd9c296823b6c87f0de3943c59b8bc7c64bee"}, - {file = "msgpack-0.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4abdb88a9b67e64810fb54b0c24a1fd76b12297b4f7a1467d85a14dd8367191a"}, - {file = "msgpack-0.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dedf54d72d9e7b6d043c244c8213fe2b8bbfe66874b9a65b39c4cc892dd99dd4"}, - {file = "msgpack-0.6.2-cp37-cp37m-win32.whl", hash = "sha256:0cc7ca04e575ba34fea7cfcd76039f55def570e6950e4155a4174368142c8e1b"}, - {file = "msgpack-0.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:1904b7cb65342d0998b75908304a03cb004c63ef31e16c8c43fee6b989d7f0d7"}, - {file = "msgpack-0.6.2.tar.gz", hash = "sha256:ea3c2f859346fcd55fc46e96885301d9c2f7a36d453f5d8f2967840efa1e1830"}, -] -multidict = [ - {file = "multidict-4.7.6-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000"}, - {file = "multidict-4.7.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a"}, - {file = "multidict-4.7.6-cp35-cp35m-win32.whl", hash = "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5"}, - {file = "multidict-4.7.6-cp35-cp35m-win_amd64.whl", hash = "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3"}, - {file = "multidict-4.7.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87"}, - {file = "multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2"}, - {file = "multidict-4.7.6-cp36-cp36m-win32.whl", hash = "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7"}, - {file = "multidict-4.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463"}, - {file = "multidict-4.7.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"}, - {file = "multidict-4.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255"}, - {file = "multidict-4.7.6-cp37-cp37m-win32.whl", hash = "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507"}, - {file = "multidict-4.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c"}, - {file = "multidict-4.7.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b"}, - {file = "multidict-4.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7"}, - {file = "multidict-4.7.6-cp38-cp38-win32.whl", hash = "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d"}, - {file = "multidict-4.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19"}, - {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, -] -netaddr = [ - {file = "netaddr-0.7.20-py2.py3-none-any.whl", hash = "sha256:7a9c8f58d048b820df1882439bb04fb2de13c03ec8af3112a1099822b0a2a4b8"}, - {file = "netaddr-0.7.20.tar.gz", hash = "sha256:d09252e5aec3913815d77eb8e8ea8fa6eb33521253e52f977f6abaa964776f3e"}, -] -paramiko = [ - {file = "paramiko-2.7.2-py2.py3-none-any.whl", hash = "sha256:4f3e316fef2ac628b05097a637af35685183111d4bc1b5979bd397c2ab7b5898"}, - {file = "paramiko-2.7.2.tar.gz", hash = "sha256:7f36f4ba2c0d81d219f4595e35f70d56cc94f9ac40a6acdf51d6ca210ce65035"}, -] -parsedatetime = [ - {file = "parsedatetime-2.6-py3-none-any.whl", hash = "sha256:cb96edd7016872f58479e35879294258c71437195760746faffedb692aef000b"}, - {file = "parsedatetime-2.6.tar.gz", hash = "sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455"}, -] -parso = [ - {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, - {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, -] -pathtools = [ - {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"}, -] -pdoc3 = [ - {file = "pdoc3-0.6.4.tar.gz", hash = "sha256:85cbb0de17d1306157d19b08b67ad84817098c12ad9f92ec203b79d0307b6a25"}, -] -pillow = [ - {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"}, - {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"}, - {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"}, - {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"}, - {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"}, - {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"}, - {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"}, - {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"}, - {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"}, - {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"}, - {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"}, - {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"}, - {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"}, - {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"}, - {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"}, - {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"}, - {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"}, - {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"}, - {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"}, - {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"}, - {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"}, - {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, - {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, - {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, - {file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"}, - {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, - {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, - {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-2.0.10-py2-none-any.whl", hash = "sha256:e7f8af9e3d70f514373bf41aa51bc33af12a6db3f71461ea47fea985defb2c31"}, - {file = "prompt_toolkit-2.0.10-py3-none-any.whl", hash = "sha256:46642344ce457641f28fc9d1c9ca939b63dadf8df128b86f1b9860e59c73a5e4"}, - {file = "prompt_toolkit-2.0.10.tar.gz", hash = "sha256:f15af68f66e664eaa559d4ac8a928111eebd5feda0c11738b5998045224829db"}, -] -protobuf = [ - {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, - {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, - {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, - {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, - {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, - {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, - {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, - {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, - {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, - {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, - {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, - {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, - {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, - {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, - {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, - {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, - {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, - {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, -] -psutil = [ - {file = "psutil-5.7.2-cp27-none-win32.whl", hash = "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2"}, - {file = "psutil-5.7.2-cp27-none-win_amd64.whl", hash = "sha256:66c18ca7680a31bf16ee22b1d21b6397869dda8059dbdb57d9f27efa6615f195"}, - {file = "psutil-5.7.2-cp35-cp35m-win32.whl", hash = "sha256:5e9d0f26d4194479a13d5f4b3798260c20cecf9ac9a461e718eb59ea520a360c"}, - {file = "psutil-5.7.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4080869ed93cce662905b029a1770fe89c98787e543fa7347f075ade761b19d6"}, - {file = "psutil-5.7.2-cp36-cp36m-win32.whl", hash = "sha256:d8a82162f23c53b8525cf5f14a355f5d1eea86fa8edde27287dd3a98399e4fdf"}, - {file = "psutil-5.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0ee3c36428f160d2d8fce3c583a0353e848abb7de9732c50cf3356dd49ad63f8"}, - {file = "psutil-5.7.2-cp37-cp37m-win32.whl", hash = "sha256:ff1977ba1a5f71f89166d5145c3da1cea89a0fdb044075a12c720ee9123ec818"}, - {file = "psutil-5.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a5b120bb3c0c71dfe27551f9da2f3209a8257a178ed6c628a819037a8df487f1"}, - {file = "psutil-5.7.2-cp38-cp38-win32.whl", hash = "sha256:10512b46c95b02842c225f58fa00385c08fa00c68bac7da2d9a58ebe2c517498"}, - {file = "psutil-5.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:68d36986ded5dac7c2dcd42f2682af1db80d4bce3faa126a6145c1637e1b559f"}, - {file = "psutil-5.7.2.tar.gz", hash = "sha256:90990af1c3c67195c44c9a889184f84f5b2320dce3ee3acbd054e3ba0b4a7beb"}, -] -ptpython = [ - {file = "ptpython-2.0.6-py2.py3-none-any.whl", hash = "sha256:0977f56c934789d9955839ef71268148858f826fda49b267cb377ac7501a897b"}, - {file = "ptpython-2.0.6.tar.gz", hash = "sha256:90e24040e82de4abae0bbe6e352d59ae6657e14e1154e742c0038679361b052f"}, -] -pudb = [ - {file = "pudb-2019.2.tar.gz", hash = "sha256:e8f0ea01b134d802872184b05bffc82af29a1eb2f9374a277434b932d68f58dc"}, -] -pycountry = [ - {file = "pycountry-19.8.18.tar.gz", hash = "sha256:3c57aa40adcf293d59bebaffbe60d8c39976fba78d846a018dc0c2ec9c6cb3cb"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pycryptodomex = [ - {file = "pycryptodomex-3.9.8-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:c0d085c8187a1e4d3402f626c9e438b5861151ab132d8761d9c5ce6491a87761"}, - {file = "pycryptodomex-3.9.8-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1714675fb4ac29a26ced38ca22eb8ffd923ac851b7a6140563863194d7158422"}, - {file = "pycryptodomex-3.9.8-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c990f2c58f7c67688e9e86e6557ed05952669ff6f1343e77b459007d85f7df00"}, - {file = "pycryptodomex-3.9.8-cp27-cp27m-win32.whl", hash = "sha256:9fd758e5e2fe02d57860b85da34a1a1e7037155c4eadc2326fc7af02f9cae214"}, - {file = "pycryptodomex-3.9.8-cp27-cp27m-win_amd64.whl", hash = "sha256:b2d756620078570d3f940c84bc94dd30aa362b795cce8b2723300a8800b87f1c"}, - {file = "pycryptodomex-3.9.8-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:2710fc8d83b3352b370db932b3710033b9d630b970ff5aaa3e7458b5336e3b32"}, - {file = "pycryptodomex-3.9.8-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:2199708ebeed4b82eb45b10e1754292677f5a0df7d627ee91ea01290b9bab7e6"}, - {file = "pycryptodomex-3.9.8-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:8044eae59301dd392fbb4a7c5d64e1aea8ef0be2540549807ecbe703d6233d68"}, - {file = "pycryptodomex-3.9.8-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:06f5a458624c9b0e04c0086c7f84bcc578567dab0ddc816e0476b3057b18339f"}, - {file = "pycryptodomex-3.9.8-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:ccbbec59bf4b74226170c54476da5780c9176bae084878fc94d9a2c841218e34"}, - {file = "pycryptodomex-3.9.8-cp35-cp35m-win32.whl", hash = "sha256:e4e1c486bf226822c8dceac81d0ec59c0a2399dbd1b9e04f03c3efa3605db677"}, - {file = "pycryptodomex-3.9.8-cp35-cp35m-win_amd64.whl", hash = "sha256:2275a663c9e744ee4eace816ef2d446b3060554c5773a92fbc79b05bf47debda"}, - {file = "pycryptodomex-3.9.8-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:93a75d1acd54efed314b82c952b39eac96ce98d241ad7431547442e5c56138aa"}, - {file = "pycryptodomex-3.9.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e42860fbe1292668b682f6dabd225fbe2a7a4fa1632f0c39881c019e93dea594"}, - {file = "pycryptodomex-3.9.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f60b3484ce4be04f5da3777c51c5140d3fe21cdd6674f2b6568f41c8130bcdeb"}, - {file = "pycryptodomex-3.9.8-cp36-cp36m-win32.whl", hash = "sha256:a2ee8ba99d33e1a434fcd27d7d0aa7964163efeee0730fe2efc9d60edae1fc71"}, - {file = "pycryptodomex-3.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:58e19560814dabf5d788b95a13f6b98279cf41a49b1e49ee6cf6c79a57adb4c9"}, - {file = "pycryptodomex-3.9.8-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:a2bc4e1a2e6ca3a18b2e0be6131a23af76fecb37990c159df6edc7da6df913e3"}, - {file = "pycryptodomex-3.9.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4e0b27697fa1621c6d3d3b4edeec723c2e841285de6a8d378c1962da77b349be"}, - {file = "pycryptodomex-3.9.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3caa32cf807422adf33c10c88c22e9e2e08b9d9d042f12e1e25fe23113dd618f"}, - {file = "pycryptodomex-3.9.8-cp37-cp37m-win32.whl", hash = "sha256:89be1bf55e50116fe7e493a7c0c483099770dd7f81b87ac8d04a43b1a203e259"}, - {file = "pycryptodomex-3.9.8-cp37-cp37m-win_amd64.whl", hash = "sha256:17272d06e4b2f6455ee2cbe93e8eb50d9450a5dc6223d06862ee1ea5d1235861"}, - {file = "pycryptodomex-3.9.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea4d4b58f9bc34e224ef4b4604a6be03d72ef1f8c486391f970205f6733dbc46"}, - {file = "pycryptodomex-3.9.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8fcdda24dddf47f716400d54fc7f75cadaaba1dd47cc127e59d752c9c0fc3c48"}, - {file = "pycryptodomex-3.9.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:4ae6379350a09339109e9b6f419bb2c3f03d3e441f4b0f5b8ca699d47cc9ff7e"}, - {file = "pycryptodomex-3.9.8-cp38-cp38-win32.whl", hash = "sha256:dc2bed32c7b138f1331794e454a953360c8cedf3ee62ae31f063822da6007489"}, - {file = "pycryptodomex-3.9.8-cp38-cp38-win_amd64.whl", hash = "sha256:914fbb18e29c54585e6aa39d300385f90d0fa3b3cc02ed829b08f95c1acf60c2"}, - {file = "pycryptodomex-3.9.8-cp39-cp39-manylinux1_i686.whl", hash = "sha256:35b9c9177a9fe7288b19dd41554c9c8ca1063deb426dd5a02e7e2a7416b6bd11"}, - {file = "pycryptodomex-3.9.8-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e070a1f91202ed34c396be5ea842b886f6fa2b90d2db437dc9fb35a26c80c060"}, - {file = "pycryptodomex-3.9.8.tar.gz", hash = "sha256:48cc2cfc251f04a6142badeb666d1ff49ca6fdfc303fd72579f62b768aaa52b9"}, -] -pygithub = [ - {file = "PyGithub-1.53-py3-none-any.whl", hash = "sha256:8ad656bf79958e775ec59f7f5a3dbcbadac12147ae3dc42708b951064096af15"}, - {file = "PyGithub-1.53.tar.gz", hash = "sha256:776befaddab9d8fddd525d52a6ca1ac228cf62b5b1e271836d766f4925e1452e"}, -] -pygments = [ - {file = "Pygments-2.7.1-py3-none-any.whl", hash = "sha256:307543fe65c0947b126e83dd5a61bd8acbd84abec11f43caebaf5534cbc17998"}, - {file = "Pygments-2.7.1.tar.gz", hash = "sha256:926c3f319eda178d1bd90851e4317e6d8cdb5e292a3386aac9bd75eca29cf9c7"}, -] -pyjwkest = [ - {file = "pyjwkest-1.4.2.tar.gz", hash = "sha256:5560fd5ba08655f29ff6ad1df1e15dc05abc9d976fcbcec8d2b5167f49b70222"}, -] -pyjwt = [ - {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, - {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, -] -pylzma = [ - {file = "pylzma-0.5.0.tar.gz", hash = "sha256:b874172afbf37770e643bf2dc9d9b6b03eb95d8f8162e157145b3fe9e1b68a1c"}, -] -pynacl = [ - {file = "PyNaCl-1.3.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:2424c8b9f41aa65bbdbd7a64e73a7450ebb4aa9ddedc6a081e7afcc4c97f7621"}, - {file = "PyNaCl-1.3.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:30f36a9c70450c7878053fa1344aca0145fd47d845270b43a7ee9192a051bf39"}, - {file = "PyNaCl-1.3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05c26f93964373fc0abe332676cb6735f0ecad27711035b9472751faa8521255"}, - {file = "PyNaCl-1.3.0-cp27-cp27m-win32.whl", hash = "sha256:a14e499c0f5955dcc3991f785f3f8e2130ed504fa3a7f44009ff458ad6bdd17f"}, - {file = "PyNaCl-1.3.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f67814c38162f4deb31f68d590771a29d5ae3b1bd64b75cf232308e5c74777e0"}, - {file = "PyNaCl-1.3.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e2da3c13307eac601f3de04887624939aca8ee3c9488a0bb0eca4fb9401fc6b1"}, - {file = "PyNaCl-1.3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0d0a8171a68edf51add1e73d2159c4bc19fc0718e79dec51166e940856c2f28e"}, - {file = "PyNaCl-1.3.0-cp34-abi3-macosx_10_6_intel.whl", hash = "sha256:4943decfc5b905748f0756fdd99d4f9498d7064815c4cf3643820c9028b711d1"}, - {file = "PyNaCl-1.3.0-cp34-abi3-manylinux1_i686.whl", hash = "sha256:5bd61e9b44c543016ce1f6aef48606280e45f892a928ca7068fba30021e9b786"}, - {file = "PyNaCl-1.3.0-cp34-abi3-manylinux1_x86_64.whl", hash = "sha256:aabb0c5232910a20eec8563503c153a8e78bbf5459490c49ab31f6adf3f3a415"}, - {file = "PyNaCl-1.3.0-cp34-cp34m-win32.whl", hash = "sha256:7d3ce02c0784b7cbcc771a2da6ea51f87e8716004512493a2b69016326301c3b"}, - {file = "PyNaCl-1.3.0-cp34-cp34m-win_amd64.whl", hash = "sha256:1c780712b206317a746ace34c209b8c29dbfd841dfbc02aa27f2084dd3db77ae"}, - {file = "PyNaCl-1.3.0-cp35-cp35m-win32.whl", hash = "sha256:37aa336a317209f1bb099ad177fef0da45be36a2aa664507c5d72015f956c310"}, - {file = "PyNaCl-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:57ef38a65056e7800859e5ba9e6091053cd06e1038983016effaffe0efcd594a"}, - {file = "PyNaCl-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:a39f54ccbcd2757d1d63b0ec00a00980c0b382c62865b61a505163943624ab20"}, - {file = "PyNaCl-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6482d3017a0c0327a49dddc8bd1074cc730d45db2ccb09c3bac1f8f32d1eb61b"}, - {file = "PyNaCl-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:2d23c04e8d709444220557ae48ed01f3f1086439f12dbf11976e849a4926db56"}, - {file = "PyNaCl-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bd4ecb473a96ad0f90c20acba4f0bf0df91a4e03a1f4dd6a4bdc9ca75aa3a715"}, - {file = "PyNaCl-1.3.0-cp38-cp38-win32.whl", hash = "sha256:53126cd91356342dcae7e209f840212a58dcf1177ad52c1d938d428eebc9fee5"}, - {file = "PyNaCl-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bf459128feb543cfca16a95f8da31e2e65e4c5257d2f3dfa8c0c1031139c9c92"}, - {file = "PyNaCl-1.3.0.tar.gz", hash = "sha256:0c6100edd16fefd1557da078c7a31e7b7d7a52ce39fdca2bec29d4f7b6e7600c"}, -] -pyopenssl = [ - {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, - {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pypng = [ - {file = "pypng-0.0.20.tar.gz", hash = "sha256:1032833440c91bafee38a42c38c02d00431b24c42927feb3e63b104d8550170b"}, -] -pyqrcode = [ - {file = "PyQRCode-1.2.1.tar.gz", hash = "sha256:fdbf7634733e56b72e27f9bce46e4550b75a3a2c420414035cae9d9d26b234d5"}, - {file = "PyQRCode-1.2.1.zip", hash = "sha256:1b2812775fa6ff5c527977c4cd2ccb07051ca7d0bc0aecf937a43864abe5eff6"}, -] -pyrfc3339 = [ - {file = "pyRFC3339-1.1-py2.py3-none-any.whl", hash = "sha256:67196cb83b470709c580bb4738b83165e67c6cc60e1f2e4f286cfcb402a926f4"}, - {file = "pyRFC3339-1.1.tar.gz", hash = "sha256:81b8cbe1519cdb79bed04910dd6fa4e181faf8c88dff1e1b987b5f7ab23a5b1a"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -python-digitalocean = [ - {file = "python-digitalocean-1.15.0.tar.gz", hash = "sha256:e318fe7b866ae00820f7ecec690a9320337f88c6e645310bf92f9b491148122a"}, -] -python-http-client = [ - {file = "python_http_client-3.3.1.tar.gz", hash = "sha256:f5cb0d407b30ed699c2f7ac4ba2ba8a1f2352d44bd9db6ea3bab98d081b433ce"}, -] -python-taiga = [ - {file = "python-taiga-1.0.0.tar.gz", hash = "sha256:4ab4ae81324c8b4c8a7dae3a3300096326181e5074b238516a134825df0c25a3"}, - {file = "python_taiga-1.0.0-py2.py3-none-any.whl", hash = "sha256:d18fe441428ba2084f0442516d42f9b5787ec113e80c80ea761a47579d3a7412"}, -] -pytoml = [ - {file = "pytoml-0.1.21-py2.py3-none-any.whl", hash = "sha256:57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33"}, - {file = "pytoml-0.1.21.tar.gz", hash = "sha256:8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"}, -] -pytz = [ - {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, - {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, -] -pywin32 = [ - {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-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, -] -redis = [ - {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, - {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, -] -requests = [ - {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, - {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -requests-unixsocket = [ - {file = "requests-unixsocket-0.2.0.tar.gz", hash = "sha256:9e5c1a20afc3cf786197ae59c79bcdb0e7565f218f27df5f891307ee8817c1ea"}, - {file = "requests_unixsocket-0.2.0-py2.py3-none-any.whl", hash = "sha256:014d07bfb66dc805a011a8b4b306cf4ec96d2eddb589f6b2b5765e626f0dc0cc"}, -] -secretconf = [ - {file = "secretconf-0.1.2-py3-none-any.whl", hash = "sha256:e1b556b3de83852b9ae97a85b0041987968689efd6673f2cfbb5d5808c968e02"}, - {file = "secretconf-0.1.2.tar.gz", hash = "sha256:89aa68c7bcd995aad277a0dadaaf9f92c2e22d56a17bc4f923a01077e097eb47"}, -] -sendgrid = [ - {file = "sendgrid-6.4.7-py3-none-any.whl", hash = "sha256:177f959aab5882297fe07efe7db3c67d84fef2d55e3e1038edd4a20f3eb5f059"}, - {file = "sendgrid-6.4.7.tar.gz", hash = "sha256:f6a4608e696e5851dd12a716abf97240f947027855e2205dff112c3fdc1bc127"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] -smmap = [ - {file = "smmap-3.0.4-py2.py3-none-any.whl", hash = "sha256:54c44c197c819d5ef1991799a7e30b662d1e520f2ac75c9efbeb54a742214cf4"}, - {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"}, -] -starkbank-ecdsa = [ - {file = "starkbank-ecdsa-1.1.0.tar.gz", hash = "sha256:423f81bb55c896a3c85ee98ac7da98826721eaee918f5c0c1dfff99e1972da0c"}, -] -stellar-base-sseclient = [ - {file = "stellar-base-sseclient-0.0.21.tar.gz", hash = "sha256:2a500f3015dede4e9fac0f9d6d9d85f4fdd7fe1c9c10b2b111a6ae190cc5dc00"}, -] -stellar-sdk = [ - {file = "stellar-sdk-2.4.1.tar.gz", hash = "sha256:505468d74e321d914bc4aacfa9674f17b02d6d5502190afd7a694c0d48310cf2"}, - {file = "stellar_sdk-2.4.1-py3-none-any.whl", hash = "sha256:9303f78233864a2534736ed7fe8edb6e2a17306718115ec08eea509aa49afc50"}, -] -terminaltables = [ - {file = "terminaltables-3.1.0.tar.gz", hash = "sha256:f3eb0eb92e3833972ac36796293ca0906e998dc3be91fbe1f8615b331b853b81"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -toml = [ - {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, - {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, -] -typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, -] -urllib3 = [ - {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, - {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, -] -urwid = [ - {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, -] -watchdog = [ - {file = "watchdog-0.9.0.tar.gz", hash = "sha256:965f658d0732de3188211932aeb0bb457587f04f63ab4c1e33eab878e9de961d"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -websocket-client = [ - {file = "websocket_client-0.57.0-py2.py3-none-any.whl", hash = "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549"}, - {file = "websocket_client-0.57.0.tar.gz", hash = "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"}, -] -whoosh = [ - {file = "Whoosh-2.7.4-py2.py3-none-any.whl", hash = "sha256:aa39c3c3426e3fd107dcb4bde64ca1e276a65a889d9085a6e4b54ba82420a852"}, - {file = "Whoosh-2.7.4.tar.gz", hash = "sha256:7ca5633dbfa9e0e0fa400d3151a8a0c4bec53bd2ecedc0a67705b17565c31a83"}, - {file = "Whoosh-2.7.4.zip", hash = "sha256:e0857375f63e9041e03fedd5b7541f97cf78917ac1b6b06c1fcc9b45375dda69"}, -] -win32-setctime = [ - {file = "win32_setctime-1.0.2-py3-none-any.whl", hash = "sha256:02b4c5959ca0b195f45c98115826c6e8a630b7cf648e724feaab1a5aa6250640"}, - {file = "win32_setctime-1.0.2.tar.gz", hash = "sha256:47aa7c43548c1fc0a4f026d1944b748b37036df116c7c4cf908e82638d854313"}, -] -wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, -] -yarl = [ - {file = "yarl-1.6.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:db9eb8307219d7e09b33bcb43287222ef35cbcf1586ba9472b0a4b833666ada1"}, - {file = "yarl-1.6.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:e31fef4e7b68184545c3d68baec7074532e077bd1906b040ecfba659737df188"}, - {file = "yarl-1.6.0-cp35-cp35m-win32.whl", hash = "sha256:5d84cc36981eb5a8533be79d6c43454c8e6a39ee3118ceaadbd3c029ab2ee580"}, - {file = "yarl-1.6.0-cp35-cp35m-win_amd64.whl", hash = "sha256:5e447e7f3780f44f890360ea973418025e8c0cdcd7d6a1b221d952600fd945dc"}, - {file = "yarl-1.6.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:6f6898429ec3c4cfbef12907047136fd7b9e81a6ee9f105b45505e633427330a"}, - {file = "yarl-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d088ea9319e49273f25b1c96a3763bf19a882cff774d1792ae6fba34bd40550a"}, - {file = "yarl-1.6.0-cp36-cp36m-win32.whl", hash = "sha256:b7c199d2cbaf892ba0f91ed36d12ff41ecd0dde46cbf64ff4bfe997a3ebc925e"}, - {file = "yarl-1.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:67c5ea0970da882eaf9efcf65b66792557c526f8e55f752194eff8ec722c75c2"}, - {file = "yarl-1.6.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:04a54f126a0732af75e5edc9addeaa2113e2ca7c6fce8974a63549a70a25e50e"}, - {file = "yarl-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcbe419805c9b20db9a51d33b942feddbf6e7fb468cb20686fd7089d4164c12a"}, - {file = "yarl-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:c604998ab8115db802cc55cb1b91619b2831a6128a62ca7eea577fc8ea4d3131"}, - {file = "yarl-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c22607421f49c0cb6ff3ed593a49b6a99c6ffdeaaa6c944cdda83c2393c8864d"}, - {file = "yarl-1.6.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7ce35944e8e61927a8f4eb78f5bc5d1e6da6d40eadd77e3f79d4e9399e263921"}, - {file = "yarl-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c15d71a640fb1f8e98a1423f9c64d7f1f6a3a168f803042eaf3a5b5022fde0c1"}, - {file = "yarl-1.6.0-cp38-cp38-win32.whl", hash = "sha256:3cc860d72ed989f3b1f3abbd6ecf38e412de722fb38b8f1b1a086315cf0d69c5"}, - {file = "yarl-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:e32f0fb443afcfe7f01f95172b66f279938fbc6bdaebe294b0ff6747fb6db020"}, - {file = "yarl-1.6.0.tar.gz", hash = "sha256:61d3ea3c175fe45f1498af868879c6ffeb989d4143ac542163c45538ba5ec21b"}, -] -zipp = [ - {file = "zipp-3.2.0-py3-none-any.whl", hash = "sha256:43f4fa8d8bb313e65d8323a3952ef8756bf40f9a5c3ea7334be23ee4ec8278b6"}, - {file = "zipp-3.2.0.tar.gz", hash = "sha256:b52f22895f4cfce194bc8172f3819ee8de7540aa6d873535a8668b730b8b411f"}, -] -"zope.component" = [ - {file = "zope.component-4.6.2-py2.py3-none-any.whl", hash = "sha256:607628e4c84f7887a69a958542b5c304663e726b73aba0882e3a3f059bff14f3"}, - {file = "zope.component-4.6.2.tar.gz", hash = "sha256:91628918218b3e6f6323de2a7b845e09ddc5cae131c034896c051b084bba3c92"}, -] -"zope.deferredimport" = [ - {file = "zope.deferredimport-4.3.1-py2.py3-none-any.whl", hash = "sha256:9a0c211df44aa95f1c4e6d2626f90b400f56989180d3ef96032d708da3d23e0a"}, - {file = "zope.deferredimport-4.3.1.tar.gz", hash = "sha256:57b2345e7b5eef47efcd4f634ff16c93e4265de3dcf325afc7315ade48d909e1"}, -] -"zope.deprecation" = [ - {file = "zope.deprecation-4.4.0-py2.py3-none-any.whl", hash = "sha256:f1480b74995958b24ce37b0ef04d3663d2683e5d6debc96726eff18acf4ea113"}, - {file = "zope.deprecation-4.4.0.tar.gz", hash = "sha256:0d453338f04bacf91bbfba545d8bcdf529aa829e67b705eac8c1a7fdce66e2df"}, -] -"zope.event" = [ - {file = "zope.event-4.5.0-py2.py3-none-any.whl", hash = "sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42"}, - {file = "zope.event-4.5.0.tar.gz", hash = "sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330"}, -] -"zope.hookable" = [ - {file = "zope.hookable-5.0.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d3b3b3eedfdbf6b02898216e85aa6baf50207f4378a2a6803d6d47650cd37031"}, - {file = "zope.hookable-5.0.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:afaa740206b7660d4cc3b8f120426c85761f51379af7a5b05451f624ad12b0af"}, - {file = "zope.hookable-5.0.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:e427ebbdd223c72e06ba94c004bb04e996c84dec8a0fa84e837556ae145c439e"}, - {file = "zope.hookable-5.0.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:86bd12624068cea60860a0759af5e2c3adc89c12aef6f71cf12f577e28deefe3"}, - {file = "zope.hookable-5.0.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e760b2bc8ece9200804f0c2b64d10147ecaf18455a2a90827fbec4c9d84f3ad5"}, - {file = "zope.hookable-5.0.1-cp27-cp27m-win32.whl", hash = "sha256:b5f5fa323f878bb16eae68ea1ba7f6c0419d4695d0248bed4b18f51d7ce5ab85"}, - {file = "zope.hookable-5.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:81db29edadcbb740cd2716c95a297893a546ed89db1bfe9110168732d7f0afdd"}, - {file = "zope.hookable-5.0.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:522d1153d93f2d48aa0bd9fb778d8d4500be2e4dcf86c3150768f0e3adbbc4ef"}, - {file = "zope.hookable-5.0.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:df5067d87aaa111ed5d050e1ee853ba284969497f91806efd42425f5348f1c06"}, - {file = "zope.hookable-5.0.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ecb3f17dce4803c1099bd21742cd126b59817a4e76a6544d31d2cca6e30dbffd"}, - {file = "zope.hookable-5.0.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ea9a9cc8bcc70e18023f30fa2f53d11ae069572a162791224e60cd65df55fb69"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:9c184d8f9f7a76e1ced99855ccf390ffdd0ec3765e5cbf7b9cada600accc0a1e"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6fd27921ebf3aaa945fa25d790f1f2046204f24dba4946f82f5f0a442577c3e9"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6781f86e6d54a110980a76e761eb54590630fd2af2a17d7edf02a079d2646c1d"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:acc789e8c29c13555e43fe4bf9fcd15a65512c9645e97bbaa5602e3201252b02"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0194b9b9e7f614abba60c90b231908861036578297515d3d6508eb10190f266d"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-win32.whl", hash = "sha256:3f73096f27b8c28be53ffb6604f7b570fbbb82f273c6febe5f58119009b59898"}, - {file = "zope.hookable-5.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0c2977473918bdefc6fa8dfb311f154e7f13c6133957fe649704deca79b92093"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:523d2928fb7377bbdbc9af9c0b14ad73e6eaf226349f105733bdae27efd15b5a"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ee885d347279e38226d0a437b6a932f207f691c502ee565aba27a7022f1285df"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:81867c23b0dc66c8366f351d00923f2bc5902820a24c2534dfd7bf01a5879963"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:e583ad4309c203ef75a09d43434cf9c2b4fa247997ecb0dcad769982c39411c7"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e2587644812c6138f05b8a41594a8337c6790e3baf9a01915e52438c13fc6bef"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-win32.whl", hash = "sha256:3aed60c2bb5e812bbf9295c70f25b17ac37c233f30447a96c67913ba5073642f"}, - {file = "zope.hookable-5.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed794e3b3de42486d30444fb60b5561e724ee8a2d1b17b0c2e0f81e3ddaf7a87"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9f4a5a72f40256b686d31c5c0b1fde503172307beb12c1568296e76118e402c"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3cac1565cc768911e72ca9ec4ddf5c5109e1fef0104f19f06649cf1874943b60"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5848309d4fc5c02150a45e8f8d2227e5bfda386a508bbd3160fed7c633c5a2fa"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fe45f6870f7588ac7b2763ff1ce98cce59369717afe70cc353ec5218bc854bcc"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:36fb1b35d1150267cb0543a1ddd950c0bc2c75ed0e6e92e3aaa6ac2e29416cb7"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-win32.whl", hash = "sha256:17b8bdb3b77e03a152ca0d5ca185a7ae0156f5e5a2dbddf538676633a1f7380f"}, - {file = "zope.hookable-5.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:70d581862863f6bf9e175e85c9d70c2d7155f53fb04dcdb2f73cf288ca559a53"}, - {file = "zope.hookable-5.0.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ca553f524293a0bdea05e7f44c3e685e4b7b022cb37d87bc4a3efa0f86587a8d"}, - {file = "zope.hookable-5.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:fd5e7bc5f24f7e3d490698f7b854659a9851da2187414617cd5ed360af7efd63"}, - {file = "zope.hookable-5.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e27fd877662db94f897f3fd532ef211ca4901eb1a70ba456f15c0866a985464a"}, - {file = "zope.hookable-5.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3d4bc0cc4a37c3cd3081063142eeb2125511db3c13f6dc932d899c512690378e"}, - {file = "zope.hookable-5.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c212de743283ec0735db24ec6ad913758df3af1b7217550ff270038062afd6ae"}, - {file = "zope.hookable-5.0.1-cp38-cp38-win32.whl", hash = "sha256:cab67065a3db92f636128d3157cc5424a145f82d96fb47159c539132833a6d36"}, - {file = "zope.hookable-5.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:bd89e0e2c67bf4ac3aca2a19702b1a37269fb1923827f68324ac2e7afd6e3406"}, - {file = "zope.hookable-5.0.1.tar.gz", hash = "sha256:29d07681a78042cdd15b268ae9decffed9ace68a53eebeb61d65ae931d158841"}, -] -"zope.interface" = [ - {file = "zope.interface-5.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:645a7092b77fdbc3f68d3cc98f9d3e71510e419f54019d6e282328c0dd140dcd"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:d1fe9d7d09bb07228650903d6a9dc48ea649e3b8c69b1d263419cc722b3938e8"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a744132d0abaa854d1aad50ba9bc64e79c6f835b3e92521db4235a1991176813"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:461d4339b3b8f3335d7e2c90ce335eb275488c587b61aca4b305196dde2ff086"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:269b27f60bcf45438e8683269f8ecd1235fa13e5411de93dae3b9ee4fe7f7bc7"}, - {file = "zope.interface-5.1.0-cp27-cp27m-win32.whl", hash = "sha256:6874367586c020705a44eecdad5d6b587c64b892e34305bb6ed87c9bbe22a5e9"}, - {file = "zope.interface-5.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8149ded7f90154fdc1a40e0c8975df58041a6f693b8f7edcd9348484e9dc17fe"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:0103cba5ed09f27d2e3de7e48bb320338592e2fabc5ce1432cf33808eb2dfd8b"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b0becb75418f8a130e9d465e718316cd17c7a8acce6fe8fe07adc72762bee425"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:fb55c182a3f7b84c1a2d6de5fa7b1a05d4660d866b91dbf8d74549c57a1499e8"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4f98f70328bc788c86a6a1a8a14b0ea979f81ae6015dd6c72978f1feff70ecda"}, - {file = "zope.interface-5.1.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:af2c14efc0bb0e91af63d00080ccc067866fb8cbbaca2b0438ab4105f5e0f08d"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:f68bf937f113b88c866d090fea0bc52a098695173fc613b055a17ff0cf9683b6"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d7804f6a71fc2dda888ef2de266727ec2f3915373d5a785ed4ddc603bbc91e08"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:74bf0a4f9091131de09286f9a605db449840e313753949fe07c8d0fe7659ad1e"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:ba4261c8ad00b49d48bbb3b5af388bb7576edfc0ca50a49c11dcb77caa1d897e"}, - {file = "zope.interface-5.1.0-cp35-cp35m-win32.whl", hash = "sha256:ebb4e637a1fb861c34e48a00d03cffa9234f42bef923aec44e5625ffb9a8e8f9"}, - {file = "zope.interface-5.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:911714b08b63d155f9c948da2b5534b223a1a4fc50bb67139ab68b277c938578"}, - {file = "zope.interface-5.1.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:e74671e43ed4569fbd7989e5eecc7d06dc134b571872ab1d5a88f4a123814e9f"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b1d2ed1cbda2ae107283befd9284e650d840f8f7568cb9060b5466d25dc48975"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ef739fe89e7f43fb6494a43b1878a36273e5924869ba1d866f752c5812ae8d58"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:eb9b92f456ff3ec746cd4935b73c1117538d6124b8617bc0fe6fda0b3816e345"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:dcefc97d1daf8d55199420e9162ab584ed0893a109f45e438b9794ced44c9fd0"}, - {file = "zope.interface-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:f40db0e02a8157d2b90857c24d89b6310f9b6c3642369852cdc3b5ac49b92afc"}, - {file = "zope.interface-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:14415d6979356629f1c386c8c4249b4d0082f2ea7f75871ebad2e29584bd16c5"}, - {file = "zope.interface-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5e86c66a6dea8ab6152e83b0facc856dc4d435fe0f872f01d66ce0a2131b7f1d"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:39106649c3082972106f930766ae23d1464a73b7d30b3698c986f74bf1256a34"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8cccf7057c7d19064a9e27660f5aec4e5c4001ffcf653a47531bde19b5aa2a8a"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:562dccd37acec149458c1791da459f130c6cf8902c94c93b8d47c6337b9fb826"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:da2844fba024dd58eaa712561da47dcd1e7ad544a257482392472eae1c86d5e5"}, - {file = "zope.interface-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:1ae4693ccee94c6e0c88a4568fb3b34af8871c60f5ba30cf9f94977ed0e53ddd"}, - {file = "zope.interface-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dd98c436a1fc56f48c70882cc243df89ad036210d871c7427dc164b31500dc11"}, - {file = "zope.interface-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b87ed2dc05cb835138f6a6e3595593fea3564d712cb2eb2de963a41fd35758c"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:558a20a0845d1a5dc6ff87cd0f63d7dac982d7c3be05d2ffb6322a87c17fa286"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b726194f938791a6691c7592c8b9e805fc6d1b9632a833b9c0640828cd49cbc"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:60a207efcd8c11d6bbeb7862e33418fba4e4ad79846d88d160d7231fcb42a5ee"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b054eb0a8aa712c8e9030065a59b5e6a5cf0746ecdb5f087cca5ec7685690c19"}, - {file = "zope.interface-5.1.0-cp38-cp38-win32.whl", hash = "sha256:27d287e61639d692563d9dab76bafe071fbeb26818dd6a32a0022f3f7ca884b5"}, - {file = "zope.interface-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:a5f8f85986197d1dd6444763c4a15c991bfed86d835a1f6f7d476f7198d5f56a"}, - {file = "zope.interface-5.1.0.tar.gz", hash = "sha256:40e4c42bd27ed3c11b2c983fecfb03356fae1209de10686d03c02c8696a1d90e"}, -] -"zope.proxy" = [ - {file = "zope.proxy-4.3.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:2b50ea79849e46b5f4f2b0247a3687505d32d161eeb16a75f6f7e6cd81936e43"}, - {file = "zope.proxy-4.3.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f8f4b0a9e6683e43889852130595c8854d8ae237f2324a053cdd884de936aa9b"}, - {file = "zope.proxy-4.3.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:17fc7e16d0c81f833a138818a30f366696653d521febc8e892858041c4d88785"}, - {file = "zope.proxy-4.3.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:bdf5041e5851526e885af579d2f455348dba68d74f14a32781933569a327fddf"}, - {file = "zope.proxy-4.3.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5c24903675e271bd688c6e9e7df5775ac6b168feb87dbe0e4bcc90805f21b28f"}, - {file = "zope.proxy-4.3.5-cp27-cp27m-win32.whl", hash = "sha256:cc8f590a5eed30b314ae6b0232d925519ade433f663de79cc3783e4b10d662ba"}, - {file = "zope.proxy-4.3.5-cp27-cp27m-win_amd64.whl", hash = "sha256:e98a8a585b5668aa9e34d10f7785abf9545fe72663b4bfc16c99a115185ae6a5"}, - {file = "zope.proxy-4.3.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:092049280f2848d2ba1b57b71fe04881762a220a97b65288bcb0968bb199ec30"}, - {file = "zope.proxy-4.3.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a69f5cbf4addcfdf03dda564a671040127a6b7c34cf9fe4973582e68441b63fa"}, - {file = "zope.proxy-4.3.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:207aa914576b1181597a1516e1b90599dc690c095343ae281b0772e44945e6a4"}, - {file = "zope.proxy-4.3.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:cfc781ce442ec407c841e9aa51d0e1024f72b6ec34caa8fdb6ef9576d549acf2"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:5903d38362b6c716e66bbe470f190579c530a5baf03dbc8500e5c2357aa569a5"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7e162bdc5e3baad26b2262240be7d2bab36991d85a6a556e48b9dfb402370261"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:219a7db5ed53e523eb4a4769f13105118b6d5b04ed169a283c9775af221e231f"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6943da9c09870490dcfd50c4909c0cc19f434fa6948f61282dc9cb07bcf08160"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:fc45a53219ed30a7f670a6d8c98527af0020e6fd4ee4c0a8fb59f147f06d816c"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-win32.whl", hash = "sha256:74884a0aec1f1609190ec8b34b5d58fb3b5353cf22b96161e13e0e835f13518f"}, - {file = "zope.proxy-4.3.5-cp35-cp35m-win_amd64.whl", hash = "sha256:7007227f4ea85b40a2f5e5a244479f6a6dfcf906db9b55e812a814a8f0e2c28d"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:6bbaa245015d933a4172395baad7874373f162955d73612f0b66b6c2c33b6366"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00573dfa755d0703ab84bb23cb6ecf97bb683c34b340d4df76651f97b0bab068"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b6ed71e4a7b4690447b626f499d978aa13197a0e592950e5d7020308f6054698"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:19577dfeb70e8a67249ba92c8ad20589a1a2d86a8d693647fa8385408a4c17b0"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:dea9f6f8633571e18bc20cad83603072e697103a567f4b0738d52dd0211b4527"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-win32.whl", hash = "sha256:63ddb992931a5e616c87d3d89f5a58db086e617548005c7f9059fac68c03a5cc"}, - {file = "zope.proxy-4.3.5-cp36-cp36m-win_amd64.whl", hash = "sha256:0cbd27b4d3718b5ec74fc65ffa53c78d34c65c6fd9411b8352d2a4f855220cf1"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d25fe5571ddb16369054f54cdd883f23de9941476d97f2b92eb6d7d83afe22d"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e7106374d4a74ed9ff00c46cc00f0a9f06a0775f8868e423f85d4464d2333679"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6b44433a79bdd7af0e3337bd7bbcf53dd1f9b0fa66bf21bcb756060ce32a96c1"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61b55ae3c23a126a788b33ffb18f37d6668e79a05e756588d9e4d4be7246ab1c"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5ef6bc5ed98139e084f4e91100f2b098a0cd3493d4e76f9d6b3f7b95d7ad0f06"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-win32.whl", hash = "sha256:f64840e68483316eb58d82c376ad3585ca995e69e33b230436de0cdddf7363f9"}, - {file = "zope.proxy-4.3.5-cp37-cp37m-win_amd64.whl", hash = "sha256:e4a86a1d5eb2cce83c5972b3930c7c1eac81ab3508464345e2b8e54f119d5505"}, - {file = "zope.proxy-4.3.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf19b5f63a59c20306e034e691402b02055c8f4e38bf6792c23cad489162a642"}, - {file = "zope.proxy-4.3.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6ad40f85c1207803d581d5d75e9ea25327cd524925699a83dfc03bf8e4ba72b7"}, - {file = "zope.proxy-4.3.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b00f9f0c334d07709d3f73a7cb8ae63c6ca1a90c790a63b5e7effa666ef96021"}, - {file = "zope.proxy-4.3.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cd7a318a15fe6cc4584bf3c4426f092ed08c0fd012cf2a9173114234fe193e11"}, - {file = "zope.proxy-4.3.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:be034360dd34e62608419f86e799c97d389c10a0e677a25f236a971b2f40dac9"}, - {file = "zope.proxy-4.3.5-cp38-cp38-win32.whl", hash = "sha256:814d62678dc3a30f4aa081982d830b7c342cf230ffc9d030b020cb154eeebf9e"}, - {file = "zope.proxy-4.3.5-cp38-cp38-win_amd64.whl", hash = "sha256:8878a34c5313ee52e20aa50b03138af8d472bae465710fb954d133a9bfd3c38d"}, - {file = "zope.proxy-4.3.5.tar.gz", hash = "sha256:a66a0d94e5b081d5d695e66d6667e91e74d79e273eee95c1747717ba9cb70792"}, -] diff --git a/tests/frontend/pages/Packages/__init__.py b/tests/frontend/pages/Packages/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/frontend/pages/Packages/packages.py b/tests/frontend/pages/Packages/packages.py deleted file mode 100644 index 8d1520e208..0000000000 --- a/tests/frontend/pages/Packages/packages.py +++ /dev/null @@ -1,69 +0,0 @@ -from urllib.parse import urljoin -from tests.frontend.pages.base import Base -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - - -class Packages(Base): - def __init__(self, driver, *args, **kwargs): - super().__init__(self, *args, **kwargs) - self.driver = driver - self.endpoint = "/admin/#/packages" - - def load(self): - url = urljoin(self.base_url, self.endpoint) - self.driver.get(url) - - def system_packages(self): - packages = self.driver.find_elements_by_class_name("v-card__title") - system_packages = [] - for i in range(6): - system_packages.append(packages[i].text) - return system_packages - - def add_package(self, git_url): - buttons = self.driver.find_elements_by_class_name("v-btn") - add_button = [button for button in buttons if button.text == "ADD"][0] - add_button.click() - add_new_package_box = self.driver.find_elements_by_class_name("v-text-field__slot") - git_url_input = add_new_package_box[1].find_element_by_tag_name("input") - git_url_input.send_keys(git_url) - buttons = self.driver.find_elements_by_class_name("v-btn") - submit_button = [button for button in buttons if button.text == "SUBMIT"][0] - submit_button.click() - wait = WebDriverWait(self.driver, 60) - wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "v-dialog"))) - - def check_package_card(self): - - installed_packages = {} - available_packages = {} - packages_category = self.driver.find_elements_by_class_name("row") - installed_packages_cards = packages_category[1].find_elements_by_class_name("v-card") - available_packages_cards = packages_category[2].find_elements_by_class_name("v-card") - for installed_card in installed_packages_cards: - installed_package_card_name = installed_card.find_element_by_class_name("v-card__title") - installed_name = installed_package_card_name.text - installed_packages[installed_name] = installed_card - - for available_card in available_packages_cards: - available_package_card_name = available_card.find_element_by_class_name("v-card__title") - available_name = available_package_card_name.text - available_packages[available_name] = available_card - - return installed_packages, available_packages - - def delete_package(self, package_name): - installed_packages, available_packages = self.check_package_card() - for package in installed_packages.keys(): - if package == package_name: - package_card = installed_packages[package_name] - delete_icon = package_card.find_element_by_class_name("v-btn") - delete_icon.click() - break - else: - return - buttons = self.driver.find_elements_by_class_name("v-btn") - submit_button = [button for button in buttons if button.text == "SUBMIT"][0] - submit_button.click() diff --git a/tests/frontend/pages/base.py b/tests/frontend/pages/base.py index 3fd96d7524..d0aa0d00f1 100644 --- a/tests/frontend/pages/base.py +++ b/tests/frontend/pages/base.py @@ -1,5 +1,20 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + + class Base: base_url = "https://localhost" def __init__(self, *args, **kwargs): pass + + def wait(self, driver, class_name): + wait = WebDriverWait(driver, 180) + wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) + + def click_button(self, driver, text): + self.wait(driver, "progressbar") + buttons = driver.find_elements_by_class_name("v-btn") + next_button = [button for button in buttons if button.text == text][0] + next_button.click() diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index ceff3f2a30..8693c82dc2 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -1,9 +1,6 @@ from jumpscale.loader import j from urllib.parse import urljoin from tests.frontend.pages.base import Base -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC class ThreebotDeployer(Base): @@ -16,28 +13,21 @@ def load(self): url = urljoin(self.base_url, self.endpoint) self.driver.get(url) - def wait(self, class_name): - wait = WebDriverWait(self.driver, 60) - wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) - def view_an_existing_3bot_button(self): + self.load() view_my_existing_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[2] view_my_existing_3bot_button.click() + self.wait(self.driver, "v-data-table__progress") def switch_driver_to_iframe(self): # switch driver to iframe - self.wait("v-progress-linear__buffer") + self.wait(self.driver, "v-progress-linear__buffer") iframe = self.driver.find_elements_by_tag_name("iframe")[0] self.driver.switch_to_frame(iframe) - def click_button(self, text): - buttons = self.driver.find_elements_by_class_name("v-btn") - next_button = [button for button in buttons if button.text == text][0] - next_button.click() - def find_correct_3bot_instance(self, action, my_3bot_instance_name): # Find correct 3bot instance row - self.wait("v-progress-linear__buffer") + self.wait(self.driver, "v-progress-linear__buffer") table_box = self.driver.find_element_by_class_name("v-data-table") table = table_box.find_element_by_tag_name("table") rows = table.find_elements_by_tag_name("tr") @@ -50,8 +40,8 @@ def find_correct_3bot_instance(self, action, my_3bot_instance_name): if row.text.split()[0] == my_3bot_instance_name: row.find_elements_by_class_name("v-btn__content")[i].click() break - else: - return + else: + return def payment_process(self, wallet_name): chat_box = self.driver.find_element_by_class_name("chat") @@ -69,10 +59,11 @@ def payment_process(self, wallet_name): def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): # Deploy a new 3bot button + deploy_new_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[1] deploy_new_3bot_button.click() - self.wait("v-progress-linear__buffer") + self.wait(self.driver, "v-progress-linear__buffer") # switch driver to iframe iframe = self.driver.find_elements_by_tag_name("iframe")[0] @@ -83,60 +74,59 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): create_button = chat_box.find_elements_by_class_name("v-input--selection-controls__ripple")[0] create_button.click() - self.click_button("NEXT") + self.click_button(self.driver, "NEXT") # ThreeBot instance Name name_element = chat_box.find_element_by_class_name("v-text-field__slot") name_input = name_element.find_element_by_tag_name("input") name_input.send_keys(my_3bot_instances) - self.click_button("NEXT") + self.click_button(self.driver, "NEXT") - self.wait("progressbar") - self.wait("progressbar") + self.wait(self.driver, "v-card__progress") + self.wait(self.driver, "v-card__progress") # Choose how much resources the deployed solution will use. # We use 1 CPU, 2GB Memory, and 2GB[SSD] in this example. - instance_resources = chat_box.find_elements_by_class_name("v-radio")[0] - instance_resources.click() - self.click_button("NEXT") - self.click_button("NEXT") + import ipdb + + ipdb.set_trace() + + self.click_button(self.driver, "NEXT") + self.click_button(self.driver, "NEXT") # Threebot recovery password password_element = chat_box.find_element_by_class_name("v-text-field__slot") password_input = password_element.find_element_by_tag_name("input") password_input.send_keys(password) - self.click_button("NEXT") - - self.wait("v-progress-circular") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") # The deployment location policy ( We here use it automatically ) - instance_location_selection = chat_box.find_elements_by_class_name("v-radio")[0] - instance_location_selection.click() - self.click_button("NEXT") - self.wait("v-progress-circular") - self.click_button("NEXT") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") + self.click_button(self.driver, "NEXT") - self.wait("v-progress-circular") + self.wait(self.driver, "v-progress-circular") - self.click_button("NEXT") + self.click_button(self.driver, "NEXT") # Payment process self.payment_process(wallet_name=wallet_name) - self.click_button("NEXT") - self.wait("v-progress-circular") - self.click_button("NEXT") - self.wait("progressbar") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "progressbar") # Threebot instance URL threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[14] - self.click_button("FINISH") + self.click_button(self.driver, "FINISH") return threebot_instance_URL def view_my_3bot(self, status): @@ -144,7 +134,7 @@ def view_my_3bot(self, status): # View an existing 3bot button self.view_an_existing_3bot_button() - self.wait("progressbar") + self.wait(self.driver, "v-data-table__progress") # Select 3bot instances with certain status my_3bot_box = self.driver.find_element_by_class_name("v-select__selections") @@ -152,7 +142,7 @@ def view_my_3bot(self, status): status_input.send_keys(status) # List 3bot instances - self.wait("v-progress-linear__buffer") + self.wait(self.driver, "v-progress-linear__buffer") table_box = self.driver.find_element_by_class_name("v-data-table") table = table_box.find_element_by_tag_name("table") rows = table.find_elements_by_tag_name("tr") @@ -178,9 +168,9 @@ def delete_threebot_instance(self, my_3bot_instance_name, password): input_password.send_keys(password) # Click CONFIRM button - self.click_button("CONFIRM") + self.click_button(self.driver, "CONFIRM") - self.wait("v-progress-linear__buffer") + self.wait(self.driver, "v-card__process") def start_stopped_3bot_instance(self, my_3bot_instance_name, password, wallet_name): @@ -197,20 +187,20 @@ def start_stopped_3bot_instance(self, my_3bot_instance_name, password, wallet_na input_password = password_chat_box.find_element_by_tag_name("input") input_password.send_keys(password) - self.click_button("NEXT") - self.wait("progressbar") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "progressbar") - self.click_button("NEXT") + self.click_button(self.driver, "NEXT") self.payment_process(wallet_name=wallet_name) - self.click_button("NEXT") - self.wait("v-progress-linear__buffer") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-linear__buffer") # Threebot instance URL threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[14] - self.click_button("FINISH") + self.click_button(self.driver, "FINISH") return threebot_instance_URL def stop_running_3bot_instance(self, my_3bot_instance_name, password): @@ -225,5 +215,5 @@ def stop_running_3bot_instance(self, my_3bot_instance_name, password): input_password = password_chat_box.find_element_by_tag_name("input") input_password.send_keys(password) - self.click_button("CONFIRM") - self.wait("v-progress-linear__buffer") + self.click_button(self.driver, "CONFIRM") + self.wait(self.driver, "v-progress-linear__buffer") diff --git a/tests/frontend/tests/test_packages.py b/tests/frontend/tests/test_packages.py deleted file mode 100644 index c737a815bc..0000000000 --- a/tests/frontend/tests/test_packages.py +++ /dev/null @@ -1,55 +0,0 @@ -import pytest -from tests.frontend.pages.Packages.packages import Packages -from tests.frontend.tests.base_tests import BaseTest - -from gevent import monkey - -monkey.patch_all(subprocess=False) - - -@pytest.mark.integration -class PackagesTests(BaseTest): - def test01_system_packages(self): - """ - Test case for checking system packages list. - **Test Scenario** - - Check the system packages list. - the package list that should be started by default with threebot server. - ['auth', 'chatflows', 'admin', 'weblibs', 'tfgrid_solutions', 'backup'] - """ - - packages = Packages(self.driver) - packages.load() - packages_list = packages.system_packages() - - self.info("Check the system packages list") - default_packages_list = ["auth", "chatflows", "admin", "weblibs", "tfgrid_solutions", "backup"] - self.assertTrue(set(default_packages_list).issubset(packages_list), "not all default packages exist") - - def test02_add_delete_package(self): - """ - Test case for installing a package and deleting it. - **Test Scenario** - - Install a package. - - Check that the package has been installed correctly. - - Delete the package. - - Check that the package has been deleted successfully. - """ - - self.info("Install a package") - packages = Packages(self.driver) - packages.load() - git_url = "https://github.com/threefoldtech/js-sdk/tree/development/jumpscale/packages/notebooks" - packages.add_package(git_url) - - self.info("Check that the package has been installed correctly") - installed_packages, available_packages = packages.check_package_card() - self.assertIn("notebooks", installed_packages.keys()) - - print(installed_packages, available_packages) - self.info("Delete the package") - packages.delete_package("notebooks") - - self.info("Check that the package has been deleted successfully") - installed_packages, available_packages = packages.check_package_card() - self.assertIn("notebooks", available_packages.keys()) diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 00fe3d4be6..8efb70ec65 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -13,17 +13,17 @@ class ThreebotDeployerTests(BaseTest): def setUp(self): super().setUp() - if not hasattr(ThreebotDeployerTests, "wallet_name"): - self.wallet_name = self.random_name() - self.create_wallet(self.wallet_name) + # if not hasattr(ThreebotDeployerTests, "wallet_name"): + self.wallet_name = self.random_name() + self.create_wallet(self.wallet_name) self.threebot_deployer = ThreebotDeployer(self.driver) self.threebot_deployer.load() - @classmethod - def tearDownClass(cls): - cls.delete_wallet() - super().tearDownClass() + def tearDown(self): + self.wallet_name = self.random_name() + self.create_wallet(self.wallet_name) + super().tearDown() def test01_deploy_and_delete_3bot(self): """ @@ -33,9 +33,9 @@ def test01_deploy_and_delete_3bot(self): #. Create a wallet. #. Create a threebot instance. #. Check that the threebot instance has been created successfully. - #. Delete the wallet. #. Delete the threebot instance. #. Check that the threebot instance has been deleted successfully. + #. Delete the wallet. """ self.info("Create a wallet") @@ -52,8 +52,6 @@ def test01_deploy_and_delete_3bot(self): my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") self.assertIn(threebot_name, my_3bot_instances) - self.info("Delete the wallet") - self.info("Delete the threebot instance") self.threebot_deployer.delete_threebot_instance(my_3bot_instances=threebot_name, password=password) @@ -61,13 +59,15 @@ def test01_deploy_and_delete_3bot(self): my_3bot_instances = self.threebot_deployer.view_my_3bot("DELETED") self.assertIn(threebot_name, my_3bot_instances) + self.info("Delete the wallet") + def test02_start_and_stop_my_3bot_instance(self): """ Test case to test start and stop a 3bot instance **Test Scenario** #. Create a wallet. - #. Create a 3bot instance. + #. Create a threebot instance. #. Stopped the new created 3bot instance. #. Check that the 3bot instance has been stopped successfully. #. Start the 3bot instance. @@ -78,11 +78,11 @@ def test02_start_and_stop_my_3bot_instance(self): self.info("Create a wallet") - self.info("Create a 3bot instance") + self.info("Create a threebot instance") threebot_name = "threebot{}".format(randint(1, 1000)) password = randint(1, 500000) self.threebot_deployer.deploy_new_3bot( - my_3bot_instance_name=threebot_name, password=password, wallet_name=self.wallet_name + my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name ) self.info("Stopped the new created 3bot instance") @@ -113,8 +113,8 @@ def create_wallet(self, wallet_name): wallets.load() wallets.add_funded(wallet_name) - def delete_wallet(self): + def delete_wallet(self, wallet_name): self.info("Delete the wallet") wallets = Wallets(self.driver) wallets.load() - wallets.delete(self.wallet_name) + wallets.delete(wallet_name) From 536b2e7de80f9538adb63bb891687f3aa311f79a Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Wed, 23 Dec 2020 23:53:57 +0200 Subject: [PATCH 09/25] add settings UI tests --- tests/frontend/pages/base.py | 16 ++++ tests/frontend/pages/settings/__init__.py | 0 tests/frontend/pages/settings/settings.py | 88 ++++++++++++++++++++++ tests/frontend/tests/test_settings.py | 92 +++++++++++++++++++++++ 4 files changed, 196 insertions(+) create mode 100644 tests/frontend/pages/settings/__init__.py create mode 100644 tests/frontend/pages/settings/settings.py create mode 100644 tests/frontend/tests/test_settings.py diff --git a/tests/frontend/pages/base.py b/tests/frontend/pages/base.py index 3fd96d7524..77b3a7d4f5 100644 --- a/tests/frontend/pages/base.py +++ b/tests/frontend/pages/base.py @@ -1,5 +1,21 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.common import exceptions + + class Base: base_url = "https://localhost" def __init__(self, *args, **kwargs): pass + + def wait(self, driver, class_name): + wait = WebDriverWait(driver, 180) + wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) + + def click_button(self, driver, text): + self.wait(driver, "progressbar") + buttons = driver.find_elements_by_class_name("v-btn") + next_button = [button for button in buttons if button.text == text][0] + next_button.click() diff --git a/tests/frontend/pages/settings/__init__.py b/tests/frontend/pages/settings/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/frontend/pages/settings/settings.py b/tests/frontend/pages/settings/settings.py new file mode 100644 index 0000000000..dce739341b --- /dev/null +++ b/tests/frontend/pages/settings/settings.py @@ -0,0 +1,88 @@ +from tests.frontend.pages.base import Base +from urllib.parse import urljoin +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + + +class Settings(Base): + def __init__(self, driver, *args, **kwargs): + super().__init__(self, *args, **kwargs) + self.driver = driver + self.endpoint = "/admin/#/settings" + + def load(self): + url = urljoin(self.base_url, self.endpoint) + self.driver.get(url) + + def add_admin(self, name): + self.select_card("Admins") + + admin_card = self.driver.find_element_by_class_name("v-dialog--active") + input = admin_card.find_element_by_tag_name("input") + input.send_keys(name) + add_button = admin_card.find_elements_by_tag_name("button") + add_button[1].click() + self.wait(self.driver, "v-card__progress") + + def delete_admin(self, admin): + admins = self.list("Admins") + deleted_admin = [admins[a] for a in admins.keys() if a == admin][0] + delete_button = deleted_admin.find_element_by_tag_name("button") + delete_button.click() + self.click_button(self.driver, "CONFIRM") + self.wait(self.driver, "v-card__progress") + + def add_escalation_emails(self, email): + self.select_card("Escalation Emails") + escale_card = self.driver.find_element_by_class_name("v-dialog--active") + input = escale_card.find_element_by_tag_name("input") + input.send_keys(email) + add_button = escale_card.find_elements_by_tag_name("button") + add_button[1].click() + self.wait(self.driver, "v-card__progress") + + def delete_escalation_emails(self, email): + emails = self.list("Escalation Emails") + deleted_email = [emails[e] for e in emails.keys() if e == email][0] + delete_button = deleted_email.find_element_by_tag_name("button") + delete_button.click() + + def add_identities(self, name, _3bot_name, email, words): + self.select_card("Identities") + v_cards = self.driver.find_elements_by_class_name("v-card") + identity_card = [card for card in v_cards if "Add identity" in card.text][0] + form = identity_card.find_element_by_tag_name("form") + inputs_div = form.find_elements_by_class_name("v-text-field__slot") + inputs = {"Display name": name, "3Bot name": _3bot_name, "Email": email, "Words": words} + + for input in inputs_div: + if input.text in inputs.keys(): + input.find_element_by_tag_name("input").send_keys(inputs[input.text]) + + self.click_button(self.driver, "CLOSE") + self.wait(self.driver, "v-card__progress") + + def delete_identity(self, name): + identities = self.list("Identities") + identity = [identities[i] for i in identities.keys() if i == name][0] + identity.click() + v_cards = self.driver.find_elements_by_class_name("v-card") + identity_details = [identity for identity in v_cards if identity == "Identity details"] + buttons = identity_details.find_element_by_tag_name("button") + buttons[0].click() + + def list(self, name): + names = {} + v_cards = self.driver.find_elements_by_class_name("v-card") + card = [card for card in v_cards if name in card.text][0] + admins = card.find_elements_by_class_name("ma-2") + for a in admins: + names[a.text] = a + return names + + def select_card(self, name): + v_cards = self.driver.find_elements_by_class_name("v-card") + card = [card for card in v_cards if name in card.text][0] + button = card.find_element_by_tag_name("button") + button.click() diff --git a/tests/frontend/tests/test_settings.py b/tests/frontend/tests/test_settings.py new file mode 100644 index 0000000000..ef2ed87bd4 --- /dev/null +++ b/tests/frontend/tests/test_settings.py @@ -0,0 +1,92 @@ +import pytest +from tests.frontend.pages.settings.settings import Settings +from tests.frontend.tests.base_tests import BaseTest +from jumpscale.loader import j + + +@pytest.mark.integration +class SettingsTests(BaseTest): + def test01_add_admins(self): + """Test case for adding an admin and deleting it. + + **Test Scenario** + + - Add an admin. + - Check that the admin has been added in the admins. + - Delete the admin. + - Check that the admin has been deleted from the admins. + """ + settings = Settings(self.driver) + settings.load() + + self.info("Add an admin") + admin = f"{self.random_name()}.3bot" + settings.add_admin(admin) + + self.info("Check that the admin has been added in the admins") + admins = settings.list("Admins") + self.assertIn(admin, admins.keys()) + + self.info("Delete the admin") + settings.delete_admin(admin) + + self.info("Check that the admin has been deleted from the admins") + admins = settings.list("Admins") + self.assertNotIn(admin, admins.keys()) + + def test02_add_identity(self): + """Test case for adding an identity and deleting it. + + **Test Scenario** + + - Add an identity. + - Check that the identity has been added in the identities. + - Delete the identity. + - Check that the identity has been deleted from the identities. + """ + settings = Settings(self.driver) + settings.load() + + self.info("Add an identity") + name = self.random_name() + settings.add_identities(name, self.tname, self.email, self.words) + + self.info("Check that the identity has been added in the identities") + identities = settings.list("Identities") + self.assertIn(name, identities.keys()) + + self.info("Delete the identity") + settings.delete_identity(name) + + self.info("Check that the identity has been deleted from the identities") + identities = settings.list("Identities") + self.assertNotIn(name, identities.keys()) + + def test03_add_escalation_emails(self): + """Test case for adding an email and deleting it. + + **Test Scenario** + + - Add an email. + - Check that the email has been added in the escalation emails. + - Delete the email. + - Check that the email has been deleted from the escalation emails. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Add an email") + email = j.data.fake.email() + settings.add_escalation_emails(email) + + self.info("Check that the email has been added in the escalation emails") + emails = settings.list("Escalation Emails") + self.assertIn(email, emails.keys()) + + self.info("Delete the email") + settings.delete_escalation_emails(email) + + self.info("Check that the email has been deleted from the escalation emails") + emails = settings.list("Escalation Emails") + self.assertNotIn(email, emails.keys()) From 71c4cb9be43fcc8e065e99ddb4bdbb75c10814cb Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Thu, 24 Dec 2020 14:46:30 +0200 Subject: [PATCH 10/25] add developer options --- tests/frontend/pages/settings/settings.py | 7 +++++ tests/frontend/tests/test_settings.py | 37 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/tests/frontend/pages/settings/settings.py b/tests/frontend/pages/settings/settings.py index dce739341b..15f9f0e73a 100644 --- a/tests/frontend/pages/settings/settings.py +++ b/tests/frontend/pages/settings/settings.py @@ -72,6 +72,13 @@ def delete_identity(self, name): buttons = identity_details.find_element_by_tag_name("button") buttons[0].click() + def developer_options(self): + cards = self.driver.find_elements_by_class_name("mt-0") + developer_card = [card for card in cards if "Developer options" in card.text][0] + options = developer_card.find_elements_by_class_name("v-input--selection-controls__input") + for option in options: + option.click() + def list(self, name): names = {} v_cards = self.driver.find_elements_by_class_name("v-card") diff --git a/tests/frontend/tests/test_settings.py b/tests/frontend/tests/test_settings.py index ef2ed87bd4..8c26e50a04 100644 --- a/tests/frontend/tests/test_settings.py +++ b/tests/frontend/tests/test_settings.py @@ -90,3 +90,40 @@ def test03_add_escalation_emails(self): self.info("Check that the email has been deleted from the escalation emails") emails = settings.list("Escalation Emails") self.assertNotIn(email, emails.keys()) + + def test04_developer_options(self): + """Test case for changing developer options. + + **Test Scenario** + + - Get the config for all options. + - Change this config. + - Check that the config has been changed. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Get the config for all options") + options_before_changes = [ + j.core.config.get("TEST_CERT", False), + j.core.config.set("OVER_PROVISIONING", False), + j.core.config.get("EXPLORER_LOGS", False), + j.core.config.get("ESCALATION_EMAILS_ENABLED", False), + j.core.config.get("AUTO_EXTEND_POOLS_ENABLED", False), + j.core.config.get("SORT_NODES_BY_SRU", False), + ] + + self.info("Change this config") + settings.developer_options() + options_after_changes = [ + j.core.config.get("TEST_CERT", False), + j.core.config.set("OVER_PROVISIONING", False), + j.core.config.get("EXPLORER_LOGS", False), + j.core.config.get("ESCALATION_EMAILS_ENABLED", False), + j.core.config.get("AUTO_EXTEND_POOLS_ENABLED", False), + j.core.config.get("SORT_NODES_BY_SRU", False), + ] + + self.info("Check that the config has been changed") + self.assertNotEqual(options_before_changes, options_after_changes) From aac5eac17f5a01c17619a97f354682a3b043f61a Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Tue, 29 Dec 2020 14:16:33 +0200 Subject: [PATCH 11/25] modify workloads testcases --- tests/frontend/pages/workloads/workloads.py | 13 ++----------- tests/frontend/tests/test_workloads.py | 6 ++++-- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/tests/frontend/pages/workloads/workloads.py b/tests/frontend/pages/workloads/workloads.py index 9ce92ef93c..74f0f43694 100644 --- a/tests/frontend/pages/workloads/workloads.py +++ b/tests/frontend/pages/workloads/workloads.py @@ -1,6 +1,6 @@ from urllib.parse import urljoin +from solutions_automation import deployer from tests.frontend.pages.base import Base -from solutions_automation.dashboard_solutions.network import NetworkDeployAutomated class workloads(Base): @@ -27,17 +27,8 @@ def select_workload_by_ID(self, workload_ID): click_ID.click() def create_workload(self, workload_name): - test_network = NetworkDeployAutomated( - solution_name=workload_name, - type="Create", - ip_version="IPv4", - ip_select="Choose ip range for me", - ip_range="", - access_node="choose_random", - pool="choose_random", - debug=True, - ) + test_network = deployer.create_network(solution_name=workload_name) test_network_dict = test_network.config return int(test_network_dict.get("ids")[0]) diff --git a/tests/frontend/tests/test_workloads.py b/tests/frontend/tests/test_workloads.py index 359112a9cf..aec58a342c 100644 --- a/tests/frontend/tests/test_workloads.py +++ b/tests/frontend/tests/test_workloads.py @@ -13,6 +13,8 @@ def setUp(self): def test01_delete_selected_workloads(self): """ + Check that selected workload has been deleted correctly. + **Test Scenario** #. Create a workload. #. Delete selected workload. @@ -27,5 +29,5 @@ def test01_delete_selected_workloads(self): self.workloads.delete_selected_workloads(workload_ID) self.info("Check that selected workload has been deleted correctly") - worklods_status = self.workloads.check_selected_workloads_status(workload_ID) - self.assertEquals(worklods_status, "DELETED") + workloads_status = self.workloads.check_selected_workloads_status(workload_ID) + self.assertEquals(workloads_status, "DELETED") From 3e8fdf6951569ec9315e529731cbd65456657fc2 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Tue, 29 Dec 2020 15:14:26 +0200 Subject: [PATCH 12/25] modify workloads testcases --- docs/tests/README.md | 1 + docs/tests/frontend/tests/test_workloads.md | 7 +++++++ tests/frontend/tests/test_workloads.py | 10 ++++------ 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 docs/tests/frontend/tests/test_workloads.md diff --git a/docs/tests/README.md b/docs/tests/README.md index 0ae7474884..e6204352fd 100644 --- a/docs/tests/README.md +++ b/docs/tests/README.md @@ -11,6 +11,7 @@ ### Frontend - [test_wallets](frontend/tests/test_wallets.md) +- [test_workloads](frontend/tests/test_workloads.md) ### Sals diff --git a/docs/tests/frontend/tests/test_workloads.md b/docs/tests/frontend/tests/test_workloads.md new file mode 100644 index 0000000000..52bcaa56da --- /dev/null +++ b/docs/tests/frontend/tests/test_workloads.md @@ -0,0 +1,7 @@ +### test01_delete_selected_workloads + + +# Check that selected workload has been deleted correctly. +- Create a workload. +- Delete selected workload. +- Check that selected workload has been deleted correctly. diff --git a/tests/frontend/tests/test_workloads.py b/tests/frontend/tests/test_workloads.py index aec58a342c..c4b91ef7ff 100644 --- a/tests/frontend/tests/test_workloads.py +++ b/tests/frontend/tests/test_workloads.py @@ -13,12 +13,10 @@ def setUp(self): def test01_delete_selected_workloads(self): """ - Check that selected workload has been deleted correctly. - - **Test Scenario** - #. Create a workload. - #. Delete selected workload. - #. Check that selected workload has been deleted correctly. + # Check that selected workload has been deleted correctly. + - Create a workload. + - Delete selected workload. + - Check that selected workload has been deleted correctly. """ self.info("Create a workload") From 130cfacc5404adac95c7fc6c2695c67d8a5eda62 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Tue, 29 Dec 2020 20:24:50 +0200 Subject: [PATCH 13/25] explorer client testcases --- tests/clients/explorer/test_explorer.py | 82 +++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 tests/clients/explorer/test_explorer.py diff --git a/tests/clients/explorer/test_explorer.py b/tests/clients/explorer/test_explorer.py new file mode 100644 index 0000000000..59b51179de --- /dev/null +++ b/tests/clients/explorer/test_explorer.py @@ -0,0 +1,82 @@ +from os import environ +from random import randint, choice + +from jumpscale.loader import j +from tests.base_tests import BaseTests + + +class Explorer(BaseTests): + + tname = environ.get("TNAME") + email = environ.get("EMAIL") + words = environ.get("WORDS") + explorer_url = "https://explorer.testnet.grid.tf/api/v1" + MYID_NAME = "identity_{}".format(randint(1, 1000)) + explorer = j.core.identity.me.explorer + + @classmethod + def setUpClass(cls): + if not all([cls.tname, cls.email, cls.words]): + raise Exception("Please add (TNAME, EMAIL, WORDS) of your 3bot identity as environment variables") + cls.me = None + if j.core.identity.list_all() and hasattr(j.core.identity, "me"): + cls.me = j.core.identity.me + myid = j.core.identity.new( + cls.MYID_NAME, tname=cls.tname, email=cls.email, words=cls.words, explorer_url=cls.explorer_url + ) + myid.register() + myid.set_default() + myid.save() + + @classmethod + def tearDownClass(cls): + j.core.identity.delete(cls.MYID_NAME) + if cls.me: + cls.me.set_default() + + def test01_check_nodes(self): + """ + #. Check the node lists in explorer client. + + - List all nodes. + - Check that node list contains the node_id, farm_id, resources. + """ + + self.info("List all nodes") + nodes = self.explorer.nodes.list() + node = choice(nodes) + + self.info("Check that node list contains the node_id, farm_id, resources") + + self.assertIn("node_id", str(node)) + self.assertIn("farm_id", str(node)) + self.asserIn("total_resources", str(node)) + + def test02_check_explorer_url(self): + """ + #. Check the explorer URL. + + - Check the explorer url. + - Make sure explorer_url "https://explorer.testnet.grid.tf/api/v1" + """ + + self.info("Check the explorer url") + self.assertEquals(self.explorer.url, "https://explorer.testnet.grid.tf/api/v1") + + def test03_check_farms(self): + """ + #. Check the farms lists in explorer client. + + - List all farms. + - Check that farm list contains the wallet_addresses, id, location. + """ + + self.info("List all farms") + farms = self.explorer.farms.list() + farm = choice(farms) + + self.info("Check that farm list contains the wallet_addresses, id, location") + + self.assertIn("wallet_addresses", str(farm)) + self.assertIn("id", str(farm)) + self.assertIn("location", str(farm)) From d345b197b3634d35e831b5440e7cf2708b1f46f0 Mon Sep 17 00:00:00 2001 From: Dina-Abd-Elrahman Date: Wed, 30 Dec 2020 10:36:17 +0200 Subject: [PATCH 14/25] remove package files --- tests/frontend/pages/Packages/__init__.py | 0 tests/frontend/pages/Packages/packages.py | 69 ----------------------- tests/frontend/tests/test_packages.py | 55 ------------------ 3 files changed, 124 deletions(-) delete mode 100644 tests/frontend/pages/Packages/__init__.py delete mode 100644 tests/frontend/pages/Packages/packages.py delete mode 100644 tests/frontend/tests/test_packages.py diff --git a/tests/frontend/pages/Packages/__init__.py b/tests/frontend/pages/Packages/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/frontend/pages/Packages/packages.py b/tests/frontend/pages/Packages/packages.py deleted file mode 100644 index 8d1520e208..0000000000 --- a/tests/frontend/pages/Packages/packages.py +++ /dev/null @@ -1,69 +0,0 @@ -from urllib.parse import urljoin -from tests.frontend.pages.base import Base -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - - -class Packages(Base): - def __init__(self, driver, *args, **kwargs): - super().__init__(self, *args, **kwargs) - self.driver = driver - self.endpoint = "/admin/#/packages" - - def load(self): - url = urljoin(self.base_url, self.endpoint) - self.driver.get(url) - - def system_packages(self): - packages = self.driver.find_elements_by_class_name("v-card__title") - system_packages = [] - for i in range(6): - system_packages.append(packages[i].text) - return system_packages - - def add_package(self, git_url): - buttons = self.driver.find_elements_by_class_name("v-btn") - add_button = [button for button in buttons if button.text == "ADD"][0] - add_button.click() - add_new_package_box = self.driver.find_elements_by_class_name("v-text-field__slot") - git_url_input = add_new_package_box[1].find_element_by_tag_name("input") - git_url_input.send_keys(git_url) - buttons = self.driver.find_elements_by_class_name("v-btn") - submit_button = [button for button in buttons if button.text == "SUBMIT"][0] - submit_button.click() - wait = WebDriverWait(self.driver, 60) - wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "v-dialog"))) - - def check_package_card(self): - - installed_packages = {} - available_packages = {} - packages_category = self.driver.find_elements_by_class_name("row") - installed_packages_cards = packages_category[1].find_elements_by_class_name("v-card") - available_packages_cards = packages_category[2].find_elements_by_class_name("v-card") - for installed_card in installed_packages_cards: - installed_package_card_name = installed_card.find_element_by_class_name("v-card__title") - installed_name = installed_package_card_name.text - installed_packages[installed_name] = installed_card - - for available_card in available_packages_cards: - available_package_card_name = available_card.find_element_by_class_name("v-card__title") - available_name = available_package_card_name.text - available_packages[available_name] = available_card - - return installed_packages, available_packages - - def delete_package(self, package_name): - installed_packages, available_packages = self.check_package_card() - for package in installed_packages.keys(): - if package == package_name: - package_card = installed_packages[package_name] - delete_icon = package_card.find_element_by_class_name("v-btn") - delete_icon.click() - break - else: - return - buttons = self.driver.find_elements_by_class_name("v-btn") - submit_button = [button for button in buttons if button.text == "SUBMIT"][0] - submit_button.click() diff --git a/tests/frontend/tests/test_packages.py b/tests/frontend/tests/test_packages.py deleted file mode 100644 index c737a815bc..0000000000 --- a/tests/frontend/tests/test_packages.py +++ /dev/null @@ -1,55 +0,0 @@ -import pytest -from tests.frontend.pages.Packages.packages import Packages -from tests.frontend.tests.base_tests import BaseTest - -from gevent import monkey - -monkey.patch_all(subprocess=False) - - -@pytest.mark.integration -class PackagesTests(BaseTest): - def test01_system_packages(self): - """ - Test case for checking system packages list. - **Test Scenario** - - Check the system packages list. - the package list that should be started by default with threebot server. - ['auth', 'chatflows', 'admin', 'weblibs', 'tfgrid_solutions', 'backup'] - """ - - packages = Packages(self.driver) - packages.load() - packages_list = packages.system_packages() - - self.info("Check the system packages list") - default_packages_list = ["auth", "chatflows", "admin", "weblibs", "tfgrid_solutions", "backup"] - self.assertTrue(set(default_packages_list).issubset(packages_list), "not all default packages exist") - - def test02_add_delete_package(self): - """ - Test case for installing a package and deleting it. - **Test Scenario** - - Install a package. - - Check that the package has been installed correctly. - - Delete the package. - - Check that the package has been deleted successfully. - """ - - self.info("Install a package") - packages = Packages(self.driver) - packages.load() - git_url = "https://github.com/threefoldtech/js-sdk/tree/development/jumpscale/packages/notebooks" - packages.add_package(git_url) - - self.info("Check that the package has been installed correctly") - installed_packages, available_packages = packages.check_package_card() - self.assertIn("notebooks", installed_packages.keys()) - - print(installed_packages, available_packages) - self.info("Delete the package") - packages.delete_package("notebooks") - - self.info("Check that the package has been deleted successfully") - installed_packages, available_packages = packages.check_package_card() - self.assertIn("notebooks", available_packages.keys()) From 192af462df2ca933f164006487eac15bf28a0fb3 Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Mon, 18 Jan 2021 10:27:53 +0200 Subject: [PATCH 15/25] handel comments --- tests/clients/explorer/test_explorer.py | 15 ++- tests/frontend/pages/settings/settings.py | 12 +- tests/frontend/tests/test_settings.py | 152 ++++++++++++++++++---- tests/frontend/tests/test_workloads.py | 6 +- 4 files changed, 149 insertions(+), 36 deletions(-) diff --git a/tests/clients/explorer/test_explorer.py b/tests/clients/explorer/test_explorer.py index 59b51179de..908e10e289 100644 --- a/tests/clients/explorer/test_explorer.py +++ b/tests/clients/explorer/test_explorer.py @@ -35,8 +35,9 @@ def tearDownClass(cls): cls.me.set_default() def test01_check_nodes(self): - """ - #. Check the node lists in explorer client. + """Check the node lists in explorer client. + + **Test Scenario** - List all nodes. - Check that node list contains the node_id, farm_id, resources. @@ -53,8 +54,9 @@ def test01_check_nodes(self): self.asserIn("total_resources", str(node)) def test02_check_explorer_url(self): - """ - #. Check the explorer URL. + """Check the explorer URL. + + **Test Scenario** - Check the explorer url. - Make sure explorer_url "https://explorer.testnet.grid.tf/api/v1" @@ -64,8 +66,9 @@ def test02_check_explorer_url(self): self.assertEquals(self.explorer.url, "https://explorer.testnet.grid.tf/api/v1") def test03_check_farms(self): - """ - #. Check the farms lists in explorer client. + """Check the farms lists in explorer client. + + **Test Scenario** - List all farms. - Check that farm list contains the wallet_addresses, id, location. diff --git a/tests/frontend/pages/settings/settings.py b/tests/frontend/pages/settings/settings.py index 15f9f0e73a..41fce55b4f 100644 --- a/tests/frontend/pages/settings/settings.py +++ b/tests/frontend/pages/settings/settings.py @@ -48,13 +48,13 @@ def delete_escalation_emails(self, email): delete_button = deleted_email.find_element_by_tag_name("button") delete_button.click() - def add_identities(self, name, _3bot_name, email, words): + def add_identities(self, name, tname, email, words): self.select_card("Identities") v_cards = self.driver.find_elements_by_class_name("v-card") identity_card = [card for card in v_cards if "Add identity" in card.text][0] form = identity_card.find_element_by_tag_name("form") inputs_div = form.find_elements_by_class_name("v-text-field__slot") - inputs = {"Display name": name, "3Bot name": _3bot_name, "Email": email, "Words": words} + inputs = {"Display name": name, "3Bot name": tname, "Email": email, "Words": words} for input in inputs_div: if input.text in inputs.keys(): @@ -72,12 +72,12 @@ def delete_identity(self, name): buttons = identity_details.find_element_by_tag_name("button") buttons[0].click() - def developer_options(self): + def developer_options(self, label): cards = self.driver.find_elements_by_class_name("mt-0") developer_card = [card for card in cards if "Developer options" in card.text][0] - options = developer_card.find_elements_by_class_name("v-input--selection-controls__input") - for option in options: - option.click() + options = developer_card.find_elements_by_class_name("v-input__slot") + button = [option for option in options if option.text == label][0] + button.click() def list(self, name): names = {} diff --git a/tests/frontend/tests/test_settings.py b/tests/frontend/tests/test_settings.py index 8c26e50a04..f7e9be0e5c 100644 --- a/tests/frontend/tests/test_settings.py +++ b/tests/frontend/tests/test_settings.py @@ -2,6 +2,7 @@ from tests.frontend.pages.settings.settings import Settings from tests.frontend.tests.base_tests import BaseTest from jumpscale.loader import j +from gevent import sleep @pytest.mark.integration @@ -91,12 +92,12 @@ def test03_add_escalation_emails(self): emails = settings.list("Escalation Emails") self.assertNotIn(email, emails.keys()) - def test04_developer_options(self): - """Test case for changing developer options. + def test04_allow_staging_ssl(self): + """Test case for changing developer options (Allow staging ssl certificate). **Test Scenario** - - Get the config for all options. + - Get the config for staging ssl certificate option. - Change this config. - Check that the config has been changed. """ @@ -104,26 +105,133 @@ def test04_developer_options(self): settings = Settings(self.driver) settings.load() - self.info("Get the config for all options") - options_before_changes = [ - j.core.config.get("TEST_CERT", False), - j.core.config.set("OVER_PROVISIONING", False), - j.core.config.get("EXPLORER_LOGS", False), - j.core.config.get("ESCALATION_EMAILS_ENABLED", False), - j.core.config.get("AUTO_EXTEND_POOLS_ENABLED", False), - j.core.config.get("SORT_NODES_BY_SRU", False), - ] + self.info("Get the config for staging ssl certificate option") + option_before_changes = (j.core.config.get("TEST_CERT", False),) self.info("Change this config") - settings.developer_options() - options_after_changes = [ - j.core.config.get("TEST_CERT", False), - j.core.config.set("OVER_PROVISIONING", False), - j.core.config.get("EXPLORER_LOGS", False), - j.core.config.get("ESCALATION_EMAILS_ENABLED", False), - j.core.config.get("AUTO_EXTEND_POOLS_ENABLED", False), - j.core.config.get("SORT_NODES_BY_SRU", False), - ] + settings.developer_options("Allow staging ssl certificate") + sleep(3) + option_after_changes = (j.core.config.get("TEST_CERT", False),) self.info("Check that the config has been changed") - self.assertNotEqual(options_before_changes, options_after_changes) + self.assertNotEqual(option_before_changes, option_after_changes) + + def test05_allow_over_provisioning(self): + """Test case for changing developer options (Allow over provisioning). + + **Test Scenario** + + - Get the config for over provisioning. + - Change this config. + - Check that the config has been changed. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Get the config for over provisioning") + option_before_changes = (j.core.config.get("OVER_PROVISIONING", False),) + + self.info("Change this config") + settings.developer_options("Allow over provisioning") + sleep(3) + option_after_changes = (j.core.config.get("OVER_PROVISIONING", False),) + + self.info("Check that the config has been changed") + self.assertNotEqual(option_before_changes, option_after_changes) + + def test06_enable_explorer_logs(self): + """Test case for changing developer options (Enable explorer logs). + + **Test Scenario** + + - Get the config for explorer logs. + - Change this config. + - Check that the config has been changed. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Get the config for explorer logs") + option_before_changes = (j.core.config.get("EXPLORER_LOGS", False),) + + self.info("Change this config") + settings.developer_options("Enable explorer logs") + sleep(3) + option_after_changes = (j.core.config.get("EXPLORER_LOGS", False),) + + self.info("Check that the config has been changed") + self.assertNotEqual(option_before_changes, option_after_changes) + + def test07_enable_sending_escalation_emails(self): + """Test case for changing developer options (Enable sending escalation emails). + + **Test Scenario** + + - Get the config for sending escalation emails. + - Change this config. + - Check that the config has been changed. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Get the config for sending escalation emails") + option_before_changes = (j.core.config.get("ESCALATION_EMAILS_ENABLED", False),) + + self.info("Change this config") + settings.developer_options("Enable sending escalation emails") + sleep(3) + option_after_changes = (j.core.config.get("ESCALATION_EMAILS_ENABLED", False),) + + self.info("Check that the config has been changed") + self.assertNotEqual(option_before_changes, option_after_changes) + + def test08_pools_auto_extension(self): + """Test case for changing developer options (Pools auto extension). + + **Test Scenario** + + - Get the config for pools auto extension. + - Change this config. + - Check that the config has been changed. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Get the config for pools auto extension") + option_before_changes = (j.core.config.get("AUTO_EXTEND_POOLS_ENABLED", False),) + + self.info("Change this config") + settings.developer_options("Pools auto extension") + sleep(3) + option_after_changes = (j.core.config.get("AUTO_EXTEND_POOLS_ENABLED", False),) + + self.info("Check that the config has been changed") + self.assertNotEqual(option_before_changes, option_after_changes) + + def test09_sort_nodes_by_SRU(self): + """Test case for changing developer options (Sort nodes by SRU). + + **Test Scenario** + + - Get the config for sort nodes by SRU. + - Change this config. + - Check that the config has been changed. + """ + + settings = Settings(self.driver) + settings.load() + + self.info("Get the config for sort nodes by SRU") + option_before_changes = (j.core.config.get("SORT_NODES_BY_SRU", False),) + + self.info("Change this config") + settings.developer_options("Sort nodes by SRU") + sleep(3) + option_after_changes = (j.core.config.get("SORT_NODES_BY_SRU", False),) + + self.info("Check that the config has been changed") + self.assertNotEqual(option_before_changes, option_after_changes) diff --git a/tests/frontend/tests/test_workloads.py b/tests/frontend/tests/test_workloads.py index c4b91ef7ff..2bf35160a3 100644 --- a/tests/frontend/tests/test_workloads.py +++ b/tests/frontend/tests/test_workloads.py @@ -12,8 +12,10 @@ def setUp(self): self.workloads.load() def test01_delete_selected_workloads(self): - """ - # Check that selected workload has been deleted correctly. + """Check that selected workload has been deleted correctly. + + **Test Scenario** + - Create a workload. - Delete selected workload. - Check that selected workload has been deleted correctly. From b524ef3957540c4fc3bcb013e867776186e88d24 Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Sun, 31 Jan 2021 22:51:52 +0200 Subject: [PATCH 16/25] handle comments --- .../threebot_deployer/threebot_deployer.py | 18 +--- .../frontend/tests/test_threebot_deployer.py | 100 +++++++----------- 2 files changed, 44 insertions(+), 74 deletions(-) diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index 8693c82dc2..013eb0d0f5 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -25,7 +25,7 @@ def switch_driver_to_iframe(self): iframe = self.driver.find_elements_by_tag_name("iframe")[0] self.driver.switch_to_frame(iframe) - def find_correct_3bot_instance(self, action, my_3bot_instance_name): + def find_3bot_instance(self, action, my_3bot_instance_name): # Find correct 3bot instance row self.wait(self.driver, "v-progress-linear__buffer") table_box = self.driver.find_element_by_class_name("v-data-table") @@ -40,8 +40,6 @@ def find_correct_3bot_instance(self, action, my_3bot_instance_name): if row.text.split()[0] == my_3bot_instance_name: row.find_elements_by_class_name("v-btn__content")[i].click() break - else: - return def payment_process(self, wallet_name): chat_box = self.driver.find_element_by_class_name("chat") @@ -52,7 +50,7 @@ def payment_process(self, wallet_name): reservation_ID = payment_info[7] total_amount = payment_info[9].split()[0] - a = getattr(j.clients.stellar, wallet_name).get_asset(currency) + a = getattr(j.clients.stellar, wallet_name)._get_asset(currency) j.clients.stellar.demos_wallet.transfer( destination_wallet_address, amount=total_amount, memo_text=reservation_ID, asset=f"{a.code}:{a.issuer}" ) @@ -83,17 +81,11 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): self.click_button(self.driver, "NEXT") - self.wait(self.driver, "v-card__progress") self.wait(self.driver, "v-card__progress") # Choose how much resources the deployed solution will use. # We use 1 CPU, 2GB Memory, and 2GB[SSD] in this example. - import ipdb - - ipdb.set_trace() - - self.click_button(self.driver, "NEXT") self.click_button(self.driver, "NEXT") # Threebot recovery password @@ -160,7 +152,7 @@ def delete_threebot_instance(self, my_3bot_instance_name, password): self.view_an_existing_3bot_button() # Find correct 3bot instance row - self.find_correct_3bot_instance("delete", my_3bot_instance_name=my_3bot_instance_name) + self.find_3bot_instance("delete", my_3bot_instance_name=my_3bot_instance_name) # Destroy 3bot box destroy_3bot = self.driver.find_element_by_class_name("v-card") @@ -178,7 +170,7 @@ def start_stopped_3bot_instance(self, my_3bot_instance_name, password, wallet_na self.view_an_existing_3bot_button() # Find correct 3bot instance row - self.find_correct_3bot_instance("start", my_3bot_instance_name=my_3bot_instance_name) + self.find_3bot_instance("start", my_3bot_instance_name=my_3bot_instance_name) # switch driver to iframe self.switch_driver_to_iframe() @@ -209,7 +201,7 @@ def stop_running_3bot_instance(self, my_3bot_instance_name, password): self.view_an_existing_3bot_button() # Find correct 3bot instance row - self.find_correct_3bot_instance("stop", my_3bot_instance_name=my_3bot_instance_name) + self.find_3bot_instance("stop", my_3bot_instance_name=my_3bot_instance_name) password_chat_box = self.driver.find_element_by_class_name("v-card") input_password = password_chat_box.find_element_by_tag_name("input") diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 8efb70ec65..956448e92c 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -1,5 +1,7 @@ import pytest import urllib.request +import os +from jumpscale.loader import j from random import randint from tests.frontend.tests.base_tests import BaseTest from tests.frontend.pages.wallets.wallets import Wallets @@ -8,113 +10,89 @@ @pytest.mark.integration class ThreebotDeployerTests(BaseTest): + @classmethod + def setUpClass(cls): + super().setUpClass() - wallet_name = "wallet_{}".format(randint(1, 500)) + cls.info("Import a wallet") + cls.wallet_name = "demos_wallet" + cls.wallet_secret = os.environ.get("WALLET_SECRET") + if not cls.wallet_secret: + raise Exception("Please add WALLET_SECRET as environment variables") - def setUp(self): - super().setUp() - # if not hasattr(ThreebotDeployerTests, "wallet_name"): - self.wallet_name = self.random_name() - self.create_wallet(self.wallet_name) - - self.threebot_deployer = ThreebotDeployer(self.driver) - self.threebot_deployer.load() - - def tearDown(self): - self.wallet_name = self.random_name() - self.create_wallet(self.wallet_name) - super().tearDown() + j.clients.stellar.get(cls.wallet_name, network="STD", secret=cls.wallet_secret) def test01_deploy_and_delete_3bot(self): - """ - Test case to test deploy and delete a 3bot instance + """Test case to test deploy and delete a 3bot instance **Test Scenario** - #. Create a wallet. - #. Create a threebot instance. - #. Check that the threebot instance has been created successfully. - #. Delete the threebot instance. - #. Check that the threebot instance has been deleted successfully. - #. Delete the wallet. + + - Create a threebot instance. + - Check that the threebot instance has been created successfully. + - Delete the threebot instance. + - Check that the threebot instance has been deleted successfully. """ - self.info("Create a wallet") + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() self.info("Create a threebot instance") threebot_name = "threebot{}".format(randint(1, 1000)) password = randint(1, 500000) - threebot_instance_url = self.threebot_deployer.deploy_new_3bot( + threebot_instance_url = threebot_deployer.deploy_new_3bot( my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name ) self.info("Check that the threebot instance has been created successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") self.assertIn(threebot_name, my_3bot_instances) self.info("Delete the threebot instance") - self.threebot_deployer.delete_threebot_instance(my_3bot_instances=threebot_name, password=password) + threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) self.info("Check that the threebot instance has been deleted successfully") - my_3bot_instances = self.threebot_deployer.view_my_3bot("DELETED") + my_3bot_instances = threebot_deployer.view_my_3bot("DELETED") self.assertIn(threebot_name, my_3bot_instances) - self.info("Delete the wallet") - def test02_start_and_stop_my_3bot_instance(self): - """ - Test case to test start and stop a 3bot instance + """Test case to test start and stop a 3bot instance **Test Scenario** - #. Create a wallet. - #. Create a threebot instance. - #. Stopped the new created 3bot instance. - #. Check that the 3bot instance has been stopped successfully. - #. Start the 3bot instance. - #. Check that the 3bot instance has been started successfully. - #. Delete the 3bot instance. - #. Delete the wallet. - """ - self.info("Create a wallet") + - Create a threebot instance. + - Stopped the new created 3bot instance. + - Check that the 3bot instance has been stopped successfully. + - Start the 3bot instance. + - Check that the 3bot instance has been started successfully. + - Delete the 3bot instance. + """ + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() self.info("Create a threebot instance") threebot_name = "threebot{}".format(randint(1, 1000)) password = randint(1, 500000) - self.threebot_deployer.deploy_new_3bot( + threebot_deployer.deploy_new_3bot( my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name ) self.info("Stopped the new created 3bot instance") - self.stop_running_3bot_instance(my_3bot_instance_name=threebot_name, password=password) + threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=threebot_name, password=password) self.info("Check that the 3bot instance has been stopped successfully") - my_3bot_instances = self.threebot_deployer.view_my_3bot("STOPPED") + my_3bot_instances = threebot_deployer.view_my_3bot("STOPPED") self.assertIn(threebot_name, my_3bot_instances) self.info("Start the 3bot instance") - threebot_instance_url = self.start_stopped_3bot_instance( + threebot_instance_url = threebot_deployer.start_stopped_3bot_instance( my_3bot_instance_name=threebot_name, password=password, wallet_name=self.wallet_name ) self.info("Check that the 3bot instance has been started successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") self.assertIn(threebot_name, my_3bot_instances) self.info("Delete the 3bot instance") - self.threebot_deployer.delete_threebot_instance(my_3bot_instances=threebot_name, password=password) - - self.info("Delete the wallet") - - def create_wallet(self, wallet_name): - self.info("Create a wallet") - wallets = Wallets(self.driver) - wallets.load() - wallets.add_funded(wallet_name) - - def delete_wallet(self, wallet_name): - self.info("Delete the wallet") - wallets = Wallets(self.driver) - wallets.load() - wallets.delete(wallet_name) + threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) From b583f1ad2d337fc944e77756a6c95cb49bf60ce2 Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Wed, 10 Feb 2021 11:53:41 +0200 Subject: [PATCH 17/25] add ssh file --- .../threebot_deployer/threebot_deployer.py | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index 013eb0d0f5..6079661cc8 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -61,7 +61,7 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): deploy_new_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[1] deploy_new_3bot_button.click() - self.wait(self.driver, "v-progress-linear__buffer") + self.wait(self.driver, "v-progress-circular") # switch driver to iframe iframe = self.driver.find_elements_by_tag_name("iframe")[0] @@ -69,12 +69,16 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): # Create a new 3Bot instance chat_box = self.driver.find_element_by_class_name("chat") - create_button = chat_box.find_elements_by_class_name("v-input--selection-controls__ripple")[0] - create_button.click() + # create_button = chat_box.find_elements_by_class_name("v-input--selection-controls__ripple")[0] + # create_button.click() - self.click_button(self.driver, "NEXT") + # self.click_button(self.driver, "NEXT") # ThreeBot instance Name + import pdb + + pdb.set_trace() + self.wait(self.driver, "v-progress-circular") name_element = chat_box.find_element_by_class_name("v-text-field__slot") name_input = name_element.find_element_by_tag_name("input") name_input.send_keys(my_3bot_instances) @@ -88,14 +92,20 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): self.click_button(self.driver, "NEXT") + ssh_element = chat_box.find_element_by_class_name("v-text-field__slot") + ssh_input = ssh_element.find_element_by_tag_name("input") + ssh_input.send_keys("/home/hassan/.ssh/id_rsa.pub") + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") + # Threebot recovery password + import pdb + + pdb.set_trace() password_element = chat_box.find_element_by_class_name("v-text-field__slot") password_input = password_element.find_element_by_tag_name("input") password_input.send_keys(password) - self.click_button(self.driver, "NEXT") - self.wait(self.driver, "v-progress-circular") - # The deployment location policy ( We here use it automatically ) self.click_button(self.driver, "NEXT") From 4654c0adbc99d81a2615079ba9601e18642ee12a Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Thu, 11 Feb 2021 13:47:46 +0200 Subject: [PATCH 18/25] cover 3bot actions --- tests/frontend/pages/base.py | 2 +- .../threebot_deployer/threebot_deployer.py | 104 +++++++++++------- .../frontend/tests/test_threebot_deployer.py | 39 ++++++- 3 files changed, 101 insertions(+), 44 deletions(-) diff --git a/tests/frontend/pages/base.py b/tests/frontend/pages/base.py index 77b3a7d4f5..df98523562 100644 --- a/tests/frontend/pages/base.py +++ b/tests/frontend/pages/base.py @@ -11,7 +11,7 @@ def __init__(self, *args, **kwargs): pass def wait(self, driver, class_name): - wait = WebDriverWait(driver, 180) + wait = WebDriverWait(driver, 600) wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, class_name))) def click_button(self, driver, text): diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index 6079661cc8..be9efa7e64 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -1,5 +1,6 @@ -from jumpscale.loader import j from urllib.parse import urljoin + +from jumpscale.loader import j from tests.frontend.pages.base import Base @@ -31,67 +32,57 @@ def find_3bot_instance(self, action, my_3bot_instance_name): table_box = self.driver.find_element_by_class_name("v-data-table") table = table_box.find_element_by_tag_name("table") rows = table.find_elements_by_tag_name("tr") - - if action == "delete": - i = 2 - else: - i = 0 + actions = {"start": 0, "stop": 0, "delete": 2, "change_location": 3} + i = actions[action] for row in rows: - if row.text.split()[0] == my_3bot_instance_name: + if row.text and row.text.split()[0] == my_3bot_instance_name: row.find_elements_by_class_name("v-btn__content")[i].click() break def payment_process(self, wallet_name): chat_box = self.driver.find_element_by_class_name("chat") - payment = chat_box.find_elements_by_tag_name("mb-4").text + payment = chat_box.find_element_by_class_name("mb-4").text payment_info = payment.splitlines() destination_wallet_address = payment_info[3] currency = payment_info[5] reservation_ID = payment_info[7] total_amount = payment_info[9].split()[0] - a = getattr(j.clients.stellar, wallet_name)._get_asset(currency) + wallet = getattr(j.clients.stellar, wallet_name)._get_asset(currency) j.clients.stellar.demos_wallet.transfer( - destination_wallet_address, amount=total_amount, memo_text=reservation_ID, asset=f"{a.code}:{a.issuer}" + destination_wallet_address, + amount=total_amount, + memo_text=reservation_ID, + asset=f"{wallet.code}:{wallet.issuer}", ) def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): + # Deploy a new 3bot button + self.wait(self.driver, "v-progress-circular") deploy_new_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[1] deploy_new_3bot_button.click() - self.wait(self.driver, "v-progress-circular") - # switch driver to iframe iframe = self.driver.find_elements_by_tag_name("iframe")[0] self.driver.switch_to_frame(iframe) - - # Create a new 3Bot instance chat_box = self.driver.find_element_by_class_name("chat") - # create_button = chat_box.find_elements_by_class_name("v-input--selection-controls__ripple")[0] - # create_button.click() - - # self.click_button(self.driver, "NEXT") # ThreeBot instance Name - import pdb - - pdb.set_trace() self.wait(self.driver, "v-progress-circular") name_element = chat_box.find_element_by_class_name("v-text-field__slot") name_input = name_element.find_element_by_tag_name("input") name_input.send_keys(my_3bot_instances) - self.click_button(self.driver, "NEXT") - - self.wait(self.driver, "v-card__progress") + self.wait(self.driver, "v-progress-circular") # Choose how much resources the deployed solution will use. # We use 1 CPU, 2GB Memory, and 2GB[SSD] in this example. self.click_button(self.driver, "NEXT") + # choose ssh file ssh_element = chat_box.find_element_by_class_name("v-text-field__slot") ssh_input = ssh_element.find_element_by_tag_name("input") ssh_input.send_keys("/home/hassan/.ssh/id_rsa.pub") @@ -99,34 +90,33 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): self.wait(self.driver, "v-progress-circular") # Threebot recovery password - import pdb - - pdb.set_trace() password_element = chat_box.find_element_by_class_name("v-text-field__slot") password_input = password_element.find_element_by_tag_name("input") password_input.send_keys(password) + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") # The deployment location policy ( We here use it automatically ) self.click_button(self.driver, "NEXT") - self.wait(self.driver, "v-progress-circular") - self.click_button(self.driver, "NEXT") - + # TODO need line wait self.wait(self.driver, "v-progress-circular") self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") # Payment process - self.payment_process(wallet_name=wallet_name) + self.payment_process(wallet_name=wallet_name) self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") + self.click_button(self.driver, "NEXT") - self.wait(self.driver, "progressbar") + self.wait(self.driver, "v-progress-circular") # Threebot instance URL threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") - threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[14] + threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[16] self.click_button(self.driver, "FINISH") return threebot_instance_URL @@ -177,26 +167,24 @@ def delete_threebot_instance(self, my_3bot_instance_name, password): def start_stopped_3bot_instance(self, my_3bot_instance_name, password, wallet_name): # View an existing 3bot button - self.view_an_existing_3bot_button() + # self.view_an_existing_3bot_button() + # v-progress-linear__indeterminate + self.wait(self.driver, "v-progress-linear__indeterminate") - # Find correct 3bot instance row self.find_3bot_instance("start", my_3bot_instance_name=my_3bot_instance_name) # switch driver to iframe self.switch_driver_to_iframe() + self.wait(self.driver, "v-progress-circular") + password_chat_box = self.driver.find_element_by_class_name("chat") input_password = password_chat_box.find_element_by_tag_name("input") input_password.send_keys(password) self.click_button(self.driver, "NEXT") self.wait(self.driver, "progressbar") - - self.click_button(self.driver, "NEXT") - self.payment_process(wallet_name=wallet_name) - - self.click_button(self.driver, "NEXT") - self.wait(self.driver, "v-progress-linear__buffer") + self.wait(self.driver, "v-progress-circular") # Threebot instance URL threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") @@ -218,4 +206,38 @@ def stop_running_3bot_instance(self, my_3bot_instance_name, password): input_password.send_keys(password) self.click_button(self.driver, "CONFIRM") + self.wait(self.driver, "v-card__process") self.wait(self.driver, "v-progress-linear__buffer") + + def change_location(self, my_3bot_instance_name, password): + self.wait(self.driver, "v-progress-linear__indeterminate") + + self.view_an_existing_3bot_button() + self.find_3bot_instance("change_location", my_3bot_instance_name=my_3bot_instance_name) + + # switch driver to iframe + self.switch_driver_to_iframe() + + self.wait(self.driver, "v-progress-circular") + + password_chat_box = self.driver.find_element_by_class_name("chat") + input_password = password_chat_box.find_element_by_tag_name("input") + input_password.send_keys(password) + + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "progressbar") + self.wait(self.driver, "v-progress-circular") + + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") + + self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-linear__indeterminate") + self.wait(self.driver, "v-progress-circular") + + # Threebot instance URL + threebot_instance_chat_box = self.driver.find_element_by_class_name("chat") + threebot_instance_URL = threebot_instance_chat_box.find_element_by_class_name("v-card__text").text.split()[14] + + self.click_button(self.driver, "FINISH") + return threebot_instance_URL diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 956448e92c..36f514f057 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -71,8 +71,8 @@ def test02_start_and_stop_my_3bot_instance(self): threebot_deployer.load() self.info("Create a threebot instance") - threebot_name = "threebot{}".format(randint(1, 1000)) - password = randint(1, 500000) + threebot_name = self.random_name().lower() + password = "hassan" # randint(1, 500000) threebot_deployer.deploy_new_3bot( my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name ) @@ -96,3 +96,38 @@ def test02_start_and_stop_my_3bot_instance(self): self.info("Delete the 3bot instance") threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) + + def test03_change_deployed_threebot_location(self): + """Test case for changing a threebot location. + + **Test Scenario** + + - Create a threebot instance. + - Stopped the new created 3bot instance. + - Change the stopped threebot location. + - Check that threebot is reachable. + """ + + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() + + self.info("Create a threebot instance") + threebot_name = self.random_name().lower() + password = "hassan" # randint(1, 500000) + threebot_deployer.deploy_new_3bot( + my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name + ) + self.info("Stopped the new created 3bot instance") + threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=threebot_name, password=password) + + self.info("Change the stopped threebot location") + threebot_instance_url = threebot_deployer.change_location( + my_3bot_instance_name=threebot_name, password=password + ) + + self.info("Check that the 3bot instance has been started successfully") + self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) + my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") + self.assertIn(threebot_name, my_3bot_instances) + + threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) From 8c129c45b5d3f83878dfdf5b531c34ac1c0212db Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Wed, 17 Feb 2021 02:02:10 +0200 Subject: [PATCH 19/25] handle comments --- tests/frontend/pages/settings/settings.py | 9 +- .../threebot_deployer/threebot_deployer.py | 9 +- tests/frontend/pages/workloads/workloads.py | 3 +- .../frontend/tests/test_threebot_deployer.py | 91 +++++++++---------- 4 files changed, 61 insertions(+), 51 deletions(-) diff --git a/tests/frontend/pages/settings/settings.py b/tests/frontend/pages/settings/settings.py index 41fce55b4f..ca1a3b4346 100644 --- a/tests/frontend/pages/settings/settings.py +++ b/tests/frontend/pages/settings/settings.py @@ -30,7 +30,10 @@ def delete_admin(self, admin): deleted_admin = [admins[a] for a in admins.keys() if a == admin][0] delete_button = deleted_admin.find_element_by_tag_name("button") delete_button.click() - self.click_button(self.driver, "CONFIRM") + self.wait(self.driver, "progressbar") + buttons = self.driver.find_elements_by_class_name("v-btn") + next_button = [button for button in buttons if button.text == "CONFIRM"][1] + next_button.click() self.wait(self.driver, "v-card__progress") def add_escalation_emails(self, email): @@ -55,7 +58,6 @@ def add_identities(self, name, tname, email, words): form = identity_card.find_element_by_tag_name("form") inputs_div = form.find_elements_by_class_name("v-text-field__slot") inputs = {"Display name": name, "3Bot name": tname, "Email": email, "Words": words} - for input in inputs_div: if input.text in inputs.keys(): input.find_element_by_tag_name("input").send_keys(inputs[input.text]) @@ -73,6 +75,7 @@ def delete_identity(self, name): buttons[0].click() def developer_options(self, label): + self.wait(self.driver, "progressbar") cards = self.driver.find_elements_by_class_name("mt-0") developer_card = [card for card in cards if "Developer options" in card.text][0] options = developer_card.find_elements_by_class_name("v-input__slot") @@ -80,6 +83,7 @@ def developer_options(self, label): button.click() def list(self, name): + self.wait(self.driver, "progressbar") names = {} v_cards = self.driver.find_elements_by_class_name("v-card") card = [card for card in v_cards if name in card.text][0] @@ -89,6 +93,7 @@ def list(self, name): return names def select_card(self, name): + self.wait(self.driver, "progressbar") v_cards = self.driver.find_elements_by_class_name("v-card") card = [card for card in v_cards if name in card.text][0] button = card.find_element_by_tag_name("button") diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index be9efa7e64..ef99a70593 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -20,6 +20,13 @@ def view_an_existing_3bot_button(self): view_my_existing_3bot_button.click() self.wait(self.driver, "v-data-table__progress") + # select All ti show all 3bots + footer = self.driver.find_element_by_class_name("v-data-footer") + select_dev = footer.find_element_by_class_name("v-input__control") + select_dev.click() + options_list = self.driver.find_elements_by_class_name("v-list-item") + options_list[3].click() + def switch_driver_to_iframe(self): # switch driver to iframe self.wait(self.driver, "v-progress-linear__buffer") @@ -100,8 +107,8 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): self.click_button(self.driver, "NEXT") # TODO need line wait + self.wait(self.driver, "v-card--loading") self.wait(self.driver, "v-progress-circular") - self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") diff --git a/tests/frontend/pages/workloads/workloads.py b/tests/frontend/pages/workloads/workloads.py index 74f0f43694..0e653b1582 100644 --- a/tests/frontend/pages/workloads/workloads.py +++ b/tests/frontend/pages/workloads/workloads.py @@ -27,12 +27,12 @@ def select_workload_by_ID(self, workload_ID): click_ID.click() def create_workload(self, workload_name): - test_network = deployer.create_network(solution_name=workload_name) test_network_dict = test_network.config return int(test_network_dict.get("ids")[0]) def delete_selected_workloads(self, workload_ID): + self.load() self.select_workload_by_ID(workload_ID) # Delete all selected workloads @@ -42,6 +42,7 @@ def delete_selected_workloads(self, workload_ID): self.click_button(self.driver, "CONFIRM") def check_selected_workloads_status(self, workload_ID): + self.load() self.driver.refresh() self.wait(self.driver, "v-progress-linear__buffer") self.select_workload_by_ID(workload_ID) diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 36f514f057..7a5dd7766e 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -22,7 +22,19 @@ def setUpClass(cls): j.clients.stellar.get(cls.wallet_name, network="STD", secret=cls.wallet_secret) - def test01_deploy_and_delete_3bot(self): + def setUp(self): + super().setUp() + self.threebot_deployer = ThreebotDeployer(self.driver) + self.threebot_deployer.load() + + def tearDown(self): + self.info("Delete the threebot instance") + self.threebot_deployer.delete_threebot_instance( + my_3bot_instance_name=self.threebot_name, password=self.password + ) + super().tearDown() + + def test01_deploy_3bot(self): """Test case to test deploy and delete a 3bot instance **Test Scenario** @@ -30,30 +42,20 @@ def test01_deploy_and_delete_3bot(self): - Create a threebot instance. - Check that the threebot instance has been created successfully. - Delete the threebot instance. - - Check that the threebot instance has been deleted successfully. """ - threebot_deployer = ThreebotDeployer(self.driver) - threebot_deployer.load() self.info("Create a threebot instance") - threebot_name = "threebot{}".format(randint(1, 1000)) - password = randint(1, 500000) - threebot_instance_url = threebot_deployer.deploy_new_3bot( - my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name + self.threebot_name = "threebot{}".format(randint(1, 1000)) + self.password = randint(1, 500000) + threebot_instance_url = self.threebot_deployer.deploy_new_3bot( + my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Check that the threebot instance has been created successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") - self.assertIn(threebot_name, my_3bot_instances) - - self.info("Delete the threebot instance") - threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) - - self.info("Check that the threebot instance has been deleted successfully") - my_3bot_instances = threebot_deployer.view_my_3bot("DELETED") - self.assertIn(threebot_name, my_3bot_instances) + my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + self.assertIn(self.threebot_name, my_3bot_instances) def test02_start_and_stop_my_3bot_instance(self): """Test case to test start and stop a 3bot instance @@ -67,35 +69,32 @@ def test02_start_and_stop_my_3bot_instance(self): - Check that the 3bot instance has been started successfully. - Delete the 3bot instance. """ - threebot_deployer = ThreebotDeployer(self.driver) - threebot_deployer.load() self.info("Create a threebot instance") - threebot_name = self.random_name().lower() - password = "hassan" # randint(1, 500000) - threebot_deployer.deploy_new_3bot( - my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name + self.threebot_name = self.random_name().lower() + self.password = randint(1, 500000) + self.threebot_deployer.deploy_new_3bot( + my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Stopped the new created 3bot instance") - threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=threebot_name, password=password) + self.threebot_deployer.stop_running_3bot_instance( + my_3bot_instance_name=self.threebot_name, password=self.password + ) self.info("Check that the 3bot instance has been stopped successfully") - my_3bot_instances = threebot_deployer.view_my_3bot("STOPPED") - self.assertIn(threebot_name, my_3bot_instances) + my_3bot_instances = self.threebot_deployer.view_my_3bot("STOPPED") + self.assertIn(self.threebot_name, my_3bot_instances) self.info("Start the 3bot instance") - threebot_instance_url = threebot_deployer.start_stopped_3bot_instance( - my_3bot_instance_name=threebot_name, password=password, wallet_name=self.wallet_name + threebot_instance_url = self.threebot_deployer.start_stopped_3bot_instance( + my_3bot_instance_name=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Check that the 3bot instance has been started successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") - self.assertIn(threebot_name, my_3bot_instances) - - self.info("Delete the 3bot instance") - threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) + my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + self.assertIn(self.threebot_name, my_3bot_instances) def test03_change_deployed_threebot_location(self): """Test case for changing a threebot location. @@ -106,28 +105,26 @@ def test03_change_deployed_threebot_location(self): - Stopped the new created 3bot instance. - Change the stopped threebot location. - Check that threebot is reachable. + - Delete the 3bot instance. """ - threebot_deployer = ThreebotDeployer(self.driver) - threebot_deployer.load() - self.info("Create a threebot instance") - threebot_name = self.random_name().lower() - password = "hassan" # randint(1, 500000) - threebot_deployer.deploy_new_3bot( - my_3bot_instances=threebot_name, password=password, wallet_name=self.wallet_name + self.threebot_name = self.random_name().lower() + self.password = randint(1, 500000) + self.threebot_deployer.deploy_new_3bot( + my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Stopped the new created 3bot instance") - threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=threebot_name, password=password) + self.threebot_deployer.stop_running_3bot_instance( + my_3bot_instance_name=self.threebot_name, password=self.password + ) self.info("Change the stopped threebot location") - threebot_instance_url = threebot_deployer.change_location( - my_3bot_instance_name=threebot_name, password=password + threebot_instance_url = self.threebot_deployer.change_location( + my_3bot_instance_name=self.threebot_name, password=self.password ) self.info("Check that the 3bot instance has been started successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") - self.assertIn(threebot_name, my_3bot_instances) - - threebot_deployer.delete_threebot_instance(my_3bot_instance_name=threebot_name, password=password) + my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + self.assertIn(self.threebot_name, my_3bot_instances) From 3938fed48a43bd5f777892de164a67d97a2a3ed1 Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Wed, 17 Feb 2021 09:47:39 +0200 Subject: [PATCH 20/25] add tests docs --- docs/tests/README.md | 3 + docs/tests/clients/explorer/test_explorer.md | 26 ++++++ docs/tests/frontend/tests/test_settings.md | 92 +++++++++++++++++++ .../frontend/tests/test_threebot_deployer.md | 34 +++++++ docs/tests/frontend/tests/test_workloads.md | 4 +- tests/frontend/pages/settings/settings.py | 2 +- 6 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 docs/tests/clients/explorer/test_explorer.md create mode 100644 docs/tests/frontend/tests/test_settings.md create mode 100644 docs/tests/frontend/tests/test_threebot_deployer.md diff --git a/docs/tests/README.md b/docs/tests/README.md index 2ca2d912e8..f2664e26d0 100644 --- a/docs/tests/README.md +++ b/docs/tests/README.md @@ -1,6 +1,7 @@ ### Clients - [test_digitalocean](clients/digitalocean/test_digitalocean.md) +- [test_explorer](clients/explorer/test_explorer.md) - [test_github](clients/github/test_github.md) - [test_sendgrid](clients/sendgrid/test_sendgrid.md) @@ -12,6 +13,8 @@ - [test_packages](frontend/tests/test_packages.md) - [test_pools](frontend/tests/test_pools.md) +- [test_settings](frontend/tests/test_settings.md) +- [test_threebot_deployer](frontend/tests/test_threebot_deployer.md) - [test_wallets](frontend/tests/test_wallets.md) - [test_workloads](frontend/tests/test_workloads.md) diff --git a/docs/tests/clients/explorer/test_explorer.md b/docs/tests/clients/explorer/test_explorer.md new file mode 100644 index 0000000000..b3b2c112c6 --- /dev/null +++ b/docs/tests/clients/explorer/test_explorer.md @@ -0,0 +1,26 @@ +### test01_check_nodes + +Check the node lists in explorer client. + +**Test Scenario** + +- List all nodes. +- Check that node list contains the node_id, farm_id, resources. + +### test02_check_explorer_url + +Check the explorer URL. + +**Test Scenario** + +- Check the explorer url. +- Make sure explorer_url "https://explorer.testnet.grid.tf/api/v1" + +### test03_check_farms + +Check the farms lists in explorer client. + +**Test Scenario** + +- List all farms. +- Check that farm list contains the wallet_addresses, id, location. diff --git a/docs/tests/frontend/tests/test_settings.md b/docs/tests/frontend/tests/test_settings.md new file mode 100644 index 0000000000..14bee23efe --- /dev/null +++ b/docs/tests/frontend/tests/test_settings.md @@ -0,0 +1,92 @@ +### test01_add_admins + +Test case for adding an admin and deleting it. + +**Test Scenario** + +- Add an admin. +- Check that the admin has been added in the admins. +- Delete the admin. +- Check that the admin has been deleted from the admins. + +### test02_add_identity + +Test case for adding an identity and deleting it. + +**Test Scenario** + +- Add an identity. +- Check that the identity has been added in the identities. +- Delete the identity. +- Check that the identity has been deleted from the identities. + +### test03_add_escalation_emails + +Test case for adding an email and deleting it. + +**Test Scenario** + +- Add an email. +- Check that the email has been added in the escalation emails. +- Delete the email. +- Check that the email has been deleted from the escalation emails. + +### test04_allow_staging_ssl + +Test case for changing developer options (Allow staging ssl certificate). + +**Test Scenario** + +- Get the config for staging ssl certificate option. +- Change this config. +- Check that the config has been changed. + +### test05_allow_over_provisioning + +Test case for changing developer options (Allow over provisioning). + +**Test Scenario** + +- Get the config for over provisioning. +- Change this config. +- Check that the config has been changed. + +### test06_enable_explorer_logs + +Test case for changing developer options (Enable explorer logs). + +**Test Scenario** + +- Get the config for explorer logs. +- Change this config. +- Check that the config has been changed. + +### test07_enable_sending_escalation_emails + +Test case for changing developer options (Enable sending escalation emails). + +**Test Scenario** + +- Get the config for sending escalation emails. +- Change this config. +- Check that the config has been changed. + +### test08_pools_auto_extension + +Test case for changing developer options (Pools auto extension). + +**Test Scenario** + +- Get the config for pools auto extension. +- Change this config. +- Check that the config has been changed. + +### test09_sort_nodes_by_SRU + +Test case for changing developer options (Sort nodes by SRU). + +**Test Scenario** + +- Get the config for sort nodes by SRU. +- Change this config. +- Check that the config has been changed. diff --git a/docs/tests/frontend/tests/test_threebot_deployer.md b/docs/tests/frontend/tests/test_threebot_deployer.md new file mode 100644 index 0000000000..5690de66a5 --- /dev/null +++ b/docs/tests/frontend/tests/test_threebot_deployer.md @@ -0,0 +1,34 @@ +### test01_deploy_3bot + +Test case to test deploy and delete a 3bot instance + +**Test Scenario** + +- Create a threebot instance. +- Check that the threebot instance has been created successfully. +- Delete the threebot instance. + +### test02_start_and_stop_my_3bot_instance + +Test case to test start and stop a 3bot instance + +**Test Scenario** + +- Create a threebot instance. +- Stopped the new created 3bot instance. +- Check that the 3bot instance has been stopped successfully. +- Start the 3bot instance. +- Check that the 3bot instance has been started successfully. +- Delete the 3bot instance. + +### test03_change_deployed_threebot_location + +Test case for changing a threebot location. + +**Test Scenario** + +- Create a threebot instance. +- Stopped the new created 3bot instance. +- Change the stopped threebot location. +- Check that threebot is reachable. +- Delete the 3bot instance. diff --git a/docs/tests/frontend/tests/test_workloads.md b/docs/tests/frontend/tests/test_workloads.md index 52bcaa56da..6d5c4ee417 100644 --- a/docs/tests/frontend/tests/test_workloads.md +++ b/docs/tests/frontend/tests/test_workloads.md @@ -1,7 +1,9 @@ ### test01_delete_selected_workloads +Check that selected workload has been deleted correctly. + +**Test Scenario** -# Check that selected workload has been deleted correctly. - Create a workload. - Delete selected workload. - Check that selected workload has been deleted correctly. diff --git a/tests/frontend/pages/settings/settings.py b/tests/frontend/pages/settings/settings.py index ca1a3b4346..11b0d92e10 100644 --- a/tests/frontend/pages/settings/settings.py +++ b/tests/frontend/pages/settings/settings.py @@ -62,7 +62,7 @@ def add_identities(self, name, tname, email, words): if input.text in inputs.keys(): input.find_element_by_tag_name("input").send_keys(inputs[input.text]) - self.click_button(self.driver, "CLOSE") + self.click_button(self.driver, "ADD") self.wait(self.driver, "v-card__progress") def delete_identity(self, name): From 5d3fe1721f8c9a657110f43f48b784ca95afe0bf Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Mon, 1 Mar 2021 15:55:56 +0200 Subject: [PATCH 21/25] fix explorer test --- tests/clients/explorer/test_explorer.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/clients/explorer/test_explorer.py b/tests/clients/explorer/test_explorer.py index 908e10e289..c348b2ca4b 100644 --- a/tests/clients/explorer/test_explorer.py +++ b/tests/clients/explorer/test_explorer.py @@ -51,7 +51,7 @@ def test01_check_nodes(self): self.assertIn("node_id", str(node)) self.assertIn("farm_id", str(node)) - self.asserIn("total_resources", str(node)) + self.assertIn("total_resources", str(node)) def test02_check_explorer_url(self): """Check the explorer URL. @@ -79,7 +79,6 @@ def test03_check_farms(self): farm = choice(farms) self.info("Check that farm list contains the wallet_addresses, id, location") - - self.assertIn("wallet_addresses", str(farm)) - self.assertIn("id", str(farm)) - self.assertIn("location", str(farm)) + self.assertTrue(hasattr(farm, "wallet_addresses")) + self.assertTrue(hasattr(farm, "id")) + self.assertTrue(hasattr(farm, "location")) From 6e7349eb6d2b35758e8df868c84f68f19d35a9cd Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Mon, 1 Mar 2021 21:51:21 +0200 Subject: [PATCH 22/25] update 3bot tests --- tests/frontend/tests/test_settings.py | 1 + tests/frontend/tests/test_threebot_deployer.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/frontend/tests/test_settings.py b/tests/frontend/tests/test_settings.py index f7e9be0e5c..9edcdd4f52 100644 --- a/tests/frontend/tests/test_settings.py +++ b/tests/frontend/tests/test_settings.py @@ -35,6 +35,7 @@ def test01_add_admins(self): admins = settings.list("Admins") self.assertNotIn(admin, admins.keys()) + @pytest.mark.skip("can't get inputs name") def test02_add_identity(self): """Test case for adding an identity and deleting it. diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 7a5dd7766e..6cc62f7462 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -4,7 +4,6 @@ from jumpscale.loader import j from random import randint from tests.frontend.tests.base_tests import BaseTest -from tests.frontend.pages.wallets.wallets import Wallets from tests.frontend.pages.threebot_deployer.threebot_deployer import ThreebotDeployer @@ -21,6 +20,10 @@ def setUpClass(cls): raise Exception("Please add WALLET_SECRET as environment variables") j.clients.stellar.get(cls.wallet_name, network="STD", secret=cls.wallet_secret) + wallet = j.clients.stellar.get(cls.wallet_name) + wallet.secret = cls.wallet_secret + wallet.network = "STD" + wallet.save() def setUp(self): super().setUp() From 9a83b7fb7f74bf3b2690a265b79cf61b33bbb982 Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Wed, 3 Mar 2021 11:59:01 +0200 Subject: [PATCH 23/25] add Initializing your 3Bot wait --- tests/frontend/pages/threebot_deployer/threebot_deployer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index ef99a70593..c38960750c 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -109,11 +109,13 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): # TODO need line wait self.wait(self.driver, "v-card--loading") self.wait(self.driver, "v-progress-circular") + # wait for "Initializing your 3Bot ..." + self.wait(self.driver, "v-progress-circular") self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") # Payment process - + self.wait(self.driver, "v-progress-linear__indeterminate") self.payment_process(wallet_name=wallet_name) self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") From bafece22dd9c3e63c15f86edaa7811f254a7d8b2 Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Mon, 8 Mar 2021 14:15:05 +0200 Subject: [PATCH 24/25] update setup --- .../frontend/tests/test_threebot_deployer.py | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index 6cc62f7462..c8e2cdc82c 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -25,11 +25,6 @@ def setUpClass(cls): wallet.network = "STD" wallet.save() - def setUp(self): - super().setUp() - self.threebot_deployer = ThreebotDeployer(self.driver) - self.threebot_deployer.load() - def tearDown(self): self.info("Delete the threebot instance") self.threebot_deployer.delete_threebot_instance( @@ -46,18 +41,19 @@ def test01_deploy_3bot(self): - Check that the threebot instance has been created successfully. - Delete the threebot instance. """ - + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() self.info("Create a threebot instance") self.threebot_name = "threebot{}".format(randint(1, 1000)) self.password = randint(1, 500000) - threebot_instance_url = self.threebot_deployer.deploy_new_3bot( + threebot_instance_url = threebot_deployer.deploy_new_3bot( my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Check that the threebot instance has been created successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") self.assertIn(self.threebot_name, my_3bot_instances) def test02_start_and_stop_my_3bot_instance(self): @@ -72,31 +68,30 @@ def test02_start_and_stop_my_3bot_instance(self): - Check that the 3bot instance has been started successfully. - Delete the 3bot instance. """ - + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() self.info("Create a threebot instance") self.threebot_name = self.random_name().lower() self.password = randint(1, 500000) - self.threebot_deployer.deploy_new_3bot( + threebot_deployer.deploy_new_3bot( my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Stopped the new created 3bot instance") - self.threebot_deployer.stop_running_3bot_instance( - my_3bot_instance_name=self.threebot_name, password=self.password - ) + threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=self.threebot_name, password=self.password) self.info("Check that the 3bot instance has been stopped successfully") - my_3bot_instances = self.threebot_deployer.view_my_3bot("STOPPED") + my_3bot_instances = threebot_deployer.view_my_3bot("STOPPED") self.assertIn(self.threebot_name, my_3bot_instances) self.info("Start the 3bot instance") - threebot_instance_url = self.threebot_deployer.start_stopped_3bot_instance( + threebot_instance_url = threebot_deployer.start_stopped_3bot_instance( my_3bot_instance_name=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Check that the 3bot instance has been started successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") self.assertIn(self.threebot_name, my_3bot_instances) def test03_change_deployed_threebot_location(self): @@ -110,24 +105,23 @@ def test03_change_deployed_threebot_location(self): - Check that threebot is reachable. - Delete the 3bot instance. """ - + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() self.info("Create a threebot instance") self.threebot_name = self.random_name().lower() self.password = randint(1, 500000) - self.threebot_deployer.deploy_new_3bot( + threebot_deployer.deploy_new_3bot( my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name ) self.info("Stopped the new created 3bot instance") - self.threebot_deployer.stop_running_3bot_instance( - my_3bot_instance_name=self.threebot_name, password=self.password - ) + threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=self.threebot_name, password=self.password) self.info("Change the stopped threebot location") - threebot_instance_url = self.threebot_deployer.change_location( + threebot_instance_url = threebot_deployer.change_location( my_3bot_instance_name=self.threebot_name, password=self.password ) self.info("Check that the 3bot instance has been started successfully") self.assertEqual(urllib.request.urlopen(threebot_instance_url).getcode(), 200) - my_3bot_instances = self.threebot_deployer.view_my_3bot("RUNNING") + my_3bot_instances = threebot_deployer.view_my_3bot("RUNNING") self.assertIn(self.threebot_name, my_3bot_instances) From 5f41ffa25b54350a0d5a4f18a6816eb1f9b3c04d Mon Sep 17 00:00:00 2001 From: Mostafa Hassan Date: Wed, 10 Mar 2021 12:19:59 +0200 Subject: [PATCH 25/25] add wait --- .../threebot_deployer/threebot_deployer.py | 25 +++++++++++-------- .../frontend/tests/test_threebot_deployer.py | 11 ++++---- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/frontend/pages/threebot_deployer/threebot_deployer.py b/tests/frontend/pages/threebot_deployer/threebot_deployer.py index c38960750c..37d01cd696 100644 --- a/tests/frontend/pages/threebot_deployer/threebot_deployer.py +++ b/tests/frontend/pages/threebot_deployer/threebot_deployer.py @@ -20,7 +20,7 @@ def view_an_existing_3bot_button(self): view_my_existing_3bot_button.click() self.wait(self.driver, "v-data-table__progress") - # select All ti show all 3bots + # select All to show all 3bots footer = self.driver.find_element_by_class_name("v-data-footer") select_dev = footer.find_element_by_class_name("v-input__control") select_dev.click() @@ -64,12 +64,12 @@ def payment_process(self, wallet_name): ) def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): - # Deploy a new 3bot button self.wait(self.driver, "v-progress-circular") deploy_new_3bot_button = self.driver.find_elements_by_class_name("v-btn__content")[1] deploy_new_3bot_button.click() + self.wait(self.driver, "v-progress-circular") # switch driver to iframe iframe = self.driver.find_elements_by_tag_name("iframe")[0] @@ -83,16 +83,18 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): name_input.send_keys(my_3bot_instances) self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") + self.wait(self.driver, "v-card__progress") # Choose how much resources the deployed solution will use. # We use 1 CPU, 2GB Memory, and 2GB[SSD] in this example. self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-progress-circular") # choose ssh file - ssh_element = chat_box.find_element_by_class_name("v-text-field__slot") - ssh_input = ssh_element.find_element_by_tag_name("input") - ssh_input.send_keys("/home/hassan/.ssh/id_rsa.pub") + # ssh_element = chat_box.find_element_by_class_name("v-text-field__slot") + # ssh_input = ssh_element.find_element_by_tag_name("input") + # ssh_input.send_keys("/home/hassan/.ssh/id_rsa.pub") self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") @@ -101,25 +103,27 @@ def deploy_new_3bot(self, my_3bot_instances, password, wallet_name): password_input = password_element.find_element_by_tag_name("input") password_input.send_keys(password) self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-card__progress") self.wait(self.driver, "v-progress-circular") # The deployment location policy ( We here use it automatically ) self.click_button(self.driver, "NEXT") - # TODO need line wait - self.wait(self.driver, "v-card--loading") + self.wait(self.driver, "v-card__progress") + self.wait(self.driver, "v-progress-circular") # wait for "Initializing your 3Bot ..." self.wait(self.driver, "v-progress-circular") + # solution's expiration time self.click_button(self.driver, "NEXT") + self.wait(self.driver, "v-card__progress") self.wait(self.driver, "v-progress-circular") # Payment process - self.wait(self.driver, "v-progress-linear__indeterminate") + self.wait(self.driver, "v-progress-circular") self.payment_process(wallet_name=wallet_name) self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") - self.click_button(self.driver, "NEXT") self.wait(self.driver, "v-progress-circular") @@ -156,7 +160,7 @@ def view_my_3bot(self, status): return my_3bot_instances def delete_threebot_instance(self, my_3bot_instance_name, password): - + self.wait(self.driver, "v-progress-linear__buffer") # View an existing 3bot button self.view_an_existing_3bot_button() @@ -203,6 +207,7 @@ def start_stopped_3bot_instance(self, my_3bot_instance_name, password, wallet_na return threebot_instance_URL def stop_running_3bot_instance(self, my_3bot_instance_name, password): + self.wait(self.driver, "v-progress-linear__buffer") # View an existing 3bot button self.view_an_existing_3bot_button() diff --git a/tests/frontend/tests/test_threebot_deployer.py b/tests/frontend/tests/test_threebot_deployer.py index c8e2cdc82c..d754bf5c78 100644 --- a/tests/frontend/tests/test_threebot_deployer.py +++ b/tests/frontend/tests/test_threebot_deployer.py @@ -26,10 +26,11 @@ def setUpClass(cls): wallet.save() def tearDown(self): - self.info("Delete the threebot instance") - self.threebot_deployer.delete_threebot_instance( - my_3bot_instance_name=self.threebot_name, password=self.password - ) + self.info("Stop and Delete the threebot instance") + threebot_deployer = ThreebotDeployer(self.driver) + threebot_deployer.load() + threebot_deployer.stop_running_3bot_instance(my_3bot_instance_name=self.threebot_name, password=self.password) + threebot_deployer.delete_threebot_instance(my_3bot_instance_name=self.threebot_name, password=self.password) super().tearDown() def test01_deploy_3bot(self): @@ -44,7 +45,7 @@ def test01_deploy_3bot(self): threebot_deployer = ThreebotDeployer(self.driver) threebot_deployer.load() self.info("Create a threebot instance") - self.threebot_name = "threebot{}".format(randint(1, 1000)) + self.threebot_name = self.random_name().lower() self.password = randint(1, 500000) threebot_instance_url = threebot_deployer.deploy_new_3bot( my_3bot_instances=self.threebot_name, password=self.password, wallet_name=self.wallet_name