Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
28 changes: 26 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ install:
uv sync
.PHONY: install

all: gen-project gen-doc
all: gen-project gen-doc precommit
%.yaml: gen-project
deploy: gen-doc mkd-gh-deploy

# generates all project files
# and updates the artifacts in linkml-model
gen-project: $(PYMODEL) gen-py
gen-project: $(PYMODEL) gen-py gen-rdf gen-sqlddl
$(RUN) gen-project -d $(DEST) --config-file gen_project_config.yaml $(SOURCE_SCHEMA_PATH)
cp -r $(DEST)/* $(PYMODEL)

Expand All @@ -70,6 +70,30 @@ gen-py: $(DEST)
done
cp $(DEST)/*.py $(PYMODEL)

# gen-rdf and gen-sqlddl are run separately because they are no longer part of
# the default gen-project GEN_MAP (which only emits sqlschema/, owl/, shacl/, etc.).
# We keep generating rdf/ and sqlddl/ outputs to preserve the public API surface
# in linkml_files.py (Format.RDF, Format.NATIVE_RDF, Format.SQLDDL) and to stay
# in step with the artifacts shipped by linkml-runtime.
# array.yaml and extended_types.yaml are excluded to match the schema scope of
# jsonld/, jsonschema/, and shex/.
gen-rdf: $(DEST)
mkdir -p $(DEST)/rdf
@for file in $(wildcard $(PYMODEL)/model/schema/*.yaml); do \
base=$$(basename $$file); \
if [ "$$base" = "extended_types.yaml" ] || [ "$$base" = "array.yaml" ]; then continue; fi; \
stem=$${base%.*}; \
$(RUN) gen-rdf $$file > $(DEST)/rdf/$$stem.ttl; \
$(RUN) gen-rdf --metauris $$file > $(DEST)/rdf/$$stem.model.ttl; \
done

# sqlddl is an alias for the SQL-DDL output (gen-sqlddl shares its implementation
# with gen-sqltables, which feeds sqlschema/). The two directories therefore hold
# the same content; sqlddl/ is preserved purely for backwards compatibility.
gen-sqlddl: $(DEST)
mkdir -p $(DEST)/sqlddl
$(RUN) gen-sqlddl $(SOURCE_SCHEMA_PATH) > $(DEST)/sqlddl/meta.sql

gen-doc:
$(RUN) gen-doc --genmeta --sort-by rank -d $(DOCDIR)/docs $(SOURCE_SCHEMA_PATH)
cp -r linkml_model/model/docs/* $(DOCDIR)/docs
Expand Down
2 changes: 1 addition & 1 deletion linkml_model/annotations.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Auto generated from annotations.yaml by pythongen.py version: 0.0.1
# Generation date: 2026-04-28T23:24:50
# Generation date: 2026-05-05T18:49:09
# Schema: annotations
#
# id: https://w3id.org/linkml/annotations
Expand Down
284 changes: 284 additions & 0 deletions linkml_model/array.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,284 @@
# Auto generated from array.yaml by pythongen.py version: 0.0.1
# Generation date: 2026-05-05T18:49:10
# Schema: arrays
#
# id: https://w3id.org/linkml/lib/arrays
# description: LinkML templates for storing one-dimensional series, two-dimensional arrays, and arrays of higher dimensionality.
# Status: Experimental
# Note that this model is not intended to be imported directly. Instead, use `implements` to denote conformance.
# license: https://creativecommons.org/publicdomain/zero/1.0/

import dataclasses
import re
from dataclasses import dataclass
from datetime import (
date,
datetime,
time
)
from typing import (
Any,
ClassVar,
Dict,
List,
Optional,
Union
)

from jsonasobj2 import (
JsonObj,
as_dict
)
from linkml_runtime.utils.curienamespace import CurieNamespace
from linkml_runtime.utils.enumerations import EnumDefinitionImpl
from linkml_runtime.utils.formatutils import (
camelcase,
sfx,
underscore
)
from linkml_runtime.utils.metamodelcore import (
bnode,
empty_dict,
empty_list
)
from linkml_runtime.utils.slot import Slot
from linkml_runtime.utils.yamlutils import (
YAMLRoot,
extended_float,
extended_int,
extended_str
)
from rdflib import (
Namespace,
URIRef
)

from .types import Integer, String

metamodel_version = "1.7.0"
Comment thread
matentzn marked this conversation as resolved.
version = None

# Namespaces
GITHUB = CurieNamespace('github', 'https://github.com/')
GOM = CurieNamespace('gom', 'https://w3id.org/gom#')
LINKML = CurieNamespace('linkml', 'https://w3id.org/linkml/')
DEFAULT_ = LINKML


# Types

# Class references



Any = Any

class DataStructure(YAMLRoot):
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["DataStructure"]
class_class_curie: ClassVar[str] = "linkml:DataStructure"
class_name: ClassVar[str] = "DataStructure"
class_model_uri: ClassVar[URIRef] = LINKML.DataStructure


@dataclass(repr=False)
class NDArray(DataStructure):
"""
a data structure consisting of a collection of *elements*, each identified by at least one array index tuple.
"""
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["NDArray"]
class_class_curie: ClassVar[str] = "linkml:NDArray"
class_name: ClassVar[str] = "NDArray"
class_model_uri: ClassVar[URIRef] = LINKML.NDArray

elements: Union[Union[dict, Any], list[Union[dict, Any]]] = None

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The type hint says that elements is required but there is no

if self._is_empty(self.elements):
  self.MissingRequiredField("elements")

like in DataArray.__post_init__. Probably an issue with pythongen.py but just flagging it as something that appears to be missing. Not blocking if this file isn't used anyway

dimensions: Optional[int] = None
array_linearization_order: Optional[Union[str, "ArrayLinearizationOrderOptions"]] = 'ROW_MAJOR_ARRAY_ORDER'

def __post_init__(self, *_: str, **kwargs: Any):
if self.dimensions is not None and not isinstance(self.dimensions, int):
self.dimensions = int(self.dimensions)

if self.array_linearization_order is not None and not isinstance(self.array_linearization_order, ArrayLinearizationOrderOptions):
self.array_linearization_order = ArrayLinearizationOrderOptions(self.array_linearization_order)

super().__post_init__(**kwargs)


@dataclass(repr=False)
class OneDimensionalSeries(NDArray):
"""
an NDArray whose dimensionality is constrained to 1
"""
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["OneDimensionalSeries"]
class_class_curie: ClassVar[str] = "linkml:OneDimensionalSeries"
class_name: ClassVar[str] = "OneDimensionalSeries"
class_model_uri: ClassVar[URIRef] = LINKML.OneDimensionalSeries

elements: Union[Union[dict, Any], list[Union[dict, Any]]] = None
dimensions: Optional[int] = None

def __post_init__(self, *_: str, **kwargs: Any):
if self.dimensions is not None and not isinstance(self.dimensions, int):
self.dimensions = int(self.dimensions)

super().__post_init__(**kwargs)


@dataclass(repr=False)
class DataArray(DataStructure):
"""
a data structure containing an NDArray and a set of one-dimensional series that are used to label the elements of
the array
"""
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["DataArray"]
class_class_curie: ClassVar[str] = "linkml:DataArray"
class_name: ClassVar[str] = "DataArray"
class_model_uri: ClassVar[URIRef] = LINKML.DataArray

axis: Union[dict, OneDimensionalSeries] = None
array: Union[dict, NDArray] = None

def __post_init__(self, *_: str, **kwargs: Any):
if self._is_empty(self.axis):
self.MissingRequiredField("axis")
if not isinstance(self.axis, OneDimensionalSeries):
self.axis = OneDimensionalSeries(**as_dict(self.axis))

if self._is_empty(self.array):
self.MissingRequiredField("array")
if not isinstance(self.array, NDArray):
self.array = NDArray(**as_dict(self.array))

super().__post_init__(**kwargs)


class GroupingByArrayOrder(YAMLRoot):
"""
A mixin that describes an array whose elements are mapped from a linear sequence to an array index via a specified
mapping
"""
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["GroupingByArrayOrder"]
class_class_curie: ClassVar[str] = "linkml:GroupingByArrayOrder"
class_name: ClassVar[str] = "GroupingByArrayOrder"
class_model_uri: ClassVar[URIRef] = LINKML.GroupingByArrayOrder


@dataclass(repr=False)
class ColumnOrderedArray(GroupingByArrayOrder):
"""
An array ordering that is column-order
"""
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["ColumnOrderedArray"]
class_class_curie: ClassVar[str] = "linkml:ColumnOrderedArray"
class_name: ClassVar[str] = "ColumnOrderedArray"
class_model_uri: ClassVar[URIRef] = LINKML.ColumnOrderedArray

array_linearization_order: Optional[Union[str, "ArrayLinearizationOrderOptions"]] = 'COLUMN_MAJOR_ARRAY_ORDER'

def __post_init__(self, *_: str, **kwargs: Any):
if self.array_linearization_order is not None and not isinstance(self.array_linearization_order, ArrayLinearizationOrderOptions):
self.array_linearization_order = ArrayLinearizationOrderOptions(self.array_linearization_order)

super().__post_init__(**kwargs)


@dataclass(repr=False)
class RowOrderedArray(GroupingByArrayOrder):
"""
An array ordering that is row-order or generalizations thereof
"""
_inherited_slots: ClassVar[list[str]] = []

class_class_uri: ClassVar[URIRef] = LINKML["RowOrderedArray"]
class_class_curie: ClassVar[str] = "linkml:RowOrderedArray"
class_name: ClassVar[str] = "RowOrderedArray"
class_model_uri: ClassVar[URIRef] = LINKML.RowOrderedArray

array_linearization_order: Optional[Union[str, "ArrayLinearizationOrderOptions"]] = 'ROW_MAJOR_ARRAY_ORDER'

def __post_init__(self, *_: str, **kwargs: Any):
if self.array_linearization_order is not None and not isinstance(self.array_linearization_order, ArrayLinearizationOrderOptions):
self.array_linearization_order = ArrayLinearizationOrderOptions(self.array_linearization_order)

super().__post_init__(**kwargs)


# Enumerations
class ArrayLinearizationOrderOptions(EnumDefinitionImpl):
"""
Determines how a linear contiguous representation of the elements of an array map to array indices
"""
COLUMN_MAJOR_ARRAY_ORDER = PermissibleValue(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I'm looking at this in more detail now. Claude flagged this -- PermissibleValue is not imported or defined in this file. Unless I am missing something, I don't think this file can be imported. Is that OK? The top-level comment says "model is not intended to be imported directly". I don't fully understand how this file is used, and I suppose since this is the first time it is generated, it hasn't been used at all!

text="COLUMN_MAJOR_ARRAY_ORDER",
description="""An array layout option in which the elements in each column is stored in consecutive positions, or any generalization thereof to dimensionality greater than 2""",
meaning=GOM["columnMajorArray"])
ROW_MAJOR_ARRAY_ORDER = PermissibleValue(
text="ROW_MAJOR_ARRAY_ORDER",
description="""An array layout option in which the elements in each row is stored in consecutive positions, or any generalization thereof to dimensionality greater than 2""",
meaning=GOM["rowMajorArray"])

_defn = EnumDefinition(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same for EnumDefinition.

name="ArrayLinearizationOrderOptions",
description="Determines how a linear contiguous representation of the elements of an array map to array indices",
)

# Slots
class slots:
pass

slots.dimensions = Slot(uri=LINKML.dimensions, name="dimensions", curie=LINKML.curie('dimensions'),
model_uri=LINKML.dimensions, domain=None, range=Optional[int])

slots.axis = Slot(uri=LINKML.axis, name="axis", curie=LINKML.curie('axis'),
model_uri=LINKML.axis, domain=None, range=Union[dict, OneDimensionalSeries])

slots.axis_index = Slot(uri=LINKML.axis_index, name="axis_index", curie=LINKML.curie('axis_index'),
model_uri=LINKML.axis_index, domain=None, range=Optional[int])

slots.array = Slot(uri=LINKML.array, name="array", curie=LINKML.curie('array'),
model_uri=LINKML.array, domain=None, range=Union[dict, NDArray])

slots.elements = Slot(uri=LINKML.elements, name="elements", curie=LINKML.curie('elements'),
model_uri=LINKML.elements, domain=None, range=Union[Union[dict, Any], list[Union[dict, Any]]])

slots.series_label = Slot(uri=LINKML.series_label, name="series_label", curie=LINKML.curie('series_label'),
model_uri=LINKML.series_label, domain=None, range=URIRef)

slots.length = Slot(uri=LINKML.length, name="length", curie=LINKML.curie('length'),
model_uri=LINKML.length, domain=None, range=Optional[int])

slots.array_linearization_order = Slot(uri=LINKML.array_linearization_order, name="array_linearization_order", curie=LINKML.curie('array_linearization_order'),
model_uri=LINKML.array_linearization_order, domain=None, range=Optional[Union[str, "ArrayLinearizationOrderOptions"]])

slots.specified_input = Slot(uri=LINKML.specified_input, name="specified_input", curie=LINKML.curie('specified_input'),
model_uri=LINKML.specified_input, domain=None, range=Optional[Union[Union[dict, DataStructure], list[Union[dict, DataStructure]]]])

slots.specified_output = Slot(uri=LINKML.specified_output, name="specified_output", curie=LINKML.curie('specified_output'),
model_uri=LINKML.specified_output, domain=None, range=Optional[Union[Union[dict, DataStructure], list[Union[dict, DataStructure]]]])

slots.operation_parameters = Slot(uri=LINKML.operation_parameters, name="operation_parameters", curie=LINKML.curie('operation_parameters'),
model_uri=LINKML.operation_parameters, domain=None, range=Optional[Union[Union[dict, Any], list[Union[dict, Any]]]])

slots.NDArray_elements = Slot(uri=LINKML.elements, name="NDArray_elements", curie=LINKML.curie('elements'),
model_uri=LINKML.NDArray_elements, domain=NDArray, range=Union[Union[dict, Any], list[Union[dict, Any]]])

slots.OneDimensionalSeries_dimensions = Slot(uri=LINKML.dimensions, name="OneDimensionalSeries_dimensions", curie=LINKML.curie('dimensions'),
model_uri=LINKML.OneDimensionalSeries_dimensions, domain=OneDimensionalSeries, range=Optional[int])

slots.ColumnOrderedArray_array_linearization_order = Slot(uri=LINKML.array_linearization_order, name="ColumnOrderedArray_array_linearization_order", curie=LINKML.curie('array_linearization_order'),
model_uri=LINKML.ColumnOrderedArray_array_linearization_order, domain=None, range=Optional[Union[str, "ArrayLinearizationOrderOptions"]])

slots.RowOrderedArray_array_linearization_order = Slot(uri=LINKML.array_linearization_order, name="RowOrderedArray_array_linearization_order", curie=LINKML.curie('array_linearization_order'),
model_uri=LINKML.RowOrderedArray_array_linearization_order, domain=None, range=Optional[Union[str, "ArrayLinearizationOrderOptions"]])
2 changes: 1 addition & 1 deletion linkml_model/datasets.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Auto generated from datasets.yaml by pythongen.py version: 0.0.1
# Generation date: 2026-04-28T23:24:52
# Generation date: 2026-05-05T18:49:10
# Schema: datasets
#
# id: https://w3id.org/linkml/datasets
Expand Down
Binary file modified linkml_model/excel/meta.xlsx
Binary file not shown.
2 changes: 1 addition & 1 deletion linkml_model/extensions.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Auto generated from extensions.yaml by pythongen.py version: 0.0.1
# Generation date: 2026-04-28T23:24:53
# Generation date: 2026-05-05T18:49:11
# Schema: extensions
#
# id: https://w3id.org/linkml/extensions
Expand Down
2 changes: 1 addition & 1 deletion linkml_model/graphql/meta.graphql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# metamodel_version: 1.7.0
# metamodel_version: 1.11.0
enum AliasPredicateEnum
{
EXACT_SYNONYM
Expand Down
10 changes: 5 additions & 5 deletions linkml_model/jsonld/meta.jsonld
Original file line number Diff line number Diff line change
Expand Up @@ -7445,7 +7445,7 @@
{
"name": "MatchQuery",
"definition_uri": "https://w3id.org/linkml/MatchQuery",
"description": "A query that is used on an enum expression to dynamically obtain a set of permissivle values via a query that matches on properties of the external concepts.",
"description": "A query that is used on an enum expression to dynamically obtain a set of permissible values via a query that matches on properties of the external concepts.",
"in_subset": [
"SpecificationSubset"
],
Expand Down Expand Up @@ -8840,11 +8840,11 @@
"@type": "ClassDefinition"
}
],
"metamodel_version": "1.7.0",
"metamodel_version": "1.11.0",
"source_file": "meta.yaml",
"source_file_date": "2026-04-15T14:43:24",
"source_file_size": 99862,
"generation_date": "2026-04-28T23:25:01",
"source_file_date": "2026-05-05T16:16:44",
"source_file_size": 99888,
"generation_date": "2026-05-05T18:49:57",
"@type": "SchemaDefinition",
"@context": [
"staging/jsonld/meta.context.jsonld",
Expand Down
Loading
Loading