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 load_recipients(self, filepath): def test(value, type_): if not isinstance(value, type_): raise TypeError("Expected %s, not %s" % type_, value) return value conf = load_yaml(filepath) recipients = set() for rule in test(conf.get("rules", []), list): filters = rule.get("filters") match = True if filters: for attr, test_value in test(filters, dict).items(): missing = object() value = getattr(self.package, attr, missing) if value is missing: match = False elif test_value is None: match = True elif isinstance(test_value, list): match = (value in test_value) else: match = (value == test_value) if not match: break if match: rule_recipients = rule.get("recipients") recipients.update(test(rule_recipients, list)) return sorted(recipients)
def load_recipients(self, filepath): def test(value, type_): if not isinstance(value, type_): raise TypeError("Expected %s, not %s" % type_, value) return value conf = load_yaml(filepath) recipients = set() for rule in test(conf.get("rules", []), list): filters = rule.get("filters") match = True if filters: for attr, test_value in test(filters, dict).iteritems(): missing = object() value = getattr(self.package, attr, missing) if value is missing: match = False elif test_value is None: match = True elif isinstance(test_value, list): match = (value in test_value) else: match = (value == test_value) if not match: break if match: rule_recipients = rule.get("recipients") recipients.update(test(rule_recipients, list)) return sorted(recipients)