prepare_xep_list.py

Mon, 07 Aug 2023 12:47:52 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 07 Aug 2023 12:47:52 +0100
changeset 7
bfc568736c13
parent 0
8e1675826e46
permissions
-rwxr-xr-x

metadata: Fix prepared statements joining on XEP status

0
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 This file is used to download the XEP list and convert it to JSON
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 from typing import Any
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 import json
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 import os
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 import sys
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 import requests
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 from defusedxml.ElementTree import fromstring
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 from defusedxml.ElementTree import ParseError
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 XEP_LIST_URL = 'https://xmpp.org/extensions/xeplist.xml'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 def build_xep_list() -> None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 Download and parse xeplist.xml and build xeplist.json
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 try:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 xeplist_request = requests.get(XEP_LIST_URL)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 except requests.exceptions.RequestException as err:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 sys.exit(f'Error while requesting xeplist.xml ({err}')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 if not 200 >= xeplist_request.status_code < 400:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 sys.exit(f'Error while downloading xeplist.xml '
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 f'({xeplist_request.status_code}')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 try:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 root = fromstring(xeplist_request.content)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 except ParseError:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 sys.exit('Error while parsing xeplist.xml')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 def fix_status(status: str) -> str:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 if status == 'Draft':
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 return 'Stable'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 return status
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 xeps: list[dict[str, Any]] = []
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 for xep in root.findall("xep"):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 xep_data = {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 'title': xep.find('title').text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 'status': fix_status(xep.find('status').text),
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 'number': int(xep.find('number').text) if xep.find('number').text != 'xxxx' else None,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 'last_updated': xep.find('last-revision').find('date').text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 'version': xep.find('last-revision').find('version').text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 'type': xep.find('type').text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 'approver': xep.find('approver').text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 }
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 if xep.get("accepted") == "true":
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 xep_data.update({
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 'accepted': True,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 'short_name': xep.find('shortname').text if xep.find('shortname') else None,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 'url': f'https://xmpp.org/extensions/xep-{xep_data["number"]:04d}.html',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 })
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 else:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 xep_data.update({
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 'accepted': False,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 'short_name': xep.find("proto-name").text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 'url': f'https://xmpp.org/extensions/inbox/{xep.find("proto-name").text}.html',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 })
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 xeps.append(xep_data)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 base_path = os.path.dirname(os.path.abspath(sys.argv[0]))
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 with open(f'{base_path}/../data/xeplist.json',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 'w',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 encoding='utf-8') as json_file:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 json.dump(xeps, json_file, indent=4)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 print('XEP List prepared successfully')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 if __name__ == '__main__':
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 build_xep_list()

mercurial