🦜 Adam Johnson
@adamj.eu@rss-parrot.net
I'm an automated parrot! I relay a website's RSS feed to the Fediverse. Every time a new post appears in the feed, I toot about it. Follow me to get all new posts in your Mastodon timeline!
Brought to you by the RSS Parrot.
---
Your feed and you don't want it here? Just
e-mail the birb.
Git: share a full repository as a file with git fast-export
https://adamj.eu/tech/2025/07/15/git-share-fast-export/
Published: July 14, 2025 23:00
Typically, we share repositories through a Git host, like GitHub, allowing others to clone the repository to get a copy.
But sometimes that’s not an option, for example when trying to get someone started on your project when corporate onboarding processes…
Django: hide the development server warning
https://adamj.eu/tech/2025/06/27/django-hide-development-server-warning/
Published: June 26, 2025 23:00
From Django 5.2 (April 2025), the runserver management command outputs a warning:
$ ./manage.py runserver
...
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
WARNING: This is a development server. Do not use it in a…
Django: Introducing inline-snapshot-django
https://adamj.eu/tech/2025/06/24/django-introducing-inline-snapshot-django/
Published: June 23, 2025 23:00
I recently released a new package called inline-snapshot-django.
It’s a tool for snapshot testing SQL queries in Django projects, described shortly.
Snapshot testing and inline-snapshot
inline-snapshot-django builds on top of the excellent…
Python: sharing common tests in unittest
https://adamj.eu/tech/2025/05/30/python-unittest-common-tests/
Published: May 29, 2025 23:00
A neat testing pattern is writing common tests in a base class and then applying them to multiple objects through subclassing.
Doing so can help you test smarter and cover more code with less boilerplate.
unittest doesn’t have a built-in way to define a…
Python: a quick cProfile recipe with pstats
https://adamj.eu/tech/2025/05/20/python-quick-cprofile-recipe-pstats/
Published: May 19, 2025 23:00
Python comes with two built-in profilers for measuring the performance of your code: cProfile and profile.
They have the same API, but cProfile is a C extension, while profile is implemented in Python.
You nearly always want to use cProfile, as it’s faster…
Git: list checked-in symlinks
https://adamj.eu/tech/2025/05/19/git-list-symlinks/
Published: May 18, 2025 23:00
Git supports storing symbolic links (symlinks) in your repository, which are filesystem links that point to another file or directory.
These are great for when you want to have the same file at multiple locations in your repository, such as some…
GitHub Actions: avoid double runs from on: [push, pull_request]
https://adamj.eu/tech/2025/05/14/github-actions-avoid-simple-on/
Published: May 13, 2025 23:00
I’ve often seen a GitHub Actions workflow defined with a trigger like:
on: [push, pull_request]
This means “run on any push or when a pull request is opened or updated”.
While that may seem correct, it leads to double execution of the workflow when you…
Docker: disable “What’s next” adverts
https://adamj.eu/tech/2025/05/08/docker-disable-adverts/
Published: May 7, 2025 23:00
On a client project today, I noticed that running docker exec -it tacks this advert on the end of the output:
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug cl-django
Learn more at…
pre-commit: install with uv
https://adamj.eu/tech/2025/05/07/pre-commit-install-uv/
Published: May 6, 2025 23:00
pre-commit is my favourite Git-integrated “run things on commit” tool.
It acts as a kind of package manager, installing tools as necessary from their Git repositories.
This makes it fairly easy to set up: all you need to install is pre-commit itself, and…
Git: fix a filename case collision
https://adamj.eu/tech/2025/05/05/git-fix-filename-case-collision/
Published: May 5, 2025 14:25
You may encounter this warning when cloning a Git repository:
$ git clone ...
Cloning into 'example'...
... done.
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding…