Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#476: Common themes

Published Mon, Apr 6, 2026, recorded Mon, Apr 6, 2026
Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsored by us! Support our work through:

Connect with the hosts

Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 11am PT. Older video versions available there too.

Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.

Brian #1: Migrating from mypy to ty: Lessons from FastAPI

  • Tim Hopper
  • I saw this post by Sebastián Ramírez about all of his projects switching to ty
    • FastAPI, Typer, SQLModel, Asyncer, FastAPI CLI
  • SqlModel is already ty only - mypy removed
  • This signals that ty is ready to use
  • Tim lists some steps to apply ty to your own projects
    • Add ty alongside mypy
    • Set error-on-warning = true
    • Accept the double-ignore comments
    • Pick a smaller project to cut over first
    • Drop mypy when the noise exceeds the signalAdd ty alongside mypy
  • Related anecdote:
    • I had tried out ty with pytest-check in the past with difficulty
    • Tried it again this morning, only a few areas where mypy was happy but ty reported issues
    • At least one ty warning was a potential problem for people running pre-releases of pytest,
    • Not really related: packaging.version.parse is awesome

Michael #2: Oxyde ORM

  • Oxyde ORM is a type-safe, Pydantic-centric asynchronous ORM with a high-performance Rust core.
  • Note: Oxyde is a young project under active development. The API may evolve between minor versions.
  • No sync wrappers or thread pools. Oxyde is async from the ground up
  • Includes oxyde-admin
  • Features
    • Django-style API - Familiar Model.objects.filter() syntax
    • Pydantic v2 models - Full validation, type hints, serialization
    • Async-first - Built for modern async Python with asyncio
    • Rust performance - SQL generation and execution in native Rust
    • Multi-database - PostgreSQL, SQLite, MySQL support
    • Transactions - transaction.atomic() context manager with savepoints
    • Migrations - Django-style makemigrations and migrate CLI

Brian #3: Typeshedded CPython docs

Michael #4: Raw+DC Database Pattern: A Retrospective

  • A new design pattern I’m seeing gain traction in the software space: Raw+DC: The ORM pattern of 2026
  • I’ve had a chance to migrate three of my most important web app.
  • Thrilled to report that yes, the web app is much faster using Raw+DC
  • Plus, this was part of the journey to move from 1.3 GB memory usage to 0.45 GB (more on this next week)

Extras

Brian:

Michael:

Joke:

Episode Transcript

Collapse transcript

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:05 This is episode 476, recorded April 6th, 2026.

00:12 So many sixes, Brian.

00:13 I'm Michael Kennedy.

00:15 And I'm Brian Okken.

00:15 And this episode is brought to you by us.

00:17 We have all sorts of awesome things to help you get better at Python, testing and so on.

00:23 Check the show notes.

00:25 Subscribe to the newsletter.

00:26 We've got a bunch of cool things we're sending out there.

00:28 And every week, one of them, every week is a nice, extra rich summary of what we talked about, what we're covering, but also additional places to find more materials.

00:39 So you can get a little bit of the background information.

00:42 Like we might talk about, oh, here's how you do this thing in CI.

00:45 But maybe the newsletter also includes details of getting started with CI and other things like that.

00:50 And that's all thanks to Brian.

00:51 So thank you for that.

00:52 With that, you know, let's migrate it over to Brian's topic.

00:56 What's up?

00:57 I am talking about Ty migration.

01:00 So Ty, T-Y, the Astral Project for type checking.

01:04 Have you used it?

01:07 I am using it actively.

01:09 Yes.

01:09 I love it.

01:10 Okay.

01:10 So it's the speed thing.

01:13 So Ty's all Rust.

01:16 So it's way faster than a lot of other stuff.

01:18 Firefly is Rust also, but Ty's still faster.

01:21 I think Firefly is Rust.

01:22 It is, I believe.

01:23 Yes.

01:24 Okay.

01:24 But it's not, Firefly is not noticeably laggy.

01:30 But mypy is.

01:32 And mypy is definitely something I use in CI.

01:35 But anyway, well, I'm bringing this up because there was a post by Sebastian Ramirez, and I just went away from it, that all of his Python projects like FastAPI, Typer, SQL Model, Async, or all of that stuff.

01:51 It's all just using, it's all using Ty now for the primary type checker.

01:56 And so I'm thinking, and I had tried on for a couple of projects, and it was a little bit pickier than I expected.

02:04 So I tried it again.

02:06 So I went ahead and migrated pytestCheck to use Ty, and I'm kind of doing a similar model, and it's going well.

02:14 So anyway, he migrated that stuff, and then Tim Hopper wrote a blog post called Migrating from mypy to Ty, Lessons from FastAPI.

02:25 And it's a pretty fun walkthrough of some of the things because it's really pretty easy to migrate.

02:34 So the idea around it, I'm going to skip down to the end because he's like, well, if you want to do this yourself, what should you do?

02:42 Add Ty alongside of mypy.

02:44 And that's what I'm doing with pytestCheck, doing both mypy and Ty.

02:49 Actually, I've got them as two different talks, runs, sections to run them separately.

02:56 But locally, I'm just running Ty because it's so fast.

03:00 It's like it runs and it's done, whereas mypy, I have to wait a few seconds.

03:03 A few seconds, not a big deal, but it makes it so that I don't run it as much.

03:08 Anyway, add Ty alongside mypy.

03:11 There's one setting that I turned on because of this article of errors on warning.

03:17 So there's some Ty warnings that show up and they don't stop a Sierra run, but I want it to.

03:25 I want to have it completely clean with no warnings.

03:27 So you can set error on warning is true.

03:30 If there's parts where you have to comment out, like you have to ignore certain lines for some reason, the annoying part right now is that you have, and I'll go back up to this discussion up here,

03:43 is that you have to do two.

03:46 So the ignore line for mypy is different than Ty in some of these.

03:52 So that is a bit annoying if you're supporting both.

03:56 But apparently it got better in Ty 0.0.25.

04:01 Oh, come on, guys.

04:02 You got to like, anyway.

04:04 Those zero-vers are just killing me.

04:05 That's a very, very, very zero-ver.

04:09 0.0 is the version.

04:12 But support's a better way to say ignore these sets of things.

04:16 Apparently that works.

04:18 So anyway, check out the model if you want to have ignores.

04:22 I don't actually have, I think I have a few ignores, but not too many.

04:26 And a lot of them are because I intentionally try to do something bad to simulate an error.

04:32 Okay.

04:33 So how it fits in the workflow also, it's really easy to run, all that stuff.

04:38 It's great.

04:39 Okay.

04:39 Let's get him back.

04:40 So you accept the double comments and then pick a smaller project.

04:44 And whereas like on the FastAPI world, SQL model is now completely Ty only and doesn't use mypy apparently.

04:52 So drop mypy when the noise exceeds the signal.

04:57 So, right.

04:58 So the SQL model had too many, like it wasn't worth having supporting both because of all the different ignores and all that stuff.

05:05 I'm currently, I've had so many people request mypy support for pytest check.

05:11 So I'm not planning on dropping it anytime soon.

05:14 And for a lot of packages, I believe that's probably going to be the case of people just supporting both for a long time.

05:21 And one of the really unfortunate things about how Python typing works, there's a lot of good things about it.

05:26 So don't call me a hater.

05:28 But one of the really unfortunate things is even amongst ty and Pyrefly, there are different conventions and warnings and things that count as errors and things that don't count as errors.

05:38 Things that are checked and things that are not checked.

05:39 And so if you have a project that needs to support two, both or more, you've got to put all of them in there.

05:47 You've got to deal with cases where your type checker says everything's fine, but someone else type checker doesn't think it's fine.

05:55 You're like, are you serious?

05:56 Like the most ridiculous version of this is for one of my templating packages.

06:03 I can't remember which one, like chameleon partials or flask chameleon.

06:09 One of those where it like lets you do something with the, or maybe Jinja partials.

06:14 I can't remember.

06:15 But somebody was doing something with flask.

06:17 And when you put the decorator onto a view that the web framework calls, it changed the signature in a very subtle way.

06:26 And the signature is extremely complicated at the definition level.

06:30 I mean, it's like multiple lines of what the warrant of the signature problem was, you know, not just like expected in, but it was really a lot of like stuff going on there.

06:39 And it said that that was wrong.

06:40 I'm like, who cares?

06:41 No one's ever calling it.

06:42 Like no one calls a view function.

06:44 It didn't, nobody gave it a definition that it's this big complicated thing, but somehow the framework, you know, like it was just, I think the something about the app.get decorator expressed a type and then it changed that type.

