linkml 1.9.1rc2__py3-none-any.whl → 1.9.2rc1__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.
Files changed (33) hide show
  1. linkml/cli/main.py +2 -0
  2. linkml/generators/__init__.py +2 -0
  3. linkml/generators/docgen/class_diagram.md.jinja2 +10 -8
  4. linkml/generators/docgen/common_metadata.md.jinja2 +1 -1
  5. linkml/generators/docgen/index.md.jinja2 +1 -1
  6. linkml/generators/docgen.py +33 -7
  7. linkml/generators/jsonldgen.py +1 -1
  8. linkml/generators/markdowngen.py +24 -1
  9. linkml/generators/mermaidclassdiagramgen.py +3 -2
  10. linkml/generators/panderagen/__init__.py +9 -0
  11. linkml/generators/panderagen/class_generator_mixin.py +20 -0
  12. linkml/generators/panderagen/enum_generator_mixin.py +17 -0
  13. linkml/generators/panderagen/panderagen.py +216 -0
  14. linkml/generators/panderagen/panderagen_class_based/class.jinja2 +26 -0
  15. linkml/generators/panderagen/panderagen_class_based/enums.jinja2 +9 -0
  16. linkml/generators/panderagen/panderagen_class_based/header.jinja2 +21 -0
  17. linkml/generators/panderagen/panderagen_class_based/mixins.jinja2 +26 -0
  18. linkml/generators/panderagen/panderagen_class_based/pandera.jinja2 +16 -0
  19. linkml/generators/panderagen/panderagen_class_based/slots.jinja2 +36 -0
  20. linkml/generators/panderagen/slot_generator_mixin.py +77 -0
  21. linkml/generators/pydanticgen/templates/enum.py.jinja +6 -4
  22. linkml/generators/pydanticgen/templates/validator.py.jinja +7 -6
  23. linkml/generators/sqltablegen.py +143 -86
  24. linkml/generators/yumlgen.py +33 -1
  25. linkml/transformers/rollup_transformer.py +115 -0
  26. linkml/utils/deprecation.py +26 -0
  27. linkml/utils/execute_tutorial.py +71 -9
  28. linkml/validator/plugins/recommended_slots_plugin.py +4 -4
  29. {linkml-1.9.1rc2.dist-info → linkml-1.9.2rc1.dist-info}/METADATA +19 -16
  30. {linkml-1.9.1rc2.dist-info → linkml-1.9.2rc1.dist-info}/RECORD +33 -21
  31. {linkml-1.9.1rc2.dist-info → linkml-1.9.2rc1.dist-info}/WHEEL +1 -1
  32. {linkml-1.9.1rc2.dist-info → linkml-1.9.2rc1.dist-info}/entry_points.txt +1 -0
  33. {linkml-1.9.1rc2.dist-info → linkml-1.9.2rc1.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
@@ -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]
@@ -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
- re_start_yaml = re.compile(r"^```(\w+)$")
16
- re_end_yaml = re.compile(r"^```$")
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 blacks to be executed
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"FILE={fn}")
174
+ print(f"TITLE={fn}")
154
175
  else:
155
- m = re_start_yaml.match(line)
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
- prior_lines += [line]
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 = re_end_yaml.match(line)
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 += [slot_def.name]
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, location + [k])
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, location + [str(i)])
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, location)
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
1
+ Metadata-Version: 2.3
2
2
  Name: linkml
3
- Version: 1.9.1rc2
3
+ Version: 1.9.2rc1
4
4
  Summary: Linked Open Data Modeling Language
5
- Home-page: https://linkml.io/linkml/
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.0,<4.0.0
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: License :: OSI Approved :: Apache Software License
16
- Classifier: Programming Language :: Python :: 3
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" or extra == "tests"
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.dev0)
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.1,<2.0.0)
38
- Requires-Dist: numpydantic (>=1.6.1) ; extra == "numpydantic" or extra == "tests"
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,<0.26.0) ; extra == "shacl" or extra == "tests"
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
  [![Pyversions](https://img.shields.io/pypi/pyversions/linkml.svg)](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=4X0OXU53nqkS18ViOIRLH8bx2eDVzgisWixhx9bhgPQ,5484
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=2qSOnibL6KtzBW3KNqVX1gx1LQttrXlOPbbVDLLV2go,1587
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=gzskx4hOpU_s6BqOXdYZ9DwKxuClnsEgDzPurm30PeY,3469
20
- linkml/generators/docgen/common_metadata.md.jinja2,sha256=gy9J8rghBfKDKimwtHj_XuHY4PJRRYHLXVlBHqWrUzU,1604
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=suXRgJydHrxcMm3quXukaKkThtdzYA9i7BTuMAVKOP0,1502
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=st4g-1QucP0HIVAWSK_Eahv9pPKBz-lOzf06j2yy-Qc,38890
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=d94TEPu9zeHDZqPU6cSaiQiJnv0kc_AXkXahi1xOBZ8,7789
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=QkZ-LDT_Vm9gmHDFhVPFFR2oqPA-xATYgEYZS8bbVAE,34403
44
- linkml/generators/mermaidclassdiagramgen.py,sha256=S-fsMKZrR4BxDD1eK7TZBEaF4JuDzhBdzx3z7SBT2ds,4940
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=572XFQyEMZfL-G_Cj68T-NI_mUnDoFOAVJOGIKu2Hb8,338
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=5vDpqdfxLpie4BzcyjE82agO6NsThIZjNlcz6gq_kFg,465
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=BaWAuvwVHsXVt85GYxzH5_UL3ZeqRI9SojlvMmh4KkE,12395
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=vaXOQtweJjpKEqa2D-IsjWGLsijxjF9AKj98ycECOeQ,12197
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=jSU93Xi9pdg1rTokb3IY9I3N2V0uzb_YA_5MgJjs-Wg,8487
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=CFMDSbCU66jCmIkvWPchqvdsXj1Ol3ujEQnchy4688Q,7033
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=6xJBJ5g0LQvwZVn_Eld_ydmrJNovFPSzj63weK6-Oaw,2329
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.1rc2.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
159
- linkml-1.9.1rc2.dist-info/METADATA,sha256=EipO09qH2XCLX2BS0ebW-4etPDAXFQ46AlW9kpOateY,3715
160
- linkml-1.9.1rc2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
161
- linkml-1.9.1rc2.dist-info/entry_points.txt,sha256=CtvrM-5f3NuMEBTXONEnIo5UUJegBRWJvXUmrYfdIfM,2194
162
- linkml-1.9.1rc2.dist-info/RECORD,,
170
+ linkml-1.9.2rc1.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
171
+ linkml-1.9.2rc1.dist-info/METADATA,sha256=AUrxKhlbTbdku6fG4ODDpGN3pvyalX6dwbwb_AH7G7I,3723
172
+ linkml-1.9.2rc1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
173
+ linkml-1.9.2rc1.dist-info/entry_points.txt,sha256=AgYAJBnCIEYZsOidFnZKRbTJRxMRtmapbXbtx5imB0E,2239
174
+ linkml-1.9.2rc1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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