11from __future__ import annotations
22
3+ import warnings
34from typing import TYPE_CHECKING , Any , Sequence
45
56from sift_client ._internal .low_level_wrappers .rules import RulesLowLevelClient
7+ from sift_client .errors import SiftWarning
68from sift_client .resources ._base import ResourceBase
79from sift_client .sift_types .asset import Asset
810from sift_client .sift_types .rule import Rule , RuleCreate , RuleUpdate
@@ -177,10 +179,13 @@ async def create(
177179 create: A RuleCreate object, a dictionary with configuration for the new rule, or a list of the previously mentioned objects.
178180 override_expression_validation: When true, the rule will be created even if the expression is invalid.
179181
182+ Warnings:
183+ SiftWarning: If not all rules are created.
184+
180185 Returns:
181186 The created Rule (if a single dictionary or RuleCreate was provided) otherwise a list of the created rules.
182187 """
183- rules : list [RuleCreate | RuleUpdate ] = []
188+ rules : list [RuleCreate ] = []
184189 if isinstance (create , Sequence ):
185190 for c in create :
186191 if isinstance (c , dict ):
@@ -192,16 +197,18 @@ async def create(
192197 else :
193198 rules .append (create )
194199
195- created_rules = await self .batch_update_rules (
200+ created_rules = await self .batch_update_or_create_rules (
196201 rules = rules , override_expression_validation = override_expression_validation
197202 )
198203 if len (created_rules ) != len (rules ):
199- raise ValueError (
200- f"Failed to create all rules: got { len (created_rules )} but expected { len (rules )} "
204+ warnings .warn (
205+ f"Failed to create all rules: got { len (created_rules )} but expected { len (rules )} " ,
206+ SiftWarning ,
207+ stacklevel = 2 ,
201208 )
202209
203210 # If there is only one rule to create provided as a dict or RuleCreate, return the single rule.
204- if len (created_rules ) == 1 and not isinstance (create , list ):
211+ if len (created_rules ) == 1 and not isinstance (create , Sequence ):
205212 return created_rules [0 ]
206213
207214 # Otherwise, return the list of created rules.
@@ -260,7 +267,7 @@ async def unarchive(self, rule: str | Rule) -> Rule:
260267 """
261268 return await self .update (rule = rule , update = RuleUpdate (is_archived = False ))
262269
263- async def batch_update_rules (
270+ async def batch_update_or_create_rules (
264271 self ,
265272 rules : Sequence [RuleCreate | RuleUpdate ],
266273 * ,
@@ -272,6 +279,9 @@ async def batch_update_rules(
272279 rules: List of rule creates or updates to apply. RuleUpdate objects must have resource_id set.
273280 override_expression_validation: When true, the rules will be created even if the expressions are invalid.
274281
282+ Warnings:
283+ UserWarning: If not all rules are created or updated.
284+
275285 Returns:
276286 List of updated or created Rules.
277287
@@ -300,9 +310,10 @@ async def batch_update_rules(
300310
301311 # Ensure all rules were updated/created.
302312 if response .rules_created_count + response .rules_updated_count != len (rules ):
303- raise ValueError (
304- f"Not all rules were updated/created: got { response .rules_created_count + response .rules_updated_count } "
305- f"but expected { len (rules )} "
313+ warnings .warn (
314+ f"Not all rules were updated/created: got { response .rules_created_count + response .rules_updated_count } but expected { len (rules )} " ,
315+ SiftWarning ,
316+ stacklevel = 2 ,
306317 )
307318
308319 # Collect rule IDs from the response
0 commit comments