Feeds
Send your talks for Akademy NOW!
Akademy 2024 (the annual world summit for KDE) is happening in Würzburg, Saturday 7th – Thursday 12th September. (I hope you knew that)
First of all, if you're reading this and thinking, "Should i go to Akademy?"
The answer is [most probably] YES! Akademy has something for everyone, be it coders, translators, promoters, designers, enthusiasts, etc.
Now, with this out of the way, one of the many things that makes Akademy is the talks on the weekend, and you know who has something to say? *YOU*
Yes, *YOU*. I'm sure you've been working on something interesting, or have a great idea to share.
*YOU* may think that your idea is not that great or the things you work on are not interesting, but that's seldomly the case when someone explains me their "boring" thing they've been working on, i always think "Wow that's great".
Ok, so now that I've convinced you to send a talk proposal, when better than *TODAY* to send it?
Yes I know the Call for Participation is open until the 24 of May, but by sending it today you make sure you don't forget sending it later and also [more important for me] you help those of us in the Program Committee not when the final date starts approaching and we don't have lots of talks yet because you all prefer sending talks on the very last minute.
So stop reading and send your talk today ;-)
This week in KDE: Looking towards Plasma 6.1
This week we put some of the final Plasma 6.0 bugs to rest, and continued working towards Plasma 6.1 with a variety of UI improvements. Nothing ground-breaking this week, just a slow grind of useful work towards a solid release!
UI ImprovementsKate now considers a file as recent when it’s saved or closed, not just when it’s opened. This means your recent files list will no longer omit files you kept open for a long time while working on them (Christoph Cullmann, Kate 24.05. Link)
The panel icons for Kickoff (Application Launcher) and Kicker (Application Menu) widgets are now capped in size so they can’t grow ridiculously huge on thicccc panel (Akseli Lahtinen and me: Nate Graham, Plasma 6.0.5. Link 1 and link 2)
System Settings no longer lets you choose GNOME’s Adwaita or High Contrast icon themes as your systemwide icon theme, because despite registering themselves as FreeDesktop-compatible icon themes, they are no longer actually designed to be used this way and will break everything from KDE if you try anyway (me: Nate Graham, Plasma 6.0.5. Link)
The screen that KWin considers active for the purpose of determining which screen to open new windows on is now determined by “last user interaction”, which includes things like mouse movement and keyboard focus. Hopefully this should better match people’s expectations (Xaver Hugl, Plasma 6.1. Link)
Made the wallpaper chooser views frameless, matching the current styling of most other settings pages in System Settings and Plasma (me: Nate Graham, Plasma 6.1. Link 1 and link 2):
Plasma’s notifications now use a more appropriate icon for canceling jobs, and also elide long title text in the middle rather than on the left (Ivan Tkachenko, Plasma 6.1. Link 1 and link 2):
Ok, so maybe “plasma-brows…gration-host” is not a work of towering genius. The fact that a long ugly technical name is shown there is another bug we’ll investigate.Refined the UI shown when changing global themes to make it clear what will happen and what’s potentially dangerous (me: Nate Graham, Plasma 6.1. Link 1 and link 2):
https://i.imgur.com/626VvQ2.mp4When you use the command-line powerprofilesctl tool to change power profiles, the new state is now reflected in the Power and Battery widget (Natalie Clarius, Plasma 6.1. Link)
Several Breeze icons (folder-encrypted, folder-decrypted, and folder-music) now have proper symbolic versions at their 16px and 22px sizes (me: Nate Graham, Frameworks 6.2. Link)
Bug FixesGwenview no longer fails to open large images; now its Qt 6 version can open the same size of image that the Qt 5 version could (Méven Car, Gwenview 24.05. Link)
On Wayland, KWin no longer crashes when it’s unable to open a socket to XWayland for some reason (Vlad Zahorodnii, Plasma 6.0.5. Link)
Fixed a case where Plasma could crash while modifying the set of favorite apps in Kickoff (Application Launcher), Kicker (Application Menu), or another launcher menu using the same backend infrastructure (Fushan Wen, Plasma 6.0.5. Link)
When using Qt 6.7, the System Tray popup is no longer sometimes inappropriately resized to a tiny nub, and also clicking a System Monitor widget showing GPU sensors no longer causes Plasma to freeze (Marco Martin, Plasma 6.0.5. Link 1 and link 2)
Fixed an extremely strange issue that could be triggered by opening any windows of IntelliJ IDE apps, and would cause other windows and Plasma panels to become transparent to clicks (Vyacheslav Mayorov, Plasma 6.0.5. Link)
When waking the system from sleep, quick-tiled windows no longer sometimes disappear, and vertically-maximized windows are no longer sometimes mis-positioned (Xaver Hugl, Plasma 6.0.5. Link 1 and link 2)
On X11, forcing tablet mode on when using a multi-screen setup with global scaling no longer causes one of the screens to scale everything incorrectly (Xaver Hugl, Plasma 6.0.5 Link)
Applied a workaround in KWin for an AMD GPU driver bug, which should reduce instances of random visual glitchiness (Xaver Hugl, Plasma 6.1. Link)
Fixed another case of Korners, this time for menus in QtWidgets-based apps (Ivan Tkachenko, Plasma 6.1. Link)
Resizing a window with a wallpaper chooser grid in it no longer sometimes causes the grid view’s header to disturbingly detach and appear in the middle of the view (me: Nate Graham, Plasma 6.1. Link)
More audio and video files now have appropriate icons, and when no suitable format-specific icon is found, the system will no longer fall back to an inappropriate symbolic speaker or filmstrip icon (Kai Uwe Broulik and me: Nate Graham, Frameworks 6.2. Link 1 and link 2)
Fixed a case in Kirigami where some UI elements would have incorrect colors when using mixed light/dark color schemes (Evgeniy Harchenko, Frameworks 6.2. Link)
After we fixed the “Pick your installation option popup” in the “Get new [thing]” windows, Qt 6.7 broke it again, so we fixed it again! This time moar betterer (Akseli Lahtinen and Ivan Tkachenko, Frameworks 6.3. Link)
Fixed an issue that caused apps with System Tray icons to inappropriately quit when deleting their tray icons (Tor Arne, Qt 6.7.2. Link)
Other bug information of note:
- 3 Very high priority Plasma bugs (same as last week). Current list of bugs
- 35 15-minute Plasma bugs (down from 39 last week). Current list of bugs
- 126 KDE bugs of all kinds fixed over the last week Full list of bugs
Implemented a bunch of security hardening for our crash reporting system based on feedback from SUSE’s security team (Harald Sitter, Plasma 6.0.5. Link)
Automation & SystematizationAdded multiple autotests to ensure that mounting different types of mountable filesystems works as intended (Stefan Brüns, Frameworks 6.2. Link)
Added an autotest to make sure that Plasma-themes UI elements that should have the same height—such as text fields and buttons—still do even if the Plasma style is changed (Fushan Wen, Plasma 6.1. Link)
…And Everything ElseThis blog only covers the tip of the iceberg! If you’re hungry for more, check out https://planet.kde.org, where you can find more news from other KDE contributors.
How You Can HelpThe KDE organization has become important in the world, and your time and labor have helped to bring it there! But as we grow, it’s going to be equally important that this stream of labor be made sustainable, which primarily means paying for it. Right now the vast majority of KDE runs on labor not paid for by KDE e.V. (the nonprofit foundation behind KDE, of which I am a board member), and that’s a problem. We’ve taken steps to change this with paid technical contractors—but those steps are small due to growing but still limited financial resources. If you’d like to help change that, consider donating today!
Otherwise, visit https://community.kde.org/Get_Involved to discover other ways to be part of a project that really matters. Each contributor makes a huge difference in KDE; you are not a number or a cog in a machine! You don’t have to already be a programmer, either. I wasn’t when I got started. Try it, you’ll like it! We don’t bite!
Trey Hunner: Installing a custom Python build with pyenv
I am so excited about the new Python REPL that will likely land in Python 3.13. I’ve been following this CPython pull request since I heard Pablo and Łukasz announce their work on the new Python REPL in episode 1 of their new core.py podcast.
Github notifications? 🤔That pull request was quiet for many months, but in the last couple weeks, I started seeing email notifications in my inbox about it. I’ve never fancied myself a competent C developer and I try to steer clear from understanding TTY magic, so I have no idea what most of the commits do. But seeing activity on this pull request rejuvenated my excitement about this upcoming feature!
I also remember reading that the Python 3.13 feature freeze is coming up soon, so I’ve been silently cheering for that PR to make the cut before the deadline.
In the last few days, I decided that I should try committing to use this new REPL locally as my default Python environment. When I type python on my machine, I want to live in this new shiny REPL. I figure this will make it easier to spot bugs that might not have been noticed yet… though honestly it’ll mostly just allow me to try out this fancy new REPL first-hand.
Installing a custom CPython build in pyenvI use pyenv to manage the many Python versions I have installed on my machine. I wondered whether it was possible to install a custom build of CPython with pyenv.
Instead of going to the pyenv documentation to figure out an answer, I argued with an AI until it gave me a working answer. I tried a few AI systems at first, but Claude seemed to give me the most promising-looking answer so it was the one I argued with for 5-10 minutes until I got a working solution.
First, I created this ~/.pyenv/plugins/python-build/share/python-build/3.13.0-pyrepl file:
1 2 3 prefer_openssl11 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "pyrepl" "https://github.com/pablogsal/cpython/archive/pyrepl.tar.gz" standard verify_py39 ensurepipThen I ran this command, which took a couple minutes:
1 $ pyenv install 3.13.0-pyreplAfter that, pyenv versions showed a new 3.13.0-pyrepl version:
1 2 3 4 5 6 7 8 $ pyenv versions system * 3.8.18 (set by /home/trey/.pyenv/version) * 3.9.18 (set by /home/trey/.pyenv/version) * 3.10.13 (set by /home/trey/.pyenv/version) * 3.11.6 (set by /home/trey/.pyenv/version) * 3.12.0 (set by /home/trey/.pyenv/version) 3.13.0-pyreplI then added 3.13.0-pyrepl to the top of my ~/.pyenv/version file to make this my default Python:
1 2 3 4 5 6 3.13.0-pyrepl 3.12.0 3.11.6 3.10.13 3.9.18 3.8.18And it worked! Tying python showed the new colorful prompt.
Is is a bad idea to make this not-even-beta version of CPython the default Python on my machine? I have no idea. Everything’s been fine for the last 10 hours at least… 🤷
If you ever need to try installing a custom CPython build with pyenv, maybe the above instructions will work. They’re mostly generated by a large language model that didn’t give me a working answer until the third response… so feel free to let me know if it’s all wrong (or all right?).
After this adventure, I checked my podcast feed this evening only to realize that there’s a new core.py episode all about exactly this feature! If you’d like to hear some core developers nerd out about CPython development, give core.py a listen. You don’t need to understand how CPython development works to enjoy their enthusiasm. 💖
Interview on Tech Over Tea about KDE’s position in the world
I recently went on Brodie Robertson’s Tech Over Tea channel for a second time. I guess I didn’t succeed at pissing him off enough on the first go-around, because he invited me back! Let’s see if I did a better job of it this time by telling him he was using Arch wrong.
Anyway, Brodie was a fantastic host, and we talked about a number of topics such as KDE’s position in the world, institutional continuity, fundraising and financial stability, the difficulty of reporting and triaging bug, the challenges of packaging software, and windows that block WiFi signals.
I hope you enjoy it!
And here’s the link I mention at the end: https://kde.org/community/donations
scikit-learn: Note on Inline Authorship Information in scikit-learn
Historically, scikit-learn’s files have included authorship information similar to the following format:
# Authors: Author1, Author2, ... # License: BSD 3 clauseHowever, after a series of discussions which you can see in detail in this issue, we could list the following caveats to the status quo:
- Authorship information was not up-to-date and in most cases, but not always, reflect the original authors of the file;
- It was unfair to all other contributors who have been contributing to the code-base;
- One can check the real authors and the history of the authors of any part of the code-base using git blame and other git tools.
Therefore we came to the conclusion to standardize all authorship information to mention “The scikit-learn developers”, and have the license notice as:
# Authors: The scikit-learn developers # License: BSD-3-ClauseThe change is to happen gradually in the coming months after April 2024.
Joachim's blog: Refactoring with Rector
Rector is a tool for making changes to PHP code, which powers tools that assist with upgrading deprecated code in Drupal. When I recently made some refactoring changes in Drupal Code Builder, which were too complex to do with search and replace regexes, it seemed like a good opportunity to experiment with Rector, and learn a bit more about it.
Besides, I'm an inveterate condiment-passer: I tend to prefer spending longer on a generalisation of a problem than on the problem itself, and the more dull the problem and the more interesting the generalisation, the more the probability increases.
So faced with a refactoring from this return from the getFileInfo() method:
return [ 'path' => '', 'filename' => $this->component_data['filename'], 'body' => [], 'merged' =>$merged, ];to this:
return new CodeFile( body_pieces: $this->component_data['filename'], merged: $merged, );which was going to be tedious as hell to do in a ton of files, obviously, I elected to spend time fiddling with Rector.
The first thing I'll say is that the same sort of approach as I use with migrations works well: work with a small indicative sample, and iterate small changes. With a migration, I will find a small number of source rows which represent different variations (or if there is too much variation, I'll iterate the iteration multiple times). I'll run the migration with just those sources, examine the result, make refinements to the migration, then roll back and repeat.
With Rector, you can specify just a single class in the code that registers the rule to RectorConfig in the rector.php file, so I picked a class which had very little code, as the dump() output of an entire PHP file's PhpParser analysis is enormous.
You then use the rule class's getNodeTypes() method to declare which node types you are interested in. Here, I made a mis-step at first. I wanted to replace Array_ nodes, but only in the getFileInfo() method. So in my first attempt, I specified ClassMethod nodes, and then in refactor() I wrote code to drill down into them to get the array Array_ nodes. This went well until I tried returning a new replacement node, and then Rector complained, and I realised the obvious thing I'd skipped over: the refactor() method expects you to return a node to replace the found node. So my approach was completely wrong.
I rewrote getNodeTypes() to search for Array_ nodes: those represent the creation of an array value. This felt more dangerous: arrays are defined in lots of places in my code! And I haven't been able to see a way to determine the parentage of a node: there do not appear to be pointers that go back up the PhpParser syntax tree (it would be handy, but would make the dump() output even worse to read!). Fortunately, the combination of array keys was unique in DrupalCodeBuilder, or at least I hoped it was fairly unique. So I wrote code to get a list of the array's keys, and then compare it to what was expected:
foreach ($node->items as $item) { $seen_array_keys[] = $item->key->value; } if (array_intersect(static::EXPECTED_MINIMUM_ARRAY_KEYS, $seen_array_keys) != static::EXPECTED_MINIMUM_ARRAY_KEYS) { return NULL; }Returning NULL from refactor() means we aren't interested in this node and don't want to change it.
With the arrays that made it through the filter, I needed to make a new node that's a class instantiation, to replace the array, passing the same values to the new statement as the array keys (mostly).
Rector's list of commonly used PhpParser nodes was really useful here.
A new statement node is made thus:
use PhpParser\Node\Name; use PhpParser\Node\Expr\New_; $class = new Name('\DrupalCodeBuilder\File\CodeFile'); return new New_($class);This doesn't have any parameters yet, but running Rector on this with my sample set showed me it was working properly. Rector has a dry run option for development, which shows you what would change but doesn't write anything to files, so you can run it over and over again. What's confusing is that it also has a cache; until I worked this out I was repeatedly confused by some runs having no effect and no output. I have honestly no idea what the point is of caching something that's designed to make changes, but there is an option to disable it. So the command to run is: $ vendor/bin/rector --dry-run --clear-cache. Over and over again.
Once that worked, I needed to convert array items to constructor parameters. Fortunately, the value from the array items work for parameters too:
use PhpParser\Node\Arg; foreach ($node->items as $array_item) { $construct_argument = new Arg( $array_item->value, );That gave me the values. But I wanted named parameters for my constructor, partly because they're cool and mostly because the CodeFile class's __construct() has optional parameters, and using names makes that simpler.
Inspecting the Arg class's own constructor showed how to do this:
use PhpParser\Node\Arg; use PhpParser\Node\Identifier; $construct_argument = new Arg( value: $array_item->value, name: new Identifier($key), );Using named parameters here too to make the code clearer to read!
It's also possible to copy over any inline comments that are above one node to a new node:
// Preserve comments. $construct_argument->setAttribute('comments', $array_item->getComments());The constructor parameters are passed as a parameter to the New_ class:
return new New_($class, $new_call_args);Once this was all working, I decided to do some more refactoring in the CodeFile class in DrupalCodeBuilder. The changes I was making with Rector made it more apparent that in a lot of cases, I was passing empty values. Also, the $body parameter wasn't well-named, as it's an array of pieces, so could do with a more descriptive name such as $body_pieces.
Changes like this are really easy to do (though by this point, I had made a git repository for my Rector rule, so I could make further enhancements without breaking what I'd got working already).
foreach ($node->items as $array_item) { $key = $array_item->key->value; // Rename the 'body' key. if ($key == 'body') { $key = 'body_pieces'; }And that's my Rector rule done.
Although it's taken me far more time than changing each file by hand, it's been far more interesting, and I've learned a lot about how Rector works, which will be useful to me in the future. I can definitely see how it's a very useful tool even for refactoring a small codebase such as DrupalCodeBuilder, where a rule is only going to be used once. It might even prompt me to undertake some minor refactoring tasks I've been putting off because of how tedious they'll be.
What I've not figured out is how to extract namespaces from full class names to an import statement, or how to put line breaks in the new statement. I'm hoping that a pass through with PHP_CodeSniffer and Drupal Coder's rules will fix those. If not, there's always good old regexes!
Tags: refactoringRectorPhpParserdrupal code builderThinkDrop Consulting: Introducing Operations Site Runner: a self-hosted CI/CD platform using GitHub Actions and DDEV.
I've been building and designing automation systems for almost 20 years. I built DevShop on top of Aegir to implement continuous integration and quality control over 10 years ago.
Running CI systems is hard. Really hard. There needs to be an active task runner. A dashboard. API integrations. Tooling. Network Access. It can be incredibly complicated. In the Enterprise? Forget it.
I've been imagining a new system for many years, and here it is.
Drupal Association blog: 5 Unmissable Attractions to Explore Around DrupalCon Portland 2024
Portland, Oregon – the Rose City, home to an array of charming experiences that extend beyond the walls of this year's much-anticipated DrupalCon. While knowledge sharing and the industry buzz at the Oregon Convention Center will undoubtedly be the main draw, the locale offers a diversity of attractions, from serene parks to bustling markets. For those fortunate enough to attend DrupalCon, it would be a miss not to maximize your time and immerse yourself in the unique culture Portland has to offer. Here are five more local attractions, in addition to our previous recommendations, that promise to enrich your DrupalCon experience and provide unforgettable memories.
1. Cruise the City on E-Scooters around Peace Memorial ParkSW corner of NE Oregon St and, NE Lloyd Blvd, Portland, OR 97232
Arriving in Portland, the first thing visitors often notice is the city's commitment to sustainability and the vibrant outdoor lifestyle. What better way to experience this than by gliding through the renowned bike paths and urban green gardens on an E-Scooter? A stone's throw away from the Oregon Convention Center, Peace Memorial Park provides a picturesque setting that is perfect for a leisurely ride. With the Willamette River flowing alongside and the skyscrapers beyond the riverbank, this sanctuary of serenity is a stark contrast to the bustling city center.
2. Discover the charm of Portland’s most historic rose garden400 SW Kingston Ave, Portland, OR 97205, United States
Known as the City of Roses, Portland proudly hosts the International Rose Test Garden, the oldest of its kind in the United States that has been in continuous operation. With the arrival of spring, there's no better moment to witness the garden's vibrant first blooms. Showcasing over 10,000 roses across 610 varieties, the garden not only offers a breathtaking display but also serves a crucial role in the cultivation and testing of new rose species. As a sanctuary for hybrid roses from across the globe, the garden continues its legacy of innovation and preservation in the heart of Portland.
3. Savor Artisanal Coffee at Roseline Coffee Cafe & Roastery321 NE Davis St, Portland, OR 97232
Portland is known for its craft coffee culture, and Roseline Coffee Cafe & Roastery stands as a testament to this. Just moments from the convention center, this local favorite offers a welcoming reprieve from the conference crowds. Here, you can try blends and single-origin roasts that represent the pinnacle of Portland's coffee craft. Whether you’re an espresso aficionado or simply in need of a caffeine hit, the experience at Roseline will elevate your DrupalCon visit.
4. Explore Exhibitions At The Portland Art Museum1219 SW Park Ave, Portland, OR 97205
Just a brief drive from the Oregon Convention Center, the Portland Art Museum stands as Oregon's largest and one of the nation's oldest art institutions. Nestled within two historic buildings in Portland’s South Park Blocks, a key part of the city's cultural district, the museum boasts an extensive and diverse art collection. Visitors can purchase Portland Art Museum tickets online or at the museum, with adult admission priced at $25. The Museum offers a wide array of exhibitions, from in-depth retrospectives of individual artists to comprehensive historical surveys and significant traveling exhibitions from across the globe. These exhibitions showcase pieces from the museum's own collection alongside masterpieces loaned from other museums and private collections worldwide.
5. Immerse Yourself in the Quirkiness of the Portland Saturday Market2 SW Naito Pkwy, Portland, OR 97204
If your stay in Portland includes the weekend, the Portland Saturday Market offers a vibrant immersion into the local eccentricity and artisanal zeal that define the City of Roses.
A visit to this lively gathering can be enriching and is just a short drive away from the Oregon Convention Center. Wandering through the maze of stalls, you’ll find an array of handcrafted delights – from jewelry to leather goods, pottery to fine art – all lovingly crafted by the city’s talented makers. The sounds of live music and the aroma of delectable local cuisine will captivate your senses, while the palpable sense of community will remind you of the inclusive spirit that saturates Portland's identity. Whether you're making a purchase or simply taking in the scene, the Saturday Market encapsulates the heart and soul of the city, making it a must-visit destination.
---
With these five enriching experiences, your DrupalCon excursion will extend far beyond the convention doors. You'll build lasting connections with both the Drupal community and the diverse tapestry of Portland. Whether you're charting a solo adventure or teaming up with fellow tech enthusiasts, these local highlights are poised to enhance your trip with a delightful blend of tranquility, creativity, and community.
Colin Watson: Playing with rich
One of the things I do as a side project for Freexian is to work on various bits of business automation: accounting tools, programs to help contributors report their hours, invoicing, that kind of thing. While it’s not quite my usual beat, this makes quite a good side project as the tools involved are mostly rather sensible and easy to deal with (Python, git, ledger, that sort of thing) and it’s the kind of thing where I can dip into it for a day or so a week and feel like I’m making useful contributions. The logic can be quite complex, but there’s very little friction in the tools themselves.
A recent case where I did run into some friction in the tools was with some commands that need to present small amounts of tabular data on the terminal, using OSC 8 hyperlinks if the terminal supports them: think customer-related information with some links to issues. One of my colleagues had previously done this using a hack on top of texttable, which was perfectly fine as far as it went. However, now I wanted to be able to add multiple links in a single table cell in some cases, and that was really going to stretch the limits of that approach: working out the width of the displayed text in the cell was going to take an annoying amount of bookkeeping.
I started looking around to see whether any other approaches might be easier, without too much effort (remember that “a day or so a week” bit above). ansiwrap looked somewhat promising, but it isn’t currently packaged in Debian, and it would have still left me with the problem of figuring out how to integrate it into texttable, which looked like it would be quite complicated. Then I remembered that I’d heard good things about rich, and thought I’d take a look.
rich turned out to be exactly what I wanted. Instead of something like this based on the texttable hack above:
import shutil from pyxian.texttable import UrlTable termsize = shutil.get_terminal_size((80, 25)) table = UrlTable(max_width=termsize.columns) table.set_deco(UrlTable.HEADER) table.set_cols_align(["l"]) table.set_cols_dtype(["u"]) table.add_row(["Issue"]) table.add_row([(issue_url, f"#{issue_id}")] print(table.draw())… now I can do this instead:
import rich from rich import box from rich.table import Table table = Table(box=box.SIMPLE) table.add_column("Issue") table.add_row(f"[link={issue_url}]#{issue_id}[/link]") rich.print(table)While this is a little shorter, the real bonus is that I can now just put multiple [link] tags in a single string, and it all just works. No ceremony. In fact, once the relevant bits of code passed type-checking (since the real code is a bit more complex than the samples above), it worked first time. It’s a pleasure to work with a library like that.
It looks like I’ve only barely scratched the surface of rich, but I expect I’ll reach for it more often now.
Python Engineering at Microsoft: Python in Visual Studio Code – May 2024 Release
We’re excited to announce the May 2024 release of the Python and Jupyter extensions for Visual Studio Code!
This release includes the following announcements:
- “Implement all inherited abstract classes” code action
- New auto indentation setting
- Debugpy removed from the Python extension in favor of the Python Debugger extension
- Socket disablement now possible during testing
- Pylance performance updates
If you’re interested, you can check the full list of improvements in our changelogs for the Python, Jupyter and Pylance extensions.
“Implement all inherited abstract classes” Code ActionAbstract classes serve as “blueprints” for other classes and help build modular, reusable code by promoting clear structure and requirements for subclasses to adhere to. To define an abstract class in Python, you can create a class that inherits from the ABC class in the abc module, and annotate its methods with the @abstractmethod decorator. Then, you can create new classes that inherit from this abstract class, and define an implementation for the base methods. Implementing these classes is easier with the latest Pylance pre-release! When defining a new class that inherits from an abstract one, you can now use the “Implement all inherited abstract classes” Code Action to automatically implement all abstract methods and properties from the parent class:
New auto indentation settingPreviously, Pylance’s auto indentation behavior was controlled through the editor.formatOnType setting, which used to be problematic if one would want to disable auto indentation, but enable format on type through other supported tools. To solve this problem, Pylance’s latest pre-release now has its own setting to control auto indentation behavior, python.analysis.autoIndent, which is enabled by default.
Debugpy removed from the Python extension in favor of the Python Debugger extensionIn our February 2024 release blog, we announced moving all debugging functionality to the Python Debugger extension, which is installed by default alongside the Python extension. In this release, we have removed duplicate debugging code from the Python extension, which helps to decrease the extension download size. As part of this change, "type": "python" and "type": "debugpy" specified in your launch.json configuration file are both interpreted as references to the Python Debugger extension path. This ensures a seamless transition without requiring any modifications to existing configuration files to run and debug effectively. Moving forward, we recommend using "type": "debugpy" as this directly corresponds to the Python Debugger extension which provides support for both legacy and modern Python versions.
Socket disablement now possible during testingYou can now run tests with socket disablement from the testing UI. This is made possible by a switch in the communication between the Python extension and the test run subprocess to now use named-pipes as opposed to numbered ports. This feature is available on the Python Testing Rewrite, which is rolled out to all users by default and will soon be fully adopted in the Python extension.
Pylance PerformanceThe Pylance team has been receiving feedback that Pylance’s performance has degraded over the past few releases. As a result, we have made several smaller improvements to memory consumption and indexing including:
- Improved performance for third-party packages indexing
- Skipped Python files from workspace .conda environments from being scanned (@pylance-release#5191)
- Skipped index on unnecessary py.typed file checks (@pyright#7652)
- Reduced memory consumption by refactoring tokenizer and parser output (@pyright#7602)
- Improved memory consumption for token creation (@pyright#7434)
For those who may still be experiencing performance issues with Pylance, we are kindly requesting for issues to be filed through the Pylance: Report Issue command from the Command Palette, ideally with logs, code samples and/or the packages that are installed in the working environment.
Additionally, we have added a couple of features in the latest Pylance pre-release version to help identify potential performance issues and gather additional information about issues you are facing. There is a new notification that prompts you to file an issue in the Pylance repo when the extension detects there may be a performance issue. Moreover, Pylance now provides a profiling command Pylance: Start Profiling that generates cpuprofile for all worker threads. This file is generated after starting and stopping profiling by triggering the Pylance: Start Profiling and Pylance: Stop Profiling commands and can be provided as additional data in an issue.
With these smaller improvements and additional ways to report performance issues, we hope to continue to make improvements to performance. We greatly appreciate the feedback and collaboration as we work to address issues!
Other Changes and EnhancementsWe have also added small enhancements and fixed issues requested by users that should improve your experience working with Python and Jupyter Notebooks in Visual Studio Code. Some notable changes include:
- Test Explorer displays projects using testscenarios with unittest and parameterized tests inside nested classes correctly (@vscode-python#22870).
- Test Explorer now handles tests in workspaces with symlinks, specifically workspace roots which are children of symlink-ed paths, which is particularly helpful in WSL scenarios (@vscode-python#22658).
We would also like to extend special thanks to this month’s contributors:
- @DetachHead Support experiment configuration in workspace settings in @vscode-python#23267
- @DavidArchibald Fix debugger attach to process when running on WSL in @vscode-python-debugger#267
As we are planning and prioritizing future work, we value your feedback! Below are a few issues we would love feedback on:
- Design proposal for test coverage in (@vscode-python#22827)
Try out these new improvements by downloading the Python extension and the Jupyter extension from the Marketplace, or install them directly from the extensions view in Visual Studio Code (Ctrl + Shift + X or ⌘ + ⇧ + X). You can learn more about Python support in Visual Studio Code in the documentation. If you run into any problems or have suggestions, please file an issue on the Python VS Code GitHub page.
The post Python in Visual Studio Code – May 2024 Release appeared first on Python.
Real Python: The Real Python Podcast – Episode #203: Embarking on a Relaxed and Friendly Python Coding Journey
Do you get stressed while trying to learn Python? Do you prefer to build small programs or projects as you continue your coding journey? This week on the show, Real Python author Stephen Gruppetta is here to talk about his new book, "The Python Coding Book."
[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]
Web Review, Week 2024-18
Let’s go for my web review for the week 2024-18.
Radio Free Fedi - Sounds from the Fediverse to the UniverseTags: tech, fediverse, streaming, culture
I’ve been listening to these radio channels the past few weeks. It’s quirky, it’s weird, it’s wild. I definitely recommend them to get out of your usual music bubble.
Tags: tech, internet, web, culture, history
Very nice account of how the Internet is nowadays and how it got there. I like the gardening metaphor which works nicely here. And yes, we can go back to a better Web again. It’s a collective decision though, that’s what makes it hard.
https://www.citationneeded.news/we-can-have-a-different-web/
Tags: tech, blog, web, social-media
Definitely this. Get the content you like known, send appreciation messages to the authors. This should keep the moribund web alive.
https://sheep.horse/2024/4/save_the_web_by_being_nice.html
Tags: tech, web, advertisement, google, criticism
Ever wondered why the quality of websites seems to go down? Well, here is a case study of what you end up needing to do if you try to fund a website through ads (like most websites).
https://theluddite.org/#!post/google-ads
Tags: tech, google, flutter
Looks like Flutter’s days are counted. It seems it has peeked and announcements like this are likely to move people away from it. Time will tell of course.
https://arstechnica.com/gadgets/2024/04/latest-google-layoffs-hit-the-flutter-and-python-groups/
Tags: tech, apple, vendor-lockin
Indeed there are more and more signs of the Apple vendor lock-in to be in trouble. And that’s a good thing.
https://www.theverge.com/24141929/apple-iphone-imessage-antitrust-dma-lock-in
Tags: tech, hardware, funny
Sure you can expect mice, but raccoons? This is a funny finding… well scary if you’re responsible of this machine room.
https://utcc.utoronto.ca/~cks/space/blog/sysadmin/MachineRoomRaccoon
Tags: tech, tools, infrastructure, deployment, python
Looks like an interesting tool for infrastructure automation. It’s all Python based which is an interesting departure from yaml files in that space. Could be a nice alternative to Ansible. I might take it out for a spin.
Tags: tech, security, tools, command-line, systemd
An alternative to the venerable sudo coming with systemd. Looks like it has interesting properties.
https://www.freedesktop.org/software/systemd/man/devel/run0.html
Tags: tech, parsing, c++
Time to leave Lex and Yacc behind? This is definitely a nice approach to make parsers nowadays.
https://berthub.eu/articles/posts/practical-peg-parsing/
Tags: tech, bytecode
Bytecodes everywhere! Really it’s a very widespread trick, I didn’t expect some of those.
https://dubroy.com/blog/bytecode-vms-in-surprising-places/
Tags: tech, java
Probably shouldn’t do this in most case… but if it’s really needed and you can bare the pain, Java has solutions for you. This is an interesting dive in lower parts of the APIs.
https://highlysuspect.agency/posts/enum_reflection/
Tags: tech, programming, rust, funny
Funny read, it has lots of good advice for starting up with Rust.
https://www.hezmatt.org/~mpalmer/blog/2024/05/01/the-mediocre-programmers-guide-to-rust.html
Tags: tech, 3d, physics, mathematics
Very cool BSDF. Should lead to better diffraction rendering in real-time 3D.
https://ssteinberg.xyz/2024/04/05/free_space_diffractions_bsdf/
Tags: tech, web, 3d
Good demonstration of what you can do with WebGL nowadays.
https://www.littleworkshop.fr/projects/keepout/
Tags: tech, 3d, foss
Another great resource for nice models and textures for your 3D needs.
https://www.sharetextures.com/
Tags: tech, shader, graphics
A nice list of little tricks to improve the image quality of your renders.
https://30fps.net/pages/post-processing/
Tags: tech, project-management
Interesting musing about the concept of friction in strategy. There are indeed a few lessons to learn from it in the context of software projects.
https://www.hillelwayne.com/post/software-friction/
Bye for now!
Python Software Foundation: The PSF's 2023 Annual Impact Report is here!
2023 was an exciting year of growth for the Python Software Foundation! We’ve captured some of the key numbers, details, and information in our latest Annual Impact Report. Some highlights of what you’ll find in the report include:
- A letter from our Executive Director, Deb Nicholson
- Notes from Our PyCon US Chair, Marietta Wijaya, and PSF Board of Director Chair, Dawn Wages
- Updates on the achievements and activities of a couple of our Developers-in-Residence, Łukasz Langa and Seth Larson—and announcing more members of the DiR team!
- An overview of what our PyPI Safety & Security Engineer, Mike Fiedler, has accomplished- as well as some eye-watering PyPI stats!
- A celebration and summary of PyCon US 2023, the event’s 20th anniversary, and the theme for 2023’s report cover
- A highlight of our Fiscal Sponsorees (we brought on 7 new organizations this year!)
- Sponsors who generously supported our work and the Python ecosystem
- An overview of PSF Financials, including a consolidated financial statement and grants data
We hope you check out the report, share it with your Python friends, and let us know what you think! You can comment here, find us on social media (Mastodon, X, LinkedIn), or share your thoughts on our forum.
The Drop Times: Exclusive Insights from Keynote Speakers of DrupalCon Portland 2024
Drupal Core News: Announcing the inaugural Project Update Working Group members
Congratulations to the inaugural members of the new Project Update Working Group.
This is a new working group tasked with helping maintainers prepare contributed projects for the next major release of Drupal core.
The inaugural members are as follows:
-
Norah Medlin (tekNorah) (provisional)
-
Vladimir Roudakov (vladimiraus)
-
Sven Decabooter (svendecabooter)
-
Naveen Valecha (naveenvalecha)
-
Kristen Pol (Kristen Pol)
-
Matt Glaman (mglaman)
-
Darren Oh (Darren Oh)
-
Mark Casias (markie)
-
Kim Pepper (kim.pepper)
-
Björn Brala (bbrala)
-
Lucas Hedding (heddn)
-
Pedro Cambra (pcambra)
-
Allan Chappell (generalredneck)
-
Jakob Perry (japerry)
-
Timo Huisman (Timo Huisman) (provisional)
The group will work in the coming weeks to establish processes and changes required to Drupal.org to facilitate the role.
If you wish to get in touch and say congratulations, you can find them in the #project-update-working-group channel on slack.
Four Kitchens: Aligning diverging websites with an upstream platform through Drupal
Senior Drupal Engineer
Mike has been part of the Four Kitchens crew since 2018, where he works as a senior engineer and tech lead for a variety of Drupal and WordPress projects.
January 1, 1970
The Columbia SPS homepageFor higher ed institutions, the need to manage updates for multiple websites is an ongoing struggle. Each site should reflect the distinct identity of a given school or department. But as each website’s CMS, frontend design, and backend architecture diverge, any organization will need to grapple with the necessary upkeep.
Columbia School of Professional Studies (SPS) faced this situation with three separate websites. One site presents summer courses, another targets high school students with pre-college offerings, and the third is the traditional SPS website. Each domain serves a different audience and is managed by a small team.
As each website continued to diverge, users found it difficult to recognize them as part of the same school. Worse yet, the three websites were on two different versions of Drupal and had grown difficult to maintain, as one platform was reaching its end of life.
SPS came to Four Kitchens seeking an upstream solution to provide relief. In this preview of an upcoming presentation at DrupalCon Portland 2024’s Higher Education Summit, the Config Split module has a newer feature that cleared the way for an efficient resolution.
How an upstream platform streamlines diverging websitesColumbia SPS needed a solution that would resolve multiple nagging issues. In much the same way that a design system streamlines operations by creating a centralized content resource, an upstream platform enables multiple websites to share a single codebase.
Along with bringing the organization’s Drupal instances into alignment and reducing technical debt, the approach offered three core advantages:
- Increased efficiency: Enable the university to maintain multiple websites with less effort. When you update code in one place, it impacts every site in the organization.
- Greater consistency: Align user experience and simplify internal planning for site updates.
- Streamlined development: Shared code, security updates, and component access. No matter what site Columbia’s team works on, they know what processes to expect.
To make sure each site could still offer a distinct experience, Columbia didn’t want to share content or merge each website into one. They primarily wanted to make each easier to manage for their team.
Offer shared (but distinct) experiences through Config SplitCreating an upstream platform for Columbia SPS hinged on the Configuration Split Drupal module. Put simply, this module allows you to apply a different configuration to a website to suit specific scenarios. You can use Config Split to make sure you only see error logs on your test environment (not your live site).
The Columbia SPS Summer Session websiteHowever, Columbia SPS still wanted its three websites to offer distinct features. To enable this flexibility, we used a newer feature in the 2.x versions of the module called Config Patch. This feature allows Columbia SPS to apply part of a website configuration to each website.
For example, each university website may share the same article structure. But one website can support a distinctive CTA component at the bottom. Columbia SPS now has that flexibility — and it doesn’t cause chaos from a website maintenance standpoint.
With Config Patch, Columbia can use a single code repository to maintain three sites that have their own distinct details within the same baseline features. We also provided SPS with a base demo site that keeps Config Split from allowing too much flexibility. Adding rules to settings.php provides a home for the logic for each site to make sure they follow the proper configuration.
Plus, the demo site functions as a mold if the organization needs to add a new website. Along with providing support for the organization’s current needs, the upstream platform provides support for the future.
Avoiding pitfalls of upstream platforms in higher edImplementing an upstream solution for Columbia SPS enabled the university to run its separate sites more efficiently and provide a more consistent experience. Just as importantly, the institution escaped the shadow of a Drupal 7 migration, which stands as a major benefit for the organization.
However, adopting an upstream platform carries its own complications. For all the advantages Columbia SPS gained, the organization also needs to be mindful of a few potential pitfalls of an upstream platform:
- Bringing distinct site features back into alignment is difficult: If Columbia SPS wanted to roll back a configuration that was previously split, the sites can be difficult to manage locally.
- Shifting priorities for Drupal updates: Platform updates must be made against the demo site first to maintain alignment between each web property.
- Increased work for developing multiple features: An upstream platform reduces complexity, but working in a single repository presents its own challenges. Creating distinct features for individual websites requires a little more work on the part of your development team.
Navigating the specific needs for multiple websites is a persistent challenge for higher ed institutions. On the one hand, delivering a consistent experience drawn from a single codebase is easier to manage, especially for a small, centralized IT team. On the other hand, individual departments and schools have specific design and functionality needs. They should be able to offer website experiences distinct from the look and feel of your core website.
With an upstream platform, you gain the functionality to serve both needs. The solution introduces new complexity, but with an experienced development partner, a multisite platform allows your team to work more efficiently. Better still, if your organization needs to maintain multiple platforms as your websites have diverged, you gain key benefits from addressing needed upgrades.
Would this kind of solution help your organization? Let us know how we can help.
DetailsIf you’re going to DrupalCon Portland 2024, please make sure to attend the Higher Education Summit to hear directly from Mike and the team at Columbia SPS.
Where: Oregon Convention Center (777 NE Martin Luther King Jr. Blvd, Portland, OR 97232), Room C123-124
When: Thursday, May 9, 2024, 9:00am – 4:00pm
For tickets and session details, click here.
The post Aligning diverging websites with an upstream platform through Drupal appeared first on Four Kitchens.
TestDriven.io: Building Reusable Components in Django
Gary Benson: git submodule forgetting
Did you forget the -r when cloning a git repo with submodules? The command you’re looking for is git submodule update --init
Django Weblog: June 2024 marks 10 incredible years of Django Girls magic! 🥳✨
June 2024 marks 10 incredible years of Django Girls magic! 🥳✨
We couldn't have reached this milestone without YOU! Whether you attended a workshop, volunteered, financially supported us, or cheered us on, you've been vital. From the bottom of our hearts, thank you for being part of the Django Girls community. 💕
To celebrate, we're reflecting on our impact and want to hear from YOU! Share your stories in a short survey courtesy of JetBrains and PyCharm. Your feedback will help us improve and reach more people.
The Theme for our 10th anniversary is “The Django Girls Glow Up!” ✨💃
We want to celebrate your positive transformations over the years!
In the survey, please share a photo 📸 or video and tell us how Django Girls has impacted your life. As a thank you, you could win a $100 Amazon gift card or a 1-year JetBrains All Products Pack subscription. Plus, everyone gets a three-month PyCharm Professional trial!
Ready to join the celebration? Click the link to complete the survey and let your Django Girl glow shine! ✨
Take the Survey Now: https://surveys.jetbrains.com/s3/dn-django-girls-survey-2024
When you’ve finished the survey, head over to our socials, and let’s continue celebrating there. Use the #DjangoGirlsGlowUp hashtag to share your photos and stories, and let's spread the love! 🚀💖
Find us on our socials:
- https://twitter.com/djangogirls
- https://fosstodon.org/@djangogirls
- https://www.linkedin.com/company/django-girls
Thank you for being part of our journey. Here's to another 10 years of glowing up together! 🌟💫
Python Morsels: Variables are pointers in Python
Python's variables are not buckets that contain objects; they're pointers. Assignment statements don't copy: they point a variable to a value (and multiple variables can "point" to the same value).
Table of contents
- Changing two lists at once...?
- Variables are separate from objects
- Assignment statements don't copy
- Explicitly copying a list
- Variables are like pointers, not buckets
Here we have a variable a that points to a list:
>>> a = [2, 1, 3, 4]Let's make a new variable b and assign it to a:
>>> a = [2, 1, 3, 4] >>> b = aIf we append a new item to b, what will its length be?
>>> b.append(7) >>> len(b)Initially, the b list had four items, so now it should have five items. And it does:
>>> len(b) 5How many items do you think a has? What's your guess?
>>> len(a)Is it five, the same as b? Or is it still four, as it was before?
The a list also has five items:
>>> len(a) 5What's going on here?
Well, the variables a and b, both point to the same list.
If we look up the unique ID for the object that each of these variables points to, we'll see that they both point to the same object:
>>> id(a) 140534104117312 >>> id(b) 140534104117312This is possible because variables in Python are not buckets, but pointers.
Variables are separate from objectsLet's say we've made three …
Read the full article: https://www.pythonmorsels.com/variables-are-pointers/