Skip to content

Commit 39cd17d

Browse files
authored
Merge pull request #152 from linkml/model-1-6-prerelease
LinkML 1.6 pre-release
2 parents b2957d8 + b74f849 commit 39cd17d

File tree

10 files changed

+2443
-2099
lines changed

10 files changed

+2443
-2099
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ test-schema:
5858
test-python:
5959
$(RUN) python -m unittest discover
6060

61+
# TODO: switch to linkml-run-examples when normalize is implemented
6162
test-examples:
6263
# $(RUN) linkml-run-examples -s $(SOURCE_SCHEMA_PATH) -e tests/input/examples -d /tmp/
6364
find tests/input/examples | ./utils/run-examples.pl

linkml_model/graphql/meta.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,7 @@ type UniqueKey implements Extensible, Annotatable, CommonMetadata
11071107
{
11081108
uniqueKeyName: String!
11091109
uniqueKeySlots: [SlotDefinition]!
1110+
considerNullsInequal: Boolean
11101111
extensions: [Extension]
11111112
annotations: [Annotation]
11121113
description: String

linkml_model/jsonld/meta.context.jsonld

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"comments": {
33
"description": "Auto generated by LinkML jsonld context generator",
4-
"generation_date": "2023-02-04T10:03:59",
4+
"generation_date": "2023-03-16T10:58:06",
55
"source": "meta.yaml"
66
},
77
"@context": {
@@ -117,6 +117,13 @@
117117
"conforms_to": {
118118
"@id": "dcterms:conformsTo"
119119
},
120+
"consider_nulls_inequal": {
121+
"@type": "xsd:boolean"
122+
},
123+
"contributors": {
124+
"@type": "@id",
125+
"@id": "dcterms:contributor"
126+
},
120127
"created_by": {
121128
"@type": "@id",
122129
"@id": "pav:createdBy"
@@ -481,9 +488,6 @@
481488
"shared": {
482489
"@type": "xsd:boolean"
483490
},
484-
"singular_name": {
485-
"@id": "skos:altLabel"
486-
},
487491
"slot_conditions": {
488492
"@type": "@id"
489493
},

linkml_model/jsonschema/meta.schema.json

Lines changed: 323 additions & 298 deletions
Large diffs are not rendered by default.

linkml_model/meta.py

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# Auto generated from meta.yaml by pythongen.py version: 0.9.0
2-
# Generation date: 2023-02-04T10:04:30
2+
# Generation date: 2023-03-16T10:58:36
33
# Schema: meta
44
#
55
# id: https://w3id.org/linkml/meta
66
# description: The metamodel for schemas defined using the Linked Data Modeling Language framework. For more
77
# information on LinkML: * [linkml.io](https://linkml.io) main website *
8-
# [specification](https://linkml.io/linkml-model/docs/specification/) LinkML is self-describing.
9-
# Every LinkML schema consists of elements that instantiate classes in this metamodel. Core
10-
# metaclasses: * [SchemaDefinition](https://w3id.org/linkml/SchemaDefinition) *
8+
# [specification](https://w3id.org/linkml/docs/specification/) LinkML is self-describing. Every
9+
# LinkML schema consists of elements that instantiate classes in this metamodel. Core metaclasses: *
10+
# [SchemaDefinition](https://w3id.org/linkml/SchemaDefinition) *
1111
# [ClassDefinition](https://w3id.org/linkml/ClassDefinition) *
1212
# [SlotDefinition](https://w3id.org/linkml/SlotDefinition) *
1313
# [TypeDefinition](https://w3id.org/linkml/TypeDefinition) There are many subsets of *profiles* of
@@ -281,7 +281,7 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
281281
@dataclass
282282
class Element(YAMLRoot):
283283
"""
284-
a named element in the model
284+
A named element in the model
285285
"""
286286
_inherited_slots: ClassVar[List[str]] = []
287287

@@ -462,7 +462,7 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
462462
@dataclass
463463
class SchemaDefinition(Element):
464464
"""
465-
a collection of subset, type, slot, enum and class definitions
465+
A collection of definitions that make up a schema or a data model.
466466
"""
467467
_inherited_slots: ClassVar[List[str]] = []
468468

@@ -479,7 +479,7 @@ class SchemaDefinition(Element):
479479
prefixes: Optional[Union[Dict[Union[str, PrefixPrefixPrefix], Union[dict, "Prefix"]], List[Union[dict, "Prefix"]]]] = empty_dict()
480480
emit_prefixes: Optional[Union[Union[str, NCName], List[Union[str, NCName]]]] = empty_list()
481481
default_curi_maps: Optional[Union[str, List[str]]] = empty_list()
482-
default_prefix: Optional[str] = "linkml"
482+
default_prefix: Optional[str] = None
483483
default_range: Optional[Union[str, TypeDefinitionName]] = None
484484
subsets: Optional[Union[Dict[Union[str, SubsetDefinitionName], Union[dict, "SubsetDefinition"]], List[Union[dict, "SubsetDefinition"]]]] = empty_dict()
485485
types: Optional[Union[Dict[Union[str, TypeDefinitionName], Union[dict, "TypeDefinition"]], List[Union[dict, "TypeDefinition"]]]] = empty_dict()
@@ -497,6 +497,8 @@ class SchemaDefinition(Element):
497497
keywords: Optional[Union[str, List[str]]] = empty_list()
498498

499499
def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
500+
if self.default_prefix is None:
501+
self.default_prefix = sfx(str(self.id))
500502
if self._is_empty(self.name):
501503
self.MissingRequiredField("name")
502504
if not isinstance(self.name, SchemaDefinitionName):
@@ -576,6 +578,9 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
576578

577579
@dataclass
578580
class AnonymousTypeExpression(YAMLRoot):
581+
"""
582+
A type expression that is not a top-level named type definition. Used for nesting.
583+
"""
579584
_inherited_slots: ClassVar[List[str]] = ["pattern", "structured_pattern", "equals_string", "equals_string_in", "equals_number", "minimum_value", "maximum_value"]
580585

581586
class_class_uri: ClassVar[URIRef] = LINKML.AnonymousTypeExpression
@@ -895,7 +900,7 @@ class EnumDefinition(Definition):
895900
class_model_uri: ClassVar[URIRef] = LINKML.EnumDefinition
896901

897902
name: Union[str, EnumDefinitionName] = None
898-
enum_uri: Optional[Union[str, URIorCURIE]] = class_class_curie
903+
enum_uri: Optional[Union[str, URIorCURIE]] = None
899904
code_set: Optional[Union[str, URIorCURIE]] = None
900905
code_set_tag: Optional[str] = None
901906
code_set_version: Optional[str] = None
@@ -1210,6 +1215,9 @@ class Expression(YAMLRoot):
12101215

12111216
@dataclass
12121217
class TypeExpression(Expression):
1218+
"""
1219+
An abstract class grouping named types and anonymous type expressions
1220+
"""
12131221
_inherited_slots: ClassVar[List[str]] = ["pattern", "structured_pattern", "equals_string", "equals_string_in", "equals_number", "minimum_value", "maximum_value"]
12141222

12151223
class_class_uri: ClassVar[URIRef] = LINKML.TypeExpression
@@ -1345,6 +1353,9 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
13451353

13461354
@dataclass
13471355
class AnonymousExpression(YAMLRoot):
1356+
"""
1357+
An abstract parent class for any nested expression
1358+
"""
13481359
_inherited_slots: ClassVar[List[str]] = []
13491360

13501361
class_class_uri: ClassVar[URIRef] = LINKML.AnonymousExpression
@@ -1696,7 +1707,7 @@ class SlotExpression(Expression):
16961707
class_name: ClassVar[str] = "slot_expression"
16971708
class_model_uri: ClassVar[URIRef] = LINKML.SlotExpression
16981709

1699-
range: Optional[Union[str, ElementName]] = "string"
1710+
range: Optional[Union[str, ElementName]] = None
17001711
range_expression: Optional[Union[dict, "AnonymousClassExpression"]] = None
17011712
enum_range: Optional[Union[dict, EnumExpression]] = None
17021713
required: Optional[Union[bool, Bool]] = None
@@ -1819,7 +1830,7 @@ class AnonymousSlotExpression(AnonymousExpression):
18191830
class_name: ClassVar[str] = "anonymous_slot_expression"
18201831
class_model_uri: ClassVar[URIRef] = LINKML.AnonymousSlotExpression
18211832

1822-
range: Optional[Union[str, ElementName]] = "string"
1833+
range: Optional[Union[str, ElementName]] = None
18231834
range_expression: Optional[Union[dict, "AnonymousClassExpression"]] = None
18241835
enum_range: Optional[Union[dict, EnumExpression]] = None
18251836
required: Optional[Union[bool, Bool]] = None
@@ -1986,7 +1997,7 @@ class SlotDefinition(Definition):
19861997
is_a: Optional[Union[str, SlotDefinitionName]] = None
19871998
mixins: Optional[Union[Union[str, SlotDefinitionName], List[Union[str, SlotDefinitionName]]]] = empty_list()
19881999
apply_to: Optional[Union[Union[str, SlotDefinitionName], List[Union[str, SlotDefinitionName]]]] = empty_list()
1989-
range: Optional[Union[str, ElementName]] = "string"
2000+
range: Optional[Union[str, ElementName]] = None
19902001
range_expression: Optional[Union[dict, "AnonymousClassExpression"]] = None
19912002
enum_range: Optional[Union[dict, EnumExpression]] = None
19922003
required: Optional[Union[bool, Bool]] = None
@@ -2014,8 +2025,6 @@ class SlotDefinition(Definition):
20142025
all_of: Optional[Union[Union[dict, AnonymousSlotExpression], List[Union[dict, AnonymousSlotExpression]]]] = empty_list()
20152026

20162027
def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
2017-
if self.slot_uri is None:
2018-
self.slot_uri = slots.slot_uri.curie
20192028
if self._is_empty(self.name):
20202029
self.MissingRequiredField("name")
20212030
if not isinstance(self.name, SlotDefinitionName):
@@ -2329,7 +2338,7 @@ class ClassDefinition(Definition):
23292338
slots: Optional[Union[Union[str, SlotDefinitionName], List[Union[str, SlotDefinitionName]]]] = empty_list()
23302339
slot_usage: Optional[Union[Dict[Union[str, SlotDefinitionName], Union[dict, SlotDefinition]], List[Union[dict, SlotDefinition]]]] = empty_dict()
23312340
attributes: Optional[Union[Dict[Union[str, SlotDefinitionName], Union[dict, SlotDefinition]], List[Union[dict, SlotDefinition]]]] = empty_dict()
2332-
class_uri: Optional[Union[str, URIorCURIE]] = class_class_curie
2341+
class_uri: Optional[Union[str, URIorCURIE]] = None
23332342
subclass_of: Optional[Union[str, URIorCURIE]] = None
23342343
union_of: Optional[Union[Union[str, ClassDefinitionName], List[Union[str, ClassDefinitionName]]]] = empty_list()
23352344
defining_slots: Optional[Union[Union[str, SlotDefinitionName], List[Union[str, SlotDefinitionName]]]] = empty_list()
@@ -3292,6 +3301,7 @@ class UniqueKey(YAMLRoot):
32923301

32933302
unique_key_name: Union[str, UniqueKeyUniqueKeyName] = None
32943303
unique_key_slots: Union[Union[str, SlotDefinitionName], List[Union[str, SlotDefinitionName]]] = None
3304+
consider_nulls_inequal: Optional[Union[bool, Bool]] = None
32953305
extensions: Optional[Union[Dict[Union[str, ExtensionTag], Union[dict, Extension]], List[Union[dict, Extension]]]] = empty_dict()
32963306
annotations: Optional[Union[Dict[Union[str, AnnotationTag], Union[dict, Annotation]], List[Union[dict, Annotation]]]] = empty_dict()
32973307
description: Optional[str] = None
@@ -3337,6 +3347,9 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
33373347
self.unique_key_slots = [self.unique_key_slots] if self.unique_key_slots is not None else []
33383348
self.unique_key_slots = [v if isinstance(v, SlotDefinitionName) else SlotDefinitionName(v) for v in self.unique_key_slots]
33393349

3350+
if self.consider_nulls_inequal is not None and not isinstance(self.consider_nulls_inequal, Bool):
3351+
self.consider_nulls_inequal = Bool(self.consider_nulls_inequal)
3352+
33403353
self._normalize_inlined_as_dict(slot_name="extensions", slot_type=Extension, key_name="tag", keyed=True)
33413354

33423355
self._normalize_inlined_as_dict(slot_name="annotations", slot_type=Annotation, key_name="tag", keyed=True)
@@ -3501,7 +3514,9 @@ class RelationalRoleEnum(EnumDefinitionImpl):
35013514
)
35023515

35033516
class AliasPredicateEnum(EnumDefinitionImpl):
3504-
3517+
"""
3518+
permissible values for the relationship between an element and an alias
3519+
"""
35053520
EXACT_SYNONYM = PermissibleValue(text="EXACT_SYNONYM",
35063521
meaning=SKOS.exactMatch)
35073522
RELATED_SYNONYM = PermissibleValue(text="RELATED_SYNONYM",
@@ -3513,6 +3528,7 @@ class AliasPredicateEnum(EnumDefinitionImpl):
35133528

35143529
_defn = EnumDefinition(
35153530
name="AliasPredicateEnum",
3531+
description="permissible values for the relationship between an element and an alias",
35163532
)
35173533

35183534
# Slots
@@ -3582,6 +3598,9 @@ class slots:
35823598
slots.created_by = Slot(uri=PAV.createdBy, name="created_by", curie=PAV.curie('createdBy'),
35833599
model_uri=LINKML.created_by, domain=Element, range=Optional[Union[str, URIorCURIE]])
35843600

3601+
slots.contributors = Slot(uri=DCTERMS.contributor, name="contributors", curie=DCTERMS.curie('contributor'),
3602+
model_uri=LINKML.contributors, domain=Element, range=Optional[Union[Union[str, URIorCURIE], List[Union[str, URIorCURIE]]]])
3603+
35853604
slots.created_on = Slot(uri=PAV.createdOn, name="created_on", curie=PAV.curie('createdOn'),
35863605
model_uri=LINKML.created_on, domain=Element, range=Optional[Union[str, XSDDateTime]])
35873606

@@ -3828,6 +3847,9 @@ class slots:
38283847
slots.unique_key_name = Slot(uri=LINKML.unique_key_name, name="unique_key_name", curie=LINKML.curie('unique_key_name'),
38293848
model_uri=LINKML.unique_key_name, domain=UniqueKey, range=Union[str, UniqueKeyUniqueKeyName])
38303849

3850+
slots.consider_nulls_inequal = Slot(uri=LINKML.consider_nulls_inequal, name="consider_nulls_inequal", curie=LINKML.curie('consider_nulls_inequal'),
3851+
model_uri=LINKML.consider_nulls_inequal, domain=UniqueKey, range=Optional[Union[bool, Bool]])
3852+
38313853
slots.unique_key_slots = Slot(uri=LINKML.unique_key_slots, name="unique_key_slots", curie=LINKML.curie('unique_key_slots'),
38323854
model_uri=LINKML.unique_key_slots, domain=UniqueKey, range=Union[Union[str, SlotDefinitionName], List[Union[str, SlotDefinitionName]]])
38333855

@@ -3894,7 +3916,7 @@ class slots:
38943916
slots.all_members = Slot(uri=LINKML.all_members, name="all_members", curie=LINKML.curie('all_members'),
38953917
model_uri=LINKML.all_members, domain=None, range=Optional[Union[dict, AnonymousSlotExpression]])
38963918

3897-
slots.singular_name = Slot(uri=SKOS.altLabel, name="singular_name", curie=SKOS.curie('altLabel'),
3919+
slots.singular_name = Slot(uri=LINKML.singular_name, name="singular_name", curie=LINKML.curie('singular_name'),
38983920
model_uri=LINKML.singular_name, domain=SlotDefinition, range=Optional[str])
38993921

39003922
slots.required = Slot(uri=LINKML.required, name="required", curie=LINKML.curie('required'),

0 commit comments

Comments
 (0)