|
2 | 2 | import importlib
|
3 | 3 |
|
4 | 4 | from tornado.gen import multi
|
5 |
| -from traitlets import Any, Bool, Dict, HasTraits, Instance, Unicode, default, observe |
| 5 | +from traitlets import Any, Bool, Dict, HasTraits, Instance, List, Unicode, default, observe |
6 | 6 | from traitlets import validate as validate_trait
|
7 | 7 | from traitlets.config import LoggingConfigurable
|
8 | 8 |
|
@@ -157,54 +157,51 @@ class ExtensionPackage(LoggingConfigurable):
|
157 | 157 | """
|
158 | 158 |
|
159 | 159 | name = Unicode(help="Name of the an importable Python package.")
|
160 |
| - enabled = Bool(False).tag(config=True) |
| 160 | + enabled = Bool(False, help="Whether the extension package is enabled.") |
161 | 161 |
|
162 |
| - def __init__(self, *args, **kwargs): |
| 162 | + _linked_points = Dict() |
| 163 | + extension_points = Dict() |
| 164 | + module = Any(allow_none=True, help="The module for this extension package. None if not enabled") |
| 165 | + metadata = List(Dict(), help="Extension metadata loaded from the extension package.") |
| 166 | + version = Unicode( |
| 167 | + help=""" |
| 168 | + The version of this extension package, if it can be found. |
| 169 | + Otherwise, an empty string. |
| 170 | + """, |
| 171 | + ) |
| 172 | + |
| 173 | + @default("version") |
| 174 | + def _load_version(self): |
| 175 | + if not self.enabled: |
| 176 | + return "" |
| 177 | + return getattr(self.module, "__version__", "") |
| 178 | + |
| 179 | + def __init__(self, **kwargs): |
163 | 180 | """Initialize an extension package."""
|
164 |
| - # Store extension points that have been linked. |
165 |
| - self._linked_points = {} |
166 |
| - super().__init__(*args, **kwargs) |
| 181 | + super().__init__(**kwargs) |
| 182 | + if self.enabled: |
| 183 | + self._load_metadata() |
167 | 184 |
|
168 |
| - _linked_points: dict = {} |
| 185 | + def _load_metadata(self): |
| 186 | + """Import package and load metadata |
169 | 187 |
|
170 |
| - @validate_trait("name") |
171 |
| - def _validate_name(self, proposed): |
172 |
| - name = proposed["value"] |
173 |
| - self._extension_points = {} |
| 188 | + Only used if extension package is enabled |
| 189 | + """ |
| 190 | + name = self.name |
174 | 191 | try:
|
175 |
| - self._module, self._metadata = get_metadata(name, self.log) |
| 192 | + self.module, self.metadata = get_metadata(name, logger=self.log) |
176 | 193 | except ImportError as e:
|
177 | 194 | msg = (
|
178 | 195 | f"The module '{name}' could not be found ({e}). Are you "
|
179 | 196 | "sure the extension is installed?"
|
180 | 197 | )
|
181 | 198 | raise ExtensionModuleNotFound(msg) from None
|
182 | 199 | # Create extension point interfaces for each extension path.
|
183 |
| - for m in self._metadata: |
| 200 | + for m in self.metadata: |
184 | 201 | point = ExtensionPoint(metadata=m)
|
185 |
| - self._extension_points[point.name] = point |
| 202 | + self.extension_points[point.name] = point |
186 | 203 | return name
|
187 | 204 |
|
188 |
| - @property |
189 |
| - def module(self): |
190 |
| - """Extension metadata loaded from the extension package.""" |
191 |
| - return self._module |
192 |
| - |
193 |
| - @property |
194 |
| - def version(self) -> str: |
195 |
| - """Get the version of this package, if it's given. Otherwise, return an empty string""" |
196 |
| - return getattr(self._module, "__version__", "") |
197 |
| - |
198 |
| - @property |
199 |
| - def metadata(self): |
200 |
| - """Extension metadata loaded from the extension package.""" |
201 |
| - return self._metadata |
202 |
| - |
203 |
| - @property |
204 |
| - def extension_points(self): |
205 |
| - """A dictionary of extension points.""" |
206 |
| - return self._extension_points |
207 |
| - |
208 | 205 | def validate(self):
|
209 | 206 | """Validate all extension points in this package."""
|
210 | 207 | for extension in self.extension_points.values():
|
|
0 commit comments