cmem-cmemc 25.1.1__py3-none-any.whl → 25.3.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.
cmem_cmemc/completion.py CHANGED
@@ -8,9 +8,8 @@ from contextlib import suppress
8
8
  from typing import Any
9
9
 
10
10
  import requests.exceptions
11
- from click import ClickException, Context
12
- from click.parser import Argument, split_arg_string
13
- from click.shell_completion import CompletionItem
11
+ from click import Argument, ClickException, Context
12
+ from click.shell_completion import CompletionItem, split_arg_string
14
13
  from cmem.cmempy.dp.authorization.conditions import (
15
14
  fetch_all_acls,
16
15
  get_actions,
@@ -54,6 +53,11 @@ SORT_BY_KEY = 0
54
53
  SORT_BY_DESC = 1
55
54
 
56
55
 
56
+ def escape_colon(value: str) -> str:
57
+ """Escape colons in the input string by prefixing them with a backslash."""
58
+ return value.replace(":", r"\:")
59
+
60
+
57
61
  def finalize_completion(
58
62
  candidates: list,
59
63
  incomplete: str = "",
@@ -127,7 +131,7 @@ def finalize_completion(
127
131
  reverse=reverse,
128
132
  )
129
133
  return [
130
- CompletionItem(value=element[0].replace(":", r"\:"), help=element[1])
134
+ CompletionItem(value=escape_colon(element[0]), help=element[1])
131
135
  for element in sorted_list
132
136
  ]
133
137
 
@@ -142,7 +146,7 @@ def get_completion_args(incomplete: str) -> list[str]:
142
146
  This is a workaround to get partial tuple options in a completion function
143
147
  see https://github.com/pallets/click/issues/2597
144
148
  """
145
- args = split_arg_string(os.environ["COMP_WORDS"])
149
+ args = split_arg_string(os.environ.get("COMP_WORDS", ""))
146
150
  if incomplete and len(args) > 0 and args[len(args) - 1] == incomplete:
147
151
  args.pop()
148
152
  return args
@@ -172,7 +176,7 @@ def acl_ids(ctx: Context, param: Argument, incomplete: str) -> list[CompletionIt
172
176
  for access_condition in acls:
173
177
  iri = convert_iri_to_qname(access_condition.get("iri"), default_ns=NS_ACL)
174
178
  label = access_condition.get("name")
175
- if check_option_in_params(iri, ctx.params.get(param.name)): # type: ignore[attr-defined]
179
+ if check_option_in_params(iri, ctx.params.get(str(param.name))):
176
180
  continue
177
181
  options.append((iri, label))
178
182
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_DESC)
@@ -190,9 +194,9 @@ def acl_actions(ctx: Context, param: Argument, incomplete: str) -> list[Completi
190
194
  except (KeyError, TypeError):
191
195
  return []
192
196
  qname = convert_iri_to_qname(iri, default_ns=NS_ACTION)
193
- if check_option_in_params(qname, ctx.params.get(param.name)): # type: ignore[attr-defined]
197
+ if check_option_in_params(qname, ctx.params.get(str(param.name))):
194
198
  continue
195
- if check_option_in_params(iri, ctx.params.get(param.name)): # type: ignore[attr-defined]
199
+ if check_option_in_params(iri, ctx.params.get(str(param.name))):
196
200
  continue
197
201
  options.append((qname, name))
198
202
  options.append(("urn:elds-backend-all-actions", "All Actions (until 24.2.x, now deprecated)"))
@@ -205,7 +209,7 @@ def acl_users(ctx: Context, param: Argument, incomplete: str) -> list[Completion
205
209
  options = []
206
210
  try:
207
211
  for _ in list_users():
208
- if check_option_in_params(_["username"], ctx.params.get(param.name)): # type: ignore[attr-defined]
212
+ if check_option_in_params(_["username"], ctx.params.get(str(param.name))):
209
213
  continue
210
214
  options.append(_["username"])
211
215
  except requests.exceptions.HTTPError:
@@ -213,7 +217,7 @@ def acl_users(ctx: Context, param: Argument, incomplete: str) -> list[Completion
213
217
  results = get_users().json()
214
218
  for _ in results:
215
219
  username = _.replace(NS_USER, "")
216
- if check_option_in_params(username, ctx.params.get(param.name)) or username in options: # type: ignore[attr-defined]
220
+ if check_option_in_params(username, ctx.params.get(str(param.name))) or username in options:
217
221
  continue
218
222
  options.append(username)
219
223
 
@@ -226,7 +230,7 @@ def acl_groups(ctx: Context, param: Argument, incomplete: str) -> list[Completio
226
230
  options = []
227
231
  try:
228
232
  for _ in list_groups():
229
- if check_option_in_params(_["name"], ctx.params.get(param.name)): # type: ignore[attr-defined]
233
+ if check_option_in_params(_["name"], ctx.params.get(str(param.name))):
230
234
  continue
231
235
  options.append(_["name"])
232
236
  except requests.exceptions.HTTPError:
@@ -234,7 +238,7 @@ def acl_groups(ctx: Context, param: Argument, incomplete: str) -> list[Completio
234
238
  results = get_groups().json()
235
239
  for _ in results:
236
240
  _ = _.replace(NS_GROUP, "") if _.startswith(NS_GROUP) else _
237
- if check_option_in_params(_, ctx.params.get(param.name)) or _ in options: # type: ignore[attr-defined]
241
+ if check_option_in_params(_, ctx.params.get(str(param.name))) or _ in options:
238
242
  continue
239
243
  options.append(_)
240
244
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_DESC)
@@ -392,7 +396,7 @@ def scheduler_ids(ctx: Context, param: Argument, incomplete: str) -> list[Comple
392
396
  facets=[{"facetId": "taskType", "keywordIds": ["Scheduler"], "type": "keyword"}],
393
397
  )["results"]
394
398
  for _ in schedulers:
395
- if check_option_in_params(_["projectId"] + ":" + _["id"], ctx.params.get(param.name)): # type: ignore[attr-defined]
399
+ if check_option_in_params(_["projectId"] + ":" + _["id"], ctx.params.get(str(param.name))):
396
400
  continue
397
401
  options.append((_["projectId"] + ":" + _["id"], _["label"]))
398
402
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_DESC)
@@ -407,7 +411,7 @@ def vocabularies(
407
411
  options = []
408
412
  for _ in vocabs:
409
413
  url = _["iri"]
410
- if check_option_in_params(url, ctx.params.get(param.name)): # type: ignore[attr-defined]
414
+ if check_option_in_params(url, ctx.params.get(str(param.name))):
411
415
  continue
412
416
  url = _["iri"]
413
417
  try:
@@ -491,32 +495,6 @@ def installable_packages(ctx: Context, param: Argument, incomplete: str) -> list
491
495
  )
492
496
 
493
497
 
494
- def workflow_io_input_files(ctx: Context, param: Argument, incomplete: str) -> list[CompletionItem]:
495
- """Prepare a list of acceptable workflow io input files."""
496
- return (
497
- file_list(incomplete=incomplete, suffix=".csv", description="CSV Dataset resource")
498
- + file_list(incomplete=incomplete, suffix=".xml", description="XML Dataset resource")
499
- + file_list(incomplete=incomplete, suffix=".json", description="JSON Dataset resource")
500
- + file_list(incomplete=incomplete, suffix=".xlsx", description="Excel Dataset resource")
501
- + file_list(incomplete=incomplete, suffix=".txt", description="Text Dataset resource")
502
- + file_list(incomplete=incomplete, suffix=".zip", description="Multi CSV Dataset resource")
503
- )
504
-
505
-
506
- def workflow_io_input_mimetypes(
507
- ctx: Context, param: Argument, incomplete: str
508
- ) -> list[CompletionItem]:
509
- """Prepare a list of acceptable workflow io input mimetypes."""
510
- return (
511
- file_list(incomplete=incomplete, suffix=".csv", description="CSV Dataset resource")
512
- + file_list(incomplete=incomplete, suffix=".xml", description="XML Dataset resource")
513
- + file_list(incomplete=incomplete, suffix=".json", description="JSON Dataset resource")
514
- + file_list(incomplete=incomplete, suffix=".xlsx", description="Excel Dataset resource")
515
- + file_list(incomplete=incomplete, suffix=".txt", description="Text Dataset resource")
516
- + file_list(incomplete=incomplete, suffix=".zip", description="Multi CSV Dataset resource")
517
- )
518
-
519
-
520
498
  def workflow_io_output_files(
521
499
  ctx: Context, param: Argument, incomplete: str
522
500
  ) -> list[CompletionItem]:
@@ -531,6 +509,18 @@ def workflow_io_output_files(
531
509
  )
532
510
 
533
511
 
512
+ def workflow_io_input_files(ctx: Context, param: Argument, incomplete: str) -> list[CompletionItem]:
513
+ """Prepare a list of acceptable workflow io input files."""
514
+ files = []
515
+ for extension, info in get_dataset_file_mapping().items():
516
+ # handle zip extension separately.
517
+ if extension != ".zip":
518
+ files += file_list(
519
+ incomplete=incomplete, suffix=extension, description=info["description"]
520
+ )
521
+ return files
522
+
523
+
534
524
  def get_dataset_file_mapping() -> dict[str, dict[str, str]]:
535
525
  """Return file extension to type and description mapping"""
536
526
  return {
@@ -543,15 +533,22 @@ def get_dataset_file_mapping() -> dict[str, dict[str, str]]:
543
533
  ".json.zip": {"description": "JSON Dataset resource (zipped)", "type": "json"},
544
534
  ".jsonl": {"description": "JSON Lines Dataset resource", "type": "json"},
545
535
  ".jsonl.zip": {"description": "JSON Lines Dataset resource (zipped)", "type": "json"},
546
- ".yaml": {"description": "YAML Document", "type": "text"},
547
- ".yaml.zip": {"description": "YAML Document (zipped)", "type": "text"},
548
- ".yml": {"description": "YAML Document", "type": "text"},
549
- ".yml.zip": {"description": "YAML Document (zipped)", "type": "text"},
536
+ ".yaml": {"description": "YAML Text Document", "type": "text"},
537
+ ".yaml.zip": {"description": "YAML Text Document (zipped)", "type": "text"},
538
+ ".md": {"description": "Markdown Text Document", "type": "text"},
539
+ ".md.zip": {"description": "Markdown Text Document (zipped)", "type": "text"},
540
+ ".yml": {"description": "YAML Text Document", "type": "text"},
541
+ ".yml.zip": {"description": "YAML Text Document (zipped)", "type": "text"},
550
542
  ".ttl": {"description": "RDF file Dataset resource", "type": "file"},
551
543
  ".orc": {"description": "Apache ORC Dataset resource", "type": "orc"},
552
544
  ".txt": {"description": "Text dataset resource", "type": "text"},
553
545
  ".txt.zip": {"description": "Text dataset resource (zipped)", "type": "text"},
554
- ".zip": {"description": "multiCsv Dataset resource", "type": "multiCsv"},
546
+ ".zip": {"description": "Potential multiCsv Dataset resource", "type": "multiCsv"},
547
+ ".pdf": {"description": "Potential Binary Dataset resource", "type": "binaryFile"},
548
+ ".png": {"description": "Potential Binary Dataset resource", "type": "binaryFile"},
549
+ ".jpg": {"description": "Potential Binary Dataset resource", "type": "binaryFile"},
550
+ ".gif": {"description": "Potential Binary Dataset resource", "type": "binaryFile"},
551
+ ".tiff": {"description": "Potential Binary Dataset resource", "type": "binaryFile"},
555
552
  }
556
553
 
557
554
 
@@ -704,7 +701,7 @@ def workflow_ids(ctx: Context, param: Argument, incomplete: str) -> list[Complet
704
701
  for _ in workflows:
705
702
  workflow = _["projectId"] + ":" + _["id"]
706
703
  label = _["label"]
707
- if check_option_in_params(workflow, ctx.params.get(param.name)): # type: ignore[attr-defined]
704
+ if check_option_in_params(workflow, ctx.params.get(str(param.name))):
708
705
  continue
709
706
  options.append((workflow, label))
710
707
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_DESC)
@@ -734,7 +731,7 @@ def project_ids(ctx: Context, param: Argument, incomplete: str) -> list[Completi
734
731
  project_id = _["name"]
735
732
  label = _["metaData"]["label"]
736
733
  # do not add project if already in the command line
737
- if check_option_in_params(project_id, ctx.params.get(param.name)): # type: ignore[attr-defined]
734
+ if check_option_in_params(project_id, ctx.params.get(str(param.name))):
738
735
  continue
739
736
  options.append((project_id, label))
740
737
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_DESC)
@@ -755,7 +752,7 @@ def _prepare_graph_options(
755
752
  iri = graph["iri"]
756
753
  label = graph["label"]["title"]
757
754
  # do not add graph if already in the command line
758
- if skip_selected_iris & check_option_in_params(iri, ctx.params.get(param.name)): # type: ignore[attr-defined]
755
+ if skip_selected_iris & check_option_in_params(iri, ctx.params.get(str(param.name))):
759
756
  continue
760
757
  options.append((iri, label))
761
758
  return options
@@ -891,7 +888,7 @@ def variable_ids(ctx: Context, param: Argument, incomplete: str) -> list[Complet
891
888
  if label == "":
892
889
  label = f"Current value: {_['value']}"
893
890
  # do not add project if already in the command line
894
- if check_option_in_params(variable_id, ctx.params.get(param.name)): # type: ignore[attr-defined]
891
+ if check_option_in_params(variable_id, ctx.params.get(str(param.name))):
895
892
  continue
896
893
  options.append((variable_id, label))
897
894
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_KEY)
@@ -1028,7 +1025,7 @@ def user_group_ids(ctx: Context, param: Argument, incomplete: str) -> list[Compl
1028
1025
  if not users:
1029
1026
  return []
1030
1027
 
1031
- if param.name == "unassign_group": # type: ignore[attr-defined]
1028
+ if param.name == "unassign_group":
1032
1029
  groups = user_groups(user_id=users[0]["id"])
1033
1030
  else:
1034
1031
  user_group_names = [group["name"] for group in user_groups(user_id=users[0]["id"])]
cmem_cmemc/constants.py CHANGED
@@ -13,3 +13,5 @@ NS_ACL = "http://eccenca.com/ac/"
13
13
  NS_USER = "http://eccenca.com/"
14
14
  NS_GROUP = "http://eccenca.com/"
15
15
  NS_ACTION = "https://vocab.eccenca.com/auth/Action/"
16
+
17
+ UNKNOWN_GRAPH_ERROR = "The graph {} is not accessible or does not exist."
cmem_cmemc/utils.py CHANGED
@@ -12,7 +12,7 @@ from typing import TYPE_CHECKING
12
12
  from zipfile import BadZipFile, ZipFile
13
13
 
14
14
  import requests
15
- from click import ClickException
15
+ from click import Argument, ClickException
16
16
  from cmem.cmempy.dp.proxy.graph import get_graphs_list
17
17
  from cmem.cmempy.queries import QueryCatalog
18
18
  from cmem.cmempy.workspace.projects.project import get_projects
@@ -84,27 +84,57 @@ def iri_to_qname(iri: str) -> str:
84
84
  return iri
85
85
 
86
86
 
87
- def read_rdf_graph_files(directory_path: str) -> list[tuple[str, str]]:
88
- """Read all files from directory_path and output as tuples.
87
+ @dataclass
88
+ class RdfGraphData:
89
+ """Represents the data structure for RDF graph information.
90
+
91
+ Attributes:
92
+ file_path: The absolute path to the RDF data file.
93
+ graph_iri: The iri of the graph.
94
+ graph_imports: A list of graph imports.
89
95
 
90
- The tuple format is (filepath, graph_name),
91
- for example ("/tmp/rdf.nt", "http://example.com")
92
96
  """
93
- rdf_graphs = []
97
+
98
+ file_path: str
99
+ graph_iri: str
100
+ graph_imports: list[str]
101
+
102
+
103
+ def read_rdf_graph_files(directory_path: str) -> list[RdfGraphData]:
104
+ """Read all files from directory_path and output as RdfGraphData."""
105
+ rdf_graphs: list[RdfGraphData] = []
94
106
  for root, _, files in os.walk(directory_path):
95
107
  for _file in files:
96
- if _file.endswith(".graph"):
108
+ if _file.endswith((".graph", ".imports")):
97
109
  continue
98
- full_file_path = SmartPath(root) / _file
110
+ file_path = SmartPath(root) / _file
99
111
  # Handle compressed files (like .gz)
100
112
  if _file.endswith(".gz"):
101
- graph_file_name = _file.replace(".gz", ".graph")
113
+ _graph_file = _file.replace(".gz", ".graph")
114
+ _graph_imports_file = _file.replace(".gz", ".imports")
102
115
  else:
103
- graph_file_name = f"{_file}.graph"
104
- full_graph_file_name_path = SmartPath(root) / graph_file_name
105
- if full_graph_file_name_path.exists():
106
- graph_name = read_file_to_string(str(full_graph_file_name_path)).strip()
107
- rdf_graphs.append((str(full_file_path.resolve()), graph_name))
116
+ _graph_file = f"{_file}.graph"
117
+ _graph_imports_file = f"{_file}.imports"
118
+ graph_file_path = SmartPath(root) / _graph_file
119
+ imports_file_path = SmartPath(root) / _graph_imports_file
120
+ graph_name = ""
121
+ graph_imports = []
122
+ if graph_file_path.exists():
123
+ graph_name = read_file_to_string(str(graph_file_path)).strip()
124
+
125
+ if imports_file_path.exists():
126
+ # Read the graph imports.
127
+ imports_content = read_file_to_string(str(imports_file_path)).strip()
128
+ graph_imports = imports_content.split("\n") if imports_content else []
129
+
130
+ if graph_name:
131
+ rdf_graphs.append(
132
+ RdfGraphData(
133
+ file_path=str(file_path.resolve()),
134
+ graph_iri=graph_name,
135
+ graph_imports=graph_imports,
136
+ )
137
+ )
108
138
  return rdf_graphs
109
139
 
110
140
 
@@ -414,3 +444,11 @@ def is_enabled(params: dict[str, str], config: PureSectionConfigParser, key: str
414
444
  return str_to_bool(config.defaults()[key])
415
445
 
416
446
  return False
447
+
448
+
449
+ def tuple_to_list(ctx: type["ApplicationContext"], param: Argument, value: tuple) -> list: # noqa: ARG001
450
+ """Get a list from a tuple
451
+
452
+ Used as callback to have mutable values
453
+ """
454
+ return list(value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: cmem-cmemc
3
- Version: 25.1.1
3
+ Version: 25.3.0
4
4
  Summary: Command line client for eccenca Corporate Memory
5
5
  License: Apache-2.0
6
6
  Author: eccenca
@@ -27,10 +27,10 @@ Classifier: Topic :: Software Development :: Testing
27
27
  Classifier: Topic :: Utilities
28
28
  Requires-Dist: beautifulsoup4 (>=4.13.3,<5.0.0)
29
29
  Requires-Dist: certifi (>=2024.2.2)
30
- Requires-Dist: click (>=8.1.8,<9.0.0)
30
+ Requires-Dist: click (>=8.1.8,<8.2.0)
31
31
  Requires-Dist: click-didyoumean (>=0.3.1,<0.4.0)
32
32
  Requires-Dist: click-help-colors (>=0.9.4,<0.10.0)
33
- Requires-Dist: cmem-cmempy (==25.1.0)
33
+ Requires-Dist: cmem-cmempy (==25.2.0)
34
34
  Requires-Dist: configparser (>=7.2.0,<8.0.0)
35
35
  Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
36
36
  Requires-Dist: junit-xml (>=1.9,<2.0)
@@ -2,32 +2,33 @@ cmem_cmemc/__init__.py,sha256=-RPEVweA-fcmEAynszDDMKwArJgxZpGW61UBiV7O4Og,24
2
2
  cmem_cmemc/_cmemc.zsh,sha256=fmkrBHIQxus8cp2AgO1tzZ5mNZdGL_83cYz3a9uAdsg,1326
3
3
  cmem_cmemc/cli.py,sha256=vDdSHFmXUstC3T7OlbPSd0hXxyigJE4VVgRMcsNz5cc,4538
4
4
  cmem_cmemc/command.py,sha256=nBtrwPKFJLRpD3IPk5hKyn2LOMl-1ae7SV9iRhgky8k,1958
5
- cmem_cmemc/command_group.py,sha256=0ltd8xY0yN6_ARR2kkwx7Hibj4glT9M0_bnjKlMhz8g,3371
5
+ cmem_cmemc/command_group.py,sha256=DCHQzt2JXRLZWXbnKd5-ZpIp5GTN0SKX90Me8R8naKQ,3429
6
6
  cmem_cmemc/commands/__init__.py,sha256=NaGM5jOzf0S_-4UIAwlVDOf2AZ3mliGPoRLXQJfTyZs,22
7
7
  cmem_cmemc/commands/acl.py,sha256=zy27D_GeEaYEn3P6EEHtQ55sbWkjgwTgspCeuBWPL14,16006
8
- cmem_cmemc/commands/admin.py,sha256=VGFEen4aVcKr2Fk3IoVu3JX-r8r99r7iE-3QFrkjJs0,9249
8
+ cmem_cmemc/commands/admin.py,sha256=wq9QE-5hfxUM1zQbzicjgQ-T_D9Sa2hlRNVyIHMbzNk,9234
9
9
  cmem_cmemc/commands/client.py,sha256=nBs7MoF2wF45AteTCeIQrXcOwKmHHCd8_lG_SM2mQSA,5127
10
- cmem_cmemc/commands/config.py,sha256=MXiBGMKOj8zVyKOBwly1Hg3ywkylfIBUjEz30WkibkU,5777
10
+ cmem_cmemc/commands/config.py,sha256=VHiVkW6NFuz-tpKXRPl7dO1gIXQLOuEhlGVxb422qwA,5803
11
11
  cmem_cmemc/commands/dataset.py,sha256=zylVsfBD92LzHgQ96edNKaQNsf0zKoPro0VQdX--Mu8,30488
12
- cmem_cmemc/commands/graph.py,sha256=RrrmiMTwKcD8CpWoM5ZUNwOFlOO8AIlauS39G_h41xg,32486
12
+ cmem_cmemc/commands/graph.py,sha256=_VtNpCwZF-Cdrv_WAQ5x1pYUB-FnWOxq4-n5qIzu81E,32335
13
+ cmem_cmemc/commands/graph_imports.py,sha256=gUcBSBLk7TXyvMth1jdLTb1L20iWidzjXNgb9E1fZUg,14157
13
14
  cmem_cmemc/commands/manual.py,sha256=-sZWeFL92Kj8gL3VYsbpKh2ZaVTyM3LgKaUcpNn9u3A,2179
14
15
  cmem_cmemc/commands/metrics.py,sha256=pIBRTq90f7MEI99HLdFLN3D1xQ2Z2u6VKUeTIz0X7DY,12205
15
- cmem_cmemc/commands/migration.py,sha256=MtavtlvXrmFfgBGL_GWlDat_8Ub6cjHeAiNorKtQo_0,9644
16
- cmem_cmemc/commands/project.py,sha256=cAJ6Bwl0clzOP4b6CXa8wXsISrLQJTFEL-vJf_btjPc,20585
17
- cmem_cmemc/commands/python.py,sha256=1It8_6Lh79hHafEtHtl7f3SkJt8Zj_VEIH-muczl5ys,11947
18
- cmem_cmemc/commands/query.py,sha256=AFOBjeDYtSHpPthY8PTfPoBiNikOqMhk8c8SVzsXEVY,27579
19
- cmem_cmemc/commands/resource.py,sha256=O0RV-lJNdTI3-pTmnKv5zcAkfTkuFVs0UbmknCbsgUU,7788
20
- cmem_cmemc/commands/scheduler.py,sha256=Ew-VvhyuoLr4YTPCjEAcQWK1LV8lFoH1cnVjfVwIQnM,8761
21
- cmem_cmemc/commands/store.py,sha256=zZiOBu2rGqZDkfp2xgO7GLHMRhO3Yxt0myODBNM_K3M,10411
16
+ cmem_cmemc/commands/migration.py,sha256=y9v4Be7WELGjDGDBZrfLBeqU_G_JH1fnP5UVG9qjB3g,9638
17
+ cmem_cmemc/commands/project.py,sha256=zHqs7XBsRjzTO6EGxaN_TgZ_rsqyIPF59aObuMhsfmA,20593
18
+ cmem_cmemc/commands/python.py,sha256=7ExdKr7nTED5ZZGjeBk5UngNI3F_KNcavwUgwaxApV0,11965
19
+ cmem_cmemc/commands/query.py,sha256=XtWZHu7BhQfAHEh3gbFTeJwI88mUhHFvMCyrFRVVSVs,27601
20
+ cmem_cmemc/commands/resource.py,sha256=74cn_yqMv3a6xOQAPpNCuluTWEH-_2PGENJnl7y8qz4,7778
21
+ cmem_cmemc/commands/scheduler.py,sha256=zYeO1-Hlxh9D-I9JIweQ-SEA0la0wv0EicY_UY7rNCg,8751
22
+ cmem_cmemc/commands/store.py,sha256=19otpzsOv2F-mH2cuq4Oz2i2vAHYdfSIQm2ec81yIFg,10429
22
23
  cmem_cmemc/commands/user.py,sha256=ANZpeOBA46xiqOcNPrueComsCV0gEBbav-vOL9VgyX4,12535
23
24
  cmem_cmemc/commands/validation.py,sha256=Fv5yBIXzqy8FyjIzo-wJkv_7H5bhtcQhMxFIlJEVoBw,29495
24
- cmem_cmemc/commands/variable.py,sha256=VZ60pl98xoOFCkRGdTnJENfgaHWoUoUTgkgfMT4TQgQ,11568
25
+ cmem_cmemc/commands/variable.py,sha256=aLRH_rFe0h7JBpKIqzcevbk26vczgUGokIDY8g6LPxA,11576
25
26
  cmem_cmemc/commands/vocabulary.py,sha256=fdXsG7gspA6HeOasXis1ky9UIZG-qRYP-NiFcvzCTKM,17840
26
- cmem_cmemc/commands/workflow.py,sha256=RRSWJsJzL5w-E7gb--aQgqU1BB1uZt-XCCLaHcNVhxs,25536
27
+ cmem_cmemc/commands/workflow.py,sha256=HSgEMbK_anYZpme4yiQ4-pxGfQcL4YWa29lrm0aT8Nk,25777
27
28
  cmem_cmemc/commands/workspace.py,sha256=IcZgBsvtulLRFofS70qpln6oKQIZunrVLfSAUeiFhCA,4579
28
- cmem_cmemc/completion.py,sha256=I-unDn_zDO5H0fNsRRIgHodQ3_NtCi_sxALwpRickaE,45723
29
+ cmem_cmemc/completion.py,sha256=NTNJWK5nllXVebACAC68NnKKru_VU4lhLA-shgzJH7Y,45092
29
30
  cmem_cmemc/config_parser.py,sha256=NduwOT-BB_uAk3pz1Y-ex18RQJW-jjHzkQKCEUUK6Hc,1276
30
- cmem_cmemc/constants.py,sha256=VKNF5-6fzZXWzPgm1OAGhWvyL4YE8SRq52kkpJjUgB0,475
31
+ cmem_cmemc/constants.py,sha256=pzZYbSaTDUiWmE-VOAHB20oivHew5_FP9UTejySsVK4,550
31
32
  cmem_cmemc/context.py,sha256=jIta2wgQ3wHviLpzaHKlt-6_Ur7M04I6fBtIIF7s4Cs,22247
32
33
  cmem_cmemc/exceptions.py,sha256=0lsGOfXhciNGJloJGERMbbPuBbs5IwIIJ_5YnY9qQ-8,546
33
34
  cmem_cmemc/manual_helper/__init__.py,sha256=G3Lqw2aPxo8x63Tg7L0aa5VD9BMaRzZDmhrog7IuEPg,43
@@ -51,9 +52,9 @@ cmem_cmemc/smart_path/clients/__init__.py,sha256=YFOm69BfTCRvAcJjN_CoUmCv3kzEciy
51
52
  cmem_cmemc/smart_path/clients/http.py,sha256=3clZu2v4uuOvPY4MY_8SVSy7hIXJDNooahFRBRpy0ok,2347
52
53
  cmem_cmemc/string_processor.py,sha256=kSVePdgFmf2ekurKj6TbDJn6ur82VGLwCsTJ9ODfBEU,2879
53
54
  cmem_cmemc/title_helper.py,sha256=7frjAR54_Xc1gszOWXfzSmKFTawNJQ7kkXhZcHmQLyw,1250
54
- cmem_cmemc/utils.py,sha256=TTis2uwB1KB_1Q7oebblsLsNf54Sn-UzIXKBfq874KU,13489
55
- cmem_cmemc-25.1.1.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
56
- cmem_cmemc-25.1.1.dist-info/METADATA,sha256=NrCdgxB6Flgkgvse-71Rnf6VukElbdSjaoDBobi_nHI,5642
57
- cmem_cmemc-25.1.1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
58
- cmem_cmemc-25.1.1.dist-info/entry_points.txt,sha256=2G0AWAyz501EHpFTjIxccdlCTsHt80NT0pdUGP1QkPA,45
59
- cmem_cmemc-25.1.1.dist-info/RECORD,,
55
+ cmem_cmemc/utils.py,sha256=PkDFDISz7uemJCmyIWmtCcjfR_gRnRBL8ao76Ex-py8,14669
56
+ cmem_cmemc-25.3.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
57
+ cmem_cmemc-25.3.0.dist-info/METADATA,sha256=aGWBNWxM2mPs_3OrXPVnGWUIiqBcexhEnIvTnl6sN_c,5642
58
+ cmem_cmemc-25.3.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
59
+ cmem_cmemc-25.3.0.dist-info/entry_points.txt,sha256=2G0AWAyz501EHpFTjIxccdlCTsHt80NT0pdUGP1QkPA,45
60
+ cmem_cmemc-25.3.0.dist-info/RECORD,,