<strong>Topics covered in this episode:</strong><br>
<ul>
<li><a href="https://github.com/nektos/act"><strong>act: Run your GitHub Actions locally!</strong> </a></li>
<li><a href="https://portr.dev">portr</a></li>
<li><a href="https://rednafi.com/python/annotate_args_and_kwargs/"><strong>Annotating args and kwargs in Python</strong></a></li>
<li><a href="https://github.com/Envoy-VC/awesome-badges">github badges</a></li>
<li><strong>Extras</strong></li>
<li><strong>Joke</strong></li>
</ul><a href='https://www.youtube.com/watch?v=v3x4WqEwamg' style='font-weight: bold;'data-umami-event="Livestream-Past" data-umami-event-episode="382">Watch on YouTube</a><br>
<p><strong>About the show</strong></p>
<p>Sponsored by ScoutAPM: <a href="https://pythonbytes.fm/scout">pythonbytes.fm/scout</a></p>
<p><strong>Connect with the hosts</strong></p>
<ul>
<li>Michael: <a href="https://fosstodon.org/@mkennedy"><strong>@mkennedy@fosstodon.org</strong></a></li>
<li>Brian: <a href="https://fosstodon.org/@brianokken"><strong>@brianokken@fosstodon.org</strong></a></li>
<li>Show: <a href="https://fosstodon.org/@pythonbytes"><strong>@pythonbytes@fosstodon.org</strong></a></li>
</ul>
<p>Join us on YouTube at <a href="https://pythonbytes.fm/stream/live"><strong>pythonbytes.fm/live</strong></a> to be part of the audience. Usually Tuesdays at 11am PT. Older video versions available there too.</p>
<p>Finally, if you want an artisanal, hand-crafted digest of every week of </p>
<p>the show notes in email form? Add your name and email to <a href="https://pythonbytes.fm/friends-of-the-show">our friends of the show list</a>, we'll never share it.</p>
<p><strong>Brian #1:</strong> <a href="https://github.com/nektos/act"><strong>act: Run your GitHub Actions locally!</strong> </a></p>
<ul>
<li>Why?
<ul>
<li>“Fast Feedback - Rather than having to commit/push every time you want to test out the changes you are making to your .github/workflows/ files (or for any changes to embedded GitHub actions), you can use act to run the actions locally. The environment variables and filesystem are all configured to match what GitHub provides.”</li>
<li>“Local Task Runner - I love make. However, I also hate repeating myself. With act, you can use the GitHub Actions defined in your .github/workflows/ to replace your Makefile!”</li>
</ul></li>
<li>Docs: <a href="https://nektosact.com/introduction.html">nektosact.com</a></li>
<li>Uses Docker to run containers for each action.</li>
</ul>
<p><strong>Michael #2:</strong> <a href="https://portr.dev">portr</a></p>
<ul>
<li>Open source ngrok alternative designed for teams</li>
<li>Expose local http, tcp or websocket connections to the public internet</li>
<li>Warning: Portr is currently in beta. Expect bugs and anticipate breaking changes.</li>
<li><a href="https://portr.dev/server/">Server setup</a> (docker basically).</li>
</ul>
<p><strong>Brian #3:</strong> <a href="https://rednafi.com/python/annotate_args_and_kwargs/"><strong>Annotating args and kwargs in Python</strong></a></p>
<ul>
<li>Redowan Delowar</li>
<li>I don’t think I’ve ever tried, but this is a fun rabbit hole.</li>
<li>Leveraging bits of PEP-5891, PEP-6462, PEP-6553, and PEP-6924.</li>
<li><p>Punchline:</p>
<pre><code>from typing import TypedDict, Unpack *# Python 3.12+*
*# from typing_extensions import TypedDict, Unpack # < Python 3.12*
class Kw(TypedDict):
key1: int
key2: bool
def foo(*args: Unpack[tuple[int, str]], **kwargs: Unpack[Kw]) -> None:
...
</code></pre></li>
<li><p>A recent pic from Redowan’s blog: </p>
<ul>
<li><a href="https://rednafi.com/python/typeguard_vs_typeis/">TypeIs does what I thought TypeGuard would do in Python</a></li>
</ul></li>
</ul>
<p><strong>Michael #4:</strong> <a href="https://github.com/Envoy-VC/awesome-badges">github badges</a></p>
<ul>
<li><img src="https://paper.dropboxstatic.com/static/img/ace/emoji/1f60e.png?version=8.0.0" alt="smiling face with sunglasses" /> A curated list of GitHub badges for your next project</li>
</ul>
<p><strong>Extras</strong> </p>
<p>Brian:</p>
<ul>
<li><a href="https://www.bleepingcomputer.com/news/security/fake-job-interviews-target-developers-with-new-python-backdoor/">Fake job interviews target developers with new Python backdoor</a></li>
<li>Later this week, <a href="https://courses.pythontest.com">course.pythontest.com</a> will shift from Teachable to Podia
<ul>
<li>Same great content. Just a different backend.</li>
<li>To celebrate, get 25% off at <a href="https://pythontest.podia.com">pythontest.podia.com</a> now through this Sunday using coupon code PYTEST</li>
</ul></li>
<li><a href="https://podcast.pythontest.com/episodes/220-juggling-pycon">Getting the most out of PyCon, including juggling - Rob Ludwick</a>
<ul>
<li>Latest PythonTest episode, also cross posted to <a href="https://pythonpeople.fm">pythonpeople.fm</a></li>
</ul></li>
<li><a href="https://hci.social/@orion/112167137880858495">3D visualization of dom</a></li>
</ul>
<p>Michael:</p>
<ul>
<li><a href="https://djangonaut.space/comms/2024/04/25/2024-opening-session-2/">Djangonauts Space Session 2 Applications</a> Open! More background at <a href="https://talkpython.fm/episodes/show/451/djangonauts-ready-for-blast-off">Djangonauts, Ready for Blast-Off</a> on Talk Python.</li>
<li><a href="https://djangochat.com/episodes/michael-kennedy">Self-Hosted Open Source - Michael Kennedy</a> on Django Chat</li>
</ul>
<p><strong>Joke:</strong> <a href="https://www.reddit.com/r/programminghumor/comments/1ceo0ds/just_a_silly_little_game/">silly games</a></p>
<p>Closing song: <a href="https://www.youtube.com/watch?v=pGbodliLFVE">Permission Granted</a></p>
↧