sima-cli 2.1.14__tar.gz → 2.1.15__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 (148) hide show
  1. {sima_cli-2.1.14/sima_cli.egg-info → sima_cli-2.1.15}/PKG-INFO +1 -1
  2. {sima_cli-2.1.14 → sima_cli-2.1.15}/pyproject.toml +1 -1
  3. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/__version__.py +1 -1
  4. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/commands.py +18 -3
  5. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/install.py +6 -1
  6. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/utils.py +39 -0
  7. {sima_cli-2.1.14 → sima_cli-2.1.15/sima_cli.egg-info}/PKG-INFO +1 -1
  8. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_sdk_image_detection.py +56 -0
  9. {sima_cli-2.1.14 → sima_cli-2.1.15}/LICENSE +0 -0
  10. {sima_cli-2.1.14 → sima_cli-2.1.15}/MANIFEST.in +0 -0
  11. {sima_cli-2.1.14 → sima_cli-2.1.15}/README.md +0 -0
  12. {sima_cli-2.1.14 → sima_cli-2.1.15}/requirements.txt +0 -0
  13. {sima_cli-2.1.14 → sima_cli-2.1.15}/setup.cfg +0 -0
  14. {sima_cli-2.1.14 → sima_cli-2.1.15}/setup.py +0 -0
  15. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/__init__.py +0 -0
  16. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/__main__.py +0 -0
  17. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/app_zoo/__init__.py +0 -0
  18. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/app_zoo/app.py +0 -0
  19. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/app_zoo/commands.py +0 -0
  20. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/auth/__init__.py +0 -0
  21. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/auth/auth0.py +0 -0
  22. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/auth/devportal.py +0 -0
  23. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/auth/login.py +0 -0
  24. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/cli.py +0 -0
  25. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/data/__init__.py +0 -0
  26. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/data/resources_internal.yaml +0 -0
  27. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/data/resources_public.yaml +0 -0
  28. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/deploy_only/__init__.py +0 -0
  29. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/deploy_only/device/__init__.py +0 -0
  30. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/deploy_only/device/commands.py +0 -0
  31. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/deploy_only/mpk/__init__.py +0 -0
  32. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/deploy_only/mpk/commands.py +0 -0
  33. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/discover/__init__.py +0 -0
  34. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/discover/discover.py +0 -0
  35. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/discover/linuxll.py +0 -0
  36. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/download/__init__.py +0 -0
  37. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/download/downloader.py +0 -0
  38. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/__init__.py +0 -0
  39. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/compatibility.py +0 -0
  40. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/github_assets.py +0 -0
  41. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/hostdriver.py +0 -0
  42. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/metadata_info.py +0 -0
  43. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/metadata_installer.py +0 -0
  44. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/metadata_validator.py +0 -0
  45. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/optiview.py +0 -0
  46. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/package_builder.py +0 -0
  47. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/palette.py +0 -0
  48. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/install/registry.py +0 -0
  49. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/mla/__init__.py +0 -0
  50. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/mla/meminfo.py +0 -0
  51. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/model_zoo/__init__.py +0 -0
  52. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/model_zoo/model.py +0 -0
  53. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/network/__init__.py +0 -0
  54. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/network/network.py +0 -0
  55. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/playbooks/__init__.py +0 -0
  56. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/playbooks/commands.py +0 -0
  57. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/playbooks/manager.py +0 -0
  58. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/__init__.py +0 -0
  59. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/cmdexec.py +0 -0
  60. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/config.py +0 -0
  61. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/linux_devkit_network.py +0 -0
  62. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/linux_shared_network.py +0 -0
  63. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/neat.py +0 -0
  64. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/network_doctor.py +0 -0
  65. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/preinstall.py +0 -0
  66. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/requirements.json +0 -0
  67. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/script.py +0 -0
  68. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/stop.py +0 -0
  69. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/sdk/uninstall.py +0 -0
  70. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/serial/__init__.py +0 -0
  71. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/serial/serial.py +0 -0
  72. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/storage/__init__.py +0 -0
  73. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/storage/nvme.py +0 -0
  74. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/storage/sdcard.py +0 -0
  75. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/__init__.py +0 -0
  76. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/bmaptool.py +0 -0
  77. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/bootimg.py +0 -0
  78. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/cleanlog.py +0 -0
  79. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/elxr.py +0 -0
  80. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/local.py +0 -0
  81. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/netboot.py +0 -0
  82. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/query.py +0 -0
  83. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/remote.py +0 -0
  84. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/update/updater.py +0 -0
  85. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/upgrade/__init__.py +0 -0
  86. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/upgrade/selfupdate.py +0 -0
  87. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/__init__.py +0 -0
  88. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/api_common.py +0 -0
  89. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/artifactory.py +0 -0
  90. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/common.py +0 -0
  91. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/config.py +0 -0
  92. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/config_loader.py +0 -0
  93. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/container_registries.py +0 -0
  94. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/deprecation.py +0 -0
  95. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/device_api.py +0 -0
  96. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/disk.py +0 -0
  97. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/docker.py +0 -0
  98. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/env.py +0 -0
  99. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/errors.py +0 -0
  100. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/mpk_api.py +0 -0
  101. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/net.py +0 -0
  102. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/network.py +0 -0
  103. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/pcie.py +0 -0
  104. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/pkg_update_check.py +0 -0
  105. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/serializers.py +0 -0
  106. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/services.py +0 -0
  107. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/utils/tag.py +0 -0
  108. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/vulcan/__init__.py +0 -0
  109. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/vulcan/artifacts.py +0 -0
  110. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli/vulcan/commands.py +0 -0
  111. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli.egg-info/SOURCES.txt +0 -0
  112. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli.egg-info/dependency_links.txt +0 -0
  113. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli.egg-info/entry_points.txt +0 -0
  114. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli.egg-info/requires.txt +0 -0
  115. {sima_cli-2.1.14 → sima_cli-2.1.15}/sima_cli.egg-info/top_level.txt +0 -0
  116. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/__init__.py +0 -0
  117. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/e2e/__init__.py +0 -0
  118. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/__init__.py +0 -0
  119. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_app_zoo.py +0 -0
  120. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_appzoo_commands.py +0 -0
  121. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_auth.py +0 -0
  122. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_auth0.py +0 -0
  123. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_cli.py +0 -0
  124. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_cli_stdio.py +0 -0
  125. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_cli_update.py +0 -0
  126. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_cli_update_rerun.py +0 -0
  127. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_deprecation.py +0 -0
  128. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_docker_utils.py +0 -0
  129. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_download.py +0 -0
  130. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_elxr_update.py +0 -0
  131. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_firmware.py +0 -0
  132. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_generate_cli_markdown_docs.py +0 -0
  133. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_install_stub.py +0 -0
  134. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_metadata_installer.py +0 -0
  135. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_metadata_validator.py +0 -0
  136. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_model_zoo.py +0 -0
  137. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_netboot.py +0 -0
  138. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_package_builder.py +0 -0
  139. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_pkg_update_check.py +0 -0
  140. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_sdk_linux_shared_network.py +0 -0
  141. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_sdk_network_doctor.py +0 -0
  142. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_sdk_preinstall.py +0 -0
  143. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_sdk_uninstall.py +0 -0
  144. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_selfupdate.py +0 -0
  145. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_skills_commands.py +0 -0
  146. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_skills_manager.py +0 -0
  147. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_utils.py +0 -0
  148. {sima_cli-2.1.14 → sima_cli-2.1.15}/tests/unit/test_vulcan.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sima-cli
