Loading .travis.yml +2 −2 Original line number Diff line number Diff line Loading @@ -55,8 +55,8 @@ after_success: - source deactivate - conda install -q conda-build anaconda-client - conda config --set anaconda_upload no - conda build recipe -q - builddir=(`conda build recipe --output`) - travis_wait conda build recipe -q - travis_wait builddir=(`conda build recipe --output`) - | if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then anaconda -t="$CONDA_UPLOAD_TOKEN" upload $builddir --force; Loading plio/io/io_controlnetwork.py +14 −14 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ def to_isis(obj, path, mode='wb', version=2, buffer_header_size, points_bytes, creation_date, modified_date) store.write(header) store.write(header.encode('utf-8')) class IsisStore(object): """ Loading Loading @@ -292,8 +292,8 @@ class IsisStore(object): """ Parameters ---------- data : str to be written to the file data : bytes Encoded header to be written to the file offset : int The byte offset into the output binary """ Loading Loading @@ -461,7 +461,7 @@ class IsisStore(object): An ISIS compliant PVL header object """ encoder = pvl.encoder.IsisCubeLabelEncoder encoder = pvl.encoder.ISISEncoder(end_delimiter=False) header_bytes = buffer_header_size points_start_byte = HEADERSTARTBYTE + buffer_header_size Loading Loading @@ -489,4 +489,4 @@ class IsisStore(object): ) ]) return pvl.dumps(header, cls=encoder) return pvl.dumps(header, encoder=encoder) plio/io/io_spectral_profiler.py +2 −2 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ class Spectral_Profiler(object): "^SP_SPECTRUM_REF1", "^SP_SPECTRUM_QA", "^L2D_RESULT_ARRAY", "^SP_SPECTRUM_RAD"]: continue if isinstance(v, pvl._collections.Units): if isinstance(v, pvl.collections.Quantity): k = "{}_{}".format(k, v.units) v = v.value keys.append(k) Loading plio/io/io_tes.py +1 −1 Original line number Diff line number Diff line Loading @@ -239,7 +239,7 @@ class Tes(object): with open(var_file, "rb") as var: buffer = var.read() def process_rad(index): if index is -1: if index == -1: return None length = np.frombuffer(buffer[index:index+2], dtype='>u2')[0] Loading plio/io/isis_serial_number.py +67 −9 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ import warnings import pvl from pvl.collections import PVLModule from itertools import chain import plio from plio.data import get_data Loading Loading @@ -70,7 +71,7 @@ def generate_serial_number(label): The ISIS compatible serial number """ if not isinstance(label, PVLModule): label = pvl.load(label, cls=SerialNumberDecoder) label = pvl.load(label, decoder=SerialNumberDecoder()) # Get the translation information translation = get_isis_translation(label) Loading Loading @@ -99,6 +100,7 @@ def generate_serial_number(label): serial_number.append(serial_entry) except: pass return '/'.join(serial_number) Loading @@ -108,13 +110,69 @@ class SerialNumberDecoder(pvl.decoder.PVLDecoder): serial number. Inherits from the PVLDecoder in planetarypy's pvl module. """ def cast_unquoated_string(self, value): def decode_simple_value(self, value: str): """Returns a Python object based on *value*, assuming that *value* can be decoded as a PVL Simple Value:: <Simple-Value> ::= (<Numeric> | <String>) Modified from https://pvl.readthedocs.io/en/stable/_modules/pvl/decoder.html#PVLDecoder.decode_simple_value Modification entails stripping datetime from list of functions. """ Overrides the parent class's method so that any un-quoted string type value found in the parsed pvl will just return the original value. This is needed so that keyword values are not re-formatted from what is originally in the ISIS cube label. for d in ( self.decode_quoted_string, self.decode_non_decimal, self.decode_decimal, ): try: return d(value) except ValueError: pass if value.casefold() == self.grammar.none_keyword.casefold(): return None if value.casefold() == self.grammar.true_keyword.casefold(): return True if value.casefold() == self.grammar.false_keyword.casefold(): return False return self.decode_unquoted_string(value) def decode_unquoted_string(self, value: str) -> str: """Returns a Python ``str`` if *value* can be decoded as an unquoted string, based on this decoder's grammar. Raises a ValueError otherwise. Note: This affects value types that are recognized as null, boolean, number, datetime, et at. Modified from: https://pvl.readthedocs.io/en/stable/_modules/pvl/decoder.html#PVLDecoder.decode_unquoted_string Modification entails removal of decode_datetime call """ return value.decode('utf-8') for coll in ( ("a comment", chain.from_iterable(self.grammar.comments)), ("some whitespace", self.grammar.whitespace), ("a special character", self.grammar.reserved_characters), ): for item in coll[1]: if item in value: raise ValueError( "Expected a Simple Value, but encountered " f'{coll[0]} in "{self}": "{item}".' ) agg_keywords = self.grammar.aggregation_keywords.items() for kw in chain.from_iterable(agg_keywords): if kw.casefold() == value.casefold(): raise ValueError( "Expected a Simple Value, but encountered " f'an aggregation keyword: "{value}".' ) for es in self.grammar.end_statements: if es.casefold() == value.casefold(): raise ValueError( "Expected a Simple Value, but encountered " f'an End-Statement: "{value}".' ) return str(value) Loading
.travis.yml +2 −2 Original line number Diff line number Diff line Loading @@ -55,8 +55,8 @@ after_success: - source deactivate - conda install -q conda-build anaconda-client - conda config --set anaconda_upload no - conda build recipe -q - builddir=(`conda build recipe --output`) - travis_wait conda build recipe -q - travis_wait builddir=(`conda build recipe --output`) - | if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then anaconda -t="$CONDA_UPLOAD_TOKEN" upload $builddir --force; Loading
plio/io/io_controlnetwork.py +14 −14 Original line number Diff line number Diff line Loading @@ -148,7 +148,7 @@ def to_isis(obj, path, mode='wb', version=2, buffer_header_size, points_bytes, creation_date, modified_date) store.write(header) store.write(header.encode('utf-8')) class IsisStore(object): """ Loading Loading @@ -292,8 +292,8 @@ class IsisStore(object): """ Parameters ---------- data : str to be written to the file data : bytes Encoded header to be written to the file offset : int The byte offset into the output binary """ Loading Loading @@ -461,7 +461,7 @@ class IsisStore(object): An ISIS compliant PVL header object """ encoder = pvl.encoder.IsisCubeLabelEncoder encoder = pvl.encoder.ISISEncoder(end_delimiter=False) header_bytes = buffer_header_size points_start_byte = HEADERSTARTBYTE + buffer_header_size Loading Loading @@ -489,4 +489,4 @@ class IsisStore(object): ) ]) return pvl.dumps(header, cls=encoder) return pvl.dumps(header, encoder=encoder)
plio/io/io_spectral_profiler.py +2 −2 Original line number Diff line number Diff line Loading @@ -100,7 +100,7 @@ class Spectral_Profiler(object): "^SP_SPECTRUM_REF1", "^SP_SPECTRUM_QA", "^L2D_RESULT_ARRAY", "^SP_SPECTRUM_RAD"]: continue if isinstance(v, pvl._collections.Units): if isinstance(v, pvl.collections.Quantity): k = "{}_{}".format(k, v.units) v = v.value keys.append(k) Loading
plio/io/io_tes.py +1 −1 Original line number Diff line number Diff line Loading @@ -239,7 +239,7 @@ class Tes(object): with open(var_file, "rb") as var: buffer = var.read() def process_rad(index): if index is -1: if index == -1: return None length = np.frombuffer(buffer[index:index+2], dtype='>u2')[0] Loading
plio/io/isis_serial_number.py +67 −9 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ import warnings import pvl from pvl.collections import PVLModule from itertools import chain import plio from plio.data import get_data Loading Loading @@ -70,7 +71,7 @@ def generate_serial_number(label): The ISIS compatible serial number """ if not isinstance(label, PVLModule): label = pvl.load(label, cls=SerialNumberDecoder) label = pvl.load(label, decoder=SerialNumberDecoder()) # Get the translation information translation = get_isis_translation(label) Loading Loading @@ -99,6 +100,7 @@ def generate_serial_number(label): serial_number.append(serial_entry) except: pass return '/'.join(serial_number) Loading @@ -108,13 +110,69 @@ class SerialNumberDecoder(pvl.decoder.PVLDecoder): serial number. Inherits from the PVLDecoder in planetarypy's pvl module. """ def cast_unquoated_string(self, value): def decode_simple_value(self, value: str): """Returns a Python object based on *value*, assuming that *value* can be decoded as a PVL Simple Value:: <Simple-Value> ::= (<Numeric> | <String>) Modified from https://pvl.readthedocs.io/en/stable/_modules/pvl/decoder.html#PVLDecoder.decode_simple_value Modification entails stripping datetime from list of functions. """ Overrides the parent class's method so that any un-quoted string type value found in the parsed pvl will just return the original value. This is needed so that keyword values are not re-formatted from what is originally in the ISIS cube label. for d in ( self.decode_quoted_string, self.decode_non_decimal, self.decode_decimal, ): try: return d(value) except ValueError: pass if value.casefold() == self.grammar.none_keyword.casefold(): return None if value.casefold() == self.grammar.true_keyword.casefold(): return True if value.casefold() == self.grammar.false_keyword.casefold(): return False return self.decode_unquoted_string(value) def decode_unquoted_string(self, value: str) -> str: """Returns a Python ``str`` if *value* can be decoded as an unquoted string, based on this decoder's grammar. Raises a ValueError otherwise. Note: This affects value types that are recognized as null, boolean, number, datetime, et at. Modified from: https://pvl.readthedocs.io/en/stable/_modules/pvl/decoder.html#PVLDecoder.decode_unquoted_string Modification entails removal of decode_datetime call """ return value.decode('utf-8') for coll in ( ("a comment", chain.from_iterable(self.grammar.comments)), ("some whitespace", self.grammar.whitespace), ("a special character", self.grammar.reserved_characters), ): for item in coll[1]: if item in value: raise ValueError( "Expected a Simple Value, but encountered " f'{coll[0]} in "{self}": "{item}".' ) agg_keywords = self.grammar.aggregation_keywords.items() for kw in chain.from_iterable(agg_keywords): if kw.casefold() == value.casefold(): raise ValueError( "Expected a Simple Value, but encountered " f'an aggregation keyword: "{value}".' ) for es in self.grammar.end_statements: if es.casefold() == value.casefold(): raise ValueError( "Expected a Simple Value, but encountered " f'an End-Statement: "{value}".' ) return str(value)