Source code for deploy_tools.modulefile
import re
from collections import defaultdict
from .layout import Layout
from .models.deployment import DefaultVersionsByName, ModuleVersionsByName
from .templater import Templater, TemplateType
VERSION_GLOB = "*/[!.]*"
DEFAULT_VERSION_REGEX = "^set ModulesVersion (.*)$"
[docs]
def deprecate_modulefile_link(name: str, version: str, layout: Layout) -> None:
"""Move a module's modulefile link into the deprecated area."""
mf_link = layout.get_modulefile_link(name, version)
deprecated_mf_link = layout.get_modulefile_link(name, version, from_deprecated=True)
deprecated_mf_link.parent.mkdir(parents=True, exist_ok=True)
mf_link.rename(deprecated_mf_link)
[docs]
def restore_modulefile_link(name: str, version: str, layout: Layout) -> None:
"""Move a module's modulefile link out of the deprecated area."""
mf_link = layout.get_modulefile_link(name, version)
deprecated_mf_link = layout.get_modulefile_link(name, version, from_deprecated=True)
mf_link.parent.mkdir(parents=True, exist_ok=True)
deprecated_mf_link.rename(mf_link)
[docs]
def get_default_modulefile_version(name: str, layout: Layout) -> str | None:
"""Return the default version recorded in a module's .version file, if any."""
version_regex = re.compile(DEFAULT_VERSION_REGEX)
default_version_file = layout.get_default_version_file(name)
with open(default_version_file) as f:
for line in f.readlines():
r = version_regex.search(line)
if r is not None:
return r.group(1)
[docs]
def apply_default_versions(
default_versions: DefaultVersionsByName, layout: Layout
) -> None:
"""Update .version files for current default version settings."""
templater = Templater()
deployed_module_versions = get_deployed_modulefile_versions(layout)
for name in deployed_module_versions:
default_version_file = layout.get_default_version_file(name)
if name in default_versions:
params = {"version": default_versions[name]}
templater.create(
default_version_file,
TemplateType.MODULEFILE_VERSION,
params,
overwrite=True,
)
else:
# Defensive: remove a stale default file for a deployed module that has no
# entry in the default map. This ought to be unreachable via the CLI
default_version_file.unlink(missing_ok=True)
[docs]
def get_deployed_modulefile_versions(
layout: Layout, from_deprecated: bool = False
) -> ModuleVersionsByName:
"""Return list of modulefiles that have been deployed."""
modulefiles_root = layout.get_modulefiles_root(from_deprecated)
found_modules: ModuleVersionsByName = defaultdict(list)
for version_path in modulefiles_root.glob(VERSION_GLOB):
found_modules[version_path.parent.name].append(version_path.name)
return found_modules