Exemplo n.º 1
0
    def _format_date(self, date):
        """
        Convert struct_time to QIF date format (MM/DD/YYYY).

        Parameters
        ----------
        date : time.struct_time
            The date of the transaction.

        Returns
        -------
        str
            String date in the format of "MM/DD/YYYY".

        Raises
        ------
        TypeError
            If date is not a struct_time.
        ValueError
            If a date value is out of range.
        OverflowError
            If a value in the tuple is too large to be stored in a C long.
        """
        try:
            return time.strftime("%m/%d/%Y", date)
        except (ValueError, TypeError, OverflowError) as err:
            msg = "date ({0}) cannot be converted ".format(date) + "to MM/DD/YYYY "
            exception.add_message(err, msg)
            raise
Exemplo n.º 2
0
    def parse(self, string):
        """
        Returns
        -------
        powl.actiondata.TransactionData
            Contains data to perform a transaction action.

        Raises
        ------
        ValueError
            If amount is not a float.
            If a value for TransactionData is missing.
        """
        data = actiondata.TransactionData()
        params = string.split(self._TOKEN_FLAG)

        for param in params:
            if re.match(self._TOKEN_DEBIT, param):
                data.debit = re.sub(self._TOKEN_DEBIT, "", param)
                data.debit = data.debit.strip()
            elif re.match(self._TOKEN_CREDIT, param):
                data.credit = re.sub(self._TOKEN_CREDIT, "", param)
                data.credit = data.credit.strip()
            elif re.match(self._TOKEN_AMOUNT, param):
                data.amount = re.sub(self._TOKEN_AMOUNT, "", param)
                data.amount = data.amount.strip()
            elif re.match(self._TOKEN_MEMO, param):
                data.memo = re.sub(self._TOKEN_MEMO, "", param)
                data.memo = data.memo.replace('"', "")
                data.memo = data.memo.strip()

        if not data.debit:
            msg = "debit is missing from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        if not data.credit:
            msg = "credit is missing from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        if not data.amount:
            msg = "amount is missing from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        if not data.memo:
            msg = "memo is missing from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        try:
            float(data.amount)
        except ValueError as err:
            message = "amount ({0}) is not a number".format(data.amount)
            exception.add_message(err, message)
            raise

        return data
Exemplo n.º 3
0
 def test__add__sanity(self):
     """
     Test that added message by string can be retrieved.
     """
     error_message = "error message"
     err = Exception()
     exception.add_message(err, error_message)
     actual = exception.get_message(err)
     self.assertEqual(error_message, actual)
Exemplo n.º 4
0
    def parse(self, string):
        """
        Returns
        -------
        powl.actiondata.BodyCompositionData
            Contains data to perform a body composition action.

        Raises
        ------
        ValueError
            If mass or fat percentage is not a float.
            If a value for BodyCompositionData is missing.
        """
        data = actiondata.BodyCompositionData()
        params = string.split(self._TOKEN_FLAG)

        for param in params:
            if re.match(self._TOKEN_MASS, param):
                data.mass = re.sub(self._TOKEN_MASS, "", param)
                data.mass = data.mass.strip()
            elif re.match(self._TOKEN_FAT, param):
                data.fat_percentage = re.sub(self._TOKEN_FAT, "", param)
                data.fat_percentage = data.fat_percentage.strip()

        if not data.mass:
            msg = "mass was not parsed from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        if not data.fat_percentage:
            msg = "fat percentage was not parsed " + "from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        try:
            float(data.mass)
        except ValueError as err:
            msg = "mass ({0}) is not a number".format(data.mass)
            exception.add_message(err, msg)
            raise

        try:
            float(data.fat_percentage)
        except ValueError as err:
            msg = "fat percentage ({0}) ".format(data.fat_percentage) + "is not a number"
            exception.add_message(err, msg)
            raise

        return data
Exemplo n.º 5
0
    def login(self, user, password):
        self._assert_connected()
        self._assert_not_empty(user, _ERRMSG_EMPTY_USER)
        self._assert_not_empty(password, _ERRMSG_EMPTY_PASSWORD)

        try:
            self._imap.login(user, password)
        except imaplib.IMAP4.error as err:
            if ("Invalid credentials" in str(err) or
                    "AUTHENTICATIONFAILED" in str(err)):
                errmsg = _ERRMSG_INVALID_CREDENTIALS
                exception.add_message(err, errmsg)
            raise

        self._select_mailbox()
        self._logged_in = True
