hap-cli 0.8.2__tar.gz → 0.8.3__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 (207) hide show
  1. {hap_cli-0.8.2 → hap_cli-0.8.3}/PKG-INFO +1 -1
  2. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/__init__.py +1 -1
  3. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/node_cmd.py +7 -3
  4. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/flow_node.py +24 -8
  5. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/record.py +14 -1
  6. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_core.py +109 -11
  7. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/PKG-INFO +1 -1
  8. {hap_cli-0.8.2 → hap_cli-0.8.3}/MANIFEST.in +0 -0
  9. {hap_cli-0.8.2 → hap_cli-0.8.3}/README.md +0 -0
  10. {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/__init__.py +0 -0
  11. {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/__main__.py +0 -0
  12. {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/config.py +0 -0
  13. {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/harness.py +0 -0
  14. {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/smoke.py +0 -0
  15. {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/state.py +0 -0
  16. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/README.md +0 -0
  17. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/README_CN.md +0 -0
  18. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/__init__.py +0 -0
  19. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/app_cmd.py +0 -0
  20. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/app_editor_cmd.py +0 -0
  21. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/auth_cmd.py +0 -0
  22. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/calendar_cmd.py +0 -0
  23. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/chart_cmd.py +0 -0
  24. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/chat_cmd.py +0 -0
  25. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/chatbot_cmd.py +0 -0
  26. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/config_cmd.py +0 -0
  27. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/contact_cmd.py +0 -0
  28. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/department_cmd.py +0 -0
  29. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/group_cmd.py +0 -0
  30. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/icon_cmd.py +0 -0
  31. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/instance_cmd.py +0 -0
  32. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/optionset_cmd.py +0 -0
  33. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/page_cmd.py +0 -0
  34. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/post_cmd.py +0 -0
  35. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/record_cmd.py +0 -0
  36. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/region_cmd.py +0 -0
  37. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/role_cmd.py +0 -0
  38. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/upload_cmd.py +0 -0
  39. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/v3_registry.py +0 -0
  40. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/workflow_cmd.py +0 -0
  41. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/worksheet_cmd.py +0 -0
  42. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/context.py +0 -0
  43. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/__init__.py +0 -0
  44. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/action_spec_adapter.py +0 -0
  45. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/app.py +0 -0
  46. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/auth.py +0 -0
  47. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/calendar_mod.py +0 -0
  48. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/chart.py +0 -0
  49. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/chat.py +0 -0
  50. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/chatbot.py +0 -0
  51. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/contact.py +0 -0
  52. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/control_type_codes.py +0 -0
  53. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/department.py +0 -0
  54. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/__init__.py +0 -0
  55. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
  56. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
  57. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/apply.py +0 -0
  58. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/componentlower.py +0 -0
  59. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/editspec.py +0 -0
  60. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/errors.py +0 -0
  61. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/fieldlower.py +0 -0
  62. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/jsonschema_mini.py +0 -0
  63. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/models.py +0 -0
  64. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/ops.py +0 -0
  65. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/planner.py +0 -0
  66. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/reader.py +0 -0
  67. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/field_normalizer.py +0 -0
  68. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/field_spec_adapter.py +0 -0
  69. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/filter_translator.py +0 -0
  70. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/global_meta.py +0 -0
  71. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/group.py +0 -0
  72. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/icon_index.py +0 -0
  73. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/instance.py +0 -0
  74. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/logger.py +0 -0
  75. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/optionset.py +0 -0
  76. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/page.py +0 -0
  77. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/post.py +0 -0
  78. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/response_crypto.py +0 -0
  79. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/role.py +0 -0
  80. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/role_perm_builder.py +0 -0
  81. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/session.py +0 -0
  82. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/token_crypto.py +0 -0
  83. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/upload.py +0 -0
  84. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/__init__.py +0 -0
  85. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/dispatcher.py +0 -0
  86. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/render.py +0 -0
  87. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/schema.py +0 -0
  88. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/view_spec_adapter.py +0 -0
  89. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/workflow.py +0 -0
  90. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/workflow_node_dsl.py +0 -0
  91. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/worksheet.py +0 -0
  92. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/worksheet_templates.py +0 -0
  93. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/hap_cli.py +0 -0
  94. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/i18n.py +0 -0
  95. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/locale/__init__.py +0 -0
  96. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/locale/messages.json +0 -0
  97. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/locale/messages.schema.json +0 -0
  98. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/__init__.py +0 -0
  99. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/conftest.py +0 -0
  100. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_app_editor.py +0 -0
  101. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_app_export_usage.py +0 -0
  102. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_app_restore.py +0 -0
  103. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_auth_prerelease.py +0 -0
  104. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_bug_036430.py +0 -0
  105. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_chart.py +0 -0
  106. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_config_cmd.py +0 -0
  107. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_destructive_confirm_cli.py +0 -0
  108. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_full_e2e.py +0 -0
  109. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_global_meta.py +0 -0
  110. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_i18n.py +0 -0
  111. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration.py +0 -0
  112. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_approval.py +0 -0
  113. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_approval_actions.py +0 -0
  114. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_calendar.py +0 -0
  115. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_destructive.py +0 -0
  116. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_misc.py +0 -0
  117. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_post.py +0 -0
  118. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_social.py +0 -0
  119. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_v3.py +0 -0
  120. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_workflow.py +0 -0
  121. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_worksheet_extra.py +0 -0
  122. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_multi_profile.py +0 -0
  123. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_org_approval_v3_semantic_cli.py +0 -0
  124. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_org_id_cli.py +0 -0
  125. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_org_id_docs.py +0 -0
  126. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_parameter_conventions.py +0 -0
  127. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
  128. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_record_batch_v3_semantic_cli.py +0 -0
  129. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_record_v3_semantic_cli.py +0 -0
  130. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_semantic_types_registry.py +0 -0
  131. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
  132. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_dispatcher.py +0 -0
  133. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
  134. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_session.py +0 -0
  135. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
  136. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_workflow_v3_semantic_cli.py +0 -0
  137. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
  138. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_worksheet_v3_semantic_cli.py +0 -0
  139. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/__init__.py +0 -0
  140. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/formatting.py +0 -0
  141. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/options.py +0 -0
  142. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/parameter_mapping.py +0 -0
  143. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/SOURCES.txt +0 -0
  144. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/dependency_links.txt +0 -0
  145. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/entry_points.txt +0 -0
  146. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/requires.txt +0 -0
  147. {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/top_level.txt +0 -0
  148. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/__init__.py +0 -0
  149. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/__main__.py +0 -0
  150. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/_wftest.py +0 -0
  151. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/charts.py +0 -0
  152. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/cleanup.py +0 -0
  153. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/compiler.py +0 -0
  154. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/config.py +0 -0
  155. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/errors.py +0 -0
  156. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/executor.py +0 -0
  157. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/fields.py +0 -0
  158. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/hap.py +0 -0
  159. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/__init__.py +0 -0
  160. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/console.py +0 -0
  161. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/jsonl.py +0 -0
  162. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/mirror.py +0 -0
  163. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/report.py +0 -0
  164. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/schema.py +0 -0
  165. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/__init__.py +0 -0
  166. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/cli.py +0 -0
  167. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/executor.py +0 -0
  168. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/template.py +0 -0
  169. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/selftest.py +0 -0
  170. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/smoke.py +0 -0
  171. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/step.py +0 -0
  172. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/steps.py +0 -0
  173. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/store.py +0 -0
  174. {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/workflow_dsl.py +0 -0
  175. {hap_cli-0.8.2 → hap_cli-0.8.3}/setup.cfg +0 -0
  176. {hap_cli-0.8.2 → hap_cli-0.8.3}/setup.py +0 -0
  177. {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json +0 -0
  178. {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json +0 -0
  179. {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json +0 -0
  180. {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json +0 -0
  181. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/INDEX.json +0 -0
  182. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
  183. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
  184. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/create_optionset.yaml +0 -0
  185. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/create_role.yaml +0 -0
  186. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_optionset.yaml +0 -0
  187. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_record.yaml +0 -0
  188. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_role.yaml +0 -0
  189. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
  190. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_app_info.yaml +0 -0
  191. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
  192. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
  193. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
  194. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_details.yaml +0 -0
  195. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
  196. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_list.yaml +0 -0
  197. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_logs.yaml +0 -0
  198. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
  199. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_relations.yaml +0 -0
  200. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
  201. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_regions.yaml +0 -0
  202. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_role_details.yaml +0 -0
  203. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_role_list.yaml +0 -0
  204. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/knowledge_search.yaml +0 -0
  205. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
  206. {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
  207. {hap_cli-0.8.2 → hap_cli-0.8.3}/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.2
3
+ Version: 0.8.3
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.2"
3
+ __version__ = "0.8.3"
@@ -372,12 +372,16 @@ def node_form_property(ctx, process_id, node_id):
372
372
 
373
373
  @node.command("sub-processes")
374
374
  @click.argument("process_id")
375
+ @click.argument("node_id")
375
376
  @pass_context
376
- def node_sub_processes(ctx, process_id):
377
- """List available sub-processes."""
377
+ def node_sub_processes(ctx, process_id, node_id):
378
+ """List sub-processes available to a sub-process node.
379
+
380
+ NODE_ID is the node being configured.
381
+ """
378
382
  try:
379
383
  session = ctx.get_session()
380
- data = node_mod.get_sub_process_list(session, process_id)
384
+ data = node_mod.get_sub_process_list(session, process_id, select_node_id=node_id)
381
385
  ctx.output(data, lambda d: output_json(d))
382
386
  except Exception as e:
383
387
  ctx.handle_error(e)
@@ -274,7 +274,9 @@ def get_node_detail(
274
274
  data["appId"] = app_id
275
275
  if instance_id:
276
276
  data["instanceId"] = instance_id
277
- return session.workflow_call("flowNode/getNodeDetail", data)
277
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
278
+ # for this action; POSTing it returns 404 Not Found.
279
+ return session.workflow_call("flowNode/getNodeDetail", data, method="GET")
278
280
 
279
281
 
280
282
  # ── Node Update ──────────────────────────────────────────────────────────
@@ -572,7 +574,9 @@ def get_webhook_data(
572
574
  data: dict[str, Any] = {"processId": process_id, "nodeId": node_id}
573
575
  if select_node_id:
574
576
  data["selectNodeId"] = select_node_id
575
- return session.workflow_call("flowNode/getWebHookData", data)
577
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
578
+ # for this action; POSTing it returns 404 Not Found.
579
+ return session.workflow_call("flowNode/getWebHookData", data, method="GET")
576
580
 
577
581
 
578
582
  # ── Utilities ────────────────────────────────────────────────────────────
@@ -617,7 +621,9 @@ def get_node_form_property(
617
621
  data: dict[str, Any] = {"processId": process_id, "nodeId": node_id}
618
622
  if select_node_id:
619
623
  data["selectNodeId"] = select_node_id
620
- return session.workflow_call("flowNode/getNodeFormProperty", data)
624
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
625
+ # for this action; POSTing it returns 404 Not Found.
626
+ return session.workflow_call("flowNode/getNodeFormProperty", data, method="GET")
621
627
 
622
628
 
623
629
  def get_sub_process_list(
@@ -630,7 +636,9 @@ def get_sub_process_list(
630
636
  Args:
631
637
  session: Active session
632
638
  process_id: Process ID
633
- select_node_id: Context node
639
+ select_node_id: Context node. flowNode.js marks ``selectNodeId``
640
+ as required (``*选中节点ID``); omitting it makes the server
641
+ answer code 2000 "节点不存在".
634
642
 
635
643
  Returns:
636
644
  Sub-process list
@@ -638,7 +646,9 @@ def get_sub_process_list(
638
646
  data: dict[str, Any] = {"processId": process_id}
639
647
  if select_node_id:
640
648
  data["selectNodeId"] = select_node_id
641
- return session.workflow_call("flowNode/getSubProcessList", data)
649
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
650
+ # for this action; POSTing it returns 404 Not Found.
651
+ return session.workflow_call("flowNode/getSubProcessList", data, method="GET")
642
652
 
643
653
 
644
654
  # ── Code Templates ───────────────────────────────────────────────────────
@@ -672,7 +682,9 @@ def get_code_template_list(
672
682
  data["source"] = source
673
683
  if template_type:
674
684
  data["type"] = template_type
675
- return session.workflow_call("flowNode/getCodeTemplateList", data)
685
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
686
+ # for this action; POSTing it returns 404 Not Found.
687
+ return session.workflow_call("flowNode/getCodeTemplateList", data, method="GET")
676
688
 
677
689
 
678
690
  def create_code_template(
@@ -774,7 +786,9 @@ def get_flow_app_dtos(
774
786
  data["enumDefault"] = enum_default
775
787
  if field_type:
776
788
  data["type"] = field_type
777
- return session.workflow_call("flowNode/getFlowAppDtos", data)
789
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
790
+ # for this action; POSTing it returns 404 Not Found.
791
+ return session.workflow_call("flowNode/getFlowAppDtos", data, method="GET")
778
792
 
779
793
 
780
794
  def get_start_event_deploy(
@@ -809,7 +823,9 @@ def get_start_event_deploy(
809
823
  data["controlId"] = control_id
810
824
  if select_node_id:
811
825
  data["selectNodeId"] = select_node_id
812
- return session.workflow_call("flowNode/getStartEventDeploy", data)
826
+ # Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
827
+ # for this action; POSTing it returns 404 Not Found.
828
+ return session.workflow_call("flowNode/getStartEventDeploy", data, method="GET")
813
829
 
814
830
 
815
831
  # ── Data Processing Convenience Functions ────────────────────────────────
@@ -56,13 +56,26 @@ def _legacy_cell_value(ctrl: dict[str, Any], value: Any) -> str:
56
56
  if t == 10: # MULTI_SELECT
57
57
  return json.dumps(_resolve_option_keys(ctrl, value), ensure_ascii=False)
58
58
 
59
- if t == 29: # RELATE_SHEET -> [{"sid": rowId}, ...]
59
+ if t in (29, 35): # RELATE_SHEET / CASCADING_SELECT -> [{"sid": rowId}, ...]
60
+ # Cascade (35) is a relation to a row in another worksheet, persisted
61
+ # the same way as a plain relate (29): an array of {"sid": rowId}. A
62
+ # bare rowId makes the server answer "服务异常" (bug #642cc8).
60
63
  if isinstance(value, (list, tuple)):
61
64
  ids = [str(v) for v in value]
62
65
  else:
63
66
  ids = [s for s in str(value).split(",") if s != ""]
64
67
  return json.dumps([{"sid": rid} for rid in ids], ensure_ascii=False)
65
68
 
69
+ if t == 48: # ORG_ROLE -> [{"organizeId": id}, ...]
70
+ # Mirrors DEPARTMENT (27): the legacy AddWorksheetRow takes an array
71
+ # of {"organizeId": id} objects; organizeName is display-only and the
72
+ # server resolves it from the id. A bare organizeId is rejected with
73
+ # "服务异常" (bug #642cc8). See pd-openweb CellControls/OrgRole.jsx.
74
+ ids = value if isinstance(value, (list, tuple)) else \
75
+ [s for s in str(value).split(",") if s != ""]
76
+ return json.dumps([{"organizeId": str(i)} for i in ids],
77
+ ensure_ascii=False)
78
+
66
79
  if t == 26: # USER_PICKER
67
80
  ids = value if isinstance(value, (list, tuple)) else \
68
81
  [s for s in str(value).split(",") if s != ""]
@@ -486,6 +486,38 @@ class TestRecord:
486
486
  # endpoint is the legacy AddWorksheetRow
487
487
  assert mock_post.call_args[0][0].endswith("/Worksheet/AddWorksheetRow")
488
488
 
489
+ @patch("hap_cli.core.worksheet.get_worksheet_controls")
490
+ @patch("hap_cli.core.session.requests.post")
491
+ def test_legacy_batch_create_serializes_orgrole_and_cascade(
492
+ self, mock_post, mock_controls, mock_session
493
+ ):
494
+ # Org-role (48) and cascading-select (35) cells must be wrapped in
495
+ # the wire shapes the legacy AddWorksheetRow expects — a bare id
496
+ # makes the server answer "服务异常". OrgRole -> [{"organizeId": id}];
497
+ # Cascade is a relation-to-a-row -> [{"sid": rowId}] (like type 29).
498
+ mock_controls.return_value = [
499
+ {"controlId": "cOrg", "controlName": "组织角色", "type": 48,
500
+ "dot": 0},
501
+ {"controlId": "cCas", "controlName": "级联选择", "type": 35,
502
+ "dot": 0},
503
+ ]
504
+ mock_post.return_value = _mock_response({"rowid": "r_new"})
505
+
506
+ rec_mod.batch_create_by_name(
507
+ mock_session,
508
+ "ws1",
509
+ [{
510
+ "组织角色": "40d102b2-12bc-48d2-9364-f57070502609",
511
+ "级联选择": "97ebc5ba-4d57",
512
+ }],
513
+ )
514
+
515
+ rc = {c["controlId"]: c
516
+ for c in mock_post.call_args[1]["json"]["receiveControls"]}
517
+ assert json.loads(rc["cOrg"]["value"]) == [
518
+ {"organizeId": "40d102b2-12bc-48d2-9364-f57070502609"}]
519
+ assert json.loads(rc["cCas"]["value"]) == [{"sid": "97ebc5ba-4d57"}]
520
+
489
521
  @patch("hap_cli.core.worksheet.get_worksheet_controls")
490
522
  @patch("hap_cli.core.session.requests.post")
491
523
  def test_cli_batch_create_uses_main_api(
@@ -899,10 +931,18 @@ class TestFlowNode:
899
931
  assert not mock_post.called, "flowNode/get must not be POSTed"
900
932
  assert "startId" in result
901
933
 
934
+ @patch("hap_cli.core.session.requests.get")
902
935
  @patch("hap_cli.core.session.requests.post")
903
- def test_get_node_detail(self, mock_post, mock_session):
904
- mock_post.return_value = _mock_response({"nodeId": "n1", "flowNodeType": 4})
936
+ def test_get_node_detail(self, mock_post, mock_get, mock_session):
937
+ """``flowNode/getNodeDetail`` is GET per ``flowNode.js`` (pins
938
+ ``base.ajaxOptions.type = 'GET'``). POSTing returns 404."""
939
+ mock_get.return_value = _mock_response({"nodeId": "n1", "flowNodeType": 4})
905
940
  result = node_mod.get_node_detail(mock_session, "wf1", "n1")
941
+ assert mock_get.called, "flowNode/getNodeDetail must be issued as GET"
942
+ assert not mock_post.called
943
+ params = mock_get.call_args[1]["params"]
944
+ assert params["processId"] == "wf1"
945
+ assert params["nodeId"] == "n1"
906
946
  assert result["flowNodeType"] == 4
907
947
 
908
948
  @patch("hap_cli.core.session.requests.post")
@@ -972,12 +1012,18 @@ class TestFlowNode:
972
1012
  body = mock_post.call_args[1]["json"]
973
1013
  assert body["json"] == '{"name": "test"}'
974
1014
 
1015
+ @patch("hap_cli.core.session.requests.get")
975
1016
  @patch("hap_cli.core.session.requests.post")
976
- def test_get_code_template_list(self, mock_post, mock_session):
977
- mock_post.return_value = _mock_response([{"id": "t1", "name": "Template1"}])
1017
+ def test_get_code_template_list(self, mock_post, mock_get, mock_session):
1018
+ """``flowNode/getCodeTemplateList`` is GET per ``flowNode.js``.
1019
+ POSTing returns 404."""
1020
+ mock_get.return_value = _mock_response([{"id": "t1", "name": "Template1"}])
978
1021
  result = node_mod.get_code_template_list(mock_session, keyword="test")
979
- body = mock_post.call_args[1]["json"]
980
- assert body["keyword"] == "test"
1022
+ assert mock_get.called, "flowNode/getCodeTemplateList must be issued as GET"
1023
+ assert not mock_post.called
1024
+ params = mock_get.call_args[1]["params"]
1025
+ assert params["keyword"] == "test"
1026
+ assert result[0]["id"] == "t1"
981
1027
 
982
1028
  @patch("hap_cli.core.session.requests.post")
983
1029
  def test_create_code_template(self, mock_post, mock_session):
@@ -987,12 +1033,64 @@ class TestFlowNode:
987
1033
  assert body["name"] == "My Tmpl"
988
1034
  assert body["code"] == "console.log('hi')"
989
1035
 
1036
+ @patch("hap_cli.core.session.requests.get")
990
1037
  @patch("hap_cli.core.session.requests.post")
991
- def test_get_sub_process_list(self, mock_post, mock_session):
992
- mock_post.return_value = _mock_response([{"id": "sub1"}])
993
- result = node_mod.get_sub_process_list(mock_session, "wf1")
994
- body = mock_post.call_args[1]["json"]
995
- assert body["processId"] == "wf1"
1038
+ def test_get_sub_process_list(self, mock_post, mock_get, mock_session):
1039
+ """``flowNode/getSubProcessList`` is GET per ``flowNode.js``.
1040
+ POSTing returns 404."""
1041
+ mock_get.return_value = _mock_response([{"id": "sub1"}])
1042
+ result = node_mod.get_sub_process_list(mock_session, "wf1", select_node_id="n1")
1043
+ assert mock_get.called, "flowNode/getSubProcessList must be issued as GET"
1044
+ assert not mock_post.called
1045
+ params = mock_get.call_args[1]["params"]
1046
+ assert params["processId"] == "wf1"
1047
+ # selectNodeId is required by the server (code 2000 without it)
1048
+ assert params["selectNodeId"] == "n1"
1049
+ assert result[0]["id"] == "sub1"
1050
+
1051
+ @patch("hap_cli.core.session.requests.get")
1052
+ @patch("hap_cli.core.session.requests.post")
1053
+ def test_get_node_form_property(self, mock_post, mock_get, mock_session):
1054
+ """``flowNode/getNodeFormProperty`` is GET per ``flowNode.js``.
1055
+ POSTing returns 404."""
1056
+ mock_get.return_value = _mock_response({"controls": []})
1057
+ result = node_mod.get_node_form_property(mock_session, "wf1", "n1")
1058
+ assert mock_get.called, "flowNode/getNodeFormProperty must be issued as GET"
1059
+ assert not mock_post.called
1060
+ params = mock_get.call_args[1]["params"]
1061
+ assert params["processId"] == "wf1"
1062
+ assert params["nodeId"] == "n1"
1063
+ assert "controls" in result
1064
+
1065
+ @patch("hap_cli.core.session.requests.get")
1066
+ @patch("hap_cli.core.session.requests.post")
1067
+ def test_get_webhook_data_uses_get(self, mock_post, mock_get, mock_session):
1068
+ """``flowNode/getWebHookData`` is GET per ``flowNode.js``.
1069
+ POSTing returns 404."""
1070
+ mock_get.return_value = _mock_response({"data": "{}"})
1071
+ node_mod.get_webhook_data(mock_session, "wf1", "n1")
1072
+ assert mock_get.called, "flowNode/getWebHookData must be issued as GET"
1073
+ assert not mock_post.called
1074
+
1075
+ @patch("hap_cli.core.session.requests.get")
1076
+ @patch("hap_cli.core.session.requests.post")
1077
+ def test_get_flow_app_dtos_uses_get(self, mock_post, mock_get, mock_session):
1078
+ """``flowNode/getFlowAppDtos`` is GET per ``flowNode.js``.
1079
+ POSTing returns 404."""
1080
+ mock_get.return_value = _mock_response([{"id": "app1"}])
1081
+ node_mod.get_flow_app_dtos(mock_session, "wf1", "n1")
1082
+ assert mock_get.called, "flowNode/getFlowAppDtos must be issued as GET"
1083
+ assert not mock_post.called
1084
+
1085
+ @patch("hap_cli.core.session.requests.get")
1086
+ @patch("hap_cli.core.session.requests.post")
1087
+ def test_get_start_event_deploy_uses_get(self, mock_post, mock_get, mock_session):
1088
+ """``flowNode/getStartEventDeploy`` is GET per ``flowNode.js``.
1089
+ POSTing returns 404."""
1090
+ mock_get.return_value = _mock_response({"processId": "wf1"})
1091
+ node_mod.get_start_event_deploy(mock_session, "wf1", "n1")
1092
+ assert mock_get.called, "flowNode/getStartEventDeploy must be issued as GET"
1093
+ assert not mock_post.called
996
1094
 
997
1095
  @patch("hap_cli.core.session.requests.post")
998
1096
  def test_add_node_with_action_id(self, mock_post, mock_session):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hap-cli
3
- Version: 0.8.2
3
+ Version: 0.8.3
4
4
  Summary: CLI harness for MingDAO HAP - Enterprise no-code platform
5
5
  Author: hap-cli
6
6
  License: Apache-2.0
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