hap-cli 0.8.0__tar.gz → 0.8.1__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.8.0 → hap_cli-0.8.1}/PKG-INFO +1 -1
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/__init__.py +1 -1
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/app_cmd.py +14 -6
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/chart_cmd.py +1 -2
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/config_cmd.py +19 -2
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/page_cmd.py +7 -4
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/record_cmd.py +14 -7
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/worksheet_cmd.py +10 -4
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/app.py +40 -16
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/auth.py +175 -29
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/chart.py +5 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/chat.py +20 -19
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/global_meta.py +25 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/page.py +9 -3
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/record.py +131 -20
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/session.py +14 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/worksheet.py +36 -4
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/conftest.py +52 -0
- hap_cli-0.8.1/hap_cli/tests/test_app_restore.py +123 -0
- hap_cli-0.8.1/hap_cli/tests/test_bug_036430.py +167 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_chart.py +14 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_config_cmd.py +23 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_core.py +189 -45
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_worksheet_extra.py +8 -4
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_session.py +25 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/PKG-INFO +1 -1
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/SOURCES.txt +2 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/MANIFEST.in +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/README.md +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/__main__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/config.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/harness.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/smoke.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/state.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/README.md +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/README_CN.md +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/app_editor_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/auth_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/calendar_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/chat_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/chatbot_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/contact_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/department_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/group_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/icon_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/instance_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/node_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/optionset_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/post_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/region_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/role_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/upload_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/v3_registry.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/workflow_cmd.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/context.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/action_spec_adapter.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/calendar_mod.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/chatbot.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/contact.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/control_type_codes.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/department.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/apply.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/componentlower.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/editspec.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/errors.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/fieldlower.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/jsonschema_mini.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/models.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/ops.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/planner.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/reader.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/field_normalizer.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/field_spec_adapter.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/filter_translator.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/flow_node.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/group.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/icon_index.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/instance.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/logger.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/optionset.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/post.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/response_crypto.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/role.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/role_perm_builder.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/token_crypto.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/upload.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/dispatcher.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/render.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/schema.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/view_spec_adapter.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/workflow.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/workflow_node_dsl.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/worksheet_templates.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/hap_cli.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/i18n.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/locale/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/locale/messages.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/locale/messages.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_app_editor.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_app_export_usage.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_auth_prerelease.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_full_e2e.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_global_meta.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_i18n.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_approval.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_approval_actions.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_calendar.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_destructive.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_misc.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_post.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_social.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_v3.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_workflow.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_multi_profile.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_org_id_cli.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_org_id_docs.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_parameter_conventions.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_dispatcher.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/formatting.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/options.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/parameter_mapping.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/dependency_links.txt +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/entry_points.txt +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/requires.txt +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/top_level.txt +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/__main__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/_wftest.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/charts.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/cleanup.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/compiler.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/config.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/errors.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/executor.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/fields.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/hap.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/console.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/jsonl.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/mirror.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/report.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/schema.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/__init__.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/cli.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/executor.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/template.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/selftest.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/smoke.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/step.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/steps.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/store.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/workflow_dsl.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/setup.cfg +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/setup.py +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/application.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/chatbot.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/custom-page.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/node.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/role.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/view.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/workflow.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/worksheet.schema.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/INDEX.json +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/create_optionset.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/create_role.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_optionset.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_record.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_role.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_app_info.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_details.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_list.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_logs.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_relations.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_regions.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_role_details.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_role_list.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/knowledge_search.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
- {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/update_optionset.yaml +0 -0
|
@@ -382,19 +382,27 @@ def app_backup(ctx, app_id, org_id, no_data):
|
|
|
382
382
|
@app.command("restore")
|
|
383
383
|
@click.argument("app_id")
|
|
384
384
|
@org_id_option()
|
|
385
|
-
@click.option("--backup-id", "-b",
|
|
386
|
-
@click.option("--file-url",
|
|
387
|
-
@click.option("--file-name",
|
|
385
|
+
@click.option("--backup-id", "-b", default="", help="Restore from an existing backup (its ID)")
|
|
386
|
+
@click.option("--file-url", default="", help="Restore from an uploaded backup file (its URL)")
|
|
387
|
+
@click.option("--file-name", default="", help="File name to show for an uploaded backup file")
|
|
388
388
|
@click.option("--no-data", is_flag=True, help="Restore without data")
|
|
389
389
|
@click.option("--as-new", is_flag=True, help="Restore as a new app")
|
|
390
390
|
@pass_context
|
|
391
391
|
def app_restore(ctx, app_id, org_id, backup_id, file_url, file_name, no_data, as_new):
|
|
392
|
-
"""Restore an application from backup.
|
|
392
|
+
"""Restore an application, either from an existing backup or an uploaded file.
|
|
393
|
+
|
|
394
|
+
Provide exactly one source: --backup-id (an existing backup) or
|
|
395
|
+
--file-url (an uploaded backup file).
|
|
396
|
+
"""
|
|
393
397
|
try:
|
|
398
|
+
if bool(backup_id) == bool(file_url):
|
|
399
|
+
raise click.UsageError(
|
|
400
|
+
"Provide exactly one of --backup-id or --file-url."
|
|
401
|
+
)
|
|
394
402
|
session = ctx.get_session()
|
|
395
403
|
data = app_mod.restore_app(
|
|
396
|
-
session, app_id, require_api_project_id(session, org_id),
|
|
397
|
-
file_url, file_name,
|
|
404
|
+
session, app_id, require_api_project_id(session, org_id),
|
|
405
|
+
backup_id=backup_id, file_url=file_url, file_name=file_name,
|
|
398
406
|
contain_data=not no_data, is_restore_new=as_new,
|
|
399
407
|
)
|
|
400
408
|
ctx.output(data, lambda d: click.echo(f"Restore started: {d}"))
|
|
@@ -27,8 +27,7 @@ def chart():
|
|
|
27
27
|
_REPORT_TYPE_HINT = (
|
|
28
28
|
"Chart type (integer). Common values: "
|
|
29
29
|
"1=column, 2=line, 3=pie, 4=number, 5=bar, 6=radar, 7=funnel, "
|
|
30
|
-
"8=dual-axis, 9=pivot, 10=heatmap.
|
|
31
|
-
"for the full set."
|
|
30
|
+
"8=dual-axis, 9=pivot, 10=heatmap."
|
|
32
31
|
)
|
|
33
32
|
|
|
34
33
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
+
import re
|
|
6
7
|
import time
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
|
|
@@ -251,6 +252,22 @@ def config_language(ctx, lang):
|
|
|
251
252
|
click.echo(f"Language set to: {label} [{lang}]")
|
|
252
253
|
|
|
253
254
|
|
|
255
|
+
# Request log lines carry redacted `Authorization=<...>` and
|
|
256
|
+
# `AccountId=<...>` tokens. They add no value when reading the log and
|
|
257
|
+
# are stripped from the view output. The Authorization value keeps its
|
|
258
|
+
# `md_pss_id ` scheme prefix (one internal space) ahead of the redacted
|
|
259
|
+
# token, so that space must be consumed too; AccountId's redacted form
|
|
260
|
+
# has no spaces.
|
|
261
|
+
_HIDDEN_LOG_TOKENS_RE = re.compile(
|
|
262
|
+
r"\s+(?:Authorization=(?:md_pss_id )?\S*|AccountId=\S+)"
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def _sanitize_log_line(line: str) -> str:
|
|
267
|
+
"""Drop `Authorization=` / `AccountId=` tokens from a log line."""
|
|
268
|
+
return _HIDDEN_LOG_TOKENS_RE.sub("", line)
|
|
269
|
+
|
|
270
|
+
|
|
254
271
|
@config_log.command("view")
|
|
255
272
|
@click.option("--lines", "-n", type=int, default=50, show_default=True,
|
|
256
273
|
help="Number of existing lines to print before following.")
|
|
@@ -277,7 +294,7 @@ def log_view(lines, no_follow):
|
|
|
277
294
|
with open(path, "r", encoding="utf-8", errors="replace") as f:
|
|
278
295
|
tail = f.readlines()[-max(0, lines):]
|
|
279
296
|
for line in tail:
|
|
280
|
-
click.echo(line.rstrip("\n"))
|
|
297
|
+
click.echo(_sanitize_log_line(line.rstrip("\n")))
|
|
281
298
|
if no_follow:
|
|
282
299
|
return
|
|
283
300
|
f.seek(0, os.SEEK_END)
|
|
@@ -287,7 +304,7 @@ def log_view(lines, no_follow):
|
|
|
287
304
|
if not chunk:
|
|
288
305
|
time.sleep(0.3)
|
|
289
306
|
continue
|
|
290
|
-
click.echo(chunk.rstrip("\n"))
|
|
307
|
+
click.echo(_sanitize_log_line(chunk.rstrip("\n")))
|
|
291
308
|
except KeyboardInterrupt:
|
|
292
309
|
click.echo("", err=True)
|
|
293
310
|
return
|
|
@@ -244,7 +244,7 @@ def page_save(ctx, app_id, version, components, adjust_screen, url_params, confi
|
|
|
244
244
|
|
|
245
245
|
|
|
246
246
|
@page.command("update-config")
|
|
247
|
-
@click.argument("
|
|
247
|
+
@click.argument("page_id")
|
|
248
248
|
@click.option("--desc", default="", help="New description")
|
|
249
249
|
@click.option("--config", "config_json", default="", help="JSON object of page config")
|
|
250
250
|
@click.option(
|
|
@@ -253,13 +253,16 @@ def page_save(ctx, app_id, version, components, adjust_screen, url_params, confi
|
|
|
253
253
|
)
|
|
254
254
|
@click.option("--url-params", default="", help="JSON array of URL parameter descriptors")
|
|
255
255
|
@pass_context
|
|
256
|
-
def page_update_config(ctx,
|
|
257
|
-
"""
|
|
256
|
+
def page_update_config(ctx, page_id, desc, config_json, adjust_screen, url_params):
|
|
257
|
+
"""Update a custom page's settings.
|
|
258
|
+
|
|
259
|
+
PAGE_ID is the custom page's own id (not the application id).
|
|
260
|
+
"""
|
|
258
261
|
try:
|
|
259
262
|
session = ctx.get_session()
|
|
260
263
|
data = page_mod.update_page_config(
|
|
261
264
|
session,
|
|
262
|
-
|
|
265
|
+
page_id=page_id,
|
|
263
266
|
desc=desc,
|
|
264
267
|
config=_json.loads(config_json) if config_json else None,
|
|
265
268
|
adjust_screen=adjust_screen,
|
|
@@ -83,7 +83,9 @@ def record_create(ctx, worksheet_id, field, no_workflow):
|
|
|
83
83
|
"""Create a new record. Use -f CONTROL_ID=VALUE for each field."""
|
|
84
84
|
try:
|
|
85
85
|
session = ctx.get_session()
|
|
86
|
-
controls =
|
|
86
|
+
controls = rec_mod.encode_controls_by_id(
|
|
87
|
+
session, worksheet_id, _parse_fields(field),
|
|
88
|
+
)
|
|
87
89
|
data = rec_mod.create_record(
|
|
88
90
|
session, worksheet_id, controls,
|
|
89
91
|
trigger_workflow=not no_workflow,
|
|
@@ -103,7 +105,9 @@ def record_update(ctx, worksheet_id, row_id, field, no_workflow):
|
|
|
103
105
|
"""Update a record. Use -f CONTROL_ID=VALUE for each field."""
|
|
104
106
|
try:
|
|
105
107
|
session = ctx.get_session()
|
|
106
|
-
controls =
|
|
108
|
+
controls = rec_mod.encode_controls_by_id(
|
|
109
|
+
session, worksheet_id, _parse_fields(field),
|
|
110
|
+
)
|
|
107
111
|
data = rec_mod.update_record(
|
|
108
112
|
session, worksheet_id, row_id, controls,
|
|
109
113
|
trigger_workflow=not no_workflow,
|
|
@@ -210,7 +214,7 @@ def record_discussions(ctx, worksheet_id, row_id, page_size, page):
|
|
|
210
214
|
try:
|
|
211
215
|
session = ctx.get_session()
|
|
212
216
|
data = rec_mod.get_discussions(
|
|
213
|
-
session,
|
|
217
|
+
session, worksheet_id, row_id,
|
|
214
218
|
page_index=page, page_size=page_size,
|
|
215
219
|
)
|
|
216
220
|
ctx.output(data, lambda d: output_json(d))
|
|
@@ -222,14 +226,17 @@ def record_discussions(ctx, worksheet_id, row_id, page_size, page):
|
|
|
222
226
|
@click.argument("worksheet_id")
|
|
223
227
|
@click.argument("row_id")
|
|
224
228
|
@click.option("--message", "-m", required=True, help="Discussion message")
|
|
225
|
-
@click.option("--app-id", default="", help="Application ID")
|
|
229
|
+
@click.option("--app-id", default="", help="Application ID (auto-detected from the worksheet if omitted)")
|
|
230
|
+
@click.option("--view-id", default="", help="View ID the discussion originates from")
|
|
231
|
+
@click.option("--reply-id", default="", help="ID of the discussion being replied to")
|
|
226
232
|
@pass_context
|
|
227
|
-
def record_add_discussion(ctx, worksheet_id, row_id, message, app_id):
|
|
233
|
+
def record_add_discussion(ctx, worksheet_id, row_id, message, app_id, view_id, reply_id):
|
|
228
234
|
"""Add a discussion/comment to a record."""
|
|
229
235
|
try:
|
|
230
236
|
session = ctx.get_session()
|
|
231
237
|
data = rec_mod.add_discussion(
|
|
232
|
-
session, row_id, message,
|
|
238
|
+
session, worksheet_id, row_id, message,
|
|
239
|
+
app_id=app_id, view_id=view_id, reply_id=reply_id,
|
|
233
240
|
)
|
|
234
241
|
ctx.output(data, lambda d: click.echo(f"Discussion added."))
|
|
235
242
|
except Exception as e:
|
|
@@ -246,7 +253,7 @@ def record_delete_discussion(ctx, discussion_id, yes):
|
|
|
246
253
|
if not yes:
|
|
247
254
|
click.confirm(f"Delete discussion {discussion_id}?", abort=True)
|
|
248
255
|
session = ctx.get_session()
|
|
249
|
-
data = rec_mod.remove_discussion(session, discussion_id
|
|
256
|
+
data = rec_mod.remove_discussion(session, discussion_id)
|
|
250
257
|
ctx.output(data, lambda d: click.echo(f"Discussion deleted."))
|
|
251
258
|
except Exception as e:
|
|
252
259
|
ctx.handle_error(e)
|
|
@@ -627,13 +627,19 @@ def worksheet_update_view(ctx, worksheet_id, view_id, name, view_json,
|
|
|
627
627
|
@worksheet.command("copy-view")
|
|
628
628
|
@click.argument("worksheet_id")
|
|
629
629
|
@click.argument("view_id")
|
|
630
|
-
@click.argument("name")
|
|
630
|
+
@click.argument("name", required=False, default="")
|
|
631
|
+
@click.option("--app-id", default="",
|
|
632
|
+
help="Application ID the worksheet belongs to "
|
|
633
|
+
"(auto-detected from the worksheet if omitted).")
|
|
631
634
|
@pass_context
|
|
632
|
-
def worksheet_copy_view(ctx, worksheet_id, view_id, name):
|
|
633
|
-
"""Copy a worksheet view.
|
|
635
|
+
def worksheet_copy_view(ctx, worksheet_id, view_id, name, app_id):
|
|
636
|
+
"""Copy a worksheet view.
|
|
637
|
+
|
|
638
|
+
NAME is optional; when given, the copied view is renamed to it.
|
|
639
|
+
"""
|
|
634
640
|
try:
|
|
635
641
|
session = ctx.get_session()
|
|
636
|
-
data = ws_mod.copy_view(session, worksheet_id, view_id, name)
|
|
642
|
+
data = ws_mod.copy_view(session, worksheet_id, view_id, name, app_id=app_id)
|
|
637
643
|
ctx.output(data, lambda d: output_json(d))
|
|
638
644
|
except Exception as e:
|
|
639
645
|
ctx.handle_error(e)
|
|
@@ -525,25 +525,49 @@ def restore_app(
|
|
|
525
525
|
session: Session,
|
|
526
526
|
app_id: str,
|
|
527
527
|
project_id: str,
|
|
528
|
-
backup_id: str,
|
|
529
|
-
file_url: str,
|
|
530
|
-
file_name: str,
|
|
528
|
+
backup_id: str = "",
|
|
529
|
+
file_url: str = "",
|
|
530
|
+
file_name: str = "",
|
|
531
531
|
contain_data: bool = True,
|
|
532
532
|
is_restore_new: bool = False,
|
|
533
|
+
auto_end_maintain: bool = False,
|
|
534
|
+
backup_current_version: bool = False,
|
|
533
535
|
) -> dict[str, Any]:
|
|
534
|
-
"""Restore an application from backup.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
536
|
+
"""Restore an application from a backup log id or an uploaded file.
|
|
537
|
+
|
|
538
|
+
The HAP UI has two mutually exclusive restore modes; the API field
|
|
539
|
+
set differs between them, so we must send only one mode's fields:
|
|
540
|
+
|
|
541
|
+
- Backup-log restore (``src/pages/AppSettings/components/
|
|
542
|
+
appBackupRestore/components/BackupFiles.jsx``): sends ``id`` (the
|
|
543
|
+
backup-restore operation-log id) plus ``autoEndMaintain``,
|
|
544
|
+
``backupCurrentVersion`` and ``isRestoreNew`` — no ``fileUrl``.
|
|
545
|
+
- Uploaded-file restore (``.../BackupFromFiles.jsx``): sends
|
|
546
|
+
``fileUrl`` + ``fileName`` + ``containData`` plus the same three
|
|
547
|
+
flags — no ``id``.
|
|
548
|
+
|
|
549
|
+
Sending both at once (as an earlier wrapper did, with all three
|
|
550
|
+
forced ``required``) made the command impossible to invoke. Exactly
|
|
551
|
+
one of ``backup_id`` / ``file_url`` must be supplied.
|
|
552
|
+
"""
|
|
553
|
+
if not backup_id and not file_url:
|
|
554
|
+
raise ValueError("restore requires either backup_id or file_url")
|
|
555
|
+
|
|
556
|
+
params: dict[str, Any] = {
|
|
557
|
+
"appId": app_id,
|
|
558
|
+
"projectId": project_id,
|
|
559
|
+
"autoEndMaintain": auto_end_maintain,
|
|
560
|
+
"backupCurrentVersion": backup_current_version,
|
|
561
|
+
"isRestoreNew": is_restore_new,
|
|
562
|
+
}
|
|
563
|
+
if backup_id:
|
|
564
|
+
# `id` is the backup-restore operation-log id (named `id` in the API).
|
|
565
|
+
params["id"] = backup_id
|
|
566
|
+
else:
|
|
567
|
+
params["fileUrl"] = file_url
|
|
568
|
+
params["fileName"] = file_name
|
|
569
|
+
params["containData"] = contain_data
|
|
570
|
+
return session.api_call("AppManagement", "Restore", params)
|
|
547
571
|
|
|
548
572
|
|
|
549
573
|
def export_apps(
|