From 7db8db09c17946d5a8a73ea0c95befe150086fa8 Mon Sep 17 00:00:00 2001 From: Nik Paushkin Date: Sat, 10 Jan 2026 01:04:16 +0200 Subject: [PATCH 1/2] add missed query parms --- packages/kubesdk/pyproject.toml | 2 +- packages/kubesdk/src/kubesdk/client.py | 26 +++++++++++++++++++++++--- uv.lock | 6 +++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/kubesdk/pyproject.toml b/packages/kubesdk/pyproject.toml index 0d63e5a..88a12ed 100644 --- a/packages/kubesdk/pyproject.toml +++ b/packages/kubesdk/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "kubesdk" -version = "0.3.2" +version = "0.3.3" description = "Fast, fully typed Kubernetes client for Python." readme = "README.md" requires-python = ">=3.10" diff --git a/packages/kubesdk/src/kubesdk/client.py b/packages/kubesdk/src/kubesdk/client.py index ca12274..a6f6765 100644 --- a/packages/kubesdk/src/kubesdk/client.py +++ b/packages/kubesdk/src/kubesdk/client.py @@ -82,6 +82,17 @@ class LabelSelectorOp(str, Enum): DoesNotExist = "DoesNotExist" +class ResourceVersionMatch(str, Enum): + NotOlderThan = "NotOlderThan" + Exact = "Exact" + + +class FieldValidation(str, Enum): + Ignore = "Ignore" + Warn = "Warn" + Strict = "Strict" + + @dataclass(kw_only=True, frozen=True) class QueryLabelSelectorRequirement: key: str @@ -142,14 +153,23 @@ class K8sQueryParams: labelSelector: QueryLabelSelector | None = None limit: int | None = None resourceVersion: str | None = None + resourceVersionMatch: ResourceVersionMatch | None = None timeoutSeconds: int | None = None + dryRun: DryRun | None = None + + # create/update/patch/apply options + fieldManager: str | None = None + fieldValidation: FieldValidation | None = None + force: bool | None = None + + # watch watch: bool | None = None allowWatchBookmarks: bool | None = None + sendInitialEvents: bool | None = None + + # delete options gracePeriodSeconds: int | None = None propagationPolicy: PropagationPolicy | None = None - dryRun: DryRun | None = None - fieldManager: str | None = None - force: bool | None = None def to_http_params(self) -> list[tuple[str, str]]: items = [] diff --git a/uv.lock b/uv.lock index c8edabd..ae9f4e4 100644 --- a/uv.lock +++ b/uv.lock @@ -692,7 +692,7 @@ wheels = [ [[package]] name = "kube-models" -version = "0.4.0" +version = "0.4.1" source = { editable = "packages/kube_models" } [package.dev-dependencies] @@ -707,7 +707,7 @@ test = [{ name = "coverage" }] [[package]] name = "kubesdk" -version = "0.3.1" +version = "0.3.2" source = { editable = "packages/kubesdk" } dependencies = [ { name = "aiohttp" }, @@ -743,7 +743,7 @@ test = [ [[package]] name = "kubesdk-cli" -version = "0.3.0" +version = "0.3.1" source = { editable = "packages/kubesdk_cli" } dependencies = [ { name = "datamodel-code-generator", extra = ["http"] }, From da580907052492d2b5ce04feb9437f23ebf4da74 Mon Sep 17 00:00:00 2001 From: Nik Paushkin Date: Sat, 10 Jan 2026 01:13:08 +0200 Subject: [PATCH 2/2] add imports, fix test --- packages/kubesdk/src/kubesdk/__init__.py | 3 +- packages/kubesdk/test/test_client.py | 40 +++++++++++++----------- uv.lock | 2 +- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/packages/kubesdk/src/kubesdk/__init__.py b/packages/kubesdk/src/kubesdk/__init__.py index 57517ff..65d3fae 100644 --- a/packages/kubesdk/src/kubesdk/__init__.py +++ b/packages/kubesdk/src/kubesdk/__init__.py @@ -29,4 +29,5 @@ def format(self, record): from .client import APIRequestProcessingConfig, APIRequestLoggingConfig, DryRun, PropagationPolicy, LabelSelectorOp, \ QueryLabelSelectorRequirement, QueryLabelSelector, FieldSelectorOp, FieldSelectorRequirement, FieldSelector, \ K8sQueryParams, K8sAPIRequestLoggingConfig, get_k8s_resource, create_k8s_resource, update_k8s_resource, \ - delete_k8s_resource, create_or_update_k8s_resource, WatchEventType, K8sResourceEvent, watch_k8s_resources + delete_k8s_resource, create_or_update_k8s_resource, WatchEventType, K8sResourceEvent, watch_k8s_resources, \ + ResourceVersionMatch, FieldValidation diff --git a/packages/kubesdk/test/test_client.py b/packages/kubesdk/test/test_client.py index 1716b7c..d2f8003 100644 --- a/packages/kubesdk/test/test_client.py +++ b/packages/kubesdk/test/test_client.py @@ -3,7 +3,8 @@ # Use package-level import to not miss anything in __init__ from kubesdk import QueryLabelSelector, QueryLabelSelectorRequirement, LabelSelectorOp, \ - FieldSelectorRequirement, FieldSelectorOp, FieldSelector, K8sQueryParams, DryRun, PropagationPolicy + FieldSelectorRequirement, FieldSelectorOp, FieldSelector, K8sQueryParams, DryRun, PropagationPolicy, \ + ResourceVersionMatch, FieldValidation class TestQueryLabelSelector(unittest.TestCase): @@ -115,24 +116,27 @@ def test_basic_scalars_bools_enums(self): dryRun=DryRun.All, fieldManager="manager", force=True, + resourceVersionMatch=ResourceVersionMatch.Exact, + fieldValidation=FieldValidation.Ignore ).to_http_params() - self.assertEqual( - params, - [ - ("pretty", "true"), - ("continue", "token123"), - ("limit", "10"), - ("resourceVersion", "rv1"), - ("timeoutSeconds", "5"), - ("watch", "true"), - ("allowWatchBookmarks", "false"), - ("gracePeriodSeconds", "30"), - ("propagationPolicy", "Foreground"), - ("dryRun", "All"), - ("fieldManager", "manager"), - ("force", "true"), - ], - ) + expected_params = [ + ("pretty", "true"), + ("continue", "token123"), + ("limit", "10"), + ("resourceVersion", "rv1"), + ("timeoutSeconds", "5"), + ("watch", "true"), + ("allowWatchBookmarks", "false"), + ("gracePeriodSeconds", "30"), + ("propagationPolicy", "Foreground"), + ("dryRun", "All"), + ("fieldManager", "manager"), + ("force", "true"), + ("resourceVersionMatch", "Exact"), + ("fieldValidation", "Ignore") + ] + for param in expected_params: + self.assertIn(param, params) def test_field_and_label_selector_objects(self): field_sel = FieldSelector( diff --git a/uv.lock b/uv.lock index ae9f4e4..3c5fa4c 100644 --- a/uv.lock +++ b/uv.lock @@ -707,7 +707,7 @@ test = [{ name = "coverage" }] [[package]] name = "kubesdk" -version = "0.3.2" +version = "0.3.3" source = { editable = "packages/kubesdk" } dependencies = [ { name = "aiohttp" },