| 51 | | |
|---|
| 52 | | class GenericEntryList (object): |
|---|
| 53 | | def __init__ (self, dirs, exts, reqs): |
|---|
| 54 | | if dirs: assert (isinstance(dirs, ConfigNode)) |
|---|
| 55 | | if exts: assert (isinstance(exts, ConfigNode)) |
|---|
| 56 | | if reqs: assert (isinstance(reqs, ConfigNode)) |
|---|
| 57 | | |
|---|
| 58 | | self._dirs_conf = dirs |
|---|
| 59 | | self._exts_conf = exts |
|---|
| 60 | | self._reqs_conf = reqs |
|---|
| 61 | | |
|---|
| 62 | | # Directories |
|---|
| 63 | | def _get_directories (self): |
|---|
| 64 | | dirs = [] |
|---|
| 65 | | if self._dirs_conf: |
|---|
| 66 | | for dirname in self._dirs_conf: |
|---|
| 67 | | from directory import Directory |
|---|
| 68 | | dir_conf = self._dirs_conf[dirname] |
|---|
| 69 | | new_dir = Directory (dir_conf, dirname) |
|---|
| 70 | | dirs.append (new_dir) |
|---|
| 71 | | return dirs |
|---|
| 72 | | |
|---|
| 73 | | directories = property (_get_directories) |
|---|
| 74 | | |
|---|
| 75 | | # Extensions |
|---|
| 76 | | def _get_extensions (self): |
|---|
| 77 | | exts = [] |
|---|
| 78 | | if self._exts_conf: |
|---|
| 79 | | for extname in self._exts_conf: |
|---|
| 80 | | from extension import Extension |
|---|
| 81 | | ext_conf = self._exts_conf[extname] |
|---|
| 82 | | new_ext = Extension (ext_conf, extname) |
|---|
| 83 | | exts.append (new_ext) |
|---|
| 84 | | return exts |
|---|
| 85 | | |
|---|
| 86 | | extensions = property (_get_extensions) |
|---|
| 87 | | |
|---|
| 88 | | # Requests |
|---|
| 89 | | def _get_requests (self): |
|---|
| 90 | | reqs = [] |
|---|
| 91 | | if self._reqs_conf: |
|---|
| 92 | | for reqname in self._reqs_conf: |
|---|
| 93 | | from request import Request |
|---|
| 94 | | req_conf = self._reqs_conf[reqname] |
|---|
| 95 | | new_req = Request (req_conf, reqname) |
|---|
| 96 | | reqs.append (new_req) |
|---|
| 97 | | return reqs |
|---|
| 98 | | |
|---|
| 99 | | requests = property (_get_requests) |
|---|
| 100 | | |
|---|
| 101 | | # All |
|---|
| 102 | | def _get_all (self): |
|---|
| 103 | | def cmp (a, b): |
|---|
| 104 | | return a.priority > b.priority |
|---|
| 105 | | |
|---|
| 106 | | all = self._get_directories() + \ |
|---|
| 107 | | self._get_extensions() + \ |
|---|
| 108 | | self._get_requests() |
|---|
| 109 | | all.sort (cmp) |
|---|
| 110 | | return all |
|---|
| 111 | | |
|---|
| 112 | | all = property (_get_all) |
|---|
| 113 | | |
|---|
| 114 | | # Add |
|---|
| 115 | | def __setitem__ (self, key, obj): |
|---|
| 116 | | assert (isinstance(obj, ConfigNode)) |
|---|
| 117 | | |
|---|
| 118 | | if obj.type == 'directory': |
|---|
| 119 | | self._dirs_conf[key] = obj |
|---|
| 120 | | elif obj.type == 'extension': |
|---|
| 121 | | self._exts_conf[key] = obj |
|---|
| 122 | | elif obj.type == 'request': |
|---|
| 123 | | self._reqs_conf[key] = obj |
|---|
| 124 | | else: |
|---|
| 125 | | raise "Unknown type: " + obj.type |
|---|
| 126 | | |
|---|
| 127 | | # Remove |
|---|
| 128 | | def _remove (self, obj, conf): |
|---|
| 129 | | priority = obj.priority |
|---|
| 130 | | for c in conf: |
|---|
| 131 | | p = conf[c]['priority'] |
|---|
| 132 | | if p and p.value == priority: |
|---|
| 133 | | del (conf[c]) |
|---|
| 134 | | |
|---|
| 135 | | def __delitem__ (self, obj): |
|---|
| 136 | | if item.type == 'directory': |
|---|
| 137 | | self._remove (obj, self._dirs) |
|---|
| 138 | | elif item.type == 'extension': |
|---|
| 139 | | self._remove (obj, self._exts) |
|---|
| 140 | | elif item.type == 'request': |
|---|
| 141 | | self._remove (obj, self._reqs) |
|---|
| 142 | | else: |
|---|
| 143 | | raise "Unknown type: " + item.type |
|---|
| 144 | | |
|---|
| 145 | | # Iter |
|---|
| 146 | | def __iter__ (self): |
|---|
| 147 | | return iter(self._get_all()) |
|---|
| 148 | | |
|---|
| 149 | | # Get |
|---|
| 150 | | def __getitem__ (self, name): |
|---|
| 151 | | if type(name) == types.StringType: |
|---|
| 152 | | for e in self._get_all(): |
|---|
| 153 | | if e.entry == name: |
|---|
| 154 | | return e |
|---|