From 61079da0a8fb4c47d7c15c439f9050d6cab67fda Mon Sep 17 00:00:00 2001 From: notabd7-deepshard Date: Wed, 11 Mar 2026 19:09:00 -0700 Subject: [PATCH] fix icon issue --- .gitignore | 1 - pyproject.toml | 1 + truffile/assets/Truffle.png | Bin 0 -> 8922 bytes truffile/cli.py | 35 +++++++++++++++++++++++++++-------- 4 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 truffile/assets/Truffle.png diff --git a/.gitignore b/.gitignore index c5f64cc..4ded562 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,5 @@ __pycache__/ .DS_Store dist -docs whatsapp/ docs-repo/ \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 55190a7..ab5869f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,3 +50,4 @@ include = ["truffile*", "truffle*"] [tool.setuptools.package-data] "*" = ["*.pyi", "py.typed"] +"truffile" = ["assets/*.png"] diff --git a/truffile/assets/Truffle.png b/truffile/assets/Truffle.png new file mode 100644 index 0000000000000000000000000000000000000000..979ff73ce44802282df90fee6b713db3088d3cf5 GIT binary patch literal 8922 zcmeHN`9GBH_rGV1Wvn5z*d^JMtQm@;2U%yvSkff>*vghIlPu2@g)EUmMKUuO%UBx* zc@j!!#=cd^GRUs6eD6L#e_!7};QRXgFh9(>uIpU)eXet#^FHr${bOTg#>ahv8vp>l zzph@k0{|%I&yR}(lr($hi~)e`%fBvPLf(Zi#}Cs*K5S~QrZ4UnRLIdD0)GRFP#f4) zLA-3*QOJ?|mtjt_X@7&#K-f9Koy}^y*WFc3OR1U&gl2&?y{swOkJvSq%j(f9X=>S7 zIkW_T%-s(#;G!ag2Pn+JvjaAkG$?T9G!_CJ6($3~Lpb;-9WWID?*1EbSNfn zWZuX~c@?s#fNkZbU^iwz*J@Yq#T!u3 zo~5%_XQ&BhR1G5ad0n?xCJ)b~KsI42XZlCND_p7i5r_NRlkAF#Pt)iGm(shG$@_VN zl+fr<;coD7#o|p~mLl3&acuVu+7=+b&E+ zw-{9-^hSsf3-f~go-sOU@I?_8E>x5bPI?m z6}lRu2`;KZK8jTeP|>C@O2`O@mvJ7a{1DMQt0oqLwU#uujB}Y2pgi|wTxC(r5WzXZ zVcZP|Q_+^Yr1Wy(=g-b;IQbmhaq=FE`B!N7lBlyZw$iE8T;8&H^JzFrX(*9lZW(GZ ze#K^IdFgx>bpwQhN!i3zH~&ZK|v9jm-=+0yY@+ON7qane|gB2mJ<-5IfUBuzo6 zHs2t^%`^EX9K$Q8iR>*fawvtC7x8tLRC#F0zCJ?6AdTtCV(L9eh)#A;Rz#Uus^p7! zHOv!yhwMl;w-3Z=pA%^@dKOg{uc~@ETN>N<$XA3M&oH(eigSgjc$PS^rxY?J58DNd z-uh}>fFuu}!t8GhSQAjnUz?-P4cyt$->a?CH#17x(?ebB#$i9++Nf z>)+vTM^D%zF6>nsysdvTtKe;WjrPqHM%;bQZ=-79@!-m|Pps1yUm4QA8lGPDJ532H zIw*^w`@B?K311%DJ%eoZsF}(d1RW}&0vac(Bagi;A4lJO!EeX($~rUqHO`?8{kXu_ zC|EB}bPyc$aTGj*xo+jmKM{w-Ew-K!suHRdYFw-K9qj1wzKw#47GyoT)N*(bm84c+ zlH;aqm89lOiZ=i9tqP{{*+YtGEw4*C5_)*BpMjOPtn_F&aE{V2BHr0oytFuYBNovh zMstLz7^a`}RzeSV`>qJ(3%wG0b4QM%C=)d}@{it&m#BAJD(jA6iE}DYQK^qWRM%uw zj5&fA8L=J0Ep~y|C8{iFruo;8j~N+-?2qsr|BM~8r;Lm)yke|HtxnzN7CG8UEusi- zYrCc?F?x*-mkitB5Zv5a%`lpC`AR^XfRy3h5kikmtHGUEpCsyBj5_nOzlkwzq;hPv znYG;XX>x;~h=ij9BFQPDwN>XL7Plpce1hb#GuByfbi+q~lrbt_7FCM1^gsExIDgAb zAB;}g7b1swcB6>x(;=Ei$dV0GGxr0DH!ZYq1u)W!p#>5uE|VeUXU5~~*!PaYd5KPn z0ToJH$4^GDfAS1Kt0HGSi#It(v!Wd07}*>@{B0Vgpp1WKW;6F48ETgnetrL-@Um+_ zYRNip&^#2!6Xjp*;XO(67ba^f=@cT%81DqG8KazHbDhuHvtM5J_jkoHS$;Fk*)i1y z=L0hEluNikxGx0yG(F1Yf_iA#_65~;rVv@%^OI^TlGx9IEQ6LSd6kqm5Q;tO5l}|r zkGFZ0G9kZe6g+`|qFtj97$>|aBN2(q38T_j|BC@w z%^&hE5X4OW`to=aoix;q*q@+ADQw?mSg_-Y8RvTPvox#=47KX{d2d}4QEgvYERLfX zH)y0tmak>zlynSM+~9Gb*)WiO=Cm$E!KQ7iQ?B^e=Oq=kjv`#7PbZX|;0f?}QWBmb z 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 L)#Y+yY~23 str: ) +def _load_stock_icon_bytes() -> tuple[bytes | None, str]: + try: + resource_file = importlib_resources.files("truffile").joinpath(str(SCAFFOLD_ICON_RESOURCE_REL)) + icon_bytes = resource_file.read_bytes() + return icon_bytes, f"truffile/{SCAFFOLD_ICON_RESOURCE_REL.as_posix()}" + except Exception: + pass + + local_package_path = Path(__file__).resolve().parent / SCAFFOLD_ICON_RESOURCE_REL + if local_package_path.exists() and local_package_path.is_file(): + return local_package_path.read_bytes(), str(local_package_path) + + legacy_docs_path = Path(__file__).resolve().parents[1] / "docs" / "Truffle.png" + if legacy_docs_path.exists() and legacy_docs_path.is_file(): + return legacy_docs_path.read_bytes(), str(legacy_docs_path) + + return None, f"truffile/{SCAFFOLD_ICON_RESOURCE_REL.as_posix()}" + + def cmd_create(args) -> int: app_name = (args.name or "").strip() if not app_name: @@ -451,13 +471,12 @@ def cmd_create(args) -> int: slug = _safe_app_slug(app_name) fg_file = f"{slug}_foreground.py" bg_file = f"{slug}_background.py" - sdk_root = Path(__file__).resolve().parents[1] - stock_icon_path = sdk_root / SCAFFOLD_ICON_SOURCE_REL - if not stock_icon_path.exists() or not stock_icon_path.is_file(): - error(f"Stock icon not found: {stock_icon_path}") + stock_icon_bytes, stock_icon_source = _load_stock_icon_bytes() + if stock_icon_bytes is None: + error(f"Stock icon not found: {stock_icon_source}") return 1 - if stock_icon_path.stat().st_size == 0: - error(f"Stock icon is empty: {stock_icon_path}") + if len(stock_icon_bytes) == 0: + error(f"Stock icon is empty: {stock_icon_source}") return 1 try: @@ -465,7 +484,7 @@ def cmd_create(args) -> int: (app_dir / "truffile.yaml").write_text(_sample_truffile_yaml(app_name, slug), encoding="utf-8") (app_dir / fg_file).write_text(_sample_foreground_py(), encoding="utf-8") (app_dir / bg_file).write_text(_sample_background_py(), encoding="utf-8") - (app_dir / "icon.png").write_bytes(stock_icon_path.read_bytes()) + (app_dir / "icon.png").write_bytes(stock_icon_bytes) except Exception as exc: error(f"Failed to scaffold app: {exc}") return 1