linkml 1.6.9__py3-none-any.whl → 1.6.11__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.
@@ -4,6 +4,7 @@ representation such as JsonSchema
4
4
  """
5
5
 
6
6
  from linkml.generators.javagen import JavaGenerator
7
+ from linkml.generators.jsonldcontextgen import ContextGenerator
7
8
  from linkml.generators.jsonschemagen import JsonSchemaGenerator
8
9
  from linkml.generators.owlgen import OwlSchemaGenerator
9
10
  from linkml.generators.pydanticgen import PydanticGenerator
@@ -41,6 +42,7 @@ __all__ = [
41
42
  "PydanticGenerator",
42
43
  "PythonGenerator",
43
44
  "JavaGenerator",
45
+ "ContextGenerator",
44
46
  "JsonSchemaGenerator",
45
47
  "ShaclGenerator",
46
48
  "ShExGenerator",
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Generate CSVs
3
3
  """
4
+
4
5
  import os
5
6
  import sys
6
7
  from csv import DictWriter
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Generate dotfiles
3
3
  """
4
+
4
5
  import os
5
6
  from dataclasses import dataclass
6
7
  from typing import List, Optional
@@ -6,6 +6,7 @@ These can be converted to solr schema-xml, and used in amigo-bbop tools
6
6
  See the golr-views directory in this repo for examples
7
7
 
8
8
  """
9
+
9
10
  import os
10
11
  from dataclasses import dataclass
11
12
  from typing import List, Optional
@@ -70,6 +70,7 @@ class JavaGenerator(OOCodeGenerator):
70
70
  generatorname = os.path.basename(__file__)
71
71
  generatorversion = "0.0.1"
72
72
  valid_formats = ["java"]
73
+ file_extension = "java"
73
74
 
74
75
  # ObjectVars
75
76
  generate_records: bool = False
@@ -2,6 +2,7 @@
2
2
  Generate JSON-LD contexts
3
3
 
4
4
  """
5
+
5
6
  import os
6
7
  import re
7
8
  from dataclasses import dataclass, field
@@ -37,6 +38,7 @@ class ContextGenerator(Generator):
37
38
  visit_all_class_slots = False
38
39
  uses_schemaloader = True
39
40
  requires_metamodel = True
41
+ file_extension = "context.jsonld"
40
42
 
41
43
  # ObjectVars
42
44
  emit_prefixes: Set[str] = field(default_factory=lambda: set())
@@ -1,6 +1,7 @@
1
1
  """ Generate JSONld
2
2
 
3
3
  """
4
+
4
5
  import os
5
6
  from copy import deepcopy
6
7
  from dataclasses import dataclass
@@ -99,13 +100,15 @@ class JSONLDGenerator(Generator):
99
100
  return (
100
101
  ClassDefinitionName(camelcase(node))
101
102
  if node in self.schema.classes
102
- else SlotDefinitionName(underscore(node))
103
- if node in self.schema.slots
104
- else SubsetDefinitionName(camelcase(node))
105
- if node in self.schema.subsets
106
- else TypeDefinitionName(underscore(node))
107
- if node in self.schema.types
108
- else None
103
+ else (
104
+ SlotDefinitionName(underscore(node))
105
+ if node in self.schema.slots
106
+ else (
107
+ SubsetDefinitionName(camelcase(node))
108
+ if node in self.schema.subsets
109
+ else TypeDefinitionName(underscore(node)) if node in self.schema.types else None
110
+ )
111
+ )
109
112
  )
110
113
  return None
111
114
 
@@ -193,6 +193,9 @@ class JsonSchemaGenerator(Generator):
193
193
  Note that if the range of a slot has a type designator, descendants will always be included.
194
194
  """
195
195
 
196
+ title_from: str = "name"
197
+ """The slot from which to populate JSONSchema title annotation."""
198
+
196
199
  top_level_schema: JsonSchema = None
197
200
 
198
201
  def __post_init__(self):
@@ -215,7 +218,7 @@ class JsonSchemaGenerator(Generator):
215
218
  "$id": self.schema.id,
216
219
  "metamodel_version": metamodel_version,
217
220
  "version": self.schema.version if self.schema.version else None,
218
- "title": self.schema.name,
221
+ "title": self.schema.title if self.title_from == "title" and self.schema.title else self.schema.name,
219
222
  "type": "object",
220
223
  "additionalProperties": self.not_closed,
221
224
  }
@@ -238,6 +241,8 @@ class JsonSchemaGenerator(Generator):
238
241
  "description": be(cls.description),
239
242
  }
240
243
  )
244
+ if self.title_from == "title" and cls.title:
245
+ class_subschema["title"] = cls.title
241
246
 
242
247
  for slot_definition in self.schemaview.class_induced_slots(cls.name):
243
248
  self.handle_class_slot(subschema=class_subschema, cls=cls, slot=slot_definition)
@@ -364,6 +369,9 @@ class JsonSchemaGenerator(Generator):
364
369
  "description": be(enum.description),
365
370
  }
366
371
  )
372
+ if self.title_from == "title" and enum.title:
373
+ enum_schema["title"] = enum.title
374
+
367
375
  if permissible_values_texts:
368
376
  enum_schema["enum"] = permissible_values_texts
369
377
  self.top_level_schema.add_def(enum.name, enum_schema)
@@ -480,6 +488,8 @@ class JsonSchemaGenerator(Generator):
480
488
  prop = JsonSchema.array_of(prop)
481
489
 
482
490
  prop.add_keyword("description", slot.description)
491
+ if self.title_from == "title" and slot.title:
492
+ prop.add_keyword("title", slot.title)
483
493
 
484
494
  own_constraints = self.get_value_constraints_for_slot(slot)
485
495
 
@@ -569,9 +579,34 @@ class JsonSchemaGenerator(Generator):
569
579
  ]
570
580
  non_id_required_slots = [s for s in non_id_slots if s.required]
571
581
 
582
+ # Some lists of objects can be serialized as SimpleDicts.
583
+ # A SimpleDict is serialized as simple key-value pairs where the value is atomic.
584
+ # The key must be declared as a key, and the value must satisfy one of the following conditions:
585
+ # 1. The value slot is the only other slot in the object other than the key
586
+ # 2. The value slot is explicitly annotated as a simple_dict_value
587
+ # 3. The value slot is the only non-key that is required
588
+ # See also: https://github.com/linkml/linkml/issues/1250
572
589
  range_simple_dict_value_slot = None
573
590
  if len(non_id_slots) == 1:
574
591
  range_simple_dict_value_slot = non_id_slots[0]
592
+ elif len(non_id_slots) > 1:
593
+ candidate_non_id_slots = []
594
+ for non_id_slot in non_id_slots:
595
+ if isinstance(non_id_slot.annotations, dict):
596
+ is_simple_dict_value = non_id_slot.annotations.get("simple_dict_value", False)
597
+ else:
598
+ is_simple_dict_value = getattr(non_id_slot.annotations, "simple_dict_value", False)
599
+ if is_simple_dict_value:
600
+ candidate_non_id_slots.append(non_id_slot)
601
+ if len(candidate_non_id_slots) == 1:
602
+ range_simple_dict_value_slot = candidate_non_id_slots[0]
603
+ else:
604
+ candidate_non_id_slots = []
605
+ for non_id_slot in non_id_slots:
606
+ if non_id_slot.required:
607
+ candidate_non_id_slots.append(non_id_slot)
608
+ if len(candidate_non_id_slots) == 1:
609
+ range_simple_dict_value_slot = candidate_non_id_slots[0]
575
610
 
576
611
  return range_class_id_slot, range_simple_dict_value_slot, non_id_required_slots
577
612
 
@@ -619,6 +654,14 @@ If this is a positive number the resulting JSON will be pretty-printed with that
619
654
  disable pretty-printing and return the most compact JSON representation
620
655
  """,
621
656
  )
657
+ @click.option(
658
+ "--title-from",
659
+ type=click.Choice(["name", "title"], case_sensitive=False),
660
+ default="name",
661
+ help="""
662
+ Specify from which slot are JSON Schema 'title' annotations generated.
663
+ """,
664
+ )
622
665
  @click.version_option(__version__, "-V", "--version")
623
666
  def cli(yamlfile, **kwargs):
624
667
  """Generate JSON Schema representation of a LinkML model"""
@@ -456,11 +456,11 @@ class MarkdownGenerator(Generator):
456
456
  filename = (
457
457
  self.formatted_element_name(obj)
458
458
  if isinstance(obj, ClassDefinition)
459
- else underscore(obj.name)
460
- if isinstance(obj, SlotDefinition)
461
- else underscore(obj.name)
462
- if isinstance(obj, EnumDefinition)
463
- else camelcase(obj.name)
459
+ else (
460
+ underscore(obj.name)
461
+ if isinstance(obj, SlotDefinition)
462
+ else underscore(obj.name) if isinstance(obj, EnumDefinition) else camelcase(obj.name)
463
+ )
464
464
  )
465
465
  subdir = "/types" if isinstance(obj, TypeDefinition) and not self.no_types_dir else ""
466
466
  return f"{self.directory}{subdir}/{filename}.md"
@@ -1,4 +1,5 @@
1
1
  """Generate OWL ontology representation of a LinkML schema."""
2
+
2
3
  import logging
3
4
  import os
4
5
  from collections import defaultdict
@@ -499,7 +500,7 @@ class OwlSchemaGenerator(Generator):
499
500
  elif range in sv.all_enums():
500
501
  x = self._enum_uri(range)
501
502
  elif range in sv.all_classes():
502
- x = self._enum_uri(range)
503
+ x = self._class_uri(range)
503
504
  else:
504
505
  raise ValueError(f"Unknown range {range}")
505
506
  # x = self._class_uri(range)
@@ -530,6 +531,9 @@ class OwlSchemaGenerator(Generator):
530
531
  graph.add((max_card_expr, RDF.type, OWL.Restriction))
531
532
  graph.add((max_card_expr, OWL.maxCardinality, Literal(1)))
532
533
  graph.add((max_card_expr, OWL.onProperty, slot_uri))
534
+ if slot.has_member:
535
+ has_member_expr = self.transform_class_slot_expression(cls, slot.has_member, slot)
536
+ owl_exprs.append(self._some_values_from(slot_uri, has_member_expr))
533
537
  return self._intersection_of(owl_exprs)
534
538
 
535
539
  def slot_node_owltypes(self, slot: Union[SlotDefinition, AnonymousSlotExpression]) -> Set[URIRef]:
@@ -571,18 +575,8 @@ class OwlSchemaGenerator(Generator):
571
575
 
572
576
  owl_exprs = []
573
577
 
574
- if slot.has_member:
575
- owl_exprs.append(
576
- self._union_of(
577
- [self.transform_class_slot_expression(cls, x, main_slot, owl_types) for x in slot.has_member]
578
- )
579
- )
580
578
  if slot.all_members:
581
- owl_exprs.append(
582
- self._union_of(
583
- [self.transform_class_slot_expression(cls, x, main_slot, owl_types) for x in slot.all_members]
584
- )
585
- )
579
+ owl_exprs.append(self.transform_class_slot_expression(cls, slot.all_members, main_slot, owl_types))
586
580
 
587
581
  if slot.any_of:
588
582
  owl_exprs.append(
@@ -1219,6 +1213,12 @@ class OwlSchemaGenerator(Generator):
1219
1213
  show_default=True,
1220
1214
  help="If true, then mixins are represented as existential expressions",
1221
1215
  )
1216
+ @click.option(
1217
+ "--use-native-uris/--no-use-native-uris",
1218
+ default=True,
1219
+ show_default=True,
1220
+ help="Use model URIs rather than class/slot URIs",
1221
+ )
1222
1222
  @click.version_option(__version__, "-V", "--version")
1223
1223
  def cli(yamlfile, metadata_profile: str, **kwargs):
1224
1224
  """Generate an OWL representation of a LinkML model
@@ -1238,7 +1238,8 @@ def cli(yamlfile, metadata_profile: str, **kwargs):
1238
1238
  metadata_profiles = [MetadataProfile(metadata_profile)]
1239
1239
  else:
1240
1240
  metadata_profiles = [MetadataProfile.linkml]
1241
- print(OwlSchemaGenerator(yamlfile, metadata_profiles=metadata_profiles, **kwargs).serialize(**kwargs))
1241
+ gen = OwlSchemaGenerator(yamlfile, metadata_profiles=metadata_profiles, **kwargs)
1242
+ print(gen.serialize(**kwargs))
1242
1243
 
1243
1244
 
1244
1245
  if __name__ == "__main__":
@@ -3,6 +3,7 @@
3
3
  https://plantuml.com/
4
4
 
5
5
  """
6
+
6
7
  import base64
7
8
  import os
8
9
  import zlib
@@ -2,6 +2,7 @@
2
2
  Generate JSON-LD contexts
3
3
 
4
4
  """
5
+
5
6
  import csv
6
7
  import os
7
8
  from dataclasses import dataclass, field
@@ -4,6 +4,7 @@ YAML Schema to RDF Generator
4
4
  Generate a JSON LD representation of the model
5
5
 
6
6
  """
7
+
7
8
  import os
8
9
  import urllib.parse as urlparse
9
10
  from dataclasses import dataclass, field
@@ -116,6 +116,7 @@ class ShaclGenerator(Generator):
116
116
  prop_pv_literal(SH.minCount, 1)
117
117
  prop_pv_literal(SH.minInclusive, s.minimum_value)
118
118
  prop_pv_literal(SH.maxInclusive, s.maximum_value)
119
+ prop_pv_literal(SH.hasValue, s.equals_number)
119
120
  r = s.range
120
121
  if r in sv.all_classes():
121
122
  range_ref = sv.get_uri(r, expand=True)
@@ -1,6 +1,7 @@
1
1
  """Generate ShEx definition of a model
2
2
 
3
3
  """
4
+
4
5
  import os
5
6
  import urllib.parse as urlparse
6
7
  from dataclasses import dataclass, field
@@ -1,4 +1,5 @@
1
1
  """DEPRECATED: Use SQLTableGenerator instead"""
2
+
2
3
  import logging
3
4
  import os
4
5
  from contextlib import redirect_stdout
@@ -1,6 +1,7 @@
1
1
  """Generate Summary Spreadsheets
2
2
 
3
3
  """
4
+
4
5
  import os
5
6
  import sys
6
7
  from csv import DictWriter
@@ -1,6 +1,7 @@
1
1
  """Validate linkml input and optionally emit completely resolved biolink yaml output
2
2
 
3
3
  """
4
+
4
5
  import os
5
6
  from dataclasses import dataclass, field
6
7
 
@@ -3,6 +3,7 @@
3
3
  https://yuml.me/diagram/scruffy/class/samples
4
4
 
5
5
  """
6
+
6
7
  import os
7
8
  from dataclasses import dataclass, field
8
9
  from typing import Callable, List, Optional, Set, cast
@@ -12,6 +12,7 @@ of constraints in both classes hold.
12
12
  These logical constraints are then simplified by translating to disjunctive normal form,
13
13
  and applying simplification rules.
14
14
  """
15
+
15
16
  import logging
16
17
  from copy import deepcopy
17
18
  from dataclasses import dataclass
linkml/utils/generator.py CHANGED
@@ -14,6 +14,7 @@ New generators should always using the latter approach
14
14
  See: https://github.com/linkml/linkml/issues/923
15
15
 
16
16
  """
17
+
17
18
  import abc
18
19
  import logging
19
20
  import os
@@ -453,9 +454,11 @@ class Generator(metaclass=abc.ABCMeta):
453
454
  return (
454
455
  None
455
456
  if element.is_a is None
456
- else self.schema.classes[element.is_a]
457
- if isinstance(element, ClassDefinition)
458
- else self.schema.slots[element.is_a]
457
+ else (
458
+ self.schema.classes[element.is_a]
459
+ if isinstance(element, ClassDefinition)
460
+ else self.schema.slots[element.is_a]
461
+ )
459
462
  )
460
463
 
461
464
  def ancestors(self, element: Union[ClassDefinition, SlotDefinition]) -> List[ElementName]:
@@ -904,7 +907,7 @@ def shared_arguments(g: Type[Generator]) -> Callable[[Command], Command]:
904
907
  ("--useuris/--metauris",),
905
908
  default=True,
906
909
  show_default=True,
907
- help="Include metadata in output",
910
+ help="Use class and slot URIs over model uris",
908
911
  )
909
912
  )
910
913
  f.params.append(Option(("--importmap", "-im"), type=click.File(), help="Import mapping file"))
@@ -113,7 +113,13 @@ default_library: List[
113
113
 
114
114
  def isabsent_match(
115
115
  txt: Text,
116
- ) -> Optional[Tuple[Match[str], bool, Callable[[Match[str], SchemaLoader, ClassDefinition, SlotDefinition], str],]]:
116
+ ) -> Optional[
117
+ Tuple[
118
+ Match[str],
119
+ bool,
120
+ Callable[[Match[str], SchemaLoader, ClassDefinition, SlotDefinition], str],
121
+ ]
122
+ ]:
117
123
  txt = str(txt)
118
124
  for pattern, postinit, f in default_library:
119
125
  m = re.match(pattern + "$", txt)
@@ -120,13 +120,11 @@ class SchemaSynopsis:
120
120
  self.add_ref(
121
121
  SlotType,
122
122
  k,
123
- ClassType
124
- if v.range in self.schema.classes
125
- else EnumType
126
- if v.range in self.schema.enums
127
- else TypeType
128
- if v.range in self.schema.types
129
- else None,
123
+ (
124
+ ClassType
125
+ if v.range in self.schema.classes
126
+ else EnumType if v.range in self.schema.enums else TypeType if v.range in self.schema.types else None
127
+ ),
130
128
  v.range,
131
129
  )
132
130
 
@@ -3,6 +3,7 @@ The ``linkml.validator`` package contains a new LinkML validation framework that
3
3
  than the ``linkml.validators`` package. While that package still exists, it may become deprecated
4
4
  in the future.
5
5
  """
6
+
6
7
  import os
7
8
  from pathlib import Path
8
9
  from typing import Any, Optional, Union
@@ -4,6 +4,7 @@ instance from a source. Instances of these classes are passed to
4
4
  :meth:`linkml.validator.Validator.validate_source` and
5
5
  :meth:`linkml.validator.Validator.iter_results_from_source`
6
6
  """
7
+
7
8
  import os
8
9
  from typing import Union
9
10
 
@@ -0,0 +1,93 @@
1
+ import os
2
+ from typing import Any, Iterator, Optional
3
+
4
+ import rdflib
5
+ from linkml_runtime.dumpers import rdflib_dumper
6
+
7
+ from linkml.generators import PythonGenerator, ShaclGenerator
8
+ from linkml.validator.plugins.validation_plugin import ValidationPlugin
9
+ from linkml.validator.report import Severity, ValidationResult
10
+ from linkml.validator.validation_context import ValidationContext
11
+
12
+ SH = rdflib.Namespace("http://www.w3.org/ns/shacl#")
13
+
14
+
15
+ class ShaclValidationPlugin(ValidationPlugin):
16
+ """A validation plugin which validates instances using SHACL.
17
+
18
+ :param shacl_path: If provided, SHACL will not be generated from the schema,
19
+ instead it will be read from this path.
20
+ :param closed: If ``True``, additional properties are not allowed on instances.
21
+ Defaults to ``False``.
22
+ :param raise_on_conversion_error: If ``True``, raise an exception if the instance
23
+ cannot be converted to a Python class. Otherwise, treat as a ValidationError.
24
+ Defaults to ``False``.
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ *,
30
+ closed: bool = False,
31
+ shacl_path: Optional[os.PathLike] = None,
32
+ raise_on_conversion_error: bool = False,
33
+ ) -> None:
34
+ self.closed = closed
35
+ self.shacl_path = shacl_path
36
+ self.raise_on_conversion_error = raise_on_conversion_error
37
+
38
+ def _shacl_graph(self, context: ValidationContext) -> Optional[rdflib.Graph]:
39
+ g = rdflib.Graph()
40
+ if self.shacl_path:
41
+ g.parse(str(self.shacl_path))
42
+ else:
43
+ gen = ShaclGenerator(context._schema)
44
+ g = gen.as_graph()
45
+ return g
46
+
47
+ def process(self, instance: Any, context: ValidationContext) -> Iterator[ValidationResult]:
48
+ """Perform JSON Schema validation on the provided instance
49
+
50
+ :param instance: The instance to validate
51
+ :param context: The validation context which provides a JSON Schema artifact
52
+ :return: Iterator over validation results
53
+ :rtype: Iterator[ValidationResult]
54
+ """
55
+ import pyshacl
56
+
57
+ shacl_graph = self._shacl_graph(context)
58
+ if isinstance(instance, dict):
59
+ pygen = PythonGenerator(context._schema)
60
+ mod = pygen.compile_module()
61
+ py_cls = getattr(mod, context._target_class)
62
+ if self.raise_on_conversion_error:
63
+ instance = py_cls(**instance)
64
+ else:
65
+ try:
66
+ instance = py_cls(**instance)
67
+ except (ValueError, TypeError):
68
+ yield ValidationResult(
69
+ type="shacl validation",
70
+ severity=Severity.ERROR,
71
+ instance=instance,
72
+ instantiates=context.target_class,
73
+ message="failed at class instantiation stage",
74
+ )
75
+ return
76
+ data_graph = rdflib_dumper.as_rdf_graph(instance, schemaview=context.schema_view)
77
+ validator = pyshacl.Validator(
78
+ shacl_graph=shacl_graph,
79
+ data_graph=data_graph,
80
+ inference="rdfs",
81
+ )
82
+ conforms, report_graph, report_text = validator.run()
83
+ for s, _, o in report_graph.triples((None, SH.result, None)):
84
+ msg = ""
85
+ for p, o2 in report_graph.predicate_objects(o):
86
+ msg += f"{p} {o2}\n"
87
+ yield ValidationResult(
88
+ type="shacl validation",
89
+ severity=Severity.ERROR,
90
+ instance=instance,
91
+ instantiates=context.target_class,
92
+ message=f"{msg}",
93
+ )
@@ -29,7 +29,7 @@ class Validator:
29
29
  schema: Union[str, dict, TextIO, Path, SchemaDefinition],
30
30
  validation_plugins: Optional[List[ValidationPlugin]] = None,
31
31
  *,
32
- strict: bool = False
32
+ strict: bool = False,
33
33
  ) -> None:
34
34
  if isinstance(schema, Path):
35
35
  schema = str(schema)
@@ -1,6 +1,7 @@
1
1
  """Iterate through all examples in a folder testing them for validity.
2
2
 
3
3
  """
4
+
4
5
  import glob
5
6
  import json
6
7
  import logging
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: linkml
3
- Version: 1.6.9
3
+ Version: 1.6.11
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
@@ -2,10 +2,10 @@ linkml/__init__.py,sha256=Ofc1RAB9gfvvRqinXih4eExeeSi2hTGhwTHbIGr5gLE,3215
2
2
  linkml/_version.py,sha256=udxv6OEqcE89DTVMYPtetXYg8IA8Sgc6yW26-6f8C3M,310
3
3
  linkml/generators/PythonGenNotes.md,sha256=wb9BPLLhF6378OKLbwSBAwmniLpwrcT5_bbfCHfLme8,51006
4
4
  linkml/generators/README.md,sha256=RMzT8EblC_GEdPy5WyfXHDBXlFI6k6mz3Cx2sdpcyWI,4438
5
- linkml/generators/__init__.py,sha256=qa22iTeBrcds6ndst_iTPVWLQtBF6NGyhVngBhbhIpc,1350
5
+ linkml/generators/__init__.py,sha256=0KxTxNpQBnq4JTsDtwXQ1RYsRdmxfkegVBJKupti4Jg,1438
6
6
  linkml/generators/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  linkml/generators/common/type_designators.py,sha256=lgVcIRJJ-yCvVGeP9U_gQZpm77UmJBQo9Bh3lGJITno,1956
8
- linkml/generators/csvgen.py,sha256=h-Mj-uNrzuETx_G3dW6eFbk1jj0NHSwqbehqR5tA6PM,2955
8
+ linkml/generators/csvgen.py,sha256=X0f4qKXahSDtkzM9Y47rwWqdseP1O6PTZ_WKiOqOrQI,2956
9
9
  linkml/generators/docgen/class.md.jinja2,sha256=_nQr8ge57ZkX3Hrh-cqPUm8Z7HCnJuuRCgYm0g21mS8,3381
10
10
  linkml/generators/docgen/class_diagram.md.jinja2,sha256=lLU_0sQZBttOX5Wiup2oZwrxHuiQtbU9ZgLi66aJvOo,2538
11
11
  linkml/generators/docgen/common_metadata.md.jinja2,sha256=zy8Ua3gDtAAq8VA3e3O3ft9W7eJopVZaq5efP8LU_hU,1321
@@ -17,47 +17,47 @@ linkml/generators/docgen/slot.md.jinja2,sha256=XVd0M4gKx9Q2fONcsUGBRj_bJivyN4P9j
17
17
  linkml/generators/docgen/subset.md.jinja2,sha256=fTNIpAkml5RKFbbtLore3IAzFN1cISVsyL1ru2-Z4oA,2665
18
18
  linkml/generators/docgen/type.md.jinja2,sha256=QmCMJZrFwP33eHkggBVtypbyrxTb-XZn9vHOYojVaYk,635
19
19
  linkml/generators/docgen.py,sha256=Kwg4ZIXL2e9G-q-_CUoj8Bgnpyyvvh5fKPnseDcTK04,33755
20
- linkml/generators/dotgen.py,sha256=CnbVY6CO1OMuiYXYnvxgNN2IW1mtOQW-J-QnwZlXkUI,5012
20
+ linkml/generators/dotgen.py,sha256=kzp1EYtF8bBqOuycJokDmsvHVDVkkW-J-6-MiUhwJH0,5013
21
21
  linkml/generators/erdiagramgen.py,sha256=Gu-_nhLuEPTsYYaoV6tNS1V6cZ2dNJdm6YwxC0VGl7g,10315
22
22
  linkml/generators/excelgen.py,sha256=OhVzuQaDESYpAGR8Zv13hiWlDDJA8ugtSZatBJH0hzA,7737
23
23
  linkml/generators/golanggen.py,sha256=Dnl7dhmb1AIK3Is7KRaUbxPd3kBTjWuspFqardiBTJ8,5751
24
- linkml/generators/golrgen.py,sha256=tIsbsr4SM9HxeK7TCUwnq-GdSKZ_qW5f7fybg_aqCZE,3436
24
+ linkml/generators/golrgen.py,sha256=OUBYRWicP7G7lrPu1VrxumbVpx3CBJal-o2imyeP05M,3437
25
25
  linkml/generators/graphqlgen.py,sha256=6qZpI0rwg3ypsv_KrLVzXgdsJfR8LNPqgMwaRwzwnDs,2151
26
26
  linkml/generators/javagen/example_template.java.jinja2,sha256=ec4CVTv_0zS7V5Y-1E6H4lRraya10gfX7BEMBlu38X4,444
27
27
  linkml/generators/javagen/java_record_template.jinja2,sha256=OQZffLSy_xR3FIhQMltvrYyVeut7l2Q-tzK7AOiVmWs,1729
28
- linkml/generators/javagen.py,sha256=oZfUowKnBQNdklRqOM-yKptO4Te4y4N5ItIc5jTuWKU,5427
29
- linkml/generators/jsonldcontextgen.py,sha256=2TUzEzFBX7wDOYJ51Kg0hp2CVXcOzJhgIbq0CrzL2oc,7832
30
- linkml/generators/jsonldgen.py,sha256=KQYurjqp3gI0bevjzmrw4WDEgz4Yf4o4TJfZsqK4_vs,7575
31
- linkml/generators/jsonschemagen.py,sha256=8fzOoR5ZRgchg7r-QxZsbkxlnfD7ytrLw6qKjIRgmWo,25294
28
+ linkml/generators/javagen.py,sha256=l3NUWCQMtJOTOIuao237hLYlILliLilVQXxdlJ5haIQ,5455
29
+ linkml/generators/jsonldcontextgen.py,sha256=nLcASMmxoT57dRj1A9W5qqwg-5TDpsGblMb9gt940Zs,7871
30
+ linkml/generators/jsonldgen.py,sha256=BtPXLYbnXTXorUcoe6y4DL0xa-TPjHOvtXdhv-ppW3I,7656
31
+ linkml/generators/jsonschemagen.py,sha256=osol3CJBNB_YgZtvyryWywzpESXHfpDwn_5igvEMBF4,27524
32
32
  linkml/generators/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  linkml/generators/linkmlgen.py,sha256=QhIPA1v2g_g5fien3ZKN-L6TkDk3t7puVFrcoEnwkwY,3540
34
- linkml/generators/markdowngen.py,sha256=ZPLahEPjWsrAsKq4CHbVDXeVd0n1NO-2STs068-g0Ac,32948
34
+ linkml/generators/markdowngen.py,sha256=LU4Z8k9ag6aDURQKZAsEa_p9PEUGWsc_oMLJRx_pamI,32964
35
35
  linkml/generators/namespacegen.py,sha256=vVcIyM0zlKd7XRvtdzwTwHjG4Pg49801gy4FUmjJlqQ,6450
36
36
  linkml/generators/oocodegen.py,sha256=l-5zck_NNAUxJiApJrnDPkqxCv3b6v5s4hC_smelszU,7620
37
- linkml/generators/owlgen.py,sha256=omOfL5oKHeQs-JARbGbTvydZ6DX4Bzyv5pukgW02kds,52419
38
- linkml/generators/plantumlgen.py,sha256=Vs__5x9ioiT4IBTbvZUpgT8MsYJ0amfBL64MB_nmQPc,14870
39
- linkml/generators/prefixmapgen.py,sha256=JJ7hgzuqKVfFZrbDV76Dk8dR2NHsmpp-eNUAspXkfwA,4626
37
+ linkml/generators/owlgen.py,sha256=aF7dufP2WqaYmbG8W41_6Dx0j3u654NmuaXvHAY1aj4,52476
38
+ linkml/generators/plantumlgen.py,sha256=jN40_1_0_YI6Dir8wbxdVm-Upy6rxIYLFSNW-V0WKFY,14871
39
+ linkml/generators/prefixmapgen.py,sha256=-IGKre3rRxCdNs0BP3Oo7Wzv8edeUQXkjjwN7od3qjU,4627
40
40
  linkml/generators/projectgen.py,sha256=g3JR2oXPM_QXhWUGukP9ts1P7tqxIeABaRdv130gbo4,9578
41
41
  linkml/generators/protogen.py,sha256=9YfxBZkQdBWwsUbstxEUR4xRWNuAKSfz9zXPhgIYePU,2328
42
42
  linkml/generators/pydanticgen.py,sha256=Ak0bpRoQsirnnBd091NiJvMZ-2d0qaQbhxADHy5ocwY,25529
43
43
  linkml/generators/pythongen.py,sha256=yGYlRJ4rNm2QQLFDjyuUnqCyKlzz-b3eSOhkSu8aCwI,52491
44
- linkml/generators/rdfgen.py,sha256=LxzYBaFEkV7rlf54nWv_6H6AGcWMRXwkaeVXq9VYEc8,2693
45
- linkml/generators/shaclgen.py,sha256=KxNmDZW2ciCuSqUhJ65TxLTjF8jME1FmN5SaWJCuW9k,8662
46
- linkml/generators/shexgen.py,sha256=E-R8jg5Z3JzzsVAIPu6Fs9FtFF7k-I5-5vMwG1jGW2U,9858
44
+ linkml/generators/rdfgen.py,sha256=94SRun1DDJwMiKVJU-BpU0jwhac2GW7gv4Gaug7iJ6o,2694
45
+ linkml/generators/shaclgen.py,sha256=H63DCUjTGYdrKRG5j7Ep8sOgFTXqmaEkH8Rne8ANvFo,8724
46
+ linkml/generators/shexgen.py,sha256=VVlSrGCighLf0YSStK_VeMnCK0imAL4BJNDRVTpUFkw,9859
47
47
  linkml/generators/sparqlgen.py,sha256=xIT4abjYTjPvAjczZ2mkqfap5z8-AImK_jaCvgZyRGs,6120
48
48
  linkml/generators/sqlalchemy/__init__.py,sha256=mb9AC1rIFkSiNZhhG0TAk45ol9PjS1XvsrvCjgfVUpQ,249
49
49
  linkml/generators/sqlalchemy/sqlalchemy_declarative_template.py,sha256=X_Ws1NUBikMI5HuNgEhl_PIeWM-B-c2B0W9KUBH4QTg,2542
50
50
  linkml/generators/sqlalchemy/sqlalchemy_imperative_template.py,sha256=u4ZpponG1h6XROrOHGOf_0H2e6xL1_s8twAOA-gx94A,1622
51
51
  linkml/generators/sqlalchemygen.py,sha256=XjvyCYr9h0EsFaKy4y-lMXunYw4dnk9vSpwlPjZK8gU,9186
52
- linkml/generators/sqlddlgen.py,sha256=t7U0-ZOWnulA7CMrlaih73H7fQdaGNRhdVLmvWGxFT4,18436
52
+ linkml/generators/sqlddlgen.py,sha256=ickgQovcWunsBRMpHBDTGxGlZKU9kfExb-XQPBS6qPs,18437
53
53
  linkml/generators/sqltablegen.py,sha256=h_zVuNC8huRzzTa9nSHNWBxq-4TuLq7nR5nZfpDnWiM,11481
54
54
  linkml/generators/sssomgen.py,sha256=yur3q7so9uwIELWZaZRzkJwNbz_ppBL7IQki9XLIM3k,6879
55
55
  linkml/generators/string_template.md,sha256=kRcfic6entgIaJdpSg6GF3jcjC9wbKsCVM6wVT2qipc,1788
56
- linkml/generators/summarygen.py,sha256=aeWAUeOaWhn1WHZKnJ3TcKVku_6psrw88ubMc-GQzEc,2924
56
+ linkml/generators/summarygen.py,sha256=67XKbzM_aCwJXEpgtsffWf7RGljeHJYE8dCIjMHXlH8,2925
57
57
  linkml/generators/terminusdbgen.py,sha256=_po9KnOz6Uoctb9Y4fJuU_voW4uA5pepvZTmHLQ2_DE,4470
58
58
  linkml/generators/typescriptgen.py,sha256=VDJ-97jk7zqYx6XlnIcxZmY8mCv885T7D2brKJHaihI,8565
59
- linkml/generators/yamlgen.py,sha256=bI4ebWe8vebR3xGVgto5TH0ZDej-RlZPTYqJ26BxKpg,1651
60
- linkml/generators/yumlgen.py,sha256=547atFkqJd9WtL_LdR-tUME9g7lWaFa3yHFvpnX6J1E,12145
59
+ linkml/generators/yamlgen.py,sha256=0hYw2hW4A92As9x3k_7T7y05y25unfK2v3NPFfrtdbw,1652
60
+ linkml/generators/yumlgen.py,sha256=nIwOYCCBWPnS8xk2y922qGlYSpoHNtMQcdB4L716iqo,12146
61
61
  linkml/linter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  linkml/linter/cli.py,sha256=BpQiETcRfQlZsI1-JALyU9wXPgPOm_KE_n11p0iJaC8,4494
63
63
  linkml/linter/config/datamodel/.linkmllint.yaml,sha256=40rNhcL35FXQSjlVBMWnyPgplwEUqFT_sJmeZqUzxMw,292
@@ -77,7 +77,7 @@ linkml/linter/rules.py,sha256=Bk87FMKgdF_aSBqeLe1uQartcTxV3-ZwUu-QRp2iK4s,11164
77
77
  linkml/reporting/__init__.py,sha256=Jo0V_nyEcnWhMukMW-bqW9dlbgCfaRlWm3CO-XzgU84,92
78
78
  linkml/reporting/model.py,sha256=-10yNfk8wuRC48ZI-akrWvtlJ9a6RYWET2TzlZV3XXo,8622
79
79
  linkml/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- linkml/transformers/logical_model_transformer.py,sha256=fD9cFwnOf_Zur6-8wvPcXgagf8n4-ApV83HwaHn5Jvc,26509
80
+ linkml/transformers/logical_model_transformer.py,sha256=1ZSB-HBoI0E2X2NV9TSgbTghp2GO4HQA27JaK0XiPBE,26510
81
81
  linkml/transformers/model_transformer.py,sha256=tK_MpRDI-q2qfe8KHT6qJHP8ZruKjYx1FcM-Fnjse-E,678
82
82
  linkml/transformers/relmodel_transformer.py,sha256=hRUVtH4gylDssOXoWvVxTetF9ESbITrAZOFu53b_Eg0,17836
83
83
  linkml/transformers/schema_renamer.py,sha256=Cr18TyktX64b5iFh5V6R_ILPVzXjbDYVDDZQyqFiAv8,5271
@@ -87,22 +87,22 @@ linkml/utils/converter.py,sha256=rdhCI7Tsjddr3o1rVBfMq5gQubk_GE6fqlBBmyxI5_M,627
87
87
  linkml/utils/datautils.py,sha256=QlbzwXykh5Fphfe5KxPo6_ekXfniLbHiEGJtLWjUrvY,3742
88
88
  linkml/utils/datavalidator.py,sha256=kBdWaVi8IZT1bOwEJgJYx-wZAb_PTBObB9nHpYORfKA,472
89
89
  linkml/utils/execute_tutorial.py,sha256=T4kHTSyz3ItJGEUZxVjR-3yLVKnOr5Ix4NMGE47-IuE,6912
90
- linkml/utils/generator.py,sha256=WAlP_gfZfAZYNklsh8l4GtiWZ338kjLg7xpQAANgUNg,38217
90
+ linkml/utils/generator.py,sha256=fIoBa5zVXXOpW7ibIRCh0FADycdSXcrH98fMuzq6sng,38271
91
91
  linkml/utils/helpers.py,sha256=yR8n4zFA5wPcYC7xzRuNF3wO16vG80v6j7DM3qTNmIc,447
92
- linkml/utils/ifabsent_functions.py,sha256=FZwceqwlq81lMPDsdNfSHhtzDXSf8F4cbbhRdnDzjss,5765
92
+ linkml/utils/ifabsent_functions.py,sha256=C2mllfh7aIZgVqqJjN5nydurVUk0hV62Wy7uVMYfPDg,5801
93
93
  linkml/utils/logictools.py,sha256=GSmBiobC49TcQjE08RtXEE3JwJEOV7eEREio25uJiFs,21184
94
94
  linkml/utils/mergeutils.py,sha256=QVm2iQB4v_L2rSvPBsPe9C865R03BgV3TzlPoTTTwWQ,9044
95
95
  linkml/utils/rawloader.py,sha256=QB7Rdvy4o4ZJEWBWa2_2xzz2TOh_6Oe4slvUn8IBVIc,4329
96
96
  linkml/utils/schema_builder.py,sha256=WLSit3J4lTifaFLLWTwjqIRiTru1pqvTIUuC1TrxS6Y,9902
97
97
  linkml/utils/schema_fixer.py,sha256=ajsxpwD4yMjDk1iDtoKJTsa34SIqGshWxlnSNXVZ52w,16745
98
98
  linkml/utils/schemaloader.py,sha256=bBSTqimMDTFH2FcKtRz99dKNJzV_myPsZSkIFp_6-A0,46421
99
- linkml/utils/schemasynopsis.py,sha256=6NKa89bkZfZQE9QM0St-6xQcrsHPkYmBgnnWnlgAcQ4,18455
99
+ linkml/utils/schemasynopsis.py,sha256=jKf5ZJxpNgSZ5x9oAcdGO3m1IwzcIU2Ni1ugm0SQq1g,18447
100
100
  linkml/utils/sqlutils.py,sha256=86XeEbfY0Dk-EObw4q5-dxyzSeBtmIhjqqyDcR8ALS0,16591
101
101
  linkml/utils/typereferences.py,sha256=8Yfuz9-HAwOPoJLbIcO_sY9zf32hvPRzGeSOzECfMWA,2232
102
102
  linkml/utils/validation.py,sha256=eLw1-d8x3N1V14bSc6H_mJJXo59ryKvvUIBcOJ1dVMw,1438
103
- linkml/validator/__init__.py,sha256=59EBUp0G0MckoMFjhBEczXbQq7SweUINjD5Mya-Youk,5001
103
+ linkml/validator/__init__.py,sha256=djKc1IyxGKvVYaX5jSxsqjfcEYaw3rFgKbFJxI2wDNk,5002
104
104
  linkml/validator/cli.py,sha256=VwYWDvR2fN37tOyz9L2k_TlE_NpUQx-MYeJ9p1O0qaI,7261
105
- linkml/validator/loaders/__init__.py,sha256=jmnzKaSxhacVPFDQTvfFr3bp1jtyGAD7_vgd1-26RhA,1164
105
+ linkml/validator/loaders/__init__.py,sha256=FjUqEfBHeT5PEMBEZ9XwpclyQOysr4OCI1M0w_MYPVc,1165
106
106
  linkml/validator/loaders/delimited_file_loader.py,sha256=fdh61ZMPTfH29_DM93f5dY0jLP7KQPNh_QAHZppsdNw,2616
107
107
  linkml/validator/loaders/json_loader.py,sha256=Qy42naS2clb0fNXbUushckRu5AIX32b3UFUL6KMhxDE,809
108
108
  linkml/validator/loaders/loader.py,sha256=YKQXmSZhCymvvb2Dbr4lVCKVDt-lOIayzRD7CWrdsJI,559
@@ -112,10 +112,11 @@ linkml/validator/plugins/__init__.py,sha256=F7Un7bfdpSRXvk8LTb7Z4Q22rCtJJKjNkqUf
112
112
  linkml/validator/plugins/jsonschema_validation_plugin.py,sha256=hMPlCyAdMg_N_OHiHMaxcG0fsOA50V4oBNqorNz_oqE,2528
113
113
  linkml/validator/plugins/pydantic_validation_plugin.py,sha256=C-Vp74bz5oqp5V-iuhXW8p0PPDoFY8NCU5x36Ur5Og4,1985
114
114
  linkml/validator/plugins/recommended_slots_plugin.py,sha256=kOdoYQyye47nLA7BjorVmydS84nGpiVy3MoCbPq1Ymo,2308
115
+ linkml/validator/plugins/shacl_validation_plugin.py,sha256=A6x3tiX-p03_i_VmR2xnw28j0dpiUw6WIAG-gllwJ8Q,3624
115
116
  linkml/validator/plugins/validation_plugin.py,sha256=9SMHF8b2bgG9-8351e8bY676e0A4aEBJSXvMjMF5kXg,1548
116
117
  linkml/validator/report.py,sha256=kkkuh-IZF9--cO-2wGjwP3PDLvOcjjvC8AOlxXUIOAM,870
117
118
  linkml/validator/validation_context.py,sha256=2BYbw0czAYepJUNoIINyTnmW6SrgK6et7SNvH5ejzgU,2700
118
- linkml/validator/validator.py,sha256=sdWbAOlnNYQWnZSEIuLpGQqH3W4cNq_8M_CdLtsNMH0,5648
119
+ linkml/validator/validator.py,sha256=BFgfKdu9Nad2dc9XTpmz9daQTj_FTcvo6mBq3e8fhJs,5649
119
120
  linkml/validators/__init__.py,sha256=43W3J5NPKhwa3ZFHLRYsJMocwQKWGYCF9Ki9r0ccGbc,202
120
121
  linkml/validators/jsonschemavalidator.py,sha256=_ku7MQGqA6KplbHMiyzDRqgRwwXGloobhLptuXqLCp4,7951
121
122
  linkml/validators/sparqlvalidator.py,sha256=JowuZ5KxmWkldgWIXAb8DJi7YCPm8x3it0QkgM4lSi0,4612
@@ -123,9 +124,9 @@ linkml/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
123
124
  linkml/workspaces/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
125
  linkml/workspaces/datamodel/workspaces.py,sha256=4HdkqweGNfMPqnB1_Onc9DcTfkhoagTRcqruh08nRoI,14905
125
126
  linkml/workspaces/datamodel/workspaces.yaml,sha256=EjVrwPpeRZqJRjuGyyDRxxFzuv55SiLIXPBRUG6HStU,4233
126
- linkml/workspaces/example_runner.py,sha256=uumXyPZ7xUJSZyRtjDP4TCCxgKSSOfebpufXc0_l0jY,11610
127
- linkml-1.6.9.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
128
- linkml-1.6.9.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
129
- linkml-1.6.9.dist-info/entry_points.txt,sha256=za8r49Z5gcz3rAYTZLbxw5EPZr1rGuxSe1uiRUpf8R0,2143
130
- linkml-1.6.9.dist-info/METADATA,sha256=KsqVPfLcVUKxAlb-hz4AFdd6Pk5VGUjtmGx3wj5x7U8,3446
131
- linkml-1.6.9.dist-info/RECORD,,
127
+ linkml/workspaces/example_runner.py,sha256=OmC_yZLIb4KXGQrstBVZL0UAQ9ZAaraguQF0RSf-snk,11611
128
+ linkml-1.6.11.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
129
+ linkml-1.6.11.dist-info/METADATA,sha256=0RyiHg0LnaAnrM3mRymCMT9pwefYYwa965a4HAzJCTQ,3447
130
+ linkml-1.6.11.dist-info/entry_points.txt,sha256=za8r49Z5gcz3rAYTZLbxw5EPZr1rGuxSe1uiRUpf8R0,2143
131
+ linkml-1.6.11.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
132
+ linkml-1.6.11.dist-info/RECORD,,