Source code for rez.tests.test_commands

# SPDX-License-Identifier: Apache-2.0
# Copyright Contributors to the Rez Project


"""
test package commands
"""
from rez.vendor.version.requirement import VersionedObject
from rez.rex import Comment, EnvAction, Shebang, Setenv, Alias, Appendenv
from rez.resolved_context import ResolvedContext
from rez.utils.filesystem import canonical_path
import unittest
from rez.tests.util import TestBase
import os


[docs]class TestCommands(TestBase): # Note some tests use a hardcoded '/' path separator instead of # os.path.join. This is because they are being compared against # baked commands in existing package.yaml|py files in the data # directory where the separator is static.
[docs] @classmethod def get_packages_path(cls): return canonical_path(cls.data_path("commands", "packages"))
[docs] @classmethod def setUpClass(cls): cls.settings = dict( packages_path=[cls.get_packages_path()], package_filter=None, resolve_caching=False, warn_untimestamped=False, warn_old_commands=False, implicit_packages=[], rez_1_environment_variables=False)
def __init__(self, fn): TestBase.__init__(self, fn) self.packages_path = self.get_packages_path() def _test_package(self, pkg, env, expected_commands): orig_environ = os.environ.copy() r = ResolvedContext([str(pkg)], caching=False) # this environ should not have changed self.assertEqual(orig_environ, os.environ) commands = r.get_actions(parent_environ=env) commands_ = [] # ignore some commands that don't matter or change depending on system ignore_keys = set(["REZ_USED", "REZ_USED_VERSION", "REZ_USED_TIMESTAMP", "REZ_USED_REQUESTED_TIMESTAMP", "REZ_USED_PACKAGES_PATH", "REZ_USED_IMPLICIT_PACKAGES", "PATH"]) for cmd in commands: if isinstance(cmd, (Comment, Shebang)): continue elif isinstance(cmd, EnvAction) and cmd.key in ignore_keys: continue else: commands_.append(cmd) self.assertEqual(commands_, expected_commands) def _get_rextest_commands(self, pkg): verstr = str(pkg.version) base = os.path.join(self.packages_path, "rextest", verstr) major_version = str(pkg.version[0] if len(pkg.version) >= 1 else '') minor_version = str(pkg.version[1] if len(pkg.version) >= 2 else '') patch_version = str(pkg.version[2] if len(pkg.version) >= 3 else '') cmds = [Setenv('REZ_REXTEST_VERSION', verstr), Setenv('REZ_REXTEST_MAJOR_VERSION', major_version), Setenv('REZ_REXTEST_MINOR_VERSION', minor_version), Setenv('REZ_REXTEST_PATCH_VERSION', patch_version), Setenv('REZ_REXTEST_BASE', base), Setenv('REZ_REXTEST_ROOT', base), # from package... Setenv('REXTEST_ROOT', base), Setenv('REXTEST_VERSION', verstr), Setenv('REXTEST_MAJOR_VERSION', str(pkg.version[0])), Setenv('REXTEST_DIRS', "/".join([base, "data"])), Alias('rextest', 'foobar')] return cmds def _test_rextest_package(self, version): pkg = VersionedObject("rextest-%s" % version) cmds = [Setenv('REZ_USED_REQUEST', str(pkg)), Setenv('REZ_USED_RESOLVE', str(pkg))] cmds += self._get_rextest_commands(pkg) self._test_package(pkg, {}, cmds) # first prepend should still override self._test_package(pkg, {"REXTEST_DIRS": "TEST"}, cmds)
[docs] def test_old_yaml(self): """Resolve a yaml-based package with old-style bash commands.""" self._test_rextest_package("1.1")
[docs] def test_new_yaml(self): """Resolve a yaml-based package with new rex commands.""" self._test_rextest_package("1.2")
[docs] def test_py(self): """Resolve a new py-based package with rex commands.""" self._test_rextest_package("1.3")
[docs] def test_2(self): """Resolve a package with a dependency, see that their commands are concatenated as expected.""" pkg = VersionedObject("rextest2-2") base = os.path.join(self.packages_path, "rextest", "1.3") base2 = os.path.join(self.packages_path, "rextest2", "2") cmds = [Setenv('REZ_USED_REQUEST', "rextest2-2"), Setenv('REZ_USED_RESOLVE', "rextest-1.3 rextest2-2"), # rez's rextest vars Setenv('REZ_REXTEST_VERSION', "1.3"), Setenv('REZ_REXTEST_MAJOR_VERSION', '1'), Setenv('REZ_REXTEST_MINOR_VERSION', '3'), Setenv('REZ_REXTEST_PATCH_VERSION', ''), Setenv('REZ_REXTEST_BASE', base), Setenv('REZ_REXTEST_ROOT', base), # rez's rextest2 vars Setenv('REZ_REXTEST2_VERSION', '2'), Setenv('REZ_REXTEST2_MAJOR_VERSION', '2'), Setenv('REZ_REXTEST2_MINOR_VERSION', ''), Setenv('REZ_REXTEST2_PATCH_VERSION', ''), Setenv('REZ_REXTEST2_BASE', base2), Setenv('REZ_REXTEST2_ROOT', base2), # rextest's commands Setenv('REXTEST_ROOT', base), Setenv('REXTEST_VERSION', "1.3"), Setenv('REXTEST_MAJOR_VERSION', "1"), Setenv('REXTEST_DIRS', "/".join([base, "data"])), Alias('rextest', 'foobar'), # rextext2's commands Appendenv('REXTEST_DIRS', "/".join([base2, "data2"])), Setenv('REXTEST2_REXTEST_VER', '1.3'), Setenv('REXTEST2_REXTEST_BASE', os.path.join(self.packages_path, "rextest", "1.3"))] self._test_package(pkg, {}, cmds) # first prepend should still override self._test_package(pkg, {"REXTEST_DIRS": "TEST"}, cmds)
if __name__ == '__main__': unittest.main()