@@ -135,7 +135,8 @@ async def create_rule(
135135 )
136136 conditions_request = [
137137 UpdateConditionRequest (
138- expression = expression_proto , actions = [create .action ._to_update_request ()]
138+ expression = expression_proto ,
139+ actions = [create .action ._to_update_request ()],
139140 )
140141 ]
141142 update_request = UpdateRuleRequest (
@@ -183,9 +184,7 @@ def _update_rule_request_from_update(
183184 "asset_tag_ids" ,
184185 ]
185186 # Need to manually copy fields that will be reset even if not provided in update dict.
186- copy_unset_fields = [
187- "description" ,
188- ]
187+ copy_unset_fields = ["description" , "name" ]
189188
190189 # Populate the trivial fields first.
191190 update_dict .update (
@@ -214,15 +213,17 @@ def _update_rule_request_from_update(
214213 "Expression and channel_references must both be provided or both be None"
215214 )
216215 expression_proto = RuleConditionExpression (
217- calculated_channel = CalculatedChannelConfig (
218- expression = expression ,
219- channel_references = {
220- c .channel_reference : ChannelReferenceProto (name = c .channel_identifier )
221- for c in channel_references
222- },
216+ calculated_channel = (
217+ CalculatedChannelConfig (
218+ expression = expression ,
219+ channel_references = {
220+ c .channel_reference : ChannelReferenceProto (name = c .channel_identifier )
221+ for c in channel_references
222+ },
223+ )
224+ if expression
225+ else None
223226 )
224- if expression
225- else None
226227 )
227228 conditions_request = [
228229 UpdateConditionRequest (
@@ -238,10 +239,10 @@ def _update_rule_request_from_update(
238239
239240 # This always needs to be set, so handle the defaults.
240241 update_dict ["asset_configuration" ] = RuleAssetConfiguration ( # type: ignore
241- asset_ids = update .asset_ids if "asset_ids" in model_dump else rule .asset_ids or [],
242- tag_ids = update . asset_tag_ids
243- if "asset_tag_ids" in model_dump
244- else rule . asset_tag_ids or [] ,
242+ asset_ids = ( update .asset_ids if "asset_ids" in model_dump else rule .asset_ids or []) ,
243+ tag_ids = (
244+ update . asset_tag_ids if "asset_tag_ids" in model_dump else rule . asset_tag_ids or []
245+ ) ,
245246 )
246247
247248 update_request = UpdateRuleRequest (
@@ -254,7 +255,7 @@ def _update_rule_request_from_update(
254255 async def update_rule (
255256 self , rule : Rule , update : RuleUpdate , version_notes : str | None = None
256257 ) -> Rule :
257- """Update a rule.
258+ """Update a rule. Also handles archive/unarchive to behave similar to other low-level clients.
258259
259260 Args:
260261 rule: The rule to update.
@@ -264,14 +265,26 @@ async def update_rule(
264265 Returns:
265266 The updated Rule.
266267 """
268+
269+ should_update_archive = "is_archived" in update .model_fields_set
270+
267271 update .resource_id = rule .id_
272+ if not should_update_archive or (
273+ should_update_archive and len (update .model_fields_set ) > 1
274+ ):
275+ update_request = self ._update_rule_request_from_update (rule , update , version_notes )
276+
277+ response = await self ._grpc_client .get_stub (RuleServiceStub ).UpdateRule (update_request )
278+ _ = cast ("UpdateRuleResponse" , response )
268279
269- update_request = self ._update_rule_request_from_update (rule , update , version_notes )
280+ if should_update_archive :
281+ if update .is_archived :
282+ await self .archive_rule (rule_id = rule .id_ )
283+ else :
284+ await self .unarchive_rule (rule_id = rule .id_ )
270285
271- response = await self ._grpc_client .get_stub (RuleServiceStub ).UpdateRule (update_request )
272- updated_grpc_rule = cast ("UpdateRuleResponse" , response )
273286 # Get the updated rule
274- return await self .get_rule (rule_id = updated_grpc_rule . rule_id )
287+ return await self .get_rule (rule_id = rule . id_ )
275288
276289 async def batch_update_rules (self , rules : list [RuleUpdate ]) -> BatchUpdateRulesResponse :
277290 """Batch update rules.
0 commit comments