Edgewall Software

Ticket #2669: pipelining_conversions.patch

File pipelining_conversions.patch, 3.4 KB (added by cboos, 6 years ago)

Simple pipelining of conversion (patch on r3307).

  • trac/mimeview/api.py

     
    253253        """Return a list of target MIME types in same form as 
    254254        `IContentConverter.get_supported_conversions()`, but with the converter 
    255255        component appended. Output is ordered from best to worst quality.""" 
     256        return sorted(self._get_all_conversions(mimetype, [], {}), 
     257                      key=lambda i: i[-1], reverse=True) 
     258 
     259    def _get_all_conversions(self, mimetype, pipeline, knowntypes): 
    256260        converters = [] 
    257261        for converter in self.converters: 
    258262            for k, n, e, im, om, q in converter.get_supported_conversions(): 
    259263                if im == mimetype and q > 0: 
    260                     converters.append((k, n, e, im, om, q, converter)) 
    261         converters = sorted(converters, key=lambda i: i[-1], reverse=True) 
     264                    newpipeline = [(converter,im,k)] + pipeline 
     265                    converters.append((k, n, e, im, om, q, newpipeline)) 
     266                    if not om in knowntypes: 
     267                        knowntypes[om] = True 
     268                        converters += self._get_all_conversions( 
     269                            om, newpipeline, knowntypes) 
    262270        return converters 
    263271 
    264272    def convert_content(self, req, mimetype, content, key, filename=None, 
     
    288296                            (mimetype, key)) 
    289297 
    290298        # First candidate which converts successfully wins. 
    291         for ck, name, ext, input_mimettype, output_mimetype, quality, \ 
    292                 converter in candidates: 
     299        for key, name, ext, input_mimettype, output_mimetype, quality, \ 
     300                pipeline in candidates: 
    293301            try: 
    294                 output = converter.convert_content(req, mimetype, content, ck) 
     302                output = (content, None) 
     303                while pipeline: 
     304                    converter, imimetype, ikey = pipeline.pop() 
     305                    output = converter.convert_content(req, imimetype, 
     306                                                       output[0], ikey) 
    295307                if not output: 
    296308                    continue 
    297309                return (output[0], output[1], ext) 
  • trac/ticket/web_ui.py

     
    208208 
    209209    def get_supported_conversions(self): 
    210210        yield ('csv', 'Comma-delimited Text', 'csv', 
    211                'trac.ticket.model.Ticket', 'text/plain', 9) 
     211               'trac.ticket.model.Ticket', 'text/csv', 9) 
    212212        yield ('tab', 'Tab-delimited Text', 'csv', 'trac.ticket.model.Ticket', 
    213213               'text/plain', 9) 
    214214        yield ('rss', 'RSS Feed', 'xml', 'trac.ticket.model.Ticket', 
  • trac/ticket/query.py

     
    352352        yield ('rss', 'RSS Feed', 'xml', 'trac.ticket.query', 
    353353               'application/rss+xml', 9) 
    354354        yield ('csv', 'Comma-delimited Text', 'csv', 
    355                'trac.ticket.query', 'text/plain', 9) 
     355               'trac.ticket.query', 'text/csv', 9) 
    356356        yield ('tab', 'Tab-delimited Text', 'csv', 'trac.ticket.query', 
    357357               'text/plain', 9) 
    358358