cmem-cmemc 24.1.5__py3-none-any.whl → 24.2.0__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.
@@ -0,0 +1,63 @@
1
+ """Client module to handle Path API calls."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import ABC, abstractmethod
6
+ from typing import TYPE_CHECKING
7
+
8
+ if TYPE_CHECKING:
9
+ from collections.abc import Generator
10
+
11
+
12
+ class StoragePath(ABC):
13
+ """Storage path interface."""
14
+
15
+ def __init__(self, path: str):
16
+ self.path = path
17
+
18
+ @property
19
+ @abstractmethod
20
+ def suffix(self) -> str:
21
+ """Return the suffix of the path."""
22
+
23
+ @property
24
+ @abstractmethod
25
+ def name(self) -> str:
26
+ """Return the file name."""
27
+
28
+ @property
29
+ @abstractmethod
30
+ def parent(self) -> StoragePath:
31
+ """The logical parent of the path."""
32
+
33
+ @abstractmethod
34
+ def is_dir(self) -> bool:
35
+ """Check if the path is a directory."""
36
+
37
+ @abstractmethod
38
+ def is_file(self) -> bool:
39
+ """Check if the path is a file."""
40
+
41
+ @abstractmethod
42
+ def exists(self) -> bool:
43
+ """Check if the path exists."""
44
+
45
+ @abstractmethod
46
+ def mkdir(self, parents: bool = False, exist_ok: bool = False) -> None:
47
+ """Create a directory."""
48
+
49
+ @abstractmethod
50
+ def absolute(self) -> StoragePath:
51
+ """Return an absolute version of this path"""
52
+
53
+ def resolve(self) -> StoragePath:
54
+ """Resolve the resolved path of the path."""
55
+ raise NotImplementedError(f"resolve in {self.__class__} is not implemented yet.")
56
+
57
+ @abstractmethod
58
+ def glob(self, pattern: str) -> Generator[StoragePath, StoragePath, StoragePath]:
59
+ """Iterate over this subtree and yield all existing files"""
60
+
61
+ @abstractmethod
62
+ def __truediv__(self, key: str) -> StoragePath:
63
+ """Return StoragePath with appending the key to the exising path"""
@@ -0,0 +1,65 @@
1
+ """Provides functionality for interacting with http/https paths"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from cmem_cmemc.smart_path.clients import StoragePath
8
+
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Generator
11
+
12
+
13
+ class HttpPath(StoragePath):
14
+ """Client class for interacting with Amazon S3 storage.
15
+
16
+ This class provides methods for working with http paths within the context
17
+ of the `Path` application.
18
+ """
19
+
20
+ @property
21
+ def suffix(self) -> str:
22
+ """Return the suffix of the path."""
23
+ raise NotImplementedError(f"suffix in {self.__class__} is not implemented yet.")
24
+
25
+ @property
26
+ def name(self) -> str:
27
+ """Determine the name of the path."""
28
+ return self.path.split("/")[-1]
29
+
30
+ @property
31
+ def parent(self) -> HttpPath:
32
+ """The logical parent of the path."""
33
+ raise NotImplementedError(f"parent in {self.__class__} is not implemented yet.")
34
+
35
+ def is_dir(self) -> bool:
36
+ """Determine if path is a directory or not."""
37
+ return False
38
+
39
+ def is_file(self) -> bool:
40
+ """Determine if path is a file or not."""
41
+ return not self.is_dir()
42
+
43
+ def exists(self) -> bool:
44
+ """Return the suffix of the path."""
45
+ raise NotImplementedError(f"exists in {self.__class__} is not implemented yet.")
46
+
47
+ def mkdir(self, parents: bool = False, exist_ok: bool = False) -> None:
48
+ """Return the suffix of the path."""
49
+ raise NotImplementedError(f"mkdir in {self.__class__} is not implemented yet.")
50
+
51
+ def absolute(self) -> HttpPath:
52
+ """Return an absolute version of this path"""
53
+ raise NotImplementedError(f"absolute in {self.__class__} is not implemented yet.")
54
+
55
+ def resolve(self) -> HttpPath:
56
+ """Resolve the resolved path of the path."""
57
+ raise NotImplementedError(f"resolve in {self.__class__} is not implemented yet.")
58
+
59
+ def glob(self, pattern: str) -> Generator[StoragePath, StoragePath, StoragePath]:
60
+ """Iterate over this subtree and yield all existing files"""
61
+ raise NotImplementedError(f"glob in {self.__class__} is not implemented yet.")
62
+
63
+ def __truediv__(self, key: str) -> HttpPath:
64
+ """Return path with appending the key"""
65
+ raise NotImplementedError(f"__truediv__ in {self.__class__} is not implemented yet.")
cmem_cmemc/utils.py CHANGED
@@ -2,23 +2,26 @@
2
2
 
3
3
  import json
4
4
  import os
5
+ import pathlib
5
6
  import re
6
7
  import sys
7
8
  import unicodedata
8
9
  from dataclasses import dataclass
9
10
  from importlib.metadata import version as cmemc_version
10
- from pathlib import Path
11
+ from zipfile import BadZipFile, ZipFile
11
12
 
12
13
  import requests
13
14
  from bs4 import BeautifulSoup
14
15
  from cmem.cmempy.dp.admin import get_prometheus_data
15
16
  from cmem.cmempy.dp.proxy.graph import get_graphs_list
17
+ from cmem.cmempy.queries import QueryCatalog
16
18
  from cmem.cmempy.workspace.projects.project import get_projects
17
19
  from prometheus_client import Metric
18
20
  from prometheus_client.parser import text_string_to_metric_families
19
21
 
20
22
  from cmem_cmemc.constants import NAMESPACES
21
23
  from cmem_cmemc.context import ApplicationContext
24
+ from cmem_cmemc.smart_path import SmartPath as Path
22
25
 
23
26
 
24
27
  def get_version() -> str:
@@ -88,7 +91,7 @@ def read_rdf_graph_files(directory_path: str) -> list[tuple[str, str]]:
88
91
  full_file_path = Path(root) / _file
89
92
  graph_file_name = _file + ".graph"
90
93
  full_graph_file_name_path = Path(root) / graph_file_name
91
- if not _file.endswith(".graph") and Path(full_graph_file_name_path).exists():
94
+ if not _file.endswith(".graph") and full_graph_file_name_path.exists():
92
95
  graph_name = read_file_to_string(str(full_graph_file_name_path)).strip()
93
96
  rdf_graphs.append((str(full_file_path.resolve()), graph_name))
94
97
  return rdf_graphs
@@ -97,7 +100,7 @@ def read_rdf_graph_files(directory_path: str) -> list[tuple[str, str]]:
97
100
  def read_file_to_string(file_path: str) -> str:
98
101
  """Read file to string."""
99
102
  with Path(file_path).open(mode="rb") as _file:
100
- return _file.read().decode("utf-8")
103
+ return str(_file.read().decode("utf-8"))
101
104
 
102
105
 
103
106
  def get_graphs(writeable: bool = True, readonly: bool = True) -> list:
@@ -350,3 +353,50 @@ def convert_qname_to_iri(qname: str, default_ns: str) -> str:
350
353
  return default_ns + qname[1:]
351
354
 
352
355
  return qname
356
+
357
+
358
+ def get_query_text(file_or_uri: str, required_projections: set) -> str:
359
+ """Get query text for a file or graph catalog URI.
360
+
361
+ Args:
362
+ ----
363
+ file_or_uri (str): The file path or URI to fetch the query from.
364
+ required_projections (set): A set of required projections.
365
+
366
+ Returns:
367
+ -------
368
+ str: The query text.
369
+
370
+ Raises:
371
+ ------
372
+ ValueError: If the input is not a readable file or a query URI,
373
+ or if the query contains placeholders,
374
+ or if the query does not include the required projections.
375
+
376
+ """
377
+ sparql_query = QueryCatalog().get_query(file_or_uri)
378
+ if sparql_query is None:
379
+ raise ValueError(f"{file_or_uri} is neither a readable file nor a query URI.")
380
+
381
+ if sparql_query.get_placeholder_keys():
382
+ raise ValueError("Placeholder queries are not supported.")
383
+
384
+ result = sparql_query.get_json_results()
385
+ projected_vars = set(result["head"]["vars"])
386
+
387
+ missing_projections = required_projections - projected_vars
388
+ if missing_projections:
389
+ missing = ", ".join(missing_projections)
390
+ raise ValueError(f"Select query must include projections for: {missing}")
391
+ txt: str = sparql_query.text
392
+ return txt
393
+
394
+
395
+ def validate_zipfile(zipfile: str | pathlib.Path) -> bool:
396
+ """Validate a zipfile."""
397
+ zipfile = pathlib.Path(zipfile)
398
+ try:
399
+ ZipFile(zipfile).testzip()
400
+ except BadZipFile:
401
+ return False
402
+ return True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cmem-cmemc
3
- Version: 24.1.5
3
+ Version: 24.2.0
4
4
  Summary: Command line client for eccenca Corporate Memory
5
5
  Home-page: https://eccenca.com/go/cmemc
6
6
  License: Apache-2.0
@@ -25,25 +25,28 @@ Classifier: Programming Language :: Python :: 3 :: Only
25
25
  Classifier: Topic :: Database
26
26
  Classifier: Topic :: Software Development :: Testing
27
27
  Classifier: Topic :: Utilities
28
- Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
29
- Requires-Dist: certifi (>=2023.5.7)
28
+ Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
29
+ Requires-Dist: certifi (>=2024.2.2)
30
30
  Requires-Dist: click (>=8.1.7,<9.0.0)
31
- Requires-Dist: click-didyoumean (>=0.3.0,<0.4.0)
32
- Requires-Dist: click-help-colors (>=0.9.1,<0.10.0)
33
- Requires-Dist: cmem-cmempy (==24.1.1)
34
- Requires-Dist: configparser (>=5.3.0,<6.0.0)
35
- Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
36
- Requires-Dist: natsort (>=8.3.1,<9.0.0)
37
- Requires-Dist: prometheus-client (>=0.16.0,<0.17.0)
38
- Requires-Dist: pygments (>=2.15.1,<3.0.0)
39
- Requires-Dist: pyjwt (>=2.7.0,<3.0.0)
40
- Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
31
+ Requires-Dist: click-didyoumean (>=0.3.1,<0.4.0)
32
+ Requires-Dist: click-help-colors (>=0.9.4,<0.10.0)
33
+ Requires-Dist: cmem-cmempy (==24.2.0)
34
+ Requires-Dist: configparser (>=6.0.1,<7.0.0)
35
+ Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
36
+ Requires-Dist: junit-xml (>=1.9,<2.0)
37
+ Requires-Dist: natsort (>=8.4.0,<9.0.0)
38
+ Requires-Dist: pip (>=24.2,<25.0)
39
+ Requires-Dist: prometheus-client (>=0.20.0,<0.21.0)
40
+ Requires-Dist: pygments (>=2.17.2,<3.0.0)
41
+ Requires-Dist: pyjwt (>=2.8.0,<3.0.0)
42
+ Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
41
43
  Requires-Dist: requests (>=2.31.0,<3.0.0)
42
- Requires-Dist: rich (>=13.7.0,<14.0.0)
44
+ Requires-Dist: rich (>=13.7.1,<14.0.0)
43
45
  Requires-Dist: six (>=1.16.0,<2.0.0)
46
+ Requires-Dist: smart-open (>=7.0.4,<8.0.0)
44
47
  Requires-Dist: timeago (>=1.0.16,<2.0.0)
45
- Requires-Dist: treelib (>=1.6.4,<2.0.0)
46
- Requires-Dist: urllib3 (>=2,<3)
48
+ Requires-Dist: treelib (>=1.7.0,<2.0.0)
49
+ Requires-Dist: urllib3 (>=2.2.1,<3.0.0)
47
50
  Description-Content-Type: text/markdown
48
51
 
49
52
  # cmemc
@@ -0,0 +1,42 @@
1
+ cmem_cmemc/__init__.py,sha256=Uwm6QW_Bou1VtRWVRcnMs1ilHVCi9moddXgcEqs6c3E,5484
2
+ cmem_cmemc/_cmemc.zsh,sha256=fmkrBHIQxus8cp2AgO1tzZ5mNZdGL_83cYz3a9uAdsg,1326
3
+ cmem_cmemc/commands/__init__.py,sha256=sFzT-3i01sLlxL8_nSTXaYerDfTo3fTEvvcL3jx3Y50,3681
4
+ cmem_cmemc/commands/acl.py,sha256=8Xvd98-aR-tDY9y8QB8varZgOOCOI4DpKnhDqKDNfIo,15597
5
+ cmem_cmemc/commands/admin.py,sha256=YYl8sHUS9gewgEfVALJYwbc1xpUK7mX-RoJpiXlAqr0,9159
6
+ cmem_cmemc/commands/client.py,sha256=23Sc3h64eAMaB4bJVfiamR470DMpDj1hsPWKsxUSMLg,5039
7
+ cmem_cmemc/commands/config.py,sha256=9-xEtHoJyaqU9J7C8a3Q7SpPvJQHLufMXxZYuXYQ5Pk,5699
8
+ cmem_cmemc/commands/dataset.py,sha256=_6pZyYOpIpv6EU2Cg1GJnCVLEVWcGaV9AUyCskhcT8U,30282
9
+ cmem_cmemc/commands/graph.py,sha256=eVJ6SJiDD_xIkE-Ua0PNiI_K4pAQLkP-Puk_ZCDsXBM,27935
10
+ cmem_cmemc/commands/metrics.py,sha256=BlZvYvp1RWLl9rEknxxcOnOh2_zQgGqMEEXFwtJa58E,7832
11
+ cmem_cmemc/commands/project.py,sha256=Dgnd5MxBtJ8zS-wN-1HFraim2PoL4s8LBw6SUeh94b8,19734
12
+ cmem_cmemc/commands/python.py,sha256=Mwt2wZyXOlrnc3nzbnt2wM441IKvxFBE2a3P54uYhk8,10285
13
+ cmem_cmemc/commands/query.py,sha256=r9eTjoB_PR_gsb3R0jIU0oVGThDbs2LmFwRoycBTvYg,26938
14
+ cmem_cmemc/commands/resource.py,sha256=n6ri6Tu2sNUNZuNfNGpRnMQxOx9VeTFGL1OWXUKKpjE,7534
15
+ cmem_cmemc/commands/scheduler.py,sha256=L9Cl7u3Nq3UjfgRzayivxxCHq2U6ZtpqtTCsXsndnFg,8512
16
+ cmem_cmemc/commands/store.py,sha256=esFPX4b8TnN64F4XMCrT44JS5DSoCGjWxlncGYyiW1s,9254
17
+ cmem_cmemc/commands/user.py,sha256=0BbPoPhguSeMjLUn29Qh3kRcMbpQ75bAwDHgYWrZMyQ,12288
18
+ cmem_cmemc/commands/validation.py,sha256=hGCXKdZ3q8VkhiFuzsz1IIKYerGggxrW7JXgdlo92Qc,27963
19
+ cmem_cmemc/commands/variable.py,sha256=IvQ-Yzg2z8Hb-ZstEuOCTMBDg0N931z_73K9xZPbdoM,11356
20
+ cmem_cmemc/commands/vocabulary.py,sha256=mDJ6eWKtN-ChPjnST6Xy8gmPNlO1pE7vzz_tkgGvUlQ,17342
21
+ cmem_cmemc/commands/workflow.py,sha256=nBI7pr54FqBJMhYc__CQW7BxI9DdVUYsvXZLsskdwoU,25315
22
+ cmem_cmemc/commands/workspace.py,sha256=pRx4hesL-z34m2V-FyTk4FfXErJugLDD6ufbqL6KJd8,4191
23
+ cmem_cmemc/completion.py,sha256=oP8I-hVe3KvzQ2cjyaCzSsMpoaKw9A06pVLiA5Owlaw,43135
24
+ cmem_cmemc/constants.py,sha256=s16jrvmIt42a1SrahwjON5prk8ry6MuAXHeBnuMDZyY,422
25
+ cmem_cmemc/context.py,sha256=fiMciWYlnBi0vuyBzIW2KIODxjm7XjzCMtoMYMuqRDI,18538
26
+ cmem_cmemc/exceptions.py,sha256=SpUHdmVM8cZpSjBv6ICgr9NLr3OJ5XO42DlvjohprVo,232
27
+ cmem_cmemc/manual_helper/__init__.py,sha256=G3Lqw2aPxo8x63Tg7L0aa5VD9BMaRzZDmhrog7IuEPg,43
28
+ cmem_cmemc/manual_helper/graph.py,sha256=qDchHdjRRDW2oZ66by81NxhoDgNxXaAUxq2keewEiVU,3598
29
+ cmem_cmemc/manual_helper/multi_page.py,sha256=K-S2_NubrHGynO5I_IMAanO2pZN2KETUV00wpjMqvjI,12171
30
+ cmem_cmemc/manual_helper/single_page.py,sha256=sVSeaZmPa-Cs6dtp27MqyiO6rIrskY9BtDyeAZhBWXM,1477
31
+ cmem_cmemc/object_list.py,sha256=Iyl5cu8CmeT_2RNKDsjhhSsoWoQ6AUh0rKzKwHV_Ruc,13106
32
+ cmem_cmemc/parameter_types/__init__.py,sha256=Jqhwnw5a2oPNMClzUyovWiieK60RCl3rvSNr-t3wP84,36
33
+ cmem_cmemc/parameter_types/path.py,sha256=ATwvdXHqI5GjPw9p2jCoN2pLoXlRrxPTvI0Q9Z2k_FI,1868
34
+ cmem_cmemc/smart_path/__init__.py,sha256=zDgm1kDrzLyCuIcNb8VXSdnb_CcVNjGkjgiIDVlsh74,3023
35
+ cmem_cmemc/smart_path/clients/__init__.py,sha256=YFOm69BfTCRvAcJjN_CoUmCv3kzEciyYOPUG337p_pA,1696
36
+ cmem_cmemc/smart_path/clients/http.py,sha256=3clZu2v4uuOvPY4MY_8SVSy7hIXJDNooahFRBRpy0ok,2347
37
+ cmem_cmemc/utils.py,sha256=eKXo0bVbEyaW-bARbodxv0gggnnbB6FE5pfI8MWR0cI,13173
38
+ cmem_cmemc-24.2.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
39
+ cmem_cmemc-24.2.0.dist-info/METADATA,sha256=NP18u40La3sRgvUlMnmdgtd5sb8Dq1xV8O-cN-Dx5Sc,5572
40
+ cmem_cmemc-24.2.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
41
+ cmem_cmemc-24.2.0.dist-info/entry_points.txt,sha256=znWUTG-zgDITu6Frsd-OtNxBxj6Uo8Fa7bz6gaZYMrA,41
42
+ cmem_cmemc-24.2.0.dist-info/RECORD,,
@@ -1,37 +0,0 @@
1
- cmem_cmemc/__init__.py,sha256=z7zjBQWM1c2nW9ylGUelIPiKBtXhIO38qILBJXzuEWs,5532
2
- cmem_cmemc/_cmemc.zsh,sha256=fmkrBHIQxus8cp2AgO1tzZ5mNZdGL_83cYz3a9uAdsg,1326
3
- cmem_cmemc/commands/__init__.py,sha256=_PsHWhMFwyfRAYInt0AOs3dA3Cuqhsnf_enFLjxVCGQ,3626
4
- cmem_cmemc/commands/acl.py,sha256=cA76UvQquhZc9MdS3e94kcfSn9V_RzTQ5XM0Ko6w6hM,13769
5
- cmem_cmemc/commands/admin.py,sha256=pv9N9laUWV7xevOw0toLBezRz2_B5spcgwU2B-pqaAY,8681
6
- cmem_cmemc/commands/client.py,sha256=23Sc3h64eAMaB4bJVfiamR470DMpDj1hsPWKsxUSMLg,5039
7
- cmem_cmemc/commands/config.py,sha256=9-xEtHoJyaqU9J7C8a3Q7SpPvJQHLufMXxZYuXYQ5Pk,5699
8
- cmem_cmemc/commands/dataset.py,sha256=hn3449Aby_lMgBHumSHqFn6SZS9q3cmh3ZMoUOG85RE,30198
9
- cmem_cmemc/commands/graph.py,sha256=_VtYwOU3SmNbKAQaSKHrVSTOSP3FCrs-W4jmzTQzx7M,27329
10
- cmem_cmemc/commands/metrics.py,sha256=BlZvYvp1RWLl9rEknxxcOnOh2_zQgGqMEEXFwtJa58E,7832
11
- cmem_cmemc/commands/project.py,sha256=XP4vovTTgMzvO-218SpWYnFejayWoNN4DLTp448zVuU,19268
12
- cmem_cmemc/commands/python.py,sha256=4fYWztPZjLVuz12vuApHE8el9zQvbnwGDiLh1fo7vqA,9666
13
- cmem_cmemc/commands/query.py,sha256=mx_pZB9ovD8j_svpdDTE82R1pUrwL41OICwcExpXA4s,26792
14
- cmem_cmemc/commands/resource.py,sha256=n6ri6Tu2sNUNZuNfNGpRnMQxOx9VeTFGL1OWXUKKpjE,7534
15
- cmem_cmemc/commands/scheduler.py,sha256=L9Cl7u3Nq3UjfgRzayivxxCHq2U6ZtpqtTCsXsndnFg,8512
16
- cmem_cmemc/commands/store.py,sha256=PybRXCO6R84lEWR8fsTB1jZrc8CMGrWejpruPuM9lIM,6741
17
- cmem_cmemc/commands/user.py,sha256=0BbPoPhguSeMjLUn29Qh3kRcMbpQ75bAwDHgYWrZMyQ,12288
18
- cmem_cmemc/commands/validation.py,sha256=Kr5zk_9_LPoRz11LVJ_vkEhP2KrVg8Ns2aiMfiCt-cI,19984
19
- cmem_cmemc/commands/variable.py,sha256=IvQ-Yzg2z8Hb-ZstEuOCTMBDg0N931z_73K9xZPbdoM,11356
20
- cmem_cmemc/commands/vocabulary.py,sha256=9bD_Ah6uVd4GwywIRAahSLfcqxE8yrawXIUmSMW-dMA,16693
21
- cmem_cmemc/commands/workflow.py,sha256=msBdaNClFuSdPD8KIC9sjno8C4gunyAI7n_hev4yq2w,24632
22
- cmem_cmemc/commands/workspace.py,sha256=4kMstZejLdP8KIrt9p3BMw8mrrNUrdX7E8_fSI78nc4,4097
23
- cmem_cmemc/completion.py,sha256=amF9lWdxrWvS1CAQkEOQH1S7FpbmMniw6xjKlFOw4kY,42011
24
- cmem_cmemc/constants.py,sha256=s16jrvmIt42a1SrahwjON5prk8ry6MuAXHeBnuMDZyY,422
25
- cmem_cmemc/context.py,sha256=tLyVsma3oCLUEwpywUwX-ZLtp1XqEYLnC_bVK4Ro0ps,17730
26
- cmem_cmemc/exceptions.py,sha256=SpUHdmVM8cZpSjBv6ICgr9NLr3OJ5XO42DlvjohprVo,232
27
- cmem_cmemc/manual_helper/__init__.py,sha256=G3Lqw2aPxo8x63Tg7L0aa5VD9BMaRzZDmhrog7IuEPg,43
28
- cmem_cmemc/manual_helper/graph.py,sha256=qDchHdjRRDW2oZ66by81NxhoDgNxXaAUxq2keewEiVU,3598
29
- cmem_cmemc/manual_helper/multi_page.py,sha256=K-S2_NubrHGynO5I_IMAanO2pZN2KETUV00wpjMqvjI,12171
30
- cmem_cmemc/manual_helper/single_page.py,sha256=sVSeaZmPa-Cs6dtp27MqyiO6rIrskY9BtDyeAZhBWXM,1477
31
- cmem_cmemc/object_list.py,sha256=QU-8JE5jvFcrUelEC4l5z7A9SInNnCRzRTS1bMw5FZc,13256
32
- cmem_cmemc/utils.py,sha256=wGqdltti4GDZdzikCcBMKLrwDObjRbPl3_7-TGh_Eqk,11577
33
- cmem_cmemc-24.1.5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
34
- cmem_cmemc-24.1.5.dist-info/METADATA,sha256=lQAYElKhpxomsAwLHhW3nQxcYGi3yTXAg1QJlMIthLs,5443
35
- cmem_cmemc-24.1.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
- cmem_cmemc-24.1.5.dist-info/entry_points.txt,sha256=znWUTG-zgDITu6Frsd-OtNxBxj6Uo8Fa7bz6gaZYMrA,41
37
- cmem_cmemc-24.1.5.dist-info/RECORD,,