11from __future__ import annotations
22
33from datetime import timedelta
4- from enum import Enum
5- from typing import TYPE_CHECKING , Any
4+ from enum import Enum , StrEnum
5+ from typing import TYPE_CHECKING , Any , TypeVar
66
77from prefect .events .actions import RunDeployment
88from prefect .events .schemas .automations import Automation , Posture
1818if TYPE_CHECKING :
1919 from uuid import UUID
2020
21+ T = TypeVar ("T" , bound = "TriggerDefinition" )
22+
23+
24+ class TriggerComparison (StrEnum ):
25+ MATCH = "match" # Expected trigger and actual trigger is identical
26+ REFRESH = "refresh" # The branch parameters doesn't match, the hash does, refresh in Prefect but don't run triggers
27+ UPDATE = "update" # Neither branch or other data points match, update in Prefect and run triggers
28+
29+ @property
30+ def update_prefect (self ) -> bool :
31+ return self in {TriggerComparison .REFRESH , TriggerComparison .UPDATE }
32+
2133
2234class TriggerSetupReport (BaseModel ):
2335 created : list [TriggerDefinition ] = Field (default_factory = list )
36+ refreshed : list [TriggerDefinition ] = Field (default_factory = list )
2437 updated : list [TriggerDefinition ] = Field (default_factory = list )
2538 deleted : list [Automation ] = Field (default_factory = list )
2639 unchanged : list [TriggerDefinition ] = Field (default_factory = list )
2740
2841 @property
2942 def in_use_count (self ) -> int :
30- return len (self .created + self .updated + self .unchanged )
43+ return len (self .created + self .updated + self .unchanged + self .refreshed )
44+
45+ def add_with_comparison (self , trigger : TriggerDefinition , comparison : TriggerComparison ) -> None :
46+ match comparison :
47+ case TriggerComparison .UPDATE :
48+ self .updated .append (trigger )
49+ case TriggerComparison .REFRESH :
50+ self .refreshed .append (trigger )
51+ case TriggerComparison .MATCH :
52+ self .unchanged .append (trigger )
53+
54+ def _created_triggers_with_type (self , trigger_type : type [T ]) -> list [T ]:
55+ return [trigger for trigger in self .created if isinstance (trigger , trigger_type )]
56+
57+ def _refreshed_triggers_with_type (self , trigger_type : type [T ]) -> list [T ]:
58+ return [trigger for trigger in self .refreshed if isinstance (trigger , trigger_type )]
59+
60+ def _unchanged_triggers_with_type (self , trigger_type : type [T ]) -> list [T ]:
61+ return [trigger for trigger in self .unchanged if isinstance (trigger , trigger_type )]
62+
63+ def _updated_triggers_with_type (self , trigger_type : type [T ]) -> list [T ]:
64+ return [trigger for trigger in self .updated if isinstance (trigger , trigger_type )]
65+
66+ def triggers_with_type (self , trigger_type : type [T ]) -> list [T ]:
67+ """Return all triggers that match the specified type.
68+
69+ Args:
70+ trigger_type: A TriggerDefinition class or subclass to filter by
71+
72+ Returns:
73+ List of triggers of the specified type from all categories
74+ """
75+ created = self ._created_triggers_with_type (trigger_type = trigger_type )
76+ updated = self ._updated_triggers_with_type (trigger_type = trigger_type )
77+ refreshed = self ._refreshed_triggers_with_type (trigger_type = trigger_type )
78+ unchanged = self ._unchanged_triggers_with_type (trigger_type = trigger_type )
79+ return created + updated + refreshed + unchanged
80+
81+ def modified_triggers_with_type (self , trigger_type : type [T ]) -> list [T ]:
82+ """Return all created and updated triggers that match the specified type.
83+
84+ Args:
85+ trigger_type: A TriggerDefinition class or subclass to filter by
86+
87+ Returns:
88+ List of triggers of the specified type from both created and updated lists
89+ """
90+ created = self ._created_triggers_with_type (trigger_type = trigger_type )
91+ updated = self ._updated_triggers_with_type (trigger_type = trigger_type )
92+ return created + updated
3193
3294
3395class TriggerType (str , Enum ):
@@ -41,6 +103,16 @@ class TriggerType(str, Enum):
41103 HUMAN_FRIENDLY_ID = "human_friendly_id"
42104 # OBJECT = "object"
43105
106+ @property
107+ def is_branch_specific (self ) -> bool :
108+ return self in {
109+ TriggerType .COMPUTED_ATTR_JINJA2 ,
110+ TriggerType .COMPUTED_ATTR_PYTHON ,
111+ TriggerType .COMPUTED_ATTR_PYTHON_QUERY ,
112+ TriggerType .DISPLAY_LABEL_JINJA2 ,
113+ TriggerType .HUMAN_FRIENDLY_ID ,
114+ }
115+
44116
45117def _match_related_dict () -> dict :
46118 # Make Mypy happy as match related is a dict[str, Any] | list[dict[str, Any]]
0 commit comments