DEV Community

loading...
Cover image for jsf - Faking JSON data from a schema

jsf - Faking JSON data from a schema

Andy Challis
Tinkerer at heart
・2 min read

https://github.com/ghandic/jsf

Use jsf along with fake data generators to provide consistent and meaningful fake data for your system.

Main Features

  • Provides out of the box data generation from any JSON schema πŸ“¦
  • Extendable custom data providers using any lambda functions πŸ”—
  • Multi level state for dependant data (eg multiple objects sharing value, such as children with same surname) πŸ€“
  • Inbuilt validation of fake JSON produced βœ…
  • In memory conversion from JSON Schema to Pydantic Models with generated examples 🀯
  • Seamless integration with FastAPI πŸš€

Installation

$ pip install jsf

---> 100%
Enter fullscreen mode Exit fullscreen mode

Usage

Basic 😊

from jsf import JSF

faker = JSF(
    {
        "type": "object",
        "properties": {
            "name": {"type": "string", "$provider": "faker.name"},
            "email": {"type": "string", "$provider": "faker.email"},
        },
        "required": ["name", "email"],
    }
)

fake_json = faker.generate()
Enter fullscreen mode Exit fullscreen mode

Results in ...

{
    'name': 'Jesse Phillips', 
    'email': 'xroberson@hotmail.com'
}
Enter fullscreen mode Exit fullscreen mode

From JSON file πŸ“

from jsf import JSF

faker = JSF.from_json("demo-schema.json")
fake_json = faker.generate()
Enter fullscreen mode Exit fullscreen mode

Or run stright from the commandline...

Native install

jsf --schema src/tests/data/custom.json --instance wow.json
Enter fullscreen mode Exit fullscreen mode

Docker

docker run -v $PWD:/data challisa/jsf jsf --schema /data/custom.json --instance /data/example.json
Enter fullscreen mode Exit fullscreen mode

FastAPI Integration πŸš€

Create a file main.py with:

from jsf import JSF
from fastapi import FastAPI

app = FastAPI(docs_url="/")
generator = JSF.from_json("custom.json")


@app.get("/generate", response_model=generator.pydantic())
def read_root():
    return generator.generate()

Enter fullscreen mode Exit fullscreen mode

Run the server with:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
Enter fullscreen mode Exit fullscreen mode

Navigate to http://127.0.0.1:8000 and check out your endpoint. Notice the following are all automatically created:

  • Schema with descriptions and examples
  • Example response
  • Data generation by clicking "try it out"

Example Swagger UI - Page 1
Example Swagger UI - Page 2
Example Swagger UI - Page 3
Example Swagger UI - Page 4

Discussion (0)