0001import os
0002import glob
0003from paste.script.command import Command, BadCommand
0004from paste.script import pluginlib, copydir
0005
0006class ServletCommand(Command):
0007
0008 summary = "Create servlet"
0009 usage = 'SERVLET_NAME'
0010
0011 min_args = 1
0012 max_args = 1
0013 default_verbosity = 1
0014
0015 parser = Command.standard_parser(simulate=True, quiet=True,
0016 interactive=True, overwrite=True)
0017 parser.add_option('--no-servlet',
0018 action='store_true',
0019 dest='no_servlet',
0020 help="Don't create a servlet; just template(s)")
0021
0022 group_name = 'Paste WebKit'
0023
0024 def command(self):
0025 servlet = self.args[0]
0026 if servlet.endswith('.py'):
0027
0028 servlet = servlet[:-3]
0029 if '.' in servlet:
0030
0031 servlet = servlet.replace('.', os.path.sep)
0032 if '/' != os.path.sep:
0033 servlet = servlet.replace('/', os.path.sep)
0034 parts = servlet.split(os.path.sep)
0035 name = parts[-1]
0036 base_package, base = self.web_dir()
0037 if not parts[:-1]:
0038 dir = ''
0039 elif len(parts[:-1]) == 1:
0040 dir = parts[0]
0041 else:
0042 dir = os.path.join(*parts[:-1])
0043
0044 vars = {'name': name,
0045 'base_package': base_package}
0046
0047 if not self.options.no_servlet:
0048 self.create_servlet(
0049 base_package, base, dir, name, vars)
0050
0051 template_base = os.path.join(os.path.dirname(base), 'templates')
0052 if not os.path.exists(template_base):
0053 if self.verbose > 1:
0054 print 'No template directory %s' % template_base
0055 return
0056
0057 blanks = glob.glob(os.path.join(base, template_base, 'blank.*'))
0058 if not blanks and self.verbose:
0059 print 'No blank templates found in %s' % self.shorten(template_base)
0060
0061 for blank in blanks:
0062 self.create_blank(
0063 blank, template_base, dir, name, vars)
0064
0065 def create_servlet(self, base_package, base, dir, name, vars):
0066 self.ensure_dir(os.path.join(base, dir))
0067 blank = os.path.join(base, 'blank.py')
0068 if not os.path.exists(blank):
0069 blank = os.path.join(os.path.dirname(__file__),
0070 'paster_templates',
0071 'blank_servlet.py_tmpl')
0072 f = open(blank, 'r')
0073 content = f.read()
0074 f.close()
0075 if blank.endswith('_tmpl'):
0076 content = copydir.substitute_content(content, vars,
0077 filename=blank)
0078 dest = os.path.join(base, dir, '%s.py' % name)
0079 self.ensure_file(dest, content)
0080
0081 def create_blank(self, blank, template_base, dir, name, vars):
0082 ext = os.path.splitext(blank)[1]
0083 f = open(blank, 'r')
0084 content = f.read()
0085 f.close()
0086 if ext.endswith('_tmpl'):
0087 content = copydir.substitute_content(
0088 content, vars, filename=blank)
0089 ext = ext[:-5]
0090 dest = os.path.join(template_base, dir, name + ext)
0091 self.ensure_dir(os.path.dirname(dest))
0092 self.ensure_file(dest, content)
0093
0094 def web_dir(self):
0095 egg_info = pluginlib.find_egg_info_dir(os.getcwd())
0096
0097 f = open(os.path.join(egg_info, 'top_level.txt'))
0098 packages = [l.strip() for l in f.readlines()
0099 if l.strip() and not l.strip().startswith('#')]
0100 f.close()
0101
0102
0103 base = os.path.dirname(egg_info)
0104 possible = []
0105 for pkg in packages:
0106 d = os.path.join(base, pkg, 'web')
0107 if os.path.exists(d):
0108 possible.append((pkg, d))
0109 if not possible:
0110 raise BadCommand(
0111 "No web package found (looked in %s)"
0112 % ', '.join(packages))
0113 if len(possible) > 1:
0114 raise BadCommand(
0115 "Multiple web packages found (%s)" % possible)
0116 return possible[0]