From 5f00b4e581e2dfe118014fc0f849d14095469d37 Mon Sep 17 00:00:00 2001 From: bpmcdevitt Date: Sat, 20 Aug 2022 22:45:06 -0500 Subject: [PATCH] trying to add a release class now --- tools/ubuntu_package_puller/README.md | 8 +++ tools/ubuntu_package_puller/meta_release.py | 47 +++++-------- tools/ubuntu_package_puller/release.py | 73 +++++++++++++++++++++ 3 files changed, 96 insertions(+), 32 deletions(-) create mode 100644 tools/ubuntu_package_puller/release.py diff --git a/tools/ubuntu_package_puller/README.md b/tools/ubuntu_package_puller/README.md index 331fcc7..a377e4f 100644 --- a/tools/ubuntu_package_puller/README.md +++ b/tools/ubuntu_package_puller/README.md @@ -62,3 +62,11 @@ Description-md5: 8f4d76592086bd210b07fd8b6370be43 # below command can be used to check the output number of results wc -l source_packages_remote_ubuntu_2004.default 13991 source_packages_remote_ubuntu_2004.default + +#### IPython examples using library: +``` +# setup base launchpad client +from ubuntu_launchpad_distro_archive_lookup import UbuntuDistroLaunchpad as udl + +launchpad = udl().launchpad +``` diff --git a/tools/ubuntu_package_puller/meta_release.py b/tools/ubuntu_package_puller/meta_release.py index cf4f80c..491cae1 100644 --- a/tools/ubuntu_package_puller/meta_release.py +++ b/tools/ubuntu_package_puller/meta_release.py @@ -40,26 +40,28 @@ class SourceMetaRelease: return list_of_dicts -class MetaRelease: +class MetaRelease(object): """ MetaRelease(): an object for holding onto the contents of a meta_release entry """ - def __init__(self, dist=None, name=None, version=None, date=None, + def __init__(self, meta_dict, 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 + # swtich back to get + self.dist = meta_dict.get('dist', None) + self.name = meta_dict.get('name', None) + self.version = meta_dict.get('version', None) + self.supported = meta_dict.get('supported', None) + self.description = meta_dict.get('description', None) + self.release_file = meta_dict.get('release-file', None) + self.release_notes = meta_dict.get('releasenotes', None) + self.release_notes_html = meta_dict.get('releasenoteshtml', None) + self.upgrade_tool = meta_dict.get('upgradetool', None) + self.upgrade_tool_signature = meta_dict.get('upgradetoolsignature', None) + def to_json(self): return json.dumps(self, default=lambda o: o.__dict__, @@ -70,26 +72,7 @@ class MetaReleaseJsons: self.meta_release = meta_release def build(self): - jsons = [] - for d in self.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 + return [ MetaRelease(meta_dict).to_json() for meta_dict in self.meta_release ] if __name__ == '__main__': diff --git a/tools/ubuntu_package_puller/release.py b/tools/ubuntu_package_puller/release.py new file mode 100644 index 0000000..139bc5f --- /dev/null +++ b/tools/ubuntu_package_puller/release.py @@ -0,0 +1,73 @@ +from urllib import request +from io import TextIOWrapper +from itertools import groupby +import re +import json +from meta_release import SourceMetaRelease, MetaRelease + + +RELEASE_WORD_MATCHER = r'(^\Origin\:\s|Label:\s|Suite:\s|Version:\s|Codename:\s|Date:\s|Architecture:\s|Components:\s|Description\:\s|MD5Sum:\s)' + +class Release: + def __init__(self, distro_codename): + # example url:http://old-releases.ubuntu.com/ubuntu/dists/hoary/Release + # example distro_codename = 'hoary' + self.distro_codename = distro_codename + self.meta_release = self.changelog_release_file() + + def changelog_release_file(self): + meta_release = SourceMetaRelease().meta_release_parse() + return meta_release + + def distro_release_file_urls(self): + meta_release_objects = [] + + for d in self.meta_release: + meta_release_obj = MetaRelease(d) + dist_and_release_file_url = { meta_release_obj.dist, meta_release_obj.release_file } + print(type(dist_and_release_file_url)) + meta_release_objects.append(dist_and_release_file_url) + + return meta_release_objects + + def release_file_parse(self, release_file_url): + """ Returns the meta_release_file parsed as a list of dicts """ + with request.urlopen(f'{release_file_url}') as response: + index_counter = 0 + lines = TextIOWrapper(response, encoding='utf-8') + stripped_lines = [ + re.split(RELEASE_WORD_MATCHER, l.strip()) for l in + lines ] + print(stripped_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 + +if __name__ == '__main__': + # testing + + r = Release('focal') + release_file_urls = r.distro_release_file_urls() + + for meta_release in release_file_urls: + print(meta_release) + #keys = meta_release.keys() + #for distro in keys: + # url = meta_release[distro] + # print(url) +