Changeset 18:432718b59587

Show
Ignore:
Timestamp:
07/17/08 00:11:51 (5 years ago)
Author:
Nicolas Evrard <nicoe@…>
Branch:
default
Message:

- correctly import StringIO

  • Allow the use of genshi filters on odt templates
    • divided the odt templates in three parts to stop abusing generate
      a Template object, a OOStream object, a OOSerializer object
    • the stream object is responsible for storing the stream of genshi events
      related to content.xml
    • the serializer object knows how to render a stream of event as if it was
      a specific oo file
  • Fixed tests
    • we can now use the events for testing
    • ported test.odt to the new directive syntax
  • The templates and the report are now meant to return genshi streams it is up
    to the framework implementer to call render on them or continue processing
    them.
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • relatorio.egg-info/entry_points.txt

    r16 r18  
    11[relatorio.templates.engines] 
    22oo.org = relatorio.templates.odt:Template 
    3 trml = relatorio.templates.trml:Template 
    43pdf = relatorio.templates.pdf:Template 
    54text = genshi.template:TextTemplate 
  • relatorio/reporting.py

    r16 r18  
    1919############################################################################### 
    2020 
    21 __revision__ = "$Id: reporting.py 17 2008-07-15 10:26:58Z nicoe $" 
     21__revision__ = "$Id: reporting.py 19 2008-07-17 00:11:51Z nicoe $" 
    2222__metaclass__ = type 
    2323 
    2424import os, sys 
    2525import warnings 
    26 import cStringIO 
     26from cStringIO import StringIO 
    2727 
    2828import pkg_resources 
     
    104104        self.data_factory = factory 
    105105        self.tmpl_loader = loader 
     106        self.filters = [] 
    106107 
    107108    def __call__(self, obj, **kwargs): 
    108109        template = self.tmpl_loader.load(self.fpath, self.mimetype) 
    109110        data = self.data_factory(obj, **kwargs) 
    110         report = template.generate(**data) 
    111         if not isinstance(report, (cStringIO.InputType, cStringIO.OutputType)): 
    112             report = StringIO(str(report)) 
    113         return report 
     111        return template.generate(**data).filter(*self.filters) 
    114112 
    115113    def __repr__(self): 
  • relatorio/templates/odt.py

    r13 r18  
    1919############################################################################### 
    2020 
    21 __revision__ = "$Id: odt.py 14 2008-07-14 22:09:55Z nicoe $" 
     21__revision__ = "$Id: odt.py 19 2008-07-17 00:11:51Z nicoe $" 
    2222__metaclass__ = type 
    2323 
     
    2929 
    3030import lxml.etree 
     31import genshi 
    3132from genshi.template import Template as GenshiTemplate, MarkupTemplate 
    3233 
     
    179180 
    180181    def generate(self, *args, **kwargs): 
    181         new_oo = StringIO() 
    182         inzip = zipfile.ZipFile(self.filepath) 
    183         outzip = zipfile.ZipFile(new_oo, 'w') 
    184  
    185         kwargs['make_href'] = ImageHref(outzip) 
    186         content = str(self.content_template.generate(*args, **kwargs)) 
    187  
    188         for f in inzip.infolist(): 
     182        serializer = OOSerializer(self.filepath) 
     183        kwargs['make_href'] = ImageHref(serializer.outzip) 
     184        content_stream = self.content_template.generate(*args, **kwargs) 
     185 
     186        return OOStream(content_stream, serializer) 
     187 
     188 
     189class OOStream(genshi.core.Stream): 
     190 
     191    def __init__(self, content_stream, serializer): 
     192        self.events = content_stream 
     193        self.serializer = serializer 
     194 
     195    def render(self, method=None, encoding='utf-8', out=None, **kwargs): 
     196        return self.serializer(self.events) 
     197 
     198    def serialize(self, method, **kwargs): 
     199        return self.render(method, **kwargs) 
     200 
     201    def __or__(self, function): 
     202        return OOStream(self.events | function, self.serializer) 
     203 
     204 
     205class OOSerializer: 
     206 
     207    def __init__(self, oo_path): 
     208        self.inzip = zipfile.ZipFile(oo_path) 
     209        self.new_oo = StringIO() 
     210        self.outzip = zipfile.ZipFile(self.new_oo, 'w') 
     211 
     212    def __call__(self, stream): 
     213        for f in self.inzip.infolist(): 
    189214            if f.filename == 'content.xml': 
    190215                s = StringIO() 
    191                 s.write(str(content)) 
    192                 outzip.writestr('content.xml', s.getvalue()) 
    193             else: 
    194                 outzip.writestr(f, inzip.read(f.filename)) 
    195         inzip.close() 
    196         outzip.close() 
    197  
    198         return new_oo 
    199  
     216                s.write(str(stream)) 
     217                self.outzip.writestr('content.xml', s.getvalue()) 
     218            else: 
     219                self.outzip.writestr(f, self.inzip.read(f.filename)) 
     220        self.inzip.close() 
     221        self.outzip.close() 
     222 
     223        return self.new_oo 
  • relatorio/tests/test_api.py

    r0 r18  
    1919############################################################################### 
    2020 
    21 __revision__ = "$Id: test_api.py 1 2008-07-04 14:31:52Z nicoe $" 
     21__revision__ = "$Id: test_api.py 19 2008-07-17 00:11:51Z nicoe $" 
    2222 
    2323import os 
     
    2727                       DefaultFactory, _absolute) 
    2828 
     29 
    2930class StubObject(object): 
    3031 
     
    3233        for key, val in kwargs.iteritems(): 
    3334            setattr(self, key, val) 
     35 
     36def setup(): 
     37    MIMETemplateLoader.load_template_engines() 
    3438 
    3539 
     
    7478        "Testing the report generation" 
    7579        a = StubObject(name='OpenHex') 
    76         eq_(self.report(a).getvalue(), 'Hello OpenHex.\n') 
     80        eq_(self.report(a).render(), 'Hello OpenHex.\n') 
    7781 
    7882    def test_factory(self): 
     
    9296 
    9397        a = StubObject(name='Foo') 
    94         eq_(report(a, time="One o'clock").getvalue(),  
     98        eq_(report(a, time="One o'clock").render(),  
    9599            "Hi Foo,\nIt's One o'clock to 2 !\n") 
    96         eq_(report(a, time="One o'clock", y=4).getvalue(),  
     100        eq_(report(a, time="One o'clock", y=4).render(),  
    97101            "Hi Foo,\nIt's One o'clock to 5 !\n") 
    98102        assert_raises(TypeError, report, a)  
  • relatorio/tests/test_odt.py

    r0 r18  
     1# -*- encoding: utf-8 -*- 
    12############################################################################### 
    23# 
     
    1920############################################################################### 
    2021 
    21 __revision__ = "$Id: test_odt.py 1 2008-07-04 14:31:52Z nicoe $" 
     22__revision__ = "$Id: test_odt.py 19 2008-07-17 00:11:51Z nicoe $" 
    2223 
    2324import os 
     
    2728from nose.tools import * 
    2829from genshi.template import MarkupTemplate 
     30from genshi.filters import Translator 
    2931 
    30 from mimetypes.odt import OOTemplate, NS 
     32from templates.odt import Template, NS 
     33 
     34def pseudo_gettext(string): 
     35    catalog = {'Mes collègues sont:': 'My collegues are:', 
     36               'Bonjour,': 'Hello,', 
     37               'Je suis un test de templating en odt.':  
     38                'I am an odt templating test', 
     39               'Felix da housecat': unicode('Félix le chat de la maison', 
     40                                            'utf8'), 
     41              } 
     42    return catalog.get(string, string) 
    3143 
    3244 
     
    3648        thisdir = os.path.dirname(__file__) 
    3749        filepath = os.path.join(thisdir, 'test.odt') 
    38         self.oot = OOTemplate(file(filepath), filepath) 
     50        self.oot = Template(file(filepath), filepath) 
     51        self.data = {'first_name': 'Trente', 
     52                     'last_name': unicode('Møller', 'utf8'), 
     53                     'ville': unicode('Liège', 'utf8'), 
     54                     'friends': [{'first_name': 'Camille',  
     55                                  'last_name': 'Salauhpe'}, 
     56                                 {'first_name': 'Mathias', 
     57                                  'last_name': 'Lechat'}], 
     58                     'hobbies': ['Music', 'Dancing', 'DJing'], 
     59                     'animals': ['Felix da housecat', 'Dog eat Dog']} 
    3960 
    4061    def test_init(self): 
     
    5071        eq_(root_parsed[0].attrib['{http://genshi.edgewall.org/}replace'],  
    5172            'foo') 
     73 
     74    def test_generate(self): 
     75        stream = self.oot.generate(**self.data) 
     76        rendered = stream.events.render() 
     77        assert 'Bonjour,' in rendered 
     78        assert 'Trente' in rendered 
     79        assert 'Møller' in rendered 
     80        assert 'Dog eat Dog' in rendered 
     81        assert 'Felix da housecat' in rendered 
     82 
     83    def test_filters(self): 
     84        stream = self.oot.generate(**self.data) 
     85        translated = stream.filter(Translator(pseudo_gettext)) 
     86        content_xml = translated.events.render() 
     87        assert "Hello," in content_xml 
     88        assert "I am an odt templating test" in content_xml 
     89        assert 'Felix da housecat' not in content_xml 
     90        assert 'Félix le chat de la maison' in content_xml