Skip to main content

Spin up a fake REST API from JSON/CSV with zero code.

Project description

Data Server

PyPI version

demo

Spin up a fake REST API from a JSON or CSV file with zero framework setup.

Data Server reads your file, exposes routes automatically, supports CRUD for list resources, and writes changes back to disk.


Table of Contents


Why Data Server

  • Generate an API from existing mock data in seconds.
  • Test frontend flows without hand-writing backend endpoints.
  • Simulate realistic behavior (pagination, sorting, filtering, latency).
  • Keep data local and editable through HTTP requests.

Installation

pip install data-server

You can run it either as a module or a CLI command:

python -m mock_data_server <file>
# or
data-server <file>

Quick Start

  1. Create a sample JSON file:
{
  "todos": [
    { "id": 1, "title": "Write docs", "done": false },
    { "id": 2, "title": "Ship feature", "done": false }
  ]
}
  1. Start the server:
data-server ./todos.json --port 8000
  1. Try requests:
curl http://127.0.0.1:8000/
curl http://127.0.0.1:8000/todos
curl http://127.0.0.1:8000/todos/1

How Routing Works

  • GET / returns discovered routes and supported methods.
  • Each top-level list becomes a collection endpoint (for example, todos -> /todos).
  • Collection endpoints support GET and POST.
  • Item endpoints support GET, PUT, PATCH, and DELETE.

If you provide --url-path-prefix /api/v1, all routes are served under that prefix.


Request and Response Behavior

  • POST returns 201.
  • DELETE returns 204 when successful.
  • Other successful requests return 200.
  • CORS header Access-Control-Allow-Origin: * is included.
  • Errors are returned as JSON:
{
  "error": {
    "description": "...",
    "code": 400,
    "details": "..."
  }
}

You can add custom headers to every response with:

--additional-headers "X-Limit:20;X-Source:mock"

Query Parameters (filter, sort, paging)

Collection GET requests support:

  • Filtering: any extra query keys are treated as exact-match filters.
  • Sorting: sort_by=<field> and order=asc|desc.
  • Pagination:
    • page (starts at 0)
    • size (default comes from --page-size, default value is 10)

Example:

curl "http://127.0.0.1:8000/todos?done=false&sort_by=title&order=asc&page=0&size=5"

You can rename these query parameter names via CLI flags such as --page-param-name, --sort-param-name, --order-param-name, and --size-param-name.


CLI Reference

Usage:

data-server <file> [options]

Required positional argument:

  • file: Path to a .json or .csv file.

Server options:

  • --host (default: 127.0.0.1)
  • --port (default: 2000)
  • --url-path-prefix
  • --static-folder
  • --static-url-prefix (default: static)
  • --additional-headers
  • --sleep-before-request (milliseconds)

Data/controller options:

  • --id-name (default: id)
  • --auto-generate-ids / --no-auto-generate-ids
  • --use-timestamps / --no-use-timestamps
  • --created-at-key-name (default: created_at)
  • --updated-at-key-name (default: updated_at)
  • --page-size (default: 10)
  • --page-param-name (default: page)
  • --sort-param-name (default: sort_by)
  • --order-param-name (default: order)
  • --size-param-name (default: size)

Data File Requirements

JSON

  • Must be valid JSON.
  • Top-level object keys typically map to endpoint paths.
  • List values are treated as resources that support CRUD.
  • Changes are persisted back to the same file.

CSV

  • The CSV filename (without extension) becomes the route name.
  • Rows are exposed as a single collection.
  • Values are read as strings.
  • Changes are written back to the same CSV file.

Development

# install with dev dependencies
pip install -e .[dev]

# format + lint
ruff format .
ruff check .

# type-check
mypy --strict mock_data_server

# run tests
coverage run -m unittest discover -v -s tests
coverage report -m

Main CI runs on push/PR to main.


Release and Publish (PyPI)

Publishing is automated through GitHub Actions after a successful CI run on main.

  1. Bump version in pyproject.toml.
  2. Ensure repo secret PYPI_API_TOKEN is configured.
  3. Merge to main.
  4. CI passes, then the publish workflow uploads to PyPI.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mock_data_server-1.0.0.tar.gz (215.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mock_data_server-1.0.0-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file mock_data_server-1.0.0.tar.gz.

File metadata

  • Download URL: mock_data_server-1.0.0.tar.gz
  • Upload date:
  • Size: 215.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mock_data_server-1.0.0.tar.gz
Algorithm Hash digest
SHA256 66d925d9ce17294c929be9b7ee9a9b8710b2a1da4db3177115f7fd5161a41bbf
MD5 b83d582c2cdbc51b3b254c743e770aed
BLAKE2b-256 230ea3bf1d17ea0b71fe0c599ea3793e61d4895922cc2321a2e79f1e8b33619f

See more details on using hashes here.

File details

Details for the file mock_data_server-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mock_data_server-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3c6b7d068534fec3b7994ffe1f3941c04ae7f638b013ecff718d2cb558647dd2
MD5 9d48fae466eac273c6d6cf23f63c8da1
BLAKE2b-256 0a6f6694c0ef5983919dfb576229e07fa465ff575c343ee89d1935399b8043eb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page