inputlayer-client-dev 0.1.0.dev921__tar.gz → 0.1.0.dev932__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.
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/PKG-INFO +2 -2
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/pyproject.toml +2 -2
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/knowledge_graph.py +16 -5
- inputlayer_client_dev-0.1.0.dev932/tests/test_kg_load.py +51 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/uv.lock +249 -190
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/.gitignore +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/LICENSE +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/README.md +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/01_quickstart.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/02_social_network.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/03_rag_pipeline.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/04_ecommerce.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/05_rbac.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/06_realtime_dashboard.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/07_dataframe_etl.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/08_session_rules.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/09_access_control.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/10_migrations.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/_common.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex01_retriever.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex02_vector.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex03_tool.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex04_lcel_chain.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex05_kg_building.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex06_explainable_rag.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex07_multihop.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex08_memory.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex09_access_control.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex10_multi_agent.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex11_anomaly.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex12_hallucination.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex13_guardrails.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex14_graphrag.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex15_caching.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex16_recommendation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/ex17_lineage.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langchain/runner.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/_common.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex01_reasoning_loop.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex02_investigation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex03_human_in_loop.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex04_branching_pipeline.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex05_self_correcting.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex06_collaborative_planning.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex07_event_correlation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex08_tool_selection.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex09_streaming_aggregation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex10_resumable_graph.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex11_memory.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/ex12_resumable_chat.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/examples/langgraph/runner.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/_ast.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/_naming.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/_protocol.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/_proxy.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/_sync.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/aggregations.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/auth.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/client.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/client_sync.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/compiler.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/connection.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/derived.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/exceptions.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/functions.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/index.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langchain/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langchain/params.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langchain/retriever.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langchain/tool.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langchain/vector_store.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/_checkpoint_serde.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/_checkpointer_mixin.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/_memory_helpers.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/_memory_mixin.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/_utils.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/checkpointer.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/memory.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/nodes.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/router.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/integrations/langgraph/state.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/autodetector.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/cli.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/errors.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/executor.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/loader.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/operations.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/recorder.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/state.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/migrations/writer.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/notifications.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/py.typed +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/relation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/result.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/session.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/src/inputlayer/types.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/__init__.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/_mock_checkpoint_kg.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/_mock_memory_kg.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/conftest.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_aggregations.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_ast.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_autodetector.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_checkpointer_core.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_checkpointer_lifecycle.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_checkpointer_list.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_checkpointer_validation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_cli.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_compiler.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_connection.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_derived.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_escape_iql.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_executor.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_functions.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_integration.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_kg_node.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_kg_router.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_langchain.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_langgraph_integration.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_loader.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_memory_core.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_memory_edge_cases.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_memory_helpers.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_migration_safety.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_naming.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_operations.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_protocol.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_proxy.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_relation.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_result.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_serde.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_state.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_sync.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_types.py +0 -0
- {inputlayer_client_dev-0.1.0.dev921 → inputlayer_client_dev-0.1.0.dev932}/tests/test_writer.py +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: inputlayer-client-dev
|
|
3
|
-
Version: 0.1.0.
|
|
3
|
+
Version: 0.1.0.dev932
|
|
4
4
|
Summary: Python Object-Logic Mapper for InputLayer knowledge graph engine
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Requires-Python: >=3.10
|
|
8
8
|
Requires-Dist: pydantic<3,>=2.0
|
|
9
|
-
Requires-Dist: websockets<
|
|
9
|
+
Requires-Dist: websockets<16,>=13.0
|
|
10
10
|
Provides-Extra: all
|
|
11
11
|
Requires-Dist: langchain-core<2,>=0.3; extra == 'all'
|
|
12
12
|
Requires-Dist: langgraph<2,>=0.2; extra == 'all'
|
|
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "inputlayer-client-dev"
|
|
7
|
-
version = "0.1.0.
|
|
7
|
+
version = "0.1.0.dev932"
|
|
8
8
|
description = "Python Object-Logic Mapper for InputLayer knowledge graph engine"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
11
11
|
requires-python = ">=3.10"
|
|
12
12
|
dependencies = [
|
|
13
13
|
"pydantic>=2.0,<3",
|
|
14
|
-
"websockets>=
|
|
14
|
+
"websockets>=13.0,<16",
|
|
15
15
|
]
|
|
16
16
|
|
|
17
17
|
[project.optional-dependencies]
|
|
@@ -963,11 +963,22 @@ class KnowledgeGraph:
|
|
|
963
963
|
)
|
|
964
964
|
|
|
965
965
|
async def load(self, path: str, *, mode: str | None = None) -> None:
|
|
966
|
-
"""Load
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
966
|
+
"""Load an IQL file into this knowledge graph.
|
|
967
|
+
|
|
968
|
+
The file is read locally and sent to the server as a single
|
|
969
|
+
multi-statement program, so the load is atomic: the server parses
|
|
970
|
+
every statement before executing any, and rejects the whole
|
|
971
|
+
program on the first error.
|
|
972
|
+
|
|
973
|
+
(Sending ``.load`` over the wire does not work: the server treats
|
|
974
|
+
it as a client-only REPL command and silently ignores it.)
|
|
975
|
+
"""
|
|
976
|
+
if mode is not None:
|
|
977
|
+
msg = "load(mode=...) is not supported; --replace/--merge are unimplemented server-side"
|
|
978
|
+
raise NotImplementedError(msg)
|
|
979
|
+
with open(path, encoding="utf-8") as f:
|
|
980
|
+
program = f.read()
|
|
981
|
+
await self._execute(program)
|
|
971
982
|
|
|
972
983
|
async def clear_prefix(self, prefix: str) -> ClearResult:
|
|
973
984
|
"""Clear all relations matching a prefix."""
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Tests for KnowledgeGraph.load: local file read, sent as one atomic program."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from unittest.mock import AsyncMock
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from inputlayer.knowledge_graph import KnowledgeGraph
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _kg_with_mocked_execute() -> KnowledgeGraph:
|
|
13
|
+
kg = KnowledgeGraph.__new__(KnowledgeGraph)
|
|
14
|
+
kg._execute = AsyncMock() # type: ignore[method-assign]
|
|
15
|
+
return kg
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TestLoad:
|
|
19
|
+
async def test_sends_file_contents_as_one_program(self, tmp_path) -> None:
|
|
20
|
+
pack = tmp_path / "pack.iql"
|
|
21
|
+
pack.write_text(
|
|
22
|
+
"// a comment the server strips\n"
|
|
23
|
+
'+claim(id: string, val: string)\n'
|
|
24
|
+
'+claim[("c1", "v1")]\n'
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
kg = _kg_with_mocked_execute()
|
|
28
|
+
await kg.load(str(pack))
|
|
29
|
+
|
|
30
|
+
kg._execute.assert_awaited_once()
|
|
31
|
+
program = kg._execute.await_args.args[0]
|
|
32
|
+
# The whole file goes over in a single execute, comments included
|
|
33
|
+
# (the server strips them), never as a `.load` meta command.
|
|
34
|
+
assert '+claim[("c1", "v1")]' in program
|
|
35
|
+
assert "// a comment" in program
|
|
36
|
+
assert not program.lstrip().startswith(".load")
|
|
37
|
+
|
|
38
|
+
async def test_mode_is_rejected(self, tmp_path) -> None:
|
|
39
|
+
pack = tmp_path / "pack.iql"
|
|
40
|
+
pack.write_text("+r(x: string)\n")
|
|
41
|
+
|
|
42
|
+
kg = _kg_with_mocked_execute()
|
|
43
|
+
with pytest.raises(NotImplementedError):
|
|
44
|
+
await kg.load(str(pack), mode="--replace")
|
|
45
|
+
kg._execute.assert_not_awaited()
|
|
46
|
+
|
|
47
|
+
async def test_missing_file_raises(self) -> None:
|
|
48
|
+
kg = _kg_with_mocked_execute()
|
|
49
|
+
with pytest.raises(FileNotFoundError):
|
|
50
|
+
await kg.load("/nonexistent/pack.iql")
|
|
51
|
+
kg._execute.assert_not_awaited()
|