Repository navigation
0.10
Added
- Type annotations across the whole package, and a
py.typedmarker so they are visible to type checkers in projects that depend oncurlify3(PEP 561).to_curl()/to_curl_async()are declared as returningstrand acceptingshell,prettyandlong_options; theValueErrorcontract for an unknownshellvalue is unchanged, soshellstays a plainstr. tyas the type checker and alintCI job that runs it together withruffon every pull request and on pushes tomain.- Dependabot configuration for
uv(pyproject.toml+uv.lock) and for GitHub Actions, weekly and grouped so tooling and test dependencies arrive as separate pull requests.
Changed
ruffreplacesblackandisort, which were declared as dev dependencies but never enforced anywhere. The formatting rules are carried over: line length 120, preserved string quotes, one blank line between plain andfromimports.- The sync and async request-data bases are siblings over a shared generic base instead of the async one inheriting the sync one. An
async def body()cannot override a syncdef body(), which made thestarletteadapter — registered as async, but inheriting the sync base — a type error. - The
httpx2adapter shares the common base again instead of duplicating it. The base grew a type parameter for the wrapped request in this release, which is what kept thehttpx2copy separate;--http2stays in the output. - The release workflow anchors its version replacement on the
versionlines instead of replacing every occurrence of the literal0.1.0, which is also a plausible dependency bound now that Dependabot writes intopyproject.toml. The step asserts the replaced value afterwards, so a substitution that matched nothing stops the release instead of publishing the placeholder.
Fixed
- The
starletteadapter resolvedstarlette.requests.Requestthrough a bareimport starlette, which worked only because an unused import of the same module happened to register the submodule. It importsRequestdirectly now. - A request whose
Content-Typeannouncesmultipartwhile carrying no body no longer raisesTypeError; it renders without-F. Reachable withrequestswhen the header is set by hand. - A
requestsbody that is an iterable or a file-like object (a streaming payload) is no longer rendered as its Pythonreprinside-d. Such a payload has no textual form a shell could replay, so the command now carries no-dat all. - Header values are decoded to text before they are rendered.
requeststypes its header values asstr | bytes, and abytesvalue used to reach"multipart" in content_typeand raiseTypeError.
Full Changelog: 0.9...0.10