cmem-cmemc 24.3.0rc2__py3-none-any.whl → 24.3.3__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.
cmem_cmemc/__init__.py CHANGED
@@ -95,7 +95,7 @@ def cli(
95
95
 
96
96
  https://eccenca.com/go/cmemc
97
97
 
98
- cmemc is © 2024 eccenca GmbH, licensed under the Apache License 2.0.
98
+ cmemc is © 2025 eccenca GmbH, licensed under the Apache License 2.0.
99
99
  """
100
100
  ctx.obj = CONTEXT
101
101
  # hidden feature: 'CMEMC_MANUAL=true cmemc -q config list' will output
@@ -6,14 +6,12 @@ import io
6
6
  import json
7
7
  import mimetypes
8
8
  import os
9
- from json import JSONDecodeError
10
9
  from xml.dom import minidom # nosec
11
10
  from xml.etree.ElementTree import ( # nosec
12
11
  Element,
13
12
  SubElement,
14
13
  tostring,
15
14
  )
16
- from xml.sax import SAXParseException
17
15
 
18
16
  import click
19
17
  from click import Argument
@@ -23,9 +21,6 @@ from cmem.cmempy.dp.proxy import graph as graph_api
23
21
  from cmem.cmempy.dp.proxy.graph import get_graph_import_tree, get_graph_imports
24
22
  from cmem.cmempy.dp.proxy.sparql import get as sparql_api
25
23
  from jinja2 import Template
26
- from rdflib import Graph
27
- from rdflib.exceptions import ParserError
28
- from rdflib.plugins.parsers.notation3 import BadSyntax
29
24
  from six.moves.urllib.parse import quote
30
25
  from treelib import Tree
31
26
 
@@ -35,7 +30,7 @@ from cmem_cmemc.command_group import CmemcGroup
35
30
  from cmem_cmemc.commands.validation import validation_group
36
31
  from cmem_cmemc.context import ApplicationContext
37
32
  from cmem_cmemc.parameter_types.path import ClickSmartPath
38
- from cmem_cmemc.smart_path import SmartPath as Path
33
+ from cmem_cmemc.smart_path import SmartPath
39
34
  from cmem_cmemc.utils import (
40
35
  convert_uri_to_filename,
41
36
  get_graphs,
@@ -75,7 +70,7 @@ def _get_graph_to_file( # noqa: PLR0913
75
70
 
76
71
  numbers is a tuple of current and count (for output only).
77
72
  """
78
- if Path(file_path).exists():
73
+ if SmartPath(file_path).exists():
79
74
  if overwrite is True:
80
75
  app.echo_warning(f"Output file {file_path} does exist: will overwrite it.")
81
76
  else:
@@ -309,7 +304,7 @@ def _create_xml_catalog_file(app: ApplicationContext, names: dict, output_dir: s
309
304
  output_dir: path where to create the XML file
310
305
 
311
306
  """
312
- file_name = Path(output_dir) / "catalog-v001.xml"
307
+ file_name = SmartPath(output_dir) / "catalog-v001.xml"
313
308
  catalog = Element("catalog")
314
309
  catalog.set("prefer", "public")
315
310
  catalog.set("xmlns", "urn:oasis:names:tc:entity:xmlns:xml:catalog")
@@ -601,16 +596,16 @@ def export_command( # noqa: PLR0913
601
596
  )
602
597
  _graph_file_names = _get_export_names(app, iris, template, f"{extension}.graph")
603
598
  # create directory
604
- if not Path(output_dir).exists():
599
+ if not SmartPath(output_dir).exists():
605
600
  app.echo_warning("Output directory does not exist: " + "will create it.")
606
- Path(output_dir).mkdir(parents=True)
601
+ SmartPath(output_dir).mkdir(parents=True)
607
602
  # one .graph, one .ttl file per named graph
608
603
  for current, iri in enumerate(iris, start=1):
609
604
  # join with given output directory and normalize full path
610
- triple_file_name = os.path.normpath(Path(output_dir) / _names[iri])
611
- graph_file_name = os.path.normpath(Path(output_dir) / _graph_file_names[iri])
605
+ triple_file_name = os.path.normpath(SmartPath(output_dir) / _names[iri])
606
+ graph_file_name = os.path.normpath(SmartPath(output_dir) / _graph_file_names[iri])
612
607
  # output directory is created lazy
613
- Path(triple_file_name).parent.mkdir(parents=True, exist_ok=True)
608
+ SmartPath(triple_file_name).parent.mkdir(parents=True, exist_ok=True)
614
609
  # create and write the .ttl.graph metadata file
615
610
  graph_file = click.open_file(graph_file_name, "w")
616
611
  graph_file.write(iri + "\n")
@@ -673,50 +668,42 @@ def validate_input_path(input_path: str) -> None:
673
668
  def _get_graph_supported_formats() -> dict[str, str]:
674
669
  return {
675
670
  "application/rdf+xml": "xml",
676
- "application/ld+json": "json-ld",
671
+ "application/ld+json": "jsonld",
677
672
  "text/turtle": "turtle",
678
673
  "application/n-triples": "nt",
679
674
  }
680
675
 
681
676
 
682
- def _guess_rdf_mime_type(content: str) -> str:
683
- formats = _get_graph_supported_formats()
684
- for mime_type, rdf_format in formats.items():
685
- try:
686
- g = Graph()
687
- g.parse(data=content, format=rdf_format)
688
- except (SAXParseException, JSONDecodeError, BadSyntax, ParserError):
689
- continue
690
- else:
691
- return mime_type
692
- raise ValueError("Unknown format")
693
-
677
+ def _get_buffer_and_content_type(
678
+ triple_file: str, app: ApplicationContext
679
+ ) -> tuple[io.BytesIO, str]:
680
+ """Get the io.BytesIO buffer and the content type of triple_file"""
681
+ smart_file = SmartPath(triple_file)
682
+ content_type, encoding = mimetypes.guess_type(triple_file)
683
+ if content_type is None:
684
+ content_type = "text/turtle"
685
+ for supported_type, supported_suffix in _get_graph_supported_formats().items():
686
+ if smart_file.name.endswith(f".{supported_suffix}") or smart_file.name.endswith(
687
+ f".{supported_suffix}.gz"
688
+ ):
689
+ content_type = supported_type
690
+ elif content_type not in _get_graph_supported_formats():
691
+ app.echo_warning(
692
+ f"Content type {content_type} of {triple_file} is "
693
+ f"not one of {', '.join(_get_graph_supported_formats().keys())} "
694
+ "(but will try to import anyways)."
695
+ )
694
696
 
695
- def _parse_triple_file(triple_file: str) -> tuple[io.BytesIO, str]:
696
- """Parse the content of the triple file."""
697
- buffer = io.BytesIO()
698
697
  transport_params = {}
699
-
700
- if Path(str(triple_file)).schema in ["http", "https"]:
698
+ if smart_file.schema in ["http", "https"]:
701
699
  transport_params["headers"] = {
702
700
  "Accept": "text/turtle; q=1.0, application/x-turtle; q=0.9, text/n3;"
703
701
  " q=0.8, application/rdf+xml; q=0.5, text/plain; q=0.1"
704
702
  }
705
703
 
704
+ buffer = io.BytesIO()
706
705
  with ClickSmartPath.open(triple_file, transport_params=transport_params) as file_obj:
707
706
  buffer.write(file_obj.read())
708
-
709
- buffer.seek(0)
710
- is_gzip = buffer.read(2) == b"\x1f\x8b"
711
- buffer.seek(0)
712
-
713
- if is_gzip:
714
- with gzip.GzipFile(fileobj=buffer, mode="rb") as gzip_file:
715
- graph_content = gzip_file.read().decode("utf-8")
716
- else:
717
- graph_content = buffer.read().decode("utf-8")
718
-
719
- content_type = _guess_rdf_mime_type(graph_content)
720
707
  buffer.seek(0)
721
708
  return buffer, content_type
722
709
 
@@ -748,7 +735,7 @@ def import_command(
748
735
  input_path: str,
749
736
  replace: bool,
750
737
  skip_existing: bool,
751
- iri: tuple[str, ...],
738
+ iri: str,
752
739
  ) -> None:
753
740
  """Import graph(s) to the store.
754
741
 
@@ -767,14 +754,14 @@ def import_command(
767
754
 
768
755
  Note: Directories are scanned on the first level only (not recursively).
769
756
  """
770
- # is an array of tuples like this [('path/to/triple.file', 'graph IRI')]
771
757
  if replace and skip_existing:
772
758
  raise ValueError(
773
759
  "The options --replace and --skip-existing are mutually "
774
760
  "exclusive, so please remove one of them."
775
761
  )
776
- graphs: list
777
- if Path(input_path).is_dir():
762
+ # is an array of tuples like this [('path/to/triple.file', 'graph IRI')]
763
+ graphs: list[tuple[str, str]]
764
+ if SmartPath(input_path).is_dir():
778
765
  validate_input_path(input_path)
779
766
  if iri is None:
780
767
  # in case a directory is the source (and no IRI is given),
@@ -785,10 +772,12 @@ def import_command(
785
772
  graphs = []
786
773
  for _ in _get_graph_supported_formats():
787
774
  extension = mimetypes.guess_extension(_)
788
- graphs += [(file, iri) for file in Path(input_path).glob(f"*{extension}")]
789
- graphs += [(file, iri) for file in Path(input_path).glob(f"*{extension}.gz")]
775
+ graphs += [(str(file), iri) for file in SmartPath(input_path).glob(f"*{extension}")]
776
+ graphs += [
777
+ (str(file), iri) for file in SmartPath(input_path).glob(f"*{extension}.gz")
778
+ ]
790
779
 
791
- elif Path(input_path).is_file():
780
+ elif SmartPath(input_path).is_file():
792
781
  if iri is None:
793
782
  raise ValueError(
794
783
  "Either specify an input file AND a graph IRI or an input directory ONLY."
@@ -812,7 +801,7 @@ def import_command(
812
801
  continue
813
802
  # prevents re-replacing of graphs in a single run
814
803
  _replace = False if graph_iri in processed_graphs else replace
815
- _buffer, content_type = _parse_triple_file(triple_file)
804
+ _buffer, content_type = _get_buffer_and_content_type(triple_file, app)
816
805
  response = graph_api.post_streamed(
817
806
  graph_iri, _buffer, replace=_replace, content_type=content_type
818
807
  )
@@ -21,6 +21,7 @@ from cmem_cmemc.migrations.shapes_widget_integrations_243 import (
21
21
  TableReportPropertyShapesToWidgetIntegrations,
22
22
  WorkflowTriggerPropertyShapesToWidgetIntegrations,
23
23
  )
24
+ from cmem_cmemc.migrations.sparql_query_texts_242 import SparqlDatatypesToXsdString
24
25
  from cmem_cmemc.migrations.workspace_configurations import MigrateWorkspaceConfiguration
25
26
  from cmem_cmemc.object_list import (
26
27
  DirectListPropertyFilter,
@@ -56,6 +57,7 @@ def get_migrations(ctx: click.Context) -> list[dict]: # noqa: ARG001
56
57
  ChartsOnPropertyShapesToWidgetIntegrations(),
57
58
  WorkflowTriggerPropertyShapesToWidgetIntegrations(),
58
59
  TableReportPropertyShapesToWidgetIntegrations(),
60
+ SparqlDatatypesToXsdString(),
59
61
  ]
60
62
  ]
61
63
  data.sort(key=lambda x: x["first_version"])
cmem_cmemc/context.py CHANGED
@@ -27,9 +27,9 @@ from urllib3.exceptions import InsecureRequestWarning
27
27
  from cmem_cmemc.exceptions import InvalidConfigurationError
28
28
  from cmem_cmemc.string_processor import StringProcessor, process_row
29
29
 
30
- DI_TARGET_VERSION = "v24.2.0"
30
+ DI_TARGET_VERSION = "v24.3.0"
31
31
 
32
- EXPLORE_TARGET_VERSION = "v24.2.0"
32
+ EXPLORE_TARGET_VERSION = "v24.3.0"
33
33
 
34
34
  KNOWN_CONFIG_KEYS = {
35
35
  "CMEM_BASE_URI": cmempy_config.get_cmem_base_uri,
@@ -26,6 +26,7 @@ class MigrationRecipe(ABC):
26
26
  "sh": "http://www.w3.org/ns/shacl#",
27
27
  "auth": "https://vocab.eccenca.com/auth/",
28
28
  "shui": "https://vocab.eccenca.com/shui/",
29
+ "xsd": "http://www.w3.org/2001/XMLSchema#",
29
30
  }
30
31
 
31
32
  @abstractmethod
@@ -0,0 +1,53 @@
1
+ """Migration: Chart and Workflow Property Shapes to Widget Integration"""
2
+
3
+ from typing import ClassVar
4
+
5
+ from cmem_cmemc.migrations.abc import MigrationRecipe, components
6
+
7
+
8
+ class SparqlDatatypesToXsdString(MigrationRecipe):
9
+ """24.2 Migrate shui:sparqlQuery|sparqlUpdate datatype literals to xsd:string literals"""
10
+
11
+ id = "sparql-query-datatypes-24.2"
12
+ description = "Migrate shui SPARQL datatype literals to xsd:string literals"
13
+ component: components = "explore"
14
+ first_version = "24.2"
15
+ tags: ClassVar[list[str]] = ["shapes", "user"]
16
+ check_query = """{{DEFAULT_PREFIXES}}
17
+ SELECT DISTINCT ?query
18
+ WHERE {
19
+ GRAPH ?shapeOrQueryGraph {
20
+ ?query shui:queryText ?text .
21
+ FILTER ( datatype(?text) IN (shui:sparqlQuery, shui:sparqlUpdate) )
22
+ }
23
+ }
24
+ """
25
+ move_query = """{{DEFAULT_PREFIXES}}
26
+ DELETE {
27
+ GRAPH ?shapeOrQueryGraph {
28
+ ?query shui:queryText ?oldLiteral .
29
+ }
30
+ }
31
+ INSERT {
32
+ GRAPH ?shapeOrQueryGraph {
33
+ ?query shui:queryText ?newLiteral .
34
+ }
35
+ }
36
+ # SELECT DISTINCT ?query
37
+ WHERE {
38
+ GRAPH ?shapeOrQueryGraph {
39
+ ?query shui:queryText ?oldLiteral .
40
+ FILTER ( datatype(?oldLiteral) IN (shui:sparqlQuery, shui:sparqlUpdate) )
41
+ BIND (STRDT(STR(?oldLiteral), xsd:string) AS ?newLiteral)
42
+ }
43
+ }
44
+ """
45
+
46
+ def is_applicable(self) -> bool:
47
+ """Test if the recipe can be applied."""
48
+ queries_with_old_literals = self._select(self.check_query)
49
+ return len(queries_with_old_literals) > 0
50
+
51
+ def apply(self) -> None:
52
+ """Apply the recipe to the current version."""
53
+ self._update(self.move_query)
cmem_cmemc/utils.py CHANGED
@@ -21,7 +21,7 @@ from cmem_cmemc.constants import NAMESPACES
21
21
 
22
22
  if TYPE_CHECKING:
23
23
  from cmem_cmemc.context import ApplicationContext
24
- from cmem_cmemc.smart_path import SmartPath as Path
24
+ from cmem_cmemc.smart_path import SmartPath
25
25
 
26
26
 
27
27
  def get_version() -> str:
@@ -90,13 +90,13 @@ def read_rdf_graph_files(directory_path: str) -> list[tuple[str, str]]:
90
90
  for _file in files:
91
91
  if _file.endswith(".graph"):
92
92
  continue
93
- full_file_path = Path(root) / _file
93
+ full_file_path = SmartPath(root) / _file
94
94
  # Handle compressed files (like .gz)
95
95
  if _file.endswith(".gz"):
96
96
  graph_file_name = _file.replace(".gz", ".graph")
97
97
  else:
98
98
  graph_file_name = f"{_file}.graph"
99
- full_graph_file_name_path = Path(root) / graph_file_name
99
+ full_graph_file_name_path = SmartPath(root) / graph_file_name
100
100
  if full_graph_file_name_path.exists():
101
101
  graph_name = read_file_to_string(str(full_graph_file_name_path)).strip()
102
102
  rdf_graphs.append((str(full_file_path.resolve()), graph_name))
@@ -105,7 +105,7 @@ def read_rdf_graph_files(directory_path: str) -> list[tuple[str, str]]:
105
105
 
106
106
  def read_file_to_string(file_path: str) -> str:
107
107
  """Read file to string."""
108
- with Path(file_path).open(mode="rb") as _file:
108
+ with SmartPath(file_path).open(mode="rb") as _file:
109
109
  return str(_file.read().decode("utf-8"))
110
110
 
111
111
 
@@ -1,8 +1,7 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: cmem-cmemc
3
- Version: 24.3.0rc2
3
+ Version: 24.3.3
4
4
  Summary: Command line client for eccenca Corporate Memory
5
- Home-page: https://eccenca.com/go/cmemc
6
5
  License: Apache-2.0
7
6
  Author: eccenca
8
7
  Author-email: cmempy-developer@eccenca.com
@@ -21,6 +20,7 @@ Classifier: Programming Language :: Python :: 3
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
24
  Classifier: Programming Language :: Python :: 3 :: Only
25
25
  Classifier: Topic :: Database
26
26
  Classifier: Topic :: Software Development :: Testing
@@ -36,7 +36,6 @@ Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
36
36
  Requires-Dist: junit-xml (>=1.9,<2.0)
37
37
  Requires-Dist: natsort (>=8.4.0,<9.0.0)
38
38
  Requires-Dist: packaging (>=24.2,<25.0)
39
- Requires-Dist: pip (>=24.3.1,<25.0.0)
40
39
  Requires-Dist: prometheus-client (>=0.21.0,<0.22.0)
41
40
  Requires-Dist: pygments (>=2.18.0,<3.0.0)
42
41
  Requires-Dist: pyjwt (>=2.9.0,<3.0.0)
@@ -48,6 +47,7 @@ Requires-Dist: smart-open (>=7.0.5,<8.0.0)
48
47
  Requires-Dist: timeago (>=1.0.16,<2.0.0)
49
48
  Requires-Dist: treelib (>=1.7.0,<2.0.0)
50
49
  Requires-Dist: urllib3 (>=2.2.3,<3.0.0)
50
+ Project-URL: Homepage, https://eccenca.com/go/cmemc
51
51
  Description-Content-Type: text/markdown
52
52
 
53
53
  # cmemc
@@ -1,4 +1,4 @@
1
- cmem_cmemc/__init__.py,sha256=JP__el3oR8pNwDH4_D3mu6jE6ChdeBDnIgu5Vf_VHUg,5516
1
+ cmem_cmemc/__init__.py,sha256=JI0MMWttUaMATsR_9Sw2Y5I6PX3NCxogVX73Hjo6g7M,5516
2
2
  cmem_cmemc/_cmemc.zsh,sha256=fmkrBHIQxus8cp2AgO1tzZ5mNZdGL_83cYz3a9uAdsg,1326
3
3
  cmem_cmemc/command.py,sha256=OsrQOqHpMjiucdpyac8xzxBaSWehYIA7xkO651z8iTs,702
4
4
  cmem_cmemc/command_group.py,sha256=0ltd8xY0yN6_ARR2kkwx7Hibj4glT9M0_bnjKlMhz8g,3371
@@ -8,9 +8,9 @@ cmem_cmemc/commands/admin.py,sha256=IrhWPNJxdE5GO9UumsI8lv9PqFc_0oUh72FmQIKdl9c,
8
8
  cmem_cmemc/commands/client.py,sha256=gKh22OvYDi95q2U4czH4UPYyDRw_Ngk2K0frDywl3B4,5074
9
9
  cmem_cmemc/commands/config.py,sha256=j0zc9EFWW7Kw9bzSb_r16m-A0LZersKbZ9j5GE0mGcQ,5734
10
10
  cmem_cmemc/commands/dataset.py,sha256=xsIUiC2aMDiESjnZvjDY5Mh2fvSooOijQmo5A7RvY40,30397
11
- cmem_cmemc/commands/graph.py,sha256=x0HFeyIRjRPaCqB78esJVDD1WaN3IAHXj2gtXonbEnM,32461
11
+ cmem_cmemc/commands/graph.py,sha256=OHBMHLU5PNrbnxinvjE5Z7FQv8bU8WW-0RCfdoovXl0,32412
12
12
  cmem_cmemc/commands/metrics.py,sha256=zsyHezoYwig6jIdn7g9NZMqt9DxG6dQRoO0vP3Eu0Rc,12176
13
- cmem_cmemc/commands/migration.py,sha256=IubT8uA-cyn5frofUcknMWEBLMPeEoKMb0xNbJRXNn4,9412
13
+ cmem_cmemc/commands/migration.py,sha256=SFmEeUP744oJMdbz3RXA-zPtqeV6iWcBKiaKhWsMZe0,9538
14
14
  cmem_cmemc/commands/project.py,sha256=1BwAAZvupImqkW3Q3dXdkMir8-wnWRMsewnOyVui3QY,20545
15
15
  cmem_cmemc/commands/python.py,sha256=80k-z6AcL1Ibp5CqVHATjvK0t9wv24QsepDB0vrfDFU,10760
16
16
  cmem_cmemc/commands/query.py,sha256=KUck4w7PD0e5JYg5Eykf2QAMBfpwmgskEiIA-X_PqZs,26973
@@ -25,17 +25,18 @@ cmem_cmemc/commands/workflow.py,sha256=vQiaH3L1ZXjf5SuorwdjrD6nF_5nxZ9Xkd7eCNGwx
25
25
  cmem_cmemc/commands/workspace.py,sha256=IcZgBsvtulLRFofS70qpln6oKQIZunrVLfSAUeiFhCA,4579
26
26
  cmem_cmemc/completion.py,sha256=zgT0ihoePxl8RdmH-9wn1LBAYbeD3Scj9-nX0FcFBTY,44330
27
27
  cmem_cmemc/constants.py,sha256=VKNF5-6fzZXWzPgm1OAGhWvyL4YE8SRq52kkpJjUgB0,475
28
- cmem_cmemc/context.py,sha256=fy2gwoW-15hl-yCCY9f0t59j4Sp2Mj2GNatZ2G-mrxA,19482
28
+ cmem_cmemc/context.py,sha256=JJUCfhLT9xKQScSXL1a7US9YE6c1fpFKLLjE7kxCieM,19482
29
29
  cmem_cmemc/exceptions.py,sha256=SpUHdmVM8cZpSjBv6ICgr9NLr3OJ5XO42DlvjohprVo,232
30
30
  cmem_cmemc/manual_helper/__init__.py,sha256=G3Lqw2aPxo8x63Tg7L0aa5VD9BMaRzZDmhrog7IuEPg,43
31
31
  cmem_cmemc/manual_helper/graph.py,sha256=qDchHdjRRDW2oZ66by81NxhoDgNxXaAUxq2keewEiVU,3598
32
32
  cmem_cmemc/manual_helper/multi_page.py,sha256=5nvN1P7zTgzrnuoT7yA7abyT7EOVa24Jvp3Q2xZmXro,12236
33
33
  cmem_cmemc/manual_helper/single_page.py,sha256=sVSeaZmPa-Cs6dtp27MqyiO6rIrskY9BtDyeAZhBWXM,1477
34
34
  cmem_cmemc/migrations/__init__.py,sha256=i6Ri7qN58ou_MwOzm2KibPkXOD7u-1ELky-nUE5LjAA,24
35
- cmem_cmemc/migrations/abc.py,sha256=Q4G0tRiFruawm6qvvSC_02FkDTC-Jav4VP2Suoy5hzE,3512
35
+ cmem_cmemc/migrations/abc.py,sha256=UGJzrvMzUFdp2-sosp49ObRI-SrUSzLJqLEhvB4QTzg,3564
36
36
  cmem_cmemc/migrations/access_conditions_243.py,sha256=IXcvSuo9pLaTTo4XNBB6_ln-2TzOV5PU5ugti0BWbxA,5083
37
37
  cmem_cmemc/migrations/bootstrap_data.py,sha256=RF0vyFTGUQ_RcpTTWZmm3XLAJAJX2gSYcGwcBmRmU8A,963
38
38
  cmem_cmemc/migrations/shapes_widget_integrations_243.py,sha256=jRWtTFeMom-xUI7UaoTa3DoLmmdwFmaw9XYxvnelxMo,8746
39
+ cmem_cmemc/migrations/sparql_query_texts_242.py,sha256=K_GbxaX5-kkQKDZMq8UvT1vHazde53htwdDHGyB0b9s,1568
39
40
  cmem_cmemc/migrations/workspace_configurations.py,sha256=tFmCdfEL10ICjqMXQEIf-9fveE41HBQ_jaWNQJENz50,998
40
41
  cmem_cmemc/object_list.py,sha256=NYArisZxCV4pws_Tgk_xyltLN6TStkxQAgy-WLlzOxc,14712
41
42
  cmem_cmemc/parameter_types/__init__.py,sha256=Jqhwnw5a2oPNMClzUyovWiieK60RCl3rvSNr-t3wP84,36
@@ -45,9 +46,9 @@ cmem_cmemc/smart_path/clients/__init__.py,sha256=YFOm69BfTCRvAcJjN_CoUmCv3kzEciy
45
46
  cmem_cmemc/smart_path/clients/http.py,sha256=3clZu2v4uuOvPY4MY_8SVSy7hIXJDNooahFRBRpy0ok,2347
46
47
  cmem_cmemc/string_processor.py,sha256=kSVePdgFmf2ekurKj6TbDJn6ur82VGLwCsTJ9ODfBEU,2879
47
48
  cmem_cmemc/title_helper.py,sha256=7frjAR54_Xc1gszOWXfzSmKFTawNJQ7kkXhZcHmQLyw,1250
48
- cmem_cmemc/utils.py,sha256=fQ_9ysEhzqvAWevbrDwZvH0eJioLOKJ3dVFVaJrzxu4,12213
49
- cmem_cmemc-24.3.0rc2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
50
- cmem_cmemc-24.3.0rc2.dist-info/METADATA,sha256=Wf6-ZA-YWKg15I1zy_gMursZwBSLH_aUyxniZn36mUU,5619
51
- cmem_cmemc-24.3.0rc2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
52
- cmem_cmemc-24.3.0rc2.dist-info/entry_points.txt,sha256=znWUTG-zgDITu6Frsd-OtNxBxj6Uo8Fa7bz6gaZYMrA,41
53
- cmem_cmemc-24.3.0rc2.dist-info/RECORD,,
49
+ cmem_cmemc/utils.py,sha256=DXcJo6F2rYP1xeaI3wSvUVlS6GXbGTDJZLci7T5Rgd4,12220
50
+ cmem_cmemc-24.3.3.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
51
+ cmem_cmemc-24.3.3.dist-info/METADATA,sha256=SwZmHE0rxwd7XEA1ag86JS0GMyOIP-YLt89jBHa3d9Y,5641
52
+ cmem_cmemc-24.3.3.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
53
+ cmem_cmemc-24.3.3.dist-info/entry_points.txt,sha256=znWUTG-zgDITu6Frsd-OtNxBxj6Uo8Fa7bz6gaZYMrA,41
54
+ cmem_cmemc-24.3.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 2.0.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any