Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ def fetch_calendar(self, start_date: date, end_date: date) -> List[Tournament]:
continue

title = h3_tag.text.strip()
if title.startswith("Limited"):
continue
event_url = urljoin(MTGO_ROOT_URL, a_tag.get("href", ""))
date_str = time_tag.get("datetime", "")

Expand Down
1 change: 1 addition & 0 deletions src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"Vintage",
"Pauper",
"Commander",
"Premodern",
]

SCRYFALL_BULK_URL = "https://api.scryfall.com/bulk-data"
Expand Down
5 changes: 5 additions & 0 deletions src/scraper.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,11 @@ def _sync_tournament(
if not t.date:
t.date = today

if t.name and t.name.startswith("Limited"):
logger.info("Skipping Limited event: %s", t.name)
stats["skipped"] += 1
return True

safe_filename = sanitize_filename(t.json_file or "unknown.json")
target_dir = os.path.join(
self.cache_root,
Expand Down
44 changes: 44 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,12 @@ def test_tournament_from_url():
t_duel = tournament_from_url(duel_url)
assert t_duel.formats == "Commander"

premodern_url = (
"https://www.mtgo.com/decklist/premodern-challenge-32-2026-09-1012854063"
)
t_premodern = tournament_from_url(premodern_url)
assert t_premodern.formats == "Premodern"


def test_fetch_event_data_404_no_retry():
client = MTGOClient(max_retries=3)
Expand Down Expand Up @@ -164,3 +170,41 @@ def test_fetch_event_data_with_request_delay(monkeypatch):

client.fetch_event_data("https://www.mtgo.com/decklist/test")
assert sleep_calls == [0.1]


def test_fetch_calendar_skips_limited_events():
client = MTGOClient()
mock_resp = MagicMock()
mock_resp.status_code = 200
mock_resp.text = """
<html>
<body>
<li class="decklists-item">
<a href="/decklist/modern-challenge-64-2026-09-1012854060">
<div><h3>Modern Challenge 64</h3></div>
<time datetime="2026-09-10T13:00:00.000Z"></time>
</a>
</li>
<li class="decklists-item">
<a href="/decklist/limited-super-qualifier-2026-09-1012645816">
<div><h3>Limited Super Qualifier</h3></div>
<time datetime="2026-09-10T14:05:00.000Z"></time>
</a>
</li>
<li class="decklists-item">
<a href="/decklist/premodern-challenge-32-2026-09-1012854063">
<div><h3>Premodern Challenge 32</h3></div>
<time datetime="2026-09-10T17:00:00.000Z"></time>
</a>
</li>
</body>
</html>
"""
client.session.get = MagicMock(return_value=mock_resp)

tournaments = client.fetch_calendar(date(2026, 9, 1), date(2026, 9, 30))
assert len(tournaments) == 2
assert tournaments[0].name == "Modern Challenge 64"
assert tournaments[0].formats == "Modern"
assert tournaments[1].name == "Premodern Challenge 32"
assert tournaments[1].formats == "Premodern"
18 changes: 18 additions & 0 deletions tests/test_incremental.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,24 @@ def test_sync_specified_tournaments(tmp_path):
assert mock_client.fetch_calendar.call_count == 0


def test_sync_skips_limited_event(tmp_path):
mock_client = MagicMock()
limited_tournament = Tournament(
date=date(2026, 9, 10),
name="Limited Super Qualifier",
uri="https://www.mtgo.com/decklist/limited-super-qualifier-2024-06-0912645816",
formats=None,
json_file="limited-super-qualifier-2024-06-0912645816.json",
)
engine = MTGOSyncEngine(cache_root=str(tmp_path), client=mock_client)
stats = engine.sync(tournaments=[limited_tournament])

assert stats["skipped"] == 1
assert stats["created"] == 0
assert stats["failed"] == 0
assert mock_client.fetch_event_data.call_count == 0


def test_cli_parse_retry_args(monkeypatch):
from src.cli import parse_args

Expand Down
Loading