06:58 But who cares?

06:59 Cause it's still ran just fine.

07:00 So it was like, I had to go and spend hours reworking the signature of that thing to get it just right.

07:07 So, so Pyrite would stop giving me a warning where I never even use Pyrite.

07:11 I'm like, why am I spending my Saturday morning doing this?

07:13 That's dumb.

07:14 But people were using it.

07:15 They would just get like loads of error.

07:17 Like every viewpoint in their Flask function would have an error in Pyrite.

07:21 Right now I have stuff in my code where it's got ignore statements for Pyrefly.

07:26 But if I load it up in ty, ty gives me a warning that the ignore statement is unneeded.

07:31 I'm like, it's not unneeded for you, but it's unneeded for that.

07:34 Like, are you, anyway, this is why I say that.

07:39 Like, it's just, it's a, it's a struggle.

07:41 And if you create a library to your point, then you've got to put yourself in the situation where like, you don't have to work for a type checker that you choose.

07:49 You work for everyone's type, all the type checkers.

07:51 Cause whatever anyone may choose will become applied to your usage.

07:55 Right.

07:55 In their project, which is anyway.

07:58 Rant over.

07:58 Yeah.

07:58 Luckily I haven't had too many issues with, after, after supporting my Pi, that was the big one.

08:04 I think more people are using my Pi than anything else, but I think we'll see a shift.

08:08 One of the things that I did want to call out also related to this is ty, ty, whatever you call it.

08:17 Charlie says it's pronounced ty.

08:18 ty.

08:19 ty did catch one problem in pytest-check that I was like, oh, this, this, well, it's a hidden possible problem.

08:28 And I just, this is quick, but I have support for pytest versions and, but I have runtime behavior that changes based on version because of, because of when pytest added features.

08:41 so I was expecting, this version tuple to be integers and just comparing like, you know, is seven Oh three seven Oh, less than or equal seven Oh, sort of a thing.

08:52 But the version tuple can be a string and ty caught that.

08:57 And so I have, some code that I've converted to using, a thing called packaging.

09:03 It's a packaging project.

09:04 Packaging.version has a parse function and, and parse just creates an object that's comparable so that you can do, this whole version one equals less than or equal version two.

09:16 So, and you, yes, you can probably write this function yourself, but why bother?

09:21 It's right here.

09:21 It's supported.

09:22 use it.

09:23 So anyway, very nice.

09:25 Okay.

09:26 Next topic.

09:27 Next topic.

09:28 I want to talk about a ORM built in rust.

09:32 Very interesting.

09:33 So this is basically an instead of Django ORM, which I think is really interesting.

09:40 There's a lot of ORMs out there that are like, this is a great ORM.

09:43 You can use it for anything except for you can't use it for Django.

09:46 Sorry.

09:46 Bye now.

09:47 Why can't you use it for Django?

09:48 Because Django so deeply cares about the models using the models to drive other things.

09:54 The models generate forms.

09:55 The models generate the admin.

09:57 The, like the models and the way that ORM works in Django is kind of like what makes Django, Django.

10:04 Like if you don't care about any of that stuff.

10:06 Why are you using Django?

10:06 Pick a micro framework, you know, whatever.

10:09 Right.

10:09 The reason you choose Django is because it has all these Lego blocks that you can use.

10:13 Right.

10:14 Okay.

10:14 So this one called Oxide ORM, believe it is a, it's got to be written in Rust given that name.

10:21 But what it is, it is a type safe, identic centric async ORM with a high performance Rust core.

10:29 And it's inspired by Django.

10:32 It's not necessarily, it doesn't necessarily sell itself explicitly replacing Django, but I will tell you why I made this call back in a second.

10:39 So, Hey, this is a young project.

10:40 Just heads up.

10:41 So, you know, heads up.

10:42 This is a young project.

10:43 I bet it has a higher version than ty, but nonetheless, it's got basically the same syntax as Django, model.objects.filter, et cetera.

10:52 It has full Pydantic V2 validation.

10:55 So in this world, you create your models using Pydantic, right?

10:59 Which has all the Pydantic goodness.

11:01 We're going to come back to talking about this kind of stuff as well.

11:04 Okay.

11:04 But very cool to be using Pydantic for the data access classes.

11:10 It's also async first built on modern Python, asyncio, Rust performance, SQL generation and execution is native in Rust.

11:19 So like one of the things you got to do is, okay, you gave me a model called customers, which is a Pydantic class.

11:24 What does that mean in terms of a SQL query when you say dot city equal equal, whatever, right?

11:31 That kind of stuff.

11:32 Multi-database support, of course, transactions, migrations, Django style migrations and a migrate CLI.

11:38 So you can see it's like trying to be the ORM for Django without explicitly saying not quite.

11:42 If you look at performance, there's a couple of things.

11:46 Higher is better here.

11:47 Let's just take the Postgres.

11:49 With Oxide, it's 1,475 requests per ops per second versus Tortoise, which is 888.

11:56 Piccolo, 930.

11:59 Django, 730.

12:01 So just almost exactly 2x of Django and 4x of SQLAlchemy, 4x of SQL Model.

12:08 I mentioned, you know, tie back there.

12:09 And holy moly, PeeWee is at 80 versus 1,400.

12:13 So that's pretty wild.

12:14 And then obviously all the type checking, you know, they've got this query of like, hey, here's how you would do a really long, complicated query in both in Django and Oxide.

12:23 The only difference, literally the only difference in these, you know, probably a 90 line, 90 character 90 column rather, same thing, 90 column query on the ORM.

12:34 The only difference is the await keyword because it's async, which is pretty sweet.

12:38 So yeah, good stuff.

12:39 Now back to Django a little bit more.

12:42 It has Oxide Admin.

12:45 So Oxide Admin is auto-generated admin panel for Oxide ORM with zero boilerplate.

12:51 So it's got all the Django type of things here.

12:54 And what's interesting is it's for FastAPI, Litestar, SanicCore, and Falcon adapters.

12:59 Does it not have Django support?

13:01 It's just Django-like.

13:02 I think it might not actually even integrate with Django, but it gives you the Django style, right?

13:07 It gives you the admin, gives you the migrations.

13:10 It gives you the query syntax that's identical.

13:14 I bet you could use it with Django somehow.

13:16 Anyway, here it is.

13:17 That's pretty cool.

13:18 Yeah.

13:19 Yeah, yeah.

13:19 Pretty cool.

13:19 It's always on the lookout for these interesting data access libraries that are creative, bring something new without, you know, being too weird, I guess.

13:28 Yeah.

13:29 So anyway, Django oxide, or oxide ORM, not Django oxide.

13:33 Oxide ORM.

13:33 Check it out.

13:34 All righty.

13:36 I actually, I've been thinking about types.

13:38 So I'm going to go back to types.

13:40 We have this theme, but we're just going to talk about the same thing for whatever our theme is.

13:44 Yours is types.

13:45 Go.

13:45 Types today.

13:47 So this suggestion comes to us from Emma Typing.

13:50 So I think Emma cares about typing also.

13:53 Very cool.

13:54 She says a very cool project, which realizes something I've wanted for a long time, documentation for Python with type shed types.

14:03 So what are we talking about?

14:05 I did a comparison of side by side.

14:07 So if we take a look at like the function, the docs.python.org at the built-in functions, you get like ABS, like absolute for absolute.

14:18 And it takes a number.

14:20 But what type is number?

14:21 Well, this new project has, has the same, it's basically the Python docs, but with types.

14:27 So how, how that function signature would look with types.

14:32 And this is all from type shed.

14:34 So, the project, that we're shouting out to is, well, it's a, it's a GitHub.io thing, but, it's an open source called type shedding CPython docs, a tool for, to find

14:48 missing type shed stubs and generate type annotated CPython docs.

14:52 So it takes the CPython docs and annotates them with types.

14:56 It's pretty cool.

14:57 if you, if you're looking at some of the, some of the internal stuff, and it, it's all doing, it looks like it's using Pyrefly, to generate some of these things.

15:07 Maybe, I don't know, but.

15:08 Interesting.

15:09 Okay.

15:09 That's pretty, that's pretty much it.

15:11 just as, if you want to look at anything in the docs, but with types, there you go.

15:16 like what is a slice take?

15:18 Oh, slice takes, you know, well, it's going to be like.

15:22 It's an any, any, not too much.

15:24 Any, any.

15:24 that.

15:26 But there's somewhere probably, interval of or something.

15:29 Who knows?

15:30 Yeah.

15:30 So.

15:31 Pretty cool.

15:31 I like this idea.

15:32 That's great.

