Source code for bibliopixel.commands.animations

"""
List all BiblioPixel Animations
"""

import os, bibliopixel, inspect, BiblioPixelAnimations
from bibliopixel.animation import (
    animation, circle, collection, cube, game, indexed, indexed, matrix,
    parallel, receiver, strip, wrapper)
from bibliopixel.util import log, walk
from bibliopixel.project import importer


[docs]def run(args): animations = {} for root, filename in walk.walk(ROOTS): basepath = os.path.dirname(root) relpath = os.path.relpath(filename, basepath) for category, name in _get_classes(relpath): animations.setdefault(category, []).append(name) count = 0 for category, entries in sorted(animations.items()): log.printer(category + ':') for e in sorted(entries): if e not in _BLACKLIST: log.printer(' ', _canonicalize(e)) count += 1 log.printer() log.printer('Total animation classes', count)
[docs]def add_arguments(parser): parser.set_defaults(run=run)
def _animation_category(value): if not (inspect.isclass(value) and issubclass(value, animation.Animation)): return for cls_name, cls in BASE_CLASSES: if value is cls or value is animation.Animation: return if issubclass(value, cls): return cls_name return 'all' def _get_classes(filename): if not filename.endswith('.py'): return filename = filename[:-3] path = [] while filename: filename, segment = os.path.split(filename) path.insert(0, segment) if not path or path[-1].startswith('_'): return python_path = '.'.join(path) try: module = importer.import_module(python_path) except: return python_path += '.' for name, value in vars(module).items(): category = _animation_category(value) if category and not name.startswith('_'): yield category, python_path + name def _canonicalize(name): parts = name.split('.') p = parts[-1].lower().replace('_', '') q = parts[-2].lower().replace('_', '') if p == q: parts.pop() name = '.'.join(parts) name = name.replace('bibliopixel.animation.', '.') name = name.replace('BiblioPixelAnimations.', '$bpa.') return name BP_ROOT = os.path.dirname(bibliopixel.__file__) BPA_ROOT = os.path.dirname(BiblioPixelAnimations.__file__) ROOTS = BP_ROOT, BPA_ROOT BASE_CLASSES = ( ('circle', circle.Circle), ('cube', cube.Cube), ('game', game.Game), ('matrix', matrix.Matrix), ('strip', strip.Strip), ('parallel', parallel.Parallel), ('wrapper', wrapper.Wrapper), ('indexed', indexed.Indexed), ('collection', collection.Collection), ('receiver', receiver.Receiver), ('simple', animation.Animation), ) _BLACKLIST = set(( 'bibliopixel.animation.off.OffAnim', 'bibliopixel.animation.remote.control.Off', 'bibliopixel.main.demo_table.Sequence', 'bibliopixel.main.all_pixel_test.StripChannelTest', 'bibliopixel.animation.failed.Failed', 'BiblioPixelAnimations.simple.Fill.Fill', ))