def test_pkg_data(self): """check package contents.""" # a py-based package package = get_package("versioned", "3.0") expected_data = dict( name="versioned", version=Version("3.0"), base=canonical_path( os.path.join(self.py_packages_path, "versioned", "3.0")), commands=SourceCode('env.PATH.append("{root}/bin")')) data = package.validated_data() self.assertDictEqual(data, expected_data) # a yaml-based package package = get_package("versioned", "2.0") expected_uri = canonical_path( os.path.join(self.yaml_packages_path, "versioned", "2.0", "package.yaml")) self.assertEqual(package.uri, expected_uri) # a py-based package with late binding attribute functions package = get_package("late_binding", "1.0") self.assertEqual(package.tools, ["util"]) # a 'combined' type package package = get_package("multi", "1.0") expected_uri = canonical_path( os.path.join(self.yaml_packages_path, "multi.yaml<1.0>")) self.assertEqual(package.uri, expected_uri) expected_data = dict(name="multi", version=Version("1.0"), tools=["tweak"]) data = package.validated_data() self.assertDictEqual(data, expected_data) # a 'combined' type package, with version overrides package = get_package("multi", "1.1") expected_uri = canonical_path( os.path.join(self.yaml_packages_path, "multi.yaml<1.1>")) self.assertEqual(package.uri, expected_uri) expected_data = dict(name="multi", version=Version("1.1"), tools=["twerk"]) data = package.validated_data() self.assertDictEqual(data, expected_data) # check that visibility of 'combined' packages is correct package = get_package("multi", "2.0") expected_uri = canonical_path( os.path.join(self.py_packages_path, "multi.py<2.0>")) self.assertEqual(package.uri, expected_uri)
def __init__(self, location, resource_pool): """Create a filesystem package repository. Args: location (str): Path containing the package repository. """ # ensure that differing case doesn't get interpreted as different repos # on case-insensitive platforms (eg windows) location = canonical_path(location, platform_) super(FileSystemPackageRepository, self).__init__(location, resource_pool) global _settings _settings = config.plugins.package_repository.filesystem self.register_resource(FileSystemPackageFamilyResource) self.register_resource(FileSystemPackageResource) self.register_resource(FileSystemVariantResource) self.register_resource(FileSystemCombinedPackageFamilyResource) self.register_resource(FileSystemCombinedPackageResource) self.register_resource(FileSystemCombinedVariantResource) self.get_families = lru_cache(maxsize=None)(self._get_families) self.get_family = lru_cache(maxsize=None)(self._get_family) self.get_packages = lru_cache(maxsize=None)(self._get_packages) self.get_variants = lru_cache(maxsize=None)(self._get_variants) self.get_file = lru_cache(maxsize=None)(self._get_file)
def get_resource_from_handle(self, resource_handle, verify_repo=True): if verify_repo: repository_type = resource_handle.variables.get("repository_type") location = resource_handle.variables.get("location") if repository_type != self.name(): raise ResourceError("repository_type mismatch - requested %r, " "repository_type is %r" % (repository_type, self.name())) # It appears that sometimes, the handle location can differ to the # repo location even though they are the same path (different # mounts). We account for that here. # # https://github.com/nerdvegas/rez/pull/957 # if location != self.location: location = canonical_path(location, platform_) if location != self.location: raise ResourceError("location mismatch - requested %r, " "repository location is %r " % (location, self.location)) resource = self.pool.get_resource_from_handle(resource_handle) resource._repository = self return resource
def test_unix_case_insensistive_platform(self): if platform_.name == 'windows': self.skipTest('on windows, `os.path.realpath()` treats unix abspaths ' 'as relpaths, and prepends `os.getcwd()`') platform = self.CaseInsensitivePlatform() path = filesystem.canonical_path('/a/b/File.txt', platform) expects = '/a/b/file.txt'.replace('\\', os.sep) self.assertEqual(path, expects)
def test_win32_case_insensitive(self): if platform_.name != 'windows': self.skipTest('on linux/macos, `os.path.realpath()` treats windows ' 'abspaths as relpaths, and prepends `os.getcwd()`') platform = self.CaseInsensitivePlatform() path = filesystem.canonical_path('C:\\dir\\File.txt', platform) expects = 'c:\\dir\\file.txt'.replace('\\', os.sep) self.assertEqual(path, expects)
def __init__(self, location, resource_pool): """Create a filesystem package repository. Args: location (str): Path containing the package repository. """ # ensure that differing case doesn't get interpreted as different repos # on case-insensitive platforms (eg windows) location = canonical_path(location, platform_) super(FileSystemPackageRepository, self).__init__(location, resource_pool) # load settings optionally defined in a settings.yaml local_settings = {} settings_filepath = os.path.join(location, "settings.yaml") if os.path.exists(settings_filepath): local_settings.update(load_yaml(settings_filepath)) self.disable_memcache = local_settings.get("disable_memcache", False) # TODO allow these settings to be overridden in settings.yaml also global _settings _settings = config.plugins.package_repository.filesystem self.register_resource(FileSystemPackageFamilyResource) self.register_resource(FileSystemPackageResource) self.register_resource(FileSystemVariantResource) self.register_resource(FileSystemCombinedPackageFamilyResource) self.register_resource(FileSystemCombinedPackageResource) self.register_resource(FileSystemCombinedVariantResource) self.get_families = lru_cache(maxsize=None)(self._get_families) self.get_family = lru_cache(maxsize=None)(self._get_family) self.get_packages = lru_cache(maxsize=None)(self._get_packages) self.get_variants = lru_cache(maxsize=None)(self._get_variants) self.get_file = lru_cache(maxsize=None)(self._get_file) # decorate with memcachemed memoizers unless told otherwise if not self.disable_memcache: decorator1 = memcached( servers=config.memcached_uri if config.cache_listdir else None, min_compress_len=config.memcached_listdir_min_compress_len, key=self._get_family_dirs__key, debug=config.debug_memcache ) self._get_family_dirs = decorator1(self._get_family_dirs) decorator2 = memcached( servers=config.memcached_uri if config.cache_listdir else None, min_compress_len=config.memcached_listdir_min_compress_len, key=self._get_version_dirs__key, debug=config.debug_memcache ) self._get_version_dirs = decorator2(self._get_version_dirs)
def setUpClass(cls): TempdirMixin.setUpClass() cls.py_packages_path = canonical_path( cls.data_path("packages", "py_packages")) cls.solver_packages_path = canonical_path( cls.data_path("solver", "packages")) cls.package_cache_path = os.path.join(cls.root, "package_cache") os.mkdir(cls.package_cache_path) cls.settings = dict( packages_path=[cls.py_packages_path, cls.solver_packages_path], cache_packages_path=cls.package_cache_path, default_cachable=True, # ensure test packages will get cached package_cache_same_device=True, default_cachable_per_repository={cls.solver_packages_path: False}, default_cachable_per_package={"late_binding": False})
def test_variant_iteration(self): """test variant iteration.""" base = canonical_path( os.path.join(self.py_packages_path, "variants_py", "2.0")) expected_data = dict( name="variants_py", version=Version("2.0"), description="package with variants", base=base, requires=[PackageRequest("python-2.7")], commands=SourceCode('env.PATH.append("{root}/bin")')) package = get_package("variants_py", "2.0") for i, variant in enumerate(package.iter_variants()): data = variant.validated_data() self.assertDictEqual(data, expected_data) self.assertEqual(variant.index, i) self.assertEqual(variant.parent, package)
def get_packages_path(cls): return canonical_path(cls.data_path("commands", "packages"))