Initial upload: API Mock CLI v0.1.0
Some checks failed
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / type-check (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (3.10) (push) Has been cancelled
Some checks failed
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / type-check (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (3.10) (push) Has been cancelled
This commit is contained in:
77
src/core/templating.py
Normal file
77
src/core/templating.py
Normal file
@@ -0,0 +1,77 @@
|
||||
import re
|
||||
import uuid
|
||||
import time
|
||||
import random
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, Optional
|
||||
import jinja2
|
||||
|
||||
|
||||
class TemplatingEngine:
|
||||
def __init__(self):
|
||||
self.env = jinja2.Environment(
|
||||
loader=jinja2.DictLoader({}),
|
||||
autoescape=True,
|
||||
trim_blocks=True,
|
||||
lstrip_blocks=True
|
||||
)
|
||||
self._setup_filters()
|
||||
self._setup_globals()
|
||||
|
||||
def _setup_filters(self):
|
||||
self.env.filters["uuid"] = lambda: str(uuid.uuid4())
|
||||
self.env.filters["upper"] = lambda x: x.upper()
|
||||
self.env.filters["lower"] = lambda x: x.lower()
|
||||
self.env.filters["default"] = lambda x, d="": x if x else d
|
||||
self.env.filters["first"] = lambda x: x[0] if x else None
|
||||
self.env.filters["last"] = lambda x: x[-1] if x else None
|
||||
self.env.filters["length"] = len
|
||||
self.env.filters["random"] = lambda x: random.choice(x) if x else None
|
||||
|
||||
def _setup_globals(self):
|
||||
self.env.globals["timestamp"] = lambda: int(time.time())
|
||||
self.env.globals["datetime"] = lambda: datetime.now().isoformat()
|
||||
self.env.globals["uuid"] = lambda: str(uuid.uuid4())
|
||||
self.env.globals["random_int"] = lambda min_val=0, max_val=100: random.randint(min_val, max_val)
|
||||
self.env.globals["random_string"] = lambda length=10: "".join(random.choices("abcdefghijklmnopqrstuvwxyz", k=length))
|
||||
self.env.globals["now"] = lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
def render_template(self, template_str: str, context: Dict[str, Any]) -> str:
|
||||
try:
|
||||
template = self.env.from_string(template_str)
|
||||
return template.render(**context)
|
||||
except jinja2.TemplateError as e:
|
||||
raise ValueError(f"Template rendering failed: {e}")
|
||||
|
||||
def render_dict(self, data: Any, context: Dict[str, Any]) -> Any:
|
||||
if isinstance(data, str):
|
||||
return self.render_template(data, context)
|
||||
elif isinstance(data, dict):
|
||||
return {k: self.render_dict(v, context) for k, v in data.items()}
|
||||
elif isinstance(data, list):
|
||||
return [self.render_dict(item, context) for item in data]
|
||||
else:
|
||||
return data
|
||||
|
||||
def build_context(
|
||||
self,
|
||||
path_params: Optional[Dict[str, str]] = None,
|
||||
query_params: Optional[Dict[str, str]] = None,
|
||||
headers: Optional[Dict[str, str]] = None,
|
||||
body: Optional[Any] = None,
|
||||
extra: Optional[Dict[str, Any]] = None
|
||||
) -> Dict[str, Any]:
|
||||
context = {
|
||||
"request": {
|
||||
"path": path_params or {},
|
||||
"query": query_params or {},
|
||||
"headers": headers or {},
|
||||
"body": body or {}
|
||||
},
|
||||
"uuid": str(uuid.uuid4()),
|
||||
"timestamp": int(time.time()),
|
||||
"datetime": datetime.now().isoformat()
|
||||
}
|
||||
if extra:
|
||||
context.update(extra)
|
||||
return context
|
||||
Reference in New Issue
Block a user