uv en ty samengebracht

TL;DR: Een experimentele uv-ty-integratie is nu beschikbaar. Deze biedt eersteklas ondersteuning voor Python-scripts (zowel in de CLI als in de editor) en een uniform uv check-commando. Dit is een stap richting een geïntegreerde Astral-toolchain die gebruikmaakt van een gedeeld begrip van je project om volledig nieuwe mogelijkheden te ontsluiten.

Bij Astral bouwen we high-performance tools voor het Python-ecosysteem:

  • uv, onze package manager;
  • Ruff, onze linter en formatter; en
  • ty, onze type-checker en language server.

Historisch gezien heeft elke Astral-tool zich gericht op het productiever maken van een ander onderdeel van Python-ontwikkeling. We zien echter een kans om Python verder vooruit te helpen door traditioneel gescheiden functionaliteiten te verenigen in een geïntegreerde toolchain.

Onze visie voor de Astral-toolchain is simpel: hoewel elke tool individueel bruikbaar en interoperabel moet zijn met de rest van het ecosysteem, moeten ze nog krachtiger worden wanneer ze samen worden gebruikt.

Vandaag kondigen we een experimentele integratie aan tussen uv en ty, nu beschikbaar in preview. Waar uv de omgeving en afhankelijkheden van je Python-project begrijpt, begrijpt ty je code. Door deze twee te combineren, kunnen we functionaliteiten ontsluiten die geen van beide tools afzonderlijk kan bieden.

Eersteklas ondersteuning voor Python-scripts

PEP 723 stelt Python-scripts in staat om hun afhankelijkheden en Python-versievereisten te declareren via inline-metadata. uv gebruikt deze metadata al om een omgeving voor te bereiden bij het uitvoeren van een script. Nu kan ty deze metadata gebruiken om je scripts te begrijpen.

Zowel in de command-line als in de editor gebruikt ty nu inline-metadata om scripts in je project te ontdekken en maakt het gebruik van uv om voor elk script een omgeving voor te bereiden. Deze omgevingen stellen ty in staat om je scripts te controleren op basis van de gedeclareerde vereisten.

Scripts binnen hetzelfde repository kunnen verschillende vereisten hebben. Elk script wordt gecontroleerd tegen zijn eigen afhankelijkheidsdeclaraties, zelfs als deze afwijken van het omliggende project.

Declareer afhankelijkheden inline met PEP 723, sla het bestand op om te synchroniseren met uv, en maak gebruik van ty’s aanvullingen (completions), hover-informatie en 'Go to Definition'-functionaliteiten in je editor.

Wanneer de integratie in je editor is ingeschakeld, roept ty automatisch uv aan om op de achtergrond de omgeving van het script voor te bereiden. Dit wordt gebruikt voor typecontrole, codenavigatie en aanvullingen op basis van de gedeclareerde vereisten van het script.

In de toekomst zijn we van plan om scriptondersteuning standaard in te schakelen en automatische omgevingsconfiguratie mogelijk te maken voor standaard Python-projecten.

Een uniform commando voor controles

uv check introduceert een uniforme diagnose-interface voor uv, beginnend met ondersteuning voor ty. Op termijn zijn we van plan om ook Ruff in uv check te ondersteunen, zodat linting en typecontrole in één enkel commando worden verenigd.

Het uitvoeren van uv check bereidt automatisch de omgeving van je project voor, installeert de vereiste afhankelijkheden en controleert je project met ty. Het "werkt gewoon". (Als je uv check nooit uitvoert, verandert er niets aan je uv-ervaring; het ty-binary wordt bij de eerste aanroep apart geïnstalleerd.)

Met uv check kun je individuele pakketten of een volledige workspace controleren. In een workspace gebruik je uv check --package <naam> om een individueel pakket te selecteren, of uv check --all-packages om elk pakket te controleren. uv gebruikt je workspace-configuratie om te bepalen wat er gecontroleerd moet worden, zodat het commando gelijk blijft naarmate je workspace groeit.

Synchroniseer de afhankelijkheden van je project en voer typecontrole uit op je code met één enkel commando.

Standalone PEP 723-scripts hebben onafhankelijke omgevingen en worden apart gecontroleerd. Gebruik uv check --script example.py om een script te controleren met de gedeclareerde vereisten.

uv check gebruikt automatisch de ty-versie die is vastgelegd in de lockfile van je project. Door je projectconfiguratie en lockfile te committen, delen ontwikkelaars en CI-pipelines die uv check uitvoeren dezelfde ty-versie, zonder dat er apart onderhouden pins nodig zijn.

De ty pre-commit-hook maakt onder de motorkap ook gebruik van uv check om ty uit te voeren vóór elke commit in je Python-project. Door uv check te gebruiken, stelt de hook automatisch de omgeving voor ty in op basis van de afhankelijkheidsdeclaraties van je project.

Hoe het werkt

De uv-ty-integratie wordt aangedreven door uv workspace-metadata, wat ty een gestructureerd overzicht geeft van de pakketten, afhankelijkheden en de Python-omgeving van je project of script. ty gebruikt deze informatie vervolgens om typecontrole en editorfuncties te bieden die overeenkomen met de geconfigureerde omgeving.

Voor PEP 723-scripts roept ty uv aan om de omgeving van het script voor te bereiden, inclusief het installeren van gedeclareerde afhankelijkheden. Omdat de installatie van afhankelijkheden de uitvoering van Python-code van derden kan vereisen, is de automatische omgevingsconfiguratie momenteel opt-in.

Om de integratie voor PEP 723-scripts in VS Code te proberen, installeer je uv en de ty VS Code-extensie, en schakel je vervolgens de uv-integratie in je VS Code settings.json in:

{
  "ty.experimental.useUv": "on"
}

Je kunt je project en PEP 723-scripts ook controleren vanaf de command-line met:

TY_UV=scripts ty check

Het uitvoeren van uv check activeert de integratie automatisch en vereist geen extra configuratie.

Ondersteuning voor PEP 723-scripts en het uv check-commando vereist uv 0.12.3 of later, en ty 0.0.76 of later.

Volgende stappen

Deze integratie is experimenteel en we horen graag je feedback terwijl we de ervaring verfijnen.

Hoewel deze initiële ondersteuning grotendeels gebruikmaakt van de omgevingsmogelijkheden van uv om de uitvoering van ty aan te sturen, werken we ook aan een nieuwe categorie controles. Deze combineren de kennis van uv over projectafhankelijkheden met het begrip van ty over je code (bijvoorbeeld om ongebruikte afhankelijkheden te detecteren), waar we in een toekomstig bericht op terugkomen.

Tegelijkertijd zetten we onze stappen voort richting de stabiele release van ty.

Bedankt voor het bouwen met ons!

Speciale dank aan Aria Desires, Micha Reiser en Zsolt Dollenstein van het Astral-team voor de implementatie van de functies achter deze integratie.