15:33 I think these, these kinds of things are powerful too, because especially if you're doing any sort of AI thing, you would say, you know, you ask, is it do something that's like, what are you doing?

15:40 You have no idea thing.

15:42 Read the docs or check this out or I'm going to, you know, and if it has type information that really gives it a lot more to work with.

15:48 Yeah.

15:48 And also because like, that, that the docs, the Python docs are really for us, but type shed is really not for us.

15:57 So the kind of the idea to combine the information in type shed and present it as the docs, it's pretty kind of, it's kind of a clever thing.

16:06 So.

16:06 Yeah.

16:06 It's very clever.

16:07 And also if you're doing something kind of like something built in, you can look at, you know, look at what the types are with that and try to match it.

16:14 Yeah.

16:15 Definitely.

16:15 All right.

16:16 Shall we keep with our theme or yeah, of, of theme swapping.

16:20 So yeah, like to just keeping the theme going.

16:22 So I want to talk about databases some more.

16:24 Okay.

16:25 And, and ORMs, but from a different perspective this time a little bit in the sense that I wrote an article, the article I want to talk about is raw plus DC database pattern, a retrospective.

16:37 This is, this is pretty interesting, but in order to talk about, let me just talk about the design pattern that I published real quick.

16:44 So people maybe didn't read that article or they didn't listen a couple episodes ago or something.

16:48 Right.

16:49 So my thesis is there's a couple of reasons why depending on maybe smaller ORM libraries, it's not that great of an idea necessarily.

17:00 One is if that thing goes unsupported, you've got a good chunk of your application and a foundational portion of it that is tied to this potentially unsupported thing.

17:11 So make that concrete Talk Python Training.

17:14 When I created it, it was based on Mongo engine and that was a up and coming super nice query syntax.

17:20 Also models exactly the Django ORM by the way, by oxide, like oxide ORM.

17:26 So a lot of the queries in there looked very much like they were Django, but they were object-based going to MongoDB.

17:32 Right.

17:33 So that's great.

17:34 But fast forward 10 years and that thing's had a couple of releases that like changed the read me in five years.

17:41 Like, and for reasons, maybe I'll get to later, like another episode is I wanted to switch this to async.

17:49 I wanted to switch Talk Python Training to async, but this older ORM library was not ever, ever going to move to adopt an async model.

18:00 Right.

18:00 Even if it doesn't throw away its synchronous model, like have an async option.

18:04 Like, no, I mean, if it's all that's happening is like a couple of read me's are getting updated.

18:08 There's no, there's no way they're rewriting the whole thing to be async.

18:11 You know what I mean?

18:12 Yeah.

18:12 And it's a, it's also probably a scratch your own itch sort of thing.

18:15 If they, if the current project does what they needed to do, why, why update it?

18:19 Yeah.

18:19 And they're not obligated to, but I'm also not obligated to keep using it.

18:23 Right.

18:23 Yeah.

18:24 So that was, that's number one is like, is there a more stable base and the stable basis, whatever the core database driver package is.

18:35 In this case, it's PyMongo, but you know, could be just the core one from the Postgres team talking to Postgres with Python.

18:43 Right.

18:43 Like that's what all these ORMs are based on often anyway.

18:46 I mean, oxide ORM is not quite, probably based on the Rust version that the Postgres team provides or whatever.

18:52 Right.

18:52 So something like that.

18:53 So that's one.

18:54 The other one, the raw part has to do with this theory that I have that talking to, when you're working with agentic AI, they know frameworks, but what they really know super well is the foundational stuff.

19:07 Like they probably know SQL model, but they really know SQL, you know?

19:12 Yeah.

19:12 They probably know Mongo engine a little bit, but they really know just queer, like raw MongoDB queries.

19:19 And so that's the idea is like, like, what if we just had a data access layer that was just raw queries and it returned some kind of rich classes like data classes.

19:30 Now, before people email me, cause I've talked about this on Reddit and like three fourths of the comments were, why aren't you using Pydantic?

19:36 You could use Pydantic here.

19:38 Do you know that you're using data classes when you could use Pydantic?

19:40 You have no type.

19:41 Like, yes, sure.

19:42 You want to call it raw plus Pydantic and use Pydantic instead is literally the same thing.

19:47 You're totally welcome to do that.

19:49 Right.

19:49 I just wanted something simple.

19:50 I found like I, my dream of Pydantic, like in Beanie and other, these ORMs or SQL model is you've got this ORM and it returns Pydantic models.

20:00 And maybe you've got FastAPI and you could just like take the thing straight from the database and send it out over the API.

20:06 And how amazing would that be?

20:07 I'd not almost never was able to take the database model and return it directly as an API response.

20:16 And so you're always like transforming them anyway.

20:19 And so I ended up showing like, I just don't need, I don't need a Pydantic all the way down.

20:23 Like Pydantic at the boundaries was good for me.

20:25 Okay.

20:25 So all that's so I can tell you about my retrospective.

20:29 So I wrote up this thing where I rewrote Talk Python training.

20:34 Now Python Bytes is already using this, so it already gets this benefit.

20:37 But I did this for Talk Python training, the courses.

20:41 I said, well, let me just put it into practice and see how it goes and if it's any better.

20:45 So I came with pictures, Brian, look at these pictures.

20:48 Mongo Engine, the raw plus DC pattern.

20:51 It's almost 2x more requests per second for the same hardware, the same everything else.

20:56 Just switching this out.

20:58 And the bonus is you get a much more stable library to program against.

21:02 And AI is really good.

21:04 If you say, hey, AI, hey, Claude, create me an update function to do this thing.

21:09 And it can do that better, right?

21:11 It has a more, much, much, much, much more training information to do that with.

21:15 And you get 2x performance.

21:17 And even when you're doing 2x the number of requests, you still get quite a bit faster response time.

21:23 That's pretty cool.

21:24 Yeah.

21:24 Pretty neat, right?

21:25 Yeah.

21:25 And you scroll down.

21:26 Another bonus is actually about 10% less memory usage as well.

21:31 That's good.

21:32 Because apparently the ORM and the classes that it uses and the tracking and whatever just hangs on to junk more.

21:38 I don't know.

21:39 I mean, I'm still using classes, right?

21:41 But for whatever reason, it's just quite a bit less memory usage.

21:44 So I think that's turning out to be a pretty promising way to go.

21:48 And yeah, expect more about this stuff later.

21:51 So I can't resist.

21:53 If you've already considered data classes, have you considered adders instead?

21:59 Thank you.

22:00 I want something built in.

22:03 I want something with fewer dependencies.

22:05 Data classes are built in.

22:06 Pydantic and adders are both separate packages, right?

22:11 Yeah.

22:11 The benefit for choosing adders has to be big enough that it justifies taking on another dependency.

22:18 So I talked about data class of wizards.

22:20 So for this kind of stuff, I'm like, if I need to read and parse and validate data, I'm doing data class of wizards along with data classes.

22:26 But people are certainly welcome to choose adders.

22:29 They're welcome to choose Pydantic.

22:30 They all work good in this model.

22:32 Well, and especially to give other people their due for projects that already have Pydantic for other reasons, that makes sense also.

22:43 Yeah, yeah.

22:43 Absolutely.

22:44 Absolutely.

22:45 All right.

22:46 All right.

22:47 How extra are you feeling?

22:48 I've got one extra.

22:50 All right.

22:51 Tell us.

22:51 Just this weekend, I released a 0.5 release of the, I know I haven't talked about this much lately, the Lean TDD book that I was working over the fall and over, I guess, over Christmas.

23:06 But it's, I went through, I'm preparing to read it.

23:10 So I want to release it as an audio book.

23:11 And so in preparing for that, I have almost completely rewritten it.

23:17 It's restructured, and I think it's a lot nicer.

23:21 Now, that said, I'm still working on it.

23:24 So I think it's really solid now.

23:26 I think it's a good resource to go ahead and run with.

23:31 But I'm doing a third pass through right now with some comments from some trusted readers.

23:39 And, yeah, anyway, there'll be some expansion, but not, I don't think, a huge direction shift in the future.

23:46 Because I really want to get this done and wrapped up.

23:48 But anyway, I'm pretty happy with this state right now, Lean TDD.

23:52 And, yeah, if you're interested, let me know.

23:57 So that's it.

23:58 Awesome.

23:58 Congrats.

23:59 Getting there, huh?

24:00 Yeah.

24:01 I want to get this done.

24:02 Yeah, indeed.

24:02 All right.

24:03 Let's see if I can not be jumped on by the un-auto-hiding of Vivaldi.

24:08 So I want to talk about HiTest Just from Michael Booth.

24:12 This is a really quick extra thing I want to give a shout-out to.

24:15 Cool.

24:15 And Just, you covered this a while ago.

24:17 It's just a command runner, one of those sort of circular references type of thing.

24:22 It's kind of like Make, kind of how I see it.

24:25 You know, you've got some files.

24:26 It tells you how to build things or test things or whatever, right?

24:30 Like, was syntax inspired by Make?

24:32 There you go.

24:32 So Make is kind of long and gnarly and Just is more YAML-ish and cleaner, I think.

24:38 I don't know.

24:39 Anyway, it's a cool way to sort of structure automation for your projects, right?

24:46 So a shout-out is...

24:47 It's just lovely to work with if you haven't tried it yet.

24:51 Yeah, I like it.

24:52 So Michael Booth created a pytest-Just plugin.

24:57 And it's a plugin that adds session-scoped Just fixtures to pytest so that you can test a Just file contracts directly in your test suite.

25:07 So it lets you test, like, really nice things like just assert there exists a CI, a CI section.

25:14 And that CI has a test.

25:16 And it depends on test following the transitive dependencies of it and so on.

25:21 So anyway, I thought that was kind of cool.

25:23 So if you do stuff with Just and pytest, check out pytest-Just.

25:28 Cool.

25:29 All right, this next one needs a disclaimer before I go into it.

25:33 I was not going to put...

25:34 I was not going to talk about this, Brian, because I don't want to...

25:37 You know, it's just not like TMZ bytes.

25:40 Python bytes.

25:41 There's a lot of drama here.

25:42 But I think it's pervasive enough that I think we should put it on people's radar.

25:46 So I'm not here...

25:48 What I'm about to describe, I'm not here to take sides in.

25:50 I'm not here to, like, bad light on anybody.

25:53 But there's a mad level of turmoil around the encode projects.

26:00 HTTPX, Django REST Framework, UVicorn, Starlette, which is the foundation of FastAPI, MKDoc.

26:10 I mean, that is a mega set of dependencies that people depend upon.

26:14 So I'm just going to link to four articles, five articles.

26:18 And you all can read them and think about those however you want.

26:20 But if you're using some of those libraries, you should probably have a look at this.

26:24 So 320 upvotes on Reddit says, anyone know what's going on with HTTPX?

26:29 Maintainer of HTTPX closed off access to issues and discussions last week.

26:33 Hasn't had a release in a year.

26:35 I wonder what's going on.

26:37 Michelle says, I forked HTTPX to HTTPXXY.

26:42 Talks about why.

26:43 Transfer of UVicorn and Starlette causes a great bunch of stirs.

26:48 There's an article called The Slow Collapse of MKDocs.

26:51 Yeah.

26:52 And that ties into Zensical, right?

26:55 Yeah, exactly.

26:56 And so basically this documents over time all the stuff that is going on that has led to Martin and his co-founder creating Zensical, which was material for MKDocs.

27:08 But they found like, yeah, basically that this was becoming something they couldn't continue to work with.

27:13 So they had to do something else.

27:14 And Django REST framework is there's an inspiration to somebody's proposed that it gets taken into Django Commons.

27:22 And Django Commons is this project to basically find and maintain packages that are important to Django that are kind of going unmaintained in a sense.

27:30 And so in this conversation I'm linking to, there's a bunch of people like, this is kind of a good idea.

27:35 But the people who are actually maintaining like, but I'm not really sure I'm going to come over and become the main maintainer.

27:40 So it's sort of stalled out.

27:42 Anyway, again, not trying to throw shade or call anyone out, but there's enough going on there with enough important projects that it's worth being at least awareness.

27:51 Yeah.

27:51 Yeah.

27:52 Sad.

27:52 Okay.

27:53 Not sad.

27:53 Something awesome.

27:54 This is very awesome.

27:55 This one I like quite a bit is announcing course completion certificates over at Talk Python.

28:01 So I don't work in a big company, so that's not super relevant to me.

28:05 So I have not really maybe given it as much love and attention as people want me to.

28:10 So now I have.

28:11 So what I've done is I have a nice dashboard that I released maybe a month ago and talked about that, I think, that shows you what courses you're working on, how far you are through them, which ones you recently have most recently taken at Talk Python and so on.

28:25 But also, and if you have a bundle of like 50 courses, which a lot of people do, then it's like, well, here's a huge long list.

28:31 Which one was I doing again?

28:32 You know, it really helps like solve that problem.

28:34 But now for the completed courses, it has a certificate section and you click that, it gives you a standard old PDF certificate that you can use if you have like continuing education

28:45 requirements or something like that, where you need to submit an official certificate to your company or whatever.

28:51 So that's kind of fun.

28:52 But more importantly, more fun, I think, is there's an option to say, publish this as an official certificate on LinkedIn to my profile.

29:00 So like one button click from Talk Python in your account, boom, takes you over, populates and fills an official certificate, even with a show your credential, which takes you back to an official.

29:10 Yes, this credential is valid, verified for you page on LinkedIn.

29:14 So that's pretty cool.

29:15 Yeah.

29:15 So if you take a bunch of courses, you know, and you want to have those there.

29:19 So people go, oh yeah, they did actually take that flask class.

29:22 That's right.

29:23 They know a little bit more than, you know, maybe just flask is like a skill or something.

29:28 So.

29:28 Can I print it out and like pin it to my cubicle wall?

29:31 You know what?

29:32 You could print it out and get that on like a matte finish.

29:35 Yes.

29:35 Yeah.

29:36 You can't even get the PDF.

29:37 You could print it out.

29:37 It's actually, it's actually like letter, US letter size.

29:42 That's awesome.

29:43 If it prints, like I had to get the DPIs of the image exactly right to fit for that.

29:48 So anyway, that's fun.

29:49 I thought not everyone's going to care about that, but people do.

29:52 I think it's kind of neat to do.

29:53 That's, that's pretty cool.

29:54 Yeah.

29:55 I've had a couple of those requests and I can't remember if I turned them on or not.

29:59 I think Podia, the platform I use, I had them.

30:02 So it just.

30:03 Nice.

30:03 I had a joke also, but I think let's save mine for next week and let's just use yours.

30:09 Okay.

30:10 Here's the funny things.

30:11 I don't even remember what the joke is, but I'm going to look and then we're going to find out together.

30:14 Oh yeah.

30:14 Here we go.

30:15 It's about AI.

30:15 So this, I entitled this Noya Rich, the new rich in the eighties.

30:21 Think Don Johnson.

30:22 Think standing by a big mansion in Florida and Miami, Ferrari Testarossa in the back.

30:29 Like this is rich in the eighties.

30:31 Rich in 2026 in modal change the button color to green.

30:37 Opus six, four, six.

30:39 Yeah.

30:39 It's which model are you using there?

30:42 Yeah.

30:42 And just like do like the completely most simple, a find and replaced or just a find and a type, the letter, the word green would take care of it.

30:50 But no Opus four point six extra effort mode.

30:54 Change the button color to green.

30:57 That's funny.

30:58 Yeah.

30:58 It doesn't have a whole bunch of great comments, but it's pretty funny.

31:03 So that's my joke.

31:05 That is pretty funny.

31:05 We, so April, we had like a changeover of our licensing stuff, March to April.

31:14 And on March 31st, a lot of people were running, like got their tokens removed or something.

31:21 And it's one day.

31:22 But there was so many people complaining of like, I'm reported as out of tokens.

31:26 How do I work?

31:28 Hopefully you can still work without tokens.

31:30 I know.

31:31 It's so bad.

31:32 It is so bad.

31:33 It's so bad.

31:35 It's like pre-smartphone, post-smartphone, you know?

31:39 Well, I was just thinking that the other day.

31:42 I was driving somewhere and I'm like, how?

31:45 I'm in Portland and I've had GPS ever since I've lived in Portland.

31:49 There's a lot of places I don't think I could find without a GPS.

31:53 But you've been there before.

31:55 Well, yeah.

31:56 I've lived here for 15 years now and I, but still, I can't, I don't carry a plastic map or anything like that with me.

32:02 So.

32:03 Yeah.

32:03 I don't know if I even have an Atlas in the car anymore.

32:05 Like if for some reason my device broke and I was on a trip, I might just be there.

32:09 I'm going to live here now.

32:11 I guess we live here now.

32:15 Yeah.

32:16 This is funny.

32:17 This is great.

32:18 So.

32:18 Yeah.

32:18 Thank you, Brian, as always.

32:19 Thanks everyone for listening and catch you all next week, everyone.


Want to go deeper? Check our projects