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            # Erase extensions
0028            servlet = servlet[:-3]
0029        if '.' in servlet:
0030            # Turn into directory name:
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        # @@: Should give error about egg_info when top_leve.txt missing
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        # @@: This doesn't support deeper servlet directories,
0102        # or packages not kept at the top level.
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]