Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement fuzzy finder as default filter for Select/MultiSelect #176

Merged
merged 12 commits into from
Oct 1, 2023
Merged

Implement fuzzy finder as default filter for Select/MultiSelect #176

merged 12 commits into from
Oct 1, 2023

Conversation

Baarsgaard
Copy link
Contributor

@Baarsgaard Baarsgaard commented Sep 11, 2023

My initial suggestion on the implementation in #162 turned sour once I ran into issues with your filtered_options implementation.

In the end I decided to replace the Filter<'a, T> function in favour of a Scorer<'a, T> function.
The only difference between the two is the return type being Option<i64> still allowing to implement filters as before, but now also allowing to order/rank the options according to the calculated score.

Moving the prompts to the new scoring logic was minimally invasive and works together with the filtered_options logic already implemented!

I added a reset_cursor config option which if true, will reset the cursor position to 0 on filter input changes.

Since it's no longer a "Filter" I have renamed Documentation and types where it makes sense.
This is very much up for debate.

TODO

  • Create a feature flag that disables the fuzzy DEFAULT_SCORER and enables a naive one that just does a contains check.

@Baarsgaard
Copy link
Contributor Author

Will get to the failing tests tomorrow :P

@Baarsgaard
Copy link
Contributor Author

Baarsgaard commented Sep 13, 2023

The rustix dependency breaking the msrv tests seems to originate from the tempfile dependency from the editor feature:

├── tempfile v3.8.0
│   ├── cfg-if v1.0.0
│   ├── fastrand v2.0.0
│   └── rustix v0.38.13
│       ├── bitflags v2.4.0
│       └── linux-raw-sys v0.4.7

I'm not sure it's in scope of this PR to fix that?

Full cargo tree output
➜ cargo tree --all-features
  Downloaded numtoa v0.1.0
  Downloaded termion v2.0.1
  Downloaded 2 crates (32.4 KB) in 0.25s
inquire v0.6.2 (/home/spu/projects/inquire/inquire)
├── bitflags v2.4.0
├── chrono v0.4.30
│   ├── iana-time-zone v0.1.57
│   └── num-traits v0.2.16
│       [build-dependencies]
│       └── autocfg v1.1.0
├── console v0.15.7
│   ├── lazy_static v1.4.0
│   ├── libc v0.2.147
│   └── unicode-width v0.1.10
├── crossterm v0.25.0
│   ├── bitflags v1.3.2
│   ├── libc v0.2.147
│   ├── mio v0.8.8
│   │   ├── libc v0.2.147
│   │   └── log v0.4.20
│   ├── parking_lot v0.12.1
│   │   ├── lock_api v0.4.10
│   │   │   └── scopeguard v1.2.0
│   │   │   [build-dependencies]
│   │   │   └── autocfg v1.1.0
│   │   └── parking_lot_core v0.9.8
│   │       ├── cfg-if v1.0.0
│   │       ├── libc v0.2.147
│   │       └── smallvec v1.11.0
│   ├── signal-hook v0.3.17
│   │   ├── libc v0.2.147
│   │   └── signal-hook-registry v1.4.1
│   │       └── libc v0.2.147
│   └── signal-hook-mio v0.2.3
│       ├── libc v0.2.147
│       ├── mio v0.8.8 (*)
│       └── signal-hook v0.3.17 (*)
├── dyn-clone v1.0.13
├── fuzzy-matcher v0.3.7
│   └── thread_local v1.1.7
│       ├── cfg-if v1.0.0
│       └── once_cell v1.18.0
├── newline-converter v0.3.0
│   └── unicode-segmentation v1.10.1
├── once_cell v1.18.0
├── tempfile v3.8.0
│   ├── cfg-if v1.0.0
│   ├── fastrand v2.0.0
│   └── rustix v0.38.13
│       ├── bitflags v2.4.0
│       └── linux-raw-sys v0.4.7
├── termion v2.0.1
│   ├── libc v0.2.147
│   └── numtoa v0.1.0
├── unicode-segmentation v1.10.1
└── unicode-width v0.1.10

inquire-derive v0.6.2 (/home/spu/projects/inquire/inquire-derive)
[dev-dependencies]
└── inquire v0.6.2 (/home/spu/projects/inquire/inquire) (*)

Copy link
Owner

@mikaelmello mikaelmello left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a really clean solution to the problem, thanks for the contribution!

Do you have an idea of the impact of pulling in the library you're using? Mostly out of curiosity and to make sure we won't be shooting ourselves in the foot.

inquire/src/prompts/select/action.rs Outdated Show resolved Hide resolved
@mikaelmello
Copy link
Owner

mikaelmello commented Sep 16, 2023

I'm not sure it's in scope of this PR to fix that?

Will take care of it.

Update: Fixed it.

@Baarsgaard
Copy link
Contributor Author

Baarsgaard commented Sep 16, 2023

I'm not sure it's in scope of this PR to fix that?

Will take care of it.

Update: Fixed it.

Great, I will rebase then!

Do you have an idea of the impact of pulling in the library you're using? Mostly out of curiosity and to make sure we won't be shooting ourselves in the foot.

In terms of performance:
Performance is great still, I've been using my fork with lists of 1500 options with instant changes to the list.
I would show an Asciinema cast, but the filtering test was on work related Jira issues..

Weight should not be an issue, though I'm not 100% sure on how to quantify this.
The number of sub-dependencies is minimal and there is no non-Rust code at least.

I will try to update my fork tomorrow!

@Baarsgaard
Copy link
Contributor Author

I've applied the changes and rebased as discussed earlier, additionally I updated the changelog to reflect the changes.

Before this is considered final, I want to try and implement Nucleo instead.
It was apparently announced last week and is supposedly 5-8 times faster than fuzzy-matcher

But from a cursory view at how they are using it in the Helix editor, the implementation would potentially need to change a fair bit.
The easiest solution might be to implement a trait similar to Autocompleter which can hold the Matcher and the added Pattern/Atom types.
The reason being the Matcher can be reused for the entire lifetime of the current prompt, but the Pattern/Atom that is parsed from the input needs to be re-parsed on any change to the input.
But parsing anew on every Option in the list would be wasteful.

See: https://github.com/helix-editor/helix/blob/master/helix-term/src/ui/menu.rs#L95-L104

@Baarsgaard
Copy link
Contributor Author

Baarsgaard commented Sep 24, 2023

I'm a bit stuck on using Nucleo instead. I'm running into the same challenges as I faced with my initial idea in #162.

I would prefer to not rewrite most of the Select/Multiselect Prompt logic just to shoehorn Nucleo in.

The current performance also isn't an issue from my testing.

mikaelmello
mikaelmello previously approved these changes Sep 30, 2023
Copy link
Owner

@mikaelmello mikaelmello left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love it, your work is very appreciated :)

Let's just fix the merge conflicts, and merge this. I also think making reset cursor true the built-in behavior to be a good improvement if you feel like it, regardless just lmk when it's ready to merge and I'll push the button

@Baarsgaard
Copy link
Contributor Author

Baarsgaard commented Oct 1, 2023

Merge conflicts have been resolved and I defaulted the reset behaviour to true!
You're welcome to merge anytime! :D

Edit: And I remembered to update the Doc comments as well!

@mikaelmello mikaelmello merged commit b79036e into mikaelmello:main Oct 1, 2023
8 checks passed
@mikaelmello
Copy link
Owner

Merged!

kjuulh added a commit to kjuulh/coffee that referenced this pull request Aug 21, 2024
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [axum](https://github.com/tokio-rs/axum) | workspace.dependencies | minor | `0.6.20` -> `0.7.0` |
| [inquire](https://github.com/mikaelmello/inquire) | workspace.dependencies | minor | `0.6.2` -> `0.7.0` |
| [reqwest](https://github.com/seanmonstar/reqwest) | dependencies | minor | `0.11.18` -> `0.12.0` |
| [webbrowser](https://github.com/amodm/webbrowser-rs) | dependencies | major | `0.8.10` -> `1.0.0` |

---

### Release Notes

<details>
<summary>tokio-rs/axum (axum)</summary>

### [`v0.7.5`](https://github.com/tokio-rs/axum/releases/tag/axum-v0.7.5): axum - v0.7.5

[Compare Source](tokio-rs/axum@axum-v0.7.4...axum-v0.7.5)

-   **fixed:** Fixed layers being cloned when calling `axum::serve` directly with
    a `Router` or `MethodRouter` ([#&#8203;2586])
-   **fixed:** `h2` is no longer pulled as a dependency unless the `http2` feature
    is enabled ([#&#8203;2605])

[#&#8203;2586]: tokio-rs/axum#2586

[#&#8203;2605]: tokio-rs/axum#2605

### [`v0.7.4`](https://github.com/tokio-rs/axum/releases/tag/axum-v0.7.4): axum - v0.7.4

[Compare Source](tokio-rs/axum@axum-v0.7.3...axum-v0.7.4)

-   **fixed:** Fix performance regression present since axum 0.7.0 ([#&#8203;2483])
-   **fixed:** Improve `debug_handler` on tuple response types ([#&#8203;2201])
-   **added:** Add `must_use` attribute to `Serve` and `WithGracefulShutdown` ([#&#8203;2484])
-   **added:** Re-export `axum_core::body::BodyDataStream` from axum

[#&#8203;2201]: tokio-rs/axum#2201

[#&#8203;2483]: tokio-rs/axum#2483

[#&#8203;2201]: tokio-rs/axum#2201

[#&#8203;2484]: tokio-rs/axum#2484

### [`v0.7.3`](https://github.com/tokio-rs/axum/releases/tag/axum-v0.7.3): axum - v0.7.3

[Compare Source](tokio-rs/axum@axum-v0.7.2...axum-v0.7.3)

-   **added:** `Body` implements `From<()>` now ([#&#8203;2411])
-   **change:** Update version of multer used internally for multipart ([#&#8203;2433])
-   **change:** Update tokio-tungstenite to 0.21 ([#&#8203;2435])
-   **added:** Enable `tracing` feature by default ([#&#8203;2460])
-   **added:** Support graceful shutdown on `serve` ([#&#8203;2398])
-   **added:** `RouterIntoService` implements `Clone` ([#&#8203;2456])

[#&#8203;2411]: tokio-rs/axum#2411

[#&#8203;2433]: tokio-rs/axum#2433

[#&#8203;2435]: tokio-rs/axum#2435

[#&#8203;2460]: tokio-rs/axum#2460

[#&#8203;2398]: tokio-rs/axum#2398

[#&#8203;2456]: tokio-rs/axum#2456

### [`v0.7.2`](https://github.com/tokio-rs/axum/releases/tag/axum-v0.7.2): axum - v0.7.2

[Compare Source](tokio-rs/axum@axum-v0.7.1...axum-v0.7.2)

-   **added:** Add `axum::body::to_bytes` ([#&#8203;2373])
-   **fixed:** Gracefully handle accept errors in `serve` ([#&#8203;2400])

[#&#8203;2373]: tokio-rs/axum#2373

[#&#8203;2400]: tokio-rs/axum#2400

### [`v0.7.1`](https://github.com/tokio-rs/axum/releases/tag/axum-v0.7.1): axum - v0.7.1

[Compare Source](tokio-rs/axum@axum-v0.7.0...axum-v0.7.1)

-   **fix**: Fix readme.

### [`v0.7.0`](https://github.com/tokio-rs/axum/releases/tag/axum-v0.7.0): axum - v0.7.0

[Compare Source](tokio-rs/axum@axum-v0.6.20...axum-v0.7.0)

-   **breaking:** Update public dependencies. axum now requires
    -   [hyper](https://crates.io/crates/hyper) 1.0
    -   [http](https://crates.io/crates/http) 1.0
    -   [http-body](https://crates.io/crates/http-body) 1.0
-   **breaking:** axum now requires [tower-http](https://crates.io/crates/tower-http) 0.5
-   **breaking:** Remove deprecated `WebSocketUpgrade::max_send_queue`
-   **breaking:** The following types/traits are no longer generic over the request body
    (i.e. the `B` type param has been removed) ([#&#8203;1751] and [#&#8203;1789]):
    -   `FromRequestParts`
    -   `FromRequest`
    -   `HandlerService`
    -   `HandlerWithoutStateExt`
    -   `Handler`
    -   `LayeredFuture`
    -   `Layered`
    -   `MethodRouter`
    -   `Next`
    -   `RequestExt`
    -   `RouteFuture`
    -   `Route`
    -   `Router`
-   **breaking:** axum no longer re-exports `hyper::Body` as that type is removed
    in hyper 1.0. Instead axum has its own body type at `axum::body::Body` ([#&#8203;1751])
-   **breaking:** `extract::BodyStream` has been removed as `body::Body`
    implements `Stream` and `FromRequest` directly ([#&#8203;1751])
-   **breaking:** Change `sse::Event::json_data` to use `axum_core::Error` as its error type ([#&#8203;1762])
-   **breaking:** Rename `DefaultOnFailedUpdgrade` to `DefaultOnFailedUpgrade` ([#&#8203;1664])
-   **breaking:** Rename `OnFailedUpdgrade` to `OnFailedUpgrade` ([#&#8203;1664])
-   **breaking:** `TypedHeader` has been move to `axum-extra` ([#&#8203;1850])
-   **breaking:** Removed re-exports of `Empty` and `Full`. Use
    `axum::body::Body::empty` and `axum::body::Body::from` respectively ([#&#8203;1789])
-   **breaking:** The response returned by `IntoResponse::into_response` must use
    `axum::body::Body` as the body type. `axum::response::Response` does this
    ([#&#8203;1789])
-   **breaking:** Removed the `BoxBody` type alias and its `box_body`
    constructor. Use `axum::body::Body::new` instead ([#&#8203;1789])
-   **breaking:** Remove `RawBody` extractor. `axum::body::Body` implements `FromRequest` directly ([#&#8203;1789])
-   **breaking:** The following types from `http-body` no longer implement `IntoResponse`:
    -   `Full`, use `Body::from` instead
    -   `Empty`, use `Body::empty` instead
    -   `BoxBody`, use `Body::new` instead
    -   `UnsyncBoxBody`, use `Body::new` instead
    -   `MapData`, use `Body::new` instead
    -   `MapErr`, use `Body::new` instead
-   **added:** Add `axum::extract::Request` type alias where the body is `axum::body::Body` ([#&#8203;1789])
-   **added:** Add `Router::as_service` and `Router::into_service` to workaround
    type inference issues when calling `ServiceExt` methods on a `Router` ([#&#8203;1835])
-   **breaking:** Removed `axum::Server` as it was removed in hyper 1.0. Instead
    use `axum::serve(listener, service)` or hyper/hyper-util for more configuration options ([#&#8203;1868])
-   **breaking:** Only inherit fallbacks for routers nested with `Router::nest`.
    Routers nested with `Router::nest_service` will no longer inherit fallbacks ([#&#8203;1956])
-   **fixed:** Don't remove the `Sec-WebSocket-Key` header in `WebSocketUpgrade` ([#&#8203;1972])
-   **added:** Add `axum::extract::Query::try_from_uri` ([#&#8203;2058])
-   **added:** Implement `IntoResponse` for `Box<str>` and `Box<[u8]>` (\[[#&#8203;2035](tokio-rs/axum#2035)])
-   **breaking:** Simplify `MethodFilter`. It no longer uses bitflags ([#&#8203;2073])
-   **fixed:** Fix bugs around merging routers with nested fallbacks ([#&#8203;2096])
-   **fixed:** Fix `.source()` of composite rejections ([#&#8203;2030])
-   **fixed:** Allow unreachable code in `#[debug_handler]` ([#&#8203;2014])
-   **change:** axum's MSRV is now 1.66 ([#&#8203;1882])
-   **added:** Implement `IntoResponse` for `(R,) where R: IntoResponse` ([#&#8203;2143])
-   **changed:** For SSE, add space between field and value for compatibility ([#&#8203;2149])
-   **added:** Add `NestedPath` extractor ([#&#8203;1924])
-   **added:** Add `handle_error` function to existing `ServiceExt` trait ([#&#8203;2235])
-   **breaking:** `impl<T> IntoResponse(Parts) for Extension<T>` now requires
    `T: Clone`, as that is required by the http crate ([#&#8203;1882])
-   **added:** Add `axum::Json::from_bytes` ([#&#8203;2244])
-   **added:** Implement `FromRequestParts` for `http::request::Parts` ([#&#8203;2328])
-   **added:** Implement `FromRequestParts` for `http::Extensions` ([#&#8203;2328])
-   **fixed:** Clearly document applying `DefaultBodyLimit` to individual routes ([#&#8203;2157])

[#&#8203;1664]: tokio-rs/axum#1664

[#&#8203;1751]: tokio-rs/axum#1751

[#&#8203;1762]: tokio-rs/axum#1762

[#&#8203;1789]: tokio-rs/axum#1789

[#&#8203;1835]: tokio-rs/axum#1835

[#&#8203;1850]: tokio-rs/axum#1850

[#&#8203;1868]: tokio-rs/axum#1868

[#&#8203;1882]: tokio-rs/axum#1882

[#&#8203;1924]: tokio-rs/axum#1924

[#&#8203;1956]: tokio-rs/axum#1956

[#&#8203;1972]: tokio-rs/axum#1972

[#&#8203;2014]: tokio-rs/axum#2014

[#&#8203;2021]: tokio-rs/axum#2021

[#&#8203;2030]: tokio-rs/axum#2030

[#&#8203;2058]: tokio-rs/axum#2058

[#&#8203;2073]: tokio-rs/axum#2073

[#&#8203;2096]: tokio-rs/axum#2096

[#&#8203;2140]: tokio-rs/axum#2140

[#&#8203;2143]: tokio-rs/axum#2143

[#&#8203;2149]: tokio-rs/axum#2149

[#&#8203;2157]: tokio-rs/axum#2157

[#&#8203;2235]: tokio-rs/axum#2235

[#&#8203;2244]: tokio-rs/axum#2244

[#&#8203;2328]: tokio-rs/axum#2328

</details>

<details>
<summary>mikaelmello/inquire (inquire)</summary>

### [`v0.7.5`](https://github.com/mikaelmello/inquire/blob/HEAD/CHANGELOG.md#075---2024-04-23)

[Compare Source](mikaelmello/inquire@v0.7.4...v0.7.5)

-   Fix user-provided ANSI escape codes from being removed when rendering.
    -   Introduced on 0.7.0, this regression was making it impossible to have colorised text inside the prompt.
    -   Now ANSI escape codes are properly emitted when rendering the prompt in the terminal.

### [`v0.7.4`](https://github.com/mikaelmello/inquire/blob/HEAD/CHANGELOG.md#074---2024-03-25)

[Compare Source](mikaelmello/inquire@v0.7.3...v0.7.4)

-   Fix unexpected behaviors of `keep_filter` option in MultiSelect prompts:
    -   Filter input is now correcly getting reset **only when** `keep_filter == false`.
    -   When the filter input is reset, the list of options is now correctly reset as well. Thanks [@&#8203;Swivelgames](https://github.com/Swivelgames) for reporting [#&#8203;238](mikaelmello/inquire#238).

### [`v0.7.3`](https://github.com/mikaelmello/inquire/blob/HEAD/CHANGELOG.md#073---2024-03-21)

[Compare Source](mikaelmello/inquire@v0.7.2...v0.7.3)

-   Fix cursor occasionally blinking in unexpected places.

### [`v0.7.2`](https://github.com/mikaelmello/inquire/blob/HEAD/CHANGELOG.md#072---2024-03-17)

[Compare Source](mikaelmello/inquire@v0.7.1...v0.7.2)

-   Pressing Ctrl+D now cancels the prompt. Thanks [@&#8203;mikecvet](https://github.com/mikecvet) for the PR!
-   Add support for `h` and `l` bindings when vim_mode is enabled on MultiSelect prompts, clearing or selecting all options respectively. Thanks [@&#8203;afh](https://github.com/afh) for the PR!
-   Fix render issue [#&#8203;233](mikaelmello/inquire#233) where cursor positioning at the end of a prompt was incorrect. Thanks [@&#8203;msrd0](https://github.com/msrd0) and [@&#8203;Sydonian](https://github.com/Sydonian) for reporting!

### [`v0.7.1`](https://github.com/mikaelmello/inquire/blob/HEAD/CHANGELOG.md#071---2024-03-10)

[Compare Source](mikaelmello/inquire@v0.7.0...v0.7.1)

-   Fix render issue [#&#8203;228](mikaelmello/inquire#228) when using `console` crate as the terminal backend. Thanks [@&#8203;maospr](https://github.com/maospr) for reporting.

### [`v0.7.0`](https://github.com/mikaelmello/inquire/blob/HEAD/CHANGELOG.md#070---2024-02-24)

[Compare Source](mikaelmello/inquire@v0.6.2...v0.7.0)

##### Breaking Changes

-   The Select and Multiselect Filter now scores input and is now expected to return an `Option<i64>`, making it possible to order/rank the list of options. [#&#8203;176](mikaelmello/inquire#176)
    `None`: Will not be displayed in the list of options.
    `Some(score)`: score determines the order of options, higher score, higher on the list of options.
-   Improved user experience on Password prompts. When there is a validation error, the input is cleared if the password is rendered using the `Hidden` display mode, matching the user expectation of having to write the password from scratch again. Thanks to [@&#8203;CM-IV](https://github.com/CM-IV) for the questions on [#&#8203;149](mikaelmello/inquire#149)!
-   Allow lifetime customization of RenderConfig. [#&#8203;101](mikaelmello/inquire#101). Thanks to [@&#8203;arturfast](https://github.com/arturfast) for the suggestion [#&#8203;95](mikaelmello/inquire#95).
-   Implement fuzzy search as default on Select and MultiSelect prompts. [#&#8203;176](mikaelmello/inquire#176)
-   Revamped keybindings for DateSelect.

##### Features

-   Add one-liner helpers for quick scripts. [#&#8203;144](mikaelmello/inquire#144).
-   Add new option on MultiSelect prompts to set all options to be selected by default. Thanks to [@&#8203;conikeec](https://github.com/conikeec) for the suggestion ([#&#8203;151](mikaelmello/inquire#151))!
-   Add new option on Select/MultiSelect prompts allowing to reset selection to the first item on filter-input changes. [#&#8203;176](mikaelmello/inquire#176)
-   Emacs-like keybindings added where applicable:
    -   Ctrl-p/Ctrl-n for up/down
    -   Ctrl-b/Ctrl-f for left/right
    -   Ctrl-j/Ctrl-g for enter/cancel
-   Vim keybindings are always supported in DateSelect prompts.
-   Added 'with_starting_filter_input' to both Select and MultiSelect, which allows for setting an initial value to the filter section of the prompt.
-   Added starting_input for CustomType. [#&#8203;194](mikaelmello/inquire#194)
-   Added 'without_filtering' to both Select and MultiSelect, useful when you want to simplify the UX if the filter does not add any value, such as when the list is already short.
-   Added 'with_answered_prompt_prefix' to RenderConfig to allow customization of answered prompt prefix.
-   Improved rendering, with optimizations on incremental rendering and terminal resizing.

##### Fixes

-   Fixed typos in the code's comments.
-   Fixed issue where inquire, using termion, would crash when receiving piped inputs.

##### Dependency changes (some breaking)

-   Upgraded underlying `termion` crate from v1.5 to v2.0.
-   Upgraded underlying `bitflags` from v1 to v2, which affects the `Attributes` and `KeyModifiers` crates. If you use any of bitflag's methods directly, you might be affected, refer to the [bitflags changelog](https://github.com/bitflags/bitflags/releases/tag/2.0.0) for more information.
-   Removed `thiserror` dependency in favor of implementing `InquireError` by hand. [#&#8203;146](mikaelmello/inquire#146)
-   Raised MSRV to 1.66 due to requirements in downstream dependencies.
-   MSRV is now explicitly set in the package definition.
-   Replaced `lazy_static` with `once_cell` as `once_cell::sync::Lazy` is being standardized and `lazy_static` is not actively maintained anymore.
-   Added `fuzzy-matcher` as an optional dependency for fuzzy filtering in Select and MultiSelect prompts [#&#8203;176](mikaelmello/inquire#176)

</details>

<details>
<summary>seanmonstar/reqwest (reqwest)</summary>

### [`v0.12.7`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0127)

[Compare Source](seanmonstar/reqwest@v0.12.6...v0.12.7)

-   Revert adding `impl Service<http::Request<_>>` for `Client`.

### [`v0.12.6`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0126)

[Compare Source](seanmonstar/reqwest@v0.12.5...v0.12.6)

-   Add support for `danger_accept_invalid_hostnames` for `rustls`.
-   Add `impl Service<http::Request<Body>>` for `Client` and `&'_ Client`.
-   Add support for `!Sync` bodies in `Body::wrap_stream()`.
-   Enable happy eyeballs when `hickory-dns` is used.
-   Fix `Proxy` so that `HTTP(S)_PROXY` values take precendence over `ALL_PROXY`.
-   Fix `blocking::RequestBuilder::header()` from unsetting `sensitive` on passed header values.

### [`v0.12.5`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0125)

[Compare Source](seanmonstar/reqwest@v0.12.4...v0.12.5)

-   Add `blocking::ClientBuilder::dns_resolver()` method to change DNS resolver in blocking client.
-   Add `http3` feature back, still requiring `reqwest_unstable`.
-   Add `rustls-tls-no-provider` Cargo feature to use rustls without a crypto provider.
-   Fix `Accept-Encoding` header combinations.
-   Fix http3 resolving IPv6 addresses.
-   Internal: upgrade to rustls 0.23.

### [`v0.12.4`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0124)

[Compare Source](seanmonstar/reqwest@v0.12.3...v0.12.4)

-   Add `zstd` support, enabled with `zstd` Cargo feature.
-   Add `ClientBuilder::read_timeout(Duration)`, which applies the duration for each read operation. The timeout resets after a successful read.

### [`v0.12.3`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0123)

[Compare Source](seanmonstar/reqwest@v0.12.2...v0.12.3)

-   Add `FromStr` for `dns::Name`.
-   Add `ClientBuilder::built_in_webpki_certs(bool)` to enable them separately.
-   Add `ClientBuilder::built_in_native_certs(bool)` to enable them separately.
-   Fix sending `content-length: 0` for GET requests.
-   Fix response body `content_length()` to return value when timeout is configured.
-   Fix `ClientBuilder::resolve()` to use lowercase domain names.

### [`v0.12.2`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0122)

[Compare Source](seanmonstar/reqwest@v0.12.1...v0.12.2)

-   Fix missing ALPN when connecting to socks5 proxy with rustls.
-   Fix TLS version limits with rustls.
-   Fix not detected ALPN h2 from server with native-tls.

### [`v0.12.1`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0121)

[Compare Source](seanmonstar/reqwest@v0.12.0...v0.12.1)

-   Fix `ClientBuilder::interface()` when no TLS is enabled.
-   Fix `TlsInfo::peer_certificate()` being truncated with rustls.
-   Fix panic if `http2` feature disabled but TLS negotiated h2 in ALPN.
-   Fix `Display` for `Error` to not include its source error.

### [`v0.12.0`](https://github.com/seanmonstar/reqwest/blob/HEAD/CHANGELOG.md#v0120)

[Compare Source](seanmonstar/reqwest@v0.11.27...v0.12.0)

-   Upgrade to `hyper`, `http`, and `http-body` v1.
-   Add better support for converting to and from `http::Request` and `http::Response`.
-   Add `http2` optional cargo feature, default on.
-   Add `charset` optional cargo feature, default on.
-   Add `macos-system-configuration` cargo feature, default on.
-   Change all optional dependencies to no longer be exposed as implicit features.
-   Add `ClientBuilder::interface(str)` to specify the local interface to bind to.
-   Experimental: disables the `http3` feature temporarily.

#### v0.11.27

-   Add `hickory-dns` feature, deprecating `trust-dns`.
-   (wasm) Fix `Form::text()` to not set octet-stream for plain text fields.

#### v0.11.26

-   Revert `system-configuration` upgrade, which broke MSRV on macOS.

#### v0.11.25

-   Fix `Certificate::from_pem_bundle()` parsing.
-   Fix Apple linker errors from detecting system proxies.

#### v0.11.24

-   Add `Certificate::from_pem_bundle()` to add a bundle.
-   Add `http3_prior_knowledge()` to blocking client builder.
-   Remove `Sync` bounds requirement for `Body::wrap_stream()`.
-   Fix HTTP/2 to retry `REFUSED_STREAM` requests.
-   Fix instances of converting `Url` to `Uri` that could panic.

#### v0.11.23

-   Add `Proxy::custom_http_auth(val)` for setting the raw `Proxy-Authorization` header when connecting to proxies.
-   Fix redirect to reject locations that are not `http://` or `https://`.
-   Fix setting `nodelay` when TLS is enabled but URL is HTTP.
-   (wasm) Add `ClientBuilder::user_agent(val)`.
-   (wasm) add `multipart::Form::headers(headers)`.

#### v0.11.22

-   Fix compilation on Windows when `trust-dns` is enabled.

#### v0.11.21

-   Add automatically detecting macOS proxy settings.
-   Add `ClientBuilder::tls_info(bool)`, which will put `tls::TlsInfo` into the response extensions.
-   Fix trust-dns resolver from possible hangs.
-   Fix connect timeout to be split among multiple IP addresses.

#### v0.11.20

-   Fix `deflate` decompression back to using zlib, as outlined in the spec.

#### v0.11.19

-   Add `ClientBuilder::http1_ignore_invalid_headers_in_responses()` option.
-   Add `ClientBuilder::http1_allow_spaces_after_header_name_in_responses()` option.
-   Add support for `ALL_PROXY` environment variable.
-   Add support for `use_preconfigured_tls` when combined with HTTP/3.
-   Fix `deflate` decompression from using the zlib decoder.
-   Fix `Response::{text, text_with_charset}()` to strip BOM characters.
-   Fix a panic when HTTP/3 is used if UDP isn't able to connect.
-   Fix some dependencies for HTTP/3.
-   Increase MSRV to 1.63.

#### v0.11.18

-   Fix `RequestBuilder::json()` method from overriding a previously set `content-type` header. An existing value will be left in place.
-   Upgrade internal dependencies for rustls and compression.

#### v0.11.17

-   Upgrade internal dependencies of Experimental HTTP/3 to use quinn v0.9
-   (wasm) Fix blob url support

#### v0.11.16

-   Chore: set MSRV in `Cargo.toml`.
-   Docs: fix build on docs.rs

#### v0.11.15

-   Add `RequestBuilder` methods to split and reconstruct from its parts.
-   Add experimental HTTP/3 support.
-   Fix `connection_verbose` to log `write_vectored` calls.
-   (wasm) Make requests actually cancel if the future is dropped.

#### v0.11.14

-   Adds `Proxy::no_proxy(url)` that works like the NO_PROXY environment variable.
-   Adds `multipart::Part::headers(headers)` method to add custom headers.
-   (wasm) Add `Response::bytes_stream()`.
-   Perf: several internal optimizations reducing copies and memory allocations.

#### v0.11.13

-   Add `ClientBuilder::dns_resolver()` option for custom DNS resolvers.
-   Add `ClientBuilder::tls_sni(bool)` option to enable or disable TLS Server Name Indication.
-   Add `Identity::from_pkcs8_pem()` constructor when using `native-tls`.
-   Fix `redirect::Policy::limited(0)` from following any redirects.

#### v0.11.12

-   Add `ClientBuilder::resolve_to_addrs()` which allows a slice of IP addresses to be specified for a single host.
-   Add `Response::upgrade()` to await whether the server agrees to an HTTP upgrade.

#### v0.11.11

-   Add HTTP/2 keep-alive configuration methods on `ClientBuilder`.
-   Add `ClientBuilder::http1_allow_obsolete_multiline_headers_in_responses()`.
-   Add `impl Service<Request>` for `Client` and `&'_ Client`.
-   (wasm) Add `RequestBuilder::basic_auth()`.
-   Fix `RequestBuilder::header` to not override `sensitive` if user explicitly set on a `HeaderValue`.
-   Fix rustls parsing of elliptic curve private keys.
-   Fix Proxy URL parsing of some invalid targets.

#### v0.11.10

-   Add `Error::url()` to access the URL of an error.
-   Add `Response::extensions()` to access the `http::Extensions` of a response.
-   Fix `rustls-native-certs` to log an error instead of panicking when loading an invalid system certificate.
-   Fix passing Basic Authorization header to proxies.

#### v0.11.9

-   Add `ClientBuilder::http09_responses(bool)` option to allow receiving HTTP/0.9 responses.
-   Fix HTTP/2 to retry requests interrupted by an HTTP/2 graceful shutdown.
-   Fix proxy loading from environment variables to ignore empty values.

#### v0.11.8

-   Update internal webpki-roots dependency.

#### v0.11.7

-   Add `blocking::ClientBuilder::resolve()` option, matching the async builder.
-   Implement `From<tokio::fs::File>` for `Body`.
-   Fix `blocking` request-scoped timeout applying to bodies as well.
-   (wasm) Fix request bodies using multipart vs formdata.
-   Update internal `rustls` to 0.20.

#### v0.11.6

-   (wasm) Fix request bodies more.

#### v0.11.5

-   Add `ClientBuilder::http1_only()` method.
-   Add `tls::Version` type, and `ClientBuilder::min_tls_version()` and `ClientBuilder::max_tls_version()` methods.
-   Implement `TryFrom<Request>` for `http::Request`.
-   Implement `Clone` for `Identity`.
-   Fix `NO_PROXY`environment variable parsing to more closely match curl's. Comma-separated entries are now trimmed for whitespace, and `*` is allowed to match everything.
-   Fix redirection to respect `https_only` option.
-   (wasm) Add `Body::as_bytes()` method.
-   (wasm) Fix sometimes wrong conversation of bytes into a `JsValue`.
-   (wasm) Avoid dependency on serde-serialize feature.

#### v0.11.4

-   Add `ClientBuilder::resolve()` option to override DNS resolution for specific domains.
-   Add `native-tls-alpn` Cargo feature to use ALPN with the native-tls backend.
-   Add `ClientBuilder::deflate()` option and `deflate` Cargo feature to support decoding response bodies using deflate.
-   Add `RequestBuilder::version()` to allow setting the HTTP version of a request.
-   Fix allowing "invalid" certificates with the `rustls-tls` backend, when the server uses TLS v1.2 or v1.3.
-   (wasm) Add `try_clone` to `Request` and `RequestBuilder`

#### v0.11.3

-   Add `impl From<hyper::Body> for reqwest::Body`.
-   (wasm) Add credentials mode methods to `RequestBuilder`.

#### v0.11.2

-   Add `CookieStore` trait to customize the type that stores and retrieves cookies for a session.
-   Add `cookie::Jar` as a default `CookieStore`, easing creating some session cookies before creating the `Client`.
-   Add `ClientBuilder::http2_adaptive_window()` option to configure an adaptive HTTP2 flow control behavior.
-   Add `ClientBuilder::http2_max_frame_size()` option to adjust the maximum HTTP2 frame size that can be received.
-   Implement `IntoUrl` for `String`, making it more convenient to create requests with `format!`.

#### v0.11.1

-   Add `ClientBuilder::tls_built_in_root_certs()` option to disable built-in root certificates.
-   Fix `rustls-tls` glue to more often support ALPN to upgrade to HTTP/2.
-   Fix proxy parsing to assume `http://` if no scheme is found.
-   Fix connection pool idle reaping by enabling hyper's `runtime` feature.
-   (wasm) Add `Request::new()` constructor.

</details>

<details>
<summary>amodm/webbrowser-rs (webbrowser)</summary>

### [`v1.0.1`](https://github.com/amodm/webbrowser-rs/blob/HEAD/CHANGELOG.md#101---2024-05-06-a-name101a)

[Compare Source](amodm/webbrowser-rs@v1.0.0...v1.0.1)

##### Added

-   Support for visionOS. See PR [#&#8203;86](amodm/webbrowser-rs#86) and [#&#8203;87](amodm/webbrowser-rs#87)

### [`v1.0.0`](https://github.com/amodm/webbrowser-rs/blob/HEAD/CHANGELOG.md#100---2024-04-20-a-name100a)

[Compare Source](amodm/webbrowser-rs@v0.8.15...v1.0.0)

##### Added

-   Move to 1.0! MSRV has now been defined too.

##### Fixed

-   Unix: default to standard unix implementation, instead of whitelisting each flavour of unix
-   WASM: return an error on dry_run if window object isn't available

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xNjAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjQyNC4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Reviewed-on: https://git.front.kjuulh.io/kjuulh/coffee/pulls/14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants