plain 0.73.0__tar.gz → 0.74.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.
Files changed (182) hide show
  1. {plain-0.73.0 → plain-0.74.0}/PKG-INFO +1 -1
  2. {plain-0.73.0 → plain-0.74.0}/plain/CHANGELOG.md +11 -0
  3. {plain-0.73.0 → plain-0.74.0}/plain/cli/agent/request.py +15 -13
  4. {plain-0.73.0 → plain-0.74.0}/plain/internal/handlers/base.py +3 -0
  5. {plain-0.73.0 → plain-0.74.0}/pyproject.toml +1 -1
  6. {plain-0.73.0 → plain-0.74.0}/.gitignore +0 -0
  7. {plain-0.73.0 → plain-0.74.0}/LICENSE +0 -0
  8. {plain-0.73.0 → plain-0.74.0}/README.md +0 -0
  9. {plain-0.73.0 → plain-0.74.0}/plain/AGENTS.md +0 -0
  10. {plain-0.73.0 → plain-0.74.0}/plain/README.md +0 -0
  11. {plain-0.73.0 → plain-0.74.0}/plain/__main__.py +0 -0
  12. {plain-0.73.0 → plain-0.74.0}/plain/assets/README.md +0 -0
  13. {plain-0.73.0 → plain-0.74.0}/plain/assets/__init__.py +0 -0
  14. {plain-0.73.0 → plain-0.74.0}/plain/assets/compile.py +0 -0
  15. {plain-0.73.0 → plain-0.74.0}/plain/assets/finders.py +0 -0
  16. {plain-0.73.0 → plain-0.74.0}/plain/assets/fingerprints.py +0 -0
  17. {plain-0.73.0 → plain-0.74.0}/plain/assets/urls.py +0 -0
  18. {plain-0.73.0 → plain-0.74.0}/plain/assets/views.py +0 -0
  19. {plain-0.73.0 → plain-0.74.0}/plain/chores/README.md +0 -0
  20. {plain-0.73.0 → plain-0.74.0}/plain/chores/__init__.py +0 -0
  21. {plain-0.73.0 → plain-0.74.0}/plain/chores/registry.py +0 -0
  22. {plain-0.73.0 → plain-0.74.0}/plain/cli/README.md +0 -0
  23. {plain-0.73.0 → plain-0.74.0}/plain/cli/__init__.py +0 -0
  24. {plain-0.73.0 → plain-0.74.0}/plain/cli/agent/__init__.py +0 -0
  25. {plain-0.73.0 → plain-0.74.0}/plain/cli/agent/docs.py +0 -0
  26. {plain-0.73.0 → plain-0.74.0}/plain/cli/agent/llmdocs.py +0 -0
  27. {plain-0.73.0 → plain-0.74.0}/plain/cli/agent/md.py +0 -0
  28. {plain-0.73.0 → plain-0.74.0}/plain/cli/agent/prompt.py +0 -0
  29. {plain-0.73.0 → plain-0.74.0}/plain/cli/build.py +0 -0
  30. {plain-0.73.0 → plain-0.74.0}/plain/cli/changelog.py +0 -0
  31. {plain-0.73.0 → plain-0.74.0}/plain/cli/chores.py +0 -0
  32. {plain-0.73.0 → plain-0.74.0}/plain/cli/core.py +0 -0
  33. {plain-0.73.0 → plain-0.74.0}/plain/cli/docs.py +0 -0
  34. {plain-0.73.0 → plain-0.74.0}/plain/cli/formatting.py +0 -0
  35. {plain-0.73.0 → plain-0.74.0}/plain/cli/install.py +0 -0
  36. {plain-0.73.0 → plain-0.74.0}/plain/cli/output.py +0 -0
  37. {plain-0.73.0 → plain-0.74.0}/plain/cli/preflight.py +0 -0
  38. {plain-0.73.0 → plain-0.74.0}/plain/cli/print.py +0 -0
  39. {plain-0.73.0 → plain-0.74.0}/plain/cli/registry.py +0 -0
  40. {plain-0.73.0 → plain-0.74.0}/plain/cli/scaffold.py +0 -0
  41. {plain-0.73.0 → plain-0.74.0}/plain/cli/settings.py +0 -0
  42. {plain-0.73.0 → plain-0.74.0}/plain/cli/shell.py +0 -0
  43. {plain-0.73.0 → plain-0.74.0}/plain/cli/startup.py +0 -0
  44. {plain-0.73.0 → plain-0.74.0}/plain/cli/upgrade.py +0 -0
  45. {plain-0.73.0 → plain-0.74.0}/plain/cli/urls.py +0 -0
  46. {plain-0.73.0 → plain-0.74.0}/plain/cli/utils.py +0 -0
  47. {plain-0.73.0 → plain-0.74.0}/plain/csrf/README.md +0 -0
  48. {plain-0.73.0 → plain-0.74.0}/plain/csrf/middleware.py +0 -0
  49. {plain-0.73.0 → plain-0.74.0}/plain/csrf/views.py +0 -0
  50. {plain-0.73.0 → plain-0.74.0}/plain/debug.py +0 -0
  51. {plain-0.73.0 → plain-0.74.0}/plain/exceptions.py +0 -0
  52. {plain-0.73.0 → plain-0.74.0}/plain/forms/README.md +0 -0
  53. {plain-0.73.0 → plain-0.74.0}/plain/forms/__init__.py +0 -0
  54. {plain-0.73.0 → plain-0.74.0}/plain/forms/boundfield.py +0 -0
  55. {plain-0.73.0 → plain-0.74.0}/plain/forms/exceptions.py +0 -0
  56. {plain-0.73.0 → plain-0.74.0}/plain/forms/fields.py +0 -0
  57. {plain-0.73.0 → plain-0.74.0}/plain/forms/forms.py +0 -0
  58. {plain-0.73.0 → plain-0.74.0}/plain/http/README.md +0 -0
  59. {plain-0.73.0 → plain-0.74.0}/plain/http/__init__.py +0 -0
  60. {plain-0.73.0 → plain-0.74.0}/plain/http/cookie.py +0 -0
  61. {plain-0.73.0 → plain-0.74.0}/plain/http/multipartparser.py +0 -0
  62. {plain-0.73.0 → plain-0.74.0}/plain/http/request.py +0 -0
  63. {plain-0.73.0 → plain-0.74.0}/plain/http/response.py +0 -0
  64. {plain-0.73.0 → plain-0.74.0}/plain/internal/__init__.py +0 -0
  65. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/__init__.py +0 -0
  66. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/base.py +0 -0
  67. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/locks.py +0 -0
  68. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/move.py +0 -0
  69. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/temp.py +0 -0
  70. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/uploadedfile.py +0 -0
  71. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/uploadhandler.py +0 -0
  72. {plain-0.73.0 → plain-0.74.0}/plain/internal/files/utils.py +0 -0
  73. {plain-0.73.0 → plain-0.74.0}/plain/internal/handlers/__init__.py +0 -0
  74. {plain-0.73.0 → plain-0.74.0}/plain/internal/handlers/exception.py +0 -0
  75. {plain-0.73.0 → plain-0.74.0}/plain/internal/handlers/wsgi.py +0 -0
  76. {plain-0.73.0 → plain-0.74.0}/plain/internal/middleware/__init__.py +0 -0
  77. {plain-0.73.0 → plain-0.74.0}/plain/internal/middleware/headers.py +0 -0
  78. {plain-0.73.0 → plain-0.74.0}/plain/internal/middleware/hosts.py +0 -0
  79. {plain-0.73.0 → plain-0.74.0}/plain/internal/middleware/https.py +0 -0
  80. {plain-0.73.0 → plain-0.74.0}/plain/internal/middleware/slash.py +0 -0
  81. {plain-0.73.0 → plain-0.74.0}/plain/json.py +0 -0
  82. {plain-0.73.0 → plain-0.74.0}/plain/logs/README.md +0 -0
  83. {plain-0.73.0 → plain-0.74.0}/plain/logs/__init__.py +0 -0
  84. {plain-0.73.0 → plain-0.74.0}/plain/logs/configure.py +0 -0
  85. {plain-0.73.0 → plain-0.74.0}/plain/logs/debug.py +0 -0
  86. {plain-0.73.0 → plain-0.74.0}/plain/logs/formatters.py +0 -0
  87. {plain-0.73.0 → plain-0.74.0}/plain/logs/loggers.py +0 -0
  88. {plain-0.73.0 → plain-0.74.0}/plain/logs/utils.py +0 -0
  89. {plain-0.73.0 → plain-0.74.0}/plain/packages/README.md +0 -0
  90. {plain-0.73.0 → plain-0.74.0}/plain/packages/__init__.py +0 -0
  91. {plain-0.73.0 → plain-0.74.0}/plain/packages/config.py +0 -0
  92. {plain-0.73.0 → plain-0.74.0}/plain/packages/registry.py +0 -0
  93. {plain-0.73.0 → plain-0.74.0}/plain/paginator.py +0 -0
  94. {plain-0.73.0 → plain-0.74.0}/plain/preflight/README.md +0 -0
  95. {plain-0.73.0 → plain-0.74.0}/plain/preflight/__init__.py +0 -0
  96. {plain-0.73.0 → plain-0.74.0}/plain/preflight/checks.py +0 -0
  97. {plain-0.73.0 → plain-0.74.0}/plain/preflight/files.py +0 -0
  98. {plain-0.73.0 → plain-0.74.0}/plain/preflight/registry.py +0 -0
  99. {plain-0.73.0 → plain-0.74.0}/plain/preflight/results.py +0 -0
  100. {plain-0.73.0 → plain-0.74.0}/plain/preflight/security.py +0 -0
  101. {plain-0.73.0 → plain-0.74.0}/plain/preflight/urls.py +0 -0
  102. {plain-0.73.0 → plain-0.74.0}/plain/runtime/README.md +0 -0
  103. {plain-0.73.0 → plain-0.74.0}/plain/runtime/__init__.py +0 -0
  104. {plain-0.73.0 → plain-0.74.0}/plain/runtime/global_settings.py +0 -0
  105. {plain-0.73.0 → plain-0.74.0}/plain/runtime/user_settings.py +0 -0
  106. {plain-0.73.0 → plain-0.74.0}/plain/runtime/utils.py +0 -0
  107. {plain-0.73.0 → plain-0.74.0}/plain/signals/README.md +0 -0
  108. {plain-0.73.0 → plain-0.74.0}/plain/signals/__init__.py +0 -0
  109. {plain-0.73.0 → plain-0.74.0}/plain/signals/dispatch/__init__.py +0 -0
  110. {plain-0.73.0 → plain-0.74.0}/plain/signals/dispatch/dispatcher.py +0 -0
  111. {plain-0.73.0 → plain-0.74.0}/plain/signals/dispatch/license.txt +0 -0
  112. {plain-0.73.0 → plain-0.74.0}/plain/signing.py +0 -0
  113. {plain-0.73.0 → plain-0.74.0}/plain/templates/AGENTS.md +0 -0
  114. {plain-0.73.0 → plain-0.74.0}/plain/templates/README.md +0 -0
  115. {plain-0.73.0 → plain-0.74.0}/plain/templates/__init__.py +0 -0
  116. {plain-0.73.0 → plain-0.74.0}/plain/templates/core.py +0 -0
  117. {plain-0.73.0 → plain-0.74.0}/plain/templates/jinja/__init__.py +0 -0
  118. {plain-0.73.0 → plain-0.74.0}/plain/templates/jinja/environments.py +0 -0
  119. {plain-0.73.0 → plain-0.74.0}/plain/templates/jinja/extensions.py +0 -0
  120. {plain-0.73.0 → plain-0.74.0}/plain/templates/jinja/filters.py +0 -0
  121. {plain-0.73.0 → plain-0.74.0}/plain/templates/jinja/globals.py +0 -0
  122. {plain-0.73.0 → plain-0.74.0}/plain/test/README.md +0 -0
  123. {plain-0.73.0 → plain-0.74.0}/plain/test/__init__.py +0 -0
  124. {plain-0.73.0 → plain-0.74.0}/plain/test/client.py +0 -0
  125. {plain-0.73.0 → plain-0.74.0}/plain/test/encoding.py +0 -0
  126. {plain-0.73.0 → plain-0.74.0}/plain/test/exceptions.py +0 -0
  127. {plain-0.73.0 → plain-0.74.0}/plain/urls/README.md +0 -0
  128. {plain-0.73.0 → plain-0.74.0}/plain/urls/__init__.py +0 -0
  129. {plain-0.73.0 → plain-0.74.0}/plain/urls/converters.py +0 -0
  130. {plain-0.73.0 → plain-0.74.0}/plain/urls/exceptions.py +0 -0
  131. {plain-0.73.0 → plain-0.74.0}/plain/urls/patterns.py +0 -0
  132. {plain-0.73.0 → plain-0.74.0}/plain/urls/resolvers.py +0 -0
  133. {plain-0.73.0 → plain-0.74.0}/plain/urls/routers.py +0 -0
  134. {plain-0.73.0 → plain-0.74.0}/plain/urls/utils.py +0 -0
  135. {plain-0.73.0 → plain-0.74.0}/plain/utils/README.md +0 -0
  136. {plain-0.73.0 → plain-0.74.0}/plain/utils/__init__.py +0 -0
  137. {plain-0.73.0 → plain-0.74.0}/plain/utils/cache.py +0 -0
  138. {plain-0.73.0 → plain-0.74.0}/plain/utils/crypto.py +0 -0
  139. {plain-0.73.0 → plain-0.74.0}/plain/utils/datastructures.py +0 -0
  140. {plain-0.73.0 → plain-0.74.0}/plain/utils/dateparse.py +0 -0
  141. {plain-0.73.0 → plain-0.74.0}/plain/utils/deconstruct.py +0 -0
  142. {plain-0.73.0 → plain-0.74.0}/plain/utils/decorators.py +0 -0
  143. {plain-0.73.0 → plain-0.74.0}/plain/utils/duration.py +0 -0
  144. {plain-0.73.0 → plain-0.74.0}/plain/utils/encoding.py +0 -0
  145. {plain-0.73.0 → plain-0.74.0}/plain/utils/functional.py +0 -0
  146. {plain-0.73.0 → plain-0.74.0}/plain/utils/hashable.py +0 -0
  147. {plain-0.73.0 → plain-0.74.0}/plain/utils/html.py +0 -0
  148. {plain-0.73.0 → plain-0.74.0}/plain/utils/http.py +0 -0
  149. {plain-0.73.0 → plain-0.74.0}/plain/utils/inspect.py +0 -0
  150. {plain-0.73.0 → plain-0.74.0}/plain/utils/ipv6.py +0 -0
  151. {plain-0.73.0 → plain-0.74.0}/plain/utils/itercompat.py +0 -0
  152. {plain-0.73.0 → plain-0.74.0}/plain/utils/module_loading.py +0 -0
  153. {plain-0.73.0 → plain-0.74.0}/plain/utils/regex_helper.py +0 -0
  154. {plain-0.73.0 → plain-0.74.0}/plain/utils/safestring.py +0 -0
  155. {plain-0.73.0 → plain-0.74.0}/plain/utils/text.py +0 -0
  156. {plain-0.73.0 → plain-0.74.0}/plain/utils/timesince.py +0 -0
  157. {plain-0.73.0 → plain-0.74.0}/plain/utils/timezone.py +0 -0
  158. {plain-0.73.0 → plain-0.74.0}/plain/utils/tree.py +0 -0
  159. {plain-0.73.0 → plain-0.74.0}/plain/validators.py +0 -0
  160. {plain-0.73.0 → plain-0.74.0}/plain/views/README.md +0 -0
  161. {plain-0.73.0 → plain-0.74.0}/plain/views/__init__.py +0 -0
  162. {plain-0.73.0 → plain-0.74.0}/plain/views/base.py +0 -0
  163. {plain-0.73.0 → plain-0.74.0}/plain/views/errors.py +0 -0
  164. {plain-0.73.0 → plain-0.74.0}/plain/views/exceptions.py +0 -0
  165. {plain-0.73.0 → plain-0.74.0}/plain/views/forms.py +0 -0
  166. {plain-0.73.0 → plain-0.74.0}/plain/views/objects.py +0 -0
  167. {plain-0.73.0 → plain-0.74.0}/plain/views/redirect.py +0 -0
  168. {plain-0.73.0 → plain-0.74.0}/plain/views/templates.py +0 -0
  169. {plain-0.73.0 → plain-0.74.0}/plain/wsgi.py +0 -0
  170. {plain-0.73.0 → plain-0.74.0}/tests/.gitignore +0 -0
  171. {plain-0.73.0 → plain-0.74.0}/tests/app/.gitignore +0 -0
  172. {plain-0.73.0 → plain-0.74.0}/tests/app/settings.py +0 -0
  173. {plain-0.73.0 → plain-0.74.0}/tests/app/test/__init__.py +0 -0
  174. {plain-0.73.0 → plain-0.74.0}/tests/app/test/default_settings.py +0 -0
  175. {plain-0.73.0 → plain-0.74.0}/tests/app/urls.py +0 -0
  176. {plain-0.73.0 → plain-0.74.0}/tests/conftest.py +0 -0
  177. {plain-0.73.0 → plain-0.74.0}/tests/test_cli.py +0 -0
  178. {plain-0.73.0 → plain-0.74.0}/tests/test_csrf.py +0 -0
  179. {plain-0.73.0 → plain-0.74.0}/tests/test_http_hosts.py +0 -0
  180. {plain-0.73.0 → plain-0.74.0}/tests/test_logs.py +0 -0
  181. {plain-0.73.0 → plain-0.74.0}/tests/test_runtime.py +0 -0
  182. {plain-0.73.0 → plain-0.74.0}/tests/test_wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.73.0
