Ruff v0.16.0 – Significant new updates – 413 default rules up from 59 (astral.sh)

326 points by vismit2000 12 hours ago

nickjj 9 hours ago

I updated a ~3k line Python project with this the other day. I was using v0.15.x beforehand. It didn't take too long and the new rules do improve code quality. It caught quite a few things previous versions didn't.

Here's a few commits of changes:

(A whole bunch of manual changes based on its suggestions) https://github.com/nickjj/plutus/commit/9af66d31f98bef841588...

(Re-enable line length) https://github.com/nickjj/plutus/commit/21789f89bbcee37913c1...

(Force _ prefix for unused variables) https://github.com/nickjj/plutus/commit/a272c77b932e1c78558a...

(Auto-corrected by Ruff) https://github.com/nickjj/plutus/commit/6fe69cf88385ebdf9b8c...

woadwarrior01 11 hours ago

Great to see ruff, ty and uv being actively developed, even after Astral was acquired by OpenAI.

appplication 2 hours ago

Tbh I was super enthusiastic about Ty but it’s just so far behind basedpyright I had to switch off it. The lack of checks wasn’t the issue, it was the false positives which were the real dealbreaker. That and it doesn’t have support for baselining, which is such an insanely awesome feature for larger codebases. uv and ruff are incredible though. Maybe someday on Ty.

maratc 10 hours ago

The amount of fascination that people have with these "grammar nazi" bots -- some of them implementing completely arbitrary "rules" and some of them disagreeing with others on what "good" Python code should look like -- doesn't stop to amaze me.

Here's "bad" code:

     important_numbers = {
        'x': 3,
        'y': 42, # Answer to the Ultimate Question!
        'z': 2
    }
Here's what "good" code should look like:

    important_numbers = {"x": 3, "y": 42, "z": 2}  # Answer to the Ultimate Question!
Which completely misses the writer's intent. But did you notice that there are two spaces before the pound now? Also, the quotes are now double because apparently it's somehow more kosher! So much improvement!

The actual problems in the code I work with are not the spaces at the end of line or imports in non-alphabetic order, it's the 10-line list comprehensions that are so long that they're impossible for me to parse. None of these tools catch that. My place used pylint, flake8, black, ruff -- with hundreds of commits on every change. All that energy could be better spent elsewhere.

Majestic121 10 hours ago

The point of the "grammar nazi" bots is to focus on the actual problems: if a bot is deciding about linting, you don't have to waste brain power to discuss it in PRs.

It is what it is, everyone gets the same, shut up and work on what matters.

I'm surprised you consider it a lot of energy spent, I tend not to spend any on this, it just runs automatically on my code and I drop out of pretty much every discussions about linting as it's good enough with automated tools.

I also used to work in places where there was no such tools, and there I had to actually spend time discussing and thinking about linting.

maratc 9 hours ago

In my previous place, discussions on coding style were forbidden in PRs. It worked just fine.

Edit: one could also use single or double quotes in strings, and it didn't anger the grammar nazi bots as there were none.

dewey 9 hours ago

CuriouslyC 8 hours ago

bigmadshoe 6 hours ago

Stitch4223 9 hours ago

Even better: if someone feels like the syntax must be different, they can pick it up at a centralized repository with more people that specialize in syntax.

Afterwards it will affect production code everywhere on the planet. :)

bwhmather 6 hours ago

coldtea 5 hours ago

>The point of the "grammar nazi" bots is to focus on the actual problems: if a bot is deciding about linting, you don't have to waste brain power to discuss it in PRs.

And yet, as per the example, the bot force worse linting decisions, and even pushes towards more bugs (e.g. future readers missing the comment intention since it now applies to all 3).

mrbombastic 5 hours ago

patrick451 3 hours ago

There is no point discussing these minutia, ever. Just ban discussing them in PRs and then you don't need an opinionated bot rife with false positives to "fix" them.

qmmmur 4 hours ago

And yet, a new argument surfaces about whether or not the linking should take place. Some people just like to argue :)

insanitybit 9 hours ago

I've never had discussions about code formatting in PRs, this seems like a made up problem or something that predates my career.

BigTTYGothGF 5 hours ago

pdpi 9 hours ago

microtonal 9 hours ago

time0ut 9 hours ago

petesergeant 8 hours ago

storus 6 hours ago

Dunno, now the workflow is like agent makes code changes, ruff complains, agent fixes complaints at the cost of code bloat, agent makes a PR, another agent reviews the PR, agent makes changes, PR is approved and merged. Nobody reads PRs anymore with the agentic development velocity.

zx8080 6 hours ago

brewmarche 2 hours ago

FWIW, ruff sees your line comment and keeps each item on its line. It only adds a trailing comma and additional space.

It also does not collapse lines when there’s a trailing comma.

Your output seems to be from black. IMO it’s insane to collapse lines when there are line comments.

  $ uvx ruff format --diff formatting.py
  --- formatting.py
  +++ formatting.py
  @@ -1,8 +1,4 @@
  -no_comma  = {
  -    "x": 3,
  -    "y": 42,
  -    "z": 2
  -}
  +no_comma = {"x": 3, "y": 42, "z": 2}
  
  with_comma = {
       "x": 3,
  @@ -12,6 +8,6 @@
  
  comment = {
       "x": 3,
  -    "y": 42, # Answer to the Ultimate Question!
  -    "z": 2
  +    "y": 42,  # Answer to the Ultimate Question!
  +    "z": 2,
   }
  
  1 file would be reformatted
(I intentionally switched to double quotes since that really is a stylistic choice in Python, you can escape in both, and if you use double quotes inside of single quotes ruff leaves it as-is)

zelphirkalt an hour ago

(am not the GP)

I personally like double quotes, because in so many other languages they are for strings, while single quotes are often for other things. But somehow many people have a single quotes obsession in Python. I am guessing, that it is because of ease of typing them on a US keyboard layout.

maratc 36 minutes ago

rsyring 6 hours ago

I've read through all the sub-comments you've left here.

In short, you seem to have a grievance against linters that goes way past reasonable. You assert this example you give is "perfect" below. You also complain linters waste time and commits despite able evidence in the field they do the opposite.

You seem willing to add drama, grievance, and personal bias to what could have been a rather straightforward technical discussion. The sum of which is: linters sometimes make changes to code that I don't like.

I'd encourage you to reconsider what's really important when it comes to team development and try listening more to those around you. You seem overly focused on asserting your opinion instead of having a discussion.

These types of exchanges are usually very unproductive and stressful in a team environment. They are evidence, IMO, of a dev having the wrong priorities. I'd encourage you to step back and really consider how you view craftsmanship in a team dynamic and whether or not you are fighting the right battles.

jeltz an hour ago

There are some really bad linters out there like Rubocop so if they have had experience with those I get it.

colechristensen 5 hours ago

A person just as opinionated as the tool. People who have very strong opinions about formatting in any direction are suspect.

maratc 5 hours ago

maratc 5 hours ago

My issue with your comment is not that it seems to offer unsolicited psychological advice completely out of the blue; it's that it leaves me with an uncanny feeling that it was written by an LLM.

In a thread where I complain about the de-humanisation of my profession by the bots, the irony of having a bot's psychological advice (and so, de-humanising the discussion too) is not lost on me.

rsyring 2 hours ago

wodenokoto 9 hours ago

It’s because you forgot a comma after the last item. If you had kept that the items wouldn’t have been compacted (at least in black, I’ve stopped linking my code because it breaks intends of formatting more often than it helps)

maratc 8 hours ago

Sorry, but I did not "forg[e]t a comma after the last item". I intentionally did not put a comma there. The list of the "important numbers" in my example is already complete and perfect, and is not supposed to ever change. I wanted to emphasise this fact by specifically omitting the comma there, in the hope that intelligent people in the future would get this message exactly as I intended for it to be.

cyberrock 8 hours ago

CuriouslyC 8 hours ago

9dev 8 hours ago

slig 8 hours ago

jbvlkt 10 hours ago

Those tools actually save team energy. Without them any programmer has different opinion on formating, code quality, what is readable etc. You can discuss it endlesly or you can just use ruff.

maratc 9 hours ago

We can replace the endless and useless discussion on how to format code with an endless and useless discussion on what linting tool to use.

Another option would be to leave both topics alone and go on with our lives, improving the product, fixing bugs, implementing new features, and generally giving customers a better product and shareholders more value, while respectfully agreeing to disagree on the issues of style.

jbvlkt 9 hours ago

Hendrikto 9 hours ago

toxik 5 hours ago

I have never discussed code formatting and drive-by changes more than in projects with auto formatters.

jghn 4 hours ago

LaGrange 9 hours ago

Gods forbid I talk to people I work with, learn their preferences, and figure out the way we can accommodate each other. Sounds like such a waste of energy. It’s so much better if we all acquiesce to the preferences of some people neither of works with!

brookst 8 hours ago

jbvlkt 9 hours ago

NeutralCrane 6 hours ago

This seems like a strange hill to die on. Linters don’t consume energy, that’s the entire point. They get everyone on the same standard so that no energy is wasted by anyone on having to discuss, debate, and implement these standards. And yes, there are instances where someone’s non-standard coding style is not a problem. But there are instances where it absolutely can be, and these tools help there.

I’m also not sure I understand the “ My place used pylint, flake8, black, ruff -- with hundreds of commits on every change”. These tools don’t add extra commits. You run them prior to your PR, get them aligned with the linting, and then commit the change you were already going to make. Thats 0 extra commits.

For someone ultimately arguing that there is too much effort spent on people’s coding styles, you are spending a lot of effort arguing about people’s coding styles. These tools are some of the most set it and forget it things around.

maratc 6 hours ago

> These tools don’t add extra commits.

When you replace tool x with tool y, you need to fix your code, because these tools do not agree on what your code should look like, and what was acceptable for tool x simply isn't for tool y.

One of these changes I mentioned brought a massive reformatting of all code base, as the new tool failed 'import' statements unless they were in alphabetical order.

OoooooooO an hour ago

MawKKe 3 hours ago

dirtbag__dad 6 hours ago

> The actual problems in the code I work with are not the spaces at the end of line or imports in non-alphabetic order, it's the 10-line list comprehensions that are so long that they're impossible for me to parse.

100%. Almost all of my time burned navigating code is not hung up on stylistic conventions but on nasty services with inconsistent abstractions and patterns.

BUT, conventions and consistency make code easier to read and write, period. If you’re debating over single or double quotes that’s almost a fireable offense IMO.

Additionally, when you have a culture that delegates to tools as much as possible, the focus sharpens in a healthy way.

tclancy 2 hours ago

> it's the 10-line list comprehensions

I feel for you both working with straw men day to day. I’ve worked mainly in Python for two decades and have neither seen such a thing nor considered, even to be a bastard, doing such a thing.

tipsytoad 5 hours ago

Stylistically ugly code that is globally consistent (ideally across the entire ecosystem) >> locally beautiful code that is inconsistent with the rest of the codebase / up to authors taste. No one likes black formatting, but it’s at least consistent. “Your car can be any color you like as long as it’s black”

With regards to your example, adding a comma to the final element should preserve multi-line. You just don’t know the formatting rules yet apparently

elteto 8 hours ago

The actual rules are less important, only the consistency of applying them is.

I find that people who argue against automatic linting and formatting tend to be the same that would argue incessantly about style. So much wasted energy, I want none of that.

Also, in your example above, if you put the comment on the line _above_ instead of inline the formatter will most likely do the right thing.

maratc 8 hours ago

"A foolish consistency is the hobgoblin of little minds, adored by little statesmen and philosophers and divines."

-- Ralph Waldo Emerson

elteto 8 hours ago

tclancy 8 hours ago

You may do as you like in your projects. You might even find you can make a formatter enforce that rule which is apparently important to you.

But one thing I bring to every team is this: “I don’t want to look at a file and say that is Tom’s code or that is your code. What I want to see is [project name] code.”

maratc 6 hours ago

You want to be a cog wheel, in a company of cog wheels. There's nothing wrong with that. But I want to be an artist, and preferably in a company of artists, having been in a company of cog wheels too many times. Not only it's more fun that way, but also tends to lead to better outcomes.

tclancy 2 hours ago

kstrauser 5 hours ago

amingilani an hour ago

Ruff/black support and enforce this. Just do ‘'z': 2,’

If you add an extra dangling comma at the end of the last item, ruff/black will auto-format to the line-by-line style you like.

zelphirkalt an hour ago

Yep. So far I have found every auto-formatter tool to be hopelessly naive in its workings. No, sorry, I do not want my logger call to stretch over 5 lines of screen real estate, just because the silly tool doesn't allow to distinguish between logger calls and other stuff, and a log message can be > 80 characters. They often make code less readable than before. I am still traumatized from adding trailing comma to every multi-line call, due to black being "opinionated" and always moving things back to one line, making them less readable, if they are not longer than some limit. It's silly.

somat 6 hours ago

Oh man, list comprehensions, that's me. I get inspired, caught up in the flow, write some eldritch horror of a LC. 30 seconds later "What in the name of saint Lovecraft does this even do?" (sighs) Rewrite as a loop. I mean, I guess they are fine in small doses, very small doses, But boy do they read poorly compared to the rest of Python.

I also need something to save me from my regexps, the verbose flag helps a lot. but what would be really nice is some sort of python subset that could compile to the state machine. I would also like composable expressions, that is, composable at the graph level not the string composition we are forced to use. And a pony, I would also like a pony.

As you can tell I am not a fan of APL, not because of what it can do but because of the super compressed syntax it adopts. see also: perl

ckolkey 5 hours ago

Put a comma after "'z': 2" and it will work how you expect, fyi

driverdan 6 hours ago

The other commenters seem to be commenting on style consistency but ignoring your example. Your original format is far easier to read and understand plus the meaning of the comment is lost. IMO you're completely right about this example. Single line dict definitions shouldn't exist. Dicts are far easier to understand and manage when each key/value pair is on its own line, regardless of length.

slowking2 5 hours ago

IIRC, if you put a trailing comma on the last entry, the formatter will keep multiline dicts multiline.

maratc 6 hours ago

Thank you, but I'm afraid I disagree. Single line dict definitions are fine when that's my intent, multilines are also fine when that is, and I trust myself to know when to use one or the other. My problem is with arbitrary rules like "only x-line dict definitions are allowed," for any value of x.

aquariusDue 4 hours ago

strken 6 hours ago

I'm surprised a formatter does that. Prettier in the JS world likes to jam destructured arguments onto one line, but it will leave them alone if there's a comment.

atoav 6 hours ago

Yes sure, but the point of something like ruff is that you don't even think about formatting anymore. It is just done for you and it is done consistently.

vorticalbox 7 hours ago

this is why i like golang these sorts of things just don't matter, go fmt move on with life.

NeutralCrane 6 hours ago

I agree with you, but that is literally what ruff is meant to do, and what this person is arguing against.

OoooooooO an hour ago

Same for rustfmt.

I love gofmt, rustfmt, ruff.

cyberrock 8 hours ago

It's funny to see this comment about Python, which was designed to be a style North Korea. Maybe in a decade we'll see a Go linter and have a good laugh at that.

gchamonlive 6 hours ago

The "bad" code is actually bad imho. The comment explains intent inside the object rather than on the spec, which makes it easy to miss and harder to discover later.

This seems like a case where the tooling is compensating for unclear conventions. Collaboration tools are useful, but it may be more effective to strengthen the code specifications and documentation practices first, so intent lives in a predictable place instead of being scattered through implementation details.

gempir 10 hours ago

I wish Go had something like Ruff! A lot of languages are getting amazing tool but Go has a very fragmented ecosystem with a lot of tools but none of them feel as high quality has the likes of Ruff, Oxc, Biome or even PHP's Mago

gopherino 9 hours ago

It does and it is even better. It is called the Go Analysis Framework (https://pkg.go.dev/golang.org/x/tools/go/analysis).

It is fairly new so not well known but it is what powers go fix and go vet under the hood. And I believe the Go team is currently working on making it possible for module authors to easily describe their own custom analysis passes that would run automatically when running go fix.

It is extremely easy to define your own analysis.Analyzer struct that describes your own static analysis pass. You get access to all sorts of useful information such as the AST, types, even SSA info and you can even compose the information between analyzers. Then you can easily compile it into a binary and run it by passing that binary to go fix with a command line flag. The go toolchain itself handles all the complex caching logic so that your analyzers run fast.

Since it is made by the go team itself and part of the toolchain it should slowly become the unified standard you are looking for. So hopefully golangci-lint and others should eventually all unify under this framework.

You can easily give it a go by telling some AI agent to write some Go Analysis analyzers and telling them to drive them with go fix. My Go projects tend to accumulate a bunch of these to enforce all sorts of rules deterministically and automatically instead of some imprecise markdown file.

gempir 9 hours ago

That sounds amazing! I do hope golangci-lint and the likes pick it up, I'm a big fan of the strict by default approach that Ruff and other linters have taken.

Gofmt is great but it's still not very strict, the amount of times my colleagues have argued about formatting in Go is still too great, stuff like consts, types, funcs, methods order, struct initialziation newlines and other details that do matter, but they should be decided one and then applied everywhere like that.

abcdefg12 12 minutes ago

silverwind 8 hours ago

On problem of such go linters is they can only lint what the compiler sees so if you have multiple `build` tags, you need to run multiple lint passes. No other language's linter operates like they, they all operate on file level.

AbuAssar 8 hours ago

alentred 9 hours ago

Oh wow, not so long ago the sentiment was exactly opposite. Python community was struggling with tools and everyone wished to have `gofmt` for Python.

Granted, this is a linter, not a formatter, but my larger point is I am glad that Python ecosystem evolved like it did recently.

gempir 9 hours ago

Yeah, that's how much Astral changed python. UV and Ruff are amazing tools.

Go can get there, but like I said, I think everyone is building some partial tools that solve some problems, but there is not that one player building that one great tool.

jdrek1 9 hours ago

Ruff is actually a formatter too

Hamuko 7 hours ago

It's not really even that recent of a change. Black's been stable for the past 4+ years.

bargainbin 9 hours ago

I’m not entirely sure what you mean by a fragmented ecosystem? Go has first-party formatting and linting and the language is deliberately restricted to ensure it is written in a certain way, even when written by complete novices.

Compare that to Python or TypeScript which are Wild West languages without opinionated first-party tooling, and it’s clear why Ruff/Biome feel great.

You just wouldn’t get that same high with Go.

gempir 9 hours ago

Go has a good start for that, but It's not enough for me.

Gofmt is a great idea but it isn't strict enough for my taste. Go does not have any first party static analyzers, closest is Staticcheck which is even sponsored by Google themselves

arccy 9 hours ago

aki237 9 hours ago

What? I feel go has one of the best language tooling out there without requiring a bully ide to do stuff. golangci-lint is quite comprehensive. What do you miss otherwise?

(Honestly go's distributing itself has covered a lot of it)

gempir 9 hours ago

golangci-lint is good, but you have to glue together a bunch of linters, and it adds up. You can easily get runtimes of several minutes, there are caches etc but the main problem is that golangci-lint doesn't own the lints, so it will never be as fast as something like Ruff.

Thaxll 8 hours ago

Golang-ci exists for a while and everyone is using it.

Not sure what you're talking about.

gempir 8 hours ago

I've been using golangci-lint for years, it's okay but it's slow even with a cache, as soon as you have good amount of lints enabled your ci can suddendly take minutes.

That's not the fault of golangci-lint, it's just the concept of bringing together a bunch of different linters and keeping it fast is impossible. And the configuration is a bit wild too, because every linter obviously has their own decisions on how it wants to be configured.

Ruff can lint in seconds or even sub second.

silverwind 8 hours ago

It's like 100 times slower than ruff. They had to massive caching techniques to get it to a remotely acceptable speed.

hyeongjun 10 hours ago

Good news. enabling 413 rules by default means most projects get useful linting without touching the config at all!

embedding-shape 10 hours ago

Maybe it's just me, but getting overrun with "413 x potential warnings" hardly sounds useful :) Great for greenfield, less so for existing projects. Although nowadays, fire up your agent with "/goal work through and address all lint warnings by fixing the code according to XYZ" and leave it alone for a couple of hours and I guess it's no longer an issue...

Don't get me wrong, the new level of details coming from Ruff is much appreciated and a good thing :)

biorach 8 hours ago

> uv run ruff check --fix

Generally gets you 90% there.

apelapan 8 hours ago

vasachi 8 hours ago

jon-wood 5 hours ago

I really wish Ruff would introduce something similar to Nix’s stateVersion, which is used to determine the set of defaults that will be applied. Updating Ruff at a scale beyond a single repo is a bit of a crapshoot currently, with every version introducing a bunch of new default rules which you then have to deal with immediately (either by turning them off or fixing them).

I’m aware we could have an allowlist in place which specifies all rules that are turned on but I’d much rather have a simpler config file, and be able to bump the state version at a good time for everyone to spend a few hours fixing new violations.

gcarvalho 38 minutes ago

> with every version introducing a bunch of new default rules which you then have to deal with immediately

According to the original post

> Ruff's default rule set was last modified in v0.1.0

Which was over 2 years ago.

https://github.com/astral-sh/ruff/releases/tag/v0.1.0

mirashii 5 hours ago

I think the consensus is that this would be the wrong end to tackle the problem from. Your project should include ruff at the version it wants to use in its pyproject.toml. Bump the version when you're ready to spend the time on one project, but no need to coordinate across multiple projects. If you really want to do it, you can, but if there's one hold-out, you're not stuck behind forever because one project can't move yet.

aomix 8 hours ago

If you listen closely you can hear the thousands of CI jobs that just pull latest UV failing all at once.

kstenerud 11 hours ago

This is great news! With the advent of agentic coding, strong linting is more important than ever. What I'd really like to see is forbidigo for more languages.

alentred 10 hours ago

100% agree, I am upgrading my projects now. And yet, I have mixed feelings about this. I like to think that when I (was) writing code myself, I applied a great deal of intuition to decide when to skip or ignore some rule. On the hand, I also saw projects were developers where using pylint with most rules enabled and I have to say the code was not better - on the contrary it had plenty of hacks to make pylint happy at the cost of illegible code.

Not unlike that experience, I also saw coding agents spend lots of tokens trying to fix a benign issue, as well as doing the opposite - like disabling the tests !!! when they don't pass. :facepalm:

I grew to trust AI results in terms of overall correctness, but I still have hard time trusting their *judgement* on the *code quality*.

luciana1u 9 hours ago

413 rules and somehow every codebase I join still has the same three arguments about import sorting

hackerbrother 9 hours ago

Looks like it's recommended to use zero-config now, which is great! My new .ruff.toml is just:

  line-length = 300

westurner 2 hours ago

TIL RustPython uses Ruff's AST which is fast.

LibCST can modify the AST/CST to do python codemod, now in Rust too;

rustpython-ruff_python_parser: https://crates.io/crates/rustpython-ruff_python_parser .. https://github.com/astral-sh/ruff

LibCST: https://github.com/Instagram/LibCST

mikeydiamonds 8 hours ago

Default on lint is good for agent fleets. fwiw, I watched one agent "fix" an unfamiliar rule by deleting the test; perfect compliance, tiny misunderstanding.

vanyaland 10 hours ago

ran 0.16 on a file with no config, it flags unsorted imports and `except Exception` by default now

anticodon 6 hours ago

You know how many bugs I've met working on large Python codebases over 20 years, caused by unsorted imports or `except Exception`? Yeah, you've guessed it: exactly 0 bugs.

It's really annoying how many people think that if you enforce stupidly strict rules about formatting, more strict that those of Fortran in 70s, you'll automatically get good code.

I've seen companies that enable 100% of ruff rules, use several other linters, and enforce other rules (like every variable name should be at least 20 characters long to fully describe its purpose). And they have awful buggy unmaintainable code. But it is nicely formatted (although reading code where half of the screen estate is consumed by the variable name is a bit difficult) and has no "dreadful" `except Exception`. Or every mutable class attribute variable is annotated with `typing.ClassVar` (RUF012 - the most idiotic rule I've ever seen). Nevermind that it doesn't really stop anyone from changing value of that attribute. You must annotate it with `ClassVar`!

It's an idiotic cargo-cult.

BigTTYGothGF 4 hours ago

I think it should depend on if it's `except Exception` (don't use) or `except Exception as e` (probably fine, as long as you log `e` or do something else with it).

IshKebab an hour ago

I don't think people expect import sorting to fix bugs. It's just good (and free!) practice.

Anyway I have definitely had linters like Ruff catch bugs. Probably the most common is the mutable default argument gotcha.

bbor 10 hours ago

  Ruff v0.16 has a small number of breaking changes
Why. Why must my poor semver be hurt so!

I sorta kinda get why `ty` is pre v1.0.0 -- it's a typechecker that doesn't check a huge number of types. But what are we waiting for with `ruff`? Surely it's eaten whatever the old options were (black? maybe a few takes on py+lint?) by now many times over, and is even more dominant than `uv`.

I run this program hundreds of times a day so I'm generally excited for new features, but I guess the OAI acquisition has made me ornery when it comes to these folks. Apologies to kindly nerds who made this release happen, and congrats <3

microtonal 9 hours ago

Why must my poor semver be hurt so!

It is fully according to their versioning policy:

https://docs.astral.sh/ruff/versioning/

But also compliant with semver:

Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.

https://semver.org/

(Maybe I misinterpreted your remark, but semver does not get hurt.)

colinmarc 10 hours ago

It's conventional for semver to allow breaking changes for 0.x minor releases (but not for patch releases).

jakobnissen 9 hours ago

Yes but the question is why Ruff has not released v1 yet. They’re clearly used in production and the entire purpose of v0.x is to signal a project is early in development and is expected to have coarse edges.

ameliaquining 7 hours ago

Leynos 8 hours ago

Zerover for life

assimpleaspossi 9 hours ago

I find it somehow interesting that a tool for Python is written in Rust.

lijok 2 hours ago

What languages are python interpreters written in?

fn-mote 8 hours ago

Interesting but not surprising in an application where speed matters.

IshKebab 8 hours ago

It's the same for JavaScript. Rust is the better language (especially for large projects like these), but sometimes you don't have a choice but to use Python or JS/TS.

Hamuko 7 hours ago

Wait until you hear what CPython is written in.

latent-9 7 hours ago

this is writing 3000 lines in this era you must be a normal human being

blks 7 hours ago

Every new single piece of software calls itself “extremely fast”, “blazingly fast”, it gets tiring.

cpburns2009 3 hours ago

Broadly you have a point. In this case I would expect a Rust-based Python linter to run significantly faster than one writen in Python itself (e.g., pylint).

frumiousirc 6 hours ago

ruff is not new. It's also truly really fast. On an as-yet un-ruff'ed 32k SLOC python package it returns in 158ms finding 2k errors. Having it fix errors is also very fast.

What's really tiring is reading such facile "critiques", especially when they are not even applicable.

BigTTYGothGF 4 hours ago

Compare it to some of the other options in that space and you'll see why that was a selling point.