 Hmm. Alright. Good evening. Happy Friday. Let's go and see Grover. Okay. Got some more air movement with the fan on there. Uh, let's see here. Let's turn off this preview and pop this one on top. Has gone Davodesa and BeataGraph over on the YouTube chat. I hope everybody is having a good day and a good week and all of that. Okay. There we go. Put those there. Ouch. Um, so... I also have these. I have too many things in my pockets. Okay. And just here, let's put this back like that. Okay. So good evening to everyone. My name is Tim for anybody who is new. I go by FomeGuy on GitHub and Discord. This is the DeepDive Program, which is a weekly live stream program where we are working on all things related to CircuitPython. Sometimes we are working on CircuitPythonCore, the actual C code that is the CircuitPython program itself that runs on the microcontroller and interprets your text based Python code. Sometimes we're working on libraries. Sometimes we're working on projects. It just depends. Sometimes we do infrastructure things. Today we will be in library land and then a little bit into infrastructure of the libraries as well, depending on how much we get through of the first bit. Let me do take a quick step back though for anybody that might be new or watching this video in the future. If you don't know anything about what I'm talking about, let's just get you caught up at least a little bit. CircuitPython is what we're working on. This is a implementation of Python that runs on tiny computers called microcontrollers. There's a bunch of pictures of these tiny microcontrollers over on the downloads page here. Essentially the devices that are depicted on this page will all have kind of a main chip there. Inside that main chip essentially is an entire computer. It's not a supermassive huge amazingly powerful computer. It's relatively low power as far as computers go by today's standard. Certainly not nearly as powerful as your laptop or desktop or even like modern mobile phone or anything like that. But it is a complete computer nonetheless and it can do some pretty impressive things. One of which is running CircuitPython and allowing you to program that device in Python code. We are working on that's kind of the 50,000 foot view. If you are catching this live and you are new and you want to know more feel free to drop questions in either of the chats. I'll try to keep an eye there and I'm always happy to explain more if there are folks that are new. Otherwise we will be jumping into the nitty-gritty down into the weeds so to speak. We'll be diving pretty deep as the name of the show does suggest. CircuitPython is an open source project. Anybody is allowed to use CircuitPython on your own devices. Anybody is also allowed to port CircuitPython to your own device. So if you are a hardware manufacturer and you would like your device to support CircuitPython, you are allowed to do that. You don't have to pay anybody or anything like that. It's an open source project contributed to by the community as well as some members of the community who are paid by Adafruit in order to work on that project. So the end users do not have to pay anything at all. All of this code is open sourced. Everyone is allowed to use it within the parameters of the license that it is released under. But the team who does work on the project is paid to do so by Adafruit. There are some folks who work on the project full-time. There are other folks like me who work on the project part-time and we are paid to do so by Adafruit. So thank you first and foremost to them for obviously being able to pay folks to work on the project. It's quite literally a dream come true honestly in my case. It's an amazing project to work on and so I'm so grateful to have the opportunity to do so and be paid for it. But also thank you to everybody who purchases hardware from Adafruit because of course they would not be able to keep the lights on, keep the factory running and keep paying folks to work on CircuitPython if not for selling hardware out of the factory based in New York. So head over to Adafruit.com, check out all of the toys that they've got there, buy yourself some goodies, get those shipped straight out to your house and in the process of doing so, you are helping support the CircuitPython project by paying them for goods and services, keeping the lights on, keeping everything moving over there and allowing them to keep paying the folks working on the project. JR, let's see, JR Rixon First time catching the stream, I may have to break for a bit of food. How long does it usually run? We usually go for about two hours on Fridays, yep, right about two hours. I won't see, it's not exact. Some days we run over, some days we run a little bit short, kind of depends on what's going on but usually it's right around two hours. How's it going, William Degnan over on the YouTube. So where we are starting today is not actually this page here, today we are starting in the library PRs. In particular, we're taking a look back over the library PRs, many of which of these were submitted for the sprints at PyCon. These were submitted by folks who were in attendance at PyCon. Lots of these are submitted by newer contributors who have not necessarily contributed to the project before or some less frequent ones. I think there's even a couple of names I recognized from last year's PyCon, which is nice to see some returning folks who worked on some good stuff last year pop back in and tackle a few more this year. This one though I happen to know, this is the one that's on the top of my list here. This one I know was put in at PyCon, has had some suggested changes and the original author has come back and done some further tweaks based on the feedback of those suggested changes. So now it's ready to take another look over again and if everything is looking good then we'll leave like an approve and get this one merged in. So it is IR remote. I am gonna, first of all, I should have let's see here, one second, let me do something real fast here. Let's do this. I got a high G for one second, let's do this. Okay, this also and this too and this one more. Sorry. Actually, this one as well. Let's do that. Yep. What was that? Okay, there we go. Sorry about that. It was not quite ready just yet. So let's do this. And then yeah, where I was headed was, do we need to clone that or not? Let's see if we've got that already. IR remote. I do not have IR remote yet so I will go ahead and clone that. I got to submit a couple of those. Awesome. Yeah, thank you for doing that. I really appreciate all of the new folks that we had pop in and contribute. It's been really great to see. So we're gonna clone this one up. Okay, thank goodness they fixed this. This drove me insane for like the last day or two since I noticed it. It was defaulting to code spaces which doesn't have the URL on it. So like it just turned this thing that has been ingrained in my brain for as long as I can remember from being now like it used to be one, you know, click this and then click copy to now being two clicks because it defaulted to code paste so you had to click local and then get copy anyway. Sorry. I kind of geek out about interactions with computer sometimes and that one really tripped me up and I'm happy that they changed it back. So hard report to GitHub today for switching that back to where you don't have to click an extra time. Because honestly that was a bit crazy. How's it going Dave Mardcourt over in the YouTube. It was a lot of fun. Adafruit folks ran really good sprints. Nice. I'm glad to hear that. Yep, I was not personally out there although I hope to make it out hopefully to the next one out in Pittsburgh. Definitely one of these days for sure but I'm all in Pittsburgh for the next one. Hoping to make it out there though and join the folks that are there in person. But I was waiting in the wings this time. We got that clone. Let's open it up. I'm not going to be in that list just yet because we only just got it. Of course this is going to be at the root because of the way the code is weird. So we're actually just going to open up a random one of these. Then we're going to go to open again because now we'll be in a better directory. To be right here. Yep, there it is. Just takes it a second sometime. Trust this window. Let's do that. If I still haven't figured out how to make this default better. So we click that. Dash V. Get remote. Name, origin, data fruit. Select that better. Now we've got the code here so we can bounce back and forth to that if we need it. I like to get it cloned and have the ability to look at it in my editor as well as on this page here because this does like some collapsing and stuff and sometimes there's other kind of context around the code that gets collapsed and it's just easier sometimes to bounce over here than it is to see it inside this view. So I'm going to start by just taking a look back through the change overall and see if there's anything that's jumping out to me right now as far as like potentially needing to be changed. One thing I will say I guess right off the bat is these could be inside of here although maybe that's not true. Are these, okay, these moved from down here I see. So honestly, yeah, these imports I guess were just in a bit of a weird spot and the PR does go ahead and move them to a more typical place up above the sort of main dock strings there. Okay so those, yeah, these are not new imports. My first my first instinct here was that these were new since they're green that these were new imports and that they were used during the typing in which case it would make sense for them to be inside of this try block here but they're not actually new they just got moved. Then data pulses is a list returns a list of lists dock strings agree with that a list of pulses thanks and thanks for putting up with my peppering of random questions nice thanks for participating it was successful because of folks contributions it was nice to chat with you in general, yeah many many thanks for sure from from me as well so this is list of lists and then the next one down is a let's check here so we definitely bins is what we're returning bins is starting out is a list here and in fact it is a list that does contain other lists right now when it starts out it contains this inner list here with pulses zero and zero but then it gets appended here another list with pulse and one and at the end of this this whole thing is what gets returned which indeed looks like it matches their list of lists pulses you know what I forgot to do today was change to a t-shirt got the work uniform on the day job uniform on still pulses is a list and then returns a name tuple so this is one where it's kind of you know contracted all the code inside of here so we can't really see any of the numbers in this function I'm just going to bounce to the editor just to take a quick look in this one one or two decode bits so this way we can kind of see all this stuff at once without having to unfold and all that stuff so pulses we do immediately convert it to a tuple so it certainly could be a list I don't think this necessarily tells us for certain it is but name pulses is redefined several times it will stash the original in a separate variable for now might be worth refactoring to avoid yeah I would agree probably with that generally is that a comment that's added by this it doesn't look like it huh looks like that was there already okay yeah general I mean that is it kind of goes along with typing the way that we are rewriting pulses over and over especially if we're rewriting it with different types this is when it starts to make the code more complex with regards to the the my pie checks and things like this so that's still probably a good thing to consider it does change it to a list here well it doesn't change it to a list I mean I guess it is changing it if it's not a list but it's duplicating it I suppose I didn't realize that gave you a different list all the way I guess list function is always making a new list that's weird why did it go away yeah list definitely duplicates it makes a new one so you can then start changing them independently so now we have our original pulses we have a copy of it stored back in the variable that it came in with we also have input pulses which is a tuple containing the same data says that's going to be returning a named tuple which we return we return IR message IR message is indeed a named tuple right here IR message with pulses and code how's it going Shahid Abbas hopefully I didn't mispronounce your name there too bad apologize if so thanks for hanging out with us here during the stream definitely named tuple I think IR message you might be able to be more I don't know for sure but you might even be able to say IR message here instead of named tuple I don't know if it works like that for certain though would definitely want to test that to be sure but it is for sure I mean it is definitely a named tuple so if nothing else that's an accurate type for it as well unparsable IR message and oh okay and I see it's actually more generic than this right we can just do IR message because it only returns IR message if it makes it all the way down to here oh that's not a return though that's a raise of course if it raises then it doesn't return anything so I suppose it'd be optional that's true I don't know maybe it does still return I don't know how it raises but then we do have up here return and that's a different type NEC repeat okay so even if it can be the more specific ones it would need to be at least two like a union with NEC repeat as well as IR message and then I'm not entirely sure how raise factors in but that might as well they are all named tuples though so I'm inclined to say what's there now is probably fine right name tuple does accurately type all three of those of course this one doesn't seem used in there does it oh there it is okay setting it to message interesting but then message is not message just gets raised looks like Adafruit uses toggle switch circuit for switching from battery to V bus as the MCU's main power source are too diode safe enough on feather boards like will the MCU just choose the power source with the highest voltage honestly I am probably not the best one the person who's best suited to answer that for you sorry I don't want to lead you in the in the wrong direction or anything so I am going to pass on answering that one just because I don't know the answer for certain I am way more like personally I'm way more on the hardware side than the hardware side I am very much a newbie to electronics and circuitry and things like that I would say if you are interested you could join us over on the discord which is linked down below and then I think there's a couple places that would maybe make sense to ask there's like a help with projects I think there's also a help with hardware design even potentially something like help with circuit python might make sense if you're talking about a feather that runs circuit python main point being though there are folks around the discord that are a lot more in tune with the electrical engineering side of things than myself and they'll be able to definitely get you the correct answer there and I don't want to mess it up with something like that so that would be my recommendation is try asking over on the discord again gotta go for a bit hope to catch the tail end yep thanks for hanging out for a bit we'll see you around later if you make it back otherwise you can check out the video if you like or tune in next week or anything feathers use an LDO for power switching help with hardware would be a good place for that question yeah for sure yeah yeah sorry I couldn't get you anything more specific but get a little skittish on the electrical questions I just don't want to definitely don't want to be the the reason why anybody's letting the smoke out of anything so we got pulses as a list max pulse is an int one of those interesting ints with the underscores in there returns none pulse in someone doesn't really do a whole lot seems good read for returning none has no arguments pulses as a list again I assume we'll be seeing a lot of that pulses as a list and then aim as they return and data this is let me see this earlier you know list list encode bits another one of those there is decode bits but what why is that different decode bits takes pulses as a list decode bits takes pulses as a list we have two of those 371 is there another base class there okay okay there's another base class okay oh there's actually three at least three base classes decode bits we have another one of those interesting that it's different in here tuple instead of named tuple that's yeah that's a good point as well about the schematics too yeah on the in the learn guides for any particular piece of hardware like if you go from the shop page there will be a link to the learn guide for that product and then in the learn guide if you look for the downloads page typically there's a schematic in there generally speaking so if you look for the list list and then decode bits and then decode bits was the just tuple no longer the named tuple it is result which calls decode bits.code is it calling itself is it calling itself is it calling itself generic decode it doesn't extend anything but it just goes in here and then it says result equals decode bits pulses which is what we just got passed 102 okay this is not inside of a class these are just functions in this file hmm okay but this one is a class no this one down here rather this is a class this is generic decode class which has a function called decode bits which is calling up to the function that is not in a class static I guess I don't know if it's technically static but it feels like static function so in order to know the return type for this one down here we actually will need to know what is this return and then specifically we want to be getting decode off of it so if we take a look at for instance ire message named tuple pulses code just has like a string after it which is interesting the string is like not getting passed into anything code equals a tuple of output nice okay so that's going to be getting decode from the other one which we just saw will be a tuple where to get a raspberry pi 0 2 w looks like it's all sold out as far as I'm aware raspberry pi supply is still pretty tight so I do not have an answer for a place where you can for sure get one the best advice I can give is the advice that I have heard a few times on ask an engineer and some of the other shows which is on the Adafruit site if you first of all like make sure you have an account created you have to have an account in order to buy it make sure your account I believe it has to have two factor authentication turned on I don't know if that has changed anytime recently but as far as I know the last I heard on any of the rest of those shows that was the case so make sure you create an account make sure you get two factor authentication turned on get it all set up ready to go and then if you sign up on the product page there will be a thing for like a wish I don't know what it's called exactly like notify me when it's back in stock sign yourself up on that and then when the hardware comes in they will send emails to you know X number of people on the list based on how many hardware devices they were able to get a hold of so that is the only slash best way that I know of to try to be able to pick up a pie zero or any of the pies if I'm honest about it I don't think that's specific to zero or anything else I think that's all of them and be aware I'm pretty sure it's still limited to just like one per so if you're trying to just buy one to get it then you can go that avenue you know sign up on that notify me when it's back in stock if you're looking for more than one if you're trying to buy in bulk or anything like that unfortunately I think that's not a not an option at this time not from Adafruit last is last I knew which also be aware I am separate from the whole factory from the whole purchasing of pies and anything else so everything I know about it is all just from public live streams from asking engineer when I've heard it talked about so yeah I could my information could be out of date plus I don't have any any access to any information that's not just stuff I heard on live streams right from Lady Aida and PT pies definitely require 2FA still okay yeah Pimeroni has got four gigabyte in stock with international shipping there you go tip in the discord chat thanks for dropping that one there with Gerald over on the YouTube there we've got a folks in discord are saying Pimeroni is potentially got some four gigabytes in stock so if you look out maybe head over to Pimeroni's page and got a tip that there may be some there I would say they're pretty quick though because as far as I know they're still selling out everywhere pretty quick as soon as they show up read pulses non blocking you know that's an interesting that it is non blocking at the end I actually have I was working on non blocking for the text scrolling inside of the 14 by 4 and I think I put non blocking at the beginning of my function instead of the end might make sense to put it at the end though if nothing else just keep it consistent I don't know if that's if that's like a used across the board throughout libraries but I noticed that I did do that backwards right now input pulses as a list max pulses and int it's interesting I don't have the underscore thing on this one doesn't really matter though pulse window float yeah zero point whatever optional list so it could return a list or it could return none there return received received is if received is none then continue so yeah presumably received can be none and then you know once you get to the end of the loop something must be breaking I guess the return right here at some point you're going to get to here if recent count is zero then return received assuming received can still be none definitely starts as none there and then here in fact we are doing equals a list and then we're appending so yeah none or list definitely looks right to me input pulses list int boolean for blocking float optional list read pulses not the one I just did is it no that's the next one down but it does have a similar signature pimeroni is a good place because pys are British and so is pimeroni they're saying that on pimeroni they dropped four hours ago 6pm today I assume that's probably 6pm local time to England or wherever pimeroni's at input pulses list good to me we'll double check it with the dock strings it's always a nice one in input pulses object to read pulses from I wish that would stop popping up this doesn't say it's a pulse input pulses but it does seem like list would be more likely right if the pulses is shown as a list there oops okay now we went way back boolean float float does asterisk mean list maybe asterisk means list Sphinx dock string syntax return whoops really a return though right it was a read pulses stock string param syntax back in on list as well maybe tilde didn't come up with anything let's go we have 3 copies of this page now with I don't actually know what the tilde means oh I spelled tilde wrong I guess that's part of my problem preceding tilde cross-reference class with preceding tilde showing only the class name reference to a structured data class but also I will say too we are in this we're not in like Sphinx specifically we are in whatever this is so this is talking about specifically some ORM thing there's no tilde spelled the right way either maybe pulse in is a list I don't know yeah that one's weird to me that this one doesn't say list but my best guess is that either pulse in pretty much behaves like a list or that what we have is actually a list of pulse in objects they're kind of my top two guesses on what that is most likely meaning braille debug all none in the US be prepared for long delays for shipping 31 days to arrive not too bad when a function can return a list or none I like to return the empty list instead of none yeah I would say I don't necessarily know that we're like I don't know for sure if there are cases where it is doing that I get we had the optional one before I guess right that was from a little while back but yeah I mean if I'm writing a function I would probably tend to agree with that I think returning the same type I try to do that when I can so an empty list would be better than none in a case where it can return a full list as well but also don't necessarily want to like make that change without looking further around to make sure we're not going to break anything then what is all these headers header int one and zero it's weird why we have one and zero okay these do match the doc strings though the Sphinx one length in microseconds okay I see the length of that type of message basically trail transmit pulse out byte array repeat for int delay for int in bits optional int transmit pulse out we are matching there this one doesn't have a tilde as well so I'm thinking that tilde does probably mean list byte array matches repeat this one says float for delay those default to zero I would say it does we shouldn't try to match whatever the value so like in my mind if floats are allowed then my thought would be to do it like this where we explicitly have zero point zero to show that floats are allowed and then if floats are not allowed then that's where I go more like this int zero however as is it's a little tough to tell I don't actually know transmit can we find any usages pulse out that took pulse out and then a list byte array but then delay does not get used and that's the only usage our remote transmit is made for a circuit playground express do we need it doesn't know if it's successful right we could just do this on any pin that true can we just set this up for a pin that doesn't actually have IR on it and then try to figure out what we're allowed to pass to it here we go see this is group test built in genders I'm on a feather TFT I'm gonna worry about a button we are gonna figure out a pin we're just gonna say I don't have anything plugged in so it doesn't really matter I'm just gonna do D9 Eric transmit if button value so what I'm gonna do is change this to just say pass and then we will send this once after so obviously I don't have the IR LED hooked up so nothing is actually getting transmitted in this case the pin is gonna get toggled to where if there was a light on it then it would send a message but since there's no actual light on it obviously it's not gonna do anything hopefully it's gonna let us call it though so that we can try testing the delay argument to see if it will take a float or not okay so that did send successfully supposedly it thinks it did so it waggled our pin for us so then delay would be here like delay one we could stick into that and it will successfully make it through it again what about delay 1.8 yes okay so floats are allowed there one that could change to be float and then in my mind it makes sense also to change the default to 0.0 and that's really the only only thing I see that needs to change that's all for that pass through I'll take a quick look at these just refresh my mind on what some of these were we definitely saw pulses typed as a list everywhere I'll double check them again but I don't know quick we'll run through here 107 wow okay they highlight those so it's pretty easy pulses list, pulses list, max pulse that was another one that didn't have it there it does all the places where there's pulses typed now this one is what pulses max pulse yeah we got that one yeah that's another one those are not pulses but I'm pretty sure we did have all those done that's around 314 really weird is going on with these it's open to all of them this is the one I was trying to open I'm not sure why it opened to all of them we definitely did have that because we looked at that function those were mostly ints out to layer repeat yeah okay was this pulse window or remote that's at 281 or it was window start does float now yeah so the really the one thing I would that I can see at this point that I think should change is just delay to be a float right here that is super minor and the last time this person did commit was like a week ago if there was anything more to do than that I probably would just leave another you know suggested change I think since it's literally changed this one thing here I'm just gonna as long as it will let us I'm just gonna commit yeah I still am not clear whether this always shows up even if you don't have permission or not test that out one of these days if we want to be able to add a commit to this PR we will need to have the correct remote remote Pedro vs 16 enter that one I spelled it wrong 0 it doesn't really this one is less important I think since it's in a string and not like in the type or the default I should say in the actual code pre-commit we are good there float instead of int for delay that should be our only change unchanged Friday is going well same to you my friend commit at the bottom and then we'll wait and see if that passes actions should just ran pre-commit here but it's always good to wait we'll see if it passes actions and then I'll leave an approve and merge it if it does the one that I know off the top of my head was ready for another look so while we wait on actions for that one I will just take a look through the rest of these here this one has got some feedback but doesn't hasn't had any further action yet so kind of just play the wait and see game wait and see if the contributor is going to come back and do that eventually if they don't then somebody else will probably pick it up on this one same thing here already already got some feedback just waiting to see if the person is going to come back there are merge conflicts in this one I guess one thing we could do to try to help out is reserve the conflicts I wonder what would have changed two weeks ago days ago and pre-commit let's try to merge let's try to merge this one like this is something the contributor can do but it's I would say a little bit kind of more advanced like fear not really you don't have a lot of experience with get then it might like it might seem harder might seem hard maybe if we can do that it'll make it more likely that they come back to it I have never done it in here supposedly you can do it with this thing I've never tried that I don't think I want to try it live for the first time on one that's not mine so what we're going to do is fix it locally something something do we have that yep I got that one right there I'm currently on main but there's no telling when I clone this originally or how out of date my local one is get remote dash v get remote rename origin a to fruit we're going to end up wanting to push here as well so we're going to need the remote for the end user it remote add we're going to paste that and then I'm going to come back and do the name which is going to be r r a h k o l a enter get fetch r r and now we go g h p r list g h p r h repo set default rest g which is not one of the valid options g h p r list g h p r checkout good ol number 42 and then let's look at the differences so in order to look at the diff oh that's interesting it's in dev I don't know why that's in that like part of the name of the branch okay yeah it's not actually in dev like it's a directory it's just there's a slash in the name interesting and now that was allowed actually so if we want to see the differences pie charm actually makes this super easy on the branch we're on is add type attributes or dev slash I guess this is what has turned it to a folder kind of interesting but we can always just go like compare this right compare with like that that's going to show us up here commits that exist in main but not add type attributes and then down here commits that exist in add try type attributes but not main in our case we're interested in the top ones we want the commits that are in main but not in our PR branch basically this stuff in it's I think was the file it said so far we just have empty lines everyone looked like all all empty lines to me but I assume it's more than that otherwise it probably would have done it by default so we'll go merge main into this merge main into dev add type annotations okay there we go we found the same conflicts we're gonna say I want to merge these there we go okay so these ones are in typing we want to take that we want to take that basically here we just go pull everything as it makes sense from left and right there's actually a lot of stuff on the left here it's gonna be basically every change probably what we're gonna end up doing is pulling all the stuff from the left and all the stuff from the right and most likely there's gonna be some small number of those I'm guessing where it's actually different like we have change on the left we also have change on the right but the change on the right actually is not really a change per se it's just getting rid of an empty line the change on the left is adding the type annotations of course and in our case PyCharm's magic wand here is actually gonna result it perfectly for us because that is gonna pull the type annotations from the left and it is gonna pull the lack of an extra line from the right thank you PyCharm for having really helpful merging tools it's like same thing here string and then we got rid of an empty line there the same thing magic wand is gonna help us fix this one easily but if the difference is a little more extreme than that then the magic wand will not necessarily help you but those ones were actually really simple for it to figure out you have a lot of that is looking like the same thing it's none it doesn't have that extra empty line there I'm assuming that must have been like a difference in the version of black or pilot or something guessing the old version gave us those empty lines and the new version got rid of them or maybe more accurately might be the old version allowed us to have those empty lines without changing them or as the new version doesn't maybe the old version didn't explicitly add them itself that part I don't actually know there's a packet all changes processed so yeah all the conflicts were actually just those new lines we go apply on that we go we're ready to push that we double check that our branch is right add type annotations not excuse me attributes actually it says not annotations our hwala this will show up here and then with a bit of luck it will be green on the part here where it said like before it said there was conflicts so it wasn't allowed to be merged now the conflicts are resolved so it's back to being allowed to be merged of course appending like the actions and like an approval and all that stuff so obviously that's still in the mix but we no longer have conflicts that's a step one barrier out of the way and I will always do that for folks if I run across the PR that's like that because like I said if you're not used to the tools like that can be a daunting thing if you're not used to it dash display as feedback that is waiting on action display button right I remember this this one does have feedback yet it's waiting still for some more the next thing to try on this one I'm hoping the contributor will remove this line and see that gets rid of the my pie error that's flagging that line basically there's some type I think the term is type juggling I'm not sure if I'm like actually using that glossary term correctly or not but it sounds like it would fit I think there's like type juggling where this is like getting passed in an argument that is a string but then it's later saving the same variable to a label object instead of a string and my pie is not super happy about that this one is pre-pycon it is waiting for a review these ones are actually from pycon this person started working on this around pycon but they have kept it up and they submitted another batch of these just the other day that is still just waiting on action on their part for now have my eye on this one this is not pycon or type annotations related I do have my eye on this one to test out at some point I don't know if I want to do it on stream though because it's adding an example that renders pictures of fingerprints I don't necessarily I don't think we want my fingerprint on the stream so it would be difficult for me to stream and show what I'm working on without showing it that way this one is already merged HTTP server this one back in the draft or is that one back open now this one is looking for some more review I have tested this one a few times even I think we worked on this last week on this stream as well print status satisfying all the changes both that initially and after the ones were created listed in the first plus above with edit text next to them if they were changed any of new ones there we go we could go toes instead of fingers maybe fake fingerprint maybe ours is good foundation for implementing middleware the future if that comes so this one will need a little bit more time this one will need some more thorough testing basically but it is out of draft and ready for that so maybe Monday we'll be getting back into testing that one again Island errors something different it's already merged also I are remote that's the one we looked at date logs for no arts pre-commit is passed now I don't really understand this part I guess is there a better way to run black after the commit is pushed so ordinarily you would run black before the commit is pushed pre-commit I mean in our case generally pre-commit is going to be the thing that runs black and then the idea is that pre-commit runs before your commit gets created if you use pre-commit install oh wait no they didn't do it they did pip install pre-commit if you use pre-commit install which this doesn't then it will automatically run when you go to make a commit it will do it automatically before by itself if you're doing it manually then you typically I think are going to want to do that before it gets pushed so this I mean this is what I do pre-commit run I do dash A which is I think a shorter version of dash dash all files that typically does work for me saying though they complained about loads of files for CRLF thought going backwards was easier as black seems to check just change files I don't really follow this last part here they you know one way or another they did get it figured out of course pushed because we are all green now so really the main thing we need is like a review it used to be self.name, level, message what is that is it being used for dividing like a modulus message percent sign args and then args so the new one is self.name level we still have this but it's in parentheses now and then it also says if args, else message, args so that would be a tuple I think message and args got to hit the hey thanks Tim goodnight I'll take it easy Dave Odessa thanks for hanging out for a bit string formatting okay messages the string presumably that string has a percent then I guess or a percent something interesting I'm not sure I follow how this what's going on with this one maybe I made it set up so for the week I was a senator I didn't have pre-commit set up I don't know I don't usually install pre-commit I usually run it manually personally I played around with installing it but I don't know I find it I don't forget to do it and I like to have that manual thing I also like for like when it goes automatically it's kind of unclear like if it encounters problems then it's like what state are you in did it finish your commit or did it fail and therefore it didn't if you run it separately as two different steps and then pre-commit fails like there's no question about what state you're in like you're still in the same state your pre-commit just failed because you weren't like halfway through a push or whatever so the main change here is that you can pass in no arguments adapting the since you're on itc driver uses python logging they pass in nothing as arguments args sometimes till logger.debug blah format args compatibility with c python definitely is good this does make us closer and so I'm not used to this interface quite yet if this does get us closer to c python that's definitely for the better what does args get passed to you though so is it into like info or error those things or is it in the constructor log underscore log so I'm guessing that the guessing that like dot error and all of those ones dot warning all of those I'm guessing those are calling dot underscore log around this one cloned string format right sorry I think it I think it wanted percent was using dot format instead it wasn't since Syrian library was using python logging was doing that via logger.debug gibberish dot format nothing it seems kind of stuck it's forever I did not know that I don't know this does not feel like it's going to complete really all systems are operational though so in your example there would nothing would that be like a variable that contains none or would it be they call format and then there is literally just no nothing inside those parentheses data to log string result that depends on what is data to log string was going Jose rpo over on the YouTube there bytes returns a pretty printed data bring data I love debug format with no no result the result is none maybe you are empty it must not be none though right because string of none the string of none give you the actual string none no any with the capital N does so that I mean it feels to me like this will always return a string with something in it will either be a string with square brackets and something inside of them if this actually evaluates but even if this doesn't evaluate you would get square brackets by themselves and then and the other possibility it would be the string version of your data even if your data is none then that will still be the string the literal string none args is an empty list by the response for itc command but not necessarily meant I think I'm not built with no results it was the empty list rather than none as you say okay try that one try to make a new file here I'm gonna commit this so it'll just get deleted later but logging c python test so we have some case level to test against here so just compare some to c python import logging do that the c python logging I'm gonna split this to here I'm gonna get some of this stuff out of my way try to make this kind of the same way logging let's try getlogger so let's do that let's go sure why not let's do that bang that one logging getlogger name default handler certainly matter if we do that I need the asserting I don't think let's just let that run that should just print out our message didn't I think so is that because our level is wrong or it's because the default it's because the handler is null need this also need a handler then we need to do this but that's this there we go now we get to print red for some reason I'm not entirely sure why it's red especially when it's not like error but it did come out so so then basically this would be like if you did this placement index zero out of range this handler no message empty list okay brb I gotta run to the restroom so if we run the same thing on the microcontroller side I'm logging that same thing so far I mean it's slightly we got slightly different I guess it's not red it does have a time stamp but other than that it's the same thing auto yeah circuit bottles pretty nice they do forget to do it that way sometimes but they're default none not following what like what's the case this is what I want to try to get to is the minimal code necessary to illustrate the different behavior between circuit Python and CPython just like I don't have the same if args args I wish there would be a reproducer code of like run this code in circuit Python run this you know the CPython variation which will be almost the exact same the difference would just be the import here's how it behaves in CPython here's how it behaves in circuit Python and then this is the PR that changes it so that it's the same that would make it a lot simpler I think to review because I don't see like where I don't quite follow what this change is going to do I can't quite like visualize what is the code that runs that used to not work in circuit Python and now does right like ideally we want to try to find that code so understand what it's doing you a crashable test okay what is 30 which was there with the bread invention 30,000 years ago 30,000 years on bread huh sliced bread though I guess for that it was just rip a chunk off just not a bad way to go all checks passed on this one now how's it going Axel your mother would never touch bread with a knife you always break it and respectful interesting breaking bread I've heard of breaking bread before this one's one of these ones like to do this I don't know it doesn't really matter right this format is also acceptable I like this format though or I shouldn't even say I like it versus anything else it's just I'm most used to doing this format here and then adding a sentence at the beginning that says what changed I want the same tag that we want a new tag that's one higher it's doing that thing where it won't it won't fill this in I don't know why it does that sometimes like sometimes this list will pop up with all the people especially the one person who I'm looking for the person who made the PR other times they're just not in the list it will still pop up a list of names but it will just not include that one even if you're typing the first half of it 1.15 1.14 is the previous release 4.1.15 is definitely higher typing information BS16 breaking, expression breaking bread means to share some food with a guest nice breaking or tearing the bread is the thing in some cultures I had no idea hold off a minute on that it sounds like you may get you may get some help from I didn't notice it actually at first but that's actually from the person who made it with us as well which is awesome limitations waiting for action some of these just need pre-commit still so at some point I'll go through and run pre-commit on them and just add a commit if the original users don't ever come back and do it make a full snop icon pre-commit has been updated session, object, none, subscript 10th, none type isn't subscriptable it's relevant maybe single response the page we were looking at this code in none type it's definitely going to be passing none there are WR available but 2W look hard to come by let's not highlight the conceive at you see connection received raw interpret response interpret single response then interpret response with no underscore none of those are inside trance I'm not sure the line numbers are the same still look like it 211 shows inside of interpret response with an underscore which is here but that actually ends at 207 in this version sorry I'm still missing I'm still not quite understanding like what is at the end of the chain what is getting passed into this I'm still a little not quite understanding that so this one definitely fails if you do format with nothing but it fails with index error tuple index out of range it's different and I'm pretty sure that fails outside of logging altogether right line 10 that still so that one doesn't even make it into logging definitely not empty it's got to be none something but I'm not okay maybe is it multiple or something or maybe it's not enough none once but then one of these that fails the same way but it's still the same thing where it's like that's part of format rather than logging none like this where it types mod okay that's probably it that's probably it it did try well mod does it use dunder mod for the string substitution as well I put none in there I just run it without anything okay so that one's definitely different that does type error there whereas CPython works fine let's try it with nothing that time we were missing an argument which makes sense same thing there it's worded slightly differently but in effect it's the same message okay so I think we found it maybe none what's dunder mod dunder mod dunder is like shortcut for this double underscore so dunder mod just means double underscore underscore underscore then mod other two underscores at the end all that means and the reason I ask is because when we did this it says unsupported types and then it has this so I was saying dunder mod like is it using dunder mod in order to evaluate the percent string substitution or is that a different mechanism it looks like it does based on this because it looks like it's trying to mod that which is odd because it's not trying to like modulus it's not trying to divide and then take the remainder I don't think I think it's that substitution that we saw before this one's mypy impuy not mypy 391 327 okay it must dunder mod must be part of the magic for string formatting the old way interesting got you built in mod overload okay so when we pass none we get this error when we do the same thing on cpython it does succeed so now what we're testing would be does the one from the PR fix that so for that we go we'll copy this one to our device that again should fail with no module almost feel sane you're welcome alright there we go yeah the fix looks good fix does make it now behave the same no longer crashes and in fact does more or less the same thing as what we were seeing before obviously it does still have time stamp and it's white not red but we were seeing that same difference anyway yeah thank you for the fix it's cool to have somebody around watching the stream while we're looking over the PR it doesn't always work out that way but it's nice when it does also appreciate your help on the failure cases there one so we're going to want to be going 522 whoops I just like to do the dash here I don't think it matters but another one that time it's not listing anything get your username right so I can guess when I say y-e-t-h e-t-h yeah okay two one is the old one 522 is the new one this is not the right thing here this a fix unblocks you on the sense 55 dust sensor nice dust sensor impromptu I guess poll for the people watching this is anybody who's watching this interested in SMS or telephone calls so there is a service called Twilio which allows you they have a REST API that allows you to send and receive text messages as well as send and receive phone calls and so like you could send a phone call that will have text to speech like say something to the person who answers the example I always like to use is if you are familiar with like calling time and temperature do you ever did that as a kid or still to this day there used to be like time and temperature phone numbers there would be a phone number you call and it just plays a recording that tells you the time of day and the temperature in your area and like maybe a little bit more about the weather like cloudy or sunny or something like that Twilio is like a service that provides a REST API that allows you to make stuff like that I'm considering making a Twilio CircuitPython either library or example that just shows how to use the requests library in order to interface with Twilio but I don't have necessarily a specific use case in mind but if that kind of thing mobile SMS and telephone calls is of particular interest to anybody let me know TweetML clever with DynDyn's DynDS your ESP32 could respond yeah yeah I was thinking about that as well there's learn guides with the chat GPT stuff in it as well so it could kind of like you send it a text or something and then maybe it like prepares a response to you with chat GPT or something I was thinking of some other use cases maybe sensors it was your dust sensor here is what made me think of it actually right now is I was thinking like you could have a sensor set up in a room whether it's a dust sensor air quality or something like that and it could send out text messages if it's above a certain threshold or something as like a warning I don't know I don't have like a legitimate this is exactly what I want to do with it use case but I was thinking it might be cool just to get some examples or a helper library out there so folks who do have more specific ideas can be able to whip something up easier go with the 54 instead save a quid or two how to try them all I keo went with 54 p.m. our age 55 includes no ex is a gas but I don't know my elements or it's not really an element I guess but I don't know my chemistry names so I'm not sure what no ex is nitrous oxide that's I don't know if that's right or not just have whippers snapper most have seen whippers snapper slash adafruit IO so I definitely have seen adafruit IO is I did not know adafruit IO interacted with SMS at all to the best of my knowledge it doesn't that being said I don't have that much experience with adafruit IO so I could just be wrong to the best of my knowledge though it does not interact with SMS but that'd be cool if it does hopefully I'm just wrong and it does because that would actually cut out Twilio as a third party service which has the thing to you do have to pay for Twilio that's the thing too it's not free you have to pay per message that gets sent so it's not a lot it's like a fraction of a penny but it's not a free API as well so I like to know more about but it isn't something I had time to look into I've used it in a few unlike a few projects that are unrelated to circuit python and I found it to be pretty easy to interact with it was like a nice nice API for doing that kind of thing okay we got 10 10 12 15 minutes ish left the very last thing I'm going to do during this stream is look into a fix for this so we're on a docs page here I clicked through from the repo to the docs and on the docs page this thing here will not pop up it's supposed to pop like you click this it's supposed to go whoosh and raise up a little panel here and the panel has different versions inside of it but that's not working like if we go here you can see that's supposed to pop this up but it's not doing it and I think the reason is because it doesn't have jQuery at the right time because it does actually have jQuery um I think but it gets injected too late or something so the way the way that we fix this before N2O I still didn't catch what the actual chemical was series you get CO2 for concentration IO's take SMS IO does oh it takes inbound SMS feed messages on the pro plan I got you okay I do have the basic plan only for myself it's inbound so you can send an SMS message to Adafruit IO in order to submit data to it which is pretty interesting I don't know that thanks for the heads up and then what so and so I will say Twilio will allow us to do a bit more because it will allow us to go the other way around it would allow us to from the microcontroller essentially send a text message to a phone technically the microcontroller is actually going to send a post to the Twilio server and then the Twilio server is going to send the text message but in effect the microcontroller can cause that text message to be sent so it would give us one extra link that we don't have the option to do in Adafruit IO if I'm understanding what Adafruit IO has today correctly in OX equals nitrous oxides US you can also send text messages to your phones email address if you can send an email from your program that the target that target the email goes to can be your phone interesting I don't know that have like vague recollection of something like that from back in the day before smartphones but I don't remember the exact I don't remember the exact details does kind of ring a bell so I think what's going to be the fix for this in the libraries is going to be the same thing that was the fix in the core which was pretty much just adding Sphinx RTD theme jQuery or something Sphinx contrib.jQuery inside of extensions which is in cof and then inside of requirements doc.txt so let's head back to main let's update this let's make a new branch get checkout let's make a let's get remote-v get remote rename origin Adafruit get fetch Adafruit add only guy oh no should not have done that thought I had a URL copied so we will test this on the logging library the goal for today is to try this on one library and see if it works to fix the docs and then if it does then next week we work on how to roll it out to all of them it doesn't and we dig further and figure out what's going on with it check out jQuery fix b new branch from main jQuery fix so we go okay so one thing right off the bat oh right right right right we don't have we don't have docs requirements but what we do have is requirements inside the docs folder probably where this would go on this one let's have a different version of Sphinx I don't know if there was an empty line there or not then inside of extensions in the conf .py also inside docs extensions this one is after doc test we don't actually have out of doc interSphinx interSphinx is down here below so I'm going to put it between these two I don't think the place where it matters but try to make it as much as I can pre-commit why this is like initializing I don't know why it's doing all this reuse yeah it's mad about these extra files trying to actually check into the repo so like I would argue it shouldn't be checking them but let's try that again there's a badger at my greenhouse door slightly terrifying and very special wow if I've ever seen a badger in real life alright that passed let's go to docs let's go cp docs our docs actually builds okay perfect if I recall correctly this never did suffer from the same thing locally because locally oops probably just checked the chat over there sorry about that locally it does not have that frame that frame is some kind of magic see we just don't have that thing here it's not part of this page it's part of read the docs adds it in after the fact so we can't really check locally very well other than just to make sure the page loads which it did jQuery fix here we go we'll put that in we'll mark it for circumparthen librarians if anybody who's watching has a chance to take a look over leave a review that's most appreciated otherwise we'll wait until we get someone to look that over once that is reviewed we can try to merge it we can check on the docs and if that does work then next week we will have actionable change that we can get a patch put together for get it out to the rest of the libraries it would be nice to have our docs working again well I mean the page themselves works you can still read everything on the page you just can't go back to like other versions and things like this so it'll be nice to get it back to running but it's also not like it's you know it's not like it doesn't do anything for you as is like it is still 99% the same thing it's just like if you're trying to get the old version then you're a little sol or you even could still do it if you know the right url but you have to know that turtle got some feedback waiting on action it's also got some conflicts so that would be another one maybe we could merge the conflicts to make it easier on the computer but okay we've got there on the wisdom nice before marriage got some more updates in there one's got conflicts as well a lot of conflicts on the PRs that are open okay on then reviewed I don't know if I'll have time expertise oh right this is the I think that's the really that's the url you're asking that's the I mean if that's the thing you're asking about that is the url for it and thank you by the way Tithe I will I'll still wait on this we don't want to merge it for sure if the see I doesn't pass but if it does pass then we'll merge that and check it out real quick and then I'll probably wrap it up after that I think so if anybody has any last questions comments statements anything you want to say anything you want to ask now is the time to do it have maybe another minute or two here while we wait on the actions but then I'll probably be heading out after that for folks that are interested in this type of content if you like this sort of thing people working on circuit python you can find more of this on Saturday mornings tomorrow morning at 10 am central time I will be back but I'll be over on my own channel you can follow me on twitch if you want notifications I will post links for twitch and youtube into the discord the live broadcast chat when I get started so if you don't want to follow me that's fine as well but you want to watch along you can just hit that chat room in the morning and I'll drop links in there when I'm getting going I don't know for certain what we'll be working on tomorrow morning but I will be back for sure to stream and it will definitely be something circuit python related that's looking all good and now one thing I don't know is if we need to make a release or not so we'll actually get to wait on another actions or two ish we're gonna wait for this one to go green then we're gonna check the docs but if it's still the same then we're actually gonna make a new release and then wait for the actions one more time because I'm not sure when read the docs like I don't know if that's part of the release or if it's just part of the commit or what I don't know when that updates so we'll wait on this to go green we'll check it and then we'll make a release and we'll check it again after that screen again so another couple minutes but as I was saying 10 a.m. central time tomorrow morning I'll be back to work on some more circuit python stuff so you are interested in this sort of thing you want some more of it that is where you can keep an eye out if you want to watch some of the prior ones there are there's a big library of my past vods over on YouTube as well if you want to go back and see some of the other stuff that I've worked on but we'll be back at it tomorrow yeah I won't speculate I was going to say some of the things I might work on but I don't want to I don't actually know for sure I don't want to get anybody excited about anything specific and then end up not doing it so keep them to myself for now we'll figure out in the morning what we actually want to do what hobby circuit python projects have you been playing with lately I've been out of the loop um the main one that I have been working on lately that I would call more of a hobby project is it's actually running I'll show you the I'll leave it on that I'll show you the device here it's basically a web server that controls several other hardware peripherals so it's kind of a way to test that HTTP server PR I have a feather tripler with a feather and then 14 by 4 and then a grid of neopixels and what we worked on was an HTTP server app that runs on the feather and gives you a REST API to interact with the other hardware so you can set the text that scrolls on the segments here from the REST API you can also set the colors in all the neopixels in the grid to whatever color you want or you can set an animation out of a list of chosen ones you can't just choose an arbitrary one but I think there's like four or five of them hard coded in there and you can select the animation to have it run on these as well so all that just kind of runs and does its thing and waits in the background there on the web server for you to connect up to it and actually change those things 102 it looks like is the IP right now that gives you this page you can go let's go deep divers set marquee we have deep divers scrolling across there and then we can either change the animation so like we go rainbow comet if we want instead of rainbow we've got the comet going there or instead of the animation we can actually use this grid here where we can select colors and set and then it will set whichever colors you choose in the grid I don't have a real super it's another one where I don't like I don't really know why I made this other than just to kind of be an advanced example and to test out the non blocking marquee which I still need to make a PR for actually but that's the that's probably the thing I've been working on lately that I would say is closest to more of a hobby project than like specifically working on a library for the core or anything like that all right we got a green check here refresh that and make sure docs no okay still same thing here that's not working same thing there so let's do the release whoops they do jQuery right it's supposed to be like that more so catch up on that looks like it's got a lot of components I'm interested in nice at some point I've been dragging my feet I want to order a quadrupler the feather tripler is the biggest one I have but I do actually want to grab the quadrupler and add another add a third feather wing but I'm not I'm undecided on which one yet which tells you that I'm like very cart before the horse on this project where I'm like I know I want to add something else but I don't even know what else I want to add I just know I want more things because the goal of that project is to try to kind of make it do as many things as I can to show how you can have that HTTP server running in the background obviously it's not like literally in the background but you can have it coexisting together with the other operations happening have it control all that extra hardware so we'll wait on this one to go green and then I'll check in on the docs again and then I'll check it out for the evening after that okay this is from before NOX is car nut slang for nitrous oxide so it was nitrous oxide but it's not I mis misappropriated it I guess to being the chemical name or code or whatever I don't know what they call those but like H2O the chemical composition or whatever it's not actually that that would be in 2.0 there's a slang term for it release build I don't know which action it would be so I'll just let all these finish up and then we'll check in on the docs again we may have to wait an extra minute as well too because I think on the read the docs side I'm pretty sure it has to like do some of its own stuff as well I think it might be making a build of the docs on their server as well I'm not entirely sure I feel that carting before the horse I need to fix my environment sensors so the data they record is stirred in an easy to use database but I keep trying to figure out what database before I really know what I need the data for I need that data for yeah it's made me the grid on here in particular the LEDs has made me want to try to define a standard ish standard ish rest api for neopixels I started mocking it out show you that while we wait here I don't know for sure if I'll end up doing this or when so it's kind of like one of the things that spawned in my mind from this little project was like hey wouldn't it be interesting if we had a you know again standard ish rest api that supports neopixels so that completely through rest requests only you could initialize the neopixels on whatever pin they're on dot stars as well they don't have to be neopixels they could be dot stars also then you could go and set or get the colors on any pixel or set or get the animation on the strip as a whole and you could do all of this through rest api also we would expose those individual function calls from the neopixel objects so like brightness auto right start fill yeah so this is all theoretical none of this exists yet but it's what this portion of this project back here got me thinking about was making a more general neopixel api you know we effectively have a neopixel api in here but it's like very specific to that grid that they're in here it's not general at all you couldn't switch it to dot stars you couldn't really change the number of pixels you couldn't just call fill that's a bit more general I think that might be kind of fun so at some point I may work on that nice got it that's working now refresh okay cool no longer have any jQuery missing stuff there's this whatever this is but that's not a jQuery missing whatever it is it has not prevented the page from doing its stuff this working so good to go there now we just work on a way to kind of patch that same change out to all the rest of the libraries but that will be a job for Monday I think so thank you everybody for watching that color selector for the grid is one of the parts I want to try and use in my home server the rest api would be cool to see I'll tell you the color picker I used is an off the shelf component I want to say it was called coloris coloris yeah this was the color picker I used if you're interested in that's third party component you just kind of included in your page and then I think you call initialize on a regular old text input and then it turns it into this for you I did find it to be super convenient to work with so I can't say that I've used it a whole lot I didn't do a lot of intricate customizations or anything else but for the most basic use case I did find it pretty easy to work with it was pretty cool I was wanting somewhere to check in list data at high rates not crazy rates and only show the last 60 days or whatever like Adafruit does but long term cold storage for all the data past the 60 day window so to retrieve cheap to restore but also ideally backed up anywhere or do I really have to build the project I don't want to it's a good question I don't I do not personally have a good answer for you as far as an off the shelf sort of thing that would let you store arbitrary data I will say like personally I have a lot of experience with Django Python Django the web framework so certainly you could make a Django project that allows you to store data into it and then deploy that to a server and get your backups and all that kind of stuff you want going forward you could build that with Django but it's not just like ready made you would you would have to build that out that's if I were sitting down to do it that's probably the way I that I would do it but like you said I don't know if there's like is that rebuilding the wheel or not right there may be one out there that I just don't know of so I don't have a great answer for you you know that's one way you could do it but whether or not there's out there I don't know thank you everybody for watching take it easy Keith Tyath thanks for hanging out in the chat here with us and for your PR over there appreciate all that stuff my server is completely local so I don't know about remote servers to manage that unfortunately I gotcha yeah I mean with Django you could run it local server as well like on a raspberry pi or something like that you could run that on your local network too if you wanted anyway I will head out for now thanks for watching everybody hope you all have a good evening and a good rest of your weekend and all that kind of stuff like I said before we'll be back 10am tomorrow central time so head to the discord if you want to hit the links when that starts otherwise I will see you around later whenever that may be thanks for watching and I'll see ya