summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyramid/scripts/__init__.py2
-rw-r--r--pyramid/scripts/pcreate.py98
-rw-r--r--setup.py11
3 files changed, 106 insertions, 5 deletions
diff --git a/pyramid/scripts/__init__.py b/pyramid/scripts/__init__.py
new file mode 100644
index 000000000..ed88d78b4
--- /dev/null
+++ b/pyramid/scripts/__init__.py
@@ -0,0 +1,2 @@
+# package
+
diff --git a/pyramid/scripts/pcreate.py b/pyramid/scripts/pcreate.py
new file mode 100644
index 000000000..bece38e68
--- /dev/null
+++ b/pyramid/scripts/pcreate.py
@@ -0,0 +1,98 @@
+import optparse
+import os
+import pkg_resources
+import re
+import sys
+
+_bad_chars_re = re.compile('[^a-zA-Z0-9_]')
+
+def main(argv=sys.argv):
+ command = CreateCommand(argv)
+ return command.run()
+
+class CreateCommand(object):
+ verbose = True
+ interactive = False
+ simulate = False
+ usage = "usage: %prog [options] project"
+ parser = optparse.OptionParser(usage)
+ parser.add_option('-s', '--scaffold',
+ dest='scaffold_name',
+ action='append',
+ help=("Add a scaffold to the create process "
+ "(multiple -s args accepted)"))
+ parser.add_option('-l', '--list',
+ dest='list',
+ action='store_true',
+ help="List all available scaffold names")
+ parser.add_option('--simulate',
+ dest='simulate',
+ action='store_true',
+ help='Simulate but do no work')
+ parser.add_option('--overwrite',
+ dest='overwrite',
+ action='store_true',
+ help='Always overwrite')
+
+ def __init__(self, argv):
+ self.options, self.args = self.parser.parse_args(argv[1:])
+ self.scaffolds = all_scaffolds()
+ self.available_scaffoldnames = [x.name for x in self.scaffolds]
+
+ def run(self):
+ if self.options.list:
+ return self.show_scaffolds()
+ if not self.options.scaffold_name:
+ print('You must provide at least one scaffold name')
+ return
+ if not self.args:
+ print('You must provide a project name')
+ return
+ diff = set(self.options.scaffold_name).difference(
+ self.available_scaffoldnames)
+ if diff:
+ print('Unavailable scaffolds: %s' % list(diff))
+ self.render_scaffolds()
+
+ def render_scaffolds(self):
+ options = self.options
+ args = self.args
+ dist_name = args[0].lstrip(os.path.sep)
+ output_dir = os.path.normpath(os.path.join(os.getcwd(), dist_name))
+ pkg_name = _bad_chars_re.sub('', dist_name.lower())
+ safe_name = pkg_resources.safe_name(dist_name)
+ egg_name = pkg_resources.to_filename(safe_name),
+ vars = {
+ 'project': dist_name,
+ 'package': pkg_name,
+ 'egg': egg_name,
+ }
+ for scaffold_name in options.scaffold_name:
+ for scaffold in self.scaffolds:
+ if scaffold.name == scaffold_name:
+ scaffold.run(self, output_dir, vars)
+
+ def show_scaffolds(self):
+ scaffolds = list(self.scaffolds)
+ max_name = max([len(t.name) for t in scaffolds])
+ scaffolds.sort(key=lambda x: x.name)
+ print('Available scaffolds:')
+ for scaffold in scaffolds:
+ print(' %s:%s %s' % (
+ scaffold.name,
+ ' '*(max_name-len(scaffold.name)), scaffold.summary))
+
+
+def all_scaffolds():
+ scaffolds = []
+ eps = list(pkg_resources.iter_entry_points('pyramid.scaffold'))
+ for entry in eps:
+ try:
+ scaffold_class = entry.load()
+ scaffold = scaffold_class(entry.name)
+ scaffolds.append(scaffold)
+ except Exception as e:
+ print('Warning: could not load entry point %s (%s: %s)' % (
+ entry.name, e.__class__.__name__, e))
+ return scaffolds
+
diff --git a/setup.py b/setup.py
index af0094856..d029c1a61 100644
--- a/setup.py
+++ b/setup.py
@@ -84,11 +84,11 @@ setup(name='pyramid',
tests_require = tests_require,
test_suite="pyramid.tests",
entry_points = """\
- [glue.create_template]
- pyramid_starter=pyramid.scaffolds:StarterProjectTemplate
- pyramid_zodb=pyramid.scaffolds:ZODBProjectTemplate
- pyramid_routesalchemy=pyramid.scaffolds:RoutesAlchemyProjectTemplate
- pyramid_alchemy=pyramid.scaffolds:AlchemyProjectTemplate
+ [pyramid.scaffold]
+ starter=pyramid.scaffolds:StarterProjectTemplate
+ zodb=pyramid.scaffolds:ZODBProjectTemplate
+ routesalchemy=pyramid.scaffolds:RoutesAlchemyProjectTemplate
+ alchemy=pyramid.scaffolds:AlchemyProjectTemplate
[glue.command]
pshell=pyramid.paster:PShellCommand
proutes=pyramid.paster:PRoutesCommand
@@ -96,6 +96,7 @@ setup(name='pyramid',
ptweens=pyramid.paster:PTweensCommand
[console_scripts]
bfg2pyramid = pyramid.fixers.fix_bfg_imports:main
+ pcreate = pyramid.scripts.pcreate:main
"""
)