linkml 1.8.6__py3-none-any.whl → 1.9.0rc1__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.
@@ -21,7 +21,7 @@
21
21
  {%- endif -%}
22
22
  {% endmacro %}
23
23
 
24
- # Class: {{ title }}
24
+ # Class: {{ title }} {% if element.deprecated %} <span style="color: red;"><strong> (DEPRECATED) </strong> {% endif %}
25
25
 
26
26
  {%- if header -%}
27
27
  {{header}}
@@ -1,4 +1,4 @@
1
- # Enum: {{ gen.name(element) }}
1
+ # Enum: {{ gen.name(element) }} {% if element.deprecated %} <span style="color: red;"><strong> (DEPRECATED) </strong> {% endif %}
2
2
 
3
3
  {% if element.description %}
4
4
  {% set element_description_lines = element.description.split('\n') %}
@@ -1,4 +1,4 @@
1
- # {{ schema.name }}
1
+ # {{ schema.name }} {% if schema.deprecated %} <span style="color: red;"><strong> (DEPRECATED) </strong> {% endif %}
2
2
 
3
3
  {{ schema.description }}
4
4
 
@@ -21,7 +21,7 @@
21
21
  {%- endif -%}
22
22
  {% endmacro %}
23
23
 
24
- # Slot: {{ title }}
24
+ # Slot: {{ title }} {% if element.deprecated %} <span style="color: red;"><strong> (DEPRECATED) </strong> {% endif %}
25
25
 
26
26
  {%- if header -%}
27
27
  {{header}}
@@ -40,6 +40,9 @@ _{{ element_description_line }}_
40
40
 
41
41
  URI: {{ gen.uri_link(element) }}
42
42
 
43
+ {%- if element.alias %}
44
+ Alias: {{ element.alias }}
45
+ {% endif -%}
43
46
 
44
47
  {% if schemaview.slot_parents(element.name) or schemaview.slot_children(element.name, mixins=False) %}
45
48
 
@@ -1,4 +1,4 @@
1
- # Subset: {{ gen.name(element) }}
1
+ # Subset: {{ gen.name(element) }} {% if element.deprecated %} <span style="color: red;"><strong> (DEPRECATED) </strong> {% endif %}
2
2
 
3
3
  {%- if header -%}
4
4
  {{ header }}
@@ -1,4 +1,4 @@
1
- # Type: {{ gen.name(element) }}
1
+ # Type: {{ gen.name(element) }} {% if element.deprecated %} <span style="color: red;"><strong> (DEPRECATED) </strong> {% endif %}
2
2
 
3
3
  {% if element.description %}
4
4
  {% set element_description_lines = element.description.split('\n') %}
@@ -1,6 +1,4 @@
1
- """ Generate JSONld
2
-
3
- """
1
+ """Generate JSONld from a LinkML schema."""
4
2
 
5
3
  import os
6
4
  from copy import deepcopy
@@ -237,6 +237,7 @@ class JsonSchemaGenerator(Generator, LifecycleMixin):
237
237
  valid_formats = ["json"]
238
238
  uses_schemaloader = False
239
239
  file_extension = "schema.json"
240
+ materialize_patterns: bool = False
240
241
 
241
242
  # @deprecated("Use top_class")
242
243
  topClass: Optional[str] = None
@@ -690,6 +691,10 @@ class JsonSchemaGenerator(Generator, LifecycleMixin):
690
691
  return self.top_level_schema
691
692
 
692
693
  def serialize(self, **kwargs) -> str:
694
+ if self.materialize_patterns:
695
+ logger.info("Materializing patterns in the schema before serialization")
696
+ self.schemaview.materialize_patterns()
697
+
693
698
  return self.generate().to_json(sort_keys=True, indent=self.indent if self.indent > 0 else None)
694
699
 
695
700
 
@@ -752,6 +757,12 @@ Include LinkML Schema outside of imports mechanism. Helpful in including deprec
752
757
  YAML, and including it when necessary but not by default (e.g. in documentation or for backwards compatibility)
