@@ -59,6 +59,7 @@ def _setup_deps(deps, tla_code_libraries = {}, ext_code_libraries = {}, transiti
5959 deps: List of deps labels from ctx.attr.deps.
6060 tla_code_libraries: Dict of labels to names from ctx.attr.tla_code_files.
6161 ext_code_libraries: List of deps labels from ctx.attr.ext_code_files.
62+ transitive_extvars: Dict of extvar to values build from _make_extvar_dict
6263
6364 Returns:
6465 Returns a struct containing the following fields:
@@ -69,6 +70,9 @@ def _setup_deps(deps, tla_code_libraries = {}, ext_code_libraries = {}, transiti
6970 short_imports: Depset of Strings containing import flags set by
7071 transitive dependency targets, when invoking Jsonnet as part
7172 of a test where dependencies are stored in runfiles.
73+ transitive_extvars: Dict of extvar to values that has merged the
74+ input value with all extvars of its depdencies.
75+
7276 """
7377 transitive_sources = []
7478 imports = []
@@ -115,42 +119,72 @@ def _make_extvar_dict(
115119
116120 Returns:
117121 Dictionary with keys are variable names, and values a dict containing
118- type: The kind of extvar it is from and maps to a ctx.attr, e.g. string, code, string_file, etc.
122+ type: The type of extvar it will be in jsonnet: string or code
119123 value: The string, code, or File depending on type
120124 sources: List of labels that define the extvar
121125 """
122126 extvars = dict ()
123127 label = str (label )
124- for key , code in ext_code .items ():
125- _make_extvar_dict_update (extvars , "code" , key , code , label )
126- for key in ext_code_envs :
127- _make_extvar_dict_update (extvars , "code_env" , key , None , label )
128- for file , key in ext_code_files .items ():
129- _make_extvar_dict_update (extvars , "code_file" , key , file , label )
130- for file , key in ext_code_libraries .items ():
131- _make_extvar_dict_update (extvars , "code_library" , key , file , label )
132- for key in ext_str_envs :
133- _make_extvar_dict_update (extvars , "string_env" , key , None , label )
134- for val , key in ext_str_files .items ():
135- _make_extvar_dict_update (extvars , "string_file" , key , val , label )
136- for key , val in ext_strs .items ():
128+
129+ # extvar_lists is a list of tuple (extvar: str, value: None | str | File | JsonnetInfo, extvar_type: str)
130+ # The `None` value are used by environment
131+ # Collect all the Code extvars
132+ # ext_code, dict[extvar, str_value]
133+ extvar_code_lists = zip (ext_code .keys (), ext_code .values ())
134+
135+ # ext_code_envs, list[extvar]
136+ extvar_code_lists .extend (zip (ext_code_envs , [None ] * len (ext_code_envs )))
137+
138+ # ext_code_files, dict[label, extvar]
139+ extvar_code_lists .extend (zip (ext_code_files .values (), ext_code_files .keys ()))
140+
141+ # ext_code_libraries, dict[label, extvar]
142+ extvar_code_lists .extend (zip (ext_code_libraries .values (), ext_code_libraries .keys ()))
143+
144+ for key , val in extvar_code_lists :
145+ _make_extvar_dict_update (extvars , "code" , key , val , label )
146+
147+ # Collect all of the String extvars
148+ # ext_str_envs, list[extvar]
149+ extvar_str_lists = zip (ext_str_envs , [None ] * len (ext_str_envs ))
150+
151+ # ext_str_files, dict[label, extvar]
152+ extvar_str_lists .extend (zip (ext_str_files .values (), ext_str_files .keys ()))
153+
154+ # ext_strs, dict[extvar, str]
155+ extvar_str_lists .extend (zip (ext_strs .keys (), ext_strs .values ()))
156+
157+ for key , val in extvar_str_lists :
137158 _make_extvar_dict_update (extvars , "string" , key , val , label )
159+
138160 return extvars
139161
140- def _make_extvar_dict_update (extvars , extvar_type , key , val , label ):
141- if key in extvars :
162+ def _make_extvar_dict_update (extvars , extvar_type , extvar_name , value , label ):
163+ """Adds an entry to a given extrvars dict and validates its uniqueness
164+
165+ Args:
166+ extvars: Dict of extvars to be added to
167+ extvar_type: String of either "string" or "code"
168+ extvar_name: String of the extvar variable name
169+ value: Either a None, string, File or Target
170+ label: String of the package this extvar is defined in
171+
172+ Returns:
173+ None, modifies the given extvars input in-place
174+ """
175+ if extvar_name in extvars :
142176 fail ("duplicate extvar '{}' of type {} and {}"
143- .format (key , extvar_type , extvars [key ]["type" ]))
177+ .format (extvar_name , extvar_type , extvars [extvar_name ]["type" ]))
144178
145- if type (val ) == "string" or type (val ) == "File" or val == None :
179+ if type (value ) == "string" or type (value ) == "File" or value == None :
146180 pass
147- elif type (val ) == "Target" :
148- val = val [DefaultInfo ].files .to_list ()[0 ]
181+ elif type (value ) == "Target" :
182+ value = value [DefaultInfo ].files .to_list ()[0 ]
149183 else :
150- fail ("unknown type of value {} for {} in {}" .format (type (val ), key , label ))
184+ fail ("unknown type of value {} for {} in {}" .format (type (value ), extvar_name , label ))
151185
152- extvars .update ([[key , {
153- "value" : val ,
186+ extvars .update ([[extvar_name , {
187+ "value" : value ,
154188 "type" : extvar_type ,
155189 "sources" : [label ],
156190 }]])
@@ -167,22 +201,24 @@ def _extvar_to_arguments(transitive_extvars, short_path = False):
167201 """
168202 args = []
169203 for key , val in transitive_extvars .items ():
170- if val ["type" ] == "string" :
171- args .append ("--ext-str %s=%s" % (_quote (key ), _quote (val ["value" ])))
172- elif val ["type" ] == "string_env" :
173- args .append ("--ext-str %s" % _quote (key ))
174- elif val ["type" ] == "string_file" :
175- file = val ["value" ]
176- args .append ("--ext-str-file %s=%s" % (_quote (key ), _quote (file .short_path if short_path else file .path )))
177- elif val ["type" ] == "code" :
178- args .append ("--ext-code %s=%s" % (_quote (key ), _quote (val ["value" ])))
179- elif val ["type" ] == "code_env" :
180- args .append ("--ext-code %s" % _quote (key ))
181- elif val ["type" ] == "code_library" or val ["type" ] == "code_file" :
204+ # The --ext-str-* and --ext-code-* flag families are interchangable,
205+ # so the `type` is used to determine which to use.
206+ flag_type = "str" if val ["type" ] == "string" else val ["type" ]
207+
208+ # Each different type of value is formatted in the flags differently
209+ if val ["value" ] == None :
210+ # Environment flags
211+ args .append ("--ext-%s %s" % (flag_type , _quote (key )))
212+ elif type (val ["value" ]) == "string" :
213+ # String flags
214+ args .append ("--ext-%s %s=%s" % (flag_type , _quote (key ), _quote (val ["value" ])))
215+ elif type (val ["value" ]) == "File" :
216+ # Files and library flags
182217 file = val ["value" ]
183- args .append ("--ext-code-file %s=%s" % (_quote (key ), _quote (file .short_path if short_path else file .path )))
218+ file_path = file .short_path if short_path else file .path
219+ args .append ("--ext-%s-file %s=%s" % (flag_type , _quote (key ), _quote (file_path )))
184220 else :
185- fail ("The {} key has an unknown extvar type {}: {}" .format (key , val ["type" ] , val ["sources" ]))
221+ fail ("The {} key has an unknown extvar type {}: {}" .format (key , type ( val ["value" ]) , val ["sources" ]))
186222
187223 return args
188224
0 commit comments