Package translate :: Package storage :: Module test_poheader

[hide private]
[frames] | no frames]

# Source Code for Module translate.storage.test_poheader

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3
      4  import os, time
      5  from translate.storage import po
      6  from translate.storage import poxliff
      7  from translate.storage import poheader
      8  from translate.misc.dictutils import ordereddict
      9  from translate.misc import wStringIO
     10
     11
     12 -def test_parseheaderstring():
     13      """ test for the header parsing function"""
     14      source = r'''item1: one
     15  item2: two:two
     16  this item must get ignored because there is no colon sign in it
     17  item3: three
     18  '''
     19      d = poheader.parseheaderstring(source)
     20      print type(d)
     21      assert type(d) == ordereddict
     22      assert len(d) == 3
     23      assert d['item1'] == 'one'
     24      assert d['item2'] == 'two:two'
     25      assert d['item3'] == 'three'
     26
     27 -def test_update():
     28      '''test the update function'''
     29      # do we really add nothing if add==False ?
     30      d = poheader.update({}, test='hello')
     31      assert len(d) == 0
     32      # do we add if add==True ?
     33      d = poheader.update({}, add=True, Test='hello')
     34      assert len(d) == 1
     35      assert d['Test'] == 'hello'
     36      # do we really update ?
     37      d = poheader.update({'Test':'hello'}, add=True, Test='World')
     38      assert len(d) == 1
     39      assert d['Test'] == 'World'
     40      # does key rewrite work ?
     41      d = poheader.update({}, add=True, test_me='hello')
     42      assert d['Test-Me'] == 'hello'
     43      # is the order correct ?
     44      d = ordereddict()
     45      d['Project-Id-Version'] = 'abc'
     46      d['POT-Creation-Date'] = 'now'
     47      d = poheader.update(d, add=True, Test='hello', Report_Msgid_Bugs_To='bugs@list.org')
     48      assert d.keys()[0] == "Project-Id-Version"
     49      assert d.keys()[1] == "Report-Msgid-Bugs-To"
     50      assert d.keys()[2] == "POT-Creation-Date"
     51      assert d.keys()[3] == "Test"
     52
     53
     54 -def poparse(posource):
     55      """helper that parses po source without requiring files"""
     56      dummyfile = wStringIO.StringIO(posource)
     57      return po.pofile(dummyfile)
     58
     59 -def poxliffparse(posource):
     60      """helper that parses po source into poxliffFile"""
     61      poxli = poxliff.PoXliffFile()
     62      poxli.parse(posource)
     63      return poxli
     64
     65 -def check_po_date(datestring):
     66      """Check the validity of a PO date.
     67
     68      The datestring must be in the format: 2007-06-08 10:08+0200
     69      """
     70
     71      # We don't include the timezone offset as part of our format,
     72      # because time.strptime() does not recognize %z
     73      # The use of %z is deprecated in any case.
     74      date_format = "%Y-%m-%d %H:%M"
     75
     76      # Get the timezone offset (last 4 digits):
     77      tz = datestring[-4:]
     78      assert type(int(tz)) == int
     79
     80      # Strip the timezone from the string, typically something like "+0200".
     81      # This is to make the datestring conform to the specified format,
     82      # we can't add %z to the format.
     83      datestring = datestring[0:-5]
     84
     85      # Check that the date can be parsed
     86      assert type(time.strptime(datestring, date_format)) == time.struct_time
     87
     88 -def test_po_dates():
     89      pofile = po.pofile()
     90      headerdict = pofile.makeheaderdict(po_revision_date=True)
     91      check_po_date(headerdict["POT-Creation-Date"])
     92      check_po_date(headerdict["PO-Revision-Date"])
     93
     94      headerdict = pofile.makeheaderdict(pot_creation_date=time.localtime(),
     95          po_revision_date=time.localtime())
     96      check_po_date(headerdict["POT-Creation-Date"])
     97      check_po_date(headerdict["PO-Revision-Date"])
     98
     99 -def test_timezones():
    100      pofile = po.pofile()
    101
    102      # The following will only work on Unix because of tzset() and %z
    103      if time.__dict__.has_key('tzset'):
    104          os.environ['TZ'] = 'Asia/Kabul'
    105          time.tzset()
    106          assert time.timezone == -16200
    107          # Typically "+0430"
    108          assert poheader.tzstring() == time.strftime("%z")
    109
    110          os.environ['TZ'] = 'Asia/Tehran'
    111          time.tzset()
    112          assert time.timezone == -12600
    113          # Typically "+0330"
    114          assert poheader.tzstring() == time.strftime("%z")
    115
    116          os.environ['TZ'] = 'Canada/Newfoundland'
    117          time.tzset()
    118          assert time.timezone == 12600
    119          # Typically "-0230"
    120          assert poheader.tzstring() == time.strftime("%z")
    121
    122          os.environ['TZ'] = 'US/Eastern'
    123          time.tzset()
    124          assert time.timezone == 18000
    125          # Typically "-0400"
    126          assert poheader.tzstring() == time.strftime("%z")
    127
    128          os.environ['TZ'] = 'Asia/Seoul'
    129          time.tzset()
    130          assert time.timezone == -32400
    131          # Typically "+0900"
    132          assert poheader.tzstring() == time.strftime("%z")
    133
    134          os.environ['TZ'] = 'Africa/Johannesburg'
    135          time.tzset()
    136          assert time.timezone == -7200
    137          # Typically "+0200"
    138          assert poheader.tzstring() == time.strftime("%z")
    139
    140          os.environ['TZ'] = 'Africa/Windhoek'
    141          time.tzset()
    142          assert time.timezone == -3600
    143          # Typically "+0100"
    144          # For some reason python's %z doesn't know about Windhoek DST
    145          #assert poheader.tzstring() == time.strftime("%z")
    146
    147          os.environ['TZ'] = 'Egypt'
    148          time.tzset()
    149          assert time.timezone == -7200
    150          # Typically "+0300"
    151          assert poheader.tzstring() == time.strftime("%z")
    152
    153          os.environ['TZ'] = 'UTC'
    154          time.tzset()
    155          assert time.timezone == 0
    156          # Typically "+0000"
    157          assert poheader.tzstring() == time.strftime("%z")
    158
    159 -def test_header_blank():
    160
    161      def compare(pofile):
    162          print pofile
    163          assert len(pofile.units) == 1
    164          header = pofile.header()
    165          assert header.isheader()
    166          assert not header.isblank()
    167
    168          headeritems = pofile.parseheader()
    169          assert headeritems["Project-Id-Version"] == "PACKAGE VERSION"
    170          assert headeritems["Report-Msgid-Bugs-To"] == ""
    171          check_po_date(headeritems["POT-Creation-Date"])
    172          assert headeritems["PO-Revision-Date"] == "YEAR-MO-DA HO:MI+ZONE"
    173          assert headeritems["Last-Translator"] == "FULL NAME <EMAIL@ADDRESS>"
    174          assert headeritems["Language-Team"] == "LANGUAGE <LL@li.org>"
    175          assert headeritems["MIME-Version"] == "1.0"
    176          assert headeritems["Content-Type"] == "text/plain; charset=UTF-8"
    177          assert headeritems["Content-Transfer-Encoding"] == "8bit"
    178          assert headeritems["Plural-Forms"] == "nplurals=INTEGER; plural=EXPRESSION;"
    179
    180
    181      """test header functionality"""
    182      posource = r'''# other comment\n
    183  msgid ""
    184  msgstr ""
    185  "Project-Id-Version: PACKAGE VERSION\n"
    186  "Report-Msgid-Bugs-To: \n"
    187  "POT-Creation-Date: 2006-03-08 17:30+0200\n"
    188  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    189  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    190  "Language-Team: LANGUAGE <LL@li.org>\n"
    191  "MIME-Version: 1.0\n"
    192  "Content-Type: text/plain; charset=UTF-8\n"
    193  "Content-Transfer-Encoding: 8bit\n"
    194  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
    195  '''
    196      pofile = poparse(posource)
    197      compare(pofile)
    198
    199  ## TODO: enable this code if PoXliffFile is able to parse a header
    200  ##
    201  ##    poxliffsource = r'''<?xml version="1.0" encoding="utf-8"?>
    202  ##<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
    203  ##
    204  ##<file datatype="po" original="test.po" source-language="en-US"><body><trans-unit approved="no" id="1" restype="x-gettext-domain-header" xml:space="preserve"><source>Project-Id-Version: PACKAGE VERSION
    205  ##Report-Msgid-Bugs-To:
    206  ##POT-Creation-Date: 2006-03-08 17:30+0200
    207  ##PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
    208  ##Last-Translator: FULL NAME <ph id="1">&lt;EMAIL@ADDRESS&gt;</ph>
    209  ##Language-Team: LANGUAGE <ph id="2">&lt;LL@li.org&gt;</ph>
    210  ##MIME-Version: 1.0
    211  ##Content-Type: text/plain; charset=UTF-8
    212  ##Content-Transfer-Encoding: 8bit
    213  ##Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;
    214  ##</source><target>Project-Id-Version: PACKAGE VERSION
    215  ##Report-Msgid-Bugs-To:
    216  ##POT-Creation-Date: 2006-03-08 17:30+0200
    217  ##PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
    218  ##Last-Translator: FULL NAME <ph id="1">&lt;EMAIL@ADDRESS&gt;</ph>
    219  ##Language-Team: LANGUAGE <ph id="2">&lt;LL@li.org&gt;</ph>
    220  ##MIME-Version: 1.0
    221  ##Content-Type: text/plain; charset=UTF-8
    222  ##Content-Transfer-Encoding: 8bit
    223  ##Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;
    224  ##</target><context-group name="po-entry" purpose="information"><context context-type="x-po-trancomment">other comment\n</context></context-group><note from="po-translator">other comment\n</note></trans-unit></body></file></xliff>
    225  ##'''
    226  ##    pofile = poparse(poxliffsource)
    227  ##    compare(pofile)
    228
    229
    230 -def test_plural_equation():
    231      """test that we work with the equation even is the last semicolon is left out, since gettext
    232      tools don't seem to mind"""
    233      posource = r'''msgid ""
    234  msgstr ""
    235  "Plural-Forms: nplurals=2; plural=(n != 1)%s\n"
    236  '''
    237      for colon in ("", ";"):
    238          pofile = poparse(posource % colon)
    239          print pofile
    240          assert len(pofile.units) == 1
    241          header = pofile.units[0]
    242          assert header.isheader()
    243          assert not header.isblank()
    244
    245          headeritems = pofile.parseheader()
    246          nplural, plural = pofile.getheaderplural()
    247          assert nplural == "2"
    248          assert plural == "(n != 1)"
    249  ##    TODO: add the same test for PoXliffFile
    250
    251 -def test_plural_equation_across_lines():
    252      """test that we work if the plural equation spans more than one line"""
    253      posource = r'''msgid ""
    254  msgstr ""
    255  "Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
    256  "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
    257  '''
    258      pofile = poparse(posource)
    259      print pofile
    260      assert len(pofile.units) == 1
    261      header = pofile.units[0]
    262      assert header.isheader()
    263      assert not header.isblank()
    264
    265      headeritems = pofile.parseheader()
    266      nplural, plural = pofile.getheaderplural()
    267      assert nplural == "3"
    268      assert plural == "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)"
    269  ##    TODO: add the same test for PoXliffFile
    270