jsf – Faking JSON data from a schema

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.json
jsf <span>--schema</span> src/tests/data/custom.json <span>--instance</span> wow.json
jsf --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.json
docker run <span>-v</span> <span>$PWD</span>:/data challisa/jsf jsf <span>--schema</span> /data/custom.json <span>--instance</span> /data/example.json
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:

<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”

图片[1]-jsf - Faking JSON data from a schema - 拾光赋-拾光赋
图片[2]-jsf - Faking JSON data from a schema - 拾光赋-拾光赋
图片[3]-jsf - Faking JSON data from a schema - 拾光赋-拾光赋

原文链接:jsf – Faking JSON data from a schema

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
Don’t let your dreams be dreams.
不要让你的梦想只是想想而已
评论 抢沙发

请登录后发表评论

    暂无评论内容