jenkins-bot has submitted this change and it was merged.
Change subject: Make Site objects pickle-able
......................................................................
Make Site objects pickle-able
Since we can't pickle Lock objects, those are removed upon
pickling, and restored when the object is unpacked.
Bug: 62094
Change-Id: I3298fa212ad99e1674067b42a1c081f8bd0f779e
---
M pywikibot/site.py
M tests/site_tests.py
2 files changed, 44 insertions(+), 1 deletion(-)
Approvals:
Legoktm: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py
index 385ed16..5c28490 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -84,6 +84,8 @@
def __repr__(self):
return 'LoginStatus(%s)' % (LoginStatus.name(self.state))
+_families = {}
+
def Family(fam=None, fatal=True):
"""Import the named family.
@@ -98,6 +100,9 @@
"""
if fam is None:
fam = config.family
+ if fam in _families:
+ return _families[fam]
+
try:
myfamily = imp.load_source(fam, config.family_files[fam])
except (ImportError, KeyError):
@@ -109,7 +114,8 @@
sys.exit(1)
else:
raise Error("Family %s does not exist" % fam)
- return myfamily.Family()
+ _families[fam] = myfamily.Family()
+ return _families[fam]
class BaseSite(object):
@@ -212,6 +218,19 @@
if self.family == other.family:
return cmp(self.code, other.code)
return cmp(self.family.name, other.family.name)
+
+ def __getstate__(self):
+ """ Remove Lock based classes before pickling """
+ new = self.__dict__.copy()
+ del new['_pagemutex']
+ if '_throttle' in new:
+ del new['_throttle']
+ return new
+
+ def __setstate__(self, attrs):
+ """ Restore things removed in __getstate__ """
+ self.__dict__.update(attrs)
+ self._pagemutex = threading.Lock()
def user(self):
"""Return the currently-logged in bot user, or None."""
@@ -676,6 +695,19 @@
return APISite(site['code'], site['code'])
raise ValueError("Cannot parse a site out of %s." % dbname)
+ def __getstate__(self):
+ """ Remove Lock based classes before pickling """
+ new = super(APISite, self).__getstate__()
+ del new['sitelock']
+ del new['_msgcache']
+ return new
+
+ def __setstate__(self, attrs):
+ """ Restore things removed in __getstate__ """
+ super(APISite, self).__setstate__(attrs)
+ self.sitelock = threading.Lock()
+ self._msgcache = {}
+
def _generator(self, gen_class, type_arg=None, namespaces=None,
step=None, total=None, **args):
"""Convenience method that returns an API generator.
diff --git a/tests/site_tests.py b/tests/site_tests.py
index cca2db0..5e2cdc2 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -997,6 +997,17 @@
mysite.loadrevisions(mypage, step=5, total=12)
self.assertEqual(len(mypage._revisions), 12)
+ def testPickleAbility(self):
+ import pickle
+ #fam = pywikibot.site.Family('wikipedia')
+ #site = pywikibot.Site('en', fam)
+ #pywikibot.output(site.family.__dict__)
+ #pickle.dumps(site)
+ site = pywikibot.Site('en', 'wikipedia')
+ #pywikibot.output(site.family.__dict__)
+ pickle.dumps(site)
+ self.assertTrue(True) # No exception thrown!
+
class TestSiteLoadRevisions(PywikibotTestCase):
"""Test cases for Site.loadrevision() method."""
--
To view, visit https://gerrit.wikimedia.org/r/131033
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I3298fa212ad99e1674067b42a1c081f8bd0f779e
Gerrit-PatchSet: 4
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Legoktm <[email protected]>
Gerrit-Reviewer: Gallaecio <[email protected]>
Gerrit-Reviewer: John Vandenberg <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: Multichill <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits