Skip to content

Commit

Permalink
Add dynamic fetching of remote schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
jsignell committed Sep 11, 2023
1 parent 18a96eb commit 68562c8
Show file tree
Hide file tree
Showing 96 changed files with 95,163 additions and 6 deletions.
3 changes: 2 additions & 1 deletion pystac/validation/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

import pystac
from pystac.serialization.identify import STACVersionID, identify_stac_object
from pystac.stac_object import STACObjectType
from pystac.utils import make_absolute_href
from pystac.validation.schema_uri_map import OldExtensionSchemaUriMap

if TYPE_CHECKING:
from pystac.stac_object import STACObject, STACObjectType
from pystac.stac_object import STACObject


# Import after above class definition
Expand Down
12 changes: 11 additions & 1 deletion pystac/validation/stac_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@
from pystac.validation.schema_uri_map import DefaultSchemaUriMap, SchemaUriMap

try:
from urllib.request import Request, urlopen

import jsonschema
import jsonschema.exceptions
import jsonschema.validators
from referencing import Registry, Resource
from referencing.typing import D

from pystac.validation.local_validator import LocalValidator

Expand Down Expand Up @@ -158,7 +161,7 @@ def get_schema_from_uri(self, schema_uri: str) -> Tuple[Dict[str, Any], Any]:
self.schema_cache[schema_uri] = s

schema = self.schema_cache[schema_uri]
registry = Registry().with_resources(
registry = Registry(retrieve=_retrieve).with_resources( # type: ignore
[
(k, Resource.from_contents(v)) for k, v in self.schema_cache.items()
] # type: ignore
Expand Down Expand Up @@ -279,3 +282,10 @@ def validate_extension(
self._validate_from_uri(stac_dict, stac_object_type, schema_uri, href)

return schema_uri


def _retrieve(href: str) -> Resource[D]:
request = Request(href)
with urlopen(request) as f:
response = f.read().decode("utf-8")
return Resource.from_contents(json.loads(response))

Large diffs are not rendered by default.

3,817 changes: 3,817 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_centroid.yaml

Large diffs are not rendered by default.

1,528 changes: 1,528 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_epsg.yaml

Large diffs are not rendered by default.

4,180 changes: 4,180 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_geometry.yaml

Large diffs are not rendered by default.

Large diffs are not rendered by default.

5,743 changes: 5,743 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_projjson.yaml

Large diffs are not rendered by default.

1,528 changes: 1,528 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_shape.yaml

Large diffs are not rendered by default.

1,528 changes: 1,528 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_transform.yaml

Large diffs are not rendered by default.

Large diffs are not rendered by default.

1,528 changes: 1,528 additions & 0 deletions tests/extensions/cassettes/test_projection/ProjectionTest.test_wkt2.yaml

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

0 comments on commit 68562c8

Please sign in to comment.