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.
Files changed (208) hide show
  1. {hap_cli-0.8.0 → hap_cli-0.8.1}/PKG-INFO +1 -1
  2. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/__init__.py +1 -1
  3. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/app_cmd.py +14 -6
  4. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/chart_cmd.py +1 -2
  5. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/config_cmd.py +19 -2
  6. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/page_cmd.py +7 -4
  7. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/record_cmd.py +14 -7
  8. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/worksheet_cmd.py +10 -4
  9. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/app.py +40 -16
  10. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/auth.py +175 -29
  11. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/chart.py +5 -0
  12. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/chat.py +20 -19
  13. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/global_meta.py +25 -0
  14. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/page.py +9 -3
  15. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/record.py +131 -20
  16. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/session.py +14 -0
  17. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/worksheet.py +36 -4
  18. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/conftest.py +52 -0
  19. hap_cli-0.8.1/hap_cli/tests/test_app_restore.py +123 -0
  20. hap_cli-0.8.1/hap_cli/tests/test_bug_036430.py +167 -0
  21. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_chart.py +14 -0
  22. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_config_cmd.py +23 -0
  23. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_core.py +189 -45
  24. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_worksheet_extra.py +8 -4
  25. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_session.py +25 -0
  26. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/PKG-INFO +1 -1
  27. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/SOURCES.txt +2 -0
  28. {hap_cli-0.8.0 → hap_cli-0.8.1}/MANIFEST.in +0 -0
  29. {hap_cli-0.8.0 → hap_cli-0.8.1}/README.md +0 -0
  30. {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/__init__.py +0 -0
  31. {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/__main__.py +0 -0
  32. {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/config.py +0 -0
  33. {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/harness.py +0 -0
  34. {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/smoke.py +0 -0
  35. {hap_cli-0.8.0 → hap_cli-0.8.1}/app_live_tests/state.py +0 -0
  36. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/README.md +0 -0
  37. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/README_CN.md +0 -0
  38. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/__init__.py +0 -0
  39. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/app_editor_cmd.py +0 -0
  40. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/auth_cmd.py +0 -0
  41. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/calendar_cmd.py +0 -0
  42. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/chat_cmd.py +0 -0
  43. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/chatbot_cmd.py +0 -0
  44. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/contact_cmd.py +0 -0
  45. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/department_cmd.py +0 -0
  46. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/group_cmd.py +0 -0
  47. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/icon_cmd.py +0 -0
  48. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/instance_cmd.py +0 -0
  49. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/node_cmd.py +0 -0
  50. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/optionset_cmd.py +0 -0
  51. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/post_cmd.py +0 -0
  52. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/region_cmd.py +0 -0
  53. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/role_cmd.py +0 -0
  54. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/upload_cmd.py +0 -0
  55. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/v3_registry.py +0 -0
  56. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/commands/workflow_cmd.py +0 -0
  57. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/context.py +0 -0
  58. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/__init__.py +0 -0
  59. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/action_spec_adapter.py +0 -0
  60. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/calendar_mod.py +0 -0
  61. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/chatbot.py +0 -0
  62. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/contact.py +0 -0
  63. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/control_type_codes.py +0 -0
  64. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/department.py +0 -0
  65. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/__init__.py +0 -0
  66. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
  67. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
  68. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/apply.py +0 -0
  69. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/componentlower.py +0 -0
  70. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/editspec.py +0 -0
  71. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/errors.py +0 -0
  72. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/fieldlower.py +0 -0
  73. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/jsonschema_mini.py +0 -0
  74. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/models.py +0 -0
  75. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/ops.py +0 -0
  76. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/planner.py +0 -0
  77. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/editor/reader.py +0 -0
  78. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/field_normalizer.py +0 -0
  79. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/field_spec_adapter.py +0 -0
  80. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/filter_translator.py +0 -0
  81. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/flow_node.py +0 -0
  82. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/group.py +0 -0
  83. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/icon_index.py +0 -0
  84. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/instance.py +0 -0
  85. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/logger.py +0 -0
  86. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/optionset.py +0 -0
  87. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/post.py +0 -0
  88. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/response_crypto.py +0 -0
  89. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/role.py +0 -0
  90. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/role_perm_builder.py +0 -0
  91. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/token_crypto.py +0 -0
  92. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/upload.py +0 -0
  93. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/__init__.py +0 -0
  94. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/dispatcher.py +0 -0
  95. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/render.py +0 -0
  96. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/v3/schema.py +0 -0
  97. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/view_spec_adapter.py +0 -0
  98. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/workflow.py +0 -0
  99. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/workflow_node_dsl.py +0 -0
  100. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/core/worksheet_templates.py +0 -0
  101. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/hap_cli.py +0 -0
  102. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/i18n.py +0 -0
  103. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/locale/__init__.py +0 -0
  104. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/locale/messages.json +0 -0
  105. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/locale/messages.schema.json +0 -0
  106. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/__init__.py +0 -0
  107. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_app_editor.py +0 -0
  108. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_app_export_usage.py +0 -0
  109. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_auth_prerelease.py +0 -0
  110. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_full_e2e.py +0 -0
  111. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_global_meta.py +0 -0
  112. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_i18n.py +0 -0
  113. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration.py +0 -0
  114. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_approval.py +0 -0
  115. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_approval_actions.py +0 -0
  116. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_calendar.py +0 -0
  117. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_destructive.py +0 -0
  118. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_misc.py +0 -0
  119. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_post.py +0 -0
  120. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_social.py +0 -0
  121. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_v3.py +0 -0
  122. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_integration_workflow.py +0 -0
  123. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_multi_profile.py +0 -0
  124. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_org_id_cli.py +0 -0
  125. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_org_id_docs.py +0 -0
  126. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_parameter_conventions.py +0 -0
  127. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
  128. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
  129. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_dispatcher.py +0 -0
  130. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
  131. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
  132. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
  133. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/__init__.py +0 -0
  134. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/formatting.py +0 -0
  135. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/options.py +0 -0
  136. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli/utils/parameter_mapping.py +0 -0
  137. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/dependency_links.txt +0 -0
  138. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/entry_points.txt +0 -0
  139. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/requires.txt +0 -0
  140. {hap_cli-0.8.0 → hap_cli-0.8.1}/hap_cli.egg-info/top_level.txt +0 -0
  141. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/__init__.py +0 -0
  142. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/__main__.py +0 -0
  143. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/_wftest.py +0 -0
  144. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/charts.py +0 -0
  145. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/cleanup.py +0 -0
  146. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/compiler.py +0 -0
  147. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/config.py +0 -0
  148. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/errors.py +0 -0
  149. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/executor.py +0 -0
  150. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/fields.py +0 -0
  151. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/hap.py +0 -0
  152. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/__init__.py +0 -0
  153. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/console.py +0 -0
  154. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/jsonl.py +0 -0
  155. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/mirror.py +0 -0
  156. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/recording/report.py +0 -0
  157. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/schema.py +0 -0
  158. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/__init__.py +0 -0
  159. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/cli.py +0 -0
  160. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/executor.py +0 -0
  161. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/seed/template.py +0 -0
  162. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/selftest.py +0 -0
  163. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/smoke.py +0 -0
  164. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/step.py +0 -0
  165. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/steps.py +0 -0
  166. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/store.py +0 -0
  167. {hap_cli-0.8.0 → hap_cli-0.8.1}/live_tests/workflow_dsl.py +0 -0
  168. {hap_cli-0.8.0 → hap_cli-0.8.1}/setup.cfg +0 -0
  169. {hap_cli-0.8.0 → hap_cli-0.8.1}/setup.py +0 -0
  170. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/application.schema.json +0 -0
  171. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/chatbot.schema.json +0 -0
  172. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json +0 -0
  173. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json +0 -0
  174. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/custom-page.schema.json +0 -0
  175. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json +0 -0
  176. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json +0 -0
  177. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/node.schema.json +0 -0
  178. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/role.schema.json +0 -0
  179. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/view.schema.json +0 -0
  180. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/workflow.schema.json +0 -0
  181. {hap_cli-0.8.0 → hap_cli-0.8.1}/skills/hap-cli-app-editor/scripts/editspec/worksheet.schema.json +0 -0
  182. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/INDEX.json +0 -0
  183. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
  184. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
  185. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/create_optionset.yaml +0 -0
  186. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/create_role.yaml +0 -0
  187. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_optionset.yaml +0 -0
  188. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_record.yaml +0 -0
  189. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_role.yaml +0 -0
  190. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
  191. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_app_info.yaml +0 -0
  192. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
  193. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
  194. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
  195. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_details.yaml +0 -0
  196. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
  197. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_list.yaml +0 -0
  198. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_logs.yaml +0 -0
  199. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
  200. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_relations.yaml +0 -0
  201. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
  202. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_regions.yaml +0 -0
  203. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_role_details.yaml +0 -0
  204. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/get_role_list.yaml +0 -0
  205. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/knowledge_search.yaml +0 -0
  206. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
  207. {hap_cli-0.8.0 → hap_cli-0.8.1}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
  208. {hap_cli-0.8.0 → hap_cli-0.8.1}/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.0
3
+ Version: 0.8.1
4
4
  Summary: CLI harness for MingDAO HAP - Enterprise no-code platform
5
5
  Author: hap-cli
6
6
  License: Apache-2.0
@@ -1,3 +1,3 @@
1
1
  """CLI harness for MingDAO HAP (hap-cli)."""
2
2
 
3
- __version__ = "0.8.0"
3
+ __version__ = "0.8.1"
@@ -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", required=True, help="Backup ID")
386
- @click.option("--file-url", required=True, help="Backup file URL")
387
- @click.option("--file-name", required=True, help="Backup 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), backup_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. See pd-openweb Statistics docs "
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("app_id")
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, app_id, desc, config_json, adjust_screen, url_params):
257
- """Patch custom-page metadata (Custom.updatePage)."""
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
- app_id=app_id,
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 = _parse_fields(field)
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 = _parse_fields(field)
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, row_id, source_type=7,
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, source_type=7, app_id=app_id,
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, source_type=7)
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
- return session.api_call(
536
- "AppManagement", "Restore",
537
- {
538
- "appId": app_id,
539
- "projectId": project_id,
540
- "id": backup_id,
541
- "fileUrl": file_url,
542
- "fileName": file_name,
543
- "containData": contain_data,
544
- "isRestoreNew": is_restore_new,
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(