From 01a4c2fc4bcbcce26c29dc9771dedeef5256156b Mon Sep 17 00:00:00 2001 From: Matthias Baumgartner Date: Sat, 4 Mar 2023 16:00:46 +0100 Subject: schema requirements checking --- tagit/__init__.py | 1 + tagit/apps/desktop.py | 17 +++--- tagit/apps/port-schema.nt | 115 ---------------------------------------- tagit/assets/required_schema.nt | 110 ++++++++++++++++++++++++++++++++++++++ tagit/widgets/session.py | 12 ++--- 5 files changed, 123 insertions(+), 132 deletions(-) delete mode 100644 tagit/apps/port-schema.nt create mode 100644 tagit/assets/required_schema.nt diff --git a/tagit/__init__.py b/tagit/__init__.py index 0e10d7b..b0c602d 100644 --- a/tagit/__init__.py +++ b/tagit/__init__.py @@ -41,6 +41,7 @@ kivy.require('1.9.1') resource_add_path(os.path.join(os.path.dirname(__file__), 'assets', 'icons', 'kivy')) resource_add_path(os.path.join(os.path.dirname(__file__), 'assets', 'fonts', 'kivy')) resource_add_path(os.path.join(os.path.dirname(__file__), 'assets', 'themes')) +resource_add_path(os.path.join(os.path.dirname(__file__), 'assets')) # load font from kivy.core.text import LabelBase diff --git a/tagit/apps/desktop.py b/tagit/apps/desktop.py index b02c8f1..d934649 100644 --- a/tagit/apps/desktop.py +++ b/tagit/apps/desktop.py @@ -10,6 +10,7 @@ import typing # kivy imports from kivy.app import App +from kivy.resources import resource_find from kivy.uix.settings import SettingsWithSidebar # tagit imports @@ -41,21 +42,15 @@ class TagitApp(App): cfg = load_settings(TAGITRC, 0) - # FIXME: mb/port/bsfs # open BSFS storage store = bsfs.Open(cfg('session', 'bsfs')) # check storage schema - # FIXME: Move somewhere else?! - with open(os.path.join(os.path.dirname(__file__), 'port-schema.nt'), 'rt') as ifile: + with open(resource_find('required_schema.nt'), 'rt') as ifile: required_schema = bsfs.schema.from_string(ifile.read()) - # FIXME: Since the store isn't persistent, we migrate to the required one here. - #if not required_schema <= store.schema: - # raise Exception('') - store.migrate(required_schema) - - # FIXME: debug: add some data to the storage - from . import port_data - port_data.add_port_data(store) + if not required_schema.consistent_with(store.schema): + raise Exception("The storage's schema is incompatible with tagit's requirements") + if not required_schema <= store.schema: + store.migrate(required_schema | store.schema) # create widget return desktop.MainWindow(cfg, store, None) # FIXME: expects cfg, stor, log arguments diff --git a/tagit/apps/port-schema.nt b/tagit/apps/port-schema.nt deleted file mode 100644 index 2e70cad..0000000 --- a/tagit/apps/port-schema.nt +++ /dev/null @@ -1,115 +0,0 @@ -# common external prefixes -prefix rdf: -prefix rdfs: -prefix xsd: -prefix schema: - -# common bsfs prefixes -prefix bsfs: -prefix bsl: -prefix bsn: -prefix bse: -prefix bst: -prefix bsg: -prefix bsp: - -# essential nodes -bsn:Entity rdfs:subClassOf bsfs:Node . -bsn:Preview rdfs:subClassOf bsfs:Node . -bsn:Tag rdfs:subClassOf bsfs:Node . -bsn:Group rdfs:subClassOf bsfs:Node . - -# common definitions -bsl:BinaryBlob rdfs:subClassOf bsfs:Literal . -bsl:URI rdfs:subClassOf bsfs:Literal . -bsl:Number rdfs:subClassOf bsfs:Literal . -bsl:Time rdfs:subClassOf bsfs:Literal . - rdfs:subClassOf bsl:BinaryBlob . -xsd:string rdfs:subClassOf bsfs:Literal . -xsd:integer rdfs:subClassOf bsl:Number . -xsd:float rdfs:subClassOf bsl:Number . - -bse:filename rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range xsd:string ; - rdfs:label "File name"^^xsd:string ; - schema:description "Filename of entity in some filesystem."^^xsd:string ; - bsfs:unique "true"^^xsd:boolean . - -bse:filesize rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range xsd:integer ; - rdfs:label "File size"^^xsd:string ; - schema:description "File size of entity in some filesystem."^^xsd:string ; - bsfs:unique "true"^^xsd:boolean . - -bse:mime rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range xsd:string ; - bsfs:unique "true"^^xsd:boolean . - -bse:preview rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range bsn:Preview . - -bse:tag rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range bsn:Tag . - -bst:label rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Tag ; - rdfs:range xsd:string ; - bsfs:unique "true"^^xsd:boolean . - -bse:comment rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsfs:Node ; - rdfs:range xsd:string . - -bse:group rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range bsn:Group . - -bsg:label rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Group ; - rdfs:range xsd:string ; - bsfs:unique "true"^^xsd:boolean . - -bsg:represented_by rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Group ; - rdfs:range bsn:Entity ; - bsfs:unique "true"^^xsd:boolean . - -bse:longitude rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range xsd:float ; - bsfs:unique "true"^^xsd:boolean . - -bse:latitude rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Entity ; - rdfs:range xsd:float ; - bsfs:unique "true"^^xsd:boolean . - - -## preview nodes - -bsp:width rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Preview ; - rdfs:range xsd:integer ; - bsfs:unique "true"^^xsd:boolean . - -bsp:height rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Preview ; - rdfs:range xsd:integer ; - bsfs:unique "true"^^xsd:boolean . - -bsp:orientation rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Preview ; - rdfs:range xsd:integer ; - bsfs:unique "true"^^xsd:boolean . - -bsp:asset rdfs:subClassOf bsfs:Predicate ; - rdfs:domain bsn:Preview ; - rdfs:range ; - bsfs:unique "true"^^xsd:boolean . - - diff --git a/tagit/assets/required_schema.nt b/tagit/assets/required_schema.nt new file mode 100644 index 0000000..d48f0bd --- /dev/null +++ b/tagit/assets/required_schema.nt @@ -0,0 +1,110 @@ +# common external prefixes +prefix rdf: +prefix rdfs: +prefix xsd: +prefix schema: + +# common bsfs prefixes +prefix bsfs: +prefix bsl: +prefix bsn: +prefix bse: +prefix bst: +prefix bsg: +prefix bsp: + +# essential nodes +bsn:Entity rdfs:subClassOf bsfs:Node . +bsn:Preview rdfs:subClassOf bsfs:Node . +bsn:Tag rdfs:subClassOf bsfs:Node . +bsn:Group rdfs:subClassOf bsfs:Node . + +# common definitions +bsl:BinaryBlob rdfs:subClassOf bsfs:Literal . +bsl:URI rdfs:subClassOf bsfs:Literal . +bsl:Number rdfs:subClassOf bsfs:Literal . +bsl:Time rdfs:subClassOf bsfs:Literal . + rdfs:subClassOf bsl:BinaryBlob . +xsd:string rdfs:subClassOf bsfs:Literal . +xsd:integer rdfs:subClassOf bsl:Number . +xsd:float rdfs:subClassOf bsl:Number . + +bse:filename rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range xsd:string ; + bsfs:unique "true"^^xsd:boolean . + +bse:filesize rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range xsd:integer ; + bsfs:unique "true"^^xsd:boolean . + +bse:mime rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range xsd:string ; + bsfs:unique "true"^^xsd:boolean . + +bse:preview rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range bsn:Preview . + +bse:tag rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range bsn:Tag . + +bst:label rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Tag ; + rdfs:range xsd:string ; + bsfs:unique "true"^^xsd:boolean . + +bse:comment rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsfs:Node ; + rdfs:range xsd:string . + +bse:group rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range bsn:Group . + +bsg:label rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Group ; + rdfs:range xsd:string ; + bsfs:unique "true"^^xsd:boolean . + +bsg:represented_by rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Group ; + rdfs:range bsn:Entity ; + bsfs:unique "true"^^xsd:boolean . + +bse:longitude rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range xsd:float ; + bsfs:unique "true"^^xsd:boolean . + +bse:latitude rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Entity ; + rdfs:range xsd:float ; + bsfs:unique "true"^^xsd:boolean . + + +## preview nodes + +bsp:width rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Preview ; + rdfs:range xsd:integer ; + bsfs:unique "true"^^xsd:boolean . + +bsp:height rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Preview ; + rdfs:range xsd:integer ; + bsfs:unique "true"^^xsd:boolean . + +bsp:orientation rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Preview ; + rdfs:range xsd:integer ; + bsfs:unique "true"^^xsd:boolean . + +bsp:asset rdfs:subClassOf bsfs:Predicate ; + rdfs:domain bsn:Preview ; + rdfs:range ; + bsfs:unique "true"^^xsd:boolean . + diff --git a/tagit/widgets/session.py b/tagit/widgets/session.py index c233a15..30dfe51 100644 --- a/tagit/widgets/session.py +++ b/tagit/widgets/session.py @@ -68,13 +68,13 @@ class Session(Widget): # open BSFS storage store = bsfs.Open(cfg('session', 'bsfs')) # check storage schema - # FIXME: how to properly load the required schema? - with open(os.path.join(os.path.dirname(__file__), '..', 'apps', 'port-schema.nt'), 'rt') as ifile: + with open(resource_find('required_schema.nt'), 'rt') as ifile: required_schema = bsfs.schema.from_string(ifile.read()) - # FIXME: Since the store isn't persistent, we migrate to the required one here. - #if not required_schema <= store.schema: - # raise Exception('') - store.migrate(required_schema) + if not required_schema.consistent_with(store.schema): + raise Exception("The storage's schema is incompatible with tagit's requirements") + if not required_schema <= store.schema: + store.migrate(required_schema | store.schema) + # replace current with new storage self.storage = store -- cgit v1.2.3