Learn Python with Talk Python's 270 hours of courses

#408: Hatch: A Modern Python Workflow Transcript

Recorded on Wednesday, Mar 1, 2023.

00:00 In recent years, there's been a lot of experimenting with how we work with dependencies and external libraries for our Python code.

00:06 There's pip, pip-tools, poetry, PDM, pyenv, pipenv, Hatch, and other workflows.

00:13 We dove into this deeply back on episode 406, reimagining Python's packaging workflow with a panel.

00:22 And this time, we're back with Ofek Lev to take a deeper look at Hatch.

00:26 This is Talk Python to Me, episode 408, recorded March 1st, 2023.

00:32 Welcome to Talk Python to Me, a weekly podcast on Python.

00:49 This is your host, Michael Kennedy.

00:50 Follow me on Mastodon, where I'm @mkennedy, and follow the podcast using @talkpython.

00:56 Both on fosstodon.org.

00:58 Be careful with impersonating accounts on other instances.

01:01 There are many.

01:01 Keep up with the show and listen to over seven years of past episodes at talkpython.fm.

01:07 We've started streaming most of our episodes live on YouTube.

01:11 Subscribe to our YouTube channel over at talkpython.fm/youtube to get notified about upcoming shows and be part of that episode.

01:19 This episode is sponsored by Microsoft for Startups Founders Hub.

01:23 Check them out at talkpython.fm/foundershub to get early support for your startup.

01:29 And it's brought to you by Sentry.

01:31 Don't let those errors go unnoticed.

01:33 Use Sentry.

01:34 Get started at talkpython.fm/sentry.

01:37 OFEC, welcome to Talk Python to Me.

01:40 Thank you.

01:41 Good to be here.

01:41 It's been a long time, at least a week since you've been on the show.

01:44 Yep, just about a week.

01:47 Welcome back.

01:48 In that appearance, it was a big panel of many of us talking about Python packaging.

01:53 Yeah.

01:54 And you're the author of Hatch and Hatchling and a really interesting take on that tooling story.

02:01 So I thought it'd be fun to go ahead and just dive into that in particular for this episode and get your thoughts on it.

02:07 So I'm looking forward to talking about Hatch.

02:09 Yeah, sounds fun.

02:10 Yeah, it will be fun.

02:11 Before we get into it, though, a lot of people maybe don't know you out there.

02:14 What's your background?

02:15 How did you get into programming in Python?

02:17 Those sorts of things.

02:18 Let us know.

02:19 I guess originally, this was like maybe 15 years ago now, I was just automating stuff that I was doing every day.

02:27 So for me personally, I have a condition that makes me kind of weak.

02:31 So all I can use is like a mouse.

02:33 Therefore, I type pretty slow.

02:35 So I was automating like sentences, templating for like sending emails, basically like the traditional developer mindset.

02:45 If you do anything more than once or twice, just write a script for it.

02:49 So I had like dozens or maybe even a hundred scripts just to automate like boring stuff.

02:55 Kind of like the book, which I've never read the book.

02:58 Automate the boring stuff, but I imagine it's what I was doing.

03:01 That's how I originally got into Python.

03:03 Excellent.

03:03 You were doing the traditional developer thing.

03:06 Why spend 20 minutes doing something where you can spend two weeks automating it?

03:10 Yeah.

03:10 Just kidding.

03:11 I mean, like, I honestly, I really think that that's a huge value.

03:15 There's so many people out there, probably many people even listen to this podcast where they don't consider themselves developers,

03:23 but there's like little things that could be automated that are super annoying.

03:28 You don't look forward to it.

03:31 Just a little bit of programming skill will let you really blaze through those things.

03:36 Plus it also gets you further into Python where, you know, maybe one day you're releasing tools to manage everyone else's Python projects.

03:43 Yeah, for sure.

03:44 You don't know where it's going to go, right?

03:46 Yeah.

03:46 Now I work at Datadog working on agent integrations.

03:51 So it's like being that you physically install on your server host, it ships out of the box with like almost 200 integrations,

03:59 like connecting to databases like Postgres or monitoring like Windows APIs or hypervisors like vSphere,

04:09 pretty much whatever our customers want to monitor.

04:12 It's our job to like find a way to connect to it and provide useful data.

04:18 Yeah, excellent.

04:19 A lot of research into every product that we integrate with.

04:22 Sometimes the documentation is kind of sparse.

04:26 So it's lots of investigative work.

04:29 Yeah, I can imagine.

04:30 That sounds really fun.

04:32 And I can see that as a follow on from the way you got started as well, right?

04:37 Automating a bunch of tasks is not that different from kind of automating integration with 100 different apps

04:43 and performance counters and logs and different things, right?

04:48 Definitely.

04:48 Cool.

04:49 Is that part of the application performance monitoring type thing?

04:52 Are there?

04:53 We do that as well.

04:54 That's not my team, but yeah.

04:56 Okay.

04:56 That's part of what we do.

04:57 All right.

04:57 Well, let's go ahead and dive in.

05:01 Sure.

05:01 So as I said, if people want to check it out.

05:02 So as I said, if people want to check it out, you are on the Python packaging discussion.

05:07 And over there was a broad conversation with a bunch of core developers and other interested

05:13 folks building tools like Hatch and so on about where are we with packaging?

05:19 Because a little while ago, I remember packaging mostly felt like pip and set of tools, maybe

05:27 just just util, something like that.

05:29 And then it kind of got unlocked the separation of like the build back ends and stuff.

05:35 And then many people started creating things.

05:37 We had PIP, ENV.

05:38 We have poetry.

05:40 We have PDM.

05:41 There's a bunch of different ones and Hatch is amongst them, right?

05:45 Yeah.

05:45 Let's set the stage by just talking about, first of all, what do we mean when we're talking

05:50 about Python packaging?

05:51 And I'll ask you for you, right?

05:54 Like it might mean something different for me than it might mean for you.

05:58 And it might be different for someone else as well.

06:00 But let's just start with, you know, when we talk packaging, is that getting libraries

06:04 to devs?

06:05 Is that developers deploying their apps to servers?

06:08 Or is that me sending an executable end product to a desktop?

06:13 Like, what does it mean?

06:15 Yeah.

06:15 That's a good question.

06:16 I would say all of those are packaging.

06:19 Historically, though, we've mostly put our efforts toward the first one, which is basically

06:25 like a developer making a library and making that really simple for other developers to use

06:32 that library.

06:32 So in the form of wheels being hosted on PyPI in particular, that's what we put our efforts

06:39 on, which I think either way you look at it was the right choice to focus on in the

06:44 beginning.

06:45 Because like either way, like from either first principles or even hindsight, looking

06:50 back, you can't build a community without packages and being able to get packages and distribute

06:57 packages.

06:58 So I think that was the right choice.

07:00 And I think now we're trying to satisfy other use cases.

07:04 Notably applications, I guess.

07:07 Yeah.

07:07 Yeah.

07:07 I mean, we even have an XKCD for it, right?

07:10 True.

07:11 And I don't know how many people know this.

07:13 If you're in the Python REPL, you can type import anti-gravity.

07:17 And actually, it does something.

07:20 So the old XKCD is there's a person flying and the person on the ground looks at us.

07:25 How are you flying?

07:26 Python just learned it last night.

07:29 Everything's so simple.

07:30 Hello world is just print.

07:32 Hello world.

07:32 The person on the ground says, I don't know.

07:34 Dynamics typing white space.

07:36 Come on, join us.

07:38 Programming's fun again.

07:39 Okay.

07:39 But how are you flying?

07:40 I just typed import anti-gravity.

07:42 Right.

07:43 And it's a great joke.

07:45 But honestly, that is one of those superpowers of Python.

07:49 Is that how many things do we have right now?

07:52 How many packages?

07:52 436,000 packages.

07:55 Like insane.

07:57 It's just insane.

07:58 Yeah.

07:58 No, it's a massive community and really all kinds of domains from doing, you know,

08:04 as we talked about automating scripts, you know, different tasks to doing like

08:09 computing for, whether, you know, biomedical stuff, you know, even embedded devices now

08:17 with like, micro Python, stuff like that.

08:20 So it's, yeah.

08:21 Users of Python do everything pretty much.

08:24 Yeah.

08:25 I think in the near term, we're going to be talking about front end web as well with

08:30 PyScript and PyScript showed the possibilities, but I recently had a show on PyScript intersection

08:39 with micro Python.

08:40 And that starts to be like, well, here's a couple hundred K download.

08:44 And now you've got Python in the front end.

08:46 What do you think about it now?

08:47 But of course that has its own packaging and distribution story that we're going to have

08:52 to think about as well.

08:53 Like, well, kind of like node modules.

08:55 Now, what do you do with packages that got to run on the front end?

08:57 This is getting weird.

08:58 That kind of goes to, you know, talking about like how hard it is to do packaging when you

09:04 have, you know, dozens of use cases that we have to satisfy.

09:08 And with us being mostly just volunteers in our free time trying to do everything.

09:14 So, yeah.

09:14 Yeah.

09:15 It's fun and also challenging.

09:17 Yeah.

09:18 Yeah.

09:18 Absolutely.

09:18 Another area, another thing we could consider could be Conda, right?

09:23 Actually, I got that pulled over here.

09:25 Could be Conda, right?

09:26 This is a completely different take on pip and Wheels.

09:30 Yeah.

09:30 Conda is pretty cool.

09:31 I think Conda, if I have my history right, it came about because there really was no packaging

09:37 story.

09:38 Yeah.

09:38 Some time ago.

09:40 So, Conda, I think was made by Peter Yang, if I remember correctly.

09:44 And he has a whole company now around it supporting Conda.

09:48 And yeah, it just makes it easy to install, very complex stuff.

09:53 So, if your package depends on, yeah, you can put in Fortran and Rust and all kinds of stuff

10:00 and it just magically builds it and you can install it pretty easily.

10:05 Yeah.

10:06 It's pretty impressive.

10:07 It is pretty impressive.

10:08 And, you know, with Wheels now, it's closer, what we do with Pip.

10:12 It used to be setup.py would run and whatever it needed to do, it would do.

10:17 But often that would require, well, compile this.

10:19 Usually it was C back then, but for the scientific libraries, it says, well, compile this thing

10:26 with Fortran and then compile this thing with Scala.

10:29 You're like, I have neither of those things set up as dev tools on my environment.

10:33 I'm a science student.

10:35 What am I doing here?

10:36 Right.

10:37 And so, that was the angle they were solving.

10:39 And I think pip and Conda are coming a little bit closer together.

10:42 I think they're not necessarily converging, but they're more similar now than they used to be.

10:47 Yeah, definitely.

10:47 That is true.

10:48 And yeah, there was talk.

10:50 I don't know how many people are aware, but the Python forums has a subsection on discourse

10:56 for packaging.

10:57 So, yeah, right now there's actually talks from people at Conda trying to decide how we

11:03 can kind of provide a more unified experience.

11:07 Oh, that's interesting.

11:08 Because right now, Conda has their own repo for all their packages.

11:12 And PyPI is its own thing outside of Conda.

11:17 So, yeah, there's talk about possibly making that interoperable.

11:23 Oh, yeah.

11:23 Okay.

11:23 That'd be really interesting.

11:24 Let's see.

11:25 There was a question out here from Copa.

11:28 It says, we're in this realm.

11:30 Like, what do you think about Docker as a way of shipping things?

11:33 You know, a lot of times we'll get checkout, get clone some code on a server, maybe some production

11:40 branch, and then go through these steps, right?

11:43 pip install requirements or a hatch run type of initialization, or you just get that done

11:50 in a Docker container and you just hand that out.

11:52 What are your thoughts on Docker as part of this?

11:54 Yeah, Docker definitely has its use cases.

11:57 Like, I guess in lieu of the block file, you could kind of use Docker as a reproducible,

12:03 you know, environment.

12:05 But I still think there's a place for a way to actually build applications and, you know,

12:11 outside of Docker, outside of containers in a reproducible fashion.

12:15 I think that's still necessary.

12:17 I do as well.

12:18 And so Docker really, it addresses some of the types of packaging that we discussed really,

12:25 really well.

12:26 For example, I need to get my running code onto a server, but Docker is less good.

12:32 It's not completely irrelevant, but it's less good at giving a developer a library, right?

12:37 If people that make HTTPX and the people that make FastAPI, they're not going to build a

12:44 combo Docker, right?

12:46 There's still a place where you've just got to get the things.

12:49 And that's like a base level closer to where a hatch might be working.

12:52 And also Docker is not fantastic at sending to an end user.

12:56 If I want to build an app that a non-technical, non-developer person can use, Docker is the

13:02 opposite of what they want.

13:03 You know what I mean?

13:04 Yeah, true.

13:04 Yeah.

13:05 I will say there's another use case, which is like, if your machine is like messed up somehow

13:11 and some library package isn't working.

13:14 I've had this happen with my coworkers on their Macs.

13:18 It is nice to be able to just go into a container and start fresh.

13:22 So I've had that happen a few times.

13:24 It is isolated in quite a good way.

13:26 And that's pretty excellent.

13:28 So on that packaging panel that we were on, there was a really interesting focus for a little

13:36 bit talking about, well, what is responsible for what?

13:41 So right now, for example, I might use pip as a way to add tools to Python, to a Python project,

13:49 but I'll have to already have Python there.

13:52 And in other communities, and even a little bit like Honda in this as well, there's tools

13:58 that will say, what you do is use a tool kind of like pip, but it gets you the runtime.

14:03 It would get you a version of Python you asked for plus the libraries.

14:07 You know, I think RustUp was one of the things that was brought up there, right?

14:14 So for people who don't know RustUp, it's an installer for basically setting up a Rust environment

14:21 for doing Rust.

14:22 So pip up, Python up, I don't know.

14:25 I don't know what we would call it.

14:26 But do you want to just, you know, maybe give your thoughts on that?

14:29 Because I think you had some comments on that, like inside out, outside in, where, if you

14:34 could start fresh, where were the tools?

14:36 How would that work?

14:37 Yeah, I think if we were to start fresh, I think the way Rust does it is like now the

14:41 gold standard.

14:42 It's probably the best way to do it, which is how, as you mentioned, Conda, a similar thing,

14:49 where you have a tool that you download.

14:51 And that one tool is in charge of managing the various Python or programming language versions.

14:59 So if I were to start fresh, you would have a tool like catch that you would download, you

15:05 know, as an MSI or EXE or some kind of installer similar to RustUp.

15:10 And then that tool would manage the various Python versions and environments and packaging.

15:17 So for RustUp, when you download this, it gives you RustUp, which manages Rust.

15:23 But then it gives you Cargo, which is a separate command.

15:27 And that's their package manager.

15:29 But in both cases, they live outside of the Python.

15:32 Interesting.

15:32 Yeah.

15:32 Cargo is to Rust as pip is to Python, right?

15:35 That kind of thing.

15:36 Hey, folks, let's pause for an ad.

15:40 Remember last time I had this advertisement for Microsoft for startups?

15:43 Well, I asked the AI to have some fun with it just to show you how powerful what they have

15:48 on offer really is.

15:50 Here we go.

15:50 Me.

15:52 Can you rephrase that Microsoft Founders Hub ad as a hipster?

15:55 AI.

15:56 Sure.

15:57 Here's a rephrased version of the ad in hipster style.

16:00 Yo, Talk Python fam.

16:02 This segment is brought to you by the sickest program out there for startup founders, Microsoft

16:06 for startups Founders Hub.

16:08 If you're a boss running a startup, you're going to want to listen up because this is the

16:12 deal of a lifetime.

16:13 Microsoft for Founders Hub is your ticket to scaling efficiently and preserving your runway

16:17 all the while keeping your cool factor intact.

16:20 With over six figures worth of benefits, this program is seriously next level.

16:24 You'll get $150,000 in Azure credits, the richest cloud credit offering on the market,

16:29 access to the OpenAI APIs in the new Azure OpenAI service, where you can infuse some serious

16:35 generative AI into your apps, and a one-on-one technical advisory from the Microsoft squad, who

16:41 will help you with your tech stack and architectural plans.

16:44 This program is open all, whether you're just starting or you're already killing it.

16:47 And the best part, there's no funding requirement.

16:50 All it takes is five minutes to apply, and you'll be reaping the benefits in no time.

16:54 Check it out and sign up for Microsoft for Startup Founders Hub at talkpython.fm slash

16:58 foundershub.

16:59 Peace out and keep listening.

17:01 Thank you, Hipster Michael.

17:02 And thank you, Microsoft for Startups Founders Hub, for sponsoring the show.

17:08 I think that's pretty helpful because one of the problems is, well, you need to pip install this

17:13 thing.

17:13 Oh, do you have the wrong version of Python?

17:15 Well, you got to, you know, there's a lot of steps back, and there's no immediately obvious

17:20 command other than completely from scratch install a new Python.

17:24 Yeah.

17:25 There's the tools that manage that, right?

17:26 Like, PyEnv can work, although I've had trouble with it.

17:30 Yeah, I've had issues with that.

17:31 Yeah, I think it would be less error-prone in this hypothetical way, where the tool doesn't

17:37 mess with your shell in a global manner.

17:41 It just has its own paths to Python and just does everything by itself.

17:47 That's interesting, and that starts to maybe make it easier to solve the, I want to ship

17:52 you an executable binary, is if the tool were in charge of, I create this working directory

17:58 where part of the things I've installed is all of Python and all the packages you've asked

18:04 me for, I can see how that pretty quickly becomes something.

18:07 I'll bundle that up and hand it to somebody and, you know, give them an entry point.

18:11 Definitely, I could help that situation.

18:13 I think there's not really a standard way to build an AXE from like a Python package.

18:20 There are a few tools, like PyOxidizer is one newer option.

18:25 PyInstaller, CX Freeze, I think was the thing that I've used before.

18:30 So there's a few options.

18:32 Yeah, I've used PyToApp, and that's actually worked really well.

18:34 I've used PyInstaller, and it's worked mostly well, except for I've had weird situations

18:39 where on Windows it's great, but on Mac it has a dangling terminal.

18:44 In addition to the GUI, I'm like, what are we supposed to do that?

18:47 How do we make it go away?

18:48 Like, you know, here's the command.

18:50 Like, no, it's not going away.

18:51 I don't know why.

18:52 And if there was a more official sort of core dev organized way, that would make me super happy.

18:58 I'm not supposed to say for official or unofficial.

19:01 Like, my view is like, if it works, it works.

19:05 So as long as it's satisfying, you know, all the use cases, that's what I would push for.

19:10 So I think right now, based on what I've used personally, I think PyOxidizer would be the

19:16 best choice for distributing standalone apps.

19:19 Interesting.

19:20 Okay.

19:20 All right, cool.

19:21 Well, let's move on and start talking about Hatch.

19:26 So first off, why'd you build it?

19:29 Right?

19:30 We had Pip.

19:31 Why do we need Hatch?

19:33 And, you know, I don't know exactly the timeframe of when it came out.

19:36 So maybe we had other things like poetry or, you know, why'd you go and create this?

19:40 So Hatch, I did, it was kind of an older project back in the end of 2016 or early 2017.

19:48 I wasn't pleased with like the tooling in Python.

19:53 I think very similar to the author of poetry.

19:56 That's kind of why he made poetry.

19:58 So I wanted something that kind of matched my mental model of how development would go

20:05 with building packages and managing environments automatically, stuff like that.

20:10 When I made it though, there weren't very many standards for packaging.

20:15 And everything was kind of in limbo at that point, which kind of discouraged me from continuing.

20:21 Because then I was like, okay, in a six months or a year or two, I'm going to have to rewrite

20:27 to follow standards.

20:29 So I kind of just stopped development for a few years until everything was standardized.

20:35 And then I rewrote it about a year and a half ago with this new version and new docs.

20:42 So that's kind of the history of it.

20:45 Yeah.

20:45 I saw that there's a hatch.toml and a pyproject.toml and you can use either of them.

20:51 Was your hatch.toml the original and then pyproject.toml gained traction?

20:56 You're like, all right, well, we'll integrate with that as well.

20:58 No, hatch.toml came with the rewrite.

21:01 It's mostly for environments.

21:03 Sometimes when you define lots of environments, it's very verbose.

21:07 Like at my workplace, I saw a tox file that was like over a thousand lines.

21:13 So putting that in pyproject wouldn't be very nice.

21:17 So that's why I have a second file to isolate certain features.

21:20 Yeah, that makes sense.

21:21 Just like maybe you don't want to write your entire application in an app.py,

21:24 but maybe have multiple files.

21:27 Yeah, something like that.

21:28 All right.

21:28 Well, out in the audience, we've got some kind words.

21:31 Like I switched to hatch and pip-tools from poetry and love it.

21:34 That's pretty awesome.

21:35 Yeah.

21:36 And then probably before I'll forget, because it was right at the top of the conversation,

21:40 Marwan asks, is there a time estimate for when a hatch might support things like lock files?

21:47 That's a good question.

21:48 So my goal is by PyCon to write the plugin interface for locking.

21:58 So the first version will use pip-tools, actually.

22:01 That would be the first plugin for lock files.

22:04 But I won't be writing like an actual lock file spec.

22:08 I'll just be using an existing tool.

22:12 It's kind of blocked on Brett because he has most context and knowledge about that.

22:18 So yeah, I'm waiting on Brett, basically.

22:21 Got it.

22:21 Brett Cannon.

22:22 That being Brett Cannon.

22:23 Yes.

22:24 Python developer extraordinaire.

22:25 We all know.

22:26 Okay.

22:27 Very cool.

22:28 Other thing before we dive into it here.

22:29 I see that you have some rough action going there.

22:33 I just had Charlie on the show not too long ago to talk about rough.

22:37 It's pretty impressive.

22:38 When did you adopt that?

22:40 I was an early adopter.

22:41 I guess a few months ago now.

22:43 Yeah.

22:43 What's your experience?

22:44 It's fantastic.

22:45 It's kind of like a meme to say it now, but it's true.

22:48 Like, it's so fast.

22:49 It's almost like you wonder if it's doing anything.

22:52 Like, it's...

22:54 That was my first thought.

22:55 When I ran it, I'm like, wait a minute.

22:56 Maybe I didn't give it any files or something.

22:57 Because I ran it on Talk Python training, which is like 20,000 lines of Python code.

23:02 And it just went, bam, like that.

23:04 And I'm like, maybe it didn't take that.

23:05 Because that seems like that should take a moment at least somehow.

23:09 Yeah.

23:10 Okay.

23:10 So you recommend it?

23:11 Yeah.

23:12 All around kind of one location.

23:13 And it supports, like, so many options as well, which is nice.

23:19 Yeah.

23:19 Indeed.

23:19 Cool, cool.

23:20 All right.

23:21 Well, let's start with a high-level overview.

23:24 And then what I want to do is I want to walk through creating a project with this.

23:28 And I've got questions and thoughts as I kind of experience Hatch.

23:32 Not for the first time, but for somewhat of a newbie perspective.

23:36 So I think we'll do that.

23:37 But let's start with the high-level features.

23:40 So the Hatch project is, I guess, conceptually two different projects.

23:44 Hatch itself is the command line.

23:47 So doing publishing and environment management, versioning, stuff like that.

23:53 Then Hatch thing is the build system, similar to a flip or set tools.

24:00 So that's where the build system is.

24:03 And you can use it independently, right?

24:05 You don't have to be doing anything with Hatch to use HatchLeen.

24:09 Basically to replace setup.py, right?

24:13 Yeah.

24:13 You can replace it with the pyproject.toml.

24:16 Yeah.

24:17 And most people do use HatchLeen and not use Hatch.

24:21 So yeah.

24:22 HatchLeen is much more popular than Hatch itself.

24:25 Okay.

24:26 So for a config, it's a bit more simple than setup tools.

24:30 The default logic makes more sense for new users, especially.

24:37 It's hard to mess up packaging with HatchLeen.

24:41 Yeah.

24:41 Excellent.

24:41 So I could have just some random Python project that I've put together with a PyProject.tomal

24:47 I wrote by hand and I could just put HatchLeen in as the build subsystem to make the wheels

24:53 and whatnot, right?

24:54 One benefit of HatchLeen, I hatched too.

24:56 Basically everything is a plugin.

24:58 So you can have like a build hook that does like the mypyC, which we have.

25:04 You can have a metadata hook where you insert like project URLs from some arbitrary location.

25:12 Pretty much everything you can plug into and modify.

25:16 Yeah.

25:16 Excellent.

25:17 All right.

25:18 And then a robust environment management.

25:20 Yeah.

25:21 So for this, this you can think of as a, as talks or knocks, similar in spirit to that.

25:28 The difference is knocks and talks kind of treat environments as applications where an environment

25:36 is tied to a command and you run an environment.

25:39 Whereas in Hatch, you have environments that you define.

25:43 And then within that, you have scripts that you can run.

25:47 So you can have a style environment that might be able to rent with one script or run the

25:55 formatter to change the code with another script.

25:58 An environment itself isn't actually like, like an app.

26:03 You can run arbitrary commands.

26:05 Right.

26:06 Like I could run Hatch test or something like that.

26:10 Yeah.

26:11 And passing flags.

26:12 Yeah.

26:12 Okay.

26:13 And then often people who published packages to PyPI, they've done this with Twine or some

26:21 tool like that.

26:21 And Hatch has that capability as well, right?

26:24 Right.

26:24 Yeah.

26:24 To, yeah.

26:25 PyPI or some private, you know, corporate owned index.

26:31 I think those are probably going to be more popular than they used to be with all the supply

26:36 chain silliness.

26:37 Yeah, that's true.

26:38 Yeah.

26:39 Do you have any visibility into how people are using it, whether it's public or private or

26:43 As far as Hatch?

26:45 Yeah.

26:45 Well, how they're using Hatch to publish, do you have any visibility whether they're

26:49 publishing to PyPI or to some kind of private index?

26:52 Based on the issues I have open, like future requests, most are talking about private indices,

26:58 actually.

26:59 Interesting.

26:59 Yeah.

27:00 It's probably those are the ones where the edge cases live.

27:02 You know, the standard one place is dialed in.

27:05 And what if mine's using Active Directory for authentication as I publish it?

27:10 Like, it's doing what?

27:11 Artifactory is quite popular as well.

27:15 Yeah.

27:15 Yeah.

27:15 That absolutely is.

27:17 Another thing that was interesting is you have the ability to do version management,

27:21 as we'll see in just a minute.

27:22 You can say, like, what version is my package?

27:24 Increment the build or do a major version increment or put it into a release candidate mode.

27:30 Yeah.

27:31 And this is plugable as well.

27:33 So there's one plugin that's popular that wraps setup tools SCM, which doesn't actually

27:39 depend on setup tools anymore.

27:41 It's just in name.

27:42 It's still called that.

27:44 So that pulls your version from Git or Mercurial or Subversion.

27:49 And you can source the versions that way as well.

27:53 Interesting.

27:53 Yeah.

27:53 I really like that.

27:54 I think that's a neat aspect.

27:56 And then configurable project generation with same defaults.

28:01 Yeah.

28:01 I don't have too many options with this yet, but you can make it a flat layout or like a source

28:08 directory.

28:09 There's an option to add tests, which puts more stuff in your PyProject.com.

28:16 You can add a CLI, which has a very simple template for GitHub actions.

28:22 And then there's a flag for your CLI that would give you a click and set up a command line for

28:30 your package.

28:31 I don't know how directly related this is to anything that Hatch does.

28:35 But the usage of the PyProject.toml and then building it as a package, something you could

28:40 install, gives you a really nice way to create a global CLI, right?

28:45 With just the entry points in the PyProject.toml.

28:48 Yeah.

28:48 That's what that CLI flag does.

28:49 Yeah.

28:50 It's very nice.

28:51 Okay.

28:51 Yeah.

28:52 Then also you say it's two to three times faster than equivalent tools.

28:55 That's great.

28:56 It really is just one trick.

28:57 It's just I make the code not as readable by using lazy imports everywhere.

29:04 I just put lazy imports and that's why it's faster, essentially.

29:08 Yeah.

29:09 Because there's a lot of execution paths that only use some of the imports in effect, right?

29:12 Yeah.

29:13 Going back to the scripts, Jonathan points out, I love the custom scripts within Hatch.

29:17 It makes creating build pipelines way easier and moves most of the logic within the Hatch

29:22 configure rather than spreading them around multiple files, which is, that's pretty cool.

29:25 Yeah.

29:25 That's what I do as well.

29:26 Cool.

29:26 I even use Hatch for non-Python projects just for the scripting.

29:31 Yeah.

29:32 Cool.

29:32 Well, I mean, Python traditionally had been used for a lot of that, you know, called it glue

29:38 code, right?

29:38 A lot of, well, I really want to do these other things with these other systems and scripts,

29:42 but let me kind of orchestrate that in Python.

29:44 And that sounds a bit, a bit like that.

29:46 Yeah.

29:47 Let's do a little walkthrough, I think.

29:48 I think that'll be fun.

29:49 But first of all, I think this is just MKDocs, but thank you for pointing it out that your

29:55 documentation and your website here have hotkeys.

29:59 Yeah.

29:59 MKDocs with the material theme, which is very nice.

30:03 Yeah.

30:03 So it turns out if I just press a dot, it goes to the next page.

30:06 And if I comment, it goes to the previous page.

30:08 And it doesn't sound like much, but actually it's really nice.

30:11 It is really nice.

30:12 Before we leave this front page, one other thing to note to go back to the top, just because

30:17 I'm very happy with it.

30:18 The logo was actually generated by Dolly, the AI.

30:22 Okay.

30:22 Yeah.

30:23 Fantastic.

30:24 Yeah.

30:24 I generated the logo.

30:25 And then I had a brother of a friend from work, I like actually touch it up.

30:30 So.

30:30 Oh, it's a really cool logo.

30:31 I like it.

30:32 I didn't catch on that it was made by Dolly, but now I see that.

30:35 I've been doing a lot with mid-journey.

30:38 And I think these AI tools are, I think they're a little bit fraught with maybe a few moral

30:43 issues about like, well, did you really train it on stuff that you were allowed to train on?

30:47 But putting that aside, if they exist, you know, assuming just they exist, they're really

30:51 neat.

30:51 And there's really amazing stuff you can do with them.

30:53 Yeah.

30:54 Yeah.

30:54 Cool.

30:55 I guess maybe a quick sidebar there is if you were a project maintainer out there and you

31:00 don't really have a logo, drop in on Dolly or Mid Journey and spend half an hour and

31:06 you probably will.

31:07 But I just think there are so many people that build web apps out there that don't put

31:12 hotkeys into them.

31:13 And it's, it is not that hard.

31:15 And it is such a nice experience.

31:17 And it brings you so much closer to a native app type of experience.

31:20 So please put, put some hotkeys out there for us.

31:22 All right.

31:23 So pressing dot takes to the first one.

31:25 So installing hatch, obviously you can pip install it.

31:28 However, you offer some interesting other areas I want to talk about.

31:32 First of all, my favorite pipX.

31:35 I love pipX.

31:36 If you've got a tool that you don't directly import into your code that does stuff against

31:42 your Python apps.

31:43 Boy, pipX is almost always a good choice.

31:46 What do you think?

31:47 Oh yeah.

31:47 PipX is awesome.

31:48 Yeah.

31:49 Yeah.

31:49 It just allows you to, you know, provide isolated apps for command line apps.

31:55 Yeah.

31:55 It manages everything and you don't even have to think about it.

31:58 So yeah.

31:59 It just creates its own little environment.

32:00 And you can say upgrade all my installed CLI tools.

32:03 It's like package manager.

32:05 If the thing that it's managing is built with Python is great.

32:08 I had chat on the creator of pipX a while ago.

32:11 So people, if they want to hear more about it, they can listen to that show.

32:13 Homebrew.

32:14 Good.

32:14 MacPort is interesting.

32:17 But the one that stood out to me was Mamba.

32:19 I'm like, wait, what's Mamba?

32:23 It's interesting.

32:24 I hadn't heard of that, but yeah.

32:25 Yeah.

32:25 I don't use Konda that much, but as far as I know, there's a few different distributions

32:30 of Konda.

32:31 So there's Anaconda, which gives you like over a gigabyte installed, like massive scientific

32:39 computing.

32:39 There's Miniconda and Miniconda gives you just the bare minimum Konda CLI with like package

32:47 management.

32:48 And that's what most people use, I think.

32:50 But now there's Mamba, which is like Miniconda.

32:53 But it pulls from Konda Forge by default.

32:57 And Konda Forge is sort of like our PyPI, where anybody can contribute their own packages.

33:05 So I think that's the main difference.

33:07 And yeah, it is faster and it was rewritten.

33:11 And that's what Mamba is.

33:13 It's a re-implementation of Konda, the Konda package manager in C++, doing parallel downloading

33:20 and other bits of that, which is interesting.

33:23 Cool.

33:24 Well, I don't use either all that much, but it's still kind of cool to see there.

33:29 So you could Mamba install Hatch if that was your workflow as well, right?

33:33 Okay.

33:34 So installing it pretty easy.

33:36 If you were to do it, if somebody gave you a blank machine and said, set this up to use

33:40 Hatch, what would you do?

33:42 For now, I would do PIPX.

33:44 Okay.

33:45 In the future, like we talked about in the beginning, I plan to have like an actual executable that

33:51 does the work, like Python does.

33:53 But until then, then probably PIPX.

33:56 Okay.

33:56 So maybe then it would be Homebrew and Winget and apps, things like the higher level OS ones.

34:03 Okay.

34:03 This portion of Talk Python to Me is brought to you by Sentry.

34:08 Is your Python application fast?

34:11 Or does it sometimes suffer from slowdowns and unexpected latency?

34:15 Does this usually only happen in production?

34:18 It's really tough to track down the problems at that point, isn't it?

34:21 If you've looked at APM, application performance monitoring products before, they may have felt

34:26 out of place for software teams.

34:28 Many of them are more focused on legacy problems made for ops and infrastructure teams to keep

34:33 their infrastructure and services up and running.

34:36 Sentry has just launched their new APM service.

34:40 And Sentry's approach to application monitoring is focused on being actionable, affordable, and

34:45 actually built for developers.

34:47 Whether it's a slow running query or latent payment endpoint that's at risk of timing out

34:51 and causing sales to tank, Sentry removes the complexity and does the analysis for you,

34:57 surfacing the most critical performance issues so you can address them immediately.

35:01 Most legacy APM tools focus on an ingest-everything approach, resulting in high storage costs,

35:07 noisy environments, and an enormous amount of telemetry data most developers will never need

35:12 to analyze.

35:13 Sentry has taken a different approach, building the most affordable APM solution in the market.

35:19 They've removed the noise and extracted the maximum value out of your performance data while passing

35:23 the savings directly onto you, especially for Talk Python listeners who use the code Talk Python.

35:29 So get started at talkpython.fm/sentry and be sure to use their code Talk Python all lowercase

35:36 so you let them know that you heard about them from us.

35:39 My thanks to Sentry for keeping this podcast going strong.

35:43 All right, so the way we get started is we just say Hatch New.

35:50 And I thought one of the things I don't normally do here on the podcast, but I think it might be fun,

35:54 is just to kind of go through these steps here to see what it's like to get a sense,

36:00 because then I can ask questions.

36:02 So I'll say Hatch New Calci.

36:05 I'll call my little app Calci.

36:06 And tell us about what we get when we run that.

36:08 Sure.

36:09 So it makes your package as you named it with About.py and Init.py.

36:16 The Init.py obviously makes it, turns that directory into a Python package.

36:21 The About.py stores the version by default.

36:25 And that's where it reads it by default.

36:28 It gives you, oh yeah, go ahead.

36:30 Well, I was just going to say, one of the things I can type now is Hatch version.

36:33 And it gives me, basically pulls out the version of About.py, right?

36:38 Yeah, and you can, if you do the same command again, but pass in R like minor,

36:44 then you can bump it as well.

36:46 Yeah, so the old version is what it says, is 001.

36:49 The new version is 010.

36:51 Could I say build and get 11?

36:53 Something like that?

36:54 No, what would I type to change the last one?

36:56 RC.

36:56 You should do RC.

36:57 Okay.

36:58 It's documented the allowed arguments as well.

37:01 Got it, yeah, sure.

37:01 So yeah, then it also gives you a test directory that doesn't have any predefined tests,

37:07 but you can add tests to it.

37:09 And then the most important part is the PyProject.tomla, which has your metadata and your other config.

37:17 So it's got the build system set to be Hatchling.

37:20 And then it's got all the project settings, like who is the author?

37:23 What are the requirements?

37:25 And all that stuff, right?

37:26 And from the author, it would have gotten that from Git.

37:29 The default comes from Git.

37:31 So that's why it has the right stuff for you.

37:33 And then down here is testing.

37:36 So some coverage stuff and environments.

37:40 When I typed Hatchinew, could I have made it ask me those questions, like who are you and stuff?

37:44 There is an interactive mode, yeah.

37:46 Okay, yeah.

37:47 Yeah, so you also, as part of this PyProject.tomla, you create some of these commands.

37:54 These are the scripts you were talking about a little bit, right?

37:56 Like you've got the test and other options you can run.

37:59 This default example down there has environment, which is just default, which is a little bit special.

38:06 It just means you don't have to add a prefix on the command line.

38:09 And so there's two scripts by default.

38:11 A cove.

38:13 So you could do like a hatch run cove, and it would run pytest with coverage.

38:18 And then another command is no cove.

38:21 Yeah.

38:21 And I can do hatch test, hatch run test.

38:24 Is that a thing as well?

38:25 There is no test command.

38:26 You could do pytest.

38:28 So if you do hatch run pytest, it could, yeah.

38:31 Yeah, excellent.

38:32 That's really cool.

38:32 Yeah, so it basically creates the structure for you.

38:36 And the workflow that we just discussed would be if I've got a folder and I want to start from absolute scratch.

38:43 I want to create the entire directory structure through hatch.

38:48 But there's also a way I can go to an existing one and kind of convert it to hatch or upgrade it to hatch, right?

38:55 Me and other contributors have done it so much that most of the edge cases are gone.

39:01 So it can take pretty much any setup.py and turn it into hatch pyproject.tomalot.

39:09 It's pretty good now.

39:11 Okay.

39:11 And because it doesn't actually need hatch the CLI, the environment tool to do that, to run and build,

39:20 you could just use that to get your pyproject.tomalot and use hatchling as a build engine, right?

39:27 But still just keep going.

39:28 Yeah, exactly.

39:29 Okay.

39:29 So people are sitting out there like, I really should be using pyproject.tomal, but, you know, inertia, I don't really want to do it.

39:36 Like, hatch new init might do it, right?

39:39 Yeah, yeah.

39:40 That's an option.

39:41 Before you time out, if you do which Python, maybe I can just illustrate.

39:46 And if you do hatch run which Python 3, it will show you that it's actually in a managed virtual environment.

39:53 Okay.

39:55 So it's created a virtual environment over in, at least for me, library application support, hatch environments, and so on, so on, based on the project name.

40:03 And then it has some big long deal on the end?

40:05 It's just a hat, yeah.

40:06 It's just a checksum.

40:08 Okay.

40:08 What is that a checksum based on?

40:10 The reason I ask is, what do I change to make this no longer work?

40:16 So I do that because it's possible that somewhere else on your machine, you might have another project, maybe a fork of calci with the same name.

40:25 So I have to have a hash.

40:26 Likely.

40:26 It's a very popular library, so it's likely.

40:29 That's why I do that, yeah.

40:31 I see.

40:31 Okay.

40:31 That's like a hash of the path to where the project is or something.

40:35 Okay.

40:35 Yep.

40:35 A lot of projects, a lot of management tools work this way.

40:38 Conda works this way, for example, where there's some other place where the virtual environments live.

40:44 Is there a way, another workflow that's pretty common is to have the virtual environment in a VNV folder at the root of the project.

40:51 Is there a way when I create my project to say, I want a local ENV?

40:56 Not at project creation time, but there is a way in either hatch config or in pyproject.tomo.

41:04 They're able to change that.

41:05 Yeah.

41:06 Which is documented on the site.

41:08 Yeah.

41:08 The hatch config is one of the things I would do.

41:13 There's a lot of cool CLI tools where you can ask it to show me the details of whatever it is.

41:18 So what would I put, say, into the config to say, create my VNV locally and call it what?

41:27 Is it this DERS VNV?

41:28 Yeah, DERS and ENV.

41:30 Yeah.

41:30 What would I put in there?

41:32 You would have a subtable for virtual and then have the path be just .vend, basically.

41:40 Right.

41:40 Okay.

41:41 So like a .slash, whatever you want to call it locally.

41:43 Yeah.

41:44 Is this, I guess I could do hatch find config or config find, I guess?

41:50 Config find.

41:51 Config find.

41:51 Yeah.

41:52 Right.

41:52 And that will, so this is a global, like, how do my projects get started using hatch for my machine, not a per project deal, right?

42:00 Yeah.

42:00 That's cool.

42:01 So kind of like git config.

42:03 Once I set up my machine, if I say, well, I like my virtual environments like this, then I'll be okay.

42:09 Right?

42:09 Yeah.

42:10 It makes it easier to distribute tooling.

42:12 Like for, if you're managing like some corporate environment where you're using hatch for everything, then it's nice to have a config that you can modify.

42:22 Just as a machine level, then every project will do the same.

42:27 Just as a team to say, look, we always want tests.

42:30 We always want this other thing that we call it that we always want this default library.

42:34 Sorry.

42:35 We want this default license, right?

42:37 We don't want MIT.

42:39 We want, you know, corp.inc or whatever license that we use.

42:43 So quick question from ZL out there that I think is relevant.

42:46 Is this useful for application development, not libraries?

42:50 Say if I'm building like a Flask app or a FastAPI app, like would, would this be relevant?

42:55 Yeah.

42:55 So especially with the environment management, that's kind of what applications will use anyway.

43:00 The missing feature, of course, like the other person asked is the lock files.

43:06 For any app you're going to want to be able to reproducibly build the app.

43:11 So right now there's not a way built in other than using an environment with like pip-tools or something.

43:18 So I'm going to add that plugin interface soon.

43:21 Interesting.

43:22 Does pip-tools work with piproject.toml?

43:24 It does now.

43:24 Yeah, it does.

43:25 Yeah.

43:26 I've only used it with requirements.in and then generate the requirements.txt of it.

43:30 Yeah.

43:31 They added that last summer, I think.

43:33 I'm so behind the times on this.

43:34 You know, these workflows, I'm sort of joking, but also not.

43:38 These workflows, you kind of get into like, well, here's how I build these apps.

43:41 Here's how I manage my requirements.

43:43 And then you just tunnel, I think a lot of people just go, okay, well, that's working

43:47 for me.

43:47 I'm doing that.

43:48 You know?

43:48 Yeah, me too.

43:49 Me too.

43:49 Yeah.

43:50 Yeah.

43:50 Yeah.

43:50 And then, so if I want to, like, so for example, when I asked which Python, it said the one from

43:58 Homebrew you've installed, silly.

43:59 Of course, that's your global Python.

44:01 If I want to activate a virtual environment, if I want to get into like this application

44:06 mode, I would do hatch shell, right?

44:09 Yes.

44:09 Uh-huh.

44:10 And because I have an awesome, oh my posh, you can see my prompt here's now taking on

44:14 the calci 3.11.2 environment as part of my prompt.

44:18 So.

44:18 That's very cool.

44:19 Yeah.

44:19 That's the one.

44:20 So it's working.

44:21 Now, if I ask just straight up, which Python is that virtual environment one, right?

44:25 Yeah.

44:26 And I can do pip list and so on, but there's also ways, I think I recall, in hatch to like

44:32 show me my dependencies and get a list of.

44:34 Yeah.

44:34 Hatch, dep, show.

44:36 Dep, show.

44:37 Yeah.

44:37 Is it show dep?

44:38 Table.

44:38 Ah, table.

44:39 It's just a few options.

44:40 Yeah.

44:40 Okay.

44:41 That's your environment.

44:42 I only have right now two dependencies, pytest and pytest cov.

44:45 Yeah.

44:46 Interesting.

44:46 Or I could do requirements.

44:49 Yep.

44:49 And I would split out the.

44:50 The same, but it's not as a table, right?

44:52 Just plain text.

44:53 Yeah.

44:53 Just like requirements.txt.

44:54 Got it.

44:55 Okay.

44:56 Yeah.

44:56 Excellent.

44:57 What do you recommend?

44:58 So there's the hatch run commands, which we'll use the environment, or you can just go into

45:02 the shell and run it.

45:03 Or if I'm sneaky and I put my virtual environment in there, I might have something that automatically

45:11 detects that environment and picks it up.

45:13 So for example, PyCharm might go, you know what?

45:16 I see a VE and V folder.

45:17 We'll use that and, and just grab it and not care about hatch directly.

45:22 Right.

45:23 That's actually one of the reasons I was asking about putting it locally is it's kind

45:27 of a hassle to find that thing and tell your editor, go find it over here.

45:31 Whereas it automatically finds the top level of project variant, you know?

45:37 Yeah.

45:37 So you can do, as we talked about, sitting in the current directory, like a .vnv.

45:43 And yeah, PyCharm VS Code, they'll pick it up because it is just a virtual environment at

45:49 the end of the day.

45:50 Nothing too special.

45:51 So yeah, it will work out of the box.

45:54 Yeah.

45:54 And Colette's out there in the audience has got us covered.

45:56 pip-tools command is pip tool, pip compile, rebuild, output file, such and such, pyproject.txt

46:02 from pyproject.toml.

46:04 Yeah.

46:05 Cool.

46:05 Nice.

46:06 Yeah.

46:06 And variations on that, I suspect.

46:08 So one thing that I was thinking about this that I expected hatch to do, and maybe it does

46:14 and maybe it doesn't, I just don't know, is suppose I want to use requests for calci.

46:19 Like calci can't run locally.

46:21 It needs its calculator API service that it's going to connect to.

46:25 So it needs a request or HTTPX or something.

46:27 Yeah.

46:28 Is there a way with hatch to say, I have a new requirement, set that up, put it in the pyproject.toml, install it.

46:33 That's going to come with the lock file plugin.

46:36 I figured it wouldn't make sense to add those commands until I knew how locking would work.

46:43 Because adding and removing always hits the locking logic.

46:48 And since there wasn't locking, it didn't make sense to me to add those commands.

46:53 All right.

46:54 Yeah.

46:54 That makes sense.

46:54 It's going to come soon.

46:55 So right now, you would just modify your pyproject.toml until those are added.

47:00 And then I think there's a way where hatch looked at your pyproject.toml and said, okay, you're

47:05 going to need these dependencies, right, when you run it.

47:09 In what sense?

47:10 I thought it installed the dependencies that were in the pyproject.toml.

47:13 Even if it won't edit it, like if I put something in there and I try to run it, it'll say, oh,

47:17 you need this.

47:18 Yeah.

47:18 It'll sync automatically.

47:19 What command do I use to do that one?

47:21 Either a run command or the shell command.

47:25 I see.

47:25 Oh, even the shell will do it, huh?

47:27 Do you hatch run pip list, for example?

47:30 Yeah.

47:30 Okay.

47:30 Now in pyproject.toml, add requests maybe to.

47:35 Yeah.

47:36 All right.

47:36 Now I have requests and friends of requests.

47:38 Yeah.

47:39 Yeah.

47:39 Yeah.

47:39 Okay.

47:40 That's pretty cool.

47:41 Nice.

47:42 And then I'm looking forward to the lock stuff because I absolutely love pip-tools.

47:46 I think it is a glorious way.

47:49 I used, for a while, I used PendaBot at GitHub and it drives me crazy.

47:54 It's like so noisy.

47:55 I'll get like 30 PRs a week.

47:58 I'm like, you know, could you just package this up?

48:01 And so now I just start periodically.

48:04 I just go, okay, I'm going to use pip-tools and just ask like, how has the world changed?

48:07 And then update my stuff in a more sane way.

48:10 It was a bit noisy for us too at work.

48:12 So we had like a custom dependency update logic as well.

48:17 I think there is an open page request for a dependent bot to chunk the updates, but I

