Source code for fitbit_downloader.gen_models
import os
from pathlib import Path
from typing import Generator
from fitbit_downloader.ext_subprocess import run_then_show_output
from tests.config import RESPONSES_FOLDER
MODELS_FOLDER = Path(__file__).parent / "models"
[docs]def generate_models():
for path in _get_json_paths():
model_name = _create_model_name(path)
print(f"Generating model {model_name} from {path}")
out_path = MODELS_FOLDER / f"{model_name.lower()}.py"
_generate_model(path, out_path, model_name)
def _create_model_name(path: Path) -> str:
base_name = path.with_suffix("").name
parts = base_name.split("-")
combined = "".join(part.title() for part in parts)
return f"{combined}Response"
def _get_json_paths() -> Generator[Path, None, None]:
for path, folders, files in os.walk(RESPONSES_FOLDER):
for file in files:
if file.endswith(".json"):
full_path = Path(path) / file
yield full_path
def _generate_model(in_path: Path, out_path: Path, name: str):
command = f"datamodel-codegen --input {in_path.absolute()} --input-file-type json --output {out_path} --class-name {name}"
run_then_show_output(command)
[docs]def main():
generate_models()
if __name__ == "__main__":
main()