Working on get_schema(type) to provide a self-documenting infrastructure
This commit is contained in:
parent
97f3a1d9ae
commit
2e746a21da
@ -31,11 +31,96 @@ from ..dbstate import DbState
|
|||||||
from gramps.cli.grampscli import CLIManager
|
from gramps.cli.grampscli import CLIManager
|
||||||
from ..plug import BasePluginManager
|
from ..plug import BasePluginManager
|
||||||
from ..db.dictionary import DictionaryDb
|
from ..db.dictionary import DictionaryDb
|
||||||
from gramps.gen.lib.handle import HandleClass
|
from gramps.gen.lib.handle import HandleClass, Handle
|
||||||
|
from gramps.gen.lib import *
|
||||||
|
from gramps.gen.lib.personref import PersonRef
|
||||||
|
from gramps.gen.lib.eventref import EventRef
|
||||||
from ..const import GRAMPS_LOCALE as glocale
|
from ..const import GRAMPS_LOCALE as glocale
|
||||||
from ..constfunc import handle2internal
|
from ..constfunc import handle2internal
|
||||||
_ = glocale.translation.gettext
|
_ = glocale.translation.gettext
|
||||||
|
|
||||||
|
def get_schema(cls):
|
||||||
|
"""
|
||||||
|
Given a gramps.gen.lib class, or class name, return a dictionary
|
||||||
|
containing the schema. The schema is a dictionary of fieldname
|
||||||
|
keys with type as value.
|
||||||
|
|
||||||
|
Also, the schema includes the same metadata fields as does struct,
|
||||||
|
including "_class", returned as real class of cls.
|
||||||
|
"""
|
||||||
|
orig_cls = cls
|
||||||
|
# Get type as a gramps.gen.lib string name
|
||||||
|
if isinstance(cls, type):
|
||||||
|
cls = cls().__class__.__name__
|
||||||
|
elif isinstance(cls, object) and not isinstance(cls, str):
|
||||||
|
cls = cls.__class__.__name__
|
||||||
|
### Is there a Path?
|
||||||
|
if "." in cls:
|
||||||
|
items = parse(cls) # "Person.alternate_names"
|
||||||
|
cls, path = items[0], items[1:]
|
||||||
|
else:
|
||||||
|
path = []
|
||||||
|
# Now get the schema
|
||||||
|
if cls in ("str", "int", "bool", "float", "long", "list"):
|
||||||
|
schema = orig_cls
|
||||||
|
elif cls == "Person":
|
||||||
|
schema = {
|
||||||
|
"_class": Person,
|
||||||
|
"handle": str,
|
||||||
|
"gramps_id": Handle("Person", "PERSON-HANDLE"),
|
||||||
|
"gender": int,
|
||||||
|
"primary_name": Name,
|
||||||
|
"alternate_names": [Name],
|
||||||
|
"death_ref_index": int,
|
||||||
|
"birth_ref_index": int,
|
||||||
|
"event_ref_list": [EventRef],
|
||||||
|
"family_list": [Handle("Family", "FAMILY-HANDLE")],
|
||||||
|
"parent_family_list": [Handle("Family", "FAMILY-HANDLE")],
|
||||||
|
"media_list": [MediaRef],
|
||||||
|
"address_list": [Address],
|
||||||
|
"attribute_list": [Attribute],
|
||||||
|
"urls": [Url],
|
||||||
|
"lds_ord_list": [LdsOrd],
|
||||||
|
"citation_list": [Handle("Citation", "CITATION-HANDLE")],
|
||||||
|
"note_list": [Handle("Note", "NOTE-HANDLE")],
|
||||||
|
"change": int,
|
||||||
|
"tag_list": [Handle("Tag", "TAG-HANDLE")],
|
||||||
|
"private": bool,
|
||||||
|
"person_ref_list": [PersonRef]
|
||||||
|
}
|
||||||
|
elif cls == "Name":
|
||||||
|
schema = {
|
||||||
|
"_class": Name,
|
||||||
|
"private": bool,
|
||||||
|
"citation_list": [Handle("Citation", "CITATION-HANDLE")],
|
||||||
|
"note_list": [Handle("Note", "NOTE-HANDLE")],
|
||||||
|
"date": Date,
|
||||||
|
"first_name": str,
|
||||||
|
"surname_list": [Surname],
|
||||||
|
"suffix": str,
|
||||||
|
"title": str,
|
||||||
|
"type": NameType,
|
||||||
|
"group_as": str,
|
||||||
|
"sort_as": int,
|
||||||
|
"display_as": int,
|
||||||
|
"call": str,
|
||||||
|
"nick": str,
|
||||||
|
"famnick": str,
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
raise AttributeError("unknown class '%s'" % cls)
|
||||||
|
# walk down path, if given:
|
||||||
|
for p in range(len(path)):
|
||||||
|
# could be a list
|
||||||
|
item = path[p]
|
||||||
|
if isinstance(schema, (list, tuple)):
|
||||||
|
schema = schema[int(item)]
|
||||||
|
else:
|
||||||
|
schema = schema[item]
|
||||||
|
if isinstance(schema, type):
|
||||||
|
schema = get_schema(schema)
|
||||||
|
return schema
|
||||||
|
|
||||||
def parse(string):
|
def parse(string):
|
||||||
"""
|
"""
|
||||||
Break a string up into a struct-path:
|
Break a string up into a struct-path:
|
||||||
|
Loading…
Reference in New Issue
Block a user