From 13a1963a378764ea4c155abd587c8896bc08c897 Mon Sep 17 00:00:00 2001 From: Bhuvnesh Singh Date: Wed, 4 Jan 2023 01:46:03 -0800 Subject: [PATCH 01/22] remove lowercase while parsing csv --- tabcmd/commands/user/user_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tabcmd/commands/user/user_data.py b/tabcmd/commands/user/user_data.py index cab01427..b9012078 100644 --- a/tabcmd/commands/user/user_data.py +++ b/tabcmd/commands/user/user_data.py @@ -206,7 +206,7 @@ def get_users_from_file(csv_file: io.TextIOWrapper, logger=None) -> List[TSC.Use def _parse_line(line: str) -> Optional[TSC.UserItem]: if line is None or line is False or line == "\n" or line == "": return None - line = line.strip().lower() + line = line.strip() line_parts: List[str] = line.split(",") data = Userdata() values: List[str] = list(map(str.strip, line_parts)) From 02edb282ca29fae62b58f847217a838b9b42be80 Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 6 Jan 2023 14:52:55 -0800 Subject: [PATCH 02/22] Jac/user agent (#219) --- tabcmd/commands/auth/session.py | 5 ++++- tabcmd/execution/parent_parser.py | 14 +------------- tabcmd/version.py | 9 +++++++++ tests/e2e/online_tests.py | 6 ------ 4 files changed, 14 insertions(+), 20 deletions(-) create mode 100644 tabcmd/version.py diff --git a/tabcmd/commands/auth/session.py b/tabcmd/commands/auth/session.py index 986b2c71..e6583f87 100644 --- a/tabcmd/commands/auth/session.py +++ b/tabcmd/commands/auth/session.py @@ -7,10 +7,13 @@ import urllib3 from urllib3.exceptions import InsecureRequestWarning +from tabcmd.version import version from tabcmd.commands.constants import Errors from tabcmd.execution.localize import _ from tabcmd.execution.logger_config import log +from typing import Dict, Any + class Session: """ @@ -152,7 +155,7 @@ def _set_connection_options(self) -> TSC.Server: # args still to be handled here: # proxy, --no-proxy, # cert - http_options = {} + http_options: Dict[str, Any] = {"headers": {"User-Agent": "Tabcmd/{}".format(version)}} if self.no_certcheck: http_options["verify"] = False urllib3.disable_warnings(category=InsecureRequestWarning) diff --git a/tabcmd/execution/parent_parser.py b/tabcmd/execution/parent_parser.py index 0aa6ee75..21890728 100644 --- a/tabcmd/execution/parent_parser.py +++ b/tabcmd/execution/parent_parser.py @@ -1,21 +1,9 @@ import argparse -import logging from .localize import _ from .logger_config import log from .map_of_commands import CommandsMap - - -# when we drop python 3.8, this could be replaced with this lighter weight option -# from importlib.metadata import version, PackageNotFoundError -from pkg_resources import get_distribution, DistributionNotFound - -try: - version = get_distribution("tabcmd").version -except DistributionNotFound: - version = "2.x.unknown" - pass - +from tabcmd.version import version """ Note: output order is influenced first by grouping, then by order they are added in here diff --git a/tabcmd/version.py b/tabcmd/version.py new file mode 100644 index 00000000..e6e2d0f1 --- /dev/null +++ b/tabcmd/version.py @@ -0,0 +1,9 @@ +# when we drop python 3.8, this could be replaced with this lighter weight option +# from importlib.metadata import version, PackageNotFoundError +from pkg_resources import get_distribution, DistributionNotFound + +try: + version = get_distribution("tabcmd").version +except DistributionNotFound: + version = "2.0.0" + pass diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index b73d73b7..117b67a8 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -129,12 +129,6 @@ def _get_datasource(self, server_file): arguments = [command, server_file] _test_command(arguments) - def _get_datasource(self, server_file): - command = "get" - server_file = "/datasources/" + server_file - arguments = [command, server_file] - _test_command(arguments) - def _create_extract(self, wb_name): command = "createextracts" arguments = [command, "-w", wb_name, "--encrypt"] From 6e48d625f67d0a18bcca75a714188f6315de707e Mon Sep 17 00:00:00 2001 From: Jac Date: Wed, 1 Feb 2023 12:59:10 -0800 Subject: [PATCH 03/22] Jac/logging (#224) * handle exit with no logger * redact logging token, also clean up exit a little * add logging to check signin failure * remove duplicate log lines * refactor: extract strings to local dictionary to make it easier to extract to another file * add error handling around session file data * add flows and object detail to list output * some test coverage --- tabcmd/commands/auth/login_command.py | 2 +- tabcmd/commands/auth/session.py | 103 +++++++++++------- tabcmd/commands/constants.py | 43 ++++---- .../delete_command.py | 2 +- .../export_command.py | 2 +- .../get_url_command.py | 2 +- .../publish_command.py | 2 +- .../runschedule_command.py | 2 +- .../extracts/create_extracts_command.py | 2 +- .../extracts/decrypt_extracts_command.py | 2 +- .../extracts/delete_extracts_command.py | 2 +- .../extracts/encrypt_extracts_command.py | 2 +- .../extracts/reencrypt_extracts_command.py | 2 +- .../extracts/refresh_extracts_command.py | 2 +- tabcmd/commands/group/create_group_command.py | 2 +- tabcmd/commands/group/delete_group_command.py | 2 +- .../project/create_project_command.py | 2 +- .../project/delete_project_command.py | 2 +- .../project/publish_samples_command.py | 2 +- tabcmd/commands/site/create_site_command.py | 2 +- tabcmd/commands/site/delete_site_command.py | 2 +- tabcmd/commands/site/edit_site_command.py | 2 +- tabcmd/commands/site/list_command.py | 25 ++++- tabcmd/commands/site/list_sites_command.py | 2 +- tabcmd/commands/user/add_users_command.py | 2 +- tabcmd/commands/user/create_site_users.py | 2 +- tabcmd/commands/user/create_users_command.py | 2 +- .../user/delete_site_users_command.py | 2 +- tabcmd/commands/user/remove_users_command.py | 2 +- tabcmd/execution/tabcmd_controller.py | 18 ++- tests/commands/test_run_commands.py | 3 +- tests/commands/test_session.py | 41 +++++-- tests/e2e/tests_integration.py | 4 +- 33 files changed, 171 insertions(+), 118 deletions(-) diff --git a/tabcmd/commands/auth/login_command.py b/tabcmd/commands/auth/login_command.py index 647fee3f..d042f724 100644 --- a/tabcmd/commands/auth/login_command.py +++ b/tabcmd/commands/auth/login_command.py @@ -22,4 +22,4 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - session.create_session(args) + session.create_session(args, logger) diff --git a/tabcmd/commands/auth/session.py b/tabcmd/commands/auth/session.py index e6583f87..2e7107ef 100644 --- a/tabcmd/commands/auth/session.py +++ b/tabcmd/commands/auth/session.py @@ -48,8 +48,8 @@ def __init__(self): self.timeout = None self.logging_level = "info" - self._read_from_json() self.logger = log(__name__, self.logging_level) # instantiate here mostly for tests + self._read_from_json() self.tableau_server = None # this one is an object that doesn't get persisted in the file # called before we connect to the server @@ -206,7 +206,7 @@ def _create_new_connection(self) -> TSC.Server: return self.tableau_server def _read_existing_state(self): - if self._check_json(): + if self._json_exists(): self._read_from_json() def _print_server_info(self): @@ -265,13 +265,13 @@ def _get_saved_credentials(self): return credentials # external entry point: - def create_session(self, args): + def create_session(self, args, logger): signed_in_object = None # pull out cached info from json, then overwrite with new args if available self._read_existing_state() self._update_session_data(args) self.logging_level = args.logging_level or self.logging_level - self.logger = self.logger or log(__class__.__name__, self.logging_level) + self.logger = logger or log(__class__.__name__, self.logging_level) credentials = None if args.password: @@ -344,51 +344,70 @@ def _clear_data(self): self.timeout = None # json file functions ---------------------------------------------------- + # These should be moved into a separate class def _get_file_path(self): home_path = os.path.expanduser("~") file_path = os.path.join(home_path, "tableau_auth.json") return file_path def _read_from_json(self): - if not self._check_json(): + if not self._json_exists(): return file_path = self._get_file_path() - data = {} - with open(str(file_path), "r") as file_contents: - data = json.load(file_contents) + content = None try: - for auth in data["tableau_auth"]: - self.auth_token = auth["auth_token"] - self.server_url = auth["server"] - self.site_name = auth["site_name"] - self.site_id = auth["site_id"] - self.username = auth["username"] - self.user_id = auth["user_id"] - self.token_name = auth["personal_access_token_name"] - self.token_value = auth["personal_access_token"] - self.last_login_using = auth["last_login_using"] - self.password_file = auth["password_file"] - self.no_prompt = auth["no_prompt"] - self.no_certcheck = auth["no_certcheck"] - self.certificate = auth["certificate"] - self.no_proxy = auth["no_proxy"] - self.proxy = auth["proxy"] - self.timeout = auth["timeout"] - except KeyError as e: - self.logger.debug(_("sessionoptions.errors.bad_password_file"), e) - self._remove_json() - except Exception as any_error: - self.logger.info(_("session.new_session")) - self._remove_json() + with open(str(file_path), "r") as file_contents: + data = json.load(file_contents) + content = data["tableau_auth"] + except json.JSONDecodeError as e: + self._wipe_bad_json(e, "Error reading data from session file") + except IOError as e: + self._wipe_bad_json(e, "Error reading session file") + except AttributeError as e: + self._wipe_bad_json(e, "Error parsing session details from file") + except Exception as e: + self._wipe_bad_json(e, "Unexpected error reading session details from file") + + try: + auth = content[0] + self.auth_token = auth["auth_token"] + self.server_url = auth["server"] + self.site_name = auth["site_name"] + self.site_id = auth["site_id"] + self.username = auth["username"] + self.user_id = auth["user_id"] + self.token_name = auth["personal_access_token_name"] + self.token_value = auth["personal_access_token"] + self.last_login_using = auth["last_login_using"] + self.password_file = auth["password_file"] + self.no_prompt = auth["no_prompt"] + self.no_certcheck = auth["no_certcheck"] + self.certificate = auth["certificate"] + self.no_proxy = auth["no_proxy"] + self.proxy = auth["proxy"] + self.timeout = auth["timeout"] + except AttributeError as e: + self._wipe_bad_json(e, "Unrecognized attribute in session file") + except Exception as e: + self._wipe_bad_json(e, "Failed to load session file") - def _check_json(self): + def _wipe_bad_json(self, e, message): + self.logger.debug(message + ": " + e.__str__()) + self.logger.info(_("session.new_session")) + self._remove_json() + + def _json_exists(self): + # todo: make this location configurable home_path = os.path.expanduser("~") file_path = os.path.join(home_path, "tableau_auth.json") return os.path.exists(file_path) def _save_session_to_json(self): - data = self._serialize_for_save() - self._save_file(data) + try: + data = self._serialize_for_save() + self._save_file(data) + except Exception as e: + self._wipe_bad_json(e, "Failed to save session file") def _save_file(self, data): file_path = self._get_file_path() @@ -420,7 +439,15 @@ def _serialize_for_save(self): return data def _remove_json(self): - file_path = self._get_file_path() - self._save_file({}) - if os.path.exists(file_path): - os.remove(file_path) + file_path = "" + try: + if not self._json_exists(): + return + file_path = self._get_file_path() + self._save_file({}) + if os.path.exists(file_path): + os.remove(file_path) + except Exception as e: + message = "Error clearing session data from {}: check and remove manually".format(file_path) + self.logger.error(message) + self.logger.error(e) diff --git a/tabcmd/commands/constants.py b/tabcmd/commands/constants.py index c37cb259..c491a135 100644 --- a/tabcmd/commands/constants.py +++ b/tabcmd/commands/constants.py @@ -1,8 +1,6 @@ import inspect import sys -from tableauserverclient import ServerResponseError - from tabcmd.execution.localize import _ @@ -25,20 +23,19 @@ def is_expired_session(error): @staticmethod def is_resource_conflict(error): if hasattr(error, "code"): - return error.code == Constants.source_already_exists + return error.code.startswith(Constants.resource_conflict_general) @staticmethod def is_login_error(error): if hasattr(error, "code"): return error.code == Constants.login_error - @staticmethod - def is_server_response_error(error): - return isinstance(error, ServerResponseError) - # https://gist.github.com/FredLoney/5454553 @staticmethod def log_stack(logger): + if not logger: + print("logger not available: cannot show stack") + return try: """The log header message formatter.""" HEADER_FMT = "Printing Call Stack at %s::%s" @@ -49,11 +46,10 @@ def log_stack(logger): file, line, func = here[1:4] start = 0 n_lines = 5 - logger.trace(HEADER_FMT % (file, func)) - - for frame in stack[start + 2 : n_lines]: + logger.debug(HEADER_FMT % (file, func)) + for frame in stack[start + 1 : n_lines]: file, line, func = frame[1:4] - logger.trace(STACK_FMT % (file, line, func)) + logger.debug(STACK_FMT % (file, line, func)) except Exception as e: logger.info("Error printing stack trace:", e) @@ -66,9 +62,9 @@ def exit_with_error(logger, message=None, exception=None): if exception: if message: logger.debug("Error message: " + message) - Errors.check_common_error_codes_and_explain(logger, exception) + Errors.check_common_error_codes_and_explain(logger, exception) except Exception as exc: - print(sys.stderr, "Error during log call from exception - {}".format(exc)) + print(sys.stderr, "Error during log call from exception - {} {}".format(exc.__class__, message)) try: logger.info("Exiting...") except Exception: @@ -77,16 +73,15 @@ def exit_with_error(logger, message=None, exception=None): @staticmethod def check_common_error_codes_and_explain(logger, exception): - if Errors.is_server_response_error(exception): - logger.error(_("publish.errors.unexpected_server_response").format(exception)) - if Errors.is_expired_session(exception): - logger.error(_("session.errors.session_expired")) - # TODO: add session as an argument to this method - # and add the full command line as a field in Session? - # "session.session_expired_login")) - # session.renew_session - return - if exception.code == Constants.source_not_found: - logger.error(_("publish.errors.server_resource_not_found"), exception) + # most errors contain as much info in the message as we can get from the code + # identify any that we can add useful detail for and include them here + if Errors.is_expired_session(exception): + # catch this one so we can attempt to refresh the session before telling them it failed + logger.error(_("session.errors.session_expired")) + # TODO: add session as an argument to this method + # and add the full command line as a field in Session? + # "session.session_expired_login")) + # session.renew_session() + return else: logger.error(exception) diff --git a/tabcmd/commands/datasources_and_workbooks/delete_command.py b/tabcmd/commands/datasources_and_workbooks/delete_command.py index e28f5f45..9ac1a9e3 100644 --- a/tabcmd/commands/datasources_and_workbooks/delete_command.py +++ b/tabcmd/commands/datasources_and_workbooks/delete_command.py @@ -32,7 +32,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) content_type: str = "" if args.workbook: content_type = "workbook" diff --git a/tabcmd/commands/datasources_and_workbooks/export_command.py b/tabcmd/commands/datasources_and_workbooks/export_command.py index 6775181a..4dad864b 100644 --- a/tabcmd/commands/datasources_and_workbooks/export_command.py +++ b/tabcmd/commands/datasources_and_workbooks/export_command.py @@ -73,7 +73,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) view_content_url, wb_content_url = ExportCommand.parse_export_url_to_workbook_and_view(logger, args.url) logger.debug([view_content_url, wb_content_url]) if not view_content_url and not wb_content_url: diff --git a/tabcmd/commands/datasources_and_workbooks/get_url_command.py b/tabcmd/commands/datasources_and_workbooks/get_url_command.py index 83fb158a..440f8c8a 100644 --- a/tabcmd/commands/datasources_and_workbooks/get_url_command.py +++ b/tabcmd/commands/datasources_and_workbooks/get_url_command.py @@ -41,7 +41,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) if " " in args.url: Errors.exit_with_error(logger, _("export.errors.white_space_workbook_view")) diff --git a/tabcmd/commands/datasources_and_workbooks/publish_command.py b/tabcmd/commands/datasources_and_workbooks/publish_command.py index c4866bbd..ce04fa31 100644 --- a/tabcmd/commands/datasources_and_workbooks/publish_command.py +++ b/tabcmd/commands/datasources_and_workbooks/publish_command.py @@ -36,7 +36,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) if args.project_name: try: diff --git a/tabcmd/commands/datasources_and_workbooks/runschedule_command.py b/tabcmd/commands/datasources_and_workbooks/runschedule_command.py index 9661135b..9634c4e2 100644 --- a/tabcmd/commands/datasources_and_workbooks/runschedule_command.py +++ b/tabcmd/commands/datasources_and_workbooks/runschedule_command.py @@ -23,7 +23,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) schedule = DatasourcesAndWorkbooks.get_items_by_name(logger, server.schedules, args.schedule)[0] logger.info(_("runschedule.status")) Errors.exit_with_error(logger, "Not yet implemented") diff --git a/tabcmd/commands/extracts/create_extracts_command.py b/tabcmd/commands/extracts/create_extracts_command.py index f23be293..4dcf2ba0 100644 --- a/tabcmd/commands/extracts/create_extracts_command.py +++ b/tabcmd/commands/extracts/create_extracts_command.py @@ -31,7 +31,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) creation_call = None try: logger.debug( diff --git a/tabcmd/commands/extracts/decrypt_extracts_command.py b/tabcmd/commands/extracts/decrypt_extracts_command.py index a43d8fa6..cb47d7fa 100644 --- a/tabcmd/commands/extracts/decrypt_extracts_command.py +++ b/tabcmd/commands/extracts/decrypt_extracts_command.py @@ -24,7 +24,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) try: logger.info(_("decryptextracts.status").format(args.site_name)) diff --git a/tabcmd/commands/extracts/delete_extracts_command.py b/tabcmd/commands/extracts/delete_extracts_command.py index 62ba3bb0..20eaf5b8 100644 --- a/tabcmd/commands/extracts/delete_extracts_command.py +++ b/tabcmd/commands/extracts/delete_extracts_command.py @@ -31,7 +31,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) try: if args.datasource: logger.info(_("deleteextracts.for.datasource").format(args.datasource)) diff --git a/tabcmd/commands/extracts/encrypt_extracts_command.py b/tabcmd/commands/extracts/encrypt_extracts_command.py index 1b697fd7..0454d0ea 100644 --- a/tabcmd/commands/extracts/encrypt_extracts_command.py +++ b/tabcmd/commands/extracts/encrypt_extracts_command.py @@ -26,7 +26,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) try: logger.info(_("encryptextracts.status").format(site_item.name)) diff --git a/tabcmd/commands/extracts/reencrypt_extracts_command.py b/tabcmd/commands/extracts/reencrypt_extracts_command.py index 4f7b4ef5..e8eb363a 100644 --- a/tabcmd/commands/extracts/reencrypt_extracts_command.py +++ b/tabcmd/commands/extracts/reencrypt_extracts_command.py @@ -26,7 +26,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) try: logger.info(_("reencryptextracts.status").format(site_item.name)) diff --git a/tabcmd/commands/extracts/refresh_extracts_command.py b/tabcmd/commands/extracts/refresh_extracts_command.py index e18020a3..73a467ff 100644 --- a/tabcmd/commands/extracts/refresh_extracts_command.py +++ b/tabcmd/commands/extracts/refresh_extracts_command.py @@ -33,7 +33,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) refresh_action = "refresh" if args.addcalculations or args.removecalculations: diff --git a/tabcmd/commands/group/create_group_command.py b/tabcmd/commands/group/create_group_command.py index 8aeddb84..357fccb5 100644 --- a/tabcmd/commands/group/create_group_command.py +++ b/tabcmd/commands/group/create_group_command.py @@ -25,7 +25,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) try: logger.info(_("creategroup.status").format(args.name)) new_group = TSC.GroupItem(args.name) diff --git a/tabcmd/commands/group/delete_group_command.py b/tabcmd/commands/group/delete_group_command.py index accf62e4..71af42a5 100644 --- a/tabcmd/commands/group/delete_group_command.py +++ b/tabcmd/commands/group/delete_group_command.py @@ -25,7 +25,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) try: logger.info(_("tabcmd.find.group").format(args.name)) group_id = Server.find_group(logger, server, args.name).id diff --git a/tabcmd/commands/project/create_project_command.py b/tabcmd/commands/project/create_project_command.py index 03a7477d..85853edd 100644 --- a/tabcmd/commands/project/create_project_command.py +++ b/tabcmd/commands/project/create_project_command.py @@ -30,7 +30,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) parent_id = None readable_name = args.project_name if args.parent_project_path: diff --git a/tabcmd/commands/project/delete_project_command.py b/tabcmd/commands/project/delete_project_command.py index 74b72395..b107406c 100644 --- a/tabcmd/commands/project/delete_project_command.py +++ b/tabcmd/commands/project/delete_project_command.py @@ -27,7 +27,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) if args.parent_project_path: logger.debug("parent path: {}".format(args.parent_project_path)) diff --git a/tabcmd/commands/project/publish_samples_command.py b/tabcmd/commands/project/publish_samples_command.py index 6d8a54c4..046e4491 100644 --- a/tabcmd/commands/project/publish_samples_command.py +++ b/tabcmd/commands/project/publish_samples_command.py @@ -31,7 +31,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) try: project = PublishSamplesCommand.get_project_by_name_and_parent_path( logger, server, args.project_name, args.parent_project_path diff --git a/tabcmd/commands/site/create_site_command.py b/tabcmd/commands/site/create_site_command.py index 84208188..f684ba1f 100644 --- a/tabcmd/commands/site/create_site_command.py +++ b/tabcmd/commands/site/create_site_command.py @@ -27,7 +27,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) admin_mode = "ContentAndUsers" # default: allow site admins to manage users if not args.site_admin_user_management: admin_mode = "ContentOnly" diff --git a/tabcmd/commands/site/delete_site_command.py b/tabcmd/commands/site/delete_site_command.py index 56256c8e..f1892730 100644 --- a/tabcmd/commands/site/delete_site_command.py +++ b/tabcmd/commands/site/delete_site_command.py @@ -25,7 +25,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) target_site: TSC.SiteItem = Server.get_site_by_name(logger, server, args.site_name_to_delete) target_site_id = target_site.id logger.debug(strings[3].format(target_site_id, server.site_id)) diff --git a/tabcmd/commands/site/edit_site_command.py b/tabcmd/commands/site/edit_site_command.py index 2d7e3db4..ab6451ed 100644 --- a/tabcmd/commands/site/edit_site_command.py +++ b/tabcmd/commands/site/edit_site_command.py @@ -30,7 +30,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) if args.url: diff --git a/tabcmd/commands/site/list_command.py b/tabcmd/commands/site/list_command.py index a77eab75..da6b9f76 100644 --- a/tabcmd/commands/site/list_command.py +++ b/tabcmd/commands/site/list_command.py @@ -3,7 +3,6 @@ from tabcmd.commands.auth.session import Session from tabcmd.commands.constants import Errors from tabcmd.commands.server import Server -from tabcmd.execution.global_options import * from tabcmd.execution.localize import _ from tabcmd.execution.logger_config import log @@ -13,34 +12,48 @@ class ListCommand(Server): Command to return a list of content the user can access """ + # strings to move to string files + local_strings = { + "tabcmd_content_listing": "===== Listing {0} content for user {1}...", + "tabcmd_listing_label_name": "NAME:", + "tabcmd_listing_label_id": "ID:", + } + name: str = "list" description: str = "List content items of a specified type" @staticmethod def define_args(list_parser): args_group = list_parser.add_argument_group(title=ListCommand.name) - args_group.add_argument("content", choices=["projects", "workbooks", "datasources"], help="View content") + args_group.add_argument( + "content", choices=["projects", "workbooks", "datasources", "flows"], help="View content" + ) + args_group.add_argument("-d", "--details", action="store_true", help="Show object details") @staticmethod def run_command(args): logger = log(__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) content_type = args.content try: + logger.info(ListCommand.local_strings.tabcmd_content_listing.format(content_type, session.username)) + if content_type == "projects": items = server.projects.all() elif content_type == "workbooks": items = server.workbooks.all() elif content_type == "datasources": items = server.datasources.all() + elif content_type == "flows": + items = server.flows.all() - logger.info("===== Listing {0} content for user {1}...".format(content_type, session.username)) for item in items: - logger.info("NAME:".rjust(10), item.name) - logger.info("ID:".rjust(10), item.id) + logger.info(ListCommand.local_strings.tabcmd_listing_label_name.rjust(10), item.name) + if args.details: + logger.info(item) except Exception as e: Errors.exit_with_error(logger, e) diff --git a/tabcmd/commands/site/list_sites_command.py b/tabcmd/commands/site/list_sites_command.py index 66ad24c7..e077072e 100644 --- a/tabcmd/commands/site/list_sites_command.py +++ b/tabcmd/commands/site/list_sites_command.py @@ -26,7 +26,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) try: sites, pagination = server.sites.get() logger.info(_("listsites.status").format(session.username)) diff --git a/tabcmd/commands/user/add_users_command.py b/tabcmd/commands/user/add_users_command.py index 801f0253..1fc79b46 100644 --- a/tabcmd/commands/user/add_users_command.py +++ b/tabcmd/commands/user/add_users_command.py @@ -25,7 +25,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) logger.info(_("tabcmd.add.users.to_site").format(args.users.name, args.name)) diff --git a/tabcmd/commands/user/create_site_users.py b/tabcmd/commands/user/create_site_users.py index 7a01af21..ce515fec 100644 --- a/tabcmd/commands/user/create_site_users.py +++ b/tabcmd/commands/user/create_site_users.py @@ -31,7 +31,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) number_of_users_listed = 0 number_of_users_added = 0 number_of_errors = 0 diff --git a/tabcmd/commands/user/create_users_command.py b/tabcmd/commands/user/create_users_command.py index 71468f39..1c3ab4fa 100644 --- a/tabcmd/commands/user/create_users_command.py +++ b/tabcmd/commands/user/create_users_command.py @@ -31,7 +31,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) number_of_users_listed = 0 number_of_users_added = 0 number_of_errors = 0 diff --git a/tabcmd/commands/user/delete_site_users_command.py b/tabcmd/commands/user/delete_site_users_command.py index 42f088fd..731ed7bf 100644 --- a/tabcmd/commands/user/delete_site_users_command.py +++ b/tabcmd/commands/user/delete_site_users_command.py @@ -28,7 +28,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) logger.info(_("deleteusers.status").format(args.filename.name)) diff --git a/tabcmd/commands/user/remove_users_command.py b/tabcmd/commands/user/remove_users_command.py index 722ce3d5..38f0f720 100644 --- a/tabcmd/commands/user/remove_users_command.py +++ b/tabcmd/commands/user/remove_users_command.py @@ -25,7 +25,7 @@ def run_command(args): logger = log(__class__.__name__, args.logging_level) logger.debug(_("tabcmd.launching")) session = Session() - server = session.create_session(args) + server = session.create_session(args, logger) logger.info(_("tabcmd.delete.users.from_server").format(args.users.name, args.name)) diff --git a/tabcmd/execution/tabcmd_controller.py b/tabcmd/execution/tabcmd_controller.py index 1f7f0fdc..3798b30c 100644 --- a/tabcmd/execution/tabcmd_controller.py +++ b/tabcmd/execution/tabcmd_controller.py @@ -23,29 +23,27 @@ def run(parser, user_input=None): sys.exit(0) user_input = user_input or sys.argv[1:] namespace = parser.parse_args(user_input) - if namespace.logging_level and namespace.logging_level != logging.INFO: + if hasattr("namespace", "logging_level") and namespace.logging_level != logging.INFO: print("logging:", namespace.logging_level) logger = log(__name__, namespace.logging_level or logging.INFO) - if namespace.password or namespace.token_value: - logger.trace(namespace.func) + if (hasattr("namespace", "password") or hasattr("namespace", "token_value")) and hasattr("namespace", "func"): + # don't print whole namespace because it has secrets + logger.debug(namespace.func) else: - logger.trace(namespace) + logger.debug(namespace) if namespace.language: set_client_locale(namespace.language, logger) - try: - command_name = namespace.func - except AttributeError as aer: - # if no command was given, argparse will just not create the attribute - parser.print_help() - sys.exit(2) try: # if a subcommand was identified, call the function assigned to it # this is the functional equivalent of the call by reflection in the previous structure # https://stackoverflow.com/questions/49038616/argparse-subparsers-with-functions namespace.func.run_command(namespace) except Exception as e: + # todo: use log_stack here for better presentation logger.exception(e) + # if no command was given, argparse will just not create the attribute + sys.exit(2) return namespace diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index 774878b6..43004ba5 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -76,7 +76,8 @@ def _set_up_session(mock_session, mock_server): def test_login(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) login_command.LoginCommand.run_command(mock_args) - mock_session.assert_called_with(mock_args) + + mock_session.assert_called_with(mock_args, ANY) @patch("tabcmd.commands.auth.session.Session.end_session_and_clear_data") def test_logout(self, mock_end_session, mock_create_session, mock_server): diff --git a/tests/commands/test_session.py b/tests/commands/test_session.py index fba90fd8..5f4c8297 100644 --- a/tests/commands/test_session.py +++ b/tests/commands/test_session.py @@ -68,9 +68,9 @@ def _set_mocks_for_json_file_exists(mock_path, does_it_exist=True): return mock_path -def _set_mocks_for_creds_file(mock_file): - mock_file.readlines.return_value = "dummypassword" - return mock_file +def _set_mock_file_content(mock_load, expected_content): + mock_load.return_value = expected_content + return mock_load @mock.patch("json.dump") @@ -96,6 +96,25 @@ def test_save_session_to_json(self, mock_open, mock_path, mock_load, mock_dump): test_session._save_session_to_json() assert mock_dump.was_called() + def clear_session(self, mock_open, mock_path, mock_load, mock_dump): + _set_mocks_for_json_file_exists(mock_path) + test_session = Session() + test_session.username = "USN" + test_session.server = "SRVR" + test_session._clear_data() + assert test_session.username is None + assert test_session.server is None + + def test_json_not_present(self, mock_open, mock_path, mock_load, mock_dump): + _set_mocks_for_json_file_exists(mock_path, False) + assert mock_open.was_not_called() + + def test_json_invalid(self, mock_open, mock_path, mock_load, mock_dump): + _set_mocks_for_json_file_exists(mock_path) + _set_mock_file_content(mock_load, "just a string") + test_session = Session() + assert test_session.username is None + @mock.patch("getpass.getpass") class BuildCredentialsTests(unittest.TestCase): @@ -212,7 +231,7 @@ def test_create_session_first_time_no_args( mock_tsc().users.get_by_id.return_value = None new_session = Session() with self.assertRaises(SystemExit): - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) @mock.patch("tableauserverclient.Server") def test_create_session_first_time_with_token_arg( @@ -224,7 +243,7 @@ def test_create_session_first_time_with_token_arg( test_args.token_name = "tn" test_args.token_value = "foo" new_session = Session() - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token assert auth.auth_token.name is not None, auth.auth_token @@ -241,7 +260,7 @@ def test_create_session_first_time_with_password_arg( test_args.password = "pppp" new_session = Session() - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token assert new_session.username == "uuuu", new_session @@ -259,7 +278,7 @@ def test_create_session_first_time_with_password_file_as_password( test_args.password_file = "filename" with mock.patch("builtins.open", mock.mock_open(read_data="my_password")): new_session = Session() - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token @@ -277,7 +296,7 @@ def test_create_session_first_time_with_password_file_as_token( test_args.password_file = "filename" with mock.patch("builtins.open", mock.mock_open(read_data="my_token")): new_session = Session() - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token @@ -309,7 +328,7 @@ def test_create_session_with_active_session_saved( test_args.no_prompt = False new_session = Session() - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token assert mock_tsc.has_been_called() @@ -326,7 +345,7 @@ def test_create_session_with_saved_expired_username_session( mock_pass.getpass.return_value = "success" test_args.password = "eqweqwe" new_session = Session() - auth = new_session.create_session(test_args) + auth = new_session.create_session(test_args, None) assert mock_pass.has_been_called() assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token @@ -379,7 +398,7 @@ def test_connection_times_out(self): test_args.server = "https://nothere.com" with self.assertRaises(SystemExit): - new_session.create_session(test_args) + new_session.create_session(test_args, None) # should test connection doesn't time out? diff --git a/tests/e2e/tests_integration.py b/tests/e2e/tests_integration.py index e18c38b6..f63588b1 100644 --- a/tests/e2e/tests_integration.py +++ b/tests/e2e/tests_integration.py @@ -65,7 +65,7 @@ def test_log_in(): no_cookie=False, ) test_session = Session() - server = test_session.create_session(args) + server = test_session.create_session(args, logger) assert test_session.auth_token is not None assert test_session.site_id is not None assert test_session.user_id is not None @@ -96,7 +96,7 @@ def test_reuse_session(self): no_cookie=False, ) test_session = Session() - test_session.create_session(args) + test_session.create_session(args, logger) assert test_session.auth_token is not None assert test_session.site_id is not None assert test_session.user_id is not None From c261d76e26cef78769df1166db0018d0fa37ba62 Mon Sep 17 00:00:00 2001 From: Jac Date: Thu, 2 Feb 2023 11:58:22 -0800 Subject: [PATCH 04/22] Jac/filter spaces (#225) * encoding filter values to handle spaces and special chars in filters * added new --filter option to pass in un-encoded value for simpler input * refactoring order of args, method names * stopped sending filters for workbooks --- .../datasources_and_workbooks_command.py | 52 +++++++---- .../export_command.py | 40 ++++---- .../get_url_command.py | 6 +- .../test_datasources_and_workbooks_command.py | 93 +++++++++++++++++++ tests/commands/test_geturl_utils.py | 10 +- 5 files changed, 152 insertions(+), 49 deletions(-) create mode 100644 tests/commands/test_datasources_and_workbooks_command.py diff --git a/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py b/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py index 1d345a12..1a2169f5 100644 --- a/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py +++ b/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py @@ -1,3 +1,5 @@ +import urllib + import tableauserverclient as TSC from tabcmd.commands.constants import Errors @@ -23,7 +25,7 @@ def get_view_by_content_url(logger, server, view_content_url) -> TSC.ViewItem: try: req_option = TSC.RequestOptions() req_option.filter.add(TSC.Filter("contentUrl", TSC.RequestOptions.Operator.Equals, view_content_url)) - logger.trace(req_option.get_query_params()) + logger.debug(req_option.get_query_params()) matching_views, paging = server.views.get(req_option) except Exception as e: Errors.exit_with_error(logger, e) @@ -37,7 +39,7 @@ def get_wb_by_content_url(logger, server, workbook_content_url) -> TSC.WorkbookI try: req_option = TSC.RequestOptions() req_option.filter.add(TSC.Filter("contentUrl", TSC.RequestOptions.Operator.Equals, workbook_content_url)) - logger.trace(req_option.get_query_params()) + logger.debug(req_option.get_query_params()) matching_workbooks, paging = server.workbooks.get(req_option) except Exception as e: Errors.exit_with_error(logger, e) @@ -51,7 +53,7 @@ def get_ds_by_content_url(logger, server, datasource_content_url) -> TSC.Datasou try: req_option = TSC.RequestOptions() req_option.filter.add(TSC.Filter("contentUrl", TSC.RequestOptions.Operator.Equals, datasource_content_url)) - logger.trace(req_option.get_query_params()) + logger.debug(req_option.get_query_params()) matching_datasources, paging = server.datasources.get(req_option) except Exception as e: Errors.exit_with_error(logger, e) @@ -60,39 +62,52 @@ def get_ds_by_content_url(logger, server, datasource_content_url) -> TSC.Datasou return matching_datasources[0] @staticmethod - def apply_values_from_url_params(request_options: TSC.PDFRequestOptions, url, logger) -> None: - # should be able to replace this with request_options._append_view_filters(params) + def apply_values_from_url_params(logger, request_options: TSC.PDFRequestOptions, url) -> None: logger.debug(url) try: if "?" in url: query = url.split("?")[1] - logger.trace("Query parameters: {}".format(query)) + logger.debug("Query parameters: {}".format(query)) else: logger.debug("No query parameters present in url") return params = query.split("&") - logger.trace(params) + logger.debug(params) for value in params: if value.startswith(":"): - DatasourcesAndWorkbooks.apply_option_value(request_options, value, logger) + DatasourcesAndWorkbooks.apply_options_in_url(logger, request_options, value) else: # it must be a filter - DatasourcesAndWorkbooks.apply_filter_value(request_options, value, logger) + DatasourcesAndWorkbooks.apply_encoded_filter_value(logger, request_options, value) except Exception as e: logger.warn("Error building filter params", e) # ExportCommand.log_stack(logger) # type: ignore + # this is called from within from_url_params, for each view_filter value + @staticmethod + def apply_encoded_filter_value(logger, request_options, value): + # the REST API doesn't appear to have the option to disambiguate with "Parameters." + value = value.replace("Parameters.", "") + # the filter values received from the url are already url encoded. tsc will encode them again. + # so we run url.decode, which will be a no-op if they are not encoded. + decoded_value = urllib.parse.unquote(value) + logger.debug("url had `{0}`, saved as `{1}`".format(value, decoded_value)) + DatasourcesAndWorkbooks.apply_filter_value(logger, request_options, decoded_value) + + # this is called for each filter value, + # from apply_options, which expects an un-encoded input, + # or from apply_url_params via apply_encoded_filter_value which decodes the input @staticmethod - def apply_filter_value(request_options: TSC.PDFRequestOptions, value: str, logger) -> None: - # todo: do we need to strip Parameters.x -> x? - logger.trace("handling filter param {}".format(value)) + def apply_filter_value(logger, request_options: TSC.PDFRequestOptions, value: str) -> None: + logger.debug("handling filter param {}".format(value)) data_filter = value.split("=") request_options.vf(data_filter[0], data_filter[1]) + # this is called from within from_url_params, for each param value @staticmethod - def apply_option_value(request_options: TSC.PDFRequestOptions, value: str, logger) -> None: - logger.trace("handling url option {}".format(value)) + def apply_options_in_url(logger, request_options: TSC.PDFRequestOptions, value: str) -> None: + logger.debug("handling url option {}".format(value)) setting = value.split("=") if ":iid" == setting[0]: logger.debug(":iid value ignored in url") @@ -111,19 +126,18 @@ def is_truthy(value: str): return value.lower() in ["yes", "y", "1", "true"] @staticmethod - def apply_png_options(request_options: TSC.ImageRequestOptions, args, logger): + def apply_png_options(logger, request_options: TSC.ImageRequestOptions, args): if args.height or args.width: - # only applicable for png logger.warn("Height/width arguments not yet implemented in export") # Always request high-res images request_options.image_resolution = "high" @staticmethod - def apply_pdf_options(request_options: TSC.PDFRequestOptions, args, logger): - request_options.page_type = args.pagesize + def apply_pdf_options(logger, request_options: TSC.PDFRequestOptions, args): if args.pagelayout: - logger.debug("Setting page layout to: {}".format(args.pagelayout)) request_options.orientation = args.pagelayout + if args.pagesize: + request_options.page_type = args.pagesize @staticmethod def save_to_data_file(logger, output, filename): diff --git a/tabcmd/commands/datasources_and_workbooks/export_command.py b/tabcmd/commands/datasources_and_workbooks/export_command.py index 4dad864b..970c4b9f 100644 --- a/tabcmd/commands/datasources_and_workbooks/export_command.py +++ b/tabcmd/commands/datasources_and_workbooks/export_command.py @@ -59,8 +59,8 @@ def define_args(export_parser): group.add_argument("--height", default=600, help=_("export.options.height")) group.add_argument( "--filter", - metavar="COLUMN:VALUE", - help="View filter to apply to the view", + metavar="COLUMN=VALUE", + help="Data filter to apply to the view", ) """ @@ -104,9 +104,10 @@ def run_command(args): default_filename = "{}.png".format(view_item.name) - except Exception as e: + except TSC.ServerResponseException as e: Errors.exit_with_error(logger, _("publish.errors.unexpected_server_response").format(""), e) - + except Exception as e: + Errors.exit_with_error(logger, exception=e) try: save_name = args.filename or default_filename if args.csv: @@ -118,25 +119,19 @@ def run_command(args): Errors.exit_with_error(logger, "Error saving to file", e) @staticmethod - def apply_values_from_args(request_options: TSC.PDFRequestOptions, args, logger=None) -> None: - logger.debug( - "Args: {}, {}, {}, {}, {}".format(args.pagelayout, args.pagesize, args.width, args.height, args.filter) - ) - if args.pagelayout: - request_options.orientation = args.pagelayout - if args.pagesize: - request_options.page_type = args.pagesize + def apply_filters_from_args(request_options: TSC.PDFRequestOptions, args, logger=None) -> None: if args.filter: params = args.filter.split("&") for value in params: - ExportCommand.apply_filter_value(request_options, value, logger) + ExportCommand.apply_filter_value(logger, request_options, value) + # filtering isn't actually implemented for workbooks in REST @staticmethod def download_wb_pdf(server, workbook_item, args, logger): logger.debug(args.url) pdf_options = TSC.PDFRequestOptions(maxage=1) - ExportCommand.apply_values_from_url_params(pdf_options, args.url, logger) - ExportCommand.apply_values_from_args(pdf_options, args, logger) + ExportCommand.apply_values_from_url_params(logger, pdf_options, args.url) + ExportCommand.apply_pdf_options(logger, pdf_options, args) logger.debug(pdf_options.get_query_params()) server.workbooks.populate_pdf(workbook_item, pdf_options) return workbook_item.pdf @@ -145,8 +140,9 @@ def download_wb_pdf(server, workbook_item, args, logger): def download_view_pdf(server, view_item, args, logger): logger.debug(args.url) pdf_options = TSC.PDFRequestOptions(maxage=1) - ExportCommand.apply_values_from_url_params(pdf_options, args.url, logger) - ExportCommand.apply_values_from_args(pdf_options, args, logger) + ExportCommand.apply_values_from_url_params(logger, pdf_options, args.url) + ExportCommand.apply_filters_from_args(pdf_options, args, logger) + ExportCommand.apply_pdf_options(logger, pdf_options, args) logger.debug(pdf_options.get_query_params()) server.views.populate_pdf(view_item, pdf_options) return view_item.pdf @@ -155,8 +151,8 @@ def download_view_pdf(server, view_item, args, logger): def download_csv(server, view_item, args, logger): logger.debug(args.url) csv_options = TSC.CSVRequestOptions(maxage=1) - ExportCommand.apply_values_from_url_params(csv_options, args.url, logger) - ExportCommand.apply_values_from_args(csv_options, args, logger) + ExportCommand.apply_values_from_url_params(logger, csv_options, args.url) + ExportCommand.apply_filters_from_args(csv_options, args, logger) logger.debug(csv_options.get_query_params()) server.views.populate_csv(view_item, csv_options) return view_item.csv @@ -165,9 +161,9 @@ def download_csv(server, view_item, args, logger): def download_png(server, view_item, args, logger): logger.debug(args.url) image_options = TSC.ImageRequestOptions(maxage=1) - ExportCommand.apply_values_from_url_params(image_options, args.url, logger) - ExportCommand.apply_values_from_args(image_options, args, logger) - DatasourcesAndWorkbooks.apply_png_options(image_options, args, logger) + ExportCommand.apply_values_from_url_params(logger, image_options, args.url) + ExportCommand.apply_filters_from_args(image_options, args, logger) + DatasourcesAndWorkbooks.apply_png_options(logger, image_options, args) logger.debug(image_options.get_query_params()) server.views.populate_image(view_item, image_options) return view_item.image diff --git a/tabcmd/commands/datasources_and_workbooks/get_url_command.py b/tabcmd/commands/datasources_and_workbooks/get_url_command.py index 440f8c8a..ae7d3a54 100644 --- a/tabcmd/commands/datasources_and_workbooks/get_url_command.py +++ b/tabcmd/commands/datasources_and_workbooks/get_url_command.py @@ -176,7 +176,7 @@ def generate_pdf(logger, server, args, view_url): view_item: TSC.ViewItem = GetUrl.get_view_by_content_url(logger, server, view_url) logger.debug(_("content_type.view") + ": {}".format(view_item.name)) req_option_pdf = TSC.PDFRequestOptions(maxage=1) - DatasourcesAndWorkbooks.apply_values_from_url_params(req_option_pdf, args.url, logger) + DatasourcesAndWorkbooks.apply_values_from_url_params(logger, req_option_pdf, args.url) server.views.populate_pdf(view_item, req_option_pdf) filename = GetUrl.filename_from_args(args.filename, view_item.name, "pdf") DatasourcesAndWorkbooks.save_to_file(logger, view_item.pdf, filename) @@ -190,7 +190,7 @@ def generate_png(logger, server, args, view_url): view_item: TSC.ViewItem = GetUrl.get_view_by_content_url(logger, server, view_url) logger.debug(_("content_type.view") + ": {}".format(view_item.name)) req_option_csv = TSC.ImageRequestOptions(maxage=1) - DatasourcesAndWorkbooks.apply_values_from_url_params(req_option_csv, args.url, logger) + DatasourcesAndWorkbooks.apply_values_from_url_params(logger, req_option_csv, args.url) server.views.populate_image(view_item, req_option_csv) filename = GetUrl.filename_from_args(args.filename, view_item.name, "png") DatasourcesAndWorkbooks.save_to_file(logger, view_item.image, filename) @@ -204,7 +204,7 @@ def generate_csv(logger, server, args, view_url): view_item: TSC.ViewItem = GetUrl.get_view_by_content_url(logger, server, view_url) logger.debug(_("content_type.view") + ": {}".format(view_item.name)) req_option_csv = TSC.CSVRequestOptions(maxage=1) - DatasourcesAndWorkbooks.apply_values_from_url_params(req_option_csv, args.url, logger) + DatasourcesAndWorkbooks.apply_values_from_url_params(logger, req_option_csv, args.url) server.views.populate_csv(view_item, req_option_csv) file_name_with_path = GetUrl.filename_from_args(args.filename, view_item.name, "csv") DatasourcesAndWorkbooks.save_to_data_file(logger, view_item.csv, file_name_with_path) diff --git a/tests/commands/test_datasources_and_workbooks_command.py b/tests/commands/test_datasources_and_workbooks_command.py new file mode 100644 index 00000000..0cbf765b --- /dev/null +++ b/tests/commands/test_datasources_and_workbooks_command.py @@ -0,0 +1,93 @@ +import argparse +from unittest.mock import MagicMock + +from tabcmd.commands.datasources_and_workbooks.datasources_and_workbooks_command import DatasourcesAndWorkbooks +import tableauserverclient as tsc +import unittest +from unittest import mock + +mock_logger = mock.MagicMock() + +fake_item = mock.MagicMock() +fake_item.name = "fake-name" +fake_item.id = "fake-id" + +getter = MagicMock() +getter.get = MagicMock("get", return_value=([fake_item], 1)) + +mock_args = argparse.Namespace() + + +class ParameterTests(unittest.TestCase): + def test_get_view_url_from_names(self): + wb_name = "WB" + view_name = "VIEW" + out_value = DatasourcesAndWorkbooks.get_view_url_from_names(wb_name, view_name) + assert out_value == "{}/sheets/{}".format(wb_name, view_name) + + def test_apply_filters_from_url_params(self): + query_params = "?Product=widget" + expected = [("Product", "widget")] + request_options = tsc.PDFRequestOptions() + DatasourcesAndWorkbooks.apply_values_from_url_params(mock_logger, request_options, query_params) + assert request_options.view_filters == expected + + def test_apply_encoded_filters_from_url_params(self): + query_params = "?Product%20type=Z%C3%BCrich" + expected = [("Product type", "Zürich")] + request_options = tsc.PDFRequestOptions() + DatasourcesAndWorkbooks.apply_values_from_url_params(mock_logger, request_options, query_params) + assert request_options.view_filters == expected + + def test_apply_options_from_url_params(self): + query_params = "?:iid=5&:refresh=yes&:size=600,700" + request_options = tsc.PDFRequestOptions() + DatasourcesAndWorkbooks.apply_values_from_url_params(mock_logger, request_options, query_params) + assert request_options.max_age == 0 + + def test_apply_png_options(self): + # these aren't implemented yet. the layout and orientation ones don't apply. + mock_args.width = 800 + mock_args.height = 76 + request_options = tsc.ImageRequestOptions() + DatasourcesAndWorkbooks.apply_png_options(mock_logger, request_options, mock_args) + assert request_options.image_resolution == "high" + + def test_apply_pdf_options(self): + expected_page = tsc.PDFRequestOptions.PageType.Folio.__str__() + expected_layout = tsc.PDFRequestOptions.Orientation.Portrait.__str__() + mock_args.pagelayout = expected_layout + mock_args.pagesize = expected_page + request_options = tsc.PDFRequestOptions() + DatasourcesAndWorkbooks.apply_pdf_options(mock_logger, request_options, mock_args) + assert request_options.page_type == expected_page + assert request_options.orientation == expected_layout + + +@mock.patch("tableauserverclient.Server") +class MockedServerTests(unittest.TestCase): + def test_mock_getter(self, mock_server): + mock_server.fakes = getter + mock_server.fakes.get() + getter.get.assert_called() + + def test_get_ds_by_content_url(self, mock_server): + mock_server.datasources = getter + content_url = "blah" + DatasourcesAndWorkbooks.get_ds_by_content_url(mock_logger, mock_server, content_url) + getter.get.assert_called() + # should also assert the filter on content url + + def test_get_wb_by_content_url(self, mock_server): + mock_server.workbooks = getter + content_url = "blah" + DatasourcesAndWorkbooks.get_wb_by_content_url(mock_logger, mock_server, content_url) + getter.get.assert_called() + # should also assert the filter on content url + + def test_get_view_by_content_url(self, mock_server): + mock_server.views = getter + content_url = "blah" + DatasourcesAndWorkbooks.get_view_by_content_url(mock_logger, mock_server, content_url) + getter.get.assert_called() + # should also assert the filter on content url diff --git a/tests/commands/test_geturl_utils.py b/tests/commands/test_geturl_utils.py index 117a9181..32497be6 100644 --- a/tests/commands/test_geturl_utils.py +++ b/tests/commands/test_geturl_utils.py @@ -149,7 +149,7 @@ def test_apply_filter(self): options = TSC.PDFRequestOptions() assert options.view_filters is not None assert len(options.view_filters) is 0 - ExportCommand.apply_filter_value(options, "param1=value1", mock_logger) + ExportCommand.apply_filter_value(mock_logger, options, "param1=value1") assert len(options.view_filters) == 1 assert options.view_filters[0] == ("param1", "value1") @@ -158,7 +158,7 @@ def test_extract_query_params(self): options = TSC.PDFRequestOptions() assert options.view_filters is not None assert len(options.view_filters) is 0 - ExportCommand.apply_values_from_url_params(options, url, mock_logger) + ExportCommand.apply_values_from_url_params(mock_logger, options, url) assert len(options.view_filters) == 1 assert options.view_filters[0] == ("param1", "value1") @@ -166,21 +166,21 @@ def test_refresh_true(self): url = "wb-name/view-name?:refresh=TRUE" options = TSC.PDFRequestOptions() assert options.max_age == -1 - ExportCommand.apply_values_from_url_params(options, url, mock_logger) + ExportCommand.apply_values_from_url_params(mock_logger, options, url) assert options.max_age == 0 def test_refresh_yes(self): url = "wb-name/view-name?:refresh=yes" options = TSC.PDFRequestOptions() assert options.max_age == -1 - ExportCommand.apply_values_from_url_params(options, url, mock_logger) + ExportCommand.apply_values_from_url_params(mock_logger, options, url) assert options.max_age == 0 def test_refresh_y(self): url = "wb-name/view-name?:refresh=y" options = TSC.PDFRequestOptions() assert options.max_age == -1 - ExportCommand.apply_values_from_url_params(options, url, mock_logger) + ExportCommand.apply_values_from_url_params(mock_logger, options, url) assert options.max_age == 0 def test_save_to_binary_file(self): From 9d1d40d61855b148609ec1a318ec7f1a5e19935b Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 17 Feb 2023 12:57:44 -0800 Subject: [PATCH 05/22] Jac/delete extract (#227) * add --url, --include-all/--embedded-datasources for create/refresh/delete extract commands * replace polling code with library call * add views to workbook listing --- WorldIndicators.tdsx | Bin 0 -> 160687 bytes pyproject.toml | 5 +- .../export_command.py | 4 +- .../get_url_command.py | 2 +- .../extracts/create_extracts_command.py | 33 +++--- .../extracts/delete_extracts_command.py | 22 ++-- tabcmd/commands/extracts/extracts.py | 30 ++++++ .../extracts/refresh_extracts_command.py | 69 +++--------- tabcmd/commands/group/create_group_command.py | 2 +- tabcmd/commands/server.py | 2 +- tabcmd/commands/site/list_command.py | 15 +-- tabcmd/execution/global_options.py | 11 +- tests/commands/test_run_commands.py | 19 +++- tests/e2e/online_tests.py | 98 ++++++++---------- 14 files changed, 151 insertions(+), 161 deletions(-) create mode 100644 WorldIndicators.tdsx create mode 100644 tabcmd/commands/extracts/extracts.py diff --git a/WorldIndicators.tdsx b/WorldIndicators.tdsx new file mode 100644 index 0000000000000000000000000000000000000000..2df960ccda93870af5bbb4f8f8f7cd6ba0d13e65 GIT binary patch literal 160687 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̮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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 72a1bf27..24b331c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,15 +44,14 @@ dependencies = [ "appdirs", "doit", "ftfy", - "polling2", "pyinstaller_versionfile", - "requests>=2.11,<3.0", + "requests>=2.25,<3.0", "setuptools_scm", "types-appdirs", "types-mock", "types-requests", "types-setuptools", - "tableauserverclient>=0.19", + "tableauserverclient>=0.23", "urllib3>=1.24.3,<2.0", ] [project.optional-dependencies] diff --git a/tabcmd/commands/datasources_and_workbooks/export_command.py b/tabcmd/commands/datasources_and_workbooks/export_command.py index 970c4b9f..4ee355e0 100644 --- a/tabcmd/commands/datasources_and_workbooks/export_command.py +++ b/tabcmd/commands/datasources_and_workbooks/export_command.py @@ -75,7 +75,7 @@ def run_command(args): session = Session() server = session.create_session(args, logger) view_content_url, wb_content_url = ExportCommand.parse_export_url_to_workbook_and_view(logger, args.url) - logger.debug([view_content_url, wb_content_url]) + logger.debug(["view_url:", view_content_url, "workbook:", wb_content_url]) if not view_content_url and not wb_content_url: view_example = "/workbook_name/view_name" message = "{} [{}]".format( @@ -104,7 +104,7 @@ def run_command(args): default_filename = "{}.png".format(view_item.name) - except TSC.ServerResponseException as e: + except TSC.ServerResponseError as e: Errors.exit_with_error(logger, _("publish.errors.unexpected_server_response").format(""), e) except Exception as e: Errors.exit_with_error(logger, exception=e) diff --git a/tabcmd/commands/datasources_and_workbooks/get_url_command.py b/tabcmd/commands/datasources_and_workbooks/get_url_command.py index ae7d3a54..38518bd8 100644 --- a/tabcmd/commands/datasources_and_workbooks/get_url_command.py +++ b/tabcmd/commands/datasources_and_workbooks/get_url_command.py @@ -92,7 +92,7 @@ def get_file_type_from_filename(logger, url, file_name): Errors.exit_with_error(logger, _("tabcmd.get.extension.not_found").format(file_name)) logger.debug("filetype: {}".format(type_of_file)) - if type_of_file in ["pdf", "csv", "png", "twb", "twbx", "tdsx"]: + if type_of_file in ["pdf", "csv", "png", "twb", "twbx", "tdsx", "tds"]: return type_of_file Errors.exit_with_error(logger, _("tabcmd.get.extension.not_found").format(file_name)) diff --git a/tabcmd/commands/extracts/create_extracts_command.py b/tabcmd/commands/extracts/create_extracts_command.py index 4dcf2ba0..3f39f04a 100644 --- a/tabcmd/commands/extracts/create_extracts_command.py +++ b/tabcmd/commands/extracts/create_extracts_command.py @@ -2,6 +2,7 @@ from tabcmd.commands.auth.session import Session from tabcmd.commands.constants import Errors +from tabcmd.commands.extracts.extracts import Extracts from tabcmd.commands.server import Server from tabcmd.execution.global_options import * from tabcmd.execution.localize import _ @@ -19,12 +20,11 @@ class CreateExtracts(Server): @staticmethod def define_args(create_extract_parser): group = create_extract_parser.add_argument_group(title=CreateExtracts.name) - set_ds_xor_wb_args(group) + set_ds_xor_wb_args(group, True) set_embedded_datasources_options(group) set_encryption_option(group) set_project_arg(group) set_parent_project_arg(group) - set_site_url_arg(group) @staticmethod def run_command(args): @@ -32,24 +32,27 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args, logger) - creation_call = None - try: - logger.debug( - "Extract params: encrypt={}, include_all={}, datasources={}".format( - args.encrypt, args.include_all, args.embedded_datasources - ) + logger.debug( + "Extract params: encrypt={}, include_all={}, datasources={}".format( + args.encrypt, args.include_all, args.embedded_datasources ) - + ) + try: + item = Extracts.get_wb_or_ds_for_extracts(args, logger, server) if args.datasource: - data_source_item = Server.get_data_source_item(logger, server, args.datasource) logger.info(_("createextracts.for.datasource").format(args.datasource)) - job = server.datasources.create_extract(data_source_item, encrypt=args.encrypt) + job: TSC.JobItem = server.datasources.create_extract(item, encrypt=args.encrypt) + + else: + if not args.include_all and not args.embedded_datasources: + Errors.exit_with_error( + logger, + _("extracts.workbook.errors.requires_datasources_or_include_all").format("deleteextracts"), + ) - elif args.workbook: - workbook_item = Server.get_workbook_item(logger, server, args.workbook) logger.info(_("createextracts.for.workbook_name").format(args.workbook)) - job = server.workbooks.create_extract( - workbook_item, + job: TSC.JobItem = server.workbooks.create_extract( + item, encrypt=args.encrypt, includeAll=args.include_all, datasources=args.embedded_datasources, diff --git a/tabcmd/commands/extracts/delete_extracts_command.py b/tabcmd/commands/extracts/delete_extracts_command.py index 20eaf5b8..ab32a458 100644 --- a/tabcmd/commands/extracts/delete_extracts_command.py +++ b/tabcmd/commands/extracts/delete_extracts_command.py @@ -2,6 +2,7 @@ from tabcmd.commands.auth.session import Session from tabcmd.commands.constants import Errors +from tabcmd.commands.extracts.extracts import Extracts from tabcmd.commands.server import Server from tabcmd.execution.global_options import * from tabcmd.execution.localize import _ @@ -19,12 +20,10 @@ class DeleteExtracts(Server): @staticmethod def define_args(delete_extract_parser): group = delete_extract_parser.add_argument_group(title=DeleteExtracts.name) - set_ds_xor_wb_args(group) + set_ds_xor_wb_args(group, True) set_embedded_datasources_options(group) - # set_encryption_option(group) set_project_arg(group) set_parent_project_arg(group) - group.add_argument("--url", help=_("createextracts.options.url")) @staticmethod def run_command(args): @@ -33,14 +32,21 @@ def run_command(args): session = Session() server = session.create_session(args, logger) try: + item = Extracts.get_wb_or_ds_for_extracts(args, logger, server) if args.datasource: logger.info(_("deleteextracts.for.datasource").format(args.datasource)) - data_source_item = Server.get_data_source_item(logger, server, args.datasource) - job = server.datasources.delete_extract(data_source_item) - elif args.workbook: + job: TSC.JobItem = server.datasources.delete_extract(item) + else: + if not args.include_all and not args.embedded_datasources: + Errors.exit_with_error( + logger, + _("extracts.workbook.errors.requires_datasources_or_include_all").format("deleteextracts"), + ) logger.info(_("deleteextracts.for.workbook_name").format(args.workbook)) - workbook_item = Server.get_workbook_item(logger, server, args.workbook) - job = server.workbooks.delete_extract(workbook_item) + job: TSC.JobItem = server.workbooks.delete_extract( + item, includeAll=args.include_all, datasources=args.embedded_datasources + ) + except Exception as e: Errors.exit_with_error(logger, e) diff --git a/tabcmd/commands/extracts/extracts.py b/tabcmd/commands/extracts/extracts.py new file mode 100644 index 00000000..60c63c00 --- /dev/null +++ b/tabcmd/commands/extracts/extracts.py @@ -0,0 +1,30 @@ +from tabcmd.commands.constants import Errors +from tabcmd.commands.datasources_and_workbooks.datasources_and_workbooks_command import DatasourcesAndWorkbooks +from tabcmd.commands.server import Server +from tabcmd.execution.localize import _ + +import tableauserverclient as TSC + + +class Extracts(Server): + @staticmethod + def get_wb_or_ds_for_extracts(args, logger, server): + container = Server.get_project_by_name_and_parent_path( + logger, server, args.project_name, args.parent_project_path + ) + if args.datasource: + logger.debug(_("export.status").format(args.datasource)) + datasource = Server.get_data_source_item(logger, server, args.datasource, container) + return datasource + + elif args.workbook or args.url: + if args.workbook: + workbook_item: TSC.WorkbookItem = Server.get_workbook_item(logger, server, args.workbook, container) + else: + workbook_item: TSC.WorkbookItem = DatasourcesAndWorkbooks.get_wb_by_content_url( + logger, server, args.url + ) + logger.info(_("export.status").format(workbook_item.name)) + return workbook_item + + Errors.exit_with_error(logger, "Datasource or workbook required") diff --git a/tabcmd/commands/extracts/refresh_extracts_command.py b/tabcmd/commands/extracts/refresh_extracts_command.py index 73a467ff..b88f220b 100644 --- a/tabcmd/commands/extracts/refresh_extracts_command.py +++ b/tabcmd/commands/extracts/refresh_extracts_command.py @@ -1,8 +1,8 @@ -import polling2 # type: ignore import tableauserverclient as TSC from tabcmd.commands.auth.session import Session from tabcmd.commands.constants import Errors +from tabcmd.commands.extracts.extracts import Extracts from tabcmd.commands.server import Server from tabcmd.execution.global_options import * from tabcmd.execution.localize import _ @@ -17,12 +17,7 @@ class RefreshExtracts(Server): @staticmethod def define_args(refresh_extract_parser): group = refresh_extract_parser.add_argument_group(title=RefreshExtracts.name) - possible_targets = set_ds_xor_wb_args(group) - # hm, why did I do this instead of group.add_arg? - possible_targets.add_argument( - "--url", - help=_("createextracts.options.url"), - ) + set_ds_xor_wb_args(group, True) set_incremental_options(group) set_calculations_options(group) set_project_arg(group) @@ -34,13 +29,9 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args, logger) - refresh_action = "refresh" if args.addcalculations or args.removecalculations: - logger.warning( - "Data Acceleration tasks are deprecated and this parameter has no effect." - "It will be removed in a future update." - ) + logger.warning("Add/Remove Calculations tasks are not yet implemented.") # are these two mandatory? mutually exclusive? # docs: the REST method always runs a full refresh even if the refresh type is set to incremental. @@ -49,62 +40,28 @@ def run_command(args): # if args.synchronous: # docs: run a full refresh and poll until it completes # else: run a full refresh but don't poll for completion - container = None - if args.project_name: - try: - container = Server.get_project_by_name_and_parent_path( - logger, server, args.project_name, args.parent_project_path - ) - except Exception as ex: - logger.warning( - "Could not find project {}/{}. Continuing without.".format( - args.parent_project_path, args.project_name - ) - ) - job = None try: - # TODO: use the container in the search + item = Extracts.get_wb_or_ds_for_extracts(args, logger, server) if args.datasource: - logger.debug(_("export.status").format(args.datasource)) - datasource_id = Server.get_data_source_id(logger, server, args.datasource, container) logger.info(_("refreshextracts.status_refreshed").format(_("content_type.datasource"), args.datasource)) - job: TSC.JobItem = server.datasources.refresh(datasource_id) - - elif args.workbook: - logger.debug(_("export.status").format(args.workbook)) - workbook_id = Server.get_workbook_id(logger, server, args.workbook, container) + job: TSC.JobItem = server.datasources.refresh(item.id) + else: + job: TSC.JobItem = server.workbooks.refresh(item.id) logger.info(_("refreshextracts.status_refreshed").format(_("content_type.workbook"), args.workbook)) - job: TSC.JobItem = server.workbooks.refresh(workbook_id) - - elif args.url: - logger.error("URL not yet implemented") except Exception as e: Errors.exit_with_error(logger, _("refreshextracts.errors.error"), e) logger.info(_("common.output.job_queued_success")) + logger.debug("Extract refresh queued with JobID: {}".format(job.id)) if args.synchronous: # maintains a live connection to the server while the refresh operation is underway, polling every second # until the background job is done. logger.info("Waiting for refresh job to begin ....") - try: - polling2.poll(lambda: logger.info(".") and job.started_at is not None, step=1, timeout=args.timeout) - except polling2.TimeoutException as te: - Errors.exit_with_error(logger, _("messages.timeout_error.summary")) - logger.info("Job started at {}".format(job.started_at)) - - try: - polling2.poll( - lambda: logger.info("{}".format(job.progress)) and job.finish_code != -1, - step=1, - timeout=args.timeout, - ) - logger.info("Job completed at {}".format(job.completed_at)) - except polling2.TimeoutException as te: - Errors.exit_with_error(logger, _("messages.timeout_error.summary")) - - else: - logger.info(_("common.output.job_queued_success")) - logger.debug("Extract refresh started with JobID: {0}".format(job.id)) + job_done = server.jobs.wait_for_job(job_id=job, timeout=args.timeout) + logger.info("Job completed: ") + logger.info(job_done) + except Exception as je: + Errors.exit_with_error(logger, je) diff --git a/tabcmd/commands/group/create_group_command.py b/tabcmd/commands/group/create_group_command.py index 357fccb5..85efcaae 100644 --- a/tabcmd/commands/group/create_group_command.py +++ b/tabcmd/commands/group/create_group_command.py @@ -35,4 +35,4 @@ def run_command(args): if args.continue_if_exists and Errors.is_resource_conflict(e): logger.info(_("tabcmd.result.already_exists").format(_("content_type.group"), args.name)) return - Errors.exit_with_error(logger, _("tabcmd.result.failed.create_group")) + Errors.exit_with_error(logger, exception=e) diff --git a/tabcmd/commands/server.py b/tabcmd/commands/server.py index f215e3a8..d315e6dd 100644 --- a/tabcmd/commands/server.py +++ b/tabcmd/commands/server.py @@ -47,7 +47,7 @@ def get_items_by_name(logger, item_endpoint, item_name: str, container: Optional # TODO: typing should reflect that this returns TSC.TableauItem and item_endpoint is of type TSC.QuerysetEndpoint[same] item_log_name: str = "[{0}] {1}".format(type(item_endpoint).__name__, item_name) if container: - container_name: str = "({0}) {1}".format(container.__class__, container.name) + container_name: str = "[{0}] {1}".format(container.__class__.__name__, container.name) item_log_name = "{0}/{1}".format(container_name, item_log_name) logger.debug(_("export.status").format(item_log_name)) req_option = TSC.RequestOptions() diff --git a/tabcmd/commands/site/list_command.py b/tabcmd/commands/site/list_command.py index da6b9f76..762e73a2 100644 --- a/tabcmd/commands/site/list_command.py +++ b/tabcmd/commands/site/list_command.py @@ -13,11 +13,8 @@ class ListCommand(Server): """ # strings to move to string files - local_strings = { - "tabcmd_content_listing": "===== Listing {0} content for user {1}...", - "tabcmd_listing_label_name": "NAME:", - "tabcmd_listing_label_id": "ID:", - } + tabcmd_content_listing = "===== Listing {0} content for user {1}..." + tabcmd_listing_label_name = "NAME: {}" name: str = "list" description: str = "List content items of a specified type" @@ -39,7 +36,7 @@ def run_command(args): content_type = args.content try: - logger.info(ListCommand.local_strings.tabcmd_content_listing.format(content_type, session.username)) + logger.info(ListCommand.tabcmd_content_listing.format(content_type, session.username)) if content_type == "projects": items = server.projects.all() @@ -51,9 +48,13 @@ def run_command(args): items = server.flows.all() for item in items: - logger.info(ListCommand.local_strings.tabcmd_listing_label_name.rjust(10), item.name) + logger.info(ListCommand.tabcmd_listing_label_name.format(item.name)) if args.details: logger.info(item) + if content_type == "workbooks": + server.workbooks.populate_views(item) + for v in item.views: + logger.info(v) except Exception as e: Errors.exit_with_error(logger, e) diff --git a/tabcmd/execution/global_options.py b/tabcmd/execution/global_options.py index 2657829d..60c72fd0 100644 --- a/tabcmd/execution/global_options.py +++ b/tabcmd/execution/global_options.py @@ -163,11 +163,6 @@ def set_project_arg(parser): return parser -def set_site_url_arg(parser): - parser.add_argument("--url", help="The canonical name for the resource as it appears in the URL") - return parser - - def set_ds_xor_wb_options(parser): target_type_group = parser.add_mutually_exclusive_group(required=False) target_type_group.add_argument("-d", "--datasource", action="store_true", help="The name of the target datasource.") @@ -181,7 +176,8 @@ def set_ds_xor_wb_args(parser, url=False): target_type_group.add_argument("-d", "--datasource", help="The name of the target datasource.") target_type_group.add_argument("-w", "--workbook", help="The name of the target workbook.") if url: - target_type_group.add_argument("--url", "-U", help=_("deleteextracts.options.url")) + # -U conflicts with --username, they are not case sensitive + target_type_group.add_argument("--url", help=_("deleteextracts.options.url")) return parser @@ -201,7 +197,6 @@ def set_site_status_arg(parser): return parser -# create-site/update-site - lots of these options are never used elsewhere # mismatched arguments: createsite says --url, editsite says --site-id # just let both commands use either of them def set_site_id_args(parser): @@ -215,7 +210,7 @@ def set_site_id_args(parser): return parser -# these options are all shared in create-site and edit-site +# create-site/update-site - lots of these options are never used elsewhere def set_common_site_args(parser): parser = set_site_id_args(parser) diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index 43004ba5..5e6ed25a 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -38,7 +38,6 @@ import io mock_args = argparse.Namespace() -mock_args.logging_level = "info" fake_item = MagicMock() fake_item.name = "fake-name" @@ -71,6 +70,14 @@ def _set_up_session(mock_session, mock_server): mock_session.assert_not_called() global mock_args mock_args = argparse.Namespace(logging_level="DEBUG") + # set values for things that should always have a default + # should refactor so this can be automated + mock_args.continue_if_exists = False + mock_args.project_name = None + mock_args.parent_project_path = None + mock_args.parent_path = None + mock_args.timeout = None + mock_args.username = None # auth def test_login(self, mock_session, mock_server): @@ -158,11 +165,13 @@ def test_runschedule(self, mock_session, mock_server): def test_create_extract(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) mock_server.workbooks = getter + mock_server.projects = getter mock_args.encrypt = False mock_args.include_all = True mock_args.datasource = None mock_args.embedded_datasources = None - mock_args.workbook = "workbook" + mock_args.workbook = "workbook-name" + print(mock_args) create_extracts_command.CreateExtracts.run_command(mock_args) mock_session.assert_called() @@ -177,6 +186,7 @@ def test_delete_extract(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) mock_server.datasources = getter mock_args.datasource = "datasource-name" + mock_server.projects = getter delete_extracts_command.DeleteExtracts.run_command(mock_args) mock_session.assert_called() @@ -198,13 +208,14 @@ def test_refresh_extract(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) mock_args.datasource = "datasource" mock_server.datasources = getter + mock_server.projects = getter mock_args.workbook = None mock_args.addcalculations = None mock_args.removecalculations = None mock_args.incremental = None mock_args.synchronous = None - mock_args.project_name = None - mock_args.parent_project_path = None + print(mock_args) + refresh_extracts_command.RefreshExtracts.run_command(mock_args) mock_session.assert_called() diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index 117b67a8..a695c665 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -129,20 +129,20 @@ def _get_datasource(self, server_file): arguments = [command, server_file] _test_command(arguments) - def _create_extract(self, wb_name): + def _create_extract(self, type, wb_name): command = "createextracts" - arguments = [command, "-w", wb_name, "--encrypt"] + arguments = [command, type, wb_name, "--encrypt"] _test_command(arguments) # variation: url - def _refresh_extract(self, wb_name): + def _refresh_extract(self, type, wb_name): command = "refreshextracts" - arguments = [command, "--workbook", wb_name] + arguments = [command, type, wb_name] _test_command(arguments) - def _delete_extract(self, wb_name): + def _delete_extract(self, type, item_name): command = "deleteextracts" - arguments = [command, "-w", wb_name] + arguments = [command, type, item_name, "--include-all"] _test_command(arguments) def _list(self, item_type: str): @@ -151,7 +151,7 @@ def _list(self, item_type: str): _test_command(arguments) # actual tests - TWBX_FILE_WITH_EXTRACT = "extract-data-access.twbx" + TWBX_FILE_WITH_EXTRACT = "WorkbookWithExtract.twbx" TWBX_WITH_EXTRACT_NAME = "WorkbookWithExtract" TWBX_WITH_EXTRACT_SHEET = "sheet1" TWBX_FILE_WITHOUT_EXTRACT = "simple-data.twbx" @@ -159,7 +159,9 @@ def _list(self, item_type: str): TWBX_WITHOUT_EXTRACT_SHEET = "Testsheet1" TDSX_WITH_EXTRACT_NAME = "WorldIndicators" TDSX_FILE_WITH_EXTRACT = "World Indicators.tdsx" + # only works on linux servers or something TWB_WITH_EMBEDDED_CONNECTION = "embedded_connection_waremart.twb" + EMBEDDED_TWB_NAME = "waremart" @pytest.mark.order(1) def test_login(self): @@ -264,109 +266,95 @@ def test_delete_projects(self): @pytest.mark.order(10) def test_wb_publish(self): - name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME file = os.path.join("tests", "assets", OnlineCommandTest.TWBX_FILE_WITH_EXTRACT) - arguments = self._publish_args(file, name_on_server) + arguments = self._publish_args(file, OnlineCommandTest.TWBX_WITH_EXTRACT_NAME) _test_command(arguments) - @pytest.mark.order(10) + @pytest.mark.order(11) def test_wb_get(self): + # add .twbx to the end to tell the server what we are getting self._get_workbook(OnlineCommandTest.TWBX_WITH_EXTRACT_NAME + ".twbx") - @pytest.mark.order(10) + @pytest.mark.order(11) def test_view_get_pdf(self): wb_name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME sheet_name = OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET self._get_view(wb_name_on_server, sheet_name + ".pdf") - @pytest.mark.order(10) + @pytest.mark.order(11) def test_view_get_csv(self): wb_name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME sheet_name = OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET self._get_view(wb_name_on_server, sheet_name + ".csv") - @pytest.mark.order(10) + @pytest.mark.order(11) def test_view_get_png(self): wb_name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME sheet_name = OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET self._get_view(wb_name_on_server, sheet_name + ".png") - @pytest.mark.order(11) - def test_wb_delete(self): - name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME - self._delete_wb(name_on_server) - @pytest.mark.order(11) def test_wb_publish_embedded(self): - name_on_server = OnlineCommandTest.TWB_WITH_EMBEDDED_CONNECTION + pytest.skip("waremart failed to establish a connection to your datasource.") file = os.path.join("tests", "assets", OnlineCommandTest.TWB_WITH_EMBEDDED_CONNECTION) - arguments = self._publish_args(file, name_on_server) + arguments = self._publish_args(file, OnlineCommandTest.EMBEDDED_TWB_NAME) arguments = self._publish_creds_args(arguments, waremart_user, waremart_password, True) _test_command(arguments) @pytest.mark.order(12) def test_publish_ds(self): - name_on_server = OnlineCommandTest.TDSX_WITH_EXTRACT_NAME file = os.path.join("tests", "assets", OnlineCommandTest.TDSX_FILE_WITH_EXTRACT) - arguments = self._publish_args(file, name_on_server) + arguments = self._publish_args(file, OnlineCommandTest.TDSX_WITH_EXTRACT_NAME) _test_command(arguments) @pytest.mark.order(13) def test__get_ds(self): - ds_name_on_server = OnlineCommandTest.TDSX_WITH_EXTRACT_NAME - self._get_datasource(ds_name_on_server + ".tdsx") + self._get_datasource(OnlineCommandTest.TDSX_WITH_EXTRACT_NAME + ".tdsx") - @pytest.mark.order(14) - def test__delete_ds(self): - name_on_server = OnlineCommandTest.TDSX_WITH_EXTRACT_NAME - self._delete_ds(name_on_server) + @pytest.mark.order(13) + def test_refresh_ds_extract(self): + self._refresh_extract("-d", OnlineCommandTest.TDSX_WITH_EXTRACT_NAME) - @pytest.mark.order(15) + @pytest.mark.order(14) def test_delete_extract(self): - # fails because the extract has a bad data connection :/ - name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME - file = os.path.join("tests", "assets", OnlineCommandTest.TWBX_FILE_WITH_EXTRACT) - self._publish_args(file, name_on_server) - self._delete_extract(name_on_server) + self._delete_extract("-d", OnlineCommandTest.TDSX_WITH_EXTRACT_NAME) @pytest.mark.order(16) def test_create_extract(self): - # Fails because it 'already has an extract' :/ - name_on_server = OnlineCommandTest.TWBX_WITHOUT_EXTRACT_NAME - self._create_extract(name_on_server) + pytest.skip( + "Can't create extract for data source '3f3c204c-3c28-4fa6-9fb6-80c848a20338' because it is already extracted." + ) + self._create_extract("-d", OnlineCommandTest.TDSX_WITH_EXTRACT_NAME) @pytest.mark.order(17) - def test_refresh_extract(self): - # must be a datasource owned by the test user - name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME - file = os.path.join("tests", "assets", OnlineCommandTest.TWBX_FILE_WITH_EXTRACT) - arguments = self._publish_args(file, name_on_server) - _test_command(arguments) + def test_refresh_wb_extract(self): + self._refresh_extract("-w", OnlineCommandTest.TWBX_WITH_EXTRACT_NAME) + @pytest.mark.order(19) + def test_wb_delete(self): name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME - self._refresh_extract(name_on_server) self._delete_wb(name_on_server) @pytest.mark.order(19) - def test_export_wb_pdf(self): - name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME - file = os.path.join("tests", "assets", OnlineCommandTest.TWBX_FILE_WITH_EXTRACT) - arguments = self._publish_args(file, name_on_server) - _test_command(arguments) + def test__delete_ds(self): + name_on_server = OnlineCommandTest.TDSX_WITH_EXTRACT_NAME + self._delete_ds(name_on_server) + @pytest.mark.order(19) + def test_export_wb_pdf(self): command = "export" - friendly_name = name_on_server + "/" + OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET + friendly_name = ( + OnlineCommandTest.TWBX_WITH_EXTRACT_NAME + "/" + OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET + "?param1=3" + ) arguments = [command, friendly_name, "--fullpdf", "-f", "exported_wb.pdf"] _test_command(arguments) @pytest.mark.order(19) def test_export_view_pdf(self): - name_on_server = OnlineCommandTest.TWBX_WITH_EXTRACT_NAME - file = os.path.join("tests", "assets", OnlineCommandTest.TWBX_FILE_WITH_EXTRACT) - arguments = self._publish_args(file, name_on_server) - _test_command(arguments) command = "export" - friendly_name = name_on_server + "/" + OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET + "?param1=3" + friendly_name = ( + OnlineCommandTest.TWBX_WITH_EXTRACT_NAME + "/" + OnlineCommandTest.TWBX_WITH_EXTRACT_SHEET + "?param1=3" + ) arguments = [command, friendly_name, "--pdf", "-f", "exported_view.pdf"] _test_command(arguments) From 6a2311c9046f7b1e6a89c4252185ce9f30b35681 Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 10 Mar 2023 23:25:56 -0800 Subject: [PATCH 06/22] Jac/readme updates (#235) * remove 'known gaps' and pointed to release notes. * add log statement explaining workbooks won't be filtered * edit contributing file * add python 3.11 --- README.md | 21 ++-- contributing.md | 98 +++++++++++-------- pyproject.toml | 8 +- .../export_command.py | 3 + 4 files changed, 70 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index e1703650..810f817c 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,9 @@ e.g * `tabcmd help` ###or -## Install on the command line (requires Python 3.7+) +## Install on the command line + +(Note: this requires Python 3.7+. Generally we will actively support versions of Python that are still in security support). ```shell pip install tabcmd @@ -83,21 +85,12 @@ see the user documentation at https://tableau.github.io/tabcmd/ ## Release Notes -Version 2.0 is the first version of tabcmd built in python. +Version 2 is the first version of tabcmd built in python. It is specifically targeted to support users of Tableau Online, who are required to have MFA enabled. -(MFA support is not available in tabcmd 2022.2). It does not yet fully replace the existing tabcmd client.\ -**Known gaps** -- handling custom views in get/export commands -- several commands that can only be run by a Server Admin: - - editdomain / listdomains - - initialuser - - reset_openid_sub - - runschedule - - set - - syncgroup - - upgradethumbnails - - validateidpmetadata +(MFA support is not available in the tabcmd program that ships with Tableau Server). +Version 2 does not yet fully replace the existing tabcmd client, in particular it **does not support most server admin actions**. +For known gaps in supported functionality, see the latest [release notes](https://github.com/tableau/tabcmd/releases) ## About diff --git a/contributing.md b/contributing.md index 723e8f86..417cd22c 100644 --- a/contributing.md +++ b/contributing.md @@ -1,26 +1,35 @@ # For developers * [Install tabcmd](#install-tabcmd) -* [Run tabcmd](#run-tabcmd) -* [Development commands](#development-commands) * [Contributing](#contributing) -* [To add a new command](#to-add-a-new-command) -* [Why Python\?](#why-python) -* [Project Structure](#project-structure) - +* [Development](#development) + * [Dev scripts](#dev-scripts) + * [Why Python\?](#why-python) + * [Project structure](#project-structure) + * [To add a new command](#to-add-a-new-command) + * [Localization](#localization) +* [Releases](#releases) + * [Versioning](#versioning) + * [Packaging](#packaging) + + +These instructions are for people who want to download the code and edit it directly. If you are interested in tabcmd but not the code, see [here](Readme.md). +####To work with tabcmd, you need to have **Python 3.7+** installed. -## Install tabcmd -These instructions are only necessary if you want to download the code and run it directly. If you are interested in tabcmd but not the code, see [here](Readme.md). -####To work with tabcmd, you need to have **Python 3.7+** installed. +## Contributing -### +Code contributions and improvements by the community are welcomed! +See the LICENSE file for current open-source licensing and use information. +Before we can accept pull requests from contributors, we require a signed [Contributor License Agreement (CLA)](http://tableau.github.io/contributing.html). + ## Development -To work on the tabcmd code, use these scripts. On Windows, +### Dev scripts +To work on the tabcmd code, use these scripts. _(note that running mypy and black is required for code being submitted to the repo)_ - build @@ -38,42 +47,14 @@ _(note that running mypy and black is required for code being submitted to the r - do test coverage calculation (https://coverage.readthedocs.io/en/6.3.2) > bin/coverage.sh -- To trigger publishing to pypi tag a commit on main with 'pypi'. Versioning is done with -- setuptools_scm so it will be a x.y.dev0 pre-release version unless you first tag the -- commit with a new version tag. e.g -> git tag -d pypi && git push --delete origin pypi -> git tag v2.0.4 && git tag pypi && git push --tags - -# Missing step: a job that is triggered by pypi tag and creates a release -# Missing trigger: when pypi-release is done, begin the app smoke test -- packaging to an exe is done with pyinstaller. You can only build an executable for -- the platform you build on. -- On github this job is triggered by creating a release (or manually) -> doit version <-- produce a current version and metadata file to package -> pyinstaller tabcmd-windows.spec .... # see package.yml for OS-specific arguments - - Packaging produces dist/tabcmd.exe (or equivalent). -- Run the package -> dist/tabcmd/tabcmd.exe --help - - -## Why Python? +### Why Python? * Cross-platform * Build on our existing Python [Tableau Server Client](https://github.com/tableau/server-client-python/) -## Contributing - -Code contributions and improvements by the community are welcomed! - -See the LICENSE file for current open-source licensing and use information. - -Before we can accept pull requests from contributors, we require a signed [Contributor License Agreement (CLA)](http://tableau.github.io/contributing.html). - - -## Project structure +### Project structure The core design principles for this app are - it must provide the functionality of the instance of tabcmd, with drop-in replacement CLI options - it should be able to call [tsc](https://github.com/tableau/server-client-python/) for all server actions @@ -84,12 +65,43 @@ The core design principles for this app are 3. the 'commands' module contains the logic required to translate the tabcmd CLI interface into calls to tsc. This is completely dissociated from the parsers, and could theoretically be called from a completely different interface. 4. The 'execution' module is the core logic. TabcmdController gets an argparse parser, then attaches all the defined parsers to it and associates one command with each parser. -## To add a new command +### To add a new command 0. choose the single word that will be used as your command. Let's call this one `dream` 1. add parsers/dream_parser.py, and use methods from parent_parser to define the arguments 2. add commands/dreams/dream_command.py. It must have a method run_command.py(args) and the args object must contain all information needed from the user. 3. in map_of_parsers.py, add an entry for your new parser, like "dreams": DreamParser.dream_parser 4. in map_of_commands.py, add an entry for your new command, like "dream": ("dream", DreamCommand, "Think about picnics")," -5. add tests! +5. add tests! + +### Localization + +Strings are stored in /tabcmd/locales/[language]/*.properties by id and referred to in code as +> string = _("string.id") + +For runtime execution these files must be converted to .mo via .po +> doit mo +## Releases +To trigger publishing to pypi tag a commit on main with 'pypi'. +When pypi-release is done, begin the app smoke test action. + +### Versioning +Versioning is done with setuptools_scm and based on git tags. +It will be a x.y.dev0 pre-release version except for commits with a new version tag. e.g +> git tag v2.0.4 && git push --tags + +A new tag is created with the name of each release on github. + +### Packaging +Before packaging, we produce a current metadata file to include in the bundle +> doit version + +Packaging is done with pyinstaller, which will build an executable for the platform it runs on. +A github action runs on Mac, Windows and Linux to generate each executable. + +> pyinstaller tabcmd-windows.spec .... + +Packaging produces executables in the dist folder. To run: +> dist/tabcmd/tabcmd.exe --help + diff --git a/pyproject.toml b/pyproject.toml index 24b331c9..17ac9ecf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ packages = ["tabcmd"] tabcmd = ["tabcmd.locales/**/*.mo"] [tool.black] line-length = 120 -target-version = ['py37', 'py38', 'py39', 'py310'] +target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] extend-exclude = '^/bin/*' [tool.mypy] disable_error_code = [ @@ -30,14 +30,16 @@ description="A command line client for working with Tableau Server." authors = [{name="Tableau", email="github@tableau.com"}] license = {file = "LICENSE"} readme = "README.md" -requires-python = ">=3.7" +requires-python = ">=3.7" # https://devguide.python.org/versions/ classifiers = [ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10" + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12" ] dependencies = [ 'argparse', diff --git a/tabcmd/commands/datasources_and_workbooks/export_command.py b/tabcmd/commands/datasources_and_workbooks/export_command.py index 4ee355e0..9a52fe5b 100644 --- a/tabcmd/commands/datasources_and_workbooks/export_command.py +++ b/tabcmd/commands/datasources_and_workbooks/export_command.py @@ -121,6 +121,7 @@ def run_command(args): @staticmethod def apply_filters_from_args(request_options: TSC.PDFRequestOptions, args, logger=None) -> None: if args.filter: + logger.debug("filter = {}".format(args.filter)) params = args.filter.split("&") for value in params: ExportCommand.apply_filter_value(logger, request_options, value) @@ -130,6 +131,8 @@ def apply_filters_from_args(request_options: TSC.PDFRequestOptions, args, logger def download_wb_pdf(server, workbook_item, args, logger): logger.debug(args.url) pdf_options = TSC.PDFRequestOptions(maxage=1) + if args.filter or args.url.find("?") > 0: + logger.info("warning: Filter values will not be applied when exporting a complete workbook") ExportCommand.apply_values_from_url_params(logger, pdf_options, args.url) ExportCommand.apply_pdf_options(logger, pdf_options, args) logger.debug(pdf_options.get_query_params()) From c46a8ca0518d2ff904cfafd712b24b141d03caf0 Mon Sep 17 00:00:00 2001 From: Jac Date: Sat, 11 Mar 2023 13:57:35 -0800 Subject: [PATCH 07/22] Always log version (#234) When people ask for help they usually show default logs and don't know what version they have. --- tabcmd/execution/tabcmd_controller.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tabcmd/execution/tabcmd_controller.py b/tabcmd/execution/tabcmd_controller.py index 3798b30c..1a4544d2 100644 --- a/tabcmd/execution/tabcmd_controller.py +++ b/tabcmd/execution/tabcmd_controller.py @@ -5,6 +5,8 @@ from .logger_config import log from .parent_parser import ParentParser +from tabcmd.version import version + class TabcmdController: @staticmethod @@ -27,6 +29,7 @@ def run(parser, user_input=None): print("logging:", namespace.logging_level) logger = log(__name__, namespace.logging_level or logging.INFO) + logger.info("Tabcmd {}".format(version)) if (hasattr("namespace", "password") or hasattr("namespace", "token_value")) and hasattr("namespace", "func"): # don't print whole namespace because it has secrets logger.debug(namespace.func) From 1361c922a96e86e7beebc2b8cfa0d2a2de584896 Mon Sep 17 00:00:00 2001 From: Jac Date: Sat, 11 Mar 2023 14:17:07 -0800 Subject: [PATCH 08/22] Jac/content listing (#230) * add tests * format error output * add ID to output, add a "nothing found" message instead of just exiting silently. --- tabcmd/commands/site/list_command.py | 20 +++++--- tabcmd/commands/site/list_sites_command.py | 4 +- tabcmd/tabcmd.py | 10 ++-- tests/commands/test_listing_commands.py | 58 ++++++++++++++++++++++ tests/commands/test_run_commands.py | 11 ++++ tests/e2e/online_tests.py | 8 +++ 6 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 tests/commands/test_listing_commands.py diff --git a/tabcmd/commands/site/list_command.py b/tabcmd/commands/site/list_command.py index 762e73a2..64e4fa48 100644 --- a/tabcmd/commands/site/list_command.py +++ b/tabcmd/commands/site/list_command.py @@ -1,5 +1,3 @@ -import tableauserverclient as TSC - from tabcmd.commands.auth.session import Session from tabcmd.commands.constants import Errors from tabcmd.commands.server import Server @@ -13,8 +11,12 @@ class ListCommand(Server): """ # strings to move to string files - tabcmd_content_listing = "===== Listing {0} content for user {1}..." - tabcmd_listing_label_name = "NAME: {}" + local_strings = { + "tabcmd_content_listing": "===== Listing {0} content for user {1}...", + "tabcmd_listing_label_name": "\tNAME: {}", + "tabcmd_listing_label_id": "ID: {}", + "tabcmd_content_none": "No content found.", + } name: str = "list" description: str = "List content items of a specified type" @@ -36,7 +38,7 @@ def run_command(args): content_type = args.content try: - logger.info(ListCommand.tabcmd_content_listing.format(content_type, session.username)) + logger.info(ListCommand.local_strings["tabcmd_content_listing"].format(content_type, session.username)) if content_type == "projects": items = server.projects.all() @@ -47,14 +49,18 @@ def run_command(args): elif content_type == "flows": items = server.flows.all() + if not items or len(items) == 0: + logger.info(ListCommand.local_strings["tabcmd_content_none"]) for item in items: - logger.info(ListCommand.tabcmd_listing_label_name.format(item.name)) if args.details: - logger.info(item) + logger.info("\t{}".format(item)) if content_type == "workbooks": server.workbooks.populate_views(item) for v in item.views: logger.info(v) + else: + logger.info(ListCommand.local_strings["tabcmd_listing_label_id"].format(item.id)) + logger.info(ListCommand.local_strings["tabcmd_listing_label_name"].format(item.name)) except Exception as e: Errors.exit_with_error(logger, e) diff --git a/tabcmd/commands/site/list_sites_command.py b/tabcmd/commands/site/list_sites_command.py index e077072e..f124fbe6 100644 --- a/tabcmd/commands/site/list_sites_command.py +++ b/tabcmd/commands/site/list_sites_command.py @@ -31,8 +31,8 @@ def run_command(args): sites, pagination = server.sites.get() logger.info(_("listsites.status").format(session.username)) for site in sites: - logger.info("NAME:".rjust(10), site.name) - logger.info("SITEID:".rjust(10), site.content_url) + logger.info("NAME: {}".format(site.name)) + logger.info("SITEID: {}".format(site.id)) if args.get_extract_encryption_mode: logger.info("EXTRACTENCRYPTION:", site.extract_encryption_mode) except Exception as e: diff --git a/tabcmd/tabcmd.py b/tabcmd/tabcmd.py index 7a03f692..70b8b63d 100644 --- a/tabcmd/tabcmd.py +++ b/tabcmd/tabcmd.py @@ -17,10 +17,12 @@ def main(): print("Keyboard Interrupt: exiting") sys.exit(1) except Exception as e: - print(sys.stderr, "Unhandled exception: {}".format(type(e).__name__)) - print( - sys.stderr, - f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}", + sys.stderr.writelines( + [ + "ERROR\n", + "Unhandled exception: {}\n".format(type(e).__name__), + f"at line {e.__traceback__.tb_lineno} of {__file__}: {e}\n", + ] ) sys.exit(1) diff --git a/tests/commands/test_listing_commands.py b/tests/commands/test_listing_commands.py new file mode 100644 index 00000000..5d45590f --- /dev/null +++ b/tests/commands/test_listing_commands.py @@ -0,0 +1,58 @@ +import argparse +from unittest.mock import MagicMock + +from tabcmd.commands.site.list_command import ListCommand +from tabcmd.commands.site.list_sites_command import ListSiteCommand + +import unittest +from unittest import mock + +mock_logger = mock.MagicMock() + +fake_item = mock.MagicMock() +fake_item.name = "fake-name" +fake_item.id = "fake-id" +fake_item.extract_encryption_mode = "ENFORCED" + +getter = MagicMock() +getter.get = MagicMock("get", return_value=([fake_item], 1)) + +mock_args = argparse.Namespace() +mock_args.logging_level = "INFO" + + +@mock.patch("tabcmd.commands.auth.session.Session.create_session") +@mock.patch("tableauserverclient.Server") +class ListingTests(unittest.TestCase): + def test_list_sites(self, mock_server, mock_session): + mock_server.sites = getter + mock_args.get_extract_encryption_mode = False + mock_session.return_value = mock_server + out_value = ListSiteCommand.run_command(mock_args) + + def test_list_content(self, mock_server, mock_session): + mock_server.flows = getter + mock_args.content = "flows" + mock_session.return_value = mock_server + out_value = ListCommand.run_command(mock_args) + + def test_list_wb_details(self, mock_server, mock_session): + mock_server.workbooks = getter + mock_args.content = "workbooks" + mock_session.return_value = mock_server + mock_args.details = True + out_value = ListCommand.run_command(mock_args) + + def test_list_datasources(self, mock_server, mock_session): + mock_server.datasources = getter + mock_args.content = "datasources" + mock_session.return_value = mock_server + mock_args.details = True + out_value = ListCommand.run_command(mock_args) + + def test_list_projects(self, mock_server, mock_session): + mock_server.projects = getter + mock_args.content = "projects" + mock_session.return_value = mock_server + mock_args.details = True + out_value = ListCommand.run_command(mock_args) diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index 5e6ed25a..f8c5d24f 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -26,6 +26,7 @@ delete_site_command, edit_site_command, list_sites_command, + list_command, ) from tabcmd.commands.user import ( add_users_command, @@ -393,3 +394,13 @@ def test_create_user(self, mock_session, mock_server): mock_args.require_all_valid = False create_users_command.CreateUsersCommand.run_command(mock_args) mock_session.assert_called() + + def test_list_content(self, mock_session, mock_server): + RunCommandsTest._set_up_session(mock_session, mock_server) + mock_args.content = "workbooks" + list_command.ListCommand.run_command(mock_args) + mock_args.content = "projects" + list_command.ListCommand.run_command(mock_args) + mock_args.content = "flows" + list_command.ListCommand.run_command(mock_args) + # todo: details, filters diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index a695c665..22c1f993 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -257,6 +257,14 @@ def test_create_projects(self): def test_list_projects(self): self._list("projects") + @pytest.mark.order(8) + def test_list_flows(self): + self._list("flows") + + @pytest.mark.order(8) + def test_list_workbooks(self): + self._list("workbooks") + @pytest.mark.order(10) def test_delete_projects(self): if not project_admin: From 80cb75761d4681b9f9fd7f51f969187d6cf178ef Mon Sep 17 00:00:00 2001 From: Jac Date: Sat, 11 Mar 2023 14:21:49 -0800 Subject: [PATCH 09/22] Jac/parse publish options (#236) * implement thumbnail options. (including 'not yet implemented' message for --thumbnail-group) * Implement overwrite/append/replace arguments (including not-yet-implemented message for --replace) * clarified help content for extract-encryption and some other not-implemented options * added tests for all valid publish command options * error log cleanup: better stacktrace, less repetition --- tabcmd/commands/auth/session.py | 2 +- tabcmd/commands/constants.py | 23 ++++--- .../datasources_and_workbooks_command.py | 6 +- .../export_command.py | 4 +- .../publish_command.py | 47 ++++++++++--- tabcmd/commands/user/user_data.py | 2 +- tabcmd/execution/global_options.py | 64 +++++++++++++----- tabcmd/execution/parent_parser.py | 2 +- tests/commands/test_run_commands.py | 4 ++ tests/parsers/test_parser_publish.py | 67 +++++++++++++++++++ 10 files changed, 180 insertions(+), 41 deletions(-) diff --git a/tabcmd/commands/auth/session.py b/tabcmd/commands/auth/session.py index 2e7107ef..1dcf34a7 100644 --- a/tabcmd/commands/auth/session.py +++ b/tabcmd/commands/auth/session.py @@ -249,7 +249,7 @@ def _sign_in(self, tableau_auth) -> TSC.Server: self.username = self.tableau_server.users.get_by_id(self.user_id).name self.logger.info(_("common.output.succeeded")) except Exception as e: - Errors.exit_with_error(self.logger, e) + Errors.exit_with_error(self.logger, exception=e) self.logger.debug("Signed into {0}{1} as {2}".format(self.server_url, self.site_name, self.username)) return self.tableau_server diff --git a/tabcmd/commands/constants.py b/tabcmd/commands/constants.py index c491a135..263fb763 100644 --- a/tabcmd/commands/constants.py +++ b/tabcmd/commands/constants.py @@ -1,5 +1,8 @@ import inspect import sys +from typing import Optional + +import tableauserverclient from tabcmd.execution.localize import _ @@ -44,7 +47,7 @@ def log_stack(logger): stack = inspect.stack() here = stack[0] file, line, func = here[1:4] - start = 0 + start = 1 n_lines = 5 logger.debug(HEADER_FMT % (file, func)) for frame in stack[start + 1 : n_lines]: @@ -54,15 +57,17 @@ def log_stack(logger): logger.info("Error printing stack trace:", e) @staticmethod - def exit_with_error(logger, message=None, exception=None): + def exit_with_error(logger, message: Optional[str] = None, exception: Optional[Exception] = None): try: - Errors.log_stack(logger) if message and not exception: logger.error(message) - if exception: + Errors.log_stack(logger) + elif exception: if message: - logger.debug("Error message: " + message) - Errors.check_common_error_codes_and_explain(logger, exception) + logger.info("Error message: " + message) + Errors.check_common_error_codes_and_explain(logger, exception) + else: + logger.info("No exception or message provided") except Exception as exc: print(sys.stderr, "Error during log call from exception - {} {}".format(exc.__class__, message)) try: @@ -72,7 +77,7 @@ def exit_with_error(logger, message=None, exception=None): sys.exit(1) @staticmethod - def check_common_error_codes_and_explain(logger, exception): + def check_common_error_codes_and_explain(logger, exception: Exception): # most errors contain as much info in the message as we can get from the code # identify any that we can add useful detail for and include them here if Errors.is_expired_session(exception): @@ -83,5 +88,7 @@ def check_common_error_codes_and_explain(logger, exception): # "session.session_expired_login")) # session.renew_session() return - else: + if exception.__class__ == tableauserverclient.ServerResponseError: logger.error(exception) + else: + logger.exception(exception) diff --git a/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py b/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py index 1a2169f5..fb0d5daf 100644 --- a/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py +++ b/tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py @@ -28,7 +28,7 @@ def get_view_by_content_url(logger, server, view_content_url) -> TSC.ViewItem: logger.debug(req_option.get_query_params()) matching_views, paging = server.views.get(req_option) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) if len(matching_views) < 1: Errors.exit_with_error(logger, message=_("errors.xmlapi.not_found")) return matching_views[0] @@ -42,7 +42,7 @@ def get_wb_by_content_url(logger, server, workbook_content_url) -> TSC.WorkbookI logger.debug(req_option.get_query_params()) matching_workbooks, paging = server.workbooks.get(req_option) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) if len(matching_workbooks) < 1: Errors.exit_with_error(logger, message=_("dataalerts.failure.error.workbookNotFound")) return matching_workbooks[0] @@ -56,7 +56,7 @@ def get_ds_by_content_url(logger, server, datasource_content_url) -> TSC.Datasou logger.debug(req_option.get_query_params()) matching_datasources, paging = server.datasources.get(req_option) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) if len(matching_datasources) < 1: Errors.exit_with_error(logger, message=_("dataalerts.failure.error.datasourceNotFound")) return matching_datasources[0] diff --git a/tabcmd/commands/datasources_and_workbooks/export_command.py b/tabcmd/commands/datasources_and_workbooks/export_command.py index 9a52fe5b..23012b51 100644 --- a/tabcmd/commands/datasources_and_workbooks/export_command.py +++ b/tabcmd/commands/datasources_and_workbooks/export_command.py @@ -54,7 +54,9 @@ def define_args(export_parser): help="Set the page size of the exported PDF", ) - group.add_argument("--width", default=800, help="Set the width of the image in pixels. Default is 800 px") + group.add_argument( + "--width", default=800, help="[Not Yet Implemented] Set the width of the image in pixels. Default is 800 px" + ) group.add_argument("--filename", "-f", help="filename to store the exported data") group.add_argument("--height", default=600, help=_("export.options.height")) group.add_argument( diff --git a/tabcmd/commands/datasources_and_workbooks/publish_command.py b/tabcmd/commands/datasources_and_workbooks/publish_command.py index ce04fa31..5aaf7db2 100644 --- a/tabcmd/commands/datasources_and_workbooks/publish_command.py +++ b/tabcmd/commands/datasources_and_workbooks/publish_command.py @@ -29,6 +29,8 @@ def define_args(publish_parser): ) set_publish_args(group) set_project_r_arg(group) + set_overwrite_option(group) + set_append_replace_option(group) set_parent_project_arg(group) @staticmethod @@ -52,8 +54,7 @@ def run_command(args): args.project_name = "default" args.parent_project_path = "" - publish_mode = PublishCommand.get_publish_mode(args) # --overwrite, --replace - logger.info("Publishing as " + publish_mode) + publish_mode = PublishCommand.get_publish_mode(args, logger) if args.db_username: creds = TSC.models.ConnectionCredentials(args.db_username, args.db_password, embed=args.save_db_password) @@ -66,18 +67,27 @@ def run_command(args): source = PublishCommand.get_filename_extension_if_tableau_type(logger, args.filename) logger.info(_("publish.status").format(args.filename)) if source in ["twbx", "twb"]: + if args.thumbnail_group: + raise AttributeError("Generating thumbnails for a group is not yet implemented.") + if args.thumbnail_username and args.thumbnail_group: + raise AttributeError("Cannot specify both a user and group for thumbnails.") + new_workbook = TSC.WorkbookItem(project_id, name=args.name, show_tabs=args.tabbed) try: + print(creds) new_workbook = server.workbooks.publish( new_workbook, args.filename, publish_mode, + # args.thumbnail_username, not yet implemented in tsc + # args.thumbnail_group, connection_credentials=creds, as_job=False, skip_connection_check=False, ) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) + logger.info(_("publish.success") + "\n{}".format(new_workbook.webpage_url)) elif source in ["tds", "tdsx", "hyper"]: @@ -88,13 +98,34 @@ def run_command(args): new_datasource, args.filename, publish_mode, connection_credentials=creds ) except Exception as exc: - Errors.exit_with_error(logger, exc) + Errors.exit_with_error(logger, exception=exc) logger.info(_("publish.success") + "\n{}".format(new_datasource.webpage_url)) + # todo write tests for this method @staticmethod - def get_publish_mode(args): + def get_publish_mode(args, logger): + # default: fail if it already exists on the server + default_mode = TSC.Server.PublishMode.CreateNew + publish_mode = default_mode + + if args.replace: + raise AttributeError("Replacing an extract is not yet implemented") + + if args.append: + if publish_mode != default_mode: + publish_mode = None + else: + # only relevant for datasources, but tsc will throw an error for us if necessary + publish_mode = TSC.Server.PublishMode.Append + if args.overwrite: - publish_mode = TSC.Server.PublishMode.Overwrite - else: - publish_mode = TSC.Server.PublishMode.CreateNew + if publish_mode != default_mode: + publish_mode = None + else: + # Overwrites the workbook, data source, or data extract if it already exists on the server. + publish_mode = TSC.Server.PublishMode.Overwrite + + if not publish_mode: + Errors.exit_with_error(logger, "Invalid combination of publishing options (Append, Overwrite, Replace)") + logger.debug("Publish mode selected: " + publish_mode) return publish_mode diff --git a/tabcmd/commands/user/user_data.py b/tabcmd/commands/user/user_data.py index b9012078..5251aba4 100644 --- a/tabcmd/commands/user/user_data.py +++ b/tabcmd/commands/user/user_data.py @@ -260,7 +260,7 @@ def act_on_users( try: group = UserCommand.find_group(logger, server, args.name) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) n_users_handled: int = 0 number_of_errors: int = 0 diff --git a/tabcmd/execution/global_options.py b/tabcmd/execution/global_options.py index 60c72fd0..695820db 100644 --- a/tabcmd/execution/global_options.py +++ b/tabcmd/execution/global_options.py @@ -126,7 +126,7 @@ def set_encryption_option(parser): "--encrypt", dest="encrypt", action="store_true", # set to true IF user passes in option --encrypt - help="Encrypt the newly created extract.", + help="Encrypt the newly created extract. [N/a on Tableau Cloud: extract encryption is controlled by Site Admin]", ) return parser @@ -230,7 +230,8 @@ def set_common_site_args(parser): "--extract-encryption-mode", choices=encryption_modes, type=case_insensitive_string_type(encryption_modes), - help="The extract encryption mode for the site can be enforced, enabled or disabled. ", + help="The extract encryption mode for the site can be enforced, enabled or disabled. " + "[N/a on Tableau Cloud: encryption mode is always enforced] ", ) parser.add_argument( @@ -275,8 +276,6 @@ def set_filename_arg(parser, description=_("get.options.file")): def set_publish_args(parser): parser.add_argument("-n", "--name", help="Name to publish the new datasource or workbook by.") - set_overwrite_option(parser) - creds = parser.add_mutually_exclusive_group() creds.add_argument("--oauth-username", help="The email address of a preconfigured OAuth connection") creds.add_argument( @@ -302,34 +301,63 @@ def set_publish_args(parser): navigate through the workbook", ) parser.add_argument( - "--replace", action="store_true", help="Use the extract file to replace the existing data source." + "--disable-uploader", + action="store_true", + help="[DEPRECATED - has no effect] Disable the incremental file uploader.", ) - parser.add_argument("--disable-uploader", action="store_true", help="Disable the incremental file uploader.") - parser.add_argument("--restart", help="Restart the file upload.") + parser.add_argument("--restart", help="[DEPRECATED - has no effect] Restart the file upload.") parser.add_argument( "--encrypt-extracts", action="store_true", - help="Encrypt extracts in the workbook, datasource, or extract being published to the server", + help="Encrypt extracts in the workbook, datasource, or extract being published to the server. " + "[N/a on Tableau Cloud: extract encryption is controlled by Site Admin]", ) + + # These two only apply for a workbook, not a datasource thumbnails = parser.add_mutually_exclusive_group() - thumbnails.add_argument("--thumbnail-username", help="Not yet implemented") - thumbnails.add_argument("--thumbnail-group", help="Not yet implemented") # not implemented in the REST API + thumbnails.add_argument( + "--thumbnail-username", + help="If the workbook contains user filters, the thumbnails will be generated based on what the " + "specified user can see. Cannot be specified when --thumbnail-group option is set.", + ) + thumbnails.add_argument( + "--thumbnail-group", + help="[Not yet implemented] If the workbook contains user filters, the thumbnails will be generated based on what the " + "specified group can see. Cannot be specified when --thumbnail-username option is set.", + ) parser.add_argument("--use-tableau-bridge", action="store_true", help="Refresh datasource through Tableau Bridge") -def set_overwrite_option(parser): +# these two are used to publish an extract to an existing data source +def set_append_replace_option(parser): append_group = parser.add_mutually_exclusive_group() append_group.add_argument( - "-o", - "--overwrite", + "--append", action="store_true", - help="Overwrites the workbook, data source, or data extract if it already exists on the server.", + help="Set to true to append the data being published to an existing data source that has the same name. " + "The default behavior is to fail if the data source already exists. " + "If append is set to true but the data source doesn't already exist, the operation fails.", ) + + # what's the difference between this and 'overwrite'? + # This is meant for when a) the local file is an extract b) the server item is an existing data source append_group.add_argument( - "--append", + "--replace", + action="store_true", + help="Use the extract file being published to replace data in the existing data source. The default " + "behavior is to fail if the item already exists.", + ) + + +# this is meant to be like replacing like +def set_overwrite_option(parser): + parser.add_argument( + "-o", + "--overwrite", action="store_true", - help="Append the extract file to the existing data source.", + help="Overwrites the workbook, data source, or data extract if it already exists on the server. The default " + "behavior is to fail if the item already exists.", ) @@ -351,12 +379,12 @@ def set_calculations_options(parser): calc_group.add_argument( "--addcalculations", action="store_true", - help="DEPRECATED [has no effect] Add precalculated data operations in the extract data source.", + help="[Not implemented] Add precalculated data operations in the extract data source.", ) calc_group.add_argument( "--removecalculations", action="store_true", - help="DEPRECATED [has no effect] Remove precalculated data in the extract data source.", + help="[Not implemented] Remove precalculated data in the extract data source.", ) return calc_group diff --git a/tabcmd/execution/parent_parser.py b/tabcmd/execution/parent_parser.py index 21890728..ba379619 100644 --- a/tabcmd/execution/parent_parser.py +++ b/tabcmd/execution/parent_parser.py @@ -101,7 +101,7 @@ def parent_parser_with_global_options(): parser.add_argument( "--continue-if-exists", action="store_true", # default behavior matches old tabcmd - help=strings[9], + help=strings[9], # kind of equivalent to 'overwrite' in the publish command ) parser.add_argument( diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index f8c5d24f..dbb9bf55 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -149,6 +149,10 @@ def test_publish(self, mock_session, mock_server): mock_args.tabbed = True mock_args.db_username = None mock_args.oauth_username = None + mock_args.append = False + mock_args.replace = False + mock_args.thumbnail_username = None + mock_args.thumbnail_group = None mock_server.projects = getter publish_command.PublishCommand.run_command(mock_args) mock_session.assert_called() diff --git a/tests/parsers/test_parser_publish.py b/tests/parsers/test_parser_publish.py index 261aeb6e..65aaa20d 100644 --- a/tests/parsers/test_parser_publish.py +++ b/tests/parsers/test_parser_publish.py @@ -1,4 +1,5 @@ import unittest +from unittest import skip from tabcmd.commands.datasources_and_workbooks.publish_command import PublishCommand from .common_setup import * @@ -38,3 +39,69 @@ def test_publish_parser_save_password(self): ] args = self.parser_under_test.parse_args(mock_args) assert args.save_db_password is True, args + + def test_publish_parser_save_oauth(self): + mock_args = [ + commandname, + "filename.twbx", + "--oauth-username", + "user", + "--save-oauth", + ] + args = self.parser_under_test.parse_args(mock_args) + assert args.save_oauth is True, args + assert args.oauth_username == "user", args + + def test_publish_parser_thumbnails(self): + mock_args = [commandname, "filename.twbx", "--thumbnail-username"] # no value for thumbnail-user + with self.assertRaises(SystemExit): + args = self.parser_under_test.parse_args(mock_args) + + mock_args = [commandname, "filename.twbx", "--thumbnail-username", "goofy"] + args = self.parser_under_test.parse_args(mock_args) + assert args.thumbnail_username == "goofy", args + + @skip("Not yet implemented") + def test_publish_parser_thumbnail_group(self): + mock_args = [commandname, "filename.twbx", "--thumbnail-group", "goofy"] + args = self.parser_under_test.parse_args(mock_args) + assert args.thumbnail_group == "goofy", args + + """ + append | replace | overwrite -> result + -------- + true | F/empty | F/empty -> append + true | F/empty | true -> ERROR + true | true | F/empty -> ERROR + .... basically, replace == overwrite, append != r/o + """ + + def test_publish_parser_append_options(self): + mock_args = [commandname, "filename.twbx", "--append"] + args = self.parser_under_test.parse_args(mock_args) + + def test_publish_parser_replace_and_append(self): + mock_args = [commandname, "filename.twbx", "--append", "--replace"] + with self.assertRaises(SystemExit): + args = self.parser_under_test.parse_args(mock_args) + + def test_publish_parser_replace_options(self): + mock_args = [commandname, "filename.twbx", "--overwrite"] + args = self.parser_under_test.parse_args(mock_args) + + mock_args = [commandname, "filename.twbx", "--replace"] + args = self.parser_under_test.parse_args(mock_args) + + mock_args = [commandname, "filename.twbx", "--replace", "--overwrite"] + args = self.parser_under_test.parse_args(mock_args) + + def test_publish_parser_deprecated_options(self): + # does nothing in new tabcmd, but shouldn't break anything + mock_args = [commandname, "filename.twbx", "--disable-uploader"] + args = self.parser_under_test.parse_args(mock_args) + mock_args = [commandname, "filename.twbx", "--restart", "argument"] + args = self.parser_under_test.parse_args(mock_args) + + def test_publish_parser_use_bridge_option(self): + mock_args = [commandname, "filename.twbx", "--use-tableau-bridge"] + args = self.parser_under_test.parse_args(mock_args) From c2857e9f2f9ea423ea54b01e3dd1f572a4dc35f1 Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 24 Mar 2023 13:54:27 -0700 Subject: [PATCH 10/22] proxy settings (#241) * implement --proxy, --no-proxy options * implement but not tested --use-certificate option * tweak output * specify black version --- pyproject.toml | 2 +- tabcmd/__main__.py | 5 +- tabcmd/commands/auth/session.py | 86 ++++++++--- tabcmd/execution/parent_parser.py | 2 +- tests/commands/test_session.py | 234 ++++++++++++++++-------------- 5 files changed, 195 insertions(+), 134 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 17ac9ecf..a6e022b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ dependencies = [ ] [project.optional-dependencies] test = [ - "black", + "black>=22,<23", "mock", "mypy", "pytest>=7.0", diff --git a/tabcmd/__main__.py b/tabcmd/__main__.py index 50eace8f..5bd5fb1f 100644 --- a/tabcmd/__main__.py +++ b/tabcmd/__main__.py @@ -3,9 +3,8 @@ try: from tabcmd.tabcmd import main except ImportError as e: - print(sys.stderr, e) - print(sys.stderr, "Tabcmd needs to be run as a module, it cannot be run as a script") - print(sys.stderr, "Try running python -m tabcmd") + print("Exception thrown running program: `{}`, `{}`".format(e, e.__context__), file=sys.stderr) + print("[Possible cause: Tabcmd needs to be run as a module, try running `python -m tabcmd`]", file=sys.stderr) sys.exit(1) if __name__ == "__main__": diff --git a/tabcmd/commands/auth/session.py b/tabcmd/commands/auth/session.py index 1dcf34a7..87101791 100644 --- a/tabcmd/commands/auth/session.py +++ b/tabcmd/commands/auth/session.py @@ -43,7 +43,7 @@ def __init__(self): self.no_prompt = False self.certificate = None self.no_certcheck = False - self.no_proxy = True + self.no_proxy = False self.proxy = None self.timeout = None @@ -73,10 +73,10 @@ def _update_session_data(self, args): self.token_name = args.token_name or self.token_name self.token_value = args.token_value or self.token_value - self.no_prompt = args.no_prompt or self.no_prompt + self.no_prompt = args.no_prompt # have to set this on every call? self.certificate = args.certificate or self.certificate - self.no_certcheck = args.no_certcheck or self.no_certcheck - self.no_proxy = args.no_proxy or self.no_proxy + self.no_certcheck = args.no_certcheck # have to set this on every call? + self.no_proxy = args.no_proxy # have to set this on every call? self.proxy = args.proxy or self.proxy self.timeout = self.timeout_as_integer(self.logger, args.timeout, self.timeout) @@ -150,28 +150,45 @@ def _create_new_token_credential(self): else: Errors.exit_with_error(self.logger, _("session.errors.missing_arguments").format("token name")) - def _set_connection_options(self) -> TSC.Server: + def _open_connection_with_opts(self) -> TSC.Server: self.logger.debug("Setting up request options") - # args still to be handled here: - # proxy, --no-proxy, - # cert http_options: Dict[str, Any] = {"headers": {"User-Agent": "Tabcmd/{}".format(version)}} + if self.no_certcheck: http_options["verify"] = False urllib3.disable_warnings(category=InsecureRequestWarning) + + """ + Do we want to do the same format check as old tabcmd? + For now I think we can trust requests to handle a bad proxy + Pattern pattern = Pattern.compile("([^:]*):([0-9]*)"); + if not matches: + throw new ReportableException(m_i18n.getString("sessionoptions.errors.bad_proxy_format", proxyArg)); + """ if self.proxy: - # do we catch this error? "sessionoptions.errors.bad_proxy_format" - self.logger.debug("Setting proxy: ", self.proxy) + self.logger.debug("Setting http proxy: {}".format(self.proxy)) + proxies = {"http": self.proxy} + http_options["proxies"] = proxies + if self.no_proxy: + # override any proxy that was set + http_options["proxies"] = None + if self.timeout: http_options["timeout"] = self.timeout + + if self.certificate: + http_options["cert"] = self.certificate + try: self.logger.debug(http_options) + # this is the only place we open a connection to the server + # so the request options are all set for the session now tableau_server = TSC.Server(self.server_url, http_options=http_options) except Exception as e: self.logger.debug( - "Connection args: server {}, site {}, proxy {}, cert {}".format( - self.server_url, self.site_name, self.proxy, self.certificate + "Connection args: server {}, site {}, proxy {}/no-proxy {}, cert {}".format( + self.server_url, self.site_name, self.proxy, self.no_proxy, self.certificate ) ) Errors.exit_with_error(self.logger, "Failed to connect to server", e) @@ -196,11 +213,10 @@ def _verify_server_connection_unauthed(self): Errors.exit_with_error(self.logger, exception=e) def _create_new_connection(self) -> TSC.Server: - self.logger.info(_("session.new_session")) self._print_server_info() self.logger.info(_("session.connecting")) try: - self.tableau_server = self._set_connection_options() + self.tableau_server = self._open_connection_with_opts() except Exception as e: Errors.exit_with_error(self.logger, "Failed to connect to server", e) return self.tableau_server @@ -211,22 +227,33 @@ def _read_existing_state(self): def _print_server_info(self): self.logger.info("===== Server: {}".format(self.server_url)) + if self.proxy: + self.logger.info("===== Proxy: {}".format(self.proxy)) if self.username: self.logger.info("===== Username: {}".format(self.username)) + if self.certificate: + self.logger.info("===== Certificate: {}".format(self.certificate)) else: self.logger.info("===== Token Name: {}".format(self.token_name)) site_display_name = self.site_name or "Default Site" self.logger.info(_("dataconnections.classes.tableau_server_site") + ": {}".format(site_display_name)) + # side-effect: sets self.username def _validate_existing_signin(self): - self.logger.info(_("session.continuing_session")) # when do these two messages show up? self.logger.info(_("session.auto_site_login")) try: if self.tableau_server and self.tableau_server.is_signed_in(): - response = self.tableau_server.users.get_by_id(self.user_id) - self.logger.debug(response) - if response.status_code.startswith("200"): - return self.tableau_server + server_user = self.tableau_server.users.get_by_id(self.user_id).name + if not self.username: + self.username = server_user + if not self.username == server_user: + Errors.exit_with_error( + self.logger, + message="Local username `{}` does not match server username `{}`".format( + self.username, server_user + ), + ) + return self.tableau_server except TSC.ServerResponseError as e: self.logger.info(_("publish.errors.unexpected_server_response"), e) except Exception as e: @@ -245,12 +272,14 @@ def _sign_in(self, tableau_auth) -> TSC.Server: self.site_id = self.tableau_server.site_id self.user_id = self.tableau_server.user_id self.auth_token = self.tableau_server._auth_token - if not self.username: - self.username = self.tableau_server.users.get_by_id(self.user_id).name - self.logger.info(_("common.output.succeeded")) + success = self._validate_existing_signin() except Exception as e: Errors.exit_with_error(self.logger, exception=e) - self.logger.debug("Signed into {0}{1} as {2}".format(self.server_url, self.site_name, self.username)) + if success: + self.logger.info(_("common.output.succeeded")) + else: + Errors.exit_with_error(self.logger, message="Sign in failed") + return self.tableau_server def _get_saved_credentials(self): @@ -290,6 +319,7 @@ def create_session(self, args, logger): else: # no login arguments given - look for saved info # maybe we're already signed in! if self.tableau_server: + self.logger.info(_("session.continuing_session")) signed_in_object = self._validate_existing_signin() self.logger.debug(signed_in_object) # or maybe we at least have the credentials saved @@ -297,7 +327,7 @@ def create_session(self, args, logger): credentials = self._get_saved_credentials() if credentials and not signed_in_object: - # logging in, not using an existing session + self.logger.debug("We are not logged in yet but we have credentials to log in with") self.tableau_server = self._create_new_connection() self._verify_server_connection_unauthed() signed_in_object = self._sign_in(credentials) @@ -358,7 +388,12 @@ def _read_from_json(self): try: with open(str(file_path), "r") as file_contents: data = json.load(file_contents) + if data is None or data == {}: + return content = data["tableau_auth"] + if content is None: + return + self._save_data_from_json(content) except json.JSONDecodeError as e: self._wipe_bad_json(e, "Error reading data from session file") except IOError as e: @@ -368,8 +403,11 @@ def _read_from_json(self): except Exception as e: self._wipe_bad_json(e, "Unexpected error reading session details from file") + def _save_data_from_json(self, content): try: auth = content[0] + if auth is None: + self._wipe_bad_json(ValueError(), "Empty session file") self.auth_token = auth["auth_token"] self.server_url = auth["server"] self.site_name = auth["site_name"] diff --git a/tabcmd/execution/parent_parser.py b/tabcmd/execution/parent_parser.py index ba379619..bc81f59c 100644 --- a/tabcmd/execution/parent_parser.py +++ b/tabcmd/execution/parent_parser.py @@ -85,7 +85,7 @@ def parent_parser_with_global_options(): ) proxy_group.add_argument( "--no-proxy", - action="store_false", + action="store_true", # default to false help=_("session.options.no-proxy"), ) diff --git a/tests/commands/test_session.py b/tests/commands/test_session.py index 5f4c8297..dfecc3a3 100644 --- a/tests/commands/test_session.py +++ b/tests/commands/test_session.py @@ -2,10 +2,9 @@ from argparse import Namespace import unittest from unittest import mock -from unittest.mock import patch, mock_open +from unittest.mock import MagicMock from tabcmd.commands.auth.session import Session -import os args_to_mock = Namespace( username=None, @@ -50,9 +49,9 @@ logger = logging.getLogger("tests") -def _set_mocks_for_json_file_saved_username(mock_json_load, auth_token, username): +def _set_mocks_for_json_file_saved_username(mock_json_lib, auth_token, username): mock_auth = vars(mock_data_from_json) - mock_json_load.return_value = {"tableau_auth": [mock_auth]} + mock_json_lib.load.return_value = {"tableau_auth": [mock_auth]} mock_auth["auth_token"] = auth_token mock_auth["username"] = username mock_auth["server"] = fakeserver @@ -60,27 +59,28 @@ def _set_mocks_for_json_file_saved_username(mock_json_load, auth_token, username mock_auth["no_certcheck"] = True -def _set_mocks_for_json_file_exists(mock_path, does_it_exist=True): - os.path = mock_path - mock_path.expanduser.return_value = "" - mock_path.join.return_value = "" - mock_path.exists.return_value = does_it_exist - return mock_path +def _set_mocks_for_json_file_exists(mock_path, mock_json_lib, does_it_exist=True): + mock_json_lib.JSONDecodeError = ValueError + path = mock_path() + path.expanduser.return_value = "" + path.join.return_value = "" + path.exists.return_value = does_it_exist - -def _set_mock_file_content(mock_load, expected_content): - mock_load.return_value = expected_content - return mock_load + mock_auth = vars(mock_data_from_json) + if does_it_exist: + mock_json_lib.load.return_value = [mock_auth] + else: + mock_json_lib.load.return_value = None + return path -@mock.patch("json.dump") -@mock.patch("json.load") +@mock.patch("tabcmd.commands.auth.session.json") @mock.patch("os.path") @mock.patch("builtins.open") class JsonTests(unittest.TestCase): - def test_read_session_from_json(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path) - _set_mocks_for_json_file_saved_username(mock_load, "AUTHTOKEN", "USERNAME") + def test_read_session_from_json(self, mock_open, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json) + _set_mocks_for_json_file_saved_username(mock_json, "AUTHTOKEN", "USERNAME") test_session = Session() test_session._read_from_json() assert hasattr(test_session.auth_token, "AUTHTOKEN") is False, test_session @@ -88,16 +88,16 @@ def test_read_session_from_json(self, mock_open, mock_path, mock_load, mock_dump assert test_session.username == "USERNAME" assert test_session.server_url == fakeserver, test_session.server_url - def test_save_session_to_json(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path) + def test_save_session_to_json(self, mock_open, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json) test_session = Session() test_session.username = "USN" test_session.server = "SRVR" test_session._save_session_to_json() - assert mock_dump.was_called() + assert mock_json.dump.was_called() - def clear_session(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path) + def clear_session(self, mock_open, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json) test_session = Session() test_session.username = "USN" test_session.server = "SRVR" @@ -105,13 +105,13 @@ def clear_session(self, mock_open, mock_path, mock_load, mock_dump): assert test_session.username is None assert test_session.server is None - def test_json_not_present(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path, False) + def test_json_not_present(self, mock_open, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json, does_it_exist=False) assert mock_open.was_not_called() - def test_json_invalid(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path) - _set_mock_file_content(mock_load, "just a string") + def test_json_invalid(self, mock_open, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json) + mock_json.load = "just a string" test_session = Session() assert test_session.username is None @@ -215,34 +215,30 @@ def test_dont_show_prompt_if_user_said_no(self): """ -@mock.patch("json.dump") -@mock.patch("json.load") +@mock.patch("tabcmd.commands.auth.session.json") @mock.patch("os.path") @mock.patch("builtins.open") @mock.patch("getpass.getpass") class CreateSessionTests(unittest.TestCase): @mock.patch("tableauserverclient.Server") - def test_create_session_first_time_no_args( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump - ): - mock_path = _set_mocks_for_json_file_exists(mock_path, False) - assert mock_path.exists("anything") is False + def test_create_session_first_time_no_args(self, mock_tsc, mock_pass, mock_file, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json, does_it_exist=False) + test_args = Namespace(**vars(args_to_mock)) - mock_tsc().users.get_by_id.return_value = None new_session = Session() with self.assertRaises(SystemExit): auth = new_session.create_session(test_args, None) @mock.patch("tableauserverclient.Server") - def test_create_session_first_time_with_token_arg( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump - ): - mock_path = _set_mocks_for_json_file_exists(mock_path, False) - assert mock_path.exists("anything") is False + def test_create_session_first_time_with_token_arg(self, mock_tsc, mock_pass, mock_file, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json, does_it_exist=False) + new_session = Session() + new_session.tableau_server = mock_tsc() + _set_mock_signin_validation_succeeds(new_session.tableau_server, "u") + test_args = Namespace(**vars(args_to_mock)) test_args.token_name = "tn" test_args.token_value = "foo" - new_session = Session() auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token @@ -251,46 +247,52 @@ def test_create_session_first_time_with_token_arg( assert new_session.token_name == "tn", new_session @mock.patch("tableauserverclient.Server") - def test_create_session_first_time_with_password_arg( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump - ): - mock_path = _set_mocks_for_json_file_exists(mock_path, False) + def test_create_session_first_time_with_password_arg(self, mock_tsc, mock_pass, mock_file, mock_path, mock_json): + name = "uuuu" + new_session = Session() + new_session.tableau_server = mock_tsc() + _set_mocks_for_json_file_exists(mock_path, mock_json, does_it_exist=False) + _set_mock_signin_validation_succeeds(new_session.tableau_server, name) + test_args = Namespace(**vars(args_to_mock)) - test_args.username = "uuuu" + test_args.username = name test_args.password = "pppp" - new_session = Session() auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token - assert new_session.username == "uuuu", new_session + assert new_session.username == name, new_session assert mock_tsc.has_been_called() @mock.patch("tableauserverclient.Server") def test_create_session_first_time_with_password_file_as_password( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump + self, mock_tsc, mock_pass, mock_file, mock_path, mock_json ): - mock_path = _set_mocks_for_json_file_exists(mock_path, False) + username = "uuuu" + _set_mocks_for_json_file_exists(mock_path, mock_json, does_it_exist=False) + new_session = Session() + _set_mock_signin_validation_succeeds(mock_tsc(), username) test_args = Namespace(**vars(args_to_mock)) - test_args.username = "uuuu" + test_args.username = username # filename = os.path.join(os.path.dirname(__file__),"test_credential_file.txt") # test_args.password_file = os.getcwd()+"/test_credential_file.txt" test_args.password_file = "filename" with mock.patch("builtins.open", mock.mock_open(read_data="my_password")): - new_session = Session() auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token - assert new_session.username == "uuuu", new_session + assert new_session.username == username, new_session assert new_session.password_file == "filename", new_session assert mock_tsc.has_been_called() @mock.patch("tableauserverclient.Server") def test_create_session_first_time_with_password_file_as_token( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump + self, mock_tsc, mock_pass, mock_file, mock_path, mock_json ): - mock_path = _set_mocks_for_json_file_exists(mock_path, False) + _set_mocks_for_json_file_exists(mock_path, mock_json, does_it_exist=False) + server = mock_tsc() + _set_mock_signin_validation_succeeds(server, "testing") test_args = Namespace(**vars(args_to_mock)) test_args.token_name = "mytoken" test_args.password_file = "filename" @@ -304,9 +306,9 @@ def test_create_session_first_time_with_password_file_as_token( assert mock_tsc.has_been_called() @mock.patch("tableauserverclient.Server") - def test_load_saved_session_data(self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump): - _set_mocks_for_json_file_exists(mock_path, True) - _set_mocks_for_json_file_saved_username(mock_json_load, "auth_token", "username") + def test_load_saved_session_data(self, mock_tsc, mock_pass, mock_file, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json) + _set_mocks_for_json_file_saved_username(mock_json, "auth_token", "username") test_args = Namespace(**vars(args_to_mock)) new_session = Session() new_session._read_existing_state() @@ -317,11 +319,9 @@ def test_load_saved_session_data(self, mock_tsc, mock_pass, mock_file, mock_path assert mock_tsc.has_been_called() @mock.patch("tableauserverclient.Server") - def test_create_session_with_active_session_saved( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump - ): - _set_mocks_for_json_file_exists(mock_path, True) - _set_mocks_for_json_file_saved_username(mock_json_load, "auth_token", None) + def test_create_session_with_active_session_saved(self, mock_tsc, mock_pass, mock_file, mock_path, mock_json): + _set_mocks_for_json_file_exists(mock_path, mock_json) + _set_mocks_for_json_file_saved_username(mock_json, "auth_token", None) test_args = Namespace(**vars(args_to_mock)) test_args.token_value = "tn" test_args.token_name = "tnnnn" @@ -335,12 +335,14 @@ def test_create_session_with_active_session_saved( @mock.patch("tableauserverclient.Server") def test_create_session_with_saved_expired_username_session( - self, mock_tsc, mock_pass, mock_file, mock_path, mock_json_load, mock_json_dump + self, mock_tsc, mock_pass, mock_file, mock_path, mock_json ): - _set_mocks_for_json_file_saved_username(mock_json_load, "auth_token", "username") - _set_mocks_for_json_file_exists(mock_path, True) - tsc_under_test = CreateSessionTests._set_mock_tsc_not_signed_in(mock_tsc) - CreateSessionTests._set_mock_tsc_sign_in_succeeds(tsc_under_test) + test_username = "monster" + server = mock_tsc() + _set_mocks_for_json_file_exists(mock_path, mock_json) + _set_mocks_for_json_file_saved_username(mock_json, "auth_token", test_username) + _set_mock_tsc_sign_in_succeeds(server) + _set_mock_signin_validation_succeeds(server, test_username) test_args = Namespace(**vars(args_to_mock)) mock_pass.getpass.return_value = "success" test_args.password = "eqweqwe" @@ -350,24 +352,31 @@ def test_create_session_with_saved_expired_username_session( assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token assert auth.auth_token == "cookiieeeee" - assert new_session.username == "username", new_session + assert new_session.username == test_username, new_session assert mock_tsc.use_server_version.has_been_called() - @staticmethod - def _set_mock_tsc_not_signed_in(mock_tsc): - tsc_in_test = mock.MagicMock(name="manually mocking tsc") - mock_tsc.return_value = tsc_in_test - tsc_in_test.is_signed_in.return_value = False # CreateSessionTests.return_False - tsc_in_test.server_info.get.return_value = Exception - return tsc_in_test - @staticmethod - def _set_mock_tsc_sign_in_succeeds(mock_tsc): - tscauth_mock = mock.MagicMock(name="tsc.auth") - mock_tsc.auth = tscauth_mock - mock_tsc.auth_token = "cookiieeeee" - mock_tsc.site_id = "1" - mock_tsc.user_id = "0" +def _set_mock_tsc_not_signed_in(mock_tsc): + tsc_in_test = mock.MagicMock(name="manually mocking tsc") + tsc_in_test.is_signed_in.return_value = False # CreateSessionTests.return_False + tsc_in_test.server_info.get.return_value = Exception + return tsc_in_test + + +def _set_mock_tsc_sign_in_succeeds(mock_tsc): + tscauth_mock = mock.MagicMock(name="tsc.auth") + mock_tsc.auth = tscauth_mock + mock_tsc.auth_token = "cookiieeeee" + mock_tsc.site_id = "1" + mock_tsc.user_id = "0" + + +def _set_mock_signin_validation_succeeds(mock_tsc, username): + mock_u_factory = MagicMock("user") + mock_u = mock_u_factory() + mock_tsc.users.get_by_id.return_value = mock_u + mock_u.name = username + mock_tsc.is_signed_in.return_value = True class TimeoutArgTests(unittest.TestCase): @@ -392,7 +401,7 @@ class TimeoutIntegrationTest(unittest.TestCase): def test_connection_times_out(self): test_args = Namespace(**vars(args_to_mock)) new_session = Session() - test_args.timeout = 10 + test_args.timeout = 2 test_args.username = "u" test_args.password = "p" @@ -403,36 +412,51 @@ def test_connection_times_out(self): # should test connection doesn't time out? -@mock.patch("tableauserverclient.Server") class ConnectionOptionsTest(unittest.TestCase): - def test_certcheck_on(self, mock_tsc): - mock_tsc.add_http_options = mock.MagicMock() - mock_session = mock.MagicMock() + def test_user_agent(self): + mock_session = Session() + mock_session.server_url = "fakehost" + connection = mock_session._open_connection_with_opts() + assert connection._http_options["headers"]["User-Agent"].startswith("Tabcmd/") + + def test_no_certcheck(self): + mock_session = Session() + mock_session.server_url = "fakehost" mock_session.no_certcheck = True mock_session.site_id = "s" mock_session.user_id = "u" - server = "anything" - mock_session._set_connection_options() - assert mock_tsc.add_http_options.has_been_called() + connection = mock_session._open_connection_with_opts() + assert connection._http_options["verify"] == False - def test_certcheck_off(self, mock_tsc): - mock_session = mock.MagicMock() - server = "anything" + def test_cert(self): + mock_session = Session() + mock_session.server_url = "fakehost" mock_session.site_id = "s" mock_session.user_id = "u" - mock_session._set_connection_options() - mock_tsc.add_http_options.assert_not_called() + mock_session.certificate = "my-cert-info" + connection = mock_session._open_connection_with_opts() + assert connection._http_options["cert"] == mock_session.certificate - """ - def test_cert(self, mock_tsc): - assert False, 'feature not implemented' + def test_proxy_stuff(self): + mock_session = Session() + mock_session.server_url = "fakehost" + mock_session.site_id = "s" + mock_session.user_id = "u" + mock_session.proxy = "proxy:port" + connection = mock_session._open_connection_with_opts() + assert connection._http_options["proxies"] == {"http": mock_session.proxy} - def test_proxy_stuff(self, mock_tsc): - assert False, 'feature not implemented' + def test_timeout(self): + mock_session = Session() + mock_session.server_url = "fakehost" + mock_session.site_id = "s" + mock_session.user_id = "u" + mock_session.timeout = 10 + connection = mock_session._open_connection_with_opts() + assert connection._http_options["timeout"] == 10 - def test_timeout(self, mock_tsc): - assert False, 'feature not implemented' +""" class CookieTests(unittest.TestCase): def test_no_file_if_no_cookie(self): From fc992e4a8b4e82e8d5034fe6db8f8b21e5a9e4bb Mon Sep 17 00:00:00 2001 From: Jac Date: Wed, 26 Apr 2023 15:22:19 -0700 Subject: [PATCH 11/22] freeze tsc dependency (#248) * freeze tsc dependency to 0.25 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a6e022b4..4ead88bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,7 @@ dependencies = [ "types-mock", "types-requests", "types-setuptools", - "tableauserverclient>=0.23", + "tableauserverclient==0.25", "urllib3>=1.24.3,<2.0", ] [project.optional-dependencies] From 248aa850422b75c74061397b7662898d6591b0d4 Mon Sep 17 00:00:00 2001 From: Jac Date: Thu, 27 Apr 2023 15:16:23 -0700 Subject: [PATCH 12/22] add --token-file option (#243) * Update session.py * update test for new functionality --- tabcmd/commands/auth/session.py | 21 ++++++++++----------- tests/commands/test_session.py | 5 +++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tabcmd/commands/auth/session.py b/tabcmd/commands/auth/session.py index 87101791..a8b480eb 100644 --- a/tabcmd/commands/auth/session.py +++ b/tabcmd/commands/auth/session.py @@ -34,6 +34,7 @@ def __init__(self): self.token_name = None self.token_value = None self.password_file = None + self.token_file = None self.site_name = None # The site name, e.g 'alpodev' self.site_id = None # The site id, e.g 'abcd-1234-1234-1244-1234' self.server_url = None @@ -69,7 +70,8 @@ def _update_session_data(self, args): if self.site_name == "default": self.site_name = "" self.logging_level = args.logging_level or self.logging_level - self.password_file = args.password_file + self.password_file = args.password_file or self.password_file + self.token_file = args.token_file or self.token_file self.token_name = args.token_name or self.token_name self.token_value = args.token_value or self.token_value @@ -136,8 +138,8 @@ def _create_new_credential(self, password, credential_type): def _create_new_token_credential(self): if self.token_value: token = self.token_value - elif self.password_file: - token = Session._read_password_from_file(self.password_file) + elif self.token_file: + token = Session._read_password_from_file(self.token_file) elif self._allow_prompt(): token = getpass.getpass("Token:") else: @@ -303,17 +305,11 @@ def create_session(self, args, logger): self.logger = logger or log(__class__.__name__, self.logging_level) credentials = None - if args.password: + if args.password or args.password_file: self._end_session() # we don't save the password anywhere, so we pass it along directly credentials = self._create_new_credential(args.password, Session.PASSWORD_CRED_TYPE) - elif args.password_file: - self._end_session() - if args.username: - credentials = self._create_new_credential(args.password, Session.PASSWORD_CRED_TYPE) - else: - credentials = self._create_new_credential(args.password, Session.TOKEN_CRED_TYPE) - elif args.token_value: + elif args.token_value or args.token_file: self._end_session() credentials = self._create_new_token_credential() else: # no login arguments given - look for saved info @@ -363,6 +359,7 @@ def _clear_data(self): self.server = None self.last_login_using = None self.password_file = None + self.token_file = None self.last_command = None self.tableau_server = None @@ -418,6 +415,7 @@ def _save_data_from_json(self, content): self.token_value = auth["personal_access_token"] self.last_login_using = auth["last_login_using"] self.password_file = auth["password_file"] + self.token_file = auth["token_file"] self.no_prompt = auth["no_prompt"] self.no_certcheck = auth["no_certcheck"] self.certificate = auth["certificate"] @@ -466,6 +464,7 @@ def _serialize_for_save(self): "personal_access_token": self.token_value, "last_login_using": self.last_login_using, "password_file": self.password_file, + "token_file": self.token_file, "no_prompt": self.no_prompt, "no_certcheck": self.no_certcheck, "certificate": self.certificate, diff --git a/tests/commands/test_session.py b/tests/commands/test_session.py index dfecc3a3..14ce7b45 100644 --- a/tests/commands/test_session.py +++ b/tests/commands/test_session.py @@ -14,6 +14,7 @@ server=None, token_name=None, token_value=None, + token_file=None, logging_level=None, no_certcheck=None, no_prompt=False, @@ -295,14 +296,14 @@ def test_create_session_first_time_with_password_file_as_token( _set_mock_signin_validation_succeeds(server, "testing") test_args = Namespace(**vars(args_to_mock)) test_args.token_name = "mytoken" - test_args.password_file = "filename" + test_args.token_file = "filename" with mock.patch("builtins.open", mock.mock_open(read_data="my_token")): new_session = Session() auth = new_session.create_session(test_args, None) assert auth is not None, auth assert auth.auth_token is not None, auth.auth_token - assert new_session.password_file == "filename", new_session + assert new_session.token_file == "filename", new_session assert mock_tsc.has_been_called() @mock.patch("tableauserverclient.Server") From f8d22e517c822da1d651e611ceb3b6fd9baa1aef Mon Sep 17 00:00:00 2001 From: Jac Date: Wed, 26 Jul 2023 23:59:54 -0700 Subject: [PATCH 13/22] Merge down changes from main (#258) * freeze tsc dependency (#248) (#249) --- .github/workflows/package.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index e26db65a..a0b41ea2 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -68,4 +68,5 @@ jobs: - uses: actions/upload-artifact@v3 with: + name: ${{ matrix.OUT_FILE_NAME }} path: ./dist/${{ matrix.TARGET }}/${{ matrix.OUT_FILE_NAME }} From 4741edb31000f05d58bea9e35acbfb3eaa9d266f Mon Sep 17 00:00:00 2001 From: Jac Date: Thu, 27 Jul 2023 00:29:00 -0700 Subject: [PATCH 14/22] Remove duplicated tests in merge Also change a print statement to log statement --- tabcmd/commands/auth/session.py | 17 +++++----------- .../publish_command.py | 3 ++- tests/commands/test_session.py | 20 ------------------- tests/e2e/setup_e2e.py | 2 +- 4 files changed, 8 insertions(+), 34 deletions(-) diff --git a/tabcmd/commands/auth/session.py b/tabcmd/commands/auth/session.py index a8b480eb..ba824fca 100644 --- a/tabcmd/commands/auth/session.py +++ b/tabcmd/commands/auth/session.py @@ -247,14 +247,9 @@ def _validate_existing_signin(self): if self.tableau_server and self.tableau_server.is_signed_in(): server_user = self.tableau_server.users.get_by_id(self.user_id).name if not self.username: + self.logger.info("Fetched user details from server") self.username = server_user - if not self.username == server_user: - Errors.exit_with_error( - self.logger, - message="Local username `{}` does not match server username `{}`".format( - self.username, server_user - ), - ) + return self.tableau_server except TSC.ServerResponseError as e: self.logger.info(_("publish.errors.unexpected_server_response"), e) @@ -291,8 +286,7 @@ def _get_saved_credentials(self): credentials = self._create_new_token_credential() else: return None - if credentials: - self.logger.info(_("session.options.password-file")) + return credentials # external entry point: @@ -317,13 +311,12 @@ def create_session(self, args, logger): if self.tableau_server: self.logger.info(_("session.continuing_session")) signed_in_object = self._validate_existing_signin() - self.logger.debug(signed_in_object) - # or maybe we at least have the credentials saved + if not signed_in_object: credentials = self._get_saved_credentials() if credentials and not signed_in_object: - self.logger.debug("We are not logged in yet but we have credentials to log in with") + self.logger.debug("Signin details found:") self.tableau_server = self._create_new_connection() self._verify_server_connection_unauthed() signed_in_object = self._sign_in(credentials) diff --git a/tabcmd/commands/datasources_and_workbooks/publish_command.py b/tabcmd/commands/datasources_and_workbooks/publish_command.py index 5aaf7db2..99c4ea25 100644 --- a/tabcmd/commands/datasources_and_workbooks/publish_command.py +++ b/tabcmd/commands/datasources_and_workbooks/publish_command.py @@ -74,7 +74,8 @@ def run_command(args): new_workbook = TSC.WorkbookItem(project_id, name=args.name, show_tabs=args.tabbed) try: - print(creds) + if creds: + logger.debug("Workbook credentials object: " + creds) new_workbook = server.workbooks.publish( new_workbook, args.filename, diff --git a/tests/commands/test_session.py b/tests/commands/test_session.py index d14cee32..44b20a8a 100644 --- a/tests/commands/test_session.py +++ b/tests/commands/test_session.py @@ -120,26 +120,6 @@ def test_json_invalid(self, mock_open, mock_path, mock_json): test_session = Session() assert test_session.username is None - def clear_session(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path) - test_session = Session() - test_session.username = "USN" - test_session.server = "SRVR" - test_session._clear_data() - assert test_session.username is None - assert test_session.server is None - - def test_json_not_present(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path, False) - assert mock_open.was_not_called() - - def test_json_invalid(self, mock_open, mock_path, mock_load, mock_dump): - _set_mocks_for_json_file_exists(mock_path) - _set_mock_file_content(mock_load, "just a string") - test_session = Session() - assert test_session.username is None - - @mock.patch("getpass.getpass") class BuildCredentialsTests(unittest.TestCase): @classmethod diff --git a/tests/e2e/setup_e2e.py b/tests/e2e/setup_e2e.py index 4edecf7c..29213fe7 100644 --- a/tests/e2e/setup_e2e.py +++ b/tests/e2e/setup_e2e.py @@ -24,7 +24,7 @@ def login(extra="--language", value="en"): credentials.server, "--site", credentials.site, - "--token", + "--token-value", credentials.token, "--token-name", credentials.token_name, From fa12da89fd4597b0f9d4b43786689a4677ac4058 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Thu, 27 Jul 2023 17:47:18 -0700 Subject: [PATCH 15/22] ignore errors from missing var files when in github --- tests/e2e/online_tests.py | 9 ++++++++- tests/e2e/setup_e2e.py | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index 22c1f993..db3ce465 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -4,7 +4,13 @@ import time import unittest -from credentials import waremart_password, waremart_user +try: + from credentials import waremart_password, waremart_user +except ModuleNotFoundError: + waremart_user = None + waremart_password = None + print("Could not import datasource creds from credentials file") + from tests.e2e import setup_e2e debug_log = "--logging-level=DEBUG" @@ -166,6 +172,7 @@ def _list(self, item_type: str): @pytest.mark.order(1) def test_login(self): try: + # this will silently do nothing when run in github setup_e2e.login() except Exception as e: raise SystemExit(2) diff --git a/tests/e2e/setup_e2e.py b/tests/e2e/setup_e2e.py index 29213fe7..7253fd6e 100644 --- a/tests/e2e/setup_e2e.py +++ b/tests/e2e/setup_e2e.py @@ -4,7 +4,7 @@ try: from tests.e2e import credentials # type: ignore except ImportError: - credentials = None # type: ignore + credentials = {} # type: ignore our_program = "tabcmd.exe" launch_path = os.path.join("dist", "tabcmd") @@ -13,7 +13,7 @@ def login(extra="--language", value="en"): if not credentials: - return + return # when run on github # --server, --site, --username, --password args = [ "python", From 2e04907ab6dac854de9800eb6d8898fdbda0baa4 Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 28 Jul 2023 16:28:12 -0700 Subject: [PATCH 16/22] fix log error on publish (#262) also add unit test --- .../publish_command.py | 2 +- tabcmd/commands/site/list_command.py | 1 - tests/commands/test_publish_command.py | 90 +++++++++++++++++++ tests/commands/test_run_commands.py | 37 +------- tests/commands/test_session.py | 2 + 5 files changed, 95 insertions(+), 37 deletions(-) create mode 100644 tests/commands/test_publish_command.py diff --git a/tabcmd/commands/datasources_and_workbooks/publish_command.py b/tabcmd/commands/datasources_and_workbooks/publish_command.py index 99c4ea25..cb50be17 100644 --- a/tabcmd/commands/datasources_and_workbooks/publish_command.py +++ b/tabcmd/commands/datasources_and_workbooks/publish_command.py @@ -75,7 +75,7 @@ def run_command(args): new_workbook = TSC.WorkbookItem(project_id, name=args.name, show_tabs=args.tabbed) try: if creds: - logger.debug("Workbook credentials object: " + creds) + logger.debug("Workbook credentials object: " + str(creds)) new_workbook = server.workbooks.publish( new_workbook, args.filename, diff --git a/tabcmd/commands/site/list_command.py b/tabcmd/commands/site/list_command.py index 76c67cbb..64e4fa48 100644 --- a/tabcmd/commands/site/list_command.py +++ b/tabcmd/commands/site/list_command.py @@ -18,7 +18,6 @@ class ListCommand(Server): "tabcmd_content_none": "No content found.", } - name: str = "list" description: str = "List content items of a specified type" diff --git a/tests/commands/test_publish_command.py b/tests/commands/test_publish_command.py new file mode 100644 index 00000000..9f91a02e --- /dev/null +++ b/tests/commands/test_publish_command.py @@ -0,0 +1,90 @@ +import argparse +import unittest +from unittest.mock import * +import tableauserverclient as TSC + +from tabcmd.commands.auth import login_command +from tabcmd.commands.datasources_and_workbooks import delete_command, export_command, get_url_command, publish_command + + +from typing import List, NamedTuple, TextIO, Union +import io + +mock_args = argparse.Namespace() + +fake_item = MagicMock() +fake_item.name = "fake-name" +fake_item.id = "fake-id" +fake_item.pdf = b"/pdf-representation-of-view" +fake_item.extract_encryption_mode = "Disabled" + +fake_job = MagicMock() +fake_job.id = "fake-job-id" + +creator = MagicMock() +getter = MagicMock() +getter.get = MagicMock("get", return_value=([fake_item], 1)) +getter.publish = MagicMock("publish", return_value=fake_item) + + +@patch("tableauserverclient.Server") +@patch("tabcmd.commands.auth.session.Session.create_session") +class RunCommandsTest(unittest.TestCase): + @staticmethod + def _set_up_session(mock_session, mock_server): + mock_session.return_value = mock_server + assert mock_session is not None + mock_session.assert_not_called() + global mock_args + mock_args = argparse.Namespace(logging_level="DEBUG") + # set values for things that should always have a default + # should refactor so this can be automated + mock_args.continue_if_exists = False + mock_args.project_name = None + mock_args.parent_project_path = None + mock_args.parent_path = None + mock_args.timeout = None + mock_args.username = None + + def test_publish(self, mock_session, mock_server): + RunCommandsTest._set_up_session(mock_session, mock_server) + mock_args.overwrite = False + mock_args.filename = "existing_file.twbx" + mock_args.project_name = "project-name" + mock_args.parent_project_path = "projects" + mock_args.name = "" + mock_args.tabbed = True + mock_args.db_username = None + mock_args.oauth_username = None + mock_args.append = False + mock_args.replace = False + mock_args.thumbnail_username = None + mock_args.thumbnail_group = None + mock_server.projects = getter + publish_command.PublishCommand.run_command(mock_args) + mock_session.assert_called() + + def test_publish_with_creds(self, mock_session, mock_server): + RunCommandsTest._set_up_session(mock_session, mock_server) + mock_args.overwrite = False + mock_args.append = True + mock_args.replace = False + + mock_args.filename = "existing_file.twbx" + mock_args.project_name = "project-name" + mock_args.parent_project_path = "projects" + mock_args.name = "" + mock_args.tabbed = True + + mock_args.db_username = "username" + mock_args.db_password = "oauth_u" + mock_args.save_db_password = True + mock_args.oauth_username = None + mock_args.embed = False + + mock_args.thumbnail_username = None + mock_args.thumbnail_group = None + + mock_server.projects = getter + publish_command.PublishCommand.run_command(mock_args) + mock_session.assert_called() diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index dbb9bf55..2efd4a75 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -4,13 +4,7 @@ import tableauserverclient as TSC from tabcmd.commands.auth import login_command, logout_command -from tabcmd.commands.datasources_and_workbooks import ( - delete_command, - export_command, - get_url_command, - publish_command, - runschedule_command, -) +from tabcmd.commands.datasources_and_workbooks import delete_command, export_command, get_url_command, publish_command from tabcmd.commands.extracts import ( create_extracts_command, delete_extracts_command, @@ -35,7 +29,7 @@ remove_users_command, delete_site_users_command, ) -from typing import List, NamedTuple, TextIO, Union +from typing import NamedTuple, TextIO, Union import io mock_args = argparse.Namespace() @@ -139,33 +133,6 @@ def test_get_workbook(self, mock_session, mock_server): get_url_command.GetUrl.run_command(mock_args) mock_session.assert_called() - def test_publish(self, mock_session, mock_server): - RunCommandsTest._set_up_session(mock_session, mock_server) - mock_args.overwrite = False - mock_args.filename = "existing_file.twbx" - mock_args.project_name = "project-name" - mock_args.parent_project_path = "projects" - mock_args.name = "" - mock_args.tabbed = True - mock_args.db_username = None - mock_args.oauth_username = None - mock_args.append = False - mock_args.replace = False - mock_args.thumbnail_username = None - mock_args.thumbnail_group = None - mock_server.projects = getter - publish_command.PublishCommand.run_command(mock_args) - mock_session.assert_called() - - @unittest.skip("target code not implemented yet") - def test_runschedule(self, mock_session, mock_server): - RunCommandsTest._set_up_session(mock_session, mock_server) - mock_server.schedules = getter - mock_args.schedule = "myschedule" - with self.assertRaises(SystemExit): - runschedule_command.RunSchedule.run_command(mock_args) - # mock_session.assert_called() - # extracts def test_create_extract(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) diff --git a/tests/commands/test_session.py b/tests/commands/test_session.py index 44b20a8a..cb60260d 100644 --- a/tests/commands/test_session.py +++ b/tests/commands/test_session.py @@ -74,6 +74,7 @@ def _set_mocks_for_json_file_exists(mock_path, mock_json_lib, does_it_exist=True mock_json_lib.load.return_value = None return path + def _set_mock_file_content(mock_load, expected_content): mock_load.return_value = expected_content return mock_load @@ -120,6 +121,7 @@ def test_json_invalid(self, mock_open, mock_path, mock_json): test_session = Session() assert test_session.username is None + @mock.patch("getpass.getpass") class BuildCredentialsTests(unittest.TestCase): @classmethod From 71d36c3636c81907f6bf993f3e7381a8f4ead704 Mon Sep 17 00:00:00 2001 From: Jac Date: Wed, 21 Feb 2024 18:58:37 -0800 Subject: [PATCH 17/22] fix filepath handling in Get command (#277) * use os file handling code * mypy and black --- .../get_url_command.py | 32 +++++++++---------- .../publish_command.py | 2 -- tests/commands/test_execution.py | 3 +- tests/commands/test_geturl_utils.py | 26 +++++++++++++-- tests/commands/test_session.py | 2 ++ tests/e2e/online_tests.py | 10 ++++-- 6 files changed, 50 insertions(+), 25 deletions(-) diff --git a/tabcmd/commands/datasources_and_workbooks/get_url_command.py b/tabcmd/commands/datasources_and_workbooks/get_url_command.py index 38518bd8..8eae77bc 100644 --- a/tabcmd/commands/datasources_and_workbooks/get_url_command.py +++ b/tabcmd/commands/datasources_and_workbooks/get_url_command.py @@ -1,4 +1,5 @@ import inspect +import os import tableauserverclient as TSC from tableauserverclient import ServerResponseError @@ -80,7 +81,7 @@ def explain_expected_url(logger, url: str, command: str): def get_file_type_from_filename(logger, url, file_name): logger.debug("Choosing between {}, {}".format(file_name, url)) file_name = file_name or url - logger.debug(_("get.options.file") + ": {}".format(file_name)) + logger.debug(_("get.options.file") + ": {}".format(file_name)) # Name to save the file as type_of_file = GetUrl.get_file_extension(file_name) if not type_of_file and file_name is not None: @@ -98,25 +99,24 @@ def get_file_type_from_filename(logger, url, file_name): Errors.exit_with_error(logger, _("tabcmd.get.extension.not_found").format(file_name)) @staticmethod - def get_file_extension(filename): - parts = filename.split(".") - if len(parts) < 2: - return None - extension = parts[1] + def get_file_extension(path): + path_segments = os.path.split(path) + filename = path_segments[-1] + filename_segments = filename.split(".") + extension = filename_segments[-1] extension = GetUrl.strip_query_params(extension) return extension @staticmethod def strip_query_params(filename): - if filename.find("?") > 0: - filename = filename.split("?")[0] - return filename + if "?" in filename: + return filename.split("?")[0] + else: + return filename @staticmethod def get_name_without_possible_extension(filename): - if filename.find(".") > 0: - filename = filename.split(".")[0] - return filename + return filename.split(".")[0] @staticmethod def get_resource_name(url: str, logger): # workbooks/wb-name" -> "wb-name", datasource/ds-name -> ds-name @@ -181,7 +181,7 @@ def generate_pdf(logger, server, args, view_url): filename = GetUrl.filename_from_args(args.filename, view_item.name, "pdf") DatasourcesAndWorkbooks.save_to_file(logger, view_item.pdf, filename) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) @staticmethod def generate_png(logger, server, args, view_url): @@ -195,7 +195,7 @@ def generate_png(logger, server, args, view_url): filename = GetUrl.filename_from_args(args.filename, view_item.name, "png") DatasourcesAndWorkbooks.save_to_file(logger, view_item.image, filename) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) @staticmethod def generate_csv(logger, server, args, view_url): @@ -226,7 +226,7 @@ def generate_twb(logger, server, args, file_extension, url): server.workbooks.download(target_workbook.id, filepath=file_name_with_path, no_extract=False) logger.info(_("export.success").format(target_workbook.name, file_name_with_ext)) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) @staticmethod def generate_tds(logger, server, args, file_extension): @@ -243,4 +243,4 @@ def generate_tds(logger, server, args, file_extension): server.datasources.download(target_datasource.id, filepath=file_name_with_path, no_extract=False) logger.info(_("export.success").format(target_datasource.name, file_name_with_ext)) except Exception as e: - Errors.exit_with_error(logger, e) + Errors.exit_with_error(logger, exception=e) diff --git a/tabcmd/commands/datasources_and_workbooks/publish_command.py b/tabcmd/commands/datasources_and_workbooks/publish_command.py index cb50be17..64189e9e 100644 --- a/tabcmd/commands/datasources_and_workbooks/publish_command.py +++ b/tabcmd/commands/datasources_and_workbooks/publish_command.py @@ -74,8 +74,6 @@ def run_command(args): new_workbook = TSC.WorkbookItem(project_id, name=args.name, show_tabs=args.tabbed) try: - if creds: - logger.debug("Workbook credentials object: " + str(creds)) new_workbook = server.workbooks.publish( new_workbook, args.filename, diff --git a/tests/commands/test_execution.py b/tests/commands/test_execution.py index 364ce456..b31e8056 100644 --- a/tests/commands/test_execution.py +++ b/tests/commands/test_execution.py @@ -1,7 +1,6 @@ import argparse -import sys import unittest -import mock +import unittest.mock as mock from tabcmd.execution.logger_config import * from tabcmd.execution.tabcmd_controller import TabcmdController diff --git a/tests/commands/test_geturl_utils.py b/tests/commands/test_geturl_utils.py index 32497be6..ec63e4df 100644 --- a/tests/commands/test_geturl_utils.py +++ b/tests/commands/test_geturl_utils.py @@ -24,7 +24,23 @@ fake_item.id = "fake-id" -class GeturlTests(unittest.TestCase): +class FileHandling(unittest.TestCase): + + # get_file_type_from_filename(logger, url, filename) + # get_file_extension(filepath) + # evaluate_content_type(logger, url) + # strip_query_params(filename) + # get_name_without_possible_extension(fileanme) + # get_resource_name(url, logger) + # get_view_url(url, logger) + # filename_from_args(file_arg, item_name, filetype) + + def test_get_view_with_chars_in_save_name(self): + filename = "C:\\chase.culver\\docs\\downloaded.twbx" # W-13757625 fails if file path contains . + url = None + filetype = GetUrl.get_file_type_from_filename(mock_logger, filename, url) + assert filetype == "twbx", filetype + def test_evaluate_file_name_pdf(self): filename = "filename.pdf" url = None @@ -59,6 +75,9 @@ def test_get_view_without_extension_that_doesnt_have_one(self): filename = "viewname" assert GetUrl.get_name_without_possible_extension(filename) == filename + +# handling our specific url-ish identifiers: /workbook/wb-name, etc +class GeturlTests(unittest.TestCase): def test_get_workbook_name(self): assert GetUrl.get_resource_name("workbooks/wbname", mock_logger) == "wbname" @@ -69,9 +88,12 @@ def test_view_name_with_url_params(self): assert GetUrl.get_view_url("views/wb-name/view-name?:refresh=y", None) == "wb-name/sheets/view-name" """ - GetUrl.get_view_without_extension(view_name) GetUrl.get_view(url) + GetUrl.get_view_without_extension(view_name) GetUrl.get_workbook(url) + """ + + """ GetUrl.generate_twb(logger, server, args) GetUrl.generate_pdf(logger, server, args) GetUrl.generate_png(logger, server, args) diff --git a/tests/commands/test_session.py b/tests/commands/test_session.py index 44b20a8a..cb60260d 100644 --- a/tests/commands/test_session.py +++ b/tests/commands/test_session.py @@ -74,6 +74,7 @@ def _set_mocks_for_json_file_exists(mock_path, mock_json_lib, does_it_exist=True mock_json_lib.load.return_value = None return path + def _set_mock_file_content(mock_load, expected_content): mock_load.return_value = expected_content return mock_load @@ -120,6 +121,7 @@ def test_json_invalid(self, mock_open, mock_path, mock_json): test_session = Session() assert test_session.username is None + @mock.patch("getpass.getpass") class BuildCredentialsTests(unittest.TestCase): @classmethod diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index d0b402df..3e70d78d 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -38,7 +38,7 @@ site_admin = True project_admin = True extract_encryption_enabled = False -use_tabcmd_classic = False # toggle between testing using tabcmd 2 or tabcmd classic +use_tabcmd_classic = False # toggle between testing using tabcmd 2 or tabcmd classic def _test_command(test_args: list[str]): @@ -49,7 +49,11 @@ def _test_command(test_args: list[str]): # call the executable directly: lets us drop in classic tabcmd if use_tabcmd_classic: - calling_args = ["C:\\Program Files\\Tableau\\Tableau Server\\2023.3\\extras\\Command Line Utility\\tabcmd.exe"] + test_args + ["--no-certcheck"] + calling_args = ( + ["C:\\Program Files\\Tableau\\Tableau Server\\2023.3\\extras\\Command Line Utility\\tabcmd.exe"] + + test_args + + ["--no-certcheck"] + ) if database_password not in calling_args: print(calling_args) return subprocess.check_call(calling_args) @@ -312,7 +316,7 @@ def test_list_workbooks(self): self._list("workbooks") @pytest.mark.order(8) - def test_list_workbooks(self): + def test_list_datasources(self): if use_tabcmd_classic: pytest.skip("not for tabcmd classic") self._list("datasources") From fa14810af79e4524894c0bb3a66a57ff724e9bbb Mon Sep 17 00:00:00 2001 From: renoyjohnm <168143499+renoyjohnm@users.noreply.github.com> Date: Fri, 3 May 2024 00:37:13 -0700 Subject: [PATCH 18/22] Fix for "this application can't be opened" error on opening tabcmd.app on Mac (#285) * Fix for mac executable * Fix actions workflow * Fix packaging issue * adding debug statements * File permissions change * changing to macos-13 * Changing file permissions * Changing chown command args * Checking bin file permission * Adding target for Mac latest * Fix issues with tar * Fix tar file location issue * adding .tar to uploaded artifact * Fix for tar-ing the right dir * Remove .tar from the artifact name * Naming clean up * typo * Removing deprecated python version * specifying target_arch in spec file as universal2 * Revert "specifying target_arch in spec file as universal2" This reverts commit 1d037fc5e4566d8d865f7b01a53492692de4e6df. --- .github/workflows/package.yml | 35 +++++++++++++++++++++++++++++++-- .github/workflows/run-tests.yml | 2 +- tabcmd-mac.spec | 6 +++--- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 34d84b67..5e1ffdc0 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -28,11 +28,21 @@ jobs: pyinstaller tabcmd-windows.spec --clean --noconfirm --distpath ./dist/windows OUT_FILE_NAME: tabcmd.exe ASSET_MIME: application/vnd.microsoft.portable-executable + - os: macos-13 + TARGET: macos + CMD_BUILD: > + pyinstaller tabcmd-mac.spec --clean --noconfirm --distpath ./dist/macos/ + BUNDLE_NAME: tabcmd.app + OUT_FILE_NAME: tabcmd.app + APP_BINARY_FILE_NAME: tabcmd + ASSET_MIME: application/zip - os: macos-latest TARGET: macos CMD_BUILD: > - pyinstaller tabcmd-mac.spec --clean --noconfirm --distpath ./dist/macos + pyinstaller tabcmd-mac.spec --clean --noconfirm --distpath ./dist/macos/ + BUNDLE_NAME: tabcmd_arm64.app OUT_FILE_NAME: tabcmd.app + APP_BINARY_FILE_NAME: tabcmd ASSET_MIME: application/zip - os: ubuntu-latest TARGET: ubuntu @@ -64,9 +74,30 @@ jobs: run: ${{matrix.CMD_BUILD}} - name: Validate package for ${{matrix.TARGET}} + if: matrix.TARGET != 'macos' run: ./dist/${{ matrix.TARGET }}/${{matrix.OUT_FILE_NAME}} - - uses: actions/upload-artifact@v4 + - name: Validate package for Mac + if: matrix.TARGET == 'macos' + run: ./dist/${{ matrix.TARGET }}/${{ matrix.OUT_FILE_NAME }}/Contents/MacOS/${{ matrix.APP_BINARY_FILE_NAME }} + + - name: Tar app bundle for Mac + if: matrix.TARGET == 'macos' + run: | + rm -f dist/${{ matrix.TARGET }}/${{ matrix.APP_BINARY_FILE_NAME }} + cd dist/${{ matrix.TARGET }} + tar -cvf ${{ matrix.BUNDLE_NAME }}.tar ${{ matrix.OUT_FILE_NAME }} + + - name: Upload artifact + if: matrix.TARGET != 'macos' + uses: actions/upload-artifact@v4 with: name: ${{ matrix.OUT_FILE_NAME }} path: ./dist/${{ matrix.TARGET }}/${{ matrix.OUT_FILE_NAME }} + + - name: Upload artifact for Mac + if: matrix.TARGET == 'macos' + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.BUNDLE_NAME }} + path: ./dist/${{ matrix.TARGET }}/${{ matrix.BUNDLE_NAME }}.tar diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 88624a05..06e4d87f 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -15,7 +15,7 @@ jobs: fail-fast: true matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ['3.7', '3.8', '3.9', '3.10', '3'] + python-version: ['3.8', '3.9', '3.10', '3'] runs-on: ${{ matrix.os }} diff --git a/tabcmd-mac.spec b/tabcmd-mac.spec index 8d50c283..dc8acdf2 100644 --- a/tabcmd-mac.spec +++ b/tabcmd-mac.spec @@ -32,7 +32,7 @@ exe = EXE( a.zipfiles, a.datas, [], - name='tabcmd.app', + name='tabcmd', debug=False, bootloader_ignore_signals=False, strip=False, @@ -40,12 +40,12 @@ exe = EXE( runtime_tmpdir=None, console=True, codesign_identity=None, - version='program_metadata.txt', + version='program_metadata.txt' ) app = BUNDLE( exe, - name = 'tabcmd-app', + name = 'tabcmd.app', icon='res/tabcmd.icns', bundle_identifier = None, ) From 60b99957250fc54ff84865dde68323fb5c0e04a3 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 6 May 2024 22:10:41 +0200 Subject: [PATCH 19/22] Remove argparse (#282) --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c9aa9d18..f3348261 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,6 @@ classifiers = [ "Programming Language :: Python :: 3.12" ] dependencies = [ - 'argparse', "appdirs", "doit", "ftfy", From 4c5186d7fe89b80242d48e18292e0074d22f956b Mon Sep 17 00:00:00 2001 From: Jac Date: Fri, 7 Jun 2024 15:45:53 -0700 Subject: [PATCH 20/22] Add all test assets, some test improvements (#290) * test robustness - add skip-connection-check so it can run against local server - fix bug revealed where it was confused by the Default server - fix asset names to go with assets in repo - fail fast if publishing fails (because all the following tests will also fail) - fail cleanly if you forget to enter any command * add content in the tests\assets dir, update gitignore * remove import being added back * format w black * specify version of black expected --- .gitignore | 19 +- World Indicators.tdsx | Bin 4041 -> 0 bytes WorldIndicators.tdsx | Bin 160687 -> 0 bytes pyproject.toml | 1 + .../publish_command.py | 24 +- tabcmd/execution/global_options.py | 5 + tabcmd/execution/tabcmd_controller.py | 6 +- tests/assets/EmbeddedCredentials.twb | 977 ++++++++++++++++++ tests/assets/SampleDS.tds | 2 +- tests/assets/WorkbookWithExtract.twbx | Bin 0 -> 78093 bytes tests/assets/WorkbookWithoutExtract.twbx | Bin 0 -> 20782 bytes tests/assets/simple-data.twbx | Bin 0 -> 19615 bytes tests/assets/usernames.csv | 1 + tests/commands/test_publish_command.py | 2 + tests/commands/test_run_commands.py | 1 + tests/e2e/online_tests.py | 19 +- 16 files changed, 1023 insertions(+), 34 deletions(-) delete mode 100644 World Indicators.tdsx delete mode 100644 WorldIndicators.tdsx create mode 100644 tests/assets/EmbeddedCredentials.twb create mode 100644 tests/assets/WorkbookWithExtract.twbx create mode 100644 tests/assets/WorkbookWithoutExtract.twbx create mode 100644 tests/assets/simple-data.twbx create mode 100644 tests/assets/usernames.csv diff --git a/.gitignore b/.gitignore index 90521b3b..eae72589 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # general dev/ide files *.log *.vscode -*.csv .idea *.DS_Store @@ -24,19 +23,20 @@ workon/ .coverage pytest.xml +*.txt # content # todo probably want to add a workbook and ds in /res for getting started easily *.pdf *.png -*.twbx -*.hyper -*.twb -*.twbr -html *.html -*.twbr +# *.twbx +# *.hyper +# *.twb +# *.twbr +# *.tdsx **/credentials.py -*.txt +# exceptions +!tests/assets/ # doit .doit.* @@ -48,6 +48,3 @@ site-packages tabcmd-dev workon test.junit.xml - -# exceptions -!tests/assets/detailed_users.csv \ No newline at end of file diff --git a/World Indicators.tdsx b/World Indicators.tdsx deleted file mode 100644 index 7c8e53db0597c5cabf5c1c3a8219b1b2fcc3c17c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4041 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 diff --git a/WorldIndicators.tdsx b/WorldIndicators.tdsx deleted file mode 100644 index 2df960ccda93870af5bbb4f8f8f7cd6ba0d13e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160687 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̮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 diff --git a/pyproject.toml b/pyproject.toml index f3348261..7a818c8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ packages = ["tabcmd"] tabcmd = ["tabcmd.locales/**/*.mo"] [tool.black] line-length = 120 +required-version = 22 target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] extend-exclude = '^/bin/*' [tool.mypy] diff --git a/tabcmd/commands/datasources_and_workbooks/publish_command.py b/tabcmd/commands/datasources_and_workbooks/publish_command.py index 64189e9e..a4ff8c26 100644 --- a/tabcmd/commands/datasources_and_workbooks/publish_command.py +++ b/tabcmd/commands/datasources_and_workbooks/publish_command.py @@ -40,19 +40,17 @@ def run_command(args): session = Session() server = session.create_session(args, logger) - if args.project_name: - try: - dest_project = Server.get_project_by_name_and_parent_path( - logger, server, args.project_name, args.parent_project_path - ) - project_id = dest_project.id - except Exception as exc: - logger.error(exc.__str__()) - Errors.exit_with_error(logger, _("publish.errors.server_resource_not_found"), exc) - else: - project_id = "" - args.project_name = "default" + if not args.project_name: + args.project_name = "Default" args.parent_project_path = "" + try: + dest_project = Server.get_project_by_name_and_parent_path( + logger, server, args.project_name, args.parent_project_path + ) + project_id = dest_project.id + except Exception as exc: + logger.error(exc.__str__()) + Errors.exit_with_error(logger, _("publish.errors.server_resource_not_found"), exc) publish_mode = PublishCommand.get_publish_mode(args, logger) @@ -82,7 +80,7 @@ def run_command(args): # args.thumbnail_group, connection_credentials=creds, as_job=False, - skip_connection_check=False, + skip_connection_check=args.skip_connection_check, ) except Exception as e: Errors.exit_with_error(logger, exception=e) diff --git a/tabcmd/execution/global_options.py b/tabcmd/execution/global_options.py index 695820db..6c972616 100644 --- a/tabcmd/execution/global_options.py +++ b/tabcmd/execution/global_options.py @@ -312,6 +312,11 @@ def set_publish_args(parser): help="Encrypt extracts in the workbook, datasource, or extract being published to the server. " "[N/a on Tableau Cloud: extract encryption is controlled by Site Admin]", ) + parser.add_argument( + "--skip-connection-check", + action="store_true", + help="Skip connection check: do not validate the workbook/datasource connection during publishing", + ) # These two only apply for a workbook, not a datasource thumbnails = parser.add_mutually_exclusive_group() diff --git a/tabcmd/execution/tabcmd_controller.py b/tabcmd/execution/tabcmd_controller.py index 1a4544d2..6e06dfe1 100644 --- a/tabcmd/execution/tabcmd_controller.py +++ b/tabcmd/execution/tabcmd_controller.py @@ -37,14 +37,16 @@ def run(parser, user_input=None): logger.debug(namespace) if namespace.language: set_client_locale(namespace.language, logger) - try: + func = namespace.func # if a subcommand was identified, call the function assigned to it # this is the functional equivalent of the call by reflection in the previous structure # https://stackoverflow.com/questions/49038616/argparse-subparsers-with-functions namespace.func.run_command(namespace) + except AttributeError: + parser.error("No command identified or too few arguments") except Exception as e: - # todo: use log_stack here for better presentation + # todo: use log_stack here for better presentation? logger.exception(e) # if no command was given, argparse will just not create the attribute sys.exit(2) diff --git a/tests/assets/EmbeddedCredentials.twb b/tests/assets/EmbeddedCredentials.twb new file mode 100644 index 00000000..196f0924 --- /dev/null +++ b/tests/assets/EmbeddedCredentials.twb @@ -0,0 +1,977 @@ + + + + + + + + + + + + + ID + 3 + [ID] + [DBZ] + ID + 1 + integer + Sum + 10 + false + + "SQL_INTEGER" + "SQL_C_SLONG" + + + + Vendor + 130 + [Vendor] + [DBZ] + Vendor + 2 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Database + 130 + [Database] + [DBZ] + Database + 3 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + TDCName + 130 + [TDCName] + [DBZ] + TDCName + 4 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Release + 130 + [Release] + [DBZ] + Release + 5 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Release Notes + 130 + [Release Notes] + [DBZ] + Release Notes + 6 + string + Count + 255 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Status + 130 + [Status] + [DBZ] + Status + 7 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Machine Type + 130 + [Machine Type] + [DBZ] + Machine Type + 8 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + CName + 130 + [CName] + [DBZ] + CName + 9 + string + Count + 255 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + database/schema + 130 + [database/schema] + [DBZ] + database/schema + 10 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + username + 130 + [username] + [DBZ] + username + 11 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + password + 130 + [password] + [DBZ] + password + 12 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Port/Service + 130 + [Port/Service] + [DBZ] + Port/Service + 13 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + AD auth + 11 + [AD auth] + [DBZ] + AD auth + 14 + boolean + Count + true + + "SQL_BIT" + "SQL_C_BIT" + + + + LDAP Auth + 11 + [LDAP Auth] + [DBZ] + LDAP Auth + 15 + boolean + Count + true + + "SQL_BIT" + "SQL_C_BIT" + + + + DBZ Host + 130 + [DBZ Host] + [DBZ] + DBZ Host + 16 + string + Count + 25 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + DBZ Node + 130 + [DBZ Node] + [DBZ] + DBZ Node + 17 + string + Count + 255 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + DBZ Internal IP + 130 + [DBZ Internal IP] + [DBZ] + DBZ Internal IP + 18 + string + Count + 15 + true + true + + + "SQL_WCHAR" + "SQL_C_WCHAR" + + + + GOLD IP + 130 + [GOLD IP] + [DBZ] + GOLD IP + 19 + string + Count + 15 + true + true + + + "SQL_WCHAR" + "SQL_C_WCHAR" + + + + LIVE IP + 130 + [LIVE IP] + [DBZ] + LIVE IP + 20 + string + Count + 15 + true + true + + + "SQL_WCHAR" + "SQL_C_WCHAR" + + + + TEST IP + 130 + [TEST IP] + [DBZ] + TEST IP + 21 + string + Count + 15 + true + true + + + "SQL_WCHAR" + "SQL_C_WCHAR" + + + + dvah IP + 130 + [dvah IP] + [DBZ] + dvah IP + 22 + string + Count + 15 + true + true + + + "SQL_WCHAR" + "SQL_C_WCHAR" + + + + tsah IP + 130 + [tsah IP] + [DBZ] + tsah IP + 23 + string + Count + 15 + true + true + + + "SQL_WCHAR" + "SQL_C_WCHAR" + + + + IP Address Locked + 130 + [IP Address Locked] + [DBZ] + IP Address Locked + 24 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + Node Name Locked + 130 + [Node Name Locked] + [DBZ] + Node Name Locked + 25 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + MAC Address Locked + 130 + [MAC Address Locked] + [DBZ] + MAC Address Locked + 26 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + FirstBuiltDate + 7 + [FirstBuiltDate] + [DBZ] + FirstBuiltDate + 27 + date + Year + true + + "SQL_TYPE_DATE" + "SQL_C_TYPE_DATE" + true + + + + FirstBlessDate + 7 + [FirstBlessDate] + [DBZ] + FirstBlessDate + 28 + date + Year + true + + "SQL_TYPE_DATE" + "SQL_C_TYPE_DATE" + true + + + + ExternalDocURL + 130 + [ExternalDocURL] + [DBZ] + ExternalDocURL + 29 + string + Count + 250 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + InternalDocURL + 130 + [InternalDocURL] + [DBZ] + InternalDocURL + 30 + string + Count + 250 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + DriverInfo + 129 + [DriverInfo] + [DBZ] + DriverInfo + 31 + string + Count + 250 + true + true + + + "SQL_VARCHAR" + "SQL_C_CHAR" + "true" + + + + Migration Group + 130 + [Migration Group] + [DBZ] + Migration Group + 32 + string + Count + 50 + true + true + + + "SQL_WVARCHAR" + "SQL_C_WCHAR" + "true" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([sqlserver.42493.565638564818].[none:LIVE IP:nk] / [sqlserver.42493.565638564818].[none:Status:nk]) + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + [sqlserver.42493.565638564818].[none:Status:nk] + + + + + + + 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 + + +
diff --git a/tests/assets/SampleDS.tds b/tests/assets/SampleDS.tds index 40b850ac..502e6a22 100644 --- a/tests/assets/SampleDS.tds +++ b/tests/assets/SampleDS.tds @@ -1,6 +1,6 @@ - + diff --git a/tests/assets/WorkbookWithExtract.twbx b/tests/assets/WorkbookWithExtract.twbx new file mode 100644 index 0000000000000000000000000000000000000000..b6025b36c3755fc9e8079b0fac0d91cf8f0e53e2 GIT binary patch literal 78093 zcmV()K;OSmO9KQH00saE05+pSR@YZu5(RPq0Ix~`02crN09S8vYhrJ2YgcJ>XhnE* za$#e1E_8Qd?7eA|qezz~`hCpiKg6}ZGubn`k?aywXVw@Xv>+sqKtkxXu`&cmAohK^ zcK`czg(O0Xj4iV(s_UJOEVGITa6i7C=lEIN58wV*<$HI9m84D>eE))cg}>Zcff1Tc zu>bxg&vy6Zm%IP<`+xl}|MkCo`@in*@3y()nRh6RBFI-1lqSGWn8Jv=*ZA*1c6_ ziEd=+_b)r$ORX#Gs^5GV>A3w{B^xx4#jhDPpNL3V%an4aAmwjS)Q zdtVQnot0(}g+Q@CzV3|Z>r_u%I&eTaFx6kPB)7hPy?uBG-PRDd2g}H&p=o(sVCYer zgE_DSYp)yig}`fNUZZ!KwiWsuoy)sd>MO^|QR>KgrhfbGX?@wSEni@k)=1x=f70H^}JtJ#M>euEzRar)iVGyNoi z+9`j0bms(~6M#8A0`$vy=w~5we=K&d8(^)#(mo2!qo6rY1?ZL$1_6LA0QsHa>FH52 zS*Dc$TFP%9_(jQ*m0ReC%`u)qZy*Y8pGq1p^?XKH>nC-__@AMoj zGC=`ccL{Y$-rWCl(OA#|1rv4p;yOEN}uk2*e)% zGkA16zu&;JgH7Va_n>E11pt>G1;bq!egE?PmcYXjJt^{!b`Jjc*MFSnd2IggrxWsQ z)pPMTDt?0=o4lIE<2;@Qbo=n<<^)iAb5`CpFFzK#nHf5c!P!w=4J@!?Z77 z>NQ{{PMtWtf04*p1-KJ{HFibk zq8YSG@TI_;gpS^dR|%a9yhZ3i>wa!|&Ru&(E5BOcOaC85!sSUjqSvPOT=hd07SkTBnyU&c+4Om)5Tr`10=M%GoVwuh>gIzk0E*5@x!0$5oLPq%X>y9}2xp z?j^Q(h8=*Sf4gk}HE0J6IU9HljO4+)asRM|e0hAJd-r(+OknHLMS0zqZ@!i3M+^Br zv5YV=pKeOGZ!eZP=tk~8F*_fWGC$0$`=iwuJXtpz}a;5;z^xze{|2$(`SZodj6yim^CNR zz26ZqfXnYsikv$6Ff1p?ti6?7I{w^H_5D5pPS&Hv|GS*~-=OOUPbdRB-gxlv{Z2f1 z(awK7DFtky4EQ+G`yltc-;Zj^k(I8WJ*jZ?gE`wAaLtv{a#ju6cXvm=IS%0amlPBa z_7{Iu-`eK;#lzAn;Psc^|9hN=*}sj^(@!v<3;8G1uiiXu_$Tb8@WF3=@0h>;W9k4m zJ@97&Pv-Ok?X1X20g*c%>bT)=_lZFrHr*Oc)-zh>yHq7U>mUF*Z6r- z@(LLLxS|dw;p)wkI@id!QaRrbnX87{&bOGhNP8ILc?LQAN$lo6^3-S{&kGsXu z>VMox&a8G)N?T_8(=l_R|CgZV$xvR!4FZ1x=NOxMVXOHB&a-;f13J#YIjPtm2b{AC zf05hI0rSt=Zk`O~Rp5}HxcS7*qrLO=refq7e7JQ-vcmX{1YxO!R3j2=q;?g z-#h$QxVWBl{#BH`D~|H%6aI{%9FcP469!xc&L4nCR4b1ERFs@(f9#I(;}BlOO7}fG z$|qJnvGM~}fYbDNSbl828!JFAUn^rz6o_jBq^13_SZSMSJN7D85THK(2dZCx|8V1H zfd1vE$&(nvpSQ1^2!A+Gz;UW~qU1dw`P@-Hca$G?l-q#9pNEjYAS80z^;dV1cWok{ z`1r)f5BRt}6xvGTKMyFk4SejDa@$rrm{*|#G@!TjuTSWFLgxqQeB^0j;d}-2>H@_j z4DlQ^Zw{?o>H@4?KYwBxovo%5Hhvt+tC&IlV|~V-M$08V#N&bBf1XptCudSCoS$Ro zYl|MiK!o7>!4p2dHt|oS-@nKF0#csz{&kqV>mc#znED0X&&80ggN$sL2f%2$e)MEQ zO2^FX-%$df7zdyf9~{_&4r zM$7FuUWE+$t|P>skoml<0$_6knTI=a9|D%s?YobJ$!*_X1qkx4v%;SM`2@&QfSdyp z9|Dmx?e}Y5j}@-Bm?xUbjfwKK`>&z|eV0S*6D6N0c>yJN$1C<936+Ni{sO$*4&-&v zyz4;yCulxF^AczjaIyMBL33>2uK>->KwbyUyAFnZg60!6FM#GF&$?WtM0vOQ^2?gp z)j(cH%)1WXf2O4Px2wbxHyIs(;rkek`A?RT;zlq(=drr>6#tCt_@j50n~uMZk9S2R zKX;V>BX^V^a=AR>`yo5dIg4^D557IHl9hr4^~dbvAQg9QfjrEQ*_1%)pX&>_SanX(bBwElo>)6Q_bwUZzke}Kfr0<~^y6RtpMUum_}~8Z z$7di9{!s#eO$&lRu?0 z`&;$ubf)U>vVi9ti~r6UI$k1t#M-@)r&;KORD=Mj#|wZh3m-2pw!C`QCb18lkg z`K}(})dKq|!h#d1?jL@%eP}O^wH^6M5Z(0UB_Z>)FaHyU!3Q>M#{?fScrq!Mh||?6 zhzoaIP0`;`BK^%^e~Mb4vP=Fu8M@`Ev+SMa{?&R&k7G`FkSqE4-GGO@+jw}%?vhpsFA@AN^CtBmjuAB{MgBbP%&=Z?4E z(zwY_c)gvRbKakU|HmI^EdFs62?>~vKTgMy{&37c{y3(zy~%U@`Fi;Z z#V+)~cSO#5AZ=th_~6l#meL!Ma;k6-zB%Jxw8!&Cf7)rmM|3>%dR>9F{Y;(ft@5WT zwj0CG);izwyXdp;>}QMRpK9&`xu2@^1E0Q7`;zeTeM|c&$bW$$PIkf1^24n)@xmyc zXNz;yUt8pJ`1s&6m$^Yz|XXW(moR&2c&qo6i)TF$Fgx?RQ-!(GeP=bJn;=C3X0 zx$>_r%(?onPV%|>n{)lcT)hRe*8u~*g!J(JzPlf`Ztn6Gy35wxp8x&+9%#p{Yv^Qf=7DqkG~hY4_Vof@f2Ql{C$Nrx-v?m;EY{<%Ve;?+xT9~#3jSEi z?f0>4pjd$KK$+WA*v$fJ^G!BcKLde!J}4XD#YcMSB42JDNUo z&7a-!ucT|gk_r#KKhwCkj^B>B(@pb!mxTWP@ndNBmv5Inrh`AH$Nz7~#NYo7?9Qir z@%N{l7UYb7aG50FqlNb%J-C&CRN3FZ;3y8hx_MmJGy|VXy9fVI0Dq$}g5M+XJxqcR zaQ;RRzhT5z0w-=2xT7>XH*(YQr>U_YeXYkqfm%=UYF}*7lfrz#X z;ql|H_|QaqhVeM~-;bwXuLBrA6uv&}-rm`GEg%jCaect5WyaU8hJZRZC$HLu+Ri-} zzW}u^_o!Yx!wbsnbl>sn-`mvpKz5#c{%$WE-}o9XFrs`az4G4p&s-@kD?^3 zfUW|>7 z|M83K|MUvXgN^^Oynb>c{57n8JDfK-{l)Wme@jlMz%KMD)_*~)A3bm%#NiLly$|N> zo9@5C(J!8$`&)7}LIMPSvh**oH1ICIdfxyn_qCmgU|>_fe(-~pf9+p668~t6^JV~V zF!hUBHGh?Vf*FF{Wld0PeSpJl)*#@v$UVYvMyk_K|avZh| zd^C5r4YebAgT-G=EAy)?{?U%ZF8;~ozsBVs>Pq=*d?-(b@CI+ccyIq#dHX{>h3Kb8 z{JkGf0qb`b#Sd~Ca0NIFaGUbvZ2^v;AXm_}M1NH^xoYF1W%yN7Z3o}r^cS-pJ#zZx zVDG!4KW|=j0d%i5l{Zr)9n0USDj%SJgBaoY;OfrP_YbF3k6iHmi@?qPSS;l~Wb|o} z@*#xypCM>;;;ELMJ_a3s4KUh4yn%_AKaKi#1;s}wHlLt41^v(ee`eo!<1-O}S*|yU zpNXTMKzFqh=6l-vyH zEq&=7;n%+vNGw(Q9`QfJZhv-V5X2eCkdieQN$GZNi&fELO&)5)vwT@{6KG=XbweoIA{Bs3+ zG4k{L!mmXPZqKy*xs3gnoXxo%z+003PY?HgXuJT&K0*Qd&!Fx<+%Ip1-P>&ab85`# z_WB14?Asx{#n|r%^8U@j1K>W(pYHGZ)L~xMVQz1!{scCDMwhv5v%j>JElzptHDZ*lcI0>pnSBlaUS_Wz^h{|}y@>zlRD z=P|t84R3u&-#onz^Xz;H{;gyoAc4<4xOi@W>&N;YMA_l5;12Lfa=caboNnn!bsXGb z2Q-1R#Y#ZX?E4qpi)?)hKICqExw}+({%vZ9CAgoQfKUfWK=}R3!qhxKR>*CDWQ-9u5;gJE4ZTgKp;v&u$Y+x@>(84X;uYpdOv&J z`h3LV5IP`%m=grY)B_n1Mc=<1AN^PbbPnVZ1NZ;mCgnIpmM)dvRs9>l&844DX7NZJVC`YJ&%J8%2>itC zy?_3GVg`RKdNYUZ^>dK=>ZLh+hQ!5&0Mqy$3U5p#XyE0k1TWjk1pIo=(F!tSoYGy~ zgM-%k{VCmrXX(334ziX}&Z#T_(A!5~tS3HxHe1A*bAGMa%fvjkdU^7mMvtoN33adX z)K5&q86%I~IX`&2H!t=DWH)Ff$dhhfzW$SuqWBuu(p=bN%4d z%C|C1+|;(L?9%GvlXC(m`S|t@d7LdUOHr6QS(wxhSz#XXH6Eq>LrIW<=9B^i%AkX8 zK*t8QVd$oidj3syGW(n*<(LhmaE?;P{ zUPjSE=JC~eIM1N;y1A1WeXMm$@T#SI(~7JBBr!FP`_^NHXXU`-ko5bP*+Vv@lVJGAF*VX}=SBK0aDniOoFW8z3((*$&A+uo z&$oP<_U)EGYC_{CumwI_S$xzSiTMK$%DntS8VtJ_6~?Js@;}ytzN_Yt_Tj-iOig$@eeMzBHXw z_q?$D0m4suab~J5K$~lZWpEk5G3o770rSitj@7^U;4t~+@(>N``JjI{!tkLK_{?)~ zlIN#3&%?btieMmppB=^fhIm)s>y?wi zn19=8Ic9>og~qpI>aE}Z^&jt8?Yqw1E5#m%|384Lb|m_EX5qNurN6&W`Kd5Hx(q<+ zOYLvatqSlhb^Hiq8gtCMJU=r1|BGThyw@lD_x&zN4u`pm4STAF`N+tb1#q60~zkj@Xe5-6sfgi-aSdRbjgWry2ehZ)9^3O+v9vQsd7fve8 zGfje(c{rPU9?SKn|DvArFz`Q7*?Gz&*PVE(^W2pE6%7PzO)pNyGxLAE{@hM~o&3u5 z{}byxe=mgxEFG}2Li3m>wA~c0Sv*W0b@%6YvFjb?ijA+;$|FJG6?&nelaBdg>kq2u zeUbzH6KIy;t2w{~IBIc^8^@)ifco(p20F->nPthT)V&8>%pORg3^HSWxhRZ3YP=T` zFB3TWpj!ezIH245&|`O>4CUMD)y>nBs&Mt_XLW}w+}!=o*EEM8(EXDN#Fc#fY2ATk zu`b)^$on3S^zZRO7rm!xcyJH*F$Uo%3S$QBE4ss#E^%VcZ>19e{Xe}s`Caa9%h}t2 zD{%b66Xy~aMZeWWF7oC_hl`;n<~8eov&_A9_Gft3F1t`ZEi~ZO#EF16r2*a)qzm7^ zJqkiV?(A=jK=|b515#%aS4BWpSCH@jjY3DB|Dni{sX$L|IOy2(>jzgO$-?Nit2YBd z5xj?!SQqcz7P=kJNyfjUC!pH(G`)}dQK@~p%f2~Cz>zo0_h2GLAYO6f`?CR;ct=jT znw;a%LJ#C#2F`~2Qm=1bftL>-1$e(weJXy@s*el(0G4Oze}kUu(6_x6-lt$|H0=AM z+ivT4PF7z8*OM=^94*1yVg9JNcZnWC5-4`h5GW16$07GjAHnWv45!c@Lf|w)+=A}` zT<3{+8Av`bW1so#(g|7DTK(n#f;M?~Jro0}fIC|!?6_I(;zhO={wlb7jese&(Gfn1)t4`M$*rKp@tiw9xw(PjSbe@kt&2?j4_;-H9a)T^&F6u8Jc4^xV+F|bRCmvz3Oec z-9)Qbx^ba5AoAFgroKQ-NO_3J)?&C`63d>Md15eHr`AL=DZLAa?%a&nz07kgOO->K z9v^zreoJd&w?ppvmYzIt=3{ruE)1-RSCf?}9uAhe^$`exDXi1wjcM7Z=k}Zow%D9u zP_DP-LI#%v+>9%gn;FeEUGcL^|KQ%{kQuxZO~y8MAbNX~r~6@-G{UGZwvJ)OlZu~t zR=+1Ib8Id(ff&XM0v>3^pb~lcAo;e{ahMCeeWw&f!RoOH_(1P|L8C)%ibI28Ez>Ba z?S-=LlGUMRMl@-ruve$3?6`}$nPCxcb7qAan9GE*cA@7-xQBMB-0b8K7jV-tP0uH6 z5|GkBK?a7pTvhVkAB_jh&Yd2X#2g_kdYo;>(Q4wldsmjjZY8e=7kbtV5rc6rFgvL< z9%3U^XU6b;ttb6 zoL%Uty^XAxGmak5O-)|XX;L9}Da!m1i#mJ7)(sh3PVEpsC}BTlVlf)HR%|GkqBWaH z(slu|8t>`ega4rb0feSYGP1+uBg$1u-Prg4iAZ((zeg-bypuG-C58N zhwy4#OBe=^_6L>RjcDmYFX(M79I=~`vMVT*2W^fHQ^wh{-T><|hm9F}+mUIGhlA~e zPSdpv$FXh)MGv0TmJ%$HF$)j2uzaCsk5*m6CTN*dH^H1zR)fPBFG`Z^aGt>7g~v5R9<`9l11P!p(5oESPqF1`D(D>mRZA*3s{6x;nKgc9wuN6>J-it zPwVi@abya%OLjJ8SDj)jwIqq1RC*&RBvpe0oU1o6&BTq?~S`otz1jIG9d(kqjHEWa4R>xJ|zv*h@|&d`$}o z+?(}>^t9KRRJyz9xO#A*C$6G(J;lWFR&hDNJbMR58ba;utCGrjbGu#a=Dj&5hf7xu zZCgZ#Lu);+0t1t3nVFisjahZdVsoMASu1=kE&NiHvRoa7bwkx2)+KfuYtGX_f66mc z9?Un4#?FxIY1)P``@>z>r@PY9<5kC8a*V<4FZ7CVJaL0*ze5*7EV~6hOt2Yk#U|j4 zgkUlR8Jar}$Cuo?*Qj0n&_lV^1{(w`!*%i@H&S;8@U!JVL!ZP8ew(1XU5_(XWsG}H zE~1SAexL2lO;h9CK%1M3O*tGW6R@o89A1LO9+y7tFfLeZdaTd9OaGt=ycjIuAkw$k znwHmsCGE1fGdoD63w3x|!YG)^husK>(ft~NdIplX0_(y1gx01cwau`EFqG&*&+7yQ zm<`j1b8)Sjp%xNUBcph-5U?#p?lp5C^)VY4`?g4c-LWE9C92F(WNbU)a4?dsRMSRG zJAd4e5+z%s8n+5v&F9%&JmgU)>aW>@QSGzbSU6=k_ol!<1ipuYqn^?~$mx2?)w>EA%>`&w-+N@oV_nv7rj?u{7FR->&BCVO4JUg*!HC78-7Bu$e~W2u7H^a%kC)`wcAHXkJR2EvL!-Qd5e2qcR3dO<=p(ZJK6< zcJ~W@+VWqLr4toCtjrNXY7o{J$80}Rx-r=xJ1atx!=CduxyFNGX~cH9Sk4<`xQ_e< zWp|x;+XxVpuf3$X^bg{TbvGeoderlVQ+98;Bx281LSYe}n7{;!%5#O)A!-_Onr?2g zxiN0=rql-;Fo{z!hbHV|Fz#OHsoSjtW~Zk*IkhvUaIkh5SQ{{#N!kw(_%IV7t`|-N zc5P4B0s(V|S}r3c(9|g3o3+C_+R%!I?S3f$Sp>`D;c7)4X86`0t~%oc%eo0E0Ywyu zW6E(hNV?h&=C!lf>?*O$#v3~u$DAH_AUG7Wz0sAXm;N0X8c{~J=bOP`!jfpu+89mK z?=XjsENS2a$Dz}sdoz+C)P5mJxm_+mYyBx@^Gdl{SBz=z))>{Uuca|q4+cB~#oc{e zWqp#3$3W)?x)GtS2usRTcDFL@+~}?5H3Mm~-y?x|>_z@Q6Y5DNj#EG8luQ2{V^ih` zHct1em7?<@E-;gYIORtJzqjPa)oeI-=MQoK$nPAjc%aCwI`A+Q*wUC{oSDp~@@QRO z=ymNp7&1i|ZTVbkx?3fO!qFI8_4it!5%W&;&a3bT zW*jEA&BKQay<|S*CFH<%Rhp+q1v-ms63gdO=(v#+j_a9QSaqI`e5|BbA{wE%gR<#l zi1zlq67f@K8rt~UZRz#)p}pzP7c|iGoH;!nE@5sC^vCg@VHfrkr~Bw51brGH&p$@(25q?W<7VbPlCFg%%+^>$-!<%Orp#h5y9 zoe|3``6d>ivAHLM{y`VUV4Mu>B??NrZq?$=D1x!E$#G0kIaJ#>BQ2^)mtIj7E{3|U zPAAQ#!&dyZSj~(s?@0u<7Enow4R)!rwBOs8L9frW`w^qF`)%Ly&|TkNRJ+AyF;k{B zH=Wmps&p7wj5v=a;y4^e`wZT@t{bEyhl(d*S3FE)K|9#?26Xc>UY1o7HXbg6jRhHt z$$F*oxXIK-2`fR(mLt8GZv2o~1Y+t4g-1*bs9$Jif7Hi1<6P|bi9r*)%U1pcLjMpk zDh*A>leOc=s^np+<<**5+XXj<`K8Ac`@BbOXHL#Zv)#Ur_GT!?sfao55+NknT@a9I z<%@`Hqo|G~X~M5mL1%#cMg_Subn49tD%RURHPHzi+F`80jwj{3AW6CKw)sIO%5-g_ zm?;W0ZMXK!q_IW==y2#$Tc~2FieDYhy5e?=ID@&Itru|bK!r}l10~i;NnwbZ8oiS` z#TH{b7M7TBMaGx;LrGOCY7$%;7^HzPMo9VpSy$$( zX@!TbYsdJa?{w^8sq-o?a~FD($yhOC7N++7ELoVEI(EvuJ6st3!vvB_QdP8mj5d4W zKmpAfnh-{o(W8UW2gdIdPtwhZ%NfRL?P;+=Ine;Kd7)>htPwhh>U=L_t1 z2LD<6f@d z0gcZNqajQ*QUebK{?JD@8z#g>d9lWpw*&WQ;UJVxq$sy@%y9Q1wBdN1e%Uxo1 z>0hcTWNsPpYNh2;tsygng*g>o*))oQ{fyyPu37-892^QKjwa9PrkT2D{0qIR)Ci-a zQS+SB`kkH;39~>GX24Hl@6cEqgo2n1(GGfm4kXLvT^sT%dLeW-F*4(XuA$5e8ds&( zK5~q53R6q$F!kKI!PA4XV+}A}JC<7xz$RxRoUvTaw-d<58uQ8TCZ zu2!w;UZ0PI}E+f(or8R>o{%oNu`^mkpwKZume%Lx76KfpXAmKsq94?oe7Au9Iw%Z z*GE}I1rfAJiycjnHo*b4$HTHV76@H~t>V(Z!lirV%w_|@=)y@cz%fG_ti-vX>5Db7 z9G5g+7Ir_72q;n1+;V#b1^f@&IWUN?ZIBB+U{3SE#kLW2n2x!ab>+{llq+AfRJes!A0& zrN=}cJWlYNkp3A8fg|SUEQ0ZYM_Muge zDvv(6YGZ9tw;p@;a4>K6wG{<*Q$dD@W5%?M;Y^>T`>o*2@@A;!q7{%#DdQFQsxRW` zgSd?M=!@`tjqVR8RY%m}1;e8ARk$t>VZI}UJxnh~Md1#SbU)uJuw5r(uXNKzZAa2F zsxsUd2SJx<`8fn5EwK{cAFRTk1okeWadCvj_Uz!X{cNIU)F`4*aqI<^+E=?aaLlOK zQq}4(@X-wK4EM{~V%_>XiPR06a&39$l*v_9@Zra)Etl4lmu|9ROuwF`TZPt zAi#PEDmQf22q|d`X1nVoD?jP;%O-7{bW^nY(1<|1HQ^7S&>dT3Qp;k0Kc95BNk-TQ zn}nKTF_tia-`SNvB@VL%J6SYVER82~FPSsAQBDkzAzFWIXKn1IszWnADduq`uN>Q+ zT2=v#klnn3X@0R@4XJ@TH|=tWXtPOF%z@#qd3V01*od^5ICeb zeyCO=y&5LODC+92E39^fYFl$Xj(uW~mkV3&)?JR*r$W(JFZ2|Q5Z4Yn-Wy7_q#&B? z`CCir;^t;8_5!ff2Z#q|^uBS*-P+A3wdoG@D3kDDH(3KMTA9Y>(oV(~dYZqey>L=X z%LX=aX;$`zDxWH|B`%wr+0q*G!!eB2p|x`*{xFqe$e`ino{MX1wD)PI(@A5Whg*Ak zs&HGvUmWTHjGYqnNwSYy=Ahwx51kD7G>Ck}tiV{M)i$Hob8oH| z+u59N@s=BVe~(bqcEm)~s^>OQW^9FG5YA_aI!46RbjD7jfFlBWFU!Dbv0OIgFtT<) zhe9lmSt7vY4IJv1@h-%PGYsSatY~L3NR&|*g58cefzUq=P5A<@AT^G#KGsraQdQvut9%9;}3ehXqYRr^irw0+*)5FaO)jnW zE;|jB!^pyL#8`%FLEGzsipc$KIFZEeF1*kSXs58CD2?zHWC)8C0onyIp^7M3i&KmO zxQ<7&E<%`5hyY!Eb+2gSw>Euo~>Oy5sY226*Tm3+s=S#0s9FS~06rt?W!fcOog;M%`>cpk&sEM%rNkkT&EaMKQ8M1%V9Fg!W{suMK%;mIOr? zYrJK{P}GJZ{miws1X(gmk+&DIv5sez(onq#o+B}gNh3>Yc6n?{8c9+ zJigauaRZ*jgiQmSlRE z&+)}%a#@eche(9dVWRMZsGH%%c2vq;N|A(ti1xW@*<~;>L6QZXR)m~qOR%P_efB{Q z-PwMwSy;Yq*P~FnV$g3y5@6H}JJLuf!0&UTQ{rZ+qN{wgOPIZvdZG!&;p^dumqw~6 zVH!Jdzdqj(AYikJS$YAQ|pC2Y^E-GM4>f@2h}kq#wrvH1GJ+Y+<>;cB(jKKw(GF%^#+wNEc%CJ)xCeoTA?l`qPNWG4 zA|_J87|T`20)uW4Xb83liS-JaFI=FFm4_k4EP>3%hnQxT!$oUfx<0mzC#x)&L%9M? z8Wfe1z{6Sa7uNR)Ymd(}Z^y06A_~StO-a2V?;5L3G9lL|UGgN$Fa6_6;C}Fu;i#OB zhg}OX3EhUJ2pVp8f^Mz0ePb}&&W6o{ucEUVjSP{rupN~ldNd&qI<;rV;|)8%&^!6M zYZbAXP|xR!S%-x1T#3Azt1Df|t60m)q3znK-d9Z9?TT4v&Xm0Yh)YmdK8kfO(S*9y zpIOqc9N-^-_ei$u%Mp1XbBT+Rz=u{$cVFxTq9B~b(UxV&3EMbmRrF&I1T3<(kPA9A z7b<6IwDx5z=T3-;%Q3ay9HwMoFliGoY2BG=LZ`7YQfW5UN)1z-8n5_;gOLoSc+H|C zc6QWci71FKF3Uw5pHcadia?`~w4~{w(5fjj@^Oji((Hn-{Kza0olsL9O&M;c(|F(Y zr-%=t*;AMDCkJjY8JOxG=*(?=VYO$vc`uvui?ow~xQLdTURw2G3w0=I$xs^^7nTZ} zXvU=LcD6A+LDoHlhq|mB*)p)EcI;U982hpwHt?OWf?RZDyEkms)6GHJYnZ!pxfBW6 zrDHR~+$idSXL*9>lLtBQY$%HdAQmdR;s&9`pz<)Xm8UL+0Qm>^RS@=8VaH(Xy6qyeUt5GIIE)gTX2+Wz+4VwT12F;{Yz^1hqI{2l3vuU5`!TlX0gx6v>N0yxm&HB$wsvoCAsl82QwKg`D0A?LQkI$!fh`f!nM|jyLb#M z{%Wt|y=W>oDTvE#GD)Np6`o0=V3O2a^?V*#i4!h@_kqXrK=?0L>MFm`+lF1>(y)5T z2&V^w)c|Sabe0v9Vr>9t^Js0VHA*NMI9xl&S#8DA11DQ0vRg+*4`LU}L|*WvpS1cx zuRqLcbuOzLy^=<~89fkytnVh7H(BWRe#or#*$mo%8VkHD#A4_;TBB~JQNA9{QNMeL z!_a5pRz52N4?E1%2+w+u0PWqs$u5DQd!QFm0YQl-UPGE%p-KN4!yozBa?PpRM#gt?p~YZ)O{ooK_4-LO)ixUOfBH%$+~bHX3T zSWt4jl6|iB8z}OItP>4by_HwPt;7RkZz~`6#yVTCXV8v-*YnwG735xB7nnkHb_W-o z*PQI=HMuDb78oaZ067-D=};R)6H;g1%4cd8ZPbAc;_97rPwK zIar{X1E-a)p@8Fr1-_@*elg%9eBeesoLE@g(Uu&tv~}o8t-jWY^mN91Q{g~Db6^{x z%aHC#dN%23SRa51hJ25}sbSc&jUpEU(e%H0Jsfn43rKc~cg7VTuv~A;! z72L7m?Exm&8F2LiMJ^dng1#oW&b)#o8udU70VrtH0C;@+i*B!@2ZA%6`_`_=%nFzq zx*G~hx#d5eUBFF*5yOqxkeFih&{<&`s%}R1ln3E15ef!Y)!D1bSnDNGU-39%l}X)B zHP{BCZU#N5Uk~dxUg0DY2ke6aXB)*jX7PxwHoHu#2csTbK)94Od9R-0MU|Ts*g|{B zRzuT$ETnxb?-Ej%oE8{viY@<19m(;mf=gG^Wew~~F*5x{aOm}htGFA7)z0ctBM~J^ zn1aYT*AJW7a^-FIvjai|AQov@#l+IKZM=J>h5cRH_{gR++e{85?igTyi)SjlKqmEa z063+y%T~Vn(j9(l{i?z>zAUunk zcmeMq6mnu4L>A!13WtNC7?X9<#G!yKYO6U6dm%f(Emzz2npVE>nJ*&xE~t_?pDy7J z26jZ?wv`>4>X`O+vxdeu>zQILBfo=j4 zH8s{H+Mbsba9MLfZ>6kz;wZJ%bjc(YE>{IXnh?p&ylpk4IvsT7b~nbh&#$ls>9z4+ z3xaS9Qs90d6x+RJLUU<3+fe&3PxTabh1qcH_6SD__b*+oUQ`Jq{P>>He zsltD-t`Fqm-=YWC~H3?o$n*>_{gro6aFfo8y&TS6Ct*?3q4gH$TP zhRIAOKIHc?tlOSP0zpoAx84RS=Hk+{QxSHYW1<@%oi*#O#T}KVX0M;sPU`16K40=Z z5EboGwyUpJJyP1k%wg9td)NiP9W#fZk!Yylew+1Dg387~%h^^MnZ$j2x-E~>W% z5QyEv%n8cya}o9(fm@*l4nY)QcIv3tOO)E@K-%?ZrhOr}YXLq%ChU_FV$(MnIZt$Ze{ zq3$m?LbY+k?hNdZ1;Z{&c-2|r-8|GcBgWk)0nt%xxX)F3W2;p$NQ6z3yX$^1Dxm#T z9b=<5{%iH(O|VC*OkD1PZ6i9n{t_+pMD+B;wyJc5S^3%$@T^A(JqQ-*31Rj+>^8wr z5P2xF27r``*1ZeAOeRsj8QQouMQUN7^;~eCY!m2@*;?9H6G~YVBcV5{IdY5VqzjG` z0h`?t^%?x@t=?%BQ^M@dt#cEQv`^O%{!YtepQ3?wWc4gEmI5}W* z!%nBy=vFox$AijtwIEhQlFHn<&St<&SLbVUH1)e3i||L%7%N+Utbn=1IuM#YDa(^$ zP_hFmcX@CIP^t!-os%;5XeRsXc}*@-e==N5=OKIaCqTOZ#)OKi2qXu&ty=jvT);Xn z8=zFJEikQ=`x9LoQY#L`=_adK%tW?MObi^)F}v0dnp$u(t;k@O+Kf0K5jH1x6I*3l zePe)G<mN?^tE<bfFy=m}Xcy61Jho4QgT|3i05Hc`(aV(2dk^ z=L>`&!9k9-@3&%+_68J9_KybbIS~r>Sb8OVP>e$6xcz}@ zSk@D4(TEZ~p-IgkfLnx42(n|VS!sX>?M_*(A~9hl*BaR7;nBW~QYIMtYcvIV9XCk> zvk?orsm+}3mb1;m_4`t>?rc{GhR@Qv5%UAalL$GBopsc$s0|4TB*s*&KWCEmSU8&% z;1oYN6bU*w&Yj7u?qKe~Sg%uEWV)7yR`Jdix5Z$YX5dDZCC;`D)YM%xp7<4(WrEf2 zN7H6Yfy07vH5I1^mIPazWQ$8Zm^&FXtVo^bBROcc$s~$pV%E*N&|Ex7{3=UH2^?2) zi!EweCDh8Rph;%gzGjwju#AgXO<;LLpirmh&2&G{_-bJg9je!hg@g$pj1QVIicO(e z0Roa6pt(S%xb!Ny-Oq=K89QBxj4=ocC|g+@71Y5gs0xP)*q?e3kl)QRbAWy+p?>c$ zoeCs00gijeHKR&7>~XSiy=-~mXS92Mj$ZPe3O%W5uM3i8Q=rz-3Hl0A@{tN@>&Zw{+$OCZsiQkZr`IP00M zKHeLv3MTXv#oVNnz*-(IE+#UJoPU<9C>J@6GZb1M?l4mpKAa11+w&2#Nx3;!Q9$G^Kmqo zPw1>Wk@s;Z0j+fbLQ7hN<-5bcpOfPXnc&z8Z}Bm(#lyT5wJosk%{AI1^W9=M+%pQH z_d&FGv*IKh;&wr81Sme@gC#hVbx5UX0~|M;g=Djy*Ujcw8xLid)1^)3gGP;*MLq7- zcvy0bwIlNr4jeWTthL+PA4+0LcDe=O zL9QbMAAhn^3@J=89%k|^N~zgao%Z_}i?3xn26sfD3MBi085LiWu6n#DLNokgNpP3- zNL+ru-+%vp`WvL#xZG8_+^=gNynIy!++6wVud1LFfu+WR0Ot>uo`TtifrDevV{R!7 zL*JPUCQH4MwkQ!>;Htx>r*OTz0Vn+XNGn+~>= zGYA_H!v(kT!Okb_!STDHt7j%Xw?=v*IE>CjYN95%z_RL&V?lVdg$n8bYCx60tx9z& zjO+&5LsHNL{i?^Qd2XWchF^!^oTXPci|$m-;fXjY^BFy}u%0@qYfFOHP{0J(dTT#k z6^K={?6O^gpyw)=quX^?2R>LKi}#Zxq*tZY=OPv#T1{sFj-P~{V{E%XvFmHt!I&iC zW-F*khCjOU>BF8}c6eLr!Rw|YiZhCvyG!49;JGu_Dv%RRGg0#3nwvyLR(cN{S{P3- zSex-X0jOHT7=dTt{B64x&-eLW2lsD^2?H-e&hS!^rG?7cHtQsnYh#f1ZGFwf_y3OQ^Vf&Hd`gz@y!hAjTH|vsQC+mbBzRaa|tmZ+7fOy z;1FoKDATk*tL3T<6)t>Z<2(Lbh_+Q;fg|?xE=u-LO~hIk$}5^L5nCYDT3+HfS z7MUuC9XS7~);>7oHfcm%h=lfNSHE9`gr>sV$iW8-Z{r3wvfES;g@mJ#vhGyXmSr1v z9rN-ovdRg!rlCCC`3Nmd;{s&(^gb(UC8V5IV`Q?ddUj0L2)wG6Qi-=pu~P} z&gMX(C}t;v1a4gtB65inzz-?~1%C5RY< zbH=km7?oQ(1wBsVTu~iD+Sf~NMrzGY>?pKKOgEAbTx=K#ygvTk>-EUYSnQ`Wilv8q zGS#5VRVlV};JdYL79q?O>X!jEU}-eS!DNa?VVq9u;n@9@*8rDOdHFcwwuN&4%2*UPtB>o=jz*2iAhbhBB(* zaa;?Q=;wVZZpP8BrMKHx-T%L@_gZpPi@G%*hzk&&OMyTb;U(N1-XjDE_w+sMKb_j$ z(Wg(uR@AP{DvHFcwdNdSe9PmV2o`#MiCE6C`BPBdo@PX#h+>_R_y#}w(|AVsrFrH4 zrs*I4wrRzbYXpr!9<$!z*WY;03e5|?FA~=gSx7bU0$~)vD&&l>PLf-s>%cL8iCV$) zeF}e!!&2@zpIctQ8esdV8Z^@gbNN}jBJbJ?2``b!70+EMzJhErEZ^JLcR<0}Pq?Xv z?1hNu6xWOW9ln7&wHmfEM@B6hnzhY9Qr-6_JyvP5Hy8)KaS}K5oHVJn#TVYpKAUxV z&#*vByI6|P3XjS*nHbCPLeJel0(*UTm<;*e7;9#H`Foy?;+#7&-z!b9hnX)fq{x`8 zAo+;Na*Pia^nr~pCx2TaxhA((!1o!x%OL%HQ(iaAmdQA3(_iV8+nIYM;&j-+3Y@+q zpmC^-#ONQ2Vp!~pf`#%*+1@J2+s=v!{C^%K2ZNXElXa%}^LWGQx}5WOelTZm^y+{n zU0}0@FCA#7Ll31EYbkH7HR@8Pxo zPs%(>kMWtVED%yX!>)POE`mI3T;*B0pf8zBbn1zKx!5x#{>h^-bEsU;_MoudmDD0R zVPhbs@VkC`wp&BZCxqAaM<)wd>D(8!Cl<`7a#M7DB1fKm!Wt7e8Z%-SKAQ^d6Gg=Z zRzfKDW{?|iM!!~8B(n>DpROWQ{$4}b19K5#6@@poN> zckG-HG(us)*{#s)`Hl6w@O%A!7Se~J}nKUya=f5E>i!yehV^}UnHj`fo2|3pV!oDJqd2_ zLEwBFB+m7<9Q;!(C1(9P+Wv(61}2+jM2j1r^&*p2M@#X)(i#_KtCa5Za23Q^tgI$5 z&X9L49P_bhl+6y7Adex7t_}ZadFYxJ#8-2gX#vOYw<=-|vyzzkPugptVVj?9b-l^3 zqP-+n-ESY^DJ&-Vv)>=E`@1N)F%dDh$}AV}_h${e{LyknRBy!o`5F_UK}bb_CkXudteZ0@{;Uer_A0{G~yx&B$%%0RsO&6kON z%LiKuf^0t{!Xbp3t3C3!9)EUt``|oz=Py;x5x5f?L`6y6J%of&vb5b)XX{MJ%FdnX zcWbNO-zGvVs>|D&-5wW0^pofO@A-Q|#msEbpmVpP2o5s~JZFB#57b5|ekfhJ?yq6> z{-Sb`;QSZIS!33iC&LPwi#@H>U5FZ6?B9CwQHNiB>OysJYPBpo*G9Ggl)d*-|{7pTVE~R<5t|`JN?44?Jc71Pa06m@AIxkyvH~b6wk?q zU}6AXGor^Fd%P|Y(ixnrvd9hY+@3|!r6w@R``m7BZHe9kjCOnv^3>n>LgCN@yOfE# ze=KpE$gabCg%k$oxW0QgaQ*SqcD+4YO!TIW&Up=Q4QvQ7Is1Lc8%F8IvCU$?jJ%l^CUa+Y6 zhNsQApZN85W!t{zq)4Nm-SvO{Ax0BOX)zDs;`t2s#X)QQBJ^h#*Wx~)h#itIcvzA{ z1Ooxbi^Xlg6$N^Si*wdY785XpW5kjkf9L0k+qLWDntfvkxaX9c-e;@v+>(2QPCb}e z1WAe8?mOb>b3o|f!Chcp{uIHjlL`JiDBR9_^zj>?p`k)NV$mlTk_5&{#`vH0F6@;a zy%T6kX77DV%va)QmI_3Xg&hlQT9hIIM#wnV#8t&I)V+ki*6|$i;Am|W0E1-5LI0b3 zx9-&AUVn(<0we3=O+1cW53?z|Sys->8M_?N9+P>7Ya#+0^6(*^KWX{(gbo;e3?>&D z9^*b>=|N-(Nk<|;2qK!o=fi?lPj1d<_5HW5(|w>ip!s9FE*+A5BlT?zIoAGNKNU;u zp=>VfQ=p#LsL({4)?W#qE^_Qk$dWR>Jnm4GtJP&3oyr^8?!|s=tkYUfwX@=o76Dow zf5)4_i1+aCD>G^i!$KQesE@Qq19DrkHYy1R{_&or-s(mm{9F6J@77yNLl?{qQ5b@? zp1Bmza{G;^g~*68ArY64W*a*n_g$6~a|FG7_)kR<_~mL_tPK{Q%7n_aLt(A6Z49g- zVC9iUgK<}@;QaLyi5gO=4T^>tpK57pO)D(U1c~=s(PEcgxnu0!9_%OH3c{#3h+_4L14aS<==eSGwx++ZV^Z- zR3H6f*y{;A<5M0JbJ!P=wvaX73`Hso{T|d}^ zjg%h#{LP2%+DnnIyukb%KcJIVMUxTY&fY)Xxz}U!ilk=-U7nSKdkugFnDvy>BHrzk zsKnp#%5pvn`Q2;@nbBv*tX1Y^vFYpF24pjjK<6M3pa2H@I_)#b7ieZd@pdP2Prl5R zC)y=;p}zUmZ<%6ajg~CQeN(2qVXpU?S8NA3Tel;RcUG=VZyS$%i~dmq;RCcz}*=y$THIHV? z!=AoezV1wZ@(Znl!DasScipMlcqPKkGnwQInX?ruZVk zhlh{+p~oACzJtc=t=BW%FQ0U}ZMzM@Zx!HO?5ePDuW0Z0(ND?3RL*<<{`EU0aU-Vl z0+F2S_nCGXh~K=n@zq_9h_}~>SmTJZUk^3rLwIrv9PNJXT&|RyobZdb8}LPH@6R9V z=b+!8cK%B8bt^&IgN)u;3E~@rACf6+SPc_U7q z_lb@Eu3z8G;pn~3;BEiQ7`(D%wfeTQ2fzn_1z7=OV#~TJW4+4!0j;qTId=uDqyi(u z*RP{6D#wCWzy851-}^v?_pLDV>|j!c2*8WX`^J0m4uK8l+g0zxD^xci`LHSS@0b;G z5(<#6>O-`BOF(Yhf7T!H8A6ATe&;kcOQX^X&sRR7f^gU8wtwyQT>!_@oKmxib`gwf zqkvz>{2P88r`P%bR)XoX6Vl=D{m>l+5@dF}udZ%6N_Ajm4t5wwEVy_6>uh(hT`8;W z+DpC}7M}a}lI}iCL{74}we@{1>KOPo+u!kI1e+DMg*p6Y(pWNBCeB_+A_nO|BYcx= zSLkhz9~S#mZvhuP12nWkjPbW&Ua}V_HGSV>*!dfuA&_9^z9Q(92aKBc8_+76b!Uhd zGAHTng^|V=krTg?C;xj}hRF#u0ALVDhR7y&7O?*3!fc>^{n+~#Y&En3Tk}C((uq4z z>nb+yBYn3uNc~-FRfXRzMOyP$MnMs1e7x-UAT#d$q|pBL&!8{5(Qmz0eF>7T^5mFa z*X}J6ulY;cYMoinFIAYqSy#KCPQ#W2E6Ih)4gW+36C>?QAI+8;RR|G;y6;$j*KY)g zGlOF4uB`~~v?lcD@97rwvli{VDQu9c6G5l!Q~O!|pT71x-lvC{Ml2_&WmzaThTxby zB`rTL*?M&a@yOHQ9OQ}}yyFNYb9hb?F1z>sl77=Qf$?Jp;sNrDs-#54L(}b=EHvrH z4letQO8racASDpnqN_{dPbG9i$b%^(C^u^YaTf-By-^F-EwEB;w5jO*8&9X}zaAdX z@f+f}(EDF<_UjYLygd;@m=EkGJ-y1^9ybZ_NH^8@U%5-f<nz~uE1u_XJ7c*NAt%e^=Ft-P22?CSle zC}&;!yMEN$4{usFnjO7H#~nU#q`o2!f#APF5o&s69+0oHH(7-~8n8LEDdz)q`v~#> z(nJ4mjr8w$|1Yidf2W`R@4hB1Ag4qTq}?xf%GPUQ`&nfjU+K^AlW*p8+qzpM;Wn%K znKgWP@bZ&^LZmPxyxUGn&6jDeKx@HdDST+OBGLD1jeKW@1n;k(U4M{!=8G0Addx5R zf?N)w#n<}*jjF`J(UzO9FtsqQ(Abg{qB#a;A2HsPYvAD7dW&}V%d%-J=(m@!7R2z0*TDcW&honr?7Rtn=TH>s&=Z`?$S-=IK!yZerSWNW zh6j#fjc1V#y1V+;rk!K2aN(;=Sho#crYdd$L#Z(JH9LU;WUg#9&-rh>+9J<- z=Gv6F#TO_R^IkRJD7$o%#R}ibX^QkT(wkcRdk6kK`$Vb1gLvG-fG~H+S1IDoCw25& zUp?!!@j6cjE9{|4+xMQCV891^{oN~lllP;%sJ_CiE4Dk@W6#sz_o|(LpPj4StvOu9 zS;_BDKk|;Cec2rq*e<8_pf@kK33LTd2s*E&-r^}+mJavF*=+&ZAx*M_7MdyINSU{$F ze#sB&dL)1Z?7cgN{TD@g_AaG2(_;fj+Yuk8)-M0rG4D@_y4XHdCb7h^vXdGpXmbY+ zo_lOx?EUDcJ2+8Kv*m(?35H*PQqhWJKr*ZZ9f|Z_9-&R(|EFTKuL={x90oTZEH$K>7o-oR8Gow^u zrK5N`h!PMb3lf_Dyw^mk#7->reTxObA(hJbf6ucZqjX-w+Yw80w@QNW$mw9()35X5jF>cX;COQMJcl-!FW z6CD0l&1~|-7m~^s5JO8=Diy`4RH+z14>j0a#$6dy>UH`Ojf4H_1u=(t5gnRPE&Uzm z4EC80{3eqvmom8wIG1=l5*if%oO0_f3jRn*1LAN94RvF?c}PN}kCj`0>q$o>>>vP( zdE!uV^0GkpXYUK-d1>Xsgl$BiZR)F*)-^@Z+R z!+FrD_&Z*MEAs`R(1M-wuRXV=Vi-LcE}Uv!)zES3e)ntoFnGO87!g(Q@gWb{ZgNhn ztdzti9}|bpqmhcKHcu@5!2MkO^*2K0RaPKA^GeuheCzAz;FfQhPzgmJ$x){WJGMI} zj?o=6xRMx|X|g%{P9)U}5EAJ`vpCFYzn^!1Y&=ay((F5~rp_<73?;&Khdb_KdIP}} zO^>L@^VpUnK#F!VGYGIeS&#d4*dyDyTPDUFc$og~2kU0Z@Ao z`}d1w2HPF4J?yy!?Ohq^Yb>>G2Vp3Hu@*Z{B+#?nqwaON;(y0`*!v?iwm{g<$GbVu zGjX{E>U0fke*Pr@c`60xWz@h_ZbHTR&?| z$ba4+9Wn;*`t3ZrPK2@fg#@FTqx$wwJ9fN`m0(i|J`*Xq>wz0+IudztTETAB{a}Je z&Hb!}0)3mzim_N?@W%sG4kZg1@XyOCx&G6To7Vyw@{=>Vr65}LNFYiS@HxroJ z)q&7icRa>Y=IPquT1v-Y%QO8j(eK(5EH`WWd5N|< zl{XRO@?0py3uZwRyLsVPWj}DimwID*G?5mXZHf$Pnifj0D~Mt^!=hVf6rN$47JGcaY6){lui*0fO`2`Ke-G>$lZF#N$51Y#N$R z^A>*mhK2-|)*Y2{rJM#b&rM1IgZ8pPFbd3(Z^#250E;l@$8EOo|ImU$xurbDidS$& zOq+y)OJ?|zX8G+e7IX%RDS@`hhrW3LzVU%vczc~sP`|6Pc@;j1DsXMVN8tX>??L4N z9>6XFSnTkvzTF&tnMs^28t@BTaRn%DL?SQr2s!4~fg<@yh5JV#Yv8TuYGF35z6;*? zTkj^_>L#Bc-Cmx<~vu53a>P}5NiVY zhUm}&=lA}O7Tm$N58Z=958eVZBJ%g10NI1X6wX^`nF%+2&wJ&@HISmD-hh<0G9_?w zcv#W7R)hh!hVj4gWj+K006#vsq%Sw~F~|3tYAknSM<0)AWfTE`K9v4yArX)V-Hwp| zxVi8XfZTKfeG2;a|i)HQsMhA;(vMpd-R9<%oyA=J%?ZpX~}m z;g$es3B@$nIblN&9=m32gMUVH%S8jH5%ss;_yU7BTfrDlZA2gq)i(g#1zC-~5AE@o zF#=5|Fu>-1Ub7yN8MWr!>x%w0pDXbb(VVNfoA&t*HOG;VjF&OXN|eH1grguf`VvSreD2)eeV$f-1;}uInzv~ zln+VYCF`e7JY3=_f0xc%$#q$>ubTT7rVekw%4#WCE+8Ei#U_{yTA=v;y>9_-WTA06 zrI#Unv0DRE`A#F`tFE8U<#FdZmzcVan3c^dY5BH{C%AZv8YlO+u%o~a1V;%bM&vuuIx4{ZF`zi%V zRZmXf);Hv*!oTAw+iO~^byG$K()x{llU0gtlt6@jf6w#}2bJv?hn%3qOy~;@E{-Rp zw+vjTdZVHhN!=|sAODM@BS2+doTDCTT7KWY8ijI&xd#5UX{ayb~>vOh+dAe zuLPL3noWPv)^H?mVO62f{<1_7;!`a7lz2~|#(=m0@|%y`e^C`ZXPeJ=zUuFIASfE* z5>Y=#xY2X(Ac&(FYp?%Hzr_Ii0sJ8%0GJAZE-FBaSIL=j>rXE`yrsLz)^0MNvE=~P z1m}-xkhHojVo38lkP4ELg?3y2Rlg80EG|ypN40D#CHF z^_j-Njf6Y@k3KBJGjt_X308b4yF&rVSYYeQ6WDS9xZ0aL(_X|kCXho58nofx`d*Lh zD1_~vo*}+gOJr*&<5k##lb)J>9_nXAibFv9E=)Vz^P*jIsn2=~#5E9K{tFB^5ZNrc z`|tWyx(5|(X;mlF9tKni{EJ{1m)ofCl5h%Otf0>m*Wpz-njM7O!au+X(@q(xx*KDH zs@uCf^v(Y6ucConG$l=pLcimQX3q=qX&5)(LBon|oWLq#8JpFAdf#^gK>zE`bVzyt zVeyP(6H`nZa}o2*LYZLxHQaK(|Jx-hgmdTD(=4 zO!T3+94{D8%@+Uj)g0x%{~Zr80pV7X#U2+lOo7W#%+j0B0YAaD@%{1* zho~37qWJ|qOn%mJL5E;#_2{2Uw@qY(tXSO_Ekrw6=%*-q5<#Y~et zV>pu(+guhx5%p3C-JNb7daPgsG6dPzN3pbW?O*L_fMg~?n{=qX=qDyUte^ko!MB`E z$3WKsK{d!Ba=R!PkG0ghbyzm^$-^55WW05~)4H!nn0rI@+tb=ZzQKgAg5WftEW>Yp z+gR@@@1nXtc~~*s?-Q;{cLa<8*B+8r*gEA!U=!(flu$YoSFnz1F;d2E^%Q3%ll||y zId47v`F-ej`@I>RWO=f{G<@~k>y=%B5B-z5<<>}QUp|a^ zSuaD4d@%>F*5C6y%1Wm!6ES4CZ3ppCt>c&1Aw4m3?Pa(vz zu~WOk`1X3(K6i6QA}##C=kKgOfF`D)1AZpxQ$aeixcB9ar|JuKu|5TI7hHOl-I+Yh z#*}g1iSZ8mfEI#_C2Kv?k$o^o^SgelTC0zP1PEc_UpoQl9YH*vM>vaz_I0;!N3G8L z`JEYjALf;HJDMS8oUlIFX5B7|-%dpCfp6*W{73+iKrb;D&uuf>i$N0aBZMYdUrr1R zmLg4WYOuVNgN4xdBpu(-E6-1U`p<86W>Yd>K)3=B+~4u?A*qSvEvbb=0&7+Wb3SIt2O-rW3I3YUG3i zZ=6(_vKsF?k>Flg_=`+jvrquLj`#s!ts(5jh8=?*$MDGqJ&%QdI@90rqCtNU`<<>n z!3ZV+70(yxR>n?=-CrT3LGR+#1mvJ#=T0fy+Lv?f@3!=MHvpGeWm`ql=t7CtU%h|Q zk%7oS7&q5(%Yv{r&l3{C&isM6JMR@>1bdyRWIZPnnRoC$9gjASjXB7lBAudOtB|&T zG2*}TlLn!pix}eUa&)7$IM^+H8^`kS+GlY0#n@MSeXK|09@6kmaOK&a%~QOSueFm$9&pTp5CrNU(UUy#jZZdVDiT%>nK&c|i>&vp0qy zx-5)V0=Ws)S%kAc2N#
5bv#0-JtdS?0Kls0@6(SD#iPjMtM!4M4zhXMB*vrG+NX z%5Xh33rQG*@k$m%u@~Yx05ci?`ETo|eVzv0&;I8FL+RP8LsTV4G)z7NlM(BEK%Y$k zsa5;`?sq4*rn-0kbmCjzNZ;l2@)rn1{`^-^uC$tVeLr!=K0&^&V(NLXjyktmch9It ze9ONI+i8_s+~Pz}%>Y-sH~9I(hZMuM6}fpMK2!Ls2lMNzeDdb>dI*fbfOx^@5Aa;n z9$1uBfzd~Mh5F3gJ+~^MZ;!v%fqJ~f_Mg70snF#cuP`k;zkZl>e<8PbFhg^wX!cD} ztd7-)F!b%3*C7v2rg{C5$Qm4}=ytnhz^R?l>+K7xMS_pN7YVN8{hIv7Km7rOzwj8f z@KgaKA_82-!(lZKLn01aA_RLyTMYQCVxYc$dxrtFVwWMX@yu4H|3uvNnI~Jc|LW*qvi=Fz+kUT@`pwB!^VdE@Rr%=eVkcpFO3 z{tN!0XPzU8K9(XGT*zhe~%X1Jwje6#~ z0-N@L>%X~%Kqv=G*Z=WrF9M)l3j2Hh*wrjh>QsSC2=LQq++-`xvyU48ydIoHbB-%= zM-D_-s#BAq zVP_KuPZ0oK3?}H&!`*qm+Z#ZzU#%Bckh{J3*9#o)LH_hSo+_hnYA%}xT;1USS5KZh zejD>W9o#YhKG)KwxnutY3R*5-VPl3V%8XDnk0XJcUU`AM>K#xjfAhx<+i(aTtOGm+ zd1kGroWL-~2g7-BffZ*!&c9dlmR~IB)6uTB%=V2B0UvT)V3sHNa7#A3Mef?~c&>sB zI9p9DP{R3Wzkf6f-v91<|A((d zqOENWufaA+NR>$MSGxD^%=JHi;;I$dmdonL1gybGyD6QStpL7jf#7l2!7v!1&pBLH z(bB0GErLFr|I>%#9=JWddJ3O?Qr7PC>zBMCZ;Qb!;jv34CD+<7Z&?Q!s?6011VL)D zzBd9`k1vquY-i&W!j?tQ7VTj7yP)0wff`CcLQ22md3dShAJ{7>%)Cw4ggfM;bYa3S zV>HxpH0BQ?k0P(~o!C_cf;pe}9t6XgWwGs~HC>`H*bndZ8}I+=33&v~T!>8~?txu( zKt}eTgW$cYhfU-@_2=`Qzy=ecmbd|8xufr*q6%+d!~p0x3icDLu zgLIADWD+(3Zy~X0tm+FP0Cd;GnrA^#mPILI%@GHI*jN}?)=F&Sw(Bv;dFOik{2&Ou z5-6ou&(%4|q6E+2N)%|YDc(}C3%rZhCqz9FJ$H}hfUN3Cps+g!c&v{TqIi~U$_2Yz z_MaXPOY7Dxa*t(uAkC2liYg@PWELv{fuseV(Q&?AmKwAt%0Uj4B|hj*6({@|v}jQj zj4-g_#ZLYD?Qig3$!`SsyUTzGfR}q&+GW&@as-YRZ@EaMa@OaeL(ChfN;?YikEVXd z7yU!>@;m!yLvwGd{2T9Abc;yF6p9SslR4nu#}s{zGjWDAv9eaRVcE!m2wU90p@r@R zP%vT=TVl(-hldkUfGWl>un*hc`++Vi?6HMZ&N#y6jL`GHqi8==w>v}WGLVa#RE1y^ zn?q@Tm^1V+7Y+x*o%?a0YX6$s5!jid{Qj+WGX2 zJmKB6hKZwxBv-1_A*kC$y);UlItlmHEN-<($#o$8_(aL!ey9bZ>B%o|u&<4DLlG_U zP%3yb^yvduVo-GUch@&%^O3hN8a8$-9(YQ3fpK+jQQ00jd<~W<>~!g9&CO z(SUJDCjIrZ`}xyQ6yW4Se=YKvk$B@qDQ}4TH9d2==~3PKY2VN`xdS5@{9fSpA|<`W zmUixLstzc8cg{WU@A>OY<;641o`7pQ-u1j7_Z6HW<(0@}84{)=z`6BkHBu|6Bg6sw zKEAFmBR!ti9kxcu5+DiMGy1D9eVx6uQt&C4D;n?8Mc^Kztg4Z%d@g!$Lv+4%R3JA4 zKRCcfBW0ZB4*O!h9dMpL>-gzp#s!@{=I{JaauN}c;RCcx7hHio3pZp@&lb4~gtP1A z;RE>sn{jV*)UbuX#EG)#g6wIUe-Si17surcg#OiU&)4Nd<_+u)Z3<9UC%Av&PXvu3 zH2T_^fx)heERt?>_uYD6guq5-r;8WUw`K(4uGB>)FXq;YP0+6#|z#Rb=#zxAHNCcmJ1%^g)JP^G-fBI1~ zjOGCQp^DxBfAf3&EMPt0KKfL$1NBcuaMf!-eYW|n83t1e@w<@uV?Ylb7B&Ep#F|4x zOt1hV(>U~|Rde8|_{|^YGGx-%@^eK72z7NkP;f-^Ct49)O))eP2Z_bboh&o=?-w>o zy2lxFYz)Hs#Q?j!+Nr@IN7()Pb?Z7U1Eye&G{ck#>V-ToL;3ktCOr8cz zv1_iX$sEO7i-G-zloT)S0bN#j)HnG2=8uL5nB`-TsOH=eMg$<^$$iLzL^r6lK8e+O z3+$KjAA;xqjNbWwpm=6r@xYeS@2O2-5emQgzW`860|XQR1^@^E+61^%<1i_4-n{?- z00062CjbBdL}7GcFGYBCa$#e1b1!9hbaG*1bYEm)bYWj%V`F7=b1rCkaAk7ry$N7c z*Lg4gox9CGb7$XY?rfUTKH3+M7zqgkW)TRn84wakAS@&y5N1bUj4@yW*akZ^33ijz zb>bQlcgfO(fRnn(OX8(@c9tg2(zMy-rH%io9lhTfz)PCfwCO*2>3bUZ>E3hix#xc8 z`@XY$-&tu9MpNzp?-Cf8vg5`~UYM&FPm+b6}bS(;S%Qz%&P@IWWzEX%0+t zV44Hd9GK?7GzWe?2OfF0^1FNE8%DN{j`eTfJ~%SGuz$zqk&W?2Ek3lTI$om1`-eA- z?H=8MTU{GA_iyc=$8TnFV`J}*-oD=L{o4`V8{arKGCJDN@9h{H@86I6!@XPkw~zL2 z$Va$!Z+v8s->t}IvlTb)A{ZYX?;9H2z+W_S`*8mlF6GniAMGFBh*u9@e|jzMkM-~D zAKTvF_N%w>uD2&%{kFv0ckLMK-LT{Bsq=Sl{M97>z0~us9vS+#xu|^Gi{Ac*|1AAT zX8Sm1V2p3iXMdn~XnQ}dZ5ZqC-O<0X4;*>tr7;lmwu^(qoBPKGci;+VJRTex*)%x( zwg@|WhXyxx5APTp!bMKp*8Z)1{bP#<5WJP=u6N_s!Qr=p8%BnQhX%LildP_6sBWmO zt8A!2ys`dKh^m*X!rPMH+`GNAcl-9+N5;5#Z<0Ft)}{E{wCL>$@^+zBA$hJZNFffb z8tU&I?-?B4(LXlaJJgeB3?lrt3W7)9&fptt`Y-eMMmm3(?7d!KhVsJV1@s-|j|=lA zxBq`AB1mntcdUPy>tGd^Wbck0V}pI;J8qVlo9}9YN^7%6HuiIk*a5F2CoJANxM?1q z>sAL!jWIJCQzr@1DsHRi8u*s+X1w-hTG!%d1C#$uJ`!! z7C@djes$+y|Lt!E2F8as@YlV0fhY53pm)=zvHnfat2eJ~@832KGxElT{p}~W{q)xx z!v7CneL%gQ`49JchkqM3Jl#!HfkYU^w49DG3!q)*f0;~6klw{^9mxVYzhI>JS49J< zzf6+DW+uHrUAN-?xi$Rs`&C#U@DEspa0W{b_UHoib7eWM{3))O5b0|;eh0@fjV5N` zcuFCPDVKD6H2=CkfQ!Mc}Rsskl?~tqBC~ zL$)h%+?`<>B6KdmdG}U^`}=w-aK7^e${?_Ig&lz+5_?y_Zo(|&V^~}QgqdC%ls}yW`0Iz3Y)a(rD@r31P=W+L5BzQm~ zl9V#C;Oe`2K7uG!D&yH`ALv4qq;(xlDSw5t4lM4NgOvUbDTNRoy(s8^uDEe_8dv7w zxENV^2FI`b6Ro(2;|5h+;lmRVjT33<*@tVVUQoy^(26hO`hiDC{a9AC)q~j8xOZnK zsVhE*8(;6_5A1KlDJ{^y?*PaQ;B?yyd0|ZbcE2Ax|LAY)BrWIs5|W!}Ac53pWokjX zf2VNe`-)6r$4q|th3l8Un!o(w^}x6DfgfHE{45`MLk4v-S^ivUXqt_b{CaYh0~J6G zPz%%pjlc|`8JGpM0JDL1U_P(}=mKs9dVuxd=&mNv;v7`Tc^Fsj2hIbKqw_)FJ-~Z` z_W=(9e+)qNoqq;g0zL}-74Q|{>%h-}*MR>IcpZ2H_@$oM4;nb#3?UJa00nRWVc=$7 zDnXCh%IT>CJx#dN2FwHAMzM1M;Xz;va2tRnLe8DQ?Z7_Z5O5SY4%`RuJUt403b+P5 z2|NY-E%15Z3&8&Xz65+3cp7*f_#W^w!1E)G&UVT;a;kLzidmle7>+5R04N1`PO<=( z407|PByu=k2rLGc0;_=4z#4!{;x6DAa1U@6xEHud`#GF*d2m@g0&xC+72WH-JXUU#p=f=b5hBn*x4{jRC9ax}Loat@p=hW`nV#LF8&Y+|@|n`KUS z-<(n#vV{9ao>@HGirbZQcAjYV6nEqa2BADrooJuiH@HT-OlJSv^q37&+csM*O#>&x#PZLdj_BeO#}M5j;+f^7axty z+PgQjOE@`ZH|Y8ei~2hqj)rA}8*dL~){fc7H}`j)vL6|lzieui{*-!RsJx zFpWucvH3(ZM7*l+7IF$_^ZW+e=Jhe!Pk#q#TjqFd{#6UX@x=l?MXwNNrN7(8SxJ!n zWAsv+1%z7$I;-qmn*)dM%l0lE2-~~BpUp=eoIhH$A}VFAR$*m{aBip!boURPb{zDY zy?4#rGB!4_-((+e>W?4HZ7>(ja<%j}uj*^wX`|VUo@c7%G`%GB*qS@Qs)dkx%`Lb1 z>gQdiY(Z`1ZlW04Cz_-=rG3q-Y*5h)^~WLfAE4F}A0CE+o&fC~hc1)7@vB1i{I>E! zHtBGe9SCf%E@|&?Iyb(k-(7ZO@ru#d(daVq9(C>5+TMY#%fh7E?>s#?vcR!nZ{h0I z8R!Fw*g$Gz*1mMnMxms)=P@B}t9g~tF?xkT=Pk?o=5#Cs380Uj6edf+z~kro@o%8t zj^BWNV4#0sK;N})e7s9PH16I%zTXMB!;4J1xn)gFRZS+-+@?jQMNRe!ntT@?JZJAe zXCF9s?%aTTzuUdPYpAPhe8@Sze`sj`P}8Zoi^?{iY6_R>HZRhZm7OZv6u7tTwjHVX z;lacA4z>kuJF@BUfy3suv?IP_aP+ppBc}tmr9!ucl)G+CX775Jn%!Q#UA^bNy))l^ zm#7pf$-UM>Yjvo?nq9l}&a-#+x=vYAF$bc;-;*J-lr9AcasIA=d+M^4=Po#W&C z$K69+o$hf%*Z8=*$y9b~(V|7+aM)xrg%_PNg~27e9ZwDLjQ8WuIYU?HxMAEqu6GU% zbqzV)UF-0IxmBA@O^bB8DqTH$c}hBU}F} z8r%Bd;;jb{#`f*I+pF!%ZQPh!arcI!vovLjW5JTOD>G-$jvZ?O2OES=C|iGjt1uY=%htJ_ zLtXCuL(o0*JjXQ_NySfbH&T)5_+dVYC&V6`C zTdM801B3Cvs5w5m>By!dM;wj=>3feH*>u~H!T2V}Xd765aAa}ANW;k1qLHl+ZUxh4 zt+<4pQ*$M3w5^jBJ6W;qj&0kv?R4y9#kQ@Eopi@$$L`p+js2afbF(i_ogeVd_jcBJ z<`~0wy9uh<1)uAntGU$w{+NkxPnz$_0b$6KfLp*;klCx0q1&Y7K%m29SJww8d1E>KqyU-|f8 zW}3}13I6&*b=%jA^?Jt}+ov9$arNhG_EoH5IoVhsj@_vktTYDOXl6~hyxDgUcnPMP4jj@-S(Hj^N%NnIuG1&?tS}-RZ6ou0keLAIzyAgxS;aEvn*FBl4!@2LzYeFS1YXXsZ!aEd038B^)tcV2o*o$< z1vGyiSO0_9_T2g0DqUTx+Y2e*Y%sm~JX5axzkXHo=f_{g$7^`atF3k4hdP)L6P-8b zozRcWd6<&U6^TV$mB0UN`$k0;@9E$*%bU~kEMhbrA|^OHKbP<+D>UA^^?pehyxr%0 z3ybU&EMalk70sKou8Dae6V!GDD3D0@-v$Q<^UlK`{Z=`@$>taYcAF2QS=oi#>CF_> z*9ruF`JKP6Y345e(bRNAr_pP#ofl`Kho#Ui-k4vpHi1JhgB!uqL2nE@z_B!Ua-eE? zME62XC=e0~i3N0DNb(~zr)IE?jH4fV@q_=F%4+tD?=4@wzP^3W@jb$5x)>15$)_3| zMu>5s_BndVK?`xU=egqIV!CF0ytp_4E9brO#Qbtw!NPJfO>r^W7R_-W_4+gWhv1Zh zYv$A@{dA9ju@HG|SWPSsb-L}nD}$Z1jq9r z4a#;w;hY}#aV3>}`H8Xu(x#D^OcOji?b}(Owh<)Y2AAC3_#%uNr%8s`>H^(fHSoi$ zpI>_Kr3(SuPhU}RKMVm?93S@{P$&wbs{pvzhC;?;!(+#_860<_-oB1RvgVq#sE&zb z-&?wLny+>(-`Ca}Sz=(ctlgV{Bp{QchC`#r$2sJTW#C)Xja%XE8)pH3ml&~qW?Gm3 z{BdlCb3sZCX$Ya1Bn8JJ zF*|6eLI1-gYFv|h7)eB70;Pe7@^89aMH+j+;j=N(rq)3CqT9_!&w^*mnAYhdsgO!J zk7`1PToyWDB13HZ)0ISe%nVajMoNnIODuC!|5Cu8`c1JgNEnM4eQ{6b7KmXweMj`| zGA2M8Cweor`HN5qHoLqeJzwW{bIGEb58zI+y+f*SVPJuVIdS9jnYfBa-Syi9w2Y7> z)*Keoy0{T2RJTY_ydI_ki}Gvq1lWYCtBVsQ?9+olpET#=jC8o`l^|?aN^4^Xn(+i5 zJ`6^oL{K5gVT}5{Sh5&-l0Ycbqi8Mh;GMv%OOuq8spy>h4Ykj|K0d~vf|6n(Qrneh zL9g=)Jk1)B#7L4vfR_)}*`n@O=sOy)#aiT0V)n`XFOIL7Aan^{3;tk>N*dmvMtoN` zl`EYZ?^u}$9+9XQWd@ZE)mL3qX5)!a@;60ZF}?Ebp{p0e;==wnRgQIjb5|!m{}*1) zVo|_qR1;uI2vmUdLyYItH}$aa-jyhW{oAFrkh36#3W{Q`5uHQJbF?a6qaw}2FtH`i zzg3ngOIcW%mf?q_O1~N*pB!n!RUY9cQ9=~^OqJd*wu+2C%bRBo%XNyR&vZ!l;+hR3 zbkqu&M$Eor7nqe4PZ@}|rbu18b6m+7@kN-uR*PM$yR>mg*1w5r)^on*SG_*i zu86JuVuRL1W=3c_zk^{;_{rNyEF;hU{El^BSV&8&2mtOdr>5qi>Ge5I{4l*XO+=z2 zbARC}%M%KW5S5A22q6QmNeA(rfU7dN(&o@GZCAsl4M5s1e_RI&x_$l5Iqn@avl`a> z5>k+Y%braMS*?g}frp3!IIREXlURCJ)oe1-Y-2h(|1Zz#ZD8Zy6NZ1nc-}zkDJ>+0 zeuCgDUbnDN+1<~%fl|L%tzB!cyaK_6d!-xeO%53*=Y$m$=YR_ipT^?|?)G<%Grv12 zZXSrhS$b~9o%qJ@I42v{llQ0$_DiFqd>9KQuo-YB@Uwi3G;jnE=??czdEYkJHq1dc zZ8SKKF<}F78<-!#3*C)tU$aw2xMwe4w9m1C3g{c{l{o4<3HMPxDq7KrIeQYTTH!Ze zE@SKHd7I3+9h%PadhY8^T~v;#-N&KL6~;%%he5E%*3Gx&qyE>;0Jm)0$3Oi0y8?4d z)Sd>B2#oF%H;+jFjxPwBVhi;pY_sQ@zHvw{ z$da!id@%aInSZ?)eYrxlzjM7Z9ljEC9N!1x_Go6uiF`J0k-`uL$E0gMIBlD>=eyeV zTk6ScgI{w96y3=ooO&1WTM&{M;B(7a-cm8y{w+WLt)v;KEBcFUP=sE`nw3NddB*)Y z!jO8|f1RSe)2O_!L`|*j&)XadC`xO^7V_tQVU~|mXE3ZD89Qy4qRX?0D$(Zy1|vh@ z!(1gGTRR@L?m5%O?UCZD{>v?tF#zxMN#7(vQ1CGL@QbFHBp$z?)|4J~;a)~u`-|ID z@V}%+E&2I$6opN>vvdprb_rI1mq=@tea0?J>m4godk5)|6gcdHrVKC^Sea$DNm5Hj zm3V&Z?l;ya)E;VtQF7-qzp7PFGGW`~o*1e3hq6>k{I$F5SEE3zFic~}>k4}e@sGRD zk3y^05bJdXvNyhEfsaqLbuklLSE&4ub&7F$oKg;-{H#CzmD}^<~s1p7b3p7c${y!mI9wmtwFl)z7eg}Zp2K- z2yecgPwVXgiVARtJ~4U~c5*v!=uVox<+%VKWS#D+F-V4s=wgCzRmw{eS@~ng;x*-F zFX=psvPT+2ab8q3%Eo-j@-jnl90&(kxyLqvD3bdPSX;IFqK@&1n>Q*C>hfaJx3|H? z(3H$eT-&}mn-`KsjuAO;(bj$M;{8#SK%T%mr>~EZw`-I9<5lvT3ep8L>l_=M!0V|s zrC#AepCWmuO4M*3lpedOgwv&#C9<2d97LUi)Mb}&dC3RqDQgMjBv?IDYOZq+Z=zuo z%=yK0m-3vBpS26!v083|rU4zHc-A_4iqr0`6O5`t2f`d9>3?~+7#UJJy#i0rS_yykzw78B#Lb|0I4cOg-2;;_8Jv*L9*V zIl~cy{V2%pkasT*DY_aPtGFDKnM}gQvnACWx8n+t93c?`(Ne+4T#Dx_zj8<7dQ&dR z^8{3=P&3_1-yyvA_WR{xd*z8EI~uSsd7k2M2yR4ns5l`c!(boyNsJ;&=yye5hScCn zMKJfRCp%IOgp%HuR{Hw}EI&(2eQOh2iUbuHdw)H@tkr$LDBlFif3LrBJs?*+sBB>| zUT(7sF7iQ#-vEu7zUw$>Ypg>I=byJQUU3(sBCEuxshvC(GerPQ0~@m$dm?e_(Ft=qg7a+!h})(V=NDPWr?Y(; zgS7=3Emcv-2=cOPgiG8)7luoAQKNg}k>M0eD=sx%3O8>-&wm_q;V~?&6Cq{AOT;k3 zm&{kPnK-zbA}Fj|Yhzn?zZn8%=RchGe7+;8W@~qP`~CrpIs=~0zfDhszW4cEe|W#9 z?1>zI84=(AGn%>1;+x*ZaNZOnePa`dLT;+P7S60scKIhfDt;E?}`aiFCddXq7 znjD+C#(H^#=sn3lG-JQxUvtX5|2JFu-;Ah?=cZu4FNb`1?eUn(5oeO8hlM&o>q%ee ztL#xe{?Fup*AU-kflQ_rU+Ygo3aB2OZWQ9csP<{}ZkfE#ED#%`7NHl;dkYyo+ zHhc{@bdZWMiZf0d0ykVP_%t|nP|SZ`St-ycC;_|xPzSyZ)+6vPwt_cht^NQmQO_oe zoFFo{jzM{{NDrQ8s=f&>VHMpOr=!NacV9>9bG&}65aGeHrOy> zQ`-D5#ouDZMO-BLG>jj+oI6d1>@vJ)>v3bzg((suR*4Vrj%Wt zg~^2l9*Nb z7|mKWbmsYlOI@-IIdGEl$>ac>wW-3tRFcId)MLFQIX)73r;^FwREj4`S%zj#oR37w z${!^~*t3$RCfsyf;F?J8m%=VsDaC6tv_e**XN$SJcXH_PMUlJrxTGy}VEmeg1T15& zSb0hXsr1WIOCK6Fb!J1J*b0SNK#&3J%cDg7s-6Nk<#()7R~USI1EjU6*%tD!^do6J{jh)`ny?*in3M|Q{ah&ouGw7 z9eh#d!P-Q65T?kJP!{7nO6JX=c=S+6UO-bq{?zt2(Wx)uIH8({m|vJVqMm|<%|rrIC{`hw9+EFGI@|!_ zu37L8M2R|9RwR;Wke!N&KQv{c#;Cegu2C}0yY*NlFC}>#hmefKSyvVWV^;eT+2DB4 z4Wc1*AT)eJ%*!W&hfA456w#m>E^+fPV_Bt>`^mIPvlUZFa1ZcyEp8O4_gPNrhfUef z9#t&!3k2}y1y>|V(-18JK*r2K z7B%FbZs)_9#q9GEd5V8B5qU#&ghY|i_wW$CV83sr5(-sBUQ=!rL*}eUj_}{?01oAC z@!JUR`b1iNyUuTZ0c`&4ICtIxf(fG&Vj05etLB_INYD$%r#}>v5XT2;fenhAB=p5J zpGd>^*EgLPoSmbVY6gt0S*FF293>jFmR~+8{T0GWh|my*fgD&U)Pr-z%oy?FXzCiB z|IXcb36VPqUja$u3EXi;62sxgN@%~CBVr?Oy@oDtVf?;~Y2x)WCv{ZaNsolH-5`1C zHGq6bBhs9Ye2Wp6+LPW`A`4S3H0(%b!DlBTsa`{uPJ|U@3Vdu=LkSdP9VBwEK}f zM&lCVOKwV`M+7A1`jqi@TFqQ(Z%%#H;VO}sOQ=Kiou^A;oOVB#FJQaDj8-AhIjF#B zIDlOIGHSki(GM$PiS^vqFq+dT8t~TS)pW4 znSq3W1QhF|bK@Lkjm~kfsB8;*TwQ3M+sk98HrC}H)<_-PHX3CP66HT@Q6%GVk9nq9 zc(${BG!7NW&iILk)h_M^IZ;HNGI$Zx-Vya-^5|_Vk6-$GfC2^=9e ze@%0KSWm3FqG{2^Ikc+T$I|G(uP<+Y^cw7jWJBUvS?{<<( zH<@m#Wp+)@nsvhW_nD$&!&M@9Xdi8- z*&;o0O*puidkL{tY5FLQXi?gdT5%y@TR=AVZdF6P3LNJGXUbJzVv1FD){q+6NqL?N zmO%B)*;sn7QhBDccw3#@dRIX2`r%W6-Uz-9Lo(_~ZqP&KK*O)_wx~RjFcV1?R-F2i z+%Bw7o=W&Xn^Fk~AX!))ZFzRad#>WxwjV7&{<{ZZd*h!eVV2qBgv;q}yk@;^EcK+6J-5AG|7t}ry>;ephikY-NcO+~#Kt9p*v zxI&aK4Eu{EN(k-6(C!+2jC{cm^ofbi8S?;liyVSmYh~D2ziLo5T+^X)T1-j#W~Za} z5L3$~yQw5YG*vwXe?bWHzgdoH$pR)r=Jn96J+XXpB#iF=S>IGtk0s*o$qLQzf*OZf zrJExmEz*)s6lcm7pq+9LLST`4kmzZKO}!{4 z)Jw@Ca9k?e8kiXIA$(&y{HB4vt zzrj~UEO7@SP8tvu7Zlx|N;>Bwi_jo?Yfg@yuBB}prA7#aDnusBhHCOhr!1AQe{jba zq_TC9p1txXzl5fLqYlFhO=}qhRzzGI%*Q2I-f$Q6y*B-LP0apvybkN;t||c7&Hn+A zqqe?RSa7qgs-+HkqVDE#`cm{)u+8!Q+)CI)*g`d`)Ad2p04gJ4faC3ePxf)u4Ol}l z0;oYMg%GnrGK=Zh;FoNzv-D~iEm)8sA;|UTsMYJ1zyi^in7-z|`@UAtHG~j=3KR$( z04@(MivLs(J{i=F6pooV;*Azh=`d$aq6&nCA{UhN9wMf@fw4spMRF&t=P^_zf_>Fp znA67j)K6fFb@ZCAe*4^Y>pMnx1&Aza=`QZWL3Rabk(@le`x!?3J4S8~Nvfbfx-W@_ z58nUP_D-D3c5ZxW_Z_C8GE}{mcn60pyG#+wzL)%l+Fe_VoWZECgAF%mcax84^UF9L zPMt}oUdBh<6^d2Dy6+qmnZ-o(5w`Dx6XV9~lvj!>vCz7*=H<46=doPiqf9URIn>|3T za#XArxg@W?!zAItbTCi=0|8tXeesuZ6w_K_^rSr)x>?$)@X9hWV9-mL7!*6vT{VOM z7qY9UfeH1|M}Xy$_4kWD$eEb$^44e5q*aI@!W)?^qr(IU`X%=vs0BHhjrjVB#+Co` z)vw2;p6Mt&cqgCfBzlKmGtzhxiA>HQ0K0gUO)-(kt$i4^LjFxmrvNKD^ha7Ylls|` zB?Z|O8@XY#rsidW?lHz_abiEF6NV1M^ZLh@^_)e=0g^RQJs)&f)M7vLbA*YW2>4GV ztKCfcw}gupJ{)(E2(y6l8#L=szO#^_5W|Pe_Z3Q`<@1AbVop$`w`2=df}9+pMUST+J!FdCSF@;v?_j%8H}V zJ1iU1W7ogt}B~+P&Oa@pvZ8wf^8cxK{Nz>#4lA2(N*vZunN&u~F99E8=kX$!YA!zW04wG*9CAl1?+; z+L_hj@-oL{W|T2m(vQhfczD%HNGtfg@Zdr|jHn^hixcb0x+N6i}fQ)K1nExEW- z)iX5Gr}{QK%GPi(H4ZT`SI_WfuiuIEf~#0jBO4cbf>3}V1-l72MT6mEJ^~%`ngtU! z%>#nHJ`*4D?FzNE?aNO*_atL`djoDFCcJrnF|frFv$TK2zrpunyvd>3uw(fX50^OW zRm_cA|A^lsh!6g<>wziza=d~AvTW`?-yQbPTFHsGF&;Sue#F0kzIY|#2DY((}mGraH#Mc(R-f&S$m?xLeAY9>*py9Lgg9#A6Rf7^43UUgFE1# zY_UWYao6YU;MmD1vR7R2wuRDuS2KpPY5W|Y`R{q5tfpu&uAzSMpYt(q6v>^8& zvS|cKt-Rh~b8~H(lQ9g*%=$urjoQg(+>a9^Oj;;Sb1A0z5r9qj2kq-(c?@Kk*-JxiMnH<_IH&6B2LTsL~hr zpvd0av_UCklF!jEG*}%^_Td9xhAmPH$?1{7Y~P_wzHno{j5x^9Z?ii4r4$=iob$PL zC{a2Y3+^IVUxw!UqG8+Ty+d4u;;auc;~fBNDHGqSevNSnXNII$N%FZ_g1=}GLbeod z4JXc|LJ2IL&)!izbUez;%Tny>V7u4N;;>yRCW3=?(f6`wX~*57#B>eXh`7_mRg+1H zWB2Vj#v>yT#?6}v^fS)8@YIp{6i*b|Phvw)Fp?4;lDNY%+ywCM(V>@Ux4cX^=utSU z?xX_c3w~QdW^U>*WrrK60eogcJ5569G2tH~R|Wb^`$Puwhh6!`J7i2M*)z}3Lu5k& zV_=>_g<8-2N_mhAKxtA8{vTvfF(9xin>GwF(i8TpeBg-)$YBR-2@~Zy9f};B_=>lE zz-o@-gT6!rbmU^%RB=ItBOt0+=cHok+5Z!)AY|f`dgMpd7#!gg*6c#LlWBpTX@Xos zyYKF-IFj3cn<^7pwQAit%cp?Z%A0?lF!O=JKr$G-$cc_)Z4(;KZSh%Hu+yTzaeYM< zBNGDy69X;16gj1zT9fZJ8XA&(G+xt|aYL{#0zI&Dv3cBHJ>;kPJXGiE>C-?hY=nSn zSI$XIr2mu+KKn|yT=BDX&6aTB)PHhA*4LgHH%Z`X$S+ zaZvGP<|hn-1CVgq06x~~O$xWpc8%f3V@VrKM$7|(&VA=o)Wu9cQH2XFj^d?=}&g*NcY-`nhKJ9Mg@wL zurM#{v}7dckQL|cI=46HBVx=`WHczu1ea@lSf@h(wiGTu?9oEjzyNz!9~9Jtds~%H z9qj{)z3g9qqbe&%;!Cv?z?KlY9IA8DT@+gsDn zdHAZlD^G!iPU}B5t&t4)Qw|Hjh{e})s~uI3_x%UT*$e(f;Kc~udjHgSl-M`s{r53^ z>-RtKjpSa;QF`MQTZZ@WY)`PA0i=n7ov#UBz|P(NVg9aOwl@Uv%%?!U4tPBn*WEvl zqrBPOsTE7?jGj=v1lfiP&}b>_HiU1``ggS(UG2_@P%gp^M9mABs=;XqW<6QJzel<4 zkxk0B)L}Ftvv{A%W5rOz zu3cs8d(s>8L%pleDS@1yhaac-SD`07z_Ne=r``)g5(K9DHZP>9|Mb%ph*$tbAKs3Z zKN8m`BH&8Fu=~o%3x0I_!W9QJvwJ{XJOfH-{r3HWzOo8RFcG!g7YtWt#bAmWYALm3 zkdxfMAyT(8omw*KWzk5FqZ(+27ppX9FO?vdahpy-vtrNwF+YnWHp52{g;6?dkYJ~x z4@<7Nh#v=SR)jNoXs*7W_o~c|g;Z`b0crdN3BjVhhK49UV%$>55+x~W0rDEaj)Qa_ zH;W+O4F(wE`m*&~Ckf%~9GRPNqbk_;M`9oaXDgE_IS*)RqQ+SjSDwlHNor73C@pE) z${4wtaA(1rIlm37FD6lQMoyD^;&)BX>vAW7HJ$)LD>xShS_EdpUL5ju>~DhLI3D#l zrZ`hEP;;(Q@%QZM(EGH+Tn0?V*fXaw;%YdwjG@DM$k+q8DY4Mx(O8IO@S?X((){VN z+7l^r;#A31ilf>C&dRR9QJFEZ;#Ub7gc3eLTf~YLn~T7 zKJ5=kO2tByBdH@n+8a0lP|L5XvuhH_ER~@%{N61T)X_jw;MEh>2YSmF*{NXtlpGk_ z$93}oo*g``%$Nw_Lpauxp)GgHtm*QZ%}_~RGHr!DBy*a? za5%|_9CH9EI~i`3pv6MUll(M^OH?U1Z5#xtl#+o`Oo}2Ac!|A+KZRCksPHX zltXcg2(n2OS@T$$rDoF4CwbY>s2L?@Z)3onC9~O)LH&tOwk9Klx7~GyR<|U#rO2g) zLW^?dMvD(eU~5zs*^?-vLWaji7ZjK2iyjq^hI1z3j~SvH%6Kda!jg)TkpvVC6bFmC zp{t(In9s^EF-~Lrn*VDq!m9>}&I0C3{5jPX<%KC2?goteNe~89Xz7_cU*AAgjkRXO%d0Ya+>_3koEUVRh9XFMcs2z;O_mpAHk* z{qmE={FPNKPs^1hCp$MK`TCEH)KBi!$!lXyo>wDw3yT1jf1Ax}dAiQ7rtUwOUVmIq zE1iL5#hT^TQAk28PsN@{B$kibb(qe>c9xT4#opR7CFQ(aGXn3XR&8s0p5w)&6GIV3 z!0Vb6hW}~NTPD{h&a3+lv?Jhc+v%-mKr0?RT2g64HD}Lw7ucW0w<+nFX^yHoQ z(fLp7c*d?^eU`o2TT{*sCU|&QLL#eJ^g~wGxUT;bHICnV&`S@c?pN|{1gt4UeczEh zoq+rW&~8|!0zeE-3R6>54FY2aD4KeOBocBwQDY$3d4D!Y8Fv_vhnIZ>1?7_pM37nt zj&J?-XSwAI8^_RUq*NYKc20%7ct_Sy9>ZN5WWZTd2p&!N zG8}r~PsUest`_PlWTx!4nCUaXFpd%(;jizD>=N&OG!#J<%c|qg!p0JqS%T%V3`>mp z{4_*zY(rr;2l5DaBkuK1(*C7NzEzTyn|nXnRA9&=Kx3%`B$1=Sr_qGgy9@${?dp>8 z(4yXP_bLy3hwXnPecfpS#GBwQJ5YEPCQDp_~@6|R0( zlPc~YS;Eo<8FrqtF+@IjX$t&IOeqWt_Bw~p$HD+Uric%}MnT_-|IqonxMIE~0&>df zt9!vq_(Nm?=UAE&yEV2hpu`eRE4e`}ToZhel;T2ddue`wENFh!*I5s35&}(b$c+-R zF$yMj4wsq6&(LsLD$WCLBoBJ(o470d;Rh;*Kijva(o)G^x{+KFtBp0BM7fh9OHhWw zdv)dC3&moXHC`CL(-5;`t)yJn)*rO90i?kF#E<<6tBQ{W+iWjzq!=g5*`5pIND%kMu zf!taRn3VWb1;%S#M=_vvgS}x^ShiI@iyU6$*@a_-P*$>mDqb%bgY`NAz>#-iHh+#C zx+1qtUX>{e&l3-%-Ssv9Kzs2KJ6=Vy5+S8SPx{0mzWpx}MVEsiO*=PmpQJGk2V_ps zbR9n6%$$)?B0v|`j4NZGc)5!k+mk`e^;Ov=NF=e2`fhavY=b_>fvN&SB6gCZ+QAYD zWIj;4`&iVJo2+7v1grE@tq`Vv1GZAGVh!w2>-|*|u7{NL6mGJUsBo99WGMT!=WPW3 znS7vx<3-f-cV+Z;lXTK7jYS34v3E0bJ-NW|4iWu{)dxfk$pmhaJ;czJT2vR)ZEk)D ze|*F{(nG1jRZ>rXt9$~UbSCZ7`=Sqd>BMRf^wbe#xBPprX-{6H1E-&?Wo6wv5Dsvy zmDqykuwO8Zel=-Ts;JHZ0c}UAea4Yw?L!>m2?l4ph0C8$%6$Xj{PTCA_n6;up#|#; z1%J~;Un#NV6rf+^nUIq&(y-cC{HU(qNI72-8ymCO5{mBw)H#fW$hHIF!GI%vBgCj$ z56gfNAu$ae)&kbLm{?x|uSRjTKj@7xsIC|6d#ebXb<{T=NbYJ$CR^{5V4%>hYiVim zlFp3N1zwwAi_5>D8LE59It1fYrJV$e<53%9y+O>Oma+ZV*^IGN!MZ^FuV%d^q3-7l2<@5K9}|EhMj16u{VI4RWHN($TZ?U2 z)nfsvg4rL`o1hJb%;C6m6gXfY6tltqy-D!z`|RcWlxy_6SIj@l zHU!!NsxCR7=3)E=b2>+kT6`6jZ4;KVTGm`}t#qbM(#=+Vat7ygE@HUdu{5kacAEoe z(Ir>)ZI;YkG95e~Xg&?Qw`@5wEjq(P6>GBP1D#@G+5~s%k6)k4^nj+vaC&V zt~xHzBDePcssd6m%4BwAF0JbOdy{tll(-@dDhuze6?!Xu^<5>NuZ2)EI zWC!kb#zH?=B{`{n_5&%5AX!F3o;jC|WZ{5LUBM#)Zeh=e)0?3QKXt;RJhopxXV@4Z z<*=2Ab7@xp(w)3yf|yeynTHnQ5j|*|XwMij81CIcMeb!=#jM>8U4og)swC_LYinHg zPq~!Mf`$J5mx=@(*spAjWptdg1YP|{&E5qw&t+eRc$bvc?mh#Sbu-mscO=bn3tAd? zS*jdU7qbx;s7y0AD|^Y#h1d+72XJER;ZlXwtKbI(&L!hn5gmR~TKH2vj0mkiD+(gY z2&d$7M1p@mO{y^gtfqCnfAuYxq2wi1&{vG@vlGCza-r3FN5H$>!jhV84NUf5L zn6Q5Ae}jXrZ5nmt80Tz_ol{?mw`1&HB}^5S)cA8ET)%1opXnf(r^BI#Q4i;{(`WvL z-3SXXYv6!3A2C;vT%CBXj9#zL^uz6zA!biIL(+(rumZG)6)P4r(2{6zN~Tchr9g>Y zD?U#quIkvpPAfrX^L|PiwEbQ>;9#nch4L#FNs9wNQRAS}zz0}V%^k93`}w34hdCtA zn6Qm$Cd4KmHkd(oYB{-#9-s>5Th6UE#`as>3ZuATm9LiW*o_ur-NWSib%Y4@y@#H% zcj2QMfe|rmx!@yW9jsgS&xEpY=Lqy!1$G*Euh+J>|8#VyD=X{ifs;Jcz_99^3f6I_ zxr3F2aEzc1Z8TtSgZ1H8jM)5JKF7ln;JIX_rjkBaXa)EXXyY)H#V|O=Rf8T(B4$ zEl;P0q}Ii+7xkZFS~iM@iundv0;%R8%Gr5I#?!Xh>8$cT|Hqpr*2>d42iHIIjy3ZL z3Tk7kEBY17L!N7>A}-?CYPn`jzO1FDw5B-QD&TLj-hYd$t3vy#D<2x7)TU!A3VAva z7w?afOqtk!+4YCi`JSd#yjZsf<&flb&yZ9DIJF@nk;V!N22ys6dPW*r3(-5d(|@4i zrXJ(ska&m=%-%HFh?9@*+RkoEXhd5HUt$X9tVJq+RwQCS%hl-5b=!aKO^4;lb*7VR zYiJniXEHE`zfS8U$qw29hn4ZepHM?zi6i@`u!8G>BJwH0K<-UxT&e|)%t|uLGufA- z^+v<`K@9VKU)p&2IgQS_&__5rO}HEH(mZVwG82EGCBNCO2(hLR&Low*c9=bLH$0pv z|0%__NSui#PucnTeRztkzJgh1dUWN5wMpM$sOt1T_MMrWbkW z2;SII$X@gjs&;{g#!+}9m+aiFp?88?s%~TtT)t@6f4(rBL_hn+ z%h)u7Y0MqmVklOfS!#IPpHjOd$Yw=bm-7C2F!>GmJL*ism5BUVM@vh$i z6(ce8Xt{SB_HCYdKlr2Wwevbly#(66zJIf_o||93B{CE^^H*YN)>KYAZQ&_m;NWFg z8!~PiJlzHIqO#v5Qm~3V-R(=R;fHbttaig4wRR0CA~qZa;R2i0$b}U|tD5O&<%!|y z-f8>$ZVBOIfAsY?X9Y9B#LIlQ6L4KHv=i0K&wAMTP2E_(ytKJRS&tRKDFGAp~Vv0K6TI%!NO4)*84?<#Z`z}GQdoH zD0YnhLPxI?x`{Y1s=XR~6}bswam7Fs&_yr#x+j|%(wK}E`8g_;qe5a_Rg==JZR-`? z$Z$sqC08k*NoM}DBBDLYZ>moBqOdQH6(x?O_kyGBKns?BrG~0{(}4}-?`M%@$r6YZ zxHz~m)CH?I6Q+w)5Mns|2X5zWqA3k_2iIy$n#QlGS_YE*(GUe0L{RZTZa zKS2|`F9cM7Rbe1jkP{)1&P$-h0688!Ln*6}QsM+Bu5X~EG*eCsDCu@={c9aZCadfv z6#jG-!`Ds1`K96w6U8wFuG^@4XEItgtXjHE8^#!q=g$y(6yXN<*|hUibLpT&DW?8> zlK3$^SF8N;O1h{@)l$6d7=rX!Y>=`+{+bRhRbB-KJ z$)p~#8gwbi+N?Vts^ZG~N+IK;(=1f%UyS^{5!n^~icb^>8Q>-lC)!X^%uK{s5!A^D zVMGJ{$gu>n0C)9569zTt#%7KUVn-PN!b@MlJ-McQ>k8%|=L&zUPfJh397PXv4#DoP zRB%i}lCu{yf-5?EmdzF^NY1n7s#{Y3H#L^JY&p^7w@fJc*gYo23w{R}+92v=wbDoc9Js zob9AB>$3lN(?J^LBs}`ip<35~W|}#C^s}(!94f@?P%4m-3ex*mFt)rg1L<2c^gUNw zCbjYFQJ~Q0Q*(aK@%J+UQ-A&QpU3UA2h;PZ*Kc%#f0y6S2CG>{U|*pO@*mZ8PC5_Y zt8DLl=|MtI;UD*vl@aX-#sbXn@?fJu3w;oM5<6%+z#FYT%pKYts2z!&f*_e4jv(DA z3SpE?a7<@#K@v!7Vc-}Tr7%_n^cg5i7}*+vHwa3Yx&cuet_FM=0v|Nhhsq3p0pXV(4?|V`c`#0@i~r`;d(Z+6Y&WF2J7v??In^{j2OOpncLE=ILv& z_?-{M9mZS;H^fnN?)-ryC!jM^JXqdnk`vaA;SPD9(Pa3whs&9&m6gT*=C8{shcL6z zI+w?-P86=`Yrm7LCEsH{`t{tyyr_ZsX7`8*IbM|3G^{^b9Dk(p zrl(&St#&^KBo}HddD3ZIrd%xrF8?I+@OV2_Dblv=QfM3#%TGR3UWvPvtr_mSYEHZS z!>~A**A}H!!XkQJa+`LY`Z*&@7v^f;zGV2lqs_j1mFw9`?W>u0sz@8~+P0wO>d7~7 zc{Vw%5yp1Sn6tjI+_nGGboYnw^l0B#&(cs^o4eupiqDEs&wcj_)IAX!<{ivtQGRy) zL&Z!>X}-I6c2pxs^+!-rSyBW+@`POKLG$i&P7F=)g-_lEnCtAScj~+1iF)Kdi1t# zUw`(z`#-lodm9dXFE-e%RckKQ8Q3kY#nI_awU-$7@?7E_de|fh)`*058hPSv2yh7$ zGSF3Ql@8@!LC+cJKdxbGmk+l#asAwla!TVaHi>yFNmfb?EQ!3>g zOCURAzEW#{ard!UG$vY=ATOHt7w-a}oV}>1Y=N?qeSJg6ssKUCS*t5M(x6(e!F=Mu zq7RyT^7$`GM5T&jX_*9B>9N$*6-X%;(S^rH;MI9bGGSW&j&(NSvRMnC&Dh{$^7+QU za@OTeQZkOJ9&+VnzB5YoCo+D1vfnK=0VU(5Nt^dRQ)}uQ%ubr}^$IEBoNFwlU!gK- z6L^>zmle6pl`EP;Ocf?JqRpk$t{EJ$v2h6=ma{iZo7~9ELZtmZ%u26*PV55Hiv6x$3m}Jr9GSVz9L| zf%38soE;@13ziD_zeq@VR5*(p-h+M;^0^ao`cd?6`QJb8h`(*O^M%9lQgcbzaWd7L zb@DSlon@^5F)5K;ZEw%>LDN?kbQph-qLR;Lz2DV=Y_->GcI>|kL&&Hz?2R&3v9UQF zo3Hcd^JJo0+u{7S`?b=o&2=UsC5yqvflW{Ta?x^94Yv0qR8-e^e znTn3W&-~brn?mekz1AX=LSz1N(?huCe!9|QmSHF+lT}3EeKs_mw@$Cc|9F6|kyGuN zc$D8LfZ&TXeyXB8YX)mGo@SQB%i{2M;wzOv%>K6JE2Ts-Z`5|%=3=i*O;=#}yKS#= z_5Nta+YQ(0UHy`28J2_KXSfPOyg!gt((b&IQ--AHKl^Tj$+^i)f4?1G`K_2@1v+SY zHj!p|P}fBXYMXY{-9n$0;9o2{(&nx`le2xu0%=RVPE5;4oGz!V&4HE-haz5l^9bBp z&(m#f0+V-_%V0|BDLZq$f6h}aE34k`iC-=K<0@5d6VQ0^NznK}(!9^dy;YkVyvvHh z^tMt-1yxo59;`SWzX)z5vy4-2`}{~br>$B!Mm{5J3YDf-5%buXO`3QbbVQv}QAX)8 zcZup`-~icxijB-1A3-lIqUVX6dMb^VA|zhfp0yi^Q~sO5)pU4IdaZ7Y-9m>0FCYB~ zUW{4uurxBP*)vA_QIs|f8qsp0V=z}b*H7|o=Lb&3#p)c?g5=12NmWq@G9k=SE*I0q zieg1VAGgz$UseTZ?2%uw(R&*r-A8dL_+F1ky8fvpE6w}y3*~3p&{v}!6S~1wsJsHGX`oh^0WT|c0h^0*J*?< zP-1+2URI1C(-CcQoCixbyae+y#4DFE+H_#u!Qbb%I=n92=vpd)C2YQ&aEo)=NN*reU&=V0?Ywoz3rP)3Qa2RQdwiqBWHmtyQa# z$DXLehHr!;lta{dtK>u-eP$?8zuwoOM-2avF#4K~V)OTdB&6Cr5zA4EJE%RDff8 zfLUa7u=_OCblhQ@9ZW|reU98?Ry!U0oMt<#qnp(nX?2XZnt!o7ZrIHaO~)cmYg-(9 zOxNo)pn=t~-s0NNs}{S1fm9R2Ml;Dq}PH!Hx=#_mEN!iCVZ-q8LwS96ub zi>jly!_`4~%4^@V_P?2oE510uBD9Y1BtI9tQD=F#2tv+ zowy><9e)w%0S0N8IDLrQkUsic_gy2AuFHViN4+h03y2+pZgn9p+TTPC^B*EdNBSQm z{GWV_e9BYe%dvQKe2uQsFAegp*`>wJYd<<9KI5WKcyoNw_(TKm~XVtO2LM2O!|jtvrdi4Z%=Q3N`^<$kX5ecmcc!jsjiq zaqu!Y30?uG!8z~_co)16J_H|uKY?$-ci;zb8PtHQ;2O{*`Wa}N{0jc&5EYY^1Gg9r zvUtrAE0F;p7BmJ;05tXAy$@HDDIK%|ni`p)HE08J06GL7_7OZCKu6FCbOGH!chD2` z0tKKD=zi!6`h$UB5Eue90Y?GdCHH|bU@RC19sm;oy&zSsVLZ=NI{ZOmrh(~TCMXB9 zz#K3a%m59scE9=rhlvo3v=>#qaNCa1w$;0$;hoCW8>JKzuCJ#Ybh06qjCgHORl@EQ0V zdCp)El3&JOSl*bSZozvq)9gpUKw3vYs2UU&yT zeXn=Ppu|T|LiggY;5Ts7Azm??@!%3g&;+_OZNLs{J2Vh~DENJ6#t@DLaiF#{z4#k| zcu?E1N%-klPYP%R?f{KJZPzx(|F7MePF!u*w!vT9t#s+%r-(fKx>NH(Cs5nDUGaAV z-GT1lo}d8q0lH&rJ5_h6?#y98cj$1SJ9IR-8~naA$3sB2k09U#2snwWlfg7F6U+j$ zf$q{JU@6dD`2^72R|PhK&6I*J52fs+6y1@#z_VZv*bDZ91K<$Q9r_|T3SI)o!3l5@ zyaL_;x})C$X91n;AKVvlKL=lcFTvN~68IMU0BXP$01Jd#iaP328;y{08O;%Koe~)SOOjcTfsJOG$13id!(Yn|(K=1tEJ9iSP| zbYBKE*&`V4{g{bkR&Shv1(b(!dfFB?+S0A)ob6W^nZ1=gs)c5CX*Nhhuz47lAPZruOX; z?{E`%g4p?Cth-b=(PJt4*)CnhVRgr_T9e1Q)A+BTuEpEua$1QBQk&(HSdDS=rfiZ( zwMS;Ct14gJkAH@GP*4X`XHT=w+)rKT9}6Ws~wtWZbScNw}6HEX!B#kzs+f zPM4|&<#qXjiq5E>Qc^;x+f^7l-kcZeBHIvk{z3Xc)_i=C>JRwdl*fo!C&k-U8@#K; zn~(0iv7J+WsBB$TeTWRA{CxGgv=O3*%Hyw7=oj2pKF0TG<%}zGjTBa+wJhKkQmLbj zyec_Yxx=oKYc=XCuXx{-c)9Xykuuaq%&-~8JtV2b{_0M7Lw%>(s#5$D)nwTz-=SJv zM|G5z#wQqDT1x0wRjFo6Th&;#M9`K>Ok1@}Hj-l)`HGZV-GxOki?LaKMtCwYmCB{= zp{zP;i~5|J!bmwx6_GEOoI5FNC#?uqPpL{y!nUV`L6VD=yJ2dsWRPncEjcNlaP5>D zqBg5yYS>mw$$Z(MrpZ}tcaKcdD7*|~dIM1ME`*X7pTe}-qcVsVb)XH!l2c5hs-=eg zo1+zPbks))@0&hW0nKFbXh9Y`JCXY zKA;=V5&BB4Q0dZI^;D^B<@ktc4OP~WV=(y&R4{fFMvL8eQaOxKGKrWK9EBK7Sutu8 zO+Eqr2lH1zzHD-CqpWST!mX;*YRQ7u!K%MxtCplGmo##1p(QV2+JW1rFP>CGsbNbk zRr6$xnj&W~bm^0J_*^PYn#!FVG4H9VTBTZ{Lf@YjWzhzxI+R9gs(uBhKOnzIOB(SK zD&kd8bs*Jj;n;{zwS%g6!wgd>Ges^3{zj?ga)YBBXGmK_6LM4*q}T~neZQ#~sM^-x zj0xs`M$rDJFo$R3pw4M|iiOHv&e&c{ved+iDpylwFMNMSdFhE(##izjC%@0AuhkCK zgwgV}YGv4r%p{9@ceY&ZJ)BWJ0@dnaGL|#D+f^guewj)PHult53i2|X|4c1GszeP} zBbZG(soliqQ|F&CX}6u0G$GchhH%JzJZUO0Z0V(%sSNn9q+^n$WH_Zi4KSDxqNbzLvHHLbb1XFgWB#Xq!vSAeb zwE9Z8hpKAsH;9rtLc={aBTFink5Y9FRl^aGH&NGUZCA993{8!kZpLXpU(Qj<>N)5Z zY)p}_u}1MT#tD6fGD_%8swSn*H$QII7u2^<7mD`0^>`puFyW zz6>^UWCfZ9EvYGob0c@FE(*Jw#z9TiV57MvYhUAQKUp`bHtG$DQ+13*601JM4#0QP z#t1W(P}()@A*>=CW_-bT2;tm9qWYt>AoMqNQN?2kB*4fv>KJn|47o%d!}h~9nMS^i z5N?(%!id64D$iKVgJ2`+uMzVdL->e_Q?bfa536ZvBl#wf^E=A=j#dPzqqM=HMpME= zGC{phnrdt%W~+U)-?E`8Gxs z-#sFi6dPDu7LJXhLhBn@C)HPy_NF&^cGU^#uc|v@}a8yQEG)BKS zsVCGbwOp-MTbVuDGE<**q%85ba4l_GfhpOQSmU@~N@WzkQ)DqMbQ}}c1+iZIM18C- zaGdJ{^(hOR=4NR*&&#*{nKwxl+17x~tX3w&=u;Vqt8`|Ea(R{2@uj$a73=kYE9$cP zR{cr+Mg7S1c#4_-45RD|O1Z%dI|%0J3Wl*>s>Aci%UqBhEoA|MN|qRX>b!nQI?5fq zD~4l9LlYw3=wP%r+JTNnn$gloHCh>&u(ZCGu3D&O>JD|MN@IcY2~V1@7}bgX7Jq|E z%{v%$`buhO^E1qP&&g}@M}L`FMy}Dt=xOvadL!3as?MpORfN%kGH>6;4Fokms_)ew z)mqhx#oVvZ_-iJrzv;X9QPrqR>Pz*F`iXhElBeVjW~7U{L2(rC5jRKe0$DQ7#t2gr zNn#9B@OZ;jVL+cIM!M13$T2z@U5y}CI6axuKWC7Vq(He!q2#ZoE8IfL^=hSBrXEv| zt92?vrSinigm!beI~O`i^qBkNE3777mgC@6mX1vVOLuc<^O&ygI;OX+R@Yq9eLY|n zv-u1)9n5BU4dd}VoT+dc1vxI5uFKf)KWlYevRZGTzSb^mnr&t+u$_7LC4WzKHwumZNU;VPck!hBjMYaYBg4oeAB^R8?6$aGw^;QpJ35=L zV$gGy1VwLQ!Lpr)!x5Ud+3q@Gw>k#fT@℞!XJ# zW|GfyqJW|WrjOnF$7NK98WmF}j(%clE=V>Zzb zVG($mn#mB$W!CM)r+Baw)3BodLOSIGj{qW276%$|6-bbPa{FLD91Nb@dtp z>}F%;MQwm*O-{C#fF=QQTL>tM* zoyL0-#o}!|Pq6o)eTCsJ+|Qudon*Uoh?V|a)=?GAAk}_$=q&}(9fip5tbtog2FtxH zo@1TJcUlwaFeZWzssrG8?r9qx@-$D~eO&&|;`X^z;IGyj%y}N(GETB~d!6Uxby{`F z;gSIBv4L18@2d(`A2mQ-R}bd0s_CqHk$H`svKMo7@=;Zx7BV(USgjZFJ5kLido&Un z8#nbJ-7`f^22;6K%%X2N57-AtaoXnk(q?6txgAXuOw{An^wsEkK&g!6X+Btn%iWwH z%$GcV`$`cvdp+QSdQZKh&Z|GDkGPi&*om)JFQ~KrUU;5W+q1GmcFBGg`_q_GXE0K> z`13{3)gdYn9*gGX>nuyqci}pdd^NUlaxV{;5-^5kS|N+xKGJWZ!=}et2Wby6v!xwx zd#Tcb1#&8jk+#vY=K+jG-OIh)t0tYaRr`0yc* z8;&{L+C-ijBWUtt+~NZiI!UHev!9Mus&zZhxLof!tl4(WLCmilzr| zh?%Uv+i+Xa@(W*uIL49j!*W1gVD5Sh?wl`6tv}|SG-j@;D zdc4f!;^WvnvbeU}lygj|>q}}nY;&ErS)Ij!u6J=ZSzL$tw!)Vv?+00p3Brr&Ur;Xn z_?tirncod`aYVqmA=Gu)Wp(a0U2_eq^MK(xgEKYEwUh%hTkWo+cB}Jb0NVCe=TA1* zDKZ>3T;~m|tDfm`ZBiarIO4$9ald5uxwFGnOhUu$ip8mPx%RoN?+m4TMyZjo+(>oz zVQcGr)q~orY_3DPi8j|^oQq+u>(uugM|}ugwz>M^%(r2z&b7g&T-S|EXF-IkuiNUJ z>2$5)MqhWjE;_A02gDjpjT9r%@EQ$`X3Vm`s2iNo3}mi!?z6j2)A)FYE6ZVZEj2yP zT&F85!0Ni!^qlL*IJt|F(jOG>H15h_72kycRbulnje49D!(3BCtge~XOjnlSagL90 zO%1iWijB;l1B#5n#t>tuG0Z47hErv8qpi`+=&P&5V)15@%{N-|=z_jF7oE-MEK@~U#E)LDP(yTrEE5HkygB(x* ziotkL4l2M>um)6tYOos|YQHY$vh#I(XTb$<5nKY7!Sw?@+(F`@Y;icv7DljZ2Hj z!0K;IaMRpKcTCgJ;M}G$5xuh03YunQMnuN-$|z_WX-kW-xub)_!h3o$-J#K$G2y{6 z?uh6hn=LxhZsW9Ggf%kCaB{YkbOAB8(0bWM(;$x-X2TQYaV7<~_6FF4gIWhfhk0#j zkkW&GvDb4(hL~aXY}o}4XHru>859?j5#a6_(3+1RIgDJJH!LHD zaCAWH==yj1PmOw-<;J*UnuU0Bn?^@=&%bj}(~PXhnEKr_1~rYb+{tHadU&!hiJBD? z?umBm9L|_Pi-%KL)`%zx2o4S82^SD;3#pgSH*Ky2=bJ&Ez?7i$h8%qfN~fI-Eq6vZ zJ)xlz&biT94a4e32i9|9{P^;?{6Y3Wlz4(1^`kQaTs;EPX`@wgEe*pmq6tR_q(^(3 zMr4I!3OBrYUSw!Y^WgBj#t^kj(;sOS)g8lDvztQ#5*QDcJa z5H--`^EDCH@MtumT!AsR5QrLFuZz(*FkI_2b}<6O1CxT&lAI7V%^BlPGMk1w!(46& z4-7FwgTwNY+};@48y>8Q+GU6%FsV62^~Picg!FW#IRj~Mo|)v%iXj~1Op9&UG(0QJ zi|y=;{HV~VjKJ{x#&yE``gIyJ!=oDZrNL2V(3AjQpX+c4Yu22 zqiAqcc(^4ZMw~$*fw8tAXB}H$oNlnk^w{tOdV&)}(vkw~A;D<@-e4NcC#pii^|?DU z)aA)f3T_x17#A4fGCgrL*dCmi5gcM~7@Oq`>JyL_s2iMbCIx5JA?yuEtCQ5slO5I| zHYPH&OC48CW?*EOV#n@bRg2Ti5MP|DK>tx4-Mb>p; zY=dt^)d?~q>qL62o>+09852i?>)HeBcu%M7n$&o8ot#AgP%0+Qmgok9Ja>4AJzNxGN~gR<)qZs1J! zHcoP7yW`_xqO-cy4T;HeMt4h&cMb2CG$J{>y{m5H;n^dS>zYY1mJn}nxVwK;`w*wM zeT+LgKExFtq&aj|n zf$>32P5%)#ZL|8;5w<(;Y}hb9iQ}UUwT9K+`1(zoG)+mvJ|_BTCpc!s(Hnh$)T0ly z<>a)yYVdp4P5uv*sC@Sp*Av=XXN$H#aZ8OE-dbIAvGg zs}GR+PuX#hk29cr6vA)l*Z93kBgaMcv0n~b>f>$3?^PO;k{UH`o`T(n#>vT)nUGK~ zCW`YjF?H%{rLJ2ljU^?6dUWmGt9!4$1BR1k@UTu@I~QcI5g$|UZXL@&hm;gra|!j*mq| zq7>*qaQa`;Xbg68h%Q7QG1PXH|Dn+s7#^n0@o)mmZ$yhPM)B1nH264;<0pc%db9N z$_YI}Xfqaakc%nRlqzj>Mk_PM#$bUy3Oh+y)uN(_7Du_oYg({XVwjvoGD$VoQqIw! z08M~YZBO);He(A;F6K!Kj@%MctIEg$CdZ^a(W^|))7sOG&z+2}->tMnyB_Sy# zDKVZA!e_V8VI=_gsZEnN>qUs_Uf(jAP_q=rp7_Y@pJORU@uM-Dls z6{uvq{stQ1K)#ChAG8_Go?;&)TAR_yY2*+mBi7%I|F_zVRrDHPZi8aZS2Sb33`>N% zZ=L;v@owui^2HsDNOR`a|8=bYM6Xc>8t%0u{72nJ%ZH}@_qvVs zZfiEm8%6_*V+-QV0KQ1(u>X^0V}3xbW}|t?>1gA)t=kyT+Y$1%1@%VW_HX}lG+BS3 z*8l&qTkih*`kzC#NPEY#{BP#MbIhyt^>{liZ-4*r38N-X92YJY4np%z!x^xjIW^BR znLR~A3PSLfp+{)QTonB>33YF4Jc82(tO?Z_tnVh_f02|JUXm{gbev;cEdIfP4a8Ba z4cNsKJkTo9j?47|(Gd(x5D91oT8TJwu>9MVV@3lB-vcI~ruGmk`Epk9K7?v=x&D;N zqbEZ9ao zug^}u-I^xW1aXC7Ir=_k9I2nDuf+4?O2d=KPt*9*O01nF+>O&t%qp>O5=(;E5~Y5s zPQ9ISeodr(8Yx`6>BRa zguc3qeMWJFq$7dW`4hC$4(UDVylg;l&OPqqU=~h@}ZxU(t0){j3J2?tEpvY1H4_gLY6=maw-e5l$B1-Dt_bTuv*OkZ@t9NM+@_h-kVljTV0m7w0E?w&Me_yljq2gXkr z^}qw;It(8@dX%^O@QD*g1$W4f9qRjXr9?_Y1d=LPx=v$gk4@BbrUAD zeYnqn!<}V-HiQ1WUzz^PEfk>@`nAEhc$?o~`7P7t)$*JDGa?JQ_%Mm8Ew{A&w_7sg zW=M0c^x}#WcQaS&P;&~<=Kywc@%=BTq5%;daC?u}^JvpyE$}B@{KunOtL?A*$H&nU zOM6O9Lbpi(n0-+!r{I6^#b|+r}=nMYcrs8<6O$1Xx?FQp){Byy4PyuQ; z8kgW-3Vy%YxQ1};hT{hORbUg?47P%5@cWI&-GqO?`FMzM?FQsA{3pSy;B{~coCasW zSx~zPc>({w+lc&{YnQ+`;5+a=xD2j<-=9AJm9XBZlny8v00UTn71)3sAk~oo5D0>R zKAG+UwWrg=@JE115Dk8RO1&=OdZ0dN01`kVXb6%)3TOoMDfY&o3DBq6n}Oz_1xN+y zAOmCqeUzd#Xaj0bylef+?w}{=3-oFCp!@i|}hK#=itC1U*^a^~=RA0-wc z%O48`OnSL5d*zMVn?(va#GA(QNeP_P>U zzpi9yOA)h?K&MgBND57-__lr})0&{(a)N?qBMfeb1akxh&&Ib1adE*qIX4Aej;WMZ zO5PF0C}O13hCyV%OojzgHAc#2lVpkv8Y;_B_@t68QaD)3UZbE9(lbStouLU65!SbB zE_+6jzYj%SmToBTospGZK{o3U8veS=%BAaD@9 zg#g6xt7Q~=M+eaYc#jO55lY(B+ejM^;%_UX$r8R15)7uK3n)0$r^R=pTl5|j97#b- z$&LyH8`{o|$v9Bjb8p39627I#?FT}@Nr<5*acAQwc4V=jNLNGNA4olqJHC_Z=Ol4*Pwg2@ z1=&<_K)MY^W4}LBf-HNR+Q-NxX-^QMqloRlEl zpG(P$;hQUTd@24n>4(LH_7K*p66;7CPUveS_H&7ACPC_)9QMkd)?ArKjiqR08a0j* zbZ^Fqm*5B(@O>_oP|(V;aKQ@B40a=B75PU<>u7N=K55j@&2wqta2TY7=sOG0sq0RP zYyz{;?P^J_BT7{2klVC#-$f?d1d?}@?xg9>2%i5no4{I8*HzLfP4repq_LcW+Y42Xu?6jnktkT4L%m`rT%cwDUi3@W!6q}%K)Q?YUuk$H=a<|NZ!l7M#5!mu zJxrQL;x19{b+60S#2M0=EL+eq98OUt>Z2)y?;_?M3K~i=mGHsCR5E~p)|vQquvyYN zE<6llO{VUAlJ$cnM(`BsjN6keZ7AX)YD%NlVJLjHqWCs`)+-!=ewt=?|HvIpu@ms^ zlyN0$*<{rDhLe8AP=O_Df?Cm(p~Ug5+x4^@C&x4tG-)ICi) zZ?Hn!vT0PYM)tQfmhI)X`_Pd7kkR=ewGW2zIx-D(#+Si-lTQg5Fye=@2|`-sS*^VM zB04mK80{a@;m@JJI7c?1=kePeMop7Bs6X~5_#18C$N7RdwSyW%35BRXk!26cAaT&~ zHDdO_DTBz|jxKvqiVhoBdpp%Mlu3qB#EWP*&Y}Db6mu6DpQD{cBz=)=?nlk(K{|0HIq$;P2Y)_w z+(S$n<)nK?#6 zp+T)C>le%#HBtwayxHkGx4&Y{=sN!*H&G}?w}{yDEDqjhn*NO8LH4Dls~VNc zTl$_i9ARi-HRA6M^qqS!|2D&)EOkiuPwJlM-h$Q#cns~Amt_mDzCjZ68dSZl>3PGE z#xTlc;B;d;?Zzz7`j*-q<@`g{b5C0){Cr;edP(=6gC6Y4l+jVzk>r+|Cpw;P_u%wE zcgDvY_p!MLjkn8r#7t5+iV=H%MZgF5!QX?yaQbx=`D#@=V-W$KL%sG#j?kQCUGynW zC@Z?5(Xy>!`D-}CL!tg#gEe7P6>u?ptdKK%8T0se7hG_w}=;qE(M zGko2o=XD2T3sp`A5!#%pR-5zOc%EUSx!tY|#csJlMI#`@cvAjHRZd|KcT7O=xh$4l zK54>VQ^_)gwxtE$d1b zc7ZJij<#g>L`!yp*k5<2yW*&>2 zTpm2x6w#L7Y`=nDdoH7;dBZUkEx)lm=pSYdpUoUK3;#5kN^5TEX}UA!iaUFeEK7s0 zTQW&!G`BN~4DzqBBe}85;}$u9*pUr`0N-F{2|GjYwwC6(c2t_dqFJjprbCxji}d_= zTSK#UaNJVTWNt|-oCH}*dI!5lS6bb7eQJ-nU(fyP(MaEk3hApT5}x4qL|jPBllsCm zS~`xodI+=Z2;32;T`>=G!7_yDY66$a=&9KhIYB0bg;TNbetDqMc7q32F%PbR%ol_B z9m$36((Zu8-7(VTZto4q>?rxf^_Srnq-+=u0rWPDO?Uq21|aSApGK zV+@8_A7s2dK*JU=>Ca9Ih`EQ1|4xZ=Sr_;O{+0Z7mM1#$Hqepb-XW}X7V->QK|RxX+|Gih$H9>^{My<}Z75LM|5<@jE;wxeq(g~; zV%M)O*SSHk&UA?M1e5F1-lnfeIFAXj{x>L7Iu|OrWPAcdFh0uPVK@|9^Ro-v2MC$kE&Oga4=Z|Mix3%rX7#(qVv)hDvzzP1>5y5YRU? zPVbHfFV`FPS`^STPc|L2qK68~%y22ta)H9`a)k%H{=BH{=K|j~mFIvK5bVL#yZnCn z0O9S{L>aA(?+mohlub*_TQY%XtrO*nsdw>r0WBfeihGK6)s+M-570t@r-|u_y9rlY z{n0`JZLy~_&_any;(OyhX-TB4y5!>9L~;#R@BLR<;^e2O&&acpbXqc?1pv))y|{@W z33MQJo>8s8lKQ!p8pMGwi2KrLDa(@yv>=c=QIcY9>3r&9ZUFkXAqW(}1yGL^gM-<% z535+)-rbg-$ktlThas zkPbc070cr|PZ0gIb%mnTug{YF4`h3g!is|H$)>w7n3RjXq-c%c`tRUiXARQOS6km5G9Z%%tS!*ubIqDJyUJci{Z%Pg;Uwa@g4MKn;k5vJ zY2d8{7Zc8Nub1KB^7@4DgPDseQ+L}2B*MD za1^}A^+VtwH~{t&w+DAO?hddWYz0pdw+?p=?kZf3$H5Y?h`9N<8uP$(FcypfrJw{9 zgCU>@6oLZK19SsjK}V1WI)EII4cdY>ARVNEmY@ajf##qYXaep4iJ&fs0};RlLO?JG z1WphDOz_(Y3-~blD+Uq~aw2mETo&mc-tz2sj{-vM-l!Ni07!-gU&>VO{C=hV*n8-0u z1iA#e=*w|MRUxpC)rb8qSUU%>sZh}ym<-DRM~Y}bGmwfzkKRm^5~`1fKq zC)WZ&5C{e#zy(5q8-xK52nP`$5=4O*5DV&nI8Ya8v6~k(0P!FJB!Y$@2_%CQ&bM`Ob0VMNUdS(@>zsugE_uFOjRp7@;ywx%<6i>88Fx0CJWs!UKf6sUPrf=bYq9Uh~?sftaR})N$T_7RppM*w(Y5 z_$`};i%9h}+pjg`UCTT7FYLDVC47MG#$@$2F~>=gOt-Tu1_;ix`>pHR#}?5GT+^lRqs~>NeTFUPo7~IO zl)s&H_i`e5C8^SsmP6?DtNb~-scPyv&(*WE^9Xw!Z_6B7p=q;#{n043f&IUipuopa zxU2e+lFw4|bA-F7@7X=wz=7*ZO7xLu8mGQr<&AR!_AR2+R$_jHehbJ^O}-y!`5Ly- zgVX``A)cX(%hH&7Hz4*s#kJR{Nz<>I_#e63^~C=~J+G4MFulB!9M5t`huE}vn%%?| z)c!be`+14i6h4A)6=@%b>N@5K?iO~2o?=IKp3J9)&E#8x|2#Xu^C-W9a$MItFOs)4%0f%67CI0 zzm4gV$rMt-hS)clEorJwup4`iOvVJnHe&unYbwZH%^h6vx4e?x+{bRh4nj53L?M=< zth1DRoSL3yySkc`e}V^|VCVZ!T+=-Kyu3^b&BI%{GL}@D>&`;WUHG&N;2Yxi;jSfa zFVxfgw4d^RBgZ0cvI4*6;l=d$d-Tmb%3nZcD1@|V6B3a_XBXK3e5C~>P)ovyB0OYOLsCSXjpOJ?=hZ%wOQqEh~H+(TTMIAxpFo@3* z*M*0_fd@2ypPDZbk{3CayAzh!O6A|uz)Ir3 z1A01mfhO#P(RMCklSfO zpInCeXOS6nmf=dvG|x(k+Dv%3x`>SFpjrTRr?ZQCQF2rpb%?wJWdY~?w?LX-sYlNc zPeHU_X`QykF+sh+_V_mL>lbOG-X`Wt=7Me1RznMRB31d7E60fc3im78s`=s+_q3Z5 zHgRPJztu=fK7v=baHo}9)gFB$Tif|qF3*&5OnpDWXStaj5M&-r*o|-d39}}#hI-~f z&4rZtDAe6V$L*ko-ITMIR%nS>iJA*dtZD{x<1_Loul_@&CiWT1UQc~nN%=ib58c+? z%n~!8(mHbHstV?xg>qn#T--?+YoO#I=D?5i)NpSocejA+!H9_FQ)*+b{|Kj^Wp3*% zr3jBU<8P)m623?Mk>6LaKCp#6DbR5_=boQIc+nSgQBBltVk~MU_whEpxEa~bvxpYg z$b;%db{seJSs&r2#uKj2dGjRJfl6 zPeIimpi0#RLwZ}pW|nOrc7^N+lbSKlFir1==m)sT3L3VLu6Y`F0XMRr-&IIiV$@Fz z%!_nsLj<<y3$xFVicJ>xoKF!D?!CQx{zt0P7E|7k!(Ur#;$MX{pEF_JshUx9 zJ*09CIXvE54dej%Fbpb;;C%aV{2e&u?zby5)>>oHT%=|78yP|C!D?Aqs;=Jjtdu}? z1`?N&7Jk_?$J&_w@MZ(Xc86fzqaSuy9>v!rh9+2`M{@)w)669g>lsgfPLyR zxOq+E$KEm9>Eo2ji;rwfSCR`Q%)$Mmk3&Ci2PviYn{42I*Abe5L( z&*pETJmRz(d{!;Yif-Rb{t$Teb_{rzdJoPu-?;|ezX3lmbWhJUYbdaiUan$fKTWX* zj+ySA6Xo0{o)X&$AEfZApQUUkS6`ABds}_G<(V}mhR7a#fs5fP`jXY>RSkElv^>@6 zlC{RUn>qbSCezi-=*PLyV?61#p2*SW0Xa`l*Y{>w741cFV3ibZAn~R)jy-zGx|`UI zvTMGz>~S7tPss8Wd_-Q{>#MAn?_R^bZ{&`7F;K-RbMrn%DH)B6PZNp=rZ)chD^R{S8SGPTQc{lQhc+qw)TiBFE$I`S#2Ej!LbLs5rqs?8nd zkE(He#I$jh;q?}`|1J~9CD`P;+z7Q6Mlr&^>uL2pC6&7^HFWD%Cb6STk4NF4J>LYl z_c(3ty+`bxeF*$7hB_nufd92{OR7^{ooM%1Cfb+BFgwOFGe%9c*GML7)#GG;52Bxu z7mgY=7QOV|M`?c`3X5wz8uo7wbU!=L_|b8QxpyCYb%?urh0b{acbDvqHlub#n`tag zqmjy)ZY<;)yH#OBDCzy!;lrM&Kf?P9?Bm8Tl@!=9yXJ0i*(_|!nC<+!#m5@DzbV@T zF9#gruFv!LF3+-$p@Fsmbbva;Epo+ha#!p8KEj5>?*8zk6kddWHbV@I?Cw^n=j8*8 zv$!tWje*vP2AI3*d_;`SlJ=3jK($@P9m;vg0(W=)uuW8aPBd@e&)D^HDJqMsroSv(FcNjHo!R`*xYR9ep8vcy1HW%wSK73Zxo+3LeyU{_8DSlmx{ zw&Bq91Jjjz%Xbz`+4}a#j)@j25A|)8H})agvG52j+rtcVR8HnA`7pR_J;heZIvXEN zwY#5TlQT#PH#6g{`PphgE26U4VCncI%c-YO+JQ4J1i1eM3$C$yJZtPiDD-28d&g

*}eR4_#f;@9i3J-KUmensE_2yT2$SYa~9(XV0{QD=+O+ z>Tgi9N2hg$TwCpUk4n&x%2gEvM56YdsHWxQvo3zjY3$$$o?!Oepb;LzdU#^r<`_Hq z74JsD{$TnegK+EO*i*70o9#^B zkCfoqv=)05a9~YhJNeBmHr(BZe7olxllbJFokbO=Z3mTfO8N+Tb$s?n*}yhkC1fr# zR}y0Vr^qRLG=3n~u(I}4XEdW%I9`45`V}VF#q;C1G@7xwe`_0mt{r+=JV-|w({qj^ z6k(*NaQb3nkHz5kR>tR6Y2DS(^ZM_8>jbzb!37j8s|QGetD(l3H8AJ)Ye@kY0u4KE z{BAkw6txfQaa_{&+ZyLDW?B6ldT9+30!I4=vEuDr)%&;^-SeV&bwKxD_miTLE?LaQ z4Mej-BzIe$#f~+j%M2s?wf>+#%$G+)vEmUeObd!3gb40Ng^+C2QsiOvl{DFyt9!4w zy+BRgXD*s&wBI2w5#>KbL(kB;x>(|x%V>|WydKrco@)00IPvak3viQu&33FMWpcl4 zHKCd@tb6GE`snd@^mUo;z~G#&weNm;FHPpN;cBbi^6JFyXQXkJf7<{kS&Ae>qIy$W z&st0n!tmX&KSYfA?%8!ukCs_efT%BGZ_;%H!Xx~TBDA{fO2lb)n_2S?M{H$nrBZu_ zeU5j7Nl4)q<<^k@cw&V*I=fMZ6a~ulTOQ5) z{D)4oPw9}YSJk0bdsU4>Guc`KKb>D!K-vsrJ!ownyLC@;kXgP(@ z+K;-#h2s?lHeai?R-AsZA-FxR2g(hAqS`r{{;j|m`YysjV;H`NM&=CEAh!#}!z)Pm zoMpAI>|Y^VUcbr0liZv*i(zG#jYZM2_adDc>RmjW#+JV4Q{GTW-N%Flg*&s0^x(bg zwZ93;#2K3HBHfX$aPyB`1xL6ZkPB4Do*WMB90EQ$RJMyx9nf3?=7T-%xEbpB5RSYr_3iO&jUzVx}YX4PBillUNI* z>gxP6Ap9AMyO>Lw&Vq@4jdbR+MFO+?5fCJH-hSi`G&|s^KJ8KNn%{HF__1agdWr(7 z(lzBWB|B&6r#a;i&M;dOtSi-4>SDu38fh`UOJ-N2M{G3`#9<5+2JwGmVv%zH6$F28 z7!QX6w`b?iAt;YeH1bCWKx#60_VY>>mw6qoMv=ad>$-bNqM>16ub_uFyZURWeVD@B zP4(xAn`&;|nGxFsH`$VaGsS>vYuqokmbERWeIT`L}JXud= z!Pt?oA1>e$(&+dp{4mtG2t}WORK0B8^Ym)NRETX)dMgE+g#{s)%D`vz*#_=UITD%qJ;bYn1agO4RDXk`oSYKHbnq z2jTm6WxSMze;k=r2Cr(A)K_=)G3DduY^9nFR{Z33QzwKws^K zv4uGQq*JyiiYq@v8M_E*%g-)mj{d49;w4L02tbn@ikX^99?Lsl9LsAsv{u^p?s;)? zEOrbTJwCm8GEA^%Em>~hYhSU_g7RiDaHVCH7M4jcM(h)$?*|;K zk_}nm`pyd!sm_z#)eDuZ4DlKG_=I&$b4z&IJD~9Tn#Eng!i~zJuQH6MK@{lwvKeEIYdX^5MBGg0KHhvNc@Kre zRXYV^DcO5vlcOOJ2FV-q-0tHoc049*Mi6{5JRI^CG?N9njU|S(j5g@hk}6Jo9S{KD z;W!q_@$}H7*+5a{hc8$94Yfxkr9ehXmm zH`(Qj6R_I=bzob#fppX2z-yA+_9~gue@i1~!067u=7MVpJ9^4%nd}N5QB`9` zrG8VFEgBnCyw92*PpeThm~9h8W9{zg9wp1_!+Ujoe;p;WsggAiOuH@Hb8 z{DKD9wXLg+fx#EwPP~iG*6;JQUXRtPJ$LnqT(vEYFtE?>DSGUOU$THBL~Q4?I8r1f z+$fBq@(0;3AHRJ;OGQclidz>bnTvDnk7vxIjr7=s$d1SxXm5}bC5hA>q>{Sd|Assi3p=*Ba8I}m)~)?p%z+n=UdldI7W17He2(0oS#Qj(eb z%NxU58pB*HP!Ei8kZ&Tq;gw}_-lF^jDZ_MA!uqCIjO#b>_($Lium-WgRZxD~58!2| zs0$qFg0046fsN?GoUF{|exmQfT|{;dSTkl@L@KNw=b=Qbo{mcvtg%I=K$QLn_W<>k-xhR=yg7-Z zbf|EFyOf#_cuqC)POa`$2y#SZ_z35Wjoi!Vl+KRXNEuMKAGQ|WhPDcGZcf&A7w89E zqp3b`wqBw+r$X%=h{L|a77Y}Rc-C{GFu`m*Z>D%)oDaC?R^5i_&iM)pWxt0t31j;? zpzTMB+>5hG>KX4AR*am3v_bm}8#^y7X8t0*Ik1U0PiKfAhVX{^8hr2f{wvm~S~TLB z&NGl5^9|{l={h!_@Uyxr!qG#wo1piB>PeIdwahQHnN!;E}0m{1aK$kCv zv0o0C049`~-R_hX5&2Tv{&k$;O3IzI2vgkKU%0b8G39hAvJ&vW)88h{OH(2SC9(g4 zF){O_WKGDQ=0yJH61z!?+58<@cxFfj(-edaFNB@xLYYYu^>%PV#>Go=~>Ip24? zQveeU6LAWbmY+do5GvU#gNp;8LhqGDPQgMNM~K_Y{mG7LqKxoI2Wd)*_7^YKf;izf zJ(&VBeML_gC`#Ccv5!EfwU|2{A*C;-K+x(WphGr_qd}|E&T{qC!5KeTqeHvQI}Itc zmayg2)Q7caAttv~tRmCGu9lEassLO4d>?2mmVOM{qci;*>C4%V6-DYn9^wBL*U&9o z9;_uyKUk9?bAmO0zArDgR2wJK5s94_ch45s8k`a^(%L*xMH4(`cVwy;DP15v89wry zX|Y0Tk=mp`t{fj(WBj2yHk@~`=1iEs9-`o@LH^v38Z4963rtj5NZ7T+UL;i#O@ZHI zc(yIg@JNUQD0(EfE8;M}*S2g-M%ZWGfb6o(TKPIzK7~D5uCNM?pQNe-YKnjujiqwF zOLHRDP+GPH5LS$IEpQ@ld5v~FcRM9Ik+#OF7g1QK-5)qb+zN@C<0)aIz@0nX{M+4Q z!m+U)!`0#uQe1-UOnA0P(%bgMG=pFJ@{zRsy0$`6K>lYd|Gt0(!?9M(@Ezuh4 zY&nkfq?nfSxLcu5(By$K6RXwn&x}b4ihxm(LZK;&oa?U(N@>Zp2EG`7vt4a_6-FN? zl}Zv_+NjcVXV9}wdh@ZN6`vL}v6&M;O_vg>n^LLj7TnXN;9>6cIpbIbjv^fN#Sp1= zkl5xaL~gFhd0`A<|->5uZ59d)Vn_$ zBLPK32!XZLnD;DiFSGwMX-ATotd3Amggrh3F}Ac6w+=zrsTqrhfA~!3k~~+QVt0L^ zpZN9HUFU8j8D=Rc-_4bZF<>c<)jDu`03e3Xj3{YQ!5?ko5sQ-u3UBO%O?73=qMaYb zC9aocPSY-%b-+9bX$qmEt^W#r@A&N0bEXd+J)8dCl(e&xD&4I&hYmz0ZOGI_o50@C z4s6J_lwK2%z*P6#5X)-6D_6m2GK1z+7m$YcnkO3h4T~ z8r<+S6fuLkBfO^p(F=VR5}#3|_gFB$IxrQ)lG9w9y<-~{onR2P6`fZxuPt^H;$YC% z#7!DhS1U4i72O4?5K|Gi6;lQ@`M^06moi-Wn){Z29MN|vE z%PbEq&6Jz(xiBrRiHk0jIFfc`6rmICj(Byj^9@1PVj9ujP*8XZ(T<6~L7ql+sn9GK zXd~a7{bU(@VSM_?+Ks+UChfH9VKg=FetR_xCiV)U+G}l67Leoe4l?I;g5*r{jae;R zK`gpfeLE zmPDa>cgOh~hxvUA&OgT>k~wW5#{i%G)%^v~;}R;;l1@*Rc2qwej@*`hL#+s3P|itVC(~zGp=4F5TYsxR@`#15ISC>+n$L{8*y(_ zRCOND4?I7xsoM9dk}h^bvb(*4edDDMwh99$yH;-7z4Iv<-uh(h+&b^p4qAnI%*6SG zwT&|bCqZjAsBiVVRj^bA=za$u$Ss!&eSvKB-S!D;`8ctMTEOCM zJo1t0zEW^(d#1taZzeqyt!1=S!WOy)nTB~` z_;~k>Hcy6NDwnG+X|&I{K-lbYCC!7`koCUmss~3 zp+v+F>n_KEv0v+(ZxMv6-+fj`w&y08Yt(;xHg$fFqtNL73|@kHQe|r(@Z$Y4@rSOZ ztih@Bj176k&K&M86SnSO-z3qOE#+VKirS?rh$`E7wVL5GNtzA>)0~!MyxkP}OAget za5&yezOq0vZ07cGG&YNQlqxwh`mTqp#q4+8s$sJS4_v}p7W#67PwdqhUzx9B5-(@! z`W-uq>g?Zg)Q@v&pJP#OKJNVEGb7>_2Z-xGGM9dkd+5+?<~`4|#*mHmlKLwa5jL~I zN!meSWqQ}WDE;7v(NCSzg?pUfY14`vBi@1Ub&fj$icaC50joD{><^vgRHsauR6S8Q zjEm)`-GXi^cOTuI>Gt?e3$7WkC1aDWC2zPdiA|~X zkxqg`>do!o8Z?WQkt)<~O-3MD&}*Dwrq_#3rjvrmBFD|H_u-)d;;FswVp?C{JWi+Gr^nUx59tPwfjJHksIG%8$bv@YG|V&`a{%KgyL2#434P*>!uC@ zj#EQLOjT1(jthO3)>*!@HS|-D(Su<&cGF!;@;2xmJ`58dLD~N9UIbzhfufX3tEW_p zvS3!PGH_Nj3w-tcpZraGVU)VsBhKh>W2AkCzuA-2kY5!cnTQhOaF`)@1ZxR7EgpCk zW;X&BypCk9JX2|p{0o}o2pH3ngG12`RD9DPcfD z#uByIA_I7+>lFQ;4_Q8ism$LRP= zp{-OBEO_G$U?H9qb8nmVn9DC~88Vasl0~7&UmqEJGh`U7f1qj#x2rsAY=izth$U^y zGIeB@ZrOl*=|tp(G^7+^*r_Qg*sSMuE~q&>B3fQ34-DlZbjI_tSWueVNedmsWGjpm zPSTKoSSnAyH%0yL(%e(lBTjia?1H>j%I&jk;uIH8OzQ5Q5y_?)@225}xSh=rr$cNWHVEERN>&C}IBT;FcP193tu^giDz z@N|2f!7VSiF5R$U0v>$ln|(d`gX^wa8j~%ke%q)cI29d-S0q z+y?tM=Ykr~@Mh_+PiCRfuSz;;qz#Q)lc?q3bQ=V&c*)Y1t1OyoRny#b1zeu zj)_F_Yl5Zw_;}`>DnZ?rH>a<%;bXNE)|r8DJk0Aeko6N0g;h$jlC&{?<(W)b0+d3G zdi9CAHS4Qg-)!W43NFp$U)vtsBjHWnQ_B5A#KaOj9(9`-krfuE11W=NE-^%QTe{rq zno3&fU6vw``CWGMUmM?(ps*B}2`x4Yp4-;}G1Gb|6fXgG6&MprB9uUCdOa!lt)9Az zg{OVG9whUzNY%lMT~{M#!>d<}yjU^=!Rb0J$~YM_X?r~^Ru9_y+m>+~X}97+3xz3) zDvB_>6F5I2N_pja+kD~1XH|FQDTp&m$r>#TU4QRCEWr`+x^(>BLMz~@#4Jk4pGcV5 zCghM*B#_O%PsMjjAlf@RVOF(w_OpThd9L%lh2Qb%7{DMvlz9UpzaewX#voW8Uhfxw zs*q|ki9fD-fXf(=ZctQ=#F(_L{%hlHV|~&)d;cv!{exjstSZ#G)?migcm_(gDE_Mq z_vh9}v((>3L4aJE1i`|ZLdEZjl3y7B^b>MqN=#Xu_6vpVlM1s_zpRZSM`K-f2X2Jj zbX))n5x<~O=w|qzV3FVwC9gU6Pz~qfvk(&z?8`k0l(i*2MZ)26ef!Dm#QY<%{32n- zGqlCV8dms2I2l{yU+Z*HbW}JML}#@nZpcj9?$8 zNowzB2&WaEi_$B2$tDO~dKuqm2>`Ll`?w-@9C`-g#W>4STi;&etlKjo@#$+Px5k)yoz&I$e+=SD)HZHWu4SlnmIYV4*ndA=fFg7tP)rN)}uS@Sz(+NcpRzW6L zBYPklA6@WB!gOe1f!^hvT>z0G5}4nwoQ__dEM|K;#M`JJs#pPPrWpbDM|NC!3vOvJ z0CIia23Fikbz{W&;BI?cEqRS_mXJ2aSVw|ejIaTfU20I_DvtJ&)Heb+ zn0eGFfrLZEywp+Rm3qlHgb6ZPE*bCluo%-s9!rx2x{+5jc9hLfPBJREYI zl~E(*=dJKGSF;R|Z z>vdpbyOZRA^P#P&3LNH;J5>3bGeSZ=o=y&&0-**)@A!d{UdM5v8@HiN3i0c^zbmge zR}(qb31t46exlPE)ncDZFg-F!q71VFUILbqtS^uePW^5=eCAemZ?2LD|8TYhhwjw= zihL$sgX$d#n9kWW_%KlWg4eKN*`~hgMQlI+9LkMSM&_gvN_D5Gql;Kuz0JYGBZB~nj=7`9VC`DzRSf{(G(?p zM_0X_R&^0eadj|#v!T6h9DU1~ovj5NyfAVk4WjResfSXSZ@eUo8qpPq?q+!aeWQH4 zk5`FD>85Yr#N1wxD(3t;h+pa+E{qa#1~?u%VKTqiT=;ZieELH58MZGM{@WM25?G#G z{5t=UeIZ#P34=XJ3q_X+W8coDGhU2_Ac@eb!^Nr9C9Gj)k=6PFx{1XjZhZc7i#$dp z>425Ly?BrygC;I{9>GhssC{pj$wRg|EA5xkzETHi+7Sc4;L5(!sg$LUscqmfgfbg% zAk2uYQB5O#ea}VJm5|$B8ooq8g z_%Fr&CXugzx`&XR4^h9#N?ZGuaH*>wkDe2`;`9F?U6NqM%Uk^SEHP$auotadex+PH z!@iM5Jn@fL$ts{{eGhdn$bgD7)5gP+7(}|XCuNitZ-Q)&Ph>FuDWkx*chc^Xc-YR3 z1~Gx5if3|ZQ|?Z$<+<-KqC_j3@_`3XoXC7pmv{CM4KL&PMYN1cJB0`InWv+E;8cl? z?HJV5@Fes??-R~xZ5>PGZqIh5=Gks+F}1F`TLQr|fb$eRDRn0DRycu*kB#9ommTCmfv!|hIu$kMgjhi| zZHq$$wGm!01GW^#CA6b=#ys@^W%hn89h5M)*@zfQBC^-_Td-rn#(%4Z=ICLpegBIM z*g2+0;OOFG>a~=G_QviRvQU;9U4Ww2O`EYtHMR8w5$VV~tKFG^nSw^w$qv!^$NdHU z4VSv9N=FyM7e%?xO)IUm#vTA?c$czO3lrP)DGR``tKSe?8YDQSh$(uPjQnNS-@e@vl3I${L^ zkcUnL@RV&HGJqB}e$JF)<`G;qqcNkoOb{8A`5=+8CVG%7;^$(ZuoN1)f zy6RD~E}6vsXppSDBuM{(fq7cCeEP?AE3)WEP!v6+QV(wV@S82 z2X9u1(UR7oeN+8~dHcZRt}OI{HE;R_f!PQADyo&%-epKwV@~``9k~SXnhR z;?k8%+5}aFJStHa=IX{W7FM}B><#7YExv`IM9BW!>vH-`$a4Jz$Ju7%=6ILCZjmLj zCfE8SdB{lzC{tZdi_L_APk@g%?Br8ePOGh_s;-LlNh8>tADfZwT^@jd1sNm->#&NP zKITw7lbv%>Jy_k7lwbzYhPZ%0psQ0(;i-*A@3H>B+3Q`*^HJq-TV$>M15eUYNYeeh zk#^a!CVUT<4`lC68$n@Cc_?Nu!mIzv8EA<8V3=EHRZ(kOKZpVGyM0?q;sU)Y`NYt8 zk4fo50L={PGXjo#6KH52`N58B49tff8Hr9eF89sAK*Frf*HF$(%|gS14hs#fKJIe( zPxwdS`C0Q{uhbDzUu5ova@iZXj^yNUrW+Z~?my!l6s zGOr)_6^BR1uOxjxWBwl1lW5)CT)TO=xw`_+$VM?S;zE@_6ZT`-P$5PTcLNSDXSy~^ z=Pd5bKRUWZNaCObGucq{+_-Rk+puq3b3Hts7(i+Fy1BeBIzQKGab4n^?syrOkTx9{ znwV=eErQ+*w-(hs)Ta$PFamJNKE;jS)pSM zc<1?I*HBdC0!wmkqCk&Qi=-IJ)ZJw)3D#j(S5;M&`bI>pP5R!B4VFascG|IjI9_Ud z=a8}7?gIi5?6I-@kni;-&so^HBB<%XBhjkz?-?JbYYGYONibvs|4RrpBi6xz)Lvbk zLA~Mwt2C%#g8@p4*)xE$oYADaa0P86ma}8s>1NkHOra*oeym8$jN}?bkE{0!P{vuO zde;z(kttCJveTHPWo+Z4=m0qXUQ9x4+l{B8vE`)E^!qoj#Jj-#S?Mru3JG6>z|yI* zwz_yLEM*m4M!=-kOJQU%eIqkPR_`9X0P5RU?B$dpN?aPEb zq`q`_eJJtGK++GVCf&_KOu&zr{*x;eYrgtk3Mc+6!-xfV;h&boGfw!n!|Yq<8l!xh z=)4LzQ$r|E&cw3OOQuwJ(seUIC1$?qv~HtN|J_q6;`k-`p7F7vR-+TH42JrZX4x)d z6=T&AZ{hn-bX1jsiVAAG79M-8!iHJ_69)x928S?<4@Jd`a2rp{&t2fTiG#)9dSE7K zN;&vF`<86_*~~4I_R`O!GWsle(^71IM>)h_K9zhGO&O`tx{94JkG#a$Df|z@F>Z_P$?v=-fhld-WwU#w+u8O?lp;v9_(!S_EC|GkEam&l!&3t_9 zo2W+xip>V3_@W&yiY1yrrV~6wrUK}0YN%i7@)t-rzhSg1s4*wV^JOiFZp`XVBz+H6 zP8hn5zP2V|{){$x@z4g=t*VM8w&wPgKH(vJl{rz68Nyr{9-+yDI6b6dGcvMTxVWFc zP$ygTU{vwQ%}3cB6E&BXm4yXaIOHQ$k&tz0UC(eR3`R3D`Mmi`)Eqt$w!in5)+#N& z9B~x6jPd`?jhvbJR&-!VVSh-gF=67dcy+mKar>K@*_N%foMU-;TH8P+T4Lo0GHv?U zoBt)3y^}2P*M2`;1pb84!qQT6Zc#R|SbIrrP4f}tG30lDdU68-k!kg>-4_S_T=>Jf zM`%Wb?Jlf6H>*KQZx(=+6&?Q5rz7%vHXLr1w>9)kO}&4)EF+84)#g+2x6Cbqg82Hp zDd*sp$pa{&{w(O6z*m$#Et_OZR8vb=U-c`=C#<-GPBEwKjRWU>6=z^$gkX9)u^zB- z%syo&bfH>YNTMvic>3u2-ktY1@4O3~z3q`hF-cWLc&vRR^TyfjVm(%9`2ZKSva<5- z9RWT(ER2I%T^*4MUby;#dJ^C4oO+5@qSH3fmRsvlv^T8uVvxYwB5SGO$E zn)T7nzDSY6YiV-4qUO}1Clb5zPbKOMEr~fz$w!x;dpgruK4Acx`sI=@T&4$Kmk$?j z%cT1In~i3qFtVCnDkY@N_|Cx@-qWZPCE;D6v5O8eem?F~am(5%N&CMa-eZtcLnJ`Bst69f^RBYWWj1 z^9G>Xnl4)fo1!_&xB0}Blm+$q(Y^5(OyOjLt7i>$ebASN*6gG*u;z%&*~O90GV8_0 zi^F+7V1R*J1n^Kzt2Q(;Gs_u*&g$|%&lcB2!4?MsQJPOb}YC=09O^u;eGv`GjxSmg|A&3Agi`qDP zDMcF0>J{Z95I;?PuH)X`_TqB3^u+n#2zaR^>T_V|on6jyJ8S+ux^ynMxh8Zym#J>` z5DnMYpfT!)s=x0J;3cyEB3-GfK2(00oLvJlRJiu*=(--S2A7P3JTb%FfG5g5q{ zO$am$Ga{1Ex+F;2F}oa4PI`8JQ}^>jKs83}zfkq@)XwHM%P1cX9|^QFd5^ z41CDH|I2^XB2p&0SL1RzI(LQgaNP=>8-<;psJ`vXlM@@Hv-ITbzPu=n<#@ez*dYSu z4m{4h=f)CzLd+Wm57&>Zgb!G z4AGM3=Vk*o9x*03COAJ)RN9sSxtF=+Zu9lacrq;&)0e9H4oH85Us%q3p{SyM@+L#F z{#)+7Oi2o0?;tqhE@gbzO)V!U;akZzTR=dNz-iIrvkm8rihxe=Gu_D@(%fHchL@d} z4*qEpx#I(~p<6G&!(Y-enM@%sdX;}JC)g*qDQ9dQIrc{@)U8I{{mGX_B8+i literal 0 HcmV?d00001 diff --git a/tests/assets/WorkbookWithoutExtract.twbx b/tests/assets/WorkbookWithoutExtract.twbx new file mode 100644 index 0000000000000000000000000000000000000000..49fc684af5208df28a07b79ec2ce41d9b2279985 GIT binary patch literal 20782 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 literal 0 HcmV?d00001 diff --git a/tests/assets/simple-data.twbx b/tests/assets/simple-data.twbx new file mode 100644 index 0000000000000000000000000000000000000000..bf8ad6df361d6012275905dcaf9247e7028e6e3a GIT binary patch literal 19615 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 UsKOZO80k<4&KCx=gLTvW2M;DxH2?qr literal 0 HcmV?d00001 diff --git a/tests/assets/usernames.csv b/tests/assets/usernames.csv new file mode 100644 index 00000000..b300c1c1 --- /dev/null +++ b/tests/assets/usernames.csv @@ -0,0 +1 @@ +anyoung@salesforce.com \ No newline at end of file diff --git a/tests/commands/test_publish_command.py b/tests/commands/test_publish_command.py index 9f91a02e..0c9049a7 100644 --- a/tests/commands/test_publish_command.py +++ b/tests/commands/test_publish_command.py @@ -60,6 +60,7 @@ def test_publish(self, mock_session, mock_server): mock_args.replace = False mock_args.thumbnail_username = None mock_args.thumbnail_group = None + mock_args.skip_connection_check = False mock_server.projects = getter publish_command.PublishCommand.run_command(mock_args) mock_session.assert_called() @@ -84,6 +85,7 @@ def test_publish_with_creds(self, mock_session, mock_server): mock_args.thumbnail_username = None mock_args.thumbnail_group = None + mock_args.skip_connection_check = False mock_server.projects = getter publish_command.PublishCommand.run_command(mock_args) diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index 9afd8b63..c29341d0 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -147,6 +147,7 @@ def test_publish(self, mock_session, mock_server): mock_args.replace = False mock_args.thumbnail_username = None mock_args.thumbnail_group = None + mock_args.skip_connection_check = False mock_server.projects = getter publish_command.PublishCommand.run_command(mock_args) mock_session.assert_called() diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index 3e70d78d..05a9b6a9 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -93,7 +93,7 @@ def _publish_samples(self, project_name): arguments = [command, "--name", project_name] _test_command(arguments) - def _publish_args(self, file, name, tabbed=None): + def _publish_args(self, file, name): command = "publish" arguments = [command, file, "--name", name, "--overwrite"] return arguments @@ -201,11 +201,11 @@ def _list(self, item_type: str): TDSX_WITH_EXTRACT_NAME = "WorldIndicators" TDSX_FILE_WITH_EXTRACT = "World Indicators.tdsx" # fill in - TDS_FILE_LIVE_NAME = "" - TDS_FILE_LIVE = "" - # only works on linux servers or something - TWB_WITH_EMBEDDED_CONNECTION = "embedded_connection_waremart.twb" - EMBEDDED_TWB_NAME = "waremart" + TDS_FILE_LIVE_NAME = "SampleDS" + TDS_FILE_LIVE = "SampleDS.tds" + + TWB_WITH_EMBEDDED_CONNECTION = "EmbeddedCredentials.twb" + EMBEDDED_TWB_NAME = "EmbeddedCredentials" @pytest.mark.order(1) def test_login(self): @@ -333,7 +333,10 @@ def test_delete_projects(self): def test_wb_publish(self): file = os.path.join("tests", "assets", OnlineCommandTest.TWBX_FILE_WITH_EXTRACT) arguments = self._publish_args(file, OnlineCommandTest.TWBX_WITH_EXTRACT_NAME) - _test_command(arguments) + val = _test_command(arguments) + if val != 0: + print("publishing failed: cancel test run") + exit(val) @pytest.mark.order(11) def test_wb_get(self): @@ -364,6 +367,8 @@ def test_wb_publish_embedded(self): file = os.path.join("tests", "assets", OnlineCommandTest.TWB_WITH_EMBEDDED_CONNECTION) arguments = self._publish_args(file, OnlineCommandTest.EMBEDDED_TWB_NAME) arguments = self._publish_creds_args(arguments, database_user, database_password, True) + arguments.append("--tabbed") + arguments.append("--skip-connection-check") _test_command(arguments) @pytest.mark.order(12) From 2567208c3f719e201d50c3c774cdd20cbf53c913 Mon Sep 17 00:00:00 2001 From: Jac Date: Wed, 12 Jun 2024 11:19:53 -0700 Subject: [PATCH 21/22] Ignore deprecation warning, with explanation in test file (#291) --- tabcmd/execution/localize.py | 6 ++++++ tests/commands/test_localize.py | 20 +++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tabcmd/execution/localize.py b/tabcmd/execution/localize.py index f38995cc..0d6a4b04 100644 --- a/tabcmd/execution/localize.py +++ b/tabcmd/execution/localize.py @@ -82,7 +82,13 @@ def _load_language(current_locale, domain, logger): def _get_default_locale(): + # c:\dev\tabcmd\tabcmd\execution\localize.py:85: DeprecationWarning 'locale.getdefaultlocale' is deprecated + # see test_localize for details + import logging + + logging.captureWarnings(True) current_locale, encoding = locale.getdefaultlocale() + logging.captureWarnings(False) current_locale = _validate_lang(current_locale) return current_locale diff --git a/tests/commands/test_localize.py b/tests/commands/test_localize.py index 90bb4851..2ae38ba2 100644 --- a/tests/commands/test_localize.py +++ b/tests/commands/test_localize.py @@ -1,6 +1,8 @@ import gettext +import locale +import sys import unittest -from tabcmd.execution.localize import set_client_locale +from tabcmd.execution.localize import set_client_locale, _get_default_locale class LocaleTests(unittest.TestCase): @@ -44,3 +46,19 @@ def test_en_smoke_line_processed(self): assert translations is not None assert translations("importcsvsummary.line.processed") == "Lines processed: {0}" + + # https://docs.python.org/3/library/locale.html + # c:\dev\tabcmd\tabcmd\execution\localize.py:85: DeprecationWarning: + # 'locale.getdefaultlocale' is deprecated and slated for removal in Python 3.15. Use setlocale(), getencoding() and getlocale() instead + def test_get_default_locale(self): + # Our method in localize.py that needs to change. An eventual unit test should call this method. + # loc = _get_default_locale() # doesn't return anything: need to mock _validate_lang + + # This bug on pytest explains why the proposed replacements aren't directly equivalent. + # Some people online have solved this with manual string mangling. I like the pytest decision + # to wait until we hit 3.15 and hope someone has implemented a better option by then. + # current call that is deprecated -->loc = locale.getdefaultlocale() # returns ('en_US', 'cp1252') + # sys.getdefaultencoding() # returns utf-8 + # locale.getlocale() # returns ('English_United States', '1252') + new_locale = locale.setlocale(locale.LC_CTYPE, None) # returns English_United States.125 + # assert loc == new_locale From f0aea2180718c563891d0acecf29d265c07bf528 Mon Sep 17 00:00:00 2001 From: Brian Cantoni Date: Wed, 12 Jun 2024 11:39:57 -0700 Subject: [PATCH 22/22] Improvements while working on E2E tests (#293) * Fix logic in test_list_sites E2E test * Update dependencies - move TSC pin to latest 0.31 - relax urllib3 version range to avoid conflict w/TSC --- pyproject.toml | 4 ++-- tests/e2e/online_tests.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7a818c8f..3144501c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,8 +54,8 @@ dependencies = [ "types-mock", "types-requests", "types-setuptools", - "tableauserverclient==0.25", - "urllib3>=1.24.3,<2.0", + "tableauserverclient==0.31", + "urllib3", ] [project.optional-dependencies] test = [ diff --git a/tests/e2e/online_tests.py b/tests/e2e/online_tests.py index 05a9b6a9..6b502280 100644 --- a/tests/e2e/online_tests.py +++ b/tests/e2e/online_tests.py @@ -468,10 +468,10 @@ def test_list_sites(self): if not server_admin: pytest.skip("Must be server administrator to list sites") + result = True command = "listsites" try: _test_command([command]) except Exception as E: - print("yay") - result = True + result = False assert result