diff --git a/.github/workflows/ci-post-merge.yml b/.github/workflows/ci-post-merge.yml
index df6f2168..394d447a 100644
--- a/.github/workflows/ci-post-merge.yml
+++ b/.github/workflows/ci-post-merge.yml
@@ -45,7 +45,7 @@ jobs:
           toolchain: ${{ matrix.version.version }}
 
       - name: Install cargo-hack
-        uses: taiki-e/install-action@v2.23.7
+        uses: taiki-e/install-action@v2.24.1
         with:
           tool: cargo-hack
 
@@ -85,7 +85,7 @@ jobs:
         uses: actions-rust-lang/setup-rust-toolchain@v1.6.0
 
       - name: Install cargo-hack
-        uses: taiki-e/install-action@v2.23.7
+        uses: taiki-e/install-action@v2.24.1
         with:
           tool: cargo-hack
 
@@ -106,7 +106,7 @@ jobs:
         uses: actions-rust-lang/setup-rust-toolchain@v1.6.0
 
       - name: Install nextest
-        uses: taiki-e/install-action@v2.23.7
+        uses: taiki-e/install-action@v2.24.1
         with:
           tool: nextest
 
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 81139fa2..bcab6219 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -50,7 +50,7 @@ jobs:
           toolchain: ${{ matrix.version.version }}
 
       - name: Install cargo-hack
-        uses: taiki-e/install-action@v2.23.7
+        uses: taiki-e/install-action@v2.24.1
         with:
           tool: cargo-hack
 
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 810ea33d..bdd15198 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -23,7 +23,7 @@ jobs:
           components: llvm-tools-preview
 
       - name: Install cargo-llvm-cov
-        uses: taiki-e/install-action@v2.23.7
+        uses: taiki-e/install-action@v2.24.1
         with:
           tool: cargo-llvm-cov
 
diff --git a/actix-http/src/requests/head.rs b/actix-http/src/requests/head.rs
index 4558801f..2e0c2dbd 100644
--- a/actix-http/src/requests/head.rs
+++ b/actix-http/src/requests/head.rs
@@ -16,7 +16,10 @@ pub struct RequestHead {
     pub uri: Uri,
     pub version: Version,
     pub headers: HeaderMap,
+
+    /// Will only be None when called in unit tests unless [`TestRequest::peer_addr`] is used.
     pub peer_addr: Option<net::SocketAddr>,
+
     flags: Flags,
 }
 
diff --git a/actix-http/src/requests/request.rs b/actix-http/src/requests/request.rs
index 1750fb2f..6a267a7a 100644
--- a/actix-http/src/requests/request.rs
+++ b/actix-http/src/requests/request.rs
@@ -173,7 +173,7 @@ impl<P> Request<P> {
     /// Peer address is the directly connected peer's socket address. If a proxy is used in front of
     /// the Actix Web server, then it would be address of this proxy.
     ///
-    /// Will only return None when called in unit tests.
+    /// Will only return None when called in unit tests unless set manually.
     #[inline]
     pub fn peer_addr(&self) -> Option<net::SocketAddr> {
         self.head().peer_addr
diff --git a/actix-web/src/service.rs b/actix-web/src/service.rs
index 0e17c994..45122483 100644
--- a/actix-web/src/service.rs
+++ b/actix-web/src/service.rs
@@ -221,12 +221,9 @@ impl ServiceRequest {
 
     /// Returns peer's socket address.
     ///
-    /// Peer address is the directly connected peer's socket address. If a proxy is used in front of
-    /// the Actix Web server, then it would be address of this proxy.
+    /// See [`HttpRequest::peer_addr`] for more details.
     ///
-    /// To get client connection information `ConnectionInfo` should be used.
-    ///
-    /// Will only return None when called in unit tests.
+    /// [`HttpRequest::peer_addr`]: crate::HttpRequest::peer_addr
     #[inline]
     pub fn peer_addr(&self) -> Option<net::SocketAddr> {
         self.head().peer_addr
diff --git a/actix-web/src/test/test_request.rs b/actix-web/src/test/test_request.rs
index 5491af0a..a3945456 100644
--- a/actix-web/src/test/test_request.rs
+++ b/actix-web/src/test/test_request.rs
@@ -86,76 +86,77 @@ impl Default for TestRequest {
 
 #[allow(clippy::wrong_self_convention)]
 impl TestRequest {
-    /// Create TestRequest and set request uri
-    pub fn with_uri(path: &str) -> TestRequest {
-        TestRequest::default().uri(path)
+    /// Constructs test request and sets request URI.
+    pub fn with_uri(uri: &str) -> TestRequest {
+        TestRequest::default().uri(uri)
     }
 
-    /// Create TestRequest and set method to `Method::GET`
+    /// Constructs test request with GET method.
     pub fn get() -> TestRequest {
         TestRequest::default().method(Method::GET)
     }
 
-    /// Create TestRequest and set method to `Method::POST`
+    /// Constructs test request with POST method.
     pub fn post() -> TestRequest {
         TestRequest::default().method(Method::POST)
     }
 
-    /// Create TestRequest and set method to `Method::PUT`
+    /// Constructs test request with PUT method.
     pub fn put() -> TestRequest {
         TestRequest::default().method(Method::PUT)
     }
 
-    /// Create TestRequest and set method to `Method::PATCH`
+    /// Constructs test request with PATCH method.
     pub fn patch() -> TestRequest {
         TestRequest::default().method(Method::PATCH)
     }
 
-    /// Create TestRequest and set method to `Method::DELETE`
+    /// Constructs test request with DELETE method.
     pub fn delete() -> TestRequest {
         TestRequest::default().method(Method::DELETE)
     }
 
-    /// Set HTTP version of this request
+    /// Sets HTTP version of this request.
     pub fn version(mut self, ver: Version) -> Self {
         self.req.version(ver);
         self
     }
 
-    /// Set HTTP method of this request
+    /// Sets method of this request.
     pub fn method(mut self, meth: Method) -> Self {
         self.req.method(meth);
         self
     }
 
-    /// Set HTTP URI of this request
+    /// Sets URI of this request.
     pub fn uri(mut self, path: &str) -> Self {
         self.req.uri(path);
         self
     }
 
-    /// Insert a header, replacing any that were set with an equivalent field name.
+    /// Inserts a header, replacing any that were set with an equivalent field name.
     pub fn insert_header(mut self, header: impl TryIntoHeaderPair) -> Self {
         self.req.insert_header(header);
         self
     }
 
-    /// Append a header, keeping any that were set with an equivalent field name.
+    /// Appends a header, keeping any that were set with an equivalent field name.
     pub fn append_header(mut self, header: impl TryIntoHeaderPair) -> Self {
         self.req.append_header(header);
         self
     }
 
-    /// Set cookie for this request.
+    /// Sets cookie for this request.
     #[cfg(feature = "cookies")]
     pub fn cookie(mut self, cookie: Cookie<'_>) -> Self {
         self.cookies.add(cookie.into_owned());
         self
     }
 
-    /// Set request path pattern parameter.
+    /// Sets request path pattern parameter.
     ///
     /// # Examples
+    ///
     /// ```
     /// use actix_web::test::TestRequest;
     ///
@@ -171,19 +172,19 @@ impl TestRequest {
         self
     }
 
-    /// Set peer addr.
+    /// Sets peer address.
     pub fn peer_addr(mut self, addr: SocketAddr) -> Self {
         self.peer_addr = Some(addr);
         self
     }
 
-    /// Set request payload.
+    /// Sets request payload.
     pub fn set_payload(mut self, data: impl Into<Bytes>) -> Self {
         self.req.set_payload(data);
         self
     }
 
-    /// Serialize `data` to a URL encoded form and set it as the request payload.
+    /// Serializes `data` to a URL encoded form and set it as the request payload.
     ///
     /// The `Content-Type` header is set to `application/x-www-form-urlencoded`.
     pub fn set_form(mut self, data: impl Serialize) -> Self {
@@ -194,7 +195,7 @@ impl TestRequest {
         self
     }
 
-    /// Serialize `data` to JSON and set it as the request payload.
+    /// Serializes `data` to JSON and set it as the request payload.
     ///
     /// The `Content-Type` header is set to `application/json`.
     pub fn set_json(mut self, data: impl Serialize) -> Self {
@@ -204,27 +205,33 @@ impl TestRequest {
         self
     }
 
-    /// Set application data. This is equivalent of `App::data()` method
-    /// for testing purpose.
-    pub fn data<T: 'static>(mut self, data: T) -> Self {
-        self.app_data.insert(Data::new(data));
-        self
-    }
-
-    /// Set application data. This is equivalent of `App::app_data()` method
-    /// for testing purpose.
+    /// Inserts application data.
+    ///
+    /// This is equivalent of `App::app_data()` method for testing purpose.
     pub fn app_data<T: 'static>(mut self, data: T) -> Self {
         self.app_data.insert(data);
         self
     }
 
+    /// Inserts application data.
+    ///
+    /// This is equivalent of `App::data()` method for testing purpose.
+    #[doc(hidden)]
+    pub fn data<T: 'static>(mut self, data: T) -> Self {
+        self.app_data.insert(Data::new(data));
+        self
+    }
+
+    /// Sets resource map.
     #[cfg(test)]
-    /// Set request config
     pub(crate) fn rmap(mut self, rmap: ResourceMap) -> Self {
         self.rmap = rmap;
         self
     }
 
+    /// Finalizes test request.
+    ///
+    /// This request builder will be useless after calling `finish()`.
     fn finish(&mut self) -> Request {
         // mut used when cookie feature is enabled
         #[allow(unused_mut)]
@@ -251,14 +258,14 @@ impl TestRequest {
         req
     }
 
-    /// Complete request creation and generate `Request` instance
+    /// Finalizes request creation and returns `Request` instance.
     pub fn to_request(mut self) -> Request {
         let mut req = self.finish();
         req.head_mut().peer_addr = self.peer_addr;
         req
     }
 
-    /// Complete request creation and generate `ServiceRequest` instance
+    /// Finalizes request creation and returns `ServiceRequest` instance.
     pub fn to_srv_request(mut self) -> ServiceRequest {
         let (mut head, payload) = self.finish().into_parts();
         head.peer_addr = self.peer_addr;
@@ -279,12 +286,12 @@ impl TestRequest {
         )
     }
 
-    /// Complete request creation and generate `ServiceResponse` instance
+    /// Finalizes request creation and returns `ServiceResponse` instance.
     pub fn to_srv_response<B>(self, res: HttpResponse<B>) -> ServiceResponse<B> {
         self.to_srv_request().into_response(res)
     }
 
-    /// Complete request creation and generate `HttpRequest` instance
+    /// Finalizes request creation and returns `HttpRequest` instance.
     pub fn to_http_request(mut self) -> HttpRequest {
         let (mut head, _) = self.finish().into_parts();
         head.peer_addr = self.peer_addr;
@@ -302,7 +309,7 @@ impl TestRequest {
         )
     }
 
-    /// Complete request creation and generate `HttpRequest` and `Payload` instances
+    /// Finalizes request creation and returns `HttpRequest` and `Payload` pair.
     pub fn to_http_parts(mut self) -> (HttpRequest, Payload) {
         let (mut head, payload) = self.finish().into_parts();
         head.peer_addr = self.peer_addr;
@@ -322,7 +329,7 @@ impl TestRequest {
         (req, payload)
     }
 
-    /// Complete request creation, calls service and waits for response future completion.
+    /// Finalizes request creation, calls service, and waits for response future completion.
     pub async fn send_request<S, B, E>(self, app: &S) -> S::Response
     where
         S: Service<Request, Response = ServiceResponse<B>, Error = E>,
diff --git a/scripts/bump b/scripts/bump
index 68f923e7..22aa2af9 100755
--- a/scripts/bump
+++ b/scripts/bump
@@ -112,17 +112,25 @@ echo
 read -p "Update all references: (y/N) " UPDATE_REFERENCES
 UPDATE_REFERENCES="${UPDATE_REFERENCES:-n}"
 
+
 if [ "$UPDATE_REFERENCES" = 'y' ] || [ "$UPDATE_REFERENCES" = 'Y' ]; then
+    if [[ $NEW_VERSION == *".0.0" ]]; then
+        NEW_VERSION_SPEC="${NEW_VERSION%.0.0}"
+    elif [[ $NEW_VERSION == *".0" ]]; then
+        NEW_VERSION_SPEC="${NEW_VERSION%.0}"
+    else
+        NEW_VERSION_SPEC="$NEW_VERSION"
+    fi
 
     for f in $(fd Cargo.toml); do
         sed -i.bak -E \
-            "s/^(${PACKAGE_NAME} ?= ?\")[^\"]+(\")$/\1${NEW_VERSION}\2/g" $f
+            "s/^(${PACKAGE_NAME} ?= ?\")[^\"]+(\")$/\1${NEW_VERSION_SPEC}\2/g" $f
         sed -i.bak -E \
-            "s/^(${PACKAGE_NAME} ?=.*version ?= ?\")[^\"]+(\".*)$/\1${NEW_VERSION}\2/g" $f
+            "s/^(${PACKAGE_NAME} ?=.*version ?= ?\")[^\"]+(\".*)$/\1${NEW_VERSION_SPEC}\2/g" $f
         sed -i.bak -E \
-            "s/^(.*package ?= ?\"${PACKAGE_NAME}\".*version ?= ?\")[^\"]+(\".*)$/\1${NEW_VERSION}\2/g" $f
+            "s/^(.*package ?= ?\"${PACKAGE_NAME}\".*version ?= ?\")[^\"]+(\".*)$/\1${NEW_VERSION_SPEC}\2/g" $f
         sed -i.bak -E \
-            "s/^(.*version ?= ?\")[^\"]+(\".*package ?= ?\"${PACKAGE_NAME}\".*)$/\1${NEW_VERSION}\2/g" $f
+            "s/^(.*version ?= ?\")[^\"]+(\".*package ?= ?\"${PACKAGE_NAME}\".*)$/\1${NEW_VERSION_SPEC}\2/g" $f
 
         # remove backup file
         rm -f $f.bak