mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-11-15 11:40:30 +03:00
update: insert donation links based on FUNDING.yml
GitHub has specified FUNDING.yml, a file to include in a git repo for pointing people to donation links. Since F-Droid also points people to donation links, this parses them to fill out Donate: and OpenCollective:. Specifying those in the metadata file takes precedence over the FUNDING.yml. This follows the same pattern as how `fdroid update` includes Fastlane/Triple-T metadata. This lets the git repo maintain those specific donations links themselves. https://help.github.com/en/articles/displaying-a-sponsor-button-in-your-repository#about-funding-files The test file was generated using: ```python import os, re, yaml found = dict() for root, dirs, files in os.walk('.'): for f in files: if f == 'FUNDING.yml': with open(os.path.join(root, f)) as fp: data = yaml.safe_load(fp) for k, v in data.items(): if k not in found: found[k] = set() if not v: continue if isinstance(v, list): for i in v: found[k].add(i) else: found[k].add(v) with open('gather-funding-names.yaml', 'w') as fp: output = dict() for k, v in found.items(): output[k] = sorted(v) yaml.dump(output, fp, default_flow_style=False) ```
This commit is contained in:
parent
8d517d4583
commit
0183592526
5 changed files with 420 additions and 1 deletions
|
|
@ -8,6 +8,7 @@ import inspect
|
|||
import logging
|
||||
import optparse
|
||||
import os
|
||||
import random
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
|
|
@ -33,6 +34,12 @@ import fdroidserver.update
|
|||
from fdroidserver.common import FDroidPopen
|
||||
|
||||
|
||||
DONATION_FIELDS = (
|
||||
'Donate',
|
||||
'OpenCollective',
|
||||
)
|
||||
|
||||
|
||||
class UpdateTest(unittest.TestCase):
|
||||
'''fdroid update'''
|
||||
|
||||
|
|
@ -972,6 +979,84 @@ class UpdateTest(unittest.TestCase):
|
|||
'VercodeOperation': '',
|
||||
'WebSite': ''})
|
||||
|
||||
def test_insert_funding_yml_donation_links(self):
|
||||
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
||||
os.chdir(testdir)
|
||||
os.mkdir('build')
|
||||
content = textwrap.dedent("""
|
||||
community_bridge: ''
|
||||
custom: [LINK1, LINK2]
|
||||
github: USERNAME
|
||||
issuehunt: USERNAME
|
||||
ko_fi: USERNAME
|
||||
liberapay: USERNAME
|
||||
open_collective: USERNAME
|
||||
otechie: USERNAME
|
||||
patreon: USERNAME
|
||||
""")
|
||||
app = fdroidserver.metadata.App()
|
||||
app.id = 'fake.app.id'
|
||||
apps = {app.id: app}
|
||||
os.mkdir(os.path.join('build', app.id))
|
||||
fdroidserver.update.insert_funding_yml_donation_links(apps)
|
||||
for field in DONATION_FIELDS:
|
||||
self.assertFalse(app.get(field))
|
||||
with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp:
|
||||
fp.write(content)
|
||||
|
||||
fdroidserver.update.insert_funding_yml_donation_links(apps)
|
||||
for field in DONATION_FIELDS:
|
||||
self.assertIsNotNone(app.get(field), field)
|
||||
self.assertEqual('LINK1', app.get('Donate'))
|
||||
self.assertEqual('USERNAME', app.get('OpenCollective'))
|
||||
|
||||
app['Donate'] = 'keepme'
|
||||
app['OpenCollective'] = 'keepme'
|
||||
fdroidserver.update.insert_funding_yml_donation_links(apps)
|
||||
for field in DONATION_FIELDS:
|
||||
self.assertEqual('keepme', app.get(field))
|
||||
|
||||
def test_insert_funding_yml_donation_links_with_corrupt_file(self):
|
||||
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
||||
os.chdir(testdir)
|
||||
os.mkdir('build')
|
||||
app = fdroidserver.metadata.App()
|
||||
app.id = 'fake.app.id'
|
||||
apps = {app.id: app}
|
||||
os.mkdir(os.path.join('build', app.id))
|
||||
with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp:
|
||||
fp.write(textwrap.dedent("""
|
||||
opencollective: foo
|
||||
custom: []
|
||||
liberapay: :
|
||||
"""))
|
||||
fdroidserver.update.insert_funding_yml_donation_links(apps)
|
||||
for field in DONATION_FIELDS:
|
||||
self.assertIsNone(app.get(field))
|
||||
|
||||
def test_sanitize_funding_yml(self):
|
||||
with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp:
|
||||
data = yaml.safe_load(fp)
|
||||
for k, entries in data.items():
|
||||
for entry in entries:
|
||||
if k in 'custom':
|
||||
m = fdroidserver.update.sanitize_funding_yml_entry(entry)
|
||||
else:
|
||||
m = fdroidserver.update.sanitize_funding_yml_name(entry)
|
||||
if k == 'bad':
|
||||
self.assertIsNone(m)
|
||||
else:
|
||||
self.assertIsNotNone(m)
|
||||
self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry('foo\nbar'))
|
||||
self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry(
|
||||
''.join(chr(random.randint(65, 90)) for _ in range(2049))))
|
||||
|
||||
# not recommended but valid entries
|
||||
self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(12345))
|
||||
self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(5.0))
|
||||
self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(' WhyIncludeWhitespace '))
|
||||
self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second']))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue