Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v2.0.0 #12

Merged
merged 121 commits into from
Aug 20, 2024
Merged
Changes from 1 commit
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
a0c0322
add unit conversion utility using qudt
MBueschelberger Apr 5, 2024
39689ca
improve code - check unit compability, add example
MBueschelberger Apr 5, 2024
e93472d
update example, add notebook and more complicated example
MBueschelberger Apr 5, 2024
2392232
update example notebook
MBueschelberger Apr 5, 2024
36e17b0
update example
MBueschelberger Apr 5, 2024
9ab2f27
add semantic bundle for units
MBueschelberger Apr 8, 2024
64d7b12
fix hooks and pytests
MBueschelberger Apr 9, 2024
54e0519
make units sparql object configurable
MBueschelberger Apr 9, 2024
e7d5e79
add custom datatype for unit conversion of individual properties
MBueschelberger Apr 9, 2024
32b8993
finalize conversion of custom properties
MBueschelberger Apr 10, 2024
b2aa1b0
update example notebook
MBueschelberger Apr 10, 2024
4e1a579
fix pre-commit hooks
MBueschelberger Apr 10, 2024
b10bdfc
fix knowledge-select
MBueschelberger Apr 10, 2024
9f3e297
update custom properties - remove unneeded in between
MBueschelberger Apr 10, 2024
88d5ba6
assure that custom properties are updated
MBueschelberger Apr 11, 2024
46f800a
update basic usage notebook
MBueschelberger Apr 11, 2024
62d9d37
Bump version v1.3.3 -> v1.4.0rc0
MBueschelberger Apr 12, 2024
f490d4e
introduce slug indexing
MBueschelberger Apr 12, 2024
b47ec7d
update from main
MBueschelberger Apr 12, 2024
808ce9b
update url property of kitem
MBueschelberger Apr 12, 2024
2d8a268
update list-typing in dsms-apps
MBueschelberger Apr 16, 2024
34d4f5e
update python versions tested in github-ci
MBueschelberger Apr 16, 2024
e6d602b
update ignored flake8 string errors in python3.12
MBueschelberger Apr 16, 2024
1dd6a72
Bump version v1.4.0rc0 -> v1.4.0rc1
MBueschelberger Apr 16, 2024
feef705
Adding DSMS Documentation: Intial Structure and First Draft
PBMISRA95 Apr 16, 2024
c2926ca
adding requirements.txt
PBMISRA95 Apr 16, 2024
6f1d0f8
introduce new unit semantics from data2rdf
MBueschelberger Apr 17, 2024
9472c1e
Bump version v1.4.0rc1 -> v1.4.0rc2
MBueschelberger Apr 17, 2024
87b9792
update printing of kitems
MBueschelberger Apr 17, 2024
108872b
adapt to changes in new knowledge service
MBueschelberger Apr 17, 2024
691db50
adapt payload of custom properties and basic usage notebook
MBueschelberger Apr 17, 2024
fde43b6
Bump version v1.4.0rc2 -> v1.4.0rc3
MBueschelberger Apr 18, 2024
a0fcaf7
debug custom properties
MBueschelberger Apr 18, 2024
5417808
set default data for custom properties
MBueschelberger Apr 19, 2024
9a3ac0f
Bump version v1.4.0rc3 -> v1.4.0rc4
MBueschelberger Apr 19, 2024
a5ed1da
debug kitem update
MBueschelberger Apr 19, 2024
26bc37a
Bump version v1.4.0rc4 -> v1.4.0rc5
MBueschelberger Apr 19, 2024
6628e6c
update default knowledge-item repo name in triplestore
MBueschelberger Apr 19, 2024
47fd8da
Bump version v1.4.0rc5 -> v1.4.0rc6
MBueschelberger Apr 19, 2024
36273fa
further debug default triplestore repo
MBueschelberger Apr 19, 2024
5ebba76
Bump version v1.4.0rc6 -> v1.4.0rc7
MBueschelberger Apr 19, 2024
93ec340
Synching with remote repo
PBMISRA95 Apr 19, 2024
f4b83b0
add cli, autocomplete for units froms iri and displaying of units
MBueschelberger Apr 22, 2024
11de4d5
remove unneeded side effects of kitem properties, update cli, speed u…
MBueschelberger Apr 22, 2024
c6df1bc
update buffering of kitems
MBueschelberger Apr 23, 2024
20bdcc5
Bump version v1.4.0rc7 -> v1.4.0rc8
MBueschelberger Apr 23, 2024
ae29e92
minor change in ktype retrieval
MBueschelberger Apr 23, 2024
d731257
Completion of Installation and Introduction md
PBMISRA95 Apr 23, 2024
509221a
Real examples for tutorials
PBMISRA95 Apr 23, 2024
1efac25
Merge tag 'v1.4.0rc8' into enh/sdk-docs
PBMISRA95 Apr 23, 2024
319d378
update commiting mechanism and clear bugs
MBueschelberger Apr 23, 2024
405caf9
Bump version v1.4.0rc8 -> v1.4.0rc9
MBueschelberger Apr 23, 2024
7bd65de
further speedup committing
MBueschelberger Apr 23, 2024
932e16b
Bump version v1.4.0rc9 -> v1.4.0rc10
MBueschelberger Apr 23, 2024
afc6582
fix attachment by name property
MBueschelberger Apr 24, 2024
3568a6d
Bump version v1.4.0rc10 -> v1.4.0rc11
MBueschelberger Apr 24, 2024
eb65bb5
Revert "Real examples for tutorials"
PBMISRA95 May 1, 2024
1357e34
Installation,index and introduction md files updation
PBMISRA95 May 1, 2024
695a26d
development until 02nd May: Basic version of the final iteration of I…
PBMISRA95 May 2, 2024
6d505d5
Merge tag 'v1.4.0rc11' into enh/sdk-docs
PBMISRA95 May 2, 2024
ff4ab07
First major iteration
PBMISRA95 May 2, 2024
d72a723
Add heading in app availability and HDF5 Jupyter notebook and 1st com…
PBMISRA95 May 3, 2024
e1c9281
add logging messages for debugging
MBueschelberger May 7, 2024
914e04b
update logging capabilities
MBueschelberger May 10, 2024
23f8689
Bump version v1.4.0rc11 -> v1.4.0rc12
MBueschelberger May 10, 2024
9a22c10
rename kproperty and kproperty item, add more debugging messages
MBueschelberger May 10, 2024
3472f82
sync with remote repo
PBMISRA95 May 10, 2024
0252591
fix commiting changes in linked kitems and kitem apps
MBueschelberger May 13, 2024
3a332a4
update parsing of kitems
MBueschelberger May 13, 2024
9a8e4cf
Bump version v1.4.0rc12 -> v1.4.0rc13
MBueschelberger May 13, 2024
c38b95d
fix linked kitems validator
MBueschelberger May 13, 2024
1dedbd4
Bump version v1.4.0rc13 -> v1.4.0rc14
MBueschelberger May 13, 2024
d543640
debug numerical data type for displaying units, debug utilities for c…
MBueschelberger May 13, 2024
d2bc9d4
Bump version v1.4.0rc14 -> v1.4.0rc15
MBueschelberger May 13, 2024
d41f384
Enabling Docker, dedicated README.md for docs, fixing installtion.md
PBMISRA95 May 15, 2024
efe3bb7
add functionality to make avatar
MBueschelberger May 15, 2024
93d8309
update setup.cfg
MBueschelberger May 15, 2024
fe7db87
debug setup.cfg
MBueschelberger May 16, 2024
3305ea4
fix pyling issues
MBueschelberger May 16, 2024
19e0f89
add funtion to KItem
MBueschelberger May 16, 2024
b17db7a
Bump version v1.4.0rc15 -> v1.4.0rc16
MBueschelberger May 16, 2024
1d237d1
add functionality to download files as bytes
MBueschelberger Jun 6, 2024
a381d19
Bump version v1.4.0rc16 -> v1.4.0rc17
MBueschelberger Jun 6, 2024
5acb194
update summary model for linked kitems§
MBueschelberger Jun 10, 2024
d07f258
Bump version v1.4.0rc17 -> v1.4.0rc18
MBueschelberger Jun 10, 2024
2bd7041
add new app concept
MBueschelberger Jun 13, 2024
5512c56
rename query parameter
MBueschelberger Jun 13, 2024
8fcbc2b
Bump version v1.4.0rc18 -> v1.4.0rc19
MBueschelberger Jun 13, 2024
570f7ff
finalising dsms-sdk documentation
PBMISRA95 Jun 27, 2024
7677ace
Change of relative path while DSMS intialisation in tutorials
PBMISRA95 Jun 27, 2024
1b83bb0
Merge tag 'v1.4.0rc19' into enh/sdk-docs
PBMISRA95 Jun 27, 2024
e4fe554
merged with v1.4.0rc19
PBMISRA95 Jun 27, 2024
7c1b81d
fixing reminder tip formatting in dsms_config_schema.md
PBMISRA95 Jun 27, 2024
3f47987
Removing extra README.md in docs/source
PBMISRA95 Jun 27, 2024
afdecef
update schema for attachment comparison during commit
MBueschelberger Aug 1, 2024
dbc7b1e
Bump version v1.4.0rc19 -> v1.4.0rc20
MBueschelberger Aug 1, 2024
fb3219d
rename hdf5 to dataframe
MBueschelberger Aug 1, 2024
6a75006
Bump version v1.4.0rc20 -> v1.4.0rc21
MBueschelberger Aug 1, 2024
5b988f5
update committing apps
MBueschelberger Aug 7, 2024
3533133
update app specification
MBueschelberger Aug 8, 2024
89f71b1
update submission of app specs, add job logs, debug waiting for job r…
MBueschelberger Aug 8, 2024
a551419
update app config api requesting, add attachment by content
MBueschelberger Aug 8, 2024
4b89261
apply pre-commit hooks
MBueschelberger Aug 8, 2024
e9d208b
Bump version v1.4.0rc21 -> v1.4.0rc22
MBueschelberger Aug 8, 2024
ce89a56
add deletion of app configs, debug updating of app configs
MBueschelberger Aug 9, 2024
a7717a7
introduce refresh option for kitem
MBueschelberger Aug 16, 2024
40476ee
Bump version v1.4.0rc22 -> v1.4.0rc23
MBueschelberger Aug 16, 2024
29581fd
add pyyaml to requirements
MBueschelberger Aug 16, 2024
de9373c
Bump version v1.4.0rc23 -> v1.4.0rc24
MBueschelberger Aug 16, 2024
88c9de9
update kitem refreshing also for dataframes
MBueschelberger Aug 16, 2024
c409437
Bump version v1.4.0rc24 -> v1.4.0rc25
MBueschelberger Aug 16, 2024
39137de
debug deletion of dataframes
MBueschelberger Aug 16, 2024
f2a2c1d
Merge branch 'dev/unit-conversion' into enh/sdk-docs
MBueschelberger Aug 16, 2024
a3ad955
refactor docs
MBueschelberger Aug 16, 2024
1227c54
rebug doc requirements
MBueschelberger Aug 19, 2024
0325c3d
update sphinx setup
MBueschelberger Aug 19, 2024
98556e3
update docs
MBueschelberger Aug 19, 2024
0bebb1d
update docs
MBueschelberger Aug 19, 2024
4a3f1b4
update docs for KItem schema
MBueschelberger Aug 20, 2024
c48257c
Merge pull request #23 from MI-FraunhoferIWM/enh/sdk-docs
MBueschelberger Aug 20, 2024
71014e8
update tutortials and add readtherdocs config
MBueschelberger Aug 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
update committing apps
MBueschelberger committed Aug 7, 2024
commit 5b988f53463f6e700510061633bdda8e1fe483fd
3 changes: 2 additions & 1 deletion dsms/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
"""DSMS top module"""

from dsms.apps import App
from dsms.core.configuration import Configuration
from dsms.core.context import Context
from dsms.core.dsms import DSMS
from dsms.knowledge.kitem import KItem
from dsms.knowledge.ktype import KType

__all__ = ["DSMS", "Configuration", "Context", "KItem", "KType"]
__all__ = ["DSMS", "Configuration", "Context", "KItem", "KType", "App"]
144 changes: 125 additions & 19 deletions dsms/apps/apps.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,140 @@
"""DSMS apps models"""

import logging
import urllib.parse
from typing import TYPE_CHECKING, Optional

from pydantic import BaseModel, Field
from pydantic import ( # isort:skip
BaseModel,
ConfigDict,
Field,
field_validator,
model_validator,
)

from dsms.core.utils import _perform_request
from dsms.apps.utils import ( # isort:skip
_get_app_specification,
_get_available_apps,
)


from dsms.core.logging import handler # isort:skip


logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.propagate = False

if TYPE_CHECKING:
from typing import Any

from dsms import DSMS, Context


class App(BaseModel):
"""KItem app list"""

filename: str = Field(
..., description="File name of the notebook in the DSMS."
filename: Optional[str] = Field(
"", description="File name of the app in the DSMS."
)
basename: str = Field(
..., description="Base name of the notebook in the DSMS."
basename: str = Field(..., description="Base name of the app in the DSMS.")
folder: Optional[str] = Field(
"", description="Directory of the app in the DSMS."
)
folder: str = Field(
..., description="Directory of the notebook in the DSMS."

specification: Optional[str] = Field(
None,
description="File path for content of YAML Specification of the app",
)

model_config = ConfigDict(
extra="forbid",
validate_assignment=True,
validate_default=True,
arbitrary_types_allowed=True,
)

def get(self, as_html: bool = False) -> str:
"""Download the jupyter notebook"""
safe_filename = urllib.parse.quote_plus(self.filename)
response = _perform_request(
f"knowledge/api/apps/{safe_filename}",
"get",
params={"as_html": as_html},
def __init__(self, **kwargs: "Any") -> None:
"""Initialize the KItem"""
from dsms import DSMS

logger.debug("Initialize KItem with model data: %s", kwargs)

# set dsms instance if not already done
if not self.dsms:
self.dsms = DSMS()

# initialize the app
super().__init__(**kwargs)

# add app to buffer
if (
not self.in_backend
and self.basename not in self.context.buffers.created
):
logger.debug(
"Marking App with name `%s` as created and updated during App initialization.",
self.basename,
)
self.context.buffers.created.update({self.basename: self})
self.context.buffers.updated.update({self.basename: self})

logger.debug("App initialization successful.")

def __setattr__(self, name, value) -> None:
"""Add app to updated-buffer if an attribute is set"""
super().__setattr__(name, value)
logger.debug(
"Setting property with key `%s` on KItem level: %s.", name, value
)
if not response.ok:
message = f"Something went wrong downloading app `{self.filename}`: {response.text}"
raise RuntimeError(message)
return response.text
if self.basename not in self.context.buffers.updated:
logger.debug(
"Setting App with name `%s` as updated during App.__setattr__",
self.id,
)
self.context.buffers.updated.update({self.basename: self})

@field_validator("basename")
@classmethod
def validate_basename(cls, value: str) -> str:
"""Check whether the basename of the app contains invalid characters."""
new_value = urllib.parse.quote_plus(value)
if not new_value == value:
raise ValueError(f"Basename contains invalid characters: {value}")

@model_validator(mode="after")
@classmethod
def validate_app(cls, self: "App") -> "App":
"""Validate app definition."""
if self.in_backend and not self.specification:
self.specification = _get_app_specification(self.filename)
logger.info(
"App already exists in backend. Fetched the YAML specification."
)
return self

@property
def in_backend(self) -> bool:
"""Checks whether the app already exists."""
return self.basename in [
app.get("basename") for app in _get_available_apps()
]

@property
def context(cls) -> "Context":
"""Getter for Context"""
from dsms import ( # isort:skip
Context,
)

return Context

@property
def dsms(self) -> "DSMS":
"""DSMS context getter"""
return self.context.dsms

@dsms.setter
def dsms(self, value: "DSMS") -> None:
"""DSMS context setter"""
self.context.dsms = value
20 changes: 16 additions & 4 deletions dsms/apps/utils.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,31 @@
"""KItem Apps utils"""

import urllib.parse
from typing import TYPE_CHECKING

from dsms.apps.apps import App
from dsms.core.utils import _perform_request

if TYPE_CHECKING:
from typing import List
from typing import Any, Dict, List


def _get_available_apps() -> "List[App]":
def _get_available_apps() -> "List[Dict[str, Any]]":
"""Get available KItem app."""
response = _perform_request("api/knowledge/apps", "get")
if not response.ok:
message = f"""Something went wrong fetching the available app
list in the DSMS: {response.text}"""
raise RuntimeError(message)
return [App(**app) for app in response.json()]
return response.json()


def _get_app_specification(appname) -> str:
safe_filename = urllib.parse.quote_plus(appname)
response = _perform_request(
f"knowledge/api/apps/{safe_filename}",
"get",
)
if not response.ok:
message = f"Something went wrong downloading app `{appname}`: {response.text}"
raise RuntimeError(message)
return response.text
4 changes: 3 additions & 1 deletion dsms/core/dsms.py
Original file line number Diff line number Diff line change
@@ -182,7 +182,9 @@ def kitems(cls) -> "List[KItem]":
@property
def apps(cls) -> "List[App]":
"""Return available KItem apps in the DSMS"""
return _get_available_apps()
from dsms.apps import App

return [App(**app) for app in _get_available_apps()]

@property
def buffers(cls) -> "Buffers":
140 changes: 102 additions & 38 deletions dsms/knowledge/utils.py
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
import base64
import io
import logging
import os
import re
import warnings
from enum import Enum
@@ -33,6 +34,7 @@
from dsms.knowledge.search import SearchResult # isort:skip

if TYPE_CHECKING:
from dsms.apps import App
from dsms.core.context import Buffers
from dsms.knowledge import KItem, KType

@@ -492,55 +494,99 @@ def _commit(buffers: "Buffers") -> None:
logger.debug("Committing successful, clearing buffers.")


def _commit_created(buffer: "Dict[str, KItem]") -> dict:
def _commit_created(buffer: "Dict[str, Union[KItem, KType, App]]") -> dict:
"""Commit the buffer for the `created` buffers"""
for kitem in buffer.values():
_create_new_kitem(kitem)
from dsms import App, KItem, KType

for obj in buffer.values():
if isinstance(obj, KItem):
_create_new_kitem(obj)
elif isinstance(obj, App):
_create_or_update_app(obj)
elif isinstance(obj, KType):
raise NotImplementedError(
"Committing of KTypes not implemented yet."
)
else:
raise TypeError(
f"Object `{obj}` of type {type(obj)} cannot be committed."
)


def _commit_updated(buffer: "Dict[str, KItem]") -> None:
def _commit_updated(buffer: "Dict[str, Union[KItem, App, KType]]") -> None:
"""Commit the buffer for the `updated` buffers"""
for new_kitem in buffer.values():
old_kitem = _get_kitem(new_kitem.id, as_json=True)
from dsms import App, KItem, KType

for obj in buffer.values():
if isinstance(obj, KItem):
_commit_updated_kitem(obj)
elif isinstance(obj, App):
_create_or_update_app(obj, overwrite=True)
elif isinstance(obj, KType):
raise NotImplementedError(
"Committing of KTypes not implemented yet."
)
else:
raise TypeError(
f"Object `{obj}` of type {type(obj)} cannot be committed."
)


def _commit_updated_kitem(new_kitem: "KItem") -> None:
"""Commit the updated KItems"""
old_kitem = _get_kitem(new_kitem.id, as_json=True)
logger.debug(
"Fetched data from old KItem with id `%s`: %s",
new_kitem.id,
old_kitem,
)
if old_kitem:
if isinstance(new_kitem.dataframe, pd.DataFrame):
logger.debug(
"New KItem data has `pd.DataFrame`. Will push as dataframe."
)
_update_dataframe(new_kitem.id, new_kitem.dataframe)
new_kitem.dataframe = _inspect_dataframe(new_kitem.id)
elif isinstance(
new_kitem.dataframe, type(None)
) and _inspect_dataframe(new_kitem.id):
_delete_dataframe(new_kitem.id)
_update_kitem(new_kitem, old_kitem)
_update_attachments(new_kitem, old_kitem)
if new_kitem.avatar.file or new_kitem.avatar.include_qr:
_commit_avatar(new_kitem)
new_kitem.in_backend = True
logger.debug(
"Fetched data from old KItem with id `%s`: %s",
new_kitem.id,
old_kitem,
"Fetching updated KItem from remote backend: %s", new_kitem.id
)
if old_kitem:
if isinstance(new_kitem.dataframe, pd.DataFrame):
logger.debug(
"New KItem data has `pd.DataFrame`. Will push as dataframe."
)
_update_dataframe(new_kitem.id, new_kitem.dataframe)
new_kitem.dataframe = _inspect_dataframe(new_kitem.id)
elif isinstance(
new_kitem.dataframe, type(None)
) and _inspect_dataframe(new_kitem.id):
_delete_dataframe(new_kitem.id)
_update_kitem(new_kitem, old_kitem)
_update_attachments(new_kitem, old_kitem)
if new_kitem.avatar.file or new_kitem.avatar.include_qr:
_commit_avatar(new_kitem)
new_kitem.in_backend = True
for key, value in _get_kitem(new_kitem.id, as_json=True).items():
logger.debug(
"Fetching updated KItem from remote backend: %s", new_kitem.id
"Set updated property `%s` for KItem with id `%s` after commiting: %s",
key,
new_kitem.id,
value,
)
for key, value in _get_kitem(new_kitem.id, as_json=True).items():
logger.debug(
"Set updated property `%s` for KItem with id `%s` after commiting: %s",
key,
new_kitem.id,
value,
)
setattr(new_kitem, key, value)
setattr(new_kitem, key, value)


def _commit_deleted(buffer: "Dict[str, KItem]") -> None:
def _commit_deleted(buffer: "Dict[str, Union[KItem, KType, App]]") -> None:
"""Commit the buffer for the `deleted` buffers"""
for kitem in buffer.values():
_delete_dataframe(kitem.id)
_delete_kitem(kitem)
from dsms import App, KItem, KType

for obj in buffer.values():
if isinstance(obj, KItem):
_delete_dataframe(obj.id)
_delete_kitem(obj)
elif isinstance(obj, App):
raise NotImplementedError("Deletion of Apps not implemented yet.")
elif isinstance(obj, KType):
raise NotImplementedError(
"Deletion of KTypes not implemented yet."
)
else:
raise TypeError(
f"Object `{obj}` of type {type(obj)} cannot be committed or deleted."
)


def _split_iri(iri: str) -> List[str]:
@@ -728,3 +774,21 @@ def _get_avatar(kitem: "KItem") -> Image.Image:
response = _perform_request(f"api/knowledge/avatar/{kitem.id}", "get")
buffer = io.BytesIO(response.content)
return Image.open(buffer)


def _create_or_update_app(app: "App", overwrite=False) -> None:
if os.path.exists(app.specification):
with open(app.specification, mode="rb") as file:
upload_file = {"dataFile": file}
else:
upload_file = {"dataFile": io.StringIO(app.specification)}
response = _perform_request(
f"knowledge/api/apps/argo/{app.basename}",
"put",
files=upload_file,
params={"overwrite": overwrite},
)
if not response.ok:
message = f"Something went wrong uploading app with name `{app.basename}`: {response.text}"
raise RuntimeError(message)
return response.text