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))
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))
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)
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))
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(', '))
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)
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)
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())
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)
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)
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