mammoth-cli 2.2.92__tar.gz → 2.2.93__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.92 → mammoth_cli-2.2.93}/PKG-INFO +2 -2
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +30 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +8 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/dataset.py +42 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/help_summaries.json +3 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/registry.py +5 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/schema.py +59 -5
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view.py +115 -18
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_ops.py +11 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/errors/envelope.py +4 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/executor.py +29 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/strict.py +17 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/command_contract.py +2 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/conditions.py +17 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/input_fields.py +10 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/positionals.py +3 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/pyproject.toml +2 -2
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/dataset.yaml +1 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/view.yaml +158 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/edits-target.source.yaml +2 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/sdk-catalog.source.yaml +24 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/sdk-methods.yaml +53 -1
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/.gitignore +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/LICENSE +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/README.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/_lazy.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/capabilities.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/how.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_drivers.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_explore.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_forecast.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/keyring_backend.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/oauth.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/limitations.json +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/next_commands.json +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/recipes.json +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/compact.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/labels.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/next_commands.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/opens.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/shared.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/token_scope.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/column_type_guard.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_figures.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/delete_check.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_card_edit.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_cards.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_figure.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_image.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/field_enums.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/folder_ids.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/job_outcome.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/local_files.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/paging.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/period_analysis.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/poll.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/read_memo.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/schema_diff.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/suggest.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/view_variants.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/capabilities.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/collection.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/how.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/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.93
|
|
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
|
|
@@ -18,7 +18,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
18
18
|
Requires-Python: <3.15,>=3.12
|
|
19
19
|
Requires-Dist: jsonschema>=4.20
|
|
20
20
|
Requires-Dist: keyring<26,>=25.7
|
|
21
|
-
Requires-Dist: mammoth-io<0.9,>=0.8.
|
|
21
|
+
Requires-Dist: mammoth-io<0.9,>=0.8.46
|
|
22
22
|
Requires-Dist: platformdirs<5,>=4.10
|
|
23
23
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
24
24
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mammoth-cli
|
|
3
|
-
version: 2.2.
|
|
3
|
+
version: 2.2.93
|
|
4
4
|
description: "Use Mammoth Analytics from a terminal: install or authenticate the CLI, discover its live command contract, and safely manage projects, data, views, pipelines (join, merge, pivot, filter, clean), dashboards, exports, and handoffs."
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# What is proven on release
|
|
2
2
|
|
|
3
3
|
Generated from `docs/release-capability-matrix.json`; do not edit by hand.
|
|
4
|
-
The CLI publishes
|
|
4
|
+
The CLI publishes 785 commands. 516 of them bind one of the 545 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (`view transform *` commands submit through `view.task.add`, except `rename-columns` and `sort`, which set view display properties through `view.update`). 262 bound commands ran once successfully on release, 1 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID`, run it, and treat the structured error envelope as the answer. Use an untried command normally: confirm a write with the user first, check its result with a read afterwards, and never refuse a command only because it is untried.
|
|
5
5
|
|
|
6
6
|
Status meanings:
|
|
7
7
|
|
|
@@ -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 785; 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
|
|
|
@@ -56,7 +56,7 @@ Load only the applicable domain file:
|
|
|
56
56
|
- [user](commands/user.md) — 8 published commands
|
|
57
57
|
- [version](commands/version.md) — 1 published commands
|
|
58
58
|
- [view-transform](commands/view-transform.md) — 35 published commands
|
|
59
|
-
- [view](commands/view.md) —
|
|
59
|
+
- [view](commands/view.md) — 109 published commands
|
|
60
60
|
- [webhook](commands/webhook.md) — 7 published commands
|
|
61
61
|
- [workflow](commands/workflow.md) — 23 published commands
|
|
62
62
|
- [workspace](commands/workspace.md) — 33 published commands
|
|
@@ -122,6 +122,16 @@ Result: `ViewCheckpointUpdateResult`; mutation `benign_mutation`, confirmation `
|
|
|
122
122
|
|
|
123
123
|
Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. First attempt sending a full AddCheckpointSpec body (matching create's shape) failed with invalid_input_field_type; update actually needs body.patches[] (CheckpointPatches/CheckPointPatch…
|
|
124
124
|
|
|
125
|
+
### `view.column.format.set`
|
|
126
|
+
|
|
127
|
+
Run: `mammoth view column format set`. Exact input fields: `mammoth schema get view.column.format.set`.
|
|
128
|
+
|
|
129
|
+
Example: `mammoth view column format set 123 --input '{"formats": {"Admitted": {"date_format": "%d-%b-%Y"}, "Revenue": {"decimal_spec": 2}}, "dataset_id": 456}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
130
|
+
|
|
131
|
+
Result: `ViewColumnFormatSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
132
|
+
|
|
133
|
+
Status on release: untried; no live run recorded.
|
|
134
|
+
|
|
125
135
|
### `view.compare`
|
|
126
136
|
|
|
127
137
|
Run: `mammoth view compare`. Exact input fields: `mammoth schema get view.compare`.
|
|
@@ -162,6 +172,16 @@ Result: `ViewConditionalFormatListResult`; mutation `read`, confirmation `none`,
|
|
|
162
172
|
|
|
163
173
|
Status on release: ran once on CLI 2.0.17 — re-verification 2026-09-18 (2.0.16 fixes): exit 0 on release with CLI 2.0.17. With SDK 0.7.9 the one existing rule is returned as [{rule_id, cf_type, FORMAT, CONDITION, ...}]; with SDK 0.7.8 the same call returned [] (mapping keyed by rule id was discarded).…
|
|
164
174
|
|
|
175
|
+
### `view.conditional-format.replace`
|
|
176
|
+
|
|
177
|
+
Run: `mammoth view conditional-format replace`. Exact input fields: `mammoth schema get view.conditional-format.replace`.
|
|
178
|
+
|
|
179
|
+
Example: `mammoth view conditional-format replace 123 456 --input '{"columns": ["Q1", "Q2", "Q3"], "operator": "<", "value": 55, "color": "red"}' --yes`. Illustrative only: append `--yes` after observing an owned target.
|
|
180
|
+
|
|
181
|
+
Result: `ViewConditionalFormatReplaceResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
|
|
182
|
+
|
|
183
|
+
Status on release: untried; no live run recorded.
|
|
184
|
+
|
|
165
185
|
### `view.conditional-format.update`
|
|
166
186
|
|
|
167
187
|
Run: `mammoth view conditional-format update`. Exact input fields: `mammoth schema get view.conditional-format.update`.
|
|
@@ -546,6 +566,16 @@ Result: `ViewExportDeleteResult`; mutation `external_effect`, confirmation `yes_
|
|
|
546
566
|
|
|
547
567
|
Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on release with CLI 2.0.14. Deleted export 2 -> {future_id:null,status:deleted,trigger_id:2}. Single invocation only.
|
|
548
568
|
|
|
569
|
+
### `view.export.download`
|
|
570
|
+
|
|
571
|
+
Run: `mammoth view export download`. Exact input fields: `mammoth schema get view.export.download`.
|
|
572
|
+
|
|
573
|
+
Example: `mammoth view export download 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
574
|
+
|
|
575
|
+
Result: `ViewExportDownloadResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
|
|
576
|
+
|
|
577
|
+
Status on release: untried; no live run recorded.
|
|
578
|
+
|
|
549
579
|
### `view.export.elasticsearch`
|
|
550
580
|
|
|
551
581
|
Run: `mammoth view export elasticsearch`. Exact input fields: `mammoth schema get view.export.elasticsearch`.
|
|
@@ -86,6 +86,14 @@ A TEXT column that writes numbers with a decimal comma (`1.234,5`) converts with
|
|
|
86
86
|
defaults to the other mark). `view data profile` lists such a column under
|
|
87
87
|
`summary.mixed_number_format` when its values mix notations.
|
|
88
88
|
|
|
89
|
+
A TEXT column of dates converts with `"to":"DATE"` and, on the same `conversions` entry,
|
|
90
|
+
`"input_formats":["DD/MM/YYYY","YYYY-MM-DD"]` (every layout the column mixes),
|
|
91
|
+
`"output_format":"DD-Mon-YYYY"` (how it displays) and
|
|
92
|
+
`"input_format_preference":"uk"` or `"us"` (which way `03/04/2024` reads). Formats are
|
|
93
|
+
Postgres date patterns.
|
|
94
|
+
`view column format set` changes only how a DATE or number column
|
|
95
|
+
shows, never its values.
|
|
96
|
+
|
|
89
97
|
In a math `expression`, write a multi-word display name bare (`Quantity * Unit
|
|
90
98
|
Price`) or quoted (`Quantity * \"Unit Price\"` inside the JSON string).
|
|
91
99
|
|
|
@@ -1077,6 +1077,45 @@ def _validate_paging(document: dict[str, Any]) -> None:
|
|
|
1077
1077
|
)
|
|
1078
1078
|
|
|
1079
1079
|
|
|
1080
|
+
def _batch_column_ids(
|
|
1081
|
+
service: Any, dataset_id: int, project_id: int, columns: str | list[str]
|
|
1082
|
+
) -> str:
|
|
1083
|
+
"""The comma-separated column ids the batch-data route wants, from names or ids."""
|
|
1084
|
+
response = service.call(_DATASET_GET_SYMBOL, dataset_id=dataset_id, project_id=project_id)
|
|
1085
|
+
dataset = response.get("dataset", response) if isinstance(response, dict) else {}
|
|
1086
|
+
schema = dataset.get("data_schema") if isinstance(dataset, dict) else None
|
|
1087
|
+
return resolve_batch_columns(schema, dataset_id, columns)
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
def resolve_batch_columns(schema: Any, dataset_id: int, columns: str | list[str]) -> str:
|
|
1091
|
+
"""Column ids, comma-separated, for names or ids in ``columns`` (a list or one string).
|
|
1092
|
+
|
|
1093
|
+
The batch-data route refuses display names with a bare "invalid columns"; the dataset
|
|
1094
|
+
schema maps each ``c_name`` to its ``c_id``. An id passes through; a name the schema
|
|
1095
|
+
lacks is refused with the names it has.
|
|
1096
|
+
"""
|
|
1097
|
+
if not isinstance(schema, list):
|
|
1098
|
+
raise CliError(
|
|
1099
|
+
code=CODE_API_ERROR,
|
|
1100
|
+
message=f"Could not read dataset {dataset_id}'s columns to resolve 'columns'.",
|
|
1101
|
+
exit_status=EXIT_API,
|
|
1102
|
+
)
|
|
1103
|
+
wanted = [n.strip() for n in columns.split(",")] if isinstance(columns, str) else columns
|
|
1104
|
+
ids = {c["c_id"] for c in schema if isinstance(c, dict) and "c_id" in c}
|
|
1105
|
+
by_name = {c["c_name"]: c["c_id"] for c in schema if isinstance(c, dict) and "c_name" in c}
|
|
1106
|
+
resolved = [name if name in ids else by_name.get(name) for name in wanted]
|
|
1107
|
+
missing = [name for name, found in zip(wanted, resolved, strict=True) if found is None]
|
|
1108
|
+
if missing:
|
|
1109
|
+
raise CliError(
|
|
1110
|
+
code="unknown_column",
|
|
1111
|
+
message=f"Column(s) not in dataset {dataset_id}: {', '.join(missing)}.",
|
|
1112
|
+
exit_status=EXIT_USAGE,
|
|
1113
|
+
hint="Use column names or ids from `mammoth dataset get`.",
|
|
1114
|
+
details={"columns": missing, "available": sorted(by_name)},
|
|
1115
|
+
)
|
|
1116
|
+
return ",".join(str(found) for found in resolved)
|
|
1117
|
+
|
|
1118
|
+
|
|
1080
1119
|
def dataset_batch_data(invocation: Invocation) -> HandlerResult:
|
|
1081
1120
|
"""Fetch data for a specific dataset batch."""
|
|
1082
1121
|
project_id = require_project(invocation)
|
|
@@ -1091,6 +1130,9 @@ def dataset_batch_data(invocation: Invocation) -> HandlerResult:
|
|
|
1091
1130
|
}
|
|
1092
1131
|
_forward_optional(document, kwargs, ("columns", "limit", "offset", "timeout", "poll_interval"))
|
|
1093
1132
|
with open_service(invocation) as (service, auth):
|
|
1133
|
+
if kwargs.get("columns"):
|
|
1134
|
+
columns = kwargs["columns"]
|
|
1135
|
+
kwargs["columns"] = _batch_column_ids(service, dataset_id, project_id, columns)
|
|
1094
1136
|
data = service.call(_symbol(invocation), **kwargs)
|
|
1095
1137
|
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1096
1138
|
|
|
@@ -583,10 +583,12 @@
|
|
|
583
583
|
"view.checkpoint.get": "Get one checkpoint by id.",
|
|
584
584
|
"view.checkpoint.list": "List checkpoints on a dataview, with optional filters from '--input'.",
|
|
585
585
|
"view.checkpoint.update": "Update one checkpoint by id. 'body' is required.",
|
|
586
|
+
"view.column.format.set": "Set how columns display (date or number format; a view display setting, not a task).",
|
|
586
587
|
"view.compare": "Compare dataviews pairwise: rows, column differences and checksums (read-only).",
|
|
587
588
|
"view.conditional-format.create": "Colour cells in many columns by one threshold in a single command (columns + operator + value + color): each cell is judged by its own value. applies_to=row colours whole rows when any/all of the columns match.",
|
|
588
589
|
"view.conditional-format.delete-all": "Delete a conditional-format rule on a dataview. Prompt or '--yes'.",
|
|
589
590
|
"view.conditional-format.list": "List conditional-format rules on a dataview.",
|
|
591
|
+
"view.conditional-format.replace": "Replace every conditional-format rule on a view with new ones in one call.",
|
|
590
592
|
"view.conditional-format.update": "Update a conditional-format rule on a dataview. 'rule' is required.",
|
|
591
593
|
"view.create": "Create a view from a dataset. Dataset id is positional; name/clone_from optional.",
|
|
592
594
|
"view.data-check.create": "Create a data check on a dataview. 'body' is required.",
|
|
@@ -625,6 +627,7 @@
|
|
|
625
627
|
"view.export.csv": "Export a dataview to a local CSV file.",
|
|
626
628
|
"view.export.dataset": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
627
629
|
"view.export.delete": "Delete one export by id. Always requires '--yes'.",
|
|
630
|
+
"view.export.download": "Download a dataview to a local file as csv, xlsx, json, ndjson, xml, yaml or parquet.",
|
|
628
631
|
"view.export.elasticsearch": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
629
632
|
"view.export.email": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
630
633
|
"view.export.ftp": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
@@ -885,6 +885,9 @@ _TARGETS: dict[str, str] = {
|
|
|
885
885
|
"mammoth_cli.commands.view:view_conditional_format_delete_all"
|
|
886
886
|
),
|
|
887
887
|
"view.conditional-format.list": "mammoth_cli.commands.view:view_conditional_format_list",
|
|
888
|
+
"view.conditional-format.replace": (
|
|
889
|
+
"mammoth_cli.commands.view:view_conditional_format_replace"
|
|
890
|
+
),
|
|
888
891
|
"view.conditional-format.update": "mammoth_cli.commands.view:view_conditional_format_update",
|
|
889
892
|
"view.checkpoint.create": "mammoth_cli.commands.view:view_checkpoint_create",
|
|
890
893
|
"view.checkpoint.delete": "mammoth_cli.commands.view:view_checkpoint_delete",
|
|
@@ -924,6 +927,7 @@ _TARGETS: dict[str, str] = {
|
|
|
924
927
|
"view.task.update": "mammoth_cli.commands.view:view_task_update",
|
|
925
928
|
"view.export.create": "mammoth_cli.commands.view:view_export_create",
|
|
926
929
|
"view.export.csv": "mammoth_cli.commands.view:view_export_csv",
|
|
930
|
+
"view.export.download": "mammoth_cli.commands.view:view_export_download",
|
|
927
931
|
"view.export.delete": "mammoth_cli.commands.view:view_export_delete",
|
|
928
932
|
"view.export.get": "mammoth_cli.commands.view:view_export_get",
|
|
929
933
|
"view.export.list": "mammoth_cli.commands.view:view_export_list",
|
|
@@ -1005,6 +1009,7 @@ _TARGETS: dict[str, str] = {
|
|
|
1005
1009
|
"view.transform.generate-sql": "mammoth_cli.commands.view_ops:view_transform_generate_sql",
|
|
1006
1010
|
"view.transform.increment-date": "mammoth_cli.commands.view_ops:view_transform_increment_date",
|
|
1007
1011
|
"view.transform.join": "mammoth_cli.commands.view_ops:view_transform_join",
|
|
1012
|
+
"view.column.format.set": "mammoth_cli.commands.view_ops:view_column_format_set",
|
|
1008
1013
|
"view.transform.json-extract": "mammoth_cli.commands.view_ops:view_transform_json_extract",
|
|
1009
1014
|
"view.transform.limit-rows": "mammoth_cli.commands.view_ops:view_transform_limit_rows",
|
|
1010
1015
|
"view.transform.lookup": "mammoth_cli.commands.view_ops:view_transform_lookup",
|
|
@@ -224,6 +224,10 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
224
224
|
"file.delete": "delete remove uploaded source file csv",
|
|
225
225
|
"file.list": "list show uploaded source files csv",
|
|
226
226
|
"view.export.csv": "export download local CSV file artifact",
|
|
227
|
+
"view.export.download": (
|
|
228
|
+
"export download local file artifact xlsx excel json ndjson xml yaml parquet "
|
|
229
|
+
"file type format"
|
|
230
|
+
),
|
|
227
231
|
"view.export.dataset": (
|
|
228
232
|
"send copy branch out create save the result rows into a new project from an "
|
|
229
233
|
"existing append appending union stack monthly rows across datasets views "
|
|
@@ -431,6 +435,15 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
431
435
|
"view.transform.rename-columns": (
|
|
432
436
|
"rename column columns header headers relabel change column name names title"
|
|
433
437
|
),
|
|
438
|
+
"view.column.format.set": (
|
|
439
|
+
"format display column date format number format decimals decimal places currency "
|
|
440
|
+
"symbol percent percentage thousands separator show dates as how values look grid "
|
|
441
|
+
"date display"
|
|
442
|
+
),
|
|
443
|
+
"view.conditional-format.replace": (
|
|
444
|
+
"replace redo reset change all conditional formatting rules highlight colour color "
|
|
445
|
+
"existing rules in one call"
|
|
446
|
+
),
|
|
434
447
|
"view.transform.replace": "find replace substitute text value in columns",
|
|
435
448
|
"view.transform.set-values": (
|
|
436
449
|
"set values assign overwrite blank empty default where condition label "
|
|
@@ -952,7 +965,8 @@ IN_PLACE_RECIPE = (
|
|
|
952
965
|
"EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view "
|
|
953
966
|
"and its dataset's output. To make a NEW dataset and leave the source untouched: "
|
|
954
967
|
"`mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working "
|
|
955
|
-
"view, then `mammoth view export dataset WORKING_VIEW_ID`
|
|
968
|
+
"view, then `mammoth view export dataset WORKING_VIEW_ID` "
|
|
969
|
+
"(add dataset_name only if the user named it)."
|
|
956
970
|
)
|
|
957
971
|
_IN_PLACE_KEYWORDS = (
|
|
958
972
|
"new dataset create make in place edits given view working view source untouched"
|
|
@@ -1183,17 +1197,53 @@ def _accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
|
|
|
1183
1197
|
]
|
|
1184
1198
|
|
|
1185
1199
|
|
|
1200
|
+
_INLINE_SCHEMA_MAX_CHARS = 3000
|
|
1201
|
+
#: A restrictions note (where a nested input shape often lives) is inlined up to this long.
|
|
1202
|
+
_INLINE_NOTES_MAX_CHARS = 700
|
|
1203
|
+
|
|
1204
|
+
|
|
1186
1205
|
def _compact_accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
|
|
1187
|
-
"""``_accepted_fields``
|
|
1206
|
+
"""``_accepted_fields`` with a nested JSON Schema only where the type name is not enough.
|
|
1188
1207
|
|
|
1189
1208
|
A find result inlines this for its top matches: enough to compose a call
|
|
1190
|
-
(name, type, required, enum) without
|
|
1191
|
-
|
|
1209
|
+
(name, type, required, enum) without a follow-up ``schema get``. A
|
|
1210
|
+
non-scalar field (e.g. convert-type's ``conversions``) also carries its
|
|
1211
|
+
JSON Schema, unless that would be larger than ``_INLINE_SCHEMA_MAX_CHARS``.
|
|
1192
1212
|
"""
|
|
1193
1213
|
fields = _accepted_fields(record)
|
|
1194
1214
|
if fields is None:
|
|
1195
1215
|
return None
|
|
1196
|
-
|
|
1216
|
+
compact: list[dict[str, Any]] = []
|
|
1217
|
+
for field in fields:
|
|
1218
|
+
item = {key: field[key] for key in ("name", "type", "required", "enum")}
|
|
1219
|
+
schema = field.get("schema")
|
|
1220
|
+
if (
|
|
1221
|
+
schema is not None
|
|
1222
|
+
and not _is_scalar_field_schema(schema)
|
|
1223
|
+
and len(json.dumps(schema, default=str)) <= _INLINE_SCHEMA_MAX_CHARS
|
|
1224
|
+
):
|
|
1225
|
+
item["schema"] = schema
|
|
1226
|
+
compact.append(item)
|
|
1227
|
+
return compact
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
def input_contract(command_id: str) -> dict[str, Any] | None:
|
|
1231
|
+
"""The input shape a rejected call should have used: fields (with nested shapes) and an example.
|
|
1232
|
+
|
|
1233
|
+
Attached to input-validation errors so the caller can correct the call
|
|
1234
|
+
without a ``schema get`` round trip. ``None`` for a command with no
|
|
1235
|
+
manifest record or no accepted fields.
|
|
1236
|
+
"""
|
|
1237
|
+
record = command_by_id(command_id)
|
|
1238
|
+
if record is None:
|
|
1239
|
+
return None
|
|
1240
|
+
fields = _compact_accepted_fields(record)
|
|
1241
|
+
if fields is None:
|
|
1242
|
+
return None
|
|
1243
|
+
contract: dict[str, Any] = {"command_id": command_id, "accepted_fields": fields}
|
|
1244
|
+
if record.get("agent_example"):
|
|
1245
|
+
contract["agent_example"] = record["agent_example"]
|
|
1246
|
+
return contract
|
|
1197
1247
|
|
|
1198
1248
|
|
|
1199
1249
|
def _externally_supplied_fields(command_id: str) -> frozenset[str]:
|
|
@@ -2215,6 +2265,10 @@ def _inline_call_detail(entries: list[dict[str, Any]]) -> None:
|
|
|
2215
2265
|
entry["accepted_fields"] = fields
|
|
2216
2266
|
if record.get("agent_example"):
|
|
2217
2267
|
entry["agent_example"] = record["agent_example"]
|
|
2268
|
+
notes = record.get("known_restrictions")
|
|
2269
|
+
if isinstance(notes, str) and notes:
|
|
2270
|
+
cut = notes[:_INLINE_NOTES_MAX_CHARS]
|
|
2271
|
+
entry["known_restrictions"] = cut + ("..." if len(notes) > len(cut) else "")
|
|
2218
2272
|
|
|
2219
2273
|
|
|
2220
2274
|
def _inline_picks(page: list[dict[str, Any]], offset: int) -> list[dict[str, Any]]:
|
|
@@ -1446,6 +1446,7 @@ def view_data_get(invocation: Invocation) -> HandlerResult:
|
|
|
1446
1446
|
)
|
|
1447
1447
|
page_size = _DATA_PAGE_ROWS if whole_view else kwargs["limit"]
|
|
1448
1448
|
data = _trim_rows(data, limit, page_size)
|
|
1449
|
+
data = keep_columns(data, document.get("columns"))
|
|
1449
1450
|
if document.get("sequence") is None:
|
|
1450
1451
|
# The view's row count is its latest step's; a read at an earlier step differs.
|
|
1451
1452
|
data = _with_paging_total(data, meta)
|
|
@@ -1467,6 +1468,34 @@ def _page_offset(value: Any) -> int:
|
|
|
1467
1468
|
return offset
|
|
1468
1469
|
|
|
1469
1470
|
|
|
1471
|
+
def keep_columns(data: Any, columns: list[str] | None) -> Any:
|
|
1472
|
+
"""Keep only ``columns`` (display names) in a data page's rows and column header.
|
|
1473
|
+
|
|
1474
|
+
A name the page does not have is refused with the names it does have, so a typo
|
|
1475
|
+
never reads as an empty column.
|
|
1476
|
+
"""
|
|
1477
|
+
if columns is None or not isinstance(data, dict):
|
|
1478
|
+
return data
|
|
1479
|
+
rows = data.get(_ROWS_KEY)
|
|
1480
|
+
if not isinstance(rows, list):
|
|
1481
|
+
return data
|
|
1482
|
+
first = rows[0] if rows else None
|
|
1483
|
+
available = list(first) if isinstance(first, dict) else list(data.get(_COLUMNS_KEY) or [])
|
|
1484
|
+
missing = [name for name in columns if name not in available]
|
|
1485
|
+
if missing:
|
|
1486
|
+
raise CliError(
|
|
1487
|
+
code="unknown_column",
|
|
1488
|
+
message=f"Column(s) not in the view: {', '.join(missing)}.",
|
|
1489
|
+
exit_status=EXIT_USAGE,
|
|
1490
|
+
hint="Use column display names from this view.",
|
|
1491
|
+
details={"columns": missing, "available": available},
|
|
1492
|
+
)
|
|
1493
|
+
kept = {**data, _ROWS_KEY: DataRows([{c: row[c] for c in columns} for row in rows])}
|
|
1494
|
+
if isinstance(data.get(_COLUMNS_KEY), list):
|
|
1495
|
+
kept[_COLUMNS_KEY] = list(columns)
|
|
1496
|
+
return kept
|
|
1497
|
+
|
|
1498
|
+
|
|
1470
1499
|
def _with_cli_paging(
|
|
1471
1500
|
data: Any,
|
|
1472
1501
|
invocation: Invocation,
|
|
@@ -2816,6 +2845,47 @@ def view_conditional_format_create(invocation: Invocation) -> HandlerResult:
|
|
|
2816
2845
|
project_id = require_project(invocation)
|
|
2817
2846
|
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
2818
2847
|
document = invocation.load_input() or {}
|
|
2848
|
+
has_typed = _cf_check_document(document)
|
|
2849
|
+
with open_service(invocation) as (service, auth):
|
|
2850
|
+
dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
|
|
2851
|
+
rules = _cf_rules_for_document(
|
|
2852
|
+
service, document, has_typed, (dataset_id, dataview_id, project_id)
|
|
2853
|
+
)
|
|
2854
|
+
data = _create_cf_rules(service, invocation, rules, (dataset_id, dataview_id, project_id))
|
|
2855
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
2856
|
+
|
|
2857
|
+
|
|
2858
|
+
def view_conditional_format_replace(invocation: Invocation) -> HandlerResult:
|
|
2859
|
+
"""Replace every conditional-format rule on a view with new ones in one call.
|
|
2860
|
+
|
|
2861
|
+
Takes the input of ``view conditional-format create`` (typed fields or a raw ``rule``);
|
|
2862
|
+
the old rules are deleted and the new ones created. Prompt or ``--yes``.
|
|
2863
|
+
"""
|
|
2864
|
+
project_id = require_project(invocation)
|
|
2865
|
+
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
2866
|
+
document = invocation.load_input() or {}
|
|
2867
|
+
has_typed = _cf_check_document(document)
|
|
2868
|
+
with open_service(invocation) as (service, auth):
|
|
2869
|
+
dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
|
|
2870
|
+
scope = (dataset_id, dataview_id, project_id)
|
|
2871
|
+
rules = _cf_rules_for_document(service, document, has_typed, scope)
|
|
2872
|
+
enforce_confirmation(
|
|
2873
|
+
invocation,
|
|
2874
|
+
policy=POLICY_PROMPT_OR_YES,
|
|
2875
|
+
action=f"replace all conditional-format rules on view {dataview_id}",
|
|
2876
|
+
)
|
|
2877
|
+
data = service.call(
|
|
2878
|
+
_symbol(invocation),
|
|
2879
|
+
dataset_id=dataset_id,
|
|
2880
|
+
dataview_id=dataview_id,
|
|
2881
|
+
rules=rules,
|
|
2882
|
+
project_id=project_id,
|
|
2883
|
+
)
|
|
2884
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
2885
|
+
|
|
2886
|
+
|
|
2887
|
+
def _cf_check_document(document: dict[str, Any]) -> bool:
|
|
2888
|
+
"""Whether the input uses the typed fields; refuses mixing them with ``rule`` or neither."""
|
|
2819
2889
|
has_typed = any(field in document for field in cf_rules.TYPED_FIELDS)
|
|
2820
2890
|
if "rule" in document and has_typed:
|
|
2821
2891
|
raise CliError(
|
|
@@ -2825,17 +2895,20 @@ def view_conditional_format_create(invocation: Invocation) -> HandlerResult:
|
|
|
2825
2895
|
)
|
|
2826
2896
|
if "rule" not in document and not has_typed:
|
|
2827
2897
|
_require_field(document, "rule")
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2898
|
+
return has_typed
|
|
2899
|
+
|
|
2900
|
+
|
|
2901
|
+
def _cf_rules_for_document(
|
|
2902
|
+
service: Any, document: dict[str, Any], has_typed: bool, scope: tuple[Any, ...]
|
|
2903
|
+
) -> list[dict[str, Any]]:
|
|
2904
|
+
"""The rule bodies an input document stands for (typed fields build one rule per column)."""
|
|
2905
|
+
dataset_id, dataview_id, project_id = scope
|
|
2906
|
+
if has_typed:
|
|
2907
|
+
metadata = _dataview_metadata(service, dataset_id, dataview_id, project_id)
|
|
2908
|
+
column_map, column_types = _column_maps(metadata)
|
|
2909
|
+
return cf_rules.build_rules(document, column_map, column_types)
|
|
2910
|
+
cf_rules.validate_rule(document["rule"])
|
|
2911
|
+
return [document["rule"]]
|
|
2839
2912
|
|
|
2840
2913
|
|
|
2841
2914
|
def _cf_sequence(rule: Any) -> int:
|
|
@@ -3992,18 +4065,42 @@ def view_export_csv(invocation: Invocation) -> HandlerResult:
|
|
|
3992
4065
|
signed download URL is returned instead so the host can hand it to its
|
|
3993
4066
|
user. ``output_path`` is refused in that case.
|
|
3994
4067
|
"""
|
|
4068
|
+
return _download_dataview(
|
|
4069
|
+
invocation, "mammoth.api.exports.ExportsAPI.to_csv_url", ("output_path", "timeout")
|
|
4070
|
+
)
|
|
4071
|
+
|
|
4072
|
+
|
|
4073
|
+
def view_export_download(invocation: Invocation) -> HandlerResult:
|
|
4074
|
+
"""Download a dataview to a local file as csv, xlsx, json, ndjson, xml, yaml or parquet.
|
|
4075
|
+
|
|
4076
|
+
Same as ``view export csv`` otherwise: ``--input '{"format": "xlsx", "output_path":
|
|
4077
|
+
"out.xlsx"}'``; the default name carries the format's extension; an existing file is not
|
|
4078
|
+
replaced unless ``--overwrite``; embedded, the signed download URL is returned instead.
|
|
4079
|
+
"""
|
|
4080
|
+
return _download_dataview(
|
|
4081
|
+
invocation,
|
|
4082
|
+
"mammoth.api.exports.ExportsAPI.to_file_url",
|
|
4083
|
+
("output_path", "file_type", "timeout"),
|
|
4084
|
+
)
|
|
4085
|
+
|
|
4086
|
+
|
|
4087
|
+
def _download_dataview(
|
|
4088
|
+
invocation: Invocation, embedded_symbol: str, fields: tuple[str, ...]
|
|
4089
|
+
) -> HandlerResult:
|
|
4090
|
+
"""Shared body of ``view export csv`` and ``view export download``."""
|
|
3995
4091
|
dataview_id = _require_int_positional_at(invocation, 0, "dataview id")
|
|
3996
4092
|
document = invocation.load_input() or {}
|
|
3997
4093
|
if embedded.active():
|
|
3998
|
-
return _view_export_csv_embedded(invocation, dataview_id, document)
|
|
4094
|
+
return _view_export_csv_embedded(invocation, dataview_id, document, embedded_symbol)
|
|
3999
4095
|
kwargs: dict[str, Any] = {"dataview_id": dataview_id}
|
|
4000
|
-
_forward_optional(document, kwargs, (
|
|
4096
|
+
_forward_optional(document, kwargs, (*fields, "dataset_id"))
|
|
4001
4097
|
with open_service(invocation) as (service, auth):
|
|
4002
4098
|
_require_exact_parent(service, invocation, dataview_id, kwargs)
|
|
4003
4099
|
# The SDK's own default name needs the parent dataset, which is known here.
|
|
4004
4100
|
target = kwargs.get("output_path")
|
|
4005
4101
|
if target is None and kwargs.get(_DATASET_ID_FIELD) is not None:
|
|
4006
|
-
|
|
4102
|
+
extension = str(kwargs.get("file_type") or "csv").strip().lower().lstrip(".")
|
|
4103
|
+
target = f"dataview_{kwargs[_DATASET_ID_FIELD]}_{dataview_id}_export.{extension}"
|
|
4007
4104
|
if target is not None:
|
|
4008
4105
|
refuse_existing_file(invocation, target)
|
|
4009
4106
|
data = service.call(_symbol(invocation), **kwargs)
|
|
@@ -4013,9 +4110,9 @@ def view_export_csv(invocation: Invocation) -> HandlerResult:
|
|
|
4013
4110
|
|
|
4014
4111
|
|
|
4015
4112
|
def _view_export_csv_embedded(
|
|
4016
|
-
invocation: Invocation, dataview_id: int, document: dict[str, Any]
|
|
4113
|
+
invocation: Invocation, dataview_id: int, document: dict[str, Any], symbol: str
|
|
4017
4114
|
) -> HandlerResult:
|
|
4018
|
-
"""
|
|
4115
|
+
"""A download for an embedded call: never writes a local file."""
|
|
4019
4116
|
if "output_path" in document:
|
|
4020
4117
|
raise CliError(
|
|
4021
4118
|
code=CODE_UNSUPPORTED_CONTRACT,
|
|
@@ -4024,9 +4121,9 @@ def _view_export_csv_embedded(
|
|
|
4024
4121
|
hint="Drop output_path -- an embedded call returns a download_url instead.",
|
|
4025
4122
|
)
|
|
4026
4123
|
kwargs: dict[str, Any] = {"dataview_id": dataview_id}
|
|
4027
|
-
_forward_optional(document, kwargs, ("timeout", "dataset_id"))
|
|
4124
|
+
_forward_optional(document, kwargs, ("file_type", "timeout", "dataset_id"))
|
|
4028
4125
|
with open_service(invocation) as (service, auth):
|
|
4029
|
-
data = service.call(
|
|
4126
|
+
data = service.call(symbol, **kwargs)
|
|
4030
4127
|
return {"download_url": data["url"]}, _meta(invocation, auth.workspace_id, None)
|
|
4031
4128
|
|
|
4032
4129
|
|
|
@@ -2134,6 +2134,16 @@ def view_transform_rename_columns(invocation: Invocation) -> HandlerResult:
|
|
|
2134
2134
|
return _dispatch_view(invocation, view_id, "rename_columns", **kwargs)
|
|
2135
2135
|
|
|
2136
2136
|
|
|
2137
|
+
def view_column_format_set(invocation: Invocation) -> HandlerResult:
|
|
2138
|
+
"""Set how columns display (date or number format; a view display setting, not a task)."""
|
|
2139
|
+
view_id = _view_id(invocation)
|
|
2140
|
+
document = invocation.load_input()
|
|
2141
|
+
_require_field(document, "formats")
|
|
2142
|
+
assert document is not None
|
|
2143
|
+
kwargs = _bind_transform_inputs(invocation, document)
|
|
2144
|
+
return _dispatch_view(invocation, view_id, "set_column_format", **kwargs)
|
|
2145
|
+
|
|
2146
|
+
|
|
2137
2147
|
def view_transform_sort(invocation: Invocation) -> HandlerResult:
|
|
2138
2148
|
"""Set the view's row order (a display setting, not a task). ``order_by`` is required.
|
|
2139
2149
|
|
|
@@ -2175,7 +2185,7 @@ def view_transform_math(invocation: Invocation) -> HandlerResult:
|
|
|
2175
2185
|
def _math_into_column(
|
|
2176
2186
|
invocation: Invocation, view_id: int, document: dict[str, Any], **dispatch: Any
|
|
2177
2187
|
) -> HandlerResult:
|
|
2178
|
-
"""The math write for a ``view transform math`` input ``document``, with its blank
|
|
2188
|
+
"""The math write for a ``view transform math`` input ``document``, with its blank note."""
|
|
2179
2189
|
kwargs = _bind_transform_inputs(invocation, document, "view.transform.math")
|
|
2180
2190
|
blanks: dict[str, int] = {}
|
|
2181
2191
|
|
|
@@ -297,7 +297,10 @@ def missing_project_error() -> CliError:
|
|
|
297
297
|
code="project_required",
|
|
298
298
|
message="No project is set for this command.",
|
|
299
299
|
exit_status=EXIT_USAGE,
|
|
300
|
-
hint=
|
|
300
|
+
hint=(
|
|
301
|
+
"This environment has no default project. Run `mammoth project list`, then "
|
|
302
|
+
"repeat the command with --project PROJECT_ID."
|
|
303
|
+
),
|
|
301
304
|
recovery_commands=["mammoth project list", "mammoth dataset find SUBSTRING"],
|
|
302
305
|
)
|
|
303
306
|
return CliError(
|
|
@@ -128,6 +128,34 @@ def _validate_output(output: str) -> None:
|
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
|
|
131
|
+
#: Error codes that mean "the --input document was wrong": the envelope then
|
|
132
|
+
#: carries the command's input contract so the next call needs no ``schema get``.
|
|
133
|
+
_INPUT_REJECTION_CODES = frozenset(
|
|
134
|
+
{
|
|
135
|
+
"unknown_input_field",
|
|
136
|
+
"invalid_input_field_type",
|
|
137
|
+
"missing_field",
|
|
138
|
+
"invalid_input",
|
|
139
|
+
"invalid_input_document",
|
|
140
|
+
"invalid_arguments",
|
|
141
|
+
"invalid_condition",
|
|
142
|
+
"invalid_condition_value",
|
|
143
|
+
"invalid_rule",
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _attach_input_contract(error: CliError, command_id: str) -> None:
|
|
149
|
+
"""Add ``details["input_contract"]`` to an input-validation error, once."""
|
|
150
|
+
if error.code not in _INPUT_REJECTION_CODES or "input_contract" in error.details:
|
|
151
|
+
return
|
|
152
|
+
from mammoth_cli.commands.schema import input_contract
|
|
153
|
+
|
|
154
|
+
contract = input_contract(command_id)
|
|
155
|
+
if contract is not None:
|
|
156
|
+
error.details["input_contract"] = contract
|
|
157
|
+
|
|
158
|
+
|
|
131
159
|
def _with_pin_checked(error: CliError, invocation: Invocation | None) -> CliError:
|
|
132
160
|
"""Make a 403's "project-limited token" hint true for this token (one lookup, 403 only)."""
|
|
133
161
|
if invocation is None:
|
|
@@ -297,6 +325,7 @@ def run(
|
|
|
297
325
|
run_log = _open_run_log(command_id, invocation)
|
|
298
326
|
|
|
299
327
|
def fail(error: CliError, cause: BaseException | None = None) -> None:
|
|
328
|
+
_attach_input_contract(error, command_id)
|
|
300
329
|
if run_log is not None:
|
|
301
330
|
error.log_ref = run_log.ref
|
|
302
331
|
run_log.finish(error.exit_status, error_code=error.code, exception=cause)
|