plain 0.47.0__tar.gz → 0.48.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.47.0 → plain-0.48.0}/.gitignore +3 -0
- {plain-0.47.0 → plain-0.48.0}/PKG-INFO +1 -1
- {plain-0.47.0 → plain-0.48.0}/plain/runtime/README.md +1 -1
- {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/__init__.py +8 -10
- {plain-0.47.0 → plain-0.48.0}/plain/views/templates.py +3 -2
- {plain-0.47.0 → plain-0.48.0}/pyproject.toml +1 -1
- plain-0.47.0/plain/utils/connection.py +0 -84
- {plain-0.47.0 → plain-0.48.0}/LICENSE +0 -0
- {plain-0.47.0 → plain-0.48.0}/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/__main__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/compile.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/finders.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/fingerprints.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/urls.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/assets/views.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/chores/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/chores/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/chores/registry.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/build.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/chores.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/core.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/docs.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/formatting.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/preflight.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/print.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/registry.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/scaffold.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/settings.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/shell.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/startup.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/urls.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/cli/utils.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/csrf/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/csrf/middleware.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/csrf/views.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/debug.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/exceptions.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/forms/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/forms/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/forms/boundfield.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/forms/exceptions.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/forms/fields.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/forms/forms.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/http/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/http/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/http/cookie.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/http/multipartparser.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/http/request.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/http/response.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/base.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/locks.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/move.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/temp.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/files/utils.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/base.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/exception.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/headers.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/https.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/slash.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/json.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/logs/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/logs/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/logs/configure.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/logs/loggers.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/logs/utils.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/packages/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/packages/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/packages/config.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/packages/registry.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/paginator.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/files.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/messages.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/registry.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/security.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/preflight/urls.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/runtime/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/runtime/global_settings.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/runtime/user_settings.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/signals/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/signals/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/signing.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/core.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/environments.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/filters.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/globals.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/test/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/test/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/test/client.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/test/encoding.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/test/exceptions.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/converters.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/exceptions.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/patterns.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/resolvers.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/routers.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/urls/utils.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/cache.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/crypto.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/datastructures.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/dateparse.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/deconstruct.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/decorators.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/duration.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/encoding.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/functional.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/hashable.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/html.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/http.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/inspect.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/ipv6.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/itercompat.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/module_loading.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/regex_helper.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/safestring.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/text.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/timesince.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/timezone.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/utils/tree.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/validators.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/README.md +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/base.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/csrf.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/errors.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/exceptions.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/forms.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/objects.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/views/redirect.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/plain/wsgi.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/.gitignore +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/app/.gitignore +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/app/settings.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/app/test/__init__.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/app/test/default_settings.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/app/urls.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/conftest.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/test_cli.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/test_runtime.py +0 -0
- {plain-0.47.0 → plain-0.48.0}/tests/test_wsgi.py +0 -0
@@ -85,7 +85,7 @@ DATABASES: dict
|
|
85
85
|
# Automatically configure DATABASES if a DATABASE_URL was given in the environment
|
86
86
|
if "DATABASE_URL" in environ:
|
87
87
|
DATABASES = {
|
88
|
-
"default": database_url.
|
88
|
+
"default": database_url.parse_database_url(
|
89
89
|
environ["DATABASE_URL"],
|
90
90
|
# Enable persistent connections by default
|
91
91
|
conn_max_age=int(environ.get("DATABASE_CONN_MAX_AGE", 600)),
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import importlib.util
|
1
2
|
from importlib import import_module
|
2
3
|
|
3
4
|
from plain.packages import packages_registry
|
@@ -25,24 +26,21 @@ class JinjaEnvironment(LazyObject):
|
|
25
26
|
self._wrapped = env
|
26
27
|
|
27
28
|
for package_config in packages_registry.get_package_configs():
|
28
|
-
#
|
29
|
+
# Autoload template helpers if the package provides a ``templates`` module
|
29
30
|
import_name = f"{package_config.name}.templates"
|
30
31
|
if import_name in self._imported_modules:
|
31
32
|
continue
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
pass
|
33
|
+
if importlib.util.find_spec(import_name) is None:
|
34
|
+
continue
|
35
|
+
import_module(import_name)
|
36
|
+
self._imported_modules.add(import_name)
|
37
37
|
|
38
|
-
#
|
38
|
+
# Autoload template helpers from the local ``app`` package if present
|
39
39
|
import_name = "app.templates"
|
40
40
|
if import_name not in self._imported_modules:
|
41
|
-
|
41
|
+
if importlib.util.find_spec(import_name) is not None:
|
42
42
|
import_module(import_name)
|
43
43
|
self._imported_modules.add(import_name)
|
44
|
-
except ModuleNotFoundError:
|
45
|
-
pass
|
46
44
|
|
47
45
|
|
48
46
|
environment = JinjaEnvironment()
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from plain.csrf.middleware import get_token
|
2
2
|
from plain.exceptions import ImproperlyConfigured
|
3
|
+
from plain.http import Response
|
3
4
|
from plain.runtime import settings
|
4
5
|
from plain.templates import Template, TemplateFileMissing
|
5
6
|
from plain.utils.functional import lazy
|
@@ -69,5 +70,5 @@ class TemplateView(View):
|
|
69
70
|
def render_template(self) -> str:
|
70
71
|
return self.get_template().render(self.get_template_context())
|
71
72
|
|
72
|
-
def get(self):
|
73
|
-
return self.render_template()
|
73
|
+
def get(self) -> Response:
|
74
|
+
return Response(self.render_template())
|
@@ -1,84 +0,0 @@
|
|
1
|
-
from functools import cached_property
|
2
|
-
from threading import local
|
3
|
-
|
4
|
-
from plain.runtime import settings as plain_settings
|
5
|
-
|
6
|
-
|
7
|
-
class ConnectionProxy:
|
8
|
-
"""Proxy for accessing a connection object's attributes."""
|
9
|
-
|
10
|
-
def __init__(self, connections, alias):
|
11
|
-
self.__dict__["_connections"] = connections
|
12
|
-
self.__dict__["_alias"] = alias
|
13
|
-
|
14
|
-
def __getattr__(self, item):
|
15
|
-
return getattr(self._connections[self._alias], item)
|
16
|
-
|
17
|
-
def __setattr__(self, name, value):
|
18
|
-
return setattr(self._connections[self._alias], name, value)
|
19
|
-
|
20
|
-
def __delattr__(self, name):
|
21
|
-
return delattr(self._connections[self._alias], name)
|
22
|
-
|
23
|
-
def __contains__(self, key):
|
24
|
-
return key in self._connections[self._alias]
|
25
|
-
|
26
|
-
def __eq__(self, other):
|
27
|
-
return self._connections[self._alias] == other
|
28
|
-
|
29
|
-
|
30
|
-
class ConnectionDoesNotExist(Exception):
|
31
|
-
pass
|
32
|
-
|
33
|
-
|
34
|
-
class BaseConnectionHandler:
|
35
|
-
settings_name = None
|
36
|
-
exception_class = ConnectionDoesNotExist
|
37
|
-
|
38
|
-
def __init__(self, settings=None):
|
39
|
-
self._settings = settings
|
40
|
-
self._connections = local()
|
41
|
-
|
42
|
-
@cached_property
|
43
|
-
def settings(self):
|
44
|
-
self._settings = self.configure_settings(self._settings)
|
45
|
-
return self._settings
|
46
|
-
|
47
|
-
def configure_settings(self, settings):
|
48
|
-
if settings is None:
|
49
|
-
settings = getattr(plain_settings, self.settings_name)
|
50
|
-
return settings
|
51
|
-
|
52
|
-
def create_connection(self, alias):
|
53
|
-
raise NotImplementedError("Subclasses must implement create_connection().")
|
54
|
-
|
55
|
-
def __getitem__(self, alias):
|
56
|
-
try:
|
57
|
-
return getattr(self._connections, alias)
|
58
|
-
except AttributeError:
|
59
|
-
if alias not in self.settings:
|
60
|
-
raise self.exception_class(f"The connection '{alias}' doesn't exist.")
|
61
|
-
conn = self.create_connection(alias)
|
62
|
-
setattr(self._connections, alias, conn)
|
63
|
-
return conn
|
64
|
-
|
65
|
-
def __setitem__(self, key, value):
|
66
|
-
setattr(self._connections, key, value)
|
67
|
-
|
68
|
-
def __delitem__(self, key):
|
69
|
-
delattr(self._connections, key)
|
70
|
-
|
71
|
-
def __iter__(self):
|
72
|
-
return iter(self.settings)
|
73
|
-
|
74
|
-
def all(self, initialized_only=False):
|
75
|
-
return [
|
76
|
-
self[alias]
|
77
|
-
for alias in self
|
78
|
-
# If initialized_only is True, return only initialized connections.
|
79
|
-
if not initialized_only or hasattr(self._connections, alias)
|
80
|
-
]
|
81
|
-
|
82
|
-
def close_all(self):
|
83
|
-
for conn in self.all(initialized_only=True):
|
84
|
-
conn.close()
|
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
|
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
|