Commit 238966c0 authored by Austin Sanders's avatar Austin Sanders
Browse files

Added logic to skip conversion from str to datetime

parent 08d7045f
Loading
Loading
Loading
Loading
+64 −11
Original line number Diff line number Diff line
@@ -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
@@ -97,10 +98,6 @@ def generate_serial_number(label):
                serial_entry = search_translation[serial_entry]
            elif '*' in search_translation.keys() and search_translation['*'] != '*':
                serial_entry = search_translation['*']
            try:
                serial_entry = serial_entry.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]
            except:
                pass
            serial_number.append(serial_entry)
        except:
            pass
@@ -114,13 +111,69 @@ class SerialNumberDecoder(pvl.decoder.PVLDecoder):
    serial number. Inherits from the PVLDecoder in planetarypy's pvl module.
    """

    def cast_unquoted_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)