plain 0.2.4__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 (300) hide show
  1. plain-0.86.2/.gitignore +19 -0
  2. plain-0.86.2/PKG-INFO +82 -0
  3. plain-0.86.2/README.md +1 -0
  4. plain-0.86.2/plain/AGENTS.md +18 -0
  5. plain-0.86.2/plain/CHANGELOG.md +697 -0
  6. plain-0.86.2/plain/README.md +67 -0
  7. {plain-0.2.4 → plain-0.86.2}/plain/__main__.py +1 -1
  8. plain-0.86.2/plain/assets/README.md +118 -0
  9. {plain-0.2.4 → plain-0.86.2}/plain/assets/compile.py +58 -47
  10. plain-0.86.2/plain/assets/finders.py +55 -0
  11. plain-0.86.2/plain/assets/fingerprints.py +59 -0
  12. {plain-0.2.4 → plain-0.86.2}/plain/assets/urls.py +18 -9
  13. {plain-0.2.4 → plain-0.86.2}/plain/assets/views.py +50 -32
  14. plain-0.86.2/plain/chores/README.md +72 -0
  15. plain-0.86.2/plain/chores/__init__.py +4 -0
  16. plain-0.86.2/plain/chores/core.py +27 -0
  17. plain-0.86.2/plain/chores/registry.py +49 -0
  18. plain-0.86.2/plain/cli/README.md +67 -0
  19. plain-0.86.2/plain/cli/__init__.py +4 -0
  20. plain-0.86.2/plain/cli/agent/__init__.py +17 -0
  21. plain-0.86.2/plain/cli/agent/docs.py +81 -0
  22. plain-0.86.2/plain/cli/agent/llmdocs.py +155 -0
  23. plain-0.86.2/plain/cli/agent/md.py +106 -0
  24. plain-0.86.2/plain/cli/agent/prompt.py +45 -0
  25. plain-0.86.2/plain/cli/agent/request.py +194 -0
  26. plain-0.86.2/plain/cli/build.py +104 -0
  27. plain-0.86.2/plain/cli/changelog.py +115 -0
  28. plain-0.86.2/plain/cli/chores.py +89 -0
  29. plain-0.86.2/plain/cli/core.py +205 -0
  30. plain-0.86.2/plain/cli/docs.py +39 -0
  31. plain-0.86.2/plain/cli/formatting.py +94 -0
  32. plain-0.86.2/plain/cli/install.py +82 -0
  33. plain-0.86.2/plain/cli/output.py +45 -0
  34. plain-0.86.2/plain/cli/preflight.py +198 -0
  35. {plain-0.2.4 → plain-0.86.2}/plain/cli/print.py +1 -1
  36. plain-0.86.2/plain/cli/registry.py +131 -0
  37. plain-0.86.2/plain/cli/runtime.py +45 -0
  38. plain-0.86.2/plain/cli/scaffold.py +50 -0
  39. plain-0.86.2/plain/cli/server.py +133 -0
  40. plain-0.86.2/plain/cli/settings.py +60 -0
  41. plain-0.86.2/plain/cli/shell.py +73 -0
  42. plain-0.86.2/plain/cli/startup.py +45 -0
  43. plain-0.86.2/plain/cli/upgrade.py +170 -0
  44. plain-0.86.2/plain/cli/urls.py +95 -0
  45. plain-0.86.2/plain/cli/utils.py +15 -0
  46. plain-0.86.2/plain/csrf/README.md +75 -0
  47. plain-0.86.2/plain/csrf/middleware.py +144 -0
  48. plain-0.86.2/plain/debug.py +32 -0
  49. {plain-0.2.4 → plain-0.86.2}/plain/exceptions.py +28 -74
  50. plain-0.86.2/plain/forms/README.md +74 -0
  51. {plain-0.2.4 → plain-0.86.2}/plain/forms/__init__.py +1 -1
  52. {plain-0.2.4 → plain-0.86.2}/plain/forms/boundfield.py +14 -7
  53. plain-0.86.2/plain/forms/exceptions.py +13 -0
  54. {plain-0.2.4 → plain-0.86.2}/plain/forms/fields.py +173 -136
  55. {plain-0.2.4 → plain-0.86.2}/plain/forms/forms.py +77 -56
  56. plain-0.86.2/plain/http/README.md +142 -0
  57. {plain-0.2.4 → plain-0.86.2}/plain/http/__init__.py +9 -9
  58. plain-0.86.2/plain/http/cookie.py +72 -0
  59. plain-0.86.2/plain/http/middleware.py +32 -0
  60. {plain-0.2.4 → plain-0.86.2}/plain/http/multipartparser.py +60 -42
  61. {plain-0.2.4 → plain-0.86.2}/plain/http/request.py +264 -275
  62. {plain-0.2.4 → plain-0.86.2}/plain/http/response.py +138 -143
  63. plain-0.86.2/plain/internal/__init__.py +14 -0
  64. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/base.py +36 -48
  65. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/locks.py +20 -11
  66. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/move.py +9 -5
  67. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/temp.py +23 -5
  68. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/uploadedfile.py +42 -26
  69. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/uploadhandler.py +53 -31
  70. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/utils.py +16 -9
  71. plain-0.86.2/plain/internal/handlers/base.py +177 -0
  72. plain-0.86.2/plain/internal/handlers/exception.py +146 -0
  73. {plain-0.2.4 → plain-0.86.2}/plain/internal/handlers/wsgi.py +67 -38
  74. plain-0.86.2/plain/internal/middleware/headers.py +59 -0
  75. plain-0.86.2/plain/internal/middleware/hosts.py +191 -0
  76. plain-0.86.2/plain/internal/middleware/https.py +36 -0
  77. plain-0.86.2/plain/internal/middleware/slash.py +76 -0
  78. plain-0.86.2/plain/internal/reloader.py +77 -0
  79. {plain-0.2.4 → plain-0.86.2}/plain/json.py +2 -1
  80. plain-0.86.2/plain/logs/README.md +176 -0
  81. plain-0.86.2/plain/logs/__init__.py +3 -0
  82. plain-0.86.2/plain/logs/app.py +187 -0
  83. plain-0.86.2/plain/logs/configure.py +85 -0
  84. plain-0.86.2/plain/logs/debug.py +47 -0
  85. plain-0.86.2/plain/logs/filters.py +15 -0
  86. plain-0.86.2/plain/logs/formatters.py +73 -0
  87. plain-0.86.2/plain/packages/README.md +82 -0
  88. plain-0.86.2/plain/packages/__init__.py +4 -0
  89. plain-0.86.2/plain/packages/config.py +82 -0
  90. plain-0.86.2/plain/packages/registry.py +232 -0
  91. {plain-0.2.4 → plain-0.86.2}/plain/paginator.py +33 -28
  92. plain-0.86.2/plain/preflight/README.md +83 -0
  93. plain-0.86.2/plain/preflight/__init__.py +16 -0
  94. plain-0.86.2/plain/preflight/checks.py +12 -0
  95. plain-0.86.2/plain/preflight/files.py +25 -0
  96. plain-0.86.2/plain/preflight/registry.py +94 -0
  97. plain-0.86.2/plain/preflight/results.py +37 -0
  98. plain-0.86.2/plain/preflight/security.py +83 -0
  99. plain-0.86.2/plain/preflight/urls.py +16 -0
  100. plain-0.86.2/plain/runtime/README.md +159 -0
  101. plain-0.86.2/plain/runtime/__init__.py +96 -0
  102. {plain-0.2.4 → plain-0.86.2}/plain/runtime/global_settings.py +96 -118
  103. plain-0.86.2/plain/runtime/user_settings.py +313 -0
  104. plain-0.86.2/plain/runtime/utils.py +23 -0
  105. plain-0.86.2/plain/server/LICENSE +35 -0
  106. plain-0.86.2/plain/server/README.md +74 -0
  107. plain-0.86.2/plain/server/__init__.py +9 -0
  108. plain-0.86.2/plain/server/app.py +52 -0
  109. plain-0.86.2/plain/server/arbiter.py +555 -0
  110. plain-0.86.2/plain/server/config.py +118 -0
  111. plain-0.86.2/plain/server/errors.py +31 -0
  112. plain-0.86.2/plain/server/glogging.py +292 -0
  113. plain-0.86.2/plain/server/http/__init__.py +12 -0
  114. plain-0.86.2/plain/server/http/body.py +283 -0
  115. plain-0.86.2/plain/server/http/errors.py +150 -0
  116. plain-0.86.2/plain/server/http/message.py +399 -0
  117. plain-0.86.2/plain/server/http/parser.py +69 -0
  118. plain-0.86.2/plain/server/http/unreader.py +88 -0
  119. plain-0.86.2/plain/server/http/wsgi.py +421 -0
  120. plain-0.86.2/plain/server/pidfile.py +91 -0
  121. plain-0.86.2/plain/server/sock.py +219 -0
  122. plain-0.86.2/plain/server/util.py +313 -0
  123. plain-0.86.2/plain/server/workers/__init__.py +6 -0
  124. plain-0.86.2/plain/server/workers/base.py +302 -0
  125. plain-0.86.2/plain/server/workers/sync.py +210 -0
  126. plain-0.86.2/plain/server/workers/thread.py +393 -0
  127. plain-0.86.2/plain/server/workers/workertmp.py +50 -0
  128. {plain-0.2.4 → plain-0.86.2}/plain/signals/README.md +5 -1
  129. {plain-0.2.4 → plain-0.86.2}/plain/signals/__init__.py +0 -1
  130. {plain-0.2.4 → plain-0.86.2}/plain/signals/dispatch/dispatcher.py +39 -17
  131. {plain-0.2.4 → plain-0.86.2}/plain/signing.py +61 -72
  132. plain-0.86.2/plain/templates/AGENTS.md +3 -0
  133. plain-0.86.2/plain/templates/README.md +86 -0
  134. plain-0.86.2/plain/templates/__init__.py +17 -0
  135. plain-0.86.2/plain/templates/core.py +42 -0
  136. plain-0.86.2/plain/templates/jinja/__init__.py +78 -0
  137. plain-0.86.2/plain/templates/jinja/environments.py +64 -0
  138. {plain-0.2.4 → plain-0.86.2}/plain/templates/jinja/extensions.py +9 -3
  139. {plain-0.2.4 → plain-0.86.2}/plain/templates/jinja/filters.py +28 -1
  140. plain-0.86.2/plain/templates/jinja/globals.py +23 -0
  141. plain-0.86.2/plain/test/README.md +42 -0
  142. plain-0.86.2/plain/test/__init__.py +6 -0
  143. {plain-0.2.4 → plain-0.86.2}/plain/test/client.py +365 -459
  144. plain-0.86.2/plain/test/encoding.py +101 -0
  145. plain-0.86.2/plain/test/exceptions.py +15 -0
  146. plain-0.86.2/plain/urls/README.md +157 -0
  147. {plain-0.2.4 → plain-0.86.2}/plain/urls/__init__.py +7 -19
  148. {plain-0.2.4 → plain-0.86.2}/plain/urls/converters.py +13 -10
  149. plain-0.86.2/plain/urls/patterns.py +250 -0
  150. plain-0.86.2/plain/urls/resolvers.py +343 -0
  151. plain-0.86.2/plain/urls/routers.py +89 -0
  152. plain-0.86.2/plain/urls/utils.py +47 -0
  153. plain-0.86.2/plain/utils/README.md +9 -0
  154. plain-0.86.2/plain/utils/cache.py +158 -0
  155. {plain-0.2.4 → plain-0.86.2}/plain/utils/crypto.py +23 -11
  156. {plain-0.2.4 → plain-0.86.2}/plain/utils/datastructures.py +85 -55
  157. {plain-0.2.4 → plain-0.86.2}/plain/utils/dateparse.py +11 -8
  158. {plain-0.2.4 → plain-0.86.2}/plain/utils/deconstruct.py +12 -4
  159. plain-0.86.2/plain/utils/decorators.py +14 -0
  160. {plain-0.2.4 → plain-0.86.2}/plain/utils/duration.py +8 -4
  161. {plain-0.2.4 → plain-0.86.2}/plain/utils/encoding.py +14 -112
  162. {plain-0.2.4 → plain-0.86.2}/plain/utils/functional.py +61 -97
  163. {plain-0.2.4 → plain-0.86.2}/plain/utils/hashable.py +5 -1
  164. plain-0.86.2/plain/utils/html.py +138 -0
  165. plain-0.86.2/plain/utils/http.py +174 -0
  166. plain-0.86.2/plain/utils/inspect.py +46 -0
  167. {plain-0.2.4 → plain-0.86.2}/plain/utils/ipv6.py +8 -4
  168. {plain-0.2.4 → plain-0.86.2}/plain/utils/itercompat.py +6 -1
  169. {plain-0.2.4 → plain-0.86.2}/plain/utils/module_loading.py +9 -24
  170. {plain-0.2.4 → plain-0.86.2}/plain/utils/regex_helper.py +30 -19
  171. {plain-0.2.4 → plain-0.86.2}/plain/utils/safestring.py +14 -9
  172. {plain-0.2.4 → plain-0.86.2}/plain/utils/text.py +37 -274
  173. plain-0.86.2/plain/utils/timesince.py +175 -0
  174. {plain-0.2.4 → plain-0.86.2}/plain/utils/timezone.py +36 -46
  175. {plain-0.2.4 → plain-0.86.2}/plain/utils/tree.py +31 -18
  176. {plain-0.2.4 → plain-0.86.2}/plain/validators.py +72 -73
  177. {plain-0.2.4 → plain-0.86.2}/plain/views/README.md +77 -45
  178. plain-0.86.2/plain/views/base.py +145 -0
  179. plain-0.86.2/plain/views/errors.py +48 -0
  180. {plain-0.2.4 → plain-0.86.2}/plain/views/exceptions.py +4 -1
  181. {plain-0.2.4 → plain-0.86.2}/plain/views/forms.py +7 -15
  182. plain-0.86.2/plain/views/objects.py +171 -0
  183. plain-0.86.2/plain/views/redirect.py +70 -0
  184. {plain-0.2.4 → plain-0.86.2}/plain/views/templates.py +24 -28
  185. {plain-0.2.4 → plain-0.86.2}/plain/wsgi.py +3 -1
  186. plain-0.86.2/pyproject.toml +30 -0
  187. plain-0.86.2/tests/.gitignore +1 -0
  188. plain-0.86.2/tests/app/.gitignore +1 -0
  189. plain-0.86.2/tests/app/settings.py +11 -0
  190. plain-0.86.2/tests/app/test/default_settings.py +4 -0
  191. plain-0.86.2/tests/app/urls.py +14 -0
  192. plain-0.86.2/tests/conftest.py +7 -0
  193. plain-0.86.2/tests/test_cli.py +36 -0
  194. plain-0.86.2/tests/test_csrf.py +337 -0
  195. plain-0.86.2/tests/test_http_hosts.py +189 -0
  196. plain-0.86.2/tests/test_logs.py +295 -0
  197. plain-0.86.2/tests/test_runtime.py +9 -0
  198. plain-0.86.2/tests/test_wsgi.py +24 -0
  199. plain-0.2.4/PKG-INFO +0 -51
  200. plain-0.2.4/README.md +0 -35
  201. plain-0.2.4/plain/README.md +0 -33
  202. plain-0.2.4/plain/assets/README.md +0 -94
  203. plain-0.2.4/plain/assets/finders.py +0 -41
  204. plain-0.2.4/plain/assets/fingerprints.py +0 -38
  205. plain-0.2.4/plain/cli/README.md +0 -123
  206. plain-0.2.4/plain/cli/__init__.py +0 -3
  207. plain-0.2.4/plain/cli/cli.py +0 -510
  208. plain-0.2.4/plain/cli/formatting.py +0 -61
  209. plain-0.2.4/plain/cli/packages.py +0 -73
  210. plain-0.2.4/plain/cli/startup.py +0 -33
  211. plain-0.2.4/plain/csrf/README.md +0 -15
  212. plain-0.2.4/plain/csrf/middleware.py +0 -466
  213. plain-0.2.4/plain/csrf/views.py +0 -10
  214. plain-0.2.4/plain/debug.py +0 -23
  215. plain-0.2.4/plain/forms/README.md +0 -14
  216. plain-0.2.4/plain/forms/exceptions.py +0 -11
  217. plain-0.2.4/plain/http/README.md +0 -1
  218. plain-0.2.4/plain/http/cookie.py +0 -20
  219. plain-0.2.4/plain/internal/files/README.md +0 -3
  220. plain-0.2.4/plain/internal/handlers/base.py +0 -133
  221. plain-0.2.4/plain/internal/handlers/exception.py +0 -145
  222. plain-0.2.4/plain/internal/legacy/__main__.py +0 -12
  223. plain-0.2.4/plain/internal/legacy/management/__init__.py +0 -414
  224. plain-0.2.4/plain/internal/legacy/management/base.py +0 -692
  225. plain-0.2.4/plain/internal/legacy/management/color.py +0 -113
  226. plain-0.2.4/plain/internal/legacy/management/sql.py +0 -67
  227. plain-0.2.4/plain/internal/legacy/management/utils.py +0 -175
  228. plain-0.2.4/plain/logs/README.md +0 -24
  229. plain-0.2.4/plain/logs/__init__.py +0 -5
  230. plain-0.2.4/plain/logs/configure.py +0 -39
  231. plain-0.2.4/plain/logs/loggers.py +0 -74
  232. plain-0.2.4/plain/logs/utils.py +0 -46
  233. plain-0.2.4/plain/middleware/README.md +0 -3
  234. plain-0.2.4/plain/middleware/clickjacking.py +0 -52
  235. plain-0.2.4/plain/middleware/common.py +0 -87
  236. plain-0.2.4/plain/middleware/gzip.py +0 -64
  237. plain-0.2.4/plain/middleware/security.py +0 -64
  238. plain-0.2.4/plain/packages/README.md +0 -41
  239. plain-0.2.4/plain/packages/__init__.py +0 -4
  240. plain-0.2.4/plain/packages/config.py +0 -259
  241. plain-0.2.4/plain/packages/registry.py +0 -432
  242. plain-0.2.4/plain/preflight/README.md +0 -3
  243. plain-0.2.4/plain/preflight/__init__.py +0 -38
  244. plain-0.2.4/plain/preflight/compatibility/__init__.py +0 -0
  245. plain-0.2.4/plain/preflight/compatibility/django_4_0.py +0 -20
  246. plain-0.2.4/plain/preflight/files.py +0 -19
  247. plain-0.2.4/plain/preflight/messages.py +0 -88
  248. plain-0.2.4/plain/preflight/registry.py +0 -72
  249. plain-0.2.4/plain/preflight/security/__init__.py +0 -0
  250. plain-0.2.4/plain/preflight/security/base.py +0 -268
  251. plain-0.2.4/plain/preflight/security/csrf.py +0 -40
  252. plain-0.2.4/plain/preflight/urls.py +0 -107
  253. plain-0.2.4/plain/runtime/README.md +0 -74
  254. plain-0.2.4/plain/runtime/__init__.py +0 -61
  255. plain-0.2.4/plain/runtime/user_settings.py +0 -304
  256. plain-0.2.4/plain/templates/README.md +0 -20
  257. plain-0.2.4/plain/templates/__init__.py +0 -6
  258. plain-0.2.4/plain/templates/core.py +0 -24
  259. plain-0.2.4/plain/templates/jinja/README.md +0 -227
  260. plain-0.2.4/plain/templates/jinja/__init__.py +0 -22
  261. plain-0.2.4/plain/templates/jinja/defaults.py +0 -119
  262. plain-0.2.4/plain/templates/jinja/globals.py +0 -19
  263. plain-0.2.4/plain/test/README.md +0 -3
  264. plain-0.2.4/plain/test/__init__.py +0 -8
  265. plain-0.2.4/plain/urls/README.md +0 -3
  266. plain-0.2.4/plain/urls/base.py +0 -118
  267. plain-0.2.4/plain/urls/conf.py +0 -94
  268. plain-0.2.4/plain/urls/resolvers.py +0 -731
  269. plain-0.2.4/plain/utils/README.md +0 -3
  270. plain-0.2.4/plain/utils/__init__.py +0 -0
  271. plain-0.2.4/plain/utils/_os.py +0 -52
  272. plain-0.2.4/plain/utils/cache.py +0 -327
  273. plain-0.2.4/plain/utils/connection.py +0 -84
  274. plain-0.2.4/plain/utils/dateformat.py +0 -329
  275. plain-0.2.4/plain/utils/dates.py +0 -76
  276. plain-0.2.4/plain/utils/decorators.py +0 -90
  277. plain-0.2.4/plain/utils/deprecation.py +0 -6
  278. plain-0.2.4/plain/utils/email.py +0 -12
  279. plain-0.2.4/plain/utils/html.py +0 -401
  280. plain-0.2.4/plain/utils/http.py +0 -374
  281. plain-0.2.4/plain/utils/inspect.py +0 -73
  282. plain-0.2.4/plain/utils/termcolors.py +0 -221
  283. plain-0.2.4/plain/utils/timesince.py +0 -138
  284. plain-0.2.4/plain/views/base.py +0 -109
  285. plain-0.2.4/plain/views/csrf.py +0 -24
  286. plain-0.2.4/plain/views/errors.py +0 -32
  287. plain-0.2.4/plain/views/objects.py +0 -229
  288. plain-0.2.4/plain/views/redirect.py +0 -72
  289. plain-0.2.4/pyproject.toml +0 -36
  290. {plain-0.2.4 → plain-0.86.2}/LICENSE +0 -0
  291. {plain-0.2.4 → plain-0.86.2}/plain/assets/__init__.py +0 -0
  292. {plain-0.2.4 → plain-0.86.2}/plain/internal/files/__init__.py +0 -0
  293. {plain-0.2.4/plain/internal → plain-0.86.2/plain/internal/handlers}/__init__.py +0 -0
  294. {plain-0.2.4/plain/internal/handlers → plain-0.86.2/plain/internal/middleware}/__init__.py +0 -0
  295. {plain-0.2.4 → plain-0.86.2}/plain/signals/dispatch/__init__.py +0 -0
  296. {plain-0.2.4 → plain-0.86.2}/plain/signals/dispatch/license.txt +0 -0
  297. {plain-0.2.4 → plain-0.86.2}/plain/urls/exceptions.py +0 -0
  298. {plain-0.2.4/plain/internal/legacy → plain-0.86.2/plain/utils}/__init__.py +0 -0
  299. {plain-0.2.4 → plain-0.86.2}/plain/views/__init__.py +0 -0
  300. {plain-0.2.4/plain/middleware → plain-0.86.2/tests/app/test}/__init__.py +0 -0
@@ -0,0 +1,19 @@
1
+ .venv
2
+ /.env
3
+ *.egg-info
4
+ *.py[co]
5
+ __pycache__
6
+ *.DS_Store
7
+
8
+ # Test apps
9
+ plain*/tests/.plain
10
+
11
+ # Agent scratch files
12
+ /scratch
13
+
14
+ # Plain temp dirs
15
+ .plain
16
+
17
+ .vscode
18
+ /.claude
19
+ /.benchmarks
plain-0.86.2/PKG-INFO ADDED
@@ -0,0 +1,82 @@
1
+ Metadata-Version: 2.4
2
+ Name: plain
3
+ Version: 0.86.2
4
+ Summary: A web framework for building products with Python.
5
+ Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
+ License-Expression: BSD-3-Clause
7
+ License-File: LICENSE
8
+ Requires-Python: >=3.13
9
+ Requires-Dist: click>=8.0.0
10
+ Requires-Dist: jinja2>=3.1.2
11
+ Requires-Dist: opentelemetry-api>=1.34.1
12
+ Requires-Dist: opentelemetry-semantic-conventions>=0.55b1
13
+ Requires-Dist: watchfiles>=0.18.0
14
+ Description-Content-Type: text/markdown
15
+
16
+ # Plain
17
+
18
+ **Plain is a web framework for building products with Python.**
19
+
20
+ The core `plain` package provides the backbone of a Python web application (similar to [Flask](https://flask.palletsprojects.com/en/stable/)), while the additional first-party packages can power a more fully-featured database-backed app (similar to [Django](https://www.djangoproject.com/)).
21
+
22
+ All Plain packages are designed to work together and use [PEP 420](https://peps.python.org/pep-0420/) to share the `plain` namespace.
23
+
24
+ To quickly get started with Plain, visit [plainframework.com/start/](https://plainframework.com/start/).
25
+
26
+ ## Core Modules
27
+
28
+ The `plain` package includes everything you need to start handling web requests with Python:
29
+
30
+ - [assets](./assets/README.md) - Serve static files and assets.
31
+ - [cli](./cli/README.md) - The `plain` CLI, powered by Click.
32
+ - [csrf](./csrf/README.md) - Cross-Site Request Forgery protection.
33
+ - [forms](./forms/README.md) - HTML forms and form validation.
34
+ - [http](./http/README.md) - HTTP request and response handling.
35
+ - [logs](./logs/README.md) - Logging configuration and utilities.
36
+ - [preflight](./preflight/README.md) - Preflight checks for your app.
37
+ - [runtime](./runtime/README.md) - Runtime settings and configuration.
38
+ - [templates](./templates/README.md) - Jinja2 templates and rendering.
39
+ - [test](./test/README.md) - Test utilities and fixtures.
40
+ - [urls](./urls/README.md) - URL routing and request dispatching.
41
+ - [views](./views/README.md) - Class-based views and request handlers.
42
+
43
+ ## Foundational Packages
44
+
45
+ - [plain.models](/plain-models/plain/models/README.md) - Define and interact with your database models.
46
+ - [plain.cache](/plain-cache/plain/cache/README.md) - A database-driven general purpose cache.
47
+ - [plain.email](/plain-email/plain/email/README.md) - Send emails with SMTP or custom backends.
48
+ - [plain.sessions](/plain-sessions/plain/sessions/README.md) - User sessions and cookies.
49
+ - [plain.jobs](/plain-jobs/plain/jobs/README.md) - Background jobs stored in the database.
50
+ - [plain.api](/plain-api/plain/api/README.md) - Build APIs with Plain views.
51
+
52
+ ## Auth Packages
53
+
54
+ - [plain.auth](/plain-auth/plain/auth/README.md) - User authentication and authorization.
55
+ - [plain.oauth](/plain-oauth/plain/oauth/README.md) - OAuth authentication and API access.
56
+ - [plain.passwords](/plain-passwords/plain/passwords/README.md) - Password-based login and registration.
57
+ - [plain.loginlink](/plain-loginlink/plain/loginlink/README.md) - Login links for passwordless authentication.
58
+
59
+ ## Admin Packages
60
+
61
+ - [plain.admin](/plain-admin/plain/admin/README.md) - An admin interface for back-office tasks.
62
+ - [plain.flags](/plain-flags/plain/flags/README.md) - Feature flags.
63
+ - [plain.support](/plain-support/plain/support/README.md) - Customer support forms.
64
+ - [plain.redirection](/plain-redirection/plain/redirection/README.md) - Redirects managed in the database.
65
+ - [plain.pageviews](/plain-pageviews/plain/pageviews/README.md) - Basic self-hosted page view tracking and reporting.
66
+ - [plain.observer](/plain-observer/plain/observer/README.md) - On-page telemetry reporting.
67
+
68
+ ## Dev Packages
69
+
70
+ - [plain.dev](/plain-dev/plain/dev/README.md) - A single command for local development.
71
+ - [plain.pytest](/plain-pytest/plain/pytest/README.md) - Pytest fixtures and helpers.
72
+ - [plain.code](/plain-code/plain/code/README.md) - Code formatting and linting.
73
+ - [plain.tunnel](/plain-tunnel/plain/tunnel/README.md) - Expose your local server to the internet.
74
+
75
+ ## Frontend Packages
76
+
77
+ - [plain.tailwind](/plain-tailwind/plain/tailwind/README.md) - Tailwind CSS integration without Node.js.
78
+ - [plain.htmx](/plain-htmx/plain/htmx/README.md) - HTMX integrated into views and templates.
79
+ - [plain.elements](/plain-elements/plain/elements/README.md) - Server-side HTML components.
80
+ - [plain.pages](/plain-pages/plain/pages/README.md) - Static pages with Markdown and Jinja2.
81
+ - [plain.esbuild](/plain-esbuild/plain/esbuild/README.md) - Simple JavaScript bundling and minification.
82
+ - [plain.vendor](/plain-vendor/plain/vendor/README.md) - Vendor JavaScript and CSS libraries.
plain-0.86.2/README.md ADDED
@@ -0,0 +1 @@
1
+ ./plain/README.md
@@ -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).