Revision: 4162
Author: btongminh
Date: 2007-08-31 18:14:03 +0000 (Fri, 31 Aug 2007)
Log Message:
-----------
Adding a tool to automatically update the family files.
Modified Paths:
--------------
trunk/pywikipedia/maintenance/family_check.py
Added Paths:
-----------
trunk/pywikipedia/maintenance/update_namespaces.py
Modified: trunk/pywikipedia/maintenance/family_check.py
===================================================================
--- trunk/pywikipedia/maintenance/family_check.py 2007-08-31 17:38:07 UTC (rev 4161)
+++ trunk/pywikipedia/maintenance/family_check.py 2007-08-31 18:14:03 UTC (rev 4162)
@@ -14,8 +14,12 @@
'meta': 'siteinfo',
'siprop': 'namespaces',
'format': 'json'}
- response, json = site.postForm(site.apipath(), predata)
try:
+ response, json = site.postForm(site.apipath(), predata)
+ except wikipedia.ServerError, e:
+ output(u'Warning! %s: %s' % (site, e))
+ return
+ try:
data = simplejson.loads(json)
except ValueError:
output(u'Warning! %s is defined but does not exist!' % site)
Added: trunk/pywikipedia/maintenance/update_namespaces.py
===================================================================
--- trunk/pywikipedia/maintenance/update_namespaces.py (rev 0)
+++ trunk/pywikipedia/maintenance/update_namespaces.py 2007-08-31 18:14:03 UTC (rev 4162)
@@ -0,0 +1,74 @@
+import sys
+sys.path.append('..')
+
+import wikipedia
+from wikipedia import output
+
+import family_check
+import re
+
+r_namespace_section = r'(?s)self\.namespaces\[%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))
+def update_family(family, changes):
+ global namespace_section_text, namespace_defs, new_defs
+
+ output(u'Updating family %s' % family)
+ family_file = open('../families/%s_family.py' % family.name, 'r')
+ old_family_text = family_text = family_file.read()
+ family_file.close()
+
+ for lang, namespaces in changes.iteritems():
+ for namespace_id, namespace_name, predefined_namespace in namespaces:
+ output(u'Setting namespace[%s] for %s to %s' % (namespace_id, lang,
namespace_name))
+
+ 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)])
+
+ if not namespace_defs.get(lang, '').startswith('['):
+ output(u'Updating namespace[%s] to %s' % (namespace_id, namespace_name))
+
+ namespace_defs[lang] = escape_string(namespace_name.encode('utf-8'))
+ else:
+ output(u'Namespace[%s] definition is a list; not updating.' % namespace_id)
+
+ new_defs = namespace_defs.items()
+ new_defs.sort(key = lambda x: x[0])
+ new_text = '\n' + ''.join([12 * ' ' + "'%s':
%s,\n" % i for i in new_defs]) + ' ' * 8
+ family_text = family_text.replace(namespace_section.group(1), new_text)
+
+ if test_data(family_text):
+ output(u'Saving to family file')
+ family_file = open('../families/%s_family.py' % family.name, 'w')
+ family_file.write(family_text)
+ family_file.close()
+ else:
+ 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
+ except SyntaxError:
+ return False
+ except:
+ return True
+ return True
+
+if __name__ == '__main__':
+ try:
+ wikipedia.handleArgs()
+ family = wikipedia.Family(wikipedia.default_family)
+ result = family_check.check_family(family)
+ update_family(family, result)
+ finally:
+ wikipedia.stopme()
\ No newline at end of file
Show replies by date