From f9864dc3a2b754f069b2178756e065a654ea6b12 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 May 2023 14:51:04 +0200 Subject: [PATCH] rewritemeta: split into remove_blank_flags_from_builds() This takes this key bit of functionality, splits it out as its own function, and adds some unit tests. --- fdroidserver/rewritemeta.py | 29 ++++++--- tests/rewritemeta.TestCase | 122 +++++++++++++++++++++++++++++++++++- 2 files changed, 138 insertions(+), 13 deletions(-) diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 0e7ad021..7413b029 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -44,6 +44,22 @@ def proper_format(app): return content == cur_content +def remove_blank_flags_from_builds(builds): + """Remove unset entries from Builds so they are not written out.""" + if not builds: + return list() + newbuilds = list() + for build in builds: + new = dict() + for k in metadata.build_flags: + v = build[k] + if v is None or v is False or v == [] or v == '': + continue + new[k] = v + newbuilds.append(new) + return newbuilds + + def main(): global config, options @@ -82,16 +98,9 @@ def main(): print(path) continue - newbuilds = [] - for build in app.get('Builds', []): - new = metadata.Build() - for k in metadata.build_flags: - v = build[k] - if v is None or v is False or v == [] or v == '': - continue - new[k] = v - newbuilds.append(new) - app['Builds'] = newbuilds + builds = remove_blank_flags_from_builds(app.get('Builds')) + if builds: + app['Builds'] = builds # rewrite to temporary file before overwriting existing # file in case there's a bug in write_metadata diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 283e9c44..0bcc704e 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -9,15 +9,14 @@ import tempfile import textwrap from pathlib import Path -from testcommon import TmpCwd +from testcommon import TmpCwd, mkdtemp localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) -from fdroidserver import common -from fdroidserver import rewritemeta +from fdroidserver import common, metadata, rewritemeta class RewriteMetaTest(unittest.TestCase): @@ -27,6 +26,123 @@ class RewriteMetaTest(unittest.TestCase): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' os.chdir(self.basedir) + metadata.warnings_action = 'error' + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + self._td.cleanup() + + def test_remove_blank_flags_from_builds_com_politedroid_3(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'com.politedroid' + app = metadata.read_metadata({appid: -1})[appid] + builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[0], + { + 'versionName': '1.2', + 'versionCode': 3, + 'commit': '6a548e4b19', + 'target': 'android-10', + 'antifeatures': [ + 'KnownVuln', + 'UpstreamNonFree', + 'NonFreeAssets', + ], + }, + ) + + def test_remove_blank_flags_from_builds_com_politedroid_4(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'com.politedroid' + app = metadata.read_metadata({appid: -1})[appid] + builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[1], + { + 'versionName': '1.3', + 'versionCode': 4, + 'commit': 'ad865b57bf3ac59580f38485608a9b1dda4fa7dc', + 'target': 'android-15', + }, + ) + + def test_remove_blank_flags_from_builds_no_builds(self): + """Unset fields in Builds: entries should be removed.""" + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds(None), + list(), + ) + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds(dict()), + list(), + ) + + def test_rewrite_no_builds(self): + os.chdir(self.testdir) + Path('metadata').mkdir() + with Path('metadata/a.yml').open('w') as f: + f.write('AutoName: a') + rewritemeta.main() + self.assertEqual( + Path('metadata/a.yml').read_text(encoding='utf-8'), + textwrap.dedent( + '''\ + License: Unknown + + AutoName: a + + AutoUpdateMode: None + UpdateCheckMode: None + ''' + ), + ) + + def test_rewrite_empty_build_field(self): + os.chdir(self.testdir) + Path('metadata').mkdir() + with Path('metadata/a.yml').open('w') as fp: + fp.write( + textwrap.dedent( + """ + License: Apache-2.0 + Builds: + - versionCode: 4 + versionName: a + rm: + """ + ) + ) + rewritemeta.main() + self.assertEqual( + Path('metadata/a.yml').read_text(encoding='utf-8'), + textwrap.dedent( + '''\ + License: Apache-2.0 + + Builds: + - versionName: a + versionCode: 4 + + AutoUpdateMode: None + UpdateCheckMode: None + ''' + ), + ) + + def test_remove_blank_flags_from_builds_app_with_special_build_params(self): + appid = 'app.with.special.build.params' + app = metadata.read_metadata({appid: -1})[appid] + builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[-1], + { + 'versionName': '2.1.2', + 'versionCode': 51, + 'disable': 'Labelled as pre-release, so skipped', + }, + ) def test_rewrite_scenario_trivial(self): sys.argv = ['rewritemeta', 'a', 'b']