 All right, good afternoon. Let's see. Have sound. We are just live on YouTube. Did not, hopefully, uh, did not mess it up. The double YouTube action this week. I don't think so, hopefully. Okay, let me shuffle a few more of these around. How's it going, Jeff? Over in LA, sunny and 16 degrees C. It is, uh, sunnier and warmer there than here. I hear you fine. Yeah, thanks. Appreciate the heads up. All right, let's get a few more of these things shuffled around. Yeah, I could, uh, I would not be opposed to a little bit of your heat if you want to send some my way. All right, good afternoon. Welcome to everybody. Uh, first of all, thanks for tuning in. Let's do this real quick. Uh, let's also do some more things like this and maybe this or at least you open this to our circuit Python stuff. Uh, yep, that one. We'll bring that back to work on. So welcome, uh, let's see, almost there. I'll take some, uh, somehow, if you've got, uh, any to trade, yeah, the heat, I'm guessing is what you mean. Oh, take some snow, actually. So I take some snow if anyone's got any to trade. So that's the thing. We have a little bit on the ground, but it's not enough to do anything, right? Really? It shouts back on top. Okay. Good evening and welcome. Thanks for tuning in. My name is Tim. This is the deep dive. We are working on circuit Python stuff for anybody that might be new. If you don't know what circuit Python is, you can learn more at the website for it here, circuitpython.org. This is basically a version of Python that runs on tiny computers called micro controllers. Um, these devices typically will plug into your computer. They'll show up like a thumb drive. You will edit a Python code file on that thumb drive. And then when you save it, the microcontroller, the computer that's actually on these little boards will read that, um, Python code file and execute it for you. Uh, and they can interface with all sorts of other electronic widgets and doodads. So lots of microcontrollers come with, um, IO pins, input output pins that you can hook up whatever you want to different kind of electrical components. Uh, but some of them are more purpose built and they have a lot of different purpose built and they have stuff already kind of built in like this pie portal right here has a touch screen and some sensors and a neopixel and some other stuff. This macro pad has some keyboard key switches and a knob and a screen. Um, so different shapes and sizes, different form factors. This one's good for alligator clips and it's got lots of RGB neopixels on it. This one can also take some alligator clips down there on the clue on its little plug in edge thing. So all kinds of different devices and circuit Python is the thing that kind of ties it all together that runs on all of these. In this stream, typically we're working on, uh, it's called deep dive because we're typically getting into the nitty gritty a bit in circuit Python. When Scott is here, Scott is the lead developer. So he's typically working on stuff deep inside the circuit Python core. When I am here, I don't tend to work quite as low level as he does. So usually more so on libraries or when we venture into the core, it's more surface level stuff, not quite cutting edge, implementing new ports and some of the more intricate stuff that Scott's working on. So this week, I've got some library stuff to look into. So we'll dive into that in a minute. Let me also say, of course, as always, thanks to Adafruit. This is their website, Adafruit.com. You can head here if you would like to help support circuit Python. Adafruit is hardware and software company based out of New York. And they're the ones who are financially backing the circuit Python project by paying the folks who work on circuit Python. Scott, the lead developers, as well as a couple other folks are paid by Adafruit full time to work on circuit Python. Some folks like me are paid to work on it part time. And, you know, it's all made possible because folks are going to adafruit.com and buying hardware from them so that they can keep the lights on, keep the business running, and keep paying us to work on circuit Python. So thanks to them and thanks to everybody who purchases hardware from them. Really, really appreciate it as always. Two degrees C in Michigan and blizzarding. I'd be happy to send you some snow. So we've got a we've got a taker on some snow headed to Beata. So two degrees C and blizzarding is not quite as bad as it is here. So I will say that hopefully it clears up for you quickly. And somewhat selfishly, I'll say hopefully it doesn't come my way. Okay, so first thing this week is a little bit of infrastructure stuff. We're going to try to set up some web hooks on this. This is a display library that's over in the actual circuit Python organization, which is kind of a separate organization where some libraries live that are community libraries. They are maintained by members of the community, but more specifically, kind of like groups of members of the community. There was a team of us that kind of started taking on a bunch of these display.io widget projects and formed a kind of group on GitHub that does a lot of that sort of stuff. And so when that happened, Scott was into this idea of creating the circuit Python org where it can hold libraries that are maintained by multiple people in the community. It's community libraries, but not necessarily just maintained by a single individual. This one is for a gauge, which is a kind of semi-circle sort of like progress bar type thing. You can fill the gauge a certain percentage and it will fill up around the circle, at least if I recall correctly. Maybe I'm maybe I'm misremembering, but that's what I think it is. But this repo, when it was cookie cut, it must have been on like an in-between version of cookie cutter or something and it was set up without any webhooks, right? It doesn't have the actions folder like .github. And there's also some other stuff like pyprojecttoml versus setuppy will take a look. Yeah, I see inside of here there's really nothing in here and it'd be better if there was, I think, and there's also setuppy disabled, which is labeled as disabled. But that means we don't really have a sort of main manifest file or whatever. So we're going to try to do get this thing updated on its kind of infrastructure to give it the webhooks or actions. I'm calling them the wrong thing, I guess. Sorry. Workflows is if I'm calling them the wrong thing and it's not even the word that I'm thinking of webhooks is what I'm saying. Workflows is actually what I was thinking and actions are what they're actually called. So three degrees of off there. 80 degrees F here. Good evening. Yep. How's it going, DJ Devon? That sounds pretty awesome. It would take some 80 degrees F for sure. So I think the easiest way to do this is just to use cookie cutter. Honestly, we're just going to cookie cut it like it's going to be a new library and then and then we can just copy the generated stuff in. Instead of trying to like fix each file one at a time and bring it up to date. I mean, another thing we could do, I guess, is copy it out of a different library. That's all right. I think we, well, let me take a look actually. Let me take a look around. Or do the rest? I mean, is this the only one that's missing? Yes. It is. Because this has webhooks here. So we could maybe reuse. I think we, I think we still just go the cookie cutter route. I think we cookie cut a new library with the same name, with the same kind of description and everything and just copy in the files we want, basically. All right. So for anybody that has never done it before, cookie cutter is the tool we do, the tool we use to create those new libraries. And it is a command line tool. You can install it with Python, PIP, I think, yeah, PIP install cookie cutter. And then the way it works is you run the command cookie cutter and you specify which, you know, I don't know what they call these templates, maybe, or recipes or something. I don't know what they call them, but you specify the kind of template thing you want. And then it goes and pulls this template, in our case, from GitHub, which I assume is what this GH means right here, pulls the template from GitHub and then it kind of like creates a project for you from this template, after you answer a series of questions like, what's the name of the project? Who wrote it? What's it do? You know, all these different prompts you answer, which you'll see here in a minute. I should already have it installed. So we're just going to run the command by itself. I'm going to do this in here, I think, because I like that I can copy paste a little easier into the terminal of this one. A quick overview of those terms, cookie cutter, web hooks. Yep, cookie cutter, I just hit web hooks is or what I'll try to start calling them with the correct name. So the actions is what it's called inside of GitHub. Actions are a thing that essentially you create them and you manage them by having this dot GitHub folder. And within there you can have workflows, which was the other name, which I was misremembering and calling web hooks. They are basically a way to run some automated code, some automated actions whenever certain things happen within your repo. So the main things that we use them for are whenever the repo has a new commit into it, like from, you know, a PR getting merged or something like that into the main branch. There will be a build action that runs and it goes and it does a bunch of things. It runs the code formatting, it runs pilot, it builds the docs. It does a bunch of different things like that. In this case, they're all linked out into this other one so that it's not actually just listed out in this file. So that's anytime a new commit is made, it does all those things automatically, and then anytime a release is made. We also have some more actions that do basically all the same things. They run the code format, the pilot, they do all that. But they also do two additional things, which is upload the release to the GitHub assets page. So on the release itself right here, whenever you're looking at a release, there's all these assets right here. So one of those actions, this one right here GH, release GH, that's going to upload the files to this page right here. And then release PyPy, that's going to upload the copy of this library to PyPy, which is the Python packaging index. I don't know if that's the right name. Adafruit Circle Python display layout. So this library is listed on PyPy as well. And when a new release is made, the action right here, release PyPy triggers it to upload, to build and upload to PyPy, the newest version of that library. Yeah, great question by the way. And let me mention as well for anybody, feel free to throw out any questions about anything I'm working on or stuff you're interested in that's related to Circle Python. I'm happy to answer questions. I know Scott's the same way as well. So if Lent fails and stuff, do people know? Yes, definitely. So what it does is when the actions fail, it will give you a red X right here. So let's see, we don't have a PR, there's a couple PRs here actually. So we could look at these. So this is a pull request right here. And so it runs, it runs the actions on a pull request as well, even though it hasn't committed to main yet, it actually runs it against the PR branch. So it does the code format and the pilot. And what it will do is you can see this one back here has a red X, that one failed the actions. And then in this case, it was me. So I made a new commit. And then I must have realized there was another thing wrong with it because I made another new commit or something or one of them is just a merge, I guess, actually. And then it shows a green check. So red X will mean that you failed actions, which means like your pilot could have failed or your code format could have failed, or the docs might not have built or something else could have gone wrong. But then once you see that red X, you just kind of got to dig into the logs and figure out what it was and try to get it fixed. And once you can fix it with a new commit or something like that, then it will rerun the actions to check again. And if it's all good, then you'll get the green check. Yeah, for sure. Yeah, really cool. Really good questions, by the way, again. Yeah, actions is really neat stuff. It's like a GitHub thing that lets you just automatically run stuff. And we only use it for those kind of like very specific things. The action system itself, it's way more broad. It can trigger on all sorts of different things. It doesn't have to just be commits or releases. It can do triggers on all sorts of stuff. And it can trigger, you know, basically any kind of code that you want effectively. So it can kind of do anything you want it to, which is really cool. It's a really neat tool. All right, so we're going to get back into that cookie cutter. I'm just going to go up one. And then I think I have cookie cutter cookie cookie kitchen, I called it cookie kitchen. We'll just go right on over to the cookie kitchen. We will drop the cookie cutter command, which we had from our learn guide, which I closed or went away from or something, or maybe had in a different browser. First fails. Yeah, first fails are usually not from formatting with black first happens all the time. Black is the circuit Python code formatter kind of like pylon just for circuit Python, I think. Yeah, black is used for other stuff outside of circuit Python, but it is it is kind of like pylon, but it's mostly centered around the format specifically. Whereas pylon also checks not just the code format, but things like, you know, did you name your variable a good name or did you, you know, use if statements the right way or else blocks the right way or all kinds of stuff like that. All right, so cookie cutter, we run this command right here, it's going to ask us are we find download the new one, we tell it yes, it's going to download. So it's going to ask us all these questions. There's 14 questions. This is the first one, which is what's our target bundle. In our case, it is circuit Python org. So we're going to go three GitHub user circuit Python. That's the default. So in this little teal parentheses right here, that's the default, we're going to leave that one alone, because that's the GitHub user we want author name, we're going to take whatever is there today, which is I don't know if Gary Z author name Gary Z author email, we're going to leave alone because the email is tied to the GitHub account. And in this case, you know, Gary Z was like a community member, I don't you know, I don't know if they want to be getting emails for this or not. So we don't want to just put them on. I don't know the email address anyway, so we can't we couldn't put it there if we wanted to, but even if I could, I wouldn't want to company circuit Python, we're going to leave that alone again, that's kind of a reference back to the circuit Python organization on GitHub. That's just the default value when you're creating a library for the circuit Python organization, the library name. So this one I need to look at the learn guide. I think it wants the shortest one, right shortest name usually a chip name like LIS 3DH. So in our case, that is, that is, that's the wrong library, first of all, circuit Python org. So it is display IO gauge, that's the short version of the name that we want. Sometimes I forget that punctuation is case sensitive. Let's see is anyone is anyone allowed to use cookie cutter, or is it only for contributing Adafruit stuff writing my own actions with GitHub is above my head. Yeah, more great questions. Anyone is allowed to use cookie cutter. Even more specifically, anyone is allowed to use the the circuit Python cookie cutter, the template that creates these circuit Python libraries, anybody is allowed to use that. And then cookie cutter itself is a much broader tool, anyone is allowed to make any template they want. So you could make, you know, templates for your own personal projects, whether it's HTML or Node.js or whatever kind of personal project it might be, you could make templates for that with cookie cutter and then use cookie cutter to create your own projects. It could be totally unrelated to to circuit Python, Python and everything. It can be its own, its own whole thing. And then if you if you publish your template in GitHub, you can have other people use your template as well. So kind of like how the circuit Python one is, anyone can use that circuit Python one because the template for it is published on GitHub. And again, I don't know if templates the right name. So I'm, I'm saying the word template, that's what I think of it as. You know, forgive me if it turns out that it's not actually the correct name, I could be wrong there. So library name, we're going to go display IO gauge. Yeah, I'm actually I am going to type it. So it is, I wanted to arrow back, but it doesn't really actually, okay, so we did, let me, here's what we're going to do actually is we're going to just paste it in a temp. And then we can make sure so what I was trying to do is I was trying to make sure we have no extra spaces, we don't want any extra spaces. So I was trying to arrow back to see if there was a space here at the front. But it doesn't like you to arrow for some reason, I have noticed that. So the library description again, since I'm actually creating one for a library that already exists, I'm just going to copy paste the description because that's what that's where this came from. Obviously, if you were making a new library, you would write a little description about what is, you know, what, what is it, what does it do, what's it for, you know, that kind of stuff was a support, if it's for hardware. I'm going to do the same trick here, we're going to paste into this, make sure we got no extra spaces, perfect, very good. Oh, actually, there is one at the front. Huh, look at that. Library keywords, actually know where those end up. Those are here somewhere. There was keywords. Okay, so we'll just use these same keywords and the keywords are space or comma separated. So let's see here always back to the trustee learn guide. Keywords used to populate the keywords for the searching of the library and pie pie, entering a string of lowercase. So lowercase and they're separated by spaces. Yeah, lowercase, separated by spaces. So what we're going to do is actually just take the same ones from before. So some of them are automatic. We're going to go with only the ones that were added that are not automatic, which in that case is going to be starting here. So all those were automatic and the library name was automatic. Yeah, I will say one thing about the actions to actions. I don't have a lot of experience with actions either. All the experience I do have is with circuit python. So if you happen to know me through circuit python, it could seem like I have a lot of experience with actions, but it's the only experience I have really. One thing I will say too though, if writing them is over your own head, that's no problem. One of the really cool things about actions is people can publish them, right? So you can reference them kind of in a similar way as to cookie cutter where those templates can be published. So there's this whole library of actions out there already that exists that do all sorts of wonderful things. So in a lot of cases, whatever you could think of that you want your action to do most likely is unless it's really something kind of crazy and out there, most likely there's already one out there and you could just go and find it and use it. And then it's as simple as you know, kind of almost just like calling a function in a way, right? You just tell it which thing you want to execute. It's not same syntax as like calling a function in python or something, but it's a very similar idea where you just kind of import somebody else's thing and tell it what the arguments are and tell it what to do with the output when it's done and kind of do it for you. Library prefix. I always mess this one up when I guess it. So I think we're just going to leave it blank. It doesn't specify that a default is there. And technically what we really want it to do is I wanted to put the circuit python org, which I think is what it's going to do, but I don't remember. I'm just going to leave it blank. And if it doesn't do it, then we'll just have to run through these steps again and put it in. There is no product ID with this one. It does not require bus device because it's a display widget. It does not require register, other requirements. It should have display layout actually listed, I think. It doesn't right now, but it should, I think, right? Because it extends widget just from display layout. Let's make sure I'm not making stuff up. No, I'm totally wrong. It extends tile grid. And therefore, no, it does not need display layout. It does not need anything else. Okay, good. I'm glad I checked. So other requirements, we're just going to leave it blank, enter. Sphinx stocks, yes. All right, that was it. That was number 14. We're done. LS. So that has now created, right here, circuit python display or gauge, right LS before I started. Yeah, okay. So that's the LS room before we started. So we know for a fact, this is the one it just created right now. That is the exact right name, which is perfect. Our prefix did exactly what I wanted is good. I think that's the first time that I have ever like guessed and done it correctly. I'm usually, I guess usually what I do is add something there and then regret it and do it again. But Ty, it says, try forking circuit python, then enabling actions and see what fails. Usually anything that does publishing, releasing or needs tokens, which you want to update and comment it out. That was confusing. Are you saying secrets like that? Of course, you wouldn't want to fork a clone. Yeah. So the way the secrets work is the secrets are stored in kind of a separate place. They're not in the actions themselves. So there's no, well, like you need to be careful, right? Like obviously a person could accidentally put a secret token or something like that in their actions file. And that would be bad with the circuit python libraries. There's never any secrets in the actions file. Nothing ever gets put into there. So there's never any, any worry about the actions of a circuit python library containing that sort of thing. The way that it works is there is a library environment, a repository environment, which is part of the settings page. I'm not going to click over to it right now because it shows, I don't know what all it shows, but some of it we might not want on the screen. But inside the settings page, there's a place where you can set, I believe they called them environment variables or secret variables or something like that. You set them in there. That's where you put your API tokens and stuff. And then in your, we can actually take a look at it right here in your actions. It can reference that stuff without having it in there. That makes any sense. So I want to open just this real fast. So we get over to circuit python and then open, we want to go to cookie cutter kitchen, cookie kitchen, cookie kitchen right there. We'll just open this is the one we just created right here. And if we look at the actions, like let's say release pi pi actions, what you can see right there, they have this thing where it's like dollar sign bracket, bracket, secrets dot pi pi password. So it puts this like this. And then that knows to go and find it from the environment variables and substitute it in here. So when it executes, it will have the value of the pi pi password. But when you look at this file here, obviously, it's just like a variable name. Can you can set up your get repo to ignore settings Toml's secret spy? Yes. Yeah. So get ignore the dot get ignore file, this one right here. So if I understand your question correctly, which I may or may not, but my understanding, like how I'm interpreting your question is like, could you have your repository not check in those files not offer to check in those files? If that's your question? Yes, you totally could the way you would do that is in your dot get ignore file. If you don't have one, just create one. But if you used cookie cutter or something like that, then you already have one in that dot get ignore file, you can just put the name of any file you want. So if you, you know, if you were to put settings dot Toml here, then what that will do is like, if you had a file called settings dot Toml, whoops. So this is technically not a get repo right now. It's just a folder. So I'm just going to say get a knit. Do I want to do that? Yeah, I'm just going to say get a knit. Okay, and then you can see right here. So I like this is a pie charm thing. Pie charm has made this yellow right here. You know, obviously pie charm is helping out by doing the color coding and stuff. But basically what that yellow means is that settings Toml is in the get ignore file, which means that it will not automatically get added. If I were to like, click up here and to say control alt a or get add, then it would add all these files to the get repository, but it would not do settings dot Toml. Even if I don't specify it separately, it would not do it automatically because of it being in the get ignore. And you can put any file you want secrets pie or whatever else you can even do directories as well. So like if you had a directory called my secret, you know, stuff, directory, or whatever, you could have an entire folder and you can do star patterns, you know, if you want only Python files inside there or whatever, you can do all kinds of fancy stuff with this. I usually include data for settings Toml with each project. So I don't have to recreate them every time, including settings file accidentally is nightmare. Yeah, it sucks. Because then yeah, deleting history is not super easy. Yeah, by by the nature of version control, the deleting stuff from the history is just super anti to the whole concept basically. That sucks when you get something in there that you didn't really want. Okay, so we have this now I'm going to do I have I have this cloned so circuit Python org display I o annotation, I have the org bundle which technically I guess has it in there but that's not really what we want we want the repo by itself and I do not seem to have it. So what I'm going to do is head back to this repo right here display o gauge, we're going to clone that. I've had to try and delete a commit terrible idea. Yeah, really confusing. Yeah, definitely been there with you feel that pain before. Okay, so now things are going to get a little weird because I already have circuit Python display o gauge open. But this is the this is the one we just created. Okay, what I'm going to do is I'm going to actually create a temp file and I'm going to say template only just created. This is a note to myself because I will mess this up guaranteed if I don't do this. And I might still mess it up. Because what we want now is we want to go and open the other one, the real one, the one that's actually on GitHub. But now we have two projects with the exact same name that are open. Which is why I just did this. It's also all red, which is good. Okay, so this is our one that's actually on GitHub. So basically what we're going to do is we're going to take everything from the one we just generated everything like infrastructure wise actions, docs files configs, pilot RCs, all these config files, basically everything except the code itself. And maybe the read me and some other stuff will do some comparisons. But so let's start with GitHub. One more thing actually before I get all crazy on that what I am going to do is I'm going to start a branch get remote rename origin to circuit Python. I think I picked this up from Scott naming your branches based on the owner on GitHub, which is I think is a really good idea instead of using the default origin for everything try to name it after who owns the branch. So we'll rename that circuit Python, we'll make a new branch. I could make this under mine and then I could do, you know, I could merge it from there or something. I think I'm just going to make it under the circuit Python repo. Just to keep everything under that one roof and make it a little bit easier right now. So we're going to say get checkout dash B for new branch the name of it, which we want to just call this maybe update infrastructure. And then we can say the branch we want to make it from which is not Adafruit but circuit Python main circuit Python with an n Python oops see doodles I did not mean to press enter yet which is kind of unfortunate. Okay, so we're going to do this we're going to go back to main. I was not done with that command actually and I just accidentally press enter we're going to delete that branch deleted. Okay, we're going to do it again. And we want this which is like pretty much kind of the most important part no track we want to use no track otherwise anytime we commit to that new branch it's actually going to be committing to main which is not what we want at all that is like the worst thing that is the absolute last thing we want so no track makes it so that when we commit to update infrastructure is on its own new separate branch that is not committing back to main we could merge it back to main we could PR it we can bring them together but by default they will be separate because we did that no track which is very important if you forget that it is not good so we can let's see we can paste in this now I think our workspace docs let me see do we want to do anything in docs okay so we'll see if stuff changed because it will turn blue if I take github and I paste it it's going to ask me do I want to add that stuff and if I say yes then all these files well they're going to be green because they didn't use to exist but if they did use to exist and there's a new version then they'll change to blue which is good that means we'll actually be able to to preview our changes basically so I'm going to take all this stuff from docs I'm going to paste it inside docs on this side we're going to say overwrite all requirements add yep add that one so there yeah there were some changes in here so we'll look at these changes I can do in pie charm with control k takes me to the commit all right so Gary Z did change we'll change the date back on that because that should be back to the original date we don't actually want that new date comps has got some good new stuff in it good yep I remember that change so this is basically like infrastructure stuff stuff that has changed since this library got created and hasn't been updated yet it's like read the docs might have changed or different stuff that we use they changed how like what values you need to have in there and so it caused a lot of this stuff to need to be changed that's what these changes are I am going to go through and actually do some fixing of some of the things though so 2024 we did not get created in 2024 so the cookie cutter one did but obviously the original one did not we don't want to change that okay that's the only 2024 in fact so that's good control k license we can change that examples as licenses this one okay that's got a little one extra link but that is it and that definitely looks good we do want to include that check license here that's another one we'll go fix the date some of these had my name in them before I think because I did cookie cut this originally I might have put my name for the answer to something different I don't know but Gary Z the name that's in the code that's the the person who wrote this was community member Gary Z uh hug report to them I cookie cut it and I put their code in I helped them get it ready to release and stuff like that but they created the actual widget uh really cool widget by the way too all right okay so that's all of our blue ones and all that stuff we definitely want now it's like sometimes it does do this where the commits should like the see this so it's 2024 still but it's not actually like that in the the file or is it that's actually api maybe I missed that one I did okay very good put that back to the same okay there we go this stuff is like read the docs changes language this guy there's they made this required at some point I don't know if it was pipi or what but that became required okay get the rest of our stuff to post in here so we're gonna say examples we don't need to do anything from that licenses we probably don't need to do anything from that those are gonna be the same we'll check them I'll paste them in don't think they're gonna change yeah see they didn't change color which means the files actually had the same contents get ignore uh get ignore is different we'll grab the new get ignore so we will copy pre-commit pile into our C read the docs.yml yes you don't need the code because that's an empty thing anyway I do want pyproject.toml I created that settings.toml as an example requirements I don't think we need read me I don't think we want to bring over but we'll check on read me in a minute so I'm going to copy these we're going to paste them we want to add it yep go ahead normally I use check out b branch name with no base specified i.e current branch I assume it didn't track base just based off of and this was less yeah yeah no track used dash b branch name with no base specified i.e current branch oh yeah yeah so if you don't do like I did Adafruit main yeah if you and if you don't do that then it will just do whatever branch you're on but I assumed it didn't track base just based off of in this last week I did specify a base yeah I think so I mean that's again I will say git is another thing that I'm like I have a lot of experience because of circuit python with git and github but like that is all of my experience when I don't consider myself that knowledgeable or good at it so I could be wrong but that's my understanding of that no track is basically if you were to commit or push into that branch without like now if you if you go git push you know something something else right if you specify it when you push it then it goes to whatever you specify but if you just commit and just push and you didn't do no track then that is when I'm pretty sure what it will do is get pushed into whichever one you made it from figured out my layering issue with feather weather no more invisible button presses nice your suggestion was specifying the layer for every remove remove append per page work like a treat nice cool I'm glad that worked out I updated my project repo last night I was like oh I get to put 20 foot yeah 2024 in the header yeah I've been still surprised a couple of times for the years on stuff usually my branches got created without an upstream associated yeah okay can't be pushed without the dash you all right so read me I will check but it's really not that much customization and read me is there okay I'll paste read me we'll see what it says see if there's differences all right yeah I mean I think that's all pretty good stuff it fixed a couple of URLs it updated a few things it's used hyphens instead of underscores here if those are wrong we could switch in black uh switch them back I just read black right here switch and black is what I said if those are wrong we could switch them back and I'm not sure if it has dox yet or not anyway so that's all good we'll take that that'll get us to the latest kind of version of read me so that all the wording and everything is up to date requirements that should not have changed set up pie disabled we could leave it I guess I don't think it matters so this is a single file one not a package so pie modules points to the individual file display o gauge we're good there dependencies requirements but there really aren't any says blinker because he uses it for knowing about circuit python api kind of but all right I think we're there so I'm gonna run pre-commit got a couple of formatting changes got a lot of pilot failures I'm just gonna run it again right away because the format when it fails the first time it will actually edit the file too so that the next time you run it it will pass so we have a lot of pilot arguments I'm guessing a lot of pilot failures I mean I'm guessing the thing is that probably the pilot configuration was different in the old version and perhaps more strict in some way and a lot of them are these individual and two-letter invalid names and I don't think I'm gonna change them truthfully so I think we are gonna be getting a relatively top-level invalid name pilot exception and again this is like community fed library right sounded a fruit library so it's kind of like less strict in some ways and the exact pilot match everything is one of the ways I feel like it's less strict so instead of kind of renaming because this is at all geometry right x xs xp xy they're all kind of points and xy coordinates and things I don't really understand the geometry enough to give them proper names so we got a code format again so we'll run it again so now we're down to just two things too many arguments it's another one I think we're gonna be saying uh too bad so sad on the pilot front honestly like we could refactor this to take a dictionary or something but frankly there's not I don't there's not a good point in it right there's no doesn't make any sense right like Adafruit shapes we kind of took the the shapes api of outline we don't call it stroke and fill but it's outline uh foreground background it's like all these things are pretty much required I guess we could put them in an object I don't think the code is any more clear so I think we're gonna make the call on that one as well that is gonna be fine for now consider merging these comparisons within by using self that level not in 100 zero as a tuple if self that level not equals 100 and self that level not equal zero yeah sure I don't know I don't really think one is any more or less clear or better in any way I don't maybe there's a way it's better that I'm not aware of doesn't seem like it makes a difference to me but if pilot wants it that way in this case we will give it uh we will give it what it wants so if self that level not in not in tuple of 100 and zero how's going Johnny good day to you my friend all right we are passing all of our pre-commit checks so pre-commit the checks that I'm doing right here that is one of the checks that happen from the action so when we push that's gonna run inside of github actions another thing that will happen is it's gonna build the docs so I'm gonna head over to docs actually have an alias called cp docs which runs the real command but it's like sphinx something something I don't know it by heart no module bitmap tools so that we need to put in the mock docs which is a place for built-in modules that don't exist that do exist in circuit python but don't exist in regular python therefore sphinx is unaware of them when it tries to build the docs some of these get pretty tricky here so it says read me rst97 explicit markup ends without blank line I'm expected in dense sometimes these are pretty hard so it says 97 but I that rarely lines up with where it's actually at explicit markup ends without a blank line I'm just gonna delete that okay we have a different error this time I am gonna go back and run pre-commit again because I don't know if that's gonna reformat read me okay I didn't to do entry found read me rst45 to do remove the above note if pi pi version will be available is it on I don't know if it is on pi pi or not well it was never released I mean it never was on pi pi originally but the intention is that it will be because like by adding the actions we're adding the pi pi release action so you should end up on pi pi everything works punctuation not sure what you mean because I forgot the punctuation was a case sensitive uh I don't remember what we were talking about when that was put in the chat there it was a while ago index rst to do okay we got another to do so we are making progress here to do okay add any learn guides there are no learn guides I mean there's like you know the display oh one I guess we could put that one seems fair oh I think stuff format we want though I think is more like this probably still no another to do index 32 oh right down there obviously yeah we were right there huh mock docs is also good to know thanks yep I will say I don't know on mock docs I'm not sure if that's like I assume that's like a Sphinx configuration I'm not sure if that's like specific to our thing or what but yeah somehow you can put those built-in circuit python libraries or modules I should say not even libraries but built-in live almost did again built-in modules that exist in circuit python but not see python and by putting them in mock they'll make it so that Sphinx will pretty much ignore them and go ahead and try to build it because what Sphinx wants to do it wants to linkify it with like you know hey this thing uses this built-in module let me link it for you to to the real one but because the real one doesn't exist it can't all right we got a successful build so we're looking good there I'm gonna run pre-commit one more time to make sure we don't have any more changes there which we did so it's good thing I ran it we're gonna do it another one more time just so we can see that they all pass and now we are finally ready to commit this our commit failed because we have two to-dos the pycharm actually warned us here to tell us you're creating a package library is a folder add this we're not so we're gonna leave that alone same thing here we're not doing a package so we're but we're just gonna leave that alone in case if this would ever get converted to a package then we want those still to be there so circuit python update infrastructure yes that's where I want to push to and then in this case I think I'm actually gonna merge it to main as long as it passes the actions here because again this is not like official ate a fruit repo we could make a pr but I'm not sure when that's gonna get reviewed exactly and the sooner we get this library to be having actions what it will actually ultimately do is fix the circuit python.org bundle which I believe the bundle tried to contain this library but this library never got a release and then because it didn't get a release that caused the bundle to break so circuit python org bundle I think was broken because of this once we get it fixed I think that will fix it for a minute it actually broke I think circuit as well but circuit has since been fixed to where it is fine if one of the bundles is broken okay so we oh no that's a long time ago okay very good all right so we'll just make sure this succeeds and if it does then in this case I'm gonna merge it over to main on the ate a fruit library that would be like a pr oh we failed okay so this is where sometimes you get different outcomes right so we ran everything locally we try to test it out as best we could but I think we need to put display IO we need to put display IO in the mock docs too and the reason why it succeeded for me locally here is because I have blink a display IO installed which makes it so that that I can run python code import display IO and that succeeds okay that would succeed except for this is running some janky who knows what version of python this is I have no idea why it's running that or where it came from I'm just gonna close it pretend I didn't see that but in my real python that's actual python and not whatever that was I have blink a display IO installed and therefore I can import display IO in c python and it works because it imports blink a display IO so when the sphinx build happened that happened it imported blink a display IO which made it happy inside github actions did not have blink a display IO was not happy crashed as we all saw we could add blink a display IO to like the docs requirements but I don't really believe that that is the proper fix in this case because it doesn't really depend on blink a display IO it's kind of a coincidence that blink a display IO causes it to work it's not really like the real requirement if that makes any sense it just has the same name as the real requirement and therefore is able to trick sphinx okay we should pass pre-commit but like just out of an abundance of caution I'm gonna run it anyway try again and you know I could build docs again locally I guess but as we saw there like my environment's not the exact exact same so sometimes it's going to succeed here when it's going to fail there and we just got to work through them all right we got another one here successful add display IO to mock docs there are three different types of punctuation cases lower case camel case and shoddy case I think sphinx I think I had a sphinx circuit python issue I think it was an old sphinx in a third party config with bus device and I pointed it to blink a pi pi version yeah you with a lot of with a lot of things in sphinx you can kind of trick it by having display um not display but having blinka stuff installed there's a lot of stuff where you can kind of load blinka and it will be able to do the docs for you all right lucky number two do we get a succeed this time it's actually a good thing showing different weird ways that commit can fail someone who's never seen it done would learn nothing if it worked 100% on the first try yeah I'm I'm I mean you could probably tell especially folks who have watched me a lot my my style is not really to hide the errors so sometimes you'll tune into my stream and it's me struggling against something for the whole time and we barely make progress but we try to make a little bit at least but yeah I like the idea of showing people that um it stuff doesn't always work the first time the first 10 times the first week the first month like I constant like stuff constantly fails for me I gotta work at it and I think sometimes people get an idea that that stuff is like just gets done the first time successfully and they start to get down on themselves because they don't necessarily have that same success right away and I think it's important to like show people that's not really the case at least not for me maybe it is for some people but like I think there are lots of people out there who are absolutely not just getting it correct and are having to just work and work and struggle and struggle and eventually get there I think there's something really cool about streamers and video content creators and stuff people who put that out there to like instead of editing everything away to a nice polished like you know more entertaining video in shorter time span and stuff but there's something good in watching people fail as well you can learn a lot from watching people fail just like you can learn a lot from failing at stuff all right so we did push that to its own branch it did pass its actions so what I'm going to do is actually just merge it from there if I make a PR is it gonna not let me merge it some libraries they like it won't let you merge it if you're the one who created it which is usually how you want stuff to be but I do think it's a setting and like some libraries don't do that and in this case I do want to merge it right away because it's like community thing I'm the last person who worked on it anyway so we'll try it if it doesn't work then what I'm gonna do is just merge it and push it and counter barriers and learn constantly yeah totally I'm here you're not frustrated you're not learning anything do yeah most coding sessions are mostly failing in every way possible before you succeed yep totally agreed and took a cutter so firstly cookie cutter version I don't know if that's a real verb but we're gonna roll with it the library so because it's now a PR instead of just its own branch with a push in it it's gonna rerun the actions again so that's another one of the triggers that we have is on pull requests so whenever a pull request happens it triggers those actions to run again we're gonna sit and wait for him one more time as soon as that passes here then as long as it's gonna let me I'm gonna merge it but I don't know if it's gonna let me so we'll discover together between in between the add to cart and check out the raspberry pies went back out of stock got to be fast oh that's a bummer yeah the pies are tough these days I have not even uh I have not even started looking for a pie five yet I was pleasantly surprised the other day at microcenter to see that the pie fours look like they're in stock and you can actually just walk in and buy one these days so my guess is that it will be another year or something on the pie fives they tend to tends to be about a year before it's like actually easy to get them uh at least when I was paying attention to them I'm stoked that the fours are available though at this point I think the four has a lot going for it with its two hdmi's have some uh I have some ideas I would like to try to cook up with fours if they're actually available but the thing is like my ideas are rely on them being available to the general public so if they're still pinched then it's not something I can move on yet but if they're actually available then it will make a decent piece of hardware for something I have in mind it's more in the day job realm nice okay over there all right yeah and it is gonna let me do it so we're just gonna go ahead and merge that four is always available in mass at least in uk we have a limit of one removed excuse me yeah I remember I was lucky enough to get a four early on but it uh they weren't available for very long I remember and then I didn't do much with it because I was like if I build something with this I can't then like take it to somebody else and be like hey I built this thing with this and you should get some too but you can't right now I'll try to make a release as well I don't know if there's like something else might fail if we make a release but and our because we merged to main now we have a commit on main which means we get to run our actions again so the actions are automated and you can tell they kind of run a bunch bunch of different times throughout this process and in our case like they're all the same so they're technically you know it's going to find all the same stuff but you could set them up to where like each different trigger had different tasks if you wanted and so some of ours are different like release has got the the pi pi and the uh get up actions but okay yeah some of this stuff is now red here but I don't know that one's green though it's just not refreshed probably I don't know actually red there probably the badge url is wrong so before we do a release or anything let's look into that so I know it changed a couple of those to underscores or from underscores maybe we did not actually want those no preview should this be a plus or something I'm not really sure why so that's actually for docs which is also showing failing this got the different theme or something which is weird so it's passing okay this is probably like a caching thing or something I don't know but maybe a super refresh there we go okay so I did a control f5 which refreshes and like erases the cache or something I don't know if these underlines are usually here but I'm going to pretend I don't see them for now so the next one we have is it it does say the docs is failing for some reason see if we can look into that this is not the page where you can log in uh yeah uh this was I just we just did this we did this across all the real libraries not long ago at all that was what how did we do that so we need to let's go look at one actually let's not rely on my bunk memory instead we can just look back unpin yeah this right here we need this should you think I would have okay so we just need to add sphinx rtd theme into requirements easy enough I'll unpin sphinx too although it probably got unpinned I guess yeah it's already unpinned oh this is already here why has read me oh because I started changing this yeah let's just undo that get that back to unedited or an edited just roll back oh docs requirements though that's where I was we have two of these which is probably not good let's delete whichever one doesn't exist in this ate a fruit repo my guess is that having both of those it's making it take the wrong one everyone we don't want it to take it's probably taken that one the one with the a it looks like is the one that has lived here that's currently on 20.04 which is right there it's all the same as that so I'm going to delete this one hopefully that's going to fix our problem and yeah I guess we'll just commit again to our separate branch here twice the fun gotta take off have a nice weekend yep take it easy huge devon I will see you later hope you have a nice weekend as well dreamt of the cm4 coming down in price and the the cm5 dropping you're not crazy money just don't feel the great value all right we're just gonna do the same thing again I'm not sure why it's not coming up as a not push maybe github recognizes it as like only deleted a file didn't add a file maybe it recognizes it and therefore it doesn't prompt you with it I don't know usually it will give you that yellow bar at the top here that's like do you want to do this branch right here that just had commits one minute ago I'm usually like yes yes I do thank you how very helpful of you as soon as I click into it it's going to be done so click into it that way it finishes nope not done yet okay so the uh that not applying to Sphinx RTD theme that's why the theme was messed up also I may not messed up it just looked different this doesn't look like most of the other libraries where's that page oh there it is zero minutes this one is so this is basically doing the build on the read the docs side so it's doing the same build that I did locally it's doing the same build that happens inside the actions but this one is doing it inside read the docs and that one succeeded so it should have a green badge now if we go back to it and maybe super refresh it nope actually I don't even have to do that we got a green badge nice all right green green green so I think we are ready to make a release we'll see if uh see if that's the case it might fail you know I'm gonna check something in the settings but I'm gonna move it over here first obviously like I said before I don't know what all it shows I don't want to accidentally be spilling tokens or anything like that obviously okay I think it's got what it needs I think it has the uh the secrets that it needs in order to complete those actions so we'll see we'll just give it the old 1.0.0 initial release has no releases so we can't just go copy the old one what I usually do there is uh this thing I guess which is kind of cool I think we'll just leave it like that actually doesn't have there's usually another check mark here we don't know what it says but it's not here this time I guess is it's to do with it being the first one all right so now we have the release actions which again will run the same stuff like the pilot the pre-commit but it will also do the um pi pi release and the github release so pi pi release is uploading that file to pi pi using I think it's called twine it's the name of the tool it uploads with and then the github one that one's using the github api to uh to upload files to the release page set yeah that's what it says set as latest release that's true yeah shows on edit usually it shows when I create them too but my guess is that it failed because of uh yeah or not failed but my guess is it didn't show it because it was the first one so we did get a failure on our pi pi here let's take a look it's probably maybe the token was not actually right or something got a 403 forbidden it says username password authentication no longer supported migrate to api tokens or trusted publishers instead interesting and barren space I think okay let me check one more thing again yes I see okay so indeed the thing that we have the things that we have are the pi pi username and password and as this helpful error message tells us that is no longer supported we need to migrate to tokens or trusted publishers instead I do not know what either of those are this page does not have any documentation on it let's try this one so let's read about this we get to learn about pi pi api tokens together um it's pretty straightforward stuff set your username to underscore underscore token set your password to the token value okay all right I'm gonna leave it for now I'm not gonna do this on stream because this feels like a minefield of accidentally docked your token that I don't really want to tiptoe through but I'm pretty sure we just need to follow the steps that were on this page which it looks like is like go to your account make sure your email is verified go to your settings or whatever and find your token right it's in there somewhere I didn't read the whole thing but I think that's the gist of it and I can do that later I'm not sharing my screen migration time set username token I've never seen that before but strangely like it yeah it is interesting the dunder token on the username but it's kind of a explicit that you're doing that okay I think what I'm gonna do for right now is just leave this alone we have a release um the the github release actually succeeded so it uploaded the mpy files to here and that part is actually the part that is more important for circup so oddly enough I think this will actually get us to where we want to be for circup actually being able to use this this library and install it I could be wrong not 100 positive that's what I think but yeah turn up some lights of course that's gonna is that gonna green screen my face not too bad yet but eventually I'm sure I'll start disappearing there give it the ol uh what is it back to the future you know where the people on the postcard are just slowly disappearing that's me with my green screen filter when the lights are uh when it's too dark outside and I turn the lights on my green screen filter it takes chunks out of my face sometimes correct uh only pipe I'm missing but circup bundle will fetch nice okay so we're yeah we're good on circup which is the main thing I was trying to fix I will swing back around to this and figure out the pi pi I don't know if it's actually my account or what either so like if it ends up not being my account then I don't I won't have the token for it but um we'll swing back around and do that at some point um yeah that took a little longer than I was thinking it would but I'm glad that again that we got a chance to kind of work through some of the issues and you all can kind of see some of the behind the scenes of library infrastructure stuff right that one was a circuit python org library but same kind of stuff applies to all the ate a fruit libraries right so this is very you know pretty typical type of stuff that I would be working on in library land on a monday for instance so the next thing I'm going to look at is inside of here which is a PR that I started it got reviewed by Jose David a hug report to Jose I came back the other day four days ago I was going to do the changes that Jose had suggested and what I found was that this library specifically this widget so this is display IO layout library it contains a couple of different display IO layouts and widgets um specifically the flip input widget which is a single widget within this library and is the one that had some updates based on the suggestions of Jose I was trying to make those suggestions I was trying to test them out what I found is that flip input no longer works at some point the core was changed and it caused this widget to not work so we are going to go dive into that next I don't know if we'll make it all the way to the solution so if you're the kind of person who really needs to see a conclusion to be interested maybe now is a good time to say goodbye but for the rest of us I'll start this you'll see kind of how I start digging into it and we will see how far we end up and then I will take the time now to say I do also stream on Saturday mornings at 10 a.m central time and I will be streaming tomorrow at that time Saturday morning 10 a.m central and I will probably start on this then so if you do want to see wherever this ends up leading to if we don't wrap it up you can tune in tomorrow over on my channel and you will get some closure hopefully we can get the camera going here let's try third time's the charm here here we go we'll just close that one and open a new one I think okay so flip input makes I don't know why I did that we should just keep this over here flip input makes these things they are like like number counters basically they can count up and down and you can click the arrows and they don't have to be numbers they can also be arbitrary things like strings which represent months um in this case but what we'll see is that I'm on some very old version yeah thank you for the link they're tied appreciate it and that's where I'll be tomorrow morning and we'll pick up wherever we leave off here so I got about 30 minutes we'll we'll dive into this here and we'll see how far we get but then uh about 30 minutes I will bid you farewell and I'll go and get some dinner get rested up and come back in the morning boot out we are on version 733 right now which failed because I have auto reload that did not exist at the time just kind of funny I don't know why this well okay so my the auto reload triggered because it's not turned off I don't know why it wrote a file though so that's weird all right so what we want to do is figure out where this broke first thing actually I'm just going to close a lot of these so basically in the comment that I left on here when I tested this the other day I mentioned that it succeeds on 733 but it fails on 800 so where we want to start is go to the ones in between those and try to narrow it down further to figure out which specific one it fails on and then once we know that we try to chase that down and figure out which commit it fails on once we know which commit it fails on then we can see the code that was associated with that commit and we can actually figure out why it's failing what we need to change to get it back to succeeding uh Vulcan blood I'm not sure what you mean Vulcan blood Vulcan Vulcan blood all right so 733 I have installed and then 800 I tested the other day and I know that it does not work there so we have all these ones in between and I guess we'll just kind of give it the old binary sort action so I'll pick one in the middle and we'll try that one green screen oh I got you Vulcan blood green screen I'm with you and double tap that to get to the boot loader copy that one paste it all right so that succeeds so now we can cut it in half again I have two different browsers two different browsers I cut it down to just one I did beta five I think so we know that beta five succeeds so we can go maybe halfway between 733 and beta five let's call it two put a boot loader again I don't know if I mentioned it but this is a pipe portal titano all right beta two still succeeds okay so beta one I mean it must fail on beta one I would think or I'm going the wrong way aren't I I'm going the wrong way it succeeded on five it fails on zero zero so I need to be going between five and zero zero but I actually went between five and seven through three I went backwards so let's go to rz zero definitely gonna help if we go the correct direction yes all right there we go that one failed value error out of range of target that is on rc zero so we succeeded on five and we failed on rc zero so we know that six is between there so let's try six and see if that one succeeds or not so I think what happened is that the this code relies on bitmap tools dot blit and I think what happened is that somewhere in here blit got changed to have additional validation on the arguments and my guess is that this library either has a case where it's doing what are now technically invalid or maybe this library was like depending on some behavior that was unofficial or something because now it does the exception so this one is still succeeding and that is beta six so the first one that fails is drumroll please I have too many browsers and none of those are the one I want the first one that fails is rc zero beta six succeeds that's what we're on now and rc zero fails let's just val like double check that because I want to just make sure since I just installed like five different things always good to give it the old double check a rony rc zero okay value error out of range of target rc zero that's the first one it fails on so now I'm gonna make a new comment so that if I put this down and come back to it there's more information looks like I didn't paste the actual exception either which I should have so let me do okay now we at least have this here so that if we don't figure it out in this sitting we have given future tim additional breadcrumbs or whoever happens to do it it will probably be me especially if I do it tomorrow um but whoever it is will now be a little bit further along so eight zero zero rc zero we want to try to find the changes associated with that which is actually tough how do I do that are those branches okay so I'm going over to sea lion here this is sea lion which is basically pie charm but for sea projects which is what circuit python is written in sea we're gonna try the dude looking for some stuff in this this doesn't really have the branches we need as branches there's eight dot oh dot x that's not really what we need what we need is to somehow find the commits we need to somehow find the commits that came in here we have the dates I guess so I can look at the dates so from 12 21 2022 to 129 that's actually that's pretty big range that's all of almost all of January well and then only about I guess like a week of December I suppose so it's not that big but it's about a month it's pretty wide range okay so I think I can go to those right yeah this has dates right here so let's go should be tags or branches do history on the file um I'm not sure which file it will be otherwise yeah we could do like a history or a get blame type thing that shows us when it gets edited but I'm not positive which file it will be or so I will say like I did not do this part on stream but the part that actually comes before what I'm doing right now is just going over to the circuit python repo going to pull requests well the circuit python repo which is under Adafruit going to pull requests and then searching in here under closed and like either blitz or bitmap tools but I actually did this the other day and did not find the change I was looking for there's type checking raise error there's arg validation which sounds promising but that was not until March of 23 which is later than January maybe it's like an out of order thing though I think they go back and pull them in later sometimes or something I don't know but I did look through these first and this is usually where I'll find the change that's relevant but in this case I couldn't figure it out from the PRs which is why I'm digging now into the the git history so we want December 21st 2022 should be that stack again I'm not sure which stack it was but these are the two stacks here I'll put links this one is on is the s3 which is where the all the different builds uf2 files go and then this one is just the git history inside sea lion which I don't have a way to link you to there's a 21 so one thing that's a little weird is these are kind of out of date right like I guess it depends when the branch got merged because like this has a commit on the 27th but then it has another commit on the 19th and 19th and then I guess it got merged there or maybe it never got merged I don't know but okay so here's our 21st so I'm gonna kind of skim here for like display IO or bitmap tools or blit or anything like that actually probably it wouldn't be bitmap tools at the time it might have been still in bitmap actually it moved um one thing we could do is I guess if we needed to try to narrow down the file one thing that we can do is I can click one of these and I could scroll up to here so we wanted to go to about 129 so I could find to where we get to about see the thing is we've got the stragglers right like these are still 123 120 and we're in the midst of a bunch of 131s okay so what I'm gonna do is I'm gonna control click there that's gonna highlight all of these and then over here now that's gonna show me all the files that changed in that range so now what I could do is go and look in site no not site um I'm drawing a blank on the name we'll get there though as I shared binding shared is the word I'm thinking of shared bindings or shared module so bitmap tools does have changes here ow other space draw polygon that shouldn't affect us bitmap tools has draw polygon let's look in display i o because this could have been in bitmap at the time but it doesn't look like bitmap has any changes here so that's shared bindings just like the glue between python land and sea land I think is sort of how Scott describes it draw line so I is it I don't actually know which one is failing I thought it was blit let's double check 572 inside a flip input okay yeah it's totally blit value error out of range of target let's get those to print negative six is the one that it fails on maybe it should use blit constrained can copies bitmaps with constraints to the dimensions I mean negative six is outside the dimensions so that maybe we could use that and it would fix it I don't know but it's just calling anyway to target dot blit okay I was trying to hold it but I'm not gonna make it so I'll BRB I'm gonna run to the restroom I only have a few minutes left but I'm gonna make it it would have it would have the file name right then open that file and look at the history yeah I think they get maybe the get history is what you're talking about now you're cooking now look at the history to see when it changed yeah we can we could look at the history of this specific file this is kind of this view right here is kind of showing me the history or showing me the changes that are in this timeline that I highlighted basically so this is like if we see code in here dealing with blit then we know that it could be affecting us but if we see code you know dealing with draw line it did change but it doesn't affect what we're doing with blit shouldn't work on wood that's kind of random huh what is that about why did that change hmm all right BRB okay must admit I love the challenge debugging yeah I'm with you there I definitely have a lot of like you don't get me wrong there are days where it tests my patience certainly there are days where debugging is not what I want to do but I do have the bug right I for whatever reason my brain wants to wants to solve it right it wants to find the solution good yeah good thing since I make a lot of bugs I'm with you there it's a good good trait to have for somebody who likes debugging I'm with you on that one all right I don't I mean I don't see anything in here but again it could be in bitmap because blit actually used to be inside bitmap and then it moved to bitmap tools later on and I don't know the timeline exactly uh which is bad because I'm the one who did it but interesting that looks a little bit related but I don't think it actually is because it's not this is just return it doesn't raise an exception so that's not really what we're hitting all right let's hmm it's it's tricky because of the uh the fact that it moved let's take a slightly different approach here here's what I'm going to do let's go here let's go and check out the 8x branch we check out 8.0.x uh just smart checkout could not check out these all in working tree files I mean really can I just really do we need to please move or remove them lib certificates read me why is that different I didn't I've never touched this file in my life I don't understand it's not it doesn't even have any changes oh I guess I don't know really though can I just check it out for real though can I just check it out anyway I really want to just check it out anyway can I just do that what if you try real hard to just check it out anyway uh force check out okay uh no don't do anything just go away there is a change I guess it's blue now I don't know I don't really care we're not going to commit or do anything in this what I want to do though is I want to see now is at this state in time at this point in time did blit exist on bitmap object or on bitmap tools blit array blit that's not it though that's not what we want array blit array blit all those are array blit so that means it had to have been on bitmap object which is in here which is in here blit okay uh okay okay okay does this version fail or not that's the next question we want to know in order to get the answer we're going to make a build at this version at mel uh make board high portal titano I think that's right I don't know if that that doesn't look right I guess okay underscore so close I was so very close there we go hopefully that will build it did not okay maybe we do this thing do you need okay so the problem is at this version that didn't exist I don't even know if that's why it's not building though no we're probably not going to be able to make this build this fails I don't need to be here though all right let's see if it succeeds after this I don't have very high hopes but maybe off topic but if I knew more about circuit python I could do things like this as a contribution like send me a ticket um yeah I mean I'd say the the way that you learn more the way that I learned more is just start doing this kind of stuff um this one I happen to know about through the pull requests that I was working on before but I'd say the place to go is circuit python.org contributing right here that's going to be pull requests which is the default one that's a list of all the open pull requests which includes this one that I happen to be working on or you can also do open issues right here if you're looking to actually code instead of look at existing code so for debugging and stuff like that probably pull requests is maybe better because you can look at changes that people have made and either try them on your own device or like look at the code and leave a comment about if there's anything that you would change or anything that seems wrong or out of place or whatever or on the issues hand I guess it could also tie into the debugging as well especially if the issue happens to be a bug then you know of course you could go dig into why is it like that and is there a way to change it but yeah all that stuff you can find on circuit python.org and then if you just click contributing there at the top which is going to take you over to slash contributing it's a good place to find that stuff or another good place is on the circuit python repo itself at you know github adafruit circuit python all the open issues and all the open prs there it's another place I'm always looking for interesting stuff to work on or look into all right uh that failed because of something I don't know remote error unpack I don't know let's try it again see if it fails the same way or what it's not the end of the world if we can't figure this part out if it fails on this version I guess because the next thing what I want to do is look just like somebody was saying before um the next thing I'll do is look at the history of this like annotate with get blame but this is yeah shared bindings okay out of range of target isn't that what it says out of range of target but that's all the way back to 2020 this honestly this might be the original commit of this code but that can't be the case because it did work in 733 I mean this would definitely raise it though that's weird because that I think I think I have an idea must be changing the python code why is it producing negative six I don't know that's a good question I have to debug further in the code not sure what uh not sure why it's doing that I'm not even sure what part of the code is from truthfully well okay so that this would fail on our old version actually anyway maybe I probably changed that I guess though yeah did I have target that blood okay x offset 2 comes from bitmap offset which gets passed into draw position by animate bitmap which gets called by update value bitmap to offset it swaps them I think it's making it so that whatever was one is now going to be equal to two and vice versa but then that gets called by update value and that is all the way through the chain or I guess value property is next value property calls update value calls animate bitmap calls draw position but has negative six I don't get why this ever succeeded though that's the part that I'm very confused about now because target bitmap dot bled all right here's what we're gonna do I am gonna be wrapping it up here pretty soon as well but let me try one more thing such as the bane of existence of those of us with the debugging monster in our brains we must try one more thing wait wait wait wait that was the wrong one I want um I want the one that works actually it was beta six that is the right one okay does it do negative six when it succeeds maybe something else changed and it's not getting negative six so my assumption this whole time has been that it's getting the same number but not raising the exception maybe that assumption was wrong that assumption was wrong so in this version it's getting 34 not negative six what on earth could have changed in the core to make that okay well I don't know but well okay I just came a little in the past year and past year okay um that's where you have to do the diff history been a bunch of prints yeah prints is usually might go to add a bunch of prints I yeah I don't know what that could be something though must in the core must have changed it to where our calculations are coming out different so that's well that's where we will start chasing this tomorrow is figuring out where exactly do we get that negative six from and why does it end up as a negative six and not a positive 34 because when we are on a version that works it actually evaluates to a positive 34 which is valid and works and therefore it succeeds and that's the crux of our problem so I don't really know what could have changed that would change that but that is well yeah I mean that makes sense but like why like not allowed to draw at negative six that's no problem I mean that's easy but what could have changed between 733 and 800 that would cause the exact same library code and the exact same user code to come out with negative six instead of positive 34 that's the part I'm not I can't even really fathom what that change could be my I mean my guess is it's going to be something weird with like floats or something like that maybe but I don't know it'll be interesting again as a reminder you can tune in tomorrow I will dive back into this so if you'd like to learn what it was that made it do that hopefully we'll figure that out tomorrow morning again that's at 10 a.m. central time over on my channel foamy guy underscore twitch thank you to everybody for tuning in thanks to the folks for helping out in the chat asking questions we have lots of good questions tonight appreciate that as well thanks to everyone for watching hope you all have a good rest of your night and a good weekend and all that stuff I saw something change from sign to unsigned in its definition saw one UL from a 1L I do remember seeing that in the diffs yeah that's a good tip actually we'll we'll start there when we dig tomorrow I do remember seeing that actually now that you mention it the one use changed over in the code that's a good that's a good call out thanks for that all right have a good night everybody I will see you later for those of you joining me tomorrow I'll see you tomorrow otherwise next Saturday for sure I'll be back I don't know about deep dive next week so check out the meeting the weekly meeting on Mondays that's a good time to try to see if Scott is around to see if he will be doing deep dive or not I don't know for next week so I'm not sure but I'll be back tomorrow and I'll be back next Saturday as well so until then I'll see you later thanks again for watching and so long