normalize_json.lua

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 5
e28748388509
permissions
-rw-r--r--

metadata: Fix prepared statements joining on XEP status

0
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local json = require "cjson";
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local data_base_path = "data/";
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local function read_json_file(fn)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local data = assert(io.open(data_base_path .. fn)):read("*a");
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 return assert(json.decode(data));
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 end
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 local software_list = read_json_file("software_list_doap.json");
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local software_table = {};
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local known_software = {};
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 local software_categories_table = {};
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local software_platforms_table = {};
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 local software_counter = -1;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 for software_name, entry in pairs(software_list) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 software_counter = software_counter + 1;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 known_software[entry.name_slug] = software_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local new_entry = {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 id = software_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 short_name = entry.name_slug;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 name = software_name;
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 table.insert(software_table, new_entry);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 for _, platform in ipairs(entry.platforms) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 table.insert(software_platforms_table, {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 software_id = software_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 platform = platform;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 });
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 for _, category in ipairs(entry.categories) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 table.insert(software_categories_table, {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 software_id = software_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 category = category;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 });
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local xep_list = read_json_file("xeplist.json");
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 local xep_table, xeps_by_url = {}, {};
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local implementations_table = {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 --[[{
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 xep = <XEP id>
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 software = <software id>
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 version =
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 status =
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 };
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 table.sort(xep_list, function (a, b)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 if a.number ~= json.null and b.number ~= json.null then
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 return a.number < b.number;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 return a.last_updated < b.last_updated;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 end);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local xep_counter = -1;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 for _, entry in ipairs(xep_list) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 xep_counter = xep_counter + 1;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 if entry.status == "Proto" then
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 entry.status = "ProtoXEP";
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 local xep = {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 id = xep_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 number = entry.number;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 title = entry.title;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 status = entry.status;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 last_updated = entry.last_updated;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 type = entry.type;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 version = entry.version;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 approver = entry.approver;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 accepted = entry.accepted;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 short_name = entry.short_name;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 url = entry.url;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 };
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 if entry.url ~= json.null then
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 xeps_by_url[entry.url] = xep_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 for _, implementation in ipairs(entry.implementations) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 local software_id = known_software[implementation.package_name_slug];
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 if software_id then
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 table.insert(implementations_table, {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 software_id = software_id;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 xep_id = xep_counter;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 xep_version = implementation.implemented_version;
5
e28748388509 Fix field name of implementation status in the JSON
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
91 status = implementation.implementation_status;
0
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 });
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 table.insert(xep_table, xep);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 local function write_json(fn, data)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 local f = assert(io.open(fn, "w+"));
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 f:write(json.encode(data));
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 f:close();
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 local compliance_table = {};
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 for category, level_data in pairs(read_json_file("compliance_suite.json")) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 for level, software_data in pairs(level_data) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 for software_type, spec_list in pairs(software_data) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 for _, spec_url in ipairs(spec_list) do
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 local xep_id = xeps_by_url[spec_url];
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 if xep_id then
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 table.insert(compliance_table, {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 xep_id = xep_id;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 category = category;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 level = level;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 software_type = software_type;
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 });
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 end
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 write_json("db_xeps.json", xep_table);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 write_json("db_software.json", software_table);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 write_json("db_software_platforms.json", software_platforms_table);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 write_json("db_software_categories.json", software_categories_table);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 write_json("db_implementations.json", implementations_table);
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 write_json("db_compliance.json", compliance_table);

mercurial