Skip to content

Instantly share code, notes, and snippets.

@laundmo
laundmo / attributes.py
Created November 16, 2020 19:25
mixin that allows instances to access other instances attributes directly
class OtherInstancesMixin():
def __getattribute__(self, name):
try:
return object.__getattribute__(self, name)
except AttributeError as e:
for instance in object.__getattribute__(self, "_related"):
try:
return object.__getattribute__(instance, name)
except AttributeError:
pass
@laundmo
laundmo / jinja_property_error.py
Last active November 28, 2020 05:15
Jinja 2 will sometimes hide exceptions thrown in properties behind "Class has no attribute property_name" due to the way the jinja2.Undefined works. This is a way to forcibly throw the underlying exceptions.
class JinjaPropertyErrorReporting():
def __getattribute__(self, name):
if isinstance(getattr(type(self), name, None), property): # TODO: could be done using hasattr?
try:
return super().__getattribute__(name)
except Exception as e:
raise Exception(f"Jinja would have accidentally hidden this error: {type(e).__name__}: {str(e)}") from e
else:
return super().__getattribute__(name)
@laundmo
laundmo / traverse.py
Last active March 8, 2023 00:56
Recursively get values from a dict/list structure by either key or value
"""
Copyright 2020
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING
@laundmo
laundmo / docker-compose-aliases.bashrc
Created March 15, 2021 19:51
my docker compose aliases
alias dc='docker-compose'
alias dcl='dc logs -f --tail="100"'
alias dcb='dc build --parallel'
alias dcu='dc up -d'
alias dcx='dcb && dcu && dcl'
alias dcd='dc down'
alias dcr='dcd && dcu'
@laundmo
laundmo / private.py
Last active March 8, 2023 00:36
Challenge where i tried to make something in python inaccessible, only edit the evaluate method. Rules at the bottom of the file.
class Private:
def __setattr__(self, name, value):
raise RuntimeError("Attribute setting disabled.")
def __call__(self, f):
super().__setattr__("f_code", f.__code__)
def wrapper(*args, **kwargs):
f.__code__ = self.f_code
if self.code == __import__("inspect").currentframe().f_back.f_code:
@laundmo
laundmo / lerp.py
Last active May 23, 2024 19:50
lerp, inverse lerp and remap in python
def lerp(a: float, b: float, t: float) -> float:
"""Linear interpolate on the scale given by a to b, using t as the point on that scale.
Examples
--------
50 == lerp(0, 100, 0.5)
4.2 == lerp(1, 5, 0.8)
"""
return (1 - t) * a + t * b
@laundmo
laundmo / dragino_NBSN95.py
Last active December 7, 2021 16:01
Dragino NBSN95 decoder, all payloads.
"""
MIT License
Copyright (c) 2021 Laurin Schmidt laurinschmidt2001@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
@laundmo
laundmo / to_from_dataclass.py
Created February 15, 2022 15:54
very basic roundtrip dataclass to json-serializeable dict using converters per exact type
# I often find myself wanting a easy way to define custom converters for
# converting dataclasses to and from dicts, but don't want to import
# another dependency (dataclass_factory). In this example i'm converting datetimes.
# published as MIT license: https://opensource.org/licenses/MIT
from dataclasses import dataclass, fields
from datetime import datetime
from typing import List
@laundmo
laundmo / ascii-table.py
Last active May 27, 2024 21:42
simple pretty print for tables
# This code is available under the MIT license: https://opensource.org/licenses/MIT
#
# 2022-07-29 Added from_dict helper, textwrapping, max_width, and typehinted to Sequence instead of list.
from itertools import zip_longest
import textwrap
from typing import Callable, List, Optional, Sequence
def text_width(text: str) -> int:
@laundmo
laundmo / compose-check.py
Last active December 23, 2022 07:45
Check which docker-compose services were changed since last "up" and which containers need to be restarted
#!/usr/bin/env python3
# This code is available under the MIT license: https://opensource.org/licenses/MIT
from pathlib import Path
import subprocess
import json
from dataclasses import dataclass
from typing import List, Optional