linkml 1.7.9__py3-none-any.whl → 1.7.11rc1__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.
@@ -16,9 +16,7 @@ except ImportError:
16
16
 
17
17
 
18
18
  def _default_mode() -> "Mode":
19
- return Mode(
20
- target_versions={TargetVersion.PY311},
21
- )
19
+ return Mode(target_versions={TargetVersion.PY311}, line_length=120)
22
20
 
23
21
 
24
22
  def format_black(code: str, mode: Optional["Mode"] = None) -> str:
@@ -0,0 +1,46 @@
1
+ """
2
+ Classes to inject in generated pydantic models
3
+ """
4
+
5
+ from pydantic.version import VERSION
6
+
7
+ PYDANTIC_VERSION = int(VERSION[0])
8
+
9
+
10
+ LinkMLMeta_v1 = """
11
+ class LinkMLMeta(BaseModel):
12
+ __root__: Dict[str, Any] = {}
13
+
14
+ def __getattr__(self, key:str):
15
+ return getattr(self.__root__, key)
16
+
17
+ def __getitem__(self, key:str):
18
+ return self.__root__[key]
19
+
20
+ def __setitem__(self, key:str, value):
21
+ self.__root__[key] = value
22
+
23
+ class Config:
24
+ allow_mutation = False
25
+ """
26
+
27
+ LinkMLMeta_v2 = """
28
+ class LinkMLMeta(RootModel):
29
+ root: Dict[str, Any] = {}
30
+ model_config = ConfigDict(frozen=True)
31
+
32
+ def __getattr__(self, key:str):
33
+ return getattr(self.root, key)
34
+
35
+ def __getitem__(self, key:str):
36
+ return self.root[key]
37
+
38
+ def __setitem__(self, key:str, value):
39
+ self.root[key] = value
40
+
41
+ """
42
+
43
+ # if PYDANTIC_VERSION >= 2:
44
+ # LinkMLMeta = eval(LinkMLMeta_v2)
45
+ # else:
46
+ # LinkMLMeta = eval(LinkMLMeta_v1)
@@ -3,19 +3,12 @@ import logging
3
3
  import os
4
4
  import textwrap
5
5
  from collections import defaultdict
6
- from copy import deepcopy
6
+ from copy import copy, deepcopy
7
7
  from dataclasses import dataclass, field
8
+ from enum import Enum
8
9
  from pathlib import Path
9
10
  from types import ModuleType
10
- from typing import (
11
- Dict,
12
- List,
13
- Literal,
14
- Optional,
15
- Set,
16
- Type,
17
- Union,
18
- )
11
+ from typing import Dict, List, Literal, Optional, Set, Type, TypeVar, Union, overload
19
12
 
20
13
  import click
21
14
  from jinja2 import ChoiceLoader, Environment, FileSystemLoader
@@ -27,7 +20,7 @@ from linkml_runtime.linkml_model.meta import (
27
20
  TypeDefinition,
28
21
  )
29
22
  from linkml_runtime.utils.compile_python import compile_python
30
- from linkml_runtime.utils.formatutils import camelcase, underscore
23
+ from linkml_runtime.utils.formatutils import camelcase, remove_empty_items, underscore
31
24
  from linkml_runtime.utils.schemaview import SchemaView
32
25
  from pydantic.version import VERSION as PYDANTIC_VERSION
33
26
 
@@ -37,6 +30,7 @@ from linkml.generators.common.type_designators import (
37
30
  get_type_designator_value,
38
31
  )
39
32
  from linkml.generators.oocodegen import OOCodeGenerator
33
+ from linkml.generators.pydanticgen import includes
40
34
  from linkml.generators.pydanticgen.array import ArrayRangeGenerator, ArrayRepresentation
41
35
  from linkml.generators.pydanticgen.build import SlotResult
42
36
  from linkml.generators.pydanticgen.template import (
@@ -85,6 +79,7 @@ DEFAULT_IMPORTS = (
85
79
  module="typing",
86
80
  objects=[
87
81
  ObjectImport(name="Any"),
82
+ ObjectImport(name="ClassVar"),
88
83
  ObjectImport(name="List"),
89
84
  ObjectImport(name="Literal"),
90
85
  ObjectImport(name="Dict"),
@@ -100,6 +95,7 @@ DEFAULT_IMPORTS = (
100
95
  ObjectImport(name="BaseModel"),
101
96
  ObjectImport(name="ConfigDict"),
102
97
  ObjectImport(name="Field"),
98
+ ObjectImport(name="RootModel"),
103
99
  ObjectImport(name="field_validator"),
104
100
  ],
105
101
  alternative=Import(
@@ -109,6 +105,33 @@ DEFAULT_IMPORTS = (
109
105
  )
110
106
  )
111
107
 
108
+ DEFAULT_INJECTS = {1: [includes.LinkMLMeta_v1], 2: [includes.LinkMLMeta_v2]}
109
+
110
+
111
+ class MetadataMode(str, Enum):
112
+ FULL = "full"
113
+ """
114
+ all metadata from the source schema will be included, even if it is represented by the template classes,
115
+ and even if it is represented by some child class (eg. "classes" will be included with schema metadata
116
+ """
117
+ EXCEPT_CHILDREN = "except_children"
118
+ """
119
+ all metadata from the source schema will be included, even if it is represented by the template classes,
120
+ except if it is represented by some child template class (eg. "classes" will be excluded from schema metadata)
121
+ """
122
+ AUTO = "auto"
123
+ """
124
+ Only the metadata that isn't represented by the template classes or excluded with ``meta_exclude`` will be included
125
+ """
126
+ NONE = None
127
+ """
128
+ No metadata will be included.
129
+ """
130
+
131
+
132
+ DefinitionType = TypeVar("DefinitionType", bound=Union[SchemaDefinition, ClassDefinition, SlotDefinition])
133
+ TemplateType = TypeVar("TemplateType", bound=Union[PydanticModule, PydanticClass, PydanticAttribute])
134
+
112
135
 
113
136
  @dataclass
114
137
  class PydanticGenerator(OOCodeGenerator):
@@ -212,6 +235,12 @@ class PydanticGenerator(OOCodeGenerator):
212
235
  from typing_extensions import Literal
213
236
 
214
237
  """
238
+ metadata_mode: Union[MetadataMode, str, None] = MetadataMode.AUTO
239
+ """
240
+ How to include schema metadata in generated pydantic models.
241
+
242
+ See :class:`.MetadataMode` for mode documentation
243
+ """
215
244
 
216
245
  # ObjectVars (identical to pythongen)
217
246
  gen_classvars: bool = True
@@ -530,6 +559,56 @@ class PydanticGenerator(OOCodeGenerator):
530
559
 
531
560
  return array_reps
532
561
 
562
+ @overload
563
+ def include_metadata(self, model: PydanticModule, source: SchemaDefinition) -> PydanticModule: ...
564
+
565
+ @overload
566
+ def include_metadata(self, model: PydanticClass, source: ClassDefinition) -> PydanticClass: ...
567
+
568
+ @overload
569
+ def include_metadata(self, model: PydanticAttribute, source: SlotDefinition) -> PydanticAttribute: ...
570
+
571
+ def include_metadata(self, model: TemplateType, source: DefinitionType) -> TemplateType:
572
+ """
573
+ Include metadata from the source schema that is otherwise not represented in the pydantic template models.
574
+
575
+ Metadata inclusion mode is dependent on :attr:`.metadata_mode` - see:
576
+
577
+ - :class:`.MetadataMode`
578
+ - :meth:`.TemplateModel.exclude_from_meta`
579
+
580
+ """
581
+ if self.metadata_mode is None or self.metadata_mode == MetadataMode.NONE:
582
+ return model
583
+ elif self.metadata_mode in (MetadataMode.AUTO, MetadataMode.AUTO.value):
584
+ meta = {k: v for k, v in remove_empty_items(source).items() if k not in model.exclude_from_meta()}
585
+ elif self.metadata_mode in (MetadataMode.EXCEPT_CHILDREN, MetadataMode.EXCEPT_CHILDREN.value):
586
+ meta = {}
587
+ for k, v in remove_empty_items(source).items():
588
+ if not hasattr(model, k):
589
+ meta[k] = v
590
+ elif isinstance(getattr(model, k), list) and not any(
591
+ [isinstance(item, TemplateModel) for item in getattr(model, k)]
592
+ ):
593
+ meta[k] = v
594
+ elif isinstance(getattr(model, k), dict) and not any(
595
+ [isinstance(item, TemplateModel) for item in getattr(model, k).values()]
596
+ ):
597
+ meta[k] = v
598
+ elif not isinstance(getattr(model, k), TemplateModel):
599
+ meta[k] = v
600
+
601
+ elif self.metadata_mode in (MetadataMode.FULL, MetadataMode.FULL.value):
602
+ meta = remove_empty_items(source)
603
+ else:
604
+ raise ValueError(
605
+ f"Unknown metadata mode '{self.metadata_mode}', needs to be one of "
606
+ f"{[mode.value for mode in MetadataMode]}"
607
+ )
608
+
609
+ model.meta = meta
610
+ return model
611
+
533
612
  def render(self) -> PydanticModule:
534
613
  sv: SchemaView
535
614
  sv = self.schemaview
@@ -540,7 +619,7 @@ class PydanticGenerator(OOCodeGenerator):
540
619
  description=schema.description.replace('"', '\\"') if schema.description else None,
541
620
  )
542
621
  enums = self.generate_enums(sv.all_enums())
543
- injected_classes = []
622
+ injected_classes = copy(DEFAULT_INJECTS[self.pydantic_version])
544
623
  if self.injected_classes is not None:
545
624
  injected_classes += self.injected_classes
546
625
 
@@ -665,15 +744,22 @@ class PydanticGenerator(OOCodeGenerator):
665
744
  predef_slot = str(predef_slot)
666
745
  new_fields["predefined"] = predef_slot
667
746
  new_fields["name"] = attr_name
747
+
668
748
  attrs[attr_name] = PydanticAttribute(**new_fields, pydantic_ver=self.pydantic_version)
749
+ attrs[attr_name] = self.include_metadata(attrs[attr_name], src_attr)
669
750
 
670
751
  new_class = PydanticClass(
671
752
  name=k, attributes=attrs, description=c.description, pydantic_ver=self.pydantic_version
672
753
  )
754
+ new_class = self.include_metadata(new_class, c)
673
755
  if k in bases:
674
756
  new_class.bases = bases[k]
675
757
  classes[k] = new_class
676
758
 
759
+ schema_meta = {
760
+ k: v for k, v in remove_empty_items(schema).items() if k not in PydanticModule.exclude_from_meta()
761
+ }
762
+
677
763
  module = PydanticModule(
678
764
  pydantic_ver=self.pydantic_version,
679
765
  metamodel_version=self.schema.metamodel_version,
@@ -683,7 +769,9 @@ class PydanticGenerator(OOCodeGenerator):
683
769
  injected_classes=injected_classes,
684
770
  enums=enums,
685
771
  classes=classes,
772
+ meta=schema_meta,
686
773
  )
774
+ module = self.include_metadata(module, pyschema)
687
775
  return module
688
776
 
689
777
  def serialize(self) -> str:
@@ -723,7 +811,7 @@ Available templates to override:
723
811
  @click.option(
724
812
  "--pydantic-version",
725
813
  type=click.IntRange(1, 2),
726
- default=1,
814
+ default=int(PYDANTIC_VERSION[0]),
727
815
  help="Pydantic version to use (1 or 2)",
728
816
  )
729
817
  @click.option(
@@ -739,6 +827,12 @@ Available templates to override:
739
827
  default="forbid",
740
828
  help="How to handle extra fields in BaseModel.",
741
829
  )
830
+ @click.option(
831
+ "--black",
832
+ is_flag=True,
833
+ default=False,
834
+ help="Format generated models with black (must be present in the environment)",
835
+ )
742
836
  @click.version_option(__version__, "-V", "--version")
743
837
  @click.command()
744
838
  def cli(
@@ -750,8 +844,9 @@ def cli(
750
844
  classvars=True,
751
845
  slots=True,
752
846
  array_representations=list("list"),
753
- pydantic_version=1,
847
+ pydantic_version=int(PYDANTIC_VERSION[0]),
754
848
  extra_fields: Literal["allow", "forbid", "ignore"] = "forbid",
849
+ black: bool = False,
755
850
  **args,
756
851
  ):
757
852
  """Generate pydantic classes to represent a LinkML model"""
@@ -777,6 +872,7 @@ def cli(
777
872
  gen_classvars=classvars,
778
873
  gen_slots=slots,
779
874
  template_dir=template_dir,
875
+ black=black,
780
876
  **args,
781
877
  )
782
878
  print(gen.serialize())
@@ -60,6 +60,7 @@ class TemplateModel(BaseModel):
60
60
  )
61
61
 
62
62
  pydantic_ver: int = int(PYDANTIC_VERSION[0])
63
+ meta_exclude: ClassVar[List[str]] = None
63
64
 
64
65
  def render(self, environment: Optional[Environment] = None, black: bool = False) -> str:
65
66
  """
@@ -132,6 +133,16 @@ class TemplateModel(BaseModel):
132
133
  return self.json(**kwargs)
133
134
  return self.dict(**kwargs)
134
135
 
136
+ @classmethod
137
+ def exclude_from_meta(cls: "TemplateModel") -> List[str]:
138
+ """
139
+ Attributes in the source definition to exclude from linkml_meta
140
+ """
141
+ ret = [*cls.model_fields.keys()]
142
+ if cls.meta_exclude is not None:
143
+ ret = ret + cls.meta_exclude
144
+ return ret
145
+
135
146
 
136
147
  def _render(
137
148
  item: Union[TemplateModel, Any, List[Union[Any, TemplateModel]], Dict[str, Union[Any, TemplateModel]]],
@@ -213,6 +224,7 @@ class PydanticAttribute(TemplateModel):
213
224
  """
214
225
 
215
226
  template: ClassVar[str] = "attribute.py.jinja"
227
+ meta_exclude: ClassVar[List[str]] = ["from_schema", "owner", "range", "multivalued", "inlined", "inlined_as_list"]
216
228
 
217
229
  name: str
218
230
  required: bool = False
@@ -237,6 +249,10 @@ class PydanticAttribute(TemplateModel):
237
249
  minimum_value: Optional[Union[int, float]] = None
238
250
  maximum_value: Optional[Union[int, float]] = None
239
251
  pattern: Optional[str] = None
252
+ meta: Optional[Dict[str, Any]] = None
253
+ """
254
+ Metadata for the slot to be included in a Field annotation
255
+ """
240
256
 
241
257
  if int(PYDANTIC_VERSION[0]) >= 2:
242
258
 
@@ -283,11 +299,16 @@ class PydanticClass(TemplateModel):
283
299
  """
284
300
 
285
301
  template: ClassVar[str] = "class.py.jinja"
302
+ meta_exclude: ClassVar[List[str]] = ["slots", "is_a"]
286
303
 
287
304
  name: str
288
305
  bases: Union[List[str], str] = PydanticBaseModel.default_name
289
306
  description: Optional[str] = None
290
307
  attributes: Optional[Dict[str, PydanticAttribute]] = None
308
+ meta: Optional[Dict[str, Any]] = None
309
+ """
310
+ Metadata for the class to be included in a linkml_meta class attribute
311
+ """
291
312
 
292
313
  def _validators(self) -> Optional[Dict[str, PydanticValidator]]:
293
314
  if self.attributes is None:
@@ -548,6 +569,7 @@ class PydanticModule(TemplateModel):
548
569
  """
549
570
 
550
571
  template: ClassVar[str] = "module.py.jinja"
572
+ meta_exclude: ClassVar[str] = ["slots"]
551
573
 
552
574
  metamodel_version: Optional[str] = None
553
575
  version: Optional[str] = None
@@ -556,6 +578,10 @@ class PydanticModule(TemplateModel):
556
578
  imports: List[Union[Import, ConditionalImport]] = Field(default_factory=list)
557
579
  enums: Dict[str, PydanticEnum] = Field(default_factory=dict)
558
580
  classes: Dict[str, PydanticClass] = Field(default_factory=dict)
581
+ meta: Optional[Dict[str, Any]] = None
582
+ """
583
+ Metadata for the schema to be included in a linkml_meta module-level instance of LinkMLMeta
584
+ """
559
585
 
560
586
  if int(PYDANTIC_VERSION[0]) >= 2:
561
587
 
@@ -7,4 +7,10 @@
7
7
  {%- if minimum_value != None %}, ge={{minimum_value}}{% endif -%}
8
8
  {%- if maximum_value != None %}, le={{maximum_value}}{% endif -%}
9
9
  {%- endif -%}
10
- )
10
+ {%- if meta != None -%}
11
+ {%- if pydantic_ver == 1 -%}
12
+ , linkml_meta = {{ meta | pprint | indent(width=8) }}
13
+ {% else -%}
14
+ , json_schema_extra = { "linkml_meta": {{ meta | pprint | indent(width=8) }} }
15
+ {%- endif -%}
16
+ {%- endif -%})
@@ -4,6 +4,10 @@ class {{ name }}({% if bases is string %}{{ bases }}{% else %}{{ bases | join(',
4
4
  {{ description | indent(width=4) }}
5
5
  """
6
6
  {% endif -%}
7
+ {% if meta != None %}
8
+ linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({% if pydantic_ver == 1 %}__root__={% endif %}{{ meta | pprint | indent(width=8) }})
9
+
10
+ {% endif %}
7
11
  {% if attributes or validators %}
8
12
  {% if attributes %}
9
13
  {% for attr in attributes.values() %}
@@ -7,18 +7,25 @@ version = "{{version if version else None}}"
7
7
 
8
8
 
9
9
  {{ base_model }}
10
- {% if enums %}
11
- {% for e in enums.values() %}
12
10
 
13
- {{ e }}
14
- {% endfor %}
15
- {% endif %}
16
11
  {% if injected_classes %}
17
12
  {% for c in injected_classes%}
18
13
 
19
14
  {{ c }}
20
15
  {% endfor %}
21
16
  {% endif %}
17
+ {% if meta != None %}
18
+ linkml_meta = LinkMLMeta({% if pydantic_ver == 1 %}__root__={% endif %}{{ meta | pprint | indent(width=4) }} )
19
+ {% else %}
20
+ linkml_meta = None
21
+ {% endif %}
22
+ {% if enums %}
23
+ {% for e in enums.values() %}
24
+
25
+ {{ e }}
26
+ {% endfor %}
27
+ {% endif %}
28
+
22
29
  {% for c in classes.values() %}
23
30
 
24
31
  {{ c }}
@@ -130,7 +130,7 @@ class ShaclGenerator(Generator):
130
130
 
131
131
  self._add_class(cl_node_pv, r)
132
132
  range_list.append(class_node)
133
- elif r in sv.all_types().values():
133
+ elif r in sv.all_types():
134
134
  t_node = BNode()
135
135
 
136
136
  def t_node_pv(p, v):
@@ -168,7 +168,7 @@ class ShaclGenerator(Generator):
168
168
  prop_pv(SH.nodeKind, SH.IRI)
169
169
  else:
170
170
  prop_pv(SH.nodeKind, SH.BlankNodeOrIRI)
171
- elif r in sv.all_types().values():
171
+ elif r in sv.all_types():
172
172
  self._add_type(prop_pv, r)
173
173
  elif r in sv.all_enums():
174
174
  self._add_enum(g, prop_pv, r)
@@ -201,10 +201,11 @@ class ShaclGenerator(Generator):
201
201
  func(SH["in"], pv_node)
202
202
 
203
203
  def _add_type(self, func: Callable, r: ElementName) -> None:
204
+ func(SH.nodeKind, SH.Literal)
204
205
  sv = self.schemaview
205
206
  rt = sv.get_type(r)
206
207
  if rt.uri:
207
- func(SH.datatype, rt.uri)
208
+ func(SH.datatype, URIRef(sv.get_uri(rt, expand=True)))
208
209
  else:
209
210
  logging.error(f"No URI for type {rt.name}")
210
211
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: linkml
3
- Version: 1.7.9
3
+ Version: 1.7.11rc1
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
@@ -41,25 +41,26 @@ linkml/generators/projectgen.py,sha256=OuT_AneoZFNMCn50GllfZafadUHt50u61JcftM2ee
41
41
  linkml/generators/protogen.py,sha256=i4sEhNdAiFFP12fwfRdype1MX8yU-E5fF7XzkcpBCd0,2512
42
42
  linkml/generators/pydanticgen/__init__.py,sha256=uKGaaQSaeKqinHImXGFE448i-t8Oi0No8suIO76sep8,629
43
43
  linkml/generators/pydanticgen/array.py,sha256=1QWWgz46yVmWkdNauI6Kjkbx3kexp-l210nOILoHJ18,19506
44
- linkml/generators/pydanticgen/black.py,sha256=c-Hgaao9hd4nPMU9w0Hmg2j4Wc81IcY0zAfppQPr1cM,721
44
+ linkml/generators/pydanticgen/black.py,sha256=BaJ7b-kMUbIN_cKRT3yCaMEbFwxzj1_U7w4fKQnkL44,723
45
45
  linkml/generators/pydanticgen/build.py,sha256=Ia8qy4C16b-KqO_fw4tGQW_Eo4grCVyX7RsuJ3uRTtk,2681
46
- linkml/generators/pydanticgen/pydanticgen.py,sha256=RHRMRXPpR4tFoUcKM3S58NbU1VI6uXtcZ0wh6zzNZRg,30138
47
- linkml/generators/pydanticgen/template.py,sha256=fAqRofLm7N94xUqXjkStdmugcxGQfiioGkxdIhLByik,19990
48
- linkml/generators/pydanticgen/templates/attribute.py.jinja,sha256=AlH_QFJJkONpzXQRGqnW4ufmjp9s9E7Q9W5r8ykNGeQ,443
46
+ linkml/generators/pydanticgen/includes.py,sha256=PIVbACrtqQS6LFrXqQsJC6dQUcGBM3uY4E4qLQWJrnk,998
47
+ linkml/generators/pydanticgen/pydanticgen.py,sha256=S5t9RhS3R7nhE4DmYX--e41th9sIyrO2T3SdBPtxIJE,34471
48
+ linkml/generators/pydanticgen/template.py,sha256=HESLY1Rd7N_e92dqrh_fif_yp3oDl0n1UAghklMyphA,20982
49
+ linkml/generators/pydanticgen/templates/attribute.py.jinja,sha256=S_T-M7n_eeM3LW5gQUuTPH1-Oc1CEtL7Bve7qAFouYQ,688
49
50
  linkml/generators/pydanticgen/templates/base_model.py.jinja,sha256=48y64MnC9rjNSV-nKLMeDuHN4gm15UsInhnKxh65zoM,834
50
- linkml/generators/pydanticgen/templates/class.py.jinja,sha256=RIdkqdZS9rDILUuVqDIAWK_vATGkirLbPhdHSyHDAbY,565
51
+ linkml/generators/pydanticgen/templates/class.py.jinja,sha256=V_lyvFcZ9QhlKZi2bL5iff8RjHir2SQTTypOzQMOfmk,744
51
52
  linkml/generators/pydanticgen/templates/conditional_import.py.jinja,sha256=YheknDrxvepiJUzeItSL5aSbAkCdR1k0a6m6aTA4qNM,240
52
53
  linkml/generators/pydanticgen/templates/enum.py.jinja,sha256=572XFQyEMZfL-G_Cj68T-NI_mUnDoFOAVJOGIKu2Hb8,338
53
54
  linkml/generators/pydanticgen/templates/footer.py.jinja,sha256=WuWGJjkWDQcEPL2bGk5fdGuhO0gQRUJzpo4CQHHxQNQ,385
54
55
  linkml/generators/pydanticgen/templates/imports.py.jinja,sha256=d1XFna2eOpkH8cgJML3vXwqGcocczvOcrbg6jjd4kP0,945
55
- linkml/generators/pydanticgen/templates/module.py.jinja,sha256=SkmtWtQS7D-xBiZI-sFiYC3WYPKi3VJCj_KtaMVxexM,438
56
+ linkml/generators/pydanticgen/templates/module.py.jinja,sha256=nymjtSX4jqV9deSsXrsh1HWR90ygECHE4CV9MCyNrTY,615
56
57
  linkml/generators/pydanticgen/templates/validator.py.jinja,sha256=Yo4dubQal-HwEoJKztQkLYM5qCz1I8na2oaDlXuEpwU,532
57
58
  linkml/generators/pythongen.py,sha256=IVloJ6v7QE7mdHygz0kZmcJ6D61usKffeyBmZjkArng,52879
58
59
  linkml/generators/rdfgen.py,sha256=eQi3XXjWk6xliTLncQ4G0VYzGCJwCU_FFG-O7tA8DSA,2959
59
60
  linkml/generators/shacl/__init__.py,sha256=O-M-wndKw8rMW-U8X3QCNHal-ErXP6uXZqxiQSa77l4,108
60
61
  linkml/generators/shacl/ifabsent_processor.py,sha256=kV9BGA2ZPXLRfaFuW0o4jpkATvGggvrqpAo9c1UqWNE,2193
61
62
  linkml/generators/shacl/shacl_data_type.py,sha256=BT3C9tdFyBQnuucPN7YQiFAKEa9yuzy-Q26X6dmOXgo,1827
62
- linkml/generators/shaclgen.py,sha256=unhdoNDe9Tp66oGj3LnRud6emN14jtaf2jtuVtxQ2NM,8800
63
+ linkml/generators/shaclgen.py,sha256=B9BkCzOQULjpCN10jbvazY6_WEkeVGO8lxEhr6pQ3_A,8849
63
64
  linkml/generators/shexgen.py,sha256=MhB1HidCREMCJcDGBqutFQ0gWKKz7aSVw-0s-IHUMm4,9930
64
65
  linkml/generators/sparqlgen.py,sha256=c7x8GFChKWprBx4rToSnu9qN8OleWTCenVUdZ8XSTWM,6138
65
66
  linkml/generators/sqlalchemy/__init__.py,sha256=mb9AC1rIFkSiNZhhG0TAk45ol9PjS1XvsrvCjgfVUpQ,249
@@ -142,8 +143,8 @@ linkml/workspaces/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
142
143
  linkml/workspaces/datamodel/workspaces.py,sha256=4HdkqweGNfMPqnB1_Onc9DcTfkhoagTRcqruh08nRoI,14905
143
144
  linkml/workspaces/datamodel/workspaces.yaml,sha256=EjVrwPpeRZqJRjuGyyDRxxFzuv55SiLIXPBRUG6HStU,4233
144
145
  linkml/workspaces/example_runner.py,sha256=hDk2RGxRE5-WYNriWknugtbm3Mhn8bFcAcXGMlkYxVk,11705
145
- linkml-1.7.9.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
146
- linkml-1.7.9.dist-info/METADATA,sha256=BMYy_g5uDJO5NGDlD8Xvdl_uGqFBFwMuys3T_NGc7og,3724
147
- linkml-1.7.9.dist-info/entry_points.txt,sha256=7haDkIbyC7ZLhm5z-e3BhrLJpY2xoW1yuD8Y7QPNtVg,2093
148
- linkml-1.7.9.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
149
- linkml-1.7.9.dist-info/RECORD,,
146
+ linkml-1.7.11rc1.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
147
+ linkml-1.7.11rc1.dist-info/METADATA,sha256=rN4JFH3t8f6Mn3SjZlQYFUsj3leDC8GE47VrmWGRDA4,3728
148
+ linkml-1.7.11rc1.dist-info/entry_points.txt,sha256=7haDkIbyC7ZLhm5z-e3BhrLJpY2xoW1yuD8Y7QPNtVg,2093
149
+ linkml-1.7.11rc1.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
150
+ linkml-1.7.11rc1.dist-info/RECORD,,