| # config.py -- Portage Config |
| # Copyright 2007-2009 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| __all__ = ["ConfigLoaderKlass", "GenericFile", "PackageKeywordsFile", |
| "PackageUseFile", "PackageMaskFile", "PortageModulesFile"] |
| |
| from portage.cache.mappings import UserDict |
| from portage.env.loaders import KeyListFileLoader, KeyValuePairFileLoader, ItemFileLoader |
| |
| class ConfigLoaderKlass(UserDict): |
| """ |
| A base class stub for things to inherit from. |
| Users may want a non-file backend. |
| """ |
| |
| def __init__(self, loader): |
| """ |
| @param loader: A class that has a load() that returns two dicts |
| the first being a data dict, the second being a dict of errors. |
| """ |
| UserDict.__init__(self) |
| self._loader = loader |
| |
| def load(self): |
| """ |
| Load the data from the loader. |
| |
| @throws LoaderError: |
| """ |
| |
| self.data, self.errors = self._loader.load() |
| |
| class GenericFile(UserDict): |
| """ |
| Inherits from ConfigLoaderKlass, attempts to use all known loaders |
| until it gets <something> in data. This is probably really slow but is |
| helpful when you really have no idea what you are loading (hint hint the file |
| should perhaps declare what type it is? ;) |
| """ |
| |
| loaders = [KeyListFileLoader, KeyValuePairFileLoader, ItemFileLoader] |
| |
| def __init__(self, filename): |
| UserDict.__init__(self) |
| self.filename = filename |
| |
| def load(self): |
| for loader in self.loaders: |
| l = loader(self.filename, None) |
| data, errors = l.load() |
| if len(data) and not len(errors): |
| (self.data, self.errors) = (data, errors) |
| return |
| |
| |
| class PackageKeywordsFile(ConfigLoaderKlass): |
| """ |
| Inherits from ConfigLoaderKlass; implements a file-based backend. |
| """ |
| |
| default_loader = KeyListFileLoader |
| |
| def __init__(self, filename): |
| super(PackageKeywordsFile, self).__init__( |
| self.default_loader(filename, validator=None)) |
| |
| class PackageUseFile(ConfigLoaderKlass): |
| """ |
| Inherits from PackageUse; implements a file-based backend. Doesn't handle recursion yet. |
| """ |
| |
| default_loader = KeyListFileLoader |
| def __init__(self, filename): |
| super(PackageUseFile, self).__init__( |
| self.default_loader(filename, validator=None)) |
| |
| class PackageMaskFile(ConfigLoaderKlass): |
| """ |
| A class that implements a file-based package.mask |
| |
| Entires in package.mask are of the form: |
| atom1 |
| atom2 |
| or optionally |
| -atom3 |
| to revert a previous mask; this only works when masking files are stacked |
| """ |
| |
| default_loader = ItemFileLoader |
| |
| def __init__(self, filename): |
| super(PackageMaskFile, self).__init__( |
| self.default_loader(filename, validator=None)) |
| |
| class PortageModulesFile(ConfigLoaderKlass): |
| """ |
| File Class for /etc/portage/modules |
| """ |
| |
| default_loader = KeyValuePairFileLoader |
| |
| def __init__(self, filename): |
| super(PortageModulesFile, self).__init__( |
| self.default_loader(filename, validator=None)) |