753
758
  """,
754
759
  )
760
+ @click.option(
761
+ "--materialize-patterns/--no-materialize-patterns",
762
+ default=True, # Default set to True
763
+ show_default=True,
764
+ help="If set, patterns will be materialized in the generated JSON Schema.",
765
+ )
755
766
  @click.version_option(__version__, "-V", "--version")
756
767
  def cli(yamlfile, **kwargs):
757
768
  """Generate JSON Schema representation of a LinkML model"""
@@ -114,8 +114,16 @@ def cli(
114
114
  ):
115
115
  # You can use the `--materialize` / `--no-materialize` for control
116
116
  # over both attribute and pattern materialization.
117
- materialize_attributes = bool(materialize)
118
- materialize_patterns = bool(materialize)
117
+
118
+ # If the user did not explicitly specify materialize_attributes,
119
+ # fall back to the umbrella materialize flag.
120
+ if materialize_attributes is None:
121
+ materialize_attributes = materialize
122
+
123
+ # If the user did not explicitly specify materialize_patterns,
124
+ # fall back to the umbrella materialize flag.
125
+ if materialize_patterns is None:
126
+ materialize_patterns = materialize
119
127
 
120
128
  gen = LinkmlGenerator(
121
129
  yamlfile,
@@ -0,0 +1,133 @@
1
+ import importlib
2
+ import logging
3
+ import os
4
+ from dataclasses import dataclass, field
5
+ from pathlib import Path
6
+ from typing import List, Optional
7
+
8
+ import click
9
+ from jinja2 import Environment, FileSystemLoader
10
+ from linkml_runtime.linkml_model.meta import Element, SlotDefinition
11
+ from linkml_runtime.utils.schemaview import SchemaView
12
+
13
+ from linkml.generators.docgen import DocGenerator, customize_environment
14
+ from linkml.utils.generator import Generator, shared_arguments
15
+
16
+
17
+ @dataclass
18
+ class MermaidClassDiagramGenerator(Generator):
19
+ """This generator creates Mermaid Class diagrams (https://mermaid.js.org/syntax/classDiagram.html)
20
+ for individual classes in a given LinkML schema and outputs them as Markdown files. It uses
21
+ a jinja template to render these class diagrams, which can be customized by the user and pointed
22
+ to using the `--template-file` option. If no template is provided, then the default template
23
+ file provided by LinkML and present at linkml/generators/docgen/class_diagram.md.jinja2 will be used.
24
+ The generator also has the option of specifying a certain set of classes for which you want the
25
+ class diagrams to be generated by using the `--classes` option.
26
+ """
27
+
28
+ generatorname = os.path.basename(__file__)
29
+ generatorversion = "0.0.1"
30
+ valid_formats = ["markdown"]
31
+ uses_schemaloader = False
32
+ requires_metamodel = False
33
+
34
+ directory: Optional[str] = None # output directory with generated markdown files
35
+ template_file: Optional[str] = None # custom/default jinja template for class diagrams
36
+ classes: List[str] = field(default_factory=list) # optional subset of classes
37
+
38
+ def __post_init__(self):
39
+ super().__post_init__()
40
+ self.logger = logging.getLogger(__name__)
41
+ self.schemaview = SchemaView(self.schema, merge_imports=self.mergeimports)
42
+
43
+ # set the output directory
44
+ self.output_directory = Path(self.directory)
45
+
46
+ # set the template file
47
+ if not self.template_file:
48
+ package_dir = os.path.dirname(importlib.util.find_spec("linkml").origin)
49
+ # Default location of the template file
50
+ self.template_file = os.path.join(package_dir, "generators", "docgen", "class_diagram.md.jinja2")
51
+
52
+ def generate_class_diagrams(self):
53
+ """Generate Mermaid class diagrams for the specified subset of classes
54
+ or all classes if none are specified.
55
+ """
56
+ self.output_directory.mkdir(parents=True, exist_ok=True)
57
+
58
+ template_folder = os.path.dirname(self.template_file)
59
+ template_name = os.path.basename(self.template_file)
60
+ loader = FileSystemLoader(template_folder)
61
+ env = Environment(loader=loader)
62
+ customize_environment(env)
63
+
64
+ template = env.get_template(template_name)
65
+
66
+ all_classes = self.schemaview.all_classes()
67
+
68
+ if self.classes:
69
+ class_items = [(cn, all_classes[cn]) for cn in self.classes if cn in all_classes]
70
+ else:
71
+ class_items = list(all_classes.items())
72
+
73
+ for cn, class_def in class_items:
74
+ self.logger.info(f"Generating Mermaid diagram for class: {cn}")
75
+ rendered = template.render(gen=self, element=class_def, schemaview=self.schemaview)
76
+ outfile = self.output_directory / f"{cn}.md"
77
+ with open(outfile, "w", encoding="utf-8") as f:
78
+ f.write(rendered)
79
+
80
+ def cardinality(self, slot: SlotDefinition) -> str:
81
+ """Reuses the cardinality logic from DocGenerator."""
82
+ return DocGenerator.cardinality(slot)
83
+
84
+ def mermaid_directive(self) -> str:
85
+ """Provides the code fence directive (e.g., `mermaid` or `{mermaid}`)."""
86
+ return "mermaid"
87
+
88
+ def name(self, element: Element) -> str:
89
+ """Returns the canonical name for an element."""
90
+ return element.name
91
+
92
+ def all_type_object_names(self):
93
+ return list(self.schemaview.all_types().keys())
94
+
95
+
96
+ @shared_arguments(MermaidClassDiagramGenerator)
97
+ @click.command()
98
+ @click.option(
99
+ "--template-file",
100
+ "-t",
101
+ type=click.Path(exists=True),
102
+ default=None,
103
+ help="Path to Jinja template for class diagrams.",
104
+ )
105
+ @click.option(
106
+ "--directory",
107
+ "-d",
108
+ type=click.Path(),
109
+ required=True,
110
+ help="Folder in which to write the Markdown files.",
111
+ )
112
+ @click.option(
113
+ "--classes",
114
+ "-c",
115
+ multiple=True,
116
+ help="One or more classes in the schema for which to generate diagrams. "
117
+ "If omitted, diagrams for all classes are generated.",
118
+ )
119
+ @click.version_option(click.__version__, "-V", "--version")
120
+ def cli(yamlfile, template_file, directory, classes, **args):
121
+ logging.basicConfig(level=logging.INFO)
122
+ gen = MermaidClassDiagramGenerator(
123
+ schema=yamlfile,
124
+ template_file=template_file,
125
+ directory=directory,
126
+ classes=list(classes), # convert tuple to a list
127
+ **args,
128
+ )
129
+ gen.generate_class_diagrams()
130
+
131
+
132
+ if __name__ == "__main__":
133
+ cli()
@@ -708,18 +708,10 @@ class OwlSchemaGenerator(Generator):
708
708
  owl_exprs.append(eq_uri)
709
709
  if element.equals_string_in:
710
710
  equals_string_in = element.equals_string_in
711
- if is_literal is None:
712
- logger.warning(f"ignoring equals_string={equals_string_in} as unable to tell if literal")
713
- elif is_literal:
714
- dt_exprs = [
715
- self._datatype_restriction(XSD.string, [self._facet(XSD.pattern, s)]) for s in equals_string_in
716
- ]
717
- union_expr = self._union_of(dt_exprs, owl_types={RDFS.Literal})
718
- owl_exprs.append(union_expr)
719
- owl_types.add(RDFS.Literal)
720
- else:
721
- eq_uris = [URIRef(self.schemaview.expand_curie(s)) for s in equals_string_in]
722
- owl_exprs.append(self._union_of(eq_uris))
711
+ literals = [Literal(s) for s in equals_string_in]
712
+ one_of_expr = self._boolean_expression(literals, OWL.oneOf, owl_types={RDFS.Literal})
713
+ owl_exprs.append(one_of_expr)
714
+ owl_types.add(RDFS.Literal)
723
715
  for constraint_prop, constraint_val in constraints.items():
724
716
  if is_literal is not None and not is_literal:
725
717
  # In LinkML, it is permissible to have a literal constraints on slots that refer to
@@ -1140,7 +1132,7 @@ class OwlSchemaGenerator(Generator):
1140
1132
 
1141
1133
  def _boolean_expression(
1142
1134
  self,
1143
- exprs: List[Union[BNode, URIRef]],
1135
+ exprs: List[Union[BNode, URIRef, Literal]],
1144
1136
  predicate: URIRef,
1145
1137
  node: Optional[URIRef] = None,
1146
1138
  owl_types: Set[OWL_TYPE] = None,
@@ -62,7 +62,8 @@ class ShaclIfAbsentProcessor(IfAbsentProcessor):
62
62
  return Literal(f"{year}-{month}-{day}T{hour}:{minutes}:{seconds}", datatype=ShaclDataType.DATETIME.uri_ref)
63
63
 
64
64
  def map_uri_or_curie_default_value(self, default_value: str, slot: SlotDefinition, cls: ClassDefinition):
65
- raise NotImplementedError()
65
+ uri = URIRef(self.schema_view.expand_curie(default_value))
66
+ return Literal(uri, datatype=ShaclDataType.URI.uri_ref)
66
67
 
67
68
  def map_curie_default_value(self, default_value: str, slot: SlotDefinition, cls: ClassDefinition):
68
69
  return Literal(default_value, datatype=ShaclDataType.CURIE.uri_ref)
@@ -30,6 +30,8 @@ class ShaclGenerator(Generator):
30
30
  """parameterized suffix to be appended. No suffix per default."""
31
31
  include_annotations: bool = False
32
32
  """True means include all class / slot / type annotations in generated Node or Property shapes"""
33
+ exclude_imports: bool = False
34
+ """If True, elements from imported ontologies won't be included in the generator's output"""
33
35
  generatorname = os.path.basename(__file__)
34
36
  generatorversion = "0.0.1"
35
37
  valid_formats = ["ttl"]
@@ -63,7 +65,7 @@ class ShaclGenerator(Generator):
63
65
  for pfx in self.schema.prefixes.values():
64
66
  g.bind(str(pfx.prefix_prefix), pfx.prefix_reference)
65
67
 
66
- for c in sv.all_classes().values():
68
+ for c in sv.all_classes(imports=not self.exclude_imports).values():
67
69
 
68
70
  def shape_pv(p, v):
69
71
  if v is not None:
@@ -364,6 +366,13 @@ def add_simple_data_type(func: Callable, r: ElementName) -> None:
364
366
  show_default=True,
365
367
  help="Use --include-annotations to include annotations of slots, types, and classes in the generated SHACL shapes.",
366
368
  )
369
+ @click.option(
370
+ "--exclude-imports/--include-imports",
371
+ default=False,
372
+ show_default=True,
373
+ help="Use --exclude-imports to exclude imported elements from the generated SHACL shapes. This is useful when "
374
+ "extending a substantial ontology to avoid large output files.",
375
+ )
367
376
  @click.version_option(__version__, "-V", "--version")
368
377
  def cli(yamlfile, **args):
369
378
  """Generate SHACL turtle from a LinkML model"""
@@ -1,6 +1,4 @@
1
- """Generate ShEx definition of a model
2
-
3
- """
1
+ """Generate ShEx definition of a model"""
4
2
 
5
3
  import os
6
4
  import urllib.parse as urlparse
@@ -1,6 +1,4 @@
1
- """Generate Summary Spreadsheets
2
-
3
- """
1
+ """Generate Summary Spreadsheets"""
4
2
 
5
3
  import os
6
4
  from csv import DictWriter
@@ -1,6 +1,4 @@
1
- """Validate linkml input and optionally emit completely resolved biolink yaml output
2
-
3
- """
1
+ """Validate linkml input and optionally emit completely resolved biolink yaml output"""
4
2
 
5
3
  import os
6
4
  from dataclasses import dataclass
@@ -409,11 +409,13 @@ class LogicalModelTransformer(ModelTransformer):
409
409
  target_class_name: ClassDefinitionName,
410
410
  ancestors: List[ClassDefinitionName],
411
411
  ):
412
- anc_classes = [self.schemaview.get_class(anc) for anc in ancestors]
412
+ anc_classes = [self.schemaview.get_class(ancestor) for ancestor in ancestors]
413
413
  attributes: Dict[SlotDefinitionName, SlotDefinition] = {}
414
- for anc in anc_classes:
415
- top_level_slots = [(s, target_schema.slots[s]) for s in anc.slots]
416
- for slot_name, slot_expr in list(anc.attributes.items()) + list(anc.slot_usage.items()) + top_level_slots:
414
+ for ancestor_class in anc_classes:
415
+ top_level_slots = [(s, target_schema.slots[s]) for s in ancestor_class.slots]
416
+ for slot_name, slot_expr in (
417
+ list(ancestor_class.attributes.items()) + list(ancestor_class.slot_usage.items()) + top_level_slots
418
+ ):
417
419
  if slot_name not in attributes:
418
420
  attributes[slot_name] = SlotDefinition(slot_name)
419
421
  sx = attributes[slot_name]
@@ -644,7 +646,7 @@ class LogicalModelTransformer(ModelTransformer):
644
646
  if slot_expression.all_of:
645
647
  exprs.append(logictools.And(*[self._as_logical_expression(subx) for subx in slot_expression.all_of]))
646
648
  if slot_expression.exactly_one_of:
647
- # TODO: disjointness
649
+ # TODO: disjointedness
648
650
  exprs.append(logictools.Or(*[self._as_logical_expression(subx) for subx in slot_expression.exactly_one_of]))
649
651
  if slot_expression.none_of:
650
652
  exprs.append(
linkml/utils/generator.py CHANGED
@@ -27,6 +27,7 @@ from typing import Callable, ClassVar, Dict, List, Mapping, Optional, Set, TextI
27
27
 
28
28
  import click
29
29
  from click import Argument, Command, Option
30
+ from jsonasobj2 import JsonObj
30
31
  from linkml_runtime import SchemaView
31
32
  from linkml_runtime.linkml_model.meta import (
32
33
  ClassDefinition,
@@ -265,8 +266,16 @@ class Generator(metaclass=abc.ABCMeta):
265
266
  def _init_namespaces(self):
266
267
  if self.namespaces is None:
267
268
  self.namespaces = Namespaces()
268
- for prefix in self.schema.prefixes.values():
269
- self.namespaces[prefix.prefix_prefix] = prefix.prefix_reference
269
+ if isinstance(self.schema.prefixes, dict):
270
+ for key, value in self.schema.prefixes.items():
271
+ self.namespaces[key] = value
272
+ elif isinstance(self.schema.prefixes, JsonObj):
273
+ prefixes = vars(self.schema.prefixes)
274
+ for key, value in prefixes.items():
275
+ self.namespaces[key] = value
276
+ else:
277
+ for prefix in self.schema.prefixes.values():
278
+ self.namespaces[prefix.prefix_prefix] = prefix.prefix_reference
270
279
 
271
280
  def serialize(self, **kwargs) -> str:
272
281
  """
@@ -1,6 +1,4 @@
1
- """Iterate through all examples in a folder testing them for validity.
2
-
3
- """
1
+ """Iterate through all examples in a folder testing them for validity."""
4
2
 
5
3
  import glob
6
4
  import json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: linkml
3
- Version: 1.8.6
3
+ Version: 1.9.0rc1
4
4
  Summary: Linked Open Data Modeling Language
5
5
  Home-page: https://linkml.io/linkml/
6
6
  Keywords: schema,linked data,data modeling,rdf,owl,biolink
@@ -15,16 +15,16 @@ linkml/generators/common/template.py,sha256=bjcSNiC85MYl9oGhk0ZpqwZpRxxy_NqxG8XB
15
15
  linkml/generators/common/type_designators.py,sha256=lgVcIRJJ-yCvVGeP9U_gQZpm77UmJBQo9Bh3lGJITno,1956
16
16
  linkml/generators/csvgen.py,sha256=O20K3IuDxomGJAyNFJmm1_HbPyl6xUK0l-aKY0A3KcM,3253
17
17
  linkml/generators/dbmlgen.py,sha256=IrtY65iFdXg4wHBP9vHQeV20HUOUB1XlggPtmt_YvGM,5466
18
- linkml/generators/docgen/class.md.jinja2,sha256=-JmjYHgYOaaBYd5r-Tr5dkk0CLM_lX0kHdocPQtRsjU,3504
18
+ linkml/generators/docgen/class.md.jinja2,sha256=LqQSKfH-wWR1ELTbhuEK5QFypU__uqwLmbGvS9rZsKo,3602
19
19
  linkml/generators/docgen/class_diagram.md.jinja2,sha256=gzskx4hOpU_s6BqOXdYZ9DwKxuClnsEgDzPurm30PeY,3469
20
20
  linkml/generators/docgen/common_metadata.md.jinja2,sha256=gy9J8rghBfKDKimwtHj_XuHY4PJRRYHLXVlBHqWrUzU,1604
21
- linkml/generators/docgen/enum.md.jinja2,sha256=mXnUrRkleY2bOTEyAZ5c4pcUnqhs6BNa8a-4LVve-eo,1014
21
+ linkml/generators/docgen/enum.md.jinja2,sha256=BCi4PUamCjszM17yrg2KNltR_JfrBjNdH87S5uz9DtY,1112
22
22
  linkml/generators/docgen/index.md.jinja2,sha256=suXRgJydHrxcMm3quXukaKkThtdzYA9i7BTuMAVKOP0,1502
23
23
  linkml/generators/docgen/index.tex.jinja2,sha256=Go_EA-_N4JUpbOYbk3OY11mz5yV70VF2l2sMtgIPWw4,501
24
- linkml/generators/docgen/schema.md.jinja2,sha256=xlENfnzNRYgPT_0tdqNFxgklVM4Qf5BuzhFVvSMDuxs,70
25
- linkml/generators/docgen/slot.md.jinja2,sha256=dJHugIv9OPTi3FIn8Iez7CzjQizdXrcn0hcmCmXSgV4,3339
26
- linkml/generators/docgen/subset.md.jinja2,sha256=EPln_fjlhlkmwEGEp2iPX-9Xm2vVodPZLlRBlYCB_sA,2705
27
- linkml/generators/docgen/type.md.jinja2,sha256=QmCMJZrFwP33eHkggBVtypbyrxTb-XZn9vHOYojVaYk,635
24
+ linkml/generators/docgen/schema.md.jinja2,sha256=b52xmnlTheigxKgP_2Sq1nnQUEW6XNi_ScPnqxptjps,167
25
+ linkml/generators/docgen/slot.md.jinja2,sha256=_0xgRUlSYJMpxwGcboFoCAcELFDEzzXSTwBduPvwY-Q,3501
26
+ linkml/generators/docgen/subset.md.jinja2,sha256=ttcsDa2fLYOU1_tDzHOyEsplhc1UHY_cy1_apQZyk6A,2803
27
+ linkml/generators/docgen/type.md.jinja2,sha256=K0f7x5b3Nfjm1W-rDI4OHj2sU-RNm9hP1nuRJjHHJMU,733
28
28
  linkml/generators/docgen.py,sha256=iDSu2LsZ7MStrzXdxFwK-oBlVevq2MwBc1n5WzHzTyw,38996
29
29
  linkml/generators/dotgen.py,sha256=vjHveFtKBItHRkowi1I4FHffcn4u4wLpBydYgVxB-vE,5028
30
30
  linkml/generators/erdiagramgen.py,sha256=BteqzyVgKeUXfdCq3VHiiJMbuMrsn_D08IoNq8QMBcY,11462
@@ -36,14 +36,15 @@ 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=LpuTtzU4H6BH_615E4Fbt0QBCEopvqRMVOMwDva1kGk,8958
39
- linkml/generators/jsonldgen.py,sha256=9ru1rb4_u7t_Rp8ILQSmDIsk_evrDL_OeilnQUsu338,7770
40
- linkml/generators/jsonschemagen.py,sha256=NVn_QIMMLQCU-cKxX6X5qoycR-p_z88UqdMhQdt4roQ,30436
39
+ linkml/generators/jsonldgen.py,sha256=d94TEPu9zeHDZqPU6cSaiQiJnv0kc_AXkXahi1xOBZ8,7789
40
+ linkml/generators/jsonschemagen.py,sha256=8luthDkItlZ5bU4Lxt9b7tZx0HTIP4FZEZ5C2nwMMqA,30867
41
41
  linkml/generators/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- linkml/generators/linkmlgen.py,sha256=7GbD-ZErCblapbl_CukfHvFYOTbhgWiTIyg6O5BJSO0,3915
42
+ linkml/generators/linkmlgen.py,sha256=xYgS4i-Xo5Z3t9gqEdqxHKv5KGUxOerpy8M9kX6WeuI,4225
43
43
  linkml/generators/markdowngen.py,sha256=0gjMPJ0Ycm9se4Y4cyqjbTntGYqRRZu4RL-9Qf5n4lk,34464
44
+ linkml/generators/mermaidclassdiagramgen.py,sha256=NzRDXmy2qMOUHmvrcd7LrKZiVR1J___pLRhQpGstGyA,4946
44
45
  linkml/generators/namespacegen.py,sha256=C4p9LSwsnDqf6sv-wG5l0VQniWFJ1HA1hRXJBDOg3pM,6467
45
46
  linkml/generators/oocodegen.py,sha256=aBJgy-S-8FL5cW9p4hf986iSTxXwvkM7ZajKlari4us,7820
46
- linkml/generators/owlgen.py,sha256=1JYcbdHoeDVDjcT6NppODDpTd8VG3A6lpJzxy94V_Z0,58507
47
+ linkml/generators/owlgen.py,sha256=FxfEpJSybw11qEjcE3ozVvFuu_eKp1qhQmFOK566CGg,58086
47
48
  linkml/generators/plantumlgen.py,sha256=G12fBFh8qqHuXTtGEndcQJzAtarWJFE7qcUaMXLTJrE,15614
48
49
  linkml/generators/prefixmapgen.py,sha256=oISFtSt_s5OWx65tYasWk0bUJIDIU1MjnsWqfBE7ZQA,4257
49
50
  linkml/generators/projectgen.py,sha256=XQdOjAJroroT2JNNPbrUauv2DTJ3tfJoFNYGSLKky24,9791
@@ -70,9 +71,9 @@ linkml/generators/pythongen.py,sha256=-W8ZgvgDP-Hm4Q9weQiB7xtXMJyadtyfZ6BHC1CmCl
70
71
  linkml/generators/rdfgen.py,sha256=OT8oS8MPUVf5UK3OKvRWgAh9iQiWwdyWJSA69PncOw4,2969
71
72
  linkml/generators/shacl/__init__.py,sha256=KgMOyESGTdKk2Vhx9uuUYgEJPuJQ-iT1vDQVIMoiXCM,58
72
73
  linkml/generators/shacl/shacl_data_type.py,sha256=gX3Y2KyTVPwMyef0cJMTEpU9h0oH-H0ThVDORdNW170,1828
73
- linkml/generators/shacl/shacl_ifabsent_processor.py,sha256=hbgt5UtVHo_z_JOLkg6ltGRdVuiv65b2PA3x1Oy4ssQ,4269
74
- linkml/generators/shaclgen.py,sha256=RcGoo4j-NJUavbdUo1gnYo4mXTivaYb8o-oIfaUrA_g,14833
75
- linkml/generators/shexgen.py,sha256=-GFdapDEAUXAjsXdTI7ZlS39YfuvaxfzPkdqUNM19qI,9941
74
+ linkml/generators/shacl/shacl_ifabsent_processor.py,sha256=usmqdCvAPiivHzXWkNzW0G_KOaAG8bHdTCkEH2pI0b4,4364
75
+ linkml/generators/shaclgen.py,sha256=Gvg6Tm7S1FMQxPZ7fJErMrJ3mUbi5rj1yYPTiuuDf-Y,15283
76
+ linkml/generators/shexgen.py,sha256=cr4x4ORZlre6XlToWKho5F4XjFwOlzR1SpOpbeOvRA4,9939
76
77
  linkml/generators/sparqlgen.py,sha256=2DaFrFIeMI7QQfiPn79J8ERILlkJALrabDnKK7usDJQ,6188
77
78
  linkml/generators/sqlalchemy/__init__.py,sha256=mb9AC1rIFkSiNZhhG0TAk45ol9PjS1XvsrvCjgfVUpQ,249
78
79
  linkml/generators/sqlalchemy/sqlalchemy_declarative_template.py,sha256=X_Ws1NUBikMI5HuNgEhl_PIeWM-B-c2B0W9KUBH4QTg,2542
@@ -81,10 +82,10 @@ linkml/generators/sqlalchemygen.py,sha256=MYzEkg8BAgFChiRNqOZK9aMqH-aNGa6-CnpZdb
81
82
  linkml/generators/sqltablegen.py,sha256=BaWAuvwVHsXVt85GYxzH5_UL3ZeqRI9SojlvMmh4KkE,12395
82
83
  linkml/generators/sssomgen.py,sha256=zrZy0WL9fF5bk-XAcB-MZYZkhHhqVRHt2rGBUtfqnLY,6891
83
84
  linkml/generators/string_template.md,sha256=kRcfic6entgIaJdpSg6GF3jcjC9wbKsCVM6wVT2qipc,1788
84
- linkml/generators/summarygen.py,sha256=C9r34928QtVMaXTbdch-mRPB5L0jDTGmTnVmtrKrR-0,3083
85
+ linkml/generators/summarygen.py,sha256=abNd39Z-Kn3FX2fjXLeCqvXvFunpqM7UFPimtiCB2p0,3081
85
86
  linkml/generators/terminusdbgen.py,sha256=ItJ-HTMkkX22Ex1-UjJZmtEtE2fn6UdjAxDtn20RXV8,4713
86
87
  linkml/generators/typescriptgen.py,sha256=xxi7LzWNjbRFjjC6AR7NO4tfXx5CVCWNJ1urSiu5FNo,8876
87
- linkml/generators/yamlgen.py,sha256=38zdh5T4tObFhCHgbUbKbc0UuFh1TmmsWBkWM9gcvsI,1625
88
+ linkml/generators/yamlgen.py,sha256=PWexYoR3wHRoAUk6zK67fRYjBF6sAmX_iGlOAT0PJq0,1623
88
89
  linkml/generators/yumlgen.py,sha256=Bg1MGlhCCQoswB19mFKh8xB0UcL9MQGHlUrAVGZSWkc,12208
89
90
  linkml/linter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
91
  linkml/linter/cli.py,sha256=tXJ3vwjohCnj4EApEJXvXUSI3NLJ3fI3u6tJVxbgLQg,4505
@@ -105,7 +106,7 @@ linkml/linter/rules.py,sha256=NFCSBnEU_D0V9tqYbJvzhJlxhtyNuyqRzt4nrTc7xeA,11621
105
106
  linkml/reporting/__init__.py,sha256=Jo0V_nyEcnWhMukMW-bqW9dlbgCfaRlWm3CO-XzgU84,92
106
107
  linkml/reporting/model.py,sha256=-10yNfk8wuRC48ZI-akrWvtlJ9a6RYWET2TzlZV3XXo,8622
107
108
  linkml/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
- linkml/transformers/logical_model_transformer.py,sha256=hWc5uF1TYU9_qVZAKm2UtQ6ICoeWLaRCI5OUWmEy94k,29835
109
+ linkml/transformers/logical_model_transformer.py,sha256=5p6y41bTt3nJULznqINb8BJqPeCYgHGPuv8qQRycJ_E,29923
109
110
  linkml/transformers/model_transformer.py,sha256=tK_MpRDI-q2qfe8KHT6qJHP8ZruKjYx1FcM-Fnjse-E,678
110
111
  linkml/transformers/relmodel_transformer.py,sha256=2AwLVqto1to_9IaTjicweFVIPa8dcNPKK0EJWdHfWMo,19675
111
112
  linkml/transformers/schema_renamer.py,sha256=DYRbgL9j41M9FdbHYLY3u4YIdDM98laD3cv_lHcgWHQ,5275
@@ -117,7 +118,7 @@ linkml/utils/datavalidator.py,sha256=kBdWaVi8IZT1bOwEJgJYx-wZAb_PTBObB9nHpYORfKA
117
118
  linkml/utils/deprecation.py,sha256=SlAS6L27I65fkaSape2uC49CFgeOTGzUwwERZMp134E,8484
118
119
  linkml/utils/exceptions.py,sha256=3S6lf5WAUgVvjPRaES597_YjUjbbJ5KqjKjpjcaRLoU,217
119
120
  linkml/utils/execute_tutorial.py,sha256=X2sdb4fBBnBmNKg9k5_fhWeY9DXCbYEb4NXUCPv4TJ0,7057
120
- linkml/utils/generator.py,sha256=04GLUdwxz5Q4K_5ICBWOlhRapCf9yOan2H5C3zUrOE4,39132
121
+ linkml/utils/generator.py,sha256=w90ASqaXZnu4aezf8YpFfH7khU5HHvJa5Qqfk50Pd6c,39572
121
122
  linkml/utils/helpers.py,sha256=IoLaG8XE8WOorOFQF-XKfaWKSEoVDShC2E9Rd1596uo,3364
122
123
  linkml/utils/logictools.py,sha256=BGtcoqr_Rsu08Ywa6lNiL881uZzQmNWk1p4FEIVKYe0,23641
123
124
  linkml/utils/mergeutils.py,sha256=FdcSiYUmPkxxwnEv_43SR3BN6lCUeEkNndRpxJQWE2c,9080
@@ -153,9 +154,9 @@ linkml/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
153
154
  linkml/workspaces/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
155
  linkml/workspaces/datamodel/workspaces.py,sha256=4HdkqweGNfMPqnB1_Onc9DcTfkhoagTRcqruh08nRoI,14905
155
156
  linkml/workspaces/datamodel/workspaces.yaml,sha256=EjVrwPpeRZqJRjuGyyDRxxFzuv55SiLIXPBRUG6HStU,4233
156
- linkml/workspaces/example_runner.py,sha256=JfDB88apduF4p9zWzsQPr4XhTAslnJJ4o7cu8NQsG-o,12921
157
- linkml-1.8.6.dist-info/METADATA,sha256=moO1h1YU6BeFhvt-W3AG4LN2mD8Mml4XOIbG9bbvuYQ,3874
158
- linkml-1.8.6.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
159
- linkml-1.8.6.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
160
- linkml-1.8.6.dist-info/entry_points.txt,sha256=AOd8jNjp4fTn4ew1OkOLauyoi_-4wrHrbIeyhticSfA,2123
161
- linkml-1.8.6.dist-info/RECORD,,
157
+ linkml/workspaces/example_runner.py,sha256=oViQ5gT8NkFTZbg0dW5LAOSAOAfJK8_QmKdYwzzGhgQ,12919
158
+ linkml-1.9.0rc1.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
159
+ linkml-1.9.0rc1.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
160
+ linkml-1.9.0rc1.dist-info/entry_points.txt,sha256=CtvrM-5f3NuMEBTXONEnIo5UUJegBRWJvXUmrYfdIfM,2194
161
+ linkml-1.9.0rc1.dist-info/METADATA,sha256=U1wGvCcI0OTj9vrh7K-P_Avet2QMD1jGe1IA_jKCuuA,3877
162
+ linkml-1.9.0rc1.dist-info/RECORD,,
@@ -14,6 +14,7 @@ gen-jsonld=linkml.generators.jsonldgen:cli
14
14
  gen-jsonld-context=linkml.generators.jsonldcontextgen:cli
15
15
  gen-linkml=linkml.generators.linkmlgen:cli
16
16
  gen-markdown=linkml.generators.markdowngen:cli
17
+ gen-mermaid-class-diagram=linkml.generators.mermaidclassdiagramgen:cli
17
18
  gen-namespaces=linkml.generators.namespacegen:cli
18
19
  gen-owl=linkml.generators.owlgen:cli
19
20
  gen-plantuml=linkml.generators.plantumlgen:cli