From c997a1a2b42838d6eeb23297567aeebcb1ca40d7 Mon Sep 17 00:00:00 2001 From: Jason Robinson Date: Sun, 8 Sep 2019 02:01:58 +0300 Subject: [PATCH] Ensure diaspora mention is extracted even without display name part --- CHANGELOG.md | 4 ++++ federation/entities/diaspora/mixins.py | 13 +++++++++---- federation/tests/entities/diaspora/test_entities.py | 9 +++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 400ee5a..e2682b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,6 +76,10 @@ enum. `ACTOR` means this receiver is a single actor ID. `FOLLOWERS` means this is the followers of the ID in the receiver. +### Fixed + +* Ensure Diaspora mentions are extracted when they don't have a display name part. + ### Removed * **Backwards incompatible.** Support for Legacy Diaspora payloads have been removed to reduce the amount of code needed to maintain while refactoring for ActivityPub. diff --git a/federation/entities/diaspora/mixins.py b/federation/entities/diaspora/mixins.py index 568d543..fcf41cc 100644 --- a/federation/entities/diaspora/mixins.py +++ b/federation/entities/diaspora/mixins.py @@ -22,12 +22,17 @@ class DiasporaEntityMixin(BaseEntity): """ if not hasattr(self, "raw_content"): return set() - mentions = re.findall(r'@{[^;]+; [\w.-]+@[^}]+}', self.raw_content) + mentions = re.findall(r'@{([\S ][^{}]+)}', self.raw_content) if not mentions: return set() - mentions = {s.split(';')[1].strip(' }') for s in mentions} - mentions = {s for s in mentions} - return mentions + _mentions = set() + for mention in mentions: + splits = mention.split(";") + if len(splits) == 1: + _mentions.add(splits[0].strip(' }')) + elif len(splits) == 2: + _mentions.add(splits[1].strip(' }')) + return _mentions def to_string(self) -> str: """ diff --git a/federation/tests/entities/diaspora/test_entities.py b/federation/tests/entities/diaspora/test_entities.py index 1daee01..b3432c2 100644 --- a/federation/tests/entities/diaspora/test_entities.py +++ b/federation/tests/entities/diaspora/test_entities.py @@ -103,6 +103,15 @@ class TestEntitiesExtractMentions: def test_extract_mentions__set_contains_mentioned_handles(self, diasporapost): diasporapost.raw_content = 'yeye @{Jason Robinson 🐍🍻; jaywink@jasonrobinson.me} foobar ' \ '@{bar; foo@example.com}' + response = diasporapost.extract_mentions() + assert response == { + 'jaywink@jasonrobinson.me', + 'foo@example.com', + } + + def test_extract_mentions__set_contains_mentioned_handles__without_display_name(self, diasporapost): + diasporapost.raw_content = 'yeye @{jaywink@jasonrobinson.me} foobar ' \ + '@{bar; foo@example.com}' assert diasporapost.extract_mentions() == { 'jaywink@jasonrobinson.me', 'foo@example.com',