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": {
