flowbase-cli 0.1.3__tar.gz → 0.1.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowbase-cli
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Command line client for the FlowBase OpenAPI
5
5
  Author: DeepFlowAI
6
6
  License: Apache-2.0
@@ -22,6 +22,8 @@ export FLOWBASE_HOST=https://flowbase-test-a.deepflowagent.com
22
22
  export FLOWBASE_API_KEY=fbk_xxx
23
23
 
24
24
  flowbase objects list
25
+ flowbase views list obj_xxx
26
+ flowbase views create obj_xxx --json-file view.json
25
27
  flowbase pages list --object-id obj_xxx
26
28
  flowbase pages create --json-file page.json
27
29
  flowbase records create obj_xxx --json '{"values":{"name":"Example"}}'
@@ -13,6 +13,8 @@ export FLOWBASE_HOST=https://flowbase-test-a.deepflowagent.com
13
13
  export FLOWBASE_API_KEY=fbk_xxx
14
14
 
15
15
  flowbase objects list
16
+ flowbase views list obj_xxx
17
+ flowbase views create obj_xxx --json-file view.json
16
18
  flowbase pages list --object-id obj_xxx
17
19
  flowbase pages create --json-file page.json
18
20
  flowbase records create obj_xxx --json '{"values":{"name":"Example"}}'
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flowbase-cli"
7
- version = "0.1.3"
7
+ version = "0.1.4"
8
8
  description = "Command line client for the FlowBase OpenAPI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  """FlowBase OpenAPI CLI."""
2
2
 
3
- __version__ = "0.1.3"
3
+ __version__ = "0.1.4"
@@ -30,6 +30,12 @@ ENDPOINTS = (
30
30
  Endpoint("fields.update", "flowbase_fields_update", "PUT", "/objects/{object_id}/fields/{field_id}", "metadata:write", "Update a field draft.", "flowbase fields update obj_xxx fld_xxx --label Name --description 'Customer name'"),
31
31
  Endpoint("fields.delete", "flowbase_fields_delete", "DELETE", "/objects/{object_id}/fields/{field_id}", "metadata:write", "Logically delete a field.", "flowbase fields delete obj_xxx fld_xxx --yes", True),
32
32
  Endpoint("fields.restore", "flowbase_fields_restore", "POST", "/objects/{object_id}/fields/{field_id}/restore", "metadata:write", "Restore a field.", "flowbase fields restore obj_xxx fld_xxx --yes", True),
33
+ Endpoint("views.list", "flowbase_views_list", "GET", "/objects/{object_id}/views", "metadata:read", "List object view metadata.", "flowbase views list obj_xxx"),
34
+ Endpoint("views.create", "flowbase_views_create", "POST", "/objects/{object_id}/views", "metadata:write", "Create an object view draft.", "flowbase views create obj_xxx --json-file view.json"),
35
+ Endpoint("views.update", "flowbase_views_update", "PUT", "/objects/{object_id}/views/{view_id}", "metadata:write", "Update an object view draft.", "flowbase views update obj_xxx viw_xxx --json-file view.json"),
36
+ Endpoint("views.reorder", "flowbase_views_reorder", "PUT", "/objects/{object_id}/views/order", "metadata:write", "Reorder object views.", "flowbase views reorder obj_xxx --json '{\"baseRevision\":4,\"viewIds\":[\"viw_xxx\"]}'"),
37
+ Endpoint("views.set-enabled", "flowbase_views_set_enabled", "POST", "/objects/{object_id}/views/{view_id}/enabled", "metadata:write", "Enable or disable an object view.", "flowbase views set-enabled obj_xxx viw_xxx --base-revision 4 --enabled --yes", True),
38
+ Endpoint("views.delete", "flowbase_views_delete", "DELETE", "/objects/{object_id}/views/{view_id}", "metadata:write", "Logically delete an object view.", "flowbase views delete obj_xxx viw_xxx --base-revision 4 --yes", True),
33
39
  Endpoint("pages.list", "flowbase_pages_list", "GET", "/pages", "metadata:read", "List custom Page metadata.", "flowbase pages list --object-id obj_xxx"),
34
40
  Endpoint("pages.options", "flowbase_pages_options", "GET", "/pages/options", "metadata:read", "Get custom Page design options.", "flowbase pages options"),
35
41
  Endpoint("pages.get", "flowbase_pages_get", "GET", "/pages/{page_id}", "metadata:read", "Get a custom Page.", "flowbase pages get pag_xxx"),
@@ -313,6 +313,39 @@ def handle_fields(args: argparse.Namespace) -> int:
313
313
  return run_request(args, f"fields.{action}", path_params=path)
314
314
 
315
315
 
316
+ def handle_views(args: argparse.Namespace) -> int:
317
+ action = args.views_action
318
+ path = {"object_id": args.object_id}
319
+ if hasattr(args, "view_id"):
320
+ path["view_id"] = args.view_id
321
+ if action == "list":
322
+ return run_request(args, "views.list", path_params=path)
323
+ if action in ("create", "update"):
324
+ body = load_json_payload(args.json, args.json_file)
325
+ require_fields(body, "baseRevision", "name", "defaultFieldIds")
326
+ if not isinstance(body["defaultFieldIds"], list):
327
+ raise CliError("Request field 'defaultFieldIds' must be an array.")
328
+ return run_request(args, f"views.{action}", path_params=path, body=body)
329
+ if action == "reorder":
330
+ body = load_json_payload(args.json, args.json_file)
331
+ require_fields(body, "baseRevision", "viewIds")
332
+ if not isinstance(body["viewIds"], list):
333
+ raise CliError("Request field 'viewIds' must be an array.")
334
+ return run_request(args, "views.reorder", path_params=path, body=body)
335
+ if action == "set-enabled":
336
+ body = {
337
+ "baseRevision": args.base_revision,
338
+ "enabled": args.enabled,
339
+ }
340
+ return run_request(args, "views.set-enabled", path_params=path, body=body)
341
+ return run_request(
342
+ args,
343
+ "views.delete",
344
+ path_params=path,
345
+ body={"baseRevision": args.base_revision},
346
+ )
347
+
348
+
316
349
  def handle_pages(args: argparse.Namespace) -> int:
317
350
  action = args.pages_action
318
351
  if action == "list":
@@ -560,6 +593,35 @@ def build_parser() -> argparse.ArgumentParser:
560
593
  add_yes(item)
561
594
  fields.set_defaults(handler=handle_fields)
562
595
 
596
+ views = groups.add_parser("views", help="Manage object view metadata.")
597
+ view_actions = views.add_subparsers(dest="views_action", required=True)
598
+ view_list = view_actions.add_parser("list")
599
+ view_list.add_argument("object_id")
600
+ for action in ("create", "reorder"):
601
+ item = view_actions.add_parser(action)
602
+ item.add_argument("object_id")
603
+ add_json_args(item)
604
+ view_update = view_actions.add_parser("update")
605
+ view_update.add_argument("object_id")
606
+ view_update.add_argument("view_id")
607
+ add_json_args(view_update)
608
+ view_enabled = view_actions.add_parser("set-enabled")
609
+ view_enabled.add_argument("object_id")
610
+ view_enabled.add_argument("view_id")
611
+ view_enabled.add_argument("--base-revision", required=True, type=int)
612
+ view_enabled.add_argument(
613
+ "--enabled",
614
+ action=argparse.BooleanOptionalAction,
615
+ required=True,
616
+ )
617
+ add_yes(view_enabled)
618
+ view_delete = view_actions.add_parser("delete")
619
+ view_delete.add_argument("object_id")
620
+ view_delete.add_argument("view_id")
621
+ view_delete.add_argument("--base-revision", required=True, type=int)
622
+ add_yes(view_delete)
623
+ views.set_defaults(handler=handle_views)
624
+
563
625
  pages = groups.add_parser("pages", help="Manage custom Page metadata.")
564
626
  page_actions = pages.add_subparsers(dest="pages_action", required=True)
565
627
  page_list = page_actions.add_parser("list")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowbase-cli
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Command line client for the FlowBase OpenAPI
5
5
  Author: DeepFlowAI
6
6
  License: Apache-2.0
@@ -22,6 +22,8 @@ export FLOWBASE_HOST=https://flowbase-test-a.deepflowagent.com
22
22
  export FLOWBASE_API_KEY=fbk_xxx
23
23
 
24
24
  flowbase objects list
25
+ flowbase views list obj_xxx
26
+ flowbase views create obj_xxx --json-file view.json
25
27
  flowbase pages list --object-id obj_xxx
26
28
  flowbase pages create --json-file page.json
27
29
  flowbase records create obj_xxx --json '{"values":{"name":"Example"}}'
@@ -88,6 +88,78 @@ class FlowBaseCliTest(unittest.TestCase):
88
88
  self.assertTrue(any(item["key"] == "changes.release" for item in payload))
89
89
  self.assertTrue(any(item["key"] == "versions.get" for item in payload))
90
90
  self.assertTrue(any(item["key"] == "pages.create" for item in payload))
91
+ self.assertTrue(any(item["key"] == "views.create" for item in payload))
92
+
93
+ def test_view_create_sends_complete_snapshot(self):
94
+ body = {
95
+ "baseRevision": 4,
96
+ "name": "Active customers",
97
+ "defaultFieldIds": ["fld_1"],
98
+ }
99
+ stdout = io.StringIO()
100
+ with (
101
+ patch(
102
+ "flowbase_cli.main.OpenApiClient.request",
103
+ return_value=b'{"viewId":"viw_1","draftRevision":5}',
104
+ ) as request,
105
+ patch("sys.stdout", stdout),
106
+ ):
107
+ code = main([
108
+ "--api-key",
109
+ "fbk_test",
110
+ "views",
111
+ "create",
112
+ "obj_1",
113
+ "--json",
114
+ json.dumps(body),
115
+ ])
116
+ self.assertEqual(code, 0)
117
+ self.assertEqual(request.call_args.args[0], "views.create")
118
+ self.assertEqual(
119
+ request.call_args.kwargs["path_params"],
120
+ {"object_id": "obj_1"},
121
+ )
122
+ self.assertEqual(request.call_args.kwargs["body"], body)
123
+
124
+ def test_view_set_enabled_sends_revision_and_requires_yes(self):
125
+ stderr = io.StringIO()
126
+ with patch("sys.stderr", stderr), patch("sys.stdin.isatty", return_value=False):
127
+ code = main([
128
+ "--api-key",
129
+ "fbk_test",
130
+ "views",
131
+ "set-enabled",
132
+ "obj_1",
133
+ "viw_1",
134
+ "--base-revision",
135
+ "4",
136
+ "--no-enabled",
137
+ ])
138
+ self.assertEqual(code, 1)
139
+ self.assertIn("without --yes", stderr.getvalue())
140
+
141
+ with patch(
142
+ "flowbase_cli.main.OpenApiClient.request",
143
+ return_value=b'{"ok":true,"draftRevision":5}',
144
+ ) as request:
145
+ code = main([
146
+ "--api-key",
147
+ "fbk_test",
148
+ "views",
149
+ "set-enabled",
150
+ "obj_1",
151
+ "viw_1",
152
+ "--base-revision",
153
+ "4",
154
+ "--no-enabled",
155
+ "--yes",
156
+ ])
157
+ self.assertEqual(code, 0)
158
+ self.assertEqual(request.call_args.args[0], "views.set-enabled")
159
+ self.assertEqual(
160
+ request.call_args.kwargs["body"],
161
+ {"baseRevision": 4, "enabled": False},
162
+ )
91
163
 
92
164
  def test_page_set_default_sends_revision_and_requires_yes(self):
93
165
  stderr = io.StringIO()
File without changes