#!/usr/bin/env python
# -*- coding: latin-1 -*-
#
# @module towers.core.errors
# @version 0.1
# @copyright (c) 2017-present Francis Horsman.
__all__ = [
'TowersError',
'DuplicateDisk',
'CorruptRod',
'InvalidStartingConditions',
'InvalidEndingConditions',
'InvalidTowerHeight',
'InvalidDiskPosition',
'InvalidRod',
'InvalidRodHeight',
'InvalidRods',
'InvalidMoves',
]
class TowersError(Exception):
"""
Base class of all `towers` errors.
"""
pass
[docs]class InvalidRod(TypeError, TowersError):
[docs] def __init__(self, rod):
"""
:param object rod:
The :class:`Rod` which is invalid.
"""
super(InvalidRod, self).__init__(
'invalid rod: {rod}'.format(rod=rod))
self.rod = rod
[docs]class InvalidRods(TypeError, TowersError):
[docs] def __init__(self, rods):
"""
:param object rods:
The :class:`Rods` which are invalid
"""
super(InvalidRods, self).__init__(
'invalid rod: {rods}'.format(
rods=rods))
self.rods = rods
[docs]class InvalidRodHeight(ValueError, TowersError):
[docs] def __init__(self, rod, max_height):
"""
:param Rod rod:
The :class:`Rod` which has an invalid height.
:param int max_height:
The max allowed height of the :class:`Rod`.
"""
super(InvalidRodHeight, self).__init__(
'invalid rod height: {rod} expecting: {height}.'.format(
rod=rod, height=max_height))
self.rod = rod
self.height = max_height
[docs]class DuplicateDisk(ValueError, TowersError):
"""
A duplicate disk was found on a tower.
"""
[docs] def __init__(self, rod, disk_width):
"""
:param Rod rod:
The duplicate :class:`Rod`.
:param int disk_width:
The width of the :class:`Disk`.
"""
super(DuplicateDisk, self).__init__(
'Duplicate disk width found: {disk_width} in: {rod}'.format(
disk_width=disk_width, rod=rod))
self.rod = rod
self.disk_width = disk_width
[docs]class CorruptRod(ValueError, TowersError):
"""
A :class:`Rod` with an invalid stack of disks was found.
"""
[docs] def __init__(self, rod, disk):
"""
:param Rod rod:
The :class:`Rod` which is corrupt.
:param int disk:
A :class:`Disk` which sits directly atop a smaller :class:`Disk`.
"""
super(CorruptRod, self).__init__(
'Corrupt rod, at least one disk is larger than the one below it: {rod}'.format(
rod=rod))
self.rod = rod
self.disk = disk
[docs]class InvalidStartingConditions(ValueError, TowersError):
"""
The :class:`Rods` for the towers are not in the correct starting state.
"""
[docs] def __init__(self, rods, moves):
"""
:param Rod rods:
The :class:`Rod`'s.
:param int moves:
Total number of moves already made (should be zero).
"""
super(InvalidStartingConditions, self).__init__(
'Invalid starting condition for rods: {rods}, with existing moves: {moves}'.format(
rods=rods, moves=moves))
self.rods = rods
self.moves = moves
[docs]class InvalidEndingConditions(ValueError, TowersError):
"""
The :class:`Rod`'s for the towers are not in the correct ending state.
"""
[docs] def __init__(self, rods):
"""
:param Rod rods:
The :class:`Rod`'s.
"""
super(InvalidEndingConditions, self).__init__(
'Invalid ending condition for rods: {rods}'.format(
rods=rods))
self.rods = rods
[docs]class InvalidTowerHeight(ValueError, TowersError):
"""
The height of the :class:`Tower` is invalid.
"""
[docs] def __init__(self, height):
"""
:param int height:
The invalid height.
"""
super(InvalidTowerHeight, self).__init__(
'Invalid tower height: {height}'.format(
height=height))
self.height = height
[docs]class InvalidDiskPosition(ValueError, TowersError):
"""
The position of the :class:`Disk` is invalid.
"""
[docs] def __init__(self, position, height):
"""
:param int position:
The invalid position on the :class:`Rod`.
:param int height:
The height.
"""
super(InvalidDiskPosition, self).__init__(
'Invalid disk position: {position} on Rod of height: {height}'.format(
position=position, height=height))
self.position = position
self.height = height
[docs]class InvalidMoves(ValueError, TowersError):
"""
An invalid number of moves.
"""
[docs] def __init__(self, moves):
"""
:param int moves:
The invalid `moves`.
"""
super(InvalidMoves, self).__init__(
'Invalid moves: {moves}'.format(
moves=moves))
self.moves = moves