From 28b958166e77cfd3bfc4eb065a16213ce3e58ff6 Mon Sep 17 00:00:00 2001 From: Pradhvan Date: Fri, 7 Feb 2025 18:29:41 +0530 Subject: [PATCH 1/3] Add level flag when downloading bites --- src/eatlocal/__main__.py | 9 ++++++++- src/eatlocal/eatlocal.py | 30 +++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/eatlocal/__main__.py b/src/eatlocal/__main__.py index b537eec..43de470 100644 --- a/src/eatlocal/__main__.py +++ b/src/eatlocal/__main__.py @@ -6,6 +6,7 @@ import typer from rich import print from rich.status import Status +from typing import Optional from . import __version__ from .constants import EATLOCAL_HOME @@ -71,10 +72,16 @@ def download( is_flag=True, help="Overwrite bite directory with a fresh version.", ), + level: Optional[str] = typer.Option( + None, + "--level", + "-l", + help="Filter bites by difficulty level.", + ), ) -> None: """Download and extract bite code from pybitesplatform.com.""" config = load_config(EATLOCAL_HOME / ".env") - bite = choose_bite(clear) + bite = choose_bite(clear, level=level.lower()) with Status("Downloading bite..."): bite.platform_content = download_bite(bite, config) if bite.platform_content is None: diff --git a/src/eatlocal/eatlocal.py b/src/eatlocal/eatlocal.py index e7d8717..79db2ac 100644 --- a/src/eatlocal/eatlocal.py +++ b/src/eatlocal/eatlocal.py @@ -7,6 +7,7 @@ from datetime import timedelta from os import environ, makedirs from pathlib import Path +from typing import Optional, FrozenSet import install_playwright import requests @@ -42,6 +43,10 @@ CACHE_DB_LOCATION, backend="sqlite", expire_after=timedelta(days=30) ) +VALID_LEVELS: FrozenSet[str] = frozenset( + ["newbie", "intro", "beginner", "intermediate", "advanced"] +) + @dataclass class Bite: @@ -286,8 +291,8 @@ def choose_local_bite(config: dict) -> Bite: return Bite(bite, bites[bite]) -def choose_bite(clear: bool = False) -> Bite: - """Choose which bite will be downloaded. +def choose_bite(clear: bool = False, level: Optional[str] = None) -> Bite: + """Choose which level of bite will be downloaded. Returns: A Bite object. @@ -307,7 +312,26 @@ def choose_bite(clear: bool = False) -> Bite: style=ConsoleStyle.SUGGESTION.value, ) sys.exit() - bites = {bite["title"]: bite["slug"] for bite in r.json()} + if level: + # Filter bites by level (case-insensitive) + if level not in VALID_LEVELS: + console.print( + f":warning: Invalid level: {level}.", + style=ConsoleStyle.WARNING.value, + ) + console.print( + f"Valid levels are: {', '.join(VALID_LEVELS)}.", + style=ConsoleStyle.SUGGESTION.value, + ) + sys.exit() + bites = { + bite["title"]: bite["slug"] + for bite in r.json() + if bite["level"].lower() == level + } + else: + # Display bites of all levels. + bites = {bite["title"]: bite["slug"] for bite in r.json()} bite_to_download = iterfzf(bites, multi=False) if bite_to_download is None: sys.exit() From 26461e223127c8b71682869b5149f9f1293de4bc Mon Sep 17 00:00:00 2001 From: Pradhvan Date: Sat, 8 Feb 2025 12:17:51 +0530 Subject: [PATCH 2/3] Update level.lower() to choose_bite() --- src/eatlocal/__main__.py | 2 +- src/eatlocal/eatlocal.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/eatlocal/__main__.py b/src/eatlocal/__main__.py index 43de470..08864cc 100644 --- a/src/eatlocal/__main__.py +++ b/src/eatlocal/__main__.py @@ -81,7 +81,7 @@ def download( ) -> None: """Download and extract bite code from pybitesplatform.com.""" config = load_config(EATLOCAL_HOME / ".env") - bite = choose_bite(clear, level=level.lower()) + bite = choose_bite(clear, level=level) with Status("Downloading bite..."): bite.platform_content = download_bite(bite, config) if bite.platform_content is None: diff --git a/src/eatlocal/eatlocal.py b/src/eatlocal/eatlocal.py index 79db2ac..8e1d648 100644 --- a/src/eatlocal/eatlocal.py +++ b/src/eatlocal/eatlocal.py @@ -314,7 +314,7 @@ def choose_bite(clear: bool = False, level: Optional[str] = None) -> Bite: sys.exit() if level: # Filter bites by level (case-insensitive) - if level not in VALID_LEVELS: + if level.lower() not in VALID_LEVELS: console.print( f":warning: Invalid level: {level}.", style=ConsoleStyle.WARNING.value, @@ -327,7 +327,7 @@ def choose_bite(clear: bool = False, level: Optional[str] = None) -> Bite: bites = { bite["title"]: bite["slug"] for bite in r.json() - if bite["level"].lower() == level + if bite["level"].lower() == level.lower() } else: # Display bites of all levels. From f0caa395876f9c2d70216a6021b1912d13431db3 Mon Sep 17 00:00:00 2001 From: Pradhvan Date: Mon, 10 Feb 2025 20:32:38 +0530 Subject: [PATCH 3/3] Removed optional import and inforced keyword argument with * --- src/eatlocal/__main__.py | 3 +-- src/eatlocal/eatlocal.py | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/eatlocal/__main__.py b/src/eatlocal/__main__.py index 08864cc..08358dd 100644 --- a/src/eatlocal/__main__.py +++ b/src/eatlocal/__main__.py @@ -6,7 +6,6 @@ import typer from rich import print from rich.status import Status -from typing import Optional from . import __version__ from .constants import EATLOCAL_HOME @@ -72,7 +71,7 @@ def download( is_flag=True, help="Overwrite bite directory with a fresh version.", ), - level: Optional[str] = typer.Option( + level: str | None = typer.Option( None, "--level", "-l", diff --git a/src/eatlocal/eatlocal.py b/src/eatlocal/eatlocal.py index 8e1d648..0d2008e 100644 --- a/src/eatlocal/eatlocal.py +++ b/src/eatlocal/eatlocal.py @@ -7,7 +7,7 @@ from datetime import timedelta from os import environ, makedirs from pathlib import Path -from typing import Optional, FrozenSet +from typing import FrozenSet import install_playwright import requests @@ -291,7 +291,7 @@ def choose_local_bite(config: dict) -> Bite: return Bite(bite, bites[bite]) -def choose_bite(clear: bool = False, level: Optional[str] = None) -> Bite: +def choose_bite(clear: bool = False, *, level: str | None = None) -> Bite: """Choose which level of bite will be downloaded. Returns: @@ -312,7 +312,7 @@ def choose_bite(clear: bool = False, level: Optional[str] = None) -> Bite: style=ConsoleStyle.SUGGESTION.value, ) sys.exit() - if level: + if level is not None: # Filter bites by level (case-insensitive) if level.lower() not in VALID_LEVELS: console.print(