cmem-cmemc 26.1.0rc1__tar.gz → 26.1.0rc2__tar.gz

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.
Files changed (61) hide show
  1. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/PKG-INFO +2 -2
  2. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/package.py +20 -71
  3. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/manual_helper/multi_page.py +2 -0
  4. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/pyproject.toml +3 -3
  5. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/LICENSE +0 -0
  6. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/README-public.md +0 -0
  7. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/__init__.py +0 -0
  8. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/_cmemc.zsh +0 -0
  9. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/cli.py +0 -0
  10. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/command.py +0 -0
  11. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/command_group.py +0 -0
  12. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/__init__.py +0 -0
  13. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/acl.py +0 -0
  14. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/admin.py +0 -0
  15. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/client.py +0 -0
  16. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/config.py +0 -0
  17. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/dataset.py +0 -0
  18. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/file.py +0 -0
  19. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/graph.py +0 -0
  20. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/graph_imports.py +0 -0
  21. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/graph_insights.py +0 -0
  22. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/manual.py +0 -0
  23. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/metrics.py +0 -0
  24. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/migration.py +0 -0
  25. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/project.py +0 -0
  26. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/python.py +0 -0
  27. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/query.py +0 -0
  28. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/scheduler.py +0 -0
  29. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/store.py +0 -0
  30. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/user.py +0 -0
  31. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/validation.py +0 -0
  32. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/variable.py +0 -0
  33. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/vocabulary.py +0 -0
  34. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/workflow.py +0 -0
  35. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/commands/workspace.py +0 -0
  36. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/completion.py +0 -0
  37. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/config_parser.py +0 -0
  38. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/constants.py +0 -0
  39. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/context.py +0 -0
  40. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/exceptions.py +0 -0
  41. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/manual_helper/__init__.py +0 -0
  42. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/manual_helper/graph.py +0 -0
  43. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/manual_helper/single_page.py +0 -0
  44. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/__init__.py +0 -0
  45. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/abc.py +0 -0
  46. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/access_conditions_243.py +0 -0
  47. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/bootstrap_data.py +0 -0
  48. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/remove_noop_triple_251.py +0 -0
  49. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/shapes_widget_integrations_243.py +0 -0
  50. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/sparql_query_texts_242.py +0 -0
  51. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/migrations/workspace_configurations.py +0 -0
  52. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/object_list.py +0 -0
  53. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/parameter_types/__init__.py +0 -0
  54. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/parameter_types/path.py +0 -0
  55. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/placeholder.py +0 -0
  56. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/smart_path/__init__.py +0 -0
  57. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/smart_path/clients/__init__.py +0 -0
  58. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/smart_path/clients/http.py +0 -0
  59. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/string_processor.py +0 -0
  60. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/title_helper.py +0 -0
  61. {cmem_cmemc-26.1.0rc1 → cmem_cmemc-26.1.0rc2}/cmem_cmemc/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmem-cmemc
3
- Version: 26.1.0rc1
3
+ Version: 26.1.0rc2
4
4
  Summary: Command line client for eccenca Corporate Memory
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -32,7 +32,7 @@ Requires-Dist: certifi (>=2024.2.2)
32
32
  Requires-Dist: click (>=8.3.0,<9.0.0)
33
33
  Requires-Dist: click-didyoumean (>=0.3.1,<0.4.0)
34
34
  Requires-Dist: click-help-colors (>=0.9.4,<0.10.0)
35
- Requires-Dist: cmem-client (>=0.5.0,<0.6.0)
35
+ Requires-Dist: cmem-client (==0.6.0)
36
36
  Requires-Dist: cmem-cmempy (==25.4.0)
37
37
  Requires-Dist: configparser (>=7.2.0,<8.0.0)
38
38
  Requires-Dist: humanize (>=4.14.0,<5.0.0)
@@ -13,7 +13,6 @@ from cmem_client.repositories.marketplace_packages import (
13
13
  MarketplacePackagesImportConfig,
14
14
  MarketplacePackagesRepository,
15
15
  )
16
- from eccenca_marketplace_client.manifests import AbstractPackageManifest, ManifestMetadata
17
16
  from eccenca_marketplace_client.package_version import PackageVersion
18
17
  from pydantic_extra_types.semantic_version import SemanticVersion
19
18
 
