Skip to content

Instantly share code, notes, and snippets.

@edelooff
edelooff / gist:1d280ec2745248295dae
Created Jun 9, 2014
reST article to demonstrate pelican issue #1369
View gist:1d280ec2745248295dae

Automatic post summary causes weird line numbers in code-block

Date: 2014/06/09
tags:Pelican, reStructuredText

This article is a demonstration for Pelican issue #1369. The SUMMARY_MAX_LENGTH is set to 100 words, which means that index pages will list the first 100 words of this article. This includes a portion of the below code snippet, which configured to have its line numbers in a table.

@edelooff
edelooff / tileable_hexagons.py
Created Oct 1, 2014
Drawing tileable hexagons with PIL + Aggdraw
View tileable_hexagons.py
"""Module for drawing of randomly colored, tileable hexagons."""
import math
import random
from PIL import Image
from aggdraw import Draw, Brush
class HexagonGenerator(object):
@edelooff
edelooff / app.py
Created Aug 16, 2016
Pyramid 1.7 view deriver to alert on view_configs that lack a permission setting.
View app.py
def permission_check(view, info):
"""View deriver to verify all view configs define a 'permission'.
This deriver prints a message for each view config that lacks a permission
setting. Regardless of this setting, the original view is returned.
"""
opts = info.options
if opts.get('permission') is None:
name_parts = [opts['view'].__module__, opts['view'].__name__]
if opts['attr'] is not None:
@edelooff
edelooff / feistel.py
Last active Apr 10, 2018
Simple Python Feistel encoder/decoder
View feistel.py
"""A simple 8-round Feistel network to encode/decode 8-bit integers.
See https://en.wikipedia.org/wiki/Feistel_cipher for construction details.
"""
from random import randint
ROUNDS = 8
KEYS = [(randint(11, 19), randint(1, 200)) for _ in range(ROUNDS)]
@edelooff
edelooff / declarative.py
Created Jun 2, 2018
Example uses of Kalpa
View declarative.py
from kalpa import Root, Node, branch
USERS = {...}
class Root(Root):
"""Traversal root for Pyramid application."""
users = branch('UserCollection')
@edelooff
edelooff / duplicate_perf.py
Last active Oct 12, 2018
Collection length checking before determining duplicate items
View duplicate_perf.py
import timeit
NO_DUPLICATES = (
'one', 'two', 'three', 'four', 'five', 'six',
'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve')
WITH_DUPLICATES = (
'one', 'two', 'three', 'four', 'five', 'six',
'seven', 'one', 'nine', 'two', 'eleven', 'three')
@edelooff
edelooff / merge_benchmark.py
Created Apr 11, 2020
Benchmarking functions to merge two sorted lists
View merge_benchmark.py
"""Merging two sorted lists in Python in four ways.
1. The "stupid naive" way of adding them together and sorting the whole thing.
This should be pretty fast as timsort is designed to be fast on partially
sorted lists. However, it uses more memory and might not scale very well?
2. The "picking an algorithm designed for this" way of using heapq.merge. This
provides a generator that walks the two lists without additional use of
memory.
3. The "C-way" of indexing our way through two lists. This being Python though,
we will be yielding the values though (wrapping the resulting generator in
@edelooff
edelooff / sqla_secondary.py
Created Apr 24, 2020
SQLAlchemy secondary join
View sqla_secondary.py
from sqlalchemy import (
Column,
ForeignKey,
Integer,
Text,
create_engine)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
relationship,
sessionmaker)
@edelooff
edelooff / column_flag.py
Last active May 12, 2020
SQLAlchemy columns with a hybrid property boolean flag to check for presence (non-nullness)
View column_flag.py
from sqlalchemy import (
Column,
Integer,
DateTime,
Text,
create_engine,
func)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.inspection import inspect
@edelooff
edelooff / deep_add.py
Last active Jun 4, 2020
Sum any nested level of iterables, with optional initial value
View deep_add.py
from collections.abc import Iterable
def deep_add(*values, start=None):
def _traverser(parts):
for part in parts:
if isinstance(part, Iterable):
yield from _traverser(part)
else:
yield part
You can’t perform that action at this time.