linkml 1.8.6__py3-none-any.whl → 1.8.7__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.
@@ -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"""
@@ -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)
@@ -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.8.7
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
@@ -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
42
  linkml/generators/linkmlgen.py,sha256=7GbD-ZErCblapbl_CukfHvFYOTbhgWiTIyg6O5BJSO0,3915
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/shacl/shacl_ifabsent_processor.py,sha256=usmqdCvAPiivHzXWkNzW0G_KOaAG8bHdTCkEH2pI0b4,4364
74
75
  linkml/generators/shaclgen.py,sha256=RcGoo4j-NJUavbdUo1gnYo4mXTivaYb8o-oIfaUrA_g,14833
75
- linkml/generators/shexgen.py,sha256=-GFdapDEAUXAjsXdTI7ZlS39YfuvaxfzPkdqUNM19qI,9941
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.8.7.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
159
+ linkml-1.8.7.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
160
+ linkml-1.8.7.dist-info/METADATA,sha256=hubj7dcgTrPQ2ZHmC9Es38FRabdXlkYzrYOqHNp_PS0,3874
161
+ linkml-1.8.7.dist-info/entry_points.txt,sha256=CtvrM-5f3NuMEBTXONEnIo5UUJegBRWJvXUmrYfdIfM,2194
162
+ linkml-1.8.7.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
File without changes