2011-04-18 21:02:57 +00:00
# -*- encoding: utf-8 -*-
2012-12-08 10:13:52 +00:00
from __future__ import unicode_literals
2011-12-11 00:48:26 +00:00
2010-02-21 23:45:04 +00:00
import os
import re
import shutil
2011-10-13 21:34:56 +00:00
2010-02-21 23:45:04 +00:00
from django . core import management
2011-10-13 21:34:56 +00:00
from django . test import TestCase
2012-12-08 10:13:52 +00:00
from django . utils . encoding import force_text
from django . utils . _os import upath
2012-08-07 13:41:54 +00:00
from django . utils . six import StringIO
2011-10-13 21:34:56 +00:00
2010-02-21 23:45:04 +00:00
LOCALE = ' de '
class ExtractorTests ( TestCase ) :
PO_FILE = ' locale/ %s /LC_MESSAGES/django.po ' % LOCALE
def setUp ( self ) :
self . _cwd = os . getcwd ( )
2012-12-08 10:13:52 +00:00
self . test_dir = os . path . abspath ( os . path . dirname ( upath ( __file__ ) ) )
2010-02-21 23:45:04 +00:00
def _rmrf ( self , dname ) :
if os . path . commonprefix ( [ self . test_dir , os . path . abspath ( dname ) ] ) != self . test_dir :
return
shutil . rmtree ( dname )
def tearDown ( self ) :
os . chdir ( self . test_dir )
try :
self . _rmrf ( ' locale/ %s ' % LOCALE )
except OSError :
pass
os . chdir ( self . _cwd )
2010-11-04 12:08:37 +00:00
def assertMsgId ( self , msgid , s , use_quotes = True ) :
2011-12-11 00:07:06 +00:00
q = ' " '
2010-11-04 12:08:37 +00:00
if use_quotes :
msgid = ' " %s " ' % msgid
2011-12-11 00:07:06 +00:00
q = " ' "
needle = ' msgid %s ' % msgid
2011-06-07 16:11:25 +00:00
msgid = re . escape ( msgid )
2011-12-11 00:07:06 +00:00
return self . assertTrue ( re . search ( ' ^msgid %s ' % msgid , s , re . MULTILINE ) , ' Could not find %(q)s %(n)s %(q)s in generated PO file ' % { ' n ' : needle , ' q ' : q } )
2010-02-21 23:45:04 +00:00
2010-11-04 12:08:37 +00:00
def assertNotMsgId ( self , msgid , s , use_quotes = True ) :
if use_quotes :
msgid = ' " %s " ' % msgid
2011-06-07 16:11:25 +00:00
msgid = re . escape ( msgid )
2011-03-03 15:04:39 +00:00
return self . assertTrue ( not re . search ( ' ^msgid %s ' % msgid , s , re . MULTILINE ) )
2010-02-21 23:45:04 +00:00
2010-11-17 15:37:33 +00:00
class BasicExtractorTests ( ExtractorTests ) :
def test_comments_extractor ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #. Translators: This comment should be extracted ' in po_contents )
self . assertTrue ( ' This comment should not be extracted ' not in po_contents )
# Comments in templates
self . assertTrue ( ' #. Translators: Django template comment for translators ' in po_contents )
self . assertTrue ( " #. Translators: Django comment block for translators \n #. string ' s meaning unveiled " in po_contents )
2011-03-19 12:56:38 +00:00
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #. Translators: One-line translator comment #1 ' in po_contents )
self . assertTrue ( ' #. Translators: Two-line translator comment #1 \n #. continued here. ' in po_contents )
2011-03-19 12:56:38 +00:00
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #. Translators: One-line translator comment #2 ' in po_contents )
self . assertTrue ( ' #. Translators: Two-line translator comment #2 \n #. continued here. ' in po_contents )
2011-03-19 12:56:38 +00:00
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #. Translators: One-line translator comment #3 ' in po_contents )
self . assertTrue ( ' #. Translators: Two-line translator comment #3 \n #. continued here. ' in po_contents )
2011-03-19 12:56:38 +00:00
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #. Translators: One-line translator comment #4 ' in po_contents )
self . assertTrue ( ' #. Translators: Two-line translator comment #4 \n #. continued here. ' in po_contents )
2010-11-04 14:06:24 +00:00
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #. Translators: One-line translator comment #5 -- with non ASCII characters: áéíóúö ' in po_contents )
self . assertTrue ( ' #. Translators: Two-line translator comment #5 -- with non ASCII characters: áéíóúö \n #. continued here. ' in po_contents )
2011-04-18 21:02:57 +00:00
2011-12-11 00:07:06 +00:00
def test_templatize_trans_tag ( self ) :
# ticket #11240
2010-11-04 14:06:24 +00:00
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertMsgId ( ' Literal with a percent symbol at the end %% ' , po_contents )
self . assertMsgId ( ' Literal with a percent %% symbol in the middle ' , po_contents )
self . assertMsgId ( ' Completed 50 %% of all the tasks ' , po_contents )
self . assertMsgId ( ' Completed 99 %% of all the tasks ' , po_contents )
self . assertMsgId ( " Shouldn ' t double escape this sequence: %% (two percent signs) " , po_contents )
self . assertMsgId ( " Shouldn ' t double escape this sequence %% either " , po_contents )
self . assertMsgId ( " Looks like a str fmt spec %% s but shouldn ' t be interpreted as such " , po_contents )
self . assertMsgId ( " Looks like a str fmt spec %% o but shouldn ' t be interpreted as such " , po_contents )
def test_templatize_blocktrans_tag ( self ) :
# ticket #11966
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertMsgId ( ' I think that 100 %% is more that 50 %% of anything. ' , po_contents )
self . assertMsgId ( ' I think that 100 %% is more that 50 %% of %(obj)s . ' , po_contents )
2011-12-11 00:48:26 +00:00
self . assertMsgId ( " Blocktrans extraction shouldn ' t double escape this: %% , a= %(a)s " , po_contents )
2010-11-04 14:06:24 +00:00
2010-12-04 17:42:54 +00:00
def test_extraction_error ( self ) :
os . chdir ( self . test_dir )
2011-06-19 19:25:26 +00:00
shutil . copyfile ( ' ./templates/template_with_error.tpl ' , ' ./templates/template_with_error.html ' )
2010-12-04 17:42:54 +00:00
self . assertRaises ( SyntaxError , management . call_command , ' makemessages ' , locale = LOCALE , verbosity = 0 )
2011-12-21 15:35:58 +00:00
with self . assertRaises ( SyntaxError ) as context_manager :
2011-03-28 02:27:43 +00:00
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
2011-12-21 15:35:58 +00:00
self . assertRegexpMatches ( str ( context_manager . exception ) ,
2011-05-26 21:03:56 +00:00
r ' Translation blocks must not include other block tags: blocktrans \ (file templates[/ \\ ]template_with_error \ .html, line 3 \ ) '
)
2011-12-21 15:35:58 +00:00
os . remove ( ' ./templates/template_with_error.html ' )
# Check that the temporary file was cleaned up
self . assertFalse ( os . path . exists ( ' ./templates/template_with_error.html.py ' ) )
2010-12-04 17:42:54 +00:00
2012-07-18 16:34:13 +00:00
def test_extraction_warning ( self ) :
os . chdir ( self . test_dir )
shutil . copyfile ( ' ./code.sample ' , ' ./code_sample.py ' )
stdout = StringIO ( )
management . call_command ( ' makemessages ' , locale = LOCALE , stdout = stdout )
os . remove ( ' ./code_sample.py ' )
2012-12-08 10:13:52 +00:00
self . assertIn ( " code_sample.py:4 " , force_text ( stdout . getvalue ( ) ) )
2012-07-18 16:34:13 +00:00
2011-10-19 04:59:47 +00:00
def test_template_message_context_extractor ( self ) :
"""
Ensure that message contexts are correctly extracted for the
{ % trans % } and { % blocktrans % } template tags .
Refs #14806.
"""
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
# {% trans %}
self . assertTrue ( ' msgctxt " Special trans context #1 " ' in po_contents )
self . assertTrue ( " Translatable literal #7a " in po_contents )
self . assertTrue ( ' msgctxt " Special trans context #2 " ' in po_contents )
self . assertTrue ( " Translatable literal #7b " in po_contents )
self . assertTrue ( ' msgctxt " Special trans context #3 " ' in po_contents )
self . assertTrue ( " Translatable literal #7c " in po_contents )
# {% blocktrans %}
self . assertTrue ( ' msgctxt " Special blocktrans context #1 " ' in po_contents )
self . assertTrue ( " Translatable literal #8a " in po_contents )
self . assertTrue ( ' msgctxt " Special blocktrans context #2 " ' in po_contents )
self . assertTrue ( " Translatable literal #8b-singular " in po_contents )
self . assertTrue ( " Translatable literal #8b-plural " in po_contents )
self . assertTrue ( ' msgctxt " Special blocktrans context #3 " ' in po_contents )
self . assertTrue ( " Translatable literal #8c-singular " in po_contents )
self . assertTrue ( " Translatable literal #8c-plural " in po_contents )
self . assertTrue ( ' msgctxt " Special blocktrans context #4 " ' in po_contents )
self . assertTrue ( " Translatable literal #8d " in po_contents )
2010-11-04 14:06:24 +00:00
2012-09-28 03:34:45 +00:00
def test_context_in_single_quotes ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2012-09-28 03:34:45 +00:00
# {% trans %}
self . assertTrue ( ' msgctxt " Context wrapped in double quotes " ' in po_contents )
self . assertTrue ( ' msgctxt " Context wrapped in single quotes " ' in po_contents )
# {% blocktrans %}
self . assertTrue ( ' msgctxt " Special blocktrans context wrapped in double quotes " ' in po_contents )
self . assertTrue ( ' msgctxt " Special blocktrans context wrapped in single quotes " ' in po_contents )
2010-02-21 23:45:04 +00:00
class JavascriptExtractorTests ( ExtractorTests ) :
PO_FILE = ' locale/ %s /LC_MESSAGES/djangojs.po ' % LOCALE
def test_javascript_literals ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , domain = ' djangojs ' , locale = LOCALE , verbosity = 0 )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
po_contents = fp . read ( )
self . assertMsgId ( ' This literal should be included. ' , po_contents )
self . assertMsgId ( ' This one as well. ' , po_contents )
self . assertMsgId ( r ' He said, \ " hello \ " . ' , po_contents )
self . assertMsgId ( " okkkk " , po_contents )
self . assertMsgId ( " TEXT " , po_contents )
self . assertMsgId ( " It ' s at http://example.com " , po_contents )
self . assertMsgId ( " String " , po_contents )
self . assertMsgId ( " /* but this one will be too */ ' cause there is no way of telling... " , po_contents )
self . assertMsgId ( " foo " , po_contents )
self . assertMsgId ( " bar " , po_contents )
self . assertMsgId ( " baz " , po_contents )
self . assertMsgId ( " quz " , po_contents )
self . assertMsgId ( " foobar " , po_contents )
2010-02-21 23:45:04 +00:00
class IgnoredExtractorTests ( ExtractorTests ) :
def test_ignore_option ( self ) :
os . chdir ( self . test_dir )
2011-05-26 21:03:56 +00:00
pattern1 = os . path . join ( ' ignore_dir ' , ' * ' )
2012-02-04 18:27:24 +00:00
stdout = StringIO ( )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 2 ,
ignore_patterns = [ pattern1 ] , stdout = stdout )
data = stdout . getvalue ( )
self . assertTrue ( " ignoring directory ignore_dir " in data )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
po_contents = fp . read ( )
self . assertMsgId ( ' This literal should be included. ' , po_contents )
self . assertNotMsgId ( ' This should be ignored. ' , po_contents )
2010-02-21 23:45:04 +00:00
class SymlinkExtractorTests ( ExtractorTests ) :
def setUp ( self ) :
self . _cwd = os . getcwd ( )
2012-12-08 10:13:52 +00:00
self . test_dir = os . path . abspath ( os . path . dirname ( upath ( __file__ ) ) )
2010-02-21 23:45:04 +00:00
self . symlinked_dir = os . path . join ( self . test_dir , ' templates_symlinked ' )
def tearDown ( self ) :
super ( SymlinkExtractorTests , self ) . tearDown ( )
os . chdir ( self . test_dir )
try :
os . remove ( self . symlinked_dir )
except OSError :
pass
os . chdir ( self . _cwd )
def test_symlink ( self ) :
if hasattr ( os , ' symlink ' ) :
if os . path . exists ( self . symlinked_dir ) :
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . islink ( self . symlinked_dir ) )
2010-02-21 23:45:04 +00:00
else :
os . symlink ( os . path . join ( self . test_dir , ' templates ' ) , self . symlinked_dir )
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 , symlinks = True )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertMsgId ( ' This literal should be included. ' , po_contents )
self . assertTrue ( ' templates_symlinked/test.html ' in po_contents )
2010-02-21 23:45:04 +00:00
class CopyPluralFormsExtractorTests ( ExtractorTests ) :
def test_copy_plural_forms ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' Plural-Forms: nplurals=2; plural=(n != 1) ' in po_contents )
2010-11-04 12:08:37 +00:00
class NoWrapExtractorTests ( ExtractorTests ) :
def test_no_wrap_enabled ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 , no_wrap = True )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertMsgId ( ' This literal should also be included wrapped or not wrapped depending on the use of the --no-wrap option. ' , po_contents )
2010-11-04 12:08:37 +00:00
def test_no_wrap_disabled ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 , no_wrap = False )
2011-03-03 15:04:39 +00:00
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertMsgId ( ' " " \n " This literal should also be included wrapped or not wrapped depending on the " \n " use of the --no-wrap option. " ' , po_contents , use_quotes = False )
2011-11-11 13:07:14 +00:00
class NoLocationExtractorTests ( ExtractorTests ) :
def test_no_location_enabled ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 , no_location = True )
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertFalse ( ' #: templates/test.html:55 ' in po_contents )
2011-11-11 13:07:14 +00:00
def test_no_location_disabled ( self ) :
os . chdir ( self . test_dir )
management . call_command ( ' makemessages ' , locale = LOCALE , verbosity = 0 , no_location = False )
self . assertTrue ( os . path . exists ( self . PO_FILE ) )
2011-12-11 00:07:06 +00:00
with open ( self . PO_FILE , ' r ' ) as fp :
2012-12-08 10:13:52 +00:00
po_contents = force_text ( fp . read ( ) )
2011-12-11 00:07:06 +00:00
self . assertTrue ( ' #: templates/test.html:55 ' in po_contents )