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

Reply via email to