33from pathlib import Path
44
55import click
6+ import jinja2
67import yaml
78
89from metablock import Metablock , __version__
1516METABLOCK_API_TOKEN = os .environ .get ("METABLOCK_API_TOKEN" , "" )
1617
1718
18- def manifest (file_path : Path ) -> dict :
19- return yaml .safe_load (file_path .read_text ())
19+ def manifest (file_path : Path , params : dict ) -> str :
20+ env = jinja2 .Environment ()
21+ template = env .from_string (file_path .read_text ())
22+ return template .render (** params )
2023
2124
2225@click .group ()
@@ -39,13 +42,19 @@ def main() -> None:
3942 help = "metablock API token" ,
4043 default = METABLOCK_API_TOKEN ,
4144)
42- def apply (path : str , space_name : str , token : str ) -> None :
45+ @click .option (
46+ "--dry-run" ,
47+ is_flag = True ,
48+ help = "Do not apply changes, just show what would be done" ,
49+ )
50+ def apply (path : str , space_name : str , token : str , dry_run : bool ) -> None :
4351 """Apply metablock manifest to a metablock space"""
44- asyncio .get_event_loop (). run_until_complete (
52+ asyncio .run (
4553 _apply (
4654 path ,
4755 space_name or METABLOCK_SPACE ,
4856 token or METABLOCK_API_TOKEN ,
57+ dry_run = dry_run ,
4958 )
5059 )
5160
@@ -84,7 +93,7 @@ def ship(
8493 token : str ,
8594) -> None :
8695 """Deploy a new version of html block"""
87- asyncio .get_event_loop (). run_until_complete (
96+ asyncio .run (
8897 _ship (
8998 path ,
9099 env or METABLOCK_ENV ,
@@ -95,7 +104,7 @@ def ship(
95104 )
96105
97106
98- async def _apply (path : str , space_name : str , token : str ) -> None :
107+ async def _apply (path : str , space_name : str , token : str , dry_run : bool ) -> None :
99108 if not token :
100109 click .echo ("metablock API token is required" , err = True )
101110 raise click .Abort ()
@@ -106,7 +115,14 @@ async def _apply(path: str, space_name: str, token: str) -> None:
106115 blocks = []
107116 for file_path in p .glob ("*.yaml" ):
108117 name = file_path .name .split ("." )[0 ]
109- blocks .append ((name , manifest (file_path )))
118+ text = manifest (file_path , dict (space = space_name , block = name ))
119+ if dry_run :
120+ click .echo (text )
121+ else :
122+ blocks .append ((name , yaml .safe_load (text )))
123+ if not blocks :
124+ click .echo ("nothing to do" )
125+ raise click .Abort ()
110126 async with Metablock (auth_key = token ) as mb :
111127 space = await mb .spaces .get (space_name )
112128 svc = await space .blocks .get_list ()
0 commit comments