Skip to content

Commit 69b20eb

Browse files
committed
add greptile feedback
Signed-off-by: Sarah Yurick <sarahyurick@gmail.com>
1 parent 3e8cdf3 commit 69b20eb

2 files changed

Lines changed: 56 additions & 1 deletion

File tree

nemo_curator/stages/text/download/wikipedia/url_generation.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,20 @@ def _get_wikipedia_urls(self) -> list[str]:
9797
dump_data = None
9898
for candidate_date in sorted(dump_dates, reverse=True):
9999
candidate_dump_date = f"{candidate_date}/"
100-
candidate_dump_data = self._get_data_for_dump(candidate_dump_date, wiki_index_url)
100+
try:
101+
candidate_dump_data = self._get_data_for_dump(candidate_dump_date, wiki_index_url)
102+
except requests.HTTPError as e:
103+
status_code = e.response.status_code if e.response is not None else None
104+
if status_code is not None and (
105+
status_code == requests.codes.too_many_requests
106+
or status_code >= requests.codes.internal_server_error
107+
):
108+
logger.warning(
109+
f"Unable to load dump data for {candidate_date} due to HTTP {status_code}; "
110+
"trying next dump"
111+
)
112+
continue
113+
raise
101114
if candidate_dump_data is None:
102115
logger.warning(f"Cannot load dump data for {candidate_date}")
103116
continue

tests/stages/text/download/wikipedia/test_url_generation.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,48 @@ def mock_get_side_effect(url: str, **kwargs) -> Mock: # noqa: ARG001
142142
"enwiki-20230501-pages-articles-multistream1.xml.bz2"
143143
]
144144

145+
@pytest.mark.parametrize("transient_status", [429, 500, 503])
146+
@patch("requests.get")
147+
def test_get_latest_dump_date_skips_transient_status_error(self, mock_get: Mock, transient_status: int):
148+
"""A transient status error for a candidate does not prevent fallback to an older dump."""
149+
mock_html = """
150+
<a href="20230501/">20230501/</a>
151+
<a href="20230601/">20230601/</a>
152+
"""
153+
completed_dump = {
154+
"jobs": {
155+
"articlesmultistreamdump": {
156+
"status": "done",
157+
"files": {"enwiki-20230501-pages-articles-multistream1.xml.bz2": {}},
158+
}
159+
}
160+
}
161+
162+
def mock_get_side_effect(url: str, **kwargs) -> Mock: # noqa: ARG001
163+
response = Mock(status_code=200)
164+
if url == "https://dumps.wikimedia.org/enwiki":
165+
response.content = mock_html.encode("utf-8")
166+
elif url == "https://dumps.wikimedia.org/enwiki/20230601/dumpstatus.json":
167+
response.status_code = transient_status
168+
response.raise_for_status.side_effect = requests.HTTPError(
169+
f"{transient_status} Server Error", response=response
170+
)
171+
elif url == "https://dumps.wikimedia.org/enwiki/20230501/dumpstatus.json":
172+
response.content = json.dumps(completed_dump).encode("utf-8")
173+
else:
174+
error_msg = f"Unexpected URL: {url}"
175+
raise ValueError(error_msg)
176+
return response
177+
178+
mock_get.side_effect = mock_get_side_effect
179+
180+
urls = WikipediaUrlGenerator(language="en").generate_urls()
181+
182+
assert urls == [
183+
"https://dumps.wikimedia.org/enwiki/20230501/"
184+
"enwiki-20230501-pages-articles-multistream1.xml.bz2"
185+
]
186+
145187
@patch("requests.get")
146188
def test_get_latest_dump_date_http_error(self, mock_get: Mock):
147189
"""HTTP errors from the dump index are surfaced instead of parsed as HTML."""

0 commit comments

Comments
 (0)