def test_given_epics_release_exists_then_set(self): env = dls_environment.environment() with patch.dict('os.environ', {'EPICS_RELEASE': "test_release"}, clear=True): env.setEpicsFromEnv() self.assertEqual(env.epics, "test_release")
def test_given_neither_exists_then_set_default(self): env = dls_environment.environment() with patch.dict('os.environ', {'DOESNT_EXIST': "test_release"}, clear=True): env.setEpicsFromEnv() self.assertEqual(env.epics, "R3.14.12.3")
def test_given_epics_not_set_then_set_dir_and_return(self, mock_set_epics_from_env): env = dls_environment.environment() env.epics = "" env.epicsVerDir() mock_set_epics_from_env.assert_called_once_with()
def test_given_epics_version_without_R_and_match_then_set(self, mock_set_epics): env = dls_environment.environment() epics_version = "3.14.8.2" env.check_epics_version(epics_version) mock_set_epics.assert_called_once_with("R" + epics_version)
def test_areas_set(self): areas = ["support", "ioc", "matlab", "python", "etc", "tools", "epics"] env = dls_environment.environment() for area in areas: self.assertIn(area, env.areas)
def test_given_epics_value_then_epics_set(self): epics = "test_epics" env = dls_environment.environment() env.setEpics(epics) self.assertEqual("test_epics", env.epics)
def check_releases_valid(releases, parser): """ Check that two releases given and in correct order. Args: releases(list of str): Releases range requested by user parser(:class:`argparse.ArgumentParser`): ArgParse instance to handle error Raises: :class:`argparse.ArgumentParser.error`: * If one release given: To specify just start or just end point, use -e or -l flag. * If more than two releases given: Only two releases can be specified (start and end point) * If releases in wrong order: Input releases in correct order (<earlier_release> <later_release>) """ if len(releases) == 1: parser.error("To specify just start or just end point, use -e or -l" " flag.") if len(releases) > 2: parser.error("Only two releases can be specified (start and end" " point)") elif len(releases) == 2: # If start and end points both provided then check that later comes # after earlier env = environment() test_list = env.sortReleases([releases[0], releases[1]]) if releases[1] == test_list[0] and releases[1] != 'HEAD': parser.error("Input releases in correct order (<earlier> <later>)")
def check_releases_valid(releases, parser): """ Check that two releases given and in correct order. Args: releases(list of str): Releases range requested by user parser(:class:`argparse.ArgumentParser`): ArgParse instance to handle error Raises: :class:`argparse.ArgumentParser.error`: * If one release given: To specify just start or just end point, use -e or -l flag. * If more than two releases given: Only two releases can be specified (start and end point) * If releases in wrong order: Input releases in correct order (<earlier_release> <later_release>) """ if len(releases) == 1: parser.error("To specify just start or just end point, use -e or -l flag.") if len(releases) > 2: parser.error("Only two releases can be specified (start and end point)") elif len(releases) == 2: # If start and end points both provided then check that later comes after earlier env = environment() test_list = env.sortReleases([releases[0], releases[1]]) if releases[1] == test_list[0] and releases[1] != 'HEAD': parser.error("Input releases in correct order (<earlier> <later>)")
def test_given_rhel_then_set(self): rhel = "6" env = dls_environment.environment(rhel=rhel) self.assertEqual(env.rhel, rhel)
def test_given_version_more_and_support_then_dls_diamond_dir(self, _1): expected_path = "/dls_sw/work/dir/support" env = dls_environment.environment() env.epics = "R3.15" path = env.devArea() self.assertEqual(path, expected_path)
def test_given_epics_then_dls(self): area = 'epics' expected_path = "/dls_sw/" + area env = dls_environment.environment() path = env.prodArea(area) self.assertEqual(path, expected_path)
def test_given_version_less_and_support_then_home_diamond_dir(self, _1): expected_path = "/home/diamond/dir/work/support" env = dls_environment.environment() env.epics = "R3.1" path = env.devArea() self.assertEqual(path, expected_path)
def test_given_epics_set_then_return_dir(self, mock_set_epics_from_env): env = dls_environment.environment() env.epics = "dir_test_epics" epics = env.epicsVerDir() self.assertFalse(mock_set_epics_from_env.call_count) self.assertEqual(epics, "dir")
def test_given_support_then_dls_diamond_dir(self, _1): expected_path = "/dls_sw/work/dir/support" env = dls_environment.environment() env.epics = "R3.15" path = env.devArea() self.assertEqual(path, expected_path)
def test_given_version_more_and_ioc_then_dls_diamond_dir(self, _1): area = 'ioc' expected_path = "/dls_sw/work/dir/" + area env = dls_environment.environment() env.epics = "R3.15" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_epics_version_with_R_and_not_match_then_raise_error(self, mock_set_epics): env = dls_environment.environment() epics_version = "R3" expected_error_message = "Expected epics version like R3.14.8.2, got: " + epics_version try: env.check_epics_version(epics_version) except Exception as error: self.assertEqual(str(error), expected_error_message)
def test_given_version_less_and_tools_then_home_work(self): area = "tools" expected_path = "/home/work/" + area env = dls_environment.environment() env.epics = "R3.1" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_python_then_dls_work_common(self): area = 'python' env = dls_environment.environment() expected_path = "/dls_sw/work/common/" + area + "/" + env.rhelVerDir() env.epics = "R3.15" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_etc_then_dls_work(self): area = 'etc' expected_path = "/dls_sw/work/" + area env = dls_environment.environment() env.epics = "R3.15" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_matlab_then_dls_work_common(self): area = 'matlab' expected_path = "/dls_sw/work/common/" + area env = dls_environment.environment() env.epics = "R3.15" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_version_less_and_ioc_then_home_diamond_dir(self, _1): area = "ioc" expected_path = "/home/diamond/dir/work/" + area env = dls_environment.environment() env.epics = "R3.1" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_ioc_then_dls_diamond_dir(self, _1): area = 'ioc' expected_path = "/dls_sw/work/dir/" + area env = dls_environment.environment() env.epics = "R3.15" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_version_less_and_python_then_home_diamond_common(self): area = "python" expected_path = "/home/diamond/common/work/" + area env = dls_environment.environment() env.epics = "R3.1" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_version_more_and_python_then_dls_work_common(self): area = 'python' expected_path = "/dls_sw/work/common/" + area env = dls_environment.environment() env.epics = "R3.15" path = env.devArea(area) self.assertEqual(path, expected_path)
def test_given_python_then_prod(self, mock_dev_area): area = 'python' expected_path = "test/prod/test/" + area env = dls_environment.environment() env.devArea.return_value = "test/work/test/" + area path = env.prodArea(area) self.assertEqual(path, expected_path) mock_dev_area.assert_called_once_with(area)
def test_sorts_dash_doubles(self): env = dls_environment.environment() a = '-1-3' a_norm = [0, '', 1, 'z', 3, 'z', 0, '', 0, '', 0, ''] b = '1-3' b_norm = [1, 'z', 3, 'z', 0, '', 0, '', 0, '', 0, ''] c = '-1-2' c_norm = [0, '', 1, 'z', 2, 'z', 0, '', 0, '', 0, ''] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['-1-2', '-1-3', '1-3'])
def test_sorts_x_x_dls_y(self): env = dls_environment.environment() a = '3-10dls12' a_norm = [3, 'z', 10, 'z', 0, '', 12, 'z', 0, '', 0, ''] b = '3-8dls12' b_norm = [3, 'z', 8, 'z', 0, '', 12, 'z', 0, '', 0, ''] c = '3-10dls15' c_norm = [3, 'z', 10, 'z', 0, '', 15, 'z', 0, '', 0, ''] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['3-8dls12', '3-10dls12', '3-10dls15'])
def test_sorts_singles(self): env = dls_environment.environment() a = '2' a_norm = [2, 'z', 0, 'z', 0, '', 0, '', 0, '', 0, ''] b = '3' b_norm = [3, 'z', 0, 'z', 0, '', 0, '', 0, '', 0, ''] c = '1' c_norm = [1, 'z', 0, 'z', 0, '', 0, '', 0, '', 0, ''] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['1', '2', '3'])
def test_sorts_letters(self): env = dls_environment.environment() a = '1-f' a_norm = [1, 'z', 0, 'fz', 0, '', 0, '', 0, '', 0, ''] b = '1-a' b_norm = [1, 'z', 0, 'az', 0, '', 0, '', 0, '', 0, ''] c = '1-1' c_norm = [1, 'z', 1, 'z', 0, '', 0, '', 0, '', 0, ''] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['1-a', '1-f', '1-1'])
def get_last_release(releases): """ Returns the most recent release number Args: releases(list of str): Previous release numbers Returns: str: Most recent release number """ last_release = environment().sortReleases(releases)[-1].split("/")[-1] return last_release
def test_sorts_x_x_x_x_alpha_alpha2_dls_y(self): env = dls_environment.environment() a = '1-7-12-3alpha1dls16' a_norm = [1, 'z', 7, 'z', 12, 'z', 3, 'alpha1', 16, 'z', 0, '', 0, '', 0, ''] b = '1-7-12-3alpha2dls16' b_norm = [1, 'z', 7, 'z', 12, 'z', 3, 'alpha2', 16, 'z', 0, '', 0, '', 0, ''] c = '1-7-12-3dls16' c_norm = [1, 'z', 7, 'z', 12, 'z', 3, 'z', 16, 'z', 0, '', 0, '', 0, ''] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['1-7-12-3alpha1dls16', '1-7-12-3alpha2dls16', '1-7-12-3dls16'])
def test_sorts_x_x_x_x_dls_y(self): env = dls_environment.environment() a = '1-7-12-3dls16-2-13-1' a_norm = [1, 'z', 7, 'z', 12, 'z', 3, 'z', 16, 'z', 2, 'z', 13, 'z', 1, 'z'] b = '1-7-12-2dls16-2-13-1' b_norm = [1, 'z', 7, 'z', 12, 'z', 2, 'z', 16, 'z', 2, 'z', 13, 'z', 1, 'z'] c = '1-7-12-3dls16-2-14-1' c_norm = [1, 'z', 7, 'z', 12, 'z', 3, 'z', 16, 'z', 2, 'z', 14, 'z', 1, 'z'] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['1-7-12-2dls16-2-13-1', '1-7-12-3dls16-2-13-1', '1-7-12-3dls16-2-14-1'])
def test_sorts_x_x_beta_dls_y(self): env = dls_environment.environment() a = '4-5beta2dls1-3' a_norm = [4, 'z', 5, 'beta2', 0, '', 1, 'z', 3, 'z', 0, ''] b = '4-5beta1dls1-3' b_norm = [4, 'z', 5, 'beta1', 0, '', 1, 'z', 3, 'z', 0, ''] c = '4-5beta2dls2-3' c_norm = [4, 'z', 5, 'beta2', 0, '', 2, 'z', 3, 'z', 0, ''] if isinstance(env.normaliseRelease, MagicMock): env.normaliseRelease.side_effect = [a_norm, b_norm, c_norm] self.assertEqual(env.sortReleases([a, b, c]), ['4-5beta1dls1-3', '4-5beta2dls1-3', '4-5beta2dls2-3'])
def __init__(self, bld_os, server=None, epics=None): assert bld_os in os_list, "Build operating system not supported" self.os = bld_os self.force = False self.area = "" self.user = getpass.getuser() self.email = lookup_contact_details(self.user)[1] self.dls_env = environment() if server: self.dls_env.check_rhel_version(server) if server in SERVER_SHORTCUT.keys(): server = SERVER_SHORTCUT[server] if epics is None: # if we have not specifier the epics version if server is None: # use the default server and epics from env self.server = default_server() else: # set specified server self.server = server # set epics from server if self.epics() not in BUILD_SERVERS[self.os][self.server]: self.set_epics(BUILD_SERVERS[self.os][self.server][0]) else: # if we have specified epics version then set it self.set_epics(epics) if server is None: # set server from epics self.server = default_server() if self.epics() not in BUILD_SERVERS[self.os][self.server]: servers = epics_servers(self.os, self.epics()) assert servers, \ "No %s build servers exist for epics version %s" % \ (self.os, self.epics()) self.server = servers[0] else: # set specified server self.server = server assert self.server in BUILD_SERVERS[self.os].keys(), \ "No build server for this OS server: %s" % self.server assert self.epics() in BUILD_SERVERS[self.os][self.server], \ "EPICS version %s not allowed for server %s" % ( self.epics(), self.server)
def __init__(self, bld_os, server=None, epics=None): if server in server_shortcut.keys(): server = server_shortcut[server] assert bld_os in os_list, "Build operating system not supported" self.os = bld_os self.force = False self.area = "" self.user = getpass.getuser() self.email = get_email(self.user) self.dls_env = environment() if epics is None: # if we have not specifier the epics version if server is None: # use the default server and epics from env self.server = default_server() else: # set specified server self.server = server # set epics from server if self.epics() not in build_servers[self.os][self.server]: self.set_epics(build_servers[self.os][self.server][0]) else: # if we have specified epics version then set it self.set_epics(epics) if server is None: # set server from epics self.server = default_server() if self.epics() not in build_servers[self.os][self.server]: servers = epics_servers(self.os, self.epics()) assert servers, \ "No %s build servers exist for epics version %s" % \ (self.os, self.epics()) self.server = servers[0] else: # set specified server self.server = server assert self.server in build_servers[self.os].keys(), \ "No build server for this OS server: %s" % self.server assert self.epics() in build_servers[self.os][self.server], \ "EPICS version %s not allowed for server %s" % ( self.epics(), self.server)
Default epics version and rhel version are the set from you environment, to specify different versions the epics version or rhel version flags can be used. The git flag will list releases from the repository. """ import os import sys import shutil import platform import logging from dls_ade.dls_environment import environment from dls_ade.argument_parser import ArgParser from dls_ade import path_functions as pathf from dls_ade import vcs_git env = environment() logging.basicConfig(level=logging.DEBUG) usage = """ Default <area> is 'support'. List the releases of <module_name> in the <area> area of prod or the repository if -g is true. By default uses the epics release number from your environment to work out the area on disk to look for the module, this can be overridden with the -e flag. """ def get_rhel_version(): """ Checks if platform is Linux redhat, if so returns base version number from environment (e.g. returns 6 if 6.7),
from argparse import ArgumentParser from dls_ade import dls_environment env = dls_environment.environment() areas = ["support", "ioc", "matlab", "python", "etc", "tools", "epics"] class ArgParser(ArgumentParser): """ Makes a custom parser class with area arguments by default. """ def __init__(self, usage_v, supported_areas=None): super(ArgParser, self).__init__(description=usage_v) if supported_areas is None: supported_areas = areas area = self.add_mutually_exclusive_group(required=False) area.add_argument( "-a", "--area", action="store", type=str, default="support", dest="area", help="Set area, e.g. " + ", ".join(supported_areas)) area.add_argument( "-p", "--python", action="store_true", dest="python", help="Set 'python' area") area.add_argument( "-i", "--ioc", action="store_true", dest="ioc", help="Set 'ioc' area") def parse_args(self, args=None, namespace=None): """
def test_normalises_1_7_12beta1dls16_2_13_2(self): env = dls_environment.environment() self.assertEqual(env.normaliseRelease("1-7-12beta1dls16-2-13"), [1, 'z', 7, 'z', 12, 'beta1', 16, 'z', 2, 'z', 13, 'z'])
def test_normalises_1_7_12_1dls_16(self): env = dls_environment.environment() self.assertEqual(env.normaliseRelease("1-7-12-1dls16"), [1, 'z', 7, 'z', 12, 'z', 1, 'z', 16, 'z', 0, ''])
def test_given_epics_then_set(self): epics = 'R3.14.8.2' env = dls_environment.environment(epics=epics) self.assertEqual(env.epics, epics)
def test_normalises_4_5_beta2_dls_1_3(self): env = dls_environment.environment() self.assertEqual(env.normaliseRelease("4-5beta2dls1-3"), [4, 'z', 5, 'beta2', 0, '', 1, 'z', 3, 'z', 0, ''])