From 008cb004140f92267c7fdb6cfd464d15c870a5fc Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Thu, 14 Mar 2024 15:13:38 -0700 Subject: [PATCH 1/2] Draft: generate redirects for AWS Note: this doesn't work since AWS limits the number of redirect rules. We can use this as a base set of changes to modify our approach to generate HTML files for each of the redirects rather than generating the redirect configuration file. Signed-off-by: Gary O'Neall --- spec_parser/model.py | 2 ++ spec_parser/redirects.py | 48 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 spec_parser/redirects.py diff --git a/spec_parser/model.py b/spec_parser/model.py index 1e3b00d..c418010 100644 --- a/spec_parser/model.py +++ b/spec_parser/model.py @@ -113,11 +113,13 @@ def gen_all(self, dir, cfg): from .mkdocs import gen_mkdocs from .plantuml import gen_plantuml from .rdf import gen_rdf + from .redirects import gen_redirects gen_mkdocs(self, dir, cfg) gen_rdf(self, dir, cfg) gen_plantuml(self, dir, cfg) gen_jsondump(self, dir, cfg) + gen_redirects(self, dir + '/redirects.json', cfg) diff --git a/spec_parser/redirects.py b/spec_parser/redirects.py new file mode 100644 index 0000000..9f50a40 --- /dev/null +++ b/spec_parser/redirects.py @@ -0,0 +1,48 @@ +# saving the model as MkDocs input + +# SPDX-License-Identifier: Apache-2.0 + +import logging +from pathlib import Path + +''' +Generates a redirects.json file conforming to the AWS S3 redirect configuration format +''' +def gen_redirects(model, filepath, cfg): + p = Path(filepath) + if p.exists(): + if not cfg.opt_force: + logging.error(f"Destination for redirects JSON file {filepath} already exists, will not overwrite") + return + def _generate_redirect_group(file, group_name, group): + for s in group.values(): + weblocation = f'spdx-spec/v3.0/model/{s.ns.name}/{group_name}/{s.name}/index.html' + awskey = f'rdf/v3/{s.ns.name}/{s.name}' + writeredirect(file, awskey, weblocation) + + with open(p, 'w+') as f: + f.write('[\n') + _generate_redirect_group(f, "Classes", model.classes) + _generate_redirect_group(f, "Properties", model.properties) + _generate_redirect_group(f, "Vocabularies", model.vocabularies) + _generate_redirect_group(f, "Individuals", model.individuals) + _generate_redirect_group(f, "Datatypes", model.datatypes) + for ns in model.namespaces: + weblocation = f'spdx-spec/v3.0/model/{ns.name}/{ns.name}/index.html' + awskey = f'rdf/v3/{ns.name}' + writeredirect(f, awskey, weblocation) + f.write('\n') + f.write(']\n') + +def writeredirect(file, awskey, weblocation): + if file.tell() > 5: + file.write(',\n') + file.write(' {\n') + file.write(' "Condition": {\n') + file.write(f' "KeyPrefixEquals": "{awskey}"\n') + file.write(' },\n') + file.write(' "Redirect": {\n') + file.write(' "HostName": "spdx.github.io",\n') + file.write(f' "ReplaceKeyWith": "{weblocation}"\n') + file.write(' }\n') + file.write(' }') From 930d1b2d1241268399a64a1b6cee613c81e859c6 Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Fri, 15 Mar 2024 15:28:52 -0700 Subject: [PATCH 2/2] Change mk_redirects to create HTML files which redirect Signed-off-by: Gary O'Neall --- spec_parser/model.py | 2 +- spec_parser/redirects.py | 82 +++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 39 deletions(-) diff --git a/spec_parser/model.py b/spec_parser/model.py index c418010..6da6d73 100644 --- a/spec_parser/model.py +++ b/spec_parser/model.py @@ -119,7 +119,7 @@ def gen_all(self, dir, cfg): gen_rdf(self, dir, cfg) gen_plantuml(self, dir, cfg) gen_jsondump(self, dir, cfg) - gen_redirects(self, dir + '/redirects.json', cfg) + gen_redirects(self, dir + '/redirects', cfg) diff --git a/spec_parser/redirects.py b/spec_parser/redirects.py index 9f50a40..7db5170 100644 --- a/spec_parser/redirects.py +++ b/spec_parser/redirects.py @@ -1,48 +1,54 @@ -# saving the model as MkDocs input +# Creates redirects for the model references to the spec website # SPDX-License-Identifier: Apache-2.0 import logging from pathlib import Path -''' -Generates a redirects.json file conforming to the AWS S3 redirect configuration format -''' -def gen_redirects(model, filepath, cfg): - p = Path(filepath) + +def gen_redirects(model, dir, cfg): + p = Path(dir) if p.exists(): if not cfg.opt_force: - logging.error(f"Destination for redirects JSON file {filepath} already exists, will not overwrite") + logging.error(f"Destination for redirects {dir} already exists, will not overwrite") return - def _generate_redirect_group(file, group_name, group): + + p.mkdir() + + for ns in model.namespaces: + d = p / ns.name + d.mkdir() + + ''' The following does not work since it duplicates the name of the directory + f = p / ns.name + + redirect = f'https://spdx.github.io/spdx-spec/v3.0/model/{ns.name}/{ns.name}/index.html' + page = gen_html_redirect(redirect) + f.write_text(page) + ''' + + def _generate_in_dir(dirname, group, tmplfname): for s in group.values(): - weblocation = f'spdx-spec/v3.0/model/{s.ns.name}/{group_name}/{s.name}/index.html' - awskey = f'rdf/v3/{s.ns.name}/{s.name}' - writeredirect(file, awskey, weblocation) - - with open(p, 'w+') as f: - f.write('[\n') - _generate_redirect_group(f, "Classes", model.classes) - _generate_redirect_group(f, "Properties", model.properties) - _generate_redirect_group(f, "Vocabularies", model.vocabularies) - _generate_redirect_group(f, "Individuals", model.individuals) - _generate_redirect_group(f, "Datatypes", model.datatypes) - for ns in model.namespaces: - weblocation = f'spdx-spec/v3.0/model/{ns.name}/{ns.name}/index.html' - awskey = f'rdf/v3/{ns.name}' - writeredirect(f, awskey, weblocation) - f.write('\n') - f.write(']\n') - -def writeredirect(file, awskey, weblocation): - if file.tell() > 5: - file.write(',\n') - file.write(' {\n') - file.write(' "Condition": {\n') - file.write(f' "KeyPrefixEquals": "{awskey}"\n') - file.write(' },\n') - file.write(' "Redirect": {\n') - file.write(' "HostName": "spdx.github.io",\n') - file.write(f' "ReplaceKeyWith": "{weblocation}"\n') - file.write(' }\n') - file.write(' }') + in_ns = s.ns + d = p / in_ns.name + d.mkdir(exist_ok=True) + f = d / s.name + redirect = f'https://spdx.github.io/spdx-spec/v3.0/model/{in_ns.name}/{dirname}/{s.name}/index.html' + page = gen_html_redirect(redirect) + f.write_text(page) + + _generate_in_dir("Classes", model.classes, "class.md.j2") + _generate_in_dir("Properties", model.properties, "property.md.j2") + _generate_in_dir("Vocabularies", model.vocabularies, "vocabulary.md.j2") + _generate_in_dir("Individuals", model.individuals, "individual.md.j2") + _generate_in_dir("Datatypes", model.datatypes, "datatype.md.j2") + +def gen_html_redirect(redirect): + retval = '\n' + retval = retval + '\n' + retval = retval + ' \n' + retval = retval + ' SPDX Model\n' + retval = retval + f' \n' + retval = retval + ' \n' + retval = retval + '' + return retval