Skip to content

Instantly share code, notes, and snippets.

View louisswarren's full-sized avatar

Louis Warren louisswarren

View GitHub Profile
import functools
def accumulate(accum_type):
def outer_wrapper(f):
@functools.wraps(f)
def inner_wrapper(*args, **kwds):
return accum_type(iter(f(*args, **kwds)))
return inner_wrapper
return outer_wrapper
@louisswarren
louisswarren / easy_passwords.py
Last active April 30, 2022 10:01
Generate passwords which are easy to type
# Generate passwords which can be typed without using any finger to press two
# different keys in a row.
from math import log, ceil
# For each finger, write the letters *you* type with that finger.
finger_classes = [
'qaz',
'wsx',
'edc',
@louisswarren
louisswarren / youtube-terminal.py
Last active May 11, 2017 23:10
Play audio from a youtube search in the terminal
#!/usr/bin/env python3
from os import system
from sys import argv
# Example:
# youtube-terminal.py foo bar baz
# calls youtube-dl 'ytsearch:foo bar baz' --max-downloads 1 -o - | cvlc - --no-video
call_str = 'youtube-dl "ytsearch:{}" --max-downloads 1 -o -'
call_str += ' | cvlc - --no-video --play-and-exit'
@louisswarren
louisswarren / edrename.py
Last active February 5, 2018 08:42
Batch rename files using your editor
#!/usr/bin/env python3
import os
import subprocess
import tempfile
EDITOR = os.environ.get('EDITOR', 'vim')
def input_new_names(old_names):
with tempfile.NamedTemporaryFile(suffix='.tmp') as fname_file:
import builtins
def testable(f):
def run_test(test):
print(test.__doc__)
args = {name: value for (name, value) in test.__annotations__.items()
if name != 'return'}
assert f(**args) == test.__annotations__['return']
return test
f.test = run_test
@louisswarren
louisswarren / open.py
Created May 15, 2017 09:08
Search for a file and open it with xdg-open
#!/usr/bin/env python3
import re
import subprocess
import sys
if len(sys.argv) < 2:
print("Usage: {} <findregex> [pythonregex]...")
sys.exit()
@louisswarren
louisswarren / lazydict.py
Last active September 18, 2017 11:13
Lazily evaluated dictionary generator
class LazyDict:
'''Use a 2-tuple generator as a lazily-evaluated dictionary.'''
def __init__(self, gen):
self.gen = gen
self.dict = {}
def _generate_to(self, key):
while key not in self.dict:
found_key, found_val = next(self.gen)
self.dict[found_key] = found_val
@louisswarren
louisswarren / clarinet.py
Last active June 1, 2017 22:57
A clarinet is a pipe with a reed; clarinet.py reads from a named pipe.
#!/usr/bin/env python3
import os
import sys
import textwrap
import time
def usage():
print(textwrap.dedent("""
Usage: {} <pipepath>
@milesrout
milesrout / characters.py
Created March 26, 2018 03:44
Gives the characters of any literary work
print(__import__('random').choice(__import__('sys').stdin.read().strip()))