Skip to content

Commit c3deac3

Browse files
Make error messages more user friendly (#256)
* Make error messages more user friendly * Fix issues found by deepsource * Fix failing tests
1 parent 576bde5 commit c3deac3

File tree

4 files changed

+128
-27
lines changed

4 files changed

+128
-27
lines changed

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ To initialize it, you have to provide:
4444
.. code-block:: python
4545
4646
import wikipediaapi
47-
wiki_wiki = wikipediaapi.Wikipedia('MyProjectName ([email protected])', 'en')
47+
wiki_wiki = wikipediaapi.Wikipedia(user_agent='MyProjectName ([email protected])', language='en')
4848
4949
page_py = wiki_wiki.page('Python_(programming_language)')
5050

example.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
user_agent = "Wikipedia-API Example ([email protected])"
99

10-
wiki_wiki = wikipediaapi.Wikipedia(user_agent, "en")
10+
wiki_wiki = wikipediaapi.Wikipedia(user_agent=user_agent, language="en")
1111

1212
page_py = wiki_wiki.page("Python_(programming_language)")
1313

@@ -89,7 +89,7 @@ def print_categories(page):
8989
print("Page - Summary: %s" % page_nonexisting.summary[0:60])
9090

9191

92-
wiki_de = wikipediaapi.Wikipedia(user_agent, "de")
92+
wiki_de = wikipediaapi.Wikipedia(user_agent=user_agent, language="de")
9393
de_page = wiki_de.page("Deutsche Sprache")
9494
print(de_page.title + ": " + de_page.fullurl)
9595
print(de_page.summary[0:60])
@@ -110,7 +110,7 @@ def print_categorymembers(categorymembers, level=0, max_level=2):
110110
print("Category members: Category:Physics")
111111
print_categorymembers(cat.categorymembers, max_level=1)
112112

113-
wiki_hi = wikipediaapi.Wikipedia(user_agent, "hi")
113+
wiki_hi = wikipediaapi.Wikipedia(user_agent=user_agent, language="hi")
114114
# fetch page about Python in Hindu
115115
# https://hi.wikipedia.org/wiki/%E0%A4%AA%E0%A4%BE%E0%A4%87%E0%A4%A5%E0%A4%A8
116116

@@ -122,28 +122,34 @@ def print_categorymembers(categorymembers, level=0, max_level=2):
122122
print(p_hi_python_quoted.summary[0:60])
123123

124124
# Fetch page about Python in Chinese
125-
wiki_zh = wikipediaapi.Wikipedia(user_agent, "zh")
125+
wiki_zh = wikipediaapi.Wikipedia(user_agent=user_agent, language="zh")
126126
zh_page = wiki_zh.page("Python")
127127
print(zh_page.title + ": " + zh_page.fullurl)
128128
print(zh_page.summary[0:60])
129129
print(repr(zh_page.varianttitles))
130130

131131
# https://zh.wikipedia.org/zh-cn/Python
132-
wiki_zh_cn = wikipediaapi.Wikipedia(user_agent, "zh", "zh-cn")
132+
wiki_zh_cn = wikipediaapi.Wikipedia(
133+
user_agent=user_agent, language="zh", variant="zh-cn"
134+
)
133135
zh_page_cn = wiki_zh_cn.page("Python")
134136
print(zh_page_cn.title + ": " + zh_page_cn.fullurl)
135137
print(zh_page_cn.summary[0:60])
136138
print(repr(zh_page_cn.varianttitles))
137139

138140
# https://zh.wikipedia.org/zh-tw/Python
139-
wiki_zh_tw = wikipediaapi.Wikipedia(user_agent, "zh", "zh-tw")
141+
wiki_zh_tw = wikipediaapi.Wikipedia(
142+
user_agent=user_agent, language="zh", variant="zh-tw"
143+
)
140144
zh_page_tw = wiki_zh_tw.page("Python")
141145
print(zh_page_tw.title + ": " + zh_page_tw.fullurl)
142146
print(zh_page_tw.summary[0:60])
143147
print(repr(zh_page_tw.varianttitles))
144148

145149
# https://zh.wikipedia.org/zh-sg/Python
146-
wiki_zh_sg = wikipediaapi.Wikipedia(user_agent, "zh", "zh-sg")
150+
wiki_zh_sg = wikipediaapi.Wikipedia(
151+
user_agent=user_agent, language="zh", variant="zh-sg"
152+
)
147153
zh_page_sg = wiki_zh_sg.page("Python")
148154
print(zh_page_sg.title + ": " + zh_page_sg.fullurl)
149155
print(zh_page_sg.summary[0:60])

tests/wikipedia_test.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,63 @@ def test_missing_user_agent_should_fail(self):
1313
AssertionError(
1414
"Please, be nice to Wikipedia and specify user agent - "
1515
+ "https://meta.wikimedia.org/wiki/User-Agent_policy. "
16-
+ "Current user_agent: 'en' is not sufficient."
16+
+ "Current user_agent: 'en' is not sufficient. "
17+
+ "Use Wikipedia(user_agent='your-user-agent', language='en')"
1718
)
1819
),
1920
)
2021

22+
def test_swapped_parameters_in_constructor(self):
23+
with self.assertRaises(AssertionError) as e:
24+
wikipediaapi.Wikipedia("en", "my-user-agent")
25+
self.assertEqual(
26+
str(e.exception),
27+
str(
28+
AssertionError(
29+
"Please, be nice to Wikipedia and specify user agent - "
30+
+ "https://meta.wikimedia.org/wiki/User-Agent_policy. "
31+
+ "Current user_agent: 'en' is not sufficient. "
32+
+ "Use Wikipedia(user_agent='your-user-agent', language='en')"
33+
)
34+
),
35+
)
36+
37+
def test_empty_parameters_in_constructor(self):
38+
with self.assertRaises(AssertionError) as e:
39+
wikipediaapi.Wikipedia("", "")
40+
self.assertEqual(
41+
str(e.exception),
42+
str(
43+
AssertionError(
44+
"Please, be nice to Wikipedia and specify user agent - "
45+
+ "https://meta.wikimedia.org/wiki/User-Agent_policy. "
46+
+ "Current user_agent: '' is not sufficient. "
47+
+ "Use Wikipedia(user_agent='your-user-agent', language='your-language')"
48+
)
49+
),
50+
)
51+
52+
def test_empty_language_in_constructor(self):
53+
with self.assertRaises(AssertionError) as e:
54+
wikipediaapi.Wikipedia("test-user-agent", "")
55+
self.assertEqual(
56+
str(e.exception),
57+
str(
58+
AssertionError(
59+
"Specify language. Current language: '' is not sufficient. "
60+
+ "Use Wikipedia(user_agent='test-user-agent', language='your-language')"
61+
)
62+
),
63+
)
64+
65+
def test_long_language_and_user_agent(self):
66+
wiki = wikipediaapi.Wikipedia(
67+
user_agent="param-user-agent", language="very-long-language"
68+
)
69+
self.assertIsNotNone(wiki)
70+
self.assertEqual(wiki.language, "very-long-language")
71+
self.assertIsNone(wiki.variant)
72+
2173
def test_user_agent_is_used(self):
2274
wiki = wikipediaapi.Wikipedia(
2375
user_agent="param-user-agent",
@@ -28,6 +80,7 @@ def test_user_agent_is_used(self):
2880
user_agent,
2981
"param-user-agent (" + wikipediaapi.USER_AGENT + ")",
3082
)
83+
self.assertEqual(wiki.language, "en")
3184

3285
def test_user_agent_in_headers_is_fine(self):
3386
wiki = wikipediaapi.Wikipedia(

wikipediaapi/__init__.py

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
+ "; https://github.com/martin-majlis/Wikipedia-API/"
2424
)
2525

26+
MIN_USER_AGENT_LEN = 5
27+
MAX_LANG_LEN = 5
28+
2629
log = logging.getLogger(__name__)
2730

2831

@@ -163,29 +166,21 @@ def __init__(
163166
request_kwargs.setdefault("timeout", 10.0)
164167

165168
default_headers = {} if headers is None else headers
166-
if user_agent:
169+
if user_agent is not None:
167170
default_headers.setdefault(
168171
"User-Agent",
169172
user_agent,
170173
)
171-
used_user_agent = default_headers.get("User-Agent")
172-
if not (used_user_agent and len(used_user_agent) > 5):
173-
raise AssertionError(
174-
"Please, be nice to Wikipedia and specify user agent - "
175-
+ "https://meta.wikimedia.org/wiki/User-Agent_policy. Current user_agent: '"
176-
+ str(used_user_agent)
177-
+ "' is not sufficient."
178-
)
179-
default_headers["User-Agent"] += " (" + USER_AGENT + ")"
174+
used_language, used_variant, used_user_agent = self._check_and_correct_params(
175+
language,
176+
variant,
177+
default_headers.get("User-Agent"),
178+
)
180179

181-
self.language = language.strip().lower()
182-
if not self.language:
183-
raise AssertionError(
184-
"Specify language. Current language: '"
185-
+ str(self.language)
186-
+ "' is not sufficient."
187-
)
188-
self.variant = variant.strip().lower() if variant else variant
180+
default_headers["User-Agent"] = used_user_agent + " (" + USER_AGENT + ")"
181+
182+
self.language = used_language
183+
self.variant = used_variant
189184
self.extract_format = extract_format
190185

191186
log.info(
@@ -722,6 +717,53 @@ def _common_attributes(extract, page: "WikipediaPage"):
722717
if attr in extract:
723718
page._attributes[attr] = extract[attr]
724719

720+
@staticmethod
721+
def _check_and_correct_params(
722+
language: Optional[str], variant: Optional[str], user_agent: Optional[str]
723+
) -> tuple[str, Optional[str], str]:
724+
"""
725+
Checks the constructor parameters and throws AssertionError if they are incorrect.
726+
Otherwise, it normalises them to easy use later on.
727+
:param language: Language mutation of Wikipedia
728+
:param variant: Language variant
729+
:param user_agent: HTTP User-Agent used in requests
730+
:return: tuple of language, variant, user_agent
731+
"""
732+
if not user_agent or len(user_agent) < MIN_USER_AGENT_LEN:
733+
raise AssertionError(
734+
"Please, be nice to Wikipedia and specify user agent - "
735+
+ "https://meta.wikimedia.org/wiki/User-Agent_policy. Current user_agent: '"
736+
+ str(user_agent)
737+
+ "' is not sufficient. "
738+
+ "Use Wikipedia(user_agent='your-user-agent', language='"
739+
+ (str(user_agent) or "your-language")
740+
+ "')"
741+
)
742+
743+
if not language:
744+
raise AssertionError(
745+
"Specify language. Current language: '"
746+
+ str(language)
747+
+ "' is not sufficient. "
748+
+ "Use Wikipedia(user_agent='"
749+
+ str(user_agent)
750+
+ "', language='your-language')"
751+
)
752+
753+
used_language = language.strip().lower()
754+
if len(used_language) > MAX_LANG_LEN:
755+
log.warning(
756+
"Used language '%s' is longer than %d. It is suspicious",
757+
used_language,
758+
MAX_LANG_LEN,
759+
)
760+
761+
return (
762+
used_language,
763+
variant.strip().lower() if variant else variant,
764+
user_agent,
765+
)
766+
725767

726768
class WikipediaPageSection:
727769
"""WikipediaPageSection represents section in the page."""

0 commit comments

Comments
 (0)