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
<span>$</span><span> </span>pip <span>install </span>jsf<span> </span><span>---></span><span> </span>100%<span>$</span><span> </span>pip <span>install </span>jsf <span> </span><span>---></span><span> </span>100%$ pip install jsf ---> 100%
Enter fullscreen mode Exit fullscreen mode
Usage
Basic
<span>from</span> <span>jsf</span> <span>import</span> <span>JSF</span><span>faker</span> <span>=</span> <span>JSF</span><span>(</span><span>{</span><span>"</span><span>type</span><span>"</span><span>:</span> <span>"</span><span>object</span><span>"</span><span>,</span><span>"</span><span>properties</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>name</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>type</span><span>"</span><span>:</span> <span>"</span><span>string</span><span>"</span><span>,</span> <span>"</span><span>$provider</span><span>"</span><span>:</span> <span>"</span><span>faker.name</span><span>"</span><span>},</span><span>"</span><span>email</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>type</span><span>"</span><span>:</span> <span>"</span><span>string</span><span>"</span><span>,</span> <span>"</span><span>$provider</span><span>"</span><span>:</span> <span>"</span><span>faker.email</span><span>"</span><span>},</span><span>},</span><span>"</span><span>required</span><span>"</span><span>:</span> <span>[</span><span>"</span><span>name</span><span>"</span><span>,</span> <span>"</span><span>email</span><span>"</span><span>],</span><span>}</span><span>)</span><span>fake_json</span> <span>=</span> <span>faker</span><span>.</span><span>generate</span><span>()</span><span>from</span> <span>jsf</span> <span>import</span> <span>JSF</span> <span>faker</span> <span>=</span> <span>JSF</span><span>(</span> <span>{</span> <span>"</span><span>type</span><span>"</span><span>:</span> <span>"</span><span>object</span><span>"</span><span>,</span> <span>"</span><span>properties</span><span>"</span><span>:</span> <span>{</span> <span>"</span><span>name</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>type</span><span>"</span><span>:</span> <span>"</span><span>string</span><span>"</span><span>,</span> <span>"</span><span>$provider</span><span>"</span><span>:</span> <span>"</span><span>faker.name</span><span>"</span><span>},</span> <span>"</span><span>email</span><span>"</span><span>:</span> <span>{</span><span>"</span><span>type</span><span>"</span><span>:</span> <span>"</span><span>string</span><span>"</span><span>,</span> <span>"</span><span>$provider</span><span>"</span><span>:</span> <span>"</span><span>faker.email</span><span>"</span><span>},</span> <span>},</span> <span>"</span><span>required</span><span>"</span><span>:</span> <span>[</span><span>"</span><span>name</span><span>"</span><span>,</span> <span>"</span><span>email</span><span>"</span><span>],</span> <span>}</span> <span>)</span> <span>fake_json</span> <span>=</span> <span>faker</span><span>.</span><span>generate</span><span>()</span>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 …
<span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>Jesse Phillips</span><span>'</span><span>,</span><span>'</span><span>email</span><span>'</span><span>:</span> <span>'</span><span>xroberson@hotmail.com</span><span>'</span><span>}</span><span>{</span> <span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>Jesse Phillips</span><span>'</span><span>,</span> <span>'</span><span>email</span><span>'</span><span>:</span> <span>'</span><span>xroberson@hotmail.com</span><span>'</span> <span>}</span>{ 'name': 'Jesse Phillips', 'email': 'xroberson@hotmail.com' }
Enter fullscreen mode Exit fullscreen mode
From JSON file
<span>from</span> <span>jsf</span> <span>import</span> <span>JSF</span><span>faker</span> <span>=</span> <span>JSF</span><span>.</span><span>from_json</span><span>(</span><span>"</span><span>demo-schema.json</span><span>"</span><span>)</span><span>fake_json</span> <span>=</span> <span>faker</span><span>.</span><span>generate</span><span>()</span><span>from</span> <span>jsf</span> <span>import</span> <span>JSF</span> <span>faker</span> <span>=</span> <span>JSF</span><span>.</span><span>from_json</span><span>(</span><span>"</span><span>demo-schema.json</span><span>"</span><span>)</span> <span>fake_json</span> <span>=</span> <span>faker</span><span>.</span><span>generate</span><span>()</span>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 <span>--schema</span> src/tests/data/custom.json <span>--instance</span> wow.jsonjsf <span>--schema</span> src/tests/data/custom.json <span>--instance</span> wow.jsonjsf --schema src/tests/data/custom.json --instance wow.json
Enter fullscreen mode Exit fullscreen mode
Docker
docker run <span>-v</span> <span>$PWD</span>:/data challisa/jsf jsf <span>--schema</span> /data/custom.json <span>--instance</span> /data/example.jsondocker run <span>-v</span> <span>$PWD</span>:/data challisa/jsf jsf <span>--schema</span> /data/custom.json <span>--instance</span> /data/example.jsondocker 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:
<span>from</span> <span>jsf</span> <span>import</span> <span>JSF</span><span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span><span>app</span> <span>=</span> <span>FastAPI</span><span>(</span><span>docs_url</span><span>=</span><span>"</span><span>/</span><span>"</span><span>)</span><span>generator</span> <span>=</span> <span>JSF</span><span>.</span><span>from_json</span><span>(</span><span>"</span><span>custom.json</span><span>"</span><span>)</span><span>@app.get</span><span>(</span><span>"</span><span>/generate</span><span>"</span><span>,</span> <span>response_model</span><span>=</span><span>generator</span><span>.</span><span>pydantic</span><span>())</span><span>def</span> <span>read_root</span><span>():</span><span>return</span> <span>generator</span><span>.</span><span>generate</span><span>()</span><span>from</span> <span>jsf</span> <span>import</span> <span>JSF</span> <span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span> <span>app</span> <span>=</span> <span>FastAPI</span><span>(</span><span>docs_url</span><span>=</span><span>"</span><span>/</span><span>"</span><span>)</span> <span>generator</span> <span>=</span> <span>JSF</span><span>.</span><span>from_json</span><span>(</span><span>"</span><span>custom.json</span><span>"</span><span>)</span> <span>@app.get</span><span>(</span><span>"</span><span>/generate</span><span>"</span><span>,</span> <span>response_model</span><span>=</span><span>generator</span><span>.</span><span>pydantic</span><span>())</span> <span>def</span> <span>read_root</span><span>():</span> <span>return</span> <span>generator</span><span>.</span><span>generate</span><span>()</span>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:
<span>$</span><span> </span>uvicorn main:app <span>--reload</span><span> 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. </span><span>$</span><span> </span>uvicorn main:app <span>--reload</span> <span> 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. </span>$ 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”
暂无评论内容