Skip to content

Instantly share code, notes, and snippets.

View surenkov's full-sized avatar
💨
I may be slow to respond.

Savva Surenkov surenkov

💨
I may be slow to respond.
View GitHub Profile
@surenkov
surenkov / compressed_stream.py
Last active October 31, 2023 21:22
Gzip-compressed binary stream
from __future__ import annotations
import gzip
import io
import typing as ty
if ty.TYPE_CHECKING:
from collections.abc import Iterable, Iterator
DEFAULT_BLOCK_SIZE = 512 * 1024 # 512 KiB
@surenkov
surenkov / lima-vz-docker.yaml
Last active August 30, 2023 10:16
Lima VM config with VirtioFS and macOS Virtualization Framework for Docker
vmType: "vz"
arch: "default"
images:
# Try to use release-yyyyMMdd image if available. Note that release-yyyyMMdd will be removed after several months.
- location: "https://cloud-images.ubuntu.com/releases/23.04/release-20230829/ubuntu-23.04-server-cloudimg-arm64.img"
arch: "aarch64"
digest: "sha256:5316a0dc05d83b6aad277b338ec67837792d0d695db1b736a59c8117114b8deb"
- location: "https://cloud-images.ubuntu.com/releases/23.04/release-20230829/ubuntu-23.04-server-cloudimg-amd64.img"
vmType: "vz"
arch: "default"
images:
# Try to use release-yyyyMMdd image if available. Note that release-yyyyMMdd will be removed after several months.
- location: "https://cloud-images.ubuntu.com/releases/23.10/release-20231011/ubuntu-23.10-server-cloudimg-arm64.img"
arch: "aarch64"
digest: "sha256:78d35a2f551d281912ee7e5202660d94d713aa1b5de86a17e261328cc2f093d4"
- location: "https://cloud-images.ubuntu.com/releases/23.10/release-20231011/ubuntu-23.10-server-cloudimg-amd64.img"
@surenkov
surenkov / debounced.py
Last active July 29, 2022 08:16
Celery tasks debouncing
import functools
import logging
import pickle
import typing as t
from contextlib import contextmanager
from random import random
from django.conf import settings
from celery import Task
@surenkov
surenkov / django_pg_locks.py
Last active December 29, 2023 11:24
Postgres table / advisory lock context managers for Django python apps
import contextlib
import enum
import hashlib
import typing as t
from django.apps import apps
from django.db import models, transaction, connection, OperationalError, InternalError
from psycopg2 import sql
from collections import deque
field = [...] # NxM matrix
not_visited = {(x, y) for x in range(N) for y in range(M)}
def test_acceptance(x, y):
return field[x][y] == 1 and (x, y) in not_visited
@surenkov
surenkov / cache_view.py
Last active May 2, 2023 12:43
Django class-based view caching mixing with granular cache-control
import functools
import typing as t
from datetime import timedelta
from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_cookie, vary_on_headers
from django.views.generic import View
__all__ = (
"CachedView",
@surenkov
surenkov / django_choice_enum.py
Created October 21, 2019 14:43
ChoiceEnum backport (simplified) for Django < 3.0
from enum import EnumMeta, Enum
__all__ = ['ChoiceEnum']
class ChoiceEnumMeta(EnumMeta):
def __iter__(cls):
return ((tag.value, tag.name) for tag in super().__iter__())
@property
@surenkov
surenkov / drf_full_text_search_filter.py
Last active December 29, 2023 11:26
Django REST filter around `django.contrib.postgres.search` expressions
from typing import Union, Collection
from django.contrib.postgres.search import SearchVector, SearchQuery
from django.db.models.expressions import BaseExpression
from django_filters import rest_framework as filters
from django_filters.constants import EMPTY_VALUES
class FullTextSearchFilter(filters.CharFilter):
@surenkov
surenkov / drf_ctx_default.py
Created October 7, 2019 17:18
Django REST Framework context default value
from operator import methodcaller
from django.utils.functional import cached_property
from typing import Union
class ContextDefaultValue:
""">>> field = serializers.HiddenField(
>>> default=ContextDefaultValue("some_context_attr")
>>> )"""