From bac5fc32afd6cef6c7823a13b9462dca169de59d Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Tue, 1 Feb 2022 14:59:59 +0000 Subject: [PATCH 01/14] Reduce Pylint Warnings Reduce the number of pylint warnings found from executing pylint to move codebase closer to PEP8 standards. This mainly involved disabling line-too-long and import warnings --- installation_and_upgrade/IBEX_upgrade.py | 35 ++++++++++++++---------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 6ca8ee45..4ac907a3 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -1,7 +1,7 @@ """ Script to install IBEX to various machines """ - +# pylint: disable=import-error import argparse import os import re @@ -17,7 +17,7 @@ def _get_latest_release_path(release_dir): regex = re.compile(r'^\d+\.\d+\.\d+$') - releases = [name for name in os.listdir(release_dir) if os.path.isdir(os.path.join(release_dir, name))] + releases = [name for name in os.listdir(release_dir) if os.path.isdir(os.path.join(release_dir, name))] # pylint: disable=line-too-long releases = list(filter(regex.match, releases)) releases = sorted(list(filter(regex.match, releases)), key=semantic_version.Version) @@ -37,10 +37,10 @@ def _get_latest_release_path(release_dir): parser.add_argument("--release_suffix", dest="release_suffix", default="", help="Suffix for specifying non-standard releases " "(such as those including hot fixes)") - parser.add_argument("--server_build_prefix", default="EPICS", help="Prefix for build directory name") - parser.add_argument("--server_dir", default=None, help="Directory from which IBEX server should be installed") - parser.add_argument("--client_dir", default=None, help="Directory from which IBEX client should be installed") - parser.add_argument("--client_e4_dir", default=None, help="Directory from which IBEX E4 client should be installed") + parser.add_argument("--server_build_prefix", default="EPICS", help="Prefix for build directory name") # pylint: disable=line-too-long + parser.add_argument("--server_dir", default=None, help="Directory from which IBEX server should be installed") # pylint: disable=line-too-long + parser.add_argument("--client_dir", default=None, help="Directory from which IBEX client should be installed") # pylint: disable=line-too-long + parser.add_argument("--client_e4_dir", default=None, help="Directory from which IBEX E4 client should be installed") # pylint: disable=line-too-long parser.add_argument("--genie_python3_dir", default=None, help="Directory from which genie_python_3 should be installed") parser.add_argument("--confirm_step", default=False, action="store_true", @@ -59,7 +59,7 @@ def _get_latest_release_path(release_dir): client_e4_dir = args.client_e4_dir current_client_version = None if args.release_dir is not None: - current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) + current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) # pylint: disable=line-too-long current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] if args.release_suffix != "": current_release_dir += f"-{args.release_suffix}" @@ -70,9 +70,9 @@ def _get_latest_release_path(release_dir): elif args.kits_icp_dir is not None: if args.deployment_type == 'install_latest_incr': - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") + epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") # pylint: disable=line-too-long else: - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") + epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") # pylint: disable=line-too-long try: server_dir = get_latest_directory_path(epics_build_dir, "BUILD-", "EPICS") @@ -85,12 +85,12 @@ def _get_latest_release_path(release_dir): genie_python3_build_dir = os.path.join(args.kits_icp_dir, "genie_python_3") genie_python3_dir = get_latest_directory_path(genie_python3_build_dir, "BUILD-") - except IOError as e: - print(e) + except IOError as error: + print(error) sys.exit(3) - elif args.server_dir is not None and args.client_dir is not None and args.genie_python3_dir is not None and \ - args.client_e4_dir is not None: + elif args.server_dir is not None and args.client_dir is not None and \ + args.genie_python3_dir is not None and args.client_e4_dir is not None: server_dir = args.server_dir client_dir = args.client_dir client_e4_dir = args.client_e4_dir @@ -102,8 +102,13 @@ def _get_latest_release_path(release_dir): try: prompt = UserPrompt(args.quiet, args.confirm_step) - upgrade_instrument = UpgradeInstrument(prompt, server_dir, client_dir, client_e4_dir, genie_python3_dir, - current_client_version) + upgrade_instrument = UpgradeInstrument( + prompt, + server_dir, + client_dir, + client_e4_dir, + genie_python3_dir, + current_client_version) upgrade_function = UPGRADE_TYPES[args.deployment_type][0] upgrade_function(upgrade_instrument) From 0b726ea81f7f0b5c1d1f475806b79a4058cc4ddb Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Tue, 1 Feb 2022 16:15:01 +0000 Subject: [PATCH 02/14] Extract Latest Directory and Client Versions into Functions Place retrieval of latest release directory and client version into two new functions as part of refactor. Add descriptive comments to script to better understand script behaviour --- installation_and_upgrade/IBEX_upgrade.py | 62 ++++++++++++++++++++---- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 4ac907a3..4e14a37d 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -27,6 +27,29 @@ def _get_latest_release_path(release_dir): current_release = releases[-1] return os.path.join(release_dir, f"{current_release}") +def get_client_version(release_dir): + """ + Get the latest release directory + Args: + release_dir: directory to search for releases + Returns: + the latest release directory + """ + current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] + return current_client_version + +def get_latest_release_directory_if_dir(release_dir): + """ + Get the latest release directory + Args: + release_dir: directory to search for releases + Returns: + the latest release directory + """ + current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) # pylint: disable=line-too-long + + return current_release_dir + if __name__ == "__main__": parser = argparse.ArgumentParser(description='Upgrade the instrument.', @@ -34,19 +57,32 @@ def _get_latest_release_path(release_dir): parser.add_argument("--release_dir", dest="release_dir", default=None, help="directory from which the client and server should be installed") + parser.add_argument("--release_suffix", dest="release_suffix", default="", help="Suffix for specifying non-standard releases " "(such as those including hot fixes)") - parser.add_argument("--server_build_prefix", default="EPICS", help="Prefix for build directory name") # pylint: disable=line-too-long - parser.add_argument("--server_dir", default=None, help="Directory from which IBEX server should be installed") # pylint: disable=line-too-long - parser.add_argument("--client_dir", default=None, help="Directory from which IBEX client should be installed") # pylint: disable=line-too-long - parser.add_argument("--client_e4_dir", default=None, help="Directory from which IBEX E4 client should be installed") # pylint: disable=line-too-long + + parser.add_argument("--server_build_prefix", default="EPICS", + help="Prefix for build directory name") + + parser.add_argument("--server_dir", default=None, + help="Directory from which IBEX server should be installed") + + parser.add_argument("--client_dir", default=None, + help="Directory from which IBEX client should be installed") + + parser.add_argument("--client_e4_dir", default=None, + help="Directory from which IBEX E4 client should be installed") + parser.add_argument("--genie_python3_dir", default=None, help="Directory from which genie_python_3 should be installed") + parser.add_argument("--confirm_step", default=False, action="store_true", help="Confirm each major action before performing it") + parser.add_argument("--quiet", default=False, action="store_true", help="Do not ask any questions just to the default.") + parser.add_argument("--kits_icp_dir", default=None, help="Directory of kits/ICP") deployment_types = [f"{choice}: {deployment_types}" @@ -56,11 +92,14 @@ def _get_latest_release_path(release_dir): .format(", \n".join(deployment_types))) args = parser.parse_args() - client_e4_dir = args.client_e4_dir - current_client_version = None + client_e4_dir = args.client_e4_dir # The client e4 directory + current_client_version = None # The current client version + + # Get the latest release directory, client, client_e4 and genie python versions. if args.release_dir is not None: - current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) # pylint: disable=line-too-long - current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] + current_release_dir = get_latest_release_directory_if_dir(args.release_dir) + current_client_version = get_client_version(args.release_dir) + # if the release suffix is not empty, then append it to the current release directory if args.release_suffix != "": current_release_dir += f"-{args.release_suffix}" server_dir = os.path.join(current_release_dir, "EPICS") @@ -68,12 +107,15 @@ def _get_latest_release_path(release_dir): client_e4_dir = client_dir genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") + # Else, if the ICP directory is specified, then use the latest release elif args.kits_icp_dir is not None: + # If the deployment is equal to the latest release, set the epics build directory to the latest release if args.deployment_type == 'install_latest_incr': epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") # pylint: disable=line-too-long - else: + else: # Else, set the epics build directory to the latest release. epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") # pylint: disable=line-too-long + # Try getting the latest release directory try: server_dir = get_latest_directory_path(epics_build_dir, "BUILD-", "EPICS") @@ -89,6 +131,7 @@ def _get_latest_release_path(release_dir): print(error) sys.exit(3) + # Elif the server directory, client, genie_python_3, and client_e4 directories are specified, then use them. elif args.server_dir is not None and args.client_dir is not None and \ args.genie_python3_dir is not None and args.client_e4_dir is not None: server_dir = args.server_dir @@ -100,6 +143,7 @@ def _get_latest_release_path(release_dir): "ALL of the server, client, client e4 and genie python 3 directories.") sys.exit(2) + # Try to upgrade the client. try: prompt = UserPrompt(args.quiet, args.confirm_step) upgrade_instrument = UpgradeInstrument( From 7e1d3b636126834e01912ef6f0fe47f1ddbfda10 Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Mon, 7 Feb 2022 15:15:00 +0000 Subject: [PATCH 03/14] Refactor IBEX_upgrade.py and Create Arguments_config Refactor IBEX_upgrade.py to begin moving logic outside of __main__ expression into appropriate functions. Changes to reduce the quantity of logic handled inside __main__ expression involved creating an Argument_config.py file which contains dictionaries detailing arguments to unpack into argument parser. --- installation_and_upgrade/IBEX_upgrade.py | 150 +++++++----------- .../ibex_install_utils/Arguments_config.py | 67 ++++++++ 2 files changed, 128 insertions(+), 89 deletions(-) create mode 100644 installation_and_upgrade/ibex_install_utils/Arguments_config.py diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 4e14a37d..04a3b2c8 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -6,18 +6,20 @@ import os import re import sys +from typing import Tuple import semantic_version +from ibex_install_utils.Arguments_config import ARGUMENT_PARSER, ARGUMENTS from ibex_install_utils.install_tasks import UpgradeInstrument, UPGRADE_TYPES from ibex_install_utils.exceptions import UserStop, ErrorInTask from ibex_install_utils.user_prompt import UserPrompt from ibex_install_utils.file_utils import get_latest_directory_path -def _get_latest_release_path(release_dir): +def _get_latest_release_path(release_dir) -> str: regex = re.compile(r'^\d+\.\d+\.\d+$') - releases = [name for name in os.listdir(release_dir) if os.path.isdir(os.path.join(release_dir, name))] # pylint: disable=line-too-long + releases = [name for name in os.listdir(release_dir) if os.path.isdir(os.path.join(release_dir, name))] releases = list(filter(regex.match, releases)) releases = sorted(list(filter(regex.match, releases)), key=semantic_version.Version) @@ -27,79 +29,63 @@ def _get_latest_release_path(release_dir): current_release = releases[-1] return os.path.join(release_dir, f"{current_release}") -def get_client_version(release_dir): +def add_deployment_type_to_parser(argument_parser) -> argparse.ArgumentParser: """ - Get the latest release directory + Add deployment type to the argument parser Args: - release_dir: directory to search for releases - Returns: - the latest release directory + argument_parser: argument parser to add arguments to """ - current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] - return current_client_version + deployment_types = [f"{choice}: {deployment_types}" + for choice, (_, deployment_types) in UPGRADE_TYPES.items()] + argument_parser.add_argument('deployment_type', + choices=UPGRADE_TYPES.keys(), + help="What upgrade should be performed. ( {})".format(", \n".join(deployment_types))) -def get_latest_release_directory_if_dir(release_dir): + return argument_parser + +def add_arguments_to_parser_from_ARGUMENTS(argument_parser) -> argparse.ArgumentParser: """ - Get the latest release directory + Add arguments to the argument parser Args: - release_dir: directory to search for releases - Returns: - the latest release directory + argument_parser: argument parser to add arguments to """ - current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) # pylint: disable=line-too-long - - return current_release_dir - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Upgrade the instrument.', - formatter_class=argparse.RawTextHelpFormatter) - - parser.add_argument("--release_dir", dest="release_dir", default=None, - help="directory from which the client and server should be installed") + for argument in ARGUMENTS: + argument_parser.add_argument(**argument) - parser.add_argument("--release_suffix", dest="release_suffix", default="", - help="Suffix for specifying non-standard releases " - "(such as those including hot fixes)") + return argument_parser - parser.add_argument("--server_build_prefix", default="EPICS", - help="Prefix for build directory name") - - parser.add_argument("--server_dir", default=None, - help="Directory from which IBEX server should be installed") - - parser.add_argument("--client_dir", default=None, - help="Directory from which IBEX client should be installed") - - parser.add_argument("--client_e4_dir", default=None, - help="Directory from which IBEX E4 client should be installed") - - parser.add_argument("--genie_python3_dir", default=None, - help="Directory from which genie_python_3 should be installed") - - parser.add_argument("--confirm_step", default=False, action="store_true", - help="Confirm each major action before performing it") - - parser.add_argument("--quiet", default=False, action="store_true", - help="Do not ask any questions just to the default.") +def instantiate_arguments_from_list(args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir) -> Tuple[str, str, str, str]: + """ + Instantiate arguments from a list + Args: + args_list: list of arguments + """ + argument_checklist = [args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir] + if all(argument_checklist): + server_dir = args_server_dir + client_dir = args_client_dir + genie_python3_dir = args_genie_python3_dir + client_e4_dir = args_client_e4_dir + else: + print("You must specify either the release directory or kits_icp_dir or " + "ALL of the server, client, client e4 and genie python 3 directories.") + sys.exit(2) - parser.add_argument("--kits_icp_dir", default=None, help="Directory of kits/ICP") + return server_dir, client_dir, genie_python3_dir, client_e4_dir - deployment_types = [f"{choice}: {deployment_types}" - for choice, (_, deployment_types) in UPGRADE_TYPES.items()] - parser.add_argument('deployment_type', choices=UPGRADE_TYPES.keys(), - help="What upgrade should be performed. ( {})" - .format(", \n".join(deployment_types))) +if __name__ == "__main__": + # A parser to parse the command line arguments + parser = argparse.ArgumentParser(**ARGUMENT_PARSER) + parser = add_arguments_to_parser_from_ARGUMENTS(parser) # Add Arguments + parser = add_deployment_type_to_parser(parser) # Add deployment type from UPGRADE_TYPES args = parser.parse_args() - client_e4_dir = args.client_e4_dir # The client e4 directory - current_client_version = None # The current client version - - # Get the latest release directory, client, client_e4 and genie python versions. + client_e4_dir = args.client_e4_dir + current_client_version = None + # If the release directory is not specified, use the latest release if args.release_dir is not None: - current_release_dir = get_latest_release_directory_if_dir(args.release_dir) - current_client_version = get_client_version(args.release_dir) - # if the release suffix is not empty, then append it to the current release directory + current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) + current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] if args.release_suffix != "": current_release_dir += f"-{args.release_suffix}" server_dir = os.path.join(current_release_dir, "EPICS") @@ -107,15 +93,12 @@ def get_latest_release_directory_if_dir(release_dir): client_e4_dir = client_dir genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") - # Else, if the ICP directory is specified, then use the latest release elif args.kits_icp_dir is not None: - # If the deployment is equal to the latest release, set the epics build directory to the latest release if args.deployment_type == 'install_latest_incr': - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") # pylint: disable=line-too-long - else: # Else, set the epics build directory to the latest release. - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") # pylint: disable=line-too-long + epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") + else: + epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") - # Try getting the latest release directory try: server_dir = get_latest_directory_path(epics_build_dir, "BUILD-", "EPICS") @@ -127,32 +110,21 @@ def get_latest_release_directory_if_dir(release_dir): genie_python3_build_dir = os.path.join(args.kits_icp_dir, "genie_python_3") genie_python3_dir = get_latest_directory_path(genie_python3_build_dir, "BUILD-") - except IOError as error: - print(error) + except IOError as e: + print(e) sys.exit(3) - # Elif the server directory, client, genie_python_3, and client_e4 directories are specified, then use them. - elif args.server_dir is not None and args.client_dir is not None and \ - args.genie_python3_dir is not None and args.client_e4_dir is not None: - server_dir = args.server_dir - client_dir = args.client_dir - client_e4_dir = args.client_e4_dir - genie_python3_dir = args.genie_python3_dir - else: - print("You must specify either the release directory or kits_icp_dir or " - "ALL of the server, client, client e4 and genie python 3 directories.") - sys.exit(2) + # Instantiate All server, client and genie_python3 directory paths if present + server_dir, client_dir, genie_python3_dir, client_e4_dir = instantiate_arguments_from_list( + args.server_dir, + args.client_dir, + args.genie_python3_dir, + args.client_e4_dir) - # Try to upgrade the client. try: prompt = UserPrompt(args.quiet, args.confirm_step) - upgrade_instrument = UpgradeInstrument( - prompt, - server_dir, - client_dir, - client_e4_dir, - genie_python3_dir, - current_client_version) + upgrade_instrument = UpgradeInstrument(prompt, server_dir, client_dir, client_e4_dir, genie_python3_dir, + current_client_version) upgrade_function = UPGRADE_TYPES[args.deployment_type][0] upgrade_function(upgrade_instrument) @@ -164,4 +136,4 @@ def get_latest_release_directory_if_dir(release_dir): sys.exit(1) print("Finished upgrade") - sys.exit(0) + sys.exit(0) \ No newline at end of file diff --git a/installation_and_upgrade/ibex_install_utils/Arguments_config.py b/installation_and_upgrade/ibex_install_utils/Arguments_config.py new file mode 100644 index 00000000..ece9fb2c --- /dev/null +++ b/installation_and_upgrade/ibex_install_utils/Arguments_config.py @@ -0,0 +1,67 @@ +""" +Arguments for IBEX_upgrade.py +""" + +import argparse + +ARGUMENT_PARSER = { + "description": "Upgrade the instrument.", + "formatter_class": argparse.RawTextHelpFormatter +} + +ARGUMENTS = [ + { + "name_or_flags": "--release_dir", + "dest": "release_dir", + "default": None, + "help": "directory from which the client and server should be installed" + }, + { + "name_or_flags": "--release_suffix", + "dest": "release_suffix", + "default": "", + "help": "Suffix for specifying non-standard releases (such as those including hot fixes)" + }, + { + "name_or_flags": "--server_build_prefix", + "default": "EPICS", + "help": "Prefix for build directory name" + }, + { + "name_or_flags": "--server_dir", + "default": None, + "Help": "Directory from which IBEX server should be installed" + }, + { + "name_or_flags": "--client_dir", + "default": None, + "help": "Directory from which IBEX client should be installed" + }, + { + "name_or_flags": "--client_e4_dir", + "default": None, + "help": "Directory from which IBEX E4 client should be installed" + }, + { + "name_or_flags": "--genie_python3_dir", + "default": None, + "help": "Directory from which genie_python_3 should be installed" + }, + { + "name_or_flags": "--confirm_step", + "default": False, + "action": "store_true", + "help": "Confirm each major action before performing it" + }, + { + "name_or_flags": "--quiet", + "default": False, + "action": "store_true", + "help": "Do not ask any questions just to the default." + }, + { + "name_or_flags": "--kits_icp_dir", + "default": None, + "help": "Directory of kits/ICP" + } +] \ No newline at end of file From 158ad42691c450faa0b4ef5b90c864a6c2444cc9 Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Mon, 7 Feb 2022 18:30:00 +0000 Subject: [PATCH 04/14] Refactor Initialisation of Latest Build Directories Refactor handling of latest release directories being set to reduce duplication of logic and place in a function outside of __main__ expression --- installation_and_upgrade/IBEX_upgrade.py | 84 +++++++++++++++++------- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 04a3b2c8..d8ee6f2b 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -6,6 +6,7 @@ import os import re import sys +from tkinter import Y from typing import Tuple import semantic_version @@ -73,6 +74,58 @@ def instantiate_arguments_from_list(args_server_dir, args_client_dir, args_genie return server_dir, client_dir, genie_python3_dir, client_e4_dir +def set_release_directory_to_latest(args) -> str: + """ + Set the release directory to the latest release + Args: + release_dir: directory to search for releases + """ + current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) + current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] + if args.release_suffix != "": + current_release_dir += f"-{args.release_suffix}" + server_dir = os.path.join(current_release_dir, "EPICS") + client_dir = os.path.join(current_release_dir, "Client") + client_e4_dir = client_dir + genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") + return (current_release_dir, current_client_version, server_dir, client_dir, client_e4_dir, genie_python3_dir) + +def set_args_to_latest(current_release_dir): + """ + """ + server_dir = os.path.join(current_release_dir, "EPICS") + client_dir = os.path.join(current_release_dir, "Client") + client_e4_dir = client_dir + genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") + + return server_dir, client_dir, client_e4_dir, genie_python3_dir + +def set_epics_build_dir_using_kits_ICP(args) -> str: + """ + Set the epics build directory to the kits ICP directory + Args: + kits_icp_dir: kits ICP directory + """ + if args.deployment_type == 'install_latest_incr': + epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") + else: + epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") + return epics_build_dir + +def set_director_using_kits_icp(args, directory_name, directory_type, ICP, build_directory=None) -> str: + """ + """ + if ICP: + build_directory = os.path.join(args.kits_icp_dir, f"{directory_name}") + lastest_directory_path = get_latest_directory_path(build_directory, f"{directory_type}") + return build_directory, lastest_directory_path + else: + if build_directory: + lastest_directory_path = get_latest_directory_path(epics_build_dir, f"{directory_name}", f"{directory_type}") + return lastest_directory_path + else: + return None + if __name__ == "__main__": # A parser to parse the command line arguments parser = argparse.ArgumentParser(**ARGUMENT_PARSER) @@ -84,32 +137,20 @@ def instantiate_arguments_from_list(args_server_dir, args_client_dir, args_genie current_client_version = None # If the release directory is not specified, use the latest release if args.release_dir is not None: - current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) - current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] + current_release_dir, current_client_version = set_release_directory_to_latest(args) if args.release_suffix != "": current_release_dir += f"-{args.release_suffix}" - server_dir = os.path.join(current_release_dir, "EPICS") - client_dir = os.path.join(current_release_dir, "Client") - client_e4_dir = client_dir - genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") + server_dir, client_dir, client_e4_dir, genie_python3_dir = set_args_to_latest(current_release_dir) elif args.kits_icp_dir is not None: - if args.deployment_type == 'install_latest_incr': - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") - else: - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") - + # if kits_icp_dir is specified, epics_build_dir is set + epics_build_dir = set_epics_build_dir_using_kits_ICP(args) + # Try initialising the server and client directories to latest release using kits_icp_dir try: - server_dir = get_latest_directory_path(epics_build_dir, "BUILD-", "EPICS") - - client_build_dir = os.path.join(args.kits_icp_dir, "Client") - client_dir = get_latest_directory_path(client_build_dir, "BUILD") - - client_e4_build_dir = os.path.join(args.kits_icp_dir, "Client_E4") - client_e4_dir = get_latest_directory_path(client_e4_build_dir, "BUILD") - - genie_python3_build_dir = os.path.join(args.kits_icp_dir, "genie_python_3") - genie_python3_dir = get_latest_directory_path(genie_python3_build_dir, "BUILD-") + server_dir = set_director_using_kits_icp(args, "BUILD-", "EPICS", True, epics_build_dir) + client_build_dir, client_dir = set_director_using_kits_icp(args, "Client", "BUILD") + client_e4_build_dir, client_e4_dir = set_director_using_kits_icp(args, "Client_E4", "BUILD") + genie_python3_build_dir, genie_python3_dir = set_director_using_kits_icp(args, "genie_python_3", "BUILD-") except IOError as e: print(e) sys.exit(3) @@ -120,7 +161,6 @@ def instantiate_arguments_from_list(args_server_dir, args_client_dir, args_genie args.client_dir, args.genie_python3_dir, args.client_e4_dir) - try: prompt = UserPrompt(args.quiet, args.confirm_step) upgrade_instrument = UpgradeInstrument(prompt, server_dir, client_dir, client_e4_dir, genie_python3_dir, From de3257d10246c7e7a3b40e210e7c2a30efb7c73a Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Tue, 8 Feb 2022 09:12:38 +0000 Subject: [PATCH 05/14] Code Cleanup Update function names, and docstrings and enforce parameter types --- installation_and_upgrade/IBEX_upgrade.py | 50 +++++++++++++++--------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index d8ee6f2b..1790c7ef 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -30,11 +30,13 @@ def _get_latest_release_path(release_dir) -> str: current_release = releases[-1] return os.path.join(release_dir, f"{current_release}") -def add_deployment_type_to_parser(argument_parser) -> argparse.ArgumentParser: +def add_deployment_type_to_parser(argument_parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Add deployment type to the argument parser Args: argument_parser: argument parser to add arguments to + Returns: + argument_parser """ deployment_types = [f"{choice}: {deployment_types}" for choice, (_, deployment_types) in UPGRADE_TYPES.items()] @@ -44,7 +46,7 @@ def add_deployment_type_to_parser(argument_parser) -> argparse.ArgumentParser: return argument_parser -def add_arguments_to_parser_from_ARGUMENTS(argument_parser) -> argparse.ArgumentParser: +def add_arguments_to_parser_from_ARGUMENTS(argument_parser: argparse.ArgumentParser) -> argparse.ArgumentParser: """ Add arguments to the argument parser Args: @@ -55,30 +57,29 @@ def add_arguments_to_parser_from_ARGUMENTS(argument_parser) -> argparse.Argument return argument_parser -def instantiate_arguments_from_list(args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir) -> Tuple[str, str, str, str]: +def instantiate_arguments_from_list(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> Tuple[str, str, str, str]: """ Instantiate arguments from a list Args: args_list: list of arguments + Returns: + args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir """ argument_checklist = [args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir] if all(argument_checklist): - server_dir = args_server_dir - client_dir = args_client_dir - genie_python3_dir = args_genie_python3_dir - client_e4_dir = args_client_e4_dir + return args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir else: print("You must specify either the release directory or kits_icp_dir or " "ALL of the server, client, client e4 and genie python 3 directories.") sys.exit(2) - return server_dir, client_dir, genie_python3_dir, client_e4_dir - -def set_release_directory_to_latest(args) -> str: +def set_release_directory_to_latest(args: argparse.Namespace) -> Tuple[str, str, str, str]: """ Set the release directory to the latest release Args: release_dir: directory to search for releases + Returns: + (current_release_dir, current_client_version, server_dir, client_dir, client_e4_dir, genie_python3_dir) """ current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] @@ -90,8 +91,13 @@ def set_release_directory_to_latest(args) -> str: genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") return (current_release_dir, current_client_version, server_dir, client_dir, client_e4_dir, genie_python3_dir) -def set_args_to_latest(current_release_dir): +def set_args_to_latest(current_release_dir: str) -> Tuple[str, str, str, str, str, str]: """ + Set the arguments to the latest release + Args: + current_release_dir: current release directory + Returns: + server_dir, client_dir, client_e4_dir, genie_python3_dir """ server_dir = os.path.join(current_release_dir, "EPICS") client_dir = os.path.join(current_release_dir, "Client") @@ -100,7 +106,7 @@ def set_args_to_latest(current_release_dir): return server_dir, client_dir, client_e4_dir, genie_python3_dir -def set_epics_build_dir_using_kits_ICP(args) -> str: +def set_epics_build_dir_using_kits_ICP(args: argparse.Namespace) -> str: """ Set the epics build directory to the kits ICP directory Args: @@ -112,8 +118,16 @@ def set_epics_build_dir_using_kits_ICP(args) -> str: epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") return epics_build_dir -def set_director_using_kits_icp(args, directory_name, directory_type, ICP, build_directory=None) -> str: +def set_directory_using_kits_icp(args: argparse.Namespace, directory_name: str, directory_type: str, ICP: bool, build_directory=None) -> str: """ + Set the directory to the kits ICP directory to latest release + Args: + directory_name: directory name + directory_type: directory type + ICP: kits ICP directory + build_directory: build directory + Returns: + directory """ if ICP: build_directory = os.path.join(args.kits_icp_dir, f"{directory_name}") @@ -143,14 +157,14 @@ def set_director_using_kits_icp(args, directory_name, directory_type, ICP, build server_dir, client_dir, client_e4_dir, genie_python3_dir = set_args_to_latest(current_release_dir) elif args.kits_icp_dir is not None: - # if kits_icp_dir is specified, epics_build_dir is set + # If kits_icp_dir is specified, epics_build_dir is set epics_build_dir = set_epics_build_dir_using_kits_ICP(args) # Try initialising the server and client directories to latest release using kits_icp_dir try: - server_dir = set_director_using_kits_icp(args, "BUILD-", "EPICS", True, epics_build_dir) - client_build_dir, client_dir = set_director_using_kits_icp(args, "Client", "BUILD") - client_e4_build_dir, client_e4_dir = set_director_using_kits_icp(args, "Client_E4", "BUILD") - genie_python3_build_dir, genie_python3_dir = set_director_using_kits_icp(args, "genie_python_3", "BUILD-") + server_dir = set_directory_using_kits_icp(args, "BUILD-", "EPICS", True, epics_build_dir) + client_build_dir, client_dir = set_directory_using_kits_icp(args, "Client", "BUILD") + client_e4_build_dir, client_e4_dir = set_directory_using_kits_icp(args, "Client_E4", "BUILD") + genie_python3_build_dir, genie_python3_dir = set_directory_using_kits_icp(args, "genie_python_3", "BUILD-") except IOError as e: print(e) sys.exit(3) From 48e86ce092e2b37a2cc8d1d752b991dea50947ed Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Tue, 8 Feb 2022 09:15:45 +0000 Subject: [PATCH 06/14] Update Dependencies Update python dependencies by removing unused import --- installation_and_upgrade/IBEX_upgrade.py | 1 - 1 file changed, 1 deletion(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 1790c7ef..ffc383a1 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -6,7 +6,6 @@ import os import re import sys -from tkinter import Y from typing import Tuple import semantic_version From d492417c85d7fdae8b6d7c97cb7ab5c159c2d56f Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Tue, 8 Feb 2022 11:13:37 +0000 Subject: [PATCH 07/14] Improve PEP8 Compliance Reduce the number of pylint warnings and add pylint disable where appropriate to make IBEX_upgrade.py more PEP8 compliant --- installation_and_upgrade/IBEX_upgrade.py | 170 ++++++++++++++--------- 1 file changed, 106 insertions(+), 64 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index ffc383a1..11beef2d 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -19,7 +19,8 @@ def _get_latest_release_path(release_dir) -> str: regex = re.compile(r'^\d+\.\d+\.\d+$') - releases = [name for name in os.listdir(release_dir) if os.path.isdir(os.path.join(release_dir, name))] + release_path = os.listdir(release_dir) + releases = [name for name in release_path if os.path.isdir(os.path.join(release_dir, name))] releases = list(filter(regex.match, releases)) releases = sorted(list(filter(regex.match, releases)), key=semantic_version.Version) @@ -29,7 +30,7 @@ def _get_latest_release_path(release_dir) -> str: current_release = releases[-1] return os.path.join(release_dir, f"{current_release}") -def add_deployment_type_to_parser(argument_parser: argparse.ArgumentParser) -> argparse.ArgumentParser: +def add_deployment_type_to_parser(argument_parser: argparse.ArgumentParser) -> argparse.ArgumentParser: # pylint: disable=line-too-long """ Add deployment type to the argument parser Args: @@ -39,13 +40,13 @@ def add_deployment_type_to_parser(argument_parser: argparse.ArgumentParser) -> a """ deployment_types = [f"{choice}: {deployment_types}" for choice, (_, deployment_types) in UPGRADE_TYPES.items()] - argument_parser.add_argument('deployment_type', + argument_parser.add_argument('deployment_type', choices=UPGRADE_TYPES.keys(), help="What upgrade should be performed. ( {})".format(", \n".join(deployment_types))) return argument_parser -def add_arguments_to_parser_from_ARGUMENTS(argument_parser: argparse.ArgumentParser) -> argparse.ArgumentParser: +def add_arguments_to_parser_from_arguments(argument_parser: argparse.ArgumentParser) -> argparse.ArgumentParser: # pylint: disable=line-too-long """ Add arguments to the argument parser Args: @@ -56,7 +57,7 @@ def add_arguments_to_parser_from_ARGUMENTS(argument_parser: argparse.ArgumentPar return argument_parser -def instantiate_arguments_from_list(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> Tuple[str, str, str, str]: +def instantiate_arguments_from_list(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> Tuple[str, str, str, str]: # pylint: disable=line-too-long """ Instantiate arguments from a list Args: @@ -64,120 +65,161 @@ def instantiate_arguments_from_list(args_server_dir: str, args_client_dir: str, Returns: args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir """ - argument_checklist = [args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir] - if all(argument_checklist): - return args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir - else: + argument_checklist = [args_server_dir, + args_client_dir, + args_genie_python3_dir, + args_client_e4_dir] + if all(argument_checklist) is False: print("You must specify either the release directory or kits_icp_dir or " "ALL of the server, client, client e4 and genie python 3 directories.") sys.exit(2) + return args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir -def set_release_directory_to_latest(args: argparse.Namespace) -> Tuple[str, str, str, str]: +def set_release_directory_to_latest(arguments: argparse.Namespace) -> Tuple[str, str, str, str, str]: # pylint: disable=line-too-long """ Set the release directory to the latest release Args: release_dir: directory to search for releases Returns: - (current_release_dir, current_client_version, server_dir, client_dir, client_e4_dir, genie_python3_dir) + (release_directory, + client_version, + server_directory, + client_directory, + client_e4_directory, + genie_python3_directory) """ - current_release_dir = os.path.join(args.release_dir, _get_latest_release_path(args.release_dir)) - current_client_version = _get_latest_release_path(args.release_dir).split("\\")[-1] - if args.release_suffix != "": - current_release_dir += f"-{args.release_suffix}" - server_dir = os.path.join(current_release_dir, "EPICS") - client_dir = os.path.join(current_release_dir, "Client") - client_e4_dir = client_dir - genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") - return (current_release_dir, current_client_version, server_dir, client_dir, client_e4_dir, genie_python3_dir) - -def set_args_to_latest(current_release_dir: str) -> Tuple[str, str, str, str, str, str]: + release_directory = os.path.join(arguments.release_dir, + _get_latest_release_path(args.release_dir)) + client_version = _get_latest_release_path(arguments.release_dir).split("\\")[-1] + if arguments.release_suffix != "": + release_directory += f"-{arguments.release_suffix}" + server_directory = os.path.join(release_directory, "EPICS") + client_directory = os.path.join(release_directory, "Client") + client_e4_directory = client_directory + genie_python3_directory = os.path.join(release_directory, "genie_python_3") + + release_directory_tuple = (client_version, + server_directory, + client_directory, + client_e4_directory, + genie_python3_directory) + + return release_directory_tuple + +def set_args_to_latest(current_release_directory: str) -> Tuple[str, str, str, str, str, str]: """ Set the arguments to the latest release Args: - current_release_dir: current release directory + current_release_directory: current release directory Returns: - server_dir, client_dir, client_e4_dir, genie_python3_dir + server_directory, client_directory, client_e4_directory, genie_python3_directory """ - server_dir = os.path.join(current_release_dir, "EPICS") - client_dir = os.path.join(current_release_dir, "Client") - client_e4_dir = client_dir - genie_python3_dir = os.path.join(current_release_dir, "genie_python_3") + server_directory = os.path.join(current_release_directory, "EPICS") + client_directory = os.path.join(current_release_directory, "Client") + client_e4_directory = client_dir + genie_python3_directory = os.path.join(current_release_directory, "genie_python_3") - return server_dir, client_dir, client_e4_dir, genie_python3_dir + return server_directory, client_directory, client_e4_directory, genie_python3_directory -def set_epics_build_dir_using_kits_ICP(args: argparse.Namespace) -> str: +def set_epics_build_dir_using_kits_icp(arguments: argparse.Namespace) -> str: """ Set the epics build directory to the kits ICP directory Args: - kits_icp_dir: kits ICP directory + arguments: arguments + Returns: + epics_build_directory """ - if args.deployment_type == 'install_latest_incr': - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_win7_x64") + if arguments.deployment_type == 'install_latest_incr': + epics_build_directory = os.path.join(arguments.kits_icp_dir, + "EPICS", arguments.server_build_prefix+"_win7_x64") else: - epics_build_dir = os.path.join(args.kits_icp_dir, "EPICS", args.server_build_prefix+"_CLEAN_win7_x64") - return epics_build_dir + epics_build_directory = os.path.join(arguments.kits_icp_dir, + "EPICS", + arguments.server_build_prefix+"_CLEAN_win7_x64") + return epics_build_directory -def set_directory_using_kits_icp(args: argparse.Namespace, directory_name: str, directory_type: str, ICP: bool, build_directory=None) -> str: +def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: str, directory_type: str, icp: bool, build_directory=None) -> str: # pylint: disable=line-too-long """ Set the directory to the kits ICP directory to latest release Args: + arguments: arguments directory_name: directory name directory_type: directory type - ICP: kits ICP directory + icp: kits ICP directory build_directory: build directory Returns: directory """ - if ICP: - build_directory = os.path.join(args.kits_icp_dir, f"{directory_name}") + if icp: + build_directory = os.path.join(arguments.kits_icp_dir, f"{directory_name}") lastest_directory_path = get_latest_directory_path(build_directory, f"{directory_type}") return build_directory, lastest_directory_path - else: - if build_directory: - lastest_directory_path = get_latest_directory_path(epics_build_dir, f"{directory_name}", f"{directory_type}") - return lastest_directory_path - else: - return None + + if build_directory: + lastest_directory_path = get_latest_directory_path(epics_build_dir, + f"{directory_name}", + f"{directory_type}") + return lastest_directory_path + return None if __name__ == "__main__": # A parser to parse the command line arguments parser = argparse.ArgumentParser(**ARGUMENT_PARSER) - parser = add_arguments_to_parser_from_ARGUMENTS(parser) # Add Arguments + parser = add_arguments_to_parser_from_arguments(parser) # Add Arguments parser = add_deployment_type_to_parser(parser) # Add deployment type from UPGRADE_TYPES args = parser.parse_args() client_e4_dir = args.client_e4_dir - current_client_version = None + current_client_version = None # pylint: disable=invalid-name # If the release directory is not specified, use the latest release if args.release_dir is not None: - current_release_dir, current_client_version = set_release_directory_to_latest(args) - if args.release_suffix != "": - current_release_dir += f"-{args.release_suffix}" - server_dir, client_dir, client_e4_dir, genie_python3_dir = set_args_to_latest(current_release_dir) + rel_dir = set_release_directory_to_latest(args) # Set release directories to latest release + current_client_version, server_dir, client_dir, client_e4_dir, genie_python3_dir = rel_dir elif args.kits_icp_dir is not None: # If kits_icp_dir is specified, epics_build_dir is set - epics_build_dir = set_epics_build_dir_using_kits_ICP(args) + epics_build_dir = set_epics_build_dir_using_kits_icp(args) # Try initialising the server and client directories to latest release using kits_icp_dir try: - server_dir = set_directory_using_kits_icp(args, "BUILD-", "EPICS", True, epics_build_dir) - client_build_dir, client_dir = set_directory_using_kits_icp(args, "Client", "BUILD") - client_e4_build_dir, client_e4_dir = set_directory_using_kits_icp(args, "Client_E4", "BUILD") - genie_python3_build_dir, genie_python3_dir = set_directory_using_kits_icp(args, "genie_python_3", "BUILD-") - except IOError as e: - print(e) + server_dir = set_directory_using_kits_icp(args, + "BUILD-", + "EPICS", + True, + epics_build_dir) + + client_build_dir, client_dir = set_directory_using_kits_icp(args, + "Client", + "BUILD", + False) + + client_e4_build_dir, client_e4_dir = set_directory_using_kits_icp(args, + "Client_E4", + "BUILD", + False) + + genie_python3_build_dir, genie_python3_dir = set_directory_using_kits_icp(args, + "genie_python_3", + "BUILD-", + False) + + except IOError as error: + print(error) sys.exit(3) # Instantiate All server, client and genie_python3 directory paths if present server_dir, client_dir, genie_python3_dir, client_e4_dir = instantiate_arguments_from_list( - args.server_dir, - args.client_dir, - args.genie_python3_dir, + args.server_dir, + args.client_dir, + args.genie_python3_dir, args.client_e4_dir) try: prompt = UserPrompt(args.quiet, args.confirm_step) - upgrade_instrument = UpgradeInstrument(prompt, server_dir, client_dir, client_e4_dir, genie_python3_dir, - current_client_version) + upgrade_instrument = UpgradeInstrument(prompt, + server_dir, + client_dir, + client_e4_dir, + genie_python3_dir, + current_client_version) upgrade_function = UPGRADE_TYPES[args.deployment_type][0] upgrade_function(upgrade_instrument) @@ -189,4 +231,4 @@ def set_directory_using_kits_icp(args: argparse.Namespace, directory_name: str, sys.exit(1) print("Finished upgrade") - sys.exit(0) \ No newline at end of file + sys.exit(0) From 89d150640ec317dc34d0678d2ecec7fb9bc489ee Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Tue, 8 Feb 2022 12:25:37 +0000 Subject: [PATCH 08/14] Code Cleanup Clean-up script by cutting down duplication, replacing with function calls and update docstrings --- installation_and_upgrade/IBEX_upgrade.py | 60 +++++++++++++----------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 11beef2d..d748cb3e 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -17,6 +17,13 @@ def _get_latest_release_path(release_dir) -> str: + """ + Get the latest release path + Args: + release_dir: directory to search for releases + Returns: + latest_release_path + """ regex = re.compile(r'^\d+\.\d+\.\d+$') release_path = os.listdir(release_dir) @@ -51,6 +58,8 @@ def add_arguments_to_parser_from_arguments(argument_parser: argparse.ArgumentPar Add arguments to the argument parser Args: argument_parser: argument parser to add arguments to + Returns: + argument_parser """ for argument in ARGUMENTS: argument_parser.add_argument(**argument) @@ -69,58 +78,53 @@ def instantiate_arguments_from_list(args_server_dir: str, args_client_dir: str, args_client_dir, args_genie_python3_dir, args_client_e4_dir] + if all(argument_checklist) is False: print("You must specify either the release directory or kits_icp_dir or " "ALL of the server, client, client e4 and genie python 3 directories.") sys.exit(2) return args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir +def set_args_to_latest(current_release_directory: str) -> Tuple[str, str, str, str, str, str]: + """ + Set the arguments to the latest release + Args: + current_release_directory: current release directory + Returns: + server_directory, client_directory, client_e4_directory, genie_python3_directory + """ + server_directory = os.path.join(current_release_directory, "EPICS") + client_directory = os.path.join(current_release_directory, "Client") + client_e4_directory = client_directory + genie_python3_directory = os.path.join(current_release_directory, "genie_python_3") + + return server_directory, client_directory, client_e4_directory, genie_python3_directory + def set_release_directory_to_latest(arguments: argparse.Namespace) -> Tuple[str, str, str, str, str]: # pylint: disable=line-too-long """ Set the release directory to the latest release Args: release_dir: directory to search for releases Returns: - (release_directory, - client_version, - server_directory, - client_directory, - client_e4_directory, - genie_python3_directory) + (release_directory, client_version, server_directory, client_directory, + client_e4_directory, genie_python3_directory) """ release_directory = os.path.join(arguments.release_dir, _get_latest_release_path(args.release_dir)) client_version = _get_latest_release_path(arguments.release_dir).split("\\")[-1] + if arguments.release_suffix != "": release_directory += f"-{arguments.release_suffix}" - server_directory = os.path.join(release_directory, "EPICS") - client_directory = os.path.join(release_directory, "Client") - client_e4_directory = client_directory - genie_python3_directory = os.path.join(release_directory, "genie_python_3") - release_directory_tuple = (client_version, + arg_dirs = set_args_to_latest(release_directory) + server_directory, client_directory, client_e4_directory, genie_python3_directory = arg_dirs + + return (client_version, server_directory, client_directory, client_e4_directory, genie_python3_directory) - return release_directory_tuple - -def set_args_to_latest(current_release_directory: str) -> Tuple[str, str, str, str, str, str]: - """ - Set the arguments to the latest release - Args: - current_release_directory: current release directory - Returns: - server_directory, client_directory, client_e4_directory, genie_python3_directory - """ - server_directory = os.path.join(current_release_directory, "EPICS") - client_directory = os.path.join(current_release_directory, "Client") - client_e4_directory = client_dir - genie_python3_directory = os.path.join(current_release_directory, "genie_python_3") - - return server_directory, client_directory, client_e4_directory, genie_python3_directory - def set_epics_build_dir_using_kits_icp(arguments: argparse.Namespace) -> str: """ Set the epics build directory to the kits ICP directory From e97b6e4f14974b2eab98e02b26b384278d94848e Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Wed, 9 Feb 2022 11:41:14 +0000 Subject: [PATCH 09/14] Modify Argument Parser Adder Modify adding of arguments to parse function to fix passing of flags to add_argument method of ArgumentParser --- installation_and_upgrade/IBEX_upgrade.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index d748cb3e..1d7d2d30 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -3,6 +3,7 @@ """ # pylint: disable=import-error import argparse +from ast import arguments import os import re import sys @@ -62,7 +63,8 @@ def add_arguments_to_parser_from_arguments(argument_parser: argparse.ArgumentPar argument_parser """ for argument in ARGUMENTS: - argument_parser.add_argument(**argument) + flag_argument = argument.pop("name_or_flags") + argument_parser.add_argument(flag_argument, **argument) return argument_parser From 357fea20e0570eb81d087f6dfaa538ee6649f7e2 Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Wed, 9 Feb 2022 11:42:57 +0000 Subject: [PATCH 10/14] Fix Help Key Casing Fix Help key casing in one of the argument dictionaries --- installation_and_upgrade/ibex_install_utils/Arguments_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation_and_upgrade/ibex_install_utils/Arguments_config.py b/installation_and_upgrade/ibex_install_utils/Arguments_config.py index ece9fb2c..bc5c07f1 100644 --- a/installation_and_upgrade/ibex_install_utils/Arguments_config.py +++ b/installation_and_upgrade/ibex_install_utils/Arguments_config.py @@ -30,7 +30,7 @@ { "name_or_flags": "--server_dir", "default": None, - "Help": "Directory from which IBEX server should be installed" + "help": "Directory from which IBEX server should be installed" }, { "name_or_flags": "--client_dir", From fd4ebd3b83ff8851d4e967ec3a0076bb8a3c7fe9 Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Wed, 9 Feb 2022 11:57:42 +0000 Subject: [PATCH 11/14] Test specifying release dir --- installation_and_upgrade/IBEX_upgrade.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 1d7d2d30..771723db 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -213,11 +213,21 @@ def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: sys.exit(3) # Instantiate All server, client and genie_python3 directory paths if present - server_dir, client_dir, genie_python3_dir, client_e4_dir = instantiate_arguments_from_list( - args.server_dir, - args.client_dir, - args.genie_python3_dir, - args.client_e4_dir) + elif args.server_dir is not None and args.client_dir is not None and args.genie_python3_dir is not None and \ + args.client_e4_dir is not None: + server_dir = args.server_dir + client_dir = args.client_dir + client_e4_dir = args.client_e4_dir + genie_python3_dir = args.genie_python3_dir + else: + print("You must specify either the release directory or kits_icp_dir or " + "ALL of the server, client, client e4 and genie python 3 directories.") + sys.exit(2) + + # server_dir, client_dir, genie_python3_dir, client_e4_dir = instantiate_arguments_from_list(args.server_dir, + # args.client_dir, + # args.genie_python3_dir, + # args.client_e4_dir) try: prompt = UserPrompt(args.quiet, args.confirm_step) upgrade_instrument = UpgradeInstrument(prompt, From afb8e4951aea9b7c1d4d4eb6d86a583943ebccbd Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Wed, 9 Feb 2022 12:03:08 +0000 Subject: [PATCH 12/14] Test specifying release dir using all() --- installation_and_upgrade/IBEX_upgrade.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index 771723db..a6cd485a 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -213,8 +213,10 @@ def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: sys.exit(3) # Instantiate All server, client and genie_python3 directory paths if present - elif args.server_dir is not None and args.client_dir is not None and args.genie_python3_dir is not None and \ - args.client_e4_dir is not None: + + elif all([args.server_dir, args.client_dir, args.genie_python3_dir, args.client_e4_dir]) is True: + # args.server_dir is not None and args.client_dir is not None and args.genie_python3_dir is not None and \ + # args.client_e4_dir is not None: server_dir = args.server_dir client_dir = args.client_dir client_e4_dir = args.client_e4_dir From e05f218207c82b19114839fd3226c7cbf0be85aa Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Wed, 9 Feb 2022 12:18:52 +0000 Subject: [PATCH 13/14] Refactor Directory Check --- installation_and_upgrade/IBEX_upgrade.py | 28 ++++++------------------ 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index a6cd485a..a0d66326 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -68,24 +68,14 @@ def add_arguments_to_parser_from_arguments(argument_parser: argparse.ArgumentPar return argument_parser -def instantiate_arguments_from_list(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> Tuple[str, str, str, str]: # pylint: disable=line-too-long - """ - Instantiate arguments from a list - Args: - args_list: list of arguments - Returns: - args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir - """ +def check_directory_selected(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> bool: argument_checklist = [args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir] - if all(argument_checklist) is False: - print("You must specify either the release directory or kits_icp_dir or " - "ALL of the server, client, client e4 and genie python 3 directories.") - sys.exit(2) - return args_server_dir, args_client_dir, args_genie_python3_dir, args_client_e4_dir + all_directories_populated = all(argument_checklist) + return all_directories_populated def set_args_to_latest(current_release_directory: str) -> Tuple[str, str, str, str, str, str]: """ @@ -214,22 +204,18 @@ def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: # Instantiate All server, client and genie_python3 directory paths if present - elif all([args.server_dir, args.client_dir, args.genie_python3_dir, args.client_e4_dir]) is True: - # args.server_dir is not None and args.client_dir is not None and args.genie_python3_dir is not None and \ - # args.client_e4_dir is not None: + elif check_directory_selected(args.server_dir, args.client_dir, args.genie_python3_dir,\ + args.client_e4_dir) is True: + server_dir = args.server_dir client_dir = args.client_dir client_e4_dir = args.client_e4_dir genie_python3_dir = args.genie_python3_dir + else: print("You must specify either the release directory or kits_icp_dir or " "ALL of the server, client, client e4 and genie python 3 directories.") sys.exit(2) - - # server_dir, client_dir, genie_python3_dir, client_e4_dir = instantiate_arguments_from_list(args.server_dir, - # args.client_dir, - # args.genie_python3_dir, - # args.client_e4_dir) try: prompt = UserPrompt(args.quiet, args.confirm_step) upgrade_instrument = UpgradeInstrument(prompt, From ebf0e744a6318b667d0d635749c36d9e51f68931 Mon Sep 17 00:00:00 2001 From: JackEAllen Date: Wed, 9 Feb 2022 13:44:18 +0000 Subject: [PATCH 14/14] Code Cleanup Improve PEP8 compliance --- installation_and_upgrade/IBEX_upgrade.py | 51 ++++++++++++++---------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/installation_and_upgrade/IBEX_upgrade.py b/installation_and_upgrade/IBEX_upgrade.py index a0d66326..03f1ef50 100644 --- a/installation_and_upgrade/IBEX_upgrade.py +++ b/installation_and_upgrade/IBEX_upgrade.py @@ -3,7 +3,6 @@ """ # pylint: disable=import-error import argparse -from ast import arguments import os import re import sys @@ -68,7 +67,17 @@ def add_arguments_to_parser_from_arguments(argument_parser: argparse.ArgumentPar return argument_parser -def check_directory_selected(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> bool: +def check_directory_selected(args_server_dir: str, args_client_dir: str, args_genie_python3_dir: str, args_client_e4_dir: str) -> bool: # pylint: disable=line-too-long + """ + Check if all directories are selected + Args: + args_server_dir: server directory + args_client_dir: client directory + args_genie_python3_dir: genie python 3 directory + args_client_e4_dir: client e4 directory + Returns: + True if all directories are selected + """ argument_checklist = [args_server_dir, args_client_dir, args_genie_python3_dir, @@ -92,53 +101,53 @@ def set_args_to_latest(current_release_directory: str) -> Tuple[str, str, str, s return server_directory, client_directory, client_e4_directory, genie_python3_directory -def set_release_directory_to_latest(arguments: argparse.Namespace) -> Tuple[str, str, str, str, str]: # pylint: disable=line-too-long +def set_release_directory_to_latest(argument_dirs: argparse.Namespace) -> Tuple[str, str, str, str, str]: # pylint: disable=line-too-long """ Set the release directory to the latest release Args: - release_dir: directory to search for releases + argument_dirs: directory to search for releases Returns: - (release_directory, client_version, server_directory, client_directory, + (release_directory, client_version, server_directory, client_directory, client_e4_directory, genie_python3_directory) """ - release_directory = os.path.join(arguments.release_dir, + release_directory = os.path.join(argument_dirs.release_dir, _get_latest_release_path(args.release_dir)) - client_version = _get_latest_release_path(arguments.release_dir).split("\\")[-1] + client_version = _get_latest_release_path(argument_dirs.release_dir).split("\\")[-1] - if arguments.release_suffix != "": - release_directory += f"-{arguments.release_suffix}" + if argument_dirs.release_suffix != "": + release_directory += f"-{argument_dirs.release_suffix}" arg_dirs = set_args_to_latest(release_directory) server_directory, client_directory, client_e4_directory, genie_python3_directory = arg_dirs - return (client_version, + return (client_version, server_directory, client_directory, client_e4_directory, genie_python3_directory) -def set_epics_build_dir_using_kits_icp(arguments: argparse.Namespace) -> str: +def set_epics_build_dir_using_kits_icp(namespace_arguments: argparse.Namespace) -> str: """ Set the epics build directory to the kits ICP directory Args: - arguments: arguments + namespace_arguments: arguments Returns: epics_build_directory """ - if arguments.deployment_type == 'install_latest_incr': - epics_build_directory = os.path.join(arguments.kits_icp_dir, - "EPICS", arguments.server_build_prefix+"_win7_x64") + if namespace_arguments.deployment_type == 'install_latest_incr': + epics_build_directory = os.path.join(namespace_arguments.kits_icp_dir, + "EPICS", namespace_arguments.server_build_prefix+"_win7_x64") else: - epics_build_directory = os.path.join(arguments.kits_icp_dir, + epics_build_directory = os.path.join(namespace_arguments.kits_icp_dir, "EPICS", - arguments.server_build_prefix+"_CLEAN_win7_x64") + namespace_arguments.server_build_prefix+"_CLEAN_win7_x64") return epics_build_directory -def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: str, directory_type: str, icp: bool, build_directory=None) -> str: # pylint: disable=line-too-long +def set_directory_using_kits_icp(namespace_arguments: argparse.Namespace, directory_name: str, directory_type: str, icp: bool, build_directory=None) -> str: # pylint: disable=line-too-long """ Set the directory to the kits ICP directory to latest release Args: - arguments: arguments + namespace_arguments: arguments directory_name: directory name directory_type: directory type icp: kits ICP directory @@ -147,7 +156,7 @@ def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: directory """ if icp: - build_directory = os.path.join(arguments.kits_icp_dir, f"{directory_name}") + build_directory = os.path.join(namespace_arguments.kits_icp_dir, f"{directory_name}") lastest_directory_path = get_latest_directory_path(build_directory, f"{directory_type}") return build_directory, lastest_directory_path @@ -211,7 +220,7 @@ def set_directory_using_kits_icp(arguments: argparse.Namespace, directory_name: client_dir = args.client_dir client_e4_dir = args.client_e4_dir genie_python3_dir = args.genie_python3_dir - + else: print("You must specify either the release directory or kits_icp_dir or " "ALL of the server, client, client e4 and genie python 3 directories.")