Skip to content

Instantly share code, notes, and snippets.

View justanr's full-sized avatar
🏴

anr (they/them) justanr

🏴
View GitHub Profile
@justanr
justanr / deprecate.py
Last active April 16, 2018 03:03
Setting up deprecations of Pluggy Hooks
import sys
import warnings
import inspect
from pluggy import HookimplMarker, HookspecMarker, PluginManager, _HookCaller, normalize_hookimpl_opts, HookImpl
class MetadataHookspecMarker(HookspecMarker):
"""
Allows storing arbitrary metadata on the hookspec options
instead of what Pluggy sets by default.
"""
from abc import ABCMeta, abstractmethod
ABC = ABCMeta('ABC', (object,), {})
class ConversionStrategy(ABC):
@abstractmethod
def convert(self, a):
raise NotImplementedError
class IntegerConversionStrategy(ConversionStrategy):
from datetime import datetime
SUNDAY = 6
class UncleVernonMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
if environ['REQUEST_METHOD'].lower() == 'post' and datetime.now().weekday() == SUNDAY:
@justanr
justanr / example.py
Last active June 15, 2016 02:34
Proof of Concept for adding kinda Implicits to Python
class Thing:
def r(self):
pass
class HasWhatever(metaclass=ImplicitMeta, companion=Thing):
whatever = lambda s: print(s, 1)
@property
def nine(self):
return 'nine'
[tox]
envlist = cov-init,py27,py34,py35,py36,cov-report
[testenv]
usedevelop = True
setenv =
COVERAGE_FILE = .coverage.{envname}
PYTHONDONTWRITEBYTECODE = pls
commands =
py.test --cov={toxinidir}/flask_sleepy --cov-report term-missing
@justanr
justanr / builder.py
Last active February 17, 2016 14:52
Test Builder
from copy import deepcopy
class Builder(object):
def __init__(self, target, *args, **kwargs):
self._target = target
self._kwargs = kwargs
self._args = list(args)
def having(self, *args, **kwargs):
@justanr
justanr / money.py
Last active July 20, 2016 11:43
Example of a small value object representing money.
import decimal
from functools import total_ordering
from numbers import Real
class Context(object):
def __init__(self, **kwargs):
self.context = decimal.Context(**kwargs)
def __enter__(self):
with decimal.localcontext(self.context) as c:
@justanr
justanr / _core.py
Last active December 14, 2023 02:47
Clean Architecture In Python
from abc import ABC, ABCMeta, abstractmethod
from collections import namedtuple
from itertools import count
PayloadFactory = namedtuple('PayloadFactory', [
'good', 'created', 'queued', 'unchanged', 'requires_auth',
'permission_denied', 'not_found', 'invalid', 'error'
])
"""
class UserNotFound(Exception):
@classmethod
def by_username(cls, username):
return cls("No user found with username: {0}".format(username))
def find_user(username):
user = User.query.filter_by(username==username).first()
if not user:
raise UserNotFound.by_username(username)
return user
@justanr
justanr / actually_do_the_thing.py
Last active September 17, 2015 17:17
Todo: Support loading from arbitrary data store (yaml, xml, Mongo, etc)
from .command_bus import DefaultCommandBus, ValidatingCommandBus, LoggingCommandBus, SupportsSelfExecution
from .command_name_formatters import (ChangeToOn_CommandName, ChangeToLowerCaseCommandName,
RemoveCommandFromName, MultipleCommandNameFormatter)
from .command_validators import LogsFailedValidationsValidator, GenerousMappingCommandValidator
from .commands import HelloPersonCommand, HelloPersonHandler
from .dependencies import DependencyStore, BasicDependencySatsifier
from .displayer import CallableDisplayer
from .formatter import StringFormatter
from .inflector import (CallableOrNextInflector, DefaultInflector, InstantiatingInflector
CommandNameInflector, MultipleCommandNameInflector, FirstOneWinsInflector)