jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/460742 )
Change subject: [IMPR] Fix Wikibase aliases handling ......................................................................
[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(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
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': [ {
pywikibot-commits@lists.wikimedia.org