plain 0.58.0__tar.gz → 0.97.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.

Potentially problematic release.


This version of plain might be problematic. Click here for more details.

Files changed (251) hide show
  1. {plain-0.58.0 → plain-0.97.0}/.gitignore +7 -5
  2. {plain-0.58.0 → plain-0.97.0}/PKG-INFO +5 -3
  3. plain-0.97.0/plain/CHANGELOG.md +891 -0
  4. {plain-0.58.0 → plain-0.97.0}/plain/README.md +1 -1
  5. {plain-0.58.0 → plain-0.97.0}/plain/assets/compile.py +20 -7
  6. {plain-0.58.0 → plain-0.97.0}/plain/assets/finders.py +15 -11
  7. {plain-0.58.0 → plain-0.97.0}/plain/assets/fingerprints.py +6 -5
  8. {plain-0.58.0 → plain-0.97.0}/plain/assets/urls.py +1 -1
  9. {plain-0.58.0 → plain-0.97.0}/plain/assets/views.py +43 -29
  10. plain-0.97.0/plain/chores/README.md +72 -0
  11. plain-0.97.0/plain/chores/__init__.py +4 -0
  12. plain-0.97.0/plain/chores/core.py +27 -0
  13. plain-0.97.0/plain/chores/registry.py +49 -0
  14. {plain-0.58.0 → plain-0.97.0}/plain/cli/README.md +26 -0
  15. plain-0.97.0/plain/cli/__init__.py +4 -0
  16. {plain-0.58.0 → plain-0.97.0}/plain/cli/build.py +7 -8
  17. {plain-0.58.0 → plain-0.97.0}/plain/cli/changelog.py +11 -5
  18. plain-0.97.0/plain/cli/chores.py +89 -0
  19. plain-0.97.0/plain/cli/core.py +207 -0
  20. plain-0.97.0/plain/cli/docs.py +79 -0
  21. plain-0.97.0/plain/cli/formatting.py +96 -0
  22. plain-0.97.0/plain/cli/install.py +38 -0
  23. plain-0.58.0/plain/cli/docs.py → plain-0.97.0/plain/cli/llmdocs.py +27 -88
  24. {plain-0.58.0 → plain-0.97.0}/plain/cli/output.py +6 -2
  25. plain-0.97.0/plain/cli/preflight.py +199 -0
  26. plain-0.97.0/plain/cli/print.py +9 -0
  27. plain-0.97.0/plain/cli/registry.py +131 -0
  28. plain-0.97.0/plain/cli/request.py +194 -0
  29. plain-0.97.0/plain/cli/runtime.py +45 -0
  30. {plain-0.58.0 → plain-0.97.0}/plain/cli/scaffold.py +2 -7
  31. plain-0.97.0/plain/cli/server.py +143 -0
  32. plain-0.97.0/plain/cli/settings.py +64 -0
  33. {plain-0.58.0 → plain-0.97.0}/plain/cli/shell.py +29 -12
  34. plain-0.97.0/plain/cli/skills.py +153 -0
  35. {plain-0.58.0 → plain-0.97.0}/plain/cli/startup.py +9 -8
  36. plain-0.97.0/plain/cli/upgrade.py +81 -0
  37. {plain-0.58.0 → plain-0.97.0}/plain/cli/urls.py +12 -7
  38. {plain-0.58.0 → plain-0.97.0}/plain/cli/utils.py +3 -3
  39. {plain-0.58.0 → plain-0.97.0}/plain/csrf/README.md +2 -0
  40. plain-0.97.0/plain/csrf/middleware.py +143 -0
  41. {plain-0.58.0 → plain-0.97.0}/plain/debug.py +5 -2
  42. {plain-0.58.0 → plain-0.97.0}/plain/exceptions.py +22 -120
  43. plain-0.97.0/plain/forms/__init__.py +59 -0
  44. {plain-0.58.0 → plain-0.97.0}/plain/forms/boundfield.py +15 -8
  45. {plain-0.58.0 → plain-0.97.0}/plain/forms/exceptions.py +1 -1
  46. {plain-0.58.0 → plain-0.97.0}/plain/forms/fields.py +339 -141
  47. {plain-0.58.0 → plain-0.97.0}/plain/forms/forms.py +73 -45
  48. plain-0.97.0/plain/http/README.md +142 -0
  49. plain-0.97.0/plain/http/__init__.py +64 -0
  50. {plain-0.58.0 → plain-0.97.0}/plain/http/cookie.py +15 -7
  51. plain-0.97.0/plain/http/exceptions.py +65 -0
  52. plain-0.97.0/plain/http/middleware.py +32 -0
  53. {plain-0.58.0 → plain-0.97.0}/plain/http/multipartparser.py +78 -73
  54. plain-0.97.0/plain/http/request.py +796 -0
  55. {plain-0.58.0 → plain-0.97.0}/plain/http/response.py +110 -123
  56. {plain-0.58.0 → plain-0.97.0}/plain/internal/__init__.py +8 -1
  57. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/base.py +35 -19
  58. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/locks.py +19 -11
  59. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/move.py +8 -3
  60. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/temp.py +25 -6
  61. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/uploadedfile.py +47 -28
  62. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/uploadhandler.py +64 -58
  63. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/utils.py +24 -10
  64. {plain-0.58.0 → plain-0.97.0}/plain/internal/handlers/base.py +35 -23
  65. {plain-0.58.0 → plain-0.97.0}/plain/internal/handlers/exception.py +68 -65
  66. {plain-0.58.0 → plain-0.97.0}/plain/internal/handlers/wsgi.py +63 -53
  67. plain-0.97.0/plain/internal/middleware/headers.py +59 -0
  68. plain-0.97.0/plain/internal/middleware/hosts.py +191 -0
  69. plain-0.97.0/plain/internal/middleware/https.py +36 -0
  70. {plain-0.58.0 → plain-0.97.0}/plain/internal/middleware/slash.py +15 -10
  71. plain-0.97.0/plain/internal/reloader.py +77 -0
  72. {plain-0.58.0 → plain-0.97.0}/plain/json.py +2 -1
  73. plain-0.97.0/plain/logs/README.md +176 -0
  74. plain-0.97.0/plain/logs/__init__.py +3 -0
  75. plain-0.97.0/plain/logs/app.py +187 -0
  76. plain-0.97.0/plain/logs/configure.py +85 -0
  77. plain-0.97.0/plain/logs/debug.py +47 -0
  78. plain-0.97.0/plain/logs/filters.py +15 -0
  79. plain-0.97.0/plain/logs/formatters.py +73 -0
  80. {plain-0.58.0 → plain-0.97.0}/plain/packages/config.py +14 -6
  81. {plain-0.58.0 → plain-0.97.0}/plain/packages/registry.py +36 -11
  82. {plain-0.58.0 → plain-0.97.0}/plain/paginator.py +31 -21
  83. plain-0.97.0/plain/preflight/README.md +83 -0
  84. plain-0.97.0/plain/preflight/__init__.py +17 -0
  85. plain-0.97.0/plain/preflight/checks.py +12 -0
  86. plain-0.97.0/plain/preflight/files.py +25 -0
  87. plain-0.97.0/plain/preflight/registry.py +94 -0
  88. plain-0.97.0/plain/preflight/results.py +37 -0
  89. plain-0.97.0/plain/preflight/security.py +83 -0
  90. plain-0.97.0/plain/preflight/settings.py +54 -0
  91. plain-0.97.0/plain/preflight/urls.py +16 -0
  92. {plain-0.58.0 → plain-0.97.0}/plain/runtime/README.md +0 -1
  93. {plain-0.58.0 → plain-0.97.0}/plain/runtime/__init__.py +15 -7
  94. {plain-0.58.0 → plain-0.97.0}/plain/runtime/global_settings.py +49 -34
  95. plain-0.97.0/plain/runtime/secret.py +20 -0
  96. {plain-0.58.0 → plain-0.97.0}/plain/runtime/user_settings.py +103 -33
  97. plain-0.97.0/plain/runtime/utils.py +23 -0
  98. plain-0.97.0/plain/server/LICENSE +35 -0
  99. plain-0.97.0/plain/server/README.md +74 -0
  100. plain-0.97.0/plain/server/__init__.py +9 -0
  101. plain-0.97.0/plain/server/app.py +52 -0
  102. plain-0.97.0/plain/server/arbiter.py +555 -0
  103. plain-0.97.0/plain/server/config.py +118 -0
  104. plain-0.97.0/plain/server/errors.py +31 -0
  105. plain-0.97.0/plain/server/glogging.py +292 -0
  106. plain-0.97.0/plain/server/http/__init__.py +12 -0
  107. plain-0.97.0/plain/server/http/body.py +283 -0
  108. plain-0.97.0/plain/server/http/errors.py +155 -0
  109. plain-0.97.0/plain/server/http/message.py +400 -0
  110. plain-0.97.0/plain/server/http/parser.py +70 -0
  111. plain-0.97.0/plain/server/http/unreader.py +88 -0
  112. plain-0.97.0/plain/server/http/wsgi.py +421 -0
  113. plain-0.97.0/plain/server/pidfile.py +92 -0
  114. plain-0.97.0/plain/server/sock.py +240 -0
  115. plain-0.97.0/plain/server/util.py +317 -0
  116. plain-0.97.0/plain/server/workers/__init__.py +6 -0
  117. plain-0.97.0/plain/server/workers/base.py +304 -0
  118. plain-0.97.0/plain/server/workers/sync.py +212 -0
  119. plain-0.97.0/plain/server/workers/thread.py +399 -0
  120. plain-0.97.0/plain/server/workers/workertmp.py +50 -0
  121. {plain-0.58.0 → plain-0.97.0}/plain/signals/__init__.py +0 -1
  122. {plain-0.58.0 → plain-0.97.0}/plain/signals/dispatch/dispatcher.py +39 -17
  123. {plain-0.58.0 → plain-0.97.0}/plain/signing.py +137 -37
  124. plain-0.97.0/plain/skills/plain-docs/SKILL.md +25 -0
  125. plain-0.97.0/plain/skills/plain-install/SKILL.md +26 -0
  126. plain-0.97.0/plain/skills/plain-principles/SKILL.md +27 -0
  127. plain-0.97.0/plain/skills/plain-request/SKILL.md +32 -0
  128. plain-0.97.0/plain/skills/plain-shell/SKILL.md +24 -0
  129. plain-0.97.0/plain/skills/plain-upgrade/SKILL.md +35 -0
  130. {plain-0.58.0 → plain-0.97.0}/plain/templates/jinja/__init__.py +14 -27
  131. {plain-0.58.0 → plain-0.97.0}/plain/templates/jinja/environments.py +4 -3
  132. {plain-0.58.0 → plain-0.97.0}/plain/templates/jinja/extensions.py +12 -5
  133. {plain-0.58.0 → plain-0.97.0}/plain/templates/jinja/filters.py +7 -2
  134. {plain-0.58.0 → plain-0.97.0}/plain/templates/jinja/globals.py +1 -1
  135. {plain-0.58.0 → plain-0.97.0}/plain/test/README.md +1 -1
  136. {plain-0.58.0 → plain-0.97.0}/plain/test/client.py +339 -222
  137. {plain-0.58.0 → plain-0.97.0}/plain/test/encoding.py +9 -6
  138. plain-0.97.0/plain/test/exceptions.py +12 -0
  139. {plain-0.58.0 → plain-0.97.0}/plain/urls/converters.py +13 -10
  140. plain-0.97.0/plain/urls/exceptions.py +9 -0
  141. {plain-0.58.0 → plain-0.97.0}/plain/urls/patterns.py +54 -38
  142. {plain-0.58.0 → plain-0.97.0}/plain/urls/resolvers.py +35 -25
  143. {plain-0.58.0 → plain-0.97.0}/plain/urls/utils.py +5 -1
  144. {plain-0.58.0 → plain-0.97.0}/plain/utils/cache.py +14 -8
  145. {plain-0.58.0 → plain-0.97.0}/plain/utils/crypto.py +21 -10
  146. {plain-0.58.0 → plain-0.97.0}/plain/utils/datastructures.py +89 -56
  147. {plain-0.58.0 → plain-0.97.0}/plain/utils/dateparse.py +9 -6
  148. {plain-0.58.0 → plain-0.97.0}/plain/utils/deconstruct.py +15 -7
  149. {plain-0.58.0 → plain-0.97.0}/plain/utils/decorators.py +5 -1
  150. {plain-0.58.0 → plain-0.97.0}/plain/utils/duration.py +8 -4
  151. {plain-0.58.0 → plain-0.97.0}/plain/utils/encoding.py +14 -7
  152. {plain-0.58.0 → plain-0.97.0}/plain/utils/functional.py +66 -49
  153. {plain-0.58.0 → plain-0.97.0}/plain/utils/hashable.py +5 -1
  154. {plain-0.58.0 → plain-0.97.0}/plain/utils/html.py +34 -22
  155. {plain-0.58.0 → plain-0.97.0}/plain/utils/http.py +16 -29
  156. {plain-0.58.0 → plain-0.97.0}/plain/utils/inspect.py +14 -6
  157. {plain-0.58.0 → plain-0.97.0}/plain/utils/ipv6.py +7 -3
  158. {plain-0.58.0 → plain-0.97.0}/plain/utils/itercompat.py +6 -1
  159. {plain-0.58.0 → plain-0.97.0}/plain/utils/module_loading.py +7 -3
  160. {plain-0.58.0 → plain-0.97.0}/plain/utils/regex_helper.py +22 -12
  161. {plain-0.58.0 → plain-0.97.0}/plain/utils/safestring.py +14 -6
  162. {plain-0.58.0 → plain-0.97.0}/plain/utils/text.py +36 -18
  163. {plain-0.58.0 → plain-0.97.0}/plain/utils/timezone.py +33 -22
  164. {plain-0.58.0 → plain-0.97.0}/plain/utils/tree.py +35 -19
  165. {plain-0.58.0 → plain-0.97.0}/plain/validators.py +94 -52
  166. {plain-0.58.0 → plain-0.97.0}/plain/views/README.md +16 -26
  167. {plain-0.58.0 → plain-0.97.0}/plain/views/__init__.py +0 -1
  168. {plain-0.58.0 → plain-0.97.0}/plain/views/base.py +25 -18
  169. {plain-0.58.0 → plain-0.97.0}/plain/views/errors.py +13 -5
  170. {plain-0.58.0 → plain-0.97.0}/plain/views/exceptions.py +4 -1
  171. {plain-0.58.0 → plain-0.97.0}/plain/views/forms.py +6 -6
  172. {plain-0.58.0 → plain-0.97.0}/plain/views/objects.py +79 -102
  173. {plain-0.58.0 → plain-0.97.0}/plain/views/redirect.py +18 -15
  174. {plain-0.58.0 → plain-0.97.0}/plain/views/templates.py +11 -3
  175. {plain-0.58.0 → plain-0.97.0}/plain/wsgi.py +3 -1
  176. {plain-0.58.0 → plain-0.97.0}/pyproject.toml +6 -8
  177. {plain-0.58.0 → plain-0.97.0}/tests/test_cli.py +0 -8
  178. {plain-0.58.0 → plain-0.97.0}/tests/test_csrf.py +43 -61
  179. plain-0.97.0/tests/test_http_hosts.py +189 -0
  180. plain-0.97.0/tests/test_logs.py +300 -0
  181. {plain-0.58.0 → plain-0.97.0}/tests/test_wsgi.py +2 -1
  182. plain-0.58.0/plain/CHANGELOG.md +0 -178
  183. plain-0.58.0/plain/chores/README.md +0 -70
  184. plain-0.58.0/plain/chores/__init__.py +0 -3
  185. plain-0.58.0/plain/chores/registry.py +0 -79
  186. plain-0.58.0/plain/cli/__init__.py +0 -3
  187. plain-0.58.0/plain/cli/agent.py +0 -50
  188. plain-0.58.0/plain/cli/chores.py +0 -91
  189. plain-0.58.0/plain/cli/core.py +0 -123
  190. plain-0.58.0/plain/cli/formatting.py +0 -61
  191. plain-0.58.0/plain/cli/help.py +0 -27
  192. plain-0.58.0/plain/cli/install.py +0 -82
  193. plain-0.58.0/plain/cli/preflight.py +0 -126
  194. plain-0.58.0/plain/cli/print.py +0 -9
  195. plain-0.58.0/plain/cli/registry.py +0 -62
  196. plain-0.58.0/plain/cli/settings.py +0 -60
  197. plain-0.58.0/plain/cli/upgrade.py +0 -168
  198. plain-0.58.0/plain/csrf/middleware.py +0 -134
  199. plain-0.58.0/plain/csrf/views.py +0 -31
  200. plain-0.58.0/plain/forms/__init__.py +0 -8
  201. plain-0.58.0/plain/http/README.md +0 -30
  202. plain-0.58.0/plain/http/__init__.py +0 -49
  203. plain-0.58.0/plain/http/request.py +0 -748
  204. plain-0.58.0/plain/internal/middleware/headers.py +0 -25
  205. plain-0.58.0/plain/internal/middleware/https.py +0 -40
  206. plain-0.58.0/plain/logs/README.md +0 -61
  207. plain-0.58.0/plain/logs/__init__.py +0 -5
  208. plain-0.58.0/plain/logs/configure.py +0 -44
  209. plain-0.58.0/plain/logs/loggers.py +0 -74
  210. plain-0.58.0/plain/logs/utils.py +0 -46
  211. plain-0.58.0/plain/preflight/README.md +0 -61
  212. plain-0.58.0/plain/preflight/__init__.py +0 -36
  213. plain-0.58.0/plain/preflight/files.py +0 -19
  214. plain-0.58.0/plain/preflight/messages.py +0 -81
  215. plain-0.58.0/plain/preflight/registry.py +0 -72
  216. plain-0.58.0/plain/preflight/security.py +0 -89
  217. plain-0.58.0/plain/preflight/urls.py +0 -54
  218. plain-0.58.0/plain/test/exceptions.py +0 -7
  219. plain-0.58.0/plain/urls/exceptions.py +0 -9
  220. {plain-0.58.0 → plain-0.97.0}/LICENSE +0 -0
  221. {plain-0.58.0 → plain-0.97.0}/README.md +0 -0
  222. {plain-0.58.0 → plain-0.97.0}/plain/__main__.py +0 -0
  223. {plain-0.58.0 → plain-0.97.0}/plain/assets/README.md +0 -0
  224. {plain-0.58.0 → plain-0.97.0}/plain/assets/__init__.py +0 -0
  225. {plain-0.58.0 → plain-0.97.0}/plain/forms/README.md +0 -0
  226. {plain-0.58.0 → plain-0.97.0}/plain/internal/files/__init__.py +0 -0
  227. {plain-0.58.0 → plain-0.97.0}/plain/internal/handlers/__init__.py +0 -0
  228. {plain-0.58.0 → plain-0.97.0}/plain/internal/middleware/__init__.py +0 -0
  229. {plain-0.58.0 → plain-0.97.0}/plain/packages/README.md +0 -0
  230. {plain-0.58.0 → plain-0.97.0}/plain/packages/__init__.py +0 -0
  231. {plain-0.58.0 → plain-0.97.0}/plain/signals/README.md +0 -0
  232. {plain-0.58.0 → plain-0.97.0}/plain/signals/dispatch/__init__.py +0 -0
  233. {plain-0.58.0 → plain-0.97.0}/plain/signals/dispatch/license.txt +0 -0
  234. {plain-0.58.0 → plain-0.97.0}/plain/templates/README.md +0 -0
  235. {plain-0.58.0 → plain-0.97.0}/plain/templates/__init__.py +0 -0
  236. {plain-0.58.0 → plain-0.97.0}/plain/templates/core.py +0 -0
  237. {plain-0.58.0 → plain-0.97.0}/plain/test/__init__.py +0 -0
  238. {plain-0.58.0 → plain-0.97.0}/plain/urls/README.md +0 -0
  239. {plain-0.58.0 → plain-0.97.0}/plain/urls/__init__.py +0 -0
  240. {plain-0.58.0 → plain-0.97.0}/plain/urls/routers.py +0 -0
  241. {plain-0.58.0 → plain-0.97.0}/plain/utils/README.md +0 -0
  242. {plain-0.58.0 → plain-0.97.0}/plain/utils/__init__.py +0 -0
  243. {plain-0.58.0 → plain-0.97.0}/plain/utils/timesince.py +0 -0
  244. {plain-0.58.0 → plain-0.97.0}/tests/.gitignore +0 -0
  245. {plain-0.58.0 → plain-0.97.0}/tests/app/.gitignore +0 -0
  246. {plain-0.58.0 → plain-0.97.0}/tests/app/settings.py +0 -0
  247. {plain-0.58.0 → plain-0.97.0}/tests/app/test/__init__.py +0 -0
  248. {plain-0.58.0 → plain-0.97.0}/tests/app/test/default_settings.py +0 -0
  249. {plain-0.58.0 → plain-0.97.0}/tests/app/urls.py +0 -0
  250. {plain-0.58.0 → plain-0.97.0}/tests/conftest.py +0 -0
  251. {plain-0.58.0 → plain-0.97.0}/tests/test_runtime.py +0 -0
@@ -1,19 +1,21 @@
1
1
  .venv
2
- .env
2
+ /.env
3
3
  *.egg-info
4
4
  *.py[co]
5
5
  __pycache__
6
6
  *.DS_Store
7
7
 
8
+ /*.code-workspace
9
+
8
10
  # Test apps
9
11
  plain*/tests/.plain
10
12
 
11
- # Ottobot
12
- .aider*
13
-
14
- /llms-full.txt
13
+ # Agent scratch files
14
+ /scratch
15
15
 
16
16
  # Plain temp dirs
17
17
  .plain
18
18
 
19
19
  .vscode
20
+ /.claude
21
+ /.benchmarks
@@ -1,14 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.58.0
3
+ Version: 0.97.0
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