Revision: 6058 Author: russblau Date: 2008-11-04 20:42:39 +0000 (Tue, 04 Nov 2008)
Log Message: ----------- bugfixes and backwards-compatibility improvements
Modified Paths: -------------- branches/rewrite/pywikibot/__init__.py branches/rewrite/pywikibot/family.py branches/rewrite/pywikibot/login.py branches/rewrite/pywikibot/site.py
Modified: branches/rewrite/pywikibot/__init__.py =================================================================== --- branches/rewrite/pywikibot/__init__.py 2008-11-04 17:43:43 UTC (rev 6057) +++ branches/rewrite/pywikibot/__init__.py 2008-11-04 20:42:39 UTC (rev 6058) @@ -15,11 +15,43 @@ from exceptions import * import config
+ +def deprecate_arg(old_arg, new_arg): + """Decorator to declare old_arg deprecated and replace it with new_arg""" + logger = logging.getLogger() + def decorator(method): + def wrapper(*__args, **__kw): + meth_name = method.__name__ + if old_arg in __kw: + if new_arg: + if new_arg in __kw: + logger.warn( +"%(new_arg)s argument of %(meth_name)s replaces %(old_arg)s; cannot use both." + % locals()) + else: + logger.debug( +"%(old_arg)s argument of %(meth_name)s is deprecated; use %(new_arg)s instead." + % locals()) + __kw[new_arg] = __kw[old_arg] + else: + logger.debug( + "%(old_arg)s argument of %(meth_name)s is deprecated." + % locals()) + del __kw[old_arg] + return method(*__args, **__kw) + wrapper.__doc__ = method.__doc__ + wrapper.__name__ = method.__name__ + return wrapper + return decorator + + _sites = {} default_family = config.family default_code = config.mylang
-def Site(code=None, fam=None, user=None, interface=None): + +@deprecate_arg("persistent_http", None) +def Site(code=None, fam=None, user=None, sysop=None, interface=None): """Return the specified Site object.
Returns a cached object if possible, otherwise instantiates a new one. @@ -43,6 +75,11 @@ user = config.usernames[fam][code] except KeyError: user = None + if sysop is None: + try: + sysop = config.sysopnames[fam][code] + except KeyError: + sysop = None if interface is None: interface = config.site_interface try: @@ -51,7 +88,7 @@ raise ValueError("Invalid interface name '%(interface)s'" % locals()) key = '%s:%s:%s' % (fam, code, user) if not _sites.has_key(key): - _sites[key] = __Site(code=code, fam=fam, user=user) + _sites[key] = __Site(code=code, fam=fam, user=user, sysop=sysop) logger.debug("Instantiating Site object '%(site)s'" % {'site': _sites[key]}) return _sites[key]
Modified: branches/rewrite/pywikibot/family.py =================================================================== --- branches/rewrite/pywikibot/family.py 2008-11-04 17:43:43 UTC (rev 6057) +++ branches/rewrite/pywikibot/family.py 2008-11-04 20:42:39 UTC (rev 6058) @@ -7,7 +7,7 @@ import re import urllib
-from datetime import timedelta +from datetime import datetime, timedelta
logger = logging.getLogger("wiki")
@@ -1144,13 +1144,13 @@ """Return the shared image repository, if any.""" return (None, None)
- def server_time(self): - """Returns a datetime object representing server time""" - # TODO : If the local computer time is wrong, result wll be wrong + def server_time(self, code): + """Return a datetime object representing server time""" + # TODO : If the local computer time is wrong, result will be wrong return datetime.utcnow() + self.servergmtoffset
- def isPublic(self): - """Does the wiki require logging in before viewing it ?""" + def isPublic(self, code): + """Does the wiki require logging in before viewing it?""" return True
def post_get_convert(self, site, getText):
Modified: branches/rewrite/pywikibot/login.py =================================================================== --- branches/rewrite/pywikibot/login.py 2008-11-04 17:43:43 UTC (rev 6057) +++ branches/rewrite/pywikibot/login.py 2008-11-04 20:42:39 UTC (rev 6058) @@ -4,7 +4,7 @@ Script to log the robot in to a wiki account.
Suggestion is to make a special account to use for robot use only. Make -sure this robot account is well known on your home wikipedia before using. +sure this robot account is well known on your home wiki before using.
Parameters:
@@ -133,67 +133,8 @@ Returns cookie data if succesful, None otherwise.
""" - if config.use_api_login: - predata = { - 'action': 'login', - 'lgname': self.username.encode(self.site.encoding()), - 'lgpassword': self.password, - 'lgdomain': self.site.family.ldapDomain, - } - address = self.site.api_address() - else: - predata = { - "wpName": self.username.encode(self.site.encoding()), - "wpPassword": self.password, - "wpDomain": self.site.family.ldapDomain, # VistaPrint fix - "wpLoginattempt": "Aanmelden & Inschrijven", # dutch button label seems to work for all wikis - "wpRemember": str(int(bool(remember))), - "wpSkipCookieCheck": '1' - } - if captcha: - predata["wpCaptchaId"] = captcha['id'] - predata["wpCaptchaWord"] = captcha['answer'] - login_address = self.site.login_address() - address = login_address + '&action=submit' + # NOT IMPLEMENTED - see data/api.py for implementation
- if self.site.hostname() in config.authenticate.keys(): - headers = { - "Content-type": "application/x-www-form-urlencoded", - "User-agent": wikipedia.useragent - } - data = self.site.urlEncode(predata) - response = urllib2.urlopen( - urllib2.Request(self.site.protocol() - + '://' + self.site.hostname() - + address, data, headers)) - data = response.read() - wikipedia.cj.save(wikipedia.COOKIEFILE) - return "Ok" - else: - response, data = self.site.postData(address, self.site.urlEncode(predata)) - Reat=re.compile(': (.*?);') - L = [] - - for eat in response.msg.getallmatchingheaders('set-cookie'): - m = Reat.search(eat) - if m: - L.append(m.group(1)) - - got_token = got_user = False - for Ldata in L: - if 'Token=' in Ldata: - got_token = True - if 'User=' in Ldata or 'UserName=' in Ldata: - got_user = True - - if got_token and got_user: - return "\n".join(L) - elif not captcha: - solve = self.site.solveCaptcha(data) - if solve: - return self.getCookie(remember = remember, captcha = solve) - return None - def storecookiedata(self, data): """ Store cookie data.
Modified: branches/rewrite/pywikibot/site.py =================================================================== --- branches/rewrite/pywikibot/site.py 2008-11-04 17:43:43 UTC (rev 6057) +++ branches/rewrite/pywikibot/site.py 2008-11-04 20:42:39 UTC (rev 6058) @@ -11,6 +11,7 @@ __version__ = '$Id: $'
import pywikibot +from pywikibot import deprecate_arg from pywikibot.throttle import Throttle from pywikibot.data import api from pywikibot.exceptions import * @@ -29,35 +30,6 @@
logger = logging.getLogger("wiki")
- -def deprecate_arg(old_arg, new_arg): - """Decorator to declare old_arg deprecated and replace it with new_arg""" - def decorator(method): - def wrapper(*__args, **__kw): - meth_name = method.__name__ - if old_arg in __kw: - if new_arg: - if new_arg in __kw: - logger.warn( -"%(new_arg)s argument of %(meth_name)s replaces %(old_arg)s; cannot use both." - % locals()) - else: - logger.debug( -"%(old_arg)s argument of %(meth_name)s is deprecated; use %(new_arg)s instead." - % locals()) - __kw[new_arg] = __kw[old_arg] - else: - logger.debug( - "%(old_arg)s argument of %(meth_name)s is deprecated." - % locals()) - del __kw[old_arg] - return method(*__args, **__kw) - wrapper.__doc__ = method.__doc__ - wrapper.__name__ = method.__name__ - return wrapper - return decorator - - class PageInUse(pywikibot.Error): """Page cannot be reserved for writing due to existing lock."""
@@ -146,7 +118,8 @@ """Return this Site's throttle. Initialize a new one if needed."""
if not hasattr(self, "_throttle"): - self._throttle = Throttle(self, multiplydelay=True, verbosedelay=True) + self._throttle = Throttle(self, multiplydelay=True, + verbosedelay=True) try: self.login(False) except pywikibot.NoUsername: @@ -192,6 +165,9 @@ return self._username[False] return None
+ def username(self, sysop = False): + return self._username[sysop] + def __getattr__(self, attr): """Calls to methods not defined in this object are passed to Family."""
@@ -389,7 +365,36 @@
return pywikibot.Site(code=code, fam=self.family, user=self.user)
+ def urlEncode(self, query): + """DEPRECATED""" + return urllib.urlencode(query)
+ def getUrl(self, path, retry=True, sysop=False, data=None, + compress=True, no_hostname=False, cookie_only=False): + """DEPRECATED. + + Retained for compatibility only. All arguments except path and data + are ignored. + + """ + if data: + if not isinstance(data, basestring): + data = urllib.urlencode(data) + return pywikibot.comms.data.request(self, path, method="PUT", + body=data) + else: + return pywikibot.comms.data.request(self, path) + + def postForm(self, address, predata, sysop=False, cookies=None): + """DEPRECATED""" + return self.getUrl(address, data=predata) + + def postData(self, address, data, contentType=None, sysop=False, + compress=True, cookies=None): + """DEPRECATED""" + return self.getUrl(address, data=data) + + class APISite(BaseSite): """API interface to MediaWiki site.
@@ -399,10 +404,8 @@ ## Site methods from version 1.0 (as these are implemented in this file, ## or declared deprecated/obsolete, they will be removed from this list) ########## -## messages: return True if there are new messages on the site ## cookies: return user's cookies as a string ## -## getUrl: retrieve an URL from the site ## urlEncode: Encode a query to be sent using an http POST request. ## postForm: Post form data to an address at this site. ## postData: Post encoded form data to an http address at this site. @@ -439,8 +442,8 @@ ## withoutinterwiki: Special:Withoutinterwiki ## linksearch: Special:Linksearch
- def __init__(self, code, fam=None, user=None): - BaseSite.__init__(self, code, fam, user) + def __init__(self, code, fam=None, user=None, sysop=None): + BaseSite.__init__(self, code, fam, user, sysop) self._namespaces = { # these are the MediaWiki built-in names, which always work # localized names are loaded later upon accessing the wiki @@ -566,6 +569,12 @@ "Site method 'isBlocked' should be changed to 'is_blocked'") return self.is_blocked(sysop)
+ def checkBlocks(self, sysop = False): + """Check if the user is blocked, and raise an exception if so.""" + if self.is_blocked(sysop): + # User blocked + raise UserBlocked('User is blocked in site %s' % self) + def has_right(self, right, sysop=False): """Return true if and only if the user has a specific right.
@@ -1203,10 +1212,11 @@ yield linkdata['*']
@deprecate_arg("throttle", None) + @deprecate_arg("includeredirects", "filterredir") def allpages(self, start="!", prefix="", namespace=0, filterredir=None, filterlanglinks=None, minsize=None, maxsize=None, protect_type=None, protect_level=None, limit=None, - reverse=False, includeRedirects=None): + reverse=False, includeredirects=None): """Iterate pages in a single namespace.
Note: parameters includeRedirects and throttle are deprecated and @@ -1234,15 +1244,16 @@ all pages in namespace) @param reverse: if True, iterate in reverse Unicode lexigraphic order (default: iterate in forward order) + @param includeredirects: DEPRECATED, use filterredirs instead
""" if not isinstance(namespace, int): raise Error("allpages: only one namespace permitted.") - if includeRedirects is not None: + if includeredirects is not None: logger.debug( "allpages: 'includeRedirects' argument is deprecated; use 'filterredirs'.") - if includeRedirects: - if includeRedirects == "only": + if includeredirects: + if includeredirects == "only": filterredirs = True else: filterredirs = None @@ -1283,7 +1294,7 @@ """ logger.debug("Site.prefixindex() is deprecated; use allpages instead.") return self.allpages(prefix=prefix, namespace=namespace, - includeRedirects=includeredirects) + includeredirects=includeredirects)
def alllinks(self, start="!", prefix="", namespace=0, unique=False,