Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-hcloud for openSUSE:Factory 
checked in at 2026-02-05 18:00:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-hcloud (Old)
 and      /work/SRC/openSUSE:Factory/.python-hcloud.new.1670 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-hcloud"

Thu Feb  5 18:00:30 2026 rev:16 rq:1331139 version:2.16.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-hcloud/python-hcloud.changes      
2026-01-09 17:04:45.823154118 +0100
+++ /work/SRC/openSUSE:Factory/.python-hcloud.new.1670/python-hcloud.changes    
2026-02-05 18:05:49.173247112 +0100
@@ -1,0 +2,13 @@
+Wed Feb  4 09:52:50 UTC 2026 - John Paul Adrian Glaubitz 
<[email protected]>
+
+- Update to 2.16.0
+  * The experimental phase for Storage Boxes is over,
+    and Storage Boxes support is now generally available.
+  * **servers**: allow setting user_data for rebuild (#627)
+  * Storage Box support no longer experimental (#626)
+- from version 2.15.0
+  * add name to Storage Box Subaccount (#621)
+- from version 2.14.0
+  * retry requests when the api returns a `timeout` error (#617)
+
+-------------------------------------------------------------------

Old:
----
  hcloud-2.13.0.tar.gz

New:
----
  hcloud-2.16.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-hcloud.spec ++++++
--- /var/tmp/diff_new_pack.hEckGe/_old  2026-02-05 18:05:50.065284532 +0100
+++ /var/tmp/diff_new_pack.hEckGe/_new  2026-02-05 18:05:50.069284700 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-hcloud
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -15,9 +15,10 @@
 # Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
+
 %{?sle15_python_module_pythons}
 Name:           python-hcloud
-Version:        2.13.0
+Version:        2.16.0
 Release:        0
 Summary:        Hetzner Cloud Python library
 License:        MIT

++++++ hcloud-2.13.0.tar.gz -> hcloud-2.16.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/CHANGELOG.md 
new/hcloud-2.16.0/CHANGELOG.md
--- old/hcloud-2.13.0/CHANGELOG.md      2025-12-19 16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/CHANGELOG.md      2026-01-23 13:10:20.000000000 +0100
@@ -1,5 +1,28 @@
 # Changelog
 
+## 
[v2.16.0](https://github.com/hetznercloud/hcloud-python/releases/tag/v2.16.0)
+
+### Storage Boxes support is now generally available
+
+The experimental phase for Storage Boxes is over, and Storage Boxes support is 
now generally available.
+
+### Features
+
+- **servers**: allow setting user_data for rebuild (#627)
+- Storage Box support no longer experimental (#626)
+
+## 
[v2.15.0](https://github.com/hetznercloud/hcloud-python/releases/tag/v2.15.0)
+
+### Features
+
+- add name to Storage Box Subaccount (#621)
+
+## 
[v2.14.0](https://github.com/hetznercloud/hcloud-python/releases/tag/v2.14.0)
+
+### Features
+
+- retry requests when the api returns a `timeout` error (#617)
+
 ## 
[v2.13.0](https://github.com/hetznercloud/hcloud-python/releases/tag/v2.13.0)
 
 ### Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/PKG-INFO new/hcloud-2.16.0/PKG-INFO
--- old/hcloud-2.13.0/PKG-INFO  2025-12-19 16:38:04.791544700 +0100
+++ new/hcloud-2.16.0/PKG-INFO  2026-01-23 13:10:28.348504300 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: hcloud
-Version: 2.13.0
+Version: 2.16.0
 Summary: Official Hetzner Cloud python library
 Home-page: https://github.com/hetznercloud/hcloud-python
 Author: Hetzner Cloud GmbH
@@ -26,9 +26,9 @@
 Requires-Dist: python-dateutil>=2.7.5
 Requires-Dist: requests>=2.20
 Provides-Extra: docs
-Requires-Dist: sphinx<8.3,>=8; extra == "docs"
-Requires-Dist: sphinx-rtd-theme<3.1,>=3; extra == "docs"
-Requires-Dist: myst-parser<4.1,>=4; extra == "docs"
+Requires-Dist: sphinx<9.2,>=9; extra == "docs"
+Requires-Dist: sphinx-rtd-theme<3.2,>=3; extra == "docs"
+Requires-Dist: myst-parser<5.1,>=5; extra == "docs"
 Requires-Dist: watchdog<6.1,>=6; extra == "docs"
 Provides-Extra: test
 Requires-Dist: coverage<7.14,>=7.13; extra == "test"
@@ -89,7 +89,11 @@
 from hcloud.images import Image
 from hcloud.server_types import ServerType
 
-client = Client(token="{YOUR_API_TOKEN}")  # Please paste your API token here
+client = Client(
+    token="{YOUR_API_TOKEN}", # Please paste your API token here
+    application_name="my-app",
+    application_version="v1.0.0",
+)
 
 # Create a server named my-server
 response = client.servers.create(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/README.md new/hcloud-2.16.0/README.md
--- old/hcloud-2.13.0/README.md 2025-12-19 16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/README.md 2026-01-23 13:10:20.000000000 +0100
@@ -34,7 +34,11 @@
 from hcloud.images import Image
 from hcloud.server_types import ServerType
 
-client = Client(token="{YOUR_API_TOKEN}")  # Please paste your API token here
+client = Client(
+    token="{YOUR_API_TOKEN}", # Please paste your API token here
+    application_name="my-app",
+    application_version="v1.0.0",
+)
 
 # Create a server named my-server
 response = client.servers.create(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud/_client.py 
new/hcloud-2.16.0/hcloud/_client.py
--- old/hcloud-2.13.0/hcloud/_client.py 2025-12-19 16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/hcloud/_client.py 2026-01-23 13:10:20.000000000 +0100
@@ -129,6 +129,7 @@
 
         - ``conflict``
         - ``rate_limit_exceeded``
+        - ``timeout``
 
     Changes to the retry policy might occur between releases, and will not be 
considered
     breaking changes.
@@ -419,6 +420,7 @@
             return exception.code in (
                 "rate_limit_exceeded",
                 "conflict",
+                "timeout",
             )
 
         if isinstance(exception.code, int):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud/_version.py 
new/hcloud-2.16.0/hcloud/_version.py
--- old/hcloud-2.13.0/hcloud/_version.py        2025-12-19 16:37:56.000000000 
+0100
+++ new/hcloud-2.16.0/hcloud/_version.py        2026-01-23 13:10:20.000000000 
+0100
@@ -1,3 +1,3 @@
 from __future__ import annotations
 
-__version__ = "2.13.0"  # x-releaser-pleaser-version
+__version__ = "2.16.0"  # x-releaser-pleaser-version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud/servers/client.py 
new/hcloud-2.16.0/hcloud/servers/client.py
--- old/hcloud-2.13.0/hcloud/servers/client.py  2025-12-19 16:37:56.000000000 
+0100
+++ new/hcloud-2.16.0/hcloud/servers/client.py  2026-01-23 13:10:20.000000000 
+0100
@@ -358,14 +358,16 @@
     def rebuild(
         self,
         image: Image | BoundImage,
+        user_data: str | None = None,
         # pylint: disable=unused-argument
         **kwargs: Any,
     ) -> RebuildResponse:
         """Rebuilds a server overwriting its disk with the content of an 
image, thereby destroying all data on the target server.
 
         :param image: Image to use for the rebuilt server
+        :param user_data: Cloud-Init user data to use during Server rebuild 
(optional)
         """
-        return self._client.rebuild(self, image=image)
+        return self._client.rebuild(self, image=image, user_data=user_data)
 
     def change_type(
         self,
@@ -1036,6 +1038,7 @@
         self,
         server: Server | BoundServer,
         image: Image | BoundImage,
+        user_data: str | None = None,
         # pylint: disable=unused-argument
         **kwargs: Any,
     ) -> RebuildResponse:
@@ -1043,8 +1046,12 @@
 
         :param server: Server to rebuild
         :param image: Image to use for the rebuilt server
+        :param user_data: Cloud-Init user data to use during Server rebuild 
(optional)
         """
         data: dict[str, Any] = {"image": image.id_or_name}
+        if user_data is not None:
+            data["user_data"] = user_data
+
         response = self._client.request(
             url=f"{self._base_url}/{server.id}/actions/rebuild",
             method="POST",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud/storage_box_types/client.py 
new/hcloud-2.16.0/hcloud/storage_box_types/client.py
--- old/hcloud-2.13.0/hcloud/storage_box_types/client.py        2025-12-19 
16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/hcloud/storage_box_types/client.py        2026-01-23 
13:10:20.000000000 +0100
@@ -31,9 +31,6 @@
     A client for the Storage Box Types API.
 
     See https://docs.hetzner.cloud/reference/hetzner#storage-box-types.
-
-    Experimental:
-        Storage Box support is experimental, breaking changes may occur within 
minor releases.
     """
 
     _base_url = "/storage_box_types"
@@ -49,9 +46,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-types-get-a-storage-box-type
 
         :param id: ID of the Storage Box Type.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         response = self._client.request(
             method="GET",
@@ -66,9 +60,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-types-list-storage-box-types
 
         :param name: Name of the Storage Box Type.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._get_first_by(self.get_list, name=name)
 
@@ -86,9 +77,6 @@
         :param name: Name of the Storage Box Type.
         :param page: Page number to return.
         :param per_page: Maximum number of entries returned per page.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         params: dict[str, Any] = {}
         if name is not None:
@@ -120,9 +108,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-types-list-storage-box-types
 
         :param name: Name of the Storage Box Type.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._iter_pages(
             self.get_list,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud/storage_boxes/client.py 
new/hcloud-2.16.0/hcloud/storage_boxes/client.py
--- old/hcloud-2.13.0/hcloud/storage_boxes/client.py    2025-12-19 
16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/hcloud/storage_boxes/client.py    2026-01-23 
13:10:20.000000000 +0100
@@ -98,9 +98,6 @@
         :param sort: Sort Actions by field and direction.
         :param page: Page number to get.
         :param per_page: Maximum number of Actions returned per page.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_actions_list(
             self,
@@ -123,9 +120,6 @@
 
         :param status: Filter the actions by status. The response will only 
contain actions matching the specified statuses.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_actions(
             self,
@@ -146,9 +140,6 @@
 
         :param name: Name of the Storage Box.
         :param labels: User-defined labels (key/value pairs) for the Storage 
Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.update(
             self,
@@ -161,9 +152,6 @@
         Deletes a Storage Box.
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-boxes-delete-a-storage-box
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.delete(self)
 
@@ -180,9 +168,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-boxes-list-folders-of-a-storage-box
 
         :param path: Relative path to list the folders from.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_folders(
             self,
@@ -200,9 +185,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-change-protection
 
         :param delete: Prevents the Storage Box from being deleted.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.change_protection(
             self,
@@ -219,9 +201,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-change-type
 
         :param storage_box_type: Storage Box Type to change to.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.change_type(
             self,
@@ -238,9 +217,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-reset-password
 
         :param password: New password.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.reset_password(
             self,
@@ -257,9 +233,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-update-access-settings
 
         :param access_settings: New access settings for the Storage Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.update_access_settings(
             self,
@@ -276,9 +249,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-rollback-snapshot
 
         :param snapshot: Snapshot to rollback to.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.rollback_snapshot(
             self,
@@ -292,9 +262,6 @@
         Disable the snapshot plan of a Storage Box.
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-disable-snapshot-plan
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.disable_snapshot_plan(self)
 
@@ -308,9 +275,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-enable-snapshot-plan
 
         :param snapshot_plan: Snapshot Plan to enable.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.enable_snapshot_plan(
             self,
@@ -330,9 +294,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-snapshots-get-a-snapshot
 
         :param id: ID of the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_snapshot_by_id(self, id=id)
 
@@ -346,9 +307,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-snapshots-list-snapshots
 
         :param name: Name of the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_snapshot_by_name(self, name=name)
 
@@ -369,9 +327,6 @@
         :param is_automatic: Filter wether the snapshot was made by a Snapshot 
Plan.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_snapshot_list(
             self,
@@ -398,9 +353,6 @@
         :param is_automatic: Filter whether the snapshot was made by a 
Snapshot Plan.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_snapshot_all(
             self,
@@ -423,9 +375,6 @@
 
         :param description: Description of the Snapshot.
         :param labels: User-defined labels (key/value pairs) for the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.create_snapshot(
             self,
@@ -446,12 +395,22 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-get-a-subaccount
 
         :param id: ID of the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_subaccount_by_id(self, id=id)
 
+    def get_subaccount_by_name(
+        self,
+        name: str,
+    ) -> BoundStorageBoxSubaccount | None:
+        """
+        Returns a single Subaccount from a Storage Box.
+
+        See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
+
+        :param name: Name of the Subaccount.
+        """
+        return self._client.get_subaccount_by_name(self, name=name)
+
     def get_subaccount_by_username(
         self,
         username: str,
@@ -462,15 +421,13 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
 
         :param username: User name of the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_subaccount_by_username(self, username=username)
 
     def get_subaccount_list(
         self,
         *,
+        name: str | None = None,
         username: str | None = None,
         label_selector: str | None = None,
         sort: list[str] | None = None,
@@ -480,15 +437,14 @@
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
 
+        :param name: Filter resources by their name. The response will only 
contain the resources matching exactly the specified name.
         :param username: Filter resources by their username. The response will 
only contain the resources matching exactly the specified username.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_subaccount_list(
             self,
+            name=name,
             username=username,
             label_selector=label_selector,
             sort=sort,
@@ -497,6 +453,7 @@
     def get_subaccount_all(
         self,
         *,
+        name: str | None = None,
         username: str | None = None,
         label_selector: str | None = None,
         sort: list[str] | None = None,
@@ -506,15 +463,14 @@
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
 
+        :param name: Filter resources by their name. The response will only 
contain the resources matching exactly the specified name.
         :param username: Filter resources by their username. The response will 
only contain the resources matching exactly the specified username.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.get_subaccount_all(
             self,
+            name=name,
             username=username,
             label_selector=label_selector,
             sort=sort,
@@ -523,6 +479,7 @@
     def create_subaccount(
         self,
         *,
+        name: str | None = None,
         home_directory: str,
         password: str,
         access_settings: StorageBoxSubaccountAccessSettings | None = None,
@@ -535,17 +492,16 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-create-a-subaccount
 
         :param storage_box: Storage Box to create a Subaccount for.
+        :param name: Name of the Subaccount.
         :param home_directory: Home directory of the Subaccount.
         :param password: Password of the Subaccount.
         :param access_settings: Access settings of the Subaccount.
         :param description: Description of the Subaccount.
         :param labels: User-defined labels (key/value pairs) for the 
Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.create_subaccount(
             self,
+            name=name,
             home_directory=home_directory,
             password=password,
             access_settings=access_settings,
@@ -598,9 +554,6 @@
 
         :param description: Description of the Snapshot.
         :param labels: User-defined labels (key/value pairs) for the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.update_snapshot(
             self,
@@ -615,9 +568,6 @@
         Deletes a Storage Box Snapshot.
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-snapshots-delete-a-snapshot
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.delete_snapshot(self)
 
@@ -658,6 +608,7 @@
     def update(
         self,
         *,
+        name: str | None = None,
         description: str | None = None,
         labels: dict[str, str] | None = None,
     ) -> BoundStorageBoxSubaccount:
@@ -666,14 +617,13 @@
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-update-a-subaccount
 
+        :param name: Name of the Subaccount.
         :param description: Description of the Subaccount.
         :param labels: User-defined labels (key/value pairs) for the 
Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.update_subaccount(
             self,
+            name=name,
             description=description,
             labels=labels,
         )
@@ -685,9 +635,6 @@
         Deletes a Storage Box Subaccount.
 
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-delete-a-subaccount
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.delete_subaccount(self)
 
@@ -701,9 +648,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccount-actions-change-home-directory
 
         :param home_directory: Home directory for the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.change_subaccount_home_directory(
             self, home_directory=home_directory
@@ -720,8 +664,6 @@
 
         :param password: Password for the Subaccount.
 
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.reset_subaccount_password(self, password=password)
 
@@ -735,9 +677,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccount-actions-update-access-settings
 
         :param access_settings: Access settings for the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._client.update_subaccount_access_settings(
             self,
@@ -768,9 +707,6 @@
     A client for the Storage Boxes API.
 
     See https://docs.hetzner.cloud/reference/hetzner#storage-boxes.
-
-    Experimental:
-        Storage Box support is experimental, breaking changes may occur within 
minor releases.
     """
 
     _base_url = "/storage_boxes"
@@ -793,9 +729,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-boxes-get-a-storage-box
 
         :param id: ID of the Storage Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         response = self._client.request(
             method="GET",
@@ -810,9 +743,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-boxes-list-storage-boxes
 
         :param name: Name of the Storage Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._get_first_by(self.get_list, name=name)
 
@@ -835,9 +765,6 @@
         :param sort: Sort resources by field and direction.
         :param page: Page number to return.
         :param per_page: Maximum number of entries returned per page.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         params: dict[str, Any] = {}
         if name is not None:
@@ -876,9 +803,6 @@
         :param name: Name of the Storage Box.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._iter_pages(
             self.get_list,
@@ -910,9 +834,6 @@
         :param ssh_keys: SSH public keys of the Storage Box.
         :param access_settings: Access settings of the Storage Box.
         :param labels: User-defined labels (key/value pairs) for the Storage 
Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {
             "name": name,
@@ -956,9 +877,6 @@
         :param storage_box: Storage Box to update.
         :param name: Name of the Storage Box.
         :param labels: User-defined labels (key/value pairs) for the Storage 
Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {}
         if name is not None:
@@ -984,9 +902,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-boxes-delete-a-storage-box
 
         :param storage_box: Storage Box to delete.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         response = self._client.request(
             method="DELETE",
@@ -1012,9 +927,6 @@
 
         :param storage_box: Storage Box to list the folders from.
         :param path: Relative path to list the folders from.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         params: dict[str, Any] = {}
         if path is not None:
@@ -1047,9 +959,6 @@
         :param sort: Sort Actions by field and direction.
         :param page: Page number to get.
         :param per_page: Maximum number of Actions returned per page.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._get_actions_list(
             f"{self._base_url}/{storage_box.id}",
@@ -1074,9 +983,6 @@
         :param storage_box: Storage Box to get the Actions for.
         :param status: Filter the actions by status. The response will only 
contain actions matching the specified statuses.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._iter_pages(
             self.get_actions_list,
@@ -1098,9 +1004,6 @@
 
         :param storage_box: Storage Box to update.
         :param delete: Prevents the Storage Box from being deleted.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {}
         if delete is not None:
@@ -1125,9 +1028,6 @@
 
         :param storage_box: Storage Box to update.
         :param storage_box_type: Storage Box Type to change to.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {
             "storage_box_type": storage_box_type.id_or_name,
@@ -1152,9 +1052,6 @@
 
         :param storage_box: Storage Box to update.
         :param password: New password.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {
             "password": password,
@@ -1179,9 +1076,6 @@
 
         :param storage_box: Storage Box to update.
         :param access_settings: New access settings for the Storage Box.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = access_settings.to_payload()
 
@@ -1204,9 +1098,6 @@
 
         :param storage_box: Storage Box to update.
         :param snapshot: Snapshot to rollback to.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {
             "snapshot": snapshot.id_or_name,
@@ -1229,9 +1120,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-actions-disable-snapshot-plan
 
         :param storage_box: Storage Box to update.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         response = self._client.request(
             method="POST",
@@ -1251,9 +1139,6 @@
 
         :param storage_box: Storage Box to update.
         :param snapshot_plan: Snapshot Plan to enable.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = snapshot_plan.to_payload()
 
@@ -1279,9 +1164,6 @@
 
         :param storage_box: Storage Box to get the Snapshot from.
         :param id: ID of the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         response = self._client.request(
             method="GET",
@@ -1301,9 +1183,6 @@
 
         :param storage_box: Storage Box to get the Snapshot from.
         :param name: Name of the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._get_first_by(self.get_snapshot_list, storage_box, 
name=name)
 
@@ -1326,9 +1205,6 @@
         :param is_automatic: Filter whether the snapshot was made by a 
Snapshot Plan.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         params: dict[str, Any] = {}
         if name is not None:
@@ -1371,9 +1247,6 @@
         :param is_automatic: Filter whether the snapshot was made by a 
Snapshot Plan.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         # The endpoint does not have pagination, forward to the list method.
         result, _ = self.get_snapshot_list(
@@ -1400,9 +1273,6 @@
         :param storage_box: Storage Box to create a Snapshot from.
         :param description: Description of the Snapshot.
         :param labels: User-defined labels (key/value pairs) for the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {}
         if description is not None:
@@ -1440,9 +1310,6 @@
         :param snapshot: Storage Box Snapshot to update.
         :param description: Description of the Snapshot.
         :param labels: User-defined labels (key/value pairs) for the Snapshot.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if snapshot.storage_box is None:
             raise ValueError("snapshot storage_box property is none")
@@ -1470,9 +1337,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-snapshots-delete-a-snapshot
 
         :param snapshot: Storage Box Snapshot to delete.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if snapshot.storage_box is None:
             raise ValueError("snapshot storage_box property is none")
@@ -1500,9 +1364,6 @@
 
         :param storage_box: Storage Box to get the Subaccount from.
         :param id: ID of the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         response = self._client.request(
             method="GET",
@@ -1510,6 +1371,25 @@
         )
         return BoundStorageBoxSubaccount(self, response["subaccount"])
 
+    def get_subaccount_by_name(
+        self,
+        storage_box: StorageBox | BoundStorageBox,
+        name: str,
+    ) -> BoundStorageBoxSubaccount | None:
+        """
+        Returns a single Subaccount from a Storage Box.
+
+        See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
+
+        :param storage_box: Storage Box to get the Subaccount from.
+        :param name: Name of the Subaccount.
+        """
+        return self._get_first_by(
+            self.get_subaccount_list,
+            storage_box,
+            name=name,
+        )
+
     def get_subaccount_by_username(
         self,
         storage_box: StorageBox | BoundStorageBox,
@@ -1522,9 +1402,6 @@
 
         :param storage_box: Storage Box to get the Subaccount from.
         :param username: User name of the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         return self._get_first_by(
             self.get_subaccount_list,
@@ -1536,6 +1413,7 @@
         self,
         storage_box: StorageBox | BoundStorageBox,
         *,
+        name: str | None = None,
         username: str | None = None,
         label_selector: str | None = None,
         sort: list[str] | None = None,
@@ -1546,14 +1424,14 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
 
         :param storage_box: Storage Box to get the Subaccount from.
+        :param name: Filter resources by their name. The response will only 
contain the resources matching exactly the specified name.
         :param username: Filter resources by their username. The response will 
only contain the resources matching exactly the specified username.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         params: dict[str, Any] = {}
+        if name is not None:
+            params["name"] = name
         if username is not None:
             params["username"] = username
         if label_selector is not None:
@@ -1578,6 +1456,7 @@
         self,
         storage_box: StorageBox | BoundStorageBox,
         *,
+        name: str | None = None,
         username: str | None = None,
         label_selector: str | None = None,
         sort: list[str] | None = None,
@@ -1588,16 +1467,15 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-list-subaccounts
 
         :param storage_box: Storage Box to get the Subaccount from.
+        :param name: Filter resources by their name. The response will only 
contain the resources matching exactly the specified name.
         :param username: Filter resources by their username. The response will 
only contain the resources matching exactly the specified username.
         :param label_selector: Filter resources by labels. The response will 
only contain resources matching the label selector.
         :param sort: Sort resources by field and direction.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         # The endpoint does not have pagination, forward to the list method.
         result, _ = self.get_subaccount_list(
             storage_box,
+            name=name,
             username=username,
             label_selector=label_selector,
             sort=sort,
@@ -1608,6 +1486,7 @@
         self,
         storage_box: StorageBox | BoundStorageBox,
         *,
+        name: str | None = None,
         home_directory: str,
         password: str,
         access_settings: StorageBoxSubaccountAccessSettings | None = None,
@@ -1620,19 +1499,19 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-create-a-subaccount
 
         :param storage_box: Storage Box to create a Subaccount for.
+        :param name: Name of the Subaccount.
         :param home_directory: Home directory of the Subaccount.
         :param password: Password of the Subaccount.
         :param access_settings: Access settings of the Subaccount.
         :param description: Description of the Subaccount.
         :param labels: User-defined labels (key/value pairs) for the 
Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         data: dict[str, Any] = {
             "home_directory": home_directory,
             "password": password,
         }
+        if name is not None:
+            data["name"] = name
         if access_settings is not None:
             data["access_settings"] = access_settings.to_payload()
         if description is not None:
@@ -1659,6 +1538,7 @@
         self,
         subaccount: StorageBoxSubaccount | BoundStorageBoxSubaccount,
         *,
+        name: str | None = None,
         description: str | None = None,
         labels: dict[str, str] | None = None,
     ) -> BoundStorageBoxSubaccount:
@@ -1668,16 +1548,16 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-update-a-subaccount
 
         :param subaccount: Storage Box Subaccount to update.
+        :param name: Name of the Subaccount.
         :param description: Description of the Subaccount.
         :param labels: User-defined labels (key/value pairs) for the 
Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if subaccount.storage_box is None:
             raise ValueError("subaccount storage_box property is none")
 
         data: dict[str, Any] = {}
+        if name is not None:
+            data["name"] = name
         if description is not None:
             data["description"] = description
         if labels is not None:
@@ -1700,9 +1580,6 @@
         See 
https://docs.hetzner.cloud/reference/hetzner#storage-box-subaccounts-delete-a-subaccount
 
         :param subaccount: Storage Box Subaccount to delete.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if subaccount.storage_box is None:
             raise ValueError("subaccount storage_box property is none")
@@ -1727,9 +1604,6 @@
 
         :param subaccount: Storage Box Subaccount to update.
         :param home_directory: Home directory for the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if subaccount.storage_box is None:
             raise ValueError("subaccount storage_box property is none")
@@ -1757,9 +1631,6 @@
 
         :param subaccount: Storage Box Subaccount to update.
         :param password: Password for the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if subaccount.storage_box is None:
             raise ValueError("subaccount storage_box property is none")
@@ -1787,9 +1658,6 @@
 
         :param subaccount: Storage Box Subaccount to update.
         :param access_settings: Access settings for the Subaccount.
-
-        Experimental:
-            Storage Box support is experimental, breaking changes may occur 
within minor releases.
         """
         if subaccount.storage_box is None:
             raise ValueError("subaccount storage_box property is none")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud/storage_boxes/domain.py 
new/hcloud-2.16.0/hcloud/storage_boxes/domain.py
--- old/hcloud-2.13.0/hcloud/storage_boxes/domain.py    2025-12-19 
16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/hcloud/storage_boxes/domain.py    2026-01-23 
13:10:20.000000000 +0100
@@ -373,6 +373,7 @@
 
     __api_properties__ = (
         "id",
+        "name",
         "username",
         "description",
         "server",
@@ -387,6 +388,7 @@
     def __init__(
         self,
         id: int | None = None,
+        name: str | None = None,
         username: str | None = None,
         description: str | None = None,
         server: str | None = None,
@@ -397,6 +399,7 @@
         created: str | None = None,
     ):
         self.id = id
+        self.name = name
         self.username = username
         self.description = description
         self.server = server
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud.egg-info/PKG-INFO 
new/hcloud-2.16.0/hcloud.egg-info/PKG-INFO
--- old/hcloud-2.13.0/hcloud.egg-info/PKG-INFO  2025-12-19 16:38:04.000000000 
+0100
+++ new/hcloud-2.16.0/hcloud.egg-info/PKG-INFO  2026-01-23 13:10:28.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: hcloud
-Version: 2.13.0
+Version: 2.16.0
 Summary: Official Hetzner Cloud python library
 Home-page: https://github.com/hetznercloud/hcloud-python
 Author: Hetzner Cloud GmbH
@@ -26,9 +26,9 @@
 Requires-Dist: python-dateutil>=2.7.5
 Requires-Dist: requests>=2.20
 Provides-Extra: docs
-Requires-Dist: sphinx<8.3,>=8; extra == "docs"
-Requires-Dist: sphinx-rtd-theme<3.1,>=3; extra == "docs"
-Requires-Dist: myst-parser<4.1,>=4; extra == "docs"
+Requires-Dist: sphinx<9.2,>=9; extra == "docs"
+Requires-Dist: sphinx-rtd-theme<3.2,>=3; extra == "docs"
+Requires-Dist: myst-parser<5.1,>=5; extra == "docs"
 Requires-Dist: watchdog<6.1,>=6; extra == "docs"
 Provides-Extra: test
 Requires-Dist: coverage<7.14,>=7.13; extra == "test"
@@ -89,7 +89,11 @@
 from hcloud.images import Image
 from hcloud.server_types import ServerType
 
-client = Client(token="{YOUR_API_TOKEN}")  # Please paste your API token here
+client = Client(
+    token="{YOUR_API_TOKEN}", # Please paste your API token here
+    application_name="my-app",
+    application_version="v1.0.0",
+)
 
 # Create a server named my-server
 response = client.servers.create(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/hcloud.egg-info/requires.txt 
new/hcloud-2.16.0/hcloud.egg-info/requires.txt
--- old/hcloud-2.13.0/hcloud.egg-info/requires.txt      2025-12-19 
16:38:04.000000000 +0100
+++ new/hcloud-2.16.0/hcloud.egg-info/requires.txt      2026-01-23 
13:10:28.000000000 +0100
@@ -2,9 +2,9 @@
 requests>=2.20
 
 [docs]
-sphinx<8.3,>=8
-sphinx-rtd-theme<3.1,>=3
-myst-parser<4.1,>=4
+sphinx<9.2,>=9
+sphinx-rtd-theme<3.2,>=3
+myst-parser<5.1,>=5
 watchdog<6.1,>=6
 
 [test]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hcloud-2.13.0/setup.py new/hcloud-2.16.0/setup.py
--- old/hcloud-2.13.0/setup.py  2025-12-19 16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/setup.py  2026-01-23 13:10:20.000000000 +0100
@@ -7,7 +7,7 @@
 
 setup(
     name="hcloud",
-    version="2.13.0",  # x-releaser-pleaser-version
+    version="2.16.0",  # x-releaser-pleaser-version
     keywords="hcloud hetzner cloud",
     description="Official Hetzner Cloud python library",
     long_description=readme,
@@ -40,9 +40,9 @@
     ],
     extras_require={
         "docs": [
-            "sphinx>=8,<8.3",
-            "sphinx-rtd-theme>=3,<3.1",
-            "myst-parser>=4,<4.1",
+            "sphinx>=9,<9.2",
+            "sphinx-rtd-theme>=3,<3.2",
+            "myst-parser>=5,<5.1",
             "watchdog>=6,<6.1",
         ],
         "test": [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hcloud-2.13.0/tests/unit/storage_boxes/test_client.py 
new/hcloud-2.16.0/tests/unit/storage_boxes/test_client.py
--- old/hcloud-2.13.0/tests/unit/storage_boxes/test_client.py   2025-12-19 
16:37:56.000000000 +0100
+++ new/hcloud-2.16.0/tests/unit/storage_boxes/test_client.py   2026-01-23 
13:10:20.000000000 +0100
@@ -78,6 +78,7 @@
         BoundStorageBox.create_subaccount,
         BoundStorageBox.get_subaccount_all,
         BoundStorageBox.get_subaccount_by_id,
+        BoundStorageBox.get_subaccount_by_name,
         BoundStorageBox.get_subaccount_by_username,
         BoundStorageBox.get_subaccount_list,
     ]
@@ -899,9 +900,28 @@
 
         assert_bound_storage_box_subaccount(result, resource_client)
 
+    def test_get_subaccount_by_name(
+        self,
+        request_mock: mock.MagicMock,
+        resource_client: StorageBoxesClient,
+        storage_box_subaccount1,
+    ):
+        request_mock.return_value = {"subaccounts": [storage_box_subaccount1]}
+
+        result = resource_client.get_subaccount_by_name(StorageBox(42), 
"subaccount1")
+
+        request_mock.assert_called_with(
+            method="GET",
+            url="/storage_boxes/42/subaccounts",
+            params={"name": "subaccount1"},
+        )
+
+        assert_bound_storage_box_subaccount(result, resource_client)
+
     @pytest.mark.parametrize(
         "params",
         [
+            {"name": "subaccount1"},
             {"username": "u42-sub1"},
             {"label_selector": "key=value"},
             # {"page": 1, "per_page": 10}  # No pagination
@@ -950,6 +970,7 @@
     @pytest.mark.parametrize(
         "params",
         [
+            {"name": "subaccount1"},
             {"username": "u42-sub1"},
             {"label_selector": "key=value"},
             {"sort": ["id:asc"]},
@@ -1029,6 +1050,7 @@
 
         result = resource_client.create_subaccount(
             StorageBox(42),
+            name="subaccount1",
             home_directory="tmp",
             password="secret",
             access_settings=StorageBoxSubaccountAccessSettings(
@@ -1044,6 +1066,7 @@
             method="POST",
             url="/storage_boxes/42/subaccounts",
             json={
+                "name": "subaccount1",
                 "home_directory": "tmp",
                 "password": "secret",
                 "access_settings": {

Reply via email to