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.1.tar.gz (26.2 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.1-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: mock_data_server-0.0.1.tar.gz
  • Upload date:
  • Size: 26.2 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.1.tar.gz
Algorithm Hash digest
SHA256 2e466a77512eb4760014ec252f0346d4fa91be801007c9be17d7ac0fbc348393
MD5 28b41b2834bc39e9b43e7f9139eabb72
BLAKE2b-256 b57e8d5d4bd744afd14f058105351636b07c6d07ad59091d4c6b257d2d20b494

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mock_data_server-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4e5b1fddd91633c3cce8b32da6678f972916d36c055d7265452278953833908d
MD5 65f6640d4f7268235addaf2a62d69e63
BLAKE2b-256 a356847a6e67aa1db4d45b147040a6100f87c98e5a24ff46fda2a6a10caf5880

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