# -*- coding: utf-8 -*- """Common development tasks for setup.py to use.""" import re import subprocess import sys from setuptools import Command from setuptools.command.test import test as TestCommand class BaseCommand(Command, object): """The base command for project tasks.""" user_options = [] default_cmd_options = ("verbose", "quiet", "dry_run") def __init__(self, *args, **kwargs): super(BaseCommand, self).__init__(*args, **kwargs) self.verbose = False def initialize_options(self): """Override the distutils abstract method.""" pass def finalize_options(self): """Override the distutils abstract method.""" # Distutils uses incrementing integers for verbosity. self.verbose = bool(self.verbose) def call_and_exit(self, cmd, shell=True): """Run the *cmd* and exit with the proper exit code.""" sys.exit(subprocess.call(cmd, shell=shell)) def call_in_sequence(self, cmds, shell=True): """Run multiple commands in a row, exiting if one fails.""" for cmd in cmds: if subprocess.call(cmd, shell=shell) == 1: sys.exit(1) def apply_options(self, cmd, options=()): """Apply command-line options.""" for option in self.default_cmd_options + options: cmd = self.apply_option(cmd, option, active=getattr(self, option, False)) return cmd def apply_option(self, cmd, option, active=True): """Apply a command-line option.""" return re.sub( r"{{{}\:(?P