Skip to content

Instantly share code, notes, and snippets.

@stephenmcd
stephenmcd / gist:381981
Created April 28, 2010 10:39
Auto unique slugs for Django models
def save(self, *args, **kwargs):
"""
Create a unique slug from the title by appending an index.
"""
if self.id is None:
self.slug = slugify(self.title)
i = 0
while True:
if i > 0:
self.slug = "%s-%s" % (self.slug, i)
@stephenmcd
stephenmcd / changelog.py
Created July 12, 2010 22:03
Extract a RST changelog from a HG repo
#!/usr/bin/env python
"""
Use a mercurial repository to generate a reStructuredText changelog.
"""
from datetime import datetime
from mercurial import ui, hg
from django.utils.datastructures import SortedDict
@stephenmcd
stephenmcd / sloc.py
Last active September 5, 2015 10:54
SLOC and comment stats
import os, sys
c_like = {"single": "//", "multi_start": ("/*",), "multi_end": ("*/",),}
langs = {
"py": {"single": "#", "multi_start": ("'''", '"""'),
"multi_end": ("'''", '"""'),},
"html": {"single": "//", "multi_start": ("<!--", "/*"),
"multi_end": ("-->", "*/"),},
"js": c_like,
@stephenmcd
stephenmcd / nonblocking.py
Created December 31, 2010 23:29
Threaded function decorator
import functools
import thread
def nonblocking(func):
"""
Decorator that runs the given func in a separate thread
when called, eg::
@nonblocking
def some_blocking_func():
@stephenmcd
stephenmcd / pullr.rb
Created May 4, 2011 03:12 — forked from benmacleod/pullr.rb
Directory aware version of Pullr
#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'yaml'
require 'rest-client'
require 'active_support'
class Pullr
ORGANIZATION = 'ImpactData'
REPO = 'Squawkbox'
@stephenmcd
stephenmcd / jquery.squeezebox.js
Created May 11, 2011 05:20
Replacement for jquery.ui.accordion to avoid dealing with jquery.ui theming
// Replacement for jquery.ui.accordion to avoid dealing with
// jquery.ui theming.
//
// Usage: $('#container').squeezebox(options);
// where the direct child elements of '#container' are
// sequential pairs of header/panel elements, and options
// is an optional object with any of the following properties:
//
// activeHeaderClass: Class name to apply to the active header
// headerSelector: Selector for the header elements
@stephenmcd
stephenmcd / gist:1050211
Created June 28, 2011 00:34
Safe concurrent saves for Django models
"""
With Django models, calling save() can have undesired consequences,
particularly in a concurrent environment such a Celery, where model
instances may be serialized across a message queue. The save() method
will write all fields to the database which may have already been
written to by another process or thread, and as such will override
fields incorrectly.
The mixin below can be used to safely update model instances without
overriding fields of no concern that may have been written to since
@stephenmcd
stephenmcd / gist:1129135
Created August 6, 2011 07:28
Mini Mock
class MiniMock(object):
"""
A callable object that will always return a value for any
attribute/index/slice/call accessed. The value returned is a new
MiniMock instance allowing for successful chained access.
"""
def __getitem__(self, value):
"""
@stephenmcd
stephenmcd / gist:1318777
Created October 27, 2011 04:29
Estimated project cost of a Mercurial repository
# A one-liner for calculating the cost of a project using a Mercurial repo.
# Replace:
# ignore|paths - pipe separated strings in paths to ignore
# eg: embedded libraries and generated code.
# mins_per_loc - estimated minutes per line of code.
# hourly_rate - hourly dollar rate being charged.
$ hg log --stat | egrep -v 'ignore|paths' | grep '|' | awk '{s+=$3} END {print "$" s / 60 * mins_per_loc * hourly_rate}'
@stephenmcd
stephenmcd / gist:1341065
Created November 5, 2011 03:32
Trap every object method
class Foo(object):
def __getattribute__(self, name):
attr = object.__getattribute__(self, name)
if callable(attr):
def wrapper(*args, **kwargs):
try:
return attr(*args, **kwargs)
except Exception, e:
print "%s failed with exc %s" % (name, e)