Module hdpws.spase
Module defines classes representing the Space Physics Archive Search and
Extract (SPASE) https://spase-group.org/
data model https://spase-group.org/data/index.html.
Copyright © 2023 United States Government as represented by the National Aeronautics and Space Administration. No copyright is claimed in the United States under Title 17, U.S.Code. All Other Rights Reserved.
Notes
- At this time, this module is limited and does not attempt to represent the entire SPASE data model.
- If this module is extented to more completely represent the SPASE data model, it should probably be a separate project.
Expand source code
#!/usr/bin/env python3
#
# NOSA HEADER START
#
# The contents of this file are subject to the terms of the NASA Open
# Source Agreement (NOSA), Version 1.3 only (the "Agreement"). You may
# not use this file except in compliance with the Agreement.
#
# You can obtain a copy of the agreement at
# docs/NASA_Open_Source_Agreement_1.3.txt
# or
# https://cdaweb.gsfc.nasa.gov/WebServices/NASA_Open_Source_Agreement_1.3.txt.
#
# See the Agreement for the specific language governing permissions
# and limitations under the Agreement.
#
# When distributing Covered Code, include this NOSA HEADER in each
# file and include the Agreement file at
# docs/NASA_Open_Source_Agreement_1.3.txt. If applicable, add the
# following below this NOSA HEADER, with the fields enclosed by
# brackets "[]" replaced with your own identifying information:
# Portions Copyright [yyyy] [name of copyright owner]
#
# NOSA HEADER END
#
# Copyright (c) 2023 United States Government as represented by
# the National Aeronautics and Space Administration. No copyright is
# claimed in the United States under Title 17, U.S.Code. All Other
# Rights Reserved.
#
"""
Module defines classes representing the Space Physics Archive Search and
Extract (SPASE) <https://spase-group.org/>
data model <https://spase-group.org/data/index.html>.<br>
Copyright © 2023 United States Government as represented by the
National Aeronautics and Space Administration. No copyright is claimed in
the United States under Title 17, U.S.Code. All Other Rights Reserved.
Notes
-----
<ul>
<li>At this time, this module is limited and does not attempt
to represent the entire SPASE data model.</li>
<li>If this module is extented to more completely represent the
SPASE data model, it should probably be a separate project.</li>
</ul>
"""
import xml.etree.ElementTree as ET
from typing import List
from hdpws import SPASE_NS
from hdpws import NAMESPACES as NS
class AccessURL:
"""
A class representing a /Spase//AccessURL element.
Parameters
----------
element_tree
A /Spase//AccessURL element tree.
Raises
------
ValueError
If the given element_tree is not a /Spase//AccessURL element tree.
"""
# pylint: disable=too-many-instance-attributes
def __init__(self,
element_tree: ET):
access_url = element_tree.find('.', namespaces=NS)
if access_url is None or \
access_url.tag != '{' + SPASE_NS + '}AccessURL':
raise ValueError('the given element is not an AccessURL')
name = access_url.find('Name', namespaces=NS)
if name is not None:
self.name = name.text
else:
self.name = None
url = access_url.find('URL', namespaces=NS)
if url is not None:
self.url = url.text
else:
self.url = None
style = access_url.find('Style', namespaces=NS)
if style is not None:
self.style = style.text
self.product_key = []
for product_key in access_url.findall('ProductKey', namespaces=NS):
self.product_key.append(product_key.text)
description = access_url.find('Description', namespaces=NS)
if description is not None:
self.description = description.text
else:
self.description = None
language = access_url.find('Language', namespaces=NS)
if language is not None:
self.language = language.text
else:
self.language = None
@property
def name(self) -> str:
"""
Gets the name value.
Returns
-------
str
name value.
"""
return self._name
@name.setter
def name(self, value: str):
"""
Sets the name value.
Parameters
----------
value
name value.
"""
self._name = value
@property
def url(self) -> str:
"""
Gets the url value.
Returns
-------
str
url value.
"""
return self._url
@url.setter
def url(self, value: str):
"""
Sets the url value.
Parameters
----------
value
url value.
"""
self._url = value
@property
def style(self) -> str:
"""
Gets the style value.
Returns
-------
str
style value.
"""
return self._style
@style.setter
def style(self, value: str):
"""
Sets the style value.
Parameters
----------
value
style value.
"""
self._style = value
@property
def product_key(self) -> str:
"""
Gets the product_key value.
Returns
-------
str
product_key value.
"""
return self._product_key
@product_key.setter
def product_key(self, value: str):
"""
Sets the product_key value.
Parameters
----------
value
product_key value.
"""
self._product_key = value
@property
def description(self) -> str:
"""
Gets the description value.
Returns
-------
str
description value.
"""
return self._description
@description.setter
def description(self, value: str):
"""
Sets the description value.
Parameters
----------
value
description value.
"""
self._description = value
@property
def language(self) -> str:
"""
Gets the language value.
Returns
-------
str
language value.
"""
return self._language
@language.setter
def language(self, value: str):
"""
Sets the language value.
Parameters
----------
value
language value.
"""
self._language = value
#
# URL of a page to display HAPI information
#
HAPI_DISPLAY_URL = 'https://cdaweb.gsfc.nasa.gov/registry/hdp/hapi/hapiHtml.html'
class HapiAccessURL(AccessURL):
"""
A HAPI specialization of a AccessURL class.
Parameters
----------
element_tree
A /Spase//AccessURL[Style = 'HAPI'] element tree.
Raises
------
ValueError
If the given element_tree is not a /Spase//AccessURL[Style = 'HAPI']
element tree.
"""
def __init__(self,
element_tree: ET):
super().__init__(element_tree)
if self.style != 'HAPI':
raise ValueError('the given element is not a HAPI AccessURL')
def get_html_url(self) -> str:
"""
Gets a URL that produces an HTML representation of the HAPI this
AccessURL.
Returns
-------
str
a URL that produces an HTML representation of the HAPI this
AccessURL.
"""
url = HAPI_DISPLAY_URL + '#url=' + self.url + '&id='
for product_key in self.product_key:
url += product_key + ','
return url[:-1]
class AccessInformation:
"""
A class representing a /Spase//AccessInformation element.
Parameters
----------
element_tree
A /Spase//AccessInformation element tree.
Raises
------
ValueError
If the given element_tree is not a /Spase//AccessInformation
element tree.
"""
# pylint: disable=too-many-instance-attributes
# pylint: disable=too-many-branches
def __init__(self,
element_tree: ET):
access_info = element_tree.find('.',
namespaces=NS)
if access_info is None or \
access_info.tag != '{' + SPASE_NS + '}AccessInformation':
raise ValueError('the given element is not an AccessInformation')
repository_id = access_info.find('RepositoryID', namespaces=NS)
if repository_id is not None:
self.repository_id = repository_id.text
else:
self.repository_id = None
availability = access_info.find('Availability', namespaces=NS)
if availability is not None:
self.availability = availability.text
else:
self.availability = None
access_rights = access_info.find('AccessRights', namespaces=NS)
if access_rights is not None:
self.access_rights = access_rights.text
else:
self.access_rights = None
self.access_url = []
for access_url in access_info.findall('AccessURL', namespaces=NS):
self.access_url.append(AccessURL(access_url))
self.format = []
for format_element in access_info.findall('Format', namespaces=NS):
self.format.append(format_element.text)
encoding = access_info.find('Encoding', namespaces=NS)
if encoding is not None:
self.encoding = encoding.text
else:
self.encoding = None
data_extent = access_info.find('DataExtent', namespaces=NS)
if data_extent is not None:
self.data_extent = data_extent.text
else:
self.data_extent = None
acknowledgement = access_info.find('Acknowledgement', namespaces=NS)
if acknowledgement is not None:
self.acknowledgement = acknowledgement.text
else:
self.acknowledgement = None
@property
def repository_id(self) -> str:
"""
Gets the RepositoryID value.
Returns
-------
str
repository_id value.
"""
return self._repository_id
@repository_id.setter
def repository_id(self, value: str):
"""
Sets the repository_id value.
Parameters
----------
value
repository_id value.
"""
self._repository_id = value
@property
def availability(self) -> str:
"""
Gets the availability value.
Returns
-------
str
availability value.
"""
return self._availability
@availability.setter
def availability(self, value: str):
"""
Sets the availability value.
Parameters
----------
value
availability value.
"""
self._availability = value
@property
def access_rights(self) -> str:
"""
Gets the access_rights value.
Returns
-------
date
access_rights value.
"""
return self._access_rights
@access_rights.setter
def access_rights(self, value: str):
"""
Sets the access_rights value.
Parameters
----------
value
access_rights value.
"""
self._access_rights = value
@property
def access_url(self) -> List[AccessURL]:
"""
Gets the access_url values.
Returns
-------
List
access_url values.
"""
return self._access_url
@access_url.setter
def access_url(self, values: List[AccessURL]):
"""
Sets the access_url values.
Parameters
----------
values
access_url values.
"""
self._access_url = values
@property
def format(self) -> List[str]:
"""
Gets the format value.
Returns
-------
List
format values.
"""
return self._format
@format.setter
def format(self, values: List[str]):
"""
Sets the format values.
Parameters
----------
values
format value.
"""
self._format = values
@property
def encoding(self) -> str:
"""
Gets the encoding value.
Returns
-------
date
encoding value.
"""
return self._encoding
@encoding.setter
def encoding(self, value: str):
"""
Sets the encoding value.
Parameters
----------
value
encoding value.
"""
self._encoding = value
@property
def data_extent(self) -> str:
"""
Gets the data_extent value.
Returns
-------
str
data_extent value.
"""
return self._data_extent
@data_extent.setter
def data_extent(self, value: str):
"""
Sets the data_extent value.
Parameters
----------
value
data_extent value.
"""
self._data_extent = value
@property
def acknowledgement(self) -> str:
"""
Gets the acknowledgement value.
Returns
-------
str
acknowledgement value.
"""
return self._acknowledgement
@acknowledgement.setter
def acknowledgement(self, value: str):
"""
Sets the acknowledgement value.
Parameters
----------
value
acknowledgement value.
"""
self._acknowledgement = value
Classes
class AccessInformation (element_tree:
) -
A class representing a /Spase//AccessInformation element.
Parameters
element_tree
- A /Spase//AccessInformation element tree.
Raises
ValueError
- If the given element_tree is not a /Spase//AccessInformation element tree.
Expand source code
class AccessInformation: """ A class representing a /Spase//AccessInformation element. Parameters ---------- element_tree A /Spase//AccessInformation element tree. Raises ------ ValueError If the given element_tree is not a /Spase//AccessInformation element tree. """ # pylint: disable=too-many-instance-attributes # pylint: disable=too-many-branches def __init__(self, element_tree: ET): access_info = element_tree.find('.', namespaces=NS) if access_info is None or \ access_info.tag != '{' + SPASE_NS + '}AccessInformation': raise ValueError('the given element is not an AccessInformation') repository_id = access_info.find('RepositoryID', namespaces=NS) if repository_id is not None: self.repository_id = repository_id.text else: self.repository_id = None availability = access_info.find('Availability', namespaces=NS) if availability is not None: self.availability = availability.text else: self.availability = None access_rights = access_info.find('AccessRights', namespaces=NS) if access_rights is not None: self.access_rights = access_rights.text else: self.access_rights = None self.access_url = [] for access_url in access_info.findall('AccessURL', namespaces=NS): self.access_url.append(AccessURL(access_url)) self.format = [] for format_element in access_info.findall('Format', namespaces=NS): self.format.append(format_element.text) encoding = access_info.find('Encoding', namespaces=NS) if encoding is not None: self.encoding = encoding.text else: self.encoding = None data_extent = access_info.find('DataExtent', namespaces=NS) if data_extent is not None: self.data_extent = data_extent.text else: self.data_extent = None acknowledgement = access_info.find('Acknowledgement', namespaces=NS) if acknowledgement is not None: self.acknowledgement = acknowledgement.text else: self.acknowledgement = None @property def repository_id(self) -> str: """ Gets the RepositoryID value. Returns ------- str repository_id value. """ return self._repository_id @repository_id.setter def repository_id(self, value: str): """ Sets the repository_id value. Parameters ---------- value repository_id value. """ self._repository_id = value @property def availability(self) -> str: """ Gets the availability value. Returns ------- str availability value. """ return self._availability @availability.setter def availability(self, value: str): """ Sets the availability value. Parameters ---------- value availability value. """ self._availability = value @property def access_rights(self) -> str: """ Gets the access_rights value. Returns ------- date access_rights value. """ return self._access_rights @access_rights.setter def access_rights(self, value: str): """ Sets the access_rights value. Parameters ---------- value access_rights value. """ self._access_rights = value @property def access_url(self) -> List[AccessURL]: """ Gets the access_url values. Returns ------- List access_url values. """ return self._access_url @access_url.setter def access_url(self, values: List[AccessURL]): """ Sets the access_url values. Parameters ---------- values access_url values. """ self._access_url = values @property def format(self) -> List[str]: """ Gets the format value. Returns ------- List format values. """ return self._format @format.setter def format(self, values: List[str]): """ Sets the format values. Parameters ---------- values format value. """ self._format = values @property def encoding(self) -> str: """ Gets the encoding value. Returns ------- date encoding value. """ return self._encoding @encoding.setter def encoding(self, value: str): """ Sets the encoding value. Parameters ---------- value encoding value. """ self._encoding = value @property def data_extent(self) -> str: """ Gets the data_extent value. Returns ------- str data_extent value. """ return self._data_extent @data_extent.setter def data_extent(self, value: str): """ Sets the data_extent value. Parameters ---------- value data_extent value. """ self._data_extent = value @property def acknowledgement(self) -> str: """ Gets the acknowledgement value. Returns ------- str acknowledgement value. """ return self._acknowledgement @acknowledgement.setter def acknowledgement(self, value: str): """ Sets the acknowledgement value. Parameters ---------- value acknowledgement value. """ self._acknowledgement = value
Instance variables
var access_rights : str
-
Gets the access_rights value.
Returns
date
- access_rights value.
Expand source code
@property def access_rights(self) -> str: """ Gets the access_rights value. Returns ------- date access_rights value. """ return self._access_rights
var access_url : List[AccessURL]
-
Gets the access_url values.
Returns
List
- access_url values.
Expand source code
@property def access_url(self) -> List[AccessURL]: """ Gets the access_url values. Returns ------- List access_url values. """ return self._access_url
var acknowledgement : str
-
Gets the acknowledgement value.
Returns
str
- acknowledgement value.
Expand source code
@property def acknowledgement(self) -> str: """ Gets the acknowledgement value. Returns ------- str acknowledgement value. """ return self._acknowledgement
var availability : str
-
Gets the availability value.
Returns
str
- availability value.
Expand source code
@property def availability(self) -> str: """ Gets the availability value. Returns ------- str availability value. """ return self._availability
var data_extent : str
-
Gets the data_extent value.
Returns
str
- data_extent value.
Expand source code
@property def data_extent(self) -> str: """ Gets the data_extent value. Returns ------- str data_extent value. """ return self._data_extent
var encoding : str
-
Gets the encoding value.
Returns
date
- encoding value.
Expand source code
@property def encoding(self) -> str: """ Gets the encoding value. Returns ------- date encoding value. """ return self._encoding
var format : List[str]
-
Gets the format value.
Returns
List
- format values.
Expand source code
@property def format(self) -> List[str]: """ Gets the format value. Returns ------- List format values. """ return self._format
var repository_id : str
-
Gets the RepositoryID value.
Returns
str
- repository_id value.
Expand source code
@property def repository_id(self) -> str: """ Gets the RepositoryID value. Returns ------- str repository_id value. """ return self._repository_id
class AccessURL (element_tree:
) -
A class representing a /Spase//AccessURL element.
Parameters
element_tree
- A /Spase//AccessURL element tree.
Raises
ValueError
- If the given element_tree is not a /Spase//AccessURL element tree.
Expand source code
class AccessURL: """ A class representing a /Spase//AccessURL element. Parameters ---------- element_tree A /Spase//AccessURL element tree. Raises ------ ValueError If the given element_tree is not a /Spase//AccessURL element tree. """ # pylint: disable=too-many-instance-attributes def __init__(self, element_tree: ET): access_url = element_tree.find('.', namespaces=NS) if access_url is None or \ access_url.tag != '{' + SPASE_NS + '}AccessURL': raise ValueError('the given element is not an AccessURL') name = access_url.find('Name', namespaces=NS) if name is not None: self.name = name.text else: self.name = None url = access_url.find('URL', namespaces=NS) if url is not None: self.url = url.text else: self.url = None style = access_url.find('Style', namespaces=NS) if style is not None: self.style = style.text self.product_key = [] for product_key in access_url.findall('ProductKey', namespaces=NS): self.product_key.append(product_key.text) description = access_url.find('Description', namespaces=NS) if description is not None: self.description = description.text else: self.description = None language = access_url.find('Language', namespaces=NS) if language is not None: self.language = language.text else: self.language = None @property def name(self) -> str: """ Gets the name value. Returns ------- str name value. """ return self._name @name.setter def name(self, value: str): """ Sets the name value. Parameters ---------- value name value. """ self._name = value @property def url(self) -> str: """ Gets the url value. Returns ------- str url value. """ return self._url @url.setter def url(self, value: str): """ Sets the url value. Parameters ---------- value url value. """ self._url = value @property def style(self) -> str: """ Gets the style value. Returns ------- str style value. """ return self._style @style.setter def style(self, value: str): """ Sets the style value. Parameters ---------- value style value. """ self._style = value @property def product_key(self) -> str: """ Gets the product_key value. Returns ------- str product_key value. """ return self._product_key @product_key.setter def product_key(self, value: str): """ Sets the product_key value. Parameters ---------- value product_key value. """ self._product_key = value @property def description(self) -> str: """ Gets the description value. Returns ------- str description value. """ return self._description @description.setter def description(self, value: str): """ Sets the description value. Parameters ---------- value description value. """ self._description = value @property def language(self) -> str: """ Gets the language value. Returns ------- str language value. """ return self._language @language.setter def language(self, value: str): """ Sets the language value. Parameters ---------- value language value. """ self._language = value
Subclasses
Instance variables
var description : str
-
Gets the description value.
Returns
str
- description value.
Expand source code
@property def description(self) -> str: """ Gets the description value. Returns ------- str description value. """ return self._description
var language : str
-
Gets the language value.
Returns
str
- language value.
Expand source code
@property def language(self) -> str: """ Gets the language value. Returns ------- str language value. """ return self._language
var name : str
-
Gets the name value.
Returns
str
- name value.
Expand source code
@property def name(self) -> str: """ Gets the name value. Returns ------- str name value. """ return self._name
var product_key : str
-
Gets the product_key value.
Returns
str
- product_key value.
Expand source code
@property def product_key(self) -> str: """ Gets the product_key value. Returns ------- str product_key value. """ return self._product_key
var style : str
-
Gets the style value.
Returns
str
- style value.
Expand source code
@property def style(self) -> str: """ Gets the style value. Returns ------- str style value. """ return self._style
var url : str
-
Gets the url value.
Returns
str
- url value.
Expand source code
@property def url(self) -> str: """ Gets the url value. Returns ------- str url value. """ return self._url
class HapiAccessURL (element_tree:
) -
A HAPI specialization of a AccessURL class.
Parameters
element_tree
- A /Spase//AccessURL[Style = 'HAPI'] element tree.
Raises
ValueError
- If the given element_tree is not a /Spase//AccessURL[Style = 'HAPI'] element tree.
Expand source code
class HapiAccessURL(AccessURL): """ A HAPI specialization of a AccessURL class. Parameters ---------- element_tree A /Spase//AccessURL[Style = 'HAPI'] element tree. Raises ------ ValueError If the given element_tree is not a /Spase//AccessURL[Style = 'HAPI'] element tree. """ def __init__(self, element_tree: ET): super().__init__(element_tree) if self.style != 'HAPI': raise ValueError('the given element is not a HAPI AccessURL') def get_html_url(self) -> str: """ Gets a URL that produces an HTML representation of the HAPI this AccessURL. Returns ------- str a URL that produces an HTML representation of the HAPI this AccessURL. """ url = HAPI_DISPLAY_URL + '#url=' + self.url + '&id=' for product_key in self.product_key: url += product_key + ',' return url[:-1]
Ancestors
Methods
def get_html_url(self) ‑> str
-
Gets a URL that produces an HTML representation of the HAPI this AccessURL.
Returns
str
- a URL that produces an HTML representation of the HAPI this AccessURL.
Expand source code
def get_html_url(self) -> str: """ Gets a URL that produces an HTML representation of the HAPI this AccessURL. Returns ------- str a URL that produces an HTML representation of the HAPI this AccessURL. """ url = HAPI_DISPLAY_URL + '#url=' + self.url + '&id=' for product_key in self.product_key: url += product_key + ',' return url[:-1]
Inherited members