From eb2c41c2bb439aedc8b556402f1c1a3b48c78397 Mon Sep 17 00:00:00 2001 From: sreysus Date: Fri, 17 Jan 2025 17:57:34 -0500 Subject: [PATCH 1/3] fix(lint): resolve errors from merged PR #14 (see issue #8) --- qbreader/_api_utils.py | 11 +++++++---- qbreader/synchronous.py | 15 ++++++++------- qbreader/types.py | 8 ++++---- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/qbreader/_api_utils.py b/qbreader/_api_utils.py index 23ab000..4204da5 100644 --- a/qbreader/_api_utils.py +++ b/qbreader/_api_utils.py @@ -106,7 +106,7 @@ def normalize_subcat(unnormalized_subcats: UnnormalizedCategory): def category_correspondence( typed_alt_subcat: AlternateSubcategory, -) -> Tuple[Category, Subcategory]: +) -> Tuple[Category | None, Subcategory | None]: if typed_alt_subcat in [ AlternateSubcategory.ASTRONOMY, AlternateSubcategory.COMPUTER_SCIENCE, @@ -146,13 +146,16 @@ def category_correspondence( AlternateSubcategory.MISC_LITERATURE, ]: return (Category.LITERATURE, None) + + # Accounts for AlternateSubcategory.PRACTICES and AlternateSubcategory.BELIEFS + return (None, None) def normalize_cats( unnormalized_cats: UnnormalizedCategory, unnormalized_subcats: UnnormalizedSubcategory, unnormalized_alt_subcats: UnnormalizedAlternateSubcategory, -) -> Tuple[Category, Subcategory, AlternateSubcategory]: +) -> Tuple[str, str, str]: """ Normalize a single or list of categories, subcategories, and alternate_subcategories to their corresponding comma-separated strings, taking into account categories and @@ -183,8 +186,8 @@ def normalize_cats( elif isinstance(unnormalized_cats, str): final_cats = [Category(unnormalized_cats), *to_be_pushed_cats] elif isinstance(unnormalized_cats, Iterable): - for subcat in unnormalized_cats: - final_cats.append(Subcategory(subcat)) + for cat in unnormalized_cats: + final_cats.append(Category(cat)) final_cats.append(*to_be_pushed_cats) final_subcats = [] diff --git a/qbreader/synchronous.py b/qbreader/synchronous.py index 217528d..296544e 100644 --- a/qbreader/synchronous.py +++ b/qbreader/synchronous.py @@ -283,19 +283,20 @@ def random_bonus( Parameters ---------- difficulties : qbreader.types.UnnormalizedDifficulty, optional - The difficulties to search for. Can be a single or an array of `Difficulty` - enums, strings, or integers. + The difficulties to search for. Can be a single or an array of + `Difficulty` enums, strings, or integers. categories : qbreader.types.UnnormalizedCategory, optional - The categories to search for. Can be a single or an array of `Category` - enums or strings. + The categories to search for. Can be a single or an array of + `Category` enums or strings. subcategories : qbreader.types.UnnormalizedSubcategory, optional The subcategories to search for. Can be a single or an array of `Subcategory` enums or strings. The API does not check for consistency between categories and subcategories. - alternate_subcategories: qbreaader.types.UnnormalizedAlternateSubcategory, optional + alternate_subcategories : qbreaader.types.UnnormalizedAlternateSubcategory, + optional The alternates subcategories to search for. Can be a single or an array of - `AlternateSubcategory` enum variants or strings. The API does not check for consistency - between categories, subcategories, and alternate subcategories. + `AlternateSubcategory` enum variants or strings. The API does not check for + consistency between categories, subcategories, and alternate subcategories. number : int, default = 1 The number of bonuses to return. min_year : int, default = Year.MIN_YEAR diff --git a/qbreader/types.py b/qbreader/types.py index c90fdb3..d321cdc 100644 --- a/qbreader/types.py +++ b/qbreader/types.py @@ -290,7 +290,7 @@ def __init__( self.packet: PacketMetadata = packet self.set: SetMetadata = set self.number: int = number - self.alternate_subcategory: AlternateSubcategory = alternate_subcategory + self.alternate_subcategory: AlternateSubcategory | None = alternate_subcategory @classmethod def from_json(cls: Type[Self], json: dict[str, Any]) -> Self: @@ -384,7 +384,7 @@ def __init__( self.set: SetMetadata = set self.packet: PacketMetadata = packet self.number: int = number - self.alternate_subcategory: AlternateSubcategory = alternate_subcategory + self.alternate_subcategory: AlternateSubcategory | None = alternate_subcategory self.values: Optional[tuple[int, ...]] = tuple(values) if values else None self.difficultyModifiers: Optional[tuple[DifficultyModifier, ...]] = ( tuple(difficultyModifiers) if difficultyModifiers else None @@ -687,8 +687,8 @@ def __str__(self) -> str: UnnormalizedAlternateSubcategory: TypeAlias = Optional[ Union[AlternateSubcategory, str, Iterable[Union[AlternateSubcategory, str]]] ] -"""Type alias for unnormalized alternate subcategories. Union of `AlternateSubcategory`, `str`, and -`collections.abc.Iterable` containing either.""" +"""Type alias for unnormalized alternate subcategories. Union of `AlternateSubcategory`, +`str`, and `collections.abc.Iterable` containing either.""" __all__ = ( From 085de713928c6decd5c1f242caad1256e96e8b18 Mon Sep 17 00:00:00 2001 From: Geoffrey Wu Date: Fri, 7 Mar 2025 00:34:18 -0500 Subject: [PATCH 2/3] add musicals alternate subcategory --- qbreader/types.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qbreader/types.py b/qbreader/types.py index d321cdc..2eb0f7c 100644 --- a/qbreader/types.py +++ b/qbreader/types.py @@ -88,6 +88,7 @@ class AlternateSubcategory(enum.StrEnum): DANCE = "Dance" FILM = "Film" JAZZ = "Jazz" + MUSICALS = "Musicals" OPERA = "Opera" PHOTOGRAPHY = "Photography" MISC_ARTS = "Misc Arts" From 6ffd5dad182ccbd1a612a578036ffe2870bbab81 Mon Sep 17 00:00:00 2001 From: Geoffrey Wu Date: Fri, 7 Mar 2025 01:07:48 -0500 Subject: [PATCH 3/3] fix remaining lint and type problems --- qbreader/_api_utils.py | 29 ++++++++++++++--------------- qbreader/asynchronous.py | 15 +++++++++------ qbreader/synchronous.py | 18 ++++++++++-------- qbreader/types.py | 2 +- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/qbreader/_api_utils.py b/qbreader/_api_utils.py index 4204da5..c138c32 100644 --- a/qbreader/_api_utils.py +++ b/qbreader/_api_utils.py @@ -4,17 +4,17 @@ import warnings from enum import Enum, EnumType -from typing import Iterable, Optional, Union, Tuple +from typing import Iterable, Optional, Tuple, Union from qbreader.types import ( - Difficulty, + AlternateSubcategory, Category, + Difficulty, Subcategory, - AlternateSubcategory, + UnnormalizedAlternateSubcategory, UnnormalizedCategory, UnnormalizedDifficulty, UnnormalizedSubcategory, - UnnormalizedAlternateSubcategory, ) @@ -107,6 +107,7 @@ def normalize_subcat(unnormalized_subcats: UnnormalizedCategory): def category_correspondence( typed_alt_subcat: AlternateSubcategory, ) -> Tuple[Category | None, Subcategory | None]: + """Return the corresponding category/subcategory for a alternate_subcategory.""" if typed_alt_subcat in [ AlternateSubcategory.ASTRONOMY, AlternateSubcategory.COMPUTER_SCIENCE, @@ -146,7 +147,7 @@ def category_correspondence( AlternateSubcategory.MISC_LITERATURE, ]: return (Category.LITERATURE, None) - + # Accounts for AlternateSubcategory.PRACTICES and AlternateSubcategory.BELIEFS return (None, None) @@ -156,12 +157,10 @@ def normalize_cats( unnormalized_subcats: UnnormalizedSubcategory, unnormalized_alt_subcats: UnnormalizedAlternateSubcategory, ) -> Tuple[str, str, str]: - """ - Normalize a single or list of categories, subcategories, and alternate_subcategories - to their corresponding comma-separated strings, taking into account categories and - subcategories that must be added for the alternate_subcategories to work. - """ - + """Normalize a single or list of categories, subcategories, and\ + alternate_subcategories to their corresponding comma-separated strings, taking into\ + account categories and subcategories that must be added for the\ + alternate_subcategories to work.""" typed_alt_subcats: list[AlternateSubcategory] = [] if isinstance(unnormalized_alt_subcats, str): @@ -186,8 +185,8 @@ def normalize_cats( elif isinstance(unnormalized_cats, str): final_cats = [Category(unnormalized_cats), *to_be_pushed_cats] elif isinstance(unnormalized_cats, Iterable): - for cat in unnormalized_cats: - final_cats.append(Category(cat)) + for unnormalized_cat in unnormalized_cats: + final_cats.append(Category(unnormalized_cat)) final_cats.append(*to_be_pushed_cats) final_subcats = [] @@ -196,8 +195,8 @@ def normalize_cats( elif isinstance(unnormalized_subcats, str): final_subcats = [Subcategory(unnormalized_subcats), *to_be_pushed_subcats] elif isinstance(unnormalized_subcats, Iterable): - for subcat in unnormalized_subcats: - final_subcats.append(Subcategory(subcat)) + for unnormalized_subcat in unnormalized_subcats: + final_subcats.append(Subcategory(unnormalized_subcat)) final_subcats.append(*to_be_pushed_subcats) return ( diff --git a/qbreader/asynchronous.py b/qbreader/asynchronous.py index 414b184..97265fb 100644 --- a/qbreader/asynchronous.py +++ b/qbreader/asynchronous.py @@ -16,10 +16,10 @@ QuestionType, SearchType, Tossup, + UnnormalizedAlternateSubcategory, UnnormalizedCategory, UnnormalizedDifficulty, UnnormalizedSubcategory, - UnnormalizedAlternateSubcategory, Year, ) @@ -116,7 +116,8 @@ class type. The subcategories to search for. Can be a single or an array of `Subcategory` enums or strings. The API does not check for consistency between categories and subcategories. - alternate_subcategories : qbreader.types.UnnormalizedAlternateSubcategory, optional + alternate_subcategories : qbreader.types.UnnormalizedAlternateSubcategory,\ + optional The alternate subcategories to search for. Can be a single or an array of `AlternateSubcategory` enums or strings. The API does not check for consistency between categories and subcategories @@ -244,7 +245,8 @@ async def random_tossup( The subcategories to search for. Can be a single or an array of `Subcategory` enums or strings. The API does not check for consistency between categories and subcategories. - alternate_subcategories : qbreader.types.UnnormalizedAlternateSubcategory, optional + alternate_subcategories : qbreader.types.UnnormalizedAlternateSubcategory,\ + optional The alternate subcategories to search for. Can be a single or an array of `AlternateSubcategory` enums or strings. The API does not check for consistency between categories and subcategories @@ -327,10 +329,11 @@ async def random_bonus( The subcategories to search for. Can be a single or an array of `Subcategory` enums or strings. The API does not check for consistency between categories and subcategories. - alternate_subcategories: qbreaader.types.UnnormalizedAlternateSubcategory, optional + alternate_subcategories: qbreader.types.UnnormalizedAlternateSubcategory, \ + optional The alternates subcategories to search for. Can be a single or an array of - `AlternateSubcategory` enum variants or strings. The API does not check for consistency - between categories, subcategories, and alternate subcategories. + `AlternateSubcategory` enum variants or strings. The API does not check for + consistency between categories, subcategories, and alternate subcategories. number : int, default = 1 The number of bonuses to return. min_year : int, default = Year.MIN_YEAR diff --git a/qbreader/synchronous.py b/qbreader/synchronous.py index 296544e..31c1bb0 100644 --- a/qbreader/synchronous.py +++ b/qbreader/synchronous.py @@ -16,10 +16,10 @@ QuestionType, SearchType, Tossup, - UnnormalizedDifficulty, + UnnormalizedAlternateSubcategory, UnnormalizedCategory, + UnnormalizedDifficulty, UnnormalizedSubcategory, - UnnormalizedAlternateSubcategory, Year, ) @@ -81,10 +81,11 @@ class type. The subcategories to search for. Can be a single or an array of `Subcategory` enums or strings. The API does not check for consistency between categories and subcategories. - alternate_subcategories: qbreaader.types.UnnormalizedAlternateSubcategory, optional + alternate_subcategories: qbreaader.types.UnnormalizedAlternateSubcategory,\ + optional The alternates subcategories to search for. Can be a single or an array of - `AlternateSubcategory` enum variants or strings. The API does not check for consistency - between categories, subcategories, and alternate subcategories. + `AlternateSubcategory` enum variants or strings. The API does not check for + consistency between categories, subcategories, and alternate subcategories. maxReturnLength : int, default = 25 The maximum number of questions to return. tossupPagination : int, default = 1 @@ -209,10 +210,11 @@ def random_tossup( The subcategories to search for. Can be a single or an array of `Subcategory` enums or strings. The API does not check for consistency between categories and subcategories. - alternate_subcategories: qbreaader.types.UnnormalizedAlternateSubcategory, optional + alternate_subcategories: qbreaader.types.UnnormalizedAlternateSubcategory, + optional The alternates subcategories to search for. Can be a single or an array of - `AlternateSubcategory` enum variants or strings. The API does not check for consistency - between categories, subcategories, and alternate subcategories. + `AlternateSubcategory` enum variants or strings. The API does not check for + consistency between categories, subcategories, and alternate subcategories. number : int, default = 1 The number of tossups to return. min_year : int, default = Year.MIN_YEAR diff --git a/qbreader/types.py b/qbreader/types.py index 2eb0f7c..9ae73db 100644 --- a/qbreader/types.py +++ b/qbreader/types.py @@ -688,7 +688,7 @@ def __str__(self) -> str: UnnormalizedAlternateSubcategory: TypeAlias = Optional[ Union[AlternateSubcategory, str, Iterable[Union[AlternateSubcategory, str]]] ] -"""Type alias for unnormalized alternate subcategories. Union of `AlternateSubcategory`, +"""Type alias for unnormalized alternate subcategories. Union of `AlternateSubcategory`, `str`, and `collections.abc.Iterable` containing either."""