Skip to content
This repository has been archived by the owner on Apr 21, 2021. It is now read-only.
/ pydiggy Public archive

Dgraph to Python object mapper, and schema generator

License

Notifications You must be signed in to change notification settings

ahopkins/pydiggy

Repository files navigation

IMPORTANT NOTICE: WHile the concepts in here still work, with the release of dgraph 1.1 this project is being put aside. There are many changes that are needed to bring it up to date with (for example) enforced 1:1 or 1:many relationships. I am no longer using dgraph and therefore not currently supporting this package. I may come back to it in the future.

PyDiggy

Dgraph to Python object mapper

  • Free software: MIT license

Note

Python 3.7 only. Sorry.

EXAMPLE

# ./examples/__init__

from .basic import *  # noqa


# ./examples/basic.py

from __future__ import annotations


from pydiggy import Node
from typing import List


class Region(Node):
    area: int
    population: int
    name: str
    borders: List[Region]

CLI

Point the CLI utility at an existing module to generate a Dgraph schema.

$ python3 -m pydiggy generate examples

Generating schema for: examples

Nodes found: (1)
    - Region

Your schema:
~~~~~~~~

Region: bool @index(bool) .
_type: string .
area: int .
borders: uid .
name: string .
population: int .

~~~~~~~~

GENERATE MUTATIONS

from pydiggy import generate_mutation, Facets

por = Region(uid=0x11, name="Portugal")
spa = Region(uid=0x12, name="Spain")
gas = Region(uid=0x13, name="Gascony")
mar = Region(uid=0x14, name="Marseilles")

por.borders = [spa]
spa.borders = [por, gas, mar]
gas.borders = [Facets(spa, foo='bar', hello='world'), mar]
mar.borders = [spa, gas]

por.stage()
spa.stage()
gas.stage()
mar.stage()

print(generate_mutation())

The result:

{
    set {
        <0x11> <Region> "true" .
        <0x11> <_type> "Region" .
        <0x11> <name> "Portugal" .
        <0x11> <borders> <0x12> .
        <0x12> <Region> "true" .
        <0x12> <_type> "Region" .
        <0x12> <name> "Spain" .
        <0x12> <borders> <0x11> .
        <0x12> <borders> <0x13> .
        <0x12> <borders> <0x14> .
        <0x13> <Region> "true" .
        <0x13> <_type> "Region" .
        <0x13> <name> "Gascony" .
        <0x13> <borders> <0x12> (foo="bar", hello="world") .
        <0x13> <borders> <0x14> .
        <0x14> <Region> "true" .
        <0x14> <_type> "Region" .
        <0x14> <name> "Marseilles" .
        <0x14> <borders> <0x12> .
        <0x14> <borders> <0x13> .
    }
}

HYDRATE FROM JSON TO PYTHON OBJECTS

Given some response from Dgraph:

{
    "data": {
        "allRegions": [
            {
                "uid": "0x11",
                "_type": "Region",
                "name": "Portugal",
                "borders": [
                    {
                        "uid": "0x12",
                        "_type": "Region",
                        "name": "Spain"
                    }
                ]
            },
            {
                "uid": "0x12",
                "_type": "Region",
                "name": "Spain",
                "borders": [
                    {
                        "uid": "0x11",
                        "_type": "Region",
                        "name": "Portugal"
                    },
                    {
                        "uid": "0x13",
                        "_type": "Region",
                        "name": "Gascony"
                    },
                    {
                        "uid": "0x14",
                        "_type": "Region",
                        "name": "Marseilles"
                    }
                ]
            },
            {
                "uid": "0x13",
                "_type": "Region",
                "name": "Gascony",
                "borders": [
                    {
                        "uid": "0x12",
                        "_type": "Region",
                        "name": "Spain",
                        "borders|foo": "bar",
                        "borders|hello": "world"
                    },
                    {
                        "uid": "0x14",
                        "_type": "Region",
                        "name": "Marseilles"
                    }
                ]
            },
            {
                "uid": "0x14",
                "_type": "Region",
                "name": "Marseilles",
                "borders": [
                    {
                        "uid": "0x12",
                        "_type": "Region",
                        "name": "Spain"
                    },
                    {
                        "uid": "0x13",
                        "_type": "Region",
                        "name": "Gascony"
                    }
                ]
            }
        ]
    },
    "extensions": {
        "server_latency": {
            "parsing_ns": 23727,
            "processing_ns": 2000535,
            "encoding_ns": 7803450
        },
        "txn": {
            "start_ts": 117,
            "lin_read": {
                "ids": {
                    "1": 49
                }
            }
        }
    }
}

We can turn it into some Python objects:

>>> data = hydrate(retrieved_data)

{'allRegions': [<Region:17>, <Region:18>, <Region:19>, <Region:20>]}

About

Dgraph to Python object mapper, and schema generator

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published