3
- Version: 2.1.14
3
+ Version: 2.1.15
4
4
  Summary: CLI tool for SiMa Developer Portal to download models, firmware, and apps.
5
5
  Home-page: https://community.sima.ai/
6
6
  Author: SiMa.ai
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sima-cli"
7
- version = "2.1.14"
7
+ version = "2.1.15"
8
8
  description = "CLI tool for SiMa Developer Portal to download models, firmware, and apps."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -1,2 +1,2 @@
1
1
  # sima_cli/__version__.py
2
- __version__ = "2.1.14"
2
+ __version__ = "2.1.15"
@@ -304,8 +304,15 @@ def launch_sdk_tool(tool: str, cmd, ctx, recover_unavailable: bool = False):
304
304
  is_flag=True,
305
305
  help="Allow setup to install a persistent NetworkManager shared-network repair profile without prompting.",
306
306
  )
307
+ @click.option(
308
+ "--image",
309
+ "image_selectors",
310
+ multiple=True,
311
+ default=(),
312
+ help="Start only the SDK image matching this repository:tag or tag (e.g. 'ghcr.io/sima-neat/sdk:latest' or 'latest'). Repeatable; skips the selection prompt.",
313
+ )
307
314
  @click.pass_context
308
- def setup(ctx, yes, noninteractive, devkit, no_insight, no_model_sdk, minimal, workspace, persistent_network_profile):
315
+ def setup(ctx, yes, noninteractive, devkit, no_insight, no_model_sdk, minimal, workspace, persistent_network_profile, image_selectors):
309
316
  """Initialize SDK environment and select components to start."""
310
317
  devkit_ip = _resolve_devkit_ip(devkit)
311
318
  try:
@@ -318,6 +325,7 @@ def setup(ctx, yes, noninteractive, devkit, no_insight, no_model_sdk, minimal, w
318
325
  minimal=minimal,
319
326
  workspace=workspace,
320
327
  persistent_network_profile=persistent_network_profile,
328
+ image_selectors=image_selectors,
321
329
  )
322
330
  except subprocess.CalledProcessError as e:
323
331
  raise click.ClickException(f"SDK setup failed while running: {' '.join(e.cmd)}") from e
@@ -335,11 +343,18 @@ def setup(ctx, yes, noninteractive, devkit, no_insight, no_model_sdk, minimal, w
335
343
  is_flag=True,
336
344
  help="Skip confirmation before starting the container."
337
345
  )
346
+ @click.option(
347
+ "--image",
348
+ "image_selectors",
349
+ multiple=True,
350
+ default=(),
351
+ help="Start only the SDK image matching this repository:tag or tag (e.g. 'ghcr.io/sima-neat/sdk:latest' or 'latest'). Repeatable; skips the selection prompt.",
352
+ )
338
353
  @click.pass_context
339
- def start(ctx, yes, noninteractive):
354
+ def start(ctx, yes, noninteractive, image_selectors):
340
355
  """Select and start one or more SDK containers."""
341
356
  try:
342
- setup_and_start(noninteractive=noninteractive,start_only=True, yes_to_all=yes)
357
+ setup_and_start(noninteractive=noninteractive, start_only=True, yes_to_all=yes, image_selectors=image_selectors)
343
358
  except subprocess.CalledProcessError as e:
344
359
  raise click.ClickException(f"SDK start failed while running: {' '.join(e.cmd)}") from e
345
360
  except RuntimeError as e:
