import argparse import sys import textwrap from pyramid.interfaces import ITweens from pyramid.tweens import MAIN from pyramid.tweens import INGRESS from pyramid.paster import bootstrap from pyramid.paster import setup_logging from pyramid.scripts.common import parse_vars def main(argv=sys.argv, quiet=False): command = PTweensCommand(argv, quiet) return command.run() class PTweensCommand(object): description = """\ Print all implicit and explicit tween objects used by a Pyramid application. The handler output includes whether the system is using an explicit tweens ordering (will be true when the "pyramid.tweens" deployment setting is used) or an implicit tweens ordering (will be true when the "pyramid.tweens" deployment setting is *not* used). This command accepts one positional argument named "config_uri" which specifies the PasteDeploy config file to use for the interactive shell. The format is "inifile#name". If the name is left off, "main" will be assumed. Example: "ptweens myapp.ini#main". """ parser = argparse.ArgumentParser( description=textwrap.dedent(description), formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( 'config_uri', nargs='?', default=None, help='The URI to the configuration file.', ) parser.add_argument( 'config_vars', nargs='*', default=(), help="Variables required by the config file. For example, " "`http_port=%%(http_port)s` would expect `http_port=8080` to be " "passed here.", ) stdout = sys.stdout bootstrap = staticmethod(bootstrap) # testing setup_logging = staticmethod(setup_logging) # testing def __init__(self, argv, quiet=False): self.quiet = quiet self.args = self.parser.parse_args(argv[1:]) def _get_tweens(self, registry): from pyramid.config import Configurator config = Configurator(registry=registry) return config.registry.queryUtility(ITweens) def out(self, msg): # pragma: no cover if not self.quiet: print(msg) def show_chain(self, chain): fmt = '%-10s %-65s' self.out(fmt % ('Position', 'Name')) self.out(fmt % ('-' * len('Position'), '-' * len('Name'))) self.out(fmt % ('-', INGRESS)) for pos, (name, _) in enumerate(chain): self.out(fmt % (pos, name)) self.out(fmt % ('-', MAIN)) def run(self): if not self.args.config_uri: self.out('Requires a config file argument') return 2 config_uri = self.args.config_uri config_vars = parse_vars(self.args.config_vars) self.setup_logging(config_uri, global_conf=config_vars) env = self.bootstrap(config_uri, options=config_vars) registry = env['registry'] tweens = self._get_tweens(registry) if tweens is not None: explicit = tweens.explicit if explicit: self.out( '"pyramid.tweens" config value set ' '(explicitly ordered tweens used)' ) self.out('') self.out('Explicit Tween Chain (used)') self.out('') self.show_chain(tweens.explicit) self.out('') self.out('Implicit Tween Chain (not used)') self.out('') self.show_chain(tweens.implicit()) else: self.out( '"pyramid.tweens" config value NOT set ' '(implicitly ordered tweens used)' ) self.out('') self.out('Implicit Tween Chain') self.out('') self.show_chain(tweens.implicit()) return 0 if __name__ == '__main__': # pragma: no cover sys.exit(main() or 0)