mammoth-cli 2.2.48__tar.gz → 2.2.49__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.
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/PKG-INFO +2 -2
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -3
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +10 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +30 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/dashboard.py +34 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/registry.py +4 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/schema.py +14 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/view.py +34 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/view_ops.py +69 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/errors/envelope.py +1 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/command_contract.py +19 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/input_fields.py +12 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/positionals.py +10 -0
- mammoth_cli-2.2.49/mammoth_cli/services/view_variants.py +164 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/pyproject.toml +2 -2
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/dashboard.yaml +52 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/view.yaml +147 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/edits-target.source.yaml +2 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/sdk-catalog.source.yaml +21 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/sdk-methods.yaml +37 -1
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/.gitignore +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/LICENSE +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/README.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/oauth.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/job_outcome.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.49
|
|
4
4
|
Summary: Command-line interface for the Mammoth Analytics platform
|
|
5
5
|
Project-URL: homepage, https://mammoth.io
|
|
6
6
|
Project-URL: repository, https://github.com/EdgeMetric/mammothsdk
|
|
@@ -17,7 +17,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
17
17
|
Requires-Python: <3.15,>=3.12
|
|
18
18
|
Requires-Dist: jsonschema>=4.20
|
|
19
19
|
Requires-Dist: keyring<26,>=25.7
|
|
20
|
-
Requires-Dist: mammoth-io<0.9,>=0.8.
|
|
20
|
+
Requires-Dist: mammoth-io<0.9,>=0.8.27
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Published CLI command catalog
|
|
2
2
|
|
|
3
|
-
This generated catalog is a lookup table for every command in the published CLI manifest, currently
|
|
3
|
+
This generated catalog is a lookup table for every command in the published CLI manifest, currently 660; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
|
|
4
4
|
|
|
5
5
|
Load only the applicable domain file:
|
|
6
6
|
|
|
@@ -24,7 +24,7 @@ Load only the applicable domain file:
|
|
|
24
24
|
- [dashboard-qa](commands/dashboard-qa.md) — 14 published commands
|
|
25
25
|
- [dashboard-template](commands/dashboard-template.md) — 12 published commands
|
|
26
26
|
- [dashboard-style](commands/dashboard-style.md) — 10 published commands
|
|
27
|
-
- [dashboard](commands/dashboard.md) —
|
|
27
|
+
- [dashboard](commands/dashboard.md) — 99 published commands
|
|
28
28
|
- [data-app](commands/data-app.md) — 12 published commands
|
|
29
29
|
- [dataset](commands/dataset.md) — 22 published commands
|
|
30
30
|
- [doctor](commands/doctor.md) — 1 published commands
|
|
@@ -51,7 +51,7 @@ Load only the applicable domain file:
|
|
|
51
51
|
- [user](commands/user.md) — 8 published commands
|
|
52
52
|
- [version](commands/version.md) — 1 published commands
|
|
53
53
|
- [view-transform](commands/view-transform.md) — 32 published commands
|
|
54
|
-
- [view](commands/view.md) —
|
|
54
|
+
- [view](commands/view.md) — 97 published commands
|
|
55
55
|
- [webhook](commands/webhook.md) — 7 published commands
|
|
56
56
|
- [workflow](commands/workflow.md) — 16 published commands
|
|
57
57
|
- [workspace](commands/workspace.md) — 26 published commands
|
|
@@ -422,6 +422,16 @@ Result: `DashboardFigureIntentResult`; mutation `benign_mutation`, confirmation
|
|
|
422
422
|
|
|
423
423
|
Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a full matched structured body ({"added":{...},"kind":"bar","spec":{...},"intentApplied":true,...}) instead of raising ValidationError on an unmatch…
|
|
424
424
|
|
|
425
|
+
### `dashboard.figure.add`
|
|
426
|
+
|
|
427
|
+
Run: `mammoth dashboard figure add`. Exact input fields: `mammoth schema get dashboard.figure.add`.
|
|
428
|
+
|
|
429
|
+
Example: `mammoth dashboard figure add 123 --input '{"dataview_id": 1, "figure": {"kind": "hbar", "title": "Revenue by region", "dim": "Region", "measure": "Revenue", "agg": "sum"}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
430
|
+
|
|
431
|
+
Result: `DashboardFigureAddResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
432
|
+
|
|
433
|
+
Status on release: untried; no live run recorded.
|
|
434
|
+
|
|
425
435
|
### `dashboard.filter.add`
|
|
426
436
|
|
|
427
437
|
Run: `mammoth dashboard filter add`. Exact input fields: `mammoth schema get dashboard.filter.add`.
|
|
@@ -412,6 +412,26 @@ Result: `ViewDraftSubmitResult`; mutation `reversible_pipeline`, confirmation `n
|
|
|
412
412
|
|
|
413
413
|
Status on release: untried; no live run recorded.
|
|
414
414
|
|
|
415
|
+
### `view.explore-panel.get`
|
|
416
|
+
|
|
417
|
+
Run: `mammoth view explore-panel get`. Exact input fields: `mammoth schema get view.explore-panel.get`.
|
|
418
|
+
|
|
419
|
+
Example: `mammoth view explore-panel get 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
420
|
+
|
|
421
|
+
Result: `ViewExplorePanelGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
422
|
+
|
|
423
|
+
Status on release: untried; no live run recorded.
|
|
424
|
+
|
|
425
|
+
### `view.explore-panel.set`
|
|
426
|
+
|
|
427
|
+
Run: `mammoth view explore-panel set`. Exact input fields: `mammoth schema get view.explore-panel.set`.
|
|
428
|
+
|
|
429
|
+
Example: `mammoth view explore-panel set 123 --input '{"panel": {"open": true, "items": [{"column": "column_1", "renderType": "chart"}]}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
430
|
+
|
|
431
|
+
Result: `ViewExplorePanelSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
432
|
+
|
|
433
|
+
Status on release: untried; no live run recorded.
|
|
434
|
+
|
|
415
435
|
### `view.export.azure-blob`
|
|
416
436
|
|
|
417
437
|
Run: `mammoth view export azure-blob`. Exact input fields: `mammoth schema get view.export.azure-blob`.
|
|
@@ -914,6 +934,16 @@ Result: `ViewUpdateResult`; mutation `benign_mutation`, confirmation `none`, wai
|
|
|
914
934
|
|
|
915
935
|
Status on release: untried; no live run recorded.
|
|
916
936
|
|
|
937
|
+
### `view.variants.create`
|
|
938
|
+
|
|
939
|
+
Run: `mammoth view variants create`. Exact input fields: `mammoth schema get view.variants.create`.
|
|
940
|
+
|
|
941
|
+
Example: `mammoth view variants create 123 --input '{"from_view": 456, "column": "Region", "values": ["East", "West"]}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
942
|
+
|
|
943
|
+
Result: `ViewVariantsCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
|
|
944
|
+
|
|
945
|
+
Status on release: untried; no live run recorded.
|
|
946
|
+
|
|
917
947
|
### `view.version.apply`
|
|
918
948
|
|
|
919
949
|
Run: `mammoth view version apply`. Exact input fields: `mammoth schema get view.version.apply`.
|
|
@@ -608,6 +608,40 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
|
|
|
608
608
|
return data, _meta(invocation, auth.workspace_id)
|
|
609
609
|
|
|
610
610
|
|
|
611
|
+
def _figure_page_kwargs(page: Any) -> dict[str, Any]:
|
|
612
|
+
"""Map the endpoint's ``page`` ({"id"} or {"new_title"}) onto the SDK's page arguments."""
|
|
613
|
+
if not isinstance(page, dict) or set(page) not in ({"id"}, {"new_title"}):
|
|
614
|
+
raise CliError(
|
|
615
|
+
code=CODE_INVALID_ARGUMENT,
|
|
616
|
+
message='The \'page\' input field must be {"id": ...} or {"new_title": ...}.',
|
|
617
|
+
exit_status=EXIT_USAGE,
|
|
618
|
+
)
|
|
619
|
+
if "id" in page:
|
|
620
|
+
return {"page_id": page["id"]}
|
|
621
|
+
return {"page_new_title": page["new_title"]}
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
def dashboard_figure_add(invocation: Invocation) -> HandlerResult:
|
|
625
|
+
"""Add one figure to a dashboard. The input is the endpoint's own shape.
|
|
626
|
+
|
|
627
|
+
``dataview_id`` and ``figure`` are required; ``banded`` and ``page`` (``{"id": ...}``
|
|
628
|
+
or ``{"new_title": ...}``) are optional. The result carries ``bake_job_id``.
|
|
629
|
+
"""
|
|
630
|
+
dashboard_id = _require_int_positional(invocation, "dashboard id")
|
|
631
|
+
document = _bound_document(invocation)
|
|
632
|
+
kwargs: dict[str, Any] = {
|
|
633
|
+
"dashboard_id": dashboard_id,
|
|
634
|
+
"dataview_id": _require_field(document, "dataview_id"),
|
|
635
|
+
"figure": _require_field(document, "figure"),
|
|
636
|
+
}
|
|
637
|
+
_forward_optional(document, kwargs, ("banded",))
|
|
638
|
+
if document.get("page") is not None:
|
|
639
|
+
kwargs.update(_figure_page_kwargs(document["page"]))
|
|
640
|
+
with open_service(invocation) as (service, auth):
|
|
641
|
+
data = service.call(_symbol(invocation), **kwargs)
|
|
642
|
+
return data, _meta(invocation, auth.workspace_id)
|
|
643
|
+
|
|
644
|
+
|
|
611
645
|
def dashboard_cancel_generation(invocation: Invocation) -> HandlerResult:
|
|
612
646
|
"""Cancel an in-progress dashboard generation."""
|
|
613
647
|
dashboard_id = _require_int_positional(invocation, "dashboard id")
|
|
@@ -483,6 +483,7 @@ HANDLERS: dict[str, Handler] = {
|
|
|
483
483
|
"dashboard.tags.merge": dashboard_cmd.dashboard_tags_merge,
|
|
484
484
|
"dashboard.published-data-by-url": dashboard_cmd.dashboard_published_data_by_url,
|
|
485
485
|
"dashboard.restore": dashboard_cmd.dashboard_restore,
|
|
486
|
+
"dashboard.figure.add": dashboard_cmd.dashboard_figure_add,
|
|
486
487
|
"dashboard.share": dashboard_cmd.dashboard_share,
|
|
487
488
|
"dashboard.source.list": dashboard_cmd.dashboard_source_list,
|
|
488
489
|
"dashboard.trash": dashboard_cmd.dashboard_trash,
|
|
@@ -777,6 +778,8 @@ HANDLERS: dict[str, Handler] = {
|
|
|
777
778
|
"view.optimize": view_cmd.view_optimize,
|
|
778
779
|
"view.compare": view_cmd.view_compare,
|
|
779
780
|
"view.update": view_cmd.view_update,
|
|
781
|
+
"view.explore-panel.get": view_cmd.view_explore_panel_get,
|
|
782
|
+
"view.explore-panel.set": view_cmd.view_explore_panel_set,
|
|
780
783
|
"view.data.get": view_cmd.view_data_get,
|
|
781
784
|
"view.data.query": view_cmd.view_data_query,
|
|
782
785
|
"view.data.aggregate": view_cmd.view_data_aggregate_rounded,
|
|
@@ -852,6 +855,7 @@ HANDLERS: dict[str, Handler] = {
|
|
|
852
855
|
"view.export.tableau": view_cmd.view_export_specialized,
|
|
853
856
|
# view family (View-object: create/get/delete, draft, transforms)
|
|
854
857
|
"view.create": view_ops_cmd.view_create,
|
|
858
|
+
"view.variants.create": view_ops_cmd.view_variants_create,
|
|
855
859
|
"view.get": view_ops_cmd.view_get,
|
|
856
860
|
"view.delete": view_ops_cmd.view_delete,
|
|
857
861
|
"view.draft.enter": view_ops_cmd.view_draft_enter,
|
|
@@ -46,8 +46,17 @@ _PROTECTED_INPUT_PATH = "/private/path/request.json"
|
|
|
46
46
|
# second id, an optional-but-central input field, or two views to compare.
|
|
47
47
|
_FIXED_EXAMPLES: dict[str, tuple[tuple[str, ...], dict[str, Any]]] = {
|
|
48
48
|
"view.optimize": (("123",), {}),
|
|
49
|
+
"view.explore-panel.get": (("123",), {}),
|
|
50
|
+
"view.explore-panel.set": (
|
|
51
|
+
("123",),
|
|
52
|
+
{"panel": {"open": True, "items": [{"column": "column_1", "renderType": "chart"}]}},
|
|
53
|
+
),
|
|
49
54
|
"project.check": (("123", "456"), {}),
|
|
50
55
|
"view.data.profile": (("123",), {"target": "Churn"}),
|
|
56
|
+
"view.variants.create": (
|
|
57
|
+
("123",),
|
|
58
|
+
{"from_view": 456, "column": "Region", "values": ["East", "West"]},
|
|
59
|
+
),
|
|
51
60
|
"workflow.canvas": (
|
|
52
61
|
("12",),
|
|
53
62
|
{
|
|
@@ -97,6 +106,11 @@ _GROUP_DISCOVERY_PURPOSES = {
|
|
|
97
106
|
|
|
98
107
|
_COMMAND_DISCOVERY_PURPOSES = {
|
|
99
108
|
"view.update": "rename change name to a new name title relabel",
|
|
109
|
+
"view.explore-panel.get": "explore cards saved panel the data editor explore side panel read",
|
|
110
|
+
"view.explore-panel.set": "save replace explore cards panel items chart a column in the editor",
|
|
111
|
+
"dashboard.figure.add": (
|
|
112
|
+
"append an explore card figure tile to a dashboard from a payload, no chat turn"
|
|
113
|
+
),
|
|
100
114
|
"file.upload": (
|
|
101
115
|
"upload import CSV spreadsheet XLSX source data append add rows union stack "
|
|
102
116
|
"a file into an existing dataset excel workbook tabs sheets drop in"
|
|
@@ -1115,6 +1115,40 @@ def view_update(invocation: Invocation) -> HandlerResult:
|
|
|
1115
1115
|
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1116
1116
|
|
|
1117
1117
|
|
|
1118
|
+
def view_explore_panel_get(invocation: Invocation) -> HandlerResult:
|
|
1119
|
+
"""Read the Explore panel the caller saved on a view (empty when none is saved)."""
|
|
1120
|
+
project_id = require_project(invocation)
|
|
1121
|
+
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
1122
|
+
document = invocation.load_input() or {}
|
|
1123
|
+
with open_service(invocation) as (service, auth):
|
|
1124
|
+
dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
|
|
1125
|
+
data = service.call(
|
|
1126
|
+
_symbol(invocation),
|
|
1127
|
+
dataset_id=dataset_id,
|
|
1128
|
+
dataview_id=dataview_id,
|
|
1129
|
+
project_id=project_id,
|
|
1130
|
+
)
|
|
1131
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
def view_explore_panel_set(invocation: Invocation) -> HandlerResult:
|
|
1135
|
+
"""Replace the caller's saved Explore panel with the ``panel`` input field."""
|
|
1136
|
+
project_id = require_project(invocation)
|
|
1137
|
+
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
1138
|
+
document = invocation.load_input() or {}
|
|
1139
|
+
panel = _require_field(document, "panel")
|
|
1140
|
+
with open_service(invocation) as (service, auth):
|
|
1141
|
+
dataset_id = _verified_dataset_id(service, invocation, dataview_id, document)
|
|
1142
|
+
data = service.call(
|
|
1143
|
+
_symbol(invocation),
|
|
1144
|
+
dataset_id=dataset_id,
|
|
1145
|
+
dataview_id=dataview_id,
|
|
1146
|
+
panel=panel,
|
|
1147
|
+
project_id=project_id,
|
|
1148
|
+
)
|
|
1149
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1150
|
+
|
|
1151
|
+
|
|
1118
1152
|
def _untyped_patch_error(invocation: Invocation) -> CliError:
|
|
1119
1153
|
"""The refusal for a view patch that is not the typed rename."""
|
|
1120
1154
|
return CliError(
|
|
@@ -32,6 +32,7 @@ from mammoth_cli.commands.view import (
|
|
|
32
32
|
BRIEF_VIEW_FIELDS,
|
|
33
33
|
UNFINISHED_STATE,
|
|
34
34
|
_dataview_metadata,
|
|
35
|
+
_display_name_map,
|
|
35
36
|
_require_discovery_allowed,
|
|
36
37
|
apply_column_renames,
|
|
37
38
|
brief_view_record,
|
|
@@ -66,6 +67,15 @@ from mammoth_cli.services.command_contract import bind_command_inputs
|
|
|
66
67
|
from mammoth_cli.services.conditions import CONDITION_KWARG, compile_condition
|
|
67
68
|
from mammoth_cli.services.input_fields import TASK_COUNT_FIELD
|
|
68
69
|
from mammoth_cli.services.sql_check import check_sql_binds
|
|
70
|
+
from mammoth_cli.services.view_variants import (
|
|
71
|
+
VariantPlan,
|
|
72
|
+
created_entry,
|
|
73
|
+
name_template_of,
|
|
74
|
+
partial_failure,
|
|
75
|
+
plan_variants,
|
|
76
|
+
require_known_column,
|
|
77
|
+
variants_result,
|
|
78
|
+
)
|
|
69
79
|
from mammoth_cli.services.write_impact import (
|
|
70
80
|
ImpactRead,
|
|
71
81
|
Measure,
|
|
@@ -772,6 +782,65 @@ def _require_clone_from_same_dataset(service: Any, clone_from: int, dataset_id:
|
|
|
772
782
|
)
|
|
773
783
|
|
|
774
784
|
|
|
785
|
+
_VIEW_CREATE_SYMBOL = "mammoth.client.ViewsResource.create"
|
|
786
|
+
|
|
787
|
+
|
|
788
|
+
def view_variants_create(invocation: Invocation) -> HandlerResult:
|
|
789
|
+
"""Create one view per value of a column: each a clone of ``from_view`` filtered to it.
|
|
790
|
+
|
|
791
|
+
Composes ``view create`` (``clone_from``) and ``view transform filter``. All
|
|
792
|
+
checks that need no write run first; the first failing write stops the run
|
|
793
|
+
and the error names every view already created.
|
|
794
|
+
"""
|
|
795
|
+
dataset_id = _require_int_positional(invocation, "dataset id")
|
|
796
|
+
raw = invocation.load_input()
|
|
797
|
+
for field in ("from_view", "column", "values"):
|
|
798
|
+
_require_field(raw, field)
|
|
799
|
+
document = bind_command_inputs(invocation.command_id, raw)
|
|
800
|
+
from_view = int(document["from_view"])
|
|
801
|
+
column = str(document["column"])
|
|
802
|
+
with open_service(invocation) as (service, auth):
|
|
803
|
+
_require_clone_from_same_dataset(service, from_view, dataset_id)
|
|
804
|
+
source = service.call(_DATAVIEW_GET_SYMBOL, dataset_id=dataset_id, dataview_id=from_view)
|
|
805
|
+
names = set(_display_name_map(service, dataset_id, from_view, None).values())
|
|
806
|
+
require_known_column(from_view, column, names)
|
|
807
|
+
plans = plan_variants(
|
|
808
|
+
str(source.get("name", "")) if isinstance(source, dict) else "",
|
|
809
|
+
column,
|
|
810
|
+
document["values"],
|
|
811
|
+
name_template_of(document),
|
|
812
|
+
)
|
|
813
|
+
created = _create_variants(service, dataset_id, from_view, plans)
|
|
814
|
+
result = variants_result(dataset_id, from_view, column, created)
|
|
815
|
+
return result, _meta(invocation, auth.workspace_id)
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
def _create_variants(
|
|
819
|
+
service: Any, dataset_id: int, from_view: int, plans: list[VariantPlan]
|
|
820
|
+
) -> list[dict[str, Any]]:
|
|
821
|
+
"""Create and filter each variant in order; the first failure stops with a full report."""
|
|
822
|
+
created: list[dict[str, Any]] = []
|
|
823
|
+
for position, plan in enumerate(plans):
|
|
824
|
+
new_id: int | None = None
|
|
825
|
+
try:
|
|
826
|
+
view = _view_payload(
|
|
827
|
+
service.call(
|
|
828
|
+
_VIEW_CREATE_SYMBOL, dataset_id=dataset_id, name=plan.name, clone_from=from_view
|
|
829
|
+
)
|
|
830
|
+
)
|
|
831
|
+
new_id = int(view["id"])
|
|
832
|
+
data = service.call_view(
|
|
833
|
+
new_id, "filter_rows", dataset_id=dataset_id, condition=plan.condition
|
|
834
|
+
)
|
|
835
|
+
reject_pipeline_reference_errors(service, new_id, dataset_id, data)
|
|
836
|
+
except CliError as exc:
|
|
837
|
+
raise partial_failure(
|
|
838
|
+
plan, exc, created, plans[position + 1 :], new_id, dataset_id
|
|
839
|
+
) from exc
|
|
840
|
+
created.append(created_entry(plan, view))
|
|
841
|
+
return created
|
|
842
|
+
|
|
843
|
+
|
|
775
844
|
_DASHBOARDS_LIST_SYMBOL = "mammoth.api.dashboards.DashboardsAPI.list"
|
|
776
845
|
|
|
777
846
|
|
|
@@ -153,6 +153,7 @@ ERROR_SUMMARIES: dict[str, str] = {
|
|
|
153
153
|
"missing_field": _S_MISSING_INFO,
|
|
154
154
|
"network_error": "Mammoth couldn't be reached over the network.",
|
|
155
155
|
"no_op": "There is nothing to change, so this step isn't needed.",
|
|
156
|
+
"variants_partial_failure": "Some of the variant views were created and one failed.",
|
|
156
157
|
"no_output": "This step didn't return anything.",
|
|
157
158
|
"nonfinite_input_number": _S_BAD_INPUT,
|
|
158
159
|
"not_authenticated": _S_SIGN_IN,
|
|
@@ -350,6 +350,15 @@ _VIEW_DATA_PROFILE_FIELDS = (
|
|
|
350
350
|
FieldSpec("limit", required=False, annotation=int, default=50),
|
|
351
351
|
)
|
|
352
352
|
|
|
353
|
+
# view.variants.create is a CLI composite over view create (clone_from) and
|
|
354
|
+
# view transform filter; its document fields are authored here.
|
|
355
|
+
_VIEW_VARIANTS_CREATE_FIELDS = (
|
|
356
|
+
FieldSpec("from_view", required=True, annotation=int),
|
|
357
|
+
FieldSpec("column", required=True, annotation=str),
|
|
358
|
+
FieldSpec("values", required=True, annotation=list[str | int | float]),
|
|
359
|
+
FieldSpec("name_template", required=False, annotation=str | None, default=None),
|
|
360
|
+
)
|
|
361
|
+
|
|
353
362
|
# view.conditional-format.create: ``rule`` (raw body) stays accepted; the typed fields build one
|
|
354
363
|
# rule per column (per-cell threshold) or one row rule (see
|
|
355
364
|
# mammoth_cli.services.conditional_format). ``rule`` is therefore optional here -- the handler
|
|
@@ -723,6 +732,14 @@ _S7_ADDITIONAL_INPUT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
|
|
|
723
732
|
# The typed rename: the handler builds the one ``replace`` on ``name``; the
|
|
724
733
|
# SDK's free-form ``patch_data`` is handler-owned and never offered.
|
|
725
734
|
"view.update": (FieldSpec("name", required=True, annotation=str),),
|
|
735
|
+
# The endpoint's own params: ``page`` is {"id"} or {"new_title"}; the handler maps
|
|
736
|
+
# it onto the SDK's page_id / page_new_title.
|
|
737
|
+
"dashboard.figure.add": (
|
|
738
|
+
FieldSpec("dataview_id", required=True, annotation=int),
|
|
739
|
+
FieldSpec("figure", required=True, annotation=dict[str, Any]),
|
|
740
|
+
FieldSpec("banded", required=False, annotation=dict[str, Any] | None, default=None),
|
|
741
|
+
FieldSpec("page", required=False, annotation=dict[str, Any] | None, default=None),
|
|
742
|
+
),
|
|
726
743
|
"user.preference.update": (
|
|
727
744
|
# PreferencesPatchRequest: replace ops on dotted paths rooted at
|
|
728
745
|
# GLOBAL or WORKSPACE_PREFERENCES.
|
|
@@ -795,6 +812,8 @@ def resolve_command_contract(command_id: str) -> ResolvedCommandContract | None:
|
|
|
795
812
|
special_fields = _VIEW_DATA_COMPARE_FIELDS
|
|
796
813
|
elif command_id == "view.data.profile":
|
|
797
814
|
special_fields = _VIEW_DATA_PROFILE_FIELDS
|
|
815
|
+
elif command_id == "view.variants.create":
|
|
816
|
+
special_fields = _VIEW_VARIANTS_CREATE_FIELDS
|
|
798
817
|
elif command_id == "dashboard.filter.add":
|
|
799
818
|
special_fields = _DASHBOARD_FILTER_ADD_FIELDS
|
|
800
819
|
elif command_id == "dashboard.filter.remove":
|
|
@@ -48,6 +48,8 @@ _HANDLER_OWNED_FIELDS: dict[str, frozenset[str]] = {
|
|
|
48
48
|
"view.data.aggregate": frozenset({"sort"}),
|
|
49
49
|
# ``view update`` offers only the typed rename; the handler builds the patch.
|
|
50
50
|
"view.update": frozenset({"patch_data"}),
|
|
51
|
+
# The endpoint names the target page as ``page``; the handler maps it onto these two.
|
|
52
|
+
"dashboard.figure.add": frozenset({"page_id", "page_new_title"}),
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
# CLI-only commands whose complete request is carried by positionals/context.
|
|
@@ -79,6 +81,16 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
|
|
|
79
81
|
# View display settings: real column names read better than sample keys.
|
|
80
82
|
"view.transform.rename-columns": {"renames": {"cust_id": "Customer ID"}},
|
|
81
83
|
"view.update": {"name": "Revenue report"},
|
|
84
|
+
"dashboard.figure.add": {
|
|
85
|
+
"dataview_id": 1,
|
|
86
|
+
"figure": {
|
|
87
|
+
"kind": "hbar",
|
|
88
|
+
"title": "Revenue by region",
|
|
89
|
+
"dim": "Region",
|
|
90
|
+
"measure": "Revenue",
|
|
91
|
+
"agg": "sum",
|
|
92
|
+
},
|
|
93
|
+
},
|
|
82
94
|
"view.transform.sort": {"order_by": [["Revenue", "DESC"]]},
|
|
83
95
|
# The backend requires integer resource ids ("resource_ids must be
|
|
84
96
|
# comma-separated integers"); the SDK annotation is a plain list[str].
|
|
@@ -165,6 +165,10 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
|
|
|
165
165
|
example_value="card.png",
|
|
166
166
|
),
|
|
167
167
|
),
|
|
168
|
+
# The figure's source view is the ``dataview_id`` input field, never a second positional.
|
|
169
|
+
"dashboard.figure.add": (
|
|
170
|
+
PositionalSpec(name="dashboard_id", type=int, required=True, help="ID of the dashboard."),
|
|
171
|
+
),
|
|
168
172
|
"dashboard.gallery.get": (
|
|
169
173
|
PositionalSpec(name="slug", type=str, required=True, help="Template slug."),
|
|
170
174
|
),
|
|
@@ -810,6 +814,8 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
|
|
|
810
814
|
"view.impact",
|
|
811
815
|
"view.optimize",
|
|
812
816
|
"view.update",
|
|
817
|
+
"view.explore-panel.get",
|
|
818
|
+
"view.explore-panel.set",
|
|
813
819
|
"view.conditional-format.create",
|
|
814
820
|
"view.conditional-format.delete-all",
|
|
815
821
|
"view.conditional-format.list",
|
|
@@ -1234,6 +1240,10 @@ _EXACT_PARENT_HELP_OVERRIDES: dict[str, str] = {
|
|
|
1234
1240
|
"view.optimize": (
|
|
1235
1241
|
"Optional parent dataset ID. Leave it out and the CLI looks up the view's dataset. A value that is not the view's dataset is refused before the write."
|
|
1236
1242
|
),
|
|
1243
|
+
"view.explore-panel.set": (
|
|
1244
|
+
"Optional parent dataset ID. Leave it out and the CLI looks up the view's dataset. "
|
|
1245
|
+
"A value that is not the view's dataset is refused before the write."
|
|
1246
|
+
),
|
|
1237
1247
|
"view.export.dataset": (
|
|
1238
1248
|
"Exact parent dataset ID of the SOURCE view being exported -- not the "
|
|
1239
1249
|
"destination. Required for this command: pass it here or as the "
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Plan and report ``view variants create``: one view per value of one column.
|
|
2
|
+
|
|
3
|
+
The handler composes two existing SDK calls per value (create a view cloned
|
|
4
|
+
from the source view, then filter it to the value). This module owns the parts
|
|
5
|
+
that need no server: the per-value plan and the result, including the loud
|
|
6
|
+
partial-failure error that names every view already created.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from mammoth.models.pipeline import Operator
|
|
15
|
+
|
|
16
|
+
from mammoth_cli.errors.envelope import (
|
|
17
|
+
CODE_INVALID_ARGUMENTS,
|
|
18
|
+
EXIT_API,
|
|
19
|
+
EXIT_USAGE,
|
|
20
|
+
CliError,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
DEFAULT_NAME_TEMPLATE = "{view} - {value}"
|
|
24
|
+
CODE_VARIANTS_PARTIAL = "variants_partial_failure"
|
|
25
|
+
MAX_VARIANTS = 50
|
|
26
|
+
|
|
27
|
+
type VariantValue = str | int | float
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class VariantPlan:
|
|
32
|
+
"""One variant to create: its view name and the filter that defines it."""
|
|
33
|
+
|
|
34
|
+
value: VariantValue
|
|
35
|
+
name: str
|
|
36
|
+
condition: dict[str, Any]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def plan_variants(
|
|
40
|
+
source_name: str, column: str, values: list[VariantValue], name_template: str
|
|
41
|
+
) -> list[VariantPlan]:
|
|
42
|
+
"""Return one plan per value, refusing input that could not make distinct views."""
|
|
43
|
+
if not values:
|
|
44
|
+
raise _invalid("values must name at least one value.")
|
|
45
|
+
if len(values) > MAX_VARIANTS:
|
|
46
|
+
raise _invalid(f"values holds {len(values)} entries; the limit is {MAX_VARIANTS} per call.")
|
|
47
|
+
if len({str(value) for value in values}) != len(values):
|
|
48
|
+
raise _invalid("values must not repeat a value; each value makes one view.")
|
|
49
|
+
plans = [
|
|
50
|
+
VariantPlan(
|
|
51
|
+
value=value,
|
|
52
|
+
name=_render_name(name_template, source_name, value),
|
|
53
|
+
condition={"column": column, "operator": Operator.EQ.value, "value": value},
|
|
54
|
+
)
|
|
55
|
+
for value in values
|
|
56
|
+
]
|
|
57
|
+
if len({plan.name for plan in plans}) != len(plans):
|
|
58
|
+
raise _invalid(
|
|
59
|
+
"name_template gives two variants the same name.",
|
|
60
|
+
hint="Include {value} in name_template.",
|
|
61
|
+
)
|
|
62
|
+
return plans
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def name_template_of(document: dict[str, Any]) -> str:
|
|
66
|
+
"""The document's name template; absent, null or empty means the default."""
|
|
67
|
+
return str(document.get("name_template") or DEFAULT_NAME_TEMPLATE)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def require_known_column(view_id: int, column: str, names: set[str]) -> None:
|
|
71
|
+
"""Refuse a column the source view lacks; an unreadable column list is an error too."""
|
|
72
|
+
if not names:
|
|
73
|
+
raise CliError(
|
|
74
|
+
code=CODE_INVALID_ARGUMENTS,
|
|
75
|
+
message=f"Could not read the columns of view {view_id}, so '{column}' was not checked.",
|
|
76
|
+
exit_status=EXIT_API,
|
|
77
|
+
hint=f"Run `mammoth view get {view_id}` and retry; no view was created.",
|
|
78
|
+
details={"view_id": view_id, "column": column},
|
|
79
|
+
)
|
|
80
|
+
if column not in names:
|
|
81
|
+
raise CliError(
|
|
82
|
+
code=CODE_INVALID_ARGUMENTS,
|
|
83
|
+
message=f"View {view_id} has no column '{column}'.",
|
|
84
|
+
exit_status=EXIT_USAGE,
|
|
85
|
+
hint="Use one of: " + ", ".join(sorted(names)) + ".",
|
|
86
|
+
details={"view_id": view_id, "column": column, "columns": sorted(names)},
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _render_name(template: str, source_name: str, value: VariantValue) -> str:
|
|
91
|
+
try:
|
|
92
|
+
return template.format(view=source_name, value=value)
|
|
93
|
+
except (KeyError, IndexError, ValueError) as exc:
|
|
94
|
+
raise _invalid(
|
|
95
|
+
f"name_template {template!r} is not valid.",
|
|
96
|
+
hint="Use only {view} and {value}, for example '{view} - {value}'.",
|
|
97
|
+
) from exc
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _invalid(message: str, hint: str | None = None) -> CliError:
|
|
101
|
+
return CliError(code=CODE_INVALID_ARGUMENTS, message=message, exit_status=EXIT_USAGE, hint=hint)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def created_entry(plan: VariantPlan, view: dict[str, Any]) -> dict[str, Any]:
|
|
105
|
+
"""The result row for a variant that was created and filtered."""
|
|
106
|
+
return {"value": plan.value, "view_id": view.get("id"), "name": plan.name}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def variants_result(
|
|
110
|
+
dataset_id: int, from_view: int, column: str, created: list[dict[str, Any]]
|
|
111
|
+
) -> dict[str, Any]:
|
|
112
|
+
"""The result of a fully created set."""
|
|
113
|
+
return {
|
|
114
|
+
"dataset_id": dataset_id,
|
|
115
|
+
"from_view": from_view,
|
|
116
|
+
"column": column,
|
|
117
|
+
"view_ids": [entry["view_id"] for entry in created],
|
|
118
|
+
"variants": created,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def partial_failure(
|
|
123
|
+
failed: VariantPlan,
|
|
124
|
+
cause: CliError,
|
|
125
|
+
created: list[dict[str, Any]],
|
|
126
|
+
not_attempted: list[VariantPlan],
|
|
127
|
+
orphan_view_id: int | None,
|
|
128
|
+
dataset_id: int,
|
|
129
|
+
) -> CliError:
|
|
130
|
+
"""The error that stops the run: which variants exist, which failed, which never ran.
|
|
131
|
+
|
|
132
|
+
``orphan_view_id`` is the view that was created for ``failed`` but never got
|
|
133
|
+
its filter (so it holds the unfiltered source rows); the caller deletes or
|
|
134
|
+
fixes it, so it is named, never dropped.
|
|
135
|
+
"""
|
|
136
|
+
made = [entry["view_id"] for entry in created]
|
|
137
|
+
skipped = [plan.value for plan in not_attempted]
|
|
138
|
+
recovery = (
|
|
139
|
+
[f"mammoth view delete {orphan_view_id} {dataset_id}"] if orphan_view_id is not None else []
|
|
140
|
+
)
|
|
141
|
+
return CliError(
|
|
142
|
+
code=CODE_VARIANTS_PARTIAL,
|
|
143
|
+
message=(
|
|
144
|
+
f"Variant {failed.value!r} failed ({cause.message}); {len(created)} view(s) were "
|
|
145
|
+
f"created before it: {made}. Not attempted: {skipped}."
|
|
146
|
+
),
|
|
147
|
+
exit_status=EXIT_API,
|
|
148
|
+
hint=(
|
|
149
|
+
"Rerun with only the failed and not-attempted values. "
|
|
150
|
+
+ (
|
|
151
|
+
f"View {orphan_view_id} was created for {failed.value!r} but is not filtered; "
|
|
152
|
+
"delete it before the rerun."
|
|
153
|
+
if orphan_view_id is not None
|
|
154
|
+
else "No half-made view was left behind."
|
|
155
|
+
)
|
|
156
|
+
),
|
|
157
|
+
details={
|
|
158
|
+
"created": created,
|
|
159
|
+
"failed": {"value": failed.value, "code": cause.code, "message": cause.message},
|
|
160
|
+
"not_attempted": skipped,
|
|
161
|
+
"unfiltered_view_id": orphan_view_id,
|
|
162
|
+
},
|
|
163
|
+
recovery_commands=recovery,
|
|
164
|
+
)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mammoth-cli"
|
|
3
|
-
version = "2.2.
|
|
3
|
+
version = "2.2.49"
|
|
4
4
|
description = "Command-line interface for the Mammoth Analytics platform"
|
|
5
5
|
authors = [{name = "Mammoth Analytics", email = "support@mammoth.io"}]
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "LicenseRef-Proprietary"
|
|
8
8
|
requires-python = ">=3.12,<3.15"
|
|
9
9
|
dependencies = [
|
|
10
|
-
"mammoth-io (>=0.8.
|
|
10
|
+
"mammoth-io (>=0.8.27,<0.9)",
|
|
11
11
|
"typer (>=0.27,<0.28)",
|
|
12
12
|
"rich (>=15,<16)",
|
|
13
13
|
"platformdirs (>=4.10,<5)",
|