Webhost: fix doc and yaml filenames / install paths (#4193)
* WebHost: use new safe yaml template filename this mirrors the change in ArchipelagoMW/#4106 in WebHost * WebHost: install docs into safe filename and require docs to be named safe * Test: update doc test for safe name * WebHost: fix import order to not break ModuleUpdate
This commit is contained in:
parent
a734d25f66
commit
f9c6ecc8b2
|
@ -12,6 +12,7 @@ ModuleUpdate.update()
|
||||||
# in case app gets imported by something like gunicorn
|
# in case app gets imported by something like gunicorn
|
||||||
import Utils
|
import Utils
|
||||||
import settings
|
import settings
|
||||||
|
from Utils import get_file_safe_name
|
||||||
|
|
||||||
if typing.TYPE_CHECKING:
|
if typing.TYPE_CHECKING:
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
@ -71,7 +72,7 @@ def create_ordered_tutorials_file() -> typing.List[typing.Dict[str, typing.Any]]
|
||||||
shutil.rmtree(base_target_path, ignore_errors=True)
|
shutil.rmtree(base_target_path, ignore_errors=True)
|
||||||
for game, world in worlds.items():
|
for game, world in worlds.items():
|
||||||
# copy files from world's docs folder to the generated folder
|
# copy files from world's docs folder to the generated folder
|
||||||
target_path = os.path.join(base_target_path, game)
|
target_path = os.path.join(base_target_path, get_file_safe_name(game))
|
||||||
os.makedirs(target_path, exist_ok=True)
|
os.makedirs(target_path, exist_ok=True)
|
||||||
|
|
||||||
if world.zip_path:
|
if world.zip_path:
|
||||||
|
|
|
@ -9,7 +9,7 @@ from flask_compress import Compress
|
||||||
from pony.flask import Pony
|
from pony.flask import Pony
|
||||||
from werkzeug.routing import BaseConverter
|
from werkzeug.routing import BaseConverter
|
||||||
|
|
||||||
from Utils import title_sorted
|
from Utils import title_sorted, get_file_safe_name
|
||||||
|
|
||||||
UPLOAD_FOLDER = os.path.relpath('uploads')
|
UPLOAD_FOLDER = os.path.relpath('uploads')
|
||||||
LOGS_FOLDER = os.path.relpath('logs')
|
LOGS_FOLDER = os.path.relpath('logs')
|
||||||
|
@ -20,6 +20,7 @@ Pony(app)
|
||||||
|
|
||||||
app.jinja_env.filters['any'] = any
|
app.jinja_env.filters['any'] = any
|
||||||
app.jinja_env.filters['all'] = all
|
app.jinja_env.filters['all'] = all
|
||||||
|
app.jinja_env.filters['get_file_safe_name'] = get_file_safe_name
|
||||||
|
|
||||||
app.config["SELFHOST"] = True # application process is in charge of running the websites
|
app.config["SELFHOST"] = True # application process is in charge of running the websites
|
||||||
app.config["GENERATORS"] = 8 # maximum concurrent world gens
|
app.config["GENERATORS"] = 8 # maximum concurrent world gens
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% include 'header/'+theme+'Header.html' %}
|
{% include 'header/'+theme+'Header.html' %}
|
||||||
<div id="game-info" class="markdown" data-lang="{{ lang }}" data-game="{{ game }}">
|
<div id="game-info" class="markdown" data-lang="{{ lang }}" data-game="{{ game | get_file_safe_name }}">
|
||||||
<!-- Populated my JS / MD -->
|
<!-- Populated my JS / MD -->
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
A list of all games you have generated can be found on the <a href="/user-content">User Content Page</a>.
|
A list of all games you have generated can be found on the <a href="/user-content">User Content Page</a>.
|
||||||
<br />
|
<br />
|
||||||
You may also download the
|
You may also download the
|
||||||
<a href="/static/generated/configs/{{ world_name }}.yaml">template file for this game</a>.
|
<a href="/static/generated/configs/{{ world_name | get_file_safe_name }}.yaml">template file for this game</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<form id="options-form" method="post" enctype="application/x-www-form-urlencoded" action="generate-yaml">
|
<form id="options-form" method="post" enctype="application/x-www-form-urlencoded" action="generate-yaml">
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div id="tutorial-wrapper" class="markdown" data-game="{{ game }}" data-file="{{ file }}" data-lang="{{ lang }}">
|
<div id="tutorial-wrapper" class="markdown" data-game="{{ game | get_file_safe_name }}" data-file="{{ file | get_file_safe_name }}" data-lang="{{ lang }}">
|
||||||
<!-- Content generated by JavaScript -->
|
<!-- Content generated by JavaScript -->
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -30,10 +30,16 @@ class TestDocs(unittest.TestCase):
|
||||||
def test_has_game_info(self):
|
def test_has_game_info(self):
|
||||||
for game_name, world_type in AutoWorldRegister.world_types.items():
|
for game_name, world_type in AutoWorldRegister.world_types.items():
|
||||||
if not world_type.hidden:
|
if not world_type.hidden:
|
||||||
target_path = Utils.local_path("WebHostLib", "static", "generated", "docs", game_name)
|
safe_name = Utils.get_file_safe_name(game_name)
|
||||||
|
target_path = Utils.local_path("WebHostLib", "static", "generated", "docs", safe_name)
|
||||||
for game_info_lang in world_type.web.game_info_languages:
|
for game_info_lang in world_type.web.game_info_languages:
|
||||||
with self.subTest(game_name):
|
with self.subTest(game_name):
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
os.path.isfile(Utils.local_path(target_path, f'{game_info_lang}_{game_name}.md')),
|
safe_name == game_name or
|
||||||
|
not os.path.isfile(Utils.local_path(target_path, f'{game_info_lang}_{game_name}.md')),
|
||||||
|
f'Info docs have be named <lang>_{safe_name}.md for {game_name}.'
|
||||||
|
)
|
||||||
|
self.assertTrue(
|
||||||
|
os.path.isfile(Utils.local_path(target_path, f'{game_info_lang}_{safe_name}.md')),
|
||||||
f'{game_name} missing game info file for "{game_info_lang}" language.'
|
f'{game_name} missing game info file for "{game_info_lang}" language.'
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue