From cb224b0e04787877ff8605777107e1f53602fd4d Mon Sep 17 00:00:00 2001 From: Adam Ladachowski Date: Tue, 3 Feb 2026 21:08:00 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=AC=20Commit=20message:=20Update=20202?= =?UTF-8?q?6-02-03=2021:08:00,=203=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coverage | Bin 53248 -> 61440 bytes .gitignore | 5 ++++ tensors.py | 84 ++++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/.coverage b/.coverage index 78fc8c4bced27403f6ca750009c47b13d4c638e0..e98daa6c42b1176978935b1c704ca68eefb46931 100644 GIT binary patch literal 61440 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 literal 53248 zcmeI43v^V~y~h80&dk}f&odB0fCw3=5RjKZMP34;gzyG=Q%N!j6G%)lI5Po!ds5}8 zR8gs-LIqza@hzgYYPkZw@YU9~6oIQ%K`pIXy%o{i|DJs|2dwnguDezjU3(S@zi-bz zXZHE#obSwMB2y-htIi~1RmoIcJQM2&IY0;ukHr9h;g^kH@<9>8QsCd@7(Nj)=ymxl z+no-UJ`>zhyPez9nrD4t-ewJ8)68nxgZ08E)I&L-98eA@2mWIm@FrU{zinI6cv&W1 zQJcu5;+2V%_->zb-pI43j*Lw`d&IbrF)iT)H%>0C$-H=Yq<@YQc!@Cxr*ekm|r?Tp~xK$=G4|lO3Rb3ZPT@ z#nmUJt-*%;rE%lzn(G_tD$w$phPnm(&A~0i3ulri+VVu(W|IEF{?qTxcf6Ou@gDbf zO3V2>Dz<82s{Hin|l7hTmpDjCKjhJti_K`W$}hg zGONq*%`fYN->j=zL}`9uAz6B1_C(?KlvPw`(no^L#PZE9= z)z-$6RoP31ZyghF4xY`&UNgO=8Sxaq&|*n{BChn`dbaV!;u>NVwaJR(&$a9slTP3T zf>|J^RW;OC@=GPnkD)TTFp-MSOZ4)e6|wN|K9TU$>BIE=k%cEZb&j3_WqppK;kDIi zenA0gWZBcmf4BU<=y9izd?&vnM&(m=iFmppC4=N2g{0gfNJ)8(_|M?s^rU+J*###$ z9DiO}A0MI~4b%L*JmQHfg69(diX3+kd?dI8zI7w`=a;`Ao|zx}`?d37TzFAL&mWw3 zqJ{G%l=b1?^{aA1*(ER2vhLSm=<_e_xFz$EV98?>7xi2iuf;T35U)<*C5ss>?f@}9 zac&$Z$19Qzne6$?W%l&s_nu(AVh4ei-s7xp+39$BPfDiK)p%Rwx2^ObIT|aPA5ZfX zN*Bc{lF8acyk6WJaEsAte9h`~EW3ukzbg$3_L07b?_=J=qU@UF&4tJORJ`cq^@UJZ z7q6e|->>*>SnL(EpI@B(bwr5ZhOr{NDARa}erum{r~b1%vE=@HEkIBBUhCp>#pTZ5 zlwye=f*RMOm$r%#;0T#lRdE(#nZ9MR05y$@1@y=p=0yEy(+Pr5`0Ex zs5qK#McO|)clcXe)`x%REjh|R%6Wx^=6CN-yaxXY7U5Ku#!muuae1u13>|l7ee22K zB%6pSjUSPYJ-N8y$9Tx4cmulmjQF16D|D@5)~b>61gWg0}we0G!#YPrqLM3_PlkdjQ-6?&l}v0jfnS2b2TK z0p);lKslfsP!1>ulmp5E<$!WPIdIegOKVT$e+CE{S^@L_D}ea@|KEfA`=e78CE7w8 zOz%vhKAlXZ@gG^>KmRB0Zooh4p&U>SCulmp+#0S$jcz!pFMKLYNN z@3X0zs~k`cC|lmp5E z<$!WPIiMU+4k!nd1IhvAfO0@N@UJ+)fBvuf|G(m#+D18`98eA@2b2TK0p);lKslfs zP!1>ulmjP^1NifQQmEYk?&t1@?mqX|?u+ho?i20jrC?b(xj2=2_=kldWQFuywlC z*=lFGR@nT~JY>FW{?6QGZZn@SH=B2uYs{7Am1cukW0sjy&C%viv!B`3Y;U$Sb>pyc z$au$i%XrCn#(2cI+gNL?G8&DAMvYNwoM#jpgN$BAC!@7tuy5F>?0vSIy~?(+E$lwF zj;&@(*u|`#Rj}!73>(V&vM#J0b66<)MfAhy-sqdr9nq(v4@5Ua*F;xDFOR08Rnghe z3DFVJ{?XH-9ilCxIz3De(Rb)u^dE-bHVxJ9;ScMdZWC-pHGg9g(LZ z4@5RZ)1s zzAlk`7i$E`8<=;6%#& z@K9|S^J*pI_yvN`(uOjxM(|)hzgqAh&hrHi;9Etxk;a7zuxizVZFMrJwmdT0mp z&K3L`=W_(_;ygm|E1}nzceZ34A1?Ui&@0RvCiq1@f2iOWLN7D#EXg=NMDR{NXRzQM z8m?`S&!N|uH&F5}<_(aH`#)3ii_GgU`32^kA$ceBekgf6^ZE(i9>O_&CFAS%5xgpd zb50jLGPH_$y#?omMl!EgmPvC6{p>0D5NT#!55ez|L(J*0PTq8)B)Ud%+Y!>x!S*kLW)%0#ZiEwGk}ScjY8 zHYQRX@fIdR9d5$SM5e=ya5EE;j(8Iji4HfwjZ6eOtcDwy$aA^gG z-5Pps7HX4}=Qbg=b(DuTAvGz=6Pu8VjdXYx;uVx{y$^)5@snaP>V?w6Pp*)Harc$26 zgiP8>c?c6SaT4VTOvr?Zl*cb2<0nv_y@ZS#PkHbXGIkv0sY}S{v6M$HAth5N&s&7i zl!q-L!%HYnT0({mr#xl}88VO-Wnu6T+9eBv22-A{gbW-;d9)JJe-P!lN=U!{l!q!I zefv?KsDyOyOL?3U(ya^SSxQLPZj=WpAw^v&Pfm{l!qiCwnKSB5@Oku z$0H%8MR_(7VwjW%BO%P7JQWFvGRh;75IstH9ugALDGx(}_b$qlkdUnu%2NT)XJPogB5q-@=F-S!6H5b4K`15~K7;51C|DgM} z`-Z#S{ki+FdyjiNw*Tes6>fujfg5*cxZ~Y(u>1FRJG%vL3zs@yJD)iRvHAbTdD;1; z^MupnY;u=V_*!X{Kyk z`Pla-S?5{E@|s z8`Cnu_^WZi*kinIJa23@HXA=PZZwt}7aMg(xiJNs{y?LLQE0S8^Z&*^Vtd&e?0NPC z_Waw~b?nD%A**KRvx#g3JA-v)1=#XQ^smtmqPwHJqR&Mijoux-C3;Qt3hela=*;NY z=+J1N=&8~Cs6oG`f1&SU!+()JO&_Ei=uLDPy@b}&IGsvIVZZN5V>FlQ`j`60`abt}a$lA!Ykt-u< zZ1%Gv<08W%eIuPCZ6ap)oA4*$KZbvcz5W;Bhr%1fYr@OJmxhz!itw~>Nq8`}`i|jN zVX7V0{-o{Kex>cup42vL>$TO|)!Jh10xeA{c3xshfu$E?!S?`LFEOOR+Dn)e*n3G-3M{^aN`cLn=z(Y=kw9!F;XrI6S|IKv zp+MY)5#_I7owk8MAl5^3AZ~|mq`(RcUk73x9FYP`FnlEiwqQ6c1=e8rQVQ(B@HZ*2 z2*dwKflU~`kOHePd>)86{525e@L3?r;L|{q!Y6^41AmbM3o-mz3T(u1ND8dP@TWiw zgpZ}bQVbtSfvp%mlmcrp9FzikF&qfQaQGk)!{Gfu42AasF&O?Bh(YjfAO^rYQeZuX z{|>}J*e?YZWY{MKHe}c<1y*EuI}o|BM+z*-@P|O;!fq+BCd2Qgz@7}hlLCt}{8kEV z%J7yHSe4;7QeanxUrT{y8GaRrTzFFotjq95AUeY9fr!CtfhdGm1JMC?1)>062}B!s zIS_g9QXpEvi-BkfFGzvK8FmID7k2o9S7+ER1$Jk6UJ5MF@Ly73dxmX+*a5$k0{b&O zCj}O0cvcE*(C|zkcEB&Bzzz*hOMxXCetuMhUWcawu?wCI#4E5h5HG?Lfp`J71Y##V z9*FJmm=sv1;n6_sfJdajIt>p?fqfbtk^&1gJm?GFsNn%Auu?;l6xgX@vlLjW;eIKw zRl|K!V6BEtQedx!djqiq?vVnUHQX%)R%^IR3hdT!XCPL>#z3rq4S`q=cLZV?{45Yl zVZ9XCuwk7PSh3-DDX?S1ZGk9;TcyC34Qm5Y47W&uJsWNgL^1qS3T)c2CJ@DNlN8vs z;l@A|!wpgtljX2F5aZ$cK#YUy0x=eT5{NOdDiEXL+CY@RHGvofE2Y5J4J)L;+6~Kn z!Fx9>lLCu3ER_PAH!L|SaN^a0I09Emf#n;1ECsf2Xp{o$H+WKD|As5G9}hx=H}ESY zV+FrF;DeV*#u9$1WNhJ=NX8m|v1IJw7fHqv&2s_VEiPV+_*7pv%BQ;eVo7U8`c#`dS5ne{hO@n=!HG7axGiMF-X~xU}K24u-rcYC+ z_xEYaoHHa%{h?2jw)XRB;-tPlO_E2#a(J4N~x)k`-I@Zpoyw+`fYL(Z{@t?r++ zy!%HaWBCtD#`dpC#`+)PCw3^rc>h=b|Nr-^u4=Y&KslfsP!1>ulmp5E<$!WPIiMU+ L4k!msMhE^E29YIL diff --git a/.gitignore b/.gitignore index 505a3b1..550e762 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,8 @@ wheels/ # Virtual environments .venv + +# Coverage +.coverage +htmlcov/ +coverage.xml diff --git a/tensors.py b/tensors.py index 29402a6..5fa4df8 100644 --- a/tensors.py +++ b/tensors.py @@ -46,18 +46,24 @@ console = Console() # Configuration # ============================================================================ -# XDG Base Directory spec: ~/.config/tensors/config.toml +# XDG Base Directory spec +# Config: ~/.config/tensors/config.toml +# Data: ~/.local/share/tensors/models/, ~/.local/share/tensors/metadata/ CONFIG_DIR = Path(os.environ.get("XDG_CONFIG_HOME", Path.home() / ".config")) / "tensors" CONFIG_FILE = CONFIG_DIR / "config.toml" +DATA_DIR = Path(os.environ.get("XDG_DATA_HOME", Path.home() / ".local" / "share")) / "tensors" +MODELS_DIR = DATA_DIR / "models" +METADATA_DIR = DATA_DIR / "metadata" + # Legacy config for migration LEGACY_RC_FILE = Path.home() / ".sftrc" # Default download paths by model type DEFAULT_PATHS: dict[str, Path] = { - "Checkpoint": Path.home() / ".xm" / "models" / "checkpoints", - "LORA": Path.home() / ".xm" / "models" / "loras", - "LoCon": Path.home() / ".xm" / "models" / "loras", + "Checkpoint": MODELS_DIR / "checkpoints", + "LORA": MODELS_DIR / "loras", + "LoCon": MODELS_DIR / "loras", } CIVITAI_API_BASE = "https://civitai.com/api/v1" @@ -72,30 +78,62 @@ CIVITAI_DOWNLOAD_BASE = "https://civitai.com/api/download/models" class ModelType(str, Enum): """CivitAI model types.""" - checkpoint = "Checkpoint" - lora = "LORA" - embedding = "TextualInversion" - vae = "VAE" - controlnet = "Controlnet" - locon = "LoCon" + checkpoint = "checkpoint" + lora = "lora" + embedding = "embedding" + vae = "vae" + controlnet = "controlnet" + locon = "locon" + + def to_api(self) -> str: + """Convert to CivitAI API value.""" + mapping = { + "checkpoint": "Checkpoint", + "lora": "LORA", + "embedding": "TextualInversion", + "vae": "VAE", + "controlnet": "Controlnet", + "locon": "LoCon", + } + return mapping[self.value] class BaseModel(str, Enum): """Common base models.""" - sd15 = "SD 1.5" - sdxl = "SDXL 1.0" - pony = "Pony" - flux = "Flux.1 D" - illustrious = "Illustrious" + sd15 = "sd15" + sdxl = "sdxl" + pony = "pony" + flux = "flux" + illustrious = "illustrious" + + def to_api(self) -> str: + """Convert to CivitAI API value.""" + mapping = { + "sd15": "SD 1.5", + "sdxl": "SDXL 1.0", + "pony": "Pony", + "flux": "Flux.1 D", + "illustrious": "Illustrious", + } + return mapping[self.value] class SortOrder(str, Enum): """Sort options for search.""" - downloads = "Most Downloaded" - rating = "Highest Rated" - newest = "Newest" + downloads = "downloads" + rating = "rating" + newest = "newest" + + def to_api(self) -> str: + """Convert to CivitAI API value.""" + mapping = { + "downloads": "Most Downloaded", + "rating": "Highest Rated", + "newest": "Newest", + } + return mapping[self.value] # ============================================================================ @@ -345,12 +383,12 @@ def search_civitai( params["query"] = query if model_type: - params["types"] = model_type.value + params["types"] = model_type.to_api() if base_model: - params["baseModels"] = base_model.value + params["baseModels"] = base_model.to_api() - params["sort"] = sort.value + params["sort"] = sort.to_api() # Request more if we need client-side filtering if query and has_filters: @@ -760,8 +798,8 @@ def info( raise typer.Exit(1) base_name = get_base_name(file_path) - json_path = output_dir / f"{base_name}-xm.json" - sha_path = output_dir / f"{base_name}-xm.sha256" + json_path = output_dir / f"{base_name}.json" + sha_path = output_dir / f"{base_name}.sha256" output = { "file": str(file_path),