ATProto.add_source_links: truncate before adding source links

for #976
pull/1125/head
Ryan Barrett 2024-06-06 14:02:22 -07:00
rodzic 27fc843825
commit 183c829229
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 69 dodań i 4 usunięć

Wyświetl plik

@ -13,6 +13,7 @@ from arroba.repo import Repo, Write
import arroba.server
from arroba.storage import Action, CommitData
from arroba.util import at_uri, dag_cbor_cid, next_tid, parse_at_uri, service_jwt
import brevity
import dag_json
from flask import abort, request
from google.cloud import dns
@ -639,7 +640,9 @@ class ATProto(User, Protocol):
"""
assert obj.our_as1
assert from_user
summary = html_to_text(obj.our_as1.setdefault('summary', ''))
# WARNING: keep this in sync with 'description': html_to_text(..) in
# granary.bluesky.from_as1 for ACTOR_TYPES!
summary = html_to_text(obj.our_as1.setdefault('summary', ''), ignore_links=False)
if 'fed.brid.gy ]' in summary or 'Bridgy Fed]' in summary:
return
@ -650,15 +653,26 @@ class ATProto(User, Protocol):
if proto_phrase:
proto_phrase = f' on {proto_phrase}'
if from_user.key and id == from_user.profile_id():
if from_user.key and id in (from_user.key.id(), from_user.profile_id()):
url = from_user.web_url()
else:
url = as1.get_url(obj.our_as1) or id
url = util.pretty_link(url) if url else (proto_phrase or '?')
url = util.pretty_link(url) if url else '?'
source_links = f'[bridged from {url}{proto_phrase} by https://{PRIMARY_DOMAIN}/ ]'
source_links_len = len(source_links)
if summary:
summary += '<br><br>'
source_links = '<br><br>' + source_links
source_links_len += 2 # the <br>s get converted to \n's
max_graphemes = LEXICONS['app.bsky.actor.profile']['record']['properties']['description']['maxGraphemes']
limit = max_graphemes - source_links_len
if len(summary) > limit:
summary = brevity.truncate_to_nearest_word(summary, limit - 4) + ' […]'
# this will get html_to_text'ed again, in granary.bluesky.from_as1, so
# preserve newlines
summary = summary.replace('\n', '<br>')
obj.our_as1['summary'] = summary + source_links
@classmethod

Wyświetl plik

@ -1,4 +1,5 @@
git+https://github.com/snarfed/arroba.git#egg=arroba
git+https://github.com/snarfed/brevity.git@truncate_to_nearest_word#egg=brevity
git+https://github.com/snarfed/carbox.git#egg=carbox
git+https://github.com/snarfed/dag-json.git#egg=dag_json
git+https://github.com/dvska/gdata-python3.git#egg=gdata

Wyświetl plik

@ -706,6 +706,56 @@ class ATProtoTest(TestCase):
'displayName': 'Alice',
})))
def test_convert_non_atproto_actor_adds_source_links(self):
user = self.make_user_and_repo()
self.assertEqual({
'$type': 'app.bsky.actor.profile',
'displayName': 'Alice',
'description': '[bridged from web:fake:user on fake-phrase by https://fed.brid.gy/ ]',
'labels': {
'$type': 'com.atproto.label.defs#selfLabels',
'values': [{'val': 'bridged-from-bridgy-fed-fake'}],
},
}, ATProto.convert(Object(source_protocol='fake', our_as1={
'objectType': 'person',
'id': 'fake:user',
'displayName': 'Alice',
}), from_user=user))
def test_convert_non_atproto_update_actor_truncates_before_source_links(self):
user = self.make_user_and_repo()
self.assertEqual({
'$type': 'app.bsky.actor.profile',
'displayName': 'Alice',
'description': """\
Mauris laoreet dolor eu ligula vulputate aliquam.
Aenean vel augue at ipsum vestibulum ultricies.
Nam quis tristique elit.
Sed tortor neque, aliquet quis posuere aliquam, imperdiet []
[bridged from web:fake:user on fake-phrase by https://fed.brid.gy/ ]""",
'labels': {
'$type': 'com.atproto.label.defs#selfLabels',
'values': [{'val': 'bridged-from-bridgy-fed-fake'}],
},
}, ATProto.convert(Object(source_protocol='fake', our_as1={
'objectType': 'person',
'id': 'fake:user',
'displayName': 'Alice',
# 255 chars when converted to plain text. the app.bsky.actor.profile
# description limit is 256 graphemes.
'summary': """\
<p>Mauris laoreet dolor eu ligula vulputate aliquam.</p>
Aenean vel augue at ipsum vestibulum ultricies.<br>
Nam quis tristique elit.<br>
<br>
Sed tortor neque, aliquet quis posuere aliquam, imperdiet sitamet odio. In molestie, mi tincidunt maximus congue, sem risus comod.""",
}), from_user=user))
@patch('requests.get', return_value=requests_response('', status=404))
def test_web_url(self, mock_get):
user = self.make_user('did:plc:user', cls=ATProto)