From b892a6160e2af9f39f9ad9d1f579818969f51c96 Mon Sep 17 00:00:00 2001 From: Song Khoi Date: Wed, 31 Jul 2024 09:19:36 +0700 Subject: [PATCH] create cli --- src/hypermodern_python/__init__.py | 14 +++++----- .../__pycache__/__init__.cpython-312.pyc | Bin 699 -> 250 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/prettier.cpython-312.pyc | Bin 2007 -> 2154 bytes .../__pycache__/wikipedia.cpython-312.pyc | Bin 5890 -> 6428 bytes src/hypermodern_python/console.py | 7 +++-- src/hypermodern_python/wikipedia.py | 24 ++++++++++-------- 7 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 src/hypermodern_python/__pycache__/console.cpython-312.pyc diff --git a/src/hypermodern_python/__init__.py b/src/hypermodern_python/__init__.py index 21ed31b..c1948db 100644 --- a/src/hypermodern_python/__init__.py +++ b/src/hypermodern_python/__init__.py @@ -1,13 +1,13 @@ """The hypermodern Python project.""" -import argparse +# import argparse __version__ = "0.2.0" -def main(): - parser = argparse.ArgumentParser(prog="random-wikipedia-article") - parser.add_argument( - "--version", action="version", version=f"%(prog)s {__version__}" - ) - parser.parse_args() +# def main(): +# parser = argparse.ArgumentParser(prog="random-wikipedia-article") +# parser.add_argument( +# "--version", action="version", version=f"%(prog)s {__version__}" +# ) +# parser.parse_args() diff --git a/src/hypermodern_python/__pycache__/__init__.cpython-312.pyc b/src/hypermodern_python/__pycache__/__init__.cpython-312.pyc index 1a05a91dfa3d21b68f2b03d9690de8cc9a402356..be3e445e836f2451ec9856b441a165ca8c77cde2 100644 GIT binary patch delta 153 zcmdnZ`is%xG%qg~0}%MkU72Rf$iVOz#DM`I9}GV80IBH=DGX5zDU4B!l}wt<6WtWm zt5^;6jPwlrG?{L($H%ASC&$O%;*O6mOD!tS%+HIDU&-(pqY=`Yg-rL=l6hg~p2x{F5@L0v^r${y51DGVVqw&}J>n50UILJ#7< zu!49N=^n(B2mb>vTTr?N55k_j73yhEzDZNq2lM9p-pl*mo6LMSj4}dy_T}UAZH&-~ zBx_T0u)GA|05Q}?3^Qeb+nA|sg^@R?ttN`4jW0jxakH0%Tnq!og>UX9aWC-APy~JM z#?8M{sWsMin%9~;ZZ4Z`I(QY<@-4Un6vGTF>#w`71F$oEs7&)OUZYp2uboNekg1F? zEta~Oy+rg@nX@9(Qc~SEpZCJ5QlL>OATNp4sY-67F|)d9)t~VJEu` zJIt=36A5<}SltfI!<2fy7gO2{lave{&lgotF2aiLfSaJ-Ms03v&Wz2YtGhppdz1Ue zq&z3}8L1x^FT8vB`Qo=5U+tsq2MZNxjekhd^o5SJ%AC|@r1q24m!N_yk`^dsflH|< z02lJXWt~1Du_3Vm?zDIlh8qp|EpZ;GJYrM>w@@+0ztGkR+W1qgO)5)W!;P%$KP@?} A#Q*>R diff --git a/src/hypermodern_python/__pycache__/console.cpython-312.pyc b/src/hypermodern_python/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d478fb036a42042ce888628c62fa3bbc67ae155 GIT binary patch literal 671 zcmX|8OKTKC5U$>yoyYEuw;-Z{#TO1FA!i9*Rt1UdO(DbLFwFF3$INsOHM6YaNyMW^ zA(wz&!~PUcA|5j2CP8uwt_RtZ)%&mx)n9#GRbBPR@e+C1A5X z0>==84>5}yDa#sugK5lDo*BMD*od2HGc$cNvwSPFeVaHtHa{4?Q(2z#_IgicSt#S} zG?Aj4$Wq`ijKt2Re#2vRJCstDVVNjdP{@1FpIy>C;PKjeD#~aiu;x*k)NQ0LDhu-P zP(-?TZ6*N@z-F%q9D@U;u3uP5{0bTWk z7*)Bz?Yt^SN)8H)mPDpvfihUp5ow}Qv6ELMK^EgRYO8;(ctGwQTs3&pJ-6E*d!MY6 zo8LS4e%SZ_p0_uC18cfxcIS%IIWIbt{C=|wUz{yIWm~-OHEI(@IYwCTx)MQvTD-dRx==F2!#qUVMXz2vljJDLMVy370Txnd6&3?xTO<7_y5#2e o9xXLa#UtFHP)l9hAVt<8 literal 0 HcmV?d00001 diff --git a/src/hypermodern_python/__pycache__/prettier.cpython-312.pyc b/src/hypermodern_python/__pycache__/prettier.cpython-312.pyc index b9e7e3da53438d0d125d4312c4664e9d4705d9bc..b35267c8bcec2b1d804b14508f1bf3f61a1988db 100644 GIT binary patch delta 608 zcmXw0&ubGw6n<}ZcQ&(Wnzk`(Ocg>7wK=F4LBZldMK7f%PeBOL-Gr3=A+sB3L}-M9 zp524^7l?QguY%tF0}KNNp(j1aN_)!5H`(SbeDC`{zIkuh`C0w5cKD-Gae(U1*AIgo z8{kBXWf=v*(|scEzyl8h2(gQ(ISW{qQ8xl3G`l7O1E1|LrY#2)-7`Po`6LjF&*McG zyXS_Mp6yvjR+mp$r}SIrJE+S2D2mg5I*OxYkF@o06!ilI&&*=r0`*F|Dt`X**1Whu zLg7H+Na0xFfm|m;R*fVz48l~g!BDZMLuDoDB=EEERzl^m93Ypy*Tpawsvo5=q#Dy(oe@SQl?IHY~}QNgE2XNuP60`C>AG*r<3QSXejk> zP&}C=sUJ#x!H;lC2=W@iytEU(h`n*(-<7vX>qkiX1i68T$Iw0jaSV-|13FXoTD%f( z+DDb#0k=7;Uz#;8=i&ikZ6;Q7Lz7>njoi|NPKa7=FK7u?+#*K@xpP+5uDnHC{sY;$ Bg!=#h delta 506 zcmZWlO)o=16uoy|-?Xn(eQzYv5D5tjbRi)uiddkV+SHDD&qrF7nKn@yBu!X}=z?G1 zBUY^J#7^P|kg>F?L{eeZl{=-ea5MLubMM?anVGl7r|`~WC=>*WvxRf-o&&s^q84?( z;&YzF2?!9Ff+R3-VV%{6{#dXp{HYLxBP^E*AEiynDg6Sypa>M~q?O0MV9AU|=QU`{ zOJ_CnRy12$(YDIwQ?BOH&F19BvhU9x%tbBA>&Ii?a2pAYp2jteIgMMgl^U|S+FjMC zN}VK2y#y5;-DVw&vb}g@M`xsQl(qqSE=WIt_Q&G0vH0Ya_D|0xs>0rsnN1}lX2dut zhaggm%ItEno+kzdsA&w;JHalLN1!469BTN#KAN0x@sM|8xOl_wc6^#;l;$e0vTj=T z&|zt;F5#09WIsVAFqY1UT*@7nLsXiNRTBhd3lU$yDRaQ!F57qZoP(}H=z~vS%aK(E WqSKZtUHs5(tXe%pzs#N-B#&=UBXX|* diff --git a/src/hypermodern_python/__pycache__/wikipedia.cpython-312.pyc b/src/hypermodern_python/__pycache__/wikipedia.cpython-312.pyc index 94d822ab3c4832e59a7dc46da5b9fc1d641ab07f..291e0fe6214e30a4c38f7633c83d7c91cb7470f1 100644 GIT binary patch delta 3588 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 None: - CLI(wikipedia.Fetcher) + try: + CLI(cli(Fetcher, random_page)) + except ValueError: + pass diff --git a/src/hypermodern_python/wikipedia.py b/src/hypermodern_python/wikipedia.py index 2f648a6..f49fd7c 100644 --- a/src/hypermodern_python/wikipedia.py +++ b/src/hypermodern_python/wikipedia.py @@ -7,7 +7,7 @@ import textwrap import time from dataclasses import dataclass, field -from typing import TYPE_CHECKING, TypeAlias +from typing import TYPE_CHECKING, Any, TypeAlias if TYPE_CHECKING: from collections.abc import Awaitable @@ -15,7 +15,8 @@ import httpx from cattrs.preconf.orjson import make_converter from loguru import logger -from prettier import cprint + +from .prettier import cprint if sys.version_info >= (3, 8): from importlib.metadata import metadata @@ -27,6 +28,7 @@ else: from typing import Iterable + API_URL: str = ( "https://{language}.wikipedia.org/api/rest_v1/page/random/summary" ) @@ -58,7 +60,7 @@ class Page: class Fetcher: language: str = "en" url: str | None = None - timeout: float | None = None + timeout: float | None = 100 headers: dict | None = None # These two are marked 'init=False' so they do not show up in the constructor # noqa: E501 # logic because the user doesn't need the ability to initialize these values since # noqa: E501 @@ -80,9 +82,7 @@ def __post_init__(self) -> None: self.client.headers = self.headers self.client.http2 = True - async def fetch( - self, func: Awaitable[[httpx.AsyncClient, str], Page] - ) -> None: + async def fetch(self, func: Awaitable[[Any, Any], Page]) -> None: async with self.client as client: tasks = [ asyncio.ensure_future(func(client, self.url)) @@ -135,7 +135,11 @@ async def random_page(client: httpx.AsyncClient, url: str) -> Page: raise error -headers = {"User-Agent": build_user_agent()} - -fetch_wikipedia = Fetcher(timeout=100, headers=headers) -asyncio.run(fetch_wikipedia.fetch(random_page)) +def cli( + fetch_service: Fetcher, + func: Awaitable[[httpx.AsyncClient, str], Page], + timeout: int = 100, + headers: dict = {"User-Agent": build_user_agent()}, +) -> None: + fetch_wikipedia = fetch_service(timeout=timeout, headers=headers) + asyncio.run(fetch_wikipedia.fetch(func))