Commit 76d95c46 authored by Eelco van der Wel's avatar Eelco van der Wel :speech_balloon:
Browse files

Merge branch 'schema-overwrites' into 'dev'

Improve overwriting central schema classes

See merge request !154
Showing with 113 additions and 36 deletions
+113 -36
%% Cell type:code id:2d446f01 tags:
``` python
%load_ext autoreload
%autoreload 2
```
%% Output
The autoreload extension is already loaded. To reload it, use:
%reload_ext autoreload
%% Cell type:code id:870e5db2 tags:
``` python
import inspect
from pymemri.data import central_schema
from pymemri.data import _central_schema
from pymemri.pod.client import PodClient
```
%% Cell type:code id:6d5242f4 tags:
``` python
# Get all central schema classes
central_schema = {
k: v
for k, v in inspect.getmembers(central_schema)
if inspect.isclass(v) and v.__module__ == "pymemri.data.central_schema"
for k, v in inspect.getmembers(_central_schema)
if inspect.isclass(v) and v.__module__ == "pymemri.data._central_schema"
}
print("num schema classes:", len(central_schema))
```
%% Output
num schema classes: 42
num schema classes: 44
%% Cell type:code id:943e20bc tags:
``` python
client = PodClient()
for k, v in central_schema.items():
assert client.add_to_schema(v), f"Could not add {k} to schema"
```
%% Cell type:code id:8ea120f0 tags:
``` python
from pymemri.data.central_schema import EmailMessage, Country, Receipt, Account
from pymemri.data.schema import EmailMessage, Country, Receipt, Account
from datetime import datetime
item_1 = EmailMessage(starred=True, content="This is a test", dateSent=datetime.now())
item_2 = Country(name="Belgium")
item_3 = Receipt(category="clothing", store="clothing store", totalCost=100000)
item_4 = Account(displayName="1234", identifier="5678", isMe=False, service="whatsapp")
assert client.bulk_action(create_items=[item_1, item_2, item_3, item_4])
```
%% Output
BULK: Writing 4/4 items/edges
Completed Bulk action, written 4 items/edges
......
......@@ -33,6 +33,7 @@ class Account(Item):
"ownCurrency",
"owner",
"trust",
"profilePicture",
]
def __init__(
......@@ -57,6 +58,7 @@ class Account(Item):
ownCurrency: list = None,
owner: list = None,
trust: list = None,
profilePicture: list = None,
**kwargs
):
super().__init__(**kwargs)
......@@ -78,12 +80,15 @@ class Account(Item):
# Edges
self.changelog: list = changelog if changelog is not None else []
self.cryptoTransaction: list = cryptoTransaction if cryptoTransaction is not None else []
self.cryptoTransaction: list = (
cryptoTransaction if cryptoTransaction is not None else []
)
self.location: list = location if location is not None else []
self.network: list = network if network is not None else []
self.ownCurrency: list = ownCurrency if ownCurrency is not None else []
self.owner: list = owner if owner is not None else []
self.trust: list = trust if trust is not None else []
self.profilePicture: list = profilePicture if profilePicture is not None else []
class AuditItem(Item):
......@@ -114,7 +119,9 @@ class CVUStoredDefinition(Item):
"itemType",
"name",
"querystr",
"renderer",
"selector",
"type",
]
edges = Item.edges + []
......@@ -125,7 +132,9 @@ class CVUStoredDefinition(Item):
itemType: str = None,
name: str = None,
querystr: str = None,
renderer: str = None,
selector: str = None,
type: str = None,
**kwargs
):
super().__init__(**kwargs)
......@@ -136,7 +145,9 @@ class CVUStoredDefinition(Item):
self.itemType: Optional[str] = itemType
self.name: Optional[str] = name
self.querystr: Optional[str] = querystr
self.renderer: Optional[str] = renderer
self.selector: Optional[str] = selector
self.type: Optional[str] = type
class CreativeWork(Item):
......@@ -182,9 +193,13 @@ class CreativeWork(Item):
self.transcript: Optional[str] = transcript
# Edges
self.contentLocation: list = contentLocation if contentLocation is not None else []
self.contentLocation: list = (
contentLocation if contentLocation is not None else []
)
self.file: list = file if file is not None else []
self.locationCreated: list = locationCreated if locationCreated is not None else []
self.locationCreated: list = (
locationCreated if locationCreated is not None else []
)
self.writtenBy: list = writtenBy if writtenBy is not None else []
......@@ -210,7 +225,9 @@ class CryptoCurrency(Item):
self.topic: Optional[str] = topic
# Edges
self.currencySetting: list = currencySetting if currencySetting is not None else []
self.currencySetting: list = (
currencySetting if currencySetting is not None else []
)
self.picture: list = picture if picture is not None else []
......@@ -308,6 +325,19 @@ class CurrencySetting(Item):
self.wallet: list = wallet if wallet is not None else []
class Dataset(Item):
description = """A Dataset of items."""
properties = Item.properties + ["name", "querystr"]
edges = Item.edges + []
def __init__(self, name: str = None, querystr: str = None, **kwargs):
super().__init__(**kwargs)
# Properties
self.name: Optional[str] = name
self.querystr: Optional[str] = querystr
class Diet(Item):
description = """A strategy of regulating the intake of food to achieve or maintain a specific health-related goal."""
properties = Item.properties + [
......@@ -357,15 +387,19 @@ class Diet(Item):
self.transcript: Optional[str] = transcript
# Edges
self.contentLocation: list = contentLocation if contentLocation is not None else []
self.contentLocation: list = (
contentLocation if contentLocation is not None else []
)
self.file: list = file if file is not None else []
self.locationCreated: list = locationCreated if locationCreated is not None else []
self.locationCreated: list = (
locationCreated if locationCreated is not None else []
)
self.writtenBy: list = writtenBy if writtenBy is not None else []
class File(Item):
description = """Any file that can be stored on disk."""
properties = Item.properties + ["filename", "keystr", "nonce", "sha256"]
properties = Item.properties + ["filename", "keystr", "nonce", "sha256", "starred"]
edges = Item.edges + []
def __init__(
......@@ -374,6 +408,7 @@ class File(Item):
keystr: str = None,
nonce: str = None,
sha256: str = None,
starred: bool = None,
**kwargs
):
super().__init__(**kwargs)
......@@ -383,6 +418,7 @@ class File(Item):
self.keystr: Optional[str] = keystr
self.nonce: Optional[str] = nonce
self.sha256: Optional[str] = sha256
self.starred: Optional[bool] = starred
class Integrator(Item):
......@@ -473,6 +509,48 @@ class LabelAnnotation(Item):
self.annotatedItem: list = annotatedItem if annotatedItem is not None else []
class LabelingDataType(Item):
description = """A labelling data type definition."""
properties = Item.properties + ["name", "icon"]
edges = Item.edges + ["dataset"]
def __init__(
self, name: str = None, icon: str = None, dataset: list = None, **kwargs
):
super().__init__(**kwargs)
# Properties
self.name: Optional[str] = name
self.icon: Optional[str] = icon
# Edges
self.dataset: list = dataset if dataset is not None else []
class LabelingTask(Item):
description = """A labelling task definition."""
properties = Item.properties + ["name"]
edges = Item.edges + ["labelOption", "dataset", "view"]
def __init__(
self,
name: str = None,
labelOption: list = None,
dataset: list = None,
view: list = None,
**kwargs
):
super().__init__(**kwargs)
# Properties
self.name: Optional[str] = name
# Edges
self.labelOption: list = labelOption if labelOption is not None else []
self.dataset: list = dataset if dataset is not None else []
self.view: list = view if view is not None else []
class Location(Item):
description = """The location of something."""
properties = Item.properties + ["latitude", "longitude"]
......@@ -701,7 +779,9 @@ class Person(Item):
self.hasPhoneNumber: list = hasPhoneNumber if hasPhoneNumber is not None else []
self.label: list = label if label is not None else []
self.me: list = me if me is not None else []
self.medicalCondition: list = medicalCondition if medicalCondition is not None else []
self.medicalCondition: list = (
medicalCondition if medicalCondition is not None else []
)
self.mergedFrom: list = mergedFrom if mergedFrom is not None else []
self.profilePicture: list = profilePicture if profilePicture is not None else []
self.relationship: list = relationship if relationship is not None else []
......@@ -1150,29 +1230,25 @@ class Note(WrittenWork):
class EmailMessage(Message):
description = """A single email message."""
properties = Message.properties + ["starred", "read"]
edges = Message.edges + ["bcc", "cc", "message", "replyTo", "inbox"]
properties = Message.properties + ["starred"]
edges = Message.edges + ["bcc", "cc", "message", "replyTo"]
def __init__(
self,
starred: bool = None,
read: bool = None,
bcc: list = None,
cc: list = None,
message: list = None,
replyTo: list = None,
inbox: list = None,
**kwargs
):
super().__init__(**kwargs)
# Properties
self.starred: Optional[bool] = starred
self.read: Optional[bool] = read
# Edges
self.bcc: list = bcc if bcc is not None else []
self.cc: list = cc if cc is not None else []
self.message: list = message if message is not None else []
self.replyTo: list = replyTo if replyTo is not None else []
self.inbox: list = inbox if inbox is not None else []
import random, string
from .itembase import ItemBase, Edge, Item
from .central_schema import *
from ._central_schema import *
from .photo import Photo
......
#!/bin/bash
SCHEMA_REPO="https://gitlab.memri.io/memri/schema.git"
BRANCH="schema-cleanup"
BRANCH="dev"
OUT_DIR="$(pwd)/pymemri/data"
FILENAME="central_schema.py"
FILENAME="_central_schema.py"
if [ ! -d $OUT_DIR ];then
echo "Run script from pymemri root folder."
......@@ -14,11 +14,12 @@ mkdir -p /tmp/pymemri && cd /tmp/pymemri
{
cd schema
git checkout $BRANCH
git pull
} &> /dev/null || {
} || {
git clone -b $BRANCH $SCHEMA_REPO
cd schema
} &> /dev/null
}
python tools/export_pymemri.py -o $OUT_DIR/$FILENAME
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment