11import asyncio
2+ import os
23import uuid
4+ from typing import Any
35
46from colorama import Fore
57from invoke import run , task
1618
1719
1820@task
19- def summary (ctx , filter = "" , exclude = "" ):
21+ def summary (ctx : Any , filter : str = "" , exclude : str = "" ) -> None :
2022 """Produce a summary of apps, their tags, and their expected images & replicas.
2123 May not necessarily reflect actual app statuses if recent changes haven't yet been pushed to
2224 the remote, or the deployment has failed.
@@ -32,18 +34,18 @@ def summary(ctx, filter="", exclude=""):
3234
3335@task
3436def bump ( # noqa: C901
35- ctx ,
36- filter ,
37- exclude = "" ,
38- image_tag = None ,
39- prefix = None ,
40- autoexclude_inactive = True ,
41- interactive = True ,
42- push = False ,
43- redeploy = False ,
44- skip_migrations = False ,
45- skip_deploy = False ,
46- ):
37+ ctx : Any ,
38+ filter : str ,
39+ exclude : str = "" ,
40+ image_tag : str | None = None ,
41+ prefix : str | None = None ,
42+ autoexclude_inactive : bool = True ,
43+ interactive : bool = True ,
44+ push : bool = False ,
45+ redeploy : bool = False ,
46+ skip_migrations : bool = False ,
47+ skip_deploy : bool = False ,
48+ ) -> None :
4749 """Bump image tag on selected app(s).
4850 Provide `image_tag` to set to a specific image tag, or provide `prefix` to use latest image
4951 with the given prefix.
@@ -134,16 +136,16 @@ def bump( # noqa: C901
134136
135137@task
136138def command (
137- ctx ,
138- filter ,
139- command ,
140- exclude = "" ,
141- cleanup = True ,
142- sequential = True ,
143- interactive = True ,
144- cpu = 0 ,
145- memory = 0 ,
146- ):
139+ ctx : Any ,
140+ filter : str ,
141+ command : str ,
142+ exclude : str = "" ,
143+ cleanup : bool = True ,
144+ sequential : bool = True ,
145+ interactive : bool = True ,
146+ cpu : int = 0 ,
147+ memory : int = 0 ,
148+ ) -> None :
147149 """Run command on selected app(s).
148150
149151 eg. inv command customer,sandbox -e aesg "python manage.py migrate"
@@ -183,7 +185,7 @@ def command(
183185
184186
185187@task
186- def tag (ctx , filter , tag , exclude = "" ):
188+ def tag (ctx : Any , filter : str , tag : str , exclude : str = "" ) -> None :
187189 """Set a tag on selected app(s)."""
188190 try :
189191 apps = get_apps (
@@ -209,7 +211,7 @@ def tag(ctx, filter, tag, exclude=""):
209211
210212
211213@task
212- def untag (ctx , filter , tag , exclude = "" ):
214+ def untag (ctx : Any , filter : str , tag : str , exclude : str = "" ) -> None :
213215 """Unset a tag from selected app(s)."""
214216 try :
215217 apps = get_apps (
@@ -235,32 +237,34 @@ def untag(ctx, filter, tag, exclude=""):
235237
236238
237239@task # TODO: want `keys` to be optional-positional: https://github.com/pyinvoke/invoke/issues/159
238- def getenv (ctx , filter , keys = "" , exclude = "" ):
240+ def getenv (ctx : Any , filter : str , keys : str = "" , exclude : str = "" ) -> None :
239241 """Get one or more env vars on selected app(s)."""
240242 _getenv ("environment" , filter , exclude , keys )
241243
242244
243245@task # TODO: want `keys` to be optional-positional: https://github.com/pyinvoke/invoke/issues/159
244- def getsecrets (ctx , filter , keys = "" , exclude = "" ):
246+ def getsecrets (ctx : Any , filter : str , keys : str = "" , exclude : str = "" ) -> None :
245247 """Get one or more secrets on selected app(s)."""
246248 _getenv ("secrets" , filter , exclude , keys )
247249
248250
249- def _getenv (env_or_secrets , filter , exclude , filter_values ) :
250- filter_values = filter_values .split ("," ) if filter_values else ""
251+ def _getenv (env_or_secrets : str , filter : str , exclude : str , filter_values : str ) -> None :
252+ filter_values_list = filter_values .split ("," ) if filter_values else []
251253 apps = get_apps (filter = filter , exclude = exclude , mode = "SILENT" )
252254 for app in apps :
253255 print ("-" * 20 , progress (app .name ), sep = "\n " )
254256 values = app .values .get (env_or_secrets )
255257 if isinstance (values , dict ):
256- filtered_values = {k : v for k , v in values .items () if k in filter_values } if filter_values else values
258+ filtered_values = (
259+ {k : v for k , v in values .items () if k in filter_values_list } if filter_values_list else values
260+ )
257261 for k , v in filtered_values .items ():
258262 print (f"{ k } ={ v } " )
259263 else :
260264 print (warning (f"No { env_or_secrets } set." ))
261265
262266
263- def _sort_envs (envs ) :
267+ def _sort_envs (envs : dict [ str , Any ]) -> dict [ str , Any ] :
264268 sorted_envs = {}
265269 for e in config .getlist ("env_order" , fallback = "" ):
266270 if e in envs :
@@ -271,7 +275,7 @@ def _sort_envs(envs):
271275
272276
273277@task
274- def setenv (ctx , filter , values , exclude = "" ):
278+ def setenv (ctx : Any , filter : str , values : str , exclude : str = "" ) -> None :
275279 """Set one or more env vars on selected app(s).
276280
277281 eg. inv setenv customer,sandbox BG_RUNNER=DRAMATIQ,BUMP=2
@@ -292,11 +296,16 @@ def setenv(ctx, filter, values, exclude=""):
292296 print (success_negative ("Aborted." ))
293297 return
294298 for app in apps :
299+ # Split on first = only, in case values contain =
300+ new_envs : dict [str , Any ] = {}
301+ for e in splitenvs :
302+ key , value = e .split ("=" , 1 )
303+ new_envs [key ] = value
295304 update_app (
296305 app .name ,
297306 environment = _sort_envs (
298307 {
299- ** dict ( tuple ( e . split ( "=" )) for e in splitenvs ) ,
308+ ** new_envs ,
300309 ** app .values .get ("environment" , {}),
301310 }
302311 ),
@@ -309,7 +318,7 @@ def setenv(ctx, filter, values, exclude=""):
309318
310319
311320@task
312- def unsetenv (ctx , filter , values , exclude = "" ):
321+ def unsetenv (ctx : Any , filter : str , values : str , exclude : str = "" ) -> None :
313322 """Unset one or more env vars on selected app(s).
314323
315324 eg. inv unsetenv customer,sandbox BG_RUNNER,BUMP
@@ -343,7 +352,7 @@ def unsetenv(ctx, filter, values, exclude=""):
343352
344353
345354@task
346- def setcluster (ctx , filter , cluster , exclude = "" ):
355+ def setcluster (ctx : Any , filter : str , cluster : str , exclude : str = "" ) -> None :
347356 """Move selected app(s) to given cluster.
348357
349358 eg. inv setcluster customer,sandbox eks-prod
@@ -370,7 +379,7 @@ def setcluster(ctx, filter, cluster, exclude=""):
370379 print (success ("Done!" ))
371380
372381
373- def git_push (cluster_path : str , retry : int = 3 ):
382+ def git_push (cluster_path : str | os . PathLike [ str ] , retry : int = 3 ) -> None :
374383 """Git pushes in a directory and retries if commits already exist"""
375384 print (progress (f"Pushing changes to { cluster_path } " ))
376385 attempts = 0
0 commit comments