mammoth-cli 2.2.63__tar.gz → 2.2.65__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.63 → mammoth_cli-2.2.65}/PKG-INFO +1 -1
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/dataset.py +144 -87
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/view.py +16 -5
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/pyproject.toml +1 -1
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/dataset.yaml +1 -1
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/.gitignore +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/LICENSE +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/README.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/_lazy.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/help_summaries.json +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/schema.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/keyring_backend.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/oauth.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/opens.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/command_contract.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/explore_cards.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/folder_ids.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/input_fields.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/job_outcome.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/view_variants.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/edits-target.source.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/sdk-methods.yaml +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/openapi/openapi.json +0 -0
|
@@ -15,10 +15,12 @@ from typing import Any, Protocol
|
|
|
15
15
|
|
|
16
16
|
from mammoth_cli.errors.envelope import (
|
|
17
17
|
CODE_INVALID_ARGUMENT,
|
|
18
|
+
CODE_JOB_FAILED,
|
|
18
19
|
CODE_MISSING_ARGUMENT,
|
|
19
20
|
CODE_MISSING_FIELD,
|
|
20
21
|
CODE_SDK_SYMBOL_UNRESOLVED,
|
|
21
22
|
CODE_UNSUPPORTED_CONTRACT,
|
|
23
|
+
EXIT_API,
|
|
22
24
|
EXIT_USAGE,
|
|
23
25
|
CliError,
|
|
24
26
|
)
|
|
@@ -169,52 +171,62 @@ def _tokens_in_order(needle: str, name: str) -> bool:
|
|
|
169
171
|
return True
|
|
170
172
|
|
|
171
173
|
|
|
172
|
-
def
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
174
|
+
def _search_term(needle: str) -> str:
|
|
175
|
+
"""The longest word of ``needle``: the server searches a substring, the words are
|
|
176
|
+
matched in order here."""
|
|
177
|
+
return max(needle.split(), key=len, default="")
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _hit_record(hit: dict[str, Any]) -> dict[str, Any]:
|
|
181
|
+
"""A resource-search hit in the shape of a dataset record, for ``name_hit``/``source_of``."""
|
|
182
|
+
info = hit.get("additional_info")
|
|
183
|
+
original = info.get("ORIGINAL_FILE_PROPS") if isinstance(info, dict) else None
|
|
184
|
+
file_name = original.get("FILE_NAME") if isinstance(original, dict) else None
|
|
185
|
+
return {
|
|
186
|
+
"id": hit.get("object_id"),
|
|
187
|
+
"name": hit.get("name"),
|
|
188
|
+
"status": hit.get("status"),
|
|
189
|
+
"created_at": hit.get("created_at"),
|
|
190
|
+
"updated_at": hit.get("last_updated_at"),
|
|
191
|
+
"stats": {"row_count": hit.get("row_count"), "column_count": hit.get("column_count")},
|
|
192
|
+
"additional_info": info,
|
|
193
|
+
"sources": [
|
|
194
|
+
{
|
|
195
|
+
"type": hit.get("source_type"),
|
|
196
|
+
"details": {"file_name": file_name, "connector_key": hit.get("integration_key")},
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
}
|
|
200
|
+
|
|
179
201
|
|
|
180
|
-
|
|
181
|
-
|
|
202
|
+
def _find_by_name(
|
|
203
|
+
service: Any, needle: str, projects: list[dict[str, Any]]
|
|
204
|
+
) -> tuple[list[dict[str, Any]], bool]:
|
|
205
|
+
"""Datasets in ``projects`` whose name has every token of ``needle`` in order, and whether cut.
|
|
206
|
+
|
|
207
|
+
One workspace search returns each hit with its size, times and source, so no
|
|
208
|
+
project's dataset list is read: that route costs the server a few queries per
|
|
209
|
+
dataset, and a project of a few hundred datasets took 20+ s to list.
|
|
182
210
|
"""
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
211
|
+
names = {p.get("id"): p.get("name") for p in projects}
|
|
212
|
+
hits, cut = search_hits(service, "datasource", _search_term(needle), fields="standard")
|
|
213
|
+
matches = []
|
|
214
|
+
for hit in hits:
|
|
215
|
+
name = hit.get("name")
|
|
216
|
+
if hit.get("project_id") not in names or not isinstance(name, str):
|
|
187
217
|
continue
|
|
188
|
-
|
|
189
|
-
response = service.call(
|
|
190
|
-
"mammoth.api.datasets.DatasetsAPI.list_all",
|
|
191
|
-
project_id=project_id,
|
|
192
|
-
fields=DATASET_ROW_FIELDS,
|
|
193
|
-
)
|
|
194
|
-
except CliError as error:
|
|
195
|
-
if skipped is None:
|
|
196
|
-
raise
|
|
197
|
-
skipped.append(
|
|
198
|
-
{
|
|
199
|
-
"project_id": project_id,
|
|
200
|
-
"project_name": project.get("name"),
|
|
201
|
-
"error": error.message,
|
|
202
|
-
}
|
|
203
|
-
)
|
|
218
|
+
if not _tokens_in_order(needle, name):
|
|
204
219
|
continue
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
)
|
|
217
|
-
return matches
|
|
220
|
+
record = _hit_record(hit)
|
|
221
|
+
matches.append(
|
|
222
|
+
{
|
|
223
|
+
"project_id": hit["project_id"],
|
|
224
|
+
"project_name": names[hit["project_id"]],
|
|
225
|
+
**name_hit(record),
|
|
226
|
+
"source": source_of(record),
|
|
227
|
+
}
|
|
228
|
+
)
|
|
229
|
+
return matches, cut
|
|
218
230
|
|
|
219
231
|
|
|
220
232
|
#: Pages of resource search read for one name (100 hits each); past it the result says so.
|
|
@@ -269,15 +281,6 @@ def search_cut_note(kind: str) -> str:
|
|
|
269
281
|
)
|
|
270
282
|
|
|
271
283
|
|
|
272
|
-
def _projects_holding(
|
|
273
|
-
service: Any, needle: str, visible: list[dict[str, Any]]
|
|
274
|
-
) -> tuple[list[dict[str, Any]], bool]:
|
|
275
|
-
"""The visible projects that hold a dataset whose name contains ``needle``."""
|
|
276
|
-
rows, cut = search_hits(service, "datasource", needle)
|
|
277
|
-
holding = {r.get("project_id") for r in rows}
|
|
278
|
-
return [p for p in visible if p.get("id") in holding], cut
|
|
279
|
-
|
|
280
|
-
|
|
281
284
|
def _other_projects(visible: list[dict[str, Any]], project_id: int) -> list[dict[str, Any]]:
|
|
282
285
|
"""Every visible project except ``project_id``."""
|
|
283
286
|
return [p for p in visible if p.get("id") != project_id]
|
|
@@ -402,22 +405,20 @@ def _find_scoped(
|
|
|
402
405
|
needle: str,
|
|
403
406
|
visible: list[dict[str, Any]],
|
|
404
407
|
project_id: int,
|
|
405
|
-
skipped: list[dict[str, Any]],
|
|
406
408
|
) -> tuple[list[dict[str, Any]], list[dict[str, Any]], bool]:
|
|
407
409
|
"""``(matches, projects searched, cut)``: the project's own matches, then every other one's."""
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
searched = [home] + _other_projects(visible, project_id)
|
|
413
|
-
return _tag_scope(own + outside, project_id), searched, cut
|
|
410
|
+
searched = [named_project(service, project_id, visible), *_other_projects(visible, project_id)]
|
|
411
|
+
found, cut = _find_by_name(service, needle, searched)
|
|
412
|
+
matches = sorted(_tag_scope(found, project_id), key=lambda m: not m["in_project"])
|
|
413
|
+
return matches, searched, cut
|
|
414
414
|
|
|
415
415
|
|
|
416
416
|
def dataset_find(invocation: Invocation) -> HandlerResult:
|
|
417
417
|
"""Search dataset names for a substring across every visible project.
|
|
418
418
|
|
|
419
419
|
Read-only local composite: lists the projects the credential can see, then
|
|
420
|
-
|
|
420
|
+
reads one workspace search for the name and keeps the datasets whose name has
|
|
421
|
+
every word of the substring, in order, ignoring case. With
|
|
421
422
|
``--project`` the project's own matches come first and the matches in every
|
|
422
423
|
other visible project are returned too, each row marked ``in_project`` and
|
|
423
424
|
carrying its ``project_id`` and ``project_name``: the in-product agent runs
|
|
@@ -429,23 +430,19 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
|
|
|
429
430
|
"""
|
|
430
431
|
name_substring = _require_string_positional(invocation, "name substring")
|
|
431
432
|
needle = name_substring.lower()
|
|
432
|
-
skipped: list[dict[str, Any]] = []
|
|
433
433
|
dropped = 0
|
|
434
434
|
with open_service(invocation) as (service, auth):
|
|
435
435
|
visible = _visible_projects(service)
|
|
436
436
|
cut = False
|
|
437
437
|
if invocation.project is not None:
|
|
438
|
-
matches, projects, cut = _find_scoped(
|
|
439
|
-
service, needle, visible, invocation.project, skipped
|
|
440
|
-
)
|
|
438
|
+
matches, projects, cut = _find_scoped(service, needle, visible, invocation.project)
|
|
441
439
|
if not all_projects_requested(invocation):
|
|
442
440
|
matches, dropped = narrow_to_project(
|
|
443
441
|
matches, lambda m: str(m.get("name", "")).lower() == needle
|
|
444
442
|
)
|
|
445
443
|
else:
|
|
446
444
|
projects = visible
|
|
447
|
-
|
|
448
|
-
matches = _find_in_projects(service, needle, holding, skipped)
|
|
445
|
+
matches, cut = _find_by_name(service, needle, visible)
|
|
449
446
|
meta = {
|
|
450
447
|
"profile": invocation.profile,
|
|
451
448
|
"workspace_id": auth.workspace_id,
|
|
@@ -453,10 +450,8 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
|
|
|
453
450
|
}
|
|
454
451
|
result: dict[str, Any] = {
|
|
455
452
|
"matches": matches,
|
|
456
|
-
"projects_searched": len(projects)
|
|
453
|
+
"projects_searched": len(projects),
|
|
457
454
|
}
|
|
458
|
-
if skipped:
|
|
459
|
-
result["projects_skipped"] = skipped
|
|
460
455
|
notes = [ambiguity_note(len(matches), name_substring)]
|
|
461
456
|
if dropped:
|
|
462
457
|
result["elsewhere"] = dropped
|
|
@@ -561,10 +556,8 @@ def _dataset_name_search(
|
|
|
561
556
|
records = data.get("datasets", []) if isinstance(data, dict) else []
|
|
562
557
|
page = search_page(records, name, int(document.get("offset", 0)), document.get("limit"))
|
|
563
558
|
if page["matched"] == 0:
|
|
564
|
-
|
|
565
|
-
elsewhere =
|
|
566
|
-
service, name.lower(), _other_projects(holding, project_id)
|
|
567
|
-
)
|
|
559
|
+
found, cut = _find_by_name(service, name.lower(), _visible_projects(service))
|
|
560
|
+
elsewhere = [m for m in found if m["project_id"] != project_id]
|
|
568
561
|
if elsewhere:
|
|
569
562
|
page["in_other_projects"] = elsewhere
|
|
570
563
|
page["note"] = (
|
|
@@ -877,6 +870,7 @@ def dataset_create(invocation: Invocation) -> HandlerResult:
|
|
|
877
870
|
# A clone can land in another project (``dataset_spec.target_project_id``): the
|
|
878
871
|
# name check and the result's scope are that project's, not the active one's.
|
|
879
872
|
landing_project_id = _clone_target_project(ds_creation_type, dataset_spec) or project_id
|
|
873
|
+
_default_data_pull_file(ds_creation_type, dataset_spec)
|
|
880
874
|
kwargs: dict[str, Any] = {
|
|
881
875
|
"dataset_spec": dataset_spec,
|
|
882
876
|
"ds_creation_type": ds_creation_type,
|
|
@@ -927,29 +921,92 @@ def _require_clone_views(ds_creation_type: object, dataset_spec: object) -> None
|
|
|
927
921
|
)
|
|
928
922
|
|
|
929
923
|
|
|
924
|
+
#: The server's ``data_pull_file`` values for a cloud file import; the first is the app default.
|
|
925
|
+
_DATA_PULL_FILE_VALUES = ("Pull same file", "Pull next file based on name pattern")
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
def _default_data_pull_file(ds_creation_type: object, dataset_spec: object) -> None:
|
|
929
|
+
"""Default a cloud file import's ``data_pull_file`` to "Pull same file", as the web app does.
|
|
930
|
+
|
|
931
|
+
Raises:
|
|
932
|
+
CliError: ``invalid_argument`` listing the allowed values when it is not one of them.
|
|
933
|
+
"""
|
|
934
|
+
if ds_creation_type != "cloud" or not isinstance(dataset_spec, dict):
|
|
935
|
+
return
|
|
936
|
+
properties = dataset_spec.get("query_properties")
|
|
937
|
+
if not isinstance(properties, dict) or not properties.get("file_path"):
|
|
938
|
+
return
|
|
939
|
+
pull = properties.setdefault("data_pull_file", _DATA_PULL_FILE_VALUES[0])
|
|
940
|
+
if pull not in _DATA_PULL_FILE_VALUES:
|
|
941
|
+
raise CliError(
|
|
942
|
+
code=CODE_INVALID_ARGUMENT,
|
|
943
|
+
message="query_properties.data_pull_file must be one of "
|
|
944
|
+
f"{list(_DATA_PULL_FILE_VALUES)}, got {pull!r}.",
|
|
945
|
+
exit_status=EXIT_USAGE,
|
|
946
|
+
)
|
|
947
|
+
|
|
948
|
+
|
|
930
949
|
def _created_dataset(handle: Any, settled: Any) -> dict[str, Any]:
|
|
931
950
|
"""Shape a create job (handle + settled result) into a labeled result.
|
|
932
951
|
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
952
|
+
What each creation type settles with: weburl, clone and a single cloud file or
|
|
953
|
+
database import carry the new dataset id (``ds_id``, ``dataset_id`` or
|
|
954
|
+
``datasource_id``); a cloud import deferred to a later start carries
|
|
955
|
+
``datasource_config_id`` and reports ``scheduled``; a bulk cloud file import
|
|
956
|
+
carries ``files_found``/``created``/``failed`` and is returned as the server
|
|
957
|
+
sent it; a sketch is not a job and answers with the dataset itself. A job that
|
|
958
|
+
settled with none of these made nothing, so it raises with the server's reason
|
|
959
|
+
rather than report success.
|
|
960
|
+
|
|
961
|
+
Raises:
|
|
962
|
+
CliError: ``job_failed`` when the settled job made no dataset.
|
|
936
963
|
"""
|
|
937
|
-
|
|
964
|
+
if not isinstance(handle, dict) or "job_id" not in handle:
|
|
965
|
+
return settled if isinstance(settled, dict) else {"job_id": None}
|
|
966
|
+
job_id = handle["job_id"]
|
|
938
967
|
ds_id = None
|
|
968
|
+
config_id = None
|
|
939
969
|
if isinstance(settled, dict):
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
ds_id =
|
|
970
|
+
for source in (settled, settled.get("response")):
|
|
971
|
+
if not isinstance(source, dict):
|
|
972
|
+
continue
|
|
973
|
+
ds_id = ds_id or _first_id(source, _DATASET_ID_KEYS)
|
|
974
|
+
config_id = config_id or source.get("datasource_config_id")
|
|
944
975
|
job_id = settled.get("job_id", job_id)
|
|
976
|
+
if ds_id is None and config_id is not None:
|
|
977
|
+
return {"status": "scheduled", "datasource_config_id": config_id, "job_id": job_id}
|
|
978
|
+
if ds_id is None and isinstance(settled, dict) and "files_found" in settled:
|
|
979
|
+
return settled
|
|
945
980
|
if ds_id is None:
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
981
|
+
reason = _job_reason(settled)
|
|
982
|
+
raise CliError(
|
|
983
|
+
code=CODE_JOB_FAILED,
|
|
984
|
+
message="The dataset was not created"
|
|
985
|
+
+ (f": {reason}" if reason else f" (job {job_id} finished without a dataset id)."),
|
|
986
|
+
exit_status=EXIT_API,
|
|
987
|
+
)
|
|
988
|
+
return {"status": "ready", "dataset_id": ds_id, "job_id": job_id}
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
#: Keys a settled create job may carry its dataset id under.
|
|
992
|
+
_DATASET_ID_KEYS = ("ds_id", "dataset_id", "datasource_id")
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
def _first_id(source: dict[str, Any], keys: tuple[str, ...]) -> Any:
|
|
996
|
+
"""The first non-empty value of ``keys`` in ``source``, or None."""
|
|
997
|
+
return next((source[key] for key in keys if source.get(key)), None)
|
|
998
|
+
|
|
999
|
+
|
|
1000
|
+
def _job_reason(settled: Any) -> str | None:
|
|
1001
|
+
"""The failure reason a settled job carries (``failure_reason``, ``message``, ``error``)."""
|
|
1002
|
+
if not isinstance(settled, dict):
|
|
1003
|
+
return None
|
|
1004
|
+
nested = settled.get("response")
|
|
1005
|
+
for source in (settled, nested if isinstance(nested, dict) else {}):
|
|
1006
|
+
for key in ("failure_reason", "message", "error"):
|
|
1007
|
+
if source.get(key):
|
|
1008
|
+
return str(source[key])
|
|
1009
|
+
return None
|
|
953
1010
|
|
|
954
1011
|
|
|
955
1012
|
#: Pages (of 100) read to predict a final name; past it the answer is "a suffix may be added".
|
|
@@ -357,7 +357,9 @@ def _read_meta(
|
|
|
357
357
|
"""Envelope metadata for a data read, naming the dataset and view it read.
|
|
358
358
|
|
|
359
359
|
A number in an answer needs its source; without the names an agent that
|
|
360
|
-
silently used the wrong one of two look-alike datasets never says so.
|
|
360
|
+
silently used the wrong one of two look-alike datasets never says so. Both
|
|
361
|
+
carry their row count: a view's steps can filter rows, so a total read from
|
|
362
|
+
it is not the dataset's total, and the two counts are how an agent sees that.
|
|
361
363
|
"""
|
|
362
364
|
meta = _meta(invocation, workspace_id, project_id)
|
|
363
365
|
view = service.call(
|
|
@@ -365,17 +367,26 @@ def _read_meta(
|
|
|
365
367
|
dataset_id=dataset_id,
|
|
366
368
|
dataview_id=view_id,
|
|
367
369
|
project_id=project_id,
|
|
368
|
-
fields="
|
|
370
|
+
fields="id,name,row_count",
|
|
369
371
|
)
|
|
370
372
|
# The read just proved this dataset holds the view; keep the pair so the
|
|
371
373
|
# next command on it (a transform) needs no ``dataset_id`` of its own.
|
|
372
374
|
parents.remember(_profile_name(invocation), workspace_id, {view_id: dataset_id})
|
|
373
375
|
dataset = service.call(
|
|
374
|
-
_DATASET_GET_SYMBOL,
|
|
376
|
+
_DATASET_GET_SYMBOL,
|
|
377
|
+
dataset_id=dataset_id,
|
|
378
|
+
project_id=project_id,
|
|
379
|
+
fields="id,name,stats",
|
|
375
380
|
)
|
|
376
381
|
dataset = dataset.get("dataset", dataset) if isinstance(dataset, dict) else {}
|
|
377
|
-
|
|
378
|
-
|
|
382
|
+
view = view if isinstance(view, dict) else {}
|
|
383
|
+
stats = dataset.get("stats")
|
|
384
|
+
meta["dataset"] = {
|
|
385
|
+
"id": dataset_id,
|
|
386
|
+
"name": dataset.get("name"),
|
|
387
|
+
"row_count": stats.get("row_count") if isinstance(stats, dict) else None,
|
|
388
|
+
}
|
|
389
|
+
meta["view"] = {"id": view_id, "name": view.get("name"), "row_count": view.get("row_count")}
|
|
379
390
|
return meta
|
|
380
391
|
|
|
381
392
|
|
|
@@ -247,7 +247,7 @@ commands:
|
|
|
247
247
|
- CT-DATASET-CREATE-ERROR
|
|
248
248
|
draft_test: null
|
|
249
249
|
undo_test: null
|
|
250
|
-
known_restrictions: 'ds_creation_type is freeform and dataset_spec is arbitrary, so variants beyond the documented path are not qualified. Retained live evidence supports ds_creation_type=weburl with dataset_spec.url; the CLI command waits for the raw SDK job and returned ready for five OWID URL imports. Re-read returned dataset/view IDs and delete only IDs created by this task. A weburl dataset is a one-time copy that keeps no source details to refresh from, so automation''s run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); say so rather than scheduling a refresh for it. The result''s name is the dataset''s real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {"ds_creation_type": "clone", "dataset_spec": {"ds_name": NEW_NAME, "source_ds_id": ID, "clone_dataview_ids": [DEFAULT_VIEW_ID], "exclude_data": false}}, DEFAULT_VIEW_ID being the id in dataset''s `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {"ds_creation_type": "cloud", "dataset_spec": {"connector_key": "sftp", "connection_key": KEY, "query_properties": {"ds_name": NAME, "file_path": PATH_ON_SERVER}}}; the recipe is recipes/file-import.md.'
|
|
250
|
+
known_restrictions: 'ds_creation_type is freeform and dataset_spec is arbitrary, so variants beyond the documented path are not qualified. Retained live evidence supports ds_creation_type=weburl with dataset_spec.url; the CLI command waits for the raw SDK job and returned ready for five OWID URL imports. Re-read returned dataset/view IDs and delete only IDs created by this task. A weburl dataset is a one-time copy that keeps no source details to refresh from, so automation''s run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); say so rather than scheduling a refresh for it. The result''s name is the dataset''s real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {"ds_creation_type": "clone", "dataset_spec": {"ds_name": NEW_NAME, "source_ds_id": ID, "clone_dataview_ids": [DEFAULT_VIEW_ID], "exclude_data": false}}, DEFAULT_VIEW_ID being the id in dataset''s `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {"ds_creation_type": "cloud", "dataset_spec": {"connector_key": "sftp", "connection_key": KEY, "query_properties": {"ds_name": NAME, "file_path": PATH_ON_SERVER, "data_pull_file": "Pull same file"}}}. data_pull_file is a string and may be left out, which means "Pull same file" (what the web app does); its only other value is "Pull next file based on name pattern", which also needs folder_path and name_pattern. A pull that finds no file at the path fails the create with the server''s reason; the recipe is recipes/file-import.md.'
|
|
251
251
|
reviewed_by: primary
|
|
252
252
|
- command_id: dataset.create-from-pdf
|
|
253
253
|
command_path: dataset create-from-pdf
|
|
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.63 → mammoth_cli-2.2.65}/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
|
|
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
|
{mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/input.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
|