Changeset 49

Show
Ignore:
Timestamp:
07/24/07 13:09:55 (1 year ago)
Author:
edsuom
Message:

Latest work on foss.tellectual.com example; using proper-case project names for repo subdirs

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • projects/Twisted-Goodies/trunk/misc/var_www_foss.tellectual.com_index.py

    r48 r49  
    7474 
    7575 
    76 def projectURL(projectName): 
    77     """ 
    78     """ 
    79     return "/trac/%s/wiki/Start_%s" % (projectName, projectName) 
    80  
    81  
    82 class API(object): 
    83     """ 
    84     """ 
    85     def __init__(self, vhostPath, projectName, request): 
    86         self.packageName = projectName.lower().replace("-", "_") 
    87         path = "/api/%s/%s.html" % (projectName, self.packageName) 
    88         newURL = (request.scheme, request.host, path, '', '', '') 
    89         filePath = ospath.join(vhostPath, newURL[2].lstrip("/")) 
    90         if ospath.exists(filePath): 
    91             d = defer.succeed(None) 
    92         else: 
    93             tmpDir = tempfile.mkdtemp() 
    94             d = self.svn(tmpDir, projectName) 
    95             d.addCallback( 
    96                 lambda _: self.pydoctor(tmpDir, vhostPath, projectName)) 
    97             d.addCallback(lambda _: shutil.rmtree(tmpDir)) 
    98         d.addCallback(lambda _: (resource.RedirectResource(*newURL), ())) 
    99         self.d = d 
    100  
    101     def executable(self, name): 
    102         """ 
    103         """ 
     76class APIDocResource(resource.Resource): 
     77    """ 
     78    """ 
     79    def __init__(self, vhostPath, projectURLProto, projectRepoProto): 
     80        self.vhostPath = vhostPath 
     81        for name in ('projectURLProto', 'projectRepoProto'): 
     82            string = locals()[name] 
     83            if "%s" not in string: 
     84                raise ValueError("Invalid string prototype '%s'" % string) 
     85            setattr(self, name, string) 
     86 
     87    def _executable(self, name): 
    10488        result = procutils.which(name)[0] 
    10589        if not result: 
    10690            raise ImportError("Can't locate %s executable" % name) 
    10791 
    108     def svn(self, tmpDir, vhostPath, projectName): 
    109         """ 
    110         TODO 
    111         """ 
    112         return defer.succeed(None) 
     92    def locateChild(self, request, segments): 
     93        """ 
     94        """ 
     95        def ready(null): 
     96            urlPath = "/api/%s/%s" % (projectName, apiFile) 
     97            newURL = (request.scheme, request.host, urlPath, '', '', '') 
     98            return resource.RedirectResource(*newURL), () 
     99         
     100        projectName = segments[0] 
     101        packageName = projectName.lower().replace("-", "_") 
     102        if len(segments) > 1: 
     103            apiFile = segments[1] 
     104        else: 
     105            apiFile = "%s.html" % packageName 
     106        d = defer.maybeDeferred( 
     107            self.ensureDocsPresent, projectName, packageName, apiFile) 
     108        d.addCallback(ready) 
     109        return d 
     110 
     111    def ensureDocsPresent(self, projectName, packageName, apiFile): 
     112        """ 
     113        """ 
     114        filePath = ospath.join(self.vhostPath, 'api', projectName, apiFile) 
     115        if False and not ospath.exists(filePath): 
     116            tmpDir = tempfile.mkdtemp() 
     117            d = self.svn(tmpDir, projectName) 
     118            d.addCallback(lambda _: self.pydoctor(tmpDir, projectName)) 
     119            d.addCallback(lambda _: shutil.rmtree(tmpDir)) 
     120            return d 
     121 
     122    def svn(self, tmpDir, projectName): 
     123        """ 
     124        """ 
     125        repo = self.projectRepoProto % projectName 
     126        args = [ 
     127            "export", "-q", "--force", 
     128            "%s/%s/trunk" % (repo, projectName)] 
     129        return util.getProcessValue( 
     130            self._executable('svn'), args=args, path=tmpDir) 
    113131 
    114132    def pydoctor(self, tmpDir, vhostPath, projectName): 
    115133        """ 
    116         TODO 
    117         """ 
    118         return 
    119         # TODO: Nothing below does anything yet 
     134        """ 
     135        url = self.projectURLProto % projectName 
    120136        args = [ 
    121             "--add-package=%s" % self.packageName, 
     137            "--add-package=%s" % packageName, 
    122138            "--project-name=%s" % projectName, 
    123139            "--make-html", 
    124             "--html-output=%s/api/%s" % (vhostPath, projectName), 
    125             "--project-url=%s" % projectURL(projectName)] 
     140            "--html-output=%s/api/%s" % (self.vhostPath, projectName), 
     141            "--project-url=%s%s" % (url, projectName)] 
    126142        return util.getProcessValue( 
    127             self.executable('pydoctor'), args=args, path=tmpDir) 
    128      
     143            self._executable('pydoctor'), args=args, path=tmpDir) 
     144 
    129145 
    130146class Resource(StanResource): 
     
    135151    addSlash = True 
    136152    wrapper = TextWrapper(break_long_words=False) 
     153    projectURLProto = "/trac/%s/wiki" 
     154    projectRepoProto = "file:///var/svn/foss/projects/%s/trunk" 
    137155     
    138156    def __init__(self, vhostPath): 
    139157        self.vhostPath = vhostPath 
     158        self.apiDocResource = APIDocResource( 
     159            vhostPath, self.projectURLProto, self.projectRepoProto) 
    140160        self.title = "Ed Suominen's Free & Open Source Software Projects" 
    141161        self.style = { 
     
    176196            projectDescription = " ".join( 
    177197                [x.strip() for x in doc.strip().split("\n")]) 
    178             href = projectURL(projectName) 
     198            href = self.projectURLProto % projectName 
    179199            projectDiv = [ 
    180200                T.a(id="project_link", href=href)[projectName]] 
     
    233253            request.uri = request.uri.rstrip("/") + addition 
    234254 
    235         projectName, subSegments = segments[0], segments[1:] 
     255        projectName, subSegments = segments[0], list(segments[1:]) 
    236256        if not subSegments: 
    237257            extendRequest('wiki') 
    238258        root = subSegments[0] 
     259        if root == 'api': 
     260            return self.apiDocResource, [projectName] + subSegments[1:] 
    239261        if len(subSegments) == 1: 
    240262            if root == 'wiki': 
     
    242264            elif root == 'browser': 
    243265                extendRequest('projects', projectName.lower(), 'trunk') 
    244             elif root == 'api': 
    245                 return API(self.vhostPath, projectName, request).d 
    246266        possibleResult = self._possibleStatic('trac', *subSegments) 
    247267        if possibleResult: