Skip to main content

jvspatial

An async-first Python library for building graph-based spatial applications with FastAPI integration. Provides entity-centric database operations with automatic context management.

GitHub release (latest by date) GitHub Workflow Status GitHub issues GitHub pull requests GitHub

Table of Contents

Overview

jvspatial is an async-first Python library for building graph-based spatial applications with FastAPI integration. It provides entity-centric database operations with automatic context management.

Inspired by Jaseci's object-spatial paradigm and leveraging Python's async capabilities, jvspatial empowers developers to model complex relationships, traverse object graphs, and implement agent-based architectures that scale with modern cloud-native concurrency requirements.

Key Design Principles:

  • Hierarchy: Object → Node → Edge/Walker inheritance
  • Entity-Centric: Direct database operations via entity methods
  • Unified Decorators: @attribute for entity attributes, @endpoint for API endpoints
  • Automatic Context: Server automatically provides database context to entities
  • Essential CRUD: Core database operations with pagination support
  • Unified Configuration: Pydantic ServerConfig merged at Server startup (constructor kwargs / config dict override allowlisted JVSPATIAL_* env, which override library defaults)
  • Async-First: Built for modern Python async/await patterns

Key Features

🎯 Inheritance Hierarchy

  • Object: Base class for all entities
  • Node: Graph nodes with spatial data (inherits from Object)
  • Edge: Relationships between nodes (inherits from Object)
  • Walker: Graph traversal and pathfinding (inherits from Object)
  • Root: Singleton root node (inherits from Node)

🎨 Unified Decorator System

  • @attribute - Define entity attributes with protection, transient flags, and validation
  • @endpoint - Unified endpoint decorator for both functions and Walker classes
  • Automatic parameter and response schema generation

🗄️ Entity-Centric Database Operations

  • Entity methods: Entity.get(), Entity.find(), Entity.create(), entity.save(), entity.delete()
  • Automatic context management
  • Support for JSON, SQLite, MongoDB, and DynamoDB backends
  • Multi-database support with prime database for core persistence
  • Custom database registration for extensibility
  • Pagination with ObjectPager

⚙️ Unified Configuration

  • Canonical ServerConfig (Pydantic) for all server settings
  • Allowlisted JVSPATIAL_* env vars merged before explicit Server(...) / config= overrides
  • Unknown or removed JVSPATIAL_* keys are rejected (see docs/md/environment-configuration.md)

🚀 FastAPI Integration

  • Built-in FastAPI server with automatic OpenAPI documentation
  • Automatic endpoint registration from decorators
  • Authentication and authorization with automatic endpoint registration when enabled
  • Response schema definitions with examples
  • Entity-centric CRUD operations

⚡ Performance Mixins

  • DeferredSaveMixin: Batch multiple save() calls into a single database write
  • Configurable via JVSPATIAL_ENABLE_DEFERRED_SAVES; disabled automatically in serverless mode (deferred_saves_globally_allowed())
  • Ideal for entities with rapid, sequential updates

Installation

# Core installation
pip install jvspatial

Quick Start

Standard Examples: For production-ready API implementations, see:

Basic Example

from jvspatial.api import Server, endpoint
from jvspatial.core import Node

# Create server (entity-centric operations available automatically)
server = Server(
    title="My API",
    db_type="json",
    db_path="./jvdb",
    auth=dict(auth_enabled=False)  # Set auth_enabled=True for authentication
)

# Define entity
class User(Node):
    name: str = ""
    email: str = ""

# Create endpoint
@endpoint("/users/{user_id}", methods=["GET"])
async def get_user(user_id: str):
    user = await User.get(user_id)
    if not user:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="User not found")
    return {"user": await user.export()}

if __name__ == "__main__":
    server.run()

Core Concepts

Entity Definition and Attributes

from jvspatial.core import Node
from jvspatial.core.annotations import attribute

class User(Node):
    name: str = ""
    email: str = ""
    cache: dict = attribute(transient=True, default_factory=dict)

Unified Endpoint Decorator

The @endpoint decorator works with both functions and Walker classes:

from jvspatial.api import Server, endpoint
from jvspatial.core import Node

server = Server(title="My API", db_type="json", db_path="./jvdb")

# Function endpoint
@endpoint("/api/users", methods=["GET"])
async def list_users(page: int = 1, per_page: int = 10):
    from jvspatial.core.pager import ObjectPager
    pager = ObjectPager(User, page_size=per_page)
    users = await pager.get_page(page=page)
    import asyncio
    users_list = await asyncio.gather(*[user.export() for user in users])
    return {"users": users_list}

# Authenticated endpoint
@endpoint("/api/admin", methods=["GET"], auth=True, roles=["admin"])
async def admin_panel():
    return {"admin": "dashboard"}

# Endpoint with response schema
from jvspatial.api.endpoints.response import ResponseField, success_response

@endpoint(
    "/api/users",
    methods=["GET"],
    response=success_response(
        data={
            "users": ResponseField(List[Dict], "List of users"),
            "total": ResponseField(int, "Total count")
        }
    )
)
async def get_users():
    return {"users": [], "total": 0}

Entity-Centric Database Operations

from jvspatial.core import Node

class User(Node):
    name: str = ""
    email: str = ""

# Entity-centric operations (no context needed - server provides it automatically)
user = await User.create(name="John", email="john@example.com")
users = await User.find({"context.name": "John"})  # Use context. prefix for fields
user = await User.get(user_id)  # Returns None if not found
if user:
    await user.save()
    await user.delete()

# Efficient counting
total_users = await User.count()  # Count all users
active_users = await User.count({"context.active": True})  # Count filtered users using query dict
active_users = await User.count(active=True)  # Count filtered users using keyword arguments

Configuration

Serverless Mode

Set SERVERLESS_MODE=true to force serverless-safe behavior (strict synchronous request lifecycle, no fire-and-forget background task assumptions). When unset, jvspatial auto-detects AWS Lambda via runtime environment variables. Use is_serverless_mode() from jvspatial.runtime.serverless to check mode at runtime.

For deferred work across invocations, use dispatch_deferred_task() from jvspatial.serverless. On AWS, Lambda async invoke and optional EventBridge deliver JSON to your app; with the Lambda Web Adapter, Server applies best-effort AWS_LWA_PASS_THROUGH_PATH / AWS_LWA_INVOKE_MODE defaults when LWA is detected (see docs/md/serverless-mode.md); set them in IaC when the extension must read them before Python starts. Register task handlers with register_deferred_invoke_handler() in jvspatial.serverless.deferred_invoke.

Server configuration

Merge order when constructing Server is: ServerConfig defaults → allowlisted JVSPATIAL_* environment → config= dict or keyword arguments (later wins). Import ServerConfig from jvspatial.api when you need the schema outside Server.

from jvspatial.api import Server

# Basic server
server = Server(
    title="My API",
    description="API description",
    version="1.0.0",
    db_type="json",
    db_path="./jvdb"
)

# Server with authentication
# Auth settings live under the nested `auth` group; flat top-level
# auth kwargs are ignored by ServerConfig.
server = Server(
    title="Secure API",
    auth=dict(
        auth_enabled=True,  # Registers /auth/register, /auth/login, /auth/logout
        jwt_secret="your-secret-key",
        jwt_expire_minutes=60,
    ),
    db_type="json",
    db_path="./jvdb"
)

# Server without authentication (public API)
server = Server(
    title="Public API",
    auth_enabled=False,  # NO authentication endpoints registered
    db_type="json",
    db_path="./jvdb_public"
)

Authentication Behavior

  • auth_enabled=True: Server automatically registers authentication endpoints (/auth/register, /auth/login, /auth/logout)
  • auth_enabled=False: Authentication endpoints are NOT registered (public API)

Documentation

Getting Started

API Development

Advanced Topics

For Contributors

Authors & maintainers

jvspatial — a foundational object-spatial application development framework — was created by Eldon Marks (@eldonm), who serves as its lead maintainer.

See AUTHORS for the full list of authors and contributors. Copyright and licensing terms are set out in the LICENSE.

Contributors

Contributing

We welcome contributions! Please see our Contributing Guide for details.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Metadata

Release files for jvspatial 0.0.21

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jvspatial 0.0.21
File Size Uploaded Provenance Actions
jvspatial-0.0.21.tar.gz 550.6 kB With provenance Details for jvspatial-0.0.21.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for jvspatial 0.0.21
File Interpreter ABI Platform Actions
jvspatial-0.0.21-py3-none-any.whl Python 3 none any Details for jvspatial-0.0.21-py3-none-any.whl

Total release size: 1.2 MB

Release files / jvspatial-0.0.21.tar.gz

Download URL jvspatial-0.0.21.tar.gz
Size 550.6 kB
Tags Source
SHA-256 checksum
How to use checksums
22f362e11f1867a58e6405a3d39bb55f192630e6c775e23ad118de66408463a4
BLAKE2b-256 checksum
How to use checksums
3838033f16d04ce8b2538c96fd0ca4e075ace56387fa638c384e55b146df7464
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / jvspatial-0.0.21-py3-none-any.whl

Download URL jvspatial-0.0.21-py3-none-any.whl
Size 635.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2cee611d61578c9d7c9d8662a9c07be9f5917e8e905ac426564cadff89aace20
BLAKE2b-256 checksum
How to use checksums
abb1f2a5da93c798bfa8cafa629dd8381568267ed0d25e087cdb73424e39f1dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Security for jvspatial 0.0.21

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for jvspatial-0.0.21.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page