prettify write_yaml metadata

This commit is contained in:
Michael Pöhn 2017-05-07 02:13:25 +02:00
parent 7aa92abebc
commit f1e0089931
4 changed files with 215 additions and 44 deletions

View File

@ -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'(?<!\\),')

View 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

View File

@ -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

View File

@ -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()