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.
Files changed (163) hide show
  1. {plain-0.47.0 → plain-0.48.0}/.gitignore +3 -0
  2. {plain-0.47.0 → plain-0.48.0}/PKG-INFO +1 -1
  3. {plain-0.47.0 → plain-0.48.0}/plain/runtime/README.md +1 -1
  4. {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/__init__.py +8 -10
  5. {plain-0.47.0 → plain-0.48.0}/plain/views/templates.py +3 -2
  6. {plain-0.47.0 → plain-0.48.0}/pyproject.toml +1 -1
  7. plain-0.47.0/plain/utils/connection.py +0 -84
  8. {plain-0.47.0 → plain-0.48.0}/LICENSE +0 -0
  9. {plain-0.47.0 → plain-0.48.0}/README.md +0 -0
  10. {plain-0.47.0 → plain-0.48.0}/plain/README.md +0 -0
  11. {plain-0.47.0 → plain-0.48.0}/plain/__main__.py +0 -0
  12. {plain-0.47.0 → plain-0.48.0}/plain/assets/README.md +0 -0
  13. {plain-0.47.0 → plain-0.48.0}/plain/assets/__init__.py +0 -0
  14. {plain-0.47.0 → plain-0.48.0}/plain/assets/compile.py +0 -0
  15. {plain-0.47.0 → plain-0.48.0}/plain/assets/finders.py +0 -0
  16. {plain-0.47.0 → plain-0.48.0}/plain/assets/fingerprints.py +0 -0
  17. {plain-0.47.0 → plain-0.48.0}/plain/assets/urls.py +0 -0
  18. {plain-0.47.0 → plain-0.48.0}/plain/assets/views.py +0 -0
  19. {plain-0.47.0 → plain-0.48.0}/plain/chores/README.md +0 -0
  20. {plain-0.47.0 → plain-0.48.0}/plain/chores/__init__.py +0 -0
  21. {plain-0.47.0 → plain-0.48.0}/plain/chores/registry.py +0 -0
  22. {plain-0.47.0 → plain-0.48.0}/plain/cli/README.md +0 -0
  23. {plain-0.47.0 → plain-0.48.0}/plain/cli/__init__.py +0 -0
  24. {plain-0.47.0 → plain-0.48.0}/plain/cli/build.py +0 -0
  25. {plain-0.47.0 → plain-0.48.0}/plain/cli/chores.py +0 -0
  26. {plain-0.47.0 → plain-0.48.0}/plain/cli/core.py +0 -0
  27. {plain-0.47.0 → plain-0.48.0}/plain/cli/docs.py +0 -0
  28. {plain-0.47.0 → plain-0.48.0}/plain/cli/formatting.py +0 -0
  29. {plain-0.47.0 → plain-0.48.0}/plain/cli/preflight.py +0 -0
  30. {plain-0.47.0 → plain-0.48.0}/plain/cli/print.py +0 -0
  31. {plain-0.47.0 → plain-0.48.0}/plain/cli/registry.py +0 -0
  32. {plain-0.47.0 → plain-0.48.0}/plain/cli/scaffold.py +0 -0
  33. {plain-0.47.0 → plain-0.48.0}/plain/cli/settings.py +0 -0
  34. {plain-0.47.0 → plain-0.48.0}/plain/cli/shell.py +0 -0
  35. {plain-0.47.0 → plain-0.48.0}/plain/cli/startup.py +0 -0
  36. {plain-0.47.0 → plain-0.48.0}/plain/cli/urls.py +0 -0
  37. {plain-0.47.0 → plain-0.48.0}/plain/cli/utils.py +0 -0
  38. {plain-0.47.0 → plain-0.48.0}/plain/csrf/README.md +0 -0
  39. {plain-0.47.0 → plain-0.48.0}/plain/csrf/middleware.py +0 -0
  40. {plain-0.47.0 → plain-0.48.0}/plain/csrf/views.py +0 -0
  41. {plain-0.47.0 → plain-0.48.0}/plain/debug.py +0 -0
  42. {plain-0.47.0 → plain-0.48.0}/plain/exceptions.py +0 -0
  43. {plain-0.47.0 → plain-0.48.0}/plain/forms/README.md +0 -0
  44. {plain-0.47.0 → plain-0.48.0}/plain/forms/__init__.py +0 -0
  45. {plain-0.47.0 → plain-0.48.0}/plain/forms/boundfield.py +0 -0
  46. {plain-0.47.0 → plain-0.48.0}/plain/forms/exceptions.py +0 -0
  47. {plain-0.47.0 → plain-0.48.0}/plain/forms/fields.py +0 -0
  48. {plain-0.47.0 → plain-0.48.0}/plain/forms/forms.py +0 -0
  49. {plain-0.47.0 → plain-0.48.0}/plain/http/README.md +0 -0
  50. {plain-0.47.0 → plain-0.48.0}/plain/http/__init__.py +0 -0
  51. {plain-0.47.0 → plain-0.48.0}/plain/http/cookie.py +0 -0
  52. {plain-0.47.0 → plain-0.48.0}/plain/http/multipartparser.py +0 -0
  53. {plain-0.47.0 → plain-0.48.0}/plain/http/request.py +0 -0
  54. {plain-0.47.0 → plain-0.48.0}/plain/http/response.py +0 -0
  55. {plain-0.47.0 → plain-0.48.0}/plain/internal/__init__.py +0 -0
  56. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/__init__.py +0 -0
  57. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/base.py +0 -0
  58. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/locks.py +0 -0
  59. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/move.py +0 -0
  60. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/temp.py +0 -0
  61. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/uploadedfile.py +0 -0
  62. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/uploadhandler.py +0 -0
  63. {plain-0.47.0 → plain-0.48.0}/plain/internal/files/utils.py +0 -0
  64. {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/__init__.py +0 -0
  65. {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/base.py +0 -0
  66. {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/exception.py +0 -0
  67. {plain-0.47.0 → plain-0.48.0}/plain/internal/handlers/wsgi.py +0 -0
  68. {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/__init__.py +0 -0
  69. {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/headers.py +0 -0
  70. {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/https.py +0 -0
  71. {plain-0.47.0 → plain-0.48.0}/plain/internal/middleware/slash.py +0 -0
  72. {plain-0.47.0 → plain-0.48.0}/plain/json.py +0 -0
  73. {plain-0.47.0 → plain-0.48.0}/plain/logs/README.md +0 -0
  74. {plain-0.47.0 → plain-0.48.0}/plain/logs/__init__.py +0 -0
  75. {plain-0.47.0 → plain-0.48.0}/plain/logs/configure.py +0 -0
  76. {plain-0.47.0 → plain-0.48.0}/plain/logs/loggers.py +0 -0
  77. {plain-0.47.0 → plain-0.48.0}/plain/logs/utils.py +0 -0
  78. {plain-0.47.0 → plain-0.48.0}/plain/packages/README.md +0 -0
  79. {plain-0.47.0 → plain-0.48.0}/plain/packages/__init__.py +0 -0
  80. {plain-0.47.0 → plain-0.48.0}/plain/packages/config.py +0 -0
  81. {plain-0.47.0 → plain-0.48.0}/plain/packages/registry.py +0 -0
  82. {plain-0.47.0 → plain-0.48.0}/plain/paginator.py +0 -0
  83. {plain-0.47.0 → plain-0.48.0}/plain/preflight/README.md +0 -0
  84. {plain-0.47.0 → plain-0.48.0}/plain/preflight/__init__.py +0 -0
  85. {plain-0.47.0 → plain-0.48.0}/plain/preflight/files.py +0 -0
  86. {plain-0.47.0 → plain-0.48.0}/plain/preflight/messages.py +0 -0
  87. {plain-0.47.0 → plain-0.48.0}/plain/preflight/registry.py +0 -0
  88. {plain-0.47.0 → plain-0.48.0}/plain/preflight/security.py +0 -0
  89. {plain-0.47.0 → plain-0.48.0}/plain/preflight/urls.py +0 -0
  90. {plain-0.47.0 → plain-0.48.0}/plain/runtime/__init__.py +0 -0
  91. {plain-0.47.0 → plain-0.48.0}/plain/runtime/global_settings.py +0 -0
  92. {plain-0.47.0 → plain-0.48.0}/plain/runtime/user_settings.py +0 -0
  93. {plain-0.47.0 → plain-0.48.0}/plain/signals/README.md +0 -0
  94. {plain-0.47.0 → plain-0.48.0}/plain/signals/__init__.py +0 -0
  95. {plain-0.47.0 → plain-0.48.0}/plain/signals/dispatch/__init__.py +0 -0
  96. {plain-0.47.0 → plain-0.48.0}/plain/signals/dispatch/dispatcher.py +0 -0
  97. {plain-0.47.0 → plain-0.48.0}/plain/signals/dispatch/license.txt +0 -0
  98. {plain-0.47.0 → plain-0.48.0}/plain/signing.py +0 -0
  99. {plain-0.47.0 → plain-0.48.0}/plain/templates/README.md +0 -0
  100. {plain-0.47.0 → plain-0.48.0}/plain/templates/__init__.py +0 -0
  101. {plain-0.47.0 → plain-0.48.0}/plain/templates/core.py +0 -0
  102. {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/environments.py +0 -0
  103. {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/extensions.py +0 -0
  104. {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/filters.py +0 -0
  105. {plain-0.47.0 → plain-0.48.0}/plain/templates/jinja/globals.py +0 -0
  106. {plain-0.47.0 → plain-0.48.0}/plain/test/README.md +0 -0
  107. {plain-0.47.0 → plain-0.48.0}/plain/test/__init__.py +0 -0
  108. {plain-0.47.0 → plain-0.48.0}/plain/test/client.py +0 -0
  109. {plain-0.47.0 → plain-0.48.0}/plain/test/encoding.py +0 -0
  110. {plain-0.47.0 → plain-0.48.0}/plain/test/exceptions.py +0 -0
  111. {plain-0.47.0 → plain-0.48.0}/plain/urls/README.md +0 -0
  112. {plain-0.47.0 → plain-0.48.0}/plain/urls/__init__.py +0 -0
  113. {plain-0.47.0 → plain-0.48.0}/plain/urls/converters.py +0 -0
  114. {plain-0.47.0 → plain-0.48.0}/plain/urls/exceptions.py +0 -0
  115. {plain-0.47.0 → plain-0.48.0}/plain/urls/patterns.py +0 -0
  116. {plain-0.47.0 → plain-0.48.0}/plain/urls/resolvers.py +0 -0
  117. {plain-0.47.0 → plain-0.48.0}/plain/urls/routers.py +0 -0
  118. {plain-0.47.0 → plain-0.48.0}/plain/urls/utils.py +0 -0
  119. {plain-0.47.0 → plain-0.48.0}/plain/utils/README.md +0 -0
  120. {plain-0.47.0 → plain-0.48.0}/plain/utils/__init__.py +0 -0
  121. {plain-0.47.0 → plain-0.48.0}/plain/utils/cache.py +0 -0
  122. {plain-0.47.0 → plain-0.48.0}/plain/utils/crypto.py +0 -0
  123. {plain-0.47.0 → plain-0.48.0}/plain/utils/datastructures.py +0 -0
  124. {plain-0.47.0 → plain-0.48.0}/plain/utils/dateparse.py +0 -0
  125. {plain-0.47.0 → plain-0.48.0}/plain/utils/deconstruct.py +0 -0
  126. {plain-0.47.0 → plain-0.48.0}/plain/utils/decorators.py +0 -0
  127. {plain-0.47.0 → plain-0.48.0}/plain/utils/duration.py +0 -0
  128. {plain-0.47.0 → plain-0.48.0}/plain/utils/encoding.py +0 -0
  129. {plain-0.47.0 → plain-0.48.0}/plain/utils/functional.py +0 -0
  130. {plain-0.47.0 → plain-0.48.0}/plain/utils/hashable.py +0 -0
  131. {plain-0.47.0 → plain-0.48.0}/plain/utils/html.py +0 -0
  132. {plain-0.47.0 → plain-0.48.0}/plain/utils/http.py +0 -0
  133. {plain-0.47.0 → plain-0.48.0}/plain/utils/inspect.py +0 -0
  134. {plain-0.47.0 → plain-0.48.0}/plain/utils/ipv6.py +0 -0
  135. {plain-0.47.0 → plain-0.48.0}/plain/utils/itercompat.py +0 -0
  136. {plain-0.47.0 → plain-0.48.0}/plain/utils/module_loading.py +0 -0
  137. {plain-0.47.0 → plain-0.48.0}/plain/utils/regex_helper.py +0 -0
  138. {plain-0.47.0 → plain-0.48.0}/plain/utils/safestring.py +0 -0
  139. {plain-0.47.0 → plain-0.48.0}/plain/utils/text.py +0 -0
  140. {plain-0.47.0 → plain-0.48.0}/plain/utils/timesince.py +0 -0
  141. {plain-0.47.0 → plain-0.48.0}/plain/utils/timezone.py +0 -0
  142. {plain-0.47.0 → plain-0.48.0}/plain/utils/tree.py +0 -0
  143. {plain-0.47.0 → plain-0.48.0}/plain/validators.py +0 -0
  144. {plain-0.47.0 → plain-0.48.0}/plain/views/README.md +0 -0
  145. {plain-0.47.0 → plain-0.48.0}/plain/views/__init__.py +0 -0
  146. {plain-0.47.0 → plain-0.48.0}/plain/views/base.py +0 -0
  147. {plain-0.47.0 → plain-0.48.0}/plain/views/csrf.py +0 -0
  148. {plain-0.47.0 → plain-0.48.0}/plain/views/errors.py +0 -0
  149. {plain-0.47.0 → plain-0.48.0}/plain/views/exceptions.py +0 -0
  150. {plain-0.47.0 → plain-0.48.0}/plain/views/forms.py +0 -0
  151. {plain-0.47.0 → plain-0.48.0}/plain/views/objects.py +0 -0
  152. {plain-0.47.0 → plain-0.48.0}/plain/views/redirect.py +0 -0
  153. {plain-0.47.0 → plain-0.48.0}/plain/wsgi.py +0 -0
  154. {plain-0.47.0 → plain-0.48.0}/tests/.gitignore +0 -0
  155. {plain-0.47.0 → plain-0.48.0}/tests/app/.gitignore +0 -0
  156. {plain-0.47.0 → plain-0.48.0}/tests/app/settings.py +0 -0
  157. {plain-0.47.0 → plain-0.48.0}/tests/app/test/__init__.py +0 -0
  158. {plain-0.47.0 → plain-0.48.0}/tests/app/test/default_settings.py +0 -0
  159. {plain-0.47.0 → plain-0.48.0}/tests/app/urls.py +0 -0
  160. {plain-0.47.0 → plain-0.48.0}/tests/conftest.py +0 -0
  161. {plain-0.47.0 → plain-0.48.0}/tests/test_cli.py +0 -0
  162. {plain-0.47.0 → plain-0.48.0}/tests/test_runtime.py +0 -0
  163. {plain-0.47.0 → plain-0.48.0}/tests/test_wsgi.py +0 -0
@@ -6,6 +6,9 @@ __pycache__
6
6
  *.DS_Store
7
7
  .coverage
8
8
 
9
+ # Personal workspace
10
+ /*.code-workspace
11
+
9
12
  # Test apps
10
13
  plain*/tests/.plain
11
14
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.47.0
3
+ Version: 0.48.0
4
4
  Summary: A web framework for building products with Python.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-File: LICENSE
@@ -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.parse(
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
- # Allow this to fail in case there are import errors inside of their file
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
- try:
33
- import_module(import_name)
34
- self._imported_modules.add(import_name)
35
- except ModuleNotFoundError:
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
- # Allow this to fail in case there are import errors inside of their file
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
- try:
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain"
3
- version = "0.47.0"
3
+ version = "0.48.0"
4
4
  description = "A web framework for building products with Python."
5
5
  authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
6
6
  readme = "README.md"
@@ -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