cmem-cmemc 25.3.0__py3-none-any.whl → 25.5.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.
@@ -53,6 +53,7 @@ FILE_EXTENSIONS_TO_PLUGIN_ID = {
53
53
  ".txt": "text",
54
54
  ".md": "text",
55
55
  ".xlsx": "excel",
56
+ ".xls": "excel",
56
57
  ".zip": "multiCsv",
57
58
  ".pdf": "binaryFile",
58
59
  ".png": "binaryFile",
cmem_cmemc/completion.py CHANGED
@@ -53,11 +53,6 @@ SORT_BY_KEY = 0
53
53
  SORT_BY_DESC = 1
54
54
 
55
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
-
61
56
  def finalize_completion(
62
57
  candidates: list,
63
58
  incomplete: str = "",
@@ -130,10 +125,7 @@ def finalize_completion(
130
125
  key=lambda x: (str(x[sort_by]).casefold(), str(x[sort_by])),
131
126
  reverse=reverse,
132
127
  )
133
- return [
134
- CompletionItem(value=escape_colon(element[0]), help=element[1])
135
- for element in sorted_list
136
- ]
128
+ return [CompletionItem(value=element[0], help=element[1]) for element in sorted_list]
137
129
 
138
130
  raise ClickException(
139
131
  "Candidates should be a list of strings or a list of tuples." f" Got {candidates}"
@@ -199,7 +191,10 @@ def acl_actions(ctx: Context, param: Argument, incomplete: str) -> list[Completi
199
191
  if check_option_in_params(iri, ctx.params.get(str(param.name))):
200
192
  continue
201
193
  options.append((qname, name))
202
- options.append(("urn:elds-backend-all-actions", "All Actions (until 24.2.x, now deprecated)"))
194
+ if not check_option_in_params("urn:elds-backend-all-actions", ctx.params.get(str(param.name))):
195
+ options.append(
196
+ ("urn:elds-backend-all-actions", "All Actions (until 24.2.x, now deprecated)")
197
+ )
203
198
  return finalize_completion(candidates=options, incomplete=incomplete, sort_by=SORT_BY_DESC)
204
199
 
205
200
 
@@ -359,10 +354,10 @@ def dataset_list_filter(ctx: Context, param: Argument, incomplete: str) -> list[
359
354
  ("type", "Filter by dataset type."),
360
355
  ]
361
356
  filter_regex = [
362
- (r"^Final\:", "Example: Dataset label starts with 'Final:'."),
357
+ ("^Final:", "Example: Dataset label starts with 'Final:'."),
363
358
  (
364
359
  r"[12][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]",
365
- "Example: Dataset label contains a data-like string.",
360
+ "Example: Dataset label contains a date-like string.",
366
361
  ),
367
362
  ]
368
363
  options = []
@@ -526,6 +521,7 @@ def get_dataset_file_mapping() -> dict[str, dict[str, str]]:
526
521
  return {
527
522
  ".csv": {"description": "CSV Dataset resource", "type": "csv"},
528
523
  ".csv.zip": {"description": "CSV Dataset resource (zipped)", "type": "csv"},
524
+ ".xls": {"description": "Excel Dataset resource", "type": "excel"},
529
525
  ".xlsx": {"description": "Excel Dataset resource", "type": "excel"},
530
526
  ".xml": {"description": "XML Dataset resource", "type": "xml"},
531
527
  ".xml.zip": {"description": "XML Dataset resource (zipped)", "type": "xml"},
@@ -643,10 +639,11 @@ def placeholder(ctx: Context, param: Argument, incomplete: str) -> list[Completi
643
639
  args = get_completion_args(incomplete)
644
640
  # setup configuration
645
641
  ApplicationContext.set_connection_from_params(ctx.find_root().params)
642
+ catalog_graph = ctx.params.get("catalog_graph")
646
643
  # extract placeholder from given queries in the command line
647
644
  options = []
648
645
  placeholders: dict[str, QueryPlaceholder] = {}
649
- catalog = QueryCatalog() # fetch all queries
646
+ catalog = QueryCatalog(graph=catalog_graph) if catalog_graph else QueryCatalog()
650
647
  for _, arg in enumerate(args):
651
648
  query = catalog.get_query(arg)
652
649
  if query is not None:
@@ -654,7 +651,7 @@ def placeholder(ctx: Context, param: Argument, incomplete: str) -> list[Completi
654
651
  placeholders = placeholders | get_placeholders_for_query(iri=query.url)
655
652
  # collect all placeholder keys
656
653
  options.extend(list(query.get_placeholder_keys()))
657
- # look if cursor is in value position of the -p option and
654
+ # look if the cursor is in value position of the -p option and
658
655
  # use placeholder value completion, in case it is
659
656
  if args[len(args) - 2] in ("-p", "--parameter"):
660
657
  key = args[len(args) - 1]
@@ -676,8 +673,10 @@ def placeholder(ctx: Context, param: Argument, incomplete: str) -> list[Completi
676
673
  def remote_queries(ctx: Context, param: Argument, incomplete: str) -> list[CompletionItem]:
677
674
  """Prepare a list of query URIs."""
678
675
  ApplicationContext.set_connection_from_params(ctx.find_root().params)
676
+ catalog_graph = ctx.params.get("catalog_graph")
677
+ catalog = QueryCatalog(graph=catalog_graph) if catalog_graph else QueryCatalog()
679
678
  options = []
680
- for query in QueryCatalog().get_queries().values():
679
+ for query in catalog.get_queries().values():
681
680
  url = query.short_url
682
681
  label = query.label
683
682
  options.append((url, label))
@@ -729,7 +728,7 @@ def project_ids(ctx: Context, param: Argument, incomplete: str) -> list[Completi
729
728
  options = []
730
729
  for _ in projects:
731
730
  project_id = _["name"]
732
- label = _["metaData"]["label"]
731
+ label = _["metaData"].get("label", "")
733
732
  # do not add project if already in the command line
734
733
  if check_option_in_params(project_id, ctx.params.get(str(param.name))):
735
734
  continue
@@ -798,11 +797,11 @@ def graph_uris_with_all_graph_uri(
798
797
  options = graph_uris(ctx, param, incomplete, writeable=True, readonly=True)
799
798
  options.append(
800
799
  CompletionItem(
801
- value=r"urn\:elds-backend-all-graphs", help="All Graphs (until 24.2.x, now deprecated)"
800
+ value=r"urn:elds-backend-all-graphs", help="All Graphs (until 24.2.x, now deprecated)"
802
801
  )
803
802
  )
804
803
  options.append(
805
- CompletionItem(value=r"https\://vocab.eccenca.com/auth/AllGraphs", help="All Graphs")
804
+ CompletionItem(value=r"https://vocab.eccenca.com/auth/AllGraphs", help="All Graphs")
806
805
  )
807
806
  return options
808
807
 
@@ -935,9 +934,7 @@ def resource_list_filter(ctx: Context, param: Argument, incomplete: str) -> list
935
934
  if args[len(args) - 1] == "--filter":
936
935
  return [CompletionItem(value=f[0], help=f[1]) for f in filter_names]
937
936
  if args[len(args) - 1] == "project":
938
- return finalize_completion(
939
- candidates=project_ids(ctx, param, incomplete), incomplete=incomplete
940
- )
937
+ return project_ids(ctx, param, incomplete)
941
938
  if args[len(args) - 1] == "regex":
942
939
  return finalize_completion(candidates=filter_values_regex, incomplete=incomplete)
943
940
  return []
@@ -958,7 +955,7 @@ def workflow_list_filter(ctx: Context, param: Argument, incomplete: str) -> list
958
955
  ("input-output", "List only workflows with a variable input and output dataset."),
959
956
  ]
960
957
  filter_regex = [
961
- (r"^Final\:", "Example: Workflow label starts with 'Final:'."),
958
+ (r"^Final:", "Example: Workflow label starts with 'Final:'."),
962
959
  (
963
960
  r"[12][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]",
964
961
  "Example: Workflow label contains a data-like string.",
cmem_cmemc/context.py CHANGED
@@ -29,9 +29,9 @@ from cmem_cmemc.exceptions import InvalidConfigurationError
29
29
  from cmem_cmemc.string_processor import StringProcessor, process_row
30
30
  from cmem_cmemc.utils import is_enabled, str_to_bool
31
31
 
32
- DI_TARGET_VERSION = "v25.1.0"
32
+ DI_TARGET_VERSION = "v25.3.0"
33
33
 
34
- EXPLORE_TARGET_VERSION = "v25.1.0"
34
+ EXPLORE_TARGET_VERSION = "v25.3.0"
35
35
 
36
36
  KNOWN_CONFIG_KEYS = {
37
37
  "CMEM_BASE_URI": cmempy_config.get_cmem_base_uri,
@@ -31,6 +31,8 @@ def get_icon_for_command_group(full_name: str) -> str:
31
31
  "project variable": "material/variable-box",
32
32
  "query": "eccenca/application-queries",
33
33
  "graph": "eccenca/artefact-dataset-eccencadataplatform",
34
+ "graph imports": "material/family-tree",
35
+ "graph insights": "eccenca/graph-insights",
34
36
  "graph validation": "octicons/verified-16",
35
37
  "vocabulary": "eccenca/application-vocabularies",
36
38
  "vocabulary cache": "eccenca/application-vocabularies",
@@ -58,6 +60,7 @@ def get_tags_for_command_group(full_name: str) -> str:
58
60
  "project variable": ["Variables", "cmemc"],
59
61
  "query": ["SPARQL", "cmemc"],
60
62
  "graph": ["KnowledgeGraph", "cmemc"],
63
+ "graph imports": ["KnowledgeGraph", "cmemc"],
61
64
  "graph validation": ["KnowledgeGraph", "Validation", "cmemc"],
62
65
  "vocabulary": ["Vocabulary", "cmemc"],
63
66
  "vocabulary cache": ["Vocabulary", "cmemc"],
@@ -143,12 +146,10 @@ def get_commands_for_table_recursive(
143
146
  if isinstance(item, Command):
144
147
  command_name = item.name
145
148
  group_link = f"{prefix}/{group_name}/index.md".replace(" ", "/")
146
- if group_link.startswith("/"):
147
- group_link = group_link[1:]
149
+ group_link = group_link.removeprefix("/")
148
150
  command_anchor = f"{prefix}-{group_name}".replace(" ", "-")
149
151
  command_anchor += f"-{command_name}"
150
- if command_anchor.startswith("-"):
151
- command_anchor = command_anchor[1:]
152
+ command_anchor = command_anchor.removeprefix("-")
152
153
  command_link = f"{group_link}#{command_anchor}"
153
154
  new_command = {
154
155
  "command_name": command_name,
@@ -20,18 +20,23 @@ class StringProcessor(ABC):
20
20
 
21
21
 
22
22
  class TimeAgo(StringProcessor):
23
- """Create a string similar to 'x minutes ago' from a timestamp"""
23
+ """Create a string similar to 'x minutes ago' from a timestamp or iso-formated string."""
24
24
 
25
25
  def process(self, text: str) -> str:
26
26
  """Process a single string content and output the processed string."""
27
27
  if text is None:
28
28
  return ""
29
+ try:
30
+ stamp = datetime.fromisoformat(str(text))
31
+ return str(timeago.format(stamp, datetime.now(tz=timezone.utc)))
32
+ except (ValueError, TypeError):
33
+ pass
29
34
  try:
30
35
  text_as_int = int(text)
36
+ stamp = datetime.fromtimestamp(text_as_int / 1000, tz=timezone.utc)
37
+ return str(timeago.format(stamp, datetime.now(tz=timezone.utc)))
31
38
  except ValueError:
32
39
  return text
33
- stamp = datetime.fromtimestamp(text_as_int / 1000, tz=timezone.utc)
34
- return str(timeago.format(stamp, datetime.now(tz=timezone.utc)))
35
40
 
36
41
 
37
42
  class GraphLink(StringProcessor):
cmem_cmemc/utils.py CHANGED
@@ -35,7 +35,7 @@ def check_python_version(ctx: type["ApplicationContext"]) -> None:
35
35
  """Check the runtime python version and warn or error."""
36
36
  version = sys.version_info
37
37
  major_expected = [3]
38
- minor_expected = [10, 11, 12, 13]
38
+ minor_expected = [13]
39
39
  if version.major not in major_expected:
40
40
  ctx.echo_error(f"Error: cmemc can not be executed with Python {version.major}.")
41
41
  sys.exit(1)
@@ -1,8 +1,9 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: cmem-cmemc
3
- Version: 25.3.0
3
+ Version: 25.5.0
4
4
  Summary: Command line client for eccenca Corporate Memory
5
5
  License: Apache-2.0
6
+ License-File: LICENSE
6
7
  Author: eccenca
7
8
  Author-email: cmempy-developer@eccenca.com
8
9
  Requires-Python: >=3.10,<4.0
@@ -21,16 +22,17 @@ Classifier: Programming Language :: Python :: 3.10
21
22
  Classifier: Programming Language :: Python :: 3.11
22
23
  Classifier: Programming Language :: Python :: 3.12
23
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
24
26
  Classifier: Programming Language :: Python :: 3 :: Only
25
27
  Classifier: Topic :: Database
26
28
  Classifier: Topic :: Software Development :: Testing
27
29
  Classifier: Topic :: Utilities
28
30
  Requires-Dist: beautifulsoup4 (>=4.13.3,<5.0.0)
29
31
  Requires-Dist: certifi (>=2024.2.2)
30
- Requires-Dist: click (>=8.1.8,<8.2.0)
32
+ Requires-Dist: click (>=8.3.0,<9.0.0)
31
33
  Requires-Dist: click-didyoumean (>=0.3.1,<0.4.0)
32
34
  Requires-Dist: click-help-colors (>=0.9.4,<0.10.0)
33
- Requires-Dist: cmem-cmempy (==25.2.0)
35
+ Requires-Dist: cmem-cmempy (==25.4.0)
34
36
  Requires-Dist: configparser (>=7.2.0,<8.0.0)
35
37
  Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
36
38
  Requires-Dist: junit-xml (>=1.9,<2.0)
@@ -2,38 +2,39 @@ 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=DCHQzt2JXRLZWXbnKd5-ZpIp5GTN0SKX90Me8R8naKQ,3429
5
+ cmem_cmemc/command_group.py,sha256=LSCQfvRQm8R-HsBZfUs-5lzEGEf_LMaleFwZ1AKpZRE,3488
6
6
  cmem_cmemc/commands/__init__.py,sha256=NaGM5jOzf0S_-4UIAwlVDOf2AZ3mliGPoRLXQJfTyZs,22
7
- cmem_cmemc/commands/acl.py,sha256=zy27D_GeEaYEn3P6EEHtQ55sbWkjgwTgspCeuBWPL14,16006
8
- cmem_cmemc/commands/admin.py,sha256=wq9QE-5hfxUM1zQbzicjgQ-T_D9Sa2hlRNVyIHMbzNk,9234
7
+ cmem_cmemc/commands/acl.py,sha256=vJ3H5eeWiVCtGk1ZpEF2OqXeHurZgPwakD8YT09lnVM,19030
8
+ cmem_cmemc/commands/admin.py,sha256=F-393oXTVYV7HxK5NxuhONlBIEg7wffxE7DAKDuasG4,10192
9
9
  cmem_cmemc/commands/client.py,sha256=nBs7MoF2wF45AteTCeIQrXcOwKmHHCd8_lG_SM2mQSA,5127
10
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=_VtNpCwZF-Cdrv_WAQ5x1pYUB-FnWOxq4-n5qIzu81E,32335
13
- cmem_cmemc/commands/graph_imports.py,sha256=gUcBSBLk7TXyvMth1jdLTb1L20iWidzjXNgb9E1fZUg,14157
12
+ cmem_cmemc/commands/graph.py,sha256=uAI7dEDRjwLSGl6QsJ0PsAycJf2-EZNNn_lIFliDE9Q,32662
13
+ cmem_cmemc/commands/graph_imports.py,sha256=CYgTUSj8giHoWzz0Qjtup0H1V5GKZEI3xXdA_9w_btI,14046
14
+ cmem_cmemc/commands/graph_insights.py,sha256=ARgaYeKBH1b2OIKVjgOPwgAa8mVzo3CLCstcw4Z53z4,13193
14
15
  cmem_cmemc/commands/manual.py,sha256=-sZWeFL92Kj8gL3VYsbpKh2ZaVTyM3LgKaUcpNn9u3A,2179
15
16
  cmem_cmemc/commands/metrics.py,sha256=pIBRTq90f7MEI99HLdFLN3D1xQ2Z2u6VKUeTIz0X7DY,12205
16
17
  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/project.py,sha256=0cnThtaRZOc04EXR31JFEUSONKbh3ANQG4vZANGwfWA,20601
18
19
  cmem_cmemc/commands/python.py,sha256=7ExdKr7nTED5ZZGjeBk5UngNI3F_KNcavwUgwaxApV0,11965
19
- cmem_cmemc/commands/query.py,sha256=XtWZHu7BhQfAHEh3gbFTeJwI88mUhHFvMCyrFRVVSVs,27601
20
+ cmem_cmemc/commands/query.py,sha256=Dra4BHshfec1nvVJbDvLT9VTjfesWJGSQCbyNmnnMWI,28788
20
21
  cmem_cmemc/commands/resource.py,sha256=74cn_yqMv3a6xOQAPpNCuluTWEH-_2PGENJnl7y8qz4,7778
21
22
  cmem_cmemc/commands/scheduler.py,sha256=zYeO1-Hlxh9D-I9JIweQ-SEA0la0wv0EicY_UY7rNCg,8751
22
- cmem_cmemc/commands/store.py,sha256=19otpzsOv2F-mH2cuq4Oz2i2vAHYdfSIQm2ec81yIFg,10429
23
+ cmem_cmemc/commands/store.py,sha256=W_6LXq98If50-X-XYZUQsYodVwUjOSm3_jyMp62pFuA,10599
23
24
  cmem_cmemc/commands/user.py,sha256=ANZpeOBA46xiqOcNPrueComsCV0gEBbav-vOL9VgyX4,12535
24
- cmem_cmemc/commands/validation.py,sha256=Fv5yBIXzqy8FyjIzo-wJkv_7H5bhtcQhMxFIlJEVoBw,29495
25
+ cmem_cmemc/commands/validation.py,sha256=ebolVeKpTTQ-tNjsmGWnfIlvv77lDwiWZRtd-qLbrHM,29509
25
26
  cmem_cmemc/commands/variable.py,sha256=aLRH_rFe0h7JBpKIqzcevbk26vczgUGokIDY8g6LPxA,11576
26
- cmem_cmemc/commands/vocabulary.py,sha256=fdXsG7gspA6HeOasXis1ky9UIZG-qRYP-NiFcvzCTKM,17840
27
- cmem_cmemc/commands/workflow.py,sha256=HSgEMbK_anYZpme4yiQ4-pxGfQcL4YWa29lrm0aT8Nk,25777
27
+ cmem_cmemc/commands/vocabulary.py,sha256=erf3zqSRqCVrN_OlCZj5Z5w4L6MRwSaUmC6V11v2vHc,18095
28
+ cmem_cmemc/commands/workflow.py,sha256=BINC-P5RsDvKTkHUbKZpzkfV5M12Cl7EPD4RLmygDOQ,25798
28
29
  cmem_cmemc/commands/workspace.py,sha256=IcZgBsvtulLRFofS70qpln6oKQIZunrVLfSAUeiFhCA,4579
29
- cmem_cmemc/completion.py,sha256=NTNJWK5nllXVebACAC68NnKKru_VU4lhLA-shgzJH7Y,45092
30
+ cmem_cmemc/completion.py,sha256=JchfZKbgpOIxN8rPyu7ZBPerIzNKXLo0tOgz8xJa5uw,45237
30
31
  cmem_cmemc/config_parser.py,sha256=NduwOT-BB_uAk3pz1Y-ex18RQJW-jjHzkQKCEUUK6Hc,1276
31
32
  cmem_cmemc/constants.py,sha256=pzZYbSaTDUiWmE-VOAHB20oivHew5_FP9UTejySsVK4,550
32
- cmem_cmemc/context.py,sha256=jIta2wgQ3wHviLpzaHKlt-6_Ur7M04I6fBtIIF7s4Cs,22247
33
+ cmem_cmemc/context.py,sha256=Axk5zTbhAMPBSMPnk9jIaOQr4GvS3Ih5Jb6ZZc-c5O0,22247
33
34
  cmem_cmemc/exceptions.py,sha256=0lsGOfXhciNGJloJGERMbbPuBbs5IwIIJ_5YnY9qQ-8,546
34
35
  cmem_cmemc/manual_helper/__init__.py,sha256=G3Lqw2aPxo8x63Tg7L0aa5VD9BMaRzZDmhrog7IuEPg,43
35
36
  cmem_cmemc/manual_helper/graph.py,sha256=HU04NYWeJ6LmW4UC7qHr1v1qsm2Md61pJ-pgWUHFmHY,3647
36
- cmem_cmemc/manual_helper/multi_page.py,sha256=EkP-7TdDKRnZbh1FYDaHv-goxfx1nQwan-EcpV0M3So,12235
37
+ cmem_cmemc/manual_helper/multi_page.py,sha256=v24CZpirD-ThVYJI34axQhC-IB9APQ_VyjMrl6WNQQk,12320
37
38
  cmem_cmemc/manual_helper/single_page.py,sha256=0mMn_IJwFCe-WPKAmxGEStb8IINLpQRxAx_F1pIxg1E,1526
38
39
  cmem_cmemc/migrations/__init__.py,sha256=i6Ri7qN58ou_MwOzm2KibPkXOD7u-1ELky-nUE5LjAA,24
39
40
  cmem_cmemc/migrations/abc.py,sha256=UGJzrvMzUFdp2-sosp49ObRI-SrUSzLJqLEhvB4QTzg,3564
@@ -50,11 +51,11 @@ cmem_cmemc/placeholder.py,sha256=PzZWpVBa7WPP5_5f-HlSoaZaOnto-1Dr9XuCTSpPnNM,238
50
51
  cmem_cmemc/smart_path/__init__.py,sha256=zDgm1kDrzLyCuIcNb8VXSdnb_CcVNjGkjgiIDVlsh74,3023
51
52
  cmem_cmemc/smart_path/clients/__init__.py,sha256=YFOm69BfTCRvAcJjN_CoUmCv3kzEciyYOPUG337p_pA,1696
52
53
  cmem_cmemc/smart_path/clients/http.py,sha256=3clZu2v4uuOvPY4MY_8SVSy7hIXJDNooahFRBRpy0ok,2347
53
- cmem_cmemc/string_processor.py,sha256=kSVePdgFmf2ekurKj6TbDJn6ur82VGLwCsTJ9ODfBEU,2879
54
+ cmem_cmemc/string_processor.py,sha256=0EZVl3UeVgV5EEYGLPvCGHrJDMd0Ezekkwg6mDQVBZI,3112
54
55
  cmem_cmemc/title_helper.py,sha256=7frjAR54_Xc1gszOWXfzSmKFTawNJQ7kkXhZcHmQLyw,1250
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,,
56
+ cmem_cmemc/utils.py,sha256=LlvAMHxciY9ge-REdwHQhRetJGrYghRqBZADxqE0yL4,14657
57
+ cmem_cmemc-25.5.0.dist-info/METADATA,sha256=F3j2Ueql34apDjUfI0IH2TgvOpRzq-Ki-QGvd37Kqq8,5715
58
+ cmem_cmemc-25.5.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
59
+ cmem_cmemc-25.5.0.dist-info/entry_points.txt,sha256=2G0AWAyz501EHpFTjIxccdlCTsHt80NT0pdUGP1QkPA,45
60
+ cmem_cmemc-25.5.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
61
+ cmem_cmemc-25.5.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.0.1
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any