77import sys
88from copy import deepcopy
99from dataclasses import dataclass , field , fields , replace
10- from typing import Callable , Optional , TextIO
10+ from typing import (
11+ Callable ,
12+ Optional ,
13+ TextIO ,
14+ )
1115
1216from databricks .bundles .core import Bundle , Diagnostics , Location , Resources
1317from databricks .bundles .core ._resource_mutator import ResourceMutator
18+ from databricks .bundles .core ._resource_type import _ResourceType
1419from databricks .bundles .core ._transform import _transform
15- from databricks .bundles .jobs import Job
1620
1721__all__ = []
1822
@@ -81,21 +85,23 @@ def _load_resources_from_input(input: dict) -> tuple[Resources, Diagnostics]:
8185 diagnostics = Diagnostics ()
8286
8387 input_resources = input .get ("resources" , {})
84- input_jobs = input_resources .get ("jobs" , {})
8588
86- for resource_name , job_dict in input_jobs .items ():
87- try :
88- job = Job .from_dict (job_dict )
89+ for tpe in _ResourceType .all ():
90+ input_resources = input_resources .get (tpe .plural_name , {})
8991
90- resources .add_job (resource_name , job )
91- except Exception as exc :
92- diagnostics = diagnostics .extend (
93- Diagnostics .from_exception (
94- exc = exc ,
95- summary = "Error while loading job" ,
96- path = ("resources" , "jobs" , resource_name ),
92+ for resource_name , resource_dict in input_resources .items ():
93+ try :
94+ resource = _transform (tpe .resource_type , resource_dict )
95+
96+ resources .add_resource (resource_name = resource_name , resource = resource )
97+ except Exception as exc :
98+ diagnostics = diagnostics .extend (
99+ Diagnostics .from_exception (
100+ exc = exc ,
101+ summary = "Error while loading {tpe.singular_name}" ,
102+ path = ("resources" , tpe .plural_name , resource_name ),
103+ )
97104 )
98- )
99105
100106 return resources , diagnostics
101107
@@ -105,38 +111,56 @@ def _apply_mutators(
105111 resources : Resources ,
106112 mutator_functions : list [ResourceMutator ],
107113) -> tuple [Resources , Diagnostics ]:
108- for resource_name , job in resources .jobs .items ():
114+ diagnostics = Diagnostics ()
115+
116+ for tpe in _ResourceType .all ():
117+ resources , diagnostics = diagnostics .extend_tuple (
118+ _apply_mutators_for_type (bundle , resources , tpe , mutator_functions )
119+ )
120+
121+ return resources , diagnostics
122+
123+
124+ def _apply_mutators_for_type (
125+ bundle : Bundle ,
126+ resources : Resources ,
127+ tpe : _ResourceType ,
128+ mutator_functions : list [ResourceMutator ],
129+ ) -> tuple [Resources , Diagnostics ]:
130+ resources_dict = getattr (resources , tpe .plural_name )
131+
132+ for resource_name , resource in resources_dict .items ():
109133 for mutator in mutator_functions :
110- if mutator .resource_type != Job :
134+ if mutator .resource_type != tpe . resource_type :
111135 continue
112136
113137 location = Location .from_callable (mutator .function )
114138
115139 try :
116140 if _get_num_args (mutator .function ) == 1 :
117- new_job = mutator .function (job )
141+ new_resource = mutator .function (resource )
118142 else :
119143 # defensive copy so that one function doesn't affect another
120- new_job = mutator .function (deepcopy (bundle ), job )
144+ new_resource = mutator .function (deepcopy (bundle ), resource )
121145
122- # mutating job in-place works, but we can't tell when it happens,
146+ # mutating resource in-place works, but we can't tell when it happens,
123147 # so we only update location if new instance is returned
124148
125- if new_job is not job :
149+ if new_resource is not resource :
126150 if location :
127151 resources .add_location (
128- ("resources" , "jobs" , resource_name ), location
152+ ("resources" , tpe . plural_name , resource_name ), location
129153 )
130- resources . jobs [resource_name ] = new_job
131- job = new_job
154+ resources_dict [resource_name ] = new_resource
155+ resource = new_resource
132156 except Exception as exc :
133157 mutator_name = mutator .function .__name__
134158
135159 return resources , Diagnostics .from_exception (
136160 exc = exc ,
137161 summary = f"Failed to apply '{ mutator_name } ' mutator" ,
138162 location = location ,
139- path = ("resources" , "jobs" , resource_name ),
163+ path = ("resources" , tpe . plural_name , resource_name ),
140164 )
141165
142166 return resources , Diagnostics ()
@@ -219,12 +243,19 @@ def _append_resources(bundle: dict, resources: Resources) -> dict:
219243
220244 new_bundle = bundle .copy ()
221245
222- if resources .jobs :
223- new_bundle ["resources" ] = new_bundle .get ("resources" , {})
224- new_bundle ["resources" ]["jobs" ] = new_bundle ["resources" ].get ("jobs" , {})
246+ for tpe in _ResourceType .all ():
247+ resources_dict = getattr (resources , tpe .plural_name )
225248
226- for resource_name , resource in resources .jobs .items ():
227- new_bundle ["resources" ]["jobs" ][resource_name ] = resource .as_dict ()
249+ if resources_dict :
250+ new_bundle ["resources" ] = new_bundle .get ("resources" , {})
251+ new_bundle ["resources" ][tpe .plural_name ] = new_bundle ["resources" ].get (
252+ tpe .plural_name , {}
253+ )
254+
255+ for resource_name , resource in resources_dict .items ():
256+ new_bundle ["resources" ][tpe .plural_name ][resource_name ] = (
257+ resource .as_dict ()
258+ )
228259
229260 return new_bundle
230261
@@ -385,7 +416,7 @@ def _load_resource_mutator(
385416
386417 if instance and not isinstance (instance , ResourceMutator ):
387418 return None , Diagnostics .create_error (
388- f"'{ name } ' in module '{ module_name } ' is not instance of ResourceMutator, did you decorate it with @job_mutator ?" ,
419+ f"'{ name } ' in module '{ module_name } ' is not instance of ResourceMutator, did you decorate it with @<resource_type>_mutator ?" ,
389420 )
390421
391422 return instance , diagnostics
0 commit comments