Edgewall Software

Changeset 14509


Ignore:
Timestamp:
Feb 9, 2016, 5:24:34 PM (10 years ago)
Author:
Jun Omae
Message:

1.2dev: add doc_args to pass parameters to the extracted messages to ConfigSection and Option classes (closes #12222)

Location:
trunk/trac
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/trac/config.py

    r14195 r14509  
    2525from trac.util.compat import OrderedDict, wait_for_file_mtime_change
    2626from trac.util.text import cleandoc, printout, to_unicode, to_utf8
    27 from trac.util.translation import _, N_, tag_
     27from trac.util.translation import N_, _, dgettext, tag_
    2828
    2929__all__ = ['Configuration', 'ConfigSection', 'Option', 'BoolOption',
     
    5757        items = [item for item in items if item not in (None, '')]
    5858    return items
     59
     60
     61def _getdoc(option_or_section):
     62    doc = to_unicode(option_or_section.__doc__)
     63    if doc:
     64        doc = dgettext(option_or_section.doc_domain, doc,
     65                       **(option_or_section.doc_args or {}))
     66    return doc
    5967
    6068
     
    631639        return _get_registry(ConfigSection, compmgr)
    632640
    633     def __init__(self, name, doc, doc_domain='tracini'):
     641    def __init__(self, name, doc, doc_domain='tracini', doc_args=None):
    634642        """Create the configuration section."""
    635643        self.name = name
     
    637645        self.__doc__ = cleandoc(doc)
    638646        self.doc_domain = doc_domain
     647        self.doc_args = doc_args
    639648
    640649    def __get__(self, instance, owner):
     
    648657        return '<%s [%s]>' % (self.__class__.__name__, self.name)
    649658
     659    @property
     660    def doc(self):
     661        """Return localized document of the section"""
     662        return _getdoc(self)
     663
    650664
    651665class Option(object):
     
    668682
    669683    def __init__(self, section, name, default=None, doc='',
    670                  doc_domain='tracini'):
     684                 doc_domain='tracini', doc_args=None):
    671685        """Create the configuration option.
    672686
     
    683697        self.__doc__ = cleandoc(doc)
    684698        self.doc_domain = doc_domain
     699        self.doc_args = doc_args
    685700
    686701    def __get__(self, instance, owner):
     
    699714        return '<%s [%s] %r>' % (self.__class__.__name__, self.section,
    700715                                 self.name)
     716
     717    @property
     718    def doc(self):
     719        """Return localized document of the option"""
     720        return _getdoc(self)
    701721
    702722    def dumps(self, value):
     
    763783
    764784    def __init__(self, section, name, default=None, sep=',', keep_empty=False,
    765                  doc='', doc_domain='tracini'):
     785                 doc='', doc_domain='tracini', doc_args=None):
    766786        self.sep = sep
    767787        self.keep_empty = keep_empty
    768         Option.__init__(self, section, name, default, doc, doc_domain)
     788        Option.__init__(self, section, name, default, doc, doc_domain,
     789                        doc_args)
    769790
    770791    def accessor(self, section, name, default):
     
    790811    """
    791812
    792     def __init__(self, section, name, choices, doc='', doc_domain='tracini'):
     813    def __init__(self, section, name, choices, doc='', doc_domain='tracini',
     814                 doc_args=None):
    793815        Option.__init__(self, section, name, to_unicode(choices[0]), doc,
    794                         doc_domain)
     816                        doc_domain, doc_args)
    795817        self.choices = set(to_unicode(c).strip() for c in choices)
    796818
     
    824846
    825847    def __init__(self, section, name, interface, default=None, doc='',
    826                  doc_domain='tracini'):
    827         Option.__init__(self, section, name, default, doc, doc_domain)
     848                 doc_domain='tracini', doc_args=None):
     849        Option.__init__(self, section, name, default, doc, doc_domain,
     850                        doc_args)
    828851        self.xtnpt = ExtensionPoint(interface)
    829852
     
    854877
    855878    def __init__(self, section, name, interface, default=None,
    856                  include_missing=True, doc='', doc_domain='tracini'):
     879                 include_missing=True, doc='', doc_domain='tracini',
     880                 doc_args=None):
    857881        ListOption.__init__(self, section, name, default, doc=doc,
    858                             doc_domain=doc_domain)
     882                            doc_domain=doc_domain, doc_args=doc_args)
    859883        self.xtnpt = ExtensionPoint(interface)
    860884        self.include_missing = include_missing
  • trunk/trac/mimeview/pygments.py

    r14208 r14509  
    6363        from the end. The lexer //short names// can also be used in place
    6464        of the lexer name.
    65         """ % {'url': 'http://pygments.org/docs/lexers/'})
     65        """, doc_args={'url': 'http://pygments.org/docs/lexers/'})
    6666
    6767    default_style = Option('mimeviewer', 'pygments_default_style', 'trac',
  • trunk/trac/tests/config.py

    r14502 r14509  
    11261126
    11271127
     1128class OptionDocTestCase(BaseTestCase):
     1129
     1130    def test_config_section(self):
     1131        class Dummy(object):
     1132            section_a = (ConfigSection)('a', 'Doc for a')
     1133            section_b = (ConfigSection)(
     1134                'b', 'Doc for [%(page)s@%(version)d b]',
     1135                doc_args={'page': 'WikiStart', 'version': 42})
     1136            section_c = (ConfigSection)('c', '')
     1137
     1138        self.assertEqual('Doc for a', Dummy.section_a.__doc__)
     1139        self.assertEqual(None, Dummy.section_a.doc_args)
     1140        self.assertEqual('Doc for a', Dummy.section_a.doc)
     1141        self.assertEqual('Doc for [%(page)s@%(version)d b]',
     1142                         Dummy.section_b.__doc__)
     1143        self.assertEqual({'page': 'WikiStart', 'version': 42},
     1144                         Dummy.section_b.doc_args)
     1145        self.assertEqual('Doc for [WikiStart@42 b]', Dummy.section_b.doc)
     1146        self.assertEqual('', Dummy.section_c.__doc__)
     1147        self.assertEqual(None, Dummy.section_c.doc_args)
     1148        self.assertEqual('', Dummy.section_c.doc)
     1149
     1150    def test_options(self):
     1151        class IDummy(Interface):
     1152            pass
     1153        class Dummy(Component):
     1154            implements(IDummy)
     1155            opt_nodoc = (Option)('a', 'option_nodoc', 'default')
     1156            opt = (Option)(
     1157                'a', 'option', 'default',
     1158                doc='Doc for %(name)s', doc_args={'name': 'opt'})
     1159            bool_opt = (BoolOption)(
     1160                'a', 'bool_opt', 'false',
     1161                doc='Doc for %(name)s', doc_args={'name': 'bool_opt'})
     1162            int_opt = (IntOption)(
     1163                'a', 'int_opt', '42',
     1164                doc='Doc for %(name)s', doc_args={'name': 'int_opt'})
     1165            float_opt = (IntOption)(
     1166                'a', 'float_opt', '4.2',
     1167                doc='Doc for %(name)s', doc_args={'name': 'float_opt'})
     1168            list_opt = (ListOption)(
     1169                'a', 'list_opt', 'foo,bar,baz',
     1170                doc='Doc for %(name)s', doc_args={'name': 'list_opt'})
     1171            path_opt = (PathOption)(
     1172                'a', 'path_opt', 'trac.ini',
     1173                doc='Doc for %(name)s', doc_args={'name': 'path_opt'})
     1174            ext_opt = (ExtensionOption)(
     1175                'a', 'ext_opt', IDummy, 'Dummy',
     1176                doc='Doc for %(name)s', doc_args={'name': 'ext_opt'})
     1177            ordered_ext_opt = (OrderedExtensionsOption)(
     1178                'a', 'ordered_ext_opt', IDummy, 'Dummy,Dummy',
     1179                doc='Doc for %(name)s', doc_args={'name': 'ordered_ext_opt'})
     1180
     1181        self.assertEqual('', Dummy.opt_nodoc.__doc__)
     1182        self.assertEqual(None, Dummy.opt_nodoc.doc_args)
     1183        self.assertEqual('', Dummy.opt_nodoc.doc)
     1184        self.assertEqual('Doc for %(name)s', Dummy.opt.__doc__)
     1185        self.assertEqual({'name': 'opt'}, Dummy.opt.doc_args)
     1186        self.assertEqual('Doc for opt', Dummy.opt.doc)
     1187        self.assertEqual('Doc for %(name)s', Dummy.bool_opt.__doc__)
     1188        self.assertEqual({'name': 'bool_opt'}, Dummy.bool_opt.doc_args)
     1189        self.assertEqual('Doc for bool_opt', Dummy.bool_opt.doc)
     1190        self.assertEqual('Doc for %(name)s', Dummy.int_opt.__doc__)
     1191        self.assertEqual({'name': 'int_opt'}, Dummy.int_opt.doc_args)
     1192        self.assertEqual('Doc for int_opt', Dummy.int_opt.doc)
     1193        self.assertEqual('Doc for %(name)s', Dummy.float_opt.__doc__)
     1194        self.assertEqual({'name': 'float_opt'}, Dummy.float_opt.doc_args)
     1195        self.assertEqual('Doc for float_opt', Dummy.float_opt.doc)
     1196        self.assertEqual('Doc for %(name)s', Dummy.list_opt.__doc__)
     1197        self.assertEqual({'name': 'list_opt'}, Dummy.list_opt.doc_args)
     1198        self.assertEqual('Doc for list_opt', Dummy.list_opt.doc)
     1199        self.assertEqual('Doc for %(name)s', Dummy.path_opt.__doc__)
     1200        self.assertEqual({'name': 'path_opt'}, Dummy.path_opt.doc_args)
     1201        self.assertEqual('Doc for path_opt', Dummy.path_opt.doc)
     1202        self.assertEqual('Doc for %(name)s', Dummy.ext_opt.__doc__)
     1203        self.assertEqual({'name': 'ext_opt'}, Dummy.ext_opt.doc_args)
     1204        self.assertEqual('Doc for ext_opt', Dummy.ext_opt.doc)
     1205        self.assertEqual('Doc for %(name)s', Dummy.ordered_ext_opt.__doc__)
     1206        self.assertEqual({'name': 'ordered_ext_opt'},
     1207                         Dummy.ordered_ext_opt.doc_args)
     1208        self.assertEqual('Doc for ordered_ext_opt', Dummy.ordered_ext_opt.doc)
     1209
     1210
    11281211def suite():
    11291212    suite = unittest.TestSuite()
     
    11361219        print("SKIP: trac.tests.config.ConfigurationSetDefaultsTestCase "
    11371220              "(__name__ is not trac.tests.config)")
     1221    suite.addTest(unittest.makeSuite(OptionDocTestCase))
    11381222    return suite
    11391223
  • trunk/trac/wiki/macros.py

    r14284 r14509  
    779779            key_filter = args.pop(0).strip()
    780780
    781         def getdoc(option_or_section):
    782             doc = to_unicode(option_or_section.__doc__)
    783             if doc:
    784                 doc = dgettext(option_or_section.doc_domain, doc)
    785             return doc
    786 
    787781        registry = ConfigSection.get_registry(self.compmgr)
    788         sections = dict((name, getdoc(section))
     782        sections = dict((name, section.doc)
    789783                        for name, section in registry.iteritems()
    790784                        if name.startswith(section_filter))
     
    810804             tag.table(class_='wiki')(tag.tbody(
    811805                 tag.tr(tag.td(tag.code(option.name)),
    812                         tag.td(format_to_oneliner(
    813                             self.env, formatter.context, getdoc(option))),
     806                        tag.td(format_to_oneliner(self.env, formatter.context,
     807                                                  option.doc)),
    814808                        default_cell(option),
    815809                        class_='odd' if idx % 2 else 'even')
  • trunk/trac/wiki/tests/macros.py

    r14481 r14509  
    521521<tr class="even"><td><code>option1</code></td><td></td><td class="default"><code>value</code></td></tr>\
    522522<tr class="odd"><td><code>option2</code></td><td>blah</td><td class="default"><code>value</code></td></tr>\
     523<tr class="even"><td><code>option3</code></td><td>Doc for option3</td><td class="default"><code>value</code></td></tr>\
    523524</tbody></table>\
    524525</div><p>
     
    560561        option_a1 = (Option)('section-42', 'option1', 'value', doc='')
    561562        option_a2 = (Option)('section-42', 'option2', 'value', doc='blah')
     563        option_a3 = (Option)('section-42', 'option3', 'value',
     564                             doc='Doc for %(name)s',
     565                             doc_args={'name': 'option3'})
    562566        option_l1 = (ListOption)('section-list', 'option1',
    563567                                 [4.2, '42', 42, None, 0, True], sep='|',
Note: See TracChangeset for help on using the changeset viewer.