From a3ec3c1538cf6826e61d6a939c92568a643edc69 Mon Sep 17 00:00:00 2001 From: Nicolas MARIE Date: Sun, 10 Aug 2025 11:10:50 +0200 Subject: [PATCH 1/2] file change : add gui --- gui/__init__.py | 0 gui/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 178 bytes gui/__pycache__/main_window.cpython-313.pyc | Bin 0 -> 3720 bytes gui/__pycache__/worker.cpython-313.pyc | Bin 0 -> 2194 bytes gui/main_window.py | 57 ++++++++++++++++++ gui/worker.py | 31 ++++++++++ main.py | 11 +++- requirements.txt | Bin 386 -> 259 bytes scraper/__pycache__/config.cpython-313.pyc | Bin 1184 -> 1188 bytes scraper/__pycache__/extract.cpython-313.pyc | Bin 8007 -> 8139 bytes scraper/__pycache__/save.cpython-313.pyc | Bin 3402 -> 3327 bytes scraper/__pycache__/scraper.cpython-313.pyc | Bin 4512 -> 4945 bytes scraper/__pycache__/transform.cpython-313.pyc | Bin 3497 -> 3545 bytes scraper/config.py | 8 +-- scraper/extract.py | 7 ++- scraper/save.py | 4 +- scraper/scraper.py | 27 +++++---- 17 files changed, 124 insertions(+), 21 deletions(-) create mode 100644 gui/__init__.py create mode 100644 gui/__pycache__/__init__.cpython-313.pyc create mode 100644 gui/__pycache__/main_window.cpython-313.pyc create mode 100644 gui/__pycache__/worker.cpython-313.pyc create mode 100644 gui/main_window.py create mode 100644 gui/worker.py diff --git a/gui/__init__.py b/gui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/__pycache__/__init__.cpython-313.pyc b/gui/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41c74d6b1a5d1f905542a4ddfcc55afde75015c9 GIT binary patch literal 178 zcmey&%ge<81aj}EWq|0%AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkqX}7ps_X{~+%e zxBQ~q#FEVXycqw2)V$=J#Ny(j{QTVFn1ITX45+9xTr@tQC_gJTxg_4eC?>r$GbTPh pGcU6wK3=b&@)n0pZhlH>PO4oIE6@gz3yMLEkIamWj77{q763!;FLVF^ literal 0 HcmV?d00001 diff --git a/gui/__pycache__/main_window.cpython-313.pyc b/gui/__pycache__/main_window.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84c35e9a8d2720bc833a6fc142e50f97f153286a GIT binary patch literal 3720 zcmb6bU2hx5agRKb%THO6Y<=22OR@u|wQM9-TG(mO#7>%!wq^0eNUhi&X!1l|Lft8Q zM@#Zc)S^fvq<~czLR2(Bq$eT&B#$K|f%eux0yHmv6Cwr8V`uhwB*n-mI>62C&F;<2 z&i7$F9w7jq-QJw*4-)ck{O}-9UmPkDAsa*`s+1-S-@dez@-bh^&-^Kw$*BMfq=GD{ z;GRDnN>N5rVHQqBSVYj|bTk!XF<1xGU^<>ku!KT-$q-RP{Y0g?@R;9~#X1Bv4Ae-@ z-=Ln#b*j;8(}d(xgyeifBu6qMo|?_~80d+>x^kz6$e8; zHtI`|(v`XVQ@Zz`Cru$GsU#(1&+zD-WPrye-dI>D8-=`MSSAlmOc}+J?(pcudv97x zxAMzY#o^(JNqxzAt7stoZpEH^v*I|Gne_9ZYLv`;8U7o;_r6|mU@;s(@TGg!Ek{n(E>IU47Nh)DJRbu{}47Un+nzNwl>nALv`Ta?affBmOWgWEPe%oP5AD3;tJj-P~V53Hg!Y6ND%T0}E(z&-S zHZM$`8(+}PLOE~S%(CX~+}&ko&N2n{MuV!|Wfq!OyYh0bR55b%dBfBe!M@hw=)y7& zpm?2kA2-FQpkl_@{eV`;V;ZZ`zAEjj(Q{RL?sI$V>OYqEY4Q+uNueH&xF)z3Hj`no z0e59Dz~W1|GCKnc8}}8~3z!FH%McJhku9ikJd0Kove^Kv*jYe#k`Ycd&CJj1n#LoV zHg6RxWn9NJ?ZZmGT;J)?v{{4MPT4SZ)6z6Xk;7?3U5NS+{R|L4t!cIc_AF?5$6?03 zilf_b9)-DLQCHUCAq)~5`Fu>CboFfxKf1nh>w8%Wy!1m*3dG$%@Nfa126#brcoj&0 zY>U+_xhi3NzE7DfA~c}N5T`*kz(QH_Yl+bj0?`^#3oO5&GswATr-02dtD~`n)xQG! zzAkN$nTG61f0q0KEa|1Qf^po4&&Dw*dd&!h6L`-yP<^U@tbP@R%!Ivdk8_rk8+?I- zD7fAk_nkqvwt*@)<<6kx1gMSVHKmzOkLpP>eOX@y{n!R4OKtLh&R@rGj?Qg^tgp#q zrpMd#w1IoaJX%)DV8*mT2BWDBK-Y6^B=~H~DS^}PJc!o4uKYIpu0g=f2KssOL6_>} znR8intOdo!z<@HAJjDZc1wsTf#4rs9vLa#Y&XmaZNy91YJjit0c%U=rfrR_ZR*6U9 zLdIN_Fakp?`3mC6Azp#oI@5A-4|EYrjq9%B_#Yv?13 zl;{3?j>&`NdPC4OQL-TGFlZG;SrOHMVdvsq%^)B3?ttF6cL4pkLY~t2TBu5U_h`Q; zNdr|nuz7orz64(nqifOio14RX^xSt{gO9GS%73LurfalD2di{&b8?RkJx%oev;XpL z;>xQ3yUxK!XIF!dX`)7Zf$3)V7rlQ6)$HQKd?it?r$H z?SVad=^#kL@n(9|=x~(|Z{6HUZ>M+0x5xMB)y97~P}JzfD!sVn?0mHS(H{L}V-M4| zMn|f2WNUI~W_zY~VXS&#Y>&SBt())eP_j=4+@x!DLL=#}f%gB;@YWpJnojbuQM6Lf zwQkbq7Pip5Zrk~iULVoiI`#%0Jl$f>rbk|eEgOSe3^iDo9(JsCY=-u!BJ@wn437v| z>^iPq1C$K2^SB;DG>izHBI>2^9Ycxi0w5l*7uSMbE^As+V!r~a@bzz8|{TFOn&fn1}=YpF%}s7&!7}Ie?S1agAAU;W+H}0E!hj>>9Wl`?=GuGQGa!G0$K}> z{5C^lGZ_&!57AvjFX4&i*&7zq-7yR&2RG^yqF3l_6dK5^Q4)bKF74)ln7V|{XaO$g zS?NCagFzuVL{o!7dCppd*?9@#8?atz8{9a3&7BZmXYT2Js@Rr1Q$WaMkoe`|0(^K+mGeYC-40EomKVW^xE{Nzu%X855h$57Z&|5NIk%3 literal 0 HcmV?d00001 diff --git a/gui/__pycache__/worker.cpython-313.pyc b/gui/__pycache__/worker.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..284b108cc4b0280f92cd662ab16a83069caf4107 GIT binary patch literal 2194 zcmbsqU2hXdaP~gzvpG9K5#$45&H&suwUgiOQXPYL7!J@t!7Z*SUm5jm&p=5-koWl0pC_f@lL4hvl1(ojs zRmhP(w8MakMKKk6$d)P23m+MuI-wU_FQghpD{rQV7j_CXU)E`Xi8LWlhWgt`IgZEX zfD#obrxMENgkH#reWW2wLu}s{Xwq;NUL`8m11BUZF=uE*6=*aI`v_gN2~wgLI%?CC zI(;ahN`VXX*u)NHqn<`IKrX-}&JCF0vhXfOqIrx0$J))7ZV^&sEX8}GQ^AXPlBOA! z;cA-4SEz|}!O_hbDx)bcqG<&)?>L&~u%i^E>WvTe=Z=nNMso*kTFSeIZRN(xy5);e z+b%h|!)M&tfI7&OeX4et+ANgX_MN$6#mJrVZz+|M!M1B8(HusHrMe-%=3r}eYS+e3K+Gu~) zKHI&>$CXD=gd|L|y!sG^{7wLie+h5I$+o6;wsrG3sG(i0odO%M$Si(8KlV;zo*^@^ zkKX_@BncD$`wmT8sqh$Oi7hl8Vsi+`1|0QI5Djqb6=Yg@MN$Bh?5+4P*~)Vk`hs`T zjJU;32pMMaImoo~yu!$GO)Ui`_+H4ucF2+;vYRM?<;IP9M8R4XPS}R!@uhs(;~kfJ zQPVDJj^A25K`$9DlgZPf*2Bs?W3DO$18driBLH=Tj>(-Q3cIIK-#jV-P1zBqe+_KNfUu4}?KAKqD; zo_lLaZvTAz?D$<-S&)_a&P6$OPwu%ibX(p!fAEgHm99qBN)Mvi)vv3H>gK6ySVhHe zkhn;v)6q&dvZD{Ke59zXZ8CPjE|pE))u)lmO8>#P=ad7K+O%KsNHi7kq^XKwq9w-@ z8&~Z@Das5{cHf{e9XMUk%dGp*P9%EL4E8W*R-aCZerRZti6$6}=yW~Kez4xdXuZ)0 z7LRf9qAM|Cb>aMk=o}#7l+ReFUsp*z^+M<*fuwOZjA8`ojr6{PAtfYpJiqFQ3Tq%>p&uVo>80M^P_WP z$Mp}c&EA;0oqX-C+`l0AKdJF3_oNp34`cs0ThROO_OE&~4mab`!6<*T>y<%~zXjr8 z3~q@cQf@_gwvKHa+|H+nAIg->egG?9((wm~YFf#ju9$2sYufvjycuxXG;PM9j%ym0 zZrPefS>^b#r+$7mu`SCd-HgavgFl9gze7RGyDl}RDz1*7h!+d~lY(xVnuZ?4QP^Q6 z+Q$L@6cRH9G&xxJ*12k;-RV3|ggkXT~Ko;}OVNVRBPsneu TQ*+J8OUmWqBmYuCR4F*aA^G0h!Mxu-IM5n#4XrRTR45~>8DZ>{`b%i ew9IGHAcq`OXf@?vT8WY8vG1)qydn;;RgXUcw@*m` literal 386 zcmYL_+X})k5Jcx$@KY?dR($d^d=@WJ3%%J^Q9oWiyRk?~mS!erC;NHt6|~b$g9@Ff zrFu2gR=L)Exe}#Xu;-d;q67Z!=PullX|7C594q&Zz6;zATEIP14YgCnSxKjtQ;Z+U z2?V1TI^x_p*OU~to!2C)$n^YmO#EKzS_kWj9_Tf&jGA$G;d@LozNx1}(4959R?Zk8 yw`jG_+M+%n1^&$6c>T{JPQ+4eP%Lp^DveijrSvvWOn&3lrN4PkqOq$@E9zhBIy%V! diff --git a/scraper/__pycache__/config.cpython-313.pyc b/scraper/__pycache__/config.cpython-313.pyc index a92da0e8920e5ac77282287d764bff04bfe2f2f7..b465e14e84ad5885ad492268d8ecce11b05c6509 100644 GIT binary patch delta 114 zcmZ3$xrCGNGcPX}0}$x@%*bG7-pD7w#3ZgaS)NIkNlI_BFO!rqzn-3cN@7W(er9fB zdTOzLsX9>ghxyBQD!Akq7iXpxDd=tPV2WjA(Yeg0JNYHEI*a*bF^kC}EXpj3m${WD RTeB#z=wD$lm>kdI2mo|`9%ldm delta 110 zcmZ3&xqy@JGcPX}0}!;WpPKQXX(OKi6QkH<1twia$;tjqQi^r61-m->Kk|UtFA-TBNYKhbfkkMf)MUlL#mpy5uqd-AT;^7sY|o;= NqIZQse{wR5BLKW2A7}so diff --git a/scraper/__pycache__/extract.cpython-313.pyc b/scraper/__pycache__/extract.cpython-313.pyc index 8d9ad066409fcd29100e4d97fe2e60d20c7efdcb..41b07149768df1e9590bd8f048d427b2bda13f7f 100644 GIT binary patch delta 2214 zcmaJ@TWlLe6rHhm{eHjJ&&GK)shfyC)25;66H15_7qV>CU?k(%n_%j!o!NDj6p2** z%4e(vl77*CpaMdGWIm`O@f1R(0u=>N*ica+e)vlhKKLr!S=VV=p^oJ1nRCzGxpVGZ zufIKV^Qd#f>9ipj?ZV;Oe57+ z+vwgxQLdD7Gg*ofE1)cVWIvdT=r_hXH@w)f7+Sn=%eM1prh5ZmRGSYOI$8At=ZESU z{Co?g>O){36d~l36hM(cr5HNfyDP-ZBI^+os6L9E&rwMfOMhfH%2o3iFXddAj32n8F*q-J-Ni;lykR8Ey zsqrnCc_%%(WIy`}@1nWW%ASYe$tsIwvuv7$Q5C-{IB(^(>1g*fFD=*i(2 zuw#O<{C>d?tZh2$Qsa0ud3VcZ@&O^h>rXTXg&=T~>MVJ|u)j(197-pRM~93SO7_yoWG36m5NI1mL&BSnR%5P1@qdUkL#g@_Q<1r8_C zX#((Qf4%CV=VW8>5 zjB*EHS4YO&M0mI0fHv`LZ4&|i-`(K7nOHMwzu;(!wBOL2B~c6FjgsTI;~AWuYRty* zI2tgvpmCh)slUta#+=3~MWrNaIHxg#df?$eM9NR5ZJ+ z>Qhu-ksvHcSe>+To+!nQ)k>bUP_R{f!+HwuR#&ZEM-u=f zA2*1F20O%Qh2-)|wvbbDe}?x z>5sYPuD(x?e?EA9@QcDy`qx1GP9V0BuBET+xz=~J@0UQ&h82b4cUk0*tl3>C5L?_+ z>z}i%sF&@h4D;6d@Amze`RDJ~u$piVBqEUOSFRI|XFceK$2R0K-iUS&*^S@XS(vMD zbD{eC&dUae18BqvCQV%GY0uHUaIX+KNKGF#v{r<62RQ^rGs$8}%qtqBfH)cp#VJk0Ws!68!}oB9)r8udomF@R>&L*B0q z#8$uOUBDT=u;zS~5K&Ty5BzDe1FVLVgdXm%e_^CpLc5L}rVbW<+lz{3BI0EEyr>!J z8-Q)3Vz1;T#H>`E91{ugsB8XcOs}yUE@yVDZxSAKS=}DEgl+0QZ>0WZ;3l5kDiYld zeuYrVN**f}d66t!%9?RH&`#=Y~=oai;bFJI9j%A^dOkLrGI zp6T7phPVK1XkyM0rI?3yv{y*EP=!ldDHn9n8a*+puEf%_dNHZekEXs^U_#GN2B@LB zYGxwB`!X+*BXngVy22?}<1Dn?nq#xbRZ@CTd;%{#>THxxmsnHZiFe^C_51h`wy5Dm zC;K{ZzNw!~RIr8qH%QsZ0d;9xYn8s3^@byQvU*Nb073)agFg&(uGi0UcoL3V5|5Be zfMNK^yTGg&F~+ONeH$fiqvSe+anHI*!Z^4-W=!Dz^<&tNx%D1D?%(LyhuifB{s(`b B;1d7< delta 2017 zcmaJ?U2GIp6ux(N_HSnYf4bejcH6BjOG^tv3vFEy5NMmUN~Z%=qT6M6T1vOG+q<(# zAtsZWOpHDm*TfeM2I3F#g$5JrC z&-u>J%znTB+h-jc4hN55z5mTSr?)LRLipfP+aYcWCv8h=f-d2J;ct$n0$p^#d7d6O z9Ba2QG+UxgGC7gR?>2VhswR%c$3&qG4h={$j{4|az~``US{1WoruU42CPz(Ukt{xR z+*&epp_0Le2KFMPSS2f6H2A&Ssy+jLXEERhhm7i8{Uo(V8S{k_!tvmm?pR6mN+r0qmJsR*b}G*Ks81hb$bpf z8D~~Kry0n}AvQ5DKCk2jFU>mY^=e|k*_Ehq_DMdGxe8hQk{_TgR53&x3Gpe>+G|h( zQef1`S|GJ{p>C)mTS}eiQG%jJY!f45gSbs>5|f=~rCzFo?A>4wNg=7eACNj70qE3A zA-#^lIC{arsw)K{)^-+ard{lSy};}{vA6@GhNZCBspBJ31Z-W5zQnaagX8d3tdpn- zova6?zAPxy15t&OmQ9W5lLQzm|JJdR@MuIIrohSACQcIQvN;qH4hTo_NLe&0u$#n_ zC}nI!lQ_Ba-0yV76|DSW4&vv_Hn3r`5cC&QZ>Ho+5H4mnG%d zQyR`B4H`F4n3Xlt!9roCG?v7gsiczWVkKlfi(6cpmB@2txuljf2=RxIwy3T z|An(H3@*xxC$1j4&BuS>npQ&%3sWmx-5T#S?OhFouB4aJ%jr9T?gf6;6Zz58vf^o3 z7VmhH3+4xAR2SVaabf;`AhL*8UG7Ws7w0!j$dR}gja?gfZ{T)EY9*S|H46tW4ZS&Z zb!=hij=lM(KxEB?Y{4}Tg4=66@;5Ixt@v6NtoLY}{Ya%?--G$T)`tyX{qv!he&|T` z!VsYw-qwMBbYov&pohEZaWa|kG1()4{<|I%ll}Z)zwwr-eXz%PtH(6h|Ecp6gWU|b z37fzXVx?cW_wU@r6i+j;n~6P47@6n>p_!|#)i~Bj;sq7m;fYM_X8<1)2beg>#1Rl0 z$GW6BYE4rzvoe7v9+j*h;*S>@V_5%YYij5+$&)mgR9f-eG;E;Cy!Q(3WG`*ak}VS= zD=M+WX@n%04#$Zfet&xeD`_I|N=0NJP5Hw;dCqN`^al`*d}?hi*`3Q&9J9U?`M?`OOr6{M~Fz- sXw8T*{u#OMqS##&U+3}|2i9LT#&F;IbJ&N2>m5Gax6!d1Cv;!`0QFAPxBvhE diff --git a/scraper/__pycache__/save.cpython-313.pyc b/scraper/__pycache__/save.cpython-313.pyc index 5c648de265588fe52e834aa392f39183b3b263f8..846f0c31fa8a9829edb770e9da7605521390722b 100644 GIT binary patch delta 571 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 diff --git a/scraper/__pycache__/transform.cpython-313.pyc b/scraper/__pycache__/transform.cpython-313.pyc index 0ad8f04f8edf3a2916b45ed9a2e7be8de424ab78..c5b8537ddaa7d679cfefa8becefafbcbbfee5d39 100644 GIT binary patch delta 139 zcmZ1}eN&qEGcPX}0}vd0H7(=!MqXJ?Mvu+foPvy#4{(ZdbDA=O7RNE>OII;e!~1pjdUuXurWx;&WOG!u6cn)i_@% delta 111 zcmca9y;7R@GcPX}0}wQ>o0^fckyn#U#VUI zDr;c)AjTjl*5G+VNc@6?)m56fNQgY6Sq&?jMo> diff --git a/scraper/config.py b/scraper/config.py index cc618cc..6ebe741 100644 --- a/scraper/config.py +++ b/scraper/config.py @@ -11,19 +11,19 @@ # Errors list and path exec_errors = [] -errors_path = Path("./data/exec_errors.txt") +errors_path = Path("../data/exec_errors.txt") errors_path.parent.mkdir(parents=True, exist_ok=True) # Skipped images list and path skipped_images = [] -skipped_images_path = Path("./data/skipped_images.txt") +skipped_images_path = Path("../data/skipped_images.txt") skipped_images_path.parent.mkdir(parents=True, exist_ok=True) # Remove folders and files if exist -data_dir = Path("./data/images/") +data_dir = Path("../data/images/") if data_dir.exists(): shutil.rmtree(data_dir) -print("🧹 Dossier ./data/images/ supprimé.") +print("🧹 Dossier ../data/images/ supprimé.") if errors_path.exists(): os.remove(errors_path) diff --git a/scraper/extract.py b/scraper/extract.py index 0dddd4e..96e4e79 100644 --- a/scraper/extract.py +++ b/scraper/extract.py @@ -2,6 +2,9 @@ from bs4 import BeautifulSoup from urllib.parse import urljoin +def display_book(book): + print(f"\n▻ Book \"{book}\" saved\n") + def extract_data(url, errors_log): """Function that extracts datas from url. The given url represents a product page i.e. a book page @@ -31,7 +34,9 @@ def extract_data(url, errors_log): # Extraction of product title title = soup.find('li', class_='active').string - print(f" ▷▷ {title} \n") + + display_book(title) + all_datas['title'] = title diff --git a/scraper/save.py b/scraper/save.py index 9cd7da1..519d81a 100644 --- a/scraper/save.py +++ b/scraper/save.py @@ -24,7 +24,7 @@ def download_image(url_img, file_path, errors_log, skipped_images): directory.mkdir(parents=True, exist_ok=True) print(f"➥ Image destination : {file_path}") - print(f"➥ Path length : {len(str(file_path))}") + #print(f"➥ Path length : {len(str(file_path))}") if not file_path.exists(): with open(file_path, "wb") as fp: @@ -34,7 +34,7 @@ def download_image(url_img, file_path, errors_log, skipped_images): print(f"⚠️ Image already exists : {file_path}") skipped_images.append(file_path) - print("═════\n") + print("="*60+"\n") except Exception as e: print(f"❌ Error for {url_img} → {e}\n") diff --git a/scraper/scraper.py b/scraper/scraper.py index 39310fa..3351f48 100644 --- a/scraper/scraper.py +++ b/scraper/scraper.py @@ -10,21 +10,25 @@ def display_category(cat): c = "┈" * int((35 - n) / 2) l = "┈" * 60 print(l) - print(c + " PROCESSING CATEGORY ⯈⯈ " + cat + " " + c) + print(f"{c} PROCESSING CATEGORY ⯈⯈ \"{cat}\" {c}") print(l) -def display_category_end(cat, count): - print(f"\n▻ Total books scraped for category {cat} : {count}") - print(f"\n▻ Category {cat} saved to {csv_file}\n\n") +def display_category_end(cat, count, total_count): + print(f"\n▻ Total books scraped for category \"{cat}\" : {count} / {total_count}") + print(f"\n▻ Category {cat} saved to : {csv_file}\n\n") print("─" * 60 + "\n") - +def display_books_urls(books_list): + print("▻▻ List of extracted books urls :\n") + for book in books_list: + print(f"{book[0]}\n") + print("\n") def scraper(url): all_categories = get_all_categories(url) print(f"All categories extracted from {url}\n") - + total_books_count = 0 for category in all_categories: display_category(category) @@ -39,14 +43,14 @@ def scraper(url): # Extraction of all pages URL of a category book_urls_with_category = extract_books_urls_from_category(url, category) - print(f"▻ Extracted urls : {book_urls_with_category}\n") + display_books_urls(book_urls_with_category) book_count = 0 # Loop for scraping all products url of the category example for book_url, cat in book_urls_with_category: # Extraction of datas from the product page url - print("├ Extraction...🚧\n") + print("├ Extraction...🚧") extracted_datas = extract_data(book_url,exec_errors) # Transformation of datas @@ -73,8 +77,8 @@ def scraper(url): download_image(image_url, image_path, exec_errors, skipped_images) book_count += 1 - - display_category_end(category, book_count) + total_books_count += book_count + display_category_end(category, book_count, total_books_count) # Logging files if exec_errors: @@ -93,4 +97,5 @@ def scraper(url): else: message = "\n\n🙁" - print(f"{message} Download completed with {len(exec_errors)} error(s).") \ No newline at end of file + print(f"{message} Download completed with {len(exec_errors)} error(s).\n") + print(f"Total books scraped : {total_books_count}\n") \ No newline at end of file From 53f119b76ff5ee7612c7f9cab3df1f1b52250aba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 09:15:25 +0000 Subject: [PATCH 2/2] build(deps): bump uv in the pip group across 1 directory Bumps the pip group with 1 update in the / directory: [uv](https://github.com/astral-sh/uv). Updates `uv` from 0.8.4 to 0.8.6 - [Release notes](https://github.com/astral-sh/uv/releases) - [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/uv/compare/0.8.4...0.8.6) --- updated-dependencies: - dependency-name: uv dependency-version: 0.8.6 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7d1cb9d..5f5d133 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,4 @@ soupsieve==2.7 typing_extensions==4.14.1 Unidecode==1.4.0 urllib3==2.5.0 -uv==0.8.4 +uv==0.8.6