type-bridge


Nametype-bridge JSON
Version 0.1.5 PyPI version JSON
download
home_pageNone
SummaryA modern, Pythonic ORM for TypeDB with an Attribute-based API
upload_time2025-10-31 03:53:39
maintainerNone
docs_urlNone
authorNone
requires_python>=3.13
licenseMIT
keywords database graph-database orm typedb typeql
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # TypeBridge

A modern, Pythonic ORM for TypeDB with an Attribute-based API that aligns with TypeDB's type system.

## Features

- **True TypeDB Semantics**: Attributes are independent types that entities and relations own
- **Flag System**: Clean API for `@key`, `@unique`, and `@card` annotations
- **Flexible Cardinality**: Express any cardinality constraint with `Card(min, max)`
- **Pydantic Integration**: Built on Pydantic v2 for automatic validation, serialization, and type safety
- **Type-Safe**: Full Python type hints and IDE autocomplete support
- **Declarative Models**: Define entities and relations using Python classes
- **Automatic Schema Generation**: Generate TypeQL schemas from your Python models
- **Data Validation**: Automatic type checking and coercion via Pydantic
- **JSON Support**: Seamless JSON serialization/deserialization
- **CRUD Operations**: Simple managers for entity and relation operations
- **Query Builder**: Pythonic interface for building TypeQL queries

## Installation

```bash
# Clone the repository
git clone https://github.com/yourusername/type_bridge.git
cd type_bridge

# Install with uv
uv sync

# Or with pip
pip install -e .
```

## Quick Start

### 1. Define Attribute Types

```python
from type_bridge import String, Integer

class Name(String):
    pass

class Age(Integer):
    pass
```

### 2. Define Entities

```python
from typing import Optional
from type_bridge import Entity, EntityFlags, Flag, Key, Card

class Person(Entity):
    flags = EntityFlags(type_name="person")  # Optional, defaults to lowercase class name

    # Use Flag() for key/unique markers and Card for cardinality
    name: Name = Flag(Key)                   # @key (implies @card(1..1))
    age: Optional[Age]                       # @card(0..1) - optional field
    email: Email                             # @card(1..1) - default cardinality
    tags: list[Tag] = Flag(Card(min=2))      # @card(2..) - two or more
```

### 3. Create Instances

```python
# Two ways to create instances:

# Option 1: Attribute instances (fully type-safe, zero pyright errors)
alice = Person(
    name=Name("Alice"),
    age=Age(30),
    email=Email("alice@example.com")
)

# Option 2: Raw values (convenient, may show pyright warnings)
bob = Person(name="Bob", age=25, email=Email("bob@example.com"))

# Both work identically at runtime!
```

### 4. Work with Data

```python
from type_bridge import Database, SchemaManager, EntityManager

# Setup
db = Database(address="localhost:1729", database="mydb")
schema_manager = SchemaManager(db)
schema_manager.register(Person)
schema_manager.sync_schema(force=True)

# CRUD
person_manager = EntityManager(db, Person)
alice = person_manager.create(name="Alice", age=30)
all_people = person_manager.all()
```

### 4. Cardinality Constraints

```python
from typing import Optional
from type_bridge import Card, Flag

class Person(Entity):
    flags = EntityFlags(type_name="person")

    # Cardinality options:
    name: Name                              # @card(1..1) - exactly one (default)
    age: Optional[Age]                      # @card(0..1) - zero or one
    tags: list[Tag] = Flag(Card(min=2))     # @card(2..) - two or more (unbounded)
    skills: list[Skill] = Flag(Card(max=5)) # @card(0..5) - zero to five (min defaults to 0)
    jobs: list[Job] = Flag(Card(1, 3))      # @card(1..3) - one to three
```

### 5. Define Relations

```python
from typing import ClassVar
from type_bridge import Relation, RelationFlags, Role

class Employment(Relation):
    flags = RelationFlags(type_name="employment")

    # Define roles with ClassVar
    employee: ClassVar[Role] = Role("employee", Person)
    employer: ClassVar[Role] = Role("employer", Company)

    # Relations can own attributes too
    position: Position                   # @card(1..1)
    salary: Optional[Salary]             # @card(0..1)
```

### 6. Using Python Inheritance

```python
class Animal(Entity):
    flags = EntityFlags(abstract=True)  # Abstract entity
    name: Name

class Dog(Animal):  # Automatically: dog sub animal in TypeDB
    breed: Breed
```

## Documentation

See [ATTRIBUTE_API.md](ATTRIBUTE_API.md) for complete documentation.

## Pydantic Integration

TypeBridge is built on Pydantic v2, giving you powerful features out of the box:

```python
from typing import Optional

class Person(Entity):
    flags = EntityFlags(type_name="person")
    name: Name = Flag(Key)
    age: Age = Age(0)

# Automatic validation
alice = Person(name="Alice", age="30")  # String coerced to int

# JSON serialization
json_data = alice.model_dump_json()

# JSON deserialization
bob = Person.model_validate_json('{"name": "Bob", "age": 25}')

# Model copying
alice_copy = alice.model_copy(update={"age": 31})
```

## Running Examples

```bash
uv run python examples/basic_usage.py
uv run python examples/pydantic_features.py
```

## Running Tests

```bash
uv run pytest tests/ -v
```

## Requirements

- Python 3.13+
- TypeDB 2.x or 3.x
- typedb-driver==3.5.5

## License

MIT License

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "type-bridge",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.13",
    "maintainer_email": null,
    "keywords": "database, graph-database, orm, typedb, typeql",
    "author": null,
    "author_email": "ds1sqe <ds1sqe@mensakorea.org>",
    "download_url": "https://files.pythonhosted.org/packages/dc/31/dbb4303fc73c6ef6a3764d85327c0b105a1cbd5485804b76ca0e524cbc50/type_bridge-0.1.5.tar.gz",
    "platform": null,
    "description": "# TypeBridge\n\nA modern, Pythonic ORM for TypeDB with an Attribute-based API that aligns with TypeDB's type system.\n\n## Features\n\n- **True TypeDB Semantics**: Attributes are independent types that entities and relations own\n- **Flag System**: Clean API for `@key`, `@unique`, and `@card` annotations\n- **Flexible Cardinality**: Express any cardinality constraint with `Card(min, max)`\n- **Pydantic Integration**: Built on Pydantic v2 for automatic validation, serialization, and type safety\n- **Type-Safe**: Full Python type hints and IDE autocomplete support\n- **Declarative Models**: Define entities and relations using Python classes\n- **Automatic Schema Generation**: Generate TypeQL schemas from your Python models\n- **Data Validation**: Automatic type checking and coercion via Pydantic\n- **JSON Support**: Seamless JSON serialization/deserialization\n- **CRUD Operations**: Simple managers for entity and relation operations\n- **Query Builder**: Pythonic interface for building TypeQL queries\n\n## Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/yourusername/type_bridge.git\ncd type_bridge\n\n# Install with uv\nuv sync\n\n# Or with pip\npip install -e .\n```\n\n## Quick Start\n\n### 1. Define Attribute Types\n\n```python\nfrom type_bridge import String, Integer\n\nclass Name(String):\n    pass\n\nclass Age(Integer):\n    pass\n```\n\n### 2. Define Entities\n\n```python\nfrom typing import Optional\nfrom type_bridge import Entity, EntityFlags, Flag, Key, Card\n\nclass Person(Entity):\n    flags = EntityFlags(type_name=\"person\")  # Optional, defaults to lowercase class name\n\n    # Use Flag() for key/unique markers and Card for cardinality\n    name: Name = Flag(Key)                   # @key (implies @card(1..1))\n    age: Optional[Age]                       # @card(0..1) - optional field\n    email: Email                             # @card(1..1) - default cardinality\n    tags: list[Tag] = Flag(Card(min=2))      # @card(2..) - two or more\n```\n\n### 3. Create Instances\n\n```python\n# Two ways to create instances:\n\n# Option 1: Attribute instances (fully type-safe, zero pyright errors)\nalice = Person(\n    name=Name(\"Alice\"),\n    age=Age(30),\n    email=Email(\"alice@example.com\")\n)\n\n# Option 2: Raw values (convenient, may show pyright warnings)\nbob = Person(name=\"Bob\", age=25, email=Email(\"bob@example.com\"))\n\n# Both work identically at runtime!\n```\n\n### 4. Work with Data\n\n```python\nfrom type_bridge import Database, SchemaManager, EntityManager\n\n# Setup\ndb = Database(address=\"localhost:1729\", database=\"mydb\")\nschema_manager = SchemaManager(db)\nschema_manager.register(Person)\nschema_manager.sync_schema(force=True)\n\n# CRUD\nperson_manager = EntityManager(db, Person)\nalice = person_manager.create(name=\"Alice\", age=30)\nall_people = person_manager.all()\n```\n\n### 4. Cardinality Constraints\n\n```python\nfrom typing import Optional\nfrom type_bridge import Card, Flag\n\nclass Person(Entity):\n    flags = EntityFlags(type_name=\"person\")\n\n    # Cardinality options:\n    name: Name                              # @card(1..1) - exactly one (default)\n    age: Optional[Age]                      # @card(0..1) - zero or one\n    tags: list[Tag] = Flag(Card(min=2))     # @card(2..) - two or more (unbounded)\n    skills: list[Skill] = Flag(Card(max=5)) # @card(0..5) - zero to five (min defaults to 0)\n    jobs: list[Job] = Flag(Card(1, 3))      # @card(1..3) - one to three\n```\n\n### 5. Define Relations\n\n```python\nfrom typing import ClassVar\nfrom type_bridge import Relation, RelationFlags, Role\n\nclass Employment(Relation):\n    flags = RelationFlags(type_name=\"employment\")\n\n    # Define roles with ClassVar\n    employee: ClassVar[Role] = Role(\"employee\", Person)\n    employer: ClassVar[Role] = Role(\"employer\", Company)\n\n    # Relations can own attributes too\n    position: Position                   # @card(1..1)\n    salary: Optional[Salary]             # @card(0..1)\n```\n\n### 6. Using Python Inheritance\n\n```python\nclass Animal(Entity):\n    flags = EntityFlags(abstract=True)  # Abstract entity\n    name: Name\n\nclass Dog(Animal):  # Automatically: dog sub animal in TypeDB\n    breed: Breed\n```\n\n## Documentation\n\nSee [ATTRIBUTE_API.md](ATTRIBUTE_API.md) for complete documentation.\n\n## Pydantic Integration\n\nTypeBridge is built on Pydantic v2, giving you powerful features out of the box:\n\n```python\nfrom typing import Optional\n\nclass Person(Entity):\n    flags = EntityFlags(type_name=\"person\")\n    name: Name = Flag(Key)\n    age: Age = Age(0)\n\n# Automatic validation\nalice = Person(name=\"Alice\", age=\"30\")  # String coerced to int\n\n# JSON serialization\njson_data = alice.model_dump_json()\n\n# JSON deserialization\nbob = Person.model_validate_json('{\"name\": \"Bob\", \"age\": 25}')\n\n# Model copying\nalice_copy = alice.model_copy(update={\"age\": 31})\n```\n\n## Running Examples\n\n```bash\nuv run python examples/basic_usage.py\nuv run python examples/pydantic_features.py\n```\n\n## Running Tests\n\n```bash\nuv run pytest tests/ -v\n```\n\n## Requirements\n\n- Python 3.13+\n- TypeDB 2.x or 3.x\n- typedb-driver==3.5.5\n\n## License\n\nMIT License\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A modern, Pythonic ORM for TypeDB with an Attribute-based API",
    "version": "0.1.5",
    "project_urls": {
        "Documentation": "https://github.com/ds1sqe/type_bridge/blob/master/README.md",
        "Homepage": "https://github.com/ds1sqe/type_bridge",
        "Issues": "https://github.com/ds1sqe/type_bridge/issues",
        "Repository": "https://github.com/ds1sqe/type_bridge"
    },
    "split_keywords": [
        "database",
        " graph-database",
        " orm",
        " typedb",
        " typeql"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b328f75b9fc94777a6d0d55a70f05fe9e3da350c5ffe21e8894d14c202ded9aa",
                "md5": "78d3602007cbb34e7978c11231f5ca25",
                "sha256": "647d21190e389f8eaefeed7bd1ccbda88e4684fff7be8b5309cc250a6438c62c"
            },
            "downloads": -1,
            "filename": "type_bridge-0.1.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "78d3602007cbb34e7978c11231f5ca25",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.13",
            "size": 29143,
            "upload_time": "2025-10-31T03:53:37",
            "upload_time_iso_8601": "2025-10-31T03:53:37.603587Z",
            "url": "https://files.pythonhosted.org/packages/b3/28/f75b9fc94777a6d0d55a70f05fe9e3da350c5ffe21e8894d14c202ded9aa/type_bridge-0.1.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dc31dbb4303fc73c6ef6a3764d85327c0b105a1cbd5485804b76ca0e524cbc50",
                "md5": "e23a428d5be6492725f8708a0184e2d3",
                "sha256": "9c7349528f86fbc9eb0017d30dbd29ae855815373bdca522c0c7938ec7fa8ab3"
            },
            "downloads": -1,
            "filename": "type_bridge-0.1.5.tar.gz",
            "has_sig": false,
            "md5_digest": "e23a428d5be6492725f8708a0184e2d3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.13",
            "size": 54326,
            "upload_time": "2025-10-31T03:53:39",
            "upload_time_iso_8601": "2025-10-31T03:53:39.133121Z",
            "url": "https://files.pythonhosted.org/packages/dc/31/dbb4303fc73c6ef6a3764d85327c0b105a1cbd5485804b76ca0e524cbc50/type_bridge-0.1.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-31 03:53:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ds1sqe",
    "github_project": "type_bridge",
    "github_not_found": true,
    "lcname": "type-bridge"
}
        
Elapsed time: 1.41827s