http://www.mediawiki.org/wiki/Special:Code/pywikipedia/11269

Revision: 11269
Author:   xqt
Date:     2013-03-25 16:41:16 +0000 (Mon, 25 Mar 2013)
Log Message:
-----------
handle default overriding

Modified Paths:
--------------
    trunk/pywikipedia/maintenance/update_namespaces.py

Modified: trunk/pywikipedia/maintenance/update_namespaces.py
===================================================================
--- trunk/pywikipedia/maintenance/update_namespaces.py  2013-03-25 14:30:06 UTC 
(rev 11268)
+++ trunk/pywikipedia/maintenance/update_namespaces.py  2013-03-25 16:41:16 UTC 
(rev 11269)
@@ -9,7 +9,7 @@
     <family>       Work on a given wikimedia family file
 """
 #
-# (C) xqt, 2010-2011
+# (C) xqt, 2010-2013
 # (C) Pywikipedia bot team, 2007-2009
 #
 # Distributed under the terms of the MIT license.
@@ -26,31 +26,34 @@
 import re
 
 r_namespace_section_main = 
r'(?s)self\.namespaces\s*\=\s*\{.*\s+%s\s*:\s*\{(.*?)\}'
-r_namespace_section_sub = r'(?s)self\.namespaces\[%s]\s*\=\s*\{(.*?)\}'
-r_namespace_section_once = r'(?s)self\.namespaces\[%s]\[\'%s\']\s*\=\s*\(.*?)'
+r_namespace_section_sub = r'(?s)self\.namespaces\[%s\]\s*\=\s*\{(.*?)\}'
+r_namespace_section_once = r"self\.namespaces\[%d\]\['%s'\]\s*\=\s*(.*?)$"
 
 r_string = '[u]?[r]?[\'"].*?[\'"]'
 r_list = '\\[.*?\\]'
-r_namespace_def = 
re.compile(r'[\'"]([a-z_-]*)[\'"]\s*\:\s*((?:%s)|(?:%s))\s*,' % (r_string, 
r_list))
+r_namespace_def = re.compile(
+    r'[\'"]([a-z_-]*)[\'"]\s*\:\s*((?:%s)|(?:%s))\s*,' % (r_string, r_list))
 
-def update_family(family, changes):
-    global namespace_section_text, namespace_defs, new_defs
+
+def update_family(family, changes, upmain):
     if family:
         output(u'\nUpdating family %s' % family.name)
         family_file_name = '../families/%s_family.py' % family.name
         r_namespace_section = r_namespace_section_sub
         base_indent = 8
-        skip_namespace = []
+        skip_namespace = ()
     else:
         output(u'\nUpdating family.py')
         family_file_name = '../family.py'
         r_namespace_section = r_namespace_section_main
         base_indent = 12
-        skip_namespace = [4, 5]
+        skip_namespace = (4, 5)
     family_file = open(family_file_name, 'r')
     old_family_text = family_text = family_file.read()
     family_file.close()
-
+    namespace_defs = {}
+    oncedefs = {}
+    oncetext = ''
     for lang, namespaces in changes.iteritems():
         for namespace_id, namespace_list, predefined_namespace in namespaces:
             if namespace_id in skip_namespace:
@@ -58,32 +61,54 @@
             msg = u'Setting namespace[%s] for %s to ' \
                   + (u'[%s]' if len(namespace_list) > 1 else u'%s')
             output(msg % (namespace_id, lang, ', '.join(namespace_list)))
+            once = False
+            if family and not upmain and \
+               namespace_id in range(-2, 16) and namespace_id not in (4, 5):
+                once = True
+##                namespace_section = re.search(r_namespace_section_once
+##                                              % (namespace_id, lang),
+##                                              family_text)
+            else:
+                namespace_section = re.search(r_namespace_section
+                                              % namespace_id, family_text)
+                if not namespace_section:
+                    continue
+                namespace_section_text = namespace_section.group(1)
+                namespace_defs = dict(
+                    [(match.group(1), match.group(2)) for match in
+                     r_namespace_def.finditer(namespace_section_text)])
 
-            namespace_section = re.search(r_namespace_section
-                                          % namespace_id, family_text)
-            #namespace_section2 = re.search(r_namespace_section_once % 
(namespace_id, lang) ,family_text)
-            if not namespace_section:
-                continue
-            namespace_section_text = namespace_section.group(1)
-            namespace_defs = dict([(match.group(1), match.group(2))
-                for match in r_namespace_def.finditer(namespace_section_text)])
-
             msg = u'Updating namespace[%s] to ' \
                   + (u'[%s]' if len(namespace_list) > 1 else u'%s')
             output(msg % (namespace_id, ', '.join(namespace_list)))
-            if len(namespace_list) == 1:
-                namespace_defs[lang] = 
escape_string(namespace_list[0].encode('utf-8'))
+            if once:
+                if len(namespace_list) == 1:
+                    new_defs = escape_string(namespace_list[0].encode('utf-8'))
+                else:
+                    new_defs = u", ".join(escape_string(ns) for ns in
+                                          namespace_list).encode('utf-8')
+                oncetext += "        self.namespaces[%d]['%s'] = [" \
+                            % (namespace_id, lang) + new_defs + ']\n'
             else:
-                namespaces = u", ".join(escape_string(ns) for ns in 
namespace_list).encode('utf-8')
-                namespace_defs[lang] = '[%s]' % namespaces
+                if len(namespace_list) == 1:
+                    namespace_defs[lang] = escape_string(
+                        namespace_list[0].encode('utf-8'))
+                else:
+                    namespaces = u", ".join(escape_string(ns) for ns in
+                                            namespace_list).encode('utf-8')
+                    namespace_defs[lang] = '[%s]' % namespaces
+                new_defs = namespace_defs.items()
+                new_defs.sort(key=lambda x: x[0])
 
-            new_defs = namespace_defs.items()
-            new_defs.sort(key = lambda x: x[0])
-            new_text = '\n' + ''.join([(base_indent + 4) * ' ' + "'%s': %s,\n"
-                                       % i for i in new_defs]) + ' ' * 
base_indent
-            family_text = family_text.replace(namespace_section.group(1),
-                                              new_text)
+                new_text = '\n' + ''.join(
+                    [(base_indent + 4) * ' ' + "'%s': %s,\n"
+                     % i for i in new_defs]) + ' ' * base_indent
+                family_text = family_text.replace(namespace_section.group(1),
+                                                  new_text)
 
+    family_text = re.sub('(?s)# Override defaults.*?# Most',
+                         '# Override defaults\n%s\n        # Most' % oncetext,
+                         family_text)
     if family_text == old_family_text:
         output(u'No changes made')
     elif test_data(family_text):
@@ -95,9 +120,11 @@
         output(u'Warning! Syntax error!')
         output(family_text.decode('utf-8'))
 
+
 def escape_string(string):
     return "u'%s'" % string.replace('\\', '\\\\').replace("'", "\\'")
 
+
 def test_data(_test_data):
     try:
         exec _test_data
@@ -107,30 +134,33 @@
         return True
     return True
 
-def check_and_update(families, update_main = False):
+
+def check_and_update(families, update_main=False):
     for family in families:
         family = wikipedia.Family(family)
         result = family_check.check_family(family)
-        update_family(family, result)
+        update_family(family, result, update_main)
         if update_main:
             # Update also the family.py file
-            update_family(None, result)
+            update_family(None, result, update_main)
 
+
 if __name__ == '__main__':
     try:
         update_main_family = False
         update_wikimedia = False
-        families = ['wiktionary', 'wikiquote','wikisource', 'wikibooks',
-                    'wikinews', 'wikiversity','meta', 'commons', 'mediawiki',
-                    'species', 'incubator', 'test',
-                    ]
+        families = ['commons', 'incubator', 'mediawiki', 'meta', 'species',
+                    'test', 'wikibooks', 'wikidata', 'wikinews', 'wikiquote',
+                    'wikisource', 'wikiversity', 'wikivoyage', 'wiktionary']
         fam = []
         for arg in wikipedia.handleArgs():
-            if  arg == '-upmain':
+            if arg == '-upmain':
                 update_main_family = True
             elif arg == '-wikimedia':
                 update_wikimedia = True
                 fam = families
+            elif arg == '-skipmain':
+                fam = families
             elif arg in families:
                 if not arg in fam:
                     fam.append(arg)


_______________________________________________
Pywikipedia-svn mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-svn

Reply via email to