<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python Developer Tooling Handbook – Ruff</title>
    <link>https://pydevtools.com/tags/ruff/</link>
    <description>The Python Developer Tooling Handbook is a comprehensive guide to Python development tools including uv, ruff, pytest, mypy, ty, and more.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/tags/ruff/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Ruff Already Rewrites Your Python to Be More Idiomatic</title>
      <link>https://pydevtools.com/blog/ruff-already-rewrites-your-python-to-be-more-idiomatic/</link>
      <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/ruff-already-rewrites-your-python-to-be-more-idiomatic/</guid>
      <description>&lt;p&gt;Open any Python codebase that&amp;rsquo;s been through a few hands and you&amp;rsquo;ll find the same fossils: a &lt;code&gt;for&lt;/code&gt; loop adding items to a set one at a time, a conditional slice that could be &lt;code&gt;removesuffix()&lt;/code&gt;, a two-line &lt;code&gt;open()&lt;/code&gt;/&lt;code&gt;read()&lt;/code&gt; that &lt;code&gt;pathlib&lt;/code&gt; handles in one call. The code works. It passes every linter you&amp;rsquo;ve enabled. And a reviewer who knows Python well would rewrite all of it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt; can already do that rewriting. It ported 36 rules from &lt;a href=&#34;https://github.com/dosisod/refurb&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;refurb&lt;/a&gt; into a category called &lt;code&gt;FURB&lt;/code&gt;, and every one of them ships with an auto-fix. Most projects haven&amp;rsquo;t turned them on because Ruff&amp;rsquo;s defaults only enable Pyflakes (&lt;code&gt;F&lt;/code&gt;) and a subset of pycodestyle (&lt;code&gt;E&lt;/code&gt;). The rules that catch non-idiomatic patterns sit behind an opt-in flag, invisible to the people who&amp;rsquo;d benefit most.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Astral Uses Its Own Tools</title>
      <link>https://pydevtools.com/blog/how-astral-uses-its-own-tools/</link>
      <pubDate>Thu, 23 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/how-astral-uses-its-own-tools/</guid>
      <description>&lt;p&gt;Astral runs &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; inside the repos that build them. Their &lt;code&gt;pyproject.toml&lt;/code&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-set-up-pre-commit-hooks-for-a-python-project/&#34;&gt;&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;&lt;/a&gt;, and CI files are public, and a walk through the three shows how the people making ruff, ty, and uv wire their own toolchain into the projects that produce it.&lt;/p&gt;
&lt;h2&gt;Build ty from source and type-check Python with it&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;build-ty-from-source-and-type-check-python-with-it&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#build-ty-from-source-and-type-check-python-with-it&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The ruff repository ships ty as part of its crate tree. Three CI steps build ty from source and run it against the repo&amp;rsquo;s own Python:&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenAI to Acquire Astral</title>
      <link>https://pydevtools.com/blog/openai-acquires-astral/</link>
      <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/openai-acquires-astral/</guid>
      <description>&lt;p&gt;OpenAI &lt;a href=&#34;https://openai.com/index/openai-to-acquire-astral/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;announced today&lt;/a&gt; that it will acquire &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, the company behind &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;. The Astral team will join OpenAI&amp;rsquo;s Codex group after the deal closes, subject to regulatory approval.&lt;/p&gt;
&lt;h2&gt;What this means for Codex&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-this-means-for-codex&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-this-means-for-codex&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://openai.com/index/codex/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codex&lt;/a&gt;, OpenAI&amp;rsquo;s coding agent, has grown to over 2 million weekly active users, with 3x user growth and 5x usage increase since the start of 2026. Acquiring Astral gives OpenAI direct ownership of tools that millions of Python developers already depend on. OpenAI plans to integrate Astral&amp;rsquo;s tools more deeply into Codex so the agent can interact with the toolchain developers already use.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Charlie Marsh on uv, Coding Agents, and the Changing Open Source Contract</title>
      <link>https://pydevtools.com/blog/charlie-marsh-test-set-interview/</link>
      <pubDate>Tue, 24 Feb 2026 12:00:00 -0500</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/charlie-marsh-test-set-interview/</guid>
      <description>&lt;p&gt;Charlie Marsh (founder of &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, creator of &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;) joined Michael Chow and Wes McKinney on &lt;a href=&#34;https://posit.co/thetestset/episode/charlie-marsh-more-productive-but-a-lot-less-fun/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;The Test Set&lt;/a&gt;. They covered uv&amp;rsquo;s adoption strategy, how coding agents are changing Astral&amp;rsquo;s development process, and what&amp;rsquo;s happening to open source when writing code becomes cheap.&lt;/p&gt;
&lt;h2&gt;uv&amp;rsquo;s compatibility layer was the point&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;uvs-compatibility-layer-was-the-point&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#uvs-compatibility-layer-was-the-point&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When uv first shipped, it only had &lt;code&gt;uv pip install&lt;/code&gt; and &lt;code&gt;uv venv&lt;/code&gt;. Some people found this odd. Charlie says it was deliberate:&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv format: Code Formatting Comes to uv (experimentally!)</title>
      <link>https://pydevtools.com/blog/uv-format-code-formatting-comes-to-uv-experimentally/</link>
      <pubDate>Thu, 21 Aug 2025 16:08:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-format-code-formatting-comes-to-uv-experimentally/</guid>
      <description>&lt;p&gt;The latest &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; release (&lt;a href=&#34;https://github.com/astral-sh/uv/blob/main/CHANGELOG.md#0813&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;0.8.13&lt;/a&gt;) quietly introduced an experimental new command that Python developers have been waiting for: &lt;code&gt;uv format&lt;/code&gt;. This addition brings code formatting directly into uv&amp;rsquo;s toolkit, eliminating the need to juggle multiple tools for basic Python development workflows.&lt;/p&gt;
&lt;h2&gt;What is uv format?&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-is-uv-format&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-is-uv-format&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;uv format&lt;/code&gt; command provides Python code formatting through uv&amp;rsquo;s interface. Under the hood, it calls &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;&amp;rsquo;s formatter to automatically style your code according to consistent standards.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Python&#39;s RFC Process Paved the Way for uv, Ruff, and Ty</title>
      <link>https://pydevtools.com/blog/peps-and-astral/</link>
      <pubDate>Fri, 01 Aug 2025 15:22:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/peps-and-astral/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, an independent startup, has taken the Python world by storm over the last few years with three fast, robust Python developer tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; (linter and formatter)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; (packaging and project management)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; (static type checker, still under development)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These tools came from the mind of Charlie Marsh, who is neither a Python core developer nor directed by the Python Steering Council. While being independently developed, these tools work seamlessly within the established Python ecosystem. This success stems partly from Astral&amp;rsquo;s attention to guidelines established by the Python Enhancement Proposal (&lt;a href=&#34;https://pydevtools.com/handbook/explanation/pep/&#34;&gt;PEP&lt;/a&gt;) process over the last twenty-five years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Python Tooling Revolution</title>
      <link>https://pydevtools.com/blog/python-tooling-revolution/</link>
      <pubDate>Wed, 02 Apr 2025 16:48:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-tooling-revolution/</guid>
      <description>&lt;p&gt;Python development is experiencing a tooling revolution thanks to &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. Lewis Gaul&amp;rsquo;s blog examines how these tools are transforming Python workflows with exceptional speed and intelligent design.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;When trying ruff check the benefits were immediately obvious: performance is incredible, provides a superset of the pylint rules, reporting of errors is very clear, configuration is straightforward, documentation is excellent&amp;hellip;and above all else the &amp;ndash;fix flag is a huge win to automatically fix certain rule violations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple, Modern Python</title>
      <link>https://pydevtools.com/blog/simple-modern-uv/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/simple-modern-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://x.com/ojoshe/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Joshua Levy&lt;/a&gt; recently shared his enthusiasm for &lt;code&gt;uv&lt;/code&gt;, Astral&amp;rsquo;s Python package manager, along with a practical template for new projects using this tool. &lt;a href=&#34;https://x.com/ojoshe/status/1901380005084700793&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;His thread on X&lt;/a&gt; highlights both technical advantages and philosophical approaches to modern Python development.&lt;/p&gt;
&lt;h2&gt;Key Points from Levy&amp;rsquo;s UV Template&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;key-points-from-levys-uv-template&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#key-points-from-levys-uv-template&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Levy has created a &lt;a href=&#34;https://github.com/jlevy/simple-modern-uv&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;simple-modern-uv&lt;/a&gt;, &lt;a href=&#34;https://copier.readthedocs.io/en/stable/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Copier&lt;/a&gt; template that combines minimal but essential tools for Python projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for package management&lt;/li&gt;
&lt;li&gt;Incorporates &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; for linting and formatting (replacing Black and isort)&lt;/li&gt;
&lt;li&gt;Includes &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt;, &lt;a href=&#34;https://github.com/codespell-project/codespell&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;codespell&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Provides &lt;a href=&#34;https://docs.github.com/en/actions&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Actions&lt;/a&gt; configuration&lt;/li&gt;
&lt;li&gt;Uses &lt;a href=&#34;https://copier.readthedocs.io/en/stable/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Copier&lt;/a&gt; for template management&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why uv Matters Beyond Speed&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;why-uv-matters-beyond-speed&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#why-uv-matters-beyond-speed&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While uv&amp;rsquo;s performance is impressive, Levy emphasizes that its real value lies in dependency management fundamentals:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effective Python Developer Tooling in December 2024</title>
      <link>https://pydevtools.com/blog/effective-python-developer-tooling-in-december-2024/</link>
      <pubDate>Fri, 20 Dec 2024 19:25:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/effective-python-developer-tooling-in-december-2024/</guid>
      <description>&lt;p&gt;I have been writing Python for 14 years next month. When I started, people were still using easy_install to install egg-based packages for Python 2.7 and nobody had heard about Conda yet, much less uv. The Python tool ecosystem has changed since. Many people are confused by the &lt;a href=&#34;https://xkcd.com/1987/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fragmentation&lt;/a&gt; in the ecosystem, but we have better tooling for Python today than we&amp;rsquo;ve ever had before.&lt;/p&gt;
&lt;p&gt;A friend recently invited me to give a talk to his team about Python tooling. In the presentation, I shared some principles of Python tooling and developer efficiency, some anti-patterns I&amp;rsquo;ve observed, recommended practices, and an opinionated list of tools I like in December 2024. What follows is a summary of that talk.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
