hap-cli 0.9.0__tar.gz → 0.9.2__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.
- {hap_cli-0.9.0 → hap_cli-0.9.2}/PKG-INFO +2 -1
- {hap_cli-0.9.0/hap_cli → hap_cli-0.9.2}/README.md +1 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/smoke.py +208 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2/hap_cli}/README.md +1 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/README_CN.md +1 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/__init__.py +1 -1
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/attachment_cmd.py +38 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/chat_cmd.py +1 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/worksheet_cmd.py +1 -1
- hap_cli-0.9.2/hap_cli/core/attachment.py +388 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/chat.py +103 -13
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/ops.py +119 -3
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/reader.py +137 -1
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/record.py +6 -2
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/record_form_checks.py +30 -4
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/worksheet.py +194 -42
- hap_cli-0.9.2/hap_cli/tests/test_attachment_share.py +434 -0
- hap_cli-0.9.2/hap_cli/tests/test_chat_messages_cli.py +28 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_core.py +278 -1
- hap_cli-0.9.2/hap_cli/tests/test_editor_inline_subtable.py +239 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fields_mdpublic_parity.py +48 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_full_e2e.py +6 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g6_advanced_fields.py +5 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_form_checks.py +126 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli.egg-info/PKG-INFO +2 -1
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli.egg-info/SOURCES.txt +2 -0
- hap_cli-0.9.0/hap_cli/core/attachment.py +0 -176
- hap_cli-0.9.0/hap_cli/tests/test_attachment_share.py +0 -148
- {hap_cli-0.9.0 → hap_cli-0.9.2}/MANIFEST.in +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/__main__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/config.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/fixtures/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/fixtures/feedback_scenario.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/harness.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/app_live_tests/state.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/__main__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/_entry.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/app_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/app_creator_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/app_editor_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/auth_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/calendar_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/chart_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/chatbot_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/config_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/contact_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/department_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/group_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/guide_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/icon_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/instance_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/node_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/optionset_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/page_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/post_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/record_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/region_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/role_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/update_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/upload_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/v3_registry.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/commands/workflow_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/context.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/action_spec_adapter.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/_hapmeta/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/_hapmeta/worksheet_templates.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/charts.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/cleanup.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/compiler.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/config.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/design/design.schema.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/errors.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/examples/minimal.design.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/executor.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/fields.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/hap.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/merge.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/recording/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/recording/console.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/recording/jsonl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/recording/mirror.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/recording/report.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/schema.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/INSTRUCTIONS.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/executor.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/resources/attachments.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/resources/sample.docx +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/resources/sample.pdf +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/resources/sample_images.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/seed/template.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/selftest.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/smoke.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/steps.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/store.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/validate.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/app_creator/workflow_dsl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/auth.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/calendar_mod.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/chart.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/chatbot.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/cli_access.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/condition_dsl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/contact.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/control_type_codes.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/department.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/apply.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/componentlower.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/editspec/component.schema.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/editspec/custom-action.schema.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/editspec/envelope.schema.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/editspec/field.schema.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/editspec.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/errors.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/fieldlower.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/jsonschema_mini.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/models.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/editor/planner.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/field_normalizer.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/field_spec_adapter.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/filter_translator.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/filter_v3.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/flow_node.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/global_meta.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/group.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/guide.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/icon_index.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/instance.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/layout_check.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/logger.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/optionset.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/page.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/post.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/record_defaults.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/record_lookups.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/record_rules.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/relation_scope.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/response_crypto.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/role.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/role_perm_builder.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/rule_spec_adapter.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/session.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/token_crypto.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/update.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/upload.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/v3/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/v3/dispatcher.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/v3/render.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/v3/schema.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/view_spec_adapter.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/workflow.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/workflow_node_dsl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/worksheet_form.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/worksheet_reference.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/core/worksheet_templates.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/approval.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/chart.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/messages.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/overview.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/post.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/record.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/setup.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/skills.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/workflow.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/en/worksheet.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/index.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/approval.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/chart.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/messages.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/overview.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/post.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/record.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/setup.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/skills.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/workflow.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/guide/zh-Hans/worksheet.md +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/i18n.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/locale/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/locale/messages.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/locale/messages.schema.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/conftest.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_action_mdpublic_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_advanced_setting_guard.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_app_creator.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_app_editor.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_app_export_usage.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_app_light_color.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_app_section_name.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_approval_submit_fill_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_approval_wire.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_atomic_write.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_auth_prerelease.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_batch_add_atomic.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_bug_036430.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_bug_036750.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_calendar_date_range.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_calendar_discussion_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_chart.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_chart_filter_merge.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_chat_attachment_send.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_chat_recall_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_chat_send_socket.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_cli_access.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_coded_responses.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_condition_dsl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_condition_dsl_entries.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_condition_dsl_readback.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_config_cmd.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_content_language.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_control_lookup_guard.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_destructive_confirm_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_dsl_existing_node_refs.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_dsl_multi_record_guard.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_engine_core_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_arg_consistency.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_bidirectional.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_discussion_mentions.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_entry_module.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_field_record_ref.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_http_error_body.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_json_anywhere.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_json_file_arg.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_layout_check.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_node_get_detail.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_node_summary.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_post_cursor.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_publish_reasons.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_replicate_workflow.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_save_fields_shape.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_subgroups.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_subtable_read.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_worksheet_references.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_worksheet_visibility.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_fb_worksheet_workflows.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g1_chart_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g1_record_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g1_upload_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g1_worksheet_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g2_coverage_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g3_workflow_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g4_approval_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g5_low_frequency_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g6_fields_roundtrip.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g7_misc_gaps.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g7b_permanent_delete.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g8_filter_operator.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g8b_pivot_operators.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g8c_empty_filter_and_help_truth.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_g9_appid_resolve.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_global_meta.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_guide.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_guide_sections.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_i18n.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_inner_flow_batch_add.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_instance_envelope.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_instance_history_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_approval.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_approval_actions.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_calendar.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_destructive.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_misc.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_post.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_social.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_v3.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_workflow.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_integration_worksheet_extra.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_jsonschema_mini_copy.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_member_relation_array_wrap.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_multi_profile.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_no_workflow_unsupported.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_noninteractive_confirm.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_org_approval_v3_semantic_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_org_id_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_org_id_docs.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_page_filters_group_read.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_page_filters_group_update.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_page_save_page_id.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_parameter_conventions.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_post_scope_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_batch_v3_semantic_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_business_rules.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_defaults.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_doc_id_hidden.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_field_alias.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_run_action.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_v3_semantic_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_record_write_fixes.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_relation_scope.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_rmw_mdpublic_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_role_app_scope.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_rule_filters_and_field_warning.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_save_action_silent_drop.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_save_rule_spec.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_select_add_option.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_select_rejects_relation_value.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_semantic_types_registry.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_subtable_mdpublic_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_update.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_update_mode.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_upload_allow_down.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_upload_host_resolution.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_upload_mdpublic_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_bool_flags.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_dispatcher.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_response_format_json.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_session.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_view_mdpublic_parity.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_config_keys.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_inner_scope.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_json_file_arg.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_node_delete_missing.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_save_action_dsl_fields.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_structure_listing.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_trigger_outcome.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wf_trigger_preserve.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_wo4_result_handling.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_code_node.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_condition_field_types.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_condition_slots.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_delete_cascade.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_envelope_errors.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_lifecycle_wire.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_list_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_node_wire.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_publish_inner.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_read_write_keys.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_workflow_v3_semantic_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_worksheet_create_section.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_worksheet_filter_read.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_worksheet_switch.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/tests/test_worksheet_v3_semantic_cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/utils/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/utils/atomic_write.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/utils/confirm.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/utils/formatting.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/utils/options.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli/utils/parameter_mapping.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli.egg-info/dependency_links.txt +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli.egg-info/entry_points.txt +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli.egg-info/requires.txt +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/hap_cli.egg-info/top_level.txt +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/__main__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/_wftest.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/charts.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/cleanup.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/compiler.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/config.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/errors.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/executor.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/fields.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/hap.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/recording/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/recording/console.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/recording/jsonl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/recording/mirror.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/recording/report.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/schema.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/seed/__init__.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/seed/cli.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/seed/executor.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/seed/template.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/selftest.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/smoke.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/step.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/steps.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/store.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/live_tests/workflow_dsl.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/setup.cfg +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/setup.py +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/INDEX.json +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/create_optionset.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/create_role.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/delete_optionset.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/delete_record.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/delete_role.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_app_info.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_details.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_list.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_logs.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_relations.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_regions.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_role_details.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/get_role_list.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/knowledge_search.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
- {hap_cli-0.9.0 → hap_cli-0.9.2}/sources/v3-api-schema/update_optionset.yaml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hap-cli
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Summary: CLI harness for Mingdao HAP - Enterprise no-code platform
|
|
5
5
|
Author: hap-cli
|
|
6
6
|
License: Apache-2.0
|
|
@@ -312,6 +312,7 @@ discover every subcommand.
|
|
|
312
312
|
|
|
313
313
|
| Command | Description |
|
|
314
314
|
|---|---|
|
|
315
|
+
| `attachment download FILE_ID --worksheet-id WS --row-id ROW --control-id FIELD [-o PATH]` | Download a worksheet-record attachment with the same record and field permission checks as the web app; existing local files are never overwritten |
|
|
315
316
|
| `attachment share [ADDRESS]` | Create a link to a stored file that you can pass on (`--hours`, default 48; `--file-id` to share by attachment id, `--short` for a landing page instead of the storage address) |
|
|
316
317
|
|
|
317
318
|
> ADDRESS is the file's link — one that has already stopped working is fine, paste it as-is — or just the path part of it. The file itself does not expire, only the link does, so a dead link can always be revived.
|
|
@@ -283,6 +283,7 @@ discover every subcommand.
|
|
|
283
283
|
|
|
284
284
|
| Command | Description |
|
|
285
285
|
|---|---|
|
|
286
|
+
| `attachment download FILE_ID --worksheet-id WS --row-id ROW --control-id FIELD [-o PATH]` | Download a worksheet-record attachment with the same record and field permission checks as the web app; existing local files are never overwritten |
|
|
286
287
|
| `attachment share [ADDRESS]` | Create a link to a stored file that you can pass on (`--hours`, default 48; `--file-id` to share by attachment id, `--short` for a landing page instead of the storage address) |
|
|
287
288
|
|
|
288
289
|
> ADDRESS is the file's link — one that has already stopped working is fine, paste it as-is — or just the path part of it. The file itself does not expire, only the link does, so a dead link can always be revived.
|
|
@@ -226,6 +226,146 @@ def case_custom_action(app_id: str, section_id: str) -> None:
|
|
|
226
226
|
hap(["worksheet", "delete", ws_id, "-a", app_id, "-y"], check=False)
|
|
227
227
|
|
|
228
228
|
|
|
229
|
+
def case_custom_action_update(app_id: str, section_id: str) -> None:
|
|
230
|
+
"""bug #455751: --action-spec with --btn-id edits the action in place."""
|
|
231
|
+
print("scenario: custom-action update by id")
|
|
232
|
+
ws_id = _make_worksheet(app_id, section_id, "LT-action-update")
|
|
233
|
+
try:
|
|
234
|
+
ok, res = _try(["worksheet", "create-custom-action", ws_id, "-a",
|
|
235
|
+
app_id, "--action-spec", json.dumps(
|
|
236
|
+
{"name": "ORIGINAL", "type": "triggerWorkflow",
|
|
237
|
+
"color": "#2196F3"})])
|
|
238
|
+
check("update: workflow action created", ok, str(res)[:160])
|
|
239
|
+
btn_id = res.get("actionId") if ok else ""
|
|
240
|
+
proc_id = res.get("processId") if ok else ""
|
|
241
|
+
ok, res = _try(["worksheet", "create-custom-action", ws_id, "-a",
|
|
242
|
+
app_id, "--btn-id", btn_id, "--action-spec",
|
|
243
|
+
json.dumps({"name": "UPDATED"})])
|
|
244
|
+
check("update: edit succeeds", ok, str(res)[:160])
|
|
245
|
+
check("update: the id is unchanged",
|
|
246
|
+
ok and res.get("actionId") == btn_id, str(res)[:160])
|
|
247
|
+
check("update: the same workflow is reported",
|
|
248
|
+
ok and res.get("processId") == proc_id, str(res)[:160])
|
|
249
|
+
acts = _actions(ws_id)
|
|
250
|
+
check("update: still one action", len(acts) == 1,
|
|
251
|
+
str([(a.get("btnId"), a.get("name")) for a in acts]))
|
|
252
|
+
got = acts[0] if acts else {}
|
|
253
|
+
check("update: renamed in place",
|
|
254
|
+
got.get("btnId") == btn_id and got.get("name") == "UPDATED",
|
|
255
|
+
str((got.get("btnId"), got.get("name"))))
|
|
256
|
+
check("update: unnamed settings kept",
|
|
257
|
+
got.get("color") == "#2196F3" and got.get("clickType") == 1,
|
|
258
|
+
str((got.get("color"), got.get("clickType"))))
|
|
259
|
+
wf = [r for r in _workflow_rows(app_id)
|
|
260
|
+
if r.get("id") == proc_id or r.get("processId") == proc_id]
|
|
261
|
+
check("update: the action's workflow survives", bool(wf),
|
|
262
|
+
proc_id)
|
|
263
|
+
|
|
264
|
+
# A fill action edited by id stays a fill action and keeps its fields.
|
|
265
|
+
title = next((c["controlId"] for c in _fields(ws_id)
|
|
266
|
+
if c.get("attribute") == 1), "")
|
|
267
|
+
ok, res = _try(["worksheet", "create-custom-action", ws_id, "-a",
|
|
268
|
+
app_id, "--action-spec", json.dumps(
|
|
269
|
+
{"name": "FILL", "type": "updateCurrentRecord",
|
|
270
|
+
"updateFields": [title]})])
|
|
271
|
+
fill_id = res.get("actionId") if ok else ""
|
|
272
|
+
ok, res = _try(["worksheet", "create-custom-action", ws_id, "-a",
|
|
273
|
+
app_id, "--btn-id", fill_id, "--action-spec",
|
|
274
|
+
json.dumps({"name": "FILL2"})])
|
|
275
|
+
check("update: fill action edit succeeds", ok, str(res)[:160])
|
|
276
|
+
acts = _actions(ws_id)
|
|
277
|
+
fill = next((a for a in acts if a.get("btnId") == fill_id), {})
|
|
278
|
+
check("update: two actions after editing the second", len(acts) == 2,
|
|
279
|
+
str([(a.get("btnId"), a.get("name")) for a in acts]))
|
|
280
|
+
check("update: fill action keeps its kind and field",
|
|
281
|
+
fill.get("name") == "FILL2" and fill.get("clickType") == 3
|
|
282
|
+
and [w.get("controlId") for w in fill.get("writeControls")
|
|
283
|
+
or []] == [title],
|
|
284
|
+
str((fill.get("name"), fill.get("clickType"),
|
|
285
|
+
fill.get("writeControls"))))
|
|
286
|
+
|
|
287
|
+
ok, res = _try(["worksheet", "create-custom-action", ws_id, "-a",
|
|
288
|
+
app_id, "--btn-id", "000000000000000000000000",
|
|
289
|
+
"--action-spec", json.dumps({"name": "GHOST"})])
|
|
290
|
+
check("update: unknown id is refused", not ok, str(res)[:160])
|
|
291
|
+
check("update: nothing created for an unknown id",
|
|
292
|
+
len(_actions(ws_id)) == 2, str(len(_actions(ws_id))))
|
|
293
|
+
finally:
|
|
294
|
+
hap(["worksheet", "delete", ws_id, "-a", app_id, "-y"], check=False)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def case_hidden_defaults(app_id: str, section_id: str) -> None:
|
|
298
|
+
"""bug #455757: a hidden field's default goes in with a new record.
|
|
299
|
+
|
|
300
|
+
The form submits every non-empty cell on create, hidden ones included,
|
|
301
|
+
so the defaults the CLI fills in must not be judged as the caller
|
|
302
|
+
writing a hidden field. Writing one yourself is still refused.
|
|
303
|
+
"""
|
|
304
|
+
print("scenario: hidden defaults on create")
|
|
305
|
+
ws_id = _make_worksheet(app_id, section_id, "LT-hidden-defaults")
|
|
306
|
+
|
|
307
|
+
def static(value):
|
|
308
|
+
return {"defsource": json.dumps(
|
|
309
|
+
[{"cid": "", "rcid": "", "staticValue": value}])}
|
|
310
|
+
try:
|
|
311
|
+
ok, res = _try(["worksheet", "add-fields", ws_id, "--controls",
|
|
312
|
+
json.dumps([
|
|
313
|
+
{"type": 2, "controlName": "Stage",
|
|
314
|
+
"fieldPermission": "110",
|
|
315
|
+
"advancedSetting": static("Draft")},
|
|
316
|
+
{"type": 2, "controlName": "Status",
|
|
317
|
+
"fieldPermission": "110",
|
|
318
|
+
"advancedSetting": static("Open")}])])
|
|
319
|
+
check("hidden: fields added", ok, str(res)[:160])
|
|
320
|
+
ids = {c.get("controlName"): c.get("controlId")
|
|
321
|
+
for c in _fields(ws_id)}
|
|
322
|
+
name_id = next((c["controlId"] for c in _fields(ws_id)
|
|
323
|
+
if c.get("attribute") == 1), "")
|
|
324
|
+
stage, status = ids.get("Stage"), ids.get("Status")
|
|
325
|
+
|
|
326
|
+
ok, res = _try(["worksheet", "record", "create", ws_id, "-a", app_id,
|
|
327
|
+
"--fields-json", json.dumps(
|
|
328
|
+
[{"id": name_id, "value": "visible-only"}])])
|
|
329
|
+
check("hidden: create with only the visible field succeeds", ok,
|
|
330
|
+
str(res)[:200])
|
|
331
|
+
row_id = ((res.get("data") or {}).get("rowid")
|
|
332
|
+
if ok and isinstance(res, dict) else "")
|
|
333
|
+
got = (hap(["worksheet", "record", "get", ws_id, row_id, "-a",
|
|
334
|
+
app_id]) or {}) if row_id else {}
|
|
335
|
+
got = got.get("data", got) if isinstance(got, dict) else {}
|
|
336
|
+
check("hidden: the hidden defaults were stored",
|
|
337
|
+
got.get(stage) == "Draft" and got.get(status) == "Open",
|
|
338
|
+
str({k: got.get(k) for k in (name_id, stage, status)}))
|
|
339
|
+
|
|
340
|
+
ok, res = _try(["worksheet", "record", "create", ws_id, "-a", app_id,
|
|
341
|
+
"--fields-json", json.dumps(
|
|
342
|
+
[{"id": name_id, "value": "sneaky"},
|
|
343
|
+
{"id": stage, "value": "Won"}])])
|
|
344
|
+
check("hidden: writing a hidden field yourself is refused",
|
|
345
|
+
not ok and "Stage" in str(res) and "Status" not in str(res),
|
|
346
|
+
str(res)[:240])
|
|
347
|
+
|
|
348
|
+
rows = json.dumps([{name_id: "batch-1"}, {name_id: "batch-2"}])
|
|
349
|
+
ok, res = _try(["worksheet", "record", "batch-create", ws_id,
|
|
350
|
+
"-a", app_id, "--rows", rows])
|
|
351
|
+
check("hidden: batch create with only visible fields succeeds", ok,
|
|
352
|
+
str(res)[:200])
|
|
353
|
+
rows = json.dumps([{name_id: "batch-3"},
|
|
354
|
+
{name_id: "batch-4", stage: "Won"}])
|
|
355
|
+
ok, res = _try(["worksheet", "record", "batch-create", ws_id,
|
|
356
|
+
"-a", app_id, "--rows", rows])
|
|
357
|
+
check("hidden: batch writing a hidden field is refused on its row",
|
|
358
|
+
not ok and "row 2" in str(res) and "row 1" not in str(res),
|
|
359
|
+
str(res)[:240])
|
|
360
|
+
listed = (hap(["worksheet", "record", "list", ws_id, "-a", app_id])
|
|
361
|
+
or {}).get("rows") or []
|
|
362
|
+
blob = json.dumps(listed, ensure_ascii=False)
|
|
363
|
+
check("hidden: the refused batch wrote nothing",
|
|
364
|
+
"batch-3" not in blob and "batch-1" in blob, blob[:200])
|
|
365
|
+
finally:
|
|
366
|
+
hap(["worksheet", "delete", ws_id, "-a", app_id, "-y"], check=False)
|
|
367
|
+
|
|
368
|
+
|
|
229
369
|
def _items(app_id: str) -> dict[str, str]:
|
|
230
370
|
"""All sidebar items (worksheets, pages, chatbots) name -> id."""
|
|
231
371
|
detail = hap(["app", "info", "-a", app_id])
|
|
@@ -3397,6 +3537,71 @@ def case_fb_subtable_read(app_id: str, section_id: str) -> None:
|
|
|
3397
3537
|
hap(["worksheet", "delete", parent, "--yes"], check=False)
|
|
3398
3538
|
|
|
3399
3539
|
|
|
3540
|
+
def case_editor_inline_subtable(app_id: str, section_id: str) -> None:
|
|
3541
|
+
"""Bug #455768: edit-spec field ops on an inline sub-table's own sheet."""
|
|
3542
|
+
print("\nscenario: editor field ops on an inline sub-table (#455768)")
|
|
3543
|
+
import json as _json
|
|
3544
|
+
name = "BUG455768-sub-parent"
|
|
3545
|
+
parent = _make_worksheet(app_id, section_id, name)
|
|
3546
|
+
check("inline-subtable: a throwaway parent was created", bool(parent))
|
|
3547
|
+
if not parent:
|
|
3548
|
+
return
|
|
3549
|
+
try:
|
|
3550
|
+
hap(["worksheet", "update-fields", parent, "--title-name", "名称",
|
|
3551
|
+
"--no-verify", "--fields", _json.dumps([
|
|
3552
|
+
{"type": "TEXT", "name": "名称"},
|
|
3553
|
+
{"type": "SUB_LIST", "name": "内嵌明细", "child_fields": [
|
|
3554
|
+
{"type": "TEXT", "name": "行名称"},
|
|
3555
|
+
{"type": "NUMBER", "name": "行数量"}]},
|
|
3556
|
+
], ensure_ascii=False)], check=False)
|
|
3557
|
+
child = next((c.get("dataSource") for c in _fields(parent)
|
|
3558
|
+
if c.get("type") == 34), "")
|
|
3559
|
+
check("inline-subtable: the parent names its child sheet",
|
|
3560
|
+
bool(child), str(child))
|
|
3561
|
+
if not child:
|
|
3562
|
+
return
|
|
3563
|
+
|
|
3564
|
+
def _child_cols() -> list[dict]:
|
|
3565
|
+
got = hap(["worksheet", "fields", child, "--raw",
|
|
3566
|
+
"--parent", parent], check=False)
|
|
3567
|
+
return [c for c in got if len(c.get("controlId") or "") == 24] \
|
|
3568
|
+
if isinstance(got, list) else []
|
|
3569
|
+
|
|
3570
|
+
rc, out, err = editor_apply({"app": app_id, "ops": [
|
|
3571
|
+
{"type": "field.update", "worksheet": child, "field": "行名称",
|
|
3572
|
+
"set": {"hint": "按id改"}}]})
|
|
3573
|
+
check("inline-subtable: field.update by sheet id applies", rc == 0,
|
|
3574
|
+
(err or out)[-300:])
|
|
3575
|
+
cols = {c["controlName"]: c for c in _child_cols()}
|
|
3576
|
+
check("inline-subtable: the hint reads back",
|
|
3577
|
+
(cols.get("行名称") or {}).get("hint") == "按id改",
|
|
3578
|
+
str(cols.get("行名称"))[:200])
|
|
3579
|
+
|
|
3580
|
+
rc, out, err = editor_apply({"app": app_id, "ops": [
|
|
3581
|
+
{"type": "field.update", "worksheet": f"{name}/内嵌明细",
|
|
3582
|
+
"field": "行数量", "rename": "数量", "set": {}},
|
|
3583
|
+
{"type": "field.add", "worksheet": child,
|
|
3584
|
+
"field": {"name": "行备注", "type": "Text"}},
|
|
3585
|
+
{"type": "field.reorder", "worksheet": child,
|
|
3586
|
+
"order": ["行备注", "数量"]},
|
|
3587
|
+
{"type": "field.delete", "worksheet": child, "field": "行名称",
|
|
3588
|
+
"confirm": True}]})
|
|
3589
|
+
check("inline-subtable: add / reorder / delete apply", rc == 0,
|
|
3590
|
+
(err or out)[-300:])
|
|
3591
|
+
names = [c["controlName"] for c in
|
|
3592
|
+
sorted(_child_cols(), key=lambda c: c.get("row", 0))]
|
|
3593
|
+
check("inline-subtable: columns read back renamed, added, "
|
|
3594
|
+
"reordered and deleted", names == ["行备注", "数量"],
|
|
3595
|
+
str(names))
|
|
3596
|
+
sub = next((c for c in _fields(parent) if c.get("type") == 34), {})
|
|
3597
|
+
shown = {c["controlId"]: c["controlName"] for c in _child_cols()}
|
|
3598
|
+
check("inline-subtable: the new column is shown in the sub-table",
|
|
3599
|
+
[shown.get(i) for i in sub.get("showControls") or []]
|
|
3600
|
+
== ["行备注", "数量"], str(sub.get("showControls")))
|
|
3601
|
+
finally:
|
|
3602
|
+
hap(["worksheet", "delete", parent, "-a", app_id, "-y"], check=False)
|
|
3603
|
+
|
|
3604
|
+
|
|
3400
3605
|
def case_fb_subgroups(app_id: str, section_id: str) -> None:
|
|
3401
3606
|
"""WO-FB 3.1: the editor can see worksheets in second-level groups."""
|
|
3402
3607
|
print("\nscenario: sub-group visibility (WO-FB 3.1)")
|
|
@@ -4546,6 +4751,8 @@ _CASES = {
|
|
|
4546
4751
|
"view": case_view,
|
|
4547
4752
|
"role": case_role,
|
|
4548
4753
|
"custom-action": case_custom_action,
|
|
4754
|
+
"custom-action-update": case_custom_action_update,
|
|
4755
|
+
"hidden-defaults": case_hidden_defaults,
|
|
4549
4756
|
"chatbot": case_chatbot,
|
|
4550
4757
|
"custom-page": case_custom_page,
|
|
4551
4758
|
"component": case_component,
|
|
@@ -4585,6 +4792,7 @@ _CASES = {
|
|
|
4585
4792
|
"fb-layout-check": case_fb_layout_check,
|
|
4586
4793
|
"fb-pair-relation": case_fb_pair_relation,
|
|
4587
4794
|
"fb-subtable-read": case_fb_subtable_read,
|
|
4795
|
+
"editor-inline-subtable": case_editor_inline_subtable,
|
|
4588
4796
|
"fb-subgroups": case_fb_subgroups,
|
|
4589
4797
|
"fb-button-target": case_fb_button_target,
|
|
4590
4798
|
"g6-advanced-fields": case_g6_advanced_fields,
|
|
@@ -283,6 +283,7 @@ discover every subcommand.
|
|
|
283
283
|
|
|
284
284
|
| Command | Description |
|
|
285
285
|
|---|---|
|
|
286
|
+
| `attachment download FILE_ID --worksheet-id WS --row-id ROW --control-id FIELD [-o PATH]` | Download a worksheet-record attachment with the same record and field permission checks as the web app; existing local files are never overwritten |
|
|
286
287
|
| `attachment share [ADDRESS]` | Create a link to a stored file that you can pass on (`--hours`, default 48; `--file-id` to share by attachment id, `--short` for a landing page instead of the storage address) |
|
|
287
288
|
|
|
288
289
|
> ADDRESS is the file's link — one that has already stopped working is fine, paste it as-is — or just the path part of it. The file itself does not expire, only the link does, so a dead link can always be revived.
|
|
@@ -262,6 +262,7 @@ hap --json worksheet record list WORKSHEET_ID
|
|
|
262
262
|
|
|
263
263
|
| 命令 | 说明 |
|
|
264
264
|
|---|---|
|
|
265
|
+
| `attachment download FILE_ID --worksheet-id WS --row-id ROW --control-id FIELD [-o PATH]` | 按网页端相同的记录和字段权限校验下载工作表记录附件;不会覆盖已有本地文件 |
|
|
265
266
|
| `attachment share [ADDRESS]` | 为已存储的文件生成一条可以转给别人的链接(`--hours`,默认 48 小时;`--file-id` 按附件 ID 分享,`--short` 返回文件介绍页而非存储地址) |
|
|
266
267
|
|
|
267
268
|
> ADDRESS 传文件的链接即可——**已经失效的链接照样能传,原样粘贴**——也可以只传路径部分。文件本身不会过期,过期的只是链接,所以失效链接随时可以重新生成。
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""CLI commands for files stored as attachments."""
|
|
2
2
|
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
3
5
|
import click
|
|
4
6
|
|
|
5
7
|
from hap_cli.context import pass_context
|
|
@@ -55,7 +57,43 @@ def attachment_share(ctx, address, hours, file_id, short, display_name, size):
|
|
|
55
57
|
ctx.handle_error(e)
|
|
56
58
|
|
|
57
59
|
|
|
60
|
+
@attachment.command("download")
|
|
61
|
+
@click.argument("file_id")
|
|
62
|
+
@click.option("--worksheet-id", required=True, help="Worksheet containing the record.")
|
|
63
|
+
@click.option("--row-id", required=True, help="Record containing the attachment.")
|
|
64
|
+
@click.option("--control-id", required=True, help="Attachment field containing the file.")
|
|
65
|
+
@click.option(
|
|
66
|
+
"--output", "-o", "output", type=click.Path(path_type=Path, dir_okay=False),
|
|
67
|
+
default=None, help="Save as this path. By default, uses the attachment name.",
|
|
68
|
+
)
|
|
69
|
+
@pass_context
|
|
70
|
+
def attachment_download(ctx, file_id, worksheet_id, row_id, control_id, output):
|
|
71
|
+
"""Download a file attached to a worksheet record.
|
|
72
|
+
|
|
73
|
+
FILE_ID is listed in an attachment field or a record operation log.
|
|
74
|
+
Existing local files are never overwritten.
|
|
75
|
+
"""
|
|
76
|
+
try:
|
|
77
|
+
session = ctx.get_session()
|
|
78
|
+
data = attachment_mod.download_attachment(
|
|
79
|
+
session,
|
|
80
|
+
file_id,
|
|
81
|
+
worksheet_id=worksheet_id,
|
|
82
|
+
row_id=row_id,
|
|
83
|
+
control_id=control_id,
|
|
84
|
+
output=output,
|
|
85
|
+
)
|
|
86
|
+
ctx.output(data, _download_human)
|
|
87
|
+
except Exception as e:
|
|
88
|
+
ctx.handle_error(e)
|
|
89
|
+
|
|
90
|
+
|
|
58
91
|
def _human(d):
|
|
59
92
|
click.echo(d["url"])
|
|
60
93
|
if d.get("expiresAt"):
|
|
61
94
|
click.echo(f"Usable until {d['expiresAt']}")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _download_human(d):
|
|
98
|
+
click.echo(d["path"])
|
|
99
|
+
click.echo(f"{d['bytes']} bytes")
|
|
@@ -1299,7 +1299,7 @@ def worksheet_save_button(ctx, worksheet_id, btn_config, action_spec,
|
|
|
1299
1299
|
eff_app = app_id or getattr(session, "default_app_id", "") or ""
|
|
1300
1300
|
data = ws_mod.create_custom_action(
|
|
1301
1301
|
session, worksheet_id, json.loads(action_spec),
|
|
1302
|
-
app_id=eff_app,
|
|
1302
|
+
app_id=eff_app, btn_id=btn_id,
|
|
1303
1303
|
)
|
|
1304
1304
|
else:
|
|
1305
1305
|
btn_data = json.loads(btn_config)
|