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.
Files changed (276) hide show
  1. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/PKG-INFO +1 -1
  2. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/dataset.py +144 -87
  4. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/view.py +16 -5
  5. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/pyproject.toml +1 -1
  6. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/dataset.yaml +1 -1
  7. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/.gitignore +0 -0
  8. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/LICENSE +0 -0
  9. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/README.md +0 -0
  10. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/__main__.py +0 -0
  11. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/app.py +0 -0
  12. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  13. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  14. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  15. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  16. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  17. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  18. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  19. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  20. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  21. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  22. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  23. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  24. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  25. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  26. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  27. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  28. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  29. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  30. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  31. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  32. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  33. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  34. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  35. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  36. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  37. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  38. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  39. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  40. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  41. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  42. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  43. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  44. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  45. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  46. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  47. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  48. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  49. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  50. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  51. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  52. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  53. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  54. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  55. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  56. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  57. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  58. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  59. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  60. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  61. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  62. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  63. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  64. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  65. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  66. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  67. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  68. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  69. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  70. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  71. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  72. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  73. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  74. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  75. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
  76. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  77. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  78. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  79. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  80. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  81. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
  82. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  83. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  84. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  85. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  86. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  87. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  88. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  89. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  90. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  91. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  92. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  93. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/__init__.py +0 -0
  94. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/_lazy.py +0 -0
  95. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/activity.py +0 -0
  96. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/addon.py +0 -0
  97. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/agent.py +0 -0
  98. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/ai.py +0 -0
  99. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/annotation.py +0 -0
  100. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/auth.py +0 -0
  101. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/automation.py +0 -0
  102. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/batch.py +0 -0
  103. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/billing.py +0 -0
  104. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/browse.py +0 -0
  105. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/calc.py +0 -0
  106. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/capability.py +0 -0
  107. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/client_app.py +0 -0
  108. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/completion.py +0 -0
  109. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/config.py +0 -0
  110. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/connector.py +0 -0
  111. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/context.py +0 -0
  112. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/dashboard.py +0 -0
  113. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/data_app.py +0 -0
  114. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/doctor.py +0 -0
  115. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/external_key.py +0 -0
  116. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/file.py +0 -0
  117. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/folder.py +0 -0
  118. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/help_summaries.json +0 -0
  119. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/job.py +0 -0
  120. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/link.py +0 -0
  121. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/notification.py +0 -0
  122. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/parameter.py +0 -0
  123. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/project.py +0 -0
  124. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/registry.py +0 -0
  125. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/report.py +0 -0
  126. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/resolve.py +0 -0
  127. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/schedule.py +0 -0
  128. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/schema.py +0 -0
  129. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/skill.py +0 -0
  130. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/snippet.py +0 -0
  131. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/support.py +0 -0
  132. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/template.py +0 -0
  133. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/trash.py +0 -0
  134. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/upgrade.py +0 -0
  135. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/user.py +0 -0
  136. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/view_ops.py +0 -0
  137. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/view_profile.py +0 -0
  138. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/webhook.py +0 -0
  139. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/workflow.py +0 -0
  140. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/commands/workspace.py +0 -0
  141. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/__init__.py +0 -0
  142. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/credentials.py +0 -0
  143. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/endpoint.py +0 -0
  144. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/keyring_backend.py +0 -0
  145. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/oauth.py +0 -0
  146. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/profiles.py +0 -0
  147. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/context/resolver.py +0 -0
  148. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/contracts/__init__.py +0 -0
  149. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/contracts/auth.py +0 -0
  150. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/embed.py +0 -0
  151. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/errors/__init__.py +0 -0
  152. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/errors/envelope.py +0 -0
  153. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/manifest/__init__.py +0 -0
  154. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/manifest/loader.py +0 -0
  155. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/messages/__init__.py +0 -0
  156. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/__init__.py +0 -0
  157. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/envelope.py +0 -0
  158. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/normalize.py +0 -0
  159. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/policy.py +0 -0
  160. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/progress.py +0 -0
  161. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/output/render.py +0 -0
  162. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/py.typed +0 -0
  163. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/__init__.py +0 -0
  164. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/confirm.py +0 -0
  165. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/dataset_health.py +0 -0
  166. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/dryrun.py +0 -0
  167. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  168. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/embedded.py +0 -0
  169. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/executor.py +0 -0
  170. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/input_loader.py +0 -0
  171. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/intent_only.py +0 -0
  172. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/invocation.py +0 -0
  173. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/locked_files.py +0 -0
  174. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/new_data.py +0 -0
  175. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/opens.py +0 -0
  176. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/options.py +0 -0
  177. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/parents.py +0 -0
  178. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/runlog.py +0 -0
  179. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/session.py +0 -0
  180. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/state.py +0 -0
  181. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/strict.py +0 -0
  182. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/updates.py +0 -0
  183. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/validate.py +0 -0
  184. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/runtime/verify.py +0 -0
  185. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/__init__.py +0 -0
  186. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/append_blank_columns.py +0 -0
  187. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/argspec.py +0 -0
  188. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/board_values.py +0 -0
  189. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/coerce.py +0 -0
  190. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/command_contract.py +0 -0
  191. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/conditional_format.py +0 -0
  192. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/conditions.py +0 -0
  193. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dashboard_filters.py +0 -0
  194. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dashboard_pages.py +0 -0
  195. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dashboard_review.py +0 -0
  196. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/data_profile.py +0 -0
  197. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/data_quality.py +0 -0
  198. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/dispatch.py +0 -0
  199. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/explore_cards.py +0 -0
  200. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/factory.py +0 -0
  201. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/folder_ids.py +0 -0
  202. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/input_fields.py +0 -0
  203. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/job_outcome.py +0 -0
  204. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/listing.py +0 -0
  205. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/local_time.py +0 -0
  206. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/mapping.py +0 -0
  207. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/openapi_types.py +0 -0
  208. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/positionals.py +0 -0
  209. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/protocol.py +0 -0
  210. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/read_queries.py +0 -0
  211. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/sdk_service.py +0 -0
  212. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/sql_check.py +0 -0
  213. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/stored_stats.py +0 -0
  214. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/testing.py +0 -0
  215. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/text_dates.py +0 -0
  216. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/type_system.py +0 -0
  217. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/view_analysis.py +0 -0
  218. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/view_variants.py +0 -0
  219. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/services/write_impact.py +0 -0
  220. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/skills/__init__.py +0 -0
  221. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/skills/installer.py +0 -0
  222. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/skills/steering.py +0 -0
  223. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/mammoth_cli/testing.py +0 -0
  224. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/activity.yaml +0 -0
  225. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/addon.yaml +0 -0
  226. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/agent.yaml +0 -0
  227. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/ai.yaml +0 -0
  228. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/annotation.yaml +0 -0
  229. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/auth.yaml +0 -0
  230. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/automation.yaml +0 -0
  231. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/batch.yaml +0 -0
  232. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/billing.yaml +0 -0
  233. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/browse.yaml +0 -0
  234. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/calc.yaml +0 -0
  235. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/capability.yaml +0 -0
  236. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/client-app.yaml +0 -0
  237. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/completion.yaml +0 -0
  238. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/config.yaml +0 -0
  239. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/connector.yaml +0 -0
  240. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/context.yaml +0 -0
  241. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/dashboard.yaml +0 -0
  242. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/data-app.yaml +0 -0
  243. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/doctor.yaml +0 -0
  244. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/external-key.yaml +0 -0
  245. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/file.yaml +0 -0
  246. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/folder.yaml +0 -0
  247. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/job.yaml +0 -0
  248. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/link.yaml +0 -0
  249. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/log.yaml +0 -0
  250. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/notification.yaml +0 -0
  251. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/parameter.yaml +0 -0
  252. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/project.yaml +0 -0
  253. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/report.yaml +0 -0
  254. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/resolve.yaml +0 -0
  255. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/schedule.yaml +0 -0
  256. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/schema.yaml +0 -0
  257. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/skill.yaml +0 -0
  258. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/snippet.yaml +0 -0
  259. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/support.yaml +0 -0
  260. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/template.yaml +0 -0
  261. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/token.yaml +0 -0
  262. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/trash.yaml +0 -0
  263. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/upgrade.yaml +0 -0
  264. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/user.yaml +0 -0
  265. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/version.yaml +0 -0
  266. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/view.yaml +0 -0
  267. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/webhook.yaml +0 -0
  268. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/workflow.yaml +0 -0
  269. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/commands/workspace.yaml +0 -0
  270. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/edits-target.source.yaml +0 -0
  271. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/openapi-operations.yaml +0 -0
  272. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/schema-v1.json +0 -0
  273. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/sdk-catalog.source.yaml +0 -0
  274. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/manifests/sdk-methods.yaml +0 -0
  275. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/spec/openapi/metadata.json +0 -0
  276. {mammoth_cli-2.2.63 → mammoth_cli-2.2.65}/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.63
3
+ Version: 2.2.65
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
@@ -6,7 +6,7 @@ not implement a second HTTP client and does not call private SDK members.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "2.2.63"
9
+ __version__ = "2.2.65"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -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 _find_in_projects(
173
- service: Any,
174
- needle: str,
175
- projects: list[dict[str, Any]],
176
- skipped: list[dict[str, Any]] | None = None,
177
- ) -> list[dict[str, Any]]:
178
- """Datasets whose name has every token of ``needle`` in order, in each of ``projects``.
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
- A project that cannot be read does not end the search: with ``skipped`` it is
181
- recorded there (id, name, why) and the rest are still searched.
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
- matches: list[dict[str, Any]] = []
184
- for project in projects:
185
- project_id = project.get("id")
186
- if project_id is None:
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
- try:
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
- datasets = response.get("datasets", []) if isinstance(response, dict) else []
206
- for dataset in datasets:
207
- name = dataset.get("name") if isinstance(dataset, dict) else None
208
- if isinstance(name, str) and _tokens_in_order(needle, name):
209
- matches.append(
210
- {
211
- "project_id": project_id,
212
- "project_name": project.get("name"),
213
- **name_hit(dataset),
214
- "source": source_of(dataset),
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
- home = named_project(service, project_id, visible)
409
- own = _find_in_projects(service, needle, [home], skipped)
410
- holding, cut = _projects_holding(service, needle, visible)
411
- outside = _find_in_projects(service, needle, _other_projects(holding, project_id), skipped)
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
- lists datasets in each and keeps a case-insensitive substring match. With
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
- holding, cut = _projects_holding(service, needle, visible)
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) - len(skipped),
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
- holding, cut = _projects_holding(service, name.lower(), _visible_projects(service))
565
- elsewhere = _find_in_projects(
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
- ``wait_if_job`` returns the completed job's inner response, where the new
934
- dataset id lives under ``ds_id``. Falls back to the raw job handle when the
935
- server returned something unrecognized, so no information is lost.
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
- job_id = handle.get("job_id") if isinstance(handle, dict) else None
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
- ds_id = settled.get("ds_id") or settled.get("dataset_id")
941
- nested = settled.get("response")
942
- if ds_id is None and isinstance(nested, dict):
943
- ds_id = nested.get("ds_id") or nested.get("dataset_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
- # No recognizable dataset id: surface the settled payload untouched
947
- # rather than claim a readiness we cannot confirm.
948
- return settled if isinstance(settled, dict) else {"job_id": job_id}
949
- result: dict[str, Any] = {"status": "ready", "dataset_id": ds_id}
950
- if job_id is not None:
951
- result["job_id"] = job_id
952
- return result
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="__min",
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, dataset_id=dataset_id, project_id=project_id, fields="id,name"
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
- meta["dataset"] = {"id": dataset_id, "name": dataset.get("name")}
378
- meta["view"] = {"id": view_id, "name": view.get("name") if isinstance(view, dict) else None}
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.2.63"
3
+ version = "2.2.65"
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"
@@ -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