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