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.
@@ -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) }} --|> {{ s.range }} : {{ gen.name(s) }}
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) }} --|> {{ s.range }} : {{ gen.name(s) }}
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) }} --|> {{ s.range }} : {{ gen.name(s) }}
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) }} --|> {{ s.range }} : {{ gen.name(s) }}
55
+ {{ gen.name(element) }} --> {{ s.range }} : {{ gen.name(s) }}
56
56
  {% endif %}
57
57
  {% endfor %}
58
58
  ```
@@ -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
- uml_class_diagram = "uml_class_diagram"
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.uml_class_diagram.value:
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
 
@@ -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
- constraint.valueExpr = self._class_or_type_uri(slot.range)
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.all_class().keys():
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.all_class():
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.all_class().keys() if cn not in refs]
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.all_class():
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]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: linkml
3
- Version: 1.6.8
3
+ Version: 1.6.9
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
@@ -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=05Kbl83ApOMzA7gZeRJjPU7jkZHCIsaKN1BYWNMRTfM,3275
10
- linkml/generators/docgen/class_diagram.md.jinja2,sha256=ShRhNnIae54Y_4zrfXuIF6BjX8oCHRZJnovE8G1fjOU,2542
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=zsLzbXN2t9pafQubEnb7QshufMKBMqUWjdLE1OyFyq8,33296
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=Awtn5SyjS-TUcVCwMdT0F7hNO4K8VcSCYBaFru45Mwg,8994
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=RpZYyR_Re0E7yh1fifvQVJagi8KvLDaseF3Zgs2E3uw,4254
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=2XWM9LBSVp8v3SwIZECrX3SjDUYzdnP-syjp6YdL89E,3734
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.8.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
128
- linkml-1.6.8.dist-info/LICENSE,sha256=kORMoywK6j9_iy0UvLR-a80P1Rvc9AOM4gsKlUNZABg,535
129
- linkml-1.6.8.dist-info/entry_points.txt,sha256=za8r49Z5gcz3rAYTZLbxw5EPZr1rGuxSe1uiRUpf8R0,2143
130
- linkml-1.6.8.dist-info/METADATA,sha256=AnOhJfXSxtF9U1R0uUcrEIyf21cT4voTXlmC77iI7eM,3446
131
- linkml-1.6.8.dist-info/RECORD,,
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