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.
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/PKG-INFO +3 -1
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/README.md +2 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/pyproject.toml +1 -1
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli/__init__.py +1 -1
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli/endpoints.py +6 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli/main.py +62 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli.egg-info/PKG-INFO +3 -1
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/tests/test_cli.py +72 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/setup.cfg +0 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli.egg-info/SOURCES.txt +0 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli.egg-info/dependency_links.txt +0 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli.egg-info/entry_points.txt +0 -0
- {flowbase_cli-0.1.3 → flowbase_cli-0.1.4}/src/flowbase_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowbase-cli
|
|
3
|
-
Version: 0.1.
|
|
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"}}'
|
|
@@ -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
|
+
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|