|
8 | 8 | from pyrsistent import m, pmap, s
|
9 | 9 | from pyrsistent.typing import PMap, PSet
|
10 | 10 |
|
| 11 | +from referencing import exceptions |
11 | 12 | from referencing._attrs import frozen
|
12 |
| -from referencing.exceptions import CannotDetermineSpecification, Unresolvable |
13 | 13 | from referencing.typing import URI, D, Mapping
|
14 | 14 |
|
15 | 15 |
|
@@ -89,7 +89,7 @@ def from_contents(
|
89 | 89 | )
|
90 | 90 |
|
91 | 91 | if specification is None:
|
92 |
| - raise CannotDetermineSpecification(contents) |
| 92 | + raise exceptions.CannotDetermineSpecification(contents) |
93 | 93 | return cls(contents=contents, specification=specification) # type: ignore[reportUnknownArgumentType] # noqa: E501
|
94 | 94 |
|
95 | 95 | @classmethod
|
@@ -122,14 +122,23 @@ def subresources(self) -> Iterable[Resource[D]]:
|
122 | 122 | def pointer(self, pointer: str, resolver: Resolver[D]) -> Resolved[D]:
|
123 | 123 | """
|
124 | 124 | Resolve the given JSON pointer.
|
| 125 | +
|
| 126 | + Raises: |
| 127 | +
|
| 128 | + `exceptions.PointerToNowhere` |
| 129 | +
|
| 130 | + if the pointer points to a location not present in the document |
125 | 131 | """
|
126 | 132 | contents = self.contents
|
127 | 133 | for segment in unquote(pointer[1:]).split("/"):
|
128 | 134 | if isinstance(contents, Sequence):
|
129 | 135 | segment = int(segment)
|
130 | 136 | else:
|
131 | 137 | segment = segment.replace("~1", "/").replace("~0", "~")
|
132 |
| - contents = contents[segment] # type: ignore[reportUnknownArgumentType] # noqa: E501 |
| 138 | + try: |
| 139 | + contents = contents[segment] # type: ignore[reportUnknownArgumentType] # noqa: E501 |
| 140 | + except LookupError: |
| 141 | + raise exceptions.PointerToNowhere(ref=pointer, resource=self) |
133 | 142 | return Resolved(contents=contents, resolver=resolver) # type: ignore[reportUnknownArgumentType] # noqa: E501
|
134 | 143 |
|
135 | 144 |
|
@@ -295,21 +304,21 @@ def lookup(self, ref: URI) -> Resolved[D]:
|
295 | 304 |
|
296 | 305 | Raises:
|
297 | 306 |
|
298 |
| - `Unresolvable` |
| 307 | + `exceptions.Unresolvable` |
299 | 308 |
|
300 | 309 | if the reference isn't resolvable
|
301 | 310 | """
|
302 | 311 | uri, fragment = urldefrag(urljoin(self._base_uri, ref))
|
303 | 312 | resolver, registry = self, self._registry
|
304 | 313 | resource = registry.get(uri)
|
305 |
| - try: |
306 |
| - if resource is None: |
307 |
| - registry = registry.crawl() |
| 314 | + if resource is None: |
| 315 | + registry = registry.crawl() |
| 316 | + try: |
308 | 317 | resource = registry[uri]
|
309 |
| - resolver = evolve(resolver, registry=registry) |
310 |
| - if fragment.startswith("/"): |
311 |
| - return resource.pointer(pointer=fragment, resolver=resolver) |
312 |
| - except KeyError: |
313 |
| - raise Unresolvable(ref=ref) from None |
| 318 | + except KeyError: |
| 319 | + raise exceptions.Unresolvable(ref=ref) from None |
| 320 | + resolver = evolve(resolver, registry=registry) |
| 321 | + if fragment.startswith("/"): |
| 322 | + return resource.pointer(pointer=fragment, resolver=resolver) |
314 | 323 |
|
315 | 324 | return Resolved(contents=resource.contents, resolver=resolver)
|
0 commit comments