linkml 1.9.1rc3__py3-none-any.whl → 1.9.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- linkml/cli/main.py +2 -0
- linkml/generators/__init__.py +2 -0
- linkml/generators/docgen/class_diagram.md.jinja2 +10 -8
- linkml/generators/docgen/common_metadata.md.jinja2 +1 -1
- linkml/generators/docgen/index.md.jinja2 +1 -1
- linkml/generators/docgen.py +33 -7
- linkml/generators/jsonldgen.py +1 -1
- linkml/generators/markdowngen.py +24 -1
- linkml/generators/mermaidclassdiagramgen.py +3 -2
- linkml/generators/panderagen/__init__.py +9 -0
- linkml/generators/panderagen/class_generator_mixin.py +20 -0
- linkml/generators/panderagen/enum_generator_mixin.py +17 -0
- linkml/generators/panderagen/panderagen.py +216 -0
- linkml/generators/panderagen/panderagen_class_based/class.jinja2 +26 -0
- linkml/generators/panderagen/panderagen_class_based/enums.jinja2 +9 -0
- linkml/generators/panderagen/panderagen_class_based/header.jinja2 +21 -0
- linkml/generators/panderagen/panderagen_class_based/mixins.jinja2 +26 -0
- linkml/generators/panderagen/panderagen_class_based/pandera.jinja2 +16 -0
- linkml/generators/panderagen/panderagen_class_based/slots.jinja2 +36 -0
- linkml/generators/panderagen/slot_generator_mixin.py +77 -0
- linkml/generators/pydanticgen/templates/enum.py.jinja +6 -4
- linkml/generators/pydanticgen/templates/validator.py.jinja +7 -6
- linkml/generators/sqltablegen.py +143 -86
- linkml/generators/yumlgen.py +33 -1
- linkml/transformers/rollup_transformer.py +115 -0
- linkml/utils/deprecation.py +26 -0
- linkml/utils/execute_tutorial.py +71 -9
- linkml/validator/plugins/recommended_slots_plugin.py +4 -4
- {linkml-1.9.1rc3.dist-info → linkml-1.9.2.dist-info}/METADATA +19 -16
- {linkml-1.9.1rc3.dist-info → linkml-1.9.2.dist-info}/RECORD +33 -21
- {linkml-1.9.1rc3.dist-info → linkml-1.9.2.dist-info}/WHEEL +1 -1
- {linkml-1.9.1rc3.dist-info → linkml-1.9.2.dist-info}/entry_points.txt +1 -0
- {linkml-1.9.1rc3.dist-info → linkml-1.9.2.dist-info}/LICENSE +0 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
"""
|
2
|
+
flatten_transformer.py
|
3
|
+
|
4
|
+
This module provides a FlattenTransformer that transforms a LinkML schema into a flattened version.
|
5
|
+
The transformer takes a target class name and rolls up all slots from its descendants into that class.
|
6
|
+
This is useful for implementing single table inheritance or simplifying inheritance for systems like KGX.
|
7
|
+
"""
|
8
|
+
|
9
|
+
import copy
|
10
|
+
from dataclasses import dataclass
|
11
|
+
from typing import Optional
|
12
|
+
|
13
|
+
from linkml_runtime.linkml_model.meta import (
|
14
|
+
ClassDefinitionName,
|
15
|
+
SchemaDefinition,
|
16
|
+
)
|
17
|
+
from linkml_runtime.utils.schemaview import SchemaView
|
18
|
+
|
19
|
+
from linkml.transformers.model_transformer import ModelTransformer
|
20
|
+
|
21
|
+
|
22
|
+
@dataclass
|
23
|
+
class FlattenTransformerConfiguration:
|
24
|
+
"""
|
25
|
+
Configuration options for the FlattenTransformer.
|
26
|
+
|
27
|
+
Attributes:
|
28
|
+
preserve_class_designator: If True, preserves the original class name in the specified
|
29
|
+
class designator slot (e.g., 'category').
|
30
|
+
class_designator_slot: The name of the slot that designates the original class (e.g., 'category').
|
31
|
+
include_all_classes: If True, keeps all classes in the schema; otherwise, only the target class
|
32
|
+
and non-descendants are kept.
|
33
|
+
include_mixins: If True, includes properties from mixins in the flattened class.
|
34
|
+
"""
|
35
|
+
|
36
|
+
preserve_class_designator: bool = True
|
37
|
+
class_designator_slot: Optional[str] = "category"
|
38
|
+
include_all_classes: bool = False
|
39
|
+
include_mixins: bool = True
|
40
|
+
|
41
|
+
|
42
|
+
class RollupTransformer(ModelTransformer):
|
43
|
+
"""
|
44
|
+
Transforms a LinkML schema by flattening an inheritance hierarchy into a single class.
|
45
|
+
|
46
|
+
This transformer takes a schema and a target class name, and produces a new schema where
|
47
|
+
all descendant classes of the target class are removed and their slots are rolled up into the
|
48
|
+
target class.
|
49
|
+
"""
|
50
|
+
|
51
|
+
def __init__(
|
52
|
+
self,
|
53
|
+
target_class: str,
|
54
|
+
config: Optional[FlattenTransformerConfiguration] = None,
|
55
|
+
):
|
56
|
+
super().__init__()
|
57
|
+
self.target_class = target_class
|
58
|
+
self.config = config or FlattenTransformerConfiguration()
|
59
|
+
self._descendant_classes: set[str] = set()
|
60
|
+
self._class_to_slot_map: dict[str, set[str]] = {}
|
61
|
+
|
62
|
+
def transform(self, tgt_schema_name: str = None, top_class: ClassDefinitionName = None) -> SchemaDefinition:
|
63
|
+
"""
|
64
|
+
Transform the schema by flattening the inheritance hierarchy.
|
65
|
+
|
66
|
+
Args:
|
67
|
+
tgt_schema_name: Optional target schema name (not used in this transformer)
|
68
|
+
top_class: Optional top class name (not used in this transformer)
|
69
|
+
|
70
|
+
Returns:
|
71
|
+
A transformed SchemaDefinition with the target class having all slots from its descendants.
|
72
|
+
"""
|
73
|
+
if not self.schemaview:
|
74
|
+
raise ValueError("SchemaView not set. Ensure schema is set by calling set_schema().")
|
75
|
+
|
76
|
+
schema_copy = copy.deepcopy(self.source_schema)
|
77
|
+
view = SchemaView(schema_copy)
|
78
|
+
descendants = view.class_descendants(self.target_class, imports=True, mixins=True, reflexive=False, is_a=True)
|
79
|
+
self._descendant_classes = set(descendants)
|
80
|
+
|
81
|
+
# Collect all slots from the target class and its descendant classes, and
|
82
|
+
# populate a mapping of class name to the set of its slot names.
|
83
|
+
for descendant in self._descendant_classes:
|
84
|
+
slots = view.class_induced_slots(descendant)
|
85
|
+
self._class_to_slot_map[descendant] = {s.name for s in slots}
|
86
|
+
|
87
|
+
# flatten the schema
|
88
|
+
return self._create_flattened_schema(schema_copy)
|
89
|
+
|
90
|
+
def _create_flattened_schema(self, schema: SchemaDefinition) -> SchemaDefinition:
|
91
|
+
"""
|
92
|
+
Create a new flattened version of the schema based on collected slots.
|
93
|
+
"""
|
94
|
+
target_class_def = schema.classes[self.target_class]
|
95
|
+
existing_slot_names = set(target_class_def.slots or [])
|
96
|
+
all_slots = set()
|
97
|
+
|
98
|
+
for descendant in self._descendant_classes:
|
99
|
+
if descendant in schema.classes:
|
100
|
+
for slot_name in self._class_to_slot_map.get(descendant, set()):
|
101
|
+
if slot_name not in existing_slot_names:
|
102
|
+
all_slots.add(slot_name)
|
103
|
+
|
104
|
+
if not target_class_def.slots:
|
105
|
+
target_class_def.slots = []
|
106
|
+
|
107
|
+
target_class_def.slots.extend(list(all_slots))
|
108
|
+
|
109
|
+
# Optionally remove descendant classes.
|
110
|
+
if not self.config.include_all_classes:
|
111
|
+
for descendant in self._descendant_classes:
|
112
|
+
if descendant in schema.classes:
|
113
|
+
del schema.classes[descendant]
|
114
|
+
|
115
|
+
return schema
|
linkml/utils/deprecation.py
CHANGED
@@ -232,6 +232,32 @@ DEPRECATIONS = (
|
|
232
232
|
),
|
233
233
|
recommendation="Update to use linkml.validator",
|
234
234
|
),
|
235
|
+
Deprecation(
|
236
|
+
name="gen-markdown",
|
237
|
+
# the last update to any code in markdowngen.py was in v1.9.1
|
238
|
+
# we can start considering it as deprecated from this version
|
239
|
+
deprecated_in=SemVer.from_str("1.9.1"),
|
240
|
+
removed_in=SemVer.from_str("1.10.0"),
|
241
|
+
message=(
|
242
|
+
"gen-markdown has been deprecated in favor of gen-doc, which is the new "
|
243
|
+
"de-facto generator for generating markdown documentation files (with "
|
244
|
+
"embedded mermaid class diagrams) from a LinkML schema"
|
245
|
+
),
|
246
|
+
recommendation="Update to use `gen-doc`",
|
247
|
+
),
|
248
|
+
Deprecation(
|
249
|
+
name="gen-yuml",
|
250
|
+
# the last update to any code in yumlgen.py was in v1.8.7
|
251
|
+
# we can start considering it as deprecated from this version
|
252
|
+
deprecated_in=SemVer.from_str("1.8.7"),
|
253
|
+
removed_in=SemVer.from_str("1.10.0"),
|
254
|
+
message=(
|
255
|
+
"gen-yuml has been deprecated and is no longer supported. "
|
256
|
+
"It has been replaced by more feature-rich diagram generators such as "
|
257
|
+
"gen-doc (embedded mermaid diagrams), gen-plantuml, gen-mermaid-class-diagram, and gen-erdiagram."
|
258
|
+
),
|
259
|
+
recommendation="Update to use `gen-doc`, `gen-plantuml`, `gen-mermaid-class-diagram`, or `gen-erdiagram`",
|
260
|
+
),
|
235
261
|
) # type: tuple[Deprecation, ...]
|
236
262
|
|
237
263
|
EMITTED = set() # type: set[str]
|
linkml/utils/execute_tutorial.py
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
"""
|
2
|
+
This module executes and evaluates code blocks in tutorial markdown files.
|
3
|
+
Command line usage example: `python -m linkml.utils.execute_tutorial -d /tmp/tutorial/ docs/intro/tutorial01.md`
|
4
|
+
|
5
|
+
It requires that the code blocks have the following format:
|
6
|
+
- A code block containing file contents that should be written to a file for testing should be preceded by a line
|
7
|
+
whose text is the file name (no spaces) and a colon.
|
8
|
+
- A code block containing expected output should be preceded by a line whose text is a single word containing the
|
9
|
+
text "output" (case insensitive) and a colon.
|
10
|
+
- A code block containing a command that is expected to fail should be preceded by a line that starts with
|
11
|
+
"<!-- fail" (case insensitive).
|
12
|
+
- A code block containing commands that should not be executed should be preceded by a line that starts with
|
13
|
+
"<!-- no_execute" (case insensitive).
|
14
|
+
- The code block starts with a line containing three backticks. It can then contain either the language name
|
15
|
+
(e.g., `bash`, `python`, etc.) or `{literalinclude}` followed by a file path. If using `{literalinclude}`,
|
16
|
+
the next line should contain the language tag (e.g., `:language: python`).
|
17
|
+
- The code block ends with a line containing three backticks.
|
18
|
+
"""
|
19
|
+
|
1
20
|
import logging
|
2
21
|
import re
|
3
22
|
import subprocess
|
@@ -12,8 +31,9 @@ from linkml._version import __version__
|
|
12
31
|
logger = logging.getLogger(__name__)
|
13
32
|
|
14
33
|
re_decl = re.compile(r"^(\S+):$")
|
15
|
-
|
16
|
-
|
34
|
+
re_start_code_block = re.compile(r"^```(\w+)$") # does not include literalinclude blocks
|
35
|
+
re_literalinclude = re.compile(r"^```\{literalinclude\} (.+)$")
|
36
|
+
re_end_code_block = re.compile(r"^```$")
|
17
37
|
re_html_comment = re.compile(r"^<!-- (.+) -->")
|
18
38
|
|
19
39
|
|
@@ -58,8 +78,9 @@ def execute_blocks(directory: str, blocks: list[Block]) -> list[str]:
|
|
58
78
|
for block in blocks:
|
59
79
|
write_lines(block.prior_lines)
|
60
80
|
logger.info(f"# Block: {block.category} {block.title}")
|
61
|
-
if block.is_file_block():
|
81
|
+
if block.is_file_block() and not block.is_bash():
|
62
82
|
path = PurePath(directory, block.title)
|
83
|
+
logger.info(f"Writing to: {path}")
|
63
84
|
with open(path, "w", encoding="UTF-8") as stream:
|
64
85
|
stream.write(block.content)
|
65
86
|
elif block.is_bash():
|
@@ -82,7 +103,7 @@ def execute_blocks(directory: str, blocks: list[Block]) -> list[str]:
|
|
82
103
|
block.output = r.stdout.decode("utf-8")
|
83
104
|
if outpath:
|
84
105
|
with open(outpath, "w", encoding="UTF-8") as stream:
|
85
|
-
logger.info(f"WRITING {len(block.output)} TO = {outpath}")
|
106
|
+
logger.info(f"WRITING {len(block.output)} CHARS TO = {outpath}")
|
86
107
|
stream.write(block.output)
|
87
108
|
block.error = r.stderr.decode("utf-8")
|
88
109
|
logger.info(f"OUT [sample] = {block.output[0:30]}")
|
@@ -123,7 +144,7 @@ def write_lines(lines: list[str]) -> None:
|
|
123
144
|
|
124
145
|
def parse_file_to_blocks(input) -> list[Block]:
|
125
146
|
"""
|
126
|
-
Parses a markdown tutorial file to code
|
147
|
+
Parses a markdown tutorial file to code blocks to be executed
|
127
148
|
|
128
149
|
:param input:
|
129
150
|
:return:
|
@@ -150,9 +171,9 @@ def parse_file_to_blocks(input) -> list[Block]:
|
|
150
171
|
m = re_decl.match(line)
|
151
172
|
if m:
|
152
173
|
fn = m.group(1)
|
153
|
-
print(f"
|
174
|
+
print(f"TITLE={fn}")
|
154
175
|
else:
|
155
|
-
m =
|
176
|
+
m = re_start_code_block.match(line)
|
156
177
|
if m:
|
157
178
|
curr_block = Block(
|
158
179
|
category=m.group(1),
|
@@ -165,12 +186,53 @@ def parse_file_to_blocks(input) -> list[Block]:
|
|
165
186
|
prior_lines = []
|
166
187
|
anns = []
|
167
188
|
else:
|
168
|
-
|
189
|
+
m = re_literalinclude.match(line)
|
190
|
+
if m and fn:
|
191
|
+
# Handle literalinclude directive
|
192
|
+
file_path = m.group(1).strip()
|
193
|
+
# Look ahead and extract language from the language tag
|
194
|
+
language = "yaml" # Default to yaml if no language tag is found
|
195
|
+
if lines and lines[0].strip().startswith(":language:"):
|
196
|
+
language_line = lines[0].strip()
|
197
|
+
language = language_line.split(":language:")[1].strip()
|
198
|
+
lines = lines[1:]
|
199
|
+
# Skip end of code block
|
200
|
+
if lines and lines[0].strip() == "```":
|
201
|
+
lines = lines[1:]
|
202
|
+
else:
|
203
|
+
logger.warning(
|
204
|
+
f"Expected end of code block after literalinclude, but found: {lines[0].strip()}"
|
205
|
+
)
|
206
|
+
|
207
|
+
# Convert relative path to absolute path
|
208
|
+
input_dir = Path(input).parent
|
209
|
+
abs_path = input_dir / file_path
|
210
|
+
|
211
|
+
try:
|
212
|
+
with open(abs_path) as f:
|
213
|
+
file_content = f.read()
|
214
|
+
|
215
|
+
# Create a block for this file
|
216
|
+
file_block = Block(
|
217
|
+
category=language, # Use the extracted language
|
218
|
+
title=fn,
|
219
|
+
expected_fail=expected_fail,
|
220
|
+
content=file_content,
|
221
|
+
annotations=anns,
|
222
|
+
prior_lines=prior_lines,
|
223
|
+
)
|
224
|
+
blocks.append(file_block)
|
225
|
+
prior_lines = []
|
226
|
+
anns = []
|
227
|
+
except Exception as e:
|
228
|
+
logger.error(f"Failed to read included file {abs_path}: {e}")
|
229
|
+
else:
|
230
|
+
prior_lines += [line]
|
169
231
|
else:
|
170
232
|
# in block
|
171
233
|
fn = None
|
172
234
|
expected_fail = False
|
173
|
-
m =
|
235
|
+
m = re_end_code_block.match(line)
|
174
236
|
if m:
|
175
237
|
blocks.append(curr_block)
|
176
238
|
curr_block = None
|
@@ -30,15 +30,15 @@ class RecommendedSlotsPlugin(ValidationPlugin):
|
|
30
30
|
)
|
31
31
|
slot_range_class = context.schema_view.get_class(slot_def.range)
|
32
32
|
if slot_range_class is not None and slot_value is not None:
|
33
|
-
location
|
33
|
+
slot_location = location + [slot_def.name]
|
34
34
|
if slot_def.multivalued:
|
35
35
|
if slot_def.inlined and isinstance(slot_value, dict):
|
36
36
|
for k, v in slot_value.items():
|
37
|
-
yield from _do_process(v, slot_range_class.name,
|
37
|
+
yield from _do_process(v, slot_range_class.name, slot_location + [k])
|
38
38
|
elif slot_def.inlined_as_list and isinstance(slot_value, list):
|
39
39
|
for i, v in enumerate(slot_value):
|
40
|
-
yield from _do_process(v, slot_range_class.name,
|
40
|
+
yield from _do_process(v, slot_range_class.name, slot_location + [str(i)])
|
41
41
|
else:
|
42
|
-
yield from _do_process(instance[slot_def.name], slot_range_class.name,
|
42
|
+
yield from _do_process(instance[slot_def.name], slot_range_class.name, slot_location)
|
43
43
|
|
44
44
|
yield from _do_process(instance, context.target_class)
|
@@ -1,59 +1,62 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: linkml
|
3
|
-
Version: 1.9.
|
3
|
+
Version: 1.9.2
|
4
4
|
Summary: Linked Open Data Modeling Language
|
5
|
-
|
5
|
+
License: Apache-2.0
|
6
6
|
Keywords: schema,linked data,data modeling,rdf,owl,biolink
|
7
7
|
Author: Chris Mungall
|
8
8
|
Author-email: cjmungall@lbl.gov
|
9
|
-
Requires-Python: >=3.9
|
9
|
+
Requires-Python: >=3.9
|
10
10
|
Classifier: Development Status :: 5 - Production/Stable
|
11
11
|
Classifier: Environment :: Console
|
12
12
|
Classifier: Intended Audience :: Developers
|
13
|
-
Classifier: Intended Audience :: Healthcare Industry
|
14
13
|
Classifier: Intended Audience :: Science/Research
|
15
|
-
Classifier:
|
16
|
-
Classifier:
|
14
|
+
Classifier: Intended Audience :: Healthcare Industry
|
15
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
17
16
|
Classifier: Programming Language :: Python :: 3.9
|
18
17
|
Classifier: Programming Language :: Python :: 3.10
|
19
18
|
Classifier: Programming Language :: Python :: 3.11
|
20
19
|
Classifier: Programming Language :: Python :: 3.12
|
21
20
|
Classifier: Programming Language :: Python :: 3.13
|
22
|
-
Classifier: Programming Language :: Python :: 3.8
|
23
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
24
21
|
Provides-Extra: black
|
25
22
|
Provides-Extra: numpydantic
|
23
|
+
Provides-Extra: pandera
|
24
|
+
Provides-Extra: polars-lts-cpu
|
26
25
|
Provides-Extra: shacl
|
27
26
|
Provides-Extra: tests
|
28
27
|
Requires-Dist: antlr4-python3-runtime (>=4.9.0,<4.10)
|
29
|
-
Requires-Dist: black (>=24.0.0) ; extra == "black"
|
28
|
+
Requires-Dist: black (>=24.0.0) ; extra == "black"
|
29
|
+
Requires-Dist: black (>=24.0.0) ; extra == "tests"
|
30
30
|
Requires-Dist: click (>=7.0)
|
31
31
|
Requires-Dist: graphviz (>=0.10.1)
|
32
32
|
Requires-Dist: hbreader
|
33
33
|
Requires-Dist: isodate (>=0.6.0)
|
34
34
|
Requires-Dist: jinja2 (>=3.1.0)
|
35
|
-
Requires-Dist: jsonasobj2 (>=1.0.3,<2.
|
35
|
+
Requires-Dist: jsonasobj2 (>=1.0.3,<2.0.0)
|
36
36
|
Requires-Dist: jsonschema[format] (>=4.0.0)
|
37
|
-
Requires-Dist: linkml-runtime (>=1.9.
|
38
|
-
Requires-Dist: numpydantic (>=1.6.1) ; extra == "numpydantic"
|
37
|
+
Requires-Dist: linkml-runtime (>=1.9.2,<2.0.0)
|
38
|
+
Requires-Dist: numpydantic (>=1.6.1) ; extra == "numpydantic"
|
39
|
+
Requires-Dist: numpydantic (>=1.6.1) ; extra == "tests"
|
39
40
|
Requires-Dist: openpyxl
|
41
|
+
Requires-Dist: pandera (>=0.19.0) ; extra == "pandera"
|
40
42
|
Requires-Dist: parse
|
43
|
+
Requires-Dist: polars-lts-cpu (>=1.0.0) ; extra == "polars-lts-cpu"
|
41
44
|
Requires-Dist: prefixcommons (>=0.1.7)
|
42
45
|
Requires-Dist: prefixmaps (>=0.2.2)
|
43
46
|
Requires-Dist: pydantic (>=1.0.0,<3.0.0)
|
44
47
|
Requires-Dist: pyjsg (>=0.11.6)
|
45
|
-
Requires-Dist: pyshacl (>=0.25.0
|
48
|
+
Requires-Dist: pyshacl (>=0.25.0) ; extra == "shacl"
|
49
|
+
Requires-Dist: pyshacl (>=0.25.0) ; extra == "tests"
|
46
50
|
Requires-Dist: pyshex (>=0.7.20)
|
47
51
|
Requires-Dist: pyshexc (>=0.8.3)
|
48
52
|
Requires-Dist: python-dateutil
|
49
53
|
Requires-Dist: pyyaml
|
50
54
|
Requires-Dist: rdflib (>=6.0.0)
|
51
55
|
Requires-Dist: requests (>=2.22)
|
56
|
+
Requires-Dist: sphinx-click (>=6.0.0)
|
52
57
|
Requires-Dist: sqlalchemy (>=1.4.31)
|
53
58
|
Requires-Dist: typing-extensions (>=4.6.0) ; python_version < "3.12"
|
54
59
|
Requires-Dist: watchdog (>=0.9.0)
|
55
|
-
Project-URL: Documentation, https://linkml.io/linkml/
|
56
|
-
Project-URL: Repository, https://github.com/linkml/linkml
|
57
60
|
Description-Content-Type: text/markdown
|
58
61
|
|
59
62
|
[](https://pypi.python.org/pypi/linkml)
|
@@ -2,10 +2,10 @@ linkml/__init__.py,sha256=0REu65rXiOk3F1CYLzq60HiSZ2DfFySfGS6QFljZ01s,3663
|
|
2
2
|
linkml/_version.py,sha256=udxv6OEqcE89DTVMYPtetXYg8IA8Sgc6yW26-6f8C3M,310
|
3
3
|
linkml/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
linkml/cli/__main__.py,sha256=oPa7Fl2DQP40UivpIWNRr1CgwT2SQM0rhE478155zBY,80
|
5
|
-
linkml/cli/main.py,sha256=
|
5
|
+
linkml/cli/main.py,sha256=EncEEYMqaSlXj3pOEi8_xqZe12BYPW9IdEMJilGqIkI,5594
|
6
6
|
linkml/generators/PythonGenNotes.md,sha256=wb9BPLLhF6378OKLbwSBAwmniLpwrcT5_bbfCHfLme8,51006
|
7
7
|
linkml/generators/README.md,sha256=RMzT8EblC_GEdPy5WyfXHDBXlFI6k6mz3Cx2sdpcyWI,4438
|
8
|
-
linkml/generators/__init__.py,sha256=
|
8
|
+
linkml/generators/__init__.py,sha256=AxTltouJeNayg3sJmVM7h4JkCx8NxGa4AV-_awtvfmo,1669
|
9
9
|
linkml/generators/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
linkml/generators/common/build.py,sha256=X2QDnybdr5GwDIaXWfwAzIqduqk7_rDReU-7CvcJ2OI,2835
|
11
11
|
linkml/generators/common/ifabsent_processor.py,sha256=qefNF_rd24DxF4IGAynR9J7zWGH-oMfDULNbFMvZalA,13527
|
@@ -16,16 +16,16 @@ linkml/generators/common/type_designators.py,sha256=ORA9siVxHUXqn3TMuun81m_whqZc
|
|
16
16
|
linkml/generators/csvgen.py,sha256=gPwX5GuwToD2KQF7SrINatqwMYY-54ZsgDTgYH1EM1Y,3242
|
17
17
|
linkml/generators/dbmlgen.py,sha256=IrtY65iFdXg4wHBP9vHQeV20HUOUB1XlggPtmt_YvGM,5466
|
18
18
|
linkml/generators/docgen/class.md.jinja2,sha256=LqQSKfH-wWR1ELTbhuEK5QFypU__uqwLmbGvS9rZsKo,3602
|
19
|
-
linkml/generators/docgen/class_diagram.md.jinja2,sha256=
|
20
|
-
linkml/generators/docgen/common_metadata.md.jinja2,sha256=
|
19
|
+
linkml/generators/docgen/class_diagram.md.jinja2,sha256=hCBPUyhvZWFow5eWVyzCtZ-_nMbq5fHFLxz7d6hpdNI,3633
|
20
|
+
linkml/generators/docgen/common_metadata.md.jinja2,sha256=Gj2JltvwCvVHBloYkXFtudFsu407pibfgmKRw4NFY4k,1603
|
21
21
|
linkml/generators/docgen/enum.md.jinja2,sha256=BCi4PUamCjszM17yrg2KNltR_JfrBjNdH87S5uz9DtY,1112
|
22
|
-
linkml/generators/docgen/index.md.jinja2,sha256=
|
22
|
+
linkml/generators/docgen/index.md.jinja2,sha256=jP_sx7b96bf1WDmtsS7XtdsNoRuHrOI2Wbl8VE223pQ,1512
|
23
23
|
linkml/generators/docgen/index.tex.jinja2,sha256=Go_EA-_N4JUpbOYbk3OY11mz5yV70VF2l2sMtgIPWw4,501
|
24
24
|
linkml/generators/docgen/schema.md.jinja2,sha256=b52xmnlTheigxKgP_2Sq1nnQUEW6XNi_ScPnqxptjps,167
|
25
25
|
linkml/generators/docgen/slot.md.jinja2,sha256=_0xgRUlSYJMpxwGcboFoCAcELFDEzzXSTwBduPvwY-Q,3501
|
26
26
|
linkml/generators/docgen/subset.md.jinja2,sha256=ttcsDa2fLYOU1_tDzHOyEsplhc1UHY_cy1_apQZyk6A,2803
|
27
27
|
linkml/generators/docgen/type.md.jinja2,sha256=K0f7x5b3Nfjm1W-rDI4OHj2sU-RNm9hP1nuRJjHHJMU,733
|
28
|
-
linkml/generators/docgen.py,sha256=
|
28
|
+
linkml/generators/docgen.py,sha256=wkcg62Dkx2ksx7m3M_0wEK3F6NfGTemVSkD8HhWMFzk,39929
|
29
29
|
linkml/generators/dotgen.py,sha256=DR1tC-vZ7Vj-NxEkE-zOPGrwPUIk5Bo2LISsJpS0rUk,5022
|
30
30
|
linkml/generators/erdiagramgen.py,sha256=_NVBq7RzJNDZPjMtb0NYE_mbYrOyZVG-8uqGy5J5KC0,11451
|
31
31
|
linkml/generators/excelgen.py,sha256=81x0Ib13ZjLC5WBWsH0aePn8swv_pjZnwV4X-T4q4Jc,7684
|
@@ -36,15 +36,26 @@ linkml/generators/javagen/example_template.java.jinja2,sha256=ec4CVTv_0zS7V5Y-1E
|
|
36
36
|
linkml/generators/javagen/java_record_template.jinja2,sha256=OQZffLSy_xR3FIhQMltvrYyVeut7l2Q-tzK7AOiVmWs,1729
|
37
37
|
linkml/generators/javagen.py,sha256=BTAXgvOOvRa3AOfaaiVFyuyaqg4XFR_JbO6_7tT_AnQ,5335
|
38
38
|
linkml/generators/jsonldcontextgen.py,sha256=3bu4OY4t5eyiCghXJZ1m9mGPrLpHcJ2ap21Cov_IWpM,8947
|
39
|
-
linkml/generators/jsonldgen.py,sha256=
|
39
|
+
linkml/generators/jsonldgen.py,sha256=titjvZz7pMozT0kR1UJh4H57RTPBKKYQ35t0g5Ofj_Q,7794
|
40
40
|
linkml/generators/jsonschemagen.py,sha256=F2lJCS-8cSYRgljh-6OM395aCeL2Fb3Qx6gB2X2mXXw,30848
|
41
41
|
linkml/generators/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
42
|
linkml/generators/linkmlgen.py,sha256=xYgS4i-Xo5Z3t9gqEdqxHKv5KGUxOerpy8M9kX6WeuI,4225
|
43
|
-
linkml/generators/markdowngen.py,sha256=
|
44
|
-
linkml/generators/mermaidclassdiagramgen.py,sha256=
|
43
|
+
linkml/generators/markdowngen.py,sha256=23fYWzVfufbzQxrRLKvYLEDDlBBKqVfJCguelIiW2Fs,35214
|
44
|
+
linkml/generators/mermaidclassdiagramgen.py,sha256=yllg4l8psxdeti1kYOgiseB0fGeFQK_4FAealjFZ5bE,5011
|
45
45
|
linkml/generators/namespacegen.py,sha256=C4p9LSwsnDqf6sv-wG5l0VQniWFJ1HA1hRXJBDOg3pM,6467
|
46
46
|
linkml/generators/oocodegen.py,sha256=dgcHhpO81qC2Tx-kG_VhZVaoRjOwrcrulIXV8gEU1bY,7808
|
47
47
|
linkml/generators/owlgen.py,sha256=HcW5EIohi9YMd6pXH62bAesZrrbBt5H8-4eQ3Eab6ow,58095
|
48
|
+
linkml/generators/panderagen/__init__.py,sha256=Bcthn0rKU6xzQoBU--hfTUJwyOvKjASGICYamEglzcQ,109
|
49
|
+
linkml/generators/panderagen/class_generator_mixin.py,sha256=LKdpKb1_pyBN3iyhzsQE_Q9A3S9CnXj0RQUDQw0_Ly4,826
|
50
|
+
linkml/generators/panderagen/enum_generator_mixin.py,sha256=CMILBMjP35L8HHdp7WuO0dAHe9zEVBvN5CBSQlq41_g,708
|
51
|
+
linkml/generators/panderagen/panderagen.py,sha256=OxLZrVLzUD5PrmomsC0MYaUM8v0R4djKHDtVr6UjPjQ,6445
|
52
|
+
linkml/generators/panderagen/panderagen_class_based/class.jinja2,sha256=56Pb-6iiGgyfcCT1oE7mD4Rbs637SLgn2wsqH3Eyzwc,686
|
53
|
+
linkml/generators/panderagen/panderagen_class_based/enums.jinja2,sha256=7eXfmoz7F6Tb2aYumTwW6UrwrQvqD73oYTi-LbmNCVw,295
|
54
|
+
linkml/generators/panderagen/panderagen_class_based/header.jinja2,sha256=shLPwNAjIPMgR7uoqZWUxo4a_OtV15ywSjYh0m9dIKo,396
|
55
|
+
linkml/generators/panderagen/panderagen_class_based/mixins.jinja2,sha256=JCgwGre4FuoEUSbPrg5MRJXZbcx5_3uCt-JuBsG3LRY,955
|
56
|
+
linkml/generators/panderagen/panderagen_class_based/pandera.jinja2,sha256=Vlh5tdp7T9gbPst1RR72PdFeboE4Ha0yX5wILXHeZyE,506
|
57
|
+
linkml/generators/panderagen/panderagen_class_based/slots.jinja2,sha256=cy8LKkGNDkNZBoECVOwkvN0MKLj0U_KrgkiOaY317Rc,1416
|
58
|
+
linkml/generators/panderagen/slot_generator_mixin.py,sha256=mDoyptHXiR4TehDmSe3cYX4Mpa1oJUH8apPiJEKycLo,2586
|
48
59
|
linkml/generators/plantumlgen.py,sha256=S05S13kxDLeKJihZ7BZesuj_8-tQUzsWjL6S478dzQg,15603
|
49
60
|
linkml/generators/prefixmapgen.py,sha256=X-3K1q5WcSS8TL7rHBOL4qBGBk2Szr7l1_UzRQVvFGA,4246
|
50
61
|
linkml/generators/projectgen.py,sha256=vPaCv8Qf3rwi2aPlEpFc2-Q27ed9WwZiJfseZvflIXU,9764
|
@@ -60,11 +71,11 @@ linkml/generators/pydanticgen/templates/attribute.py.jinja,sha256=4s4eUZEqiTxHV2
|
|
60
71
|
linkml/generators/pydanticgen/templates/base_model.py.jinja,sha256=6KRQ1ZVHh1uwZnYL3qxBnyit8_DNE7D-4l2-1wsRsG0,406
|
61
72
|
linkml/generators/pydanticgen/templates/class.py.jinja,sha256=GqR2t5y0vLmvUpT2vyP5VX42PO9AkAnGE-U2RZPa9AI,690
|
62
73
|
linkml/generators/pydanticgen/templates/conditional_import.py.jinja,sha256=YheknDrxvepiJUzeItSL5aSbAkCdR1k0a6m6aTA4qNM,240
|
63
|
-
linkml/generators/pydanticgen/templates/enum.py.jinja,sha256=
|
74
|
+
linkml/generators/pydanticgen/templates/enum.py.jinja,sha256=d2j0FbQ4HT-TjspaUkfSHWaHJ50didUBTE8RV9Cj7bo,372
|
64
75
|
linkml/generators/pydanticgen/templates/footer.py.jinja,sha256=t_24p1xmqdbfxGqz_XCXSTvkkWt26_2w_RcQjGIAWlY,155
|
65
76
|
linkml/generators/pydanticgen/templates/imports.py.jinja,sha256=vwAOWV98rM4reAUXUYQXihukTPoVDcs8D9HWsVZmTiQ,1249
|
66
77
|
linkml/generators/pydanticgen/templates/module.py.jinja,sha256=hqZKsJ72yUioBkZAunscVgLSe58OFHf0z6-so_b43U4,526
|
67
|
-
linkml/generators/pydanticgen/templates/validator.py.jinja,sha256=
|
78
|
+
linkml/generators/pydanticgen/templates/validator.py.jinja,sha256=oz8XWh4Mt7DRHH0KObKGZWl_WUoR0KzoGMkLOh-NXFU,525
|
68
79
|
linkml/generators/python/__init__.py,sha256=NS9fPEuAo0punDplD91F9mcViXMJJv04Q5NkFcKPNvY,40
|
69
80
|
linkml/generators/python/python_ifabsent_processor.py,sha256=io-bLevkdy2xgKl0kqGB3o5iR7O7P1uE4qWEhKt-GcM,3838
|
70
81
|
linkml/generators/pythongen.py,sha256=LDYQxtl4PEDmzX4e9mR9DQ2X9ANcE3vIOI4JMwnl8R8,55769
|
@@ -79,14 +90,14 @@ linkml/generators/sqlalchemy/__init__.py,sha256=mb9AC1rIFkSiNZhhG0TAk45ol9PjS1Xv
|
|
79
90
|
linkml/generators/sqlalchemy/sqlalchemy_declarative_template.py,sha256=X_Ws1NUBikMI5HuNgEhl_PIeWM-B-c2B0W9KUBH4QTg,2542
|
80
91
|
linkml/generators/sqlalchemy/sqlalchemy_imperative_template.py,sha256=u4ZpponG1h6XROrOHGOf_0H2e6xL1_s8twAOA-gx94A,1622
|
81
92
|
linkml/generators/sqlalchemygen.py,sha256=fl8twO36TkC8mWu6pJjgGzrKEGpAinRdGJYOK5ck5wI,9326
|
82
|
-
linkml/generators/sqltablegen.py,sha256=
|
93
|
+
linkml/generators/sqltablegen.py,sha256=9HMFs0JE9HKzdJgUwgvCpHoPE0Mm8ByW9o64y9lrLG4,14785
|
83
94
|
linkml/generators/sssomgen.py,sha256=zrZy0WL9fF5bk-XAcB-MZYZkhHhqVRHt2rGBUtfqnLY,6891
|
84
95
|
linkml/generators/string_template.md,sha256=kRcfic6entgIaJdpSg6GF3jcjC9wbKsCVM6wVT2qipc,1788
|
85
96
|
linkml/generators/summarygen.py,sha256=abNd39Z-Kn3FX2fjXLeCqvXvFunpqM7UFPimtiCB2p0,3081
|
86
97
|
linkml/generators/terminusdbgen.py,sha256=om2pHIIMmL2mh3DkzCO_J20ni7qr43L4ptl3jqSsZN4,4689
|
87
98
|
linkml/generators/typescriptgen.py,sha256=wRnZpZ3LEepJRFYHVNP06PX5rPFzIDPglDRxi0Z6Zro,8870
|
88
99
|
linkml/generators/yamlgen.py,sha256=PWexYoR3wHRoAUk6zK67fRYjBF6sAmX_iGlOAT0PJq0,1623
|
89
|
-
linkml/generators/yumlgen.py,sha256=
|
100
|
+
linkml/generators/yumlgen.py,sha256=ZK42N3hJPvvOdztOWCwysARrGVWjg5V4Qx2XcS2Vvgc,13277
|
90
101
|
linkml/linter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
91
102
|
linkml/linter/cli.py,sha256=N6MRbRU2bE9ee4xVtgWoqBRh_IZ_SSt15S6RJDP1m1I,4514
|
92
103
|
linkml/linter/config/datamodel/.linkmllint.yaml,sha256=40rNhcL35FXQSjlVBMWnyPgplwEUqFT_sJmeZqUzxMw,292
|
@@ -109,15 +120,16 @@ linkml/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
109
120
|
linkml/transformers/logical_model_transformer.py,sha256=g_o23EDfFnEdKD71Td1m8ZZ1hYuHrqOyvx9sBuX8_LE,29938
|
110
121
|
linkml/transformers/model_transformer.py,sha256=tK_MpRDI-q2qfe8KHT6qJHP8ZruKjYx1FcM-Fnjse-E,678
|
111
122
|
linkml/transformers/relmodel_transformer.py,sha256=9_r4bNJ6HDjaqZZTOE6nmjXjLgmRm-i96NbgBma8iR4,19663
|
123
|
+
linkml/transformers/rollup_transformer.py,sha256=YP3RyYa0TzfkTrPZ4LnTIedmQWCnneFk3wAT77E1Amc,4549
|
112
124
|
linkml/transformers/schema_renamer.py,sha256=DvXsAsxAb8p8RAxR_c74zbn_VRFN1JHCLHcjH9z7qr0,5263
|
113
125
|
linkml/utils/__init__.py,sha256=Pkyv-Gfb8QoJdInRdJuuUz1Igfe0sT9t8Gv3V_fyTXc,92
|
114
126
|
linkml/utils/cli_utils.py,sha256=MdVbox1qr6kDUHUCWAmFhV-D6ebs_nn8vVwB8KDQfew,742
|
115
127
|
linkml/utils/converter.py,sha256=0xcUXdVPUXZvVuHivUibfVMoCd24oPsjYU1M17H173U,7121
|
116
128
|
linkml/utils/datautils.py,sha256=QlbzwXykh5Fphfe5KxPo6_ekXfniLbHiEGJtLWjUrvY,3742
|
117
129
|
linkml/utils/datavalidator.py,sha256=kBdWaVi8IZT1bOwEJgJYx-wZAb_PTBObB9nHpYORfKA,472
|
118
|
-
linkml/utils/deprecation.py,sha256=
|
130
|
+
linkml/utils/deprecation.py,sha256=fFd_rUmTJInovuhuHVZf_44fQRve6FyJ43DY2-0XLmA,9781
|
119
131
|
linkml/utils/exceptions.py,sha256=3S6lf5WAUgVvjPRaES597_YjUjbbJ5KqjKjpjcaRLoU,217
|
120
|
-
linkml/utils/execute_tutorial.py,sha256=
|
132
|
+
linkml/utils/execute_tutorial.py,sha256=gGgkuTjP8Tsb-4imsNAa_1ESlrsl3qCz02skFvhI5dE,10587
|
121
133
|
linkml/utils/generator.py,sha256=TWif2M7LHv6pAW5uRHJKBzNmEkasAen1W3uMjO1VPIA,39576
|
122
134
|
linkml/utils/helpers.py,sha256=MomYM4Oof-c1SgyMpjoG0Aob-eaVeF8kXvuzdJiKo_g,3351
|
123
135
|
linkml/utils/logictools.py,sha256=pV66YWCWhQyCjra77k2H_hygaIq3Dy6vAb9N67rrAdc,23649
|
@@ -141,7 +153,7 @@ linkml/validator/loaders/yaml_loader.py,sha256=JqTWBV1V4Imk-uktQugjaxl88sqWS0X5Q
|
|
141
153
|
linkml/validator/plugins/__init__.py,sha256=0ifiDqpcXVy4X7OJFm7FMYi1-6E06avNIIk9R0c6nD8,693
|
142
154
|
linkml/validator/plugins/jsonschema_validation_plugin.py,sha256=F40Ml5Qs71mXmcMqoIsZsNJEhrkmNHMgnl33EuPF7HQ,2696
|
143
155
|
linkml/validator/plugins/pydantic_validation_plugin.py,sha256=dJ-LDUtbD8Y6tH1RE-eGRkhu1XTjxGXIzL4bflW5T4M,2017
|
144
|
-
linkml/validator/plugins/recommended_slots_plugin.py,sha256=
|
156
|
+
linkml/validator/plugins/recommended_slots_plugin.py,sha256=6P2WYNgA_UPSJja_0jhh4hlLD6P8HXIkefnD9IxH4Hc,2359
|
145
157
|
linkml/validator/plugins/shacl_validation_plugin.py,sha256=4QxFAhuMKKkKTl8VDtD-FTBqnXsQEoG_d3osDKggcQk,3915
|
146
158
|
linkml/validator/plugins/validation_plugin.py,sha256=Gx4S5nFZ7DPoYIGlFe_o2vQJyCX0vBB3Qk2t606IfFs,1557
|
147
159
|
linkml/validator/report.py,sha256=fhXGkm1Yxdy1fmxJD08Kn_yZ7FikJMW0LVPmZiF4lHw,1055
|
@@ -155,8 +167,8 @@ linkml/workspaces/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
155
167
|
linkml/workspaces/datamodel/workspaces.py,sha256=YIGzErECZuMER03h3DcuY3psMb0lDF1Pia_8hreKoTE,14667
|
156
168
|
linkml/workspaces/datamodel/workspaces.yaml,sha256=EjVrwPpeRZqJRjuGyyDRxxFzuv55SiLIXPBRUG6HStU,4233
|
157
169
|
linkml/workspaces/example_runner.py,sha256=EjaAn6vaAKZnFcW5hRopkYBguiaR05aqKbuaM-o_7IE,12940
|
158
|
-
linkml-1.9.
|
159
|
-
linkml-1.9.
|
160
|
-
linkml-1.9.
|
161
|
-
linkml-1.9.
|
162
|
-
linkml-1.9.
|
170
|
+
linkml-1.9.2.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
|
171
|
+
linkml-1.9.2.dist-info/METADATA,sha256=Dxc9EJ467qTcNWS63GOUMyDGwRsskLvCpe87XY0NSQM,3720
|
172
|
+
linkml-1.9.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
173
|
+
linkml-1.9.2.dist-info/entry_points.txt,sha256=AgYAJBnCIEYZsOidFnZKRbTJRxMRtmapbXbtx5imB0E,2239
|
174
|
+
linkml-1.9.2.dist-info/RECORD,,
|
@@ -17,6 +17,7 @@ gen-markdown=linkml.generators.markdowngen:cli
|
|
17
17
|
gen-mermaid-class-diagram=linkml.generators.mermaidclassdiagramgen:cli
|
18
18
|
gen-namespaces=linkml.generators.namespacegen:cli
|
19
19
|
gen-owl=linkml.generators.owlgen:cli
|
20
|
+
gen-pandera=linkml.generators.panderagen:cli
|
20
21
|
gen-plantuml=linkml.generators.plantumlgen:cli
|
21
22
|
gen-prefix-map=linkml.generators.prefixmapgen:cli
|
22
23
|
gen-project=linkml.generators.projectgen:cli
|
File without changes
|