Пример #1
0
    def test_hash(self):
        """__hash__() interface tests."""
        card = Flashcard('q', 'a', 2027, 19, str(datetime.utcnow()))
        card_prime = Flashcard('q', 'a', 27, 9, str(datetime.utcnow()))

        _ = {card: card_prime}  # Hashable items can be dictionary keys.
        self.assertEqual(hash(card), hash(card))
        self.assertNotEqual(hash(card), hash(card_prime))
Пример #2
0
    def test_equality(self):
        """__eq__() interface tests."""
        card = Flashcard('q', 'a', 2027, 19, str(datetime.utcnow()))
        card_prime = Flashcard('q', 'a', 27, 9, str(datetime.utcnow()))

        self.assertEqual(card, card)
        self.assertNotEqual(card, card_prime)
        self.assertNotEqual(card, str(card))
Пример #3
0
 def setUp(self):
     self.deck_name = 'test deck'
     self.deck = Deck(self.deck_name)
     self.cards = [
         Flashcard('q0', 'a0', 0, 0, str(datetime.datetime.utcnow())),
         Flashcard('q1', 'a1', 0, 0, str(datetime.datetime.utcnow())),
         Flashcard('q2', 'a2', 0, 0, str(datetime.datetime.utcnow()))
     ]
     for c in self.cards:
         self.deck.add_card(c)
Пример #4
0
    def test_incorrect(self):
        """incorrect() interface tests."""
        card = Flashcard('question', 'answer')
        correct = card.n_correct
        attempts = card.n_attempts
        card.incorrect()

        self.assertEqual(card.n_correct, correct)
        self.assertEqual(card.n_attempts, attempts + 1)
        self.assertTrue(isinstance(card.last_shown, datetime))
Пример #5
0
    def save(self, filename, overwrite=False):
        """Save the deck to file.

        Args:
            filename (str): Path to deck file.
            overwrite (bool): Overwrite existing file flag.
                True -> Overwrite file if it exists.
                False -> Raise exception if file exists.

        Raises:
            ValueError: filename exists.
        """
        if os.path.isfile(filename) and not overwrite:
            raise ValueError('{} exists.'.format(filename))

        with open(filename, mode='w', newline='') as f:
            deckwriter = csv.writer(f)
            deckwriter.writerow([
                '{keyword} {value}'.format(keyword=self.ReservedWords.name,
                                           value=self.name),
            ])
            deckwriter.writerow([self.ReservedWords.quiz])
            deckwriter.writerow(Flashcard.headers().split(', '))
            for c in self._cards:
                deckwriter.writerow(str(c).split(', '))
Пример #6
0
    def test_construction_defaults(self):
        """Constructor tests -- defaults."""
        card = Flashcard()

        self.assertEqual(card.question, None)
        self.assertEqual(card.answer, None)
        self.assertEqual(card.n_attempts, 0)
        self.assertEqual(card.n_correct, 0)
        self.assertEqual(card.last_shown, None)
Пример #7
0
    def test_construction(self):
        """Constructor tests."""
        def verify(c):
            self.assertEqual(c.question, question)
            self.assertEqual(c.answer, answer)
            self.assertEqual(c.n_attempts, attempts)
            self.assertEqual(c.n_correct, correct)
            self.assertEqual(c.last_shown, timestamp)

        question = 'q'
        answer = 'a'
        attempts = 42
        correct = 17
        timestamp = datetime.utcnow()

        card = Flashcard(question, answer, attempts, correct, str(timestamp))
        verify(card)

        card = Flashcard(question, answer, str(attempts), str(correct),
                         str(timestamp))
        verify(card)
Пример #8
0
 def test_display(self):
     """Display interfaces (__str__ and header) tests."""
     card = Flashcard('Question', 'Answer')
     card.n_attempts = 'Attempts'
     card.n_correct = 'Correct'
     card.last_shown = 'Last Shown'
     self.assertEqual(str(card), card.headers())
Пример #9
0
def swap(args):
    """Swap-create a new flashcard deck.

    Create a new flashcard deck by swapping questions and answers.

    Args:
        args (argparse.Namespace): command line arguments.
    """
    print('Swapping questions and answers from {} and saving to {}.'.format(
        args.deck, args.dest))
    src = Deck.load(args.deck)
    dest = Deck(src.name)
    for c in src:
        dest.add_card(Flashcard(c.answer, c.question))

    dest.save(args.dest)
Пример #10
0
def create(args):
    """Create a new flashcard deck.

    Args:
        args (argparse.Namespace): command line arguments.
    """
    _logger.info('Creating deck {}.'.format(args.deck))

    if os.path.exists(args.deck):
        raise ValueError('{} already exists.'.format(args.deck))

    name = input('Deck Name: ')
    deck = Deck(name)
    print('Enter an empty question to finish.')
    for idx in itertools.count(1):
        q = input('Question #{}: '.format(idx))
        if not q:
            break

        a = input('Answer #{}: '.format(idx))
        deck.add_card(Flashcard(q, a))

    deck.save(args.deck)
Пример #11
0
    def load(cls, filename):
        """Load a deck.

        Args:
            filename (str): Path to deck file.

        Raises:
            ValueError: filename is not a valid deck.
        """
        name = ''
        deck = None
        with open(filename, mode='r', newline='') as f:
            csvreader = csv.reader(f)

            # Parse reserved keywords until we hit the beginning of quiz data.
            for row in csvreader:
                cell = row[0]
                if cls._starts_with_reserved_word(cell):
                    if cell.startswith(cls.ReservedWords.name):
                        name = cls._deck_name(cell)
                    elif cell.startswith(cls.ReservedWords.quiz):
                        break

            else:
                raise ValueError('{} not a deck file.'.format(filename))

            # Quiz data is csv.
            deck = cls(name)
            for idx, row in enumerate(csvreader):
                if idx == 0:
                    continue

                card = Flashcard(*row)
                deck.add_card(card)

        return deck