From 85aaee7155877eaf799e2c8582d97f8359c43a0e Mon Sep 17 00:00:00 2001 From: detachhead Date: Sat, 4 Jul 2026 12:45:35 +1000 Subject: [PATCH 1/5] switch from pyprojectx to gg - drops dependency on corepack - removes dev dependency on nodejs-wheel (runtime dependency of nodejs-wheel-binaries is stell present tho) - drops dev dependency on a system-wide python installation --- .basedpyright/baseline.json | 8 - .github/workflows/build_and_release.yml | 2 +- .github/workflows/docs.yaml | 8 +- .github/workflows/mypy_primer_pr.yaml | 5 +- .github/workflows/validation.yml | 25 +- .vscode/settings.json | 14 +- .vscode/tasks.json | 13 +- build/generateAllDocstubs.sh | 4 +- docs/development/contributing.md | 2 +- docs/development/localization.md | 2 +- gg.cmd | Bin 0 -> 29197 bytes gg.toml | 5 + gg/mypy_primer | 1 + gg/mypy_primer.cmd | 1 + gg/pnpm | 1 + gg/pnpm.cmd | 1 + gg/uv | 1 + gg/uv.cmd | 1 + mypy_primer | 2 +- package.json | 1 - pdm_build.py | 26 +- pw | 262 ------------------ pw.bat | 2 - pw.lock | 3 - pw.ps1 | 1 - pyproject.toml | 15 - uv.lock | 352 ++++++++++++------------ 27 files changed, 225 insertions(+), 533 deletions(-) create mode 100755 gg.cmd create mode 100644 gg.toml create mode 120000 gg/mypy_primer create mode 120000 gg/mypy_primer.cmd create mode 120000 gg/pnpm create mode 120000 gg/pnpm.cmd create mode 120000 gg/uv create mode 120000 gg/uv.cmd delete mode 100755 pw delete mode 100644 pw.bat delete mode 100644 pw.lock delete mode 100644 pw.ps1 diff --git a/.basedpyright/baseline.json b/.basedpyright/baseline.json index f30c85cef3..325ab09c02 100644 --- a/.basedpyright/baseline.json +++ b/.basedpyright/baseline.json @@ -1733,14 +1733,6 @@ "lineCount": 1 } }, - { - "code": "reportUnusedCallResult", - "range": { - "startColumn": 12, - "endColumn": 111, - "lineCount": 1 - } - }, { "code": "reportPossiblyUnboundVariable", "range": { diff --git a/.github/workflows/build_and_release.yml b/.github/workflows/build_and_release.yml index ae04ff45b4..777c73baaf 100644 --- a/.github/workflows/build_and_release.yml +++ b/.github/workflows/build_and_release.yml @@ -97,7 +97,7 @@ jobs: name: docstubs path: docstubs - - run: ./pw uv sync --config-setting regenerate_docstubs=false + - run: ./gg.cmd uv sync --config-setting regenerate_docstubs=false - name: add pyprojectx and npm scripts to PATH # using both relative and absolute path for npm scripts because some binaries are in package-specific node_modules/.bin diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 0f028cc2b8..6854fa6bc9 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -44,13 +44,13 @@ jobs: git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - name: install dependencies - run: ./pw uv sync + run: ./gg.cmd uv sync - name: deploy dev docs if: github.ref == 'refs/heads/main' - run: ./pw uv run mike deploy --push --update-aliases dev + run: ./gg.cmd uv run mike deploy --push --update-aliases dev - name: deploy release docs if: github.ref_type == 'tag' # zizmor: ignore[template-injection] run: | - ./pw uv run mike deploy --push --update-aliases ${{ github.ref_name }} latest - ./pw uv run mike set-default --push latest + ./gg.cmd uv run mike deploy --push --update-aliases ${{ github.ref_name }} latest + ./gg.cmd uv run mike set-default --push latest diff --git a/.github/workflows/mypy_primer_pr.yaml b/.github/workflows/mypy_primer_pr.yaml index 16714c19ec..ed26eef899 100644 --- a/.github/workflows/mypy_primer_pr.yaml +++ b/.github/workflows/mypy_primer_pr.yaml @@ -55,11 +55,10 @@ jobs: persist-credentials: false submodules: true - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 - - name: Install dependencies + - name: add gg aliases to PATH run: | cd pyright_to_test - ./pw --install-context mypy_primer - realpath ./.pyprojectx/mypy_primer >> $GITHUB_PATH + realpath ./gg >> $GITHUB_PATH - name: Run mypy_primer shell: bash env: diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 5e5f729243..5f7adb19ce 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -19,23 +19,22 @@ jobs: persist-credentials: false submodules: true # needed to typecheck mypy_primer - # need to use pw script at least once even when activating the context so that the wrapper installs pyprojectx - - run: ./pw uv sync --locked + - name: add gg aliases to PATH + run: realpath ./gg >> $GITHUB_PATH - - name: activate pyprojectx context - run: realpath ./.pyprojectx/main >> $GITHUB_PATH + - run: uv sync --locked - name: typescript typecheck - run: uv run npm run typecheck + run: pnpm run typecheck - name: zizmor # intentionally exclude workflows from the mypy_primer submodule. https://github.com/zizmorcore/zizmor/issues/784 run: uv run zizmor .github --persona=auditor - - run: uv run npm run check + - run: pnpm run check - name: python typecheck - run: uv run npm run typecheck-python + run: pnpm run typecheck-python - name: ruff check run: uv run ruff check --output-format github @@ -44,7 +43,7 @@ jobs: run: uv run ruff format --check --diff - name: pylint - run: uv run npm run pylint + run: pnpm run pylint - name: validate docs run: uv run mkdocs build --strict @@ -65,18 +64,18 @@ jobs: - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 id: install_python - - run: ./pw uv sync + - run: ./gg.cmd uv sync # ideally we would do the same thing with ./node_modules/.bin to ensure that the version of node from nodejs-wheel # is always used, but it seems to be impossible to prevent github actions from using its own node version - - name: add pyprojectx to PATH (linux) + - name: add gg aliases to PATH (linux) if: runner.os != 'Windows' run: | - realpath ./.pyprojectx/main >> $GITHUB_PATH - - name: add pyprojectx to PATH (windows) + realpath ./gg >> $GITHUB_PATH + - name: add gg aliases to PATH (windows) if: runner.os == 'Windows' run: | - echo (resolve-path "./.pyprojectx/main").path | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo (resolve-path "./gg").path | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: python tests run: uv run npm run test-python -- -m "not needs_all_docstubs" diff --git a/.vscode/settings.json b/.vscode/settings.json index 5dad3afc0f..264178ff23 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -69,7 +69,7 @@ }, "explorer.compactFolders": false, "search.exclude": { - "pw": true + "gg.cmd": true }, "python.terminal.activateEnvInCurrentTerminal": true, "editor.acceptSuggestionOnCommitCharacter": false, @@ -84,20 +84,20 @@ // even though python.terminal.activateEnvInCurrentTerminal is enabled, we still need to add the venv's script folder to the PATH // because vscode's npm tasks do not run with the activated venv "terminal.integrated.env.windows": { - "PATH": "${workspaceFolder}/.pyprojectx/main;${workspaceFolder}/node_modules/.bin;${workspaceFolder}/.venv/Scripts;${env:PATH}" + "PATH": "${workspaceFolder}/gg;${workspaceFolder}/node_modules/.bin;${workspaceFolder}/.venv/Scripts;${env:PATH}" }, "terminal.integrated.env.osx": { - "PATH": "${workspaceFolder}/.pyprojectx/main:${workspaceFolder}/node_modules/.bin:${workspaceFolder}/.venv/bin:${env:PATH}" + "PATH": "${workspaceFolder}/gg:${workspaceFolder}/node_modules/.bin:${workspaceFolder}/.venv/bin:${env:PATH}" }, "terminal.integrated.env.linux": { - "PATH": "${workspaceFolder}/.pyprojectx/main:${workspaceFolder}/node_modules/.bin:${workspaceFolder}/.venv/bin:${env:PATH}" + "PATH": "${workspaceFolder}/gg:${workspaceFolder}/node_modules/.bin:${workspaceFolder}/.venv/bin:${env:PATH}" }, "task.problemMatchers.neverPrompt": true, "editor.unicodeHighlight.nonBasicASCII": true, "ruff.nativeServer": true, "js/ts.inlayHints.parameterNames.enabled": "literals", "js/ts.inlayHints.enumMemberValues.enabled": true, - "jest.jestCommandLine": "node_modules/.bin/pnpm run jest", + "jest.jestCommandLine": "./gg.cmd pnpm run jest", "jest.useJest30": true, "files.readonlyInclude": { ".pdm-build/**/*": true, @@ -112,9 +112,7 @@ "docstubs/**/*": true, "pnpm-lock.yaml": true, "uv.lock": true, - "pw.lock": true, - "pw": true, - "pw.bat": true + "gg.cmd": true, }, // package.json file copied into the pypi package // this is a top-level folder but the ** is still needed due to https://github.com/microsoft/vscode/issues/92114 diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 85db931fb8..bad1751294 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -79,18 +79,19 @@ { "label": "install dependencies", "type": "shell", - "command": "./pw", + "command": "uv", // need to always reinstall the current project because docstubs may be outdated - "args": ["uv", "sync", "--reinstall-package", "basedpyright"], + "args": ["sync", "--reinstall-package", "basedpyright"], "presentation": { "clear": true }, "problemMatcher": [], + // TODO: don't think this is needed anymore since switching to gg, but i don't dev on windows anymore so cbf testing it // https://github.com/microsoft/vscode/issues/160891#issuecomment-2915280629 - "windows": { - "command": "&'${command:python.interpreterPath}'", - "args": ["pw", "uv", "sync", "--reinstall-package", "basedpyright"] - } + // "windows": { + // "command": "&'${command:python.interpreterPath}'", + // "args": ["pw", "uv", "sync", "--reinstall-package", "basedpyright"] + // } }, { "label": "bump version", diff --git a/build/generateAllDocstubs.sh b/build/generateAllDocstubs.sh index d25adceebb..93a99a1fd6 100755 --- a/build/generateAllDocstubs.sh +++ b/build/generateAllDocstubs.sh @@ -1,5 +1,5 @@ set -e for pythonVersion in 3.14 3.13 3.12 3.11 3.10 3.9; do - ./pw uv sync --only-group=docstubs --no-install-project --python $pythonVersion - ./pw uv run --no-sync build/py3_8/generate_docstubs.py + ./gg.cmd uv sync --only-group=docstubs --no-install-project --python $pythonVersion + ./gg.cmd uv run --no-sync build/py3_8/generate_docstubs.py done \ No newline at end of file diff --git a/docs/development/contributing.md b/docs/development/contributing.md index 89db2d9b87..3582b0fcbc 100644 --- a/docs/development/contributing.md +++ b/docs/development/contributing.md @@ -14,7 +14,7 @@ we recommend using vscode, as there are project configuration files in the repo 1. hit `F1` > `Tasks: Run task` > `install dependencies`, or run the following command: ``` - ./pw uv sync + ./gg.cmd uv sync ``` this will install all dependencies required for the project (pyprojectx, uv, node, typescript, etc.). all dependencies are installed locally to `./.venv` and `./node_modules` 2. press "Yes" when prompted by vscode to use the newly created virtualenv diff --git a/docs/development/localization.md b/docs/development/localization.md index ac875d4f54..26147bf0b3 100644 --- a/docs/development/localization.md +++ b/docs/development/localization.md @@ -19,7 +19,7 @@ Run the script: ```shell # use uv -./pw uv run build/py_latest/localization_helper.py +./gg.cmd uv run build/py_latest/localization_helper.py # or from inside the venv npm run localization-helper ``` diff --git a/gg.cmd b/gg.cmd new file mode 100755 index 0000000000000000000000000000000000000000..e26bec03b3d3eaa075baaf2e141aefe0ae55dcb5 GIT binary patch literal 29197 zcmb@sbyS>PvNwvmd(g(+-9vD9cXxMp2oT)e-6aGG9)i2OyL;o8yzk7Jne&}1AtgT0NVu_wUD)4|Z$ z89@IB@Bf#u($p@B?8W{n|O`V+Voor0qOl`>jak{_RKW^-Q#7qLPwKlPI`tLbO z{`UNL$i@H?XJddZ3xG=7$kWACTUVFL+!#Pf&O`~I7qv6CH?g!c2YmU^0DL~~*T&S? z1wgNCZRr4DW@BNerv7h6|486s=menm@-X`omtOdPL1AKQ^P&Gg5&i#F#Q(W~|CpDL z;u+i9+8WxK0O;KSPNs%74u&ok00Bl5Q#VFC*N@9&5ujk^1-Mw4+Iqn@6?@tnd?tj7j%YuaLqe1xre+}rrRR3{?fA%&%$=@@?Xl_pO*H_42gYgH( z-)R09Co&0nSy9ISaQ(n%YV-e+{_nv5I>n!Y{QD_B5d0Z3#(xZ%v&Fw3>;Gy>LiYI& z{y#VVSEc@LetL)hmV^Y(#nAF&OpO7wAKlCG_nr6v{_a)>kH1>=KTweXC@B70jQ;`X zU)lf4O%w$K^4ACal+W8oS#_Gz7gb7H2?A6|LS1X!)^6qVurMCr7Q!xXQtdMxv8)}@ zGzD{Oy{T?dQ?y_WaVOSyhD~HlNJCWA`1Y(5V>BMs1FTBoAjII)Ikh~fbsIc>ih1uCRv^$vDP+#u` z0YzVl@U_QXzq-z+PN`0&qOT~%!p!3dsY0kDLO~yly05BlTth?pmh#N42+K8?D{v>Ww)x%us z6roQjQzwDL3;M;0x<3Z6@CyhLndOZQq`EO|RRmhuh5g61+`U8fFaT8K}qQIT-1fqh4P{1XE;v-`w_3Zhw8x%}&BG}N$FUi`{;t8m*3r+6N>qgR@8;9wj?Is9tT-dsto|THDbV5!- zxu^gh$${{g&he8imL1dKm;wX3WMb@p#tiKqpo1bWme)XF@m6D zh@TYh2BLPn;vIL|?*p3O1810y=CV`VH1N z^0u_|nR)Q;injbB#IiHHOckGJ@Qc-~j-0>hhYEv_FEUwEAZLLsRf+9- z(t~TknF#lRP!2LHvdPD7m!j>|3rkY|-Q9$cBK zIT2%#2x`Vz1 zXADUZC@!v@8ffkYLt~b&-o_m@Fk~ANSc*apG3;musALrcih!;3OW%+>d0)D`AP1kO zgQ6wCkvbCXxf$Mb4-X9$_%@8?2q{#yCCLz-94EKdNS@PJDs0LS(JxoLVLd?LqS7s( zwYYtI5UL&h-Y85Mln$c&AV~6U(<`7XZ%0ZUf1SYA&?GmiL5c2}^*r!fxu0;5`LqaK zYbgCxfM63)kknY0ai_S4w-PJ0S!Ab1Oo+ZuKLnFlEBpy(BG17G?XV()q{PDu$vn(Y z91MJ=fS+WoE#YoJ9Dz=vs|NU$yPC+0u;Hyij-yJF!=^d*wpXW75JdX9D{)$nZ!isz6M>=*U;bb#x^{+ z!W3=#=$slLF}=-tlZF_-1s9@2MmHccv2}dw;T`J;y(FH~A%B1~-O4aC`8Q8KvU9W} z4zFBF0iD}jycF^(8huf6Pj<4Qbr*69U46Q<-Q%vvUQmK3GL(o;1Iy2I9IA8;fHMZ~ z^a^?KY)2JtL+Q7);}`Lg-YA~(Vt^m(3mC+KeO~6ddA=J*`Lm^9J{oxB0!cuv4I_Nu zpoix`<51yt-3X#07iA`K^pUmprR#DRs}xt@5Ald}?0_@R?swwyoXd-^Xb;1hQiEoG zs-*Mh<@S(b*ADP+0i&0kFQGwnoJhCb0_J=~M(O1_ju8m{gjeFP{@wHB8&I)r0nik% z&4yLZg7@SUQlsZuHY4vsMVlGsFKu>QJ{Mb$J(7a`YmL!c{sA*MBtWuxf<;I?(VEJq z_Sr`Qr}jD>Wl=~0_e-67u>=?LQnC=!s^&Rv#7xZwbm%(LpXT!-38KF#o8HTq4iz3^ zgnWAj^pP?kgWj6%1&vp|{XO{buGHCHvTZR@oVzeX*w$xId1eIC`HW&^#!ur%cDcPV zSRNC-lNz|Bu)=p6TIfRQ?3$G*a+@fHu~Op$;WZTodqW=;(qiE`s1^s6l{ggA%6JFd zQLn<|e^`=jcZsdEc!Y2pGj*}j66xPJDiV|jA|_$ z_-ZO{BHR>>Zt93C`Bkv@GSx5`5q8-CQt~15!bbOX@jLxoO)Om3B)bmoU7g{m{LIFT zEuO~p;iai)Jgq{u%fmcvXlc6uB;nH}HvCSmcizQ%qO+^^gL=-J!`0|HtHRpl$;icG zt;X;8Xw4sadd}8;oT}hM-&S>T9_XlXV^fvX(y_yK_C?oObpbvnaS!&Ww}D__?yuI} z?!2+M;guPu<#bjMoKKHk&tIfWmNe=V9&RNWQNn3w?Au7<7%whF(8`@Z?O&z zdd%dd9TuHW4#mDw_AxF?Ok>3$`rG21Yc_eI`Gflim8=bBYeRFdf^n|~Ik!L_IE>Wp zI!JpX{b)M)i$NS*+Q)Y}6z<>90P=Bists48I7r;}NO$I+a5`^I`TfHj51LtiI+y2k zDP6MYyy3j16d%7j zD>O^y87IwTK1Ar#$}KStd1mFa@TpRl(it&~l6AB#W~=MoA1ZrgkTRe)B8~7qJZUSc zNWn&wFM;)EHFDpCI+M>Mibe1Vni7d$Gj8+fX&yakj-W?ZH%I*QyBGWh^!K`y)`fWU zDbaTd55Ha<&-IwkUqE#}gTac12#8w1=1-t%30aWm&xHucA1Zy(2e^F7XGD8q$*)Cg z%bHw(ttP&e52+!$rT?Oi{)Cio4da_T=^9c)c{>r}CvqtEg%kCOIzJP(n$!h8UmMmI z&{RLOQAcGZ_uGK0LkVO6+zd?ZD}UFs#oz+_5TnfEh@Qu8vSeYd9ATy4^IY}s<>~<- z`2|5Ge_@TN`o5h%Ux&T*?!L5R>V8$)`oj);a%{)4x#ZE5@XeEb8Vc5%-PjX@IBpe3 zwTYc-tZAm4thK{baOX3dgT+8Wnhx#zsVPHk&)d)ma!kj~&=s6&?0(31#f=(`9E}%D zcgxU+?j&h@&nWe*CjrB@r^nGS`0wEe?c(;iy z>a&OI8?E2ldy5xj)wx>r2%qSA?s!#>@w>J+5K|tneIg(8HPho-U3fqCdxW+*&nx3Z zMpowIA1OZe`)>D+P2D^vKjd2teN1>;bClU3#44=C;?ggu9b7S=L^Y`(dq3HoR6NG1AVyEzZ63n%vIM=^{dH#(VD` z5qslY^Sn|Z)6P!~~bl7-$9S-~#vLPL+{*XNNvdCqD! zino@FsUCXWX3pQ73;bRFpI3%D!m$Zn>wUWRUbc^-{FaT*Z1wd$n2%p^H+b8z(hCG5 zJEl++Z!~neM&FRj+W6OMy%c|u3MLcaT@MJ2eVVYdkX%}>Ygc#a)80wbcpT0SMV4RX z+nVA>gm!1{%Q3dE#c%T%U&;(0u&Fy|zRk(zHr3paBrg{;mGYvg#4T1TpP3nbJd*Nq z$Vl)uP?)-Ghom5{WVl&J1Z4rt!|JNs>bg7a8O3e{E za+PUW-!I% ztc}YW()Go0Fu#>G7n^%c%*UAejEp0M4VxNG()uhLHO~wzLV_9@e~}JHwvtpP7NRBH zmL()O4d=)oEh$y{=7X6TvVR(qg0&8r5cF|8Vsr}ipfHLN%sR~_pzhg#?*1MIc(aQ^ z8|evn|Aj6r8bG*(7lc4f9^c1hN{5LhAL{yMMgH+qkP+N7RAkqX1R2{iWRO&pko=l~ zBsKD9F11oH(Y=%3;nc;3zPHt~OM z{-xi1r=+6VdRPaR$^kjMdl>s5y6R%Otkt2CsXb@;yH-*me$ZanriOr0fK`AxgN%S~ zfW2VUp*j$4N_IB}`~Wp3OWGywCJwL+&BnpP~6AEEU z*J7CDJo2AxCMPgK+?`5D3bQfrlZ5I_&84d+>e6-=x~YPLzkjamn-&-}WT!XiF&fqfd4s5;SfId1&+L`oBoXdGS*>SYdQx5WtQYCn6;BrRX&W5!P)M@_O`Uv)@**@ zXPSL!3hlGRt7nU=Efr&A3o8PM-BFOp<4Crp!MIodQ(Z(CWz`({C*tBD%SSr>r>~Bd z$w^RDSihx=wObsO%9CKH-#ZHr{3uEA7#0;~Di@ES+5SWg`V`F75ybomM0uTBSr z%$F=_6ij|=cK7rwId)&n4hH}fBI91)FMKcd_NT*h)*5-de?yP?c5S>qZCpGjy!-ku z1SgkFvH#LMO^c$jF40y?{~a6WMyLXRm%ARB>py=U$dR*w8pjLvCdQ4!Mz8WBvToCs zYPP|99?ERXSVF{{%YGr2ohleE=Y!nxpz3uP_qhWnikq@{BeON%xisJac9D7$7nBp; zBRGH)7U&3if#RUj-45~66p)K~83pF2*)52DDFoU@y}1MCr{A3m2h0ixhs-jQ>*s{$ zQtwWL^vMh`hh1dYY=``*(Jj(F2c}1F5F5||h6Dpt1l`FK%BDX}T@+Gegm-OFAcA+T zS3rh$ty6f1bFHmAC>X~)*3PfNJl4#Q!8}&ax5KyakFItKbZ6ic6sWbYL*z}B4bHT*Ceu@%z1YgT%1%fl~20$!JKSzh}!t+{h}g*hfm6GDq&}=}UtNG_3GhcWZ}`=yuV3|4PNi(HwAq^c_ZtCU6`N zu2ocP?~20o#cQY$71Y|TwM+7MOr#{HTE#CIB{m~U_P8Cl^5L1Kfyf5p&?`*Rhiz!-{(5;j&o8;p2sYFS?V|Y-4uX&JF<6!rS;w^ zN~VaMFl9mV=INXTS0bM6#VoGx;ss1~8pDUgh38edGG8OpbLdg0K%*I6#dpm1SixI#*7 ztrw8kI;&Op`wHb|fK;7LH;W)~VA_B~#NLo&8Z0VNMym0Mx`a)KE>UExFS-h9fTS*{QMB0y?C9)kuGBp?8YBZ=YE<3?F&WDGApisea_opUA zj5Cn(nvUZ5Y*l(dNSy~M-QH-d{gq-Z9AZSe@Jq|2o;Nvp%8pHd2N&0diN&gRmH z#G*zQGs)M&LYLus`(bm&H(74-JJ%Ut#QcnSE`GVAVtr!Vo3_6V!IYbId#PoX$)shM zw`6g4LFduG7bbo2qO)GkwN%PZ5X68Pw#C~s$XBUxGmS0sSmrgs4{D;z0hmnBL)FCL zM$T^zV8=~QHNqJ8s-+>Z^Cr!n-#nixgi4h%80DLUH+b|X{pt}XM{o^5IV813kg|P~ zrLjonH11&Y_H{Bm{&HZc@+F6(VEk_J+oA`Cb7M|pHKd7})(ZK3hk+1rn1o~mz5LLu zf|={vL2z-ifL`S#>Pif>KRIpm(mCSv)OU$#`J3qwGiiFi(9}gQT`hfX%NuOnUj)>* z^B5}ZU$jW8Hp@}%>mqifD~Jfq#GSDv^)wEbd6!MniXGeSJ8GN|7wC2>UYF`1Yq2p9DrydkWI$(;JW6k%;z!!p_o;lJ2eUM|LGB(_yPz29MMJ)S>q z$sarh66v`L$b%z*4KlWJ&2B5cW5q6*6L``U`BZmP-h*olG<8tdbiABE!WAELd{Rf! zSi@cDi!7CR>I9n)M6shc z+b92Bmr(!l?Y(vT`TfET!~fxRgVX7?Zn}ePEbFCTaLt9$Tacgkb8T15&*k)Q%4Rgo z(V-KcN{((HvJhrmYv~u(&@Ibr?sHtuIP>}LOpgk9*OHDixF5tWMpEfM6ljj$Qilwu z=(FRFudgipw9GM9*9w(%1qkQI#=UXYkK|mvXPpF+b8s1DqaVKEUVL(|@Se{)wz^Bt ze@iYqim0LL#Hm$9q-U( zsZqFLwF-~9RZ%}N2d)DlZw{K+%M$^k-|iuA;Dg_KTibLJBJRqIM~>^(yy9mvSZ(q8 zw7fh7h3*C}r@}d^S6MV1u5Z|P8s$^6JKp!FX5d&k#O{J>-3U3s-m5_Uy8{L`M#Q&I5PF{xfL)xMh5HzDB(G1>!IvFS zFBst5?l>WWhTRja5(htpfS;gzVnMrp1>{=A*@uE|7{!ebK)qN)y}(1=b&UXCxWGMa zptg|lF3F*MVnDmr0`$$g?U^^tKMnfV3IUg(wjOY2SK@?t#1Vn*2tb5jA7QAi_puN! z3}so*iYa7U!rza5JYPK6xEhy~H%{+7mw(0%gDfGxs4NJ*M(eARNhpdKc)?`w1mEv; zmGCPdH(HWfi9#fKRk#;h!Io)3Rj`20eKVjzt{{PcIyq!3&j4$K3akmwlM2niq$mLs za>Xet2&oXxx56vag2`ZjsO=F_#ZzLVV5^2YuC9<~B0!K;52~=XSjH*S0`#h#e%7H z?LzsaDF>2(8Bp`-=rR?`8pSW;i1ImgXsxt-Yx11}iSj)iGUcvNX69jR=N7OL~xw$*|{;UJJdq8G< z!CzO#-0MwzLmRzQn)voxK>V14GpIdBABF*G{E3OoM|{DYohU9puz^&E7m*mo9iSw> zJeMEKfV%SwMvVU0)r;bpE52a#jyAU+&%g&LgqV%ds~=7;95G$dJKkJ++rVsm!Ni^1 zZ4bW=&#)c)1K{^o+H(LMJJ7P zXhS~c%-(|jTH7#3%ei+vck&p}2JkKnj^dYkPj9ve^0s~1cpi-L5~oFrGFOTOrHc47 zjy(O0CtShX{*#Ur{esh1vKaOYS5%Rlhg?xcu`%MxF99)))NaQ>vq%CSLg6bJg4kj% z^?@G>HuLqN+Y_~xT;a+31FcmrJcI+owL4cILQeOG5b;O&^&t#>2;;_k3s)FwegyKS z9|GGS!Tdu&_z*URKWtVs9&4>Mj6SwxKDM+qA6tP3u_1i4x`|+cx}ZeZmziJ!fK6X8KhbVRSRgm3ApNE;SPWc?cDFVpKAJ;&fGMaT z*(MLDI&6zlcQF_PR-JCQJB&wI041D9RRAlbk8Awo8<+t7W-P=@O+f5T%eiV(&mHc# z(JXE%Z-(a$8(VdrmRp%imfO4wt-8@mtXAP z{6GrjOPf2p?Y|#Cd?H(0!+X+HRgo(V>x>h5oP*&e)8ZlO4eH|dL(`wi{iZD&Oh7i( z072aW#B;a+8949f9`<*003^lm!b#2ZeIDSW7ulSDjH-RS- ze|_)Bc&71e#^wJh>DcrL^D&V3(GM%TiUMBoTCG*SVNVD)Y_`A%r z_0=5Ta)th`VieU?v{yK+Y|zIy`eDnR6iLr0>Ro`nDQDA6C*NjL#3U%Ae977y7etj? zs4;u+PT&j5Ahgbwd-o3btp{ebm*R+?1yoroQX24SOT>tM6M84NkASvy2hkmf3;WPt zi)d`j2YSQb0{=j}W3ak;pXI`DiPx*@>X6sPt8X8IoG0nTHoHMjZhteYog(lZDGbZN zPw?B`X}HrHimZHfj}rr!-R1*MwKY+++0i;!0^z6xXGh8qPZw>h<_ov;r%FB! z5yd)Dms5KD)b;^orQ4;&+f}Rj5f92q;w_t883=>-C0;7lBsb7 zcObu#Ly(B|42y)iJrwLrq!1n@r0-RD_>#en30_gewGl$h09&uG6(Qx$BgzSW{i>w1 z8@9q@mf*lb2dQ+SRmz}VdX*Ll?P0A(3$k~lk`^kV7pC+LXDWj`5&WKN0M*pCaAE>U zQxHt>(kR`MIhVe;)LFlSen^4q)TvBtY&p!#EtFo16zvRw@40@xQVC)YQ~pQLPLTsb ze0g6pE5FlSpQ`QH9p13I#bUv<5V!s>%EZqlk~W*s#r#s~V4anLkzFD)Ef~mwmAL1X zyt5+b8J|<($ywi|lNf1oai&`0+BV#>+(KgoWO^?WYmg_@`lM!0Jiu8TzUW0n>(xJxL_gmT*jE_Weqgn7owM{@X}@QW5MJ~_hFkCDueXh(?z@*GDjd5qu&TQ z-Da?WqH*O>#3ggh$t=jy3k?6LzU3mcM_5x8Z6VO8!c>mnri%i(%>q)j_ zY=-mAg}{tpVG4c(23I^PHZKw@8${Hr9A5W6du2<2|oG8Z0*4m2a zrUdwtPv47|h%QX%U+lv6t+9jtjuUP0yqyT|$nsA#`t69?F2KLOko1VNr_#F|V zeBh_)ePb#51AynQ?lGd(u8741?+wj{%erE3*`N&9VXa_-vTwc{li3P%Mb8BZ{Fi7l zolW>mr3Bu(*%wV$n&IG0$s%^7@v@p^Kl__ALgeEvweZ-Cd@wi^zwbp5vISxBvcn)b4rAp0M;k1FwsLDD_q1Wy(X4+2h)T%+P%-t}4 z({x^*`!jqqOw2cNg}kpTYTIFmW}SEjF?jcxo)8A82tRs;nmQ|ciBv*kTY9@(w(eh8 zv{Zuc2*=WVw~r%*Ac+XYjl%65$6n;8T>(*CF#$wc?0xMLYjL!%fy727yT!)m>0Pe8 zVbpx$qrw*6^llzJ5qBF}m>mZtG>h)R_CTe%(I0`CU?9!3b_4cgrR?>rNw2n87klyoM>X#0 z8c^CGtwn9R&h_(>71P`{f(%AumXanMrR%V)Ns)EaMAXc;5Jx#HoiCxVLg!{HA?(P0 zQU_=H{EXi$fwBK;wNsU>ZO~cm$IKKR!*}M1mCA0%AADJt*OP|#zHyq3=z%fU8erZ? zRs>jqi9{8_io`90ZRBNr4*q4=s~>O}4RjV==^a0>D#&9-f$;YrQISH(7s}PLv0stU zW~~45qgAcraBc-7+3BvL`+HKQI-aiz2MPHc8v5IP&c!Hqragss0whH4GB@AW%0;I0 zxchi|I;*+gxc6q(4Ot(P9Kmo+*Djc-*Sas}-9lVRB@r93C+8|n4`?D`@$7!@aX2H{ zKs?r|uU?wpmqQ3jt{zx9hamK<%@1+Qp1hk=7o4shH{pn;a*2_DIF*1u-BhSlMj-vW z&c(0FRx_>qTW8G;_8Yhg%7)_;SUO;a=bdUZf{kEhv)Im72re@8s}~)L8hD%hRe1&4 zoNrhK(3ISw4Ay^E;jRv!<;9P^>Q}GTYTWCU$l?KVzX?Bziitl{4MlHQL3mS30t|%- z|M>%?kD)N46{tTS4pOC%?t`c+w;@#pV}^n%e+6|zh32Es4XI1|0;rm2^~nLyWxmU8 zzUz%-q024WO&`ix@sKmhzF28YM5QZRswb+Ohh!z<<6k#vAUE6>eAA?Q9$usFi(JiL?hbepDB>$w+|EBqI&KAnn{N&-y!P+JF^t+5YF$s3ZvvY&Y zf9yR~YU_fur}Nv3Ey;c8VV@FE&6R)lEL-K67)WRxR%&27{$l9K+I6tbRL1Q7`|0PA zHB@^vpOSzU{`CX?BYYyq*FeLP(oJvfM*dK|RaUq9@L!-n-vDXZZ8kgG)V0 zM)>ksVs-YZX&yXA_(S({f}G?9?%+3C^o6fMOA3zMm+OAg%5MN>d~%?C7R*6mE8e*Vx3`(+PZ##4a$Y_X_y|Dff-|SS zN=y(KU^5Gte>NkEy0Jfa{E7Nz%a_~N)0Ka4BhFA~E9k=K$~&mWksdSwOKpG(%!=r+ z;mv)n%S?`anD()Q$w3DRoS3pOx*-IT|A?^NT<{lw4xT`@z_t3$iCmx3o+v3G9{hZ; zaeLz-u4MMAGwPCcgqosX;ohFkIJ05=>4B-Ei+iyY4ajHi9k=ur!=%~2`-P%1-2{GE zT2_XGb!pfHFOfIh#=IdBIdYLK9*m+xW>`int;)!WIB`y(D31t*905maJGwS6B~LdyF+C4;C#jXyG&J zVVIXRTrc(ScB&PuP-S(HbzV0Y)2605X-2o2wkkFzt#W83L7Hes*K@(4F4Z3QkK|!Q z4ZiQ156S*$B$AF!Q)w905SoQpk}=vKjAe+DBL6)GkH)@B;ng#Cm7zB_YAn=LLeVxY z)8mh>K1CiSVP@v!d!z(=ND|P_-P$|=D(B4g;L!!xCb`^fIAWRunLtG!8#y4}DABi( zwm$%ssq6po0B)%LbZ1w2ixlUF^>{+!iy%MoY{>AaL%5E-GUA_X(oFoZVaXsoN}Q`d zFmvjF}8(Vn$Q-9wnKdJSFZHzXi-+X%n3X+(3Rn(8L_xPQjpJ>5>dlYM9 z-A`U}{;dyb`*L4v$J_QO_eU}I6}QNnetoh1bk(%Awczs={K=Q@+sa$6h#Q^~vzT1_ z#0#nYp9(oSu{Rv1>2Coh&HVDY`?YnqS?w%~DKQrVM3QE&XFESBoHbF)m*))^U)`6c zrBB;N19?2g9ZR0@O*wLMCRiE1X^c=yT^L14E!Lv*`PTFMK^>($g?*xXjRSp>r_5UF z2I^C=KC(R?=Dw3ZtMre*KR}y|ZTV+M7<4LVp+L^Nex{F6Q)lFe9K)2C0(WAop$6qI z`(+}E9A0Qhn)hic1WOho*h)p7%8IUt3`}vY^f!2eAQ`l9eF#1q0zVD{L~k2o#Zg-g zM3cj6+)f6?h!`IZ0(nvZ8WKdIVFKzZkr2#Q?H2*}2db8jg`PY8ohk2xM$tgY1U z;#f{n+1Y~j0NJM%lr%lL9f^-Xu|1VX629XEAXG52l9>YQQIJ6TT8(V2gTrv)IegSS+ z)nkDe7Y4F8rfy6a+w>uEHd~iag?Y%UfIb!OZRl-XNho-|29*VwQIT9jP3T@6;WT1b zRhi;<`K1cuEK|LoCP&vAmTagJzkD0;RnVtegnYyhgHQQGO;Y0uw@|3_Pai0^w>$!1^z_?w-rzc%hrQFhMQiwmR{d9Q3k98QGh zXaP(r0H4W=PYy%-isf{b@kw=m100(L{*ClBO8J@@Q!n6p`okJspPRZO7mq zz}|Zr%JH_NKKLFw?FoKO)UK;$c_0|J_!^*lebAy~HsZg^J4(~ICn(_9topG!9c`52 zeXmbm<7`sX+WWHNjLG}%2rd1iaGJ)wtt#QiLHRYR=w6kRHu*j&7y&9zxKZN@$h_*) z4f1E6?hY`%t}yrFw5>$y%^#V1Lq6jW8n6a!-OL~`a2_d$?a-Gv0ZE$^ZClyQt2up* zH&dgWt9Cc$q7GCBW-=uKnoI>dQH_SD51f~BVCUS18-`{m+UP86^WC1?&+s`rJy$Rb zI3ASo@%io`~`C{GZcdS!uz`DuNU zj6MTij%RE`QL`IdQSWZ!qgjhNoYRWfk%Wc9>VF}eWOW{VAV6?JuWQF|q;6|sh`)Qr) zCAkCj*mK&p_Z$L%hAV`bwy`&wb`s+p;{8m+53>A+OkM3D#-RI**<*kYvz( z^lkIjH2JUG;UDA~b(Hd#G1dp!VEAMG>BIUj;%D|@o%UBu0@M!|_uLO_&#-?dhoWvD zetg0oAbDKQ2y9iL^~gFZ&n$|c=<|ft*QaD$30w|)c{9rV zzz-)~-Deej2@f5(+*Oo)kq#$S-RX+FxDO{q-BlEQ;SML+-9^gIp$Xb{kxu5XQWV4*_0t^tUsy}m zFgg14FyjoA#`JIrY~Xy`p(PA<@DZnux%hlG%Z)hU``OVaUyqM);EEtE+Y8mf2ij`l zu0wUnV~UX>Pp0@F;xIs)`TDsJK490G>2bfFZPXs2^vc$JWu4j5c|v!p#RKfaRmP4x zM-DWpQJfJ3e`6cAX7_|5_ChoT_ugF8ShZrivyUSB0!eD;IaG4z*;(}Ug68DG_vz+r zW2hLSvu&hwv_?>c*VXNq+@PRdMvwb9i>CA9&D@0?lvfn&9IJC)9&rM=>G_#p7k0}J z@1}@l?-Lld=jL}NLw)ZCk@GX*!H!4E-St|T-St4NWEK$V4Pt?N|H`VZ<)9_R?;xuy z4k6pk6!Nw2RW@VR<-1|V-Amd^5Fz=BWb2xyh~FPg5g(AGI)#i<=Ipz=Y)x0*esCLH zY@&i}xmM#_n!OKNL?UNOR1q*L)aV@*79PDVv1KTwC2R-`Kkz|v+5+}>v)I&Y5j7(1 z<4Nn{ntR|!DAYKRo>4`46Z+~J0tpk6@7_g`?74)fB^e*FCb=k7*w{*97lwbYLWFYX zv{MnBl=oqLJe=~uxpYK6xl2TY)^YAjUXI~<5!Dc%ZpjCpPK{tq!xKa z;KUw12rlzQ84c|*A&aKU@EaE7Xx}I|&&h9M((?EnG_(_-&N}2qXU5C|gWKa0?g{g} zE5=05qSxi+YMO_i9!kJF>Ti1#Dc+Gl?3uTBP-n!Q&bAPWI(TCorq`1cvznl5EFPEE zB@*v{Ct74<6li#TKQi%&g&p()v3h1y8`MJ$Iz{CELhLOHHn`5%7<}rw2=Ep)!(YBf z|3O|`oYyhUIl+0dA^XX@4C8siI9^iDay;jO$<=mWD7MyoCXRn{8bLsA<@q;NVl$^> zrsN~MKM_*4sq(Qq$>#cCSgA!!bg`-Ox$bmdx_5L|YpPVI3Cn|#P+}`*LHLu;52mrz=axx6>I3)Ebni2e0H3h^ zc&T$V=7;O{=ejW(ALxLfnKFLZyms~r_uk_0n+Mz=%;@(tdASi)6C4)sMejbn~ruYZ#r0`xpG^c`qH5U>z?V-vj-C-gj)B%{-IH{x~4si z-5%~37eCXx@qCgR*Y&VnisXMGJ+zU@>jd(q_iI=aUX$B;eIl_78}v=@E5bDx>C@%I zPs)LfOx<^${R>@YyN&XjhkJ*&^?Nq|i`eAOja+>H3HX-|l*)!YyL zukor!Z@uvic*i%r-J(bD(yJCO)|ZY-q!Ok30rvlTBk`}76DFAW_l13aFE2~6OU^_D zorQhwFC>pKB#{ED zMm$DzcWONP(TIK`2ERtP$Gk@00Qe(bm`}(|Ua0|Mi+g8gsEIu=%FiOyJ-bCkSQ2g!A^0HuR>59i{`x<7(2$ zQW4g8^s3R07}j!2{27Pc?iuA^^r}nH>R=?X+H+g2#>v$0-3TXAc}{4j@Bna6=9OGf z3Ud}uf<#z~RMys%q40E{Z$qW&tK++b6oMuVQA2zj>1Je!*sPxnoG20(n9~iMxD&0@ zebR;o(tI+8&ScIFuZ1bv(?*RG-NaZtnG^pN&U_@$vPsb7MQf8N<1F6kinBP2`N>DLA-y)(p3DqEDyE9rmGZkX7(I z7o_^LAlglM$V4$03A;5_ddC;$1@G2-D{sDqgjC~38E{CU=Rat3`jBddQ`X0Y@OeSP zFL|`R{ML4z@}B&ak8_2o5W9)Lt;|@fEm=BS*duRR7{wT5SjUq?Uos30qwekmRBM*# z(`ssZ_^jJx0y-8-1j#hHLoAVCq$eJUettT`?``FH_gSrraD>4|>Lz}n)b`>HcL2m} znhgyT(-|DWlcevg#OC^^usFkbK6wV+f;+;vrgXZ3y!$iu4Ev)c&dc?SzrRq5URnDB zzI>!wX0t{BJ+B1%XGZZOy=us1UN88L1!>vKdu_NF3DBN(3 z0qEZbHhqGgH9Q=m4_=~%`z~OK>FWsdB=a>K>|rJb3==42bV9w&J&;BpArr}+U*L>& zYE7;w3PtUlxjOkdr(=gBP&IVvs<$Cy8n&|gYyScD45;pAn=qTP! zLBe?I1P$>)(2cHsdc&ka$M;R&U#E9#{!;C2wjT=`+ND^}VEyGF95pmgi{UbuZg&*} ze>wtrzd%OI7!-a1zs-ogcmQ|(m;!j~f;}Z!pRq3<)xkrBK1L7p?fQ6}{`{(8fbCc- zf?xIkc|QQ@h6+ui-VK{UyUC2mFJw1G1mPDBzl}#Z7>G+dSgK&)uN^mG7O4A+8r?Ck z1nwo0OIb+B2bDB1b_ZUaV{dT_Nst`R z@@XBDX7+||wPSC1W{eF>x#ssAYH|yJ6IVaz24lh*IgT=k)f_27dJd+k=uC$U=>qf2K-V&#~lk1y4YgS;SEW`)ue@2C@-*QNXZ@YVq6%j9Ux( zepERWH=iNydE;yn*HRoic=EWKCVCSro%_}~c&CmRGOKrH?p-KmbCg$Oe#3Cfuxg;$ zxT9XM{8J`*Z!1wIVsA&eD``)18b%x-GF{Dl_qk|Y_R>)qC7SYLU-Gu=m!Z}-aM3#Y zV`3o9t&%VPtO)$osDpYR*1e$Dq9^T~+S4V-4cL@A?~ zp1if5JjFs#)8-EXPo}{q6N>zv`2qV$DSc8PFP{9go)pJ_s0;G|si%n1C$#D(?9(TR zb&SWvN48tBD=ROcLOfKf+OvVSRiJdIE~Bj&HYdlUl(yT*!Z&P^ly!Y&#_6T0MW@o_ zF@9?%!C&tWHqi3v{~N2-&vru1G<)o+l9;D7A9L)PxbAVrv9Z>=3QJf&aepm+e9|-M ztX>@W%yYWHAtj4Bbv(Ox1hT6Po{CVHS`k!k-5oaF=bVQ1*w|~R4Z8|B9sG@Dd1&7y zPBhEz61AO&M$#g;f98GmnyRW%3fa~*6LapCu1b4xvt7^qYbFn2>@Z#Bc@sHkq7I}k zlDZkD@vSfTDp644g@Sar2RW6iQk==aii*iN@PcK_E?Fv#e2aH<7>C|C_PV{+&F zAygbcX|PlxYVqX-i|qWKVB8FISTIEa;C*DRfoTspthNZfN=LgiMJM|8jIOmL`iXF9dMq@^^xA)` zwIRKJjk~j>L<-+x)O$!7mqP1#71u1g9+<&X+Cz)5-uZXTwsYo@_|iy=D1U>~(;p zzXb8E^t4y~mGbRnrD%hQeBRH)9I&4m^B&y7kL1D;?J~;fB&06X%#!Nlt64bF;f-Wy zbiss#_6ghhJuxpgFiosqSj|QLj#Jrr=Utze!mZ+S38Ib|vF}?LgX=WW{jS#*Z3~0v zp{&VgVukM9UsCTr0x#QKj5Q-Xc2%CLb@$1&k803;%0cwi6J>@a zBxmH{wPuj`G`W74OQjL{n{}-)#sE5Ng zHpXDy0@j74`F;#PRVQ$C*Qvr)-cr_ij>R zmc}CWih{e+XC2CJc~tw8QO^4-9~sWAiJANAqv7APg^T3C+5Wa}(vYqLF)LtI=(_Xq zcPXD|chk>(F&hgVS2ucUn(`7eZre#NJb{!dvHL+wyrVrE4^5 zsy-zc;GT;x#l4tcemY7Vb~-uddh67aVM(|jkxn-<#qYSSN1 zw+(h=Iqw!}LuN6(HR>fWo?|%bHy~>`J3EgWh-;*eYK?yyfKN9Dg!G#Z+uLmRk)f+&j|4W-94P(vwq4@`P&ePa zd6(Wvfu^V?M;Wc=&1{xL-KAG1>?3tUkmAgQsi$<8Cap{aAP48$aLPTCoA&M z2gic<2YrUvm_A2uoQvj8xTNc(*+G57p%sfl8}bOD?qe z(uA(vj_+C15VZB!7*^Klpb?aMcKvPu+J^C$!bAS~&2~ZbOA)=J7RMc=pXBkz;LunqDMz@Ghv%PV)aJu93 zDjf{{^0PuLZtPh1FDdSXKId1>$xcKzvEYYj_m?M&)Lpb#?S zXBHJp%&J!t@2uS<`3E2OgLWhLjdn_y<1DP5Pok>X;m&1Q*(l6mBYN` zt)*D+`qiWU+{vq6ppk8fQjf+_Sokds;?2~6anWi2&C*BBJj)9K$>!^vmk=~-RA1kP zB(k%-^>hx^>2$IAy_M4jY-mVb+fjAooa&Ky$Kz4@OG;YBCqf#s+qsE2nnZ&xYgGG* z&eL53TKkWEZ2Q~tWcX#+P9%?OwC<+s&M6rDIw4*waE9vKD{d~yL!Z)XJ?K^Zg!iKk z>Fbr6gCB!|#l!9&hxMU0cg}$M>qhSbFiI@G`d=2Tb9*$8!*wF|I|#cGOyz*0`CSnG z(Ow(|LT_t(c75q(goO5H^hi)#&|Toq6K*1dX|Zf26FxEJx{?<&te$;dQ*~zBzgfu# zMBgNrDaAvrEc1}tsfB~6bc;BejL9tsKSr)SM7q&}R%)n>PsS4vwwI@7Ee}y+!eGMR zYo}H87Ps{HpRQan|{NUy78enazk)YW_>k&ruZa1N$m%-+G&Gz#R zfluTzjYFmGTp7cXv)Dl$%@u_?3>lx4+)U5ux!#zxy4;xel9S)CqzAAlobZR0J_e(? zv$y7(yN3cE@r1O(^~AS8gA!NfS-bBKMgxV_o4(RjdK=#%nyHg&_M;>`U0n=;2YKzrZsCnS!t5tb&E$yj> zOLljx<4rpnasXi2+0*SZptx5I>%VPLg|K9c5K5RBT<}aO_ z%AI5B6I23!3dW_nz`x1*93u$rCkzL=NY;MdG=$; z9SVy5n*>GXlb;StQAy@_glw^~Xk`63N9Blj&ZFQk3EgD985^4wpiMWP!qL--`Ixx% zo7h+l$j#YNU+B@;5kSq->BLUK+xt=XQDBWo%DDhBg{Z^7$6HGu zHu&_(9zJpe5aVZe-FAcDWc(jE8qgsi7H~9V0A|F5 zZ1dkMW1ksiW+z0&WmfR$q7nM6D3({>K<`@wM~oR zi8{~Se&}RRuhyhp4tDTDl_9*zPIF*De7K+qG_?dJ?@t@Dc4U68tb4ez%8dj>>|HQtj zT`)9KOIsb?3cv{j#KFU%e&uCJ$qkXQ@8J zB!0Z9F2r`4aW=M`F+`P1R>vkaWwTr;%~w*)&{naH+%CU8D4ZB=*A~iG&vI7glXmpU zKhwhpn@>y_vWh4N@YelQ_Z4y65~};f&x<28n$P@CEv}!S+|h~zZ({*W=OgpIoTayC ziu7zmCI|xhI2<}L@yfkHo^MOaW;q}#ss(Y~zSGQ?&p(v}O6uaq{m}F6io8Nb=6-N$^?@@43vf|Pw$puUS16eHmwT)T|1JBZEtvf+VZa7TS#UG_9*d8Z z(hfoRfj5nW3+kMz9l$U}hwApz`uKAPSTuTLzkl(NO=6zttl3WX*!vpMu2|bn;<++e z8+0`@%uq*Ljep7>RN&Sn4cY~AC+0TS7hK4WR7sphT(EsPcGGr>40(sz5Dom0rhxLuzF|!zQ2w@zRH;xr|Q@o-y%HN7UZwROWa9?EyWzT*I_B$5pVtZ zc<$x7!7+J1F=fMJxdoAuF&75;$ppq1uUq5>sD|1xUPLll zkq8Qsy$&(uBL2ZxK*(~3QA=XY6{@bX*Y}QbgXsxRP#MPDAUB@;P3@9IYWK&;+W~Rq z-!ER^G4(K5m&;Sky%miWWP($WuqFRH)LK$-*VPqbV~K%GpL;{Z_BIAQ*fBRu8YGPCA4k^QFmuypibCMbUy}GCkb6Zr0-F1M}VMDlX zIV@1mp;CKq67q}a3&e-VP}=n{_JT7uk$cRYrZhrV4Zg4sGSA=ez55{3_e{ckG=h?C zFn;EVC+arujOlNCsIPu|mck^dQ|R4ljv;yVwH{x|8H*|>02}KGW>@QHHH?cRCu*E* z;;l%SP)$Tnri-39DHdl=6g7^`CI*hpkF=i5pQSEr)K6ZYactzrA=;-6+Hm&20BrdU zl~5gT61&IHCCzX>ZxTQlJF(J+%1;ETon};GPbR;PIO#swM4vy7jV19DcxX@NP@xOk z_a|^&9Gf1w4RwIphWdMLankIkTXz2!Tv@xn0zn#8ej8HmeFc9xY^Zi2;FH6eYIaMO zoJb|Rp|=uo|E(++fJr{ODSGy1g*q_Iq_^6|{+8SczpJNm!?0Q89;YcBv@!Qzj3?%S z{qcjTYUBo$fbhLqlk4Jt9RIuG493ARZRX4h*1h{k&>yG_3?$E;AH8o zPFRS=!ASS5w$d0lQJm6=vc_o{{oN$EZ-oSFO9UUw$_jYiI2rr+cnAOW4K}V{$N!M1Z55WH`6}E5 z1jW&^H=<;CZeiilUP$1B^?`mMPLn=-TT07l0~?=^x#OvAwA$S}83n+L^Y|+g(g~+i z$IBh+Tfp&H;}H;8;fQ{?{02(W6A~!7YZDZ(dYj2w|^=CXR2FdsxDY^zcqeu z$FAQI`y@KRu+&y70O($zoMq}>q*Rc9(#D3-9PsAWhX=eBEUh8~_Xn*-2cm~Wzxh@L zpRE_17@ZVrM^wv2=EV@;9cnOu7V>IX-)#LGQ3Pb3*dQ9DCSH@U)8{HMW2ak9BAqU^fCs zO>TFU@mI_^nZdw}*zkxq+P2h11tB?oJGS||*zk0nO6Fu16FTB*X999q`Y?{rR#M-X zw`!F;I5U&Dj9(}}J~8t=_p%qeOv_2f*dPjVSl(TvAXK_LtT71|h{ zJHrN3q=_z{kkEJJWkzN}C+2h@S>C|BcG|m%Z7B+cP~3dIUtMAvmxOcOum@4Fe#SJf z;j};7@5DJ#jtbSTW*Olj{}@bstt~)UX+hHbj5l?q^tNqI;hFFx#AJL%{D%2VI4<-i zveZ?5*H+lI*Yvk&$IFNIXD!qS?YuW)y|Z8T!z*0bOpPix>>LuQsHo(csrg1s@!PU0 zrf7NJkHDga}{;^7rskhWT z(!2KW|Fs7S`NvvJY97EC>;^DpASa(3E(Jvc{Rc4VrC|;nN_@_R=}oRuJ~U&>PShu} z-CpeY>Gy#v8Qq{O;Z)L+7^ZLKV>(F4i0P!LyHlKaZ)+t^B>6| zh<6bF5Cmhgw`~3X5VS)0%l<*J3&@*tnSwn3>a`LtbQ@GluC}vBd}BpaKYwPj9SC?1 zqjXL}ZX_TprA`K&5;Chd0`Eb7hV=A`smIRx>_v4+2?@{9*>wIqf5~FK|J-_yCEo!Z zlx%U4VzaE`m7GvqFvE>bF#ejM$fJ{Nn?`YcP%sY4qD5xYL-YQfQ14Hx47r!zWpX3X zOwqr~h9qzltheYlB^{{oHv?=Q#k=BrC1AXzPOGhI9;FBKNG8V(!tIA&PV9RB;Y?zz4I2_NvVQh_nQ+#I zd)M_IA8Fiq7t@D5*J-lj%&~h*!+Y7g&M*BJ*pa*C%waW%s=CLY&jbx}-DRxL@b1Q2 zA-L8Q=y1#*j{+V~Trxy}m;jmj1tcK-?mq3VJ?+jv?GBK3cRx#5;{A>AmuM!e zz}ncSSfp}gBexnc5pxcF?#RRtCzI-;(oRi z`u2tG0sNFM=HCeX6cN99P)+vWp$oj)hvD!*Lt7uqKbVywZnpI&VTla@(u2ES2kZ-I zvtH*udEsqQz$cHjio56Y7XGLySav|xb;aRRX5D=4UJV`sV9kqM&0ZPJ!j+woif&s7 zKDI{y#ld5~od@_IQcD_4u@QI!_zS8)l2!tnX81F!hfI{A zWJ;hpt^U5)>x;h7^nT=s^!qa zfpV%$C4JG-Xp7!LO8SBJUDv5lHf(2I=(y9iq(y9?IaNS;tDSFBTyf@m^xaSAZ7zPG zHuGDj2!Dq85Sq*Ef!D6h9iR|x5T;99NS-Jp2geaS@Z`HEhO zw^J;%Nd?!}Oln(P4<3Cn9_9`kGyFl-ayVj3x8I=^opLy1V&^D@jI$y0-TE@G(h7;W ztbpERg8^2ZBz!9P>FYPG71B_4-_0+AD=R*&NExk$#m{y3WkL4yvFDf6U0t4>aQEvN ziKkuexdrBh6fNzb)e${C|IyWaCh@_>Rc%?9~0^Z=RSs>p`7dj+=*R*LT1XKJHDo!$+P?nE-`+b1-wWb8G`z;-9z-5JeVZC#} zuc8P*Ky!^6A7vZ0DBiw$fy@G(h(uje-xKS9n77r%*DT&Z>3LjR=gWiIaYFpiAPz(yM%z zw`?fS_O}uhjdD3GLBe`f91;Wjk0+xB-OA5OSbftd+n;}RRH=8)mm~~+Jj^Bs zW(j+iTls7ldE$E{o!K|-GyBGkp-3D?2)~ltTc7Rw=$(vOCD1>ej`mvSANbTlbuWbF zk!1c-<}a~ED_#Meqk>>l=7k`{GY|0duk_Bct?!EiUGqXeX5}d{BBVWK#c_fb;!ty+ zBulebBq&N37}ZEIO*+cH<7q0`N!DIGSI=5BjD2pCCt;A`B|7P-N-qC77}&}kV?9He zV&VoohVX|qP0Pop7MZm2rjQLI1VJCOF3W$8X=Fw}t&&&;#wHz~=cck%^m)jHTs5m& zE|BEQ2vEs~-D_G#Frg}03ztNruszu>C+9Y4 zg|WqgwJ`tD{2_vOBf-S5R$-EJC5gRXQ7UrHEj#a5yQ5mhvare|^g~5-r8m*8cJK9Z z$@ntJEsbZIeGfxSi5*9QtMShV`4&2cZ{9&J^y?g3RdM%@IrXwd@SLMrrS1<{TaL81 zhWQY$gQ5OK!BcDX84l$_|77=+#@VSFMd-1){DIyVlLGpy%KCM(iD60I6kdE?^Nw<6 zXtCOhi;Vov<-aoN!Xx|HGeyb`F@olYNy~#O?JC3lz4g$CrWJngPPMF-MNhC_N8poYrG1^w~OuvUu=cV~QOYe)`B)kQ4g#q_y80sxm@@2}8Wv_6UZ~+kU&OkOoADWap8j z9Llx4Vz4}pPM2U53262%1~JeFxt$ZGUt9gqZ03*!R+0AusGVuHMI4$TRZ)Ho_M4J) ziGysH$yu* zBPQIl=j7LR4=muL1f|}}AG_&E7*Cjj!ty=xWAm~1{3meCN$kZ&(vjAc!|HmKqpfnLOwDi53*@@c@WQADrfH12ubC3CEaoZsc|^g#~_`nLD^N5vBL zDC?^Ey%Mx60r{H~Y;?1b702#LK9i59C#GuD&_BNJ21-T7J3B3PqoZ!p@_S>(JDeZW zg`{Tra_RX*5@?I(>yISOnm(|#QJ^+>bvhZMoOEyC+2d;Ka_4&@N{mOP7>v>{FRrwC zDJP_hYWzYtcu>DO9lNhP)=)ARRX3_T`p(x;8jeU!RQe4Jns*jB>%Hjb(`)5;%I!N~ z!f@r~3=c_fS4e7Vas-{1Hyt{o&USYoaOweP2S4aJP4&h;>U^LQv6AfvGFwJsUHeGE z8hzKbWDd>fn(L0s8t2<@3?XNMw+l9F`hN7z*+$n{Ui#M&Yx)$Lej741Z*++G(zI1e zo-yy_#$t!d%y_N4b6>7xSurIviYA!;^0tO0TOh`5~yFIVm5GgiEWl6N{&N?sN~PEW4Mr=$Uto9y!b(tW4RLiveR{m%!Sk+L_| zi{Sz*^dk}^)NQ(tfrsw9U%x!& zY5j=x``dEP7~_F9AQ@Dn8Gf9{{Ku#i@WUdj#g%U?%FL}LzF>ttaOZXY%Erb`qf<~z zGFNEu+b_HCyrC;EpT3gM4*&XO;tG|NVO(EEw=!vfdTyn${B|e=2^}f-T+WyorOWq! zX%g-P7u^3Tf%`Z+O98hk=it!xS!&kj^RHf(H55m`k;E9`lH?@Zm37UBwKE3q0hH3{ z*F1Gzp2e{1Z1R#p zP|UAD23>V(((j=Iw?39zlVM*^prJne7`we+GbnEU+&9zA_1VVqgHn9zf@t;U-;Q{# z(Z8kMpf{pEgiCAAlMSVh4*M-XYi(lX@{Aman_W;4xpt&Rdd5ntTE)*TYzbdKkIgNt zVYfSi*dC$B1~d)imDRw$I3y34=hvLhED(M6m8t1(p40C|RlM+=oc1Ie~9o-YX^%Jhn*mR_5IE+RrfukJUYq#;fhs? zmw#FF!k^rUaSX||-u!pp1utIQ$zNuny&an+H6wZWLn|M;xWU4xiLlkZf<;liUPYgI zJtJ9ykwIYX`)o!|{V#9(A%>*85r858JY)#6(7DdP?i zC+IPPg8lJHUXxgG3~?kxF$&4O3Vt8_3k^X&M3B(I$TRuGX=eJtKxeC*--Ks^d}mg; zV8lSbb(<+mvx7RlxIS3&b6auyH1N}uVDwBmi!t4(saoXXrdtZB`!HAbjNDjpY8*8U zhmuD_VsTzoN%Ld8OiesWdbE`TzlOtXe zR^dOLJ;o=&g3%6DYp?$;l&6!rrxw>v>!>bB5Wz`?ycXs7+*8wxb82-I#zty#8o37D zXl7^AxF$s!?UXCa4BpI&tG;oV+|0^*o?cf!R<>8p`n}3nmxm@*RMD_P;!JCfSBcfs zXm3t%@0rQIVEVWzW<-;OO3tlS9E<_|2Hk5R3!{}_qxLt$I{{BXhX6@l6Hl%m_cu6I-gPDk>HXjrPKhPTXQI* zAJZgkFg69TkbHtDW46$36D%1rGRwVt>YAo>gv5b$W_TrSG4G=rv=l*ah@CKi!=nG{ zjdDo`Ym;-U`xs32iVT}wP-jJ1w+kF8Fwl z`~&x6fPwA~7bDX45TsenR;P8r6mk1lTgy}+k!(Qr}I$%w^5#_~7#rS?aufN@N zXV#!RMp__XLC_|#)A#0$3E)~|Kq0;@{e;2KV*L*i(q*$yI>T;`>g{EoqeMzQ5{`o& zJ~ufxM6aB8?@DzM7tfShMw=VaUj1z?Kfi|YK!4G_zeWYzuRi^kLi%8MYZ!%GqW}Sb r0^4KAY#xTkPbUjtuK?ofwk!(s4mbOG>i=43pM#ZxqaB_Zp+EaS;~xO^ literal 0 HcmV?d00001 diff --git a/gg.toml b/gg.toml new file mode 100644 index 0000000000..b992583c46 --- /dev/null +++ b/gg.toml @@ -0,0 +1,5 @@ +[aliases] +uv = "gh/astral-sh/uv@0.11.26" +pnpm = "gh/pnpm/pnpm@11.9" +# we run mypy primer in a separate isolated venv because it can't run in the same venv as the version of basedpyright it's testing +mypy_primer = "uv tool run --from ./mypy_primer mypy_primer" diff --git a/gg/mypy_primer b/gg/mypy_primer new file mode 120000 index 0000000000..6623f4434a --- /dev/null +++ b/gg/mypy_primer @@ -0,0 +1 @@ +../gg.cmd \ No newline at end of file diff --git a/gg/mypy_primer.cmd b/gg/mypy_primer.cmd new file mode 120000 index 0000000000..6623f4434a --- /dev/null +++ b/gg/mypy_primer.cmd @@ -0,0 +1 @@ +../gg.cmd \ No newline at end of file diff --git a/gg/pnpm b/gg/pnpm new file mode 120000 index 0000000000..6623f4434a --- /dev/null +++ b/gg/pnpm @@ -0,0 +1 @@ +../gg.cmd \ No newline at end of file diff --git a/gg/pnpm.cmd b/gg/pnpm.cmd new file mode 120000 index 0000000000..6623f4434a --- /dev/null +++ b/gg/pnpm.cmd @@ -0,0 +1 @@ +../gg.cmd \ No newline at end of file diff --git a/gg/uv b/gg/uv new file mode 120000 index 0000000000..6623f4434a --- /dev/null +++ b/gg/uv @@ -0,0 +1 @@ +../gg.cmd \ No newline at end of file diff --git a/gg/uv.cmd b/gg/uv.cmd new file mode 120000 index 0000000000..6623f4434a --- /dev/null +++ b/gg/uv.cmd @@ -0,0 +1 @@ +../gg.cmd \ No newline at end of file diff --git a/mypy_primer b/mypy_primer index 1fa7455b31..198da277a1 160000 --- a/mypy_primer +++ b/mypy_primer @@ -1 +1 @@ -Subproject commit 1fa7455b317ea4ecdd0734a26067178cde8721c4 +Subproject commit 198da277a1cf692453f4d1b37778cfb50b14e79a diff --git a/package.json b/package.json index 83cdfbc54a..ebdaef3494 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "run:langserver": "pnpm run build:cli:dev && node packages/pyright/langserver.index.js --stdio", "jest": "cd packages/pyright-internal && node_modules/.bin/jest", "update-python-deps": "uv sync --upgrade", - "update-pyprojectx-lockfile": "python pw --lock", "typecheck-python": "uv run --no-sync basedpyright", "typecheck-python:writebaseline": "pnpm run typecheck-python --writebaseline", "ruff-check": "uv run --no-sync ruff check --no-cache && uv run --no-sync ruff format --check --diff", diff --git a/pdm_build.py b/pdm_build.py index f211d0970b..098561e6d4 100644 --- a/pdm_build.py +++ b/pdm_build.py @@ -3,10 +3,9 @@ from json import loads from pathlib import Path from shutil import copy, copyfile, copytree -from subprocess import CompletedProcess # noqa: S404 no user input +from subprocess import run # noqa: S404 no user input from typing import TYPE_CHECKING, TypedDict, cast -from nodejs_wheel.executable import corepack from pdm.backend.hooks.base import BuildHookInterface from typing_extensions import override @@ -20,20 +19,6 @@ class PackageJson(TypedDict): bin: dict[str, str] -def run_corepack(*args: str): - # cast needed because the corepack function doesn't have all the overloads from subprocess.run - # even though the args are forwarded to it - result = cast( - CompletedProcess[str], - corepack(args, return_completed_process=True, capture_output=True, text=True), - ) - if result.returncode != 0: - raise Exception( - f"the following corepack command exited with exit code {result.returncode}: {args}" - f"\n\nstderr:\n{result.stderr}" - ) - - # https://github.com/pdm-project/pdm-backend/issues/247 class Hook(BuildHookInterface): # pyright:ignore[reportImplicitAbstractClass] @override @@ -50,8 +35,13 @@ def pdm_build_update_files(self, context: Context, files: dict[str, Path]): if context.builder.config_settings.get("regenerate_docstubs") != "false": generate_docstubs(overwrite=True) - run_corepack("enable") - run_corepack("pnpm", "run", "build:cli:dev") + _ = run( # noqa: S602 + "./gg.cmd pnpm run build:cli:dev", + capture_output=True, + check=True, + text=True, + shell=True, + ) if context.target == "editable": copy(npm_package_dir / package_json, pypi_package_dir) diff --git a/pw b/pw deleted file mode 100755 index 62b8a04e80..0000000000 --- a/pw +++ /dev/null @@ -1,262 +0,0 @@ -#!/usr/bin/env python3 - -################################################################################## -# Pyprojectx wrapper script # -# https://github.com/pyprojectx/pyprojectx # -# # -# Copyright (c) 2021 Ivo Houbrechts # -# # -# Licensed under the MIT license # -################################################################################## -import argparse -import os -import subprocess -import sys -import sysconfig -import zipfile -from pathlib import Path -from urllib import request - -try: - from venv import EnvBuilder -except ImportError: - EnvBuilder = None - - -VERSION = "3.3.4" -UV_VERSION = "0.11.6" - -PYPROJECTX_INSTALL_DIR_ENV_VAR = "PYPROJECTX_INSTALL_DIR" -PYPROJECTX_PACKAGE_ENV_VAR = "PYPROJECTX_PACKAGE" -PYPROJECTX_USE_UV_ENV_VAR = "PYPROJECTX_USE_UV" -PYPROJECT_TOML = "pyproject.toml" -DEFAULT_INSTALL_DIR = ".pyprojectx" -SCRIPTS_DIR = Path(sysconfig.get_path("scripts")).name -EXE = sysconfig.get_config_var("EXE") - -CYAN = "\033[96m" -BLUE = "\033[94m" -RED = "\033[91m" -RESET = "\033[0m" -if sys.platform.startswith("win"): - os.system("color") - - -def run(args): - try: - options = get_options(args) - if options.upgrade: - download_wrappers() - return - - pyprojectx_script = ensure_pyprojectx(options) - explicit_options = [] - if not options.toml: - explicit_options += ["--toml", str(options.toml_path)] - if not options.install_dir: - explicit_options += ["--install-dir", str(options.install_path)] - - subprocess.run([str(pyprojectx_script), *explicit_options, *args], check=True) - except subprocess.CalledProcessError as e: - raise SystemExit(e.returncode) from e - - -def get_options(args): - options = arg_parser().parse_args(args) - options.install_path = Path( - options.install_dir - or os.environ.get(PYPROJECTX_INSTALL_DIR_ENV_VAR, Path(__file__).with_name(DEFAULT_INSTALL_DIR)) - ) - options.toml_path = Path(options.toml) if options.toml else Path(__file__).with_name(PYPROJECT_TOML) - if os.environ.get(PYPROJECTX_PACKAGE_ENV_VAR): - options.version = "development" - options.pyprojectx_package = os.environ.get(PYPROJECTX_PACKAGE_ENV_VAR) - else: - options.version = VERSION - options.pyprojectx_package = f"pyprojectx=={VERSION}" - options.verbosity = 0 if options.quiet or not options.verbosity else options.verbosity - return options - - -def arg_parser(): - parser = argparse.ArgumentParser( - prog="pw", - description="Execute commands or aliases defined in the [tool.pyprojectx] section of pyproject.toml. " - "Use the -i or --info option to see available tools and aliases.", - allow_abbrev=False, - ) - parser.add_argument("--version", action="version", version=VERSION) - parser.add_argument( - "--toml", - "-t", - action="store", - help="The toml config file. Defaults to 'pyproject.toml' in the same directory as the pw script.", - ) - parser.add_argument( - "--install-dir", - action="store", - help=f"The directory where all tools (including pyprojectx) are installed; defaults to the " - f"{PYPROJECTX_INSTALL_DIR_ENV_VAR} environment value if set, else '.pyprojectx' " - f"in the same directory as the invoked pw script.", - ) - parser.add_argument( - "--force-install", - "-f", - action="store_true", - help="Force clean installation of the virtual environment used to run cmd, if any.", - ) - parser.add_argument( - "--clean", - "-c", - action="store_true", - help="Clean .pyprojectx directory by removing all but the current versions " - "of pyprojectx and context virtual environments.", - ) - parser.add_argument( - "--install-context", - action="store", - metavar="tool-context", - help="Install a tool context without actually running any command.", - ) - parser.add_argument( - "--verbose", - "-v", - action="count", - dest="verbosity", - help="Give more output. This option is additive and can be used up to 2 times.", - ) - parser.add_argument( - "--quiet", - "-q", - action="store_true", - help="Suppress output.", - ) - parser.add_argument( - "--info", - "-i", - action="store_true", - help="Show the configuration details of a command instead of running it. " - "If no command is specified, a list with all available tools and aliases is shown.", - ) - parser.add_argument( - "--add", - action="store", - metavar="[context:],...", - help="Add one or more packages to a tool context. " - "If no context is specified, the packages are added to the main context. " - "Packages can be specified as in 'pip install', except that a ',' can't be used in the version specification.", - ) - parser.add_argument( - "--lock", - action="store_true", - help="Write all dependencies of all tool contexts to 'pw.lock' to guarantee reproducible outcomes.", - ) - parser.add_argument( - "--install-px", action="store_true", help="Install the px and pxg scripts in your home directory." - ) - parser.add_argument( - "--upgrade", - action="store_true", - help="Download the latest pyprojectx wrapper scripts.", - ) - parser.add_argument( - "command", nargs=argparse.REMAINDER, help="The command/alias with optional arguments to execute." - ) - return parser - - -def ensure_pyprojectx(options): # noqa: C901, PLR0912 - venv_dir = ( - options.install_path / "pyprojectx" / f"{options.version}-py{sys.version_info.major}.{sys.version_info.minor}" - ) - pyprojectx_script = venv_dir / SCRIPTS_DIR / f"pyprojectx{EXE}" - - if not pyprojectx_script.is_file(): - if options.quiet: - out = subprocess.DEVNULL - else: - out = sys.stderr - print(f"{CYAN}creating pyprojectx venv in {BLUE}{venv_dir}{RESET}", file=sys.stderr) - - use_uv_install_script = not EnvBuilder or os.environ.get(PYPROJECTX_USE_UV_ENV_VAR) - if not use_uv_install_script: - env_builder = EnvBuilder(with_pip=True) - env_context = env_builder.ensure_directories(venv_dir) - try: - env_builder.create(venv_dir) - except (SystemExit, subprocess.CalledProcessError) as e: - print(f"failed to create virtualenv, falling back to uv install script ({e})") - use_uv_install_script = True - else: - pip_cmd = [env_context.env_exe, "-m", "pip", "install", "--pre"] - subprocess.run( - [*pip_cmd, "--upgrade", "pip"], - stdout=out, - check=True, - ) - if use_uv_install_script: # download and use uv to create the pyprojectx venv - uv_dir = Path(options.install_path) / f"uv-{UV_VERSION}" - release_base_url = ( - "https://github.com/astral-sh/uv/releases/latest/download" - if UV_VERSION == "__uv_version__" - else f"https://github.com/astral-sh/uv/releases/download/{UV_VERSION}" - ) - if sys.platform == "win32": - # https://github.com/PowerShell/PowerShell/issues/18530#issuecomment-1325691850 - os.environ["PSMODULEPATH"] = "" - install_uv_cmd = ( - f'powershell -ExecutionPolicy Bypass -c "irm {release_base_url}/uv-installer.ps1 | iex"' - ) - else: - install_uv_cmd = f"curl --proto '=https' --tlsv1.2 -LsSf irm {release_base_url}/uv-installer.sh | sh" - subprocess.run( - install_uv_cmd, - stdout=out, - check=True, - shell=True, - env={**os.environ, "UV_BUILD_UNMANAGED_INSTALL": str(uv_dir), "UV_UNMANAGED_INSTALL": str(uv_dir)}, - ) - uv = uv_dir / f"uv{EXE}" - subprocess.run( - [uv, "venv", str(venv_dir), "--python", sys.executable, "--clear"], - stdout=out, - check=True, - ) - pip_cmd = [uv, "pip", "install", "--pre", "--python", str(venv_dir / SCRIPTS_DIR / f"python{EXE}")] - - if not options.quiet: - print( - f"{CYAN}installing pyprojectx {BLUE}{options.version}: {options.pyprojectx_package} {RESET}", - file=sys.stderr, - ) - if options.version == "development": - if not options.quiet: - print( - f"{RED}WARNING: {options.pyprojectx_package} is installed in editable mode{RESET}", - file=sys.stderr, - ) - pip_cmd.append("-e") - subprocess.run([*pip_cmd, options.pyprojectx_package], stdout=out, check=True) - # create .gitignore file - gitignore_file = options.install_path / ".gitignore" - if not gitignore_file.is_file(): - gitignore_file.write_text("*\n") - - return pyprojectx_script - - -def download_wrappers(): - latest = "https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip" - zip_file, _ = request.urlretrieve(latest) # noqa: S310 - with zipfile.ZipFile(zip_file, "r") as zip_ref: - for entry in zip_ref.namelist(): - if Path(__file__).with_name(entry).is_file(): - zip_ref.extract(entry, Path(__file__).parent) - - -if __name__ == "__main__": - try: - run(sys.argv[1:]) - except KeyboardInterrupt: - sys.tracebacklimit = -1 - raise diff --git a/pw.bat b/pw.bat deleted file mode 100644 index 5a81b0841d..0000000000 --- a/pw.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -python "%~dp0pw" %* diff --git a/pw.lock b/pw.lock deleted file mode 100644 index 84935b5baf..0000000000 --- a/pw.lock +++ /dev/null @@ -1,3 +0,0 @@ -[main] -requirements = ["uv==0.11.14"] -hash = "45210da832f9626829457a65e9e7c4d0" diff --git a/pw.ps1 b/pw.ps1 deleted file mode 100644 index 98524bba52..0000000000 --- a/pw.ps1 +++ /dev/null @@ -1 +0,0 @@ -python "$(Split-Path -Parent $MyInvocation.MyCommand.Definition)\pw" @args diff --git a/pyproject.toml b/pyproject.toml index b8e2b8026e..43f37eae8e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,6 @@ dependencies = [ dev = [ "pylint>=3.0.0a7", "ruff>=0.2.2", - "nodejs-wheel>=24.14.1,<25", "pdm-backend>=2.3.0", "typing_extensions>=4.12.2", "pytest>=8.2.2", @@ -49,11 +48,6 @@ lochelper = ["rich>=13.0", "textual>=0.70.0"] build-backend = "pdm.backend" requires = [ "pdm-backend>=2.3.0", - # required for building the pyright npm package to be bundled in the pypi package. - # cli is required due to dependencies with install scripts that assume node/npm is in the path - # corepack was removed in node 25 and we need it to install pnpm. we also have pnpm listed as a dev depenency - # so we don't have to run it thru corepack after the first install - "nodejs-wheel>=20.13.1,<25", # used in pdm_build.py: "typing_extensions>=4.12.2", "docify>=1.0.0", @@ -66,12 +60,6 @@ repository = "https://github.com/detachhead/basedpyright" basedpyright = 'basedpyright.pyright:main' basedpyright-langserver = 'basedpyright.langserver:main' -[tool.pyprojectx] -lock-python-version = "3.8" -main = ["uv"] -# ideally this would be in an uv dependency group but in the ci we need to install it outside of the project's venv -# so this is the easiest way to do it -mypy_primer = "-e ./mypy_primer" [tool.uv] default-groups = ["dev", "docstubs", "lochelper"] @@ -204,7 +192,6 @@ max-line-length = 200 pythonVersion = "3.8" # https://github.com/DetachHead/basedpyright/issues/31 ignore = [ - "pw", "basedpyright/dist", "packages", "docstubs", @@ -213,7 +200,6 @@ ignore = [ ".venv", ] exclude = [ - "pw", "basedpyright/dist", "packages", "docstubs", @@ -239,7 +225,6 @@ line-length = 100 preview = true unsafe-fixes = true extend-exclude = [ - "pw", "packages/pyright-internal/typeshed-fallback", "docstubs", "packages/pyright-internal/src/tests/samples", diff --git a/uv.lock b/uv.lock index 7c58e38821..292e2d4c87 100644 --- a/uv.lock +++ b/uv.lock @@ -25,7 +25,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/0d/3a/22ff5415bf4d296c1e92b07fd746ad42c96781f13295a074d58e77747848/aiosqlite-0.20.0.tar.gz", hash = "sha256:6d35c8c256637f4672f843c31021464090805bf925385ac39473fb16eaaca3d7", size = 21691, upload-time = "2024-02-20T06:12:53.915Z" } wheels = [ @@ -58,7 +58,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/53/1067e1113ecaf58312357f2cd93063674924119d80d173adc3f6f2387aa2/astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a", size = 397576, upload-time = "2024-07-20T12:57:43.26Z" } wheels = [ @@ -73,7 +73,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/18/74/dfb75f9ccd592bbedb175d4a32fc643cf569d7c218508bfbd6ea7ef9c091/astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", size = 400439, upload-time = "2025-07-13T18:04:23.177Z" } wheels = [ @@ -92,7 +92,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/63/0adf26577da5eff6eb7a177876c1cfa213856be9926a000f65c4add9692b/astroid-4.0.4.tar.gz", hash = "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0", size = 406358, upload-time = "2026-02-07T23:35:07.509Z" } wheels = [ @@ -212,7 +212,6 @@ dev = [ { name = "mkdocs-awesome-pages-plugin", version = "2.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1'" }, { name = "mkdocs-macros-plugin" }, { name = "mkdocs-material" }, - { name = "nodejs-wheel" }, { name = "pdm-backend", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "pdm-backend", version = "2.4.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, { name = "pylint", version = "3.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, @@ -251,7 +250,6 @@ dev = [ { name = "mkdocs-awesome-pages-plugin", specifier = ">=2.9.2" }, { name = "mkdocs-macros-plugin", specifier = ">=1.2.0" }, { name = "mkdocs-material", specifier = ">=9.5.37" }, - { name = "nodejs-wheel", specifier = ">=24.14.1,<25" }, { name = "pdm-backend", specifier = ">=2.3.0" }, { name = "pylint", specifier = ">=3.0.0a7" }, { name = "pytest", specifier = ">=8.2.2" }, @@ -305,9 +303,9 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "exceptiongroup" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/29/7b/da4aa2f95afb2f28010453d03d6eedf018f9e085bd001f039e15731aba89/cattrs-24.1.3.tar.gz", hash = "sha256:981a6ef05875b5bb0c7fb68885546186d306f10f0f6718fe9b96c226e68821ff", size = 426684, upload-time = "2025-03-25T15:01:00.325Z" } wheels = [ @@ -322,9 +320,9 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "exceptiongroup" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/6e/00/2432bb2d445b39b5407f0a90e01b9a271475eea7caf913d7a86bcb956385/cattrs-25.3.0.tar.gz", hash = "sha256:1ac88d9e5eda10436c4517e390a4142d88638fe682c436c93db7ce4a277b884a", size = 509321, upload-time = "2025-10-07T12:26:08.737Z" } wheels = [ @@ -343,9 +341,9 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/a0/ec/ba18945e7d6e55a58364d9fb2e46049c1c2998b3d805f19b703f14e81057/cattrs-26.1.0.tar.gz", hash = "sha256:fa239e0f0ec0715ba34852ce813986dfed1e12117e209b816ab87401271cdd40", size = 495672, upload-time = "2026-02-18T22:15:19.406Z" } wheels = [ @@ -507,7 +505,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } wheels = [ @@ -526,7 +524,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } wheels = [ @@ -591,7 +589,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or python_full_version >= '3.11'" }, { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } @@ -638,7 +636,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304, upload-time = "2024-09-11T14:56:08.937Z" } wheels = [ @@ -653,7 +651,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ @@ -669,7 +667,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/be/f3e8c6081b684f176b761e6a2fef02a0be939740ed6f54109a2951d806f3/importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065", size = 43372, upload-time = "2024-09-09T17:03:14.677Z" } wheels = [ @@ -684,7 +682,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } wheels = [ @@ -742,7 +740,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } wheels = [ @@ -787,9 +785,9 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "pyyaml", marker = "python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "typing-inspect", marker = "python_full_version < '3.9'" }, + { name = "pyyaml" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-inspect" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/ef/610498b5e982d9dd64f2af8422ece1be44a946a8dbda15d08087e0e1ff08/libcst-1.1.0.tar.gz", hash = "sha256:0acbacb9a170455701845b7e940e2d7b9519db35a86768d86330a0b0deae1086", size = 764691, upload-time = "2023-10-06T02:50:16.255Z" } wheels = [ @@ -838,9 +836,9 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "pyyaml", marker = "python_full_version >= '3.14' or (python_full_version >= '3.9' and python_full_version < '3.13')" }, + { name = "pyyaml", marker = "python_full_version != '3.13.*'" }, { name = "pyyaml-ft", marker = "python_full_version == '3.13.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/cd/337df968b38d94c5aabd3e1b10630f047a2b345f6e1d4456bd9fe7417537/libcst-1.8.6.tar.gz", hash = "sha256:f729c37c9317126da9475bdd06a7208eb52fcbd180a6341648b45a56b4ba708b", size = 891354, upload-time = "2025-11-03T22:33:30.621Z" } wheels = [ @@ -920,7 +918,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "uc-micro-py", version = "1.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "uc-micro-py", version = "1.0.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946, upload-time = "2024-02-04T14:48:04.179Z" } wheels = [ @@ -939,7 +937,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "uc-micro-py", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "uc-micro-py", version = "2.0.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/c9/06ea13676ef354f0af6169587ae292d3e2406e212876a413bf9eece4eb23/linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b", size = 29158, upload-time = "2026-03-01T07:48:47.683Z" } wheels = [ @@ -955,12 +953,12 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "aiosqlite", version = "0.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "pygls", version = "1.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "stamina", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "textual", version = "0.73.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8.1'" }, + { name = "aiosqlite", version = "0.20.0", source = { registry = "https://pypi.org/simple" } }, + { name = "importlib-resources", version = "6.4.5", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" } }, + { name = "pygls", version = "1.3.1", source = { registry = "https://pypi.org/simple" } }, + { name = "stamina", version = "25.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "textual", version = "0.73.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8.1' or python_full_version >= '3.9'" }, { name = "textual", version = "6.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f9/a1/1270b2d37c9d012ecfb1aa40352cc8d5fe42fb6b42d4968c5256605740fa/lsp_devtools-0.2.3.tar.gz", hash = "sha256:9c7aee5e1f4f8afe0e8def74633a9af2b093fa23af5b93525462e9e49622f755", size = 27899, upload-time = "2024-05-22T18:49:43.798Z" } @@ -976,11 +974,11 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "aiosqlite", version = "0.22.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pygls", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "stamina", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "textual", version = "8.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "aiosqlite", version = "0.22.1", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pygls", version = "2.1.1", source = { registry = "https://pypi.org/simple" } }, + { name = "stamina", version = "25.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "textual", version = "8.2.7", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/9d/70afc9ed26f1040161e3877d57cd652b0649d4f4e6376b123676f2f20e08/lsp_devtools-0.2.4.tar.gz", hash = "sha256:4966daa77cbbecc43afc1af930859a3a56e689a17e09783fbc99d891a0dfabb6", size = 27078, upload-time = "2024-11-23T19:30:33.665Z" } wheels = [ @@ -999,11 +997,11 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "aiosqlite", version = "0.22.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.9.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pygls", version = "2.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "stamina", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "textual", version = "8.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "aiosqlite", version = "0.22.1", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs", version = "4.9.6", source = { registry = "https://pypi.org/simple" } }, + { name = "pygls", version = "2.1.1", source = { registry = "https://pypi.org/simple" } }, + { name = "stamina", version = "26.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "textual", version = "8.2.7", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/d3/4d/c68335c76b9bf9ae00aa213c88e7e91da2ff6579b56c38a87e535bc2f33a/lsp_devtools-0.4.0.tar.gz", hash = "sha256:9fdb21b50f9ff0c0cbcdcf8c369195cc08e70dbccf2321db62c60c46b63fb38b", size = 37438, upload-time = "2026-03-23T19:40:36.01Z" } wheels = [ @@ -1019,8 +1017,8 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "cattrs", version = "24.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "cattrs", version = "24.1.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/f6/6e80484ec078d0b50699ceb1833597b792a6c695f90c645fbaf54b947e6f/lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d", size = 69434, upload-time = "2024-01-09T17:21:12.625Z" } wheels = [ @@ -1040,8 +1038,8 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "cattrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "cattrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "cattrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/26/67b84e6ec1402f0e6764ef3d2a0aaf9a79522cc1d37738f4e5bb0b21521a/lsprotocol-2025.0.0.tar.gz", hash = "sha256:e879da2b9301e82cfc3e60d805630487ac2f7ab17492f4f5ba5aaba94fe56c29", size = 74896, upload-time = "2025-06-17T21:30:18.156Z" } @@ -1058,7 +1056,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086, upload-time = "2024-08-16T15:55:17.812Z" } wheels = [ @@ -1073,7 +1071,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } wheels = [ @@ -1106,7 +1104,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "mdurl", marker = "python_full_version < '3.10'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ @@ -1115,10 +1113,10 @@ wheels = [ [package.optional-dependencies] linkify = [ - { name = "linkify-it-py", version = "2.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "linkify-it-py", version = "2.0.3", source = { registry = "https://pypi.org/simple" } }, ] plugins = [ - { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" } }, ] [[package]] @@ -1133,7 +1131,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "mdurl", marker = "python_full_version >= '3.10'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ @@ -1142,7 +1140,7 @@ wheels = [ [package.optional-dependencies] linkify = [ - { name = "linkify-it-py", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "linkify-it-py", version = "2.1.0", source = { registry = "https://pypi.org/simple" } }, ] [[package]] @@ -1330,7 +1328,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload-time = "2024-09-09T20:27:49.564Z" } wheels = [ @@ -1349,7 +1347,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } wheels = [ @@ -1439,9 +1437,9 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "mkdocs", marker = "python_full_version < '3.8.1'" }, - { name = "natsort", marker = "python_full_version < '3.8.1'" }, - { name = "wcmatch", version = "10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8.1'" }, + { name = "mkdocs" }, + { name = "natsort" }, + { name = "wcmatch", version = "10.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/7a/0a783218350dbf56182bfba23666159affb63072db3111f6d3a281798d5b/mkdocs_awesome_pages_plugin-2.9.2.tar.gz", hash = "sha256:c3f7d366ecfe99b64524c49a84d8e13c576c19a918ea2e6f59bb486a259313af", size = 15920, upload-time = "2023-08-19T21:30:33.029Z" } wheels = [ @@ -1462,9 +1460,9 @@ resolution-markers = [ "python_full_version >= '3.8.1' and python_full_version < '3.9'", ] dependencies = [ - { name = "mkdocs", marker = "python_full_version >= '3.8.1'" }, - { name = "natsort", marker = "python_full_version >= '3.8.1'" }, - { name = "wcmatch", version = "10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, + { name = "mkdocs" }, + { name = "natsort" }, + { name = "wcmatch", version = "10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "wcmatch", version = "10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/92/e8/6ae9c18d8174a5d74ce4ade7a7f4c350955063968bc41ff1e5833cff4a2b/mkdocs_awesome_pages_plugin-2.10.1.tar.gz", hash = "sha256:cda2cb88c937ada81a4785225f20ef77ce532762f4500120b67a1433c1cdbb2f", size = 16303, upload-time = "2024-12-22T21:13:49.19Z" } @@ -1481,10 +1479,10 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "mergedeep", marker = "python_full_version < '3.9'" }, - { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "pyyaml", marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mergedeep" }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" } }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } wheels = [ @@ -1504,11 +1502,11 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "mergedeep", marker = "python_full_version >= '3.9'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "mergedeep" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.9.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.9'" }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } wheels = [ @@ -1598,18 +1596,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268, upload-time = "2023-06-20T04:17:17.522Z" }, ] -[[package]] -name = "nodejs-wheel" -version = "24.15.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nodejs-wheel-binaries" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d0/bd/d08ebc39887cc59669ccc52c3b394f7674352d94b9f642ffa520eb9b8f29/nodejs_wheel-24.15.0.tar.gz", hash = "sha256:4ed5ad3634e0490dd95ebf6fe5cf054d11b78f236a3fc7e7d3c367e16eaec418", size = 2968, upload-time = "2026-04-19T15:48:15.724Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/3e/91fb9aa2de8872e63ded2c95184ce15de8ad24a47afcd25212d4df919d05/nodejs_wheel-24.15.0-py3-none-any.whl", hash = "sha256:4703a436b1a7b933c8769e03117c56181acd616535c37dd439197eab5db9d83d", size = 3985, upload-time = "2026-04-19T15:47:30.753Z" }, -] - [[package]] name = "nodejs-wheel-binaries" version = "24.15.0" @@ -1683,7 +1669,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/bf/d75d568521cef171ae9138d9ab55c169a98ee803853ca87b7096e4636d5b/pdm_backend-2.4.3.tar.gz", hash = "sha256:dbd9047a7ac10d11a5227e97163b617ad5d665050476ff63867d971758200728", size = 117684, upload-time = "2024-10-23T08:27:45.933Z" } wheels = [ @@ -1703,7 +1689,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7c/7e/6d441c8739a30820ec59517a88326789c201ae43a344b2ffb02fb2702d8e/pdm_backend-2.4.8.tar.gz", hash = "sha256:d8ef85d2c4306ee67195412d701fae9983e84ec6574598e26798ae26b7b3c7e0", size = 119572, upload-time = "2026-04-02T02:41:54.711Z" } wheels = [ @@ -1790,8 +1776,8 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "cattrs", version = "24.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "lsprotocol", version = "2023.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "cattrs", version = "24.1.3", source = { registry = "https://pypi.org/simple" } }, + { name = "lsprotocol", version = "2023.0.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/86/b9/41d173dad9eaa9db9c785a85671fc3d68961f08d67706dc2e79011e10b5c/pygls-1.3.1.tar.gz", hash = "sha256:140edceefa0da0e9b3c533547c892a42a7d2fd9217ae848c330c53d266a55018", size = 45527, upload-time = "2024-03-26T18:44:25.679Z" } wheels = [ @@ -1811,10 +1797,10 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "cattrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "attrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "cattrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "cattrs", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "lsprotocol", version = "2025.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "lsprotocol", version = "2025.0.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/da/2e/7bbe061d175c0baddde8fc9edb908a4c31ba5d9165b8c68e3439c3a9f138/pygls-2.1.1.tar.gz", hash = "sha256:1da03ba9053201bb337dcdd8d121df70feb2a91e1a0dcc74de5da79755b1a201", size = 55091, upload-time = "2026-03-25T11:19:10.541Z" } wheels = [ @@ -1860,15 +1846,15 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "astroid", version = "3.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, - { name = "dill", version = "0.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "isort", version = "5.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "mccabe", marker = "python_full_version < '3.9'" }, - { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "tomli", marker = "python_full_version < '3.9'" }, - { name = "tomlkit", version = "0.13.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "astroid", version = "3.2.4", source = { registry = "https://pypi.org/simple" } }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill", version = "0.4.0", source = { registry = "https://pypi.org/simple" } }, + { name = "isort", version = "5.13.2", source = { registry = "https://pypi.org/simple" } }, + { name = "mccabe" }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli" }, + { name = "tomlkit", version = "0.13.3", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/e8/d59ce8e54884c9475ed6510685ef4311a10001674c28703b23da30f3b24d/pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e", size = 1511922, upload-time = "2024-08-31T14:26:26.851Z" } wheels = [ @@ -1883,15 +1869,15 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "astroid", version = "3.3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, - { name = "dill", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "mccabe", marker = "python_full_version == '3.9.*'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "tomli", marker = "python_full_version == '3.9.*'" }, - { name = "tomlkit", version = "0.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "astroid", version = "3.3.11", source = { registry = "https://pypi.org/simple" } }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill", version = "0.4.1", source = { registry = "https://pypi.org/simple" } }, + { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mccabe" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli" }, + { name = "tomlkit", version = "0.15.0", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/9d/81c84a312d1fa8133b0db0c76148542a98349298a01747ab122f9314b04e/pylint-3.3.9.tar.gz", hash = "sha256:d312737d7b25ccf6b01cc4ac629b5dcd14a0fcf3ec392735ac70f137a9d5f83a", size = 1525946, upload-time = "2025-10-05T18:41:43.786Z" } wheels = [ @@ -1910,14 +1896,14 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "astroid", version = "4.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "dill", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "isort", version = "8.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "mccabe", marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.9.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, - { name = "tomlkit", version = "0.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "astroid", version = "4.0.4", source = { registry = "https://pypi.org/simple" } }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill", version = "0.4.1", source = { registry = "https://pypi.org/simple" } }, + { name = "isort", version = "8.0.1", source = { registry = "https://pypi.org/simple" } }, + { name = "mccabe" }, + { name = "platformdirs", version = "4.9.6", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomlkit", version = "0.15.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/b6/74d9a8a68b8067efce8d07707fe6a236324ee1e7808d2eb3646ec8517c7d/pylint-4.0.5.tar.gz", hash = "sha256:8cd6a618df75deb013bd7eb98327a95f02a6fb839205a6bbf5456ef96afb317c", size = 1572474, upload-time = "2026-02-20T09:07:33.621Z" } wheels = [ @@ -1933,8 +1919,8 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "markdown", version = "3.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "pyyaml", marker = "python_full_version < '3.9'" }, + { name = "markdown", version = "3.7", source = { registry = "https://pypi.org/simple" } }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/08/92/a7296491dbf5585b3a987f3f3fc87af0e632121ff3e490c14b5f2d2b4eb5/pymdown_extensions-10.15.tar.gz", hash = "sha256:0e5994e32155f4b03504f939e501b981d306daf7ec2aa1cd2eb6bd300784f8f7", size = 852320, upload-time = "2025-04-27T23:48:29.183Z" } wheels = [ @@ -1954,9 +1940,9 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "markdown", version = "3.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "markdown", version = "3.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "markdown", version = "3.10.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.9'" }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/26/d1015444da4d952a1ca487a236b522eb979766f0295a0bd0c5fc089989a9/pymdown_extensions-10.21.3.tar.gz", hash = "sha256:72cfcf55f07aea0d4af2c4f11dd4e52466ddfb1bb819673146398e0bd3a77354", size = 854140, upload-time = "2026-05-13T12:57:32.267Z" } wheels = [ @@ -2002,12 +1988,12 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.9'" }, - { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "packaging", marker = "python_full_version < '3.9'" }, - { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "tomli", marker = "python_full_version < '3.9'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } wheels = [ @@ -2022,13 +2008,13 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, - { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "packaging", marker = "python_full_version == '3.9.*'" }, - { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "tomli", marker = "python_full_version == '3.9.*'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } wheels = [ @@ -2047,13 +2033,13 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ @@ -2070,7 +2056,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version != '3.9.*'" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/39/d4/c54ee6a871eee4a7468e3a8c0dead28e634c0bc2110c694309dcb7563a66/pytest_github_actions_annotate_failures-0.3.0.tar.gz", hash = "sha256:d4c3177c98046c3900a7f8ddebb22ea54b9f6822201b5d3ab8fcdea51e010db7", size = 11248, upload-time = "2025-01-17T22:39:32.722Z" } @@ -2090,7 +2076,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "pytest", version = "9.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "9.0.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/c2/e1/8f2c242e6d75a26a8e5ddcc23f652a411e4aac3eedc4b923808ac0582685/pytest_github_actions_annotate_failures-0.4.0.tar.gz", hash = "sha256:77d6baa29c8c61c2dacc494fa76eb95a185f0ee61666714ac43fb12ea672d217", size = 10857, upload-time = "2026-03-02T18:57:40.919Z" } wheels = [ @@ -2207,7 +2193,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "pyyaml", marker = "python_full_version < '3.9'" }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631, upload-time = "2020-11-12T02:38:26.239Z" } wheels = [ @@ -2227,7 +2213,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "pyyaml", marker = "python_full_version >= '3.9'" }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } wheels = [ @@ -2267,10 +2253,10 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "certifi", marker = "python_full_version < '3.9'" }, - { name = "charset-normalizer", marker = "python_full_version < '3.9'" }, - { name = "idna", marker = "python_full_version < '3.9'" }, - { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } wheels = [ @@ -2285,10 +2271,10 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "certifi", marker = "python_full_version == '3.9.*'" }, - { name = "charset-normalizer", marker = "python_full_version == '3.9.*'" }, - { name = "idna", marker = "python_full_version == '3.9.*'" }, - { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ @@ -2307,10 +2293,10 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "certifi", marker = "python_full_version >= '3.10'" }, - { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, - { name = "idna", marker = "python_full_version >= '3.10'" }, - { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ @@ -2326,8 +2312,8 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/67/cae617f1351490c25a4b8ac3b8b63a4dda609295d8222bad12242dfdc629/rich-14.3.4.tar.gz", hash = "sha256:817e02727f2b25b40ef56f5aa2217f400c8489f79ca8f46ea2b70dd5e14558a9", size = 230524, upload-time = "2026-04-11T02:57:45.419Z" } wheels = [ @@ -2347,9 +2333,9 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ @@ -2400,9 +2386,9 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "tenacity", version = "9.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "tenacity", version = "9.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version != '3.9.*'" }, { name = "tenacity", version = "9.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version != '3.9.*'" }, { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fd/c4/d242d76ffc88aa1fd14214d3143b542857b32276db4a20f8d99669054a5e/stamina-25.1.0.tar.gz", hash = "sha256:ad674809796ae40512b3b6296cfade826efd63863ff2ca2f59f806342e91e94a", size = 561127, upload-time = "2025-03-12T09:37:08.217Z" } @@ -2422,7 +2408,7 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "tenacity", version = "9.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "tenacity", version = "9.1.4", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/bd/b2f71ae14368a066f103d182f25bbc6c3bf4aa695889f3ed3cba026d6f36/stamina-26.1.0.tar.gz", hash = "sha256:0214d05fdf5102c518194a4aac7520ce53cf660550ae3b940701aad88cf50c17", size = 568171, upload-time = "2026-04-13T17:44:31.012Z" } wheels = [ @@ -2531,9 +2517,9 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify", "plugins"], marker = "python_full_version < '3.8.1'" }, - { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8.1'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8.1'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify", "plugins"] }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/d8/e9/4939bf72d4a7d1a37aa5d55ad4438594a9d5e59875195dd89e9d8c14a9a9/textual-0.73.0.tar.gz", hash = "sha256:ccd1e873370577f557dfdf2b3411f2a4f68b57d4365f9d83a00d084afb15f5a6", size = 1291992, upload-time = "2024-07-18T15:42:55.233Z" } wheels = [ @@ -2548,11 +2534,11 @@ resolution-markers = [ "python_full_version >= '3.8.1' and python_full_version < '3.9'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify", "plugins"], marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, - { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, - { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, - { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify", "plugins"] }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" } }, + { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.org/simple" } }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/a2/30/38b615f7d4b16f6fdd73e4dcd8913e2d880bbb655e68a076e3d91181a7ee/textual-6.2.1.tar.gz", hash = "sha256:4699d8dfae43503b9c417bd2a6fb0da1c89e323fe91c4baa012f9298acaa83e1", size = 1570645, upload-time = "2025-10-01T16:11:24.467Z" } wheels = [ @@ -2572,15 +2558,15 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "python_full_version == '3.9.*'" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "python_full_version < '3.10'" }, { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "python_full_version >= '3.10'" }, - { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "mdit-py-plugins", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.9.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" } }, + { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/9b/7a/c519db0aba5024f86e71e9631810bfdd6866ed2c8695bd7fa34b90e7ef59/textual-8.2.7.tar.gz", hash = "sha256:658f568ff81e30ed43890c3e07520390e5cf1b4763822006e060656b0a88f105", size = 1859249, upload-time = "2026-05-19T10:52:49.531Z" } wheels = [ @@ -2718,8 +2704,8 @@ name = "typing-inspect" version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mypy-extensions", marker = "python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "mypy-extensions" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } wheels = [ @@ -2906,7 +2892,7 @@ resolution-markers = [ "python_full_version < '3.8.1'", ] dependencies = [ - { name = "bracex", version = "2.5.post1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "bracex", version = "2.5.post1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578, upload-time = "2024-09-26T18:39:52.505Z" } wheels = [ @@ -2926,7 +2912,7 @@ resolution-markers = [ "python_full_version == '3.9.*'", ] dependencies = [ - { name = "bracex", version = "2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "bracex", version = "2.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/79/3e/c0bdc27cf06f4e47680bd5803a07cb3dfd17de84cde92dd217dcb9e05253/wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af", size = 117421, upload-time = "2025-06-22T19:14:02.49Z" } wheels = [ From 3b93fe31033030126dbff350b96d839c3543a00c Mon Sep 17 00:00:00 2001 From: detachhead Date: Sun, 5 Jul 2026 11:02:37 +1000 Subject: [PATCH 2/5] set github token for gg in ci --- .github/workflows/build_and_release.yml | 1 + .github/workflows/docs.yaml | 1 + .github/workflows/mypy_primer_pr.yaml | 1 + .github/workflows/validation.yml | 3 +++ 4 files changed, 6 insertions(+) diff --git a/.github/workflows/build_and_release.yml b/.github/workflows/build_and_release.yml index 777c73baaf..20939c56ba 100644 --- a/.github/workflows/build_and_release.yml +++ b/.github/workflows/build_and_release.yml @@ -10,6 +10,7 @@ env: BROWSER_NPM_PACKAGE_DIR: packages/browser-pyright # prevent uv from constantly reinstalling the project and overwriting docstubs UV_NO_SYNC: true + GG_GITHUB_TOKEN: ${{ github.token }} on: push diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 6854fa6bc9..f91a646d5e 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -28,6 +28,7 @@ jobs: env: REPO_KEY: ${{ secrets.GH_TOKEN }} USERNAME: github-actions[bot] + GG_GITHUB_TOKEN: ${{ github.token }} steps: - name: Checkout # zizmor: ignore[artipacked] diff --git a/.github/workflows/mypy_primer_pr.yaml b/.github/workflows/mypy_primer_pr.yaml index ed26eef899..6be665f447 100644 --- a/.github/workflows/mypy_primer_pr.yaml +++ b/.github/workflows/mypy_primer_pr.yaml @@ -17,6 +17,7 @@ name: Run mypy_primer on PR env: PYRIGHT_DISABLE_GITHUB_ACTIONS_OUTPUT: true + GG_GITHUB_TOKEN: ${{ github.token }} on: # Run on the creation or update of a PR. diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 5f7adb19ce..55c97eb0ec 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -10,6 +10,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + GG_GITHUB_TOKEN: ${{ github.token }} + jobs: static_checks: runs-on: ubuntu-latest From add62c51353cbd5bbe140657e434140c92ee5e7e Mon Sep 17 00:00:00 2001 From: detachhead Date: Wed, 8 Jul 2026 21:31:01 +1000 Subject: [PATCH 3/5] workaround gg symlink bug on macos --- .github/workflows/validation.yml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 55c97eb0ec..2abb878118 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -71,20 +71,21 @@ jobs: # ideally we would do the same thing with ./node_modules/.bin to ensure that the version of node from nodejs-wheel # is always used, but it seems to be impossible to prevent github actions from using its own node version - - name: add gg aliases to PATH (linux) - if: runner.os != 'Windows' - run: | - realpath ./gg >> $GITHUB_PATH - - name: add gg aliases to PATH (windows) - if: runner.os == 'Windows' - run: | - echo (resolve-path "./gg").path | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + # currently commented out because this doesn't work on macos, see https://github.com/eirikb/gg/issues/289 + # - name: add gg aliases to PATH (linux/macos) + # if: runner.os != 'Windows' + # run: | + # realpath ./gg >> $GITHUB_PATH + # - name: add gg aliases to PATH (windows) + # if: runner.os == 'Windows' + # run: | + # echo (resolve-path "./gg").path | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: python tests - run: uv run npm run test-python -- -m "not needs_all_docstubs" + run: ./gg.cmd uv run npm run test-python -- -m "not needs_all_docstubs" - name: npm test (pyright-internal) - run: uv run npm test + run: ../../gg.cmd uv run npm test working-directory: packages/pyright-internal # TODO: all tests run in a venv now so i dont think any of this stuff is needed anymore @@ -113,13 +114,13 @@ jobs: env: CI_IMPORT_TEST_VENVPATH: '../../' CI_IMPORT_TEST_VENV: '.venv' - run: uv run npm run test:imports + run: ../../gg.cmd pnpm run test:imports working-directory: packages/pyright-internal - name: Run import tests with pythonpath env: CI_IMPORT_TEST_PYTHONPATH: ${{env.python_venv_path}} - run: uv run npm run test:imports + run: ../../gg.cmd pnpm run test:imports working-directory: packages/pyright-internal required: From 76c2294f62c996ae4912c1b550d486ad74d167b3 Mon Sep 17 00:00:00 2001 From: detachhead Date: Wed, 8 Jul 2026 22:36:51 +1000 Subject: [PATCH 4/5] attempt to fix primer. can't test until after this is merged tho because it tries to use gg on the main branch... --- .github/workflows/mypy_primer_pr.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/mypy_primer_pr.yaml b/.github/workflows/mypy_primer_pr.yaml index 6be665f447..45ccee5e1c 100644 --- a/.github/workflows/mypy_primer_pr.yaml +++ b/.github/workflows/mypy_primer_pr.yaml @@ -60,6 +60,7 @@ jobs: run: | cd pyright_to_test realpath ./gg >> $GITHUB_PATH + - run: uv --version - name: Run mypy_primer shell: bash env: From 340d990aaaf49d7ab9415917b3069f39e641458d Mon Sep 17 00:00:00 2001 From: detachhead Date: Sat, 11 Jul 2026 16:40:16 +1000 Subject: [PATCH 5/5] workaround gg windows issues --- .github/workflows/build_and_release.yml | 11 +++++++++-- .github/workflows/validation.yml | 17 +++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_and_release.yml b/.github/workflows/build_and_release.yml index 20939c56ba..226984733b 100644 --- a/.github/workflows/build_and_release.yml +++ b/.github/workflows/build_and_release.yml @@ -66,8 +66,15 @@ jobs: name: docstubs-linux-and-macos path: docstubs - name: generate docstubs for each python version - run: ./build/generateAllDocstubs.sh - shell: bash + # https://github.com/eirikb/gg/issues/291 + run: | + $ErrorActionPreference = "Stop" + foreach ($pythonVersion in "3.14", "3.13", "3.12", "3.11", "3.10", "3.9") { + ./gg.cmd uv sync --only-group=docstubs --no-install-project --python $pythonVersion + ./gg.cmd uv run --no-sync build/py3_8/generate_docstubs.py + } + # https://github.com/eirikb/gg/issues/292 + shell: powershell - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a with: name: docstubs diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 2abb878118..0b8d7fb242 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -55,10 +55,18 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-latest, windows-latest, ubuntu-latest] - - name: Test ${{ matrix.os }} - runs-on: ${{ matrix.os }} + os: + - name: macos-latest + shell: bash + # https://github.com/eirikb/gg/issues/291 + # https://github.com/eirikb/gg/issues/292 + - name: windows-latest + shell: powershell + - name: ubuntu-latest + shell: bash + + name: Test ${{ matrix.os.name }} + runs-on: ${{ matrix.os.name }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd with: @@ -68,6 +76,7 @@ jobs: id: install_python - run: ./gg.cmd uv sync + shell: ${{ matrix.os.shell }} # ideally we would do the same thing with ./node_modules/.bin to ensure that the version of node from nodejs-wheel # is always used, but it seems to be impossible to prevent github actions from using its own node version