Welcome, guest | Sign In | My Account | Store | Cart
#! /usr/bin/env python
"""Encapsulate verses from the Bible and support quizzing over them.

The Verse class in this module is far superior to the one implemented in
Java. All quizzing/testing capabilities are imported from another module."""

################################################################################

__author__ = 'Stephen "Zero" Chappell <Noctis.Skytower@gmail.com>'
__date__ = '11 February 2010'
__version__ = '$Revision: 3 $'

################################################################################

import manager
import timeout
import compare

################################################################################

class Verse:

    """Give a helpful interface to the reference and text of a verse.

    The Verse class initially came from TestVerse, written in Java and
    ported into Python. The verse-checking implementation was extremely
    naive and has been reimplemented in another module for this version."""

    __manager = False

    @classmethod
    def init_manager(cls, sleep_interval):
        """Initialize an optional verse-checking management system.

        If a verse is checked with a positive timeout argument, then the
        entry is checked with a timeout. Execution is only guaranteed to
        terminate as the "ready" property is regularly polled. A manager
        initialized here can ensure termination regardless of the client."""
        # This is an optional system. It ensures that timeouts are called.
        # SessionManager(s) cannot be killed, so this is a one-way choice.
        assert not cls.__manager, 'Verse manager is already initialized!'
        cls.__timeout = manager.SessionManager(sleep_interval)
        cls.__timeout.daemon = True
        cls.__timeout.start()
        cls.__manager = True

################################################################################

    def __init__(self, addr, text):
        """Initialize the reference and text of a Verse instance."""
        self.__addr = addr
        self.__text = text
        self.__search = timeout.add_timeout(compare.search)

    def check(self, entry, limit=0, ident=''):
        """Check the entry against the verse's official text.

        Calls with a non-positive limit are blocking in nature. Those with
        a limit greater than zero are started asynchronously and run in a
        separate process. If a timeout manager is running, a cancellation
        method is registered using an IP address and the verse reference."""
        if limit <= 0:
            return compare.search(self.__text, entry)
        # We are working with a timeout call.
        self.__search = timeout.add_timeout(compare.search, limit)
        self.__search(self.__text, entry)
        if Verse.__manager:
            # The verse manager timeout system should be used.
            with Verse.__timeout:
                session = manager.Session(limit + 1, self.__search.cancel)
                Verse.__timeout[ident + ' -> ' + self.__addr] = session

################################################################################

    @property
    def addr(self):
        """Read-only address or reference property."""
        return self.__addr

    @property
    def text(self):
        """Read-only text (from the verse) property."""
        return self.__text

    @property
    def hint(self):
        """Read-only property that computes the hint."""
        return compare.empty_master(self.__text)

    @property
    def ready(self):
        """Read-only status property for a verse check."""
        return self.__search.ready

    @property
    def value(self):
        """Read-only return property for a verse check."""
        return self.__search.value

History

  • revision 3 (14 years ago)
  • previous revisions are not available