mammoth-cli 2.2.12__tar.gz → 2.2.13__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.12 → mammoth_cli-2.2.13}/PKG-INFO +2 -2
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +3 -3
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/schedule.py +12 -8
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/schema.py +22 -3
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/view.py +50 -12
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/dryrun_targets.py +84 -1
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/command_contract.py +3 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/data_quality.py +7 -9
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/input_fields.py +3 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/listing.py +6 -2
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/pyproject.toml +2 -2
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/schedule.yaml +1 -1
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/view.yaml +3 -3
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/.gitignore +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/LICENSE +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/README.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/edits-target.source.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/manifests/sdk-methods.yaml +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/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.13
|
|
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.13
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -878,11 +878,11 @@ Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on
|
|
|
878
878
|
|
|
879
879
|
Run: `mammoth view update`. Exact input fields: `mammoth schema get view.update`.
|
|
880
880
|
|
|
881
|
-
Example: `mammoth view update 123 123 --input '{"
|
|
881
|
+
Example: `mammoth view update 123 123 --input '{"name": "Revenue report"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
882
882
|
|
|
883
|
-
|
|
883
|
+
Result: `ViewUpdateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
884
884
|
|
|
885
|
-
|
|
885
|
+
Status on release: untried; no live run recorded.
|
|
886
886
|
|
|
887
887
|
### `view.version.apply`
|
|
888
888
|
|
|
@@ -22,6 +22,7 @@ from mammoth_cli.errors.envelope import (
|
|
|
22
22
|
CODE_SDK_SYMBOL_UNRESOLVED,
|
|
23
23
|
EXIT_USAGE,
|
|
24
24
|
CliError,
|
|
25
|
+
not_available_error,
|
|
25
26
|
)
|
|
26
27
|
from mammoth_cli.manifest.loader import command_by_id
|
|
27
28
|
from mammoth_cli.runtime.confirm import (
|
|
@@ -154,14 +155,17 @@ def _meta(invocation: Invocation, workspace_id: int, project_id: int) -> dict[st
|
|
|
154
155
|
|
|
155
156
|
|
|
156
157
|
def schedule_list(invocation: Invocation) -> HandlerResult:
|
|
157
|
-
"""
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
158
|
+
"""Retired: the server does not implement listing a project's schedules.
|
|
159
|
+
|
|
160
|
+
``GET /workspaces/{id}/projects/{id}/schedules`` always answers ``5GENR011
|
|
161
|
+
NOT_IMPLEMENTED`` (the server raises it on purpose). The command stays so a
|
|
162
|
+
caller gets a clear answer instead of a bare backend error.
|
|
163
|
+
"""
|
|
164
|
+
raise not_available_error(
|
|
165
|
+
"schedule list",
|
|
166
|
+
web_path="the web app, which opens a schedule from the dataset or automation that owns it",
|
|
167
|
+
instead="`schedule get SCHEDULE_ID` reads one schedule by an id you already have.",
|
|
168
|
+
)
|
|
165
169
|
|
|
166
170
|
|
|
167
171
|
def schedule_get(invocation: Invocation) -> HandlerResult:
|
|
@@ -74,6 +74,7 @@ _GROUP_DISCOVERY_PURPOSES = {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
_COMMAND_DISCOVERY_PURPOSES = {
|
|
77
|
+
"view.update": "rename change name to a new name title relabel",
|
|
77
78
|
"file.upload": (
|
|
78
79
|
"upload import CSV spreadsheet XLSX source data append add rows union stack "
|
|
79
80
|
"a file into an existing dataset excel workbook tabs sheets drop in"
|
|
@@ -305,7 +306,7 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
305
306
|
"view.data.explore": (
|
|
306
307
|
"explore trend trends trending over time per day week month quarter year by date "
|
|
307
308
|
"distribution spread histogram top most common frequent values breakdown share "
|
|
308
|
-
"percentage profile"
|
|
309
|
+
"percentage profile period year quarter month date range coverage figure"
|
|
309
310
|
),
|
|
310
311
|
# "Give the West team their own copy they can change" / "duplicate this
|
|
311
312
|
# dataset as an independent copy" / "clone it without changing the
|
|
@@ -323,7 +324,10 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
323
324
|
# value -- and neither can be dropped as a data word anyway, since
|
|
324
325
|
# view.data.explore's own purpose text already uses both for its trend
|
|
325
326
|
# feature.
|
|
326
|
-
"view.data.aggregate":
|
|
327
|
+
"view.data.aggregate": (
|
|
328
|
+
"group and sum totals by month week without changing the pipeline "
|
|
329
|
+
"sum total figure answer a question, read only"
|
|
330
|
+
),
|
|
327
331
|
# Goals stated as "what is in this data" / "why do customers churn": one
|
|
328
332
|
# whole-view profile answers both, so the phrasing must reach it.
|
|
329
333
|
"view.data.profile": (
|
|
@@ -1740,6 +1744,21 @@ def _inline_call_detail(entries: list[dict[str, Any]]) -> None:
|
|
|
1740
1744
|
entry["agent_example"] = record["agent_example"]
|
|
1741
1745
|
|
|
1742
1746
|
|
|
1747
|
+
def _inline_picks(page: list[dict[str, Any]], offset: int) -> list[dict[str, Any]]:
|
|
1748
|
+
"""The entries to inline: the top ones, plus read commands ranked below a write.
|
|
1749
|
+
|
|
1750
|
+
A read that answers the question is worth its fields even when a write such as
|
|
1751
|
+
``view.transform.pivot`` outranks it; otherwise the caller needs a ``schema get``.
|
|
1752
|
+
"""
|
|
1753
|
+
head = page[: max(0, _INLINE_DETAIL_COUNT - offset)]
|
|
1754
|
+
reads = [
|
|
1755
|
+
entry
|
|
1756
|
+
for entry in page[len(head) :]
|
|
1757
|
+
if (command_by_id(entry["command_id"]) or {}).get("mutation_class") == "read"
|
|
1758
|
+
]
|
|
1759
|
+
return head + reads[:_INLINE_DETAIL_COUNT]
|
|
1760
|
+
|
|
1761
|
+
|
|
1743
1762
|
#: How to drill down from a find: a family's full command list, or every family.
|
|
1744
1763
|
_BROWSE_NEXT = (
|
|
1745
1764
|
"mammoth schema list FAMILY lists every command in a family; mammoth schema list "
|
|
@@ -1902,7 +1921,7 @@ def find_schemas(
|
|
|
1902
1921
|
)
|
|
1903
1922
|
total_matches = len(ranked_matches)
|
|
1904
1923
|
page = [match for _, match in ranked_matches[offset : offset + bounded_limit]]
|
|
1905
|
-
_inline_call_detail(page
|
|
1924
|
+
_inline_call_detail(_inline_picks(page, offset))
|
|
1906
1925
|
has_more = offset + len(page) < total_matches
|
|
1907
1926
|
continuation = (
|
|
1908
1927
|
{
|
|
@@ -899,19 +899,45 @@ def view_impact(invocation: Invocation) -> HandlerResult:
|
|
|
899
899
|
|
|
900
900
|
|
|
901
901
|
def view_update(invocation: Invocation) -> HandlerResult:
|
|
902
|
-
"""
|
|
903
|
-
|
|
902
|
+
"""Rename a view from the name input field; any other patch is refused.
|
|
903
|
+
|
|
904
|
+
The dataview patch route leaves op, path and value unconstrained, so the only
|
|
905
|
+
typed change offered is the rename (``replace`` on ``name``).
|
|
906
|
+
"""
|
|
907
|
+
project_id = require_project(invocation)
|
|
908
|
+
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
909
|
+
document = invocation.load_input() or {}
|
|
910
|
+
name = document.get("name")
|
|
911
|
+
# ``dataview_id`` is the VIEW_ID positional, bound into the document by the contract.
|
|
912
|
+
allowed = {"name", _DATASET_ID_FIELD, "dataview_id"}
|
|
913
|
+
if set(document) - allowed or not isinstance(name, str) or not name.strip():
|
|
914
|
+
raise _untyped_patch_error(invocation)
|
|
915
|
+
with open_service(invocation) as (service, auth):
|
|
916
|
+
dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
|
|
917
|
+
data = service.call(
|
|
918
|
+
_symbol(invocation),
|
|
919
|
+
dataset_id=dataset_id,
|
|
920
|
+
dataview_id=dataview_id,
|
|
921
|
+
patch_data=[{"op": "replace", "path": "name", "value": name.strip()}],
|
|
922
|
+
project_id=project_id,
|
|
923
|
+
)
|
|
924
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
def _untyped_patch_error(invocation: Invocation) -> CliError:
|
|
928
|
+
"""The refusal for a view patch that is not the typed rename."""
|
|
929
|
+
return CliError(
|
|
904
930
|
code=CODE_UNSUPPORTED_CONTRACT,
|
|
905
931
|
message="Raw dataview patch operations are not available through the CLI.",
|
|
906
932
|
exit_status=EXIT_USAGE,
|
|
907
933
|
hint=(
|
|
908
|
-
"The OpenAPI operation leaves op, path, and value unconstrained. "
|
|
909
|
-
|
|
934
|
+
"The OpenAPI operation leaves op, path, and value unconstrained. The typed "
|
|
935
|
+
'change is the rename: view update VIEW_ID --input \'{"name": "New name"}\'.'
|
|
910
936
|
),
|
|
911
937
|
details={
|
|
912
938
|
"command_id": invocation.command_id,
|
|
913
939
|
"blocker": "B09 DATAVIEW_INPUT_UNTYPED",
|
|
914
|
-
"typed_alternatives": [],
|
|
940
|
+
"typed_alternatives": ['view update VIEW_ID --input \'{"name": "New name"}\''],
|
|
915
941
|
},
|
|
916
942
|
recovery_commands=[
|
|
917
943
|
"mammoth schema find view",
|
|
@@ -1288,17 +1314,19 @@ def _relabel_and_check(
|
|
|
1288
1314
|
) -> Any:
|
|
1289
1315
|
"""Relabel a data page to display names and add ``column_warnings`` and ``duplicates``.
|
|
1290
1316
|
|
|
1317
|
+
Only read-only data reads call this, so a dates-as-text finding carries no convert fix.
|
|
1318
|
+
|
|
1291
1319
|
The metadata read happens only when the page has rows and the caller has
|
|
1292
1320
|
not read it already (one read serves both the names and the types).
|
|
1293
1321
|
"""
|
|
1294
1322
|
rows = data.get(_ROWS_KEY) if isinstance(data, dict) else None
|
|
1295
1323
|
if not isinstance(rows, list) or not rows:
|
|
1296
1324
|
data = _relabel_columns(service, dataset_id, view_id, project_id, data, mapping)
|
|
1297
|
-
return _with_column_warnings(data, types or {}, view_id, dataset_id)
|
|
1325
|
+
return _with_column_warnings(data, types or {}, view_id, dataset_id, read_only=True)
|
|
1298
1326
|
if mapping is None or types is None:
|
|
1299
1327
|
mapping, types = _column_profile(service, dataset_id, view_id, project_id)
|
|
1300
1328
|
data = _relabel_columns(service, dataset_id, view_id, project_id, data, mapping)
|
|
1301
|
-
data = _with_column_warnings(data, types, view_id, dataset_id)
|
|
1329
|
+
data = _with_column_warnings(data, types, view_id, dataset_id, read_only=True)
|
|
1302
1330
|
return _with_duplicates_fact(data, view_id, dataset_id, whole_view)
|
|
1303
1331
|
|
|
1304
1332
|
|
|
@@ -1322,7 +1350,11 @@ COLUMN_CHECK_ISSUES = (
|
|
|
1322
1350
|
|
|
1323
1351
|
|
|
1324
1352
|
def _with_column_warnings(
|
|
1325
|
-
data: Any,
|
|
1353
|
+
data: Any,
|
|
1354
|
+
types: dict[str, str],
|
|
1355
|
+
view_id: int,
|
|
1356
|
+
dataset_id: int | None = None,
|
|
1357
|
+
read_only: bool = False,
|
|
1326
1358
|
) -> Any:
|
|
1327
1359
|
"""Add ``column_checks`` (always) and ``column_warnings`` (when found).
|
|
1328
1360
|
|
|
@@ -1332,13 +1364,19 @@ def _with_column_warnings(
|
|
|
1332
1364
|
"""
|
|
1333
1365
|
if not isinstance(data, dict) or not isinstance(data.get(_ROWS_KEY, []), list):
|
|
1334
1366
|
return data
|
|
1335
|
-
checks, warnings = _check_columns(
|
|
1367
|
+
checks, warnings = _check_columns(
|
|
1368
|
+
data.get(_ROWS_KEY) or [], types, view_id, dataset_id, read_only
|
|
1369
|
+
)
|
|
1336
1370
|
out = {**data, "column_checks": checks}
|
|
1337
1371
|
return {**out, "column_warnings": warnings} if warnings else out
|
|
1338
1372
|
|
|
1339
1373
|
|
|
1340
1374
|
def _check_columns(
|
|
1341
|
-
rows: list[Any],
|
|
1375
|
+
rows: list[Any],
|
|
1376
|
+
types: dict[str, str],
|
|
1377
|
+
view_id: int,
|
|
1378
|
+
dataset_id: int | None,
|
|
1379
|
+
read_only: bool = False,
|
|
1342
1380
|
) -> tuple[dict[str, Any], list[dict[str, Any]]]:
|
|
1343
1381
|
"""Run ``column_warnings`` and describe what was checked (never raises)."""
|
|
1344
1382
|
checks: dict[str, Any] = {
|
|
@@ -1350,7 +1388,7 @@ def _check_columns(
|
|
|
1350
1388
|
warnings: list[dict[str, Any]] = []
|
|
1351
1389
|
if rows and types:
|
|
1352
1390
|
try:
|
|
1353
|
-
warnings = column_warnings(rows, types, view_id, dataset_id)
|
|
1391
|
+
warnings = column_warnings(rows, types, view_id, dataset_id, read_only)
|
|
1354
1392
|
except Exception as exc: # noqa: BLE001 -- a presentation aid must not fail the read
|
|
1355
1393
|
checks["checked"] = []
|
|
1356
1394
|
checks["error"] = f"{type(exc).__name__}: {exc}"
|
|
@@ -1728,7 +1766,7 @@ def _run_aggregate_for_compare(
|
|
|
1728
1766
|
) -> tuple[list[dict[str, Any]], dict[str, Any]]:
|
|
1729
1767
|
"""Run ``view data aggregate``'s own handler against one view, for compare."""
|
|
1730
1768
|
sub_invocation = dataclasses.replace(
|
|
1731
|
-
invocation, command_id="view.data.aggregate", extra_args=[str(view_id)]
|
|
1769
|
+
invocation, command_id="view.data.aggregate", extra_args=[str(view_id)], positionals={}
|
|
1732
1770
|
)
|
|
1733
1771
|
data, meta = view_data_aggregate(sub_invocation)
|
|
1734
1772
|
rows = data.get(_ROWS_KEY, [])
|
|
@@ -192,6 +192,17 @@ SUBS: dict[str, tuple[Sub, ...]] = {
|
|
|
192
192
|
"view.draft.discard": (
|
|
193
193
|
Sub("draft", "view_id", "view", "view_id", name_fmt="{parent} › unsaved draft changes"),
|
|
194
194
|
),
|
|
195
|
+
"agent.action.delete": (
|
|
196
|
+
Sub(
|
|
197
|
+
"agent action",
|
|
198
|
+
"action_id",
|
|
199
|
+
source="agent.action.list",
|
|
200
|
+
container="actions",
|
|
201
|
+
forward=("session_id",),
|
|
202
|
+
label_paths=("name", "kind"),
|
|
203
|
+
name_fmt="what agent action {action_id} made: {label}",
|
|
204
|
+
),
|
|
205
|
+
),
|
|
195
206
|
"agent.session.delete": (
|
|
196
207
|
Sub(
|
|
197
208
|
"agent session",
|
|
@@ -251,6 +262,34 @@ SUBS: dict[str, tuple[Sub, ...]] = {
|
|
|
251
262
|
label_paths=("title", "name", "label"),
|
|
252
263
|
),
|
|
253
264
|
),
|
|
265
|
+
"dashboard.template.thumbnail.clear": (
|
|
266
|
+
Sub(
|
|
267
|
+
"dashboard template picture",
|
|
268
|
+
"template_id",
|
|
269
|
+
source="dashboard.template.get",
|
|
270
|
+
label_paths=("title", "name", "label"),
|
|
271
|
+
name_fmt="picture of dashboard template {label}",
|
|
272
|
+
),
|
|
273
|
+
),
|
|
274
|
+
"support.template.discard": (
|
|
275
|
+
Sub(
|
|
276
|
+
"curated template",
|
|
277
|
+
"slug",
|
|
278
|
+
source="support.template.list",
|
|
279
|
+
container="templates",
|
|
280
|
+
id_field="slug",
|
|
281
|
+
label_paths=("title", "slug"),
|
|
282
|
+
),
|
|
283
|
+
),
|
|
284
|
+
"workflow.cleanup": (
|
|
285
|
+
Sub(
|
|
286
|
+
"ghost workflows",
|
|
287
|
+
"project_id",
|
|
288
|
+
"project",
|
|
289
|
+
"project_id",
|
|
290
|
+
name_fmt="ghost (orphaned skeleton) workflows in {parent}",
|
|
291
|
+
),
|
|
292
|
+
),
|
|
254
293
|
"template.delete": (
|
|
255
294
|
Sub("template", "template_id", source="template.get", label_paths=("name", "title")),
|
|
256
295
|
),
|
|
@@ -328,6 +367,7 @@ COMMAND_TARGETS: dict[str, tuple[str, str]] = {
|
|
|
328
367
|
"dataset.delete": ("dataset", "dataset_id"),
|
|
329
368
|
"dataset.bulk-delete": ("dataset", "dataset_ids"),
|
|
330
369
|
"dataset.file-settings.undo": ("dataset", "dataset_id"),
|
|
370
|
+
"dataset.broken-rows.resolve": ("dataset", "dataset_id"),
|
|
331
371
|
"view.delete": ("view", "view_id"),
|
|
332
372
|
"view.bulk-delete": ("view", "dataview_ids"),
|
|
333
373
|
"batch.delete": ("batch", "batch_id"),
|
|
@@ -352,6 +392,10 @@ COMMAND_TARGETS: dict[str, tuple[str, str]] = {
|
|
|
352
392
|
}
|
|
353
393
|
|
|
354
394
|
|
|
395
|
+
#: Commands that make a new resource and change no existing one: nothing to name.
|
|
396
|
+
CREATES_ONLY: frozenset[str] = frozenset({"dataset.create", "dataset.create-from-pdf"})
|
|
397
|
+
|
|
398
|
+
|
|
355
399
|
def unresolvable_error(command_id: str, reason: str) -> CliError:
|
|
356
400
|
"""The fail-loud error for a command whose targets cannot be named."""
|
|
357
401
|
return CliError(
|
|
@@ -496,6 +540,16 @@ def _unresolved_name(kind: str, target_id: object, symbol: str, key: str) -> Cli
|
|
|
496
540
|
)
|
|
497
541
|
|
|
498
542
|
|
|
543
|
+
def _container_items(listed: Any, container: str) -> list[Any]:
|
|
544
|
+
"""The items of a list read: a bare list, a mapping, or a typed SDK model."""
|
|
545
|
+
if isinstance(listed, list):
|
|
546
|
+
return listed
|
|
547
|
+
held = (
|
|
548
|
+
listed.get(container) if isinstance(listed, Mapping) else getattr(listed, container, None)
|
|
549
|
+
)
|
|
550
|
+
return held if isinstance(held, list) else []
|
|
551
|
+
|
|
552
|
+
|
|
499
553
|
def _sub_record(
|
|
500
554
|
service: MammothService,
|
|
501
555
|
sub: Sub,
|
|
@@ -516,7 +570,7 @@ def _sub_record(
|
|
|
516
570
|
if symbol not in lists:
|
|
517
571
|
lists[symbol] = service.call(symbol, **kwargs)
|
|
518
572
|
listed = lists[symbol]
|
|
519
|
-
items =
|
|
573
|
+
items = _container_items(listed, sub.container)
|
|
520
574
|
found = next((i for i in items if str(_path(i, sub.id_field)) == str(target)), None)
|
|
521
575
|
if found is None:
|
|
522
576
|
raise _unresolved_name(sub.kind, target, symbol, sub.id_field)
|
|
@@ -568,6 +622,8 @@ def _target_spec(command_id: str, would_call: Mapping[str, Any]) -> tuple[str, s
|
|
|
568
622
|
"""
|
|
569
623
|
if command_id in COMMAND_TARGETS:
|
|
570
624
|
return COMMAND_TARGETS[command_id]
|
|
625
|
+
if command_id in CREATES_ONLY:
|
|
626
|
+
return None
|
|
571
627
|
record = command_by_id(command_id) or {}
|
|
572
628
|
if record.get("mutation_class") == "destructive":
|
|
573
629
|
raise unresolvable_error(command_id, "no read command names this command's targets")
|
|
@@ -589,6 +645,31 @@ def _remove_batch_invites(
|
|
|
589
645
|
return _sub_targets(service, command_id, _INVITE_SUB, {"invite_ids": invite_ids})
|
|
590
646
|
|
|
591
647
|
|
|
648
|
+
def _patched_dataset_ids(patch_data: Any) -> list[int]:
|
|
649
|
+
"""The dataset ids a bulk patch renames: the keys of each operation's ``value``."""
|
|
650
|
+
operations = patch_data if isinstance(patch_data, list) else [patch_data]
|
|
651
|
+
found: list[int] = []
|
|
652
|
+
for operation in operations:
|
|
653
|
+
value = operation.get("value") if isinstance(operation, Mapping) else None
|
|
654
|
+
if isinstance(value, Mapping):
|
|
655
|
+
found.extend(int(key) for key in value if str(key).isdigit())
|
|
656
|
+
return list(dict.fromkeys(found))
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
def _bulk_update_targets(
|
|
660
|
+
service: MammothService, command_id: str, arguments: Mapping[str, Any]
|
|
661
|
+
) -> list[dict[str, Any]]:
|
|
662
|
+
"""Name the datasets a ``dataset bulk-update`` patch changes, from its own ``patch_data``."""
|
|
663
|
+
ids = _patched_dataset_ids(arguments.get("patch_data"))
|
|
664
|
+
if not ids:
|
|
665
|
+
raise unresolvable_error(
|
|
666
|
+
command_id,
|
|
667
|
+
"'patch_data' names no dataset; pass "
|
|
668
|
+
'{"op": "replace", "path": "name", "value": {"<dataset_id>": "<new name>"}}',
|
|
669
|
+
)
|
|
670
|
+
return _read_names(service, "dataset", ids, arguments)
|
|
671
|
+
|
|
672
|
+
|
|
592
673
|
def resolve_targets(
|
|
593
674
|
service: MammothService, command_id: str, would_call: Mapping[str, Any]
|
|
594
675
|
) -> list[dict[str, Any]]:
|
|
@@ -611,6 +692,8 @@ def resolve_targets(
|
|
|
611
692
|
arguments = would_call.get("arguments") or {}
|
|
612
693
|
if command_id == "user.avatar.delete":
|
|
613
694
|
return _avatar_target(service)
|
|
695
|
+
if command_id == "dataset.bulk-update":
|
|
696
|
+
return _bulk_update_targets(service, command_id, arguments)
|
|
614
697
|
if command_id in SUBS:
|
|
615
698
|
scope = {k: v for k, v in would_call.items() if k in ("view_id", "dataset_id")}
|
|
616
699
|
merged = {**scope, **arguments}
|
|
@@ -697,6 +697,9 @@ _S7_ADDITIONAL_INPUT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
|
|
|
697
697
|
FieldSpec("activities", required=False, annotation=list[Any] | None, default=None),
|
|
698
698
|
FieldSpec("user_ids", required=False, annotation=list[Any] | None, default=None),
|
|
699
699
|
),
|
|
700
|
+
# The typed rename: the handler builds the one ``replace`` on ``name``; the
|
|
701
|
+
# SDK's free-form ``patch_data`` is handler-owned and never offered.
|
|
702
|
+
"view.update": (FieldSpec("name", required=True, annotation=str),),
|
|
700
703
|
"user.preference.update": (
|
|
701
704
|
# PreferencesPatchRequest: replace ops on dotted paths rooted at
|
|
702
705
|
# GLOBAL or WORKSPACE_PREFERENCES.
|
|
@@ -354,6 +354,7 @@ def column_warnings(
|
|
|
354
354
|
column_types: Mapping[str, str],
|
|
355
355
|
view_id: int | None = None,
|
|
356
356
|
dataset_id: int | None = None,
|
|
357
|
+
read_only: bool = False,
|
|
357
358
|
) -> list[dict[str, Any]]:
|
|
358
359
|
"""Return warnings for text columns that hold numbers or dates, and for blanks.
|
|
359
360
|
|
|
@@ -363,6 +364,8 @@ def column_warnings(
|
|
|
363
364
|
view_id: The view the rows came from, used in the suggested command.
|
|
364
365
|
dataset_id: The view's dataset, used for the duplicate-rows fix
|
|
365
366
|
command (a mutation, so it needs the exact parent, not discovery).
|
|
367
|
+
read_only: The rows came from a read-only data read; a ``dates_stored_as_text``
|
|
368
|
+
finding then carries no ``fix``, since a read answers from the text as it is.
|
|
366
369
|
|
|
367
370
|
Returns:
|
|
368
371
|
One record per finding: ``column``, ``issue``
|
|
@@ -414,15 +417,10 @@ def column_warnings(
|
|
|
414
417
|
# there would be untrue.
|
|
415
418
|
detail += " (the conversion makes them empty)"
|
|
416
419
|
detail += "."
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
"detail": detail,
|
|
422
|
-
"fix": _convert_hint(view_id, column, to),
|
|
423
|
-
"rows_checked": checked,
|
|
424
|
-
}
|
|
425
|
-
)
|
|
420
|
+
finding: dict[str, Any] = {"column": column, "issue": issue, "detail": detail}
|
|
421
|
+
if not (read_only and kind == "dates"):
|
|
422
|
+
finding["fix"] = _convert_hint(view_id, column, to)
|
|
423
|
+
warnings.append({**finding, "rows_checked": checked})
|
|
426
424
|
break
|
|
427
425
|
variant_warning = _variant_spellings_warning(column, texts, view_id, checked)
|
|
428
426
|
if variant_warning is not None:
|
|
@@ -46,6 +46,8 @@ _HANDLER_OWNED_FIELDS: dict[str, frozenset[str]] = {
|
|
|
46
46
|
# ``sort`` is the backend's internal result-column pairs; the CLI takes
|
|
47
47
|
# ``order_by`` (result labels) and maps it, so a raw ``sort`` would be dropped.
|
|
48
48
|
"view.data.aggregate": frozenset({"sort"}),
|
|
49
|
+
# ``view update`` offers only the typed rename; the handler builds the patch.
|
|
50
|
+
"view.update": frozenset({"patch_data"}),
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
# CLI-only commands whose complete request is carried by positionals/context.
|
|
@@ -76,6 +78,7 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
|
|
|
76
78
|
},
|
|
77
79
|
# View display settings: real column names read better than sample keys.
|
|
78
80
|
"view.transform.rename-columns": {"renames": {"cust_id": "Customer ID"}},
|
|
81
|
+
"view.update": {"name": "Revenue report"},
|
|
79
82
|
"view.transform.sort": {"order_by": [["Revenue", "DESC"]]},
|
|
80
83
|
# The backend requires integer resource ids ("resource_ids must be
|
|
81
84
|
# comma-separated integers"); the SDK annotation is a plain list[str].
|
|
@@ -352,14 +352,18 @@ def compact_view_list(
|
|
|
352
352
|
Sizes and columns come from the records already fetched. Each kept view then
|
|
353
353
|
gets ``sample_values`` from the backend's stored column stats via ``read_stats``
|
|
354
354
|
(one stored-stats read per kept view, run concurrently; no query runs).
|
|
355
|
+
A list of one dataset's views names every column; several datasets cap it at a few.
|
|
355
356
|
Returns ``{"dataviews", "shown"}`` plus
|
|
356
357
|
``first_dropped_dataset`` / ``views_omitted`` when something was cut, for the
|
|
357
358
|
caller to turn into a way to the next page.
|
|
358
359
|
"""
|
|
359
360
|
groups: dict[Any, list[tuple[dict[str, Any], dict[str, Any]]]] = {}
|
|
360
|
-
|
|
361
|
+
by_dataset = _group_by_dataset(views)
|
|
362
|
+
# One dataset's views are listed to be read from: the whole column list saves a `view get`.
|
|
363
|
+
every_column = all_columns or len(by_dataset) == 1
|
|
364
|
+
for ds_id, group in by_dataset.items():
|
|
361
365
|
groups[ds_id] = [
|
|
362
|
-
(v, view_summary(v, datasets.get(ds_id), ds_id,
|
|
366
|
+
(v, view_summary(v, datasets.get(ds_id), ds_id, every_column)) for v in group
|
|
363
367
|
]
|
|
364
368
|
chosen, dropped_dataset, omitted = _choose_views(groups)
|
|
365
369
|
with ThreadPoolExecutor(max_workers=_STATS_WORKERS) as pool:
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mammoth-cli"
|
|
3
|
-
version = "2.2.
|
|
3
|
+
version = "2.2.13"
|
|
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.13,<0.9)",
|
|
11
11
|
"typer (>=0.27,<0.28)",
|
|
12
12
|
"rich (>=15,<16)",
|
|
13
13
|
"platformdirs (>=4.10,<5)",
|
|
@@ -158,7 +158,7 @@ commands:
|
|
|
158
158
|
- CT-SCHEDULE-LIST-ERROR
|
|
159
159
|
draft_test: null
|
|
160
160
|
undo_test: null
|
|
161
|
-
known_restrictions: 'B04 SERVER_VARIANCE: unconditionally unimplemented on every backend
|
|
161
|
+
known_restrictions: 'Retired: the command answers not_available and names the web app. B04 SERVER_VARIANCE: unconditionally unimplemented on every backend
|
|
162
162
|
release tested, not intermittent -- GET .../schedules always returns HTTP 400 with error
|
|
163
163
|
code 5GENR011 NOT_IMPLEMENTED (mvc-service apiv2/apiv2/schedules/controller.py
|
|
164
164
|
ScheduleController.list_schedules always raises ClientError(not_implemented_error); its
|
|
@@ -5834,7 +5834,7 @@ commands:
|
|
|
5834
5834
|
required_fixture_guard: null
|
|
5835
5835
|
secret_fields: []
|
|
5836
5836
|
human_example: mammoth view update VIEW_ID --help
|
|
5837
|
-
agent_example: 'mammoth view update 123 123 --input ''{"
|
|
5837
|
+
agent_example: 'mammoth view update 123 123 --input ''{"name": "Revenue report"}'''
|
|
5838
5838
|
unit_tests:
|
|
5839
5839
|
- UT-VIEW-UPDATE
|
|
5840
5840
|
contract_tests:
|
|
@@ -5843,8 +5843,8 @@ commands:
|
|
|
5843
5843
|
- CT-VIEW-UPDATE-ERROR
|
|
5844
5844
|
draft_test: null
|
|
5845
5845
|
undo_test: null
|
|
5846
|
-
known_restrictions: '
|
|
5847
|
-
|
|
5846
|
+
known_restrictions: 'Only the typed rename is offered (--input {"name": ...}); any other patch is refused
|
|
5847
|
+
with B09 DATAVIEW_INPUT_UNTYPED because patch_data is an arbitrary dictionary.'
|
|
5848
5848
|
reviewed_by: primary
|
|
5849
5849
|
- command_id: view.version.apply
|
|
5850
5850
|
command_path: view version apply
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mammoth_cli-2.2.12 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|