jenkins-bot merged this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[IMPR] Fix Wikibase aliases handling

Individual fixes:
- user can now remove all aliases of a single language be either removing
the language key or making the list empty (T194512)
- compare lists by sorting them instead of using Counter to handle
duplicate aliases
- improve WikibasePage._normalizeData, so that user can provide both
strings and structured dicts
- call WikibasePage._normalizeLanguages on aliases in
WikibasePage._normalizeData

Bug: T194512
Change-Id: I578b08d91cabbf69f071dfddf4afe19329df1e0c
---
M pywikibot/page.py
M tests/wikibase_tests.py
2 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/pywikibot/page.py b/pywikibot/page.py
index dd4f49a..4de9d02 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -3983,19 +3983,23 @@
self._diff_to('descriptions', 'language', 'value', diffto, data)

aliases = self._normalizeLanguages(self.aliases).copy()
- if diffto and 'aliases' in diffto:
- for lang in set(diffto['aliases'].keys()) - set(aliases.keys()):
- aliases[lang] = []
- for lang, strings in list(aliases.items()):
- if diffto and 'aliases' in diffto and lang in diffto['aliases']:
- empty = len(diffto['aliases'][lang]) - len(strings)
- if empty > 0:
- strings += [''] * empty
- elif Counter(val['value'] for val
- in diffto['aliases'][lang]) == Counter(strings):
- del aliases[lang]
- if lang in aliases:
- aliases[lang] = [{'language': lang, 'value': i} for i in strings]
+ if diffto:
+ for lang, strings in diffto.get('aliases', {}).items():
+ if len(aliases.get(lang, [])) > 0:
+ if tuple(sorted(val['value'] for val in strings)) != tuple(
+ sorted(aliases[lang])):
+ aliases[lang] = [{'language': lang, 'value': i}
+ for i in aliases[lang]]
+ else:
+ del aliases[lang]
+ else:
+ aliases[lang] = [
+ {'language': lang, 'value': i['value'], 'remove': ''}
+ for i in strings]
+ else:
+ for lang, values in aliases.items():
+ aliases[lang] = [{'language': lang, 'value': i}
+ for i in values]

if aliases:
data['aliases'] = aliases
@@ -4117,11 +4121,16 @@
data[prop][key] = {'language': key, 'value': value}

if 'aliases' in data:
+ data['aliases'] = cls._normalizeLanguages(data['aliases'])
for key, values in data['aliases'].items():
- if (isinstance(values, list) and
- isinstance(values[0], basestring)):
- data['aliases'][key] = [{'language': key, 'value': value}
- for value in values]
+ if isinstance(values, list):
+ strings = []
+ for value in values:
+ if isinstance(value, basestring):
+ strings.append({'language': key, 'value': value})
+ else:
+ strings.append(value)
+ data['aliases'][key] = strings

return data

diff --git a/tests/wikibase_tests.py b/tests/wikibase_tests.py
index d02b01e..04a4332 100644
--- a/tests/wikibase_tests.py
+++ b/tests/wikibase_tests.py
@@ -1626,14 +1626,20 @@
"""Setup tests."""
super(TestWriteNormalizeData, self).setUp()
self.data_out = {
- 'aliases': {'en': [{'language': 'en', 'value': 'Bah'}]},
+ 'aliases': {'en': [
+ {'language': 'en', 'value': 'Bah'},
+ {'language': 'en', 'value': 'Bar', 'remove': ''},
+ ]},
'labels': {'en': {'language': 'en', 'value': 'Foo'}},
}

def test_normalize_data(self):
"""Test _normalizeData() method."""
data_in = {
- 'aliases': {'en': ['Bah']},
+ 'aliases': {'en': [
+ 'Bah',
+ {'language': 'en', 'value': 'Bar', 'remove': ''},
+ ]},
'labels': {'en': 'Foo'},
}

@@ -1957,6 +1963,10 @@
def test_json_diff(self):
"""Test json diff."""
del self.wdp.labels['en']
+ self.wdp.aliases['de'].append('New York')
+ self.wdp.aliases['de'].append('foo')
+ self.wdp.aliases['de'].remove('NYC')
+ del self.wdp.aliases['nl']
del self.wdp.claims['P213']
expected = {
'labels': {
@@ -1965,6 +1975,18 @@
'value': ''
}
},
+ 'aliases': {
+ 'de': [
+ {'language': 'de', 'value': 'City of New York'},
+ {'language': 'de', 'value': 'The Big Apple'},
+ {'language': 'de', 'value': 'New York'},
+ {'language': 'de', 'value': 'New York'},
+ {'language': 'de', 'value': 'foo'},
+ ],
+ 'nl': [
+ {'language': 'nl', 'value': 'New York', 'remove': ''},
+ ],
+ },
'claims': {
'P213': [
{

To view, visit change 460742. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I578b08d91cabbf69f071dfddf4afe19329df1e0c
Gerrit-Change-Number: 460742
Gerrit-PatchSet: 6
Gerrit-Owner: Matěj Suchánek <matejsuchanek97@gmail.com>
Gerrit-Reviewer: Dalba <dalba.wiki@gmail.com>
Gerrit-Reviewer: Danmichaelo <danmichaelo@gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb@gmail.com>
Gerrit-Reviewer: Matěj Suchánek <matejsuchanek97@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot (75)