3
+ Version: 0.74.0
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
@@ -1,5 +1,16 @@
1
1
  # plain changelog
2
2
 
3
+ ## [0.74.0](https://github.com/dropseed/plain/releases/plain@0.74.0) (2025-10-08)
4
+
5
+ ### What's changed
6
+
7
+ - The `plain agent request` command now displays request ID in the response output ([4a20cfa3fc](https://github.com/dropseed/plain/commit/4a20cfa3fc))
8
+ - Request headers are now included in OpenTelemetry tracing baggage for improved observability ([08a3376d06](https://github.com/dropseed/plain/commit/08a3376d06))
9
+
10
+ ### Upgrade instructions
11
+
12
+ - No changes required
13
+
3
14
  ## [0.73.0](https://github.com/dropseed/plain/releases/plain@0.73.0) (2025-10-07)
4
15
 
5
16
  ### What's changed
@@ -72,9 +72,6 @@ def request(
72
72
  try:
73
73
  user = User.query.get(id=user_id)
74
74
  client.force_login(user)
75
- click.secho(
76
- f"Authenticated as user {user_id}", fg="green", dim=True
77
- )
78
75
  except User.DoesNotExist:
79
76
  click.secho(f"User {user_id} not found", fg="red", err=True)
80
77
  return
@@ -134,23 +131,28 @@ def request(
134
131
  return
135
132
 
136
133
  # Display response information
137
- click.secho(
138
- f"HTTP {response.status_code}",
139
- fg="green" if response.status_code < 400 else "red",
140
- bold=True,
141
- )
134
+ click.secho("Response:", fg="yellow", bold=True)
142
135
 
143
- # Show additional response info first
144
- if hasattr(response, "user"):
145
- click.secho(f"Authenticated user: {response.user}", fg="blue", dim=True)
136
+ # Status code
137
+ click.echo(f" Status: {response.status_code}")
146
138
 
147
- if hasattr(response, "resolver_match") and response.resolver_match:
139
+ # Request ID
140
+ click.echo(f" Request ID: {response.wsgi_request.unique_id}")
141
+
142
+ # User
143
+ if response.user:
144
+ click.echo(f" Authenticated user: {response.user}")
145
+
146
+ # URL pattern
147
+ if response.resolver_match:
148
148
  match = response.resolver_match
149
149
  namespaced_url_name = getattr(match, "namespaced_url_name", None)
150
150
  url_name_attr = getattr(match, "url_name", None)
151
151
  url_name = namespaced_url_name or url_name_attr
152
152
  if url_name:
153
- click.secho(f"URL pattern matched: {url_name}", fg="blue", dim=True)
153
+ click.echo(f" URL pattern: {url_name}")
154
+
155
+ click.echo()
154
156
 
155
157
  # Show headers
156
158
  if response.headers:
@@ -94,6 +94,9 @@ class BaseHandler:
94
94
  span_attributes[url_attributes.URL_QUERY] = query_string
95
95
 
96
96
  span_context = baggage.set_baggage("http.request.cookies", request.cookies)
97
+ span_context = baggage.set_baggage(
98
+ "http.request.headers", request.headers, span_context
99
+ )
97
100
 
98
101
  with tracer.start_as_current_span(
99
102
  f"{request.method} {request.path_info}",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain"
3
- version = "0.73.0"
3
+ version = "0.74.0"
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"
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
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