Skip to content

Commit a30a39a

Browse files
committed
add a pcreate command
1 parent 24b5c1f commit a30a39a

File tree

3 files changed

+106
-5
lines changed

3 files changed

+106
-5
lines changed

pyramid/scripts/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# package
2+

pyramid/scripts/pcreate.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import optparse
2+
import os
3+
import pkg_resources
4+
import re
5+
import sys
6+
7+
_bad_chars_re = re.compile('[^a-zA-Z0-9_]')
8+
9+
def main(argv=sys.argv):
10+
command = CreateCommand(argv)
11+
return command.run()
12+
13+
class CreateCommand(object):
14+
verbose = True
15+
interactive = False
16+
simulate = False
17+
usage = "usage: %prog [options] project"
18+
parser = optparse.OptionParser(usage)
19+
parser.add_option('-s', '--scaffold',
20+
dest='scaffold_name',
21+
action='append',
22+
help=("Add a scaffold to the create process "
23+
"(multiple -s args accepted)"))
24+
parser.add_option('-l', '--list',
25+
dest='list',
26+
action='store_true',
27+
help="List all available scaffold names")
28+
parser.add_option('--simulate',
29+
dest='simulate',
30+
action='store_true',
31+
help='Simulate but do no work')
32+
parser.add_option('--overwrite',
33+
dest='overwrite',
34+
action='store_true',
35+
help='Always overwrite')
36+
37+
def __init__(self, argv):
38+
self.options, self.args = self.parser.parse_args(argv[1:])
39+
self.scaffolds = all_scaffolds()
40+
self.available_scaffoldnames = [x.name for x in self.scaffolds]
41+
42+
def run(self):
43+
if self.options.list:
44+
return self.show_scaffolds()
45+
if not self.options.scaffold_name:
46+
print('You must provide at least one scaffold name')
47+
return
48+
if not self.args:
49+
print('You must provide a project name')
50+
return
51+
diff = set(self.options.scaffold_name).difference(
52+
self.available_scaffoldnames)
53+
if diff:
54+
print('Unavailable scaffolds: %s' % list(diff))
55+
self.render_scaffolds()
56+
57+
def render_scaffolds(self):
58+
options = self.options
59+
args = self.args
60+
dist_name = args[0].lstrip(os.path.sep)
61+
output_dir = os.path.normpath(os.path.join(os.getcwd(), dist_name))
62+
pkg_name = _bad_chars_re.sub('', dist_name.lower())
63+
safe_name = pkg_resources.safe_name(dist_name)
64+
egg_name = pkg_resources.to_filename(safe_name),
65+
vars = {
66+
'project': dist_name,
67+
'package': pkg_name,
68+
'egg': egg_name,
69+
}
70+
for scaffold_name in options.scaffold_name:
71+
for scaffold in self.scaffolds:
72+
if scaffold.name == scaffold_name:
73+
scaffold.run(self, output_dir, vars)
74+
75+
def show_scaffolds(self):
76+
scaffolds = list(self.scaffolds)
77+
max_name = max([len(t.name) for t in scaffolds])
78+
scaffolds.sort(key=lambda x: x.name)
79+
print('Available scaffolds:')
80+
for scaffold in scaffolds:
81+
print(' %s:%s %s' % (
82+
scaffold.name,
83+
' '*(max_name-len(scaffold.name)), scaffold.summary))
84+
85+
86+
def all_scaffolds():
87+
scaffolds = []
88+
eps = list(pkg_resources.iter_entry_points('pyramid.scaffold'))
89+
for entry in eps:
90+
try:
91+
scaffold_class = entry.load()
92+
scaffold = scaffold_class(entry.name)
93+
scaffolds.append(scaffold)
94+
except Exception as e:
95+
print('Warning: could not load entry point %s (%s: %s)' % (
96+
entry.name, e.__class__.__name__, e))
97+
return scaffolds
98+

setup.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,19 @@
8484
tests_require = tests_require,
8585
test_suite="pyramid.tests",
8686
entry_points = """\
87-
[glue.create_template]
88-
pyramid_starter=pyramid.scaffolds:StarterProjectTemplate
89-
pyramid_zodb=pyramid.scaffolds:ZODBProjectTemplate
90-
pyramid_routesalchemy=pyramid.scaffolds:RoutesAlchemyProjectTemplate
91-
pyramid_alchemy=pyramid.scaffolds:AlchemyProjectTemplate
87+
[pyramid.scaffold]
88+
starter=pyramid.scaffolds:StarterProjectTemplate
89+
zodb=pyramid.scaffolds:ZODBProjectTemplate
90+
routesalchemy=pyramid.scaffolds:RoutesAlchemyProjectTemplate
91+
alchemy=pyramid.scaffolds:AlchemyProjectTemplate
9292
[glue.command]
9393
pshell=pyramid.paster:PShellCommand
9494
proutes=pyramid.paster:PRoutesCommand
9595
pviews=pyramid.paster:PViewsCommand
9696
ptweens=pyramid.paster:PTweensCommand
9797
[console_scripts]
9898
bfg2pyramid = pyramid.fixers.fix_bfg_imports:main
99+
pcreate = pyramid.scripts.pcreate:main
99100
"""
100101
)
101102

0 commit comments

Comments
 (0)