plain 0.19.1__tar.gz → 0.21.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {plain-0.19.1 → plain-0.21.0}/.gitignore +3 -0
- {plain-0.19.1 → plain-0.21.0}/PKG-INFO +1 -1
- {plain-0.19.1 → plain-0.21.0}/plain/assets/compile.py +3 -2
- {plain-0.19.1 → plain-0.21.0}/plain/assets/finders.py +12 -11
- {plain-0.19.1 → plain-0.21.0}/plain/assets/views.py +4 -3
- plain-0.21.0/plain/http/README.md +3 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/handlers/base.py +12 -5
- plain-0.21.0/plain/preflight/README.md +5 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/objects.py +2 -0
- {plain-0.19.1 → plain-0.21.0}/pyproject.toml +1 -1
- plain-0.19.1/plain/http/README.md +0 -1
- plain-0.19.1/plain/preflight/README.md +0 -3
- {plain-0.19.1 → plain-0.21.0}/LICENSE +0 -0
- {plain-0.19.1 → plain-0.21.0}/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/__main__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/assets/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/assets/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/assets/fingerprints.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/assets/urls.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/cli.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/formatting.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/packages.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/print.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/cli/startup.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/csrf/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/csrf/middleware.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/csrf/views.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/debug.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/exceptions.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/forms/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/forms/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/forms/boundfield.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/forms/exceptions.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/forms/fields.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/forms/forms.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/http/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/http/cookie.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/http/multipartparser.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/http/request.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/http/response.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/base.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/locks.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/move.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/temp.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/files/utils.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/handlers/exception.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/middleware/headers.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/middleware/https.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/internal/middleware/slash.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/json.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/logs/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/logs/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/logs/configure.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/logs/loggers.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/logs/utils.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/packages/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/packages/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/packages/config.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/packages/registry.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/paginator.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/preflight/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/preflight/files.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/preflight/messages.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/preflight/registry.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/preflight/security.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/preflight/urls.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/runtime/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/runtime/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/runtime/global_settings.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/runtime/user_settings.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/signals/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/signals/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/signing.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/core.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/jinja/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/jinja/environments.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/jinja/filters.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/templates/jinja/globals.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/test/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/test/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/test/client.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/base.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/conf.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/converters.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/exceptions.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/urls/resolvers.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/_os.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/cache.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/connection.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/crypto.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/datastructures.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/dateformat.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/dateparse.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/dates.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/deconstruct.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/decorators.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/deprecation.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/duration.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/email.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/encoding.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/functional.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/hashable.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/html.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/http.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/inspect.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/ipv6.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/itercompat.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/module_loading.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/regex_helper.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/safestring.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/text.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/timesince.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/timezone.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/utils/tree.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/validators.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/README.md +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/base.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/csrf.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/errors.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/exceptions.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/forms.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/redirect.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/views/templates.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/plain/wsgi.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/.bolt/assets_collected/assets.json +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/.gitignore +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/app/.gitignore +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/app/settings.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/app/test/__init__.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/app/test/default_settings.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/app/urls.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/conftest.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/test_cli.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/test_runtime.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/tests/test_wsgi.py +0 -0
- {plain-0.19.1 → plain-0.21.0}/uv.lock +0 -0
@@ -5,7 +5,7 @@ import shutil
|
|
5
5
|
|
6
6
|
from plain.runtime import settings
|
7
7
|
|
8
|
-
from .finders import
|
8
|
+
from .finders import iter_assets
|
9
9
|
from .fingerprints import AssetsFingerprintsManifest
|
10
10
|
|
11
11
|
FINGERPRINT_LENGTH = 7
|
@@ -54,7 +54,8 @@ def get_compiled_path():
|
|
54
54
|
def compile_assets(*, target_dir, keep_original, fingerprint, compress):
|
55
55
|
manifest = AssetsFingerprintsManifest()
|
56
56
|
|
57
|
-
for
|
57
|
+
for asset in iter_assets():
|
58
|
+
url_path = asset.url_path
|
58
59
|
resolved_path, compiled_paths = compile_asset(
|
59
60
|
asset=asset,
|
60
61
|
target_dir=target_dir,
|
@@ -8,9 +8,7 @@ APP_ASSETS_DIR = APP_PATH / "assets"
|
|
8
8
|
SKIP_ASSETS = (".DS_Store", ".gitignore")
|
9
9
|
|
10
10
|
|
11
|
-
def
|
12
|
-
assets_map = {}
|
13
|
-
|
11
|
+
def iter_assets():
|
14
12
|
class Asset:
|
15
13
|
def __init__(self, *, url_path, absolute_path):
|
16
14
|
self.url_path = url_path
|
@@ -19,7 +17,7 @@ def find_assets():
|
|
19
17
|
def __str__(self):
|
20
18
|
return self.url_path
|
21
19
|
|
22
|
-
def
|
20
|
+
def _iter_assets_dir(path):
|
23
21
|
for root, _, files in os.walk(path):
|
24
22
|
for f in files:
|
25
23
|
if f in SKIP_ASSETS:
|
@@ -28,14 +26,17 @@ def find_assets():
|
|
28
26
|
url_path = os.path.relpath(abs_path, path)
|
29
27
|
yield url_path, abs_path
|
30
28
|
|
29
|
+
for asset_dir in iter_asset_dirs():
|
30
|
+
for url_path, abs_path in _iter_assets_dir(asset_dir):
|
31
|
+
yield Asset(url_path=url_path, absolute_path=abs_path)
|
32
|
+
|
33
|
+
|
34
|
+
def iter_asset_dirs():
|
31
35
|
# Iterate the installed package assets, in order
|
32
36
|
for pkg in packages.get_package_configs():
|
33
|
-
|
34
|
-
|
35
|
-
|
37
|
+
asset_dir = os.path.join(pkg.path, "assets")
|
38
|
+
if os.path.exists(asset_dir):
|
39
|
+
yield asset_dir
|
36
40
|
|
37
41
|
# The app/assets take priority over everything
|
38
|
-
|
39
|
-
assets_map[url_path] = Asset(url_path=url_path, absolute_path=abs_path)
|
40
|
-
|
41
|
-
return assets_map
|
42
|
+
yield APP_ASSETS_DIR
|
@@ -17,7 +17,7 @@ from plain.urls import reverse
|
|
17
17
|
from plain.views import View
|
18
18
|
|
19
19
|
from .compile import FINGERPRINT_LENGTH, get_compiled_path
|
20
|
-
from .finders import
|
20
|
+
from .finders import iter_assets
|
21
21
|
from .fingerprints import get_fingerprinted_url_path
|
22
22
|
|
23
23
|
|
@@ -80,8 +80,9 @@ class AssetView(View):
|
|
80
80
|
|
81
81
|
def get_debug_asset_path(self, path):
|
82
82
|
"""Make a "live" check to find the uncompiled asset in the filesystem"""
|
83
|
-
|
84
|
-
|
83
|
+
for asset in iter_assets():
|
84
|
+
if asset.url_path == path:
|
85
|
+
return asset.absolute_path
|
85
86
|
|
86
87
|
def check_asset_path(self, path):
|
87
88
|
if not path:
|
@@ -14,11 +14,16 @@ logger = logging.getLogger("plain.request")
|
|
14
14
|
|
15
15
|
|
16
16
|
# These middleware classes are always used by Plain.
|
17
|
-
|
18
|
-
"plain.internal.middleware.headers.DefaultHeadersMiddleware",
|
19
|
-
"plain.internal.middleware.https.HttpsRedirectMiddleware",
|
17
|
+
BUILTIN_BEFORE_MIDDLEWARE = [
|
18
|
+
"plain.internal.middleware.headers.DefaultHeadersMiddleware", # Runs after response, to set missing headers
|
19
|
+
"plain.internal.middleware.https.HttpsRedirectMiddleware", # Runs before response, to redirect to HTTPS quickly
|
20
|
+
"plain.csrf.middleware.CsrfViewMiddleware", # Runs before and after get_response...
|
21
|
+
]
|
22
|
+
|
23
|
+
BUILTIN_AFTER_MIDDLEWARE = [
|
24
|
+
# Want this to run first (when reversed) so the slash middleware
|
25
|
+
# can immediately redirect to the slash-appended path if there is one.
|
20
26
|
"plain.internal.middleware.slash.RedirectSlashMiddleware",
|
21
|
-
"plain.csrf.middleware.CsrfViewMiddleware",
|
22
27
|
]
|
23
28
|
|
24
29
|
|
@@ -34,7 +39,9 @@ class BaseHandler:
|
|
34
39
|
get_response = self._get_response
|
35
40
|
handler = convert_exception_to_response(get_response)
|
36
41
|
|
37
|
-
middlewares = reversed(
|
42
|
+
middlewares = reversed(
|
43
|
+
BUILTIN_BEFORE_MIDDLEWARE + settings.MIDDLEWARE + BUILTIN_AFTER_MIDDLEWARE
|
44
|
+
)
|
38
45
|
|
39
46
|
for middleware_path in middlewares:
|
40
47
|
middleware = import_string(middleware_path)
|
@@ -80,6 +80,8 @@ class CreateView(ObjectTemplateViewMixin, FormView):
|
|
80
80
|
View for creating a new object, with a response rendered by a template.
|
81
81
|
"""
|
82
82
|
|
83
|
+
template_name_suffix = "_form"
|
84
|
+
|
83
85
|
def post(self) -> Response:
|
84
86
|
"""
|
85
87
|
Handle POST requests: instantiate a form instance with the passed
|
@@ -1 +0,0 @@
|
|
1
|
-
# HTTP
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|