101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
from urllib import request
|
|
from io import TextIOWrapper
|
|
from itertools import groupby
|
|
import re
|
|
import json
|
|
|
|
META_RELEASE_WORD_MATCHER = r'(^\Dist\:\s|Name:\s|Version:\s|Date:\s|Supported:\s|Description:\s|Release\-File\:\s|ReleaseNotes:\s|ReleaseNotesHtml\:\s|UpgradeTool:\s|UpgradeToolSignature:\s)'
|
|
META_SPACE_MATCHER = r'^\s'
|
|
|
|
class SourceMetaRelease:
|
|
|
|
def __init__(self):
|
|
self.meta_release_url = 'http://changelogs.ubuntu.com/meta-release'
|
|
|
|
def meta_release_parse(self):
|
|
""" Returns the meta_release_file parsed as a list of dicts """
|
|
with request.urlopen(self.meta_release_url) as response:
|
|
index_counter = 0
|
|
lines = TextIOWrapper(response, encoding='utf-8')
|
|
stripped_lines = [
|
|
re.split(META_RELEASE_WORD_MATCHER, l.strip())[1::] for l in
|
|
lines ]
|
|
grouped_lines = [list(group) for key, group in
|
|
groupby(stripped_lines, lambda x: x == []) if not key]
|
|
list_of_dicts = []
|
|
|
|
for group in grouped_lines:
|
|
d = {}
|
|
# list of each group
|
|
for arr in group:
|
|
arr_per_group = len(group)
|
|
k = arr[0].lower().replace(":", "").strip()
|
|
v = arr[1].strip()
|
|
|
|
# this builds up our dict by adding one k,v pair per key
|
|
d[f"{k}"] = v
|
|
|
|
list_of_dicts.append(d) if arr_per_group == len(d.keys()) else None
|
|
|
|
return list_of_dicts
|
|
|
|
|
|
class MetaRelease:
|
|
"""
|
|
MetaRelease(): an object for holding onto the contents of a
|
|
meta_release entry
|
|
"""
|
|
def __init__(self, dist=None, name=None, version=None, date=None,
|
|
supported=None, description=None, release_file=None,
|
|
release_notes=None, release_notes_html=None,
|
|
upgrade_tool=None, upgrade_tool_signature=None):
|
|
|
|
self.dist = dist
|
|
self.name = name
|
|
self.version = version
|
|
self.supported = supported
|
|
self.description = description
|
|
self.release_file = release_file
|
|
self.release_notes = release_notes
|
|
self.release_notes_html = release_notes_html
|
|
self.upgrade_tool = upgrade_tool
|
|
self.upgrade_tool_signature = upgrade_tool_signature
|
|
|
|
def to_json(self):
|
|
return json.dumps(self, default=lambda o: o.__dict__,
|
|
indent=4)
|
|
|
|
class MetaReleaseJsons:
|
|
def __init__(self, meta_release):
|
|
self.meta_relesae = meta_release
|
|
|
|
def build(self):
|
|
jsons = []
|
|
for d in meta_release:
|
|
keys = d.keys()
|
|
|
|
meta_release_obj = MetaRelease(
|
|
dist = d.get('dist', None),
|
|
name = d.get('name', None),
|
|
version = d.get('version', None),
|
|
supported = d.get('supported', None),
|
|
description = d.get('description', None),
|
|
release_file = d.get('release-file', None),
|
|
release_notes = d.get('releasenotes', None),
|
|
release_notes_html = d.get('releasenoteshtml', None),
|
|
upgrade_tool = d.get('upgradetool', None),
|
|
upgrade_tool_signature = d.get('upgradetoolsignature', None)
|
|
)
|
|
|
|
jsons.append(meta_release_obj.to_json())
|
|
|
|
return jsons
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
meta_release = SourceMetaRelease().meta_release_parse()
|
|
meta_release_jsons = MetaReleaseJsons(meta_release).build()
|
|
|
|
for release_info in meta_release_jsons:
|
|
print(release_info)
|