Skip to content

Instantly share code, notes, and snippets.

View adamchainz's full-sized avatar
🍐
I like pears.

Adam Johnson adamchainz

🍐
I like pears.
View GitHub Profile
@adamchainz
adamchainz / middleware.py
Created April 3, 2023 19:46
login required middleware
class LoginRequiredMiddleware:
def __init__(self, get_response: GetResponse) -> None:
self.get_response = get_response
def __call__(self, request: HttpRequest) -> HttpResponse:
return self.get_response(request)
def process_view(
self,
request: HttpRequest,
@adamchainz
adamchainz / migrate_postgres_serial_columns.py
Created October 18, 2022 14:42
Django 4.1 serial to identity migration script, alternative version
"""
Alternative version that uses internal-poking technique from:
https://www.enterprisedb.com/blog/postgresql-10-identity-columns-explained
"""
from __future__ import annotations
import argparse
from typing import Any
from django.core.management.base import BaseCommand
@adamchainz
adamchainz / authlib.patch
Created September 14, 2022 08:32
authlib 1.0.1 to 1.1.0 wheel diff
diff --git a/Users/chainz/Downloads/Authlib-1.0.1-py2.py3-none-any/Authlib-1.0.1.dist-info/LICENSE b/Users/chainz/Downloads/Authlib-1.1.0-py2.py3-none-any/Authlib-1.1.0.dist-info/LICENSE
similarity index 100%
rename from /Users/chainz/Downloads/Authlib-1.0.1-py2.py3-none-any/Authlib-1.0.1.dist-info/LICENSE
rename to /Users/chainz/Downloads/Authlib-1.1.0-py2.py3-none-any/Authlib-1.1.0.dist-info/LICENSE
diff --git a/Users/chainz/Downloads/Authlib-1.0.1-py2.py3-none-any/Authlib-1.0.1.dist-info/METADATA b/Users/chainz/Downloads/Authlib-1.1.0-py2.py3-none-any/Authlib-1.1.0.dist-info/METADATA
similarity index 99%
rename from /Users/chainz/Downloads/Authlib-1.0.1-py2.py3-none-any/Authlib-1.0.1.dist-info/METADATA
rename to /Users/chainz/Downloads/Authlib-1.1.0-py2.py3-none-any/Authlib-1.1.0.dist-info/METADATA
index da8bbee..58ce39e 100644
--- a/Users/chainz/Downloads/Authlib-1.0.1-py2.py3-none-any/Authlib-1.0.1.dist-info/METADATA
@adamchainz
adamchainz / test_migrations.py
Last active June 29, 2023 14:25
Django test for pending migrations
from io import StringIO
from django.core.management import call_command
from django.test import TestCase
class PendingMigrationsTests(TestCase):
def test_no_pending_migrations(self):
out = StringIO()
try:
call_command(
@adamchainz
adamchainz / get_line_offsets.py
Last active June 17, 2022 14:01
Will McGugan's get_line_offsets challenge
def adam_get_line_offsets(text: str) -> list[int]:
offsets = [0]
n = 0
text_index = text.index
offsets_append = offsets.append
while True:
try:
n = text_index('\n', n) + 1
except ValueError:
break
@adamchainz
adamchainz / fix_curly_quotes.py
Created May 30, 2022 15:14
Curly quote fixer script
#!/usr/bin/env python
import argparse
def main(argv=None):
parser = argparse.ArgumentParser(
description="Replace curly quotes with straight versions."
)
parser.add_argument(
"file",
@adamchainz
adamchainz / settings.py
Created February 10, 2022 22:19
Django logging setting with Rich
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"filters": {
"require_debug_true": {
"()": "django.utils.log.RequireDebugTrue",
},
},
"formatters": {
"rich": {"datefmt": "[%X]"},
@adamchainz
adamchainz / typed_property.py
Created October 18, 2021 10:30 — forked from willmcgugan/typed_property.py
A descriptor that permits a different type in the setter
from __future__ import annotations
from typing import NamedTuple, cast, overload
class ConsoleDimensions(NamedTuple):
width: int
height: int
@adamchainz
adamchainz / example.py
Created August 29, 2021 08:32
raylib python example
# Example of using raylib using only Python standard library
# whilst raylib-py looks useful, it seems quite out of date
from pathlib import Path
from ctypes import CDLL, c_int, c_char_p, c_ubyte, c_bool, Structure
raylib = CDLL(Path(__file__).parent / "lib" / "libraylib.3.7.0.dylib")
raylib.InitWindow.argtypes = [c_int, c_int, c_char_p]
raylib.InitWindow.restype = None
@adamchainz
adamchainz / shell session
Created July 8, 2021 14:09
metaclass repr puzzle
$ cat base.py
class MyMeta(type):
def __new__(mcs, name, bases, attrs):
return super().__new__(mcs, name, bases, attrs)
class MyBase(metaclass=MyMeta):
pass
$ python -c 'from base import MyBase