Skip to main content

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

Project description

Data Server

CI PyPI version

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-0.0.3.tar.gz (26.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-0.0.3-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mock_data_server-0.0.3.tar.gz
  • Upload date:
  • Size: 26.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-0.0.3.tar.gz
Algorithm Hash digest
SHA256 fc0c2bd3020c5c0c19fa8d9eedfe793943194ab8dc74faf9bf32f7b5f456fd2f
MD5 c8edceb6de406b6936aa0c9d7c8a4e6c
BLAKE2b-256 4fb745618472fc5a3972dbd82056410f070c4fa13b92bcfb5f73845da68f3c5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mock_data_server-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c5eafc790c11a013027f83508d9da44c6cd7b3ee8586779ae054923e133640e4
MD5 de11c1569938b192498ef3b81f20fee4
BLAKE2b-256 35db06151a4e698d1b55098f4570ff9a91ba18ea2bcbcd6b9a7e52819e9012c8

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