feat: added abspath to jexpr
This commit is contained in:
		
							parent
							
								
									a225097b13
								
							
						
					
					
						commit
						1fac2fbbfb
					
				
					 1 changed files with 16 additions and 14 deletions
				
			
		|  | @ -1,3 +1,4 @@ | ||||||
|  | import os | ||||||
| from typing import Any, cast, Callable, Final | from typing import Any, cast, Callable, Final | ||||||
| import json | import json | ||||||
| 
 | 
 | ||||||
|  | @ -8,34 +9,35 @@ Json = Any | ||||||
| Builtin = Callable[..., Json] | Builtin = Callable[..., Json] | ||||||
| 
 | 
 | ||||||
| BUILTINS: Final[dict[str, Builtin]] = { | BUILTINS: Final[dict[str, Builtin]] = { | ||||||
|     "uname": lambda arg: getattr(shell.uname(), arg).lower(), |     "uname": lambda arg, ctx: getattr(shell.uname(), arg).lower(), | ||||||
|     "include": lambda arg: evalRead(arg), |     "include": lambda arg, ctx: evalRead(arg), | ||||||
|     "evalRead": lambda arg: evalRead(arg), |     "evalRead": lambda arg, ctx: evalRead(arg), | ||||||
|     "join": lambda lhs, rhs: cast(Json, {**lhs, **rhs} if isinstance(lhs, dict) else lhs + rhs), |     "join": lambda lhs, rhs, ctx: cast(Json, {**lhs, **rhs} if isinstance(lhs, dict) else lhs + rhs), | ||||||
|     "concat": lambda *args: "".join(args), |     "concat": lambda *args, ctx: "".join(args), | ||||||
|     "eval": lambda arg: eval(arg), |     "eval": lambda arg, ctx: eval(arg), | ||||||
|     "read": lambda arg: read(arg), |     "read": lambda arg, ctx: read(arg), | ||||||
|     "exec": lambda *args: shell.popen(*args).splitlines(), |     "exec": lambda *args, ctx: shell.popen(*args).splitlines(), | ||||||
|     "latest": lambda arg: shell.latest(arg), |     "latest": lambda arg, ctx: shell.latest(arg), | ||||||
|  |     "abspath": lambda *args, ctx: os.path.normpath(os.path.join(os.path.dirname(ctx["filepath"]), *args))  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def eval(jexpr: Json) -> Json: | def eval(jexpr: Json, filePath: str) -> Json: | ||||||
|     if isinstance(jexpr, dict): |     if isinstance(jexpr, dict): | ||||||
|         result = {} |         result = {} | ||||||
|         for k in cast(dict[str, Json], jexpr): |         for k in cast(dict[str, Json], jexpr): | ||||||
|             result[k] = eval(jexpr[k]) |             result[k] = eval(jexpr[k], filePath) | ||||||
|         return cast(Json, result) |         return cast(Json, result) | ||||||
|     elif isinstance(jexpr, list): |     elif isinstance(jexpr, list): | ||||||
|         jexpr = cast(list[Json], jexpr) |         jexpr = cast(list[Json], jexpr) | ||||||
|         if len(jexpr) > 0 and isinstance(jexpr[0], str) and jexpr[0].startswith("@"): |         if len(jexpr) > 0 and isinstance(jexpr[0], str) and jexpr[0].startswith("@"): | ||||||
|             funcName = jexpr[0][1:] |             funcName = jexpr[0][1:] | ||||||
|             if funcName in BUILTINS: |             if funcName in BUILTINS: | ||||||
|                 return BUILTINS[funcName](*eval(jexpr[1:])) |                 return BUILTINS[funcName](*eval(jexpr[1:], filePath), ctx={"filepath": filePath}) | ||||||
| 
 | 
 | ||||||
|             raise RuntimeError(f"Unknown macro {funcName}") |             raise RuntimeError(f"Unknown macro {funcName}") | ||||||
|         else: |         else: | ||||||
|             return list(map(eval, jexpr)) |             return list(map(lambda j: eval(j, filePath), jexpr)) | ||||||
|     else: |     else: | ||||||
|         return jexpr |         return jexpr | ||||||
| 
 | 
 | ||||||
|  | @ -51,4 +53,4 @@ def read(path: str) -> Json: | ||||||
| def evalRead(path: str) -> Json: | def evalRead(path: str) -> Json: | ||||||
|     data = read(path) |     data = read(path) | ||||||
|     ensureSupportedManifest(data, path) |     ensureSupportedManifest(data, path) | ||||||
|     return eval(data) |     return eval(data, path) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue