Spaces:
Running
Running
Support optional inputs in lynxkite-graph-analytics.
Browse files
lynxkite-core/tests/test_simple.py
CHANGED
@@ -19,7 +19,7 @@ async def test_optional_inputs():
|
|
19 |
ws = workspace.Workspace(env="test", nodes=[], edges=[])
|
20 |
a = ws.add_node(one)
|
21 |
b = ws.add_node(maybe_add)
|
22 |
-
|
23 |
assert b.data.error == "Missing input: a"
|
24 |
ws.add_edge(a, "output", b, "a")
|
25 |
outputs = await ws.execute()
|
|
|
19 |
ws = workspace.Workspace(env="test", nodes=[], edges=[])
|
20 |
a = ws.add_node(one)
|
21 |
b = ws.add_node(maybe_add)
|
22 |
+
await ws.execute()
|
23 |
assert b.data.error == "Missing input: a"
|
24 |
ws.add_edge(a, "output", b, "a")
|
25 |
outputs = await ws.execute()
|
lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py
CHANGED
@@ -187,6 +187,7 @@ async def execute(ws: workspace.Workspace):
|
|
187 |
todo.remove(id)
|
188 |
progress = True
|
189 |
await _execute_node(node, ws, catalog, outputs)
|
|
|
190 |
|
191 |
|
192 |
async def await_if_needed(obj):
|
@@ -213,10 +214,15 @@ async def _execute_node(
|
|
213 |
# Convert inputs types to match operation signature.
|
214 |
try:
|
215 |
inputs = []
|
|
|
216 |
for p in op.inputs:
|
217 |
if p.name not in input_map:
|
218 |
-
|
219 |
-
|
|
|
|
|
|
|
|
|
220 |
x = input_map[p.name]
|
221 |
if p.type == nx.Graph and isinstance(x, Bundle):
|
222 |
x = x.to_nx()
|
@@ -230,6 +236,9 @@ async def _execute_node(
|
|
230 |
traceback.print_exc()
|
231 |
node.publish_error(e)
|
232 |
return
|
|
|
|
|
|
|
233 |
# Execute op.
|
234 |
try:
|
235 |
result = op(*inputs, **params)
|
|
|
187 |
todo.remove(id)
|
188 |
progress = True
|
189 |
await _execute_node(node, ws, catalog, outputs)
|
190 |
+
return outputs
|
191 |
|
192 |
|
193 |
async def await_if_needed(obj):
|
|
|
214 |
# Convert inputs types to match operation signature.
|
215 |
try:
|
216 |
inputs = []
|
217 |
+
missing = []
|
218 |
for p in op.inputs:
|
219 |
if p.name not in input_map:
|
220 |
+
opt_type = ops.get_optional_type(p.type)
|
221 |
+
if opt_type is not None:
|
222 |
+
inputs.append(None)
|
223 |
+
else:
|
224 |
+
missing.append(p.name)
|
225 |
+
continue
|
226 |
x = input_map[p.name]
|
227 |
if p.type == nx.Graph and isinstance(x, Bundle):
|
228 |
x = x.to_nx()
|
|
|
236 |
traceback.print_exc()
|
237 |
node.publish_error(e)
|
238 |
return
|
239 |
+
if missing:
|
240 |
+
node.publish_error(f"Missing input: {', '.join(missing)}")
|
241 |
+
return
|
242 |
# Execute op.
|
243 |
try:
|
244 |
result = op(*inputs, **params)
|
lynxkite-graph-analytics/tests/test_lynxkite_ops.py
CHANGED
@@ -160,5 +160,28 @@ async def test_multiple_inputs():
|
|
160 |
assert ws.nodes[-1].data.display is False
|
161 |
|
162 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
if __name__ == "__main__":
|
164 |
pytest.main()
|
|
|
160 |
assert ws.nodes[-1].data.display is False
|
161 |
|
162 |
|
163 |
+
async def test_optional_inputs():
|
164 |
+
@ops.op("test", "one")
|
165 |
+
def one():
|
166 |
+
return 1
|
167 |
+
|
168 |
+
@ops.op("test", "maybe add")
|
169 |
+
def maybe_add(a: int, b: int | None = None):
|
170 |
+
return a + (b or 0)
|
171 |
+
|
172 |
+
assert maybe_add.__op__.inputs == [
|
173 |
+
ops.Input(name="a", type=int, position="left"),
|
174 |
+
ops.Input(name="b", type=int | None, position="left"),
|
175 |
+
]
|
176 |
+
ws = workspace.Workspace(env="test", nodes=[], edges=[])
|
177 |
+
a = ws.add_node(one)
|
178 |
+
b = ws.add_node(maybe_add)
|
179 |
+
await execute(ws)
|
180 |
+
assert b.data.error == "Missing input: a"
|
181 |
+
ws.add_edge(a, "output", b, "a")
|
182 |
+
outputs = await execute(ws)
|
183 |
+
assert outputs[b.id, "output"] == 1
|
184 |
+
|
185 |
+
|
186 |
if __name__ == "__main__":
|
187 |
pytest.main()
|