Unverified Commit c041a597 authored by acpaquette's avatar acpaquette Committed by GitHub
Browse files

Ale Path Expansion Fixes (#551)

* Fixed expandvar function to expand paths completely

* Made expandvars fail if it can't expand a variable
parent 49f8d6bf
Loading
Loading
Loading
Loading
+21 −12
Original line number Original line Diff line number Diff line
@@ -131,14 +131,15 @@ def find_latest_metakernel(path, year):




def dict_merge(dct, merge_dct):
def dict_merge(dct, merge_dct):
    new_dct = dct.copy()
    for k, v in merge_dct.items():
    for k, v in merge_dct.items():
        if (k in dct and isinstance(dct[k], dict)
        if (k in dct and isinstance(dct[k], dict)
                and isinstance(merge_dct[k], Mapping)):
                and isinstance(merge_dct[k], Mapping)):
            dict_merge(dct[k], merge_dct[k])
            new_dct[k] = dict_merge(dct[k], merge_dct[k])
        else:
        else:
            dct[k] = merge_dct[k]
            new_dct[k] = merge_dct[k]


    return dct
    return new_dct




def get_isis_preferences(isis_preferences=None):
def get_isis_preferences(isis_preferences=None):
@@ -178,15 +179,23 @@ def dict_to_lower(d):




def expandvars(path, env_dict=os.environ, default=None, case_sensitive=True):
def expandvars(path, env_dict=os.environ, default=None, case_sensitive=True):
    if env_dict != os.environ:
        env_dict = dict_merge(env_dict, os.environ)

    while "$" in path:
        user_dict = env_dict if case_sensitive else dict_to_lower(env_dict)
        user_dict = env_dict if case_sensitive else dict_to_lower(env_dict)


        def replace_var(m):
        def replace_var(m):
        group0 = m.group(0) if case_sensitive else m.group(0).lower()
            group1 = m.group(1) if case_sensitive else m.group(1).lower()
            group1 = m.group(1) if case_sensitive else m.group(1).lower()
            val = user_dict.get(m.group(2) or group1 if default is None else default)
            if not val:
                raise KeyError(f"Failed to evaluate {m.group(0)} from env_dict. " + 
                               f"Should {m.group(0)} be an environment variable?")


        return user_dict.get(m.group(2) or group1, group0 if default is None else default)
            return val
        reVar = r'\$(\w+|\{([^}]*)\})'
        reVar = r'\$(\w+|\{([^}]*)\})'
    return re.sub(reVar, replace_var, path)
        path = re.sub(reVar, replace_var, path)
    return path




def generate_kernels_from_cube(cube,  expand=False, format_as='list'):
def generate_kernels_from_cube(cube,  expand=False, format_as='list'):
@@ -281,7 +290,7 @@ def get_kernels_from_isis_pvl(kernel_group, expand=True, format_as="list"):
            if not "DataDirectory" in isisprefs:
            if not "DataDirectory" in isisprefs:
              warnings.warn("No IsisPreferences file found, is your ISISROOT env var set?")
              warnings.warn("No IsisPreferences file found, is your ISISROOT env var set?")


            kernels = [expandvars(expandvars(k, isisprefs['DataDirectory'], case_sensitive=False)) for k in kernels]
            kernels = [expandvars(k, isisprefs['DataDirectory'], case_sensitive=False) for k in kernels]
        # Ensure that the ISIS Addendum kernel is last in case it overrides
        # Ensure that the ISIS Addendum kernel is last in case it overrides
        # some values from the default Instrument kernel
        # some values from the default Instrument kernel
        # Sorts planetary constants kernel first so it can be overridden by more specific kernels
        # Sorts planetary constants kernel first so it can be overridden by more specific kernels
@@ -295,7 +304,7 @@ def get_kernels_from_isis_pvl(kernel_group, expand=True, format_as="list"):
            for kern_list in mk_paths:
            for kern_list in mk_paths:
                for index, kern in enumerate(mk_paths[kern_list]):
                for index, kern in enumerate(mk_paths[kern_list]):
                    if kern is not None:
                    if kern is not None:
                        mk_paths[kern_list][index] = expandvars(expandvars(kern, isisprefs['DataDirectory'], case_sensitive=False))
                        mk_paths[kern_list][index] = expandvars(kern, isisprefs['DataDirectory'], case_sensitive=False)
        return mk_paths
        return mk_paths
    else:
    else:
        raise Exception(f'{format_as} is not a valid return format')
        raise Exception(f'{format_as} is not a valid return format')