plain 0.73.0__py3-none-any.whl → 0.75.0__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.
plain/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # plain changelog
2
2
 
3
+ ## [0.75.0](https://github.com/dropseed/plain/releases/plain@0.75.0) (2025-10-10)
4
+
5
+ ### What's changed
6
+
7
+ - Documentation references updated from `plain-worker` to `plain-jobs` following the package rename ([24219856e0](https://github.com/dropseed/plain/commit/24219856e0))
8
+
9
+ ### Upgrade instructions
10
+
11
+ - No changes required
12
+
13
+ ## [0.74.0](https://github.com/dropseed/plain/releases/plain@0.74.0) (2025-10-08)
14
+
15
+ ### What's changed
16
+
17
+ - The `plain agent request` command now displays request ID in the response output ([4a20cfa3fc](https://github.com/dropseed/plain/commit/4a20cfa3fc))
18
+ - Request headers are now included in OpenTelemetry tracing baggage for improved observability ([08a3376d06](https://github.com/dropseed/plain/commit/08a3376d06))
19
+
20
+ ### Upgrade instructions
21
+
22
+ - No changes required
23
+
3
24
  ## [0.73.0](https://github.com/dropseed/plain/releases/plain@0.73.0) (2025-10-07)
4
25
 
5
26
  ### What's changed
plain/README.md CHANGED
@@ -31,7 +31,7 @@ The `plain` package includes everything you need to start handling web requests
31
31
  - [plain.cache](/plain-cache/plain/cache/README.md) - A database-driven general purpose cache.
32
32
  - [plain.email](/plain-email/plain/email/README.md) - Send emails with SMTP or custom backends.
33
33
  - [plain.sessions](/plain-sessions/plain/sessions/README.md) - User sessions and cookies.
34
- - [plain.worker](/plain-worker/plain/worker/README.md) - Background jobs stored in the database.
34
+ - [plain.jobs](/plain-jobs/plain/jobs/README.md) - Background jobs stored in the database.
35
35
  - [plain.api](/plain-api/plain/api/README.md) - Build APIs with Plain views.
36
36
 
37
37
  ## Auth Packages
plain/chores/README.md CHANGED
@@ -38,7 +38,7 @@ The `plain chores run` command will execute all registered chores. When and how
38
38
  There are several ways you can run chores depending on your needs:
39
39
 
40
40
  - on deploy
41
- - as a [`plain.worker` scheduled job](/plain-worker/plain/worker/README.md#scheduled-jobs)
41
+ - as a [`plain.jobs` scheduled job](/plain-jobs/plain/jobs/README.md#scheduled-jobs)
42
42
  - as a cron job (using any cron-like system where your app is hosted)
43
43
  - manually as needed
44
44
 
@@ -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
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.73.0
3
+ Version: 0.75.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
@@ -44,7 +44,7 @@ The `plain` package includes everything you need to start handling web requests
44
44
  - [plain.cache](/plain-cache/plain/cache/README.md) - A database-driven general purpose cache.
45
45
  - [plain.email](/plain-email/plain/email/README.md) - Send emails with SMTP or custom backends.
46
46
  - [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.
47
+ - [plain.jobs](/plain-jobs/plain/jobs/README.md) - Background jobs stored in the database.
48
48
  - [plain.api](/plain-api/plain/api/README.md) - Build APIs with Plain views.
49
49
 
50
50
  ## Auth Packages
@@ -1,6 +1,6 @@
1
1
  plain/AGENTS.md,sha256=As6EFSWWHJ9lYIxb2LMRqNRteH45SRs7a_VFslzF53M,1046
2
- plain/CHANGELOG.md,sha256=xPFdA8w7p55_OeVgvSdkDTs5OPQaaNQso_kcPXbrkDI,23168
3
- plain/README.md,sha256=5BJyKhf0TDanWVbOQyZ3zsi5Lov9xk-LlJYCDWofM6Y,4078
2
+ plain/CHANGELOG.md,sha256=PJbWcLkRQVfMtpmeZ_Ga6C4eo-0AkB8qIheC7vRRMgQ,23956
3
+ plain/README.md,sha256=VvzhXNvf4I6ddmjBP9AExxxFXxs7RwyoxdgFm-W5dsg,4072
4
4
  plain/__main__.py,sha256=GK39854Lc_LO_JP8DzY9Y2MIQ4cQEl7SXFJy244-lC8,110
5
5
  plain/debug.py,sha256=C2OnFHtRGMrpCiHSt-P2r58JypgQZ62qzDBpV4mhtFM,855
6
6
  plain/exceptions.py,sha256=uWC7q3f-szQCGm2XD7SOR66wTDj570ctSTMwaofr0dA,5610
@@ -16,7 +16,7 @@ plain/assets/finders.py,sha256=j9sZ2LAJp55hdJ_e1lFevzwicNEMUtv6rLtQgiIkDgY,1589
16
16
  plain/assets/fingerprints.py,sha256=UPJwLmzzqXBp7FPk9XnMkcTps2UW9SnTAv0hGieUnMo,1458
17
17
  plain/assets/urls.py,sha256=Qe0ctXYAQjAlLIKuX6JeLVBOFqzJxggR0RSGkRXmX78,1173
18
18
  plain/assets/views.py,sha256=Zs_wyguh-WljOgW3DiPfpspTVOKC6z3bRSu01-SDcoU,9877
19
- plain/chores/README.md,sha256=xTYKOBnfcLBpVeZgJQ6c35vdxHYaKkfJB8B-6sB3lcs,2054
19
+ plain/chores/README.md,sha256=ashFQ4kc1h81DqFmOXiGcrmzvJQQMg4ZWdUIFDcJah0,2048
20
20
  plain/chores/__init__.py,sha256=r9TXtQCH-VbvfnIJ5F8FxgQC35GRWFOfmMZN3q9niLg,67
21
21
  plain/chores/registry.py,sha256=kKhN7z0XcgGCMnpx9bVWI1klUUl-yAEfcDaLnsSYs6c,1589
22
22
  plain/cli/README.md,sha256=5C7vsH0ISxu7q5H6buC25MBOILkI_rzdySitswpQgJw,1032
@@ -44,7 +44,7 @@ plain/cli/agent/docs.py,sha256=1YSmbl9CNsnnmbFd6dzIuzu1rwaHbEn7zX1_Y-MKUKo,2550
44
44
  plain/cli/agent/llmdocs.py,sha256=spDfgNRARyXsHey3Gb0N6ZuvQR6wsH5L3OWR8FKSp0w,5491
45
45
  plain/cli/agent/md.py,sha256=eRspArtBVQNqxIii6J7sPPZqBjc-qmAF49aLnwZoWAE,2778
46
46
  plain/cli/agent/prompt.py,sha256=hMb4RXiMF68xSSHC3gXrCUjv5jZa7flQzL4FZvUMu1I,1261
47
- plain/cli/agent/request.py,sha256=Mz_9xehWmkaQKoi2vKwLxIJUHl6n-S2jl4pr6MrvcOg,6589
47
+ plain/cli/agent/request.py,sha256=cBdN9w4msPqfaE13DHrvAE0lkSdkTdTkIjZzBht8Ydc,6432
48
48
  plain/csrf/README.md,sha256=ApWpB-qlEf0LkOKm9Yr-6f_lB9XJEvGFDo_fraw8ghI,2391
49
49
  plain/csrf/middleware.py,sha256=p46QBXtJDrcCc5xwgZt7n-SIny4adShaFPTfBVXTNTM,5389
50
50
  plain/csrf/views.py,sha256=ckQp-ZJCdtgFukJLHQDtKARBhng6AWOP-1ijsW5Ddqo,736
@@ -70,7 +70,7 @@ plain/internal/files/uploadedfile.py,sha256=RaMeOMMB5LhH_QTEda9fGcI4kEg5CgCLE3kT
70
70
  plain/internal/files/uploadhandler.py,sha256=zUEMePuCsoaukRMCy5yBvMHaeOBageUw2sLBHsXpmew,7982
71
71
  plain/internal/files/utils.py,sha256=9aWCkGGGRdZLbI921IOgeUOD9zxx4FgpWCzXvq0lMXU,2871
72
72
  plain/internal/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- plain/internal/handlers/base.py,sha256=nAK2Wfw1-f3fbsCp8w8zzHwl-Fb8sj9CXWPyMM0aLbk,6551
73
+ plain/internal/handlers/base.py,sha256=DhJSZqVMrzKGCMrcpkbq6aMXMm0Q94lPuvAIurpAQ0Y,6671
74
74
  plain/internal/handlers/exception.py,sha256=9Qf9dfQANuaeNx9-DMFJzg3Y3un61NicxfK7YnK3RTk,5226
75
75
  plain/internal/handlers/wsgi.py,sha256=d2Hcs4fzTSir6OvtpVromTw0RmmFAqTL4_EaBjoHtNU,8919
76
76
  plain/internal/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -162,8 +162,8 @@ plain/views/forms.py,sha256=ESZOXuo6IeYixp1RZvPb94KplkowRiwO2eGJCM6zJI0,2400
162
162
  plain/views/objects.py,sha256=5y0PoPPo07dQTTcJ_9kZcx0iI1O7regsooAIK4VqXQ0,5579
163
163
  plain/views/redirect.py,sha256=mIpSAFcaEyeLDyv4Fr6g_ektduG4Wfa6s6L-rkdazmM,2154
164
164
  plain/views/templates.py,sha256=9LgDMCv4C7JzLiyw8jHF-i4350ukwgixC_9y4faEGu0,1885
165
- plain-0.73.0.dist-info/METADATA,sha256=GmC3RNUDukGn5CQYU8XKZzVVjmvp_oO--rPvKTJbd_o,4488
166
- plain-0.73.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
167
- plain-0.73.0.dist-info/entry_points.txt,sha256=wvMzY-iREvfqRgyLm77htPp4j_8CQslLoZA15_AnNo8,171
168
- plain-0.73.0.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
169
- plain-0.73.0.dist-info/RECORD,,
165
+ plain-0.75.0.dist-info/METADATA,sha256=stPlpTtFhA_NaICFaJYV22Pa4Rd2uIbZjhtocI6KCkU,4482
166
+ plain-0.75.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
167
+ plain-0.75.0.dist-info/entry_points.txt,sha256=wvMzY-iREvfqRgyLm77htPp4j_8CQslLoZA15_AnNo8,171
168
+ plain-0.75.0.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
169
+ plain-0.75.0.dist-info/RECORD,,
File without changes