Skip to content

Instantly share code, notes, and snippets.

@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)
@stephenmcd
stephenmcd / gist:1374413
Created November 17, 2011 20:27
Sort object list by index of attribute in a keylist
def sort_by_keylist(objects, attr, keylist):
indexes = dict([(x, i) for i, x in enumerate(keylist)])
return sorted(objects, key=lambda x: indexes.get(getattr(x, attr)))
@stephenmcd
stephenmcd / tag_closer.py
Created November 18, 2011 20:07
HTMLParser that closes open tags
class TagCloser(HTMLParser):
"""
HTMLParser that closes open tags. Call close_tags with a HTML
string arg which returns it with any required closing tags
appended.
"""
def __init__(self):
HTMLParser.__init__(self)
self.tags = []
@stephenmcd
stephenmcd / declauser.py
Created January 21, 2012 02:16
Convert 3-clause BSD licenses to 2-clause in a directory of projects, commit and push to BitBucket and GitHub
#!/usr/bin/env python
import os
cwd = os.path.abspath(os.getcwd())
for project in os.listdir("."):
path = os.path.join(cwd, project)
if not os.path.isdir(path):
@stephenmcd
stephenmcd / persistent_test_session.py
Created January 30, 2012 04:45
Persistent Sessions in Django TestCase
"""
The Django test client implements the session API but doesn't persist values in it:
https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session
This Client subclass can be used to maintain a persistent session during test cases.
"""
from django.conf import settings
from django.test import TestCase
@stephenmcd
stephenmcd / slumber_django_testclient.py
Created February 8, 2012 04:58
Subclass of ``slumber.API`` that patches ``requests.request`` with Django test client compatible HTTP requests.
from collections import namedtuple
from django.test import TestCase
from requests.auth import HTTPBasicAuth
import slumber
class SlumberTestClientAPI(slumber.API):
"""
Subclass of ``slumber.API`` that patches ``requests.request``
@stephenmcd
stephenmcd / richtextfield_clean.py
Created April 26, 2012 22:19
Patch Mezzanine's RichTextField without upgrading
"""
XSS privilege escalation by malicious non-superuser admin users.
Fixed in Mezzanine 1.0.9:
https://bitbucket.org/stephenmcd/mezzanine/changeset/40cbc47b8d8a
If an admin user was to create their own POST submit to any forms with a
RichTextField, they could include JavaScript that does the following:
@stephenmcd
stephenmcd / patch_extend_node.py
Created May 8, 2012 12:00
Allow circular Django template inheritance, so projects can both override and extend a reusable app's templates.
from django.template.loader_tags import ExtendsNode
def get_extends_parent(self, context):
"""
Patched onto Django's ``ExtendsNode.get_parent`` which is
responsible for loading the template to extend from with
the ``extends`` template tag.
This patch allows the template foo/bar.html to extend
foo/bar.html, given that there is another version of it that