diff --git a/Dockerfile b/Dockerfile index f8b7cf04..9eeb7f1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -124,6 +124,20 @@ COPY migrations/ ./migrations/ COPY scripts/ ./scripts/ COPY wsgi.py ./ +# The two files under docs/ that the APP SERVES at runtime, not documentation. +# shopdb/core/api/docs.py resolves both relative to the repo root, so without +# them /api/docs renders the Redoc shell and then 404s fetching its own spec - +# which is what every Docker deployment did. Copied by name rather than copying +# docs/ wholesale: the rest of that tree is prose and has no business in a lean +# runtime image. +COPY docs/openapi.json docs/llms.txt ./docs/ + +# Fail the BUILD on a syntax error rather than the pod at runtime. Docker never +# imports the application, so a broken .py sails through every layer and only +# surfaces as a crash-looping container: observed, four restarts before anyone +# noticed. compileall touches nothing at runtime and costs a couple of seconds. +RUN python -m compileall -q shopdb plugins migrations wsgi.py + # Built SPA from stage 1. Flask serves it via register_frontend_routes. COPY --from=frontendbuild /build/frontend/dist ./frontend/dist diff --git a/shopdb/core/api/docs.py b/shopdb/core/api/docs.py index cbda186b..f2a5be59 100644 --- a/shopdb/core/api/docs.py +++ b/shopdb/core/api/docs.py @@ -97,50 +97,162 @@ def docs_index(): '' '' '' '%s' '
' '' '' '' % (tryit_note, redoc_url, json.dumps(spec_url)) ) @@ -224,7 +336,11 @@ def swagger_tryit(): '' '' '' '' diff --git a/shopdb/core/api/staticdocs/redoc.standalone.js.LICENSE.txt b/shopdb/core/api/staticdocs/redoc.standalone.js.LICENSE.txt new file mode 100644 index 00000000..8e040433 --- /dev/null +++ b/shopdb/core/api/staticdocs/redoc.standalone.js.LICENSE.txt @@ -0,0 +1,37 @@ +Redoc (redoc.standalone.js) - vendored third-party bundle +========================================================= + +Redoc is distributed under the MIT License. + +WHY THIS FILE IS A PLACEHOLDER +------------------------------ +The vendored bundle opens with: + + /*! For license information please see redoc.standalone.js.LICENSE.txt */ + +That companion file is produced by webpack and carries the extracted licence +headers of Redoc AND of every third-party package compiled into the bundle. It +ships alongside redoc.standalone.js in the upstream dist and was not copied when +this bundle was vendored, so the pointer above led nowhere. + +The contents are NOT reproduced from memory here, because doing so would mean +inventing attribution for packages whose notices cannot be read back out of a +minified bundle. Do not treat this file as a substitute for the real one. + +WHAT TO DO +---------- +When next re-vendoring Redoc, copy BOTH files out of the upstream dist: + + redoc.standalone.js + redoc.standalone.js.LICENSE.txt <- replaces this placeholder + +and record the version and source URL in the same commit, so the next person +does not have to work out what is installed by reading the minified source. + +The version of the currently vendored bundle could not be determined: it has no +version string, and no commit or document in this repository records it. + +RELATED +------- +Swagger UI is vendored in this same directory and DOES carry its upstream +notice (swagger-ui.LICENSE.txt). That is the pattern this file should follow. diff --git a/tests/test_core/test_api_docs_tryit.py b/tests/test_core/test_api_docs_tryit.py index 44b07933..93b7cc3e 100644 --- a/tests/test_core/test_api_docs_tryit.py +++ b/tests/test_core/test_api_docs_tryit.py @@ -266,7 +266,13 @@ def test_the_redoc_page_follows_the_system_theme(client): assert 'Redoc.init' in page assert '