Extending the API
To create a new api from this framework or modify an existing one, use the following classes from s100py.s1xx
as well as the ones in s100py.s100
.
S1xxObject for hdf5 groups with attributes, datasets and sub-groups.
S1xxDatasetBase for datasets (numpy arrays).
S1xxCollection for groups that have multiple occurrences using the S100 naming scheme (Group_NNN)
To make data members for one of the above classes, here is how to make a template in PyCharm to speed creation:
File-Settings-Editor-LiveTemplates
Create a new template (hit the plus button on the side) and name it S102 and give it a description paste in the code below (@property lines)
Click the Edit Variables and for $attr$ under expression put: snakeCase(SELECTION) at the bottom is a line that says “applicable in” and has a hyperlinked word (define or change) – click that and select Python
To use, highlight the camel case S102 attribute name and press ctrl-alt-J (or ctrl-alt-T) and select your S102 from the list It will fill in the names and then put the cursor in the right place to specify the type
- What it does:
take the selected text (name from the S102 doc) and:
make a read only property returning the S102 HDF5 attribute name
make a read/write property to contain the data
make a property to tell the type of the data
make a _create() function to make a default value for the attribute
Code to put in your live template
__$attr$_hdf_name__ = "$SELECTION$" #: HDF5 naming
@property
def $attr$(self) -> $type$:
return self._attributes[self.__$attr$_hdf_name__]
@$attr$.setter
def $attr$(self, val: $type$):
self._attributes[self.__$attr$_hdf_name__] = val
@property
def __$attr$_type__(self) -> Type[$type$]:
return $type$
def $attr$_create(self):
""" Creates a blank, empty or zero value for $attr$"""
# noinspection PyAttributeOutsideInit
# pylint: disable=attribute-defined-outside-init
self.$attr$ = self.__$attr$_type__()
- For enumeration data types use this template which is very similar
Again, click the Edit Variables and for $attr$ under expression put: snakeCase(SELECTION)
At the bottom is a line that says “applicable in” and has a hyperlinked word (define or change) – click that and select Python
__$attr$_hdf_name__ = "$SELECTION$" #: HDF5 naming
@property
def $attr$(self) -> $type$:
return self._attributes[self.__$attr$_hdf_name__]
@$attr$.setter
def $attr$(self, val: Union[int, str, $type$]):
self.set_enum_attribute(val, self.__$attr$_hdf_name__, self.__$attr$_type__)
@property
def __$attr$_type__(self) -> Type[$type$]:
return $type$
def $attr$_create(self):
""" Creates a value using the first item in the enumeration of $attr$"""
# Make the enum into a list and take the first value
# noinspection PyAttributeOutsideInit
# pylint: disable=attribute-defined-outside-init
self.$attr$ = list(self.__$attr$_type__)[0]
This template makes an attribute but specifies the type as well before you run it. Put the HDF5 name from the S100+ spec first followed by an arrow (->) then the type.
- Click the Edit Variables and:
for “type” under expression put: regularExpression(SELECTION, “.*->”, “”)
for “HDF5NAME” for expression put: regularExpression(SELECTION, “->.*”, “”)
for “attr” under expression put: snakeCase(regularExpression(SELECTION, “->.*”, “”))
at the bottom is a line that says “applicable in” and has a hyperlinked word (define or change) – click that and select Python
Types can be basic python types or custom created classes.
Ex: eastBoundLongitude->float
__$attr$_hdf_name__ = return "$HDF5NAME$" #: HDF5 naming
@property
def $attr$(self) -> $type$:
return self._attributes[self.__$attr$_hdf_name__]
@$attr$.setter
def $attr$(self, val: $type$):
self._attributes[self.__$attr$_hdf_name__] = val
@property
def __$attr$_type__(self) -> Type[$type$]:
return $type$
def $attr$_create(self):
""" Creates a blank, empty or zero value for $attr$
$SELECTION$
"""
# noinspection PyAttributeOutsideInit
# pylint: disable=attribute-defined-outside-init
self.$attr$ = self.__$attr$_type__()
And finally a similar one for enumerations. Same syntax or HDF5 name followed by the Enumeration name.
- Click the Edit Variables and:
for “type” under expression put: regularExpression(SELECTION, “.*->”, “”)
for “HDF5NAME” for expression put: regularExpression(SELECTION, “->.*”, “”)
for “attr” under expression put: snakeCase(regularExpression(SELECTION, “->.*”, “”))
at the bottom is a line that says “applicable in” and has a hyperlinked word (define or change) – click that and select Python
If you used the enumeration ‘MONTY’ from the sample api, this would look like dataName->MONTY
__$attr$_hdf_name__ = return "$HDF5NAME$" #: HDF5 naming
@property
def $attr$(self) -> $type$:
return self._attributes[self.__$attr$_hdf_name__]
@$attr$.setter
def $attr$(self, val: Union[int, str, $type$]):
self.set_enum_attribute(val, self.__$attr$_hdf_name__, self.$attr$_type)
@property
def __$attr$_type__(self) -> Type[$type$]:
return $type$
def $attr$_create(self):
""" Creates a blank, empty or zero value for $attr$
$SELECTION$
"""
# Make the enum into a list and take the first value
# noinspection PyAttributeOutsideInit
# pylint: disable=attribute-defined-outside-init
self.$attr$ = list(self.__$attr$_type__)[0]