@@ -37,6 +37,7 @@ from sima_cli.sdk.utils import (
37
37
  get_workspace,
38
38
  get_local_sima_images,
39
39
  prompt_image_selection,
40
+ filter_images_by_selector,
40
41
  confirm_to_remove_exiting_container,
41
42
  sanitize_container_name,
42
43
  ensure_simasdkbridge_network,
@@ -1039,6 +1040,7 @@ def setup_and_start(
1039
1040
  minimal: bool = False,
1040
1041
  workspace: Optional[str] = None,
1041
1042
  persistent_network_profile: bool = False,
1043
+ image_selectors=(),
1042
1044
  ):
1043
1045
  """Main entry for SDK setup and container start."""
1044
1046
 
@@ -1050,7 +1052,10 @@ def setup_and_start(
1050
1052
  syscheck(force_install=yes_to_all, noninteractive=noninteractive)
1051
1053
 
1052
1054
  images = get_local_sima_images()
1053
- selected_images = prompt_image_selection(images, noninteractive)
1055
+ if image_selectors:
1056
+ selected_images = filter_images_by_selector(images, image_selectors)
1057
+ else:
1058
+ selected_images = prompt_image_selection(images, noninteractive)
1054
1059
 
1055
1060
  if not start_only:
1056
1061
  _reject_if_windows_native_neat_sdk(selected_images, console)
@@ -2557,6 +2557,45 @@ def prompt_image_selection(images, noninteractive=False):
2557
2557
 
2558
2558
  return [s for s in selected if s not in {"__all__", "__cancel__"}]
2559
2559
 
2560
+
2561
+ def _match_image_selector(images, selector):
2562
+ """Match one selector against local images: exact ref, then tag, then substring."""
2563
+ exact = [img for img in images if img == selector]
2564
+ if exact:
2565
+ return exact
2566
+ by_tag = [img for img in images if img.rsplit(":", 1)[-1] == selector]
2567
+ if by_tag:
2568
+ return by_tag
2569
+ return [img for img in images if selector in img]
2570
+
2571
+
2572
+ def filter_images_by_selector(images, selectors):
2573
+ """Resolve explicit --image selectors to local SDK images without prompting."""
2574
+ if not images:
2575
+ console.print("[red]❌ No SiMa.ai SDK images found locally.[/red]")
2576
+ sys.exit(1)
2577
+
2578
+ selected = []
2579
+ for selector in selectors:
2580
+ matches = _match_image_selector(images, selector)
2581
+ if not matches:
2582
+ available = "\n".join(f" • {img}" for img in images)
2583
+ console.print(
2584
+ f"[red]❌ No local SDK image matches '--image {selector}'.[/red]\n"
2585
+ f"[dim]Available SDK images:[/dim]\n{available}"
2586
+ )
2587
+ sys.exit(1)
2588
+ selected.extend(matches)
2589
+
2590
+ result = []
2591
+ for img in selected:
2592
+ if img not in result:
2593
+ result.append(img)
2594
+
2595
+ console.print(f"[dim]Explicit image selection: starting {', '.join(result)}.[/dim]")
2596
+ return result
2597
+
2598
+
2560
2599
  def confirm_to_remove_exiting_container(image, yes_to_all=False):
2561
2600
  """Start a container for the given SDK image."""
2562
2601
  container_name = image.split("/")[-1].replace(":", "_")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sima-cli
3
- Version: 2.1.14
3
+ Version: 2.1.15
4
4
  Summary: CLI tool for SiMa Developer Portal to download models, firmware, and apps.
5
5
  Home-page: https://community.sima.ai/
6
6
  Author: SiMa.ai
@@ -2288,6 +2288,62 @@ table ip6 nm-shared-enx6c1ff720d573 {
2288
2288
  self.assertTrue(start_container.call_args.kwargs["minimal"])
2289
2289
  self.assertTrue(start_container.call_args.kwargs["no_insight"])
2290
2290
 
2291
+ def test_filter_images_by_selector_matches_ref_tag_and_substring(self):
2292
+ from sima_cli.sdk.utils import filter_images_by_selector
2293
+ images = ["ghcr.io/sima-neat/sdk:latest", "ghcr.io/sima-neat/sdk:v2.1.2"]
2294
+ self.assertEqual(
2295
+ filter_images_by_selector(images, ("ghcr.io/sima-neat/sdk:latest",)),
2296
+ ["ghcr.io/sima-neat/sdk:latest"],
2297
+ )
2298
+ self.assertEqual(
2299
+ filter_images_by_selector(images, ("v2.1.2",)),
2300
+ ["ghcr.io/sima-neat/sdk:v2.1.2"],
2301
+ )
2302
+ self.assertEqual(
2303
+ filter_images_by_selector(images, ("latest",)),
2304
+ ["ghcr.io/sima-neat/sdk:latest"],
2305
+ )
2306
+
2307
+ def test_filter_images_by_selector_exits_on_no_match(self):
2308
+ from sima_cli.sdk.utils import filter_images_by_selector
2309
+ with self.assertRaises(SystemExit):
2310
+ filter_images_by_selector(["ghcr.io/sima-neat/sdk:latest"], ("nope",))
2311
+
2312
+ def test_setup_image_selector_bypasses_prompt_and_starts_only_that_image(self):
2313
+ images = ["ghcr.io/sima-neat/sdk:latest", "ghcr.io/sima-neat/sdk:v2.1.2"]
2314
+ with patch("sima_cli.sdk.install.ensure_simasdkbridge_network"), \
2315
+ patch("sima_cli.sdk.install.syscheck"), \
2316
+ patch("sima_cli.sdk.install.get_local_sima_images", return_value=images), \
2317
+ patch("sima_cli.sdk.install.prompt_image_selection") as prompt, \
2318
+ patch("sima_cli.sdk.install.ensure_colima_resources_for_neat_sdk"), \
2319
+ patch("sima_cli.sdk.install.get_container_status", return_value={}), \
2320
+ patch("sima_cli.sdk.install.get_workspace", return_value="/tmp/workspace"), \
2321
+ patch("sima_cli.sdk.install._setup_devkit_share", return_value=None), \
2322
+ patch("sima_cli.sdk.install.confirm_to_remove_exiting_container", return_value=None), \
2323
+ patch("sima_cli.sdk.install.start_docker_container") as start_container:
2324
+ setup_and_start(
2325
+ no_model_sdk=True,
2326
+ yes_to_all=True,
2327
+ noninteractive=True,
2328
+ image_selectors=("ghcr.io/sima-neat/sdk:latest",),
2329
+ )
2330
+
2331
+ prompt.assert_not_called()
2332
+ start_container.assert_called_once()
2333
+ self.assertEqual(start_container.call_args.kwargs["image"], "ghcr.io/sima-neat/sdk:latest")
2334
+
2335
+ def test_sdk_setup_image_option_is_forwarded(self):
2336
+ runner = CliRunner()
2337
+ with patch("sima_cli.sdk.commands.check_and_start_docker"), \
2338
+ patch("sima_cli.sdk.commands.setup_and_start") as setup_start:
2339
+ result = runner.invoke(sdk, ["setup", "--image", "ghcr.io/sima-neat/sdk:latest", "-y", "-n"])
2340
+
2341
+ self.assertEqual(result.exit_code, 0, result.output)
2342
+ self.assertEqual(
2343
+ setup_start.call_args.kwargs["image_selectors"],
2344
+ ("ghcr.io/sima-neat/sdk:latest",),
2345
+ )
2346
+
2291
2347
  def test_setup_warns_for_snap_docker_with_neat_sdk(self):
2292
2348
  image = "ghcr.io/sima-neat/sdk:latest"
2293
2349
  with patch("sima_cli.sdk.install.ensure_simasdkbridge_network"), \
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes