Source code for pystac.stac_io
import os
import json
from urllib.parse import urlparse
from urllib.request import urlopen
from urllib.error import HTTPError
[docs]class STAC_IO:
"""Methods used to read and save STAC json.
Allows users of the library to set their own methods
(e.g. for reading and writing from cloud storage)
"""
[docs] def default_read_text_method(uri):
"""Default method for reading text. Only handles local file paths."""
parsed = urlparse(uri)
if parsed.scheme != '':
try:
with urlopen(uri) as f:
return f.read().decode('utf-8')
except HTTPError as e:
raise Exception("Could not read uri {}".format(uri)) from e
else:
with open(uri) as f:
return f.read()
[docs] def default_write_text_method(uri, txt):
"""Default method for writing text. Only handles local file paths."""
dirname = os.path.dirname(uri)
if dirname != '' and not os.path.isdir(dirname):
os.makedirs(dirname)
with open(uri, 'w') as f:
f.write(txt)
read_text_method = default_read_text_method
"""Users of PySTAC can replace the read_text_method in order
to expand the ability of PySTAC to read different file systems.
For example, a client of the library might replace this class
member in it's own __init__.py with a method that can read from
cloud storage.
"""
write_text_method = default_write_text_method
"""Users of PySTAC can replace the writte_text_method in order
to expand the ability of PySTAC to write to different file systems.
For example, a client of the library might replace this class
member in it's own __init__.py with a method that can read from
cloud storage.
"""
# Replaced in __init__ to account for extension objects.
_stac_object_from_dict = None
# This is set in __init__.py
_STAC_OBJECT_CLASSES = None
[docs] @classmethod
def read_text(cls, uri):
"""Read text from the given URI.
Args:
uri (str): The URI from which to read text.
Returns:
str: The text contained in the file at the location specified by the uri.
Note:
This method uses the :func:`STAC_IO.read_text_method
<pystac.STAC_IO.read_text_method>`. If you want to modify the behavior of
STAC_IO in order to enable additional URI types, replace that member
with your own implementation.
"""
return cls.read_text_method(uri)
[docs] @classmethod
def write_text(cls, uri, txt):
"""Write the given text to a file at the given URI.
Args:
uri (str): The URI of the file to write the text to.
txt (str): The text to write.
Note:
This method uses the :func:`STAC_IO.write_text_method
<pystac.STAC_IO.write_text_method>`. If you want to modify the behavior of
STAC_IO in order to enable additional URI types, replace that member
with your own implementation.
"""
cls.write_text_method(uri, txt)
[docs] @classmethod
def read_json(cls, uri):
"""Read a dict from the given URI.
Args:
uri (str): The URI from which to read.
Returns:
dict: A dict representation of the JSON contained in the file at the
given uri.
Note:
This method uses the :func:`STAC_IO.read_text_method
<pystac.STAC_IO.read_text_method>`. If you want to modify the behavior of
STAC_IO in order to enable additional URI types, replace that member
with your own implementation.
"""
return json.loads(STAC_IO.read_text(uri))
[docs] @classmethod
def read_stac_object(cls, uri, root=None):
"""Read a STACObject from a JSON file at the given URI.
Args:
uri (str): The URI from which to read.
root (Catalog or Collection): Optional root of the catalog for this object.
If provided, the root's resolved object cache can be used to search for
previously resolved instances of the STAC object.
Returns:
STACObject: The deserialized STACObject from the serialized JSON
contained in the file at the given uri.
Note:
This method uses the :func:`STAC_IO.read_text_method
<pystac.STAC_IO.read_text_method>`. If you want to modify the behavior of
STAC_IO in order to enable additional URI types, replace that member
with your own implementation.
"""
d = cls.read_json(uri)
return cls.stac_object_from_dict(d, href=uri, root=root)
[docs] @classmethod
def save_json(cls, uri, json_dict):
"""Write a dict to the given URI as JSON.
Args:
uri (str): The URI of the file to write the text to.
json_dict (dict): The JSON dict to write.
Note:
This method uses the :func:`STAC_IO.write_text_method
<pystac.STAC_IO.write_text_method>`. If you want to modify the behavior of
STAC_IO in order to enable additional URI types, replace that member
with your own implementation.
"""
STAC_IO.write_text(uri, json.dumps(json_dict, indent=4))