@@ -93,55 +92,6 @@ def _complete_installed_package_ids(
93
92
  return completion.finalize_completion(candidates=candidates, incomplete=incomplete)
94
93
 
95
94
 
96
- @click.command(cls=CmemcCommand, name="create")
97
- @click.argument("package_id", required=True)
98
- @click.option(
99
- "--name",
100
- type=click.STRING,
101
- help=ManifestMetadata.model_fields.get("name").description + " Defaults to package ID.",
102
- )
103
- @click.option(
104
- "--version",
105
- type=click.STRING,
106
- default="0.0.1",
107
- show_default=True,
108
- help=AbstractPackageManifest.model_fields.get("package_version").description,
109
- )
110
- @click.option(
111
- "--description",
112
- type=click.STRING,
113
- help=ManifestMetadata.model_fields.get("description").description,
114
- default="This is the first version of a wonderful eccenca Corporate Memory package 🤓",
115
- show_default=True,
116
- )
117
- @click.pass_obj
118
- def create_command(
119
- app: ApplicationContext, package_id: str, version: str, name: str | None, description: str
120
- ) -> None:
121
- """Initialize an empty package directory with a minimal manifest."""
122
- if Path(package_id).exists():
123
- raise click.UsageError(f"Package directory '{package_id}' already exists.")
124
- if name is None:
125
- name = package_id
126
- manifest_src = {
127
- "package_id": package_id,
128
- "package_type": "project",
129
- "package_version": version,
130
- "metadata": {
131
- "name": name,
132
- "description": description,
133
- },
134
- "files": [],
135
- }
136
- package_version = PackageVersion.from_json(json.dumps(manifest_src))
137
- directory = Path(package_id)
138
- app.echo_info(f"Initialize package directory '{directory}' ... ", nl=False)
139
- directory.mkdir(parents=True, exist_ok=True)
140
- manifest = directory / "manifest.json"
141
- manifest.write_text(package_version.manifest.model_dump_json(indent=2))
142
- app.echo_success("done")
143
-
144
-
145
95
  @click.command(cls=CmemcCommand, name="inspect")
146
96
  @click.argument(
147
97
  "PACKAGE_PATH",
@@ -165,7 +115,9 @@ def inspect_command(app: ApplicationContext, package_path: Path, key: str, raw:
165
115
  """Inspect the manifest of a package."""
166
116
  path = Path(package_path)
167
117
  package_version = (
168
- PackageVersion.from_directory(path) if path.is_dir() else PackageVersion.from_archive(path)
118
+ PackageVersion.from_directory(path, validate_files=False)
119
+ if path.is_dir()
120
+ else PackageVersion.from_archive(path)
169
121
  )
170
122
  manifest = package_version.manifest
171
123
  manifest_data = json.loads(manifest.model_dump_json(indent=2))
@@ -281,7 +233,7 @@ def install_command(
281
233
  if input_path:
282
234
  package_path = Path(input_path)
283
235
  package_version = (
284
- PackageVersion.from_directory(package_path)
236
+ PackageVersion.from_directory(package_path, validate_files=False)
285
237
  if package_path.is_dir()
286
238
  else PackageVersion.from_archive(package_path)
287
239
  )
@@ -447,7 +399,7 @@ def build_command(
447
399
  Package archives can be published to the marketplace using the `package publish` command.
448
400
  """
449
401
  package_path = Path(package_directory)
450
- package_version = PackageVersion.from_directory(package_path)
402
+ package_version = PackageVersion.from_directory(package_path, validate_files=False)
451
403
  if version:
452
404
  if version.startswith("v"):
453
405
  version = version[1:]
@@ -466,25 +418,32 @@ def build_command(
466
418
 
467
419
  if version_str.endswith("dirty"):
468
420
  app.echo_warning(
469
- "Dirty Repository: Your version strings ends with 'dirty'."
421
+ "Dirty Repository: Your version string ends with 'dirty'."
470
422
  "This indicates an unclean repository."
471
423
  )
424
+ if version_str == "0.0.0":
425
+ raise CmemcError(
426
+ "Invalid Version 0.0.0: "
427
+ "Use the --version option to override this, or change the manifest."
428
+ )
472
429
  if cpa_file.exists() and not replace:
473
430
  raise CmemcError(
474
431
  f"Package archive `{cpa_file}` already exists. Use `--replace` to overwrite."
475
432
  )
476
433
  app.echo_info(f"Building package archive `{cpa_file.name}` ... ", nl=False)
434
+ package_version.validate_text_files(package_version.manifest, package_path)
435
+ package_version.validate_image_files(package_version.manifest, package_path)
477
436
  package_version.build_archive(archive=cpa_file)
478
437
  app.echo_success("done")
479
438
 
480
439
 
481
440
  @click.command(cls=CmemcCommand, name="publish")
482
441
  @click.argument(
483
- "PACKAGE",
442
+ "PACKAGE_ARCHIVE",
484
443
  required=True,
485
444
  type=ClickSmartPath(
486
445
  allow_dash=False,
487
- dir_okay=True,
446
+ dir_okay=False,
488
447
  readable=True,
489
448
  exists=True,
490
449
  remote_okay=True,
@@ -497,25 +456,16 @@ def build_command(
497
456
  default="https://marketplace.eccenca.dev/",
498
457
  )
499
458
  @click.pass_obj
500
- def publish_command(app: ApplicationContext, package: str, marketplace_url: str) -> None:
459
+ def publish_command(app: ApplicationContext, package_archive: str, marketplace_url: str) -> None:
501
460
  """Publish a package archive to the marketplace server."""
502
- package_path = Path(package)
461
+ package_path = Path(package_archive)
503
462
 
504
- package_version = (
505
- PackageVersion.from_directory(package_path)
506
- if package_path.is_dir()
507
- else PackageVersion.from_archive(package_path)
508
- )
463
+ package_version = PackageVersion.from_archive(package_path)
509
464
  package_id = package_version.manifest.package_id
510
465
 
511
466
  app.echo_info(f"Publishing package `{package_id}` ... ", nl=False)
512
-
513
- if package_path.is_dir():
514
- package_data = b"".join(PackageVersion.create_archive(package_path))
515
- filename = f"{package_id}.cpa"
516
- else:
517
- package_data = package_path.read_bytes()
518
- filename = package_path.name
467
+ package_data = package_path.read_bytes()
468
+ filename = package_path.name
519
469
 
520
470
  if marketplace_url.endswith("/"):
521
471
  marketplace_url = marketplace_url[:-1]
@@ -538,7 +488,6 @@ def package_group() -> CmemcGroup: # type: ignore[empty-body]
538
488
  """List, (un)install, export, create, or inspect packages."""
539
489
 
540
490
 
541
- package_group.add_command(create_command)
542
491
  package_group.add_command(inspect_command)
543
492
  package_group.add_command(list_command)
544
493
  package_group.add_command(install_command)
@@ -26,6 +26,7 @@ def get_icon_for_command_group(full_name: str) -> str:
26
26
  "admin workspace python": "material/language-python",
27
27
  "config": "material/cog-outline",
28
28
  "dataset": "eccenca/artefact-dataset",
29
+ "package": "material/shopping",
29
30
  "project": "eccenca/artefact-project",
30
31
  "project file": "eccenca/artefact-file",
31
32
  "project variable": "material/variable-box",
@@ -54,6 +55,7 @@ def get_tags_for_command_group(full_name: str) -> str:
54
55
  "admin workspace python": ["Python", "cmemc"],
55
56
  "config": ["Configuration", "cmemc"],
56
57
  "dataset": ["cmemc"],
58
+ "package": ["cmemc", "Package"],
57
59
  "project": ["Project", "cmemc"],
58
60
  "project file": ["Files", "cmemc"],
59
61
  "project variable": ["Variables", "cmemc"],
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "cmem-cmemc"
3
- version = "26.1.0rc1"
3
+ version = "26.1.0rc2"
4
4
  description = "Command line client for eccenca Corporate Memory"
5
5
  license = "Apache-2.0"
6
6
  classifiers = [
@@ -36,7 +36,7 @@ click-didyoumean = "^0.3.1"
36
36
  click-help-colors = "^0.9.4"
37
37
  cmem-cmempy = "==25.4.0"
38
38
  # cmem-cmempy = { path = "cmempy", develop = true }
39
- cmem-client = "^0.5.0"
39
+ cmem-client = "=0.6.0"
40
40
  # cmem-client = { path = "cmem-client", develop = true }
41
41
  configparser = "^7.2.0"
42
42
  jinja2 = "^3.1.6"
@@ -71,7 +71,7 @@ pytest-mock = "^3.14.1"
71
71
  requests-mock = "^1.12.1"
72
72
  ruff = "^0.7.4"
73
73
  semver = "^3.0.4"
74
- trivy-py-ecc = "^0.67.2"
74
+ trivy-py-ecc = "^0.68"
75
75
  types-python-dateutil = "^2.9.0.20240316"
76
76
  types-requests = "^2.32.0.20241016"
77
77
  types-six = "^1.16.21.20240425"
File without changes