Skip to content

Instantly share code, notes, and snippets.

View gavinwahl's full-sized avatar

Gavin Wahl gavinwahl

  • Fusionbox
  • Colorado
View GitHub Profile
@gavinwahl
gavinwahl / abcmodel.py
Created December 3, 2013 22:26
Abstract (PEP 3119) Django models.
from abc import ABCMeta, abstractmethod
class AbstractModelMeta(ABCMeta, type(models.Model)):
pass
class ABCModel(models.Model):
__metaclass__ = AbstractModelMeta
class Meta:
@gavinwahl
gavinwahl / gist:1244417
Created September 27, 2011 05:43
relation algebra
(define (zip-cons a b)
(if (null? a)
'()
(cons (cons (car a) (car b))
(zip-cons (cdr a) (cdr b)))))
(define (p c r)
(cond
((null? c) (map (lambda (x) '()) r))
((eq? (car c) (caar r))
@gavinwahl
gavinwahl / python_implementation
Last active April 24, 2020 23:23
Triggers to enforce referential integrity for foreign keys, if postgres didn't support them natively.
CREATE OR REPLACE FUNCTION check_fk_child() RETURNS trigger AS $$
DECLARE
fk_local TEXT := TG_ARGV[0];
parent_table TEXT := TG_ARGV[1];
fk_val INT;
is_valid BOOLEAN;
query TEXT;
BEGIN
-- fk_val = getattr(NEW, fk_local)
EXECUTE format('SELECT $1.%I', fk_local) USING NEW INTO fk_val;
@gavinwahl
gavinwahl / audio.js
Created August 11, 2018 04:25
Audio in React
import React, { Component } from 'react';
import PropTypes from 'prop-types';
const {Provider: AudioContextProvider, Consumer: AudioConsumer} = React.createContext();
class AudioProvider extends Component {
static propTypes = {
children: PropTypes.arrayOf(PropTypes.node).isRequired,
}
@gavinwahl
gavinwahl / bulk_object_creator.py
Last active July 19, 2018 21:39
Bulk create your objects, but don't accidentally keep too many in memory
import contextlib
@contextlib.contextmanager
def bulk_object_creator(limit=100):
"""
Allows creation of model objects in bulk, intelligently not using too much memory.
with bulk_object_creator() as foo_creator:
for i in range(100000):
from django.core.cache import cache
class RateLimiter(object):
def __init__(self, timeout, max_failures):
self.timeout = timeout
self.max_failures = max_failures
def get_key(self, t):
return ':'.join(str(s) for s in t)
var group_reduce = function (dependentKey, key_func, reduce) {
return Ember.reduceComputed.call(null, dependentKey, {
initialValue: Ember.A,
initialize: function(initialValue, changeMeta, instanceMeta) {
instanceMeta.meta = new Ember.Map();
},
addedItem: function (accumulatedValue, obj, changeMeta, instanceMeta) {
var key = key_func(obj), reduced_object;
if (instanceMeta.meta.get(key) === undefined) {
@gavinwahl
gavinwahl / gist:5952850
Created July 8, 2013 21:59
consume_once
from itertools import tee
class consume_once(object):
"""
Takes an iterator and returns an iterable that can be consumed
multiple times while only consuming the original a single time.
>>> x = consume_once(i for i in range(3))
>>> list(x)
[0, 1, 2]
@gavinwahl
gavinwahl / split_up.py
Created June 3, 2013 20:36
Splits up a string into pages of a maximum length. Includes pages numbers. Tries not to split in the middle of a word. Good for SMS.
from math import ceil
def split_up(s, length=160):
"""
Splits the string s into pages of no longer than length. Includes
pages numbers. Tries not to split in the middle of a word.
>>> split_up("abc", 5)
['abc']
>>> split_up("abcdef", 5)
@gavinwahl
gavinwahl / mixins.py
Created June 2, 2013 18:18
DecoratorMixin is a mixin factory that converts any view decorator into a class-based view mixin.
def DecoratorMixin(decorator):
"""
Converts a decorator written for a function view into a mixin for a
class-based view.
::
LoginRequiredMixin = DecoratorMixin(login_required)
class MyView(LoginRequiredMixin):