sima-cli 2.1.10__tar.gz → 2.1.11__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.
- {sima_cli-2.1.10/sima_cli.egg-info → sima_cli-2.1.11}/PKG-INFO +56 -16
- {sima_cli-2.1.10 → sima_cli-2.1.11}/README.md +53 -13
- {sima_cli-2.1.10 → sima_cli-2.1.11}/pyproject.toml +2 -2
- {sima_cli-2.1.10 → sima_cli-2.1.11}/setup.cfg +1 -1
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/__version__.py +1 -1
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/app_zoo/commands.py +23 -1
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/auth0.py +2 -2
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/devportal.py +2 -3
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/cli.py +1 -8
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/data/resources_public.yaml +2 -2
- sima_cli-2.1.11/sima_cli/install/compatibility.py +161 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/metadata_installer.py +28 -4
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/metadata_validator.py +40 -6
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/package_builder.py +10 -1
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/registry.py +54 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/commands.py +19 -1
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/install.py +35 -6
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/preinstall.py +33 -24
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/utils.py +34 -20
- sima_cli-2.1.11/sima_cli/utils/deprecation.py +8 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11/sima_cli.egg-info}/PKG-INFO +56 -16
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/SOURCES.txt +5 -1
- sima_cli-2.1.11/tests/unit/test_appzoo_commands.py +37 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_auth.py +23 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_auth0.py +5 -0
- sima_cli-2.1.11/tests/unit/test_deprecation.py +29 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_install_stub.py +81 -2
- sima_cli-2.1.11/tests/unit/test_metadata_installer.py +413 -0
- sima_cli-2.1.11/tests/unit/test_metadata_validator.py +77 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_package_builder.py +125 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_sdk_image_detection.py +153 -9
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_sdk_preinstall.py +30 -1
- sima_cli-2.1.10/sima_cli/auth/oauth.py +0 -203
- sima_cli-2.1.10/tests/unit/test_metadata_installer.py +0 -207
- {sima_cli-2.1.10 → sima_cli-2.1.11}/LICENSE +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/MANIFEST.in +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/requirements.txt +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/setup.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/__main__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/app_zoo/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/app_zoo/app.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/login.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/data/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/data/resources_internal.yaml +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/device/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/device/commands.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/mpk/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/mpk/commands.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/discover/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/discover/discover.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/discover/linuxll.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/download/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/download/downloader.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/github_assets.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/hostdriver.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/metadata_info.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/optiview.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/palette.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/mla/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/mla/meminfo.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/model_zoo/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/model_zoo/model.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/network/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/network/network.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/playbooks/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/playbooks/commands.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/playbooks/manager.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/cmdexec.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/config.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/linux_shared_network.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/neat.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/requirements.json +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/script.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/stop.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/uninstall.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/serial/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/serial/serial.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/storage/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/storage/nvme.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/storage/sdcard.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/bmaptool.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/bootimg.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/cleanlog.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/elxr.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/local.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/netboot.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/query.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/remote.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/updater.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/upgrade/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/upgrade/selfupdate.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/api_common.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/artifactory.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/common.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/config.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/config_loader.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/container_registries.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/device_api.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/disk.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/docker.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/env.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/errors.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/mpk_api.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/net.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/network.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/pcie.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/pkg_update_check.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/serializers.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/services.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/tag.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/vulcan/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/vulcan/artifacts.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/vulcan/commands.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/dependency_links.txt +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/entry_points.txt +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/requires.txt +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/top_level.txt +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/e2e/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/__init__.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_app_zoo.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli_stdio.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli_update.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli_update_rerun.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_docker_utils.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_download.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_elxr_update.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_firmware.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_model_zoo.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_netboot.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_pkg_update_check.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_sdk_uninstall.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_selfupdate.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_skills_commands.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_skills_manager.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_utils.py +0 -0
- {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_vulcan.py +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sima-cli
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.11
|
|
4
4
|
Summary: CLI tool for SiMa Developer Portal to download models, firmware, and apps.
|
|
5
|
-
Home-page: https://
|
|
5
|
+
Home-page: https://community.sima.ai/
|
|
6
6
|
Author: SiMa.ai
|
|
7
7
|
Author-email: "Sima.ai" <support@sima.ai>
|
|
8
8
|
License: MIT
|
|
9
|
-
Project-URL: Homepage, https://
|
|
9
|
+
Project-URL: Homepage, https://community.sima.ai/
|
|
10
10
|
Classifier: Programming Language :: Python :: 3
|
|
11
11
|
Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -41,12 +41,12 @@ Dynamic: requires-python
|
|
|
41
41
|
[](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
42
42
|
[](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
43
43
|
[](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
44
|
-
[&label=e2e%20macOS&logo=apple&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
45
45
|
[&label=e2e%20Windows&logo=windows&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
46
46
|
[&label=e2e%20Ubuntu%20x86&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
47
47
|
[&label=e2e%20Ubuntu%20ARM64&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
48
48
|
|
|
49
|
-
`sima-cli` is the command-line interface for SiMa developer workflows.
|
|
49
|
+
`sima-cli` is the command-line interface for SiMa developer workflows. Use it to authenticate, set up SDK containers, update DevKits, install packages, download artifacts, and access Model Zoo and App Zoo content.
|
|
50
50
|
|
|
51
51
|
## Documentation
|
|
52
52
|
|
|
@@ -59,16 +59,45 @@ Use the generated docs for detailed options, arguments, subcommands, and full he
|
|
|
59
59
|
|
|
60
60
|
## Installation
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
For most users, install the latest official release from the public installer URL for your operating system.
|
|
63
|
+
|
|
64
|
+
### Linux, macOS, and DevKit
|
|
65
|
+
|
|
66
|
+
Run the installer from a terminal:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
curl -fsSL https://artifacts.neat.sima.ai/sima-cli/linux-mac.sh | bash
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
After installation, open a new terminal or reload your shell profile, then verify the install:
|
|
63
73
|
|
|
64
74
|
```bash
|
|
65
|
-
|
|
66
|
-
|
|
75
|
+
sima-cli --version
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Windows PowerShell
|
|
79
|
+
|
|
80
|
+
Download and run the Windows installer from PowerShell:
|
|
81
|
+
|
|
82
|
+
```powershell
|
|
83
|
+
Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/windows.bat -OutFile windows.bat
|
|
84
|
+
.\windows.bat
|
|
67
85
|
```
|
|
68
86
|
|
|
69
|
-
|
|
87
|
+
After installation, open a new Command Prompt or PowerShell window, then verify the install:
|
|
88
|
+
|
|
89
|
+
```powershell
|
|
90
|
+
sima-cli --version
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Advanced: choose a branch or release
|
|
94
|
+
|
|
95
|
+
Use `install.py` only when you need to choose a specific tested branch build or release instead of installing the latest official PyPI release.
|
|
96
|
+
|
|
97
|
+
On Linux, macOS, or DevKit:
|
|
70
98
|
|
|
71
99
|
```bash
|
|
100
|
+
curl -fsSL https://artifacts.neat.sima.ai/sima-cli/install.py -o sima-cli-install.py
|
|
72
101
|
python3 sima-cli-install.py
|
|
73
102
|
```
|
|
74
103
|
|
|
@@ -82,10 +111,19 @@ python3 sima-cli-install.py v2.1.6 latest
|
|
|
82
111
|
On Windows PowerShell:
|
|
83
112
|
|
|
84
113
|
```powershell
|
|
85
|
-
Invoke-WebRequest https://artifacts.
|
|
86
|
-
python .\sima-cli-install.py
|
|
114
|
+
Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/install.py -OutFile sima-cli-install.py
|
|
115
|
+
python .\sima-cli-install.py
|
|
87
116
|
```
|
|
88
117
|
|
|
118
|
+
To install a specific branch or release:
|
|
119
|
+
|
|
120
|
+
```powershell
|
|
121
|
+
python .\sima-cli-install.py feature/my-branch latest
|
|
122
|
+
python .\sima-cli-install.py v2.1.6 latest
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Release tags such as `v2.1.6` install from public PyPI. Branch names install tested artifacts from `artifacts.neat.sima.ai/sima-cli`.
|
|
126
|
+
|
|
89
127
|
Public PyPI releases can also be installed directly:
|
|
90
128
|
|
|
91
129
|
```bash
|
|
@@ -96,15 +134,15 @@ pip install sima-cli
|
|
|
96
134
|
|
|
97
135
|
```bash
|
|
98
136
|
sima-cli --help
|
|
137
|
+
sima-cli --version
|
|
99
138
|
sima-cli login
|
|
100
|
-
sima-cli version
|
|
101
139
|
```
|
|
102
140
|
|
|
103
141
|
Use `--internal` or `SIMA_CLI_INTERNAL=1` when internal Artifactory resources are required:
|
|
104
142
|
|
|
105
143
|
```bash
|
|
106
144
|
sima-cli --internal login
|
|
107
|
-
SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.
|
|
145
|
+
SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.2 tools/model-compiler/amd64
|
|
108
146
|
```
|
|
109
147
|
|
|
110
148
|
## Common Workflows
|
|
@@ -116,10 +154,13 @@ sima-cli sdk setup
|
|
|
116
154
|
sima-cli sdk neat
|
|
117
155
|
```
|
|
118
156
|
|
|
119
|
-
Install
|
|
157
|
+
Install Model Compiler from package metadata:
|
|
120
158
|
|
|
121
159
|
```bash
|
|
122
|
-
|
|
160
|
+
# amd64 host
|
|
161
|
+
sima-cli install -v 2.1.2 tools/model-compiler/amd64
|
|
162
|
+
# arm64 host
|
|
163
|
+
sima-cli install -v 2.1.2 tools/model-compiler/arm64
|
|
123
164
|
```
|
|
124
165
|
|
|
125
166
|
Download or install Neat artifacts:
|
|
@@ -165,7 +206,6 @@ sima-cli appzoo list
|
|
|
165
206
|
| `sima-cli selfupdate` | Update sima-cli manually. | [docs](docs/sima-cli/commands/sima-cli-selfupdate.md) |
|
|
166
207
|
| `sima-cli serial` | Connect to the UART serial console of a DevKit. | [docs](docs/sima-cli/commands/sima-cli-serial.md) |
|
|
167
208
|
| `sima-cli update` | Update a SiMa DevKit or remote device. | [docs](docs/sima-cli/commands/sima-cli-update.md) |
|
|
168
|
-
| `sima-cli version` | Show the installed CLI version. | [docs](docs/sima-cli/commands/sima-cli-version.md) |
|
|
169
209
|
|
|
170
210
|
## Development
|
|
171
211
|
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
[](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
8
8
|
[](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
9
9
|
[](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
10
|
-
[&label=e2e%20macOS&logo=apple&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
11
11
|
[&label=e2e%20Windows&logo=windows&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
12
12
|
[&label=e2e%20Ubuntu%20x86&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
13
13
|
[&label=e2e%20Ubuntu%20ARM64&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
|
|
14
14
|
|
|
15
|
-
`sima-cli` is the command-line interface for SiMa developer workflows.
|
|
15
|
+
`sima-cli` is the command-line interface for SiMa developer workflows. Use it to authenticate, set up SDK containers, update DevKits, install packages, download artifacts, and access Model Zoo and App Zoo content.
|
|
16
16
|
|
|
17
17
|
## Documentation
|
|
18
18
|
|
|
@@ -25,16 +25,45 @@ Use the generated docs for detailed options, arguments, subcommands, and full he
|
|
|
25
25
|
|
|
26
26
|
## Installation
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
For most users, install the latest official release from the public installer URL for your operating system.
|
|
29
|
+
|
|
30
|
+
### Linux, macOS, and DevKit
|
|
31
|
+
|
|
32
|
+
Run the installer from a terminal:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
curl -fsSL https://artifacts.neat.sima.ai/sima-cli/linux-mac.sh | bash
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
After installation, open a new terminal or reload your shell profile, then verify the install:
|
|
29
39
|
|
|
30
40
|
```bash
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
sima-cli --version
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Windows PowerShell
|
|
45
|
+
|
|
46
|
+
Download and run the Windows installer from PowerShell:
|
|
47
|
+
|
|
48
|
+
```powershell
|
|
49
|
+
Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/windows.bat -OutFile windows.bat
|
|
50
|
+
.\windows.bat
|
|
33
51
|
```
|
|
34
52
|
|
|
35
|
-
|
|
53
|
+
After installation, open a new Command Prompt or PowerShell window, then verify the install:
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
sima-cli --version
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Advanced: choose a branch or release
|
|
60
|
+
|
|
61
|
+
Use `install.py` only when you need to choose a specific tested branch build or release instead of installing the latest official PyPI release.
|
|
62
|
+
|
|
63
|
+
On Linux, macOS, or DevKit:
|
|
36
64
|
|
|
37
65
|
```bash
|
|
66
|
+
curl -fsSL https://artifacts.neat.sima.ai/sima-cli/install.py -o sima-cli-install.py
|
|
38
67
|
python3 sima-cli-install.py
|
|
39
68
|
```
|
|
40
69
|
|
|
@@ -48,10 +77,19 @@ python3 sima-cli-install.py v2.1.6 latest
|
|
|
48
77
|
On Windows PowerShell:
|
|
49
78
|
|
|
50
79
|
```powershell
|
|
51
|
-
Invoke-WebRequest https://artifacts.
|
|
52
|
-
python .\sima-cli-install.py
|
|
80
|
+
Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/install.py -OutFile sima-cli-install.py
|
|
81
|
+
python .\sima-cli-install.py
|
|
53
82
|
```
|
|
54
83
|
|
|
84
|
+
To install a specific branch or release:
|
|
85
|
+
|
|
86
|
+
```powershell
|
|
87
|
+
python .\sima-cli-install.py feature/my-branch latest
|
|
88
|
+
python .\sima-cli-install.py v2.1.6 latest
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Release tags such as `v2.1.6` install from public PyPI. Branch names install tested artifacts from `artifacts.neat.sima.ai/sima-cli`.
|
|
92
|
+
|
|
55
93
|
Public PyPI releases can also be installed directly:
|
|
56
94
|
|
|
57
95
|
```bash
|
|
@@ -62,15 +100,15 @@ pip install sima-cli
|
|
|
62
100
|
|
|
63
101
|
```bash
|
|
64
102
|
sima-cli --help
|
|
103
|
+
sima-cli --version
|
|
65
104
|
sima-cli login
|
|
66
|
-
sima-cli version
|
|
67
105
|
```
|
|
68
106
|
|
|
69
107
|
Use `--internal` or `SIMA_CLI_INTERNAL=1` when internal Artifactory resources are required:
|
|
70
108
|
|
|
71
109
|
```bash
|
|
72
110
|
sima-cli --internal login
|
|
73
|
-
SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.
|
|
111
|
+
SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.2 tools/model-compiler/amd64
|
|
74
112
|
```
|
|
75
113
|
|
|
76
114
|
## Common Workflows
|
|
@@ -82,10 +120,13 @@ sima-cli sdk setup
|
|
|
82
120
|
sima-cli sdk neat
|
|
83
121
|
```
|
|
84
122
|
|
|
85
|
-
Install
|
|
123
|
+
Install Model Compiler from package metadata:
|
|
86
124
|
|
|
87
125
|
```bash
|
|
88
|
-
|
|
126
|
+
# amd64 host
|
|
127
|
+
sima-cli install -v 2.1.2 tools/model-compiler/amd64
|
|
128
|
+
# arm64 host
|
|
129
|
+
sima-cli install -v 2.1.2 tools/model-compiler/arm64
|
|
89
130
|
```
|
|
90
131
|
|
|
91
132
|
Download or install Neat artifacts:
|
|
@@ -131,7 +172,6 @@ sima-cli appzoo list
|
|
|
131
172
|
| `sima-cli selfupdate` | Update sima-cli manually. | [docs](docs/sima-cli/commands/sima-cli-selfupdate.md) |
|
|
132
173
|
| `sima-cli serial` | Connect to the UART serial console of a DevKit. | [docs](docs/sima-cli/commands/sima-cli-serial.md) |
|
|
133
174
|
| `sima-cli update` | Update a SiMa DevKit or remote device. | [docs](docs/sima-cli/commands/sima-cli-update.md) |
|
|
134
|
-
| `sima-cli version` | Show the installed CLI version. | [docs](docs/sima-cli/commands/sima-cli-version.md) |
|
|
135
175
|
|
|
136
176
|
## Development
|
|
137
177
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sima-cli"
|
|
7
|
-
version = "2.1.
|
|
7
|
+
version = "2.1.11"
|
|
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"
|
|
@@ -37,7 +37,7 @@ dependencies = [
|
|
|
37
37
|
]
|
|
38
38
|
|
|
39
39
|
[project.urls]
|
|
40
|
-
Homepage = "https://
|
|
40
|
+
Homepage = "https://community.sima.ai/"
|
|
41
41
|
|
|
42
42
|
[project.scripts]
|
|
43
43
|
sima-cli = "sima_cli.cli:main"
|
|
@@ -5,7 +5,7 @@ author_email = support@sima.ai
|
|
|
5
5
|
description = CLI tool for SiMa Developer Portal to download models, firmware, and apps.
|
|
6
6
|
long_description = file: README.md
|
|
7
7
|
long_description_content_type = text/markdown
|
|
8
|
-
url = https://
|
|
8
|
+
url = https://community.sima.ai/
|
|
9
9
|
license = MIT
|
|
10
10
|
classifiers =
|
|
11
11
|
Programming Language :: Python :: 3
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# sima_cli/__version__.py
|
|
2
|
-
__version__ = "2.1.
|
|
2
|
+
__version__ = "2.1.11"
|
|
@@ -1,9 +1,31 @@
|
|
|
1
1
|
|
|
2
2
|
import click
|
|
3
|
+
from rich.console import Console
|
|
4
|
+
from rich.panel import Panel
|
|
3
5
|
|
|
4
6
|
from sima_cli.app_zoo.app import list_apps, download_app, describe_app, clone_apps
|
|
7
|
+
from sima_cli.utils.deprecation import should_show_post_neat_ga_deprecation_notice
|
|
5
8
|
from sima_cli.utils.tag import resolve_version
|
|
6
9
|
|
|
10
|
+
console = Console()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def show_appzoo_deprecation_notice() -> None:
|
|
14
|
+
if not should_show_post_neat_ga_deprecation_notice():
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
console.print(
|
|
18
|
+
Panel(
|
|
19
|
+
"[yellow]App Zoo is compatible with legacy Palette SDKs and will be deprecated soon.[/yellow]\n\n"
|
|
20
|
+
"Use https://developer.sima.ai/examples to access current example applications.",
|
|
21
|
+
title="App Zoo Deprecation Notice",
|
|
22
|
+
border_style="yellow",
|
|
23
|
+
style="yellow",
|
|
24
|
+
expand=False,
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
7
29
|
@click.group()
|
|
8
30
|
@click.option(
|
|
9
31
|
"-v", "--ver", "--version",
|
|
@@ -15,6 +37,7 @@ from sima_cli.utils.tag import resolve_version
|
|
|
15
37
|
def appzoo(ctx, ver):
|
|
16
38
|
"""Access sample apps from the App Zoo."""
|
|
17
39
|
ctx.ensure_object(dict)
|
|
40
|
+
show_appzoo_deprecation_notice()
|
|
18
41
|
internal = ctx.obj.get("internal", False)
|
|
19
42
|
if not internal:
|
|
20
43
|
ver = resolve_version(ver)
|
|
@@ -71,4 +94,3 @@ def register_appzoo_commands(main):
|
|
|
71
94
|
register_appzoo_commands(main)
|
|
72
95
|
"""
|
|
73
96
|
main.add_command(appzoo)
|
|
74
|
-
|
|
@@ -32,8 +32,8 @@ USERINFO_AUDIENCE = PROD_USERINFO_AUDIENCE
|
|
|
32
32
|
LATEST_EULA_GRANT = "LatestEULA"
|
|
33
33
|
DOC_ACCESS_GRANT = "DocsAccess"
|
|
34
34
|
DOC_ACCESS_GRANT_ALIASES = (DOC_ACCESS_GRANT, "DocAccess")
|
|
35
|
-
PROD_DISCOURSE_URL = "https://
|
|
36
|
-
STAGING_DISCOURSE_URL = "https://
|
|
35
|
+
PROD_DISCOURSE_URL = "https://community.sima.ai/login"
|
|
36
|
+
STAGING_DISCOURSE_URL = "https://community-dev.sima.ai/login"
|
|
37
37
|
|
|
38
38
|
# ─────────────────────────────────────────────
|
|
39
39
|
# Configuration loader
|
|
@@ -40,15 +40,14 @@ HOST_DOCKER_CONTEXTS_DIR = os.path.join(os.path.expanduser("~"), ".docker", "con
|
|
|
40
40
|
# Detect staging or production environment
|
|
41
41
|
is_staging = False
|
|
42
42
|
if os.getenv("USE_STAGING_DEV_PORTAL", "false").lower() in ("1", "true", "yes"):
|
|
43
|
-
DEV_PORTAL = "https://
|
|
43
|
+
DEV_PORTAL = "https://community-dev.sima.ai"
|
|
44
44
|
DOCS_PORTAL = "https://docs-dev.sima.ai"
|
|
45
45
|
is_staging = True
|
|
46
46
|
else:
|
|
47
|
-
DEV_PORTAL = "https://
|
|
47
|
+
DEV_PORTAL = "https://community.sima.ai"
|
|
48
48
|
DOCS_PORTAL = "https://docs.sima.ai"
|
|
49
49
|
|
|
50
50
|
# Derived endpoints
|
|
51
|
-
LOGIN_URL = f"{DEV_PORTAL}/session"
|
|
52
51
|
DEV_PORTAL_LOGIN_URL = f"{DEV_PORTAL}/login"
|
|
53
52
|
DUMMY_CHECK_URL = f"{DOCS_PORTAL}/pkg_downloads/validation"
|
|
54
53
|
ACCESS_REQUEST_FORM_URL = "https://www2.sima.ai/l/1041271/2025-05-05/37bndg"
|
|
@@ -82,6 +82,7 @@ def _rerun_current_command() -> None:
|
|
|
82
82
|
# Entry point for the CLI tool using Click's command group decorator
|
|
83
83
|
@click.group(context_settings=dict(help_option_names=["-h", "--help", "-?"], max_content_width=120))
|
|
84
84
|
@click.option('-i', '--internal', is_flag=True, help="Use internal Artifactory resources, Authorized Sima employees only")
|
|
85
|
+
@click.version_option(version=f"{__version__}", message="SiMa CLI version: %(version)s")
|
|
85
86
|
@click.pass_context
|
|
86
87
|
def main(ctx, internal):
|
|
87
88
|
"""
|
|
@@ -143,14 +144,6 @@ def login(ctx):
|
|
|
143
144
|
internal = ctx.obj.get("internal", False)
|
|
144
145
|
perform_login.login("internal" if internal else "external")
|
|
145
146
|
|
|
146
|
-
# ----------------------
|
|
147
|
-
# Version Command
|
|
148
|
-
# ----------------------
|
|
149
|
-
@main.command(name="version")
|
|
150
|
-
def version_cmd():
|
|
151
|
-
"""Show the version of the CLI tool."""
|
|
152
|
-
click.echo(f"SiMa CLI version: {__version__}")
|
|
153
|
-
|
|
154
147
|
# ----------------------
|
|
155
148
|
# Logout Command
|
|
156
149
|
# ----------------------
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
artifactory:
|
|
2
|
-
url: "https://
|
|
2
|
+
url: "https://community.sima.ai"
|
|
3
3
|
|
|
4
4
|
auth:
|
|
5
5
|
auth_url: "/login"
|
|
@@ -18,4 +18,4 @@ auth-dev:
|
|
|
18
18
|
client-id: Rjrv1TXE5VWjMmCmWyT6OmLYEN1K5AIS
|
|
19
19
|
|
|
20
20
|
download:
|
|
21
|
-
download_url: "https://docs.sima.ai/pkg_downloads/"
|
|
21
|
+
download_url: "https://docs.sima.ai/pkg_downloads/"
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Dict, List, Optional, Sequence
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
VALID_OS = {"linux", "windows", "mac", "ubuntu"}
|
|
6
|
+
VALID_PLATFORM_TYPES = {"board", "palette", "host"}
|
|
7
|
+
|
|
8
|
+
_COMPATIBLE_NAME_RE = re.compile(r"^[A-Za-z0-9_.-]+$")
|
|
9
|
+
_VERSION_RE = r"v?\d+(?:\.\d+)*"
|
|
10
|
+
_VERSION_CLAUSE_RE = re.compile(r"^(>=|<=|==|=|>|<)?\s*({})$".format(_VERSION_RE))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _split_csv(value: str) -> List[str]:
|
|
14
|
+
return [item.strip() for item in value.split(",") if item.strip()]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _version_tuple(version: str) -> tuple:
|
|
18
|
+
normalized = version.strip()
|
|
19
|
+
if normalized.startswith("v"):
|
|
20
|
+
normalized = normalized[1:]
|
|
21
|
+
return tuple(int(part) for part in normalized.split("."))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _pad_versions(left: tuple, right: tuple) -> tuple:
|
|
25
|
+
length = max(len(left), len(right))
|
|
26
|
+
return left + (0,) * (length - len(left)), right + (0,) * (length - len(right))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def normalize_version_spec(spec: str) -> str:
|
|
30
|
+
if not isinstance(spec, str) or not spec.strip():
|
|
31
|
+
raise ValueError("version spec must be a non-empty string")
|
|
32
|
+
|
|
33
|
+
clauses = []
|
|
34
|
+
for raw_clause in spec.split(","):
|
|
35
|
+
clause = raw_clause.strip()
|
|
36
|
+
if not clause:
|
|
37
|
+
raise ValueError("version spec contains an empty clause")
|
|
38
|
+
match = _VERSION_CLAUSE_RE.fullmatch(clause)
|
|
39
|
+
if not match:
|
|
40
|
+
raise ValueError(
|
|
41
|
+
"invalid version spec '{}'; expected versions like 2.1.1, ==2.1.1, "
|
|
42
|
+
">=2.1.0, or >=2.1.0,<=2.1.2".format(spec)
|
|
43
|
+
)
|
|
44
|
+
op, version = match.groups()
|
|
45
|
+
clauses.append("{}{}".format(op or "", version))
|
|
46
|
+
|
|
47
|
+
return ",".join(clauses)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def validate_version_spec(spec: str) -> None:
|
|
51
|
+
normalize_version_spec(spec)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def normalize_exact_version(version: str) -> str:
|
|
55
|
+
if not isinstance(version, str) or not version.strip():
|
|
56
|
+
raise ValueError("version must be a non-empty string")
|
|
57
|
+
normalized = version.strip()
|
|
58
|
+
if not re.fullmatch(_VERSION_RE, normalized):
|
|
59
|
+
raise ValueError("invalid exact version '{}'; expected a version like 2.0.0".format(version))
|
|
60
|
+
return normalized
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def version_matches(version: str, spec: str) -> bool:
|
|
64
|
+
normalized_spec = normalize_version_spec(spec)
|
|
65
|
+
current = _version_tuple(version)
|
|
66
|
+
|
|
67
|
+
for clause in normalized_spec.split(","):
|
|
68
|
+
match = _VERSION_CLAUSE_RE.fullmatch(clause)
|
|
69
|
+
if not match:
|
|
70
|
+
return False
|
|
71
|
+
op, target_value = match.groups()
|
|
72
|
+
op = op or "=="
|
|
73
|
+
target = _version_tuple(target_value)
|
|
74
|
+
left, right = _pad_versions(current, target)
|
|
75
|
+
|
|
76
|
+
if op in ("=", "=="):
|
|
77
|
+
clause_matches = left == right
|
|
78
|
+
elif op == ">":
|
|
79
|
+
clause_matches = left > right
|
|
80
|
+
elif op == ">=":
|
|
81
|
+
clause_matches = left >= right
|
|
82
|
+
elif op == "<":
|
|
83
|
+
clause_matches = left < right
|
|
84
|
+
elif op == "<=":
|
|
85
|
+
clause_matches = left <= right
|
|
86
|
+
else:
|
|
87
|
+
clause_matches = False
|
|
88
|
+
|
|
89
|
+
if not clause_matches:
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
return True
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def parse_host_platform_specs(host_platforms: Optional[Sequence[str]]) -> List[Dict]:
|
|
96
|
+
platforms = []
|
|
97
|
+
for raw_spec in host_platforms or []:
|
|
98
|
+
os_values = []
|
|
99
|
+
seen = set()
|
|
100
|
+
for value in _split_csv(raw_spec):
|
|
101
|
+
os_value = value.lower()
|
|
102
|
+
if os_value not in VALID_OS:
|
|
103
|
+
raise ValueError(
|
|
104
|
+
"invalid host platform OS '{}'; supported values are {}".format(
|
|
105
|
+
value, ", ".join(sorted(VALID_OS))
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
if os_value not in seen:
|
|
109
|
+
seen.add(os_value)
|
|
110
|
+
os_values.append(os_value)
|
|
111
|
+
if not os_values:
|
|
112
|
+
raise ValueError("host platform spec must include at least one OS")
|
|
113
|
+
platforms.append({"type": "host", "os": os_values})
|
|
114
|
+
return platforms
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def parse_board_platform_spec(spec: str) -> Dict:
|
|
118
|
+
if not isinstance(spec, str) or not spec.strip():
|
|
119
|
+
raise ValueError("board platform spec must be a non-empty string")
|
|
120
|
+
|
|
121
|
+
raw_compat, separator, raw_version_spec = spec.strip().partition("@")
|
|
122
|
+
compatible_with = []
|
|
123
|
+
seen = set()
|
|
124
|
+
for value in _split_csv(raw_compat):
|
|
125
|
+
if not _COMPATIBLE_NAME_RE.fullmatch(value):
|
|
126
|
+
raise ValueError(
|
|
127
|
+
"invalid board compatibility target '{}'; use letters, numbers, dots, underscores, or hyphens".format(
|
|
128
|
+
value
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
if value not in seen:
|
|
132
|
+
seen.add(value)
|
|
133
|
+
compatible_with.append(value)
|
|
134
|
+
|
|
135
|
+
if not compatible_with:
|
|
136
|
+
raise ValueError("board platform spec must include at least one compatibility target")
|
|
137
|
+
|
|
138
|
+
platform = {"type": "board", "compatible_with": compatible_with}
|
|
139
|
+
if separator:
|
|
140
|
+
platform["version"] = normalize_version_spec(raw_version_spec)
|
|
141
|
+
return platform
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def parse_board_platform_specs(board_platforms: Optional[Sequence[str]]) -> List[Dict]:
|
|
145
|
+
return [parse_board_platform_spec(spec) for spec in board_platforms or []]
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def build_platform_specs(
|
|
149
|
+
host_platforms: Optional[Sequence[str]] = None,
|
|
150
|
+
board_platforms: Optional[Sequence[str]] = None,
|
|
151
|
+
palette_platform: Optional[str] = None,
|
|
152
|
+
) -> List[Dict]:
|
|
153
|
+
platforms = []
|
|
154
|
+
platforms.extend(parse_host_platform_specs(host_platforms))
|
|
155
|
+
platforms.extend(parse_board_platform_specs(board_platforms))
|
|
156
|
+
if palette_platform is not None:
|
|
157
|
+
platform = {"type": "palette"}
|
|
158
|
+
if palette_platform:
|
|
159
|
+
platform["version"] = normalize_exact_version(palette_platform)
|
|
160
|
+
platforms.append(platform)
|
|
161
|
+
return platforms
|
|
@@ -28,6 +28,7 @@ from sima_cli.utils.disk import check_disk_space
|
|
|
28
28
|
from sima_cli.utils.env import get_environment_type, get_exact_devkit_type, get_sima_build_version
|
|
29
29
|
from sima_cli.download.downloader import download_file_from_url
|
|
30
30
|
from sima_cli.install.metadata_validator import validate_metadata, MetadataValidationError
|
|
31
|
+
from sima_cli.install.compatibility import version_matches
|
|
31
32
|
from sima_cli.install.metadata_info import print_metadata_summary, parse_size_string_to_bytes
|
|
32
33
|
from sima_cli.utils.container_registries import install_from_cr
|
|
33
34
|
from sima_cli.install.registry import PackageRegistry
|
|
@@ -1114,6 +1115,19 @@ def _compare_versions(current: str, condition: str) -> bool:
|
|
|
1114
1115
|
return cur <= target
|
|
1115
1116
|
return False
|
|
1116
1117
|
|
|
1118
|
+
|
|
1119
|
+
def _get_palette_sdk_version(release_file: Path = Path("/etc/sdk-release")) -> str:
|
|
1120
|
+
try:
|
|
1121
|
+
content = release_file.read_text(encoding="utf-8")
|
|
1122
|
+
except OSError:
|
|
1123
|
+
return ""
|
|
1124
|
+
|
|
1125
|
+
match = re.search(r"^SDK Version\s*=\s*(\S+)", content, flags=re.MULTILINE)
|
|
1126
|
+
if not match:
|
|
1127
|
+
return ""
|
|
1128
|
+
return match.group(1).split("_", 1)[0].strip()
|
|
1129
|
+
|
|
1130
|
+
|
|
1117
1131
|
def _is_platform_compatible(metadata: dict, force: bool = False) -> bool:
|
|
1118
1132
|
"""
|
|
1119
1133
|
Determines if the current environment is compatible with the package metadata.
|
|
@@ -1169,7 +1183,17 @@ def _is_platform_compatible(metadata: dict, force: bool = False) -> bool:
|
|
|
1169
1183
|
for platform_entry in platforms:
|
|
1170
1184
|
platform_type = platform_entry.get("type")
|
|
1171
1185
|
if (platform_type, env_type, env_subtype) == ("palette", "sdk", "palette"):
|
|
1172
|
-
|
|
1186
|
+
compatible_palette_version = platform_entry.get("version", "")
|
|
1187
|
+
if not compatible_palette_version:
|
|
1188
|
+
return True
|
|
1189
|
+
palette_sdk_version = _get_palette_sdk_version()
|
|
1190
|
+
if palette_sdk_version and version_matches(palette_sdk_version, compatible_palette_version):
|
|
1191
|
+
return True
|
|
1192
|
+
click.echo(
|
|
1193
|
+
f"❌ Palette SDK version {palette_sdk_version or 'unknown'} is not compatible. "
|
|
1194
|
+
f"Required: {compatible_palette_version}"
|
|
1195
|
+
)
|
|
1196
|
+
continue
|
|
1173
1197
|
if platform_type != env_type:
|
|
1174
1198
|
continue
|
|
1175
1199
|
|
|
@@ -1179,10 +1203,10 @@ def _is_platform_compatible(metadata: dict, force: bool = False) -> bool:
|
|
|
1179
1203
|
if env_subtype not in compat and exact_devkit_type not in compat:
|
|
1180
1204
|
continue
|
|
1181
1205
|
else:
|
|
1182
|
-
compatible_board_version = platform_entry.get(
|
|
1183
|
-
# If version field exists in metadata then check if the board is running compatible version
|
|
1206
|
+
compatible_board_version = platform_entry.get("version", "")
|
|
1207
|
+
# If version field exists in metadata then check if the board is running compatible version.
|
|
1184
1208
|
if len(compatible_board_version) > 0:
|
|
1185
|
-
if board_ver
|
|
1209
|
+
if board_ver and version_matches(board_ver, compatible_board_version):
|
|
1186
1210
|
return True
|
|
1187
1211
|
else:
|
|
1188
1212
|
# otherwise return true as it's generally compatible
|