plain 0.31.0__tar.gz → 0.32.1__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 (153) hide show
  1. {plain-0.31.0 → plain-0.32.1}/PKG-INFO +1 -1
  2. plain-0.32.1/plain/preflight/urls.py +54 -0
  3. {plain-0.31.0 → plain-0.32.1}/plain/urls/patterns.py +0 -2
  4. {plain-0.31.0 → plain-0.32.1}/pyproject.toml +1 -1
  5. plain-0.31.0/plain/preflight/urls.py +0 -101
  6. {plain-0.31.0 → plain-0.32.1}/.gitignore +0 -0
  7. {plain-0.31.0 → plain-0.32.1}/LICENSE +0 -0
  8. {plain-0.31.0 → plain-0.32.1}/README.md +0 -0
  9. {plain-0.31.0 → plain-0.32.1}/plain/README.md +0 -0
  10. {plain-0.31.0 → plain-0.32.1}/plain/__main__.py +0 -0
  11. {plain-0.31.0 → plain-0.32.1}/plain/assets/README.md +0 -0
  12. {plain-0.31.0 → plain-0.32.1}/plain/assets/__init__.py +0 -0
  13. {plain-0.31.0 → plain-0.32.1}/plain/assets/compile.py +0 -0
  14. {plain-0.31.0 → plain-0.32.1}/plain/assets/finders.py +0 -0
  15. {plain-0.31.0 → plain-0.32.1}/plain/assets/fingerprints.py +0 -0
  16. {plain-0.31.0 → plain-0.32.1}/plain/assets/urls.py +0 -0
  17. {plain-0.31.0 → plain-0.32.1}/plain/assets/views.py +0 -0
  18. {plain-0.31.0 → plain-0.32.1}/plain/cli/README.md +0 -0
  19. {plain-0.31.0 → plain-0.32.1}/plain/cli/__init__.py +0 -0
  20. {plain-0.31.0 → plain-0.32.1}/plain/cli/core.py +0 -0
  21. {plain-0.31.0 → plain-0.32.1}/plain/cli/formatting.py +0 -0
  22. {plain-0.31.0 → plain-0.32.1}/plain/cli/print.py +0 -0
  23. {plain-0.31.0 → plain-0.32.1}/plain/cli/registry.py +0 -0
  24. {plain-0.31.0 → plain-0.32.1}/plain/cli/startup.py +0 -0
  25. {plain-0.31.0 → plain-0.32.1}/plain/csrf/README.md +0 -0
  26. {plain-0.31.0 → plain-0.32.1}/plain/csrf/middleware.py +0 -0
  27. {plain-0.31.0 → plain-0.32.1}/plain/csrf/views.py +0 -0
  28. {plain-0.31.0 → plain-0.32.1}/plain/debug.py +0 -0
  29. {plain-0.31.0 → plain-0.32.1}/plain/exceptions.py +0 -0
  30. {plain-0.31.0 → plain-0.32.1}/plain/forms/README.md +0 -0
  31. {plain-0.31.0 → plain-0.32.1}/plain/forms/__init__.py +0 -0
  32. {plain-0.31.0 → plain-0.32.1}/plain/forms/boundfield.py +0 -0
  33. {plain-0.31.0 → plain-0.32.1}/plain/forms/exceptions.py +0 -0
  34. {plain-0.31.0 → plain-0.32.1}/plain/forms/fields.py +0 -0
  35. {plain-0.31.0 → plain-0.32.1}/plain/forms/forms.py +0 -0
  36. {plain-0.31.0 → plain-0.32.1}/plain/http/README.md +0 -0
  37. {plain-0.31.0 → plain-0.32.1}/plain/http/__init__.py +0 -0
  38. {plain-0.31.0 → plain-0.32.1}/plain/http/cookie.py +0 -0
  39. {plain-0.31.0 → plain-0.32.1}/plain/http/multipartparser.py +0 -0
  40. {plain-0.31.0 → plain-0.32.1}/plain/http/request.py +0 -0
  41. {plain-0.31.0 → plain-0.32.1}/plain/http/response.py +0 -0
  42. {plain-0.31.0 → plain-0.32.1}/plain/internal/__init__.py +0 -0
  43. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/README.md +0 -0
  44. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/__init__.py +0 -0
  45. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/base.py +0 -0
  46. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/locks.py +0 -0
  47. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/move.py +0 -0
  48. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/temp.py +0 -0
  49. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/uploadedfile.py +0 -0
  50. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/uploadhandler.py +0 -0
  51. {plain-0.31.0 → plain-0.32.1}/plain/internal/files/utils.py +0 -0
  52. {plain-0.31.0 → plain-0.32.1}/plain/internal/handlers/__init__.py +0 -0
  53. {plain-0.31.0 → plain-0.32.1}/plain/internal/handlers/base.py +0 -0
  54. {plain-0.31.0 → plain-0.32.1}/plain/internal/handlers/exception.py +0 -0
  55. {plain-0.31.0 → plain-0.32.1}/plain/internal/handlers/wsgi.py +0 -0
  56. {plain-0.31.0 → plain-0.32.1}/plain/internal/middleware/__init__.py +0 -0
  57. {plain-0.31.0 → plain-0.32.1}/plain/internal/middleware/headers.py +0 -0
  58. {plain-0.31.0 → plain-0.32.1}/plain/internal/middleware/https.py +0 -0
  59. {plain-0.31.0 → plain-0.32.1}/plain/internal/middleware/slash.py +0 -0
  60. {plain-0.31.0 → plain-0.32.1}/plain/json.py +0 -0
  61. {plain-0.31.0 → plain-0.32.1}/plain/logs/README.md +0 -0
  62. {plain-0.31.0 → plain-0.32.1}/plain/logs/__init__.py +0 -0
  63. {plain-0.31.0 → plain-0.32.1}/plain/logs/configure.py +0 -0
  64. {plain-0.31.0 → plain-0.32.1}/plain/logs/loggers.py +0 -0
  65. {plain-0.31.0 → plain-0.32.1}/plain/logs/utils.py +0 -0
  66. {plain-0.31.0 → plain-0.32.1}/plain/packages/README.md +0 -0
  67. {plain-0.31.0 → plain-0.32.1}/plain/packages/__init__.py +0 -0
  68. {plain-0.31.0 → plain-0.32.1}/plain/packages/config.py +0 -0
  69. {plain-0.31.0 → plain-0.32.1}/plain/packages/registry.py +0 -0
  70. {plain-0.31.0 → plain-0.32.1}/plain/paginator.py +0 -0
  71. {plain-0.31.0 → plain-0.32.1}/plain/preflight/README.md +0 -0
  72. {plain-0.31.0 → plain-0.32.1}/plain/preflight/__init__.py +0 -0
  73. {plain-0.31.0 → plain-0.32.1}/plain/preflight/files.py +0 -0
  74. {plain-0.31.0 → plain-0.32.1}/plain/preflight/messages.py +0 -0
  75. {plain-0.31.0 → plain-0.32.1}/plain/preflight/registry.py +0 -0
  76. {plain-0.31.0 → plain-0.32.1}/plain/preflight/security.py +0 -0
  77. {plain-0.31.0 → plain-0.32.1}/plain/runtime/README.md +0 -0
  78. {plain-0.31.0 → plain-0.32.1}/plain/runtime/__init__.py +0 -0
  79. {plain-0.31.0 → plain-0.32.1}/plain/runtime/global_settings.py +0 -0
  80. {plain-0.31.0 → plain-0.32.1}/plain/runtime/user_settings.py +0 -0
  81. {plain-0.31.0 → plain-0.32.1}/plain/signals/README.md +0 -0
  82. {plain-0.31.0 → plain-0.32.1}/plain/signals/__init__.py +0 -0
  83. {plain-0.31.0 → plain-0.32.1}/plain/signals/dispatch/__init__.py +0 -0
  84. {plain-0.31.0 → plain-0.32.1}/plain/signals/dispatch/dispatcher.py +0 -0
  85. {plain-0.31.0 → plain-0.32.1}/plain/signals/dispatch/license.txt +0 -0
  86. {plain-0.31.0 → plain-0.32.1}/plain/signing.py +0 -0
  87. {plain-0.31.0 → plain-0.32.1}/plain/templates/README.md +0 -0
  88. {plain-0.31.0 → plain-0.32.1}/plain/templates/__init__.py +0 -0
  89. {plain-0.31.0 → plain-0.32.1}/plain/templates/core.py +0 -0
  90. {plain-0.31.0 → plain-0.32.1}/plain/templates/jinja/README.md +0 -0
  91. {plain-0.31.0 → plain-0.32.1}/plain/templates/jinja/__init__.py +0 -0
  92. {plain-0.31.0 → plain-0.32.1}/plain/templates/jinja/environments.py +0 -0
  93. {plain-0.31.0 → plain-0.32.1}/plain/templates/jinja/extensions.py +0 -0
  94. {plain-0.31.0 → plain-0.32.1}/plain/templates/jinja/filters.py +0 -0
  95. {plain-0.31.0 → plain-0.32.1}/plain/templates/jinja/globals.py +0 -0
  96. {plain-0.31.0 → plain-0.32.1}/plain/test/README.md +0 -0
  97. {plain-0.31.0 → plain-0.32.1}/plain/test/__init__.py +0 -0
  98. {plain-0.31.0 → plain-0.32.1}/plain/test/client.py +0 -0
  99. {plain-0.31.0 → plain-0.32.1}/plain/urls/README.md +0 -0
  100. {plain-0.31.0 → plain-0.32.1}/plain/urls/__init__.py +0 -0
  101. {plain-0.31.0 → plain-0.32.1}/plain/urls/converters.py +0 -0
  102. {plain-0.31.0 → plain-0.32.1}/plain/urls/exceptions.py +0 -0
  103. {plain-0.31.0 → plain-0.32.1}/plain/urls/resolvers.py +0 -0
  104. {plain-0.31.0 → plain-0.32.1}/plain/urls/routers.py +0 -0
  105. {plain-0.31.0 → plain-0.32.1}/plain/urls/utils.py +0 -0
  106. {plain-0.31.0 → plain-0.32.1}/plain/utils/README.md +0 -0
  107. {plain-0.31.0 → plain-0.32.1}/plain/utils/__init__.py +0 -0
  108. {plain-0.31.0 → plain-0.32.1}/plain/utils/cache.py +0 -0
  109. {plain-0.31.0 → plain-0.32.1}/plain/utils/connection.py +0 -0
  110. {plain-0.31.0 → plain-0.32.1}/plain/utils/crypto.py +0 -0
  111. {plain-0.31.0 → plain-0.32.1}/plain/utils/datastructures.py +0 -0
  112. {plain-0.31.0 → plain-0.32.1}/plain/utils/dateparse.py +0 -0
  113. {plain-0.31.0 → plain-0.32.1}/plain/utils/deconstruct.py +0 -0
  114. {plain-0.31.0 → plain-0.32.1}/plain/utils/decorators.py +0 -0
  115. {plain-0.31.0 → plain-0.32.1}/plain/utils/duration.py +0 -0
  116. {plain-0.31.0 → plain-0.32.1}/plain/utils/encoding.py +0 -0
  117. {plain-0.31.0 → plain-0.32.1}/plain/utils/functional.py +0 -0
  118. {plain-0.31.0 → plain-0.32.1}/plain/utils/hashable.py +0 -0
  119. {plain-0.31.0 → plain-0.32.1}/plain/utils/html.py +0 -0
  120. {plain-0.31.0 → plain-0.32.1}/plain/utils/http.py +0 -0
  121. {plain-0.31.0 → plain-0.32.1}/plain/utils/inspect.py +0 -0
  122. {plain-0.31.0 → plain-0.32.1}/plain/utils/ipv6.py +0 -0
  123. {plain-0.31.0 → plain-0.32.1}/plain/utils/itercompat.py +0 -0
  124. {plain-0.31.0 → plain-0.32.1}/plain/utils/module_loading.py +0 -0
  125. {plain-0.31.0 → plain-0.32.1}/plain/utils/regex_helper.py +0 -0
  126. {plain-0.31.0 → plain-0.32.1}/plain/utils/safestring.py +0 -0
  127. {plain-0.31.0 → plain-0.32.1}/plain/utils/text.py +0 -0
  128. {plain-0.31.0 → plain-0.32.1}/plain/utils/timesince.py +0 -0
  129. {plain-0.31.0 → plain-0.32.1}/plain/utils/timezone.py +0 -0
  130. {plain-0.31.0 → plain-0.32.1}/plain/utils/tree.py +0 -0
  131. {plain-0.31.0 → plain-0.32.1}/plain/validators.py +0 -0
  132. {plain-0.31.0 → plain-0.32.1}/plain/views/README.md +0 -0
  133. {plain-0.31.0 → plain-0.32.1}/plain/views/__init__.py +0 -0
  134. {plain-0.31.0 → plain-0.32.1}/plain/views/base.py +0 -0
  135. {plain-0.31.0 → plain-0.32.1}/plain/views/csrf.py +0 -0
  136. {plain-0.31.0 → plain-0.32.1}/plain/views/errors.py +0 -0
  137. {plain-0.31.0 → plain-0.32.1}/plain/views/exceptions.py +0 -0
  138. {plain-0.31.0 → plain-0.32.1}/plain/views/forms.py +0 -0
  139. {plain-0.31.0 → plain-0.32.1}/plain/views/objects.py +0 -0
  140. {plain-0.31.0 → plain-0.32.1}/plain/views/redirect.py +0 -0
  141. {plain-0.31.0 → plain-0.32.1}/plain/views/templates.py +0 -0
  142. {plain-0.31.0 → plain-0.32.1}/plain/wsgi.py +0 -0
  143. {plain-0.31.0 → plain-0.32.1}/tests/.bolt/assets_collected/assets.json +0 -0
  144. {plain-0.31.0 → plain-0.32.1}/tests/.gitignore +0 -0
  145. {plain-0.31.0 → plain-0.32.1}/tests/app/.gitignore +0 -0
  146. {plain-0.31.0 → plain-0.32.1}/tests/app/settings.py +0 -0
  147. {plain-0.31.0 → plain-0.32.1}/tests/app/test/__init__.py +0 -0
  148. {plain-0.31.0 → plain-0.32.1}/tests/app/test/default_settings.py +0 -0
  149. {plain-0.31.0 → plain-0.32.1}/tests/app/urls.py +0 -0
  150. {plain-0.31.0 → plain-0.32.1}/tests/conftest.py +0 -0
  151. {plain-0.31.0 → plain-0.32.1}/tests/test_cli.py +0 -0
  152. {plain-0.31.0 → plain-0.32.1}/tests/test_runtime.py +0 -0
  153. {plain-0.31.0 → plain-0.32.1}/tests/test_wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.31.0
3
+ Version: 0.32.1
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
@@ -0,0 +1,54 @@
1
+ from plain.runtime import settings
2
+
3
+ from . import Error, register
4
+
5
+
6
+ @register
7
+ def check_url_config(package_configs, **kwargs):
8
+ if getattr(settings, "URLS_ROUTER", None):
9
+ from plain.urls import get_resolver
10
+
11
+ resolver = get_resolver()
12
+ return check_resolver(resolver)
13
+
14
+ return []
15
+
16
+
17
+ def check_resolver(resolver):
18
+ """
19
+ Recursively check the resolver.
20
+ """
21
+ check_method = getattr(resolver, "check", None)
22
+ if check_method is not None:
23
+ return check_method()
24
+ elif not hasattr(resolver, "resolve"):
25
+ return get_warning_for_invalid_pattern(resolver)
26
+ else:
27
+ return []
28
+
29
+
30
+ def get_warning_for_invalid_pattern(pattern):
31
+ """
32
+ Return a list containing a warning that the pattern is invalid.
33
+
34
+ describe_pattern() cannot be used here, because we cannot rely on the
35
+ urlpattern having regex or name attributes.
36
+ """
37
+ if isinstance(pattern, str):
38
+ hint = (
39
+ f"Try removing the string '{pattern}'. The list of urlpatterns should not "
40
+ "have a prefix string as the first element."
41
+ )
42
+ elif isinstance(pattern, tuple):
43
+ hint = "Try using path() instead of a tuple."
44
+ else:
45
+ hint = None
46
+
47
+ return [
48
+ Error(
49
+ f"Your URL pattern {pattern!r} is invalid. Ensure that urlpatterns is a list "
50
+ "of path() and/or re_path() instances.",
51
+ hint=hint,
52
+ id="urls.E004",
53
+ )
54
+ ]
@@ -48,7 +48,6 @@ class CheckURLMixin:
48
48
  class RegexPattern(CheckURLMixin):
49
49
  def __init__(self, regex, name=None, is_endpoint=False):
50
50
  self._regex = regex
51
- self._regex_dict = {}
52
51
  self._is_endpoint = is_endpoint
53
52
  self.name = name
54
53
  self.converters = {}
@@ -157,7 +156,6 @@ def _route_to_regex(route, is_endpoint=False):
157
156
  class RoutePattern(CheckURLMixin):
158
157
  def __init__(self, route, name=None, is_endpoint=False):
159
158
  self._route = route
160
- self._regex_dict = {}
161
159
  self._is_endpoint = is_endpoint
162
160
  self.name = name
163
161
  self.converters = _route_to_regex(str(route), is_endpoint)[1]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain"
3
- version = "0.31.0"
3
+ version = "0.32.1"
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,101 +0,0 @@
1
- from collections import Counter
2
-
3
- from plain.runtime import settings
4
-
5
- from . import Error, Warning, register
6
-
7
-
8
- @register
9
- def check_url_config(package_configs, **kwargs):
10
- if getattr(settings, "URLS_ROUTER", None):
11
- from plain.urls import get_resolver
12
-
13
- resolver = get_resolver()
14
- return check_resolver(resolver)
15
-
16
- return []
17
-
18
-
19
- def check_resolver(resolver):
20
- """
21
- Recursively check the resolver.
22
- """
23
- check_method = getattr(resolver, "check", None)
24
- if check_method is not None:
25
- return check_method()
26
- elif not hasattr(resolver, "resolve"):
27
- return get_warning_for_invalid_pattern(resolver)
28
- else:
29
- return []
30
-
31
-
32
- @register
33
- def check_url_namespaces_unique(package_configs, **kwargs):
34
- """
35
- Warn if URL namespaces used in applications aren't unique.
36
- """
37
- if not getattr(settings, "URLS_ROUTER", None):
38
- return []
39
-
40
- from plain.urls import get_resolver
41
-
42
- resolver = get_resolver()
43
- all_namespaces = _load_all_namespaces(resolver)
44
- counter = Counter(all_namespaces)
45
- non_unique_namespaces = [n for n, count in counter.items() if count > 1]
46
- errors = []
47
- for namespace in non_unique_namespaces:
48
- errors.append(
49
- Warning(
50
- f"URL namespace '{namespace}' isn't unique. You may not be able to reverse "
51
- "all URLs in this namespace",
52
- id="urls.W005",
53
- )
54
- )
55
- return errors
56
-
57
-
58
- def _load_all_namespaces(resolver, parents=()):
59
- """
60
- Recursively load all namespaces from URL patterns.
61
- """
62
- url_patterns = getattr(resolver, "url_patterns", [])
63
- namespaces = [
64
- ":".join(parents + (url.namespace,))
65
- for url in url_patterns
66
- if getattr(url, "namespace", None) is not None
67
- ]
68
- for pattern in url_patterns:
69
- namespace = getattr(pattern, "namespace", None)
70
- current = parents
71
- if namespace is not None:
72
- current += (namespace,)
73
- namespaces.extend(_load_all_namespaces(pattern, current))
74
- return namespaces
75
-
76
-
77
- def get_warning_for_invalid_pattern(pattern):
78
- """
79
- Return a list containing a warning that the pattern is invalid.
80
-
81
- describe_pattern() cannot be used here, because we cannot rely on the
82
- urlpattern having regex or name attributes.
83
- """
84
- if isinstance(pattern, str):
85
- hint = (
86
- f"Try removing the string '{pattern}'. The list of urlpatterns should not "
87
- "have a prefix string as the first element."
88
- )
89
- elif isinstance(pattern, tuple):
90
- hint = "Try using path() instead of a tuple."
91
- else:
92
- hint = None
93
-
94
- return [
95
- Error(
96
- f"Your URL pattern {pattern!r} is invalid. Ensure that urlpatterns is a list "
97
- "of path() and/or re_path() instances.",
98
- hint=hint,
99
- id="urls.E004",
100
- )
101
- ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes