mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-10-04 02:00:11 +02:00
prettify write_yaml metadata
This commit is contained in:
parent
7aa92abebc
commit
f1e0089931
@ -49,7 +49,7 @@ def warn_or_exception(value):
|
||||
elif warnings_action == 'error':
|
||||
raise MetaDataException(value)
|
||||
else:
|
||||
logging.warn(value)
|
||||
logging.warning(value)
|
||||
|
||||
|
||||
# To filter which ones should be written to the metadata files if
|
||||
@ -179,6 +179,7 @@ TYPE_SCRIPT = 5
|
||||
TYPE_MULTILINE = 6
|
||||
TYPE_BUILD = 7
|
||||
TYPE_BUILD_V2 = 8
|
||||
TYPE_INT = 9
|
||||
|
||||
fieldtypes = {
|
||||
'Description': TYPE_MULTILINE,
|
||||
@ -318,6 +319,7 @@ class Build(dict):
|
||||
|
||||
|
||||
flagtypes = {
|
||||
'versionCode': TYPE_INT,
|
||||
'extlibs': TYPE_LIST,
|
||||
'srclibs': TYPE_LIST,
|
||||
'patch': TYPE_LIST,
|
||||
@ -960,41 +962,67 @@ def write_yaml(mf, app):
|
||||
'''Creates a YAML representation of a App/Build instance'''
|
||||
return dumper.represent_dict(data)
|
||||
|
||||
def _builds_to_yaml(app):
|
||||
def _field_to_yaml(typ, value):
|
||||
if typ is TYPE_STRING:
|
||||
return str(value)
|
||||
elif typ is TYPE_INT:
|
||||
return int(value)
|
||||
elif typ is TYPE_MULTILINE:
|
||||
if '\n' in value:
|
||||
return ruamel.yaml.scalarstring.preserve_literal(str(value))
|
||||
else:
|
||||
return str(value)
|
||||
elif typ is TYPE_SCRIPT:
|
||||
if len(value) > 50:
|
||||
return ruamel.yaml.scalarstring.preserve_literal(value)
|
||||
else:
|
||||
return value
|
||||
else:
|
||||
return value
|
||||
|
||||
def _app_to_yaml(app):
|
||||
cm = ruamel.yaml.comments.CommentedMap()
|
||||
insert_newline = False
|
||||
for field in yaml_app_field_order:
|
||||
if field is '\n':
|
||||
# next iteration will need to insert a newline
|
||||
insert_newline = True
|
||||
else:
|
||||
if (hasattr(app, field) and getattr(app, field)) or field is 'Builds':
|
||||
if field is 'Builds':
|
||||
cm.update({field: _builds_to_yaml(app)})
|
||||
elif field is 'CurrentVersionCode':
|
||||
cm.update({field: _field_to_yaml(TYPE_INT, getattr(app, field))})
|
||||
else:
|
||||
cm.update({field: _field_to_yaml(fieldtype(field), getattr(app, field))})
|
||||
|
||||
if insert_newline:
|
||||
# we need to prepend a newline in front of this field
|
||||
insert_newline = False
|
||||
# inserting empty lines is not supported so we add a
|
||||
# bogus comment and over-write its value
|
||||
cm.yaml_set_comment_before_after_key(field, 'bogus')
|
||||
cm.ca.items[field][1][-1].value = '\n'
|
||||
return cm
|
||||
|
||||
def _builds_to_yaml(app):
|
||||
fields = ['versionName', 'versionCode']
|
||||
fields.extend(build_flags_order)
|
||||
|
||||
builds = ruamel.yaml.comments.CommentedSeq()
|
||||
for build in app.builds:
|
||||
b = ruamel.yaml.comments.CommentedMap()
|
||||
for field in fields:
|
||||
if hasattr(build, field) and getattr(build, field):
|
||||
if field is 'versionCode':
|
||||
b.update({field: int(getattr(build, field))})
|
||||
else:
|
||||
b.update({field: getattr(build, field)})
|
||||
b.update({field: _field_to_yaml(flagtype(field), getattr(build, field))})
|
||||
builds.append(b)
|
||||
|
||||
# insert extra empty lines between builds
|
||||
# insert extra empty lines between build entries
|
||||
for i in range(1, len(builds)):
|
||||
builds.yaml_set_comment_before_after_key(i, 'bogus')
|
||||
builds.ca.items[i][1][-1].value = '\n'
|
||||
|
||||
return builds
|
||||
|
||||
empty_keys = [k for k, v in app.items() if not v]
|
||||
for k in empty_keys:
|
||||
del app[k]
|
||||
|
||||
for k in ['added', 'lastUpdated', 'id', 'metadatapath']:
|
||||
if k in app:
|
||||
del app[k]
|
||||
|
||||
# yaml.add_representer(fdroidserver.metadata.App, _class_as_dict_representer)
|
||||
ruamel.yaml.add_representer(fdroidserver.metadata.Build, _class_as_dict_representer)
|
||||
# yaml.dump(app.asOrderedDict(), mf, default_flow_style=False, Dumper=yamlordereddictloader.Dumper)
|
||||
|
||||
yaml_app_field_order = [
|
||||
'Categories',
|
||||
'License',
|
||||
@ -1022,30 +1050,8 @@ def write_yaml(mf, app):
|
||||
'CurrentVersionCode',
|
||||
]
|
||||
|
||||
preformated = ruamel.yaml.comments.CommentedMap()
|
||||
insert_newline = False
|
||||
for field in yaml_app_field_order:
|
||||
if field is '\n':
|
||||
insert_newline = True
|
||||
else:
|
||||
if (hasattr(app, field) and getattr(app, field)) or field is 'Builds':
|
||||
if field in ['Description']:
|
||||
preformated.update({field: ruamel.yaml.scalarstring.preserve_literal(getattr(app, field))})
|
||||
elif field is 'Builds':
|
||||
preformated.update({field: _builds_to_yaml(app)})
|
||||
elif field is 'CurrentVersionCode':
|
||||
preformated.update({field: int(getattr(app, field))})
|
||||
else:
|
||||
preformated.update({field: getattr(app, field)})
|
||||
|
||||
if insert_newline:
|
||||
insert_newline = False
|
||||
# inserting empty lines is not supported so we add a
|
||||
# bogus comment and over-write its value
|
||||
preformated.yaml_set_comment_before_after_key(field, 'bogus')
|
||||
preformated.ca.items[field][1][-1].value = '\n'
|
||||
|
||||
ruamel.yaml.round_trip_dump(preformated, mf, indent=4, block_seq_indent=2)
|
||||
yaml_app = _app_to_yaml(app)
|
||||
ruamel.yaml.round_trip_dump(yaml_app, mf, indent=4, block_seq_indent=2)
|
||||
|
||||
|
||||
build_line_sep = re.compile(r'(?<!\\),')
|
||||
|
64
tests/metadata/app.with.speacial.build.params.txt
Normal file
64
tests/metadata/app.with.speacial.build.params.txt
Normal file
@ -0,0 +1,64 @@
|
||||
AntiFeatures:UpstreamNonFree
|
||||
Categories:System
|
||||
License:GPL-3.0
|
||||
Web Site:
|
||||
Source Code:https://github.com/loadrunner/Facebook-Contact-Sync
|
||||
Issue Tracker:https://github.com/loadrunner/Facebook-Contact-Sync/issues
|
||||
|
||||
Auto Name:UberSync for Facebook
|
||||
Summary:Sync your Facebook Contacts
|
||||
Description:
|
||||
To configure, go to "Settings => Accounts & Sync => Add Account". Depending on
|
||||
how many friends you have, the first import might take a while, so be patient.
|
||||
|
||||
* Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced.
|
||||
* Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list.
|
||||
|
||||
Appbrain SDK was removed before building.
|
||||
.
|
||||
|
||||
Repo Type:git
|
||||
Repo:https://github.com/loadrunner/Facebook-Contact-Sync.git
|
||||
|
||||
Build:1.0.0,32
|
||||
commit=b3879c973e7cac3a3319
|
||||
|
||||
Build:1.0.1,33
|
||||
commit=252c8dd4c9
|
||||
|
||||
Build:1.2.0,39
|
||||
commit=v1.2.0
|
||||
patch=appbrain.patch
|
||||
srclibs=FacebookSDK@sdk-version-3.0.1
|
||||
rm=libs/appbrain-sdk-android.jar
|
||||
prebuild=sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && \
|
||||
sed -i 's/Class\[\]/Class\<?\>\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java
|
||||
|
||||
Build:1.2.2,42
|
||||
commit=v1.2.2
|
||||
patch=appbrain.patch
|
||||
srclibs=FacebookSDK@sdk-version-3.0.2
|
||||
rm=libs/appbrain-sdk-android.jar
|
||||
extlibs=android/android-support-v4.jar
|
||||
prebuild=mv libs/android-support-v4.jar $$FacebookSDK$$/libs/ && \
|
||||
sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && \
|
||||
sed -i 's/Class\[\]/Class\<?\>\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java
|
||||
|
||||
Build:2.1.1,48
|
||||
commit=2.1.1
|
||||
patch=manifest-ads.patch,mobilecore.patch
|
||||
srclibs=FacebookSDK@sdk-version-3.0.2
|
||||
rm=libs/applovin*,libs/mobileCore*
|
||||
extlibs=android/android-support-v4.jar
|
||||
prebuild=cp libs/android-support-v4.jar $$FacebookSDK$$/libs/ && \
|
||||
sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && \
|
||||
sed -i 's/Class\[\]/Class\<?\>\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java
|
||||
|
||||
Build:2.1.2,49
|
||||
disable=Labelled as pre-release, so skipped
|
||||
|
||||
Archive Policy:0 versions
|
||||
Auto Update Mode:None
|
||||
Update Check Mode:None
|
||||
Current Version:2.1.2
|
||||
Current Version Code:49
|
@ -0,0 +1,80 @@
|
||||
Categories:
|
||||
- System
|
||||
License: GPL-3.0
|
||||
SourceCode: https://github.com/loadrunner/Facebook-Contact-Sync
|
||||
IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues
|
||||
|
||||
AutoName: UberSync for Facebook
|
||||
Summary: Sync your Facebook Contacts
|
||||
Description: |-
|
||||
To configure, go to "Settings => Accounts & Sync => Add Account". Depending on
|
||||
how many friends you have, the first import might take a while, so be patient.
|
||||
|
||||
* Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced.
|
||||
* Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list.
|
||||
|
||||
Appbrain SDK was removed before building.
|
||||
|
||||
RepoType: git
|
||||
Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git
|
||||
|
||||
Builds:
|
||||
- versionName: 1.0.0
|
||||
versionCode: 32
|
||||
commit: b3879c973e7cac3a3319
|
||||
|
||||
- versionName: 1.0.1
|
||||
versionCode: 33
|
||||
commit: 252c8dd4c9
|
||||
|
||||
- versionName: 1.2.0
|
||||
versionCode: 39
|
||||
commit: v1.2.0
|
||||
patch:
|
||||
- appbrain.patch
|
||||
srclibs:
|
||||
- FacebookSDK@sdk-version-3.0.1
|
||||
rm:
|
||||
- libs/appbrain-sdk-android.jar
|
||||
prebuild: |-
|
||||
sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && sed -i 's/Class\[\]/Class\<?\>\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java
|
||||
|
||||
- versionName: 1.2.2
|
||||
versionCode: 42
|
||||
commit: v1.2.2
|
||||
patch:
|
||||
- appbrain.patch
|
||||
srclibs:
|
||||
- FacebookSDK@sdk-version-3.0.2
|
||||
rm:
|
||||
- libs/appbrain-sdk-android.jar
|
||||
extlibs:
|
||||
- android/android-support-v4.jar
|
||||
prebuild: |-
|
||||
mv libs/android-support-v4.jar $$FacebookSDK$$/libs/ && sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && sed -i 's/Class\[\]/Class\<?\>\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java
|
||||
|
||||
- versionName: 2.1.1
|
||||
versionCode: 48
|
||||
commit: 2.1.1
|
||||
patch:
|
||||
- manifest-ads.patch
|
||||
- mobilecore.patch
|
||||
srclibs:
|
||||
- FacebookSDK@sdk-version-3.0.2
|
||||
rm:
|
||||
- libs/applovin*
|
||||
- libs/mobileCore*
|
||||
extlibs:
|
||||
- android/android-support-v4.jar
|
||||
prebuild: |-
|
||||
cp libs/android-support-v4.jar $$FacebookSDK$$/libs/ && sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties && sed -i 's/Class\[\]/Class\<?\>\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java
|
||||
|
||||
- versionName: 2.1.2
|
||||
versionCode: 49
|
||||
disable: Labelled as pre-release, so skipped
|
||||
|
||||
ArchivePolicy: 0 versions
|
||||
AutoUpdateMode: None
|
||||
UpdateCheckMode: None
|
||||
CurrentVersion: 2.1.2
|
||||
CurrentVersionCode: 49
|
@ -61,6 +61,27 @@ class RewritemetaTest(unittest.TestCase):
|
||||
self.maxDiff = None
|
||||
self.assertEqual(result.read(), orig.read())
|
||||
|
||||
def test_rewrite_yaml_special_build_params(self):
|
||||
|
||||
# setup/reset test dir if necessary and setup params
|
||||
tmpdir = os.path.join(os.path.dirname(__file__), '..', '.testfiles')
|
||||
if not os.path.exists(tmpdir):
|
||||
os.makedirs(tmpdir)
|
||||
testdir = tempfile.mkdtemp(prefix='test_rewrite_metadata_', dir=tmpdir)
|
||||
fdroidserver.common.config = {'accepted_formats': ['txt', 'yml']}
|
||||
|
||||
# rewrite metadata
|
||||
allapps = fdroidserver.metadata.read_metadata(xref=True)
|
||||
for appid, app in allapps.items():
|
||||
if appid == 'app.with.speacial.build.params':
|
||||
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
|
||||
|
||||
# assert rewrite result
|
||||
with open(os.path.join(testdir, 'app.with.speacial.build.params.yml'), 'r', encoding='utf-8') as result:
|
||||
with open('metadata/rewrite-yml/app.with.speacial.build.params.yml', 'r', encoding='utf-8') as orig:
|
||||
self.maxDiff = None
|
||||
self.assertEqual(result.read(), orig.read())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = optparse.OptionParser()
|
||||
|
Loading…
Reference in New Issue
Block a user