Skip to content

Commit 305753e

Browse files
committed
Fix [BUG] KeyError: 'profile_def' on search #29 - Added checks when parsing JSON - Updated to 1.0.8
1 parent 96e1981 commit 305753e

File tree

8 files changed

+31
-19
lines changed

8 files changed

+31
-19
lines changed

howlongtobeatpy/howlongtobeatpy/HowLongToBeatEntry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ class HowLongToBeatEntry:
22
"""
33
A simple class to collect all game data that are being read from the JSON response
44
It contains just the main data and values for the game, the rest can be read manually from the JSON
5+
Consider that some values could be None, such as profile_dev, since HLTB sometimes remove/add values
56
The full content for the entry is available in json_content
67
"""
78

howlongtobeatpy/howlongtobeatpy/JSONResultParser.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,30 @@ def parse_json_result(self, input_json_result):
5151
def parse_json_element(self, input_game_element):
5252
current_entry = HowLongToBeatEntry()
5353
# Compute base fields
54-
current_entry.game_id = input_game_element["game_id"]
55-
current_entry.game_name = input_game_element["game_name"]
56-
current_entry.game_alias = input_game_element["game_alias"]
57-
current_entry.game_type = input_game_element["game_type"]
58-
current_entry.game_image_url = self.IMAGE_URL_PREFIX + input_game_element["game_image"]
54+
current_entry.game_id = input_game_element.get("game_id")
55+
current_entry.game_name = input_game_element.get("game_name")
56+
current_entry.game_alias = input_game_element.get("game_alias")
57+
current_entry.game_type = input_game_element.get("game_type")
58+
if "game_image" in input_game_element:
59+
current_entry.game_image_url = self.IMAGE_URL_PREFIX + input_game_element.get("game_image")
5960
current_entry.game_web_link = self.GAME_URL_PREFIX + str(current_entry.game_id)
60-
current_entry.review_score = input_game_element["review_score"]
61-
current_entry.profile_dev = input_game_element["profile_dev"]
62-
current_entry.profile_platforms = input_game_element["profile_platform"].split(", ")
63-
current_entry.release_world = input_game_element["release_world"]
61+
current_entry.review_score = input_game_element.get("review_score")
62+
current_entry.profile_dev = input_game_element.get("profile_dev")
63+
if "profile_platform" in input_game_element:
64+
current_entry.profile_platforms = input_game_element.get("profile_platform").split(", ")
65+
current_entry.release_world = input_game_element.get("release_world")
6466
# Add full JSON content to the entry
6567
current_entry.json_content = input_game_element
6668
# Add a few times elements as help for the user
67-
current_entry.main_story = round(input_game_element["comp_main"] / 3600, 2)
68-
current_entry.main_extra = round(input_game_element["comp_plus"] / 3600, 2)
69-
current_entry.completionist = round(input_game_element["comp_100"] / 3600, 2)
70-
current_entry.all_styles = round(input_game_element["comp_all"] / 3600, 2)
69+
# Calculate only if value is not None
70+
if "comp_main" in input_game_element:
71+
current_entry.main_story = round(input_game_element.get("comp_main") / 3600, 2)
72+
if "comp_plus" in input_game_element:
73+
current_entry.main_extra = round(input_game_element.get("comp_plus") / 3600, 2)
74+
if "comp_100" in input_game_element:
75+
current_entry.completionist = round(input_game_element.get("comp_100") / 3600, 2)
76+
if "comp_all" in input_game_element:
77+
current_entry.all_styles = round(input_game_element.get("comp_all") / 3600, 2)
7178
# Compute Similarity
7279
game_name_similarity = self.similar(self.game_name, current_entry.game_name,
7380
self.game_name_numbers, self.similarity_case_sensitive)

howlongtobeatpy/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
long_description = fh.read()
55

66
setup(name='howlongtobeatpy',
7-
version='1.0.7',
7+
version='1.0.8',
88
packages=find_packages(exclude=['tests']),
99
description='A Python API for How Long to Beat',
1010
long_description=long_description,

howlongtobeatpy/tests/test_async_request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ async def test_game_name_and_dev(self):
2929
self.assertNotEqual(None, results, "Search Results are None")
3030
best_result = TestNormalRequest.getMaxSimilarityElement(results)
3131
self.assertEqual("Crysis Warhead", best_result.game_name)
32-
self.assertEqual("Crytek Budapest", best_result.profile_dev)
32+
if best_result.profile_dev is not None:
33+
self.assertEqual("Crytek Budapest", best_result.profile_dev)
3334
self.assertEqual("2008", str(best_result.release_world))
3435
self.assertAlmostEqual(7, TestNormalRequest.getSimpleNumber(best_result.completionist), delta=3)
3536

howlongtobeatpy/tests/test_async_request_by_id.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ async def test_game_name_and_dev(self):
2424
result = await HowLongToBeat().async_search_from_id(2071)
2525
self.assertNotEqual(None, result, "Search Result is None")
2626
self.assertEqual("Crysis Warhead", result.game_name)
27-
self.assertEqual("Crytek Budapest", result.profile_dev)
27+
if result.profile_dev is not None:
28+
self.assertEqual("Crytek Budapest", result.profile_dev)
2829
self.assertEqual("2008", str(result.release_world))
2930
self.assertAlmostEqual(7, TestNormalRequest.getSimpleNumber(result.completionist), delta=3)
3031

howlongtobeatpy/tests/test_normal_request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ def test_game_name_and_dev(self):
4646
self.assertNotEqual(None, results, "Search Results are None")
4747
best_result = self.getMaxSimilarityElement(results)
4848
self.assertEqual("Crysis Warhead", best_result.game_name)
49-
self.assertEqual("Crytek Budapest", best_result.profile_dev)
49+
if best_result.profile_dev is not None:
50+
self.assertEqual("Crytek Budapest", best_result.profile_dev)
5051
self.assertEqual("2008", str(best_result.release_world))
5152
self.assertAlmostEqual(7, self.getSimpleNumber(best_result.completionist), delta=3)
5253

howlongtobeatpy/tests/test_normal_request_by_id.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def test_game_name_and_dev(self):
2020
result = HowLongToBeat().search_from_id(2071)
2121
self.assertNotEqual(None, result, "Search Result is None")
2222
self.assertEqual("Crysis Warhead", result.game_name)
23-
self.assertEqual("Crytek Budapest", result.profile_dev)
23+
if result.profile_dev is not None:
24+
self.assertEqual("Crytek Budapest", result.profile_dev)
2425
self.assertEqual("2008", str(result.release_world))
2526
self.assertAlmostEqual(7, TestNormalRequest.getSimpleNumber(result.completionist), delta=3)
2627

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ sonar.organization=scrappycocco-github
22
sonar.projectKey=ScrappyCocco_HowLongToBeat-PythonAPI
33

44
sonar.projectName=HowLongToBeat-PythonAPI
5-
sonar.projectVersion=1.0.7
5+
sonar.projectVersion=1.0.8
66
sonar.python.version=3.9
77

88
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.

0 commit comments

Comments
 (0)