From 513e102fc92aabfeffc441c75c4f87c31cdc4cc6 Mon Sep 17 00:00:00 2001
From: Eddy Pedroni <epedroni@pm.me>
Date: Mon, 23 Sep 2024 12:27:10 +0200
Subject: Parser returns dict instead of list

---
 src/parser.py          | 17 +++++++++--------
 src/parser_unittest.py | 13 +++++--------
 2 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/src/parser.py b/src/parser.py
index db05089..69718e5 100644
--- a/src/parser.py
+++ b/src/parser.py
@@ -3,15 +3,16 @@ from collections import namedtuple
 from enum import Enum
 from typing import TextIO, Iterator
 
-Card = namedtuple('Card', ['id', 'front', 'back'])
+Card = namedtuple('Card', ['front', 'back'])
 
-def _getCard(front_lines: list[str], back_lines: list[str]) -> Card:
+def _getCard(front_lines: list[str], back_lines: list[str]) -> tuple[int, Card]:
     front_text = "".join(front_lines).strip()
     back_text = "".join(back_lines).strip()
-    id = hash(front_text + back_text)
-    return Card(id, front_text, back_text)
+    card = Card(front_text, back_text)
+    id = hash(card)
+    return id, card
 
-def _getCards(f: TextIO) -> Iterator[Card]:
+def _getCards(f: TextIO) -> Iterator[tuple[id, Card]]:
     class State(Enum):
         PARSE_FRONT = 1,
         PARSE_BACK = 2
@@ -62,7 +63,7 @@ def _getCards(f: TextIO) -> Iterator[Card]:
 
     yield _getCard(front_lines, back_lines)
 
-def parse(path: Path) -> list[Card]:
+def parse(path: Path) -> dict[int, Card]:
     """
     Parse a .fcard file and return a list of Card instances.
 
@@ -89,7 +90,7 @@ def parse(path: Path) -> list[Card]:
     """
     if not path.is_file():
         print(f"[Warning] Not a file: {path}")
-        return []
+        return {}
 
     with open(path, "r") as f:
-        return [card for card in _getCards(f)]
+        return {id : card for id, card in _getCards(f)}
diff --git a/src/parser_unittest.py b/src/parser_unittest.py
index 02638e6..9ada265 100644
--- a/src/parser_unittest.py
+++ b/src/parser_unittest.py
@@ -32,10 +32,10 @@ Another back
 
 
         """
-    expected = [
+    expected = {
         ("Foo\n\nBar", "Fizz\n\nBuzz"),
         ("Another card", "Another back")
-    ]
+    }
     
     path = tmp_path / "valid_file.fcard"
     with open(path, "w") as f:
@@ -43,10 +43,7 @@ Another back
 
     cards = parser.parse(path)
 
-    assert expected == [(c.front, c.back) for c in cards]
-
-    # Cards have unique IDs
-    assert len(set([c.id for c in cards])) == len(cards)
+    assert expected == set(cards.values())
 
 # Edge cases
 def test_emptyFile(tmp_path):
@@ -55,11 +52,11 @@ def test_emptyFile(tmp_path):
         f.write("")
 
     cards = parser.parse(path)
-    assert cards == []
+    assert cards == {}
 
 def test_missingFile(tmp_path):
     cards = parser.parse(tmp_path / "missing_file.fcard")
-    assert cards == []
+    assert cards == {}
 
 def checkException(tmp_path, file_contents):
     path = tmp_path / "invalid_file.fcard"
-- 
cgit v1.2.3