Exemplo n.º 6
0
    def connect(self, server):
        self._assert_not_empty(server, _ERRMSG_EMPTY_SERVER)

        try:
            self._imap = imaplib.IMAP4_SSL(server)
        except socket.timeout as err:
            errmsg = _ERRMSG_TIMEOUT.format(server)
            exception.add_message(err, errmsg)
            raise
        except IOError as err:
            if err.errno == socket.EAI_NONAME:
                errmsg = _ERRMSG_SERVER_NOT_FOUND.format(server)
            elif err.errno == socket.errno.ENETUNREACH:
                errmsg = _ERRMSG_SERVER_NOT_FOUND.format(server)
            else:
                errmsg = _ERRMSG_CONNECT_UNKNOWN.format(server)
            exception.add_message(err, errmsg)
            raise
Exemplo n.º 7
0
    def do_action(self, action_type, action_data, action_date):
        """
        Do the specified action.

        Parameters
        ----------
        action_type : powl.actiontype
            The type of action to do.
        action_data : str
            Formatted string containing action data.
        action_date : time.struct_time
            Date associated with the action.
        """
        try:
            action = self._action_type_to_action_map[action_type]
        except KeyError as err:
            message = "action type ({0}) is unknown".format(action_type)
            exception.add_message(err, message)
            raise
        else:
            action.do(action_data, action_date)
Exemplo n.º 8
0
    def parse(self, string):
        """
        Returns
        -------
        powl.actiondata.BodyCompositionData
            Contains data to perform a body composition action.

        Raises
        ------
        ValueError
            If mass or fat percentage is not a float.
            If a value for BodyCompositionData is missing.
        """
        data = actiondata.BodyCompositionData()
        params = re.split(self._DELIMITER, string, self._MAX_SPLITS)

        if len(params) < self._NUM_PARAMS:
            msg = "not enough arguments from ({0})".format(string)
            err = exception.create(ValueError, msg)
            raise err

        mass = params[self._POSITION_MASS]
        fat_percentage = params[self._POSITION_FAT]

        try:
            data.mass = float(mass)
        except ValueError as err:
            msg = "mass ({0}) is not a number".format(mass)
            exception.add_message(err, msg)
            raise

        try:
            data.fat_percentage = float(fat_percentage)
        except ValueError as err:
            msg = "fat percentage ({0}) ".format(fat_percentage) + "is not a number"
            exception.add_message(err, msg)
            raise

        return data
Exemplo n.º 9
0
    def _format_amount(self, debit, amount):
        """
        Convert amount to QIF format based on debit.

        Parameters
        ----------
        debit : str
            Account key for the debit of a transaction.
        amount : str or float
            Amount of the transaction.

        Returns
        -------
        str
            Formatted amount to use in QIF file.

        Raises
        ------
        ValueError
            If amount cannot be converted to a float.
        KeyError
            If debit key is not an account.
        """
        try:
            formatted_amount = "{0:.2f}".format(float(amount))
        except ValueError as err:
            msg = "amount ({0}) cannot be converted to float".format(amount)
            exception.add_message(err, msg)
            raise

        if debit in self._expenses:
            # Amount should be negative.
            return "-" + formatted_amount
        elif debit in self._accounts:
            return formatted_amount
        else:
            msg = "account key ({0}) does not exist".format(debit)
            err = exception.create(KeyError, msg)
            raise err
Exemplo n.º 10
0
    def parse(self, item):
        """
        Returns
        -------
        tuple of powl.actiontype and str
            The action type and a string containing data for the action.

        Raises
        ------
        KeyError
            If the action_key is not in the action map.
        ValueError
            If a valid action was not parsed.
        """
        action_key, data = item.split(self._DELIMITER, 1)

        try:
            action_type = actiontype.ACTION_MAP[action_key]
        except KeyError as err:
            msg = "action key ({0}) is unknown".format(action_key)
            exception.add_message(err, msg)
            raise
        else:
            return action_type, data