linkml 1.6.8__py3-none-any.whl → 1.6.9__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.
- linkml/generators/docgen/class.md.jinja2 +4 -0
- linkml/generators/docgen/class_diagram.md.jinja2 +4 -4
- linkml/generators/docgen.py +9 -2
- linkml/generators/shexgen.py +19 -1
- linkml/linter/cli.py +6 -2
- linkml/utils/datautils.py +4 -4
- {linkml-1.6.8.dist-info → linkml-1.6.9.dist-info}/METADATA +1 -1
- {linkml-1.6.8.dist-info → linkml-1.6.9.dist-info}/RECORD +11 -11
- {linkml-1.6.8.dist-info → linkml-1.6.9.dist-info}/LICENSE +0 -0
- {linkml-1.6.8.dist-info → linkml-1.6.9.dist-info}/WHEEL +0 -0
- {linkml-1.6.8.dist-info → linkml-1.6.9.dist-info}/entry_points.txt +0 -0
@@ -33,6 +33,10 @@ URI: {{ gen.uri_link(element) }}
|
|
33
33
|
```{{ gen.mermaid_directive() }}
|
34
34
|
{{ gen.mermaid_diagram([element.name]) }}
|
35
35
|
```
|
36
|
+
{% elif diagram_type == "plantuml_class_diagram" %}
|
37
|
+
```puml
|
38
|
+
{{ gen.mermaid_diagram([element.name]) }}
|
39
|
+
```
|
36
40
|
{% else %}
|
37
41
|
{% include "class_diagram.md.jinja2" %}
|
38
42
|
{% endif %}
|
@@ -13,7 +13,7 @@
|
|
13
13
|
{% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}
|
14
14
|
{{ gen.name(element) }} : {{gen.name(s)}}
|
15
15
|
{% if s.range not in gen.all_type_object_names() %}
|
16
|
-
{{ gen.name(element) }}
|
16
|
+
{{ gen.name(element) }} --> {{ s.range }} : {{ gen.name(s) }}
|
17
17
|
{% endif %}
|
18
18
|
{% endfor %}
|
19
19
|
```
|
@@ -27,7 +27,7 @@
|
|
27
27
|
{% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}
|
28
28
|
{{ gen.name(element) }} : {{gen.name(s)}}
|
29
29
|
{% if s.range not in gen.all_type_object_names() %}
|
30
|
-
{{ gen.name(element) }}
|
30
|
+
{{ gen.name(element) }} --> {{ s.range }} : {{ gen.name(s) }}
|
31
31
|
{% endif %}
|
32
32
|
{% endfor %}
|
33
33
|
```
|
@@ -41,7 +41,7 @@
|
|
41
41
|
{% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}
|
42
42
|
{{ gen.name(element) }} : {{gen.name(s)}}
|
43
43
|
{% if s.range not in gen.all_type_object_names() %}
|
44
|
-
{{ gen.name(element) }}
|
44
|
+
{{ gen.name(element) }} --> {{ s.range }} : {{ gen.name(s) }}
|
45
45
|
{% endif %}
|
46
46
|
{% endfor %}
|
47
47
|
```
|
@@ -52,7 +52,7 @@
|
|
52
52
|
{% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}
|
53
53
|
{{ gen.name(element) }} : {{gen.name(s)}}
|
54
54
|
{% if s.range not in gen.all_type_object_names() %}
|
55
|
-
{{ gen.name(element) }}
|
55
|
+
{{ gen.name(element) }} --> {{ s.range }} : {{ gen.name(s) }}
|
56
56
|
{% endif %}
|
57
57
|
{% endfor %}
|
58
58
|
```
|
linkml/generators/docgen.py
CHANGED
@@ -28,6 +28,7 @@ from linkml_runtime.utils.schemaview import SchemaView
|
|
28
28
|
|
29
29
|
from linkml._version import __version__
|
30
30
|
from linkml.generators.erdiagramgen import ERDiagramGenerator
|
31
|
+
from linkml.generators.plantumlgen import PlantumlGenerator
|
31
32
|
from linkml.utils.generator import Generator, shared_arguments
|
32
33
|
from linkml.workspaces.example_runner import ExampleRunner
|
33
34
|
|
@@ -38,7 +39,8 @@ class MarkdownDialect(Enum):
|
|
38
39
|
|
39
40
|
|
40
41
|
class DiagramType(Enum):
|
41
|
-
|
42
|
+
mermaid_class_diagram = "mermaid_class_diagram"
|
43
|
+
plantuml_class_diagram = "plantuml_class_diagram"
|
42
44
|
er_diagram = "er_diagram"
|
43
45
|
|
44
46
|
|
@@ -593,8 +595,13 @@ class DocGenerator(Generator):
|
|
593
595
|
return erdgen.serialize_classes(class_names, follow_references=True, max_hops=2)
|
594
596
|
else:
|
595
597
|
return erdgen.serialize()
|
596
|
-
elif self.diagram_type.value == DiagramType.
|
598
|
+
elif self.diagram_type.value == DiagramType.mermaid_class_diagram.value:
|
597
599
|
self.logger.info("This is currently handled in the jinja templates")
|
600
|
+
elif self.diagram_type.value == DiagramType.plantuml_class_diagram.value:
|
601
|
+
plantumlgen = PlantumlGenerator(self.schema)
|
602
|
+
plantuml_diagram = plantumlgen.serialize(classes=class_names)
|
603
|
+
self.logger.debug(f"Created PlantUML diagram for class: {class_names}")
|
604
|
+
return plantuml_diagram
|
598
605
|
else:
|
599
606
|
raise NotImplementedError(f"Diagram type {self.diagram_type} not implemented")
|
600
607
|
|
linkml/generators/shexgen.py
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
"""
|
4
4
|
import os
|
5
|
+
import urllib.parse as urlparse
|
5
6
|
from dataclasses import dataclass, field
|
6
7
|
from typing import List, Optional, Union
|
7
8
|
|
@@ -139,7 +140,24 @@ class ShExGenerator(Generator):
|
|
139
140
|
constraint.predicate = self.namespaces.uri_for(slot.slot_uri)
|
140
141
|
constraint.min = int(bool(slot.required))
|
141
142
|
constraint.max = 1 if not slot.multivalued else -1
|
142
|
-
|
143
|
+
if slot.range in self.schema.enums:
|
144
|
+
# Handle permissible values from enums
|
145
|
+
enum = self.schema.enums[slot.range]
|
146
|
+
values = []
|
147
|
+
for value in enum.permissible_values.values():
|
148
|
+
if value.meaning:
|
149
|
+
values.append(self.namespaces.uri_for(value.meaning))
|
150
|
+
else:
|
151
|
+
value_uri = f"{self._class_or_type_uri(enum.name)}#{urlparse.quote(value.text)}"
|
152
|
+
values.append(value_uri)
|
153
|
+
if values:
|
154
|
+
node_constraint = NodeConstraint(
|
155
|
+
# id=self._class_or_type_uri(slot.range),
|
156
|
+
values=values,
|
157
|
+
)
|
158
|
+
constraint.valueExpr = node_constraint
|
159
|
+
else:
|
160
|
+
constraint.valueExpr = self._class_or_type_uri(slot.range)
|
143
161
|
|
144
162
|
def end_schema(self, output: Optional[str] = None, **_) -> None:
|
145
163
|
self.shex.shapes = self.shapes if self.shapes else [Shape()]
|
linkml/linter/cli.py
CHANGED
@@ -16,7 +16,7 @@ YAML_SUFFIXES = [".yml", ".yaml"]
|
|
16
16
|
DEFAULT_CONFIG_FILES = [".linkmllint.yaml", ".linkmllint.yml"]
|
17
17
|
|
18
18
|
|
19
|
-
def get_yaml_files(root: Path) -> Iterable[str]:
|
19
|
+
def get_yaml_files(root: Path, accept_dot_files: bool) -> Iterable[str]:
|
20
20
|
if root.is_file():
|
21
21
|
if root.suffix not in YAML_SUFFIXES:
|
22
22
|
raise click.UsageError("SCHEMA must be a YAML file")
|
@@ -26,6 +26,8 @@ def get_yaml_files(root: Path) -> Iterable[str]:
|
|
26
26
|
for file in files:
|
27
27
|
if file in DEFAULT_CONFIG_FILES:
|
28
28
|
continue
|
29
|
+
if file.startswith(".") and not accept_dot_files:
|
30
|
+
continue
|
29
31
|
path = Path(dir, file)
|
30
32
|
if path.suffix in YAML_SUFFIXES:
|
31
33
|
yield str(path)
|
@@ -36,6 +38,7 @@ def get_yaml_files(root: Path) -> Iterable[str]:
|
|
36
38
|
"schema",
|
37
39
|
type=click.Path(exists=True, dir_okay=True, file_okay=True, resolve_path=True, path_type=Path),
|
38
40
|
)
|
41
|
+
@click.option("-a", "--all", is_flag=True, default=False, help="Process files that start with '.'.")
|
39
42
|
@click.option(
|
40
43
|
"-c",
|
41
44
|
"--config",
|
@@ -82,6 +85,7 @@ def get_yaml_files(root: Path) -> Iterable[str]:
|
|
82
85
|
def main(
|
83
86
|
schema: Path,
|
84
87
|
fix: bool,
|
88
|
+
all: bool,
|
85
89
|
config: str,
|
86
90
|
format: str,
|
87
91
|
validate: bool,
|
@@ -124,7 +128,7 @@ def main(
|
|
124
128
|
error_count = 0
|
125
129
|
warning_count = 0
|
126
130
|
formatter.start_report()
|
127
|
-
for path in get_yaml_files(schema):
|
131
|
+
for path in get_yaml_files(schema, all):
|
128
132
|
formatter.start_schema(path)
|
129
133
|
report = linter.lint(path, fix=fix, validate_schema=validate, validate_only=validate_only)
|
130
134
|
for problem in report:
|
linkml/utils/datautils.py
CHANGED
@@ -79,14 +79,14 @@ def infer_root_class(sv: SchemaView) -> Optional[ClassDefinitionName]:
|
|
79
79
|
if c.tree_root:
|
80
80
|
return c.name
|
81
81
|
refs = defaultdict(int)
|
82
|
-
for cn in sv.
|
82
|
+
for cn in sv.all_classes().keys():
|
83
83
|
for sn in sv.class_slots(cn):
|
84
84
|
slot = sv.induced_slot(sn, cn)
|
85
85
|
r = slot.range
|
86
|
-
if r in sv.
|
86
|
+
if r in sv.all_classes():
|
87
87
|
for a in sv.class_ancestors(r):
|
88
88
|
refs[a] += 1
|
89
|
-
candidates = [cn for cn in sv.
|
89
|
+
candidates = [cn for cn in sv.all_classes().keys() if cn not in refs]
|
90
90
|
|
91
91
|
# throw Exception if unambiguous root cannot be inferred
|
92
92
|
if len(candidates) > 1:
|
@@ -106,7 +106,7 @@ def infer_index_slot(sv: SchemaView, root_class: ClassDefinitionName) -> Optiona
|
|
106
106
|
index_slots = []
|
107
107
|
for sn in sv.class_slots(root_class):
|
108
108
|
slot = sv.induced_slot(sn, root_class)
|
109
|
-
if slot.multivalued and slot.range in sv.
|
109
|
+
if slot.multivalued and slot.range in sv.all_classes():
|
110
110
|
index_slots.append(sn)
|
111
111
|
if len(index_slots) == 1:
|
112
112
|
return index_slots[0]
|
@@ -6,8 +6,8 @@ linkml/generators/__init__.py,sha256=qa22iTeBrcds6ndst_iTPVWLQtBF6NGyhVngBhbhIpc
|
|
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
8
|
linkml/generators/csvgen.py,sha256=h-Mj-uNrzuETx_G3dW6eFbk1jj0NHSwqbehqR5tA6PM,2955
|
9
|
-
linkml/generators/docgen/class.md.jinja2,sha256=
|
10
|
-
linkml/generators/docgen/class_diagram.md.jinja2,sha256=
|
9
|
+
linkml/generators/docgen/class.md.jinja2,sha256=_nQr8ge57ZkX3Hrh-cqPUm8Z7HCnJuuRCgYm0g21mS8,3381
|
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
|
12
12
|
linkml/generators/docgen/enum.md.jinja2,sha256=mXnUrRkleY2bOTEyAZ5c4pcUnqhs6BNa8a-4LVve-eo,1014
|
13
13
|
linkml/generators/docgen/index.md.jinja2,sha256=wXUYTmayPLFltC0vbGE_Mf6m3GkkWav7FOEjCvEpHp4,1466
|
@@ -16,7 +16,7 @@ linkml/generators/docgen/schema.md.jinja2,sha256=xlENfnzNRYgPT_0tdqNFxgklVM4Qf5B
|
|
16
16
|
linkml/generators/docgen/slot.md.jinja2,sha256=XVd0M4gKx9Q2fONcsUGBRj_bJivyN4P9jhj9IO496jQ,2817
|
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
|
-
linkml/generators/docgen.py,sha256=
|
19
|
+
linkml/generators/docgen.py,sha256=Kwg4ZIXL2e9G-q-_CUoj8Bgnpyyvvh5fKPnseDcTK04,33755
|
20
20
|
linkml/generators/dotgen.py,sha256=CnbVY6CO1OMuiYXYnvxgNN2IW1mtOQW-J-QnwZlXkUI,5012
|
21
21
|
linkml/generators/erdiagramgen.py,sha256=Gu-_nhLuEPTsYYaoV6tNS1V6cZ2dNJdm6YwxC0VGl7g,10315
|
22
22
|
linkml/generators/excelgen.py,sha256=OhVzuQaDESYpAGR8Zv13hiWlDDJA8ugtSZatBJH0hzA,7737
|
@@ -43,7 +43,7 @@ linkml/generators/pydanticgen.py,sha256=Ak0bpRoQsirnnBd091NiJvMZ-2d0qaQbhxADHy5o
|
|
43
43
|
linkml/generators/pythongen.py,sha256=yGYlRJ4rNm2QQLFDjyuUnqCyKlzz-b3eSOhkSu8aCwI,52491
|
44
44
|
linkml/generators/rdfgen.py,sha256=LxzYBaFEkV7rlf54nWv_6H6AGcWMRXwkaeVXq9VYEc8,2693
|
45
45
|
linkml/generators/shaclgen.py,sha256=KxNmDZW2ciCuSqUhJ65TxLTjF8jME1FmN5SaWJCuW9k,8662
|
46
|
-
linkml/generators/shexgen.py,sha256=
|
46
|
+
linkml/generators/shexgen.py,sha256=E-R8jg5Z3JzzsVAIPu6Fs9FtFF7k-I5-5vMwG1jGW2U,9858
|
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
|
@@ -59,7 +59,7 @@ linkml/generators/typescriptgen.py,sha256=VDJ-97jk7zqYx6XlnIcxZmY8mCv885T7D2brKJ
|
|
59
59
|
linkml/generators/yamlgen.py,sha256=bI4ebWe8vebR3xGVgto5TH0ZDej-RlZPTYqJ26BxKpg,1651
|
60
60
|
linkml/generators/yumlgen.py,sha256=547atFkqJd9WtL_LdR-tUME9g7lWaFa3yHFvpnX6J1E,12145
|
61
61
|
linkml/linter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
|
-
linkml/linter/cli.py,sha256=
|
62
|
+
linkml/linter/cli.py,sha256=BpQiETcRfQlZsI1-JALyU9wXPgPOm_KE_n11p0iJaC8,4494
|
63
63
|
linkml/linter/config/datamodel/.linkmllint.yaml,sha256=40rNhcL35FXQSjlVBMWnyPgplwEUqFT_sJmeZqUzxMw,292
|
64
64
|
linkml/linter/config/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
65
|
linkml/linter/config/datamodel/config.py,sha256=4HtqHF2ZiYx0Izm50eUQRvygsm1xSnkc49w0nd9zbGk,16837
|
@@ -84,7 +84,7 @@ linkml/transformers/schema_renamer.py,sha256=Cr18TyktX64b5iFh5V6R_ILPVzXjbDYVDDZ
|
|
84
84
|
linkml/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
85
85
|
linkml/utils/cli_utils.py,sha256=MdVbox1qr6kDUHUCWAmFhV-D6ebs_nn8vVwB8KDQfew,742
|
86
86
|
linkml/utils/converter.py,sha256=rdhCI7Tsjddr3o1rVBfMq5gQubk_GE6fqlBBmyxI5_M,6270
|
87
|
-
linkml/utils/datautils.py,sha256=
|
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
90
|
linkml/utils/generator.py,sha256=WAlP_gfZfAZYNklsh8l4GtiWZ338kjLg7xpQAANgUNg,38217
|
@@ -124,8 +124,8 @@ linkml/workspaces/datamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
124
124
|
linkml/workspaces/datamodel/workspaces.py,sha256=4HdkqweGNfMPqnB1_Onc9DcTfkhoagTRcqruh08nRoI,14905
|
125
125
|
linkml/workspaces/datamodel/workspaces.yaml,sha256=EjVrwPpeRZqJRjuGyyDRxxFzuv55SiLIXPBRUG6HStU,4233
|
126
126
|
linkml/workspaces/example_runner.py,sha256=uumXyPZ7xUJSZyRtjDP4TCCxgKSSOfebpufXc0_l0jY,11610
|
127
|
-
linkml-1.6.
|
128
|
-
linkml-1.6.
|
129
|
-
linkml-1.6.
|
130
|
-
linkml-1.6.
|
131
|
-
linkml-1.6.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|