plain 0.22.0__py3-none-any.whl → 0.22.1__py3-none-any.whl

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 (168) hide show
  1. plain/urls/resolvers.py +6 -4
  2. plain/urls/routers.py +34 -12
  3. {plain-0.22.0.dist-info → plain-0.22.1.dist-info}/METADATA +1 -1
  4. plain-0.22.1.dist-info/RECORD +145 -0
  5. plain/.pytype/.gitignore +0 -2
  6. plain/.pytype/.ninja_log +0 -17
  7. plain/.pytype/build.ninja +0 -318
  8. plain/.pytype/imports/..packages.__init__.imports +0 -8
  9. plain/.pytype/imports/..packages.__init__.imports-1 +0 -4
  10. plain/.pytype/imports/__main__.imports +0 -0
  11. plain/.pytype/imports/assets.__init__.imports +0 -0
  12. plain/.pytype/imports/assets.compile.imports +0 -10
  13. plain/.pytype/imports/assets.finders.imports +0 -7
  14. plain/.pytype/imports/assets.fingerprints.imports +0 -7
  15. plain/.pytype/imports/assets.urls.imports +0 -51
  16. plain/.pytype/imports/assets.urls.imports-1 +0 -35
  17. plain/.pytype/imports/assets.views.imports +0 -51
  18. plain/.pytype/imports/assets.views.imports-1 +0 -35
  19. plain/.pytype/imports/cli.__init__.imports +0 -16
  20. plain/.pytype/imports/cli.cli.imports +0 -15
  21. plain/.pytype/imports/cli.formatting.imports +0 -2
  22. plain/.pytype/imports/cli.packages.imports +0 -8
  23. plain/.pytype/imports/cli.print.imports +0 -1
  24. plain/.pytype/imports/cli.startup.imports +0 -7
  25. plain/.pytype/imports/debug.imports +0 -2
  26. plain/.pytype/imports/default.pyi +0 -3
  27. plain/.pytype/imports/forms.__init__.imports +0 -23
  28. plain/.pytype/imports/forms.boundfield.imports +0 -0
  29. plain/.pytype/imports/forms.exceptions.imports +0 -1
  30. plain/.pytype/imports/forms.fields.imports +0 -13
  31. plain/.pytype/imports/forms.forms.imports +0 -15
  32. plain/.pytype/imports/http.__init__.imports +0 -20
  33. plain/.pytype/imports/http.__init__.imports-1 +0 -17
  34. plain/.pytype/imports/http.cookie.imports +0 -0
  35. plain/.pytype/imports/http.multipartparser.imports +0 -14
  36. plain/.pytype/imports/http.multipartparser.imports-1 +0 -17
  37. plain/.pytype/imports/http.request.imports +0 -14
  38. plain/.pytype/imports/http.request.imports-1 +0 -25
  39. plain/.pytype/imports/http.response.imports +0 -16
  40. plain/.pytype/imports/internal.__init__.imports +0 -0
  41. plain/.pytype/imports/internal.files.__init__.imports +0 -1
  42. plain/.pytype/imports/internal.files.base.imports +0 -2
  43. plain/.pytype/imports/internal.files.locks.imports +0 -0
  44. plain/.pytype/imports/internal.files.move.imports +0 -1
  45. plain/.pytype/imports/internal.files.temp.imports +0 -1
  46. plain/.pytype/imports/internal.files.uploadedfile.imports +0 -10
  47. plain/.pytype/imports/internal.files.uploadhandler.imports +0 -12
  48. plain/.pytype/imports/internal.files.utils.imports +0 -1
  49. plain/.pytype/imports/internal.handlers.__init__.imports +0 -0
  50. plain/.pytype/imports/internal.handlers.base.imports +0 -53
  51. plain/.pytype/imports/internal.handlers.exception.imports +0 -10
  52. plain/.pytype/imports/internal.handlers.wsgi.imports +0 -29
  53. plain/.pytype/imports/internal.middleware.__init__.imports +0 -0
  54. plain/.pytype/imports/internal.middleware.headers.imports +0 -7
  55. plain/.pytype/imports/internal.middleware.https.imports +0 -8
  56. plain/.pytype/imports/internal.middleware.slash.imports +0 -51
  57. plain/.pytype/imports/json.imports +0 -12
  58. plain/.pytype/imports/json.imports-1 +0 -6
  59. plain/.pytype/imports/json_encoding.imports +0 -3
  60. plain/.pytype/imports/logs.configure.imports +0 -0
  61. plain/.pytype/imports/logs.loggers.imports +0 -0
  62. plain/.pytype/imports/logs.utils.imports +0 -0
  63. plain/.pytype/imports/middleware.imports +0 -13
  64. plain/.pytype/imports/packages.__init__.imports +0 -8
  65. plain/.pytype/imports/packages.__init__.imports-1 +0 -4
  66. plain/.pytype/imports/packages.config.imports +0 -0
  67. plain/.pytype/imports/packages.registry.imports +0 -7
  68. plain/.pytype/imports/packages.registry.imports-1 +0 -3
  69. plain/.pytype/imports/paginator.imports +0 -2
  70. plain/.pytype/imports/preflight.__init__.imports +0 -72
  71. plain/.pytype/imports/preflight.__init__.imports-1 +0 -53
  72. plain/.pytype/imports/preflight.files.imports +0 -8
  73. plain/.pytype/imports/preflight.files.imports-1 +0 -48
  74. plain/.pytype/imports/preflight.messages.imports +0 -7
  75. plain/.pytype/imports/preflight.registry.imports +0 -2
  76. plain/.pytype/imports/preflight.security.imports +0 -11
  77. plain/.pytype/imports/preflight.urls.imports +0 -51
  78. plain/.pytype/imports/preflight.urls.imports-1 +0 -48
  79. plain/.pytype/imports/runtime.global_settings.imports +0 -7
  80. plain/.pytype/imports/runtime.user_settings.imports +0 -7
  81. plain/.pytype/imports/runtime.user_settings.imports-1 +0 -3
  82. plain/.pytype/imports/signals.dispatch.__init__.imports +0 -10
  83. plain/.pytype/imports/signals.dispatch.dispatcher.imports +0 -8
  84. plain/.pytype/imports/templates.__init__.imports +0 -51
  85. plain/.pytype/imports/templates.__init__.imports-1 +0 -35
  86. plain/.pytype/imports/templates.core.imports +0 -51
  87. plain/.pytype/imports/templates.core.imports-1 +0 -35
  88. plain/.pytype/imports/templates.jinja.__init__.imports +0 -51
  89. plain/.pytype/imports/templates.jinja.__init__.imports-1 +0 -35
  90. plain/.pytype/imports/templates.jinja.environments.imports +0 -51
  91. plain/.pytype/imports/templates.jinja.environments.imports-1 +0 -35
  92. plain/.pytype/imports/templates.jinja.extensions.imports +0 -2
  93. plain/.pytype/imports/templates.jinja.filters.imports +0 -7
  94. plain/.pytype/imports/templates.jinja.globals.imports +0 -51
  95. plain/.pytype/imports/templates.jinja.globals.imports-1 +0 -35
  96. plain/.pytype/imports/test.__init__.imports +0 -0
  97. plain/.pytype/imports/test.client.imports +0 -58
  98. plain/.pytype/imports/urls.base.imports +0 -51
  99. plain/.pytype/imports/urls.base.imports-1 +0 -35
  100. plain/.pytype/imports/urls.conf.imports +0 -51
  101. plain/.pytype/imports/urls.conf.imports-1 +0 -35
  102. plain/.pytype/imports/urls.converters.imports +0 -0
  103. plain/.pytype/imports/urls.exceptions.imports +0 -1
  104. plain/.pytype/imports/urls.resolvers.imports +0 -51
  105. plain/.pytype/imports/urls.resolvers.imports-1 +0 -35
  106. plain/.pytype/imports/utils.__init__.imports +0 -0
  107. plain/.pytype/imports/utils._os.imports +0 -1
  108. plain/.pytype/imports/utils.cache.imports +0 -28
  109. plain/.pytype/imports/utils.connection.imports +0 -8
  110. plain/.pytype/imports/utils.datastructures.imports +0 -0
  111. plain/.pytype/imports/utils.dateformat.imports +0 -4
  112. plain/.pytype/imports/utils.dateparse.imports +0 -2
  113. plain/.pytype/imports/utils.dates.imports +0 -0
  114. plain/.pytype/imports/utils.deconstruct.imports +0 -0
  115. plain/.pytype/imports/utils.decorators.imports +0 -0
  116. plain/.pytype/imports/utils.deprecation.imports +0 -0
  117. plain/.pytype/imports/utils.duration.imports +0 -0
  118. plain/.pytype/imports/utils.email.imports +0 -0
  119. plain/.pytype/imports/utils.encoding.imports +0 -1
  120. plain/.pytype/imports/utils.hashable.imports +0 -1
  121. plain/.pytype/imports/utils.html.imports +0 -10
  122. plain/.pytype/imports/utils.inspect.imports +0 -0
  123. plain/.pytype/imports/utils.ipv6.imports +0 -1
  124. plain/.pytype/imports/utils.itercompat.imports +0 -0
  125. plain/.pytype/imports/utils.module_loading.imports +0 -0
  126. plain/.pytype/imports/utils.regex_helper.imports +0 -1
  127. plain/.pytype/imports/utils.safestring.imports +0 -1
  128. plain/.pytype/imports/utils.text.imports +0 -3
  129. plain/.pytype/imports/utils.timesince.imports +0 -6
  130. plain/.pytype/imports/utils.timezone.imports +0 -8
  131. plain/.pytype/imports/utils.tree.imports +0 -2
  132. plain/.pytype/imports/validators.imports +0 -7
  133. plain/.pytype/imports/views.__init__.imports +0 -72
  134. plain/.pytype/imports/views.__init__.imports-1 +0 -53
  135. plain/.pytype/imports/views.base.imports +0 -3
  136. plain/.pytype/imports/views.csrf.imports +0 -1
  137. plain/.pytype/imports/views.errors.imports +0 -51
  138. plain/.pytype/imports/views.exceptions.imports +0 -0
  139. plain/.pytype/imports/views.forms.imports +0 -51
  140. plain/.pytype/imports/views.forms.imports-1 +0 -35
  141. plain/.pytype/imports/views.imports +0 -51
  142. plain/.pytype/imports/views.objects.imports +0 -51
  143. plain/.pytype/imports/views.objects.imports-1 +0 -35
  144. plain/.pytype/imports/views.redirect.imports +0 -51
  145. plain/.pytype/imports/views.redirect.imports-1 +0 -35
  146. plain/.pytype/imports/views.templates.imports +0 -51
  147. plain/.pytype/imports/views.templates.imports-1 +0 -35
  148. plain/.pytype/imports/wsgi.imports +0 -8
  149. plain/.pytype/pyi/json.pyi +0 -15
  150. plain/.pytype/pyi/json.pyi-1 +0 -15
  151. plain/.pytype/pyi/logs/configure.pyi +0 -8
  152. plain/.pytype/pyi/logs/loggers.pyi +0 -20
  153. plain/.pytype/pyi/logs/utils.pyi +0 -7
  154. plain/.pytype/pyi/packages/__init__.pyi +0 -8
  155. plain/.pytype/pyi/packages/__init__.pyi-1 +0 -8
  156. plain/.pytype/pyi/packages/config.pyi +0 -35
  157. plain/.pytype/pyi/packages/registry.pyi +0 -49
  158. plain/.pytype/pyi/packages/registry.pyi-1 +0 -49
  159. plain/.pytype/pyi/runtime/user_settings.pyi +0 -64
  160. plain/.pytype/pyi/runtime/user_settings.pyi-1 +0 -64
  161. plain/.pytype/pyi/utils/duration.pyi +0 -9
  162. plain/.pytype/pyi/utils/hashable.pyi +0 -9
  163. plain/.pytype/pyi/utils/itercompat.pyi +0 -3
  164. plain/.pytype/pyi/utils/module_loading.pyi +0 -14
  165. plain-0.22.0.dist-info/RECORD +0 -305
  166. {plain-0.22.0.dist-info → plain-0.22.1.dist-info}/WHEEL +0 -0
  167. {plain-0.22.0.dist-info → plain-0.22.1.dist-info}/entry_points.txt +0 -0
  168. {plain-0.22.0.dist-info → plain-0.22.1.dist-info}/licenses/LICENSE +0 -0
plain/urls/resolvers.py CHANGED
@@ -97,7 +97,7 @@ def get_resolver(urls_module=None):
97
97
 
98
98
  @functools.cache
99
99
  def _get_cached_resolver(urls_module):
100
- from .routers import routers
100
+ from .routers import routers_registry
101
101
 
102
102
  if isinstance(urls_module, str):
103
103
  # Need to trigger an import in order for the @register_router
@@ -105,7 +105,7 @@ def _get_cached_resolver(urls_module):
105
105
  # usually just for the root URLS_MODULE but could be for anything.
106
106
  urls_module = import_module(urls_module)
107
107
 
108
- router = routers.get_module_router(urls_module)
108
+ router = routers_registry.get_module_router(urls_module)
109
109
  return URLResolver(pattern=RegexPattern(r"^/"), router_class=router)
110
110
 
111
111
 
@@ -139,11 +139,9 @@ class URLResolver:
139
139
  *,
140
140
  pattern,
141
141
  router_class,
142
- namespace=None,
143
142
  ):
144
143
  self.pattern = pattern
145
144
  self.router_class = router_class
146
- self.namespace = namespace
147
145
  self._reverse_dict = {}
148
146
  self._namespace_dict = {}
149
147
  self._app_dict = {}
@@ -320,6 +318,10 @@ class URLResolver:
320
318
  # Don't need to instantiate the class because they are just class attributes for now.
321
319
  return self.router_class.urls
322
320
 
321
+ @cached_property
322
+ def namespace(self):
323
+ return self.router_class.namespace
324
+
323
325
  def reverse(self, lookup_view, *args, **kwargs):
324
326
  if args and kwargs:
325
327
  raise ValueError("Don't mix *args and **kwargs in call to reverse()!")
plain/urls/routers.py CHANGED
@@ -1,12 +1,18 @@
1
+ import re
1
2
  from abc import ABC
3
+ from types import ModuleType
4
+ from typing import TYPE_CHECKING
2
5
 
3
6
  from plain.exceptions import ImproperlyConfigured
4
7
 
5
- from .patterns import RoutePattern, URLPattern
8
+ from .patterns import RegexPattern, RoutePattern, URLPattern
6
9
  from .resolvers import (
7
10
  URLResolver,
8
11
  )
9
12
 
13
+ if TYPE_CHECKING:
14
+ from plain.views import View
15
+
10
16
 
11
17
  class RouterBase(ABC):
12
18
  namespace: str = ""
@@ -39,8 +45,18 @@ class RoutersRegistry:
39
45
  ) from e
40
46
 
41
47
 
42
- def include(route, module_or_urls, *, Pattern=RoutePattern):
43
- pattern = Pattern(route, is_endpoint=False)
48
+ def include(
49
+ route: str | re.Pattern, module_or_urls: list | tuple | str | ModuleType
50
+ ) -> URLResolver:
51
+ """
52
+ Include URLs from another module or a nested list of URL patterns.
53
+ """
54
+ if isinstance(route, str):
55
+ pattern = RoutePattern(route, is_endpoint=False)
56
+ elif isinstance(route, re.Pattern):
57
+ pattern = RegexPattern(route.pattern, is_endpoint=False)
58
+ else:
59
+ raise TypeError("include() route must be a string or regex")
44
60
 
45
61
  if isinstance(module_or_urls, list | tuple):
46
62
  # We were given an explicit list of sub-patterns,
@@ -48,24 +64,30 @@ def include(route, module_or_urls, *, Pattern=RoutePattern):
48
64
  class _IncludeRouter(RouterBase):
49
65
  urls = module_or_urls
50
66
 
51
- return URLResolver(pattern=pattern, router_class=_IncludeRouter, namespace=None)
67
+ return URLResolver(pattern=pattern, router_class=_IncludeRouter)
52
68
  else:
53
69
  # We were given a module, so we need to look up the router for that module
54
70
  module = module_or_urls
55
- router = routers.get_module_router(module)
56
- namespace = router.namespace
71
+ router_class = routers_registry.get_module_router(module)
57
72
 
58
73
  return URLResolver(
59
74
  pattern=pattern,
60
- router_class=router,
61
- namespace=namespace,
75
+ router_class=router_class,
62
76
  )
63
77
 
64
78
 
65
- def path(route, view, *, name=None, Pattern=RoutePattern):
79
+ def path(route: str | re.Pattern, view: "View", *, name: str = "") -> URLPattern:
80
+ """
81
+ Standard URL with a view.
82
+ """
66
83
  from plain.views import View
67
84
 
68
- pattern = Pattern(route, name=name, is_endpoint=True)
85
+ if isinstance(route, str):
86
+ pattern = RoutePattern(route, name=name, is_endpoint=True)
87
+ elif isinstance(route, re.Pattern):
88
+ pattern = RegexPattern(route.pattern, name=name, is_endpoint=True)
89
+ else:
90
+ raise TypeError("path() route must be a string or regex")
69
91
 
70
92
  # You can't pass a View() instance to path()
71
93
  if isinstance(view, View):
@@ -86,5 +108,5 @@ def path(route, view, *, name=None, Pattern=RoutePattern):
86
108
  raise TypeError("view must be a View class or View.as_view()")
87
109
 
88
110
 
89
- routers = RoutersRegistry()
90
- register_router = routers.register_router
111
+ routers_registry = RoutersRegistry()
112
+ register_router = routers_registry.register_router
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.22.0
3
+ Version: 0.22.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,145 @@
1
+ plain/README.md,sha256=nW3Ioj3IxPb6aoCGaFMN2n7Cd7LMx0s8Lph6pMkKnh4,8
2
+ plain/__main__.py,sha256=BiYbF-txGNbeRqp_CHQ9EZ_bCbbKq2iw51Z8RRUgIBY,105
3
+ plain/debug.py,sha256=abPkJY4aSbBYGEYSZST_ZY3ohXPGDdz9uWQBYRqfd3M,730
4
+ plain/exceptions.py,sha256=pPAO8cIzNoqa2YrxG0d31C4P2V9SZ2OprHcjY9-qhIU,6332
5
+ plain/json.py,sha256=McJdsbMT1sYwkGRG--f2NSZz0hVXPMix9x3nKaaak2o,1262
6
+ plain/paginator.py,sha256=zCHCmCG8FEet6C28w2rUko9yiGFnOGCQxRbM_ssa9XY,6037
7
+ plain/signing.py,sha256=sf7g1Mp-FzdjFAEoLxHyu2YvbUl5w4FOtTVDAfq6TO0,8733
8
+ plain/validators.py,sha256=2tZh2Bvp955gejltwVtFGwfqw5-9VAOhKqos3Me4paY,19923
9
+ plain/wsgi.py,sha256=R6k5FiAElvGDApEbMPTT0MPqSD7n2e2Az5chQqJZU0I,236
10
+ plain/assets/README.md,sha256=048BzyQ2-BcsRiv6NiuLHHijOw96RK-e6lJ_Eq7g2pc,2857
11
+ plain/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ plain/assets/compile.py,sha256=Qg-rMWykij_Jheq4THrPFWlmYv07ihHzWiNsD815HYE,3336
13
+ plain/assets/finders.py,sha256=wMa0GUi4S5SUXKcWSqEesMgU4NbXXDrC4SMJwDakwNc,1215
14
+ plain/assets/fingerprints.py,sha256=1NKAnnXVlncY5iimXztr0NL3RIjBKsNlZRIe6nmItJc,931
15
+ plain/assets/urls.py,sha256=lW7VzKNzTKY11JqbszhJQ1Yy0HtljZlsHDnnkTPdLOM,992
16
+ plain/assets/views.py,sha256=z7noLzoelGw_8-MXcvGKjXs9KZ43Tivmy2TIfnZIpgw,9253
17
+ plain/cli/README.md,sha256=TvWCnNwb1rNthPzJglCRMKacN5H_RLeEjYBMe62Uz4M,2461
18
+ plain/cli/__init__.py,sha256=9ByBOIdM8DebChjNz-RH2atdz4vWe8somlwNEsbhwh4,40
19
+ plain/cli/cli.py,sha256=0iHzlXWQTLxWxqxGV4f4K9ABT7s5q5gzSqoNzj0XuKg,18383
20
+ plain/cli/formatting.py,sha256=1hZH13y1qwHcU2K2_Na388nw9uvoeQH8LrWL-O9h8Yc,2207
21
+ plain/cli/packages.py,sha256=TiLirp0ccj5K96jOfp_pS18rOnk1aQS9ckiTi27aRwE,2740
22
+ plain/cli/print.py,sha256=XraUYrgODOJquIiEv78wSCYGRBplHXtXSS9QtFG5hqY,217
23
+ plain/cli/startup.py,sha256=3LIz9JrIZoF52Sa0j0SCypQwEaBDkhvuGaBdtiQLr5Q,680
24
+ plain/csrf/README.md,sha256=RXMWMtHmzf30gVVNOfj0kD4xlSqFIPgJh-n7dIciaEM,163
25
+ plain/csrf/middleware.py,sha256=1szNRF-kKJdjhTw_Jw1Cp2IldtrLtbUqAApJOrVP1qc,17449
26
+ plain/csrf/views.py,sha256=HwQqfI6KPelHP9gSXhjfZaTLQic71PKsoZ6DPhr1rKI,572
27
+ plain/forms/README.md,sha256=fglB9MmHiEgfGGdZmcRstNl6eYaFljrElu2mzapK52M,377
28
+ plain/forms/__init__.py,sha256=UxqPwB8CiYPCQdHmUc59jadqaXqDmXBH8y4bt9vTPms,226
29
+ plain/forms/boundfield.py,sha256=LhydhCVR0okrli0-QBMjGjAJ8-06gTCXVEaBZhBouQk,1741
30
+ plain/forms/exceptions.py,sha256=XCLDRl5snIEDu5-8mLB0NnU_tegcBfyIHMiJxqvbxnc,164
31
+ plain/forms/fields.py,sha256=86ZE9jac6Zyg5vKsYGgyOUOIQLKxO--UomGXwA65tk4,35103
32
+ plain/forms/forms.py,sha256=CiONLo9VhE7E1-u-UejX4XWxxwu6MvR-lVPaVAY7VQM,10441
33
+ plain/http/README.md,sha256=HjEtoAhn14OoMdgb-wK-uc8No7C4d4gZUhzseOp7Fg4,236
34
+ plain/http/__init__.py,sha256=DIsDRbBsCGa4qZgq-fUuQS0kkxfbTU_3KpIM9VvH04w,1067
35
+ plain/http/cookie.py,sha256=11FnSG3Plo6T3jZDbPoCw7SKh9ExdBio3pTmIO03URg,597
36
+ plain/http/multipartparser.py,sha256=k6BhpilFENQQ1cuGix6aa-jGwbhBVms2A2O01-s3_4c,27304
37
+ plain/http/request.py,sha256=Kp0q-1obg7ZUJBz7iuyHwPmNMnssZmoIdLp8ylxJNAo,25965
38
+ plain/http/response.py,sha256=RR2sUG-ONWKWcZyIbztjWvtFyh0cR-CoxQvnWOyN0io,23619
39
+ plain/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ plain/internal/files/README.md,sha256=kMux-NU5qiH0o1K8IajYQT8VjrYl_jLk9LkGG_kGuSc,45
41
+ plain/internal/files/__init__.py,sha256=VctFgox4Q1AWF3klPaoCC5GIw5KeLafYjY5JmN8mAVw,63
42
+ plain/internal/files/base.py,sha256=CSq_BPKWY2kUib7pnoIvzi40isEyrKdkx1yHb8nPtLc,4817
43
+ plain/internal/files/locks.py,sha256=z03q7IZD4tPMK3s1HKF3w_uetkFj6w6FTheLUxZsfB0,3616
44
+ plain/internal/files/move.py,sha256=jfdD29QhamxZjXRgqmZS4dJoJ4sK6M7QK1Km-69jWeo,3238
45
+ plain/internal/files/temp.py,sha256=UJJnCI8dqPIC8XXHU3-jG2-0svbkrgGlBs4yhciLm4c,2506
46
+ plain/internal/files/uploadedfile.py,sha256=JRB7T3quQjg-1y3l1ASPxywtSQZhaeMc45uFPIxvl7c,4192
47
+ plain/internal/files/uploadhandler.py,sha256=eEnd5onstypjHYtg367PnVWwCaF1kAPlLPSV7goIf_E,7198
48
+ plain/internal/files/utils.py,sha256=xN4HTJXDRdcoNyrL1dFd528MBwodRlHZM8DGTD_oBIg,2646
49
+ plain/internal/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ plain/internal/handlers/base.py,sha256=oRKni79ATI_u7sywGFExrzKvP5dpJTqIp1m521A90Ew,4169
51
+ plain/internal/handlers/exception.py,sha256=rv8shMlTJdIhTm99VacILIiu5JRcmtumg8yWuy7GYto,4592
52
+ plain/internal/handlers/wsgi.py,sha256=estA1QKHTk3ZqziWxenHsw5UO2cwPp3Zr0XjkDeM5TY,7561
53
+ plain/internal/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ plain/internal/middleware/headers.py,sha256=ENIW1Gwat54hv-ejgp2R8QTZm-PlaI7k44WU01YQrNk,964
55
+ plain/internal/middleware/https.py,sha256=XpuQK8HicYX1jNanQHqNgyQ9rqe4NLUOZO3ZzKdsP8k,1203
56
+ plain/internal/middleware/slash.py,sha256=FMU8b9w0NSx4eJs9Y7Ew6RAoSTbUqe2oOM68kg3wOng,2817
57
+ plain/logs/README.md,sha256=H6uVXdInYlasq0Z1WnhWnPmNwYQoZ1MSLPDQ4ZE7u4A,492
58
+ plain/logs/__init__.py,sha256=rASvo4qFBDIHfkACmGLNGa6lRGbG9PbNjW6FmBt95ys,168
59
+ plain/logs/configure.py,sha256=6mV7d1IxkDYT3VBz61qhIj0Esuy5l5QdQfsHaGCfI6w,1063
60
+ plain/logs/loggers.py,sha256=iz9SYcwP9w5QAuwpULl48SFkVyJuuMoQ_fdLgdCHpNg,2121
61
+ plain/logs/utils.py,sha256=9UzdCCQXJinGDs71Ngw297mlWkhgZStSd67ya4NOW98,1257
62
+ plain/packages/README.md,sha256=Vq1Nw3mmEmZ2IriQavuVi4BjcQC2nb8k7YIbnm8QjIg,799
63
+ plain/packages/__init__.py,sha256=DnHN1wwHXiXib4Y9BV__x9WrbUaTovoTIxW-tVyScTU,106
64
+ plain/packages/config.py,sha256=6j6Y9Uw4Lbye1M7LVgOhL4rAMkSSkleTzHQU9JRBW7k,11070
65
+ plain/packages/registry.py,sha256=YMYGGrMWPoj4Bg_MXDVNnnoqOAufG_IBT24DB-twAgw,14860
66
+ plain/preflight/README.md,sha256=-PKVd0RBMh4ROiMkegPS2PgvT1Kq9qqN1KfNkmUSdFc,177
67
+ plain/preflight/__init__.py,sha256=H-TNRvaddPtOGmv4RXoc1fxDV1AOb7_K3u7ECF8mV58,607
68
+ plain/preflight/files.py,sha256=wbHCNgps7o1c1zQNBd8FDCaVaqX90UwuvLgEQ_DbUpY,510
69
+ plain/preflight/messages.py,sha256=HwatjA6MRFfzFAnSOa_uAw1Pvk_CLuNfW3IYi71_1Mk,2322
70
+ plain/preflight/registry.py,sha256=7s7f_iEwURzv-Ye515P5lJWcHltd5Ca2fsX1Wpbf1wQ,2306
71
+ plain/preflight/security.py,sha256=sNpv5AHobPcaO48cOUGRNe2EjusTducjY8vyShR8EhI,2645
72
+ plain/preflight/urls.py,sha256=q3ikavMB8ZFMzzm_JOnm1YKwSONgaHjH4Is4-4mmTKM,3001
73
+ plain/runtime/README.md,sha256=Q8VVO7JRGuYrDxzuYL6ptoilhclbecxKzpRXKgbWGkU,2061
74
+ plain/runtime/__init__.py,sha256=ZfypqlhtbWUoJ84vLW4aKgpx2HsdtdJfDZnbbZw6kLE,1510
75
+ plain/runtime/global_settings.py,sha256=SfOhwzpZe2zpNqSpdx3hHgCN89xdbW9KJVR4KJfS_Gk,5498
76
+ plain/runtime/user_settings.py,sha256=r6uQ-h0QxX3gSB_toJJekEbSikXXdNSb8ykUtwGTpdY,11280
77
+ plain/signals/README.md,sha256=cd3tKEgH-xc88CUWyDxl4-qv-HBXx8VT32BXVwA5azA,230
78
+ plain/signals/__init__.py,sha256=eAs0kLqptuP6I31dWXeAqRNji3svplpAV4Ez6ktjwXM,131
79
+ plain/signals/dispatch/__init__.py,sha256=FzEygqV9HsM6gopio7O2Oh_X230nA4d5Q9s0sUjMq0E,292
80
+ plain/signals/dispatch/dispatcher.py,sha256=VxSlqn9PCOTghPPJLOqZPs6FNQZfV2BJpMfFMSg6Dtc,11531
81
+ plain/signals/dispatch/license.txt,sha256=o9EhDhsC4Q5HbmD-IfNGVTEkXtNE33r5rIt3lleJ8gc,1727
82
+ plain/templates/README.md,sha256=VfA2HmrklG5weE1md85q9g84cWnMBEiXAynKzM7S1Sk,464
83
+ plain/templates/__init__.py,sha256=bX76FakE9T7mfK3N0deN85HlwHNQpeigytSC9Z8LcOs,451
84
+ plain/templates/core.py,sha256=iw58EAmyyv8N5HDA-Sq4-fLgz_qx8v8WJfurgR116jw,625
85
+ plain/templates/jinja/README.md,sha256=ft4781b4IAVI6fsIdAHIpOigdsZ6wGg06LK7BHxoj-g,6996
86
+ plain/templates/jinja/__init__.py,sha256=jGjtygVB5Bwknpd3u_pBSrtUSGlFkYo6MDo0E3IWVrs,2653
87
+ plain/templates/jinja/environments.py,sha256=T5e8rjVteN3-6IWCXNRsvPgMe0OVvTkX-r6_Q9gxhv8,2046
88
+ plain/templates/jinja/extensions.py,sha256=AEmmmHDbdRW8fhjYDzq9eSSNbp9WHsXenD8tPthjc0s,1351
89
+ plain/templates/jinja/filters.py,sha256=3KJKKbxcv9dLzUDWPcaa88k3NU2m1GG3iMIgFhzXrBA,860
90
+ plain/templates/jinja/globals.py,sha256=xx3sQBn0Hkqp9jM0fZDlCM5_35C23FrZL6jKEifL77k,498
91
+ plain/test/README.md,sha256=Zso3Ir7a8vQerzKB6egjROQWkpveLAbscn7VTROPAiU,37
92
+ plain/test/__init__.py,sha256=rXe88Y602NP8DBnReSyXb7dUzKoWweLuT43j-qwOUl4,138
93
+ plain/test/client.py,sha256=36Cir1KbrNEhza-5FTgdwxe1iZ5zaEDtESrqcnyndnY,31318
94
+ plain/urls/README.md,sha256=pWnCvgYkWN7rG7hSyBOtX4ZUP3iO7FhqM6lvwwYll6c,33
95
+ plain/urls/__init__.py,sha256=XF-W2GqLMA4bHbDRKnpZ7tiUtJ-BhWN-yAzw4nNnHdc,590
96
+ plain/urls/converters.py,sha256=s2JZVOdzZC16lgobsI93hygcdH5L0Kj4742WEkXsVcs,1193
97
+ plain/urls/exceptions.py,sha256=q4iPh3Aa-zHbA-tw8v6WyX1J1n5WdAady2xvxFuyXB0,114
98
+ plain/urls/patterns.py,sha256=bU_xfhZbKMSgRG9OJ8w_NSuYRm_9zGnqoz_WY44fhUk,9358
99
+ plain/urls/resolvers.py,sha256=T_N7hZ2VrWWpLNkMbzpNcPK8OJb4yPt6QoK_qIls4D8,15592
100
+ plain/urls/routers.py,sha256=0vwzL5udLfQDwFfE4_3lzRVq0Lsx9RcDF4rnnEiJJ1w,3613
101
+ plain/urls/utils.py,sha256=WiGq6hHI-5DLFOxCQTAZ2qm0J-UdGosLcjuxlfK6_Tg,2137
102
+ plain/utils/README.md,sha256=Bf5OG-MkOJDz_U8RGVreDfAI4M4nnPaLtk-LdinxHSc,99
103
+ plain/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
+ plain/utils/_os.py,sha256=oqfiKZRbmHwwWSZP36SIajQnFDbImbB6gcyK0idAGl4,1988
105
+ plain/utils/cache.py,sha256=3GtF8EU07LmD7CSvWSuF7YTThgeNxVkuU68wBK_35Wk,11489
106
+ plain/utils/connection.py,sha256=NN7xRhy6qIWuOOhi1x9YdGcFcYhKepTiMUETeEMS0vY,2501
107
+ plain/utils/crypto.py,sha256=zFDydnaqNMGYFHUc-CAn8f93685a17BhGusAcITH1lI,2662
108
+ plain/utils/datastructures.py,sha256=g4UYTbxIb_n8F9JWMP4dHPwUz71591fHreGATPO4qEc,10240
109
+ plain/utils/dateformat.py,sha256=nsy71l16QuPN0ozGpVlCU5Et101fhk9L38F-wqT5p5I,10203
110
+ plain/utils/dateparse.py,sha256=u9_tF85YteXSjW9KQzNg_pcCEFDZS3EGorCddcWU0vE,5351
111
+ plain/utils/dates.py,sha256=hSDKz8eIb3W5QjmGiklFZZELB0inYXsfiRUy49Cx-2Q,1226
112
+ plain/utils/deconstruct.py,sha256=7NwEFIDCiadAArUBFmiErzDgfIgDWeKqqQFDXwSgQoQ,1830
113
+ plain/utils/decorators.py,sha256=mLHOo2jLdvYRo2z8lkeVn2vQErlj7xC6XoLwZBYf_z8,358
114
+ plain/utils/duration.py,sha256=l0Gc41-DeyyAmpdy2XG-YO5UKxMf1NDpWIlQuD5hAn0,1162
115
+ plain/utils/email.py,sha256=puRTBVuz44YvpnqV3LT4nNIKqdqfY3L8zbDJIkqHk2Y,328
116
+ plain/utils/encoding.py,sha256=z8c7HxYW6wQiE4csx5Ui3WvzgbDzLGXY2aCP04_GZd4,7900
117
+ plain/utils/functional.py,sha256=Xf51mt5bB8zehR8pTRVnRfV21vJ4n1IGpcwj88SSsUA,14791
118
+ plain/utils/hashable.py,sha256=uLWobCCh7VcEPJ7xzVGPgigNVuTazYJbyzRzHTCI_wo,739
119
+ plain/utils/html.py,sha256=K8nJSiNRU54htQOfhezZAYspXaDGN3LjOE3SxmnQml8,13513
120
+ plain/utils/http.py,sha256=OmnqW_nYUaFN-pAEwjTEh9AkpfjKGmE51Ge6inNGB10,12710
121
+ plain/utils/inspect.py,sha256=lhDEOtmSLEub5Jj__MIgW3AyWOEVkaA6doJKKwBhZ6A,2235
122
+ plain/utils/ipv6.py,sha256=pISQ2AIlG8xXlxpphn388q03fq-fOrlu4GZR0YYjQXw,1267
123
+ plain/utils/itercompat.py,sha256=lacIDjczhxbwG4ON_KfG1H6VNPOGOpbRhnVhbedo2CY,184
124
+ plain/utils/module_loading.py,sha256=CWl7Shoax9Zkevf1pM9PpS_0V69J5Cukjyj078UPCAw,2252
125
+ plain/utils/regex_helper.py,sha256=pAdh_xG52BOyXLsiuIMPFgduUAoWOEje1ZpjhcefxiA,12769
126
+ plain/utils/safestring.py,sha256=SHGhpbX6FFDKSYOY9zYAgAQX0g0exzRba7dM2bJalWs,1873
127
+ plain/utils/text.py,sha256=qX7vECGH4Xk96qZRH9A1IyZA-mrJ-j62j3kDcLTdWK0,16586
128
+ plain/utils/timesince.py,sha256=a_-ZoPK_s3Pt998CW4rWp0clZ1XyK2x04hCqak2giII,5928
129
+ plain/utils/timezone.py,sha256=6u0sE-9RVp0_OCe0Y1KiYYQoq5THWLokZFQYY8jf78g,6221
130
+ plain/utils/tree.py,sha256=wdWzmfsgc26YDF2wxhAY3yVxXTixQYqYDKE9mL3L3ZY,4383
131
+ plain/views/README.md,sha256=qndsXKyNMnipPlLaAvgQeGxqXknNQwlFh31Yxk8rHp8,5994
132
+ plain/views/__init__.py,sha256=a-N1nkklVohJTtz0yD1MMaS0g66HviEjsKydNVVjvVc,392
133
+ plain/views/base.py,sha256=HxOOOKZDCCZDmy2cJCEhYswVeIHZ9TukYh1zibeUn6w,3160
134
+ plain/views/csrf.py,sha256=7q6l5xzLWhRnMY64aNj0hR6G-3pxI2yhRwG6k_5j00E,144
135
+ plain/views/errors.py,sha256=Y4oGX4Z6D2COKcDEfINvXE1acE8Ad15KwNNWPs5BCfc,967
136
+ plain/views/exceptions.py,sha256=b4euI49ZUKS9O8AGAcFfiDpstzkRAuuj_uYQXzWNHME,138
137
+ plain/views/forms.py,sha256=RhlaUcZCkeqokY_fvv-NOS-kgZAG4XhDLOPbf9K_Zlc,2691
138
+ plain/views/objects.py,sha256=g5Lzno0Zsv0K449UpcCtxwCoO7WMRAWqKlxxV2V0_qg,8263
139
+ plain/views/redirect.py,sha256=9zHZgKvtSkdrMX9KmsRM8hJTPmBktxhc4d8OitbuniI,1724
140
+ plain/views/templates.py,sha256=cBkFNCSXgVi8cMqQbhsqJ4M_rIQYVl8cUvq9qu4YIes,1951
141
+ plain-0.22.1.dist-info/METADATA,sha256=lbcAVRTvoSbCtA3Nlt-ShyzQV1UOhb2bk_FSDKL5pS4,319
142
+ plain-0.22.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
143
+ plain-0.22.1.dist-info/entry_points.txt,sha256=DHHprvufgd7xypiBiqMANYRnpJ9xPPYhYbnPGwOkWqE,40
144
+ plain-0.22.1.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
145
+ plain-0.22.1.dist-info/RECORD,,
plain/.pytype/.gitignore DELETED
@@ -1,2 +0,0 @@
1
- # Automatically created by pytype
2
- *
plain/.pytype/.ninja_log DELETED
@@ -1,17 +0,0 @@
1
- # ninja log v5
2
- 1 1354 1737048054743908879 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/logs/utils.pyi 62850f8ecffbaa08
3
- 1354 2766 1737048056153476123 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/logs/loggers.pyi 46dd3ff1ac7c8539
4
- 2766 4240 1737048057629135692 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/logs/configure.pyi 2fab9b3dd9186964
5
- 4240 5442 1737048058833065862 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/utils/duration.pyi 8ca5dc6b2c246376
6
- 5442 6910 1737048060298365212 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/packages/config.pyi 2d3ca4b4074d6093
7
- 6910 8382 1737048061767984660 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/packages/registry.pyi-1 54ed2605f20d5375
8
- 8382 9955 1737048063335306723 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/runtime/user_settings.pyi-1 f3f4f834c2de9c3
9
- 9955 11493 1737048064877086910 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/packages/registry.pyi 2b291e9f0339095e
10
- 0 1320 1737048242787566099 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/json.pyi-1 c39fd282a223bbca
11
- 1320 2840 1737048244303822409 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/runtime/user_settings.pyi-1 f3f4f834c2de9c3
12
- 1 1236 1737048520263485950 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/packages/__init__.pyi-1 156bf5ffffa13061
13
- 1236 2472 1737048521498452905 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/packages/__init__.pyi c4d38c996f804f49
14
- 2472 4038 1737048523057219205 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/packages/registry.pyi 2b291e9f0339095e
15
- 1 524 1737048588819781640 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/utils/hashable.pyi b80263a6bb5edb11
16
- 524 1851 1737048590141977101 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/utils/module_loading.pyi 3e2c45469294d5d3
17
- 1 485 1737048620466116610 /Users/davegaeddert/Developer/dropseed/plain/plain/plain/.pytype/pyi/utils/itercompat.pyi 570382667dd1583c