hap-cli 0.8.3__tar.gz → 0.8.4__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.3 → hap_cli-0.8.4}/PKG-INFO +2 -2
- {hap_cli-0.8.3/hap_cli → hap_cli-0.8.4}/README.md +1 -1
- {hap_cli-0.8.3 → hap_cli-0.8.4/hap_cli}/README.md +1 -1
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/README_CN.md +1 -1
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/__init__.py +1 -1
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/app_cmd.py +0 -31
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/app.py +0 -49
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/locale/messages.json +0 -21
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_core.py +1 -1
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_org_id_cli.py +0 -1
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli.egg-info/PKG-INFO +2 -2
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli.egg-info/SOURCES.txt +0 -1
- hap_cli-0.8.3/hap_cli/tests/test_app_restore.py +0 -123
- {hap_cli-0.8.3 → hap_cli-0.8.4}/MANIFEST.in +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/app_live_tests/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/app_live_tests/__main__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/app_live_tests/config.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/app_live_tests/harness.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/app_live_tests/smoke.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/app_live_tests/state.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/app_editor_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/auth_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/calendar_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/chart_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/chat_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/chatbot_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/config_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/contact_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/department_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/group_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/icon_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/instance_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/node_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/optionset_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/page_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/post_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/record_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/region_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/role_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/upload_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/v3_registry.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/workflow_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/commands/worksheet_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/context.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/action_spec_adapter.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/auth.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/calendar_mod.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/chart.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/chat.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/chatbot.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/contact.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/control_type_codes.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/department.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/apply.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/componentlower.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/editspec.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/errors.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/fieldlower.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/jsonschema_mini.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/models.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/ops.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/planner.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/editor/reader.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/field_normalizer.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/field_spec_adapter.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/filter_translator.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/flow_node.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/global_meta.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/group.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/icon_index.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/instance.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/logger.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/optionset.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/page.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/post.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/record.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/response_crypto.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/role.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/role_perm_builder.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/session.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/token_crypto.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/upload.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/v3/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/v3/dispatcher.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/v3/render.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/v3/schema.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/view_spec_adapter.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/workflow.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/workflow_node_dsl.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/worksheet.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/core/worksheet_templates.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/hap_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/i18n.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/locale/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/locale/messages.schema.json +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/conftest.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_app_editor.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_app_export_usage.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_auth_prerelease.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_bug_036430.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_chart.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_config_cmd.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_destructive_confirm_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_full_e2e.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_global_meta.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_i18n.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_approval.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_approval_actions.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_calendar.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_destructive.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_misc.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_post.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_social.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_v3.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_workflow.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_integration_worksheet_extra.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_multi_profile.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_org_approval_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_org_id_docs.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_parameter_conventions.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_record_batch_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_record_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_semantic_types_registry.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_v3_dispatcher.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_v3_session.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_workflow_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/tests/test_worksheet_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/utils/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/utils/formatting.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/utils/options.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli/utils/parameter_mapping.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli.egg-info/dependency_links.txt +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli.egg-info/entry_points.txt +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli.egg-info/requires.txt +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/hap_cli.egg-info/top_level.txt +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/__main__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/_wftest.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/charts.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/cleanup.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/compiler.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/config.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/errors.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/executor.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/fields.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/hap.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/recording/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/recording/console.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/recording/jsonl.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/recording/mirror.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/recording/report.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/schema.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/seed/__init__.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/seed/cli.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/seed/executor.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/seed/template.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/selftest.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/smoke.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/step.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/steps.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/store.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/live_tests/workflow_dsl.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/setup.cfg +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/setup.py +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/INDEX.json +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/create_optionset.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/create_role.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/delete_optionset.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/delete_record.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/delete_role.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_app_info.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_details.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_list.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_logs.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_relations.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_regions.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_role_details.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/get_role_list.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/knowledge_search.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
- {hap_cli-0.8.3 → hap_cli-0.8.4}/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.8.
|
|
3
|
+
Version: 0.8.4
|
|
4
4
|
Summary: CLI harness for MingDAO HAP - Enterprise no-code platform
|
|
5
5
|
Author: hap-cli
|
|
6
6
|
License: Apache-2.0
|
|
@@ -155,7 +155,7 @@ discover every subcommand.
|
|
|
155
155
|
| `app create-section / edit-section / delete-section` | Section management |
|
|
156
156
|
| `app sort-sections / sort-worksheets` | Reorder sections / a section's worksheets |
|
|
157
157
|
| `app create-item` | Batch-create empty worksheets / custom pages |
|
|
158
|
-
| `app backup /
|
|
158
|
+
| `app backup / export / exports / backup-logs` | Backup & export |
|
|
159
159
|
| `app usage / logs` | Statistics and operation logs |
|
|
160
160
|
| `app role …` | Role CRUD, permissions, members, leave-all, applications |
|
|
161
161
|
| `app optionset …` | Option set CRUD and cross-app moves |
|
|
@@ -126,7 +126,7 @@ discover every subcommand.
|
|
|
126
126
|
| `app create-section / edit-section / delete-section` | Section management |
|
|
127
127
|
| `app sort-sections / sort-worksheets` | Reorder sections / a section's worksheets |
|
|
128
128
|
| `app create-item` | Batch-create empty worksheets / custom pages |
|
|
129
|
-
| `app backup /
|
|
129
|
+
| `app backup / export / exports / backup-logs` | Backup & export |
|
|
130
130
|
| `app usage / logs` | Statistics and operation logs |
|
|
131
131
|
| `app role …` | Role CRUD, permissions, members, leave-all, applications |
|
|
132
132
|
| `app optionset …` | Option set CRUD and cross-app moves |
|
|
@@ -126,7 +126,7 @@ discover every subcommand.
|
|
|
126
126
|
| `app create-section / edit-section / delete-section` | Section management |
|
|
127
127
|
| `app sort-sections / sort-worksheets` | Reorder sections / a section's worksheets |
|
|
128
128
|
| `app create-item` | Batch-create empty worksheets / custom pages |
|
|
129
|
-
| `app backup /
|
|
129
|
+
| `app backup / export / exports / backup-logs` | Backup & export |
|
|
130
130
|
| `app usage / logs` | Statistics and operation logs |
|
|
131
131
|
| `app role …` | Role CRUD, permissions, members, leave-all, applications |
|
|
132
132
|
| `app optionset …` | Option set CRUD and cross-app moves |
|
|
@@ -117,7 +117,7 @@ hap --json worksheet record list WORKSHEET_ID
|
|
|
117
117
|
| `app create-section / edit-section / delete-section` | 分组管理 |
|
|
118
118
|
| `app sort-sections / sort-worksheets` | 重排分组 / 分组内工作表顺序 |
|
|
119
119
|
| `app create-item` | 批量创建空白工作表/自定义页面 |
|
|
120
|
-
| `app backup /
|
|
120
|
+
| `app backup / export / exports / backup-logs` | 备份与导出 |
|
|
121
121
|
| `app usage / logs` | 使用统计与操作日志 |
|
|
122
122
|
| `app role …` | 角色 CRUD、权限、成员、leave-all、申请 |
|
|
123
123
|
| `app optionset …` | 选项集 CRUD 与跨应用迁移 |
|
|
@@ -410,37 +410,6 @@ def app_backup(ctx, app_id, org_id, no_data):
|
|
|
410
410
|
ctx.handle_error(e)
|
|
411
411
|
|
|
412
412
|
|
|
413
|
-
@app.command("restore")
|
|
414
|
-
@click.argument("app_id")
|
|
415
|
-
@org_id_option()
|
|
416
|
-
@click.option("--backup-id", "-b", default="", help="Restore from an existing backup (its ID)")
|
|
417
|
-
@click.option("--file-url", default="", help="Restore from an uploaded backup file (its URL)")
|
|
418
|
-
@click.option("--file-name", default="", help="File name to show for an uploaded backup file")
|
|
419
|
-
@click.option("--no-data", is_flag=True, help="Restore without data")
|
|
420
|
-
@click.option("--as-new", is_flag=True, help="Restore as a new app")
|
|
421
|
-
@pass_context
|
|
422
|
-
def app_restore(ctx, app_id, org_id, backup_id, file_url, file_name, no_data, as_new):
|
|
423
|
-
"""Restore an application, either from an existing backup or an uploaded file.
|
|
424
|
-
|
|
425
|
-
Provide exactly one source: --backup-id (an existing backup) or
|
|
426
|
-
--file-url (an uploaded backup file).
|
|
427
|
-
"""
|
|
428
|
-
try:
|
|
429
|
-
if bool(backup_id) == bool(file_url):
|
|
430
|
-
raise click.UsageError(
|
|
431
|
-
"Provide exactly one of --backup-id or --file-url."
|
|
432
|
-
)
|
|
433
|
-
session = ctx.get_session()
|
|
434
|
-
data = app_mod.restore_app(
|
|
435
|
-
session, app_id, require_api_project_id(session, org_id),
|
|
436
|
-
backup_id=backup_id, file_url=file_url, file_name=file_name,
|
|
437
|
-
contain_data=not no_data, is_restore_new=as_new,
|
|
438
|
-
)
|
|
439
|
-
ctx.output(data, lambda d: click.echo(f"Restore started: {d}"))
|
|
440
|
-
except Exception as e:
|
|
441
|
-
ctx.handle_error(e)
|
|
442
|
-
|
|
443
|
-
|
|
444
413
|
@app.command("export")
|
|
445
414
|
@click.argument("app_ids", nargs=-1, required=True)
|
|
446
415
|
@org_id_option()
|
|
@@ -620,55 +620,6 @@ def backup_app(
|
|
|
620
620
|
)
|
|
621
621
|
|
|
622
622
|
|
|
623
|
-
def restore_app(
|
|
624
|
-
session: Session,
|
|
625
|
-
app_id: str,
|
|
626
|
-
project_id: str,
|
|
627
|
-
backup_id: str = "",
|
|
628
|
-
file_url: str = "",
|
|
629
|
-
file_name: str = "",
|
|
630
|
-
contain_data: bool = True,
|
|
631
|
-
is_restore_new: bool = False,
|
|
632
|
-
auto_end_maintain: bool = False,
|
|
633
|
-
backup_current_version: bool = False,
|
|
634
|
-
) -> dict[str, Any]:
|
|
635
|
-
"""Restore an application from a backup log id or an uploaded file.
|
|
636
|
-
|
|
637
|
-
The HAP UI has two mutually exclusive restore modes; the API field
|
|
638
|
-
set differs between them, so we must send only one mode's fields:
|
|
639
|
-
|
|
640
|
-
- Backup-log restore (``src/pages/AppSettings/components/
|
|
641
|
-
appBackupRestore/components/BackupFiles.jsx``): sends ``id`` (the
|
|
642
|
-
backup-restore operation-log id) plus ``autoEndMaintain``,
|
|
643
|
-
``backupCurrentVersion`` and ``isRestoreNew`` — no ``fileUrl``.
|
|
644
|
-
- Uploaded-file restore (``.../BackupFromFiles.jsx``): sends
|
|
645
|
-
``fileUrl`` + ``fileName`` + ``containData`` plus the same three
|
|
646
|
-
flags — no ``id``.
|
|
647
|
-
|
|
648
|
-
Sending both at once (as an earlier wrapper did, with all three
|
|
649
|
-
forced ``required``) made the command impossible to invoke. Exactly
|
|
650
|
-
one of ``backup_id`` / ``file_url`` must be supplied.
|
|
651
|
-
"""
|
|
652
|
-
if not backup_id and not file_url:
|
|
653
|
-
raise ValueError("restore requires either backup_id or file_url")
|
|
654
|
-
|
|
655
|
-
params: dict[str, Any] = {
|
|
656
|
-
"appId": app_id,
|
|
657
|
-
"projectId": project_id,
|
|
658
|
-
"autoEndMaintain": auto_end_maintain,
|
|
659
|
-
"backupCurrentVersion": backup_current_version,
|
|
660
|
-
"isRestoreNew": is_restore_new,
|
|
661
|
-
}
|
|
662
|
-
if backup_id:
|
|
663
|
-
# `id` is the backup-restore operation-log id (named `id` in the API).
|
|
664
|
-
params["id"] = backup_id
|
|
665
|
-
else:
|
|
666
|
-
params["fileUrl"] = file_url
|
|
667
|
-
params["fileName"] = file_name
|
|
668
|
-
params["containData"] = contain_data
|
|
669
|
-
return session.api_call("AppManagement", "Restore", params)
|
|
670
|
-
|
|
671
|
-
|
|
672
623
|
def export_apps(
|
|
673
624
|
session: Session,
|
|
674
625
|
project_id: str,
|
|
@@ -900,27 +900,6 @@
|
|
|
900
900
|
"app optionset update --options-json": {
|
|
901
901
|
"en": "Option list. [JSON value] [required]"
|
|
902
902
|
},
|
|
903
|
-
"app restore": {
|
|
904
|
-
"en": "Restore an application from backup."
|
|
905
|
-
},
|
|
906
|
-
"app restore --as-new": {
|
|
907
|
-
"en": "Restore as a new app"
|
|
908
|
-
},
|
|
909
|
-
"app restore --backup-id": {
|
|
910
|
-
"en": "Backup ID"
|
|
911
|
-
},
|
|
912
|
-
"app restore --file-name": {
|
|
913
|
-
"en": "Backup file name"
|
|
914
|
-
},
|
|
915
|
-
"app restore --file-url": {
|
|
916
|
-
"en": "Backup file URL"
|
|
917
|
-
},
|
|
918
|
-
"app restore --no-data": {
|
|
919
|
-
"en": "Restore without data"
|
|
920
|
-
},
|
|
921
|
-
"app restore --org-id": {
|
|
922
|
-
"en": "Organization ID"
|
|
923
|
-
},
|
|
924
903
|
"app role": {
|
|
925
904
|
"en": "Role management."
|
|
926
905
|
},
|
|
@@ -6388,7 +6388,7 @@ class TestShellCompletion:
|
|
|
6388
6388
|
comp = BashComplete(cli, {}, "hap", "_HAP_COMPLETE")
|
|
6389
6389
|
items = comp.get_completions(["app"], "r")
|
|
6390
6390
|
values = {item.value for item in items}
|
|
6391
|
-
# app has a `role` subcommand
|
|
6391
|
+
# app has a `role` subcommand that completes from the "r" prefix
|
|
6392
6392
|
assert "role" in values
|
|
6393
6393
|
|
|
6394
6394
|
def test_completion_engine_completes_option_names(self):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hap-cli
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.4
|
|
4
4
|
Summary: CLI harness for MingDAO HAP - Enterprise no-code platform
|
|
5
5
|
Author: hap-cli
|
|
6
6
|
License: Apache-2.0
|
|
@@ -155,7 +155,7 @@ discover every subcommand.
|
|
|
155
155
|
| `app create-section / edit-section / delete-section` | Section management |
|
|
156
156
|
| `app sort-sections / sort-worksheets` | Reorder sections / a section's worksheets |
|
|
157
157
|
| `app create-item` | Batch-create empty worksheets / custom pages |
|
|
158
|
-
| `app backup /
|
|
158
|
+
| `app backup / export / exports / backup-logs` | Backup & export |
|
|
159
159
|
| `app usage / logs` | Statistics and operation logs |
|
|
160
160
|
| `app role …` | Role CRUD, permissions, members, leave-all, applications |
|
|
161
161
|
| `app optionset …` | Option set CRUD and cross-app moves |
|
|
@@ -103,7 +103,6 @@ hap_cli/tests/__init__.py
|
|
|
103
103
|
hap_cli/tests/conftest.py
|
|
104
104
|
hap_cli/tests/test_app_editor.py
|
|
105
105
|
hap_cli/tests/test_app_export_usage.py
|
|
106
|
-
hap_cli/tests/test_app_restore.py
|
|
107
106
|
hap_cli/tests/test_auth_prerelease.py
|
|
108
107
|
hap_cli/tests/test_bug_036430.py
|
|
109
108
|
hap_cli/tests/test_chart.py
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"""Bugfix coverage for `hap app restore` (bug #036418).
|
|
2
|
-
|
|
3
|
-
The wrapper forced ``--backup-id``, ``--file-url`` and ``--file-name`` to
|
|
4
|
-
all be ``required`` at once, but the HAP UI actually has two mutually
|
|
5
|
-
exclusive restore modes (traced from pd-openweb):
|
|
6
|
-
|
|
7
|
-
- Restore from an existing backup log
|
|
8
|
-
(``src/pages/AppSettings/components/appBackupRestore/components/BackupFiles.jsx``):
|
|
9
|
-
sends ``{appId, projectId, id, autoEndMaintain, backupCurrentVersion,
|
|
10
|
-
isRestoreNew}`` — NO fileUrl/fileName.
|
|
11
|
-
- Restore from an uploaded file
|
|
12
|
-
(``.../BackupFromFiles.jsx``): sends ``{appId, projectId, fileUrl,
|
|
13
|
-
fileName, autoEndMaintain, backupCurrentVersion, isRestoreNew,
|
|
14
|
-
containData}`` — NO id.
|
|
15
|
-
|
|
16
|
-
So the user only ever has one of (backup-id) or (file-url) on hand;
|
|
17
|
-
requiring both made the command impossible to run.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from unittest.mock import MagicMock, patch
|
|
21
|
-
|
|
22
|
-
import pytest
|
|
23
|
-
from click.testing import CliRunner
|
|
24
|
-
|
|
25
|
-
from hap_cli.core import app as app_mod
|
|
26
|
-
from hap_cli.core.session import Session
|
|
27
|
-
from hap_cli.hap_cli import cli
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def _mock_response(data, state=1):
|
|
31
|
-
resp = MagicMock()
|
|
32
|
-
resp.status_code = 200
|
|
33
|
-
resp.json.return_value = {"data": data, "state": state}
|
|
34
|
-
resp.raise_for_status = MagicMock()
|
|
35
|
-
return resp
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
@pytest.fixture
|
|
39
|
-
def mock_session():
|
|
40
|
-
return Session(server_url="https://test.mingdao.com", auth_token="tok123")
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
@pytest.fixture
|
|
44
|
-
def logged_in(monkeypatch):
|
|
45
|
-
sess = Session(server_url="https://test.mingdao.com", auth_token="tok123")
|
|
46
|
-
sess.default_project_id = "org-default"
|
|
47
|
-
monkeypatch.setattr("hap_cli.context.Session.load", lambda *a, **k: sess)
|
|
48
|
-
return sess
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def _posted_body(mock_post):
|
|
52
|
-
return mock_post.call_args[1]["json"]
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class TestRestoreCore:
|
|
56
|
-
@patch("hap_cli.core.session.requests.post")
|
|
57
|
-
def test_backup_mode_sends_id_not_file(self, mock_post, mock_session):
|
|
58
|
-
mock_post.return_value = _mock_response(True)
|
|
59
|
-
app_mod.restore_app(
|
|
60
|
-
mock_session, "app1", "org1", backup_id="bk1", is_restore_new=True
|
|
61
|
-
)
|
|
62
|
-
body = _posted_body(mock_post)
|
|
63
|
-
assert body["id"] == "bk1"
|
|
64
|
-
assert "fileUrl" not in body
|
|
65
|
-
assert "fileName" not in body
|
|
66
|
-
assert body["appId"] == "app1"
|
|
67
|
-
assert body["projectId"] == "org1"
|
|
68
|
-
assert body["isRestoreNew"] is True
|
|
69
|
-
assert body["autoEndMaintain"] is False
|
|
70
|
-
assert body["backupCurrentVersion"] is False
|
|
71
|
-
|
|
72
|
-
@patch("hap_cli.core.session.requests.post")
|
|
73
|
-
def test_file_mode_sends_file_not_id(self, mock_post, mock_session):
|
|
74
|
-
mock_post.return_value = _mock_response(True)
|
|
75
|
-
app_mod.restore_app(
|
|
76
|
-
mock_session,
|
|
77
|
-
"app1",
|
|
78
|
-
"org1",
|
|
79
|
-
file_url="https://x/y.mdy",
|
|
80
|
-
file_name="y.mdy",
|
|
81
|
-
contain_data=True,
|
|
82
|
-
)
|
|
83
|
-
body = _posted_body(mock_post)
|
|
84
|
-
assert body["fileUrl"] == "https://x/y.mdy"
|
|
85
|
-
assert body["fileName"] == "y.mdy"
|
|
86
|
-
assert body["containData"] is True
|
|
87
|
-
assert "id" not in body
|
|
88
|
-
assert body["autoEndMaintain"] is False
|
|
89
|
-
assert body["backupCurrentVersion"] is False
|
|
90
|
-
|
|
91
|
-
def test_requires_one_mode(self, mock_session):
|
|
92
|
-
with pytest.raises(ValueError):
|
|
93
|
-
app_mod.restore_app(mock_session, "app1", "org1")
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
class TestRestoreCli:
|
|
97
|
-
def test_backup_id_only_is_accepted(self, logged_in):
|
|
98
|
-
with patch("hap_cli.core.session.requests.post") as mock_post:
|
|
99
|
-
mock_post.return_value = _mock_response(True)
|
|
100
|
-
res = CliRunner().invoke(
|
|
101
|
-
cli, ["app", "restore", "app1", "--backup-id", "bk1"]
|
|
102
|
-
)
|
|
103
|
-
assert res.exit_code == 0, res.output
|
|
104
|
-
assert _posted_body(mock_post)["id"] == "bk1"
|
|
105
|
-
|
|
106
|
-
def test_file_url_only_is_accepted(self, logged_in):
|
|
107
|
-
with patch("hap_cli.core.session.requests.post") as mock_post:
|
|
108
|
-
mock_post.return_value = _mock_response(True)
|
|
109
|
-
res = CliRunner().invoke(
|
|
110
|
-
cli,
|
|
111
|
-
[
|
|
112
|
-
"app", "restore", "app1",
|
|
113
|
-
"--file-url", "https://x/y.mdy",
|
|
114
|
-
"--file-name", "y.mdy",
|
|
115
|
-
],
|
|
116
|
-
)
|
|
117
|
-
assert res.exit_code == 0, res.output
|
|
118
|
-
assert _posted_body(mock_post)["fileUrl"] == "https://x/y.mdy"
|
|
119
|
-
|
|
120
|
-
def test_neither_mode_errors(self, logged_in):
|
|
121
|
-
res = CliRunner().invoke(cli, ["app", "restore", "app1"])
|
|
122
|
-
assert res.exit_code != 0
|
|
123
|
-
assert "backup-id" in res.output or "file-url" in res.output
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json
RENAMED
|
File without changes
|
{hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json
RENAMED
|
File without changes
|
{hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json
RENAMED
|
File without changes
|
{hap_cli-0.8.3 → hap_cli-0.8.4}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|