Skip to content

Commit 80ba3ba

Browse files
authored
defaultdict style refactor (#39)
1 parent 30cdbea commit 80ba3ba

2 files changed

Lines changed: 55 additions & 60 deletions

File tree

VersionStatus.py

Lines changed: 55 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
import os
44
import re
55
import sys
6-
from collections import defaultdict
7-
from collections import OrderedDict
6+
from collections import defaultdict, OrderedDict
87

98
import click
109
import jinja2
1110
import requests
12-
from packaging import version
1311
import validators
14-
12+
from packaging import version
1513

1614
OS_URI = "https://releases.openstack.org/{}"
1715
RPM_OS_URI_MAPPING = {
@@ -56,31 +54,31 @@
5654
re.compile(r"^[-_\w]+[-_]tempest[-_]plugin$"), # *-tempest-plugin
5755
]
5856
OPENEULER_DEFAULT_REPLACE = re.compile(r"[._]")
59-
PROXY = {}
57+
REQUESTS_ARGS = {}
6058

6159

6260
class ReleasesConfig:
6361
def __init__(self, content, arch):
6462
if not isinstance(content, str):
6563
raise RuntimeError('Input Error')
6664
self.releases = [r.strip() for r in content.split(',') if r]
67-
self.releases_config = dict()
65+
self.releases_config = {}
6866
for release in self.releases:
6967
from_os_version, to_os_version = release.split('/', 1)
70-
self.releases_config[release] = dict()
71-
self.releases_config[release]['rpm_os_ver_uri'] = list()
68+
self.releases_config[release] = {}
69+
self.releases_config[release]['rpm_os_ver_uri'] = []
7270
self.releases_config[release]['os_ver_uri'] = [
7371
OS_URI.format(from_os_version), ]
7472
# Get URL template
7573
for _to_version_tuple in RPM_OS_URI_MAPPING.keys():
7674
if to_os_version in _to_version_tuple:
77-
_url = RPM_OS_URI_MAPPING.get(_to_version_tuple)
75+
_url = RPM_OS_URI_MAPPING[_to_version_tuple]
7876
if isinstance(_url, dict):
7977
_url = _url[from_os_version]
8078
break
8179
# openstack vs openstack
8280
else:
83-
self.release_config[release]['os_ver_url'].append(
81+
self.releases_config[release]['os_ver_url'].append(
8482
OS_URI.format(to_os_version))
8583
return
8684

@@ -134,18 +132,18 @@ def render(self):
134132
for pkg_name, pkg_info in _value['data'].items():
135133
output += "{:<30} {:<15} {:<15} {:<15}\n".format(
136134
pkg_name,
137-
pkg_info.get('base_package_version'),
138-
str(pkg_info.get('comparison_package_version')),
139-
pkg_info.get('status'))
135+
pkg_info['base_package_version'],
136+
str(pkg_info['comparison_package_version']),
137+
pkg_info['status'])
140138
output += "\n"
141139
if "html" == self.file_format:
142-
SHA_TZ = datetime.timezone(
140+
sha_tz = datetime.timezone(
143141
datetime.timedelta(hours=8),
144142
name='Asia/Shanghai',
145143
)
146144
utc_now = datetime.datetime.utcnow().replace(
147145
tzinfo=datetime.timezone.utc)
148-
xian_now = utc_now.astimezone(SHA_TZ)
146+
xian_now = utc_now.astimezone(sha_tz)
149147
output = jinja2.Environment(
150148
loader=jinja2.FileSystemLoader(
151149
self.template_path)).get_template(self.template).render(
@@ -170,7 +168,7 @@ def __init__(self, _rpm_os_ver_uri_list):
170168
def rpm_versions(self):
171169
results = dict()
172170
for _rpm_os_ver_uri in self.rpm_os_ver_uri_list:
173-
r = requests.get(_rpm_os_ver_uri, proxies=PROXY, verify=False)
171+
r = requests.get(_rpm_os_ver_uri, **REQUESTS_ARGS)
174172
if r.status_code != requests.codes.ok:
175173
raise RuntimeError('CAN NOT GET {}'.format(_rpm_os_ver_uri))
176174
uri_content = r.content.decode()
@@ -189,25 +187,24 @@ def rpm_versions(self):
189187
results[pkg_name] = pkg_info
190188
else:
191189
# if current version < new version, then update it
192-
if version.parse(results.get(pkg_name).get('version')) \
190+
if version.parse(results[pkg_name]['version']) \
193191
< version.parse(pkg_ver):
194-
results.get(pkg_name).update(version=pkg_ver)
192+
results[pkg_name].update(version=pkg_ver)
195193
return results
196194

197195

198196
class UpstreamVersions:
199197
def __init__(self, _os_ver_uri):
200198
self.url_os_content = requests.get(_os_ver_uri,
201-
proxies=PROXY,
202-
verify=False).content.decode()
199+
**REQUESTS_ARGS).content.decode()
203200

204201
@property
205202
def upstream_versions(self):
206203
# get all links, which ends .tar.gz from HTML
207204
links = re.findall(r'https://.*\.tar\.gz', self.url_os_content)
208205
results = dict()
209206
for pkg_link in links:
210-
# get name and package informations from link
207+
# get name and package information from link
211208
tmp = pkg_link.split("/")
212209
pkg_full_name = tmp[4]
213210
pkg_name = pkg_full_name[0:pkg_full_name.rfind('-')]
@@ -220,9 +217,9 @@ def upstream_versions(self):
220217
results[pkg_name] = pkg_info
221218
else:
222219
# if current versions < new version, then update it
223-
if version.parse(results.get(pkg_name).get('version')) \
220+
if version.parse(results[pkg_name]['version']) \
224221
< version.parse(pkg_ver):
225-
results.get(pkg_name).update(version=pkg_ver)
222+
results[pkg_name].update(version=pkg_ver)
226223
return results
227224

228225

@@ -248,7 +245,7 @@ def sanitize_base_pkg_name(_base_pkg_name, str_to_replace):
248245
"+python3-": "python3-{}".format(default_replace),
249246
"+openstack-": "openstack-{}".format(default_replace)
250247
}
251-
return cases.get(str_to_replace)
248+
return cases[str_to_replace]
252249

253250
def is_in_comp_data(_base_pkg_name, _replacement):
254251
if sanitize_base_pkg_name(_base_pkg_name, replacement) \
@@ -298,25 +295,25 @@ def filter_upstream(_base_pkg_name):
298295
overall_status = STATUS_NONE
299296
for base_pkg_name in filter(filter_upstream, self._base_data.keys()):
300297
comp_pkg_name = self.get_pair(base_pkg_name, self._comp_data)
301-
base_pkg_ver = self._base_data.get(base_pkg_name).get('version')
298+
base_pkg_ver = self._base_data[base_pkg_name]['version']
302299
# if to comparison package and base package have pair
303300
if comp_pkg_name is not None:
304-
comp_pkg_info = self._comp_data.get(comp_pkg_name)
305-
comp_pkg_ver = comp_pkg_info.get('version')
301+
comp_pkg_info = self._comp_data[comp_pkg_name]
302+
comp_pkg_ver = comp_pkg_info['version']
306303
status = set_status(base_pkg_ver, comp_pkg_ver)
307-
pkg_infos = dict(comparison_package_version=comp_pkg_ver,
308-
base_package_version=base_pkg_ver,
309-
status=status[1], status_id=status[0])
304+
pkg_info = dict(comparison_package_version=comp_pkg_ver,
305+
base_package_version=base_pkg_ver,
306+
status=status[1], status_id=status[0])
310307
if status == STATUS_OUTDATED:
311308
overall_status = STATUS_OUTDATED
312309
paired += 1
313310
del self._comp_data[comp_pkg_name]
314311
else:
315-
pkg_infos = dict(comparison_package_version=None,
316-
base_package_version=base_pkg_ver,
317-
status=STATUS_MISSING[1],
318-
status_id=STATUS_MISSING[0])
319-
result_data[base_pkg_name] = pkg_infos
312+
pkg_info = dict(comparison_package_version=None,
313+
base_package_version=base_pkg_ver,
314+
status=STATUS_MISSING[1],
315+
status_id=STATUS_MISSING[0])
316+
result_data[base_pkg_name] = pkg_info
320317

321318
result_data = OrderedDict(sorted(result_data.items(),
322319
key=lambda x:
@@ -328,53 +325,53 @@ def filter_upstream(_base_pkg_name):
328325

329326

330327
@click.command(context_settings=dict(help_option_names=['-h', '--help']))
331-
@click.option('-r', '--releases', is_flag=False, metavar='<release-distro>',
332-
type=click.STRING, required=True,
333-
help='Comma separated releases with openstack or '
334-
'distribution of openEuler to check, for example: '
335-
'rocky/20.03-LTS-SP2,rocky/train')
336-
@click.option('-t', '--file-type', default='html',
328+
@click.option('-r', '--releases', default='train/20.03-LTS-SP3',
329+
type=click.STRING, required=False, show_default=True,
330+
help='Comma separated releases with openstack/openEuler '
331+
'to check, for example: '
332+
'rocky/20.03-LTS-SP2,train/20.03-LTS-SP3')
333+
@click.option('-t', '--file-type', default='html', required=False,
337334
show_default=True, help='Output file format',
338335
type=click.Choice(['txt', 'html']))
339-
@click.option('-n', '--file-name-os', default='index.html',
336+
@click.option('-n', '--file-name', default='index.html',
340337
required=False, show_default=True,
341338
help='Output file name of openstack version checker')
342339
@click.option('-a', '--arch', default='aarch64',
343340
required=False, show_default=True,
344341
type=click.Choice(['aarch64', 'x86_64']),
345342
help='CPU architecture of distribution')
346343
@click.option('-p', '--proxy', required=False, help='HTTP proxy url')
347-
def run(releases, file_type, file_name_os, arch, proxy):
348-
if releases:
349-
releases_config = ReleasesConfig(releases, arch)
344+
@click.option('-b', '--bypass-ssl-verify', default=False,
345+
required=False, show_default=True, is_flag=True,
346+
help='Bypass SSL verify')
347+
def run(releases, file_type, file_name, arch, proxy, bypass_ssl_verify):
350348
if isinstance(proxy, str) and validators.url(proxy):
351-
PROXY.update({'http': proxy, 'https': proxy})
349+
REQUESTS_ARGS.update({'proxies': {'http': proxy, 'https': proxy}})
350+
REQUESTS_ARGS.update({'verify': not bypass_ssl_verify})
351+
releases_config = ReleasesConfig(releases, arch)
352+
ver_data = {}
352353

353-
ver_data = dict()
354354
for release in releases_config.releases:
355-
_release_config = releases_config.releases_config.get(release)
356-
from_os_uri = _release_config.get('os_ver_uri')[0]
355+
_release_config = releases_config.releases_config[release]
356+
from_os_uri = _release_config['os_ver_uri'][0]
357357
from_os_data = UpstreamVersions(from_os_uri).upstream_versions
358358
# openstack version check openEuler
359-
_rpm_os_ver_uri = _release_config.get('rpm_os_ver_uri')
359+
_rpm_os_ver_uri = _release_config['rpm_os_ver_uri']
360360
if _rpm_os_ver_uri:
361361
to_os_data = RPMVersions(_rpm_os_ver_uri).rpm_versions
362362
# openstack version check openstack
363363
else:
364-
to_os_uri = _release_config.get('os_ver_uri')[-1]
364+
to_os_uri = _release_config['os_ver_uri'][-1]
365365
to_os_data = UpstreamVersions(to_os_uri).upstream_versions
366366

367367
ver_data[release] = VersionsComparator(from_os_data,
368368
to_os_data).compared_data
369-
ver_data[release]['apt'] = _release_config.get(
370-
'os_ver_uri') + _release_config.get('rpm_os_ver_uri')
369+
ver_data[release]['apt'] = _release_config['os_ver_uri'] + \
370+
_release_config['rpm_os_ver_uri']
371371

372372
Renderer(ver_data, "template_os_checker.j2", file_type,
373-
file_name_os).render()
373+
file_name).render()
374374

375375

376376
if __name__ == '__main__':
377-
if len(sys.argv) == 1:
378-
run.main(['--help'])
379-
else:
380-
run()
377+
run()

requirements.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
PyYAML>=5.3.1
21
requests>=2.24.0
32
Jinja2>=2.11.2
43
packaging>=20.4
54
click>=7.1.2
6-
htmlmin>=0.1.12
75
validators

0 commit comments

Comments
 (0)