Merlijn van Deen has uploaded a new change for review.
https://gerrit.wikimedia.org/r/233212
Change subject: site: make various properties configurable on-site
......................................................................
site: make various properties configurable on-site
Change-Id: I992c5d836c30b6d99f40e0f9c752b218a4ec40d8
Original-Change-Id: Ie9c86c196ef33ff7bb336bb2bac9e688b41938a3
---
M pywikibot/cosmetic_changes.py
M pywikibot/family.py
M pywikibot/site.py
M pywikibot/textlib.py
M tests/utils.py
5 files changed, 117 insertions(+), 24 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core
refs/changes/12/233212/1
diff --git a/pywikibot/cosmetic_changes.py b/pywikibot/cosmetic_changes.py
index e6b5213..1f2d0c4 100755
--- a/pywikibot/cosmetic_changes.py
+++ b/pywikibot/cosmetic_changes.py
@@ -399,7 +399,7 @@
site=self.site)
# Adding stars templates
if allstars:
- text = text.strip() + self.site.family.interwiki_text_separator
+ text = text.strip() +
self.site.settings['interwiki_text_separator']
allstars.sort()
for element in allstars:
text += '%s%s' % (element.strip(), config.line_separator)
diff --git a/pywikibot/family.py b/pywikibot/family.py
index 31526ea..57cb2de 100644
--- a/pywikibot/family.py
+++ b/pywikibot/family.py
@@ -28,6 +28,7 @@
import pywikibot
from pywikibot import config2 as config
+from pywikibot.bot import load_settings
from pywikibot.tools import (
deprecated, deprecated_args, issue_deprecation_warning,
FrozenDict,
@@ -47,6 +48,8 @@
def __init__(self):
"""Constructor."""
+ self._settings_cache = {}
+
if not hasattr(self, 'name'):
self.name = None
@@ -713,28 +716,28 @@
# main namespace. Use the Namespace given from the Site instead
self.nocapitalize = []
- # attop is a list of languages that prefer to have the interwiki
+ # DEPRECATED, attop is a list of languages that prefer to have the
interwiki
# links at the top of the page.
self.interwiki_attop = []
- # on_one_line is a list of languages that want the interwiki links
+ # DEPRECATED, on_one_line is a list of languages that want the
interwiki links
# one-after-another on a single line
self.interwiki_on_one_line = []
- # String used as separator between interwiki links and the text
+ # DEPRECATED, String used as separator between interwiki links and the
text
self.interwiki_text_separator = config.line_separator * 2
- # Similar for category
+ # DEPRECATED, Similar for category
self.category_attop = []
- # on_one_line is a list of languages that want the category links
+ # DEPRECATED, on_one_line is a list of languages that want the
category links
# one-after-another on a single line
self.category_on_one_line = []
- # String used as separator between category links and the text
+ # DEPRECATED, String used as separator between category links and the
text
self.category_text_separator = config.line_separator * 2
- # When both at the bottom should categories come after interwikilinks?
+ # DEPRECATED, When both at the bottom should categories come after
interwikilinks?
# TODO: T86284 Needed on Wikia sites, as it uses the CategorySelect
# extension which puts categories last on all sites. TO BE DEPRECATED!
self.categories_last = []
- # Which languages have a special order for putting interlanguage
+ # DEPRECATED, Which languages have a special order for putting
interlanguage
# links, and what order is it? If a language is not in
# interwiki_putfirst, alphabetical order on language code is used.
# For languages that are in interwiki_putfirst, interwiki_putfirst
@@ -875,6 +878,14 @@
elif name == 'known_families':
issue_deprecation_warning('known_families',
'APISite.interwiki(prefix)', 2)
+ elif name in set(['interwiki_text_separator',
'category_text_separator',
+ 'interwiki_attop', 'interwiki_on_one_line',
+ 'category_attop', 'category_on_one_line',
+ 'categories_last', 'interwiki_putfirst',
+ 'rcstream_host']):
+ issue_deprecation_warning(name,
+ "APISite.settings['{0}']".format(name),
2)
+
return super(Family, self).__getattribute__(name)
@staticmethod
@@ -1399,6 +1410,40 @@
for (old, new) in data.items()
if new is not None)
+ def settings(self, code):
+ if code not in self._settings_cache:
+ self._settings_cache[code] =
self._load_settings(pywikibot.Site(code, self.name))
+ return self._settings_cache[code]
+
+ def _load_settings(self, site):
+ """
+ Return the settings of the family's code.
+
+ It generates the dictionary from the already exisiting parameters. If
+ possible the Family should use PageSettingsFamily to load it
+ dynamically.
+ """
+ # avoid deprecation
+ get = super(Family, self).__getattribute__
+ settings = {}
+ # settings with a list (or similar) of languages
+ for setting in ('interwiki_attop', 'interwiki_on_one_line',
+ 'category_attop', 'category_on_one_line',
+ 'categories_last'):
+ settings[setting] = site.code in get(setting)
+ # settings with a global value for all sites
+ for setting in ('interwiki_text_separator', 'category_text_separator'):
+ settings[setting] = get(setting)
+ # settings with a dict of languages mapping to a setting
+ for setting in ('interwiki_putfirst', ):
+ if site.code in get(setting):
+ settings[setting] = get(setting)[site.code]
+ try:
+ settings['rcstream_host'] = get('rcstream_host')(site.code)
+ except NotImplementedError:
+ pass
+ return settings
+
class WikimediaFamily(Family):
@@ -1495,3 +1540,42 @@
return self.url.path[0:-8]
else:
return super(AutoFamily, self).scriptpath(code)
+
+
+class PageSettingsFamily(Family):
+
+ """A family class which reads the settings from a page."""
+
+ settings_pages = {}
+
+ def _maximum_GET_length(self, code):
+ # TODO: Make this possible, currently infinite recursion:
+ # tries to get length, tries to get settings, request page,
+ # tries to get length… you get the idea
+ # It should use the configured length (or none?) the second time
+ if 'maximum_GET_length' in self.settings(code):
+ # when False it's like 'no length'
+ return min(config.maximum_GET_length,
+ self.settings(code)['maximum_GET_length'] or 0)
+ else:
+ return config.maximum_GET_length
+
+ def _load_settings(self, site):
+ if (self.settings_pages is not True and
+ site.code not in self.settings_pages):
+ raise Exception('The "settings_pages" for {0} is not '
+ 'defined.'.format(site.code))
+ if (self.settings_pages is True or
+ self.settings_pages[site.code] is True):
+ settings_page = 'Pywikibot'
+ else:
+ settings_page = self.settings_pages[site.code]
+ # for now we can use the original method to create the default mapping
+ settings = super(PageSettingsFamily, self)._load_settings(site)
+ # this currently requires that the page exist and that it's not False
+ # Possible solutions:
+ # * don't return False
+ # * cache and only update if not False
+ # * require that it's not False
+ settings.update(load_settings(site, settings_page))
+ return settings
diff --git a/pywikibot/site.py b/pywikibot/site.py
index e77315c..a0578a5 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -1063,11 +1063,12 @@
def category_on_one_line(self):
# TODO: is this even needed? No family in the framework uses it.
"""Return True if this site wants all category links on one line."""
- return self.code in self.family.category_on_one_line
+ return self.settings['category_on_one_line']
+ @deprecated("settings.get('interwiki_putfirst')")
def interwiki_putfirst(self):
"""Return list of language codes for ordering of interwiki links."""
- return self.family.interwiki_putfirst.get(self.code, None)
+ return self.settings.get('interwiki_putfirst')
def getSite(self, code):
"""Return Site object for language 'code' in this Family."""
@@ -4353,6 +4354,10 @@
}
_ep_text_overrides = set(['appendtext', 'prependtext', 'undo'])
+ @property
+ def settings(self):
+ return self.family.settings(self.code)
+
@must_be(group='user')
def editpage(self, page, summary=None, minor=True, notminor=False,
bot=True, recreate=True, createonly=False, nocreate=False,
diff --git a/pywikibot/textlib.py b/pywikibot/textlib.py
index 77454fc..ddbb990 100644
--- a/pywikibot/textlib.py
+++ b/pywikibot/textlib.py
@@ -839,8 +839,8 @@
marker = findmarker(oldtext)
if site is None:
site = pywikibot.Site()
- separator = site.family.interwiki_text_separator
- cseparator = site.family.category_text_separator
+ separator = site.settings['interwiki_text_separator']
+ cseparator = site.settings['category_text_separator']
separatorstripped = separator.strip()
cseparatorstripped = cseparator.strip()
if addOnly:
@@ -850,11 +850,10 @@
separator=separatorstripped)
s = interwikiFormat(new, insite=site)
if s:
- if site.code in site.family.interwiki_attop or \
- u'<!-- interwiki at top -->' in oldtext:
+ if (site.settings['interwiki_attop'] or
+ '<!-- interwiki at top -->' in oldtext):
# do not add separator if interwiki links are on one line
- newtext = s + (u'' if site.code
- in site.family.interwiki_on_one_line
+ newtext = s + ('' if site.settings['interwiki_on_one_line']
else separator) + s2.replace(marker, '').strip()
else:
# calculate what was after the language links on the page
@@ -870,7 +869,7 @@
newtext = (s2[:firstafter].replace(marker, '') +
s +
s2[firstafter:])
- elif site.code in site.family.categories_last:
+ elif site.settings['categories_last']:
cats = getCategoryLinks(s2, site=site)
s2 = removeCategoryLinksAndSeparator(
s2.replace(marker, cseparatorstripped).strip(), site) + \
@@ -942,7 +941,7 @@
except AttributeError:
s.append(pywikibot.Site(site, insite.family).linkto(
links[site], othersite=insite))
- if insite.code in insite.family.interwiki_on_one_line:
+ if insite.settings['interwiki_on_one_line']:
sep = u' '
else:
sep = config.line_separator
@@ -958,7 +957,7 @@
insite = pywikibot.Site()
sites.sort()
- putfirst = insite.interwiki_putfirst()
+ putfirst = insite.settings.get('interwiki_putfirst')
if putfirst:
# In this case I might have to change the order
firstsites = []
@@ -1124,8 +1123,8 @@
'German\nWikipedia on pages that contain the Personendaten '
'template because of the\nnon-standard placement of that
template.\n'
'See
https://de.wikipedia.org/wiki/Hilfe:Personendaten#Kopiervorlage')
- separator = site.family.category_text_separator
- iseparator = site.family.interwiki_text_separator
+ separator = site.settings['category_text_separator']
+ iseparator = site.settings['interwiki_text_separator']
separatorstripped = separator.strip()
iseparatorstripped = iseparator.strip()
if addOnly:
@@ -1135,7 +1134,7 @@
separator=separatorstripped)
s = categoryFormat(new, insite=site)
if s:
- if site.code in site.family.category_attop:
+ if site.settings['category_attop']:
newtext = s + separator + s2
else:
# calculate what was after the categories links on the page
@@ -1152,7 +1151,7 @@
newtext = (s2[:firstafter].replace(marker, '') +
s +
s2[firstafter:])
- elif site.code in site.family.categories_last:
+ elif site.settings['categories_last']:
newtext = s2.replace(marker, '').strip() + separator + s
else:
interwiki = getLanguageLinks(s2, insite=site)
diff --git a/tests/utils.py b/tests/utils.py
index ecf02c2..3add1f0 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -356,6 +356,11 @@
return pywikibot.Site(code, fam, self.username(),
interface=DryDataSite)
+ @property
+ def settings(self):
+ """Return static settings from attributes."""
+ return pywikibot.family.Family._load_settings(self.family, self)
+
class DryDataSite(DrySite, pywikibot.site.DataSite):
--
To view, visit https://gerrit.wikimedia.org/r/233212
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I992c5d836c30b6d99f40e0f9c752b218a4ec40d8
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: XZise <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits