linkml 1.7.6__py3-none-any.whl → 1.7.8__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.
@@ -226,6 +226,7 @@ class RelationalModelTransformer:
226
226
 
227
227
  # TODO: separate out the logic into separate testable methods
228
228
  target_sv.set_modified()
229
+ multivalued_slots_original = []
229
230
  # post-process target schema
230
231
  for cn, c in target_sv.all_classes().items():
231
232
  if self.foreign_key_policy == ForeignKeyPolicy.NO_FOREIGN_KEYS:
@@ -243,6 +244,7 @@ class RelationalModelTransformer:
243
244
  slot.inlined or slot.inlined_as_list or "shared" in slot.annotations
244
245
  )
245
246
  if slot.multivalued:
247
+ multivalued_slots_original.append(slot.name)
246
248
  slot.multivalued = False
247
249
  slot_name = slot.name
248
250
  sn_singular = slot.singular_name if slot.singular_name else slot.name
@@ -332,6 +334,7 @@ class RelationalModelTransformer:
332
334
  # add PK and FK anns
333
335
  target_sv.set_modified()
334
336
  fk_policy = self.foreign_key_policy
337
+ forward_map = {}
335
338
  for c in target.classes.values():
336
339
  if self.foreign_key_policy == ForeignKeyPolicy.NO_FOREIGN_KEYS:
337
340
  continue
@@ -356,14 +359,31 @@ class RelationalModelTransformer:
356
359
  # if it is already an injected backref, no need to re-inject
357
360
  if "backref" not in a.annotations:
358
361
  del c.attributes[a.name]
362
+ original_name = a.name
359
363
  if "forwardref" not in a.annotations:
360
- add_annotation(a, "original_slot", a.name)
364
+ add_annotation(a, "original_slot", original_name)
361
365
  a.alias = f"{a.name}_{tc_pk_slot.name}"
362
366
  a.name = a.alias
363
367
  c.attributes[a.name] = a
368
+ forward_map[original_name] = a.name
364
369
  ann = Annotation("foreign_key", f"{tc.name}.{tc_pk_slot.name}")
365
370
  a.annotations[ann.tag] = ann
366
371
  target_sv.set_modified()
372
+ # Rewrite unique key constraints
373
+ # - if a slot has a range of object, it may be renamed, e.g. person => person_id
374
+ # - if a slot is multivalued then it is translated to backref and the UC must be dropped
375
+ removed_ucs = []
376
+ for uc_name, uc in c.unique_keys.items():
377
+ if any(sn in multivalued_slots_original for sn in uc.unique_key_slots):
378
+ logging.warning(
379
+ f"Cannot represent uniqueness constraint {uc_name}. "
380
+ f"one of the slots {uc.unique_key_slots} is multivalued"
381
+ )
382
+ removed_ucs.append(uc_name)
383
+ new_slot_names = [forward_map.get(sn, sn) for sn in uc.unique_key_slots]
384
+ uc.unique_key_slots = new_slot_names
385
+ for uc_name in removed_ucs:
386
+ del c.unique_keys[uc_name]
367
387
 
368
388
  result = TransformationResult(target, mappings=mappings)
369
389
  return result
linkml/utils/generator.py CHANGED
@@ -30,7 +30,6 @@ from typing import Callable, ClassVar, Dict, List, Mapping, Optional, Set, TextI
30
30
  import click
31
31
  from click import Argument, Command, Option
32
32
  from linkml_runtime import SchemaView
33
- from linkml_runtime.dumpers import yaml_dumper
34
33
  from linkml_runtime.linkml_model.meta import (
35
34
  ClassDefinition,
36
35
  ClassDefinitionName,
@@ -83,7 +82,7 @@ class Generator(metaclass=abc.ABCMeta):
83
82
  For usage `Generator Docs <https://linkml.io/linkml/generators/>`_
84
83
  """
85
84
 
86
- schema: Union[str, TextIO, SchemaDefinition, "Generator"]
85
+ schema: Union[str, TextIO, SchemaDefinition, "Generator", Path]
87
86
  """metamodel compliant schema. Can be URI, file name, actual schema, another generator, an
88
87
  open file or a pre-parsed schema"""
89
88
 
@@ -130,7 +129,7 @@ class Generator(metaclass=abc.ABCMeta):
130
129
  useuris: Optional[bool] = None
131
130
  """True means declared class slot uri's are used. False means use model uris"""
132
131
 
133
- log_level: int = DEFAULT_LOG_LEVEL_INT
132
+ log_level: Optional[int] = DEFAULT_LOG_LEVEL_INT
134
133
  """Logging level, 0 is minimum"""
135
134
 
136
135
  mergeimports: Optional[bool] = True
@@ -180,6 +179,8 @@ class Generator(metaclass=abc.ABCMeta):
180
179
  def __post_init__(self) -> None:
181
180
  if not self.logger:
182
181
  self.logger = logging.getLogger()
182
+ if self.log_level is not None:
183
+ self.logger.setLevel(self.log_level)
183
184
  if self.format is None:
184
185
  self.format = self.valid_formats[0]
185
186
  if self.format not in self.valid_formats:
@@ -191,7 +192,11 @@ class Generator(metaclass=abc.ABCMeta):
191
192
  self.source_file_size = None
192
193
  if self.requires_metamodel:
193
194
  self.metamodel = _resolved_metamodel(self.mergeimports)
195
+
194
196
  schema = self.schema
197
+ if isinstance(schema, Path):
198
+ schema = str(schema)
199
+
195
200
  # TODO: remove aliasing
196
201
  self.emit_metadata = self.metadata
197
202
  if self.uses_schemaloader:
@@ -225,8 +230,7 @@ class Generator(metaclass=abc.ABCMeta):
225
230
  # schemaloader based methods require schemas to have been created via SchemaLoader,
226
231
  # which prepopulates some fields (e.g. definition_url). If the schema has not been processed through the
227
232
  # loader, then roundtrip
228
- if any(c for c in schema.classes.values() if not c.definition_uri):
229
- schema = yaml_dumper.dumps(schema)
233
+ schema = schema._as_dict
230
234
  loader = SchemaLoader(
231
235
  schema,
232
236
  self.base_dir,
@@ -684,7 +688,7 @@ class Generator(metaclass=abc.ABCMeta):
684
688
 
685
689
  def slot_name(self, name: str) -> str:
686
690
  """
687
- Return the underscored version of the aliased slot name if name is a slot. Prepend "unknown\_" if the name
691
+ Return the underscored version of the aliased slot name if name is a slot. Prepend ``unknown_`` if the name
688
692
  isn't valid.
689
693
  """
690
694
  slot = self.slot_for(name)
linkml/utils/rawloader.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import copy
2
2
  from datetime import datetime
3
+ from pathlib import Path
3
4
  from typing import Optional, TextIO, Union
4
5
  from urllib.parse import urlparse
5
6
 
@@ -29,7 +30,7 @@ SchemaDefinition.MissingRequiredField = mrf
29
30
 
30
31
 
31
32
  def load_raw_schema(
32
- data: Union[str, dict, TextIO],
33
+ data: Union[str, dict, TextIO, Path],
33
34
  source_file: Optional[str] = None,
34
35
  source_file_date: Optional[str] = None,
35
36
  source_file_size: Optional[int] = None,
@@ -58,6 +59,9 @@ def load_raw_schema(
58
59
  assert source_file_date is None, "source_file_date parameter not allowed if data is a file or URL"
59
60
  assert source_file_size is None, "source_file_size parameter not allowed if data is a file or URL"
60
61
 
62
+ if isinstance(data, Path):
63
+ data = str(data)
64
+
61
65
  # Convert the input into a valid SchemaDefinition
62
66
  if isinstance(data, (str, dict, TextIO)):
63
67
  # TODO: Build a generic loader that detects type from suffix or content and invokes the appropriate loader
@@ -2,6 +2,7 @@ import logging
2
2
  import os
3
3
  from collections import OrderedDict
4
4
  from copy import deepcopy
5
+ from pathlib import Path
5
6
  from typing import Dict, Iterator, List, Mapping, Optional, Set, TextIO, Tuple, Union, cast
6
7
  from urllib.parse import urlparse
7
8
 
@@ -32,7 +33,7 @@ from linkml.utils.schemasynopsis import SchemaSynopsis
32
33
  class SchemaLoader:
33
34
  def __init__(
34
35
  self,
35
- data: Union[str, TextIO, SchemaDefinition, dict],
36
+ data: Union[str, TextIO, SchemaDefinition, dict, Path],
36
37
  base_dir: Optional[str] = None,
37
38
  namespaces: Optional[Namespaces] = None,
38
39
  useuris: Optional[bool] = None,
linkml/utils/sqlutils.py CHANGED
@@ -58,16 +58,22 @@ class SQLStore:
58
58
  - mapping your data/objects in any LinkML compliant data format (json. yaml, rdf) into ORM objects
59
59
  """
60
60
 
61
- schema: Union[str, SchemaDefinition] = None
62
- schemaview: SchemaView = None
63
- engine: Engine = None
64
- database_path: str = None
61
+ schema: Optional[Union[str, Path, SchemaDefinition]] = None
62
+ schemaview: Optional[SchemaView] = None
63
+ engine: Optional[Engine] = None
64
+ database_path: Union[str, Path] = None
65
65
  use_memory: bool = False
66
66
  """https://docs.sqlalchemy.org/en/20/dialects/sqlite.html#using-a-memory-database-in-multiple-threads"""
67
67
 
68
- module: ModuleType = None
69
- native_module: ModuleType = None
70
- include_schema_in_database: bool = None
68
+ module: Optional[ModuleType] = None
69
+ native_module: Optional[ModuleType] = None
70
+ include_schema_in_database: bool = False
71
+
72
+ def __post_init__(self):
73
+ if self.database_path is None and not self.use_memory:
74
+ raise ValueError("Must have database path or use_memory must be True")
75
+ if self.schema is not None and self.schemaview is None:
76
+ self.schemaview = SchemaView(self.schema)
71
77
 
72
78
  def db_exists(self, create=True, force=False) -> Optional[str]:
73
79
  """
@@ -117,8 +123,6 @@ class SQLStore:
117
123
  """
118
124
  gen = SQLAlchemyGenerator(self.schema)
119
125
  self.module = gen.compile_sqla(template=TemplateEnum.DECLARATIVE)
120
- if self.schemaview is None:
121
- self.schemaview = SchemaView(self.schema)
122
126
  return self.module
123
127
 
124
128
  def compile_native(self) -> ModuleType:
@@ -223,7 +227,6 @@ class SQLStore:
223
227
  for n, nu_typ in inspect.getmembers(self.module):
224
228
  # TODO: make more efficient
225
229
  if n == typ.__name__:
226
- # print(f'Creating {nu_typ} from: {inst_args}')
227
230
  nu_obj = nu_typ(**inst_args)
228
231
  return nu_obj
229
232
  raise ValueError(f"Cannot find {typ.__name__} in {self.module}")
@@ -237,8 +240,6 @@ class SQLStore:
237
240
  :param obj: sqla object
238
241
  :return: native dataclass object
239
242
  """
240
- if self.schemaview is None:
241
- self.schemaview = SchemaView(self.schema)
242
243
  typ = type(obj)
243
244
  nm = self.schemaview.class_name_mappings()
244
245
  if typ.__name__ in nm:
@@ -262,9 +263,7 @@ class SQLStore:
262
263
  for n, nu_typ in inspect.getmembers(self.native_module):
263
264
  # TODO: make more efficient
264
265
  if n == typ.__name__:
265
- # print(f'CREATING {nu_typ} FROM {inst_args}')
266
266
  nu_obj = nu_typ(**inst_args)
267
- # print(f'CREATED {nu_obj}')
268
267
  return nu_obj
269
268
  raise ValueError(f"Cannot find {typ.__name__} in {self.native_module}")
270
269
  else:
@@ -34,21 +34,27 @@ class ShaclValidationPlugin(ValidationPlugin):
34
34
  self.closed = closed
35
35
  self.shacl_path = shacl_path
36
36
  self.raise_on_conversion_error = raise_on_conversion_error
37
+ self._loaded_graphs = {}
37
38
 
38
39
  def _shacl_graph(self, context: ValidationContext) -> Optional[rdflib.Graph]:
39
40
  g = rdflib.Graph()
40
41
  if self.shacl_path:
41
42
  g.parse(str(self.shacl_path))
42
43
  else:
43
- gen = ShaclGenerator(context._schema)
44
- g = gen.as_graph()
44
+ schema_hash = hash(str(context._schema))
45
+ if schema_hash in self._loaded_graphs:
46
+ g = self._loaded_graphs[schema_hash]
47
+ else:
48
+ gen = ShaclGenerator(context._schema)
49
+ g = gen.as_graph()
50
+ self._loaded_graphs[schema_hash] = g
45
51
  return g
46
52
 
47
53
  def process(self, instance: Any, context: ValidationContext) -> Iterator[ValidationResult]:
48
- """Perform JSON Schema validation on the provided instance
54
+ """Perform SHACL Schema validation on the provided instance
49
55
 
50
56
  :param instance: The instance to validate
51
- :param context: The validation context which provides a JSON Schema artifact
57
+ :param context: The validation context which provides a SHACL artifact
52
58
  :return: Iterator over validation results
53
59
  :rtype: Iterator[ValidationResult]
54
60
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: linkml
3
- Version: 1.7.6
3
+ Version: 1.7.8
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
@@ -19,12 +19,15 @@ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
22
23
  Classifier: Programming Language :: Python :: 3.8
23
24
  Classifier: Programming Language :: Python :: 3.9
24
25
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
+ Provides-Extra: black
25
27
  Provides-Extra: shacl
26
28
  Provides-Extra: tests
27
29
  Requires-Dist: antlr4-python3-runtime (>=4.9.0,<4.10)
30
+ Requires-Dist: black (>=24.0.0) ; extra == "black" or extra == "tests"
28
31
  Requires-Dist: click (>=7.0)
29
32
  Requires-Dist: graphviz (>=0.10.1)
30
33
  Requires-Dist: hbreader
@@ -33,11 +36,11 @@ Requires-Dist: jinja2 (>=3.1.0)
33
36
  Requires-Dist: jsonasobj2 (>=1.0.3,<2.0.0)
34
37
  Requires-Dist: jsonschema[format] (>=4.0.0)
35
38
  Requires-Dist: linkml-dataops
36
- Requires-Dist: linkml-runtime (>=1.7.0)
39
+ Requires-Dist: linkml-runtime (>=1.7.4)
37
40
  Requires-Dist: openpyxl
38
41
  Requires-Dist: parse
39
42
  Requires-Dist: prefixcommons (>=0.1.7)
40
- Requires-Dist: prefixmaps (>=0.1.3)
43
+ Requires-Dist: prefixmaps (>=0.2.2)
41
44
  Requires-Dist: pydantic (>=1.0.0,<3.0.0)
42
45
  Requires-Dist: pyjsg (>=0.11.6)
43
46
  Requires-Dist: pyshacl (>=0.25.0,<0.26.0) ; extra == "shacl" or extra == "tests"
@@ -48,7 +51,7 @@ Requires-Dist: pyyaml
48
51
  Requires-Dist: rdflib (>=6.0.0)
49
52
  Requires-Dist: requests (>=2.22)
50
53
  Requires-Dist: sqlalchemy (>=1.4.31)
51
- Requires-Dist: typing-extensions (>=4.5.0,<5.0.0) ; python_version == "3.7"
54
+ Requires-Dist: typing-extensions (>=4.4.0) ; python_version < "3.9"
52
55
  Requires-Dist: watchdog (>=0.9.0)
53
56
  Project-URL: Documentation, https://linkml.io/linkml/
54
57
  Project-URL: Repository, https://github.com/linkml/linkml
@@ -1,4 +1,4 @@
1
- linkml/__init__.py,sha256=jwtUdhwmquj-0fCR6VwPH5_RfSpuG94hLWdre_W_FD4,3327
1
+ linkml/__init__.py,sha256=0REu65rXiOk3F1CYLzq60HiSZ2DfFySfGS6QFljZ01s,3663
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
@@ -13,8 +13,8 @@ linkml/generators/docgen/enum.md.jinja2,sha256=mXnUrRkleY2bOTEyAZ5c4pcUnqhs6BNa8
13
13
  linkml/generators/docgen/index.md.jinja2,sha256=wXUYTmayPLFltC0vbGE_Mf6m3GkkWav7FOEjCvEpHp4,1466
14
14
  linkml/generators/docgen/index.tex.jinja2,sha256=Go_EA-_N4JUpbOYbk3OY11mz5yV70VF2l2sMtgIPWw4,501
15
15
  linkml/generators/docgen/schema.md.jinja2,sha256=xlENfnzNRYgPT_0tdqNFxgklVM4Qf5BuzhFVvSMDuxs,70
16
- linkml/generators/docgen/slot.md.jinja2,sha256=HcLu32FiyIRy0AaV-GwBPUwEbTCY-KkPDhOZk3OKfqg,3226
17
- linkml/generators/docgen/subset.md.jinja2,sha256=fTNIpAkml5RKFbbtLore3IAzFN1cISVsyL1ru2-Z4oA,2665
16
+ linkml/generators/docgen/slot.md.jinja2,sha256=ZGa-kaNvi5LknvFRIjKQyRpSynr1SlkLrpEmWDNPwDA,3226
17
+ linkml/generators/docgen/subset.md.jinja2,sha256=EPln_fjlhlkmwEGEp2iPX-9Xm2vVodPZLlRBlYCB_sA,2705
18
18
  linkml/generators/docgen/type.md.jinja2,sha256=QmCMJZrFwP33eHkggBVtypbyrxTb-XZn9vHOYojVaYk,635
19
19
  linkml/generators/docgen.py,sha256=dz7OWxclX306EweVIgC765h3NKtJTRg0TPnqmltWygs,34347
20
20
  linkml/generators/dotgen.py,sha256=kzp1EYtF8bBqOuycJokDmsvHVDVkkW-J-6-MiUhwJH0,5013
@@ -26,24 +26,27 @@ linkml/generators/graphqlgen.py,sha256=6qZpI0rwg3ypsv_KrLVzXgdsJfR8LNPqgMwaRwzwn
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
28
  linkml/generators/javagen.py,sha256=KxwupMztyCRHcSsbtTnOovuj1WamsAny0mxbYWvTiDs,5324
29
- linkml/generators/jsonldcontextgen.py,sha256=048kzs28xooik86A8OQ0NIbXxyJZGkqH1ZMxg17mcf4,8073
30
- linkml/generators/jsonldgen.py,sha256=pk8Gmh2gSvXt_o7MTuJ71thNfIJuHUGkNl3yl3RIdsE,7728
29
+ linkml/generators/jsonldcontextgen.py,sha256=N_XWCx_1eS5KcWlzlyl79C-dW0gfe32v886UskD1iTU,8644
30
+ linkml/generators/jsonldgen.py,sha256=646aQc27CkuxxkDAJHSBcivCDwNAPl7OOT01OBR2AOI,7728
31
31
  linkml/generators/jsonschemagen.py,sha256=XOsYIrpA6BwtAcfh8GNGduIjpuPAsF2f_PQ1mghj_WU,27455
32
32
  linkml/generators/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  linkml/generators/linkmlgen.py,sha256=1_Kt_7rD42WvCTjq0yaq1Of7jEDZR_uusyzAT-qWMHk,3471
34
34
  linkml/generators/markdowngen.py,sha256=dDMyusNXLvM2raIW-_vd2AQBhDHn0P_rMeDq3QFuacs,32926
35
35
  linkml/generators/namespacegen.py,sha256=vVcIyM0zlKd7XRvtdzwTwHjG4Pg49801gy4FUmjJlqQ,6450
36
36
  linkml/generators/oocodegen.py,sha256=r73QI08ajbTZTobc9OIG6BMWZft3zdu76vKVR33pyYg,7774
37
- linkml/generators/owlgen.py,sha256=FMzdiK85CND8wnLiXPmylpayUTGpuydgD_g4hFjyez4,54374
37
+ linkml/generators/owlgen.py,sha256=NqEvuJOUh4ZEe5tVeVol3SHy7zpCagEhso7Q1GLyIqY,54458
38
38
  linkml/generators/plantumlgen.py,sha256=tk-_XJtBA5EqYJSUTc3bdMdCwqlC-rc9VYO9A2V_HpM,14895
39
39
  linkml/generators/prefixmapgen.py,sha256=L9TccwKNHEguW0ox5qgf_GhIuqauYTI8d4jSjeqdkWo,4720
40
40
  linkml/generators/projectgen.py,sha256=OuT_AneoZFNMCn50GllfZafadUHt50u61JcftM2eed4,9750
41
41
  linkml/generators/protogen.py,sha256=5UxThsFDVyDTzzTDh77Z0anx4-tLgz8kQQ-e7ywIqwI,2290
42
42
  linkml/generators/pydanticgen/__init__.py,sha256=uKGaaQSaeKqinHImXGFE448i-t8Oi0No8suIO76sep8,629
43
- linkml/generators/pydanticgen/pydanticgen.py,sha256=ZUi9fE5ZiQbW5V4Ckth8hysMghHh9H2RpqLZa3m8PfQ,27598
44
- linkml/generators/pydanticgen/template.py,sha256=e2PYQFRlDR1Nva_xy-NlsttpW79L8n6e63QKHZzoXH8,17016
43
+ linkml/generators/pydanticgen/array.py,sha256=1QWWgz46yVmWkdNauI6Kjkbx3kexp-l210nOILoHJ18,19506
44
+ linkml/generators/pydanticgen/black.py,sha256=c-Hgaao9hd4nPMU9w0Hmg2j4Wc81IcY0zAfppQPr1cM,721
45
+ linkml/generators/pydanticgen/build.py,sha256=Ia8qy4C16b-KqO_fw4tGQW_Eo4grCVyX7RsuJ3uRTtk,2681
46
+ linkml/generators/pydanticgen/pydanticgen.py,sha256=Gnii-UuKc7gyEpaN5XbRyzWp0v1F5eAUVVzMhFGX2rM,29863
47
+ linkml/generators/pydanticgen/template.py,sha256=fAqRofLm7N94xUqXjkStdmugcxGQfiioGkxdIhLByik,19990
45
48
  linkml/generators/pydanticgen/templates/attribute.py.jinja,sha256=AlH_QFJJkONpzXQRGqnW4ufmjp9s9E7Q9W5r8ykNGeQ,443
46
- linkml/generators/pydanticgen/templates/base_model.py.jinja,sha256=eYKNI-4itB6lYW5yhfIWngtMcHZnuEaic9Dv56XKX4M,797
49
+ linkml/generators/pydanticgen/templates/base_model.py.jinja,sha256=48y64MnC9rjNSV-nKLMeDuHN4gm15UsInhnKxh65zoM,834
47
50
  linkml/generators/pydanticgen/templates/class.py.jinja,sha256=RIdkqdZS9rDILUuVqDIAWK_vATGkirLbPhdHSyHDAbY,565
48
51
  linkml/generators/pydanticgen/templates/conditional_import.py.jinja,sha256=YheknDrxvepiJUzeItSL5aSbAkCdR1k0a6m6aTA4qNM,240
49
52
  linkml/generators/pydanticgen/templates/enum.py.jinja,sha256=572XFQyEMZfL-G_Cj68T-NI_mUnDoFOAVJOGIKu2Hb8,338
@@ -51,19 +54,19 @@ linkml/generators/pydanticgen/templates/footer.py.jinja,sha256=WuWGJjkWDQcEPL2bG
51
54
  linkml/generators/pydanticgen/templates/imports.py.jinja,sha256=d1XFna2eOpkH8cgJML3vXwqGcocczvOcrbg6jjd4kP0,945
52
55
  linkml/generators/pydanticgen/templates/module.py.jinja,sha256=SkmtWtQS7D-xBiZI-sFiYC3WYPKi3VJCj_KtaMVxexM,438
53
56
  linkml/generators/pydanticgen/templates/validator.py.jinja,sha256=Yo4dubQal-HwEoJKztQkLYM5qCz1I8na2oaDlXuEpwU,532
54
- linkml/generators/pythongen.py,sha256=AvOQZJ-OT8lMYeaT2bdexHuRPRfTK7wpbmgAdfc2lW4,52805
55
- linkml/generators/rdfgen.py,sha256=L6F08iDUqVemXXrRbJmcOxvJTt14hR0oo8WLoqf4npw,2656
57
+ linkml/generators/pythongen.py,sha256=4Tw4Zz5GPvvbvk10zrD1yJFdxY3cvXJYqmFKrms8aUs,52915
58
+ linkml/generators/rdfgen.py,sha256=fPhTrMzUM6dkg3HllgD6biuRJl8afIfj7ZWu9e56MKo,2973
56
59
  linkml/generators/shacl/__init__.py,sha256=O-M-wndKw8rMW-U8X3QCNHal-ErXP6uXZqxiQSa77l4,108
57
- linkml/generators/shacl/ifabsent_processor.py,sha256=I7zvSjZzB7tZjcXRE0UE3DUmF5sY7QrKbXblYvpRwkc,1746
60
+ linkml/generators/shacl/ifabsent_processor.py,sha256=kV9BGA2ZPXLRfaFuW0o4jpkATvGggvrqpAo9c1UqWNE,2193
58
61
  linkml/generators/shacl/shacl_data_type.py,sha256=BT3C9tdFyBQnuucPN7YQiFAKEa9yuzy-Q26X6dmOXgo,1827
59
- linkml/generators/shaclgen.py,sha256=mTkHziEIKoMTr-Vl6nwOdqxk-97cJzTsFG7ViMiFhMs,8308
62
+ linkml/generators/shaclgen.py,sha256=P3Kf10a0_1MCk4-prai9rrgPRHnQqtgYoXof0VIVyws,8771
60
63
  linkml/generators/shexgen.py,sha256=KzhaL-A4R4peSdhY6nlDWmS-DPfnZMxMzrXhHGnA_Ag,9874
61
64
  linkml/generators/sparqlgen.py,sha256=c7x8GFChKWprBx4rToSnu9qN8OleWTCenVUdZ8XSTWM,6138
62
65
  linkml/generators/sqlalchemy/__init__.py,sha256=mb9AC1rIFkSiNZhhG0TAk45ol9PjS1XvsrvCjgfVUpQ,249
63
66
  linkml/generators/sqlalchemy/sqlalchemy_declarative_template.py,sha256=X_Ws1NUBikMI5HuNgEhl_PIeWM-B-c2B0W9KUBH4QTg,2542
64
67
  linkml/generators/sqlalchemy/sqlalchemy_imperative_template.py,sha256=u4ZpponG1h6XROrOHGOf_0H2e6xL1_s8twAOA-gx94A,1622
65
- linkml/generators/sqlalchemygen.py,sha256=TTc1oLLwG0c1BdvDXvSfGWAJCDlVvq7Y0r0yjXcdiW4,9268
66
- linkml/generators/sqltablegen.py,sha256=XorqF6lfZX6tHfi6O2aIjd2GU_JZx5BuERuC3P6utVE,11626
68
+ linkml/generators/sqlalchemygen.py,sha256=5J9eQhTz7Ug-7WhZPv6zIaAbf7xlLi-0xMequ67pvgA,9320
69
+ linkml/generators/sqltablegen.py,sha256=87057FJi9EUVPXOjRfHuSqY0lKmepXRNQsose2fGts4,12343
67
70
  linkml/generators/sssomgen.py,sha256=yur3q7so9uwIELWZaZRzkJwNbz_ppBL7IQki9XLIM3k,6879
68
71
  linkml/generators/string_template.md,sha256=kRcfic6entgIaJdpSg6GF3jcjC9wbKsCVM6wVT2qipc,1788
69
72
  linkml/generators/summarygen.py,sha256=crH_Hegd4Z7G7byUtgyXoP2XtG_4iblzZsu_pE4aQrk,2887
@@ -92,7 +95,7 @@ linkml/reporting/model.py,sha256=-10yNfk8wuRC48ZI-akrWvtlJ9a6RYWET2TzlZV3XXo,862
92
95
  linkml/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
96
  linkml/transformers/logical_model_transformer.py,sha256=Luc8cKWIGrRAXQ9DSLA03fgpIolLpsTT19OV9Coolvk,26522
94
97
  linkml/transformers/model_transformer.py,sha256=tK_MpRDI-q2qfe8KHT6qJHP8ZruKjYx1FcM-Fnjse-E,678
95
- linkml/transformers/relmodel_transformer.py,sha256=6tA-GkutJ0rgspjCF2NSCf2z-YdU2b4qPijabkroWfE,17704
98
+ linkml/transformers/relmodel_transformer.py,sha256=aiSI2xaqRz4f0Z_0WFaBP5bknzX0pTnvxsR5mESFysg,18857
96
99
  linkml/transformers/schema_renamer.py,sha256=DYRbgL9j41M9FdbHYLY3u4YIdDM98laD3cv_lHcgWHQ,5275
97
100
  linkml/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
101
  linkml/utils/cli_utils.py,sha256=MdVbox1qr6kDUHUCWAmFhV-D6ebs_nn8vVwB8KDQfew,742
@@ -100,17 +103,17 @@ linkml/utils/converter.py,sha256=snAF-pgZBSi4ANiaKXxqtZk5w3qonJjTfI4X5OVLmUE,628
100
103
  linkml/utils/datautils.py,sha256=QlbzwXykh5Fphfe5KxPo6_ekXfniLbHiEGJtLWjUrvY,3742
101
104
  linkml/utils/datavalidator.py,sha256=kBdWaVi8IZT1bOwEJgJYx-wZAb_PTBObB9nHpYORfKA,472
102
105
  linkml/utils/execute_tutorial.py,sha256=T4kHTSyz3ItJGEUZxVjR-3yLVKnOr5Ix4NMGE47-IuE,6912
103
- linkml/utils/generator.py,sha256=8-5JpMmvkWyLMeK5qSRv3XuOpfAmi2quNQ4Mo6nNCA0,38362
106
+ linkml/utils/generator.py,sha256=ytpcq3s7cJMYpLAcL2H_F-1FWbog3FlUXkylm1It25M,38394
104
107
  linkml/utils/helpers.py,sha256=yR8n4zFA5wPcYC7xzRuNF3wO16vG80v6j7DM3qTNmIc,447
105
108
  linkml/utils/ifabsent_functions.py,sha256=IkcBcmRYu8sllx7_mTCqu4aHfTxX2AnQoccZ1KOODds,5843
106
109
  linkml/utils/logictools.py,sha256=GSmBiobC49TcQjE08RtXEE3JwJEOV7eEREio25uJiFs,21184
107
110
  linkml/utils/mergeutils.py,sha256=QVm2iQB4v_L2rSvPBsPe9C865R03BgV3TzlPoTTTwWQ,9044
108
- linkml/utils/rawloader.py,sha256=QB7Rdvy4o4ZJEWBWa2_2xzz2TOh_6Oe4slvUn8IBVIc,4329
111
+ linkml/utils/rawloader.py,sha256=nUB8Gfn8yEVwyo6bx0TtB2mBGkilC-fybi0xvQ73Gks,4417
109
112
  linkml/utils/schema_builder.py,sha256=4qhrur8O0xRZnPm7H1h2BZmTkut5R4q-IE_1KKiHy_c,9937
110
113
  linkml/utils/schema_fixer.py,sha256=Uz8M3AOQ_BputJr1f6lbfk1iyvmANUNG80-0B3BQKJ8,16761
111
- linkml/utils/schemaloader.py,sha256=XkH3ARPVcJ3ggnk4qgHJBPepyII4UlSRHzBlTWZbpCo,46062
114
+ linkml/utils/schemaloader.py,sha256=5fLM99v6RZ0OW4JHA0UAd_mtS_2HNubXAjlF5v8vHcw,46093
112
115
  linkml/utils/schemasynopsis.py,sha256=jKf5ZJxpNgSZ5x9oAcdGO3m1IwzcIU2Ni1ugm0SQq1g,18447
113
- linkml/utils/sqlutils.py,sha256=FsOC3Wut6qzzmsnIt9ROsiDt2wXOa1IZUUtJ_T4Nb6M,17071
116
+ linkml/utils/sqlutils.py,sha256=Cwoaz44MLcvAGUEBshT4jtn0Z3w7jVOp85zGkd6FTHY,17071
114
117
  linkml/utils/typereferences.py,sha256=8Yfuz9-HAwOPoJLbIcO_sY9zf32hvPRzGeSOzECfMWA,2232
115
118
  linkml/utils/validation.py,sha256=eLw1-d8x3N1V14bSc6H_mJJXo59ryKvvUIBcOJ1dVMw,1438
116
119
  linkml/validator/__init__.py,sha256=djKc1IyxGKvVYaX5jSxsqjfcEYaw3rFgKbFJxI2wDNk,5002
@@ -125,7 +128,7 @@ linkml/validator/plugins/__init__.py,sha256=F7Un7bfdpSRXvk8LTb7Z4Q22rCtJJKjNkqUf
125
128
  linkml/validator/plugins/jsonschema_validation_plugin.py,sha256=hMPlCyAdMg_N_OHiHMaxcG0fsOA50V4oBNqorNz_oqE,2528
126
129
  linkml/validator/plugins/pydantic_validation_plugin.py,sha256=C-Vp74bz5oqp5V-iuhXW8p0PPDoFY8NCU5x36Ur5Og4,1985
127
130
  linkml/validator/plugins/recommended_slots_plugin.py,sha256=kOdoYQyye47nLA7BjorVmydS84nGpiVy3MoCbPq1Ymo,2308
128
- linkml/validator/plugins/shacl_validation_plugin.py,sha256=A6x3tiX-p03_i_VmR2xnw28j0dpiUw6WIAG-gllwJ8Q,3624
131
+ linkml/validator/plugins/shacl_validation_plugin.py,sha256=X6h1O54m9P5USvqCvNqELD0YpzXkE6UrmxnV0ukU6E4,3888
129
132
  linkml/validator/plugins/validation_plugin.py,sha256=9SMHF8b2bgG9-8351e8bY676e0A4aEBJSXvMjMF5kXg,1548
130
133
  linkml/validator/report.py,sha256=kkkuh-IZF9--cO-2wGjwP3PDLvOcjjvC8AOlxXUIOAM,870
131
134
  linkml/validator/validation_context.py,sha256=Pmccq-LQ9iEeLyZhamp3mKjjtwp4ji1hIe5TT05AUT4,2732
@@ -138,8 +141,8 @@ linkml/workspaces/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
138
141
  linkml/workspaces/datamodel/workspaces.py,sha256=4HdkqweGNfMPqnB1_Onc9DcTfkhoagTRcqruh08nRoI,14905
139
142
  linkml/workspaces/datamodel/workspaces.yaml,sha256=EjVrwPpeRZqJRjuGyyDRxxFzuv55SiLIXPBRUG6HStU,4233
140
143
  linkml/workspaces/example_runner.py,sha256=OmC_yZLIb4KXGQrstBVZL0UAQ9ZAaraguQF0RSf-snk,11611
141
- linkml-1.7.6.dist-info/entry_points.txt,sha256=7haDkIbyC7ZLhm5z-e3BhrLJpY2xoW1yuD8Y7QPNtVg,2093
142
- linkml-1.7.6.dist-info/METADATA,sha256=PaI8ylnY-nUYjDrS-44yWh-r6UsiLNLQ_cYYDBNZHX8,3588
143
- linkml-1.7.6.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
144
- linkml-1.7.6.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
145
- linkml-1.7.6.dist-info/RECORD,,
144
+ linkml-1.7.8.dist-info/METADATA,sha256=7Nrt0dXBtqeom1Q3W5wGtdrLzzEcIhoURNoTaZfRyiY,3724
145
+ linkml-1.7.8.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
146
+ linkml-1.7.8.dist-info/entry_points.txt,sha256=7haDkIbyC7ZLhm5z-e3BhrLJpY2xoW1yuD8Y7QPNtVg,2093
147
+ linkml-1.7.8.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
148
+ linkml-1.7.8.dist-info/RECORD,,
File without changes