48:22 don't know if it has happened yet.

48:24 Yeah.

48:24 I think I've seen one of those for a couple of years and there was like a hundred plus

48:28 one.

48:28 Me too.

48:28 Me too.

48:29 Like I got to review these things.

48:31 You know what I mean?

48:32 And I don't know if it's there.

48:34 It's not there on my projects.

48:35 It's still.

48:36 Yeah.

48:36 I'll get 20.

48:37 I'll do a pip compile update and I'll push that and I'll get like 20 messages.

48:42 These are no longer required.

48:43 I'm like, okay, thanks.

48:44 Could you just batch them?

48:47 Yeah.

48:47 Anyway.

48:47 Yeah.

48:48 Okay.

48:48 So calci is coming along here.

48:50 Let's just imagine that it does good stuff.

48:51 I haven't even written any code for it, but it depends upon requests.

48:55 So that's a start.

48:55 The next step going kind of forking on the various possible definitions of what packaging

49:01 is.

49:01 A next step for this thing might be, I want to put it onto PyPI or create a wheel I can share.

49:06 So hatch also supports that, right?

49:08 Yeah.

49:08 So first you have to create the artifacts.

49:12 So you would do hatch build and that would build Metafault, both the source distribution

49:17 and the wheel.

49:19 Okay.

49:19 Now in your current directory, just like the other tools, there's going to be a dist,

49:24 D-I-S-T that now has those.

49:27 And if you run a hatch publish, that would put it on PyPI by default.

49:33 And it would prompt you for your username.

49:37 I'm not entering that.

49:38 I don't want to own calci on PyPI.

49:41 No, just kidding.

49:41 But yeah, I don't think I have it configured, so it wouldn't really do anything.

49:44 But it would.

49:45 It would go and put it on PyPI, right?

49:47 Yeah.

49:47 Potentially.

49:48 Yeah.

49:48 That's pretty straightforward.

49:49 You also point out in the docs that CI build wheel and things like TOX, you could be

49:58 the build, just hatchling could be the build system for that, right?

50:01 Hatch does a lot.

50:02 So you can use parts.

50:04 Say you wanted to only use environment management to replace like TOX and NOX, you could do that.

50:11 If you wanted to only use hatchling with like CI build wheel or other tools, you could do

50:17 that.

50:17 If you wanted to only use the version management, you could do that.

50:21 It's kind of choose whatever you want.

50:24 Yeah.

50:24 You're not locked in.

50:25 Yeah.

50:26 So the last thing I could do is publish, but I'm not really going to go.

50:29 Yeah.

50:30 There's also a way to set in the config file.

50:33 You said that if I set into the config file under the publish index, disable true, where

50:39 you can make it confirm rather than just straight up publishing it, right?

50:42 Yeah.

50:43 That was a feature request.

50:44 Yep.

50:45 So yeah, cool.

50:45 Another thing that is always, I've always stumbled on when I do this, at least with Twine is I'll

50:53 have some project.

50:54 I've done this.

50:55 I published a version later.

50:56 I'll come back to it.

50:57 I'll make some changes.

50:58 I'll increment the version.

50:59 I used to have to do that manually, but now I can just do a hatch version and then something

51:05 like, I could build one again.

51:07 Minor.

51:08 There you go.

51:09 There we go.

51:10 It'll automatically change it.

51:12 And that changes the code, which is great.

51:13 So now if I do a hatch build, which is really nice, it'll create a new one.

51:18 But if I look in my project, I've got the old one and the new one.

51:22 And you can't republish the old one, I don't think.

51:24 So what happens if I just say publish now and I've already got 0.1.0 out there?

51:29 Yeah.

51:29 So you can do hatch build dash C for a clean and it should clean it first.

51:35 Okay.

51:36 That's cool.

51:36 Because then I can just say hatch publish and not worry about conflicts.

51:40 Anything that exists already on PyPI, it will ignore us.

51:44 It'll put a warning, but it won't fail the command.

51:47 I think Twine by default does fail.

51:50 I think it does as well.

51:52 So I do the inverse because that was frustrating to me too.

51:55 So I do the opposite.

51:57 Yeah.

51:58 Perfect.

51:59 I love it.

51:59 Okay.

52:00 Yeah.

52:01 That's a really cool aspect.

52:02 And so, yeah, that was, I guess, walking through that.

52:07 I think it was neat to just kind of explore it together.

52:09 So thanks for talking me through that.

52:11 Yeah.

52:12 The past month I've been pretty busy at work, but I'm going to pick up development again next

52:17 week for hatch.

52:18 There's a bunch of open feature requests.

52:21 I have to crank out.

52:23 Yeah.

52:23 This is a pretty popular project on GitHub with 3.7,000 stars.

52:27 So I suspect there's some user feedback.

52:29 Yeah.

52:30 And so it's the main next features are the lock file plugin mechanism.

52:37 And also people are asking about workspaces, which is basically like kind of like editable

52:44 and stuff, but more built in and fundamental.

52:47 So I'm going to add that especially useful for monorepos.

52:51 Oh, right.

52:52 Okay.

52:53 Because you don't necessarily want to hatch build all of Google or whatever, right?

52:58 Right.

52:59 Right, right.

53:01 So a workspace is like a view into the monorepo that I said, I know there's like 500 projects

53:06 here and they all have their things, but I want the web app and the data layer.

53:11 That's it.

53:12 Something like that.

53:13 Right.

53:13 Exactly.

53:14 Yeah.

53:14 Okay.

53:14 That sounds useful.

53:16 Yeah.

53:16 And I'm modeling it after cargo workspaces in Rust.

53:20 I worked with that recently and I think they have pretty good config and like a model of

53:26 how local development works.

53:28 Okay.

53:29 Yeah.

53:29 That sounds really great.

53:30 Yeah.

53:30 I do my preview of what hatch will look like at basically cargo workspaces.

53:35 Nice.

53:37 Jonathan out there says, that sounds like music to his ears.

53:41 Definitely waiting on the workspaces feature for our monorepo work.

53:44 Nice.

53:45 And then also Ryan is asking you, any chance there could be a package build target?

53:50 I'm using PECs via TOCs currently.

53:54 Yes, that's possible.

53:55 One thing that's great about plugins is I don't have to do every feature.

54:00 Anybody can do that.

54:02 So we do have, if you go to the docs and go to the top, plugins.

54:07 Plugins, where are you?

54:08 You're home.

54:09 Yeah.

54:09 Plugins.

54:10 Builder.

54:11 Builder.

54:11 Yeah.

54:11 And then reference.

54:12 Yep.

54:13 And then, yeah.

54:14 So known third party.

54:15 So here's some examples of third party builder plugins.

54:19 So the build command that you ran, it has an option to output a target.

54:25 Okay.

54:26 Named target.

54:26 Other than wheel and sdst.

54:29 So you can write an arbitrary builder and build those targets.

54:34 So yeah.

54:34 Okay.

54:35 It's probably not super hard to do, I'm guessing, to just like basically bundle up the commands

54:40 to build the PECs.

54:41 Yeah.

54:41 And just implement the interface and that's all I gotta do.

54:44 Yeah.

54:44 Excellent.

54:44 Good to hear.

54:45 I vote for the lock file management, the dependency management.

54:50 I'm excited to hear that that's coming.

54:52 Yep.

54:53 That's coming next.

54:53 Are you thinking of building on something like pip-tools or doing your own?

54:58 I wouldn't feel confident doing my own without feedback from like other folks that have been in this for longer.

55:06 Like Brett Cannon.

55:08 I think he wrote the first lock file PEP attempt last year.

55:12 For various reasons, it kind of got rejected.

55:15 But I think his next attempt will happen.

55:18 I just don't know when.

55:19 Excellent.

55:20 There's also a suggestion, a Cython builder would be cool.

55:23 Maybe a mypyc.

55:25 I don't know.

55:26 There's a lot of options.

55:26 That one exists actually.

55:27 Oh, the mypyc one does?

55:29 Okay.

55:29 I do remember seeing.

55:30 Yeah.

55:30 If you go back to the plugins.

55:32 I know the docs are a lot.

55:34 Sorry.

55:34 Back one.

55:35 Build hook.

55:36 Okay.

55:37 And then reference.

55:38 And it's listed under a third party.

55:40 Hatch mypyc.

55:41 I maintain that one actually.

55:43 Okay.

55:43 Nice.

55:44 Actually, Black builds with that now.

55:47 Nice.

55:47 What about the Jupyter builder?

55:50 What does that do?

55:51 So recently, Jupyter switched their entire extension ecosystem to Hatchlang actually.

55:59 So now the standard way to do Jupyter stuff is with Hatchlang.

56:04 And that's the plugin that everything happens with.

56:07 Nice.

56:07 Okay.

56:07 Cool.

56:08 Probably makes you feel good to see major projects like that using your tools.

56:12 I'm happy with people who are finding a value in it.

56:15 And every time someone says, oh, it's so easy to use, it makes me happy.

56:20 Yeah.

56:21 Indeed.

56:21 I like stuff that I can do a lot, but it's very simple.

56:24 That's my purpose.

56:26 Yeah.

56:26 I think I might play with the config, the global config, to see how close I can make it match

56:31 my current workflow and make it kind of coexist what I'm doing.

56:34 So that'd be fun.

56:35 Awesome.

56:36 All right.

56:37 Well, I think we're about out of time.

56:40 Anything else you want to throw out there while we're talking about your project?

56:43 If anybody wants to contribute, there's lots of open issues.

56:48 I have had lots of really nice contributors.

56:51 They almost finished adding type hinting everywhere.

56:56 In the beginning, I had zero type hinting.

56:58 And then a bunch of contributors helped out with that.

57:01 And that was almost fully my pie.

57:03 So.

57:04 Cool.

57:05 Yeah.

57:05 I saw you had 40 contributors.

57:07 So that's really cool.

57:07 Yeah.

57:08 Maybe one other quick comment that I'd like to ask you about here is I see the domain this

57:14 is on is hatch.pypa as in Python Packaging Authority dot IO.

57:18 Mm-hmm.

57:19 How'd it end up on pypa dot IO versus, you know, hatch dot dev or whatever?

57:25 This is just the standard domain for all the packages.

57:28 So if you type in pip rather than hatch and get rid of the latest part, it'll go right

57:35 to the pip docs.

57:35 Right, right, right.

57:36 Well, I was thinking more about like how did it become sort of official?

57:40 I announced hatch 1.0, like the rewrite that happened last year sometime.

57:46 And then the same day, maybe the next day, I forget who, but somebody in the discord was

57:52 asking if I wanted to join the pipa.

57:55 And I was like, well, sure, that makes sense.

57:58 So then there was a vote on the mailing list and it was unanimous that they agreed.

58:03 And then after I think seven or 10 days, then we transferred the repo and it was hosted

58:10 on the new domain.

58:12 Oh, yeah.

58:12 And it's also under the GitHub organization of pypa.

58:14 That's right.

58:15 Yeah.

58:15 Excellent.

58:16 All right.

58:17 Well, really nice project.

58:18 Congrats on all the uptake and.

58:21 Thanks.

58:21 Yeah.

58:22 It looks like people are enjoying it.

58:23 So two quick questions before you get out of here.

58:26 I didn't get to ask you this on the panel one because one, we were over time and two,

58:30 there was a bunch of people in order just another 10 minute debate.

58:33 Yeah.

58:33 First of all, notable pypi package, something that you've come across.

58:36 Oh, this is super cool.

58:37 People should know about package X.

58:39 Anything come to mind?

58:40 I guess it's a bit cliche because right now it's actually pretty popular, but I would

58:45 still evangelize textual.

58:47 Textual is like a new application for booting T-UIs, which is like textual user interfaces.

58:56 I've actually been doing a project at work that uses this and it's very nice.

59:02 It's pretty awesome.

59:03 It's kind of nuts what this thing does.

59:05 Yeah.

59:06 This is like the higher order UI framework built on Rich by Wilma Guggen and team.

59:11 You get like fly out docking panels and scrolling within.

59:17 It's crazy.

59:17 Yeah.

59:17 It's kind of like if the web could be in a terminal.

59:21 Something like that.

59:23 It's true.

59:24 I plan to actually use this for a hatch when I have time.

59:27 On the interactive creation of a new project, on the left-hand side, you would have inputs,

59:36 and then it would render the pyproject.tama on the right-hand side and markdown.

59:41 Oh, that's super cool.

59:41 In a few months.

59:42 Yeah.

59:43 Fun.

59:43 And then if you're going to work on hatch, what editor are you using these days?

59:48 I price time for large projects.

59:51 When I'm doing like one-off scripts, then VS Code.

59:55 Mm-hmm.

59:56 Okay.

59:56 Cool.

59:57 All right.

59:57 This may be a question I got to start asking people.

59:59 I don't know.

01:00:00 PyCharm and all the JetBrains IDs, I believe, are starting to promote what they call the new UI,

01:00:07 which I think is much more like VS Code.

01:00:10 Are you the old school style or are you the new UI style?

01:00:15 I've not seen that yet, actually.

01:00:17 There's a gear in the upper right.

01:00:18 If you click on it, it'll say new UI.

01:00:20 To me, I'm old school.

01:00:21 I love the old one.

01:00:22 I mean, I'm using PyCharm, not VS Code for a reason.

01:00:25 So I don't want it to look more like VS Code for my style, right?

01:00:29 But I know other people prefer the opposite.

01:00:30 I wouldn't mind using VS Code.

01:00:32 There's one missing feature that is like a blocker where I just won't use VS Code full time,

01:00:38 which is it can't yet do vertical tabs.

01:00:41 There's an open feature for years.

01:00:44 And I guess technically, there's some kind of challenge to implementing that.

01:00:49 So right now, if you have like 100 tabs, it doesn't look very nice.

01:00:53 It's all horizontal.

01:00:54 It's just a bunch of Xs.

01:00:55 Yeah.

01:00:57 I can't select them.

01:00:58 I just close them.

01:00:59 Yeah.

01:00:59 Yeah, I got it.

01:01:00 Okay.

01:01:00 Very cool.

01:01:01 All right.

01:01:02 Well, congrats with Hatch.

01:01:04 And thanks for coming on the show.

01:01:06 Yeah, thank you very much.

01:01:07 Nice talking to you.

01:01:08 Yeah, you too.

01:01:09 Bye-bye.

01:01:09 All right.

01:01:09 Bye-bye.

01:01:11 This has been another episode of Talk Python to Me.

01:01:14 Thank you to our sponsors.

01:01:16 Be sure to check out what they're offering.

01:01:17 It really helps support the show.

01:01:19 Don't miss out on the opportunity to level up your startup game with Microsoft for Startups

01:01:23 Founders Hub.

01:01:23 Get over six figures in benefits, including Azure credits and access to OpenAI's APIs.

01:01:28 Apply now at talkpython.fm/founders hub.

01:01:31 Take some stress out of your life.

01:01:34 Get notified immediately about errors and performance issues in your web or mobile applications with

01:01:39 Sentry.

01:01:40 Just visit talkpython.fm/sentry and get started for free.

01:01:44 And be sure to use the promo code talkpython, all one word.

01:01:48 Want to level up your Python?

01:01:49 We have one of the largest catalogs of Python video courses over at Talk Python.

01:01:54 Our content ranges from true beginners to deeply advanced topics like memory and async.

01:01:59 And best of all, there's not a subscription in sight.

01:02:01 Check it out for yourself at training.talkpython.fm.

01:02:04 Be sure to subscribe to the show, open your favorite podcast app, and search for Python.

01:02:09 We should be right at the top.

01:02:10 You can also find the iTunes feed at /itunes, the Google Play feed at /play,

01:02:15 and the direct RSS feed at /rss on talkpython.fm.

01:02:20 We're live streaming most of our recordings these days.

01:02:23 If you want to be part of the show and have your comments featured on the air, be sure to

01:02:27 subscribe to our YouTube channel at talkpython.fm/youtube.

01:02:31 This is your host, Michael Kennedy.

01:02:33 Thanks so much for listening.

01:02:34 I really appreciate it.

01:02:35 Now get out there and write some Python code.

01:02:37 We'll see you next time.

Back to show page
Talk Python's Mastodon Michael Kennedy's Mastodon