Skip to content

Instantly share code, notes, and snippets.

View headsrooms's full-sized avatar
🦊

Pablo Cabezas headsrooms

🦊
  • SNGULAR
  • Madrid
  • 17:37 (UTC +02:00)
View GitHub Profile
@headsrooms
headsrooms / timeit.py
Created November 15, 2018 16:55
Timeit decorator asyncio compatible with repetitions and geometric mean result
def timeit(n):
def timeit_decorator(func):
async def process(func, *args, **params):
if asyncio.iscoroutinefunction(func):
return await func(*args, **params)
else:
return func(*args, **params)
async def helper(*args, **params):
times = []
@headsrooms
headsrooms / no_stdout.py
Created November 15, 2018 16:44
No stdout decorator
@contextlib.contextmanager
def no_stdout():
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
yield
sys.stdout = save_stdout
@headsrooms
headsrooms / avoid.py
Created August 14, 2018 10:00
Manage python exceptions through decorators
@contextmanager
def avoid(
exception: type(Exception),
raises: Exception = None,
exception_manager: Callable = None,
finally_manager: Callable = lambda: (),
):
try:
yield
except exception as e:
@headsrooms
headsrooms / not_raises.py
Created August 14, 2018 09:59
Test util to check that some code not raises an exception
from contextlib import contextmanager
import pytest
@contextmanager
def not_raises(exception):
try:
yield
except exception as e:
@headsrooms
headsrooms / makefile
Created August 9, 2018 08:20
Makefile to generate requirements.txt from poetry
requirements.txt: pyproject.lock
poetry run pip freeze > $@
class FunctionHolder(object):
def __init__(self, function):
self.func = function
self.called_count = 0
def __call__(self, *args, **kwargs):
try:
return self.func(*args, **kwargs)
finally:
self.called_count += 1
@headsrooms
headsrooms / django_admin_keyword_search.py
Created November 29, 2017 09:20
Django admin keyword search
def search_view(request):
if request.GET.get('q', None):
django_admin_keyword_search(User, request.GET['q'], ['search_field_1', 'search_field_2'])
def django_admin_keyword_search(model, keywords, search_fields):
all_queries = None
for keyword in keywords.split(' '): # breaks query_string into 'Foo' and 'Bar'
keyword_query = None
@headsrooms
headsrooms / RelatedFieldWidgetCanAdd.py
Last active September 22, 2019 10:54
ForeignKey in a Model form with "add new" button
class OrderNewForm(forms.ModelForm):
client = forms.ModelChoiceField(
required=False,
queryset=Client.objects.all(),
widget=RelatedFieldWidgetCanAdd(Client, related_url="so_client_add")
)
class Meta:
model = Order
fields = ('code', 'client')
@headsrooms
headsrooms / timeit.py
Created November 12, 2017 20:06
Timer decorator
from functools import wraps
from time import time
def timeit(f):
@wraps(f)
def wrapper(*args, **kwargs):
start = time()
result = f(*args, **kwargs)
end = time()
print('Elapsed time: {}'.format(end - start))
@headsrooms
headsrooms / string_utils.py
Last active November 11, 2017 16:38
Helper functions to convert between str and bytes extracted from "Effective Python" by Brett Slatkin. Added type hints and bytearray support.
def to_str(bytes_or_str: Union[str, bytes]) -> str:
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
elif isinstance(bytes_or_str, bytearray):
value = bytes(bytes_or_str).decode('utf-8')
else:
value = bytes_or_str
return value