plain 0.58.0__tar.gz → 0.86.2__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 (238) hide show
  1. {plain-0.58.0 → plain-0.86.2}/.gitignore +5 -5
  2. {plain-0.58.0 → plain-0.86.2}/PKG-INFO +5 -3
  3. plain-0.86.2/plain/AGENTS.md +18 -0
  4. plain-0.86.2/plain/CHANGELOG.md +697 -0
  5. {plain-0.58.0 → plain-0.86.2}/plain/README.md +1 -1
  6. {plain-0.58.0 → plain-0.86.2}/plain/assets/compile.py +20 -7
  7. {plain-0.58.0 → plain-0.86.2}/plain/assets/finders.py +15 -11
  8. {plain-0.58.0 → plain-0.86.2}/plain/assets/fingerprints.py +6 -5
  9. {plain-0.58.0 → plain-0.86.2}/plain/assets/urls.py +1 -1
  10. {plain-0.58.0 → plain-0.86.2}/plain/assets/views.py +23 -17
  11. plain-0.86.2/plain/chores/README.md +72 -0
  12. plain-0.86.2/plain/chores/__init__.py +4 -0
  13. plain-0.86.2/plain/chores/core.py +27 -0
  14. plain-0.86.2/plain/chores/registry.py +49 -0
  15. {plain-0.58.0 → plain-0.86.2}/plain/cli/README.md +26 -0
  16. plain-0.86.2/plain/cli/__init__.py +4 -0
  17. plain-0.86.2/plain/cli/agent/__init__.py +17 -0
  18. plain-0.86.2/plain/cli/agent/docs.py +81 -0
  19. plain-0.58.0/plain/cli/docs.py → plain-0.86.2/plain/cli/agent/llmdocs.py +25 -88
  20. plain-0.86.2/plain/cli/agent/md.py +106 -0
  21. plain-0.58.0/plain/cli/agent.py → plain-0.86.2/plain/cli/agent/prompt.py +10 -15
  22. plain-0.86.2/plain/cli/agent/request.py +194 -0
  23. {plain-0.58.0 → plain-0.86.2}/plain/cli/build.py +3 -3
  24. {plain-0.58.0 → plain-0.86.2}/plain/cli/changelog.py +11 -5
  25. plain-0.86.2/plain/cli/chores.py +89 -0
  26. plain-0.86.2/plain/cli/core.py +205 -0
  27. plain-0.86.2/plain/cli/docs.py +39 -0
  28. plain-0.86.2/plain/cli/formatting.py +94 -0
  29. {plain-0.58.0 → plain-0.86.2}/plain/cli/install.py +2 -2
  30. {plain-0.58.0 → plain-0.86.2}/plain/cli/output.py +6 -2
  31. plain-0.86.2/plain/cli/preflight.py +198 -0
  32. {plain-0.58.0 → plain-0.86.2}/plain/cli/print.py +1 -1
  33. plain-0.86.2/plain/cli/registry.py +131 -0
  34. plain-0.86.2/plain/cli/runtime.py +45 -0
  35. {plain-0.58.0 → plain-0.86.2}/plain/cli/scaffold.py +2 -7
  36. plain-0.86.2/plain/cli/server.py +133 -0
  37. {plain-0.58.0 → plain-0.86.2}/plain/cli/settings.py +1 -1
  38. {plain-0.58.0 → plain-0.86.2}/plain/cli/shell.py +29 -12
  39. {plain-0.58.0 → plain-0.86.2}/plain/cli/startup.py +3 -3
  40. {plain-0.58.0 → plain-0.86.2}/plain/cli/upgrade.py +6 -4
  41. {plain-0.58.0 → plain-0.86.2}/plain/cli/urls.py +12 -7
  42. {plain-0.58.0 → plain-0.86.2}/plain/cli/utils.py +3 -3
  43. plain-0.86.2/plain/csrf/middleware.py +144 -0
  44. {plain-0.58.0 → plain-0.86.2}/plain/debug.py +5 -2
  45. {plain-0.58.0 → plain-0.86.2}/plain/exceptions.py +20 -57
  46. {plain-0.58.0 → plain-0.86.2}/plain/forms/__init__.py +1 -1
  47. {plain-0.58.0 → plain-0.86.2}/plain/forms/boundfield.py +14 -7
  48. {plain-0.58.0 → plain-0.86.2}/plain/forms/exceptions.py +1 -1
  49. {plain-0.58.0 → plain-0.86.2}/plain/forms/fields.py +139 -97
  50. {plain-0.58.0 → plain-0.86.2}/plain/forms/forms.py +55 -39
  51. plain-0.86.2/plain/http/README.md +142 -0
  52. {plain-0.58.0 → plain-0.86.2}/plain/http/__init__.py +9 -7
  53. {plain-0.58.0 → plain-0.86.2}/plain/http/cookie.py +15 -7
  54. plain-0.86.2/plain/http/middleware.py +32 -0
  55. {plain-0.58.0 → plain-0.86.2}/plain/http/multipartparser.py +50 -30
  56. {plain-0.58.0 → plain-0.86.2}/plain/http/request.py +186 -191
  57. {plain-0.58.0 → plain-0.86.2}/plain/http/response.py +101 -80
  58. {plain-0.58.0 → plain-0.86.2}/plain/internal/__init__.py +8 -1
  59. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/base.py +34 -18
  60. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/locks.py +19 -11
  61. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/move.py +8 -3
  62. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/temp.py +23 -5
  63. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/uploadedfile.py +42 -26
  64. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/uploadhandler.py +50 -29
  65. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/utils.py +13 -6
  66. {plain-0.58.0 → plain-0.86.2}/plain/internal/handlers/base.py +28 -19
  67. {plain-0.58.0 → plain-0.86.2}/plain/internal/handlers/exception.py +42 -44
  68. {plain-0.58.0 → plain-0.86.2}/plain/internal/handlers/wsgi.py +35 -21
  69. plain-0.86.2/plain/internal/middleware/headers.py +59 -0
  70. plain-0.86.2/plain/internal/middleware/hosts.py +191 -0
  71. plain-0.86.2/plain/internal/middleware/https.py +36 -0
  72. {plain-0.58.0 → plain-0.86.2}/plain/internal/middleware/slash.py +14 -9
  73. plain-0.86.2/plain/internal/reloader.py +77 -0
  74. {plain-0.58.0 → plain-0.86.2}/plain/json.py +2 -1
  75. plain-0.86.2/plain/logs/README.md +176 -0
  76. plain-0.86.2/plain/logs/__init__.py +3 -0
  77. plain-0.86.2/plain/logs/app.py +187 -0
  78. plain-0.86.2/plain/logs/configure.py +85 -0
  79. plain-0.86.2/plain/logs/debug.py +47 -0
  80. plain-0.86.2/plain/logs/filters.py +15 -0
  81. plain-0.86.2/plain/logs/formatters.py +73 -0
  82. {plain-0.58.0 → plain-0.86.2}/plain/packages/config.py +14 -6
  83. {plain-0.58.0 → plain-0.86.2}/plain/packages/registry.py +36 -11
  84. {plain-0.58.0 → plain-0.86.2}/plain/paginator.py +31 -21
  85. plain-0.86.2/plain/preflight/README.md +83 -0
  86. plain-0.86.2/plain/preflight/__init__.py +16 -0
  87. plain-0.86.2/plain/preflight/checks.py +12 -0
  88. plain-0.86.2/plain/preflight/files.py +25 -0
  89. plain-0.86.2/plain/preflight/registry.py +94 -0
  90. plain-0.86.2/plain/preflight/results.py +37 -0
  91. plain-0.86.2/plain/preflight/security.py +83 -0
  92. plain-0.86.2/plain/preflight/urls.py +16 -0
  93. {plain-0.58.0 → plain-0.86.2}/plain/runtime/README.md +0 -1
  94. {plain-0.58.0 → plain-0.86.2}/plain/runtime/__init__.py +13 -7
  95. {plain-0.58.0 → plain-0.86.2}/plain/runtime/global_settings.py +27 -22
  96. {plain-0.58.0 → plain-0.86.2}/plain/runtime/user_settings.py +26 -17
  97. plain-0.86.2/plain/runtime/utils.py +23 -0
  98. plain-0.86.2/plain/server/LICENSE +35 -0
  99. plain-0.86.2/plain/server/README.md +74 -0
  100. plain-0.86.2/plain/server/__init__.py +9 -0
  101. plain-0.86.2/plain/server/app.py +52 -0
  102. plain-0.86.2/plain/server/arbiter.py +555 -0
  103. plain-0.86.2/plain/server/config.py +118 -0
  104. plain-0.86.2/plain/server/errors.py +31 -0
  105. plain-0.86.2/plain/server/glogging.py +292 -0
  106. plain-0.86.2/plain/server/http/__init__.py +12 -0
  107. plain-0.86.2/plain/server/http/body.py +283 -0
  108. plain-0.86.2/plain/server/http/errors.py +150 -0
  109. plain-0.86.2/plain/server/http/message.py +399 -0
  110. plain-0.86.2/plain/server/http/parser.py +69 -0
  111. plain-0.86.2/plain/server/http/unreader.py +88 -0
  112. plain-0.86.2/plain/server/http/wsgi.py +421 -0
  113. plain-0.86.2/plain/server/pidfile.py +91 -0
  114. plain-0.86.2/plain/server/sock.py +219 -0
  115. plain-0.86.2/plain/server/util.py +313 -0
  116. plain-0.86.2/plain/server/workers/__init__.py +6 -0
  117. plain-0.86.2/plain/server/workers/base.py +302 -0
  118. plain-0.86.2/plain/server/workers/sync.py +210 -0
  119. plain-0.86.2/plain/server/workers/thread.py +393 -0
  120. plain-0.86.2/plain/server/workers/workertmp.py +50 -0
  121. {plain-0.58.0 → plain-0.86.2}/plain/signals/__init__.py +0 -1
  122. {plain-0.58.0 → plain-0.86.2}/plain/signals/dispatch/dispatcher.py +39 -17
  123. {plain-0.58.0 → plain-0.86.2}/plain/signing.py +55 -32
  124. plain-0.86.2/plain/templates/AGENTS.md +3 -0
  125. {plain-0.58.0 → plain-0.86.2}/plain/templates/jinja/__init__.py +14 -27
  126. {plain-0.58.0 → plain-0.86.2}/plain/templates/jinja/environments.py +4 -3
  127. {plain-0.58.0 → plain-0.86.2}/plain/templates/jinja/extensions.py +9 -3
  128. {plain-0.58.0 → plain-0.86.2}/plain/templates/jinja/filters.py +7 -2
  129. {plain-0.58.0 → plain-0.86.2}/plain/templates/jinja/globals.py +1 -1
  130. {plain-0.58.0 → plain-0.86.2}/plain/test/README.md +1 -1
  131. {plain-0.58.0 → plain-0.86.2}/plain/test/client.py +334 -219
  132. {plain-0.58.0 → plain-0.86.2}/plain/test/encoding.py +9 -6
  133. plain-0.86.2/plain/test/exceptions.py +15 -0
  134. {plain-0.58.0 → plain-0.86.2}/plain/urls/converters.py +13 -10
  135. {plain-0.58.0 → plain-0.86.2}/plain/urls/patterns.py +50 -38
  136. {plain-0.58.0 → plain-0.86.2}/plain/urls/resolvers.py +35 -25
  137. {plain-0.58.0 → plain-0.86.2}/plain/urls/utils.py +5 -1
  138. {plain-0.58.0 → plain-0.86.2}/plain/utils/cache.py +14 -8
  139. {plain-0.58.0 → plain-0.86.2}/plain/utils/crypto.py +21 -10
  140. {plain-0.58.0 → plain-0.86.2}/plain/utils/datastructures.py +84 -54
  141. {plain-0.58.0 → plain-0.86.2}/plain/utils/dateparse.py +10 -7
  142. {plain-0.58.0 → plain-0.86.2}/plain/utils/deconstruct.py +12 -4
  143. {plain-0.58.0 → plain-0.86.2}/plain/utils/decorators.py +5 -1
  144. {plain-0.58.0 → plain-0.86.2}/plain/utils/duration.py +8 -4
  145. {plain-0.58.0 → plain-0.86.2}/plain/utils/encoding.py +14 -7
  146. {plain-0.58.0 → plain-0.86.2}/plain/utils/functional.py +62 -47
  147. {plain-0.58.0 → plain-0.86.2}/plain/utils/hashable.py +5 -1
  148. {plain-0.58.0 → plain-0.86.2}/plain/utils/html.py +33 -21
  149. {plain-0.58.0 → plain-0.86.2}/plain/utils/http.py +16 -29
  150. {plain-0.58.0 → plain-0.86.2}/plain/utils/inspect.py +14 -6
  151. {plain-0.58.0 → plain-0.86.2}/plain/utils/ipv6.py +7 -3
  152. {plain-0.58.0 → plain-0.86.2}/plain/utils/itercompat.py +6 -1
  153. {plain-0.58.0 → plain-0.86.2}/plain/utils/module_loading.py +7 -3
  154. {plain-0.58.0 → plain-0.86.2}/plain/utils/regex_helper.py +23 -13
  155. {plain-0.58.0 → plain-0.86.2}/plain/utils/safestring.py +14 -6
  156. {plain-0.58.0 → plain-0.86.2}/plain/utils/text.py +34 -18
  157. {plain-0.58.0 → plain-0.86.2}/plain/utils/timezone.py +30 -19
  158. {plain-0.58.0 → plain-0.86.2}/plain/utils/tree.py +31 -18
  159. {plain-0.58.0 → plain-0.86.2}/plain/validators.py +71 -44
  160. {plain-0.58.0 → plain-0.86.2}/plain/views/README.md +16 -26
  161. {plain-0.58.0 → plain-0.86.2}/plain/views/base.py +18 -11
  162. {plain-0.58.0 → plain-0.86.2}/plain/views/errors.py +13 -5
  163. {plain-0.58.0 → plain-0.86.2}/plain/views/exceptions.py +4 -1
  164. {plain-0.58.0 → plain-0.86.2}/plain/views/objects.py +64 -80
  165. {plain-0.58.0 → plain-0.86.2}/plain/views/redirect.py +14 -10
  166. {plain-0.58.0 → plain-0.86.2}/plain/views/templates.py +7 -1
  167. {plain-0.58.0 → plain-0.86.2}/plain/wsgi.py +3 -1
  168. {plain-0.58.0 → plain-0.86.2}/pyproject.toml +6 -8
  169. {plain-0.58.0 → plain-0.86.2}/tests/test_cli.py +0 -8
  170. {plain-0.58.0 → plain-0.86.2}/tests/test_csrf.py +42 -61
  171. plain-0.86.2/tests/test_http_hosts.py +189 -0
  172. plain-0.86.2/tests/test_logs.py +295 -0
  173. {plain-0.58.0 → plain-0.86.2}/tests/test_wsgi.py +2 -1
  174. plain-0.58.0/plain/CHANGELOG.md +0 -178
  175. plain-0.58.0/plain/chores/README.md +0 -70
  176. plain-0.58.0/plain/chores/__init__.py +0 -3
  177. plain-0.58.0/plain/chores/registry.py +0 -79
  178. plain-0.58.0/plain/cli/__init__.py +0 -3
  179. plain-0.58.0/plain/cli/chores.py +0 -91
  180. plain-0.58.0/plain/cli/core.py +0 -123
  181. plain-0.58.0/plain/cli/formatting.py +0 -61
  182. plain-0.58.0/plain/cli/help.py +0 -27
  183. plain-0.58.0/plain/cli/preflight.py +0 -126
  184. plain-0.58.0/plain/cli/registry.py +0 -62
  185. plain-0.58.0/plain/csrf/middleware.py +0 -134
  186. plain-0.58.0/plain/csrf/views.py +0 -31
  187. plain-0.58.0/plain/http/README.md +0 -30
  188. plain-0.58.0/plain/internal/middleware/headers.py +0 -25
  189. plain-0.58.0/plain/internal/middleware/https.py +0 -40
  190. plain-0.58.0/plain/logs/README.md +0 -61
  191. plain-0.58.0/plain/logs/__init__.py +0 -5
  192. plain-0.58.0/plain/logs/configure.py +0 -44
  193. plain-0.58.0/plain/logs/loggers.py +0 -74
  194. plain-0.58.0/plain/logs/utils.py +0 -46
  195. plain-0.58.0/plain/preflight/README.md +0 -61
  196. plain-0.58.0/plain/preflight/__init__.py +0 -36
  197. plain-0.58.0/plain/preflight/files.py +0 -19
  198. plain-0.58.0/plain/preflight/messages.py +0 -81
  199. plain-0.58.0/plain/preflight/registry.py +0 -72
  200. plain-0.58.0/plain/preflight/security.py +0 -89
  201. plain-0.58.0/plain/preflight/urls.py +0 -54
  202. plain-0.58.0/plain/test/exceptions.py +0 -7
  203. {plain-0.58.0 → plain-0.86.2}/LICENSE +0 -0
  204. {plain-0.58.0 → plain-0.86.2}/README.md +0 -0
  205. {plain-0.58.0 → plain-0.86.2}/plain/__main__.py +0 -0
  206. {plain-0.58.0 → plain-0.86.2}/plain/assets/README.md +0 -0
  207. {plain-0.58.0 → plain-0.86.2}/plain/assets/__init__.py +0 -0
  208. {plain-0.58.0 → plain-0.86.2}/plain/csrf/README.md +0 -0
  209. {plain-0.58.0 → plain-0.86.2}/plain/forms/README.md +0 -0
  210. {plain-0.58.0 → plain-0.86.2}/plain/internal/files/__init__.py +0 -0
  211. {plain-0.58.0 → plain-0.86.2}/plain/internal/handlers/__init__.py +0 -0
  212. {plain-0.58.0 → plain-0.86.2}/plain/internal/middleware/__init__.py +0 -0
  213. {plain-0.58.0 → plain-0.86.2}/plain/packages/README.md +0 -0
  214. {plain-0.58.0 → plain-0.86.2}/plain/packages/__init__.py +0 -0
  215. {plain-0.58.0 → plain-0.86.2}/plain/signals/README.md +0 -0
  216. {plain-0.58.0 → plain-0.86.2}/plain/signals/dispatch/__init__.py +0 -0
  217. {plain-0.58.0 → plain-0.86.2}/plain/signals/dispatch/license.txt +0 -0
  218. {plain-0.58.0 → plain-0.86.2}/plain/templates/README.md +0 -0
  219. {plain-0.58.0 → plain-0.86.2}/plain/templates/__init__.py +0 -0
  220. {plain-0.58.0 → plain-0.86.2}/plain/templates/core.py +0 -0
  221. {plain-0.58.0 → plain-0.86.2}/plain/test/__init__.py +0 -0
  222. {plain-0.58.0 → plain-0.86.2}/plain/urls/README.md +0 -0
  223. {plain-0.58.0 → plain-0.86.2}/plain/urls/__init__.py +0 -0
  224. {plain-0.58.0 → plain-0.86.2}/plain/urls/exceptions.py +0 -0
  225. {plain-0.58.0 → plain-0.86.2}/plain/urls/routers.py +0 -0
  226. {plain-0.58.0 → plain-0.86.2}/plain/utils/README.md +0 -0
  227. {plain-0.58.0 → plain-0.86.2}/plain/utils/__init__.py +0 -0
  228. {plain-0.58.0 → plain-0.86.2}/plain/utils/timesince.py +0 -0
  229. {plain-0.58.0 → plain-0.86.2}/plain/views/__init__.py +0 -0
  230. {plain-0.58.0 → plain-0.86.2}/plain/views/forms.py +0 -0
  231. {plain-0.58.0 → plain-0.86.2}/tests/.gitignore +0 -0
  232. {plain-0.58.0 → plain-0.86.2}/tests/app/.gitignore +0 -0
  233. {plain-0.58.0 → plain-0.86.2}/tests/app/settings.py +0 -0
  234. {plain-0.58.0 → plain-0.86.2}/tests/app/test/__init__.py +0 -0
  235. {plain-0.58.0 → plain-0.86.2}/tests/app/test/default_settings.py +0 -0
  236. {plain-0.58.0 → plain-0.86.2}/tests/app/urls.py +0 -0
  237. {plain-0.58.0 → plain-0.86.2}/tests/conftest.py +0 -0
  238. {plain-0.58.0 → plain-0.86.2}/tests/test_runtime.py +0 -0
@@ -1,5 +1,5 @@
1
1
  .venv
2
- .env
2
+ /.env
3
3
  *.egg-info
4
4
  *.py[co]
5
5
  __pycache__
@@ -8,12 +8,12 @@ __pycache__
8
8
  # Test apps
9
9
  plain*/tests/.plain
10
10
 
11
- # Ottobot
12
- .aider*
13
-
14
- /llms-full.txt
11
+ # Agent scratch files
12
+ /scratch
15
13
 
16
14
  # Plain temp dirs
17
15
  .plain
18
16
 
19
17
  .vscode
18
+ /.claude
19
+ /.benchmarks
@@ -1,14 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.58.0
3
+ Version: 0.86.2
4
4
  Summary: A web framework for building products with Python.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
+ License-Expression: BSD-3-Clause
6
7
  License-File: LICENSE
7
- Requires-Python: >=3.11
8
+ Requires-Python: >=3.13
8
9
  Requires-Dist: click>=8.0.0
9
10
  Requires-Dist: jinja2>=3.1.2
10
11
  Requires-Dist: opentelemetry-api>=1.34.1
11
12
  Requires-Dist: opentelemetry-semantic-conventions>=0.55b1
13
+ Requires-Dist: watchfiles>=0.18.0
12
14
  Description-Content-Type: text/markdown
13
15
 
14
16
  # Plain
@@ -44,7 +46,7 @@ The `plain` package includes everything you need to start handling web requests
44
46
  - [plain.cache](/plain-cache/plain/cache/README.md) - A database-driven general purpose cache.
45
47
  - [plain.email](/plain-email/plain/email/README.md) - Send emails with SMTP or custom backends.
46
48
  - [plain.sessions](/plain-sessions/plain/sessions/README.md) - User sessions and cookies.
47
- - [plain.worker](/plain-worker/plain/worker/README.md) - Background jobs stored in the database.
49
+ - [plain.jobs](/plain-jobs/plain/jobs/README.md) - Background jobs stored in the database.
48
50
  - [plain.api](/plain-api/plain/api/README.md) - Build APIs with Plain views.
49
51
 
50
52
  ## Auth Packages
@@ -0,0 +1,18 @@
1
+ # Plain AGENTS.md
2
+
3
+ Plain is a Python web framework that was originally forked from Django. While it still has a lot in common with Django, there are also significant changes -- don't solely rely on knowledge of Django when working with Plain.
4
+
5
+ ## Commands
6
+
7
+ The `plain` CLI is the main entrypoint for the framework. If `plain` is not available by itself, try `uv run plain`.
8
+
9
+ - `plain shell -c <command>`: Run a Python command with Plain configured.
10
+ - `plain run <filename>`: Run a Python script with Plain configured.
11
+ - `plain agent docs <package>`: Show README.md and symbolicated source files for a specific package.
12
+ - `plain agent docs --list`: List packages with docs available.
13
+ - `plain agent request <path> --user <user_id>`: Make an authenticated request to the running application and inspect the output.
14
+ - `plain --help`: List all available commands (including those from installed packages).
15
+
16
+ ## Code style
17
+
18
+ - Imports should be at the top of the file, unless there is a specific reason to import later (e.g. to avoid circular imports).