* test: add comprehensive unit tests for domain module Add 24 comprehensive unit tests covering the open_notebook.domain module: **ObjectModel Base (5 tests)** - Create and update operations with timestamps - Get by ID with class resolution - Delete validation - Relationship creation **RecordModel Singleton (3 tests)** - Singleton pattern behavior - Async database loading - Update persistence **ModelManager (3 tests)** - Singleton pattern - Model instance caching - Default model retrieval **Notebook Domain (3 tests)** - Name validation (empty/whitespace) - Source relationship queries - Archived flag defaults **Source Domain (3 tests)** - Text vectorization and chunking - Insight validation and creation - RecordID command field parsing **Note Domain (2 tests)** - Content validation - Embedding configuration **Podcast Domain (2 tests)** - Speaker profile validation - Episode profile segment validation **Additional Tests (3 tests)** - ChatSession relationships - Transformation creation - ContentSettings defaults All tests use proper mocking to avoid database dependencies and validate both business logic and error handling. Tests follow pytest best practices with async support, fixtures, and comprehensive assertions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * test: add comprehensive tests for utils and graphs modules Add 56 new unit tests covering utils and graphs modules: **Utils Module Tests (36 tests)** Text Utilities (13 tests): - Text splitting with various chunk sizes - ASCII and non-printable character removal - Thinking tag parsing and cleaning (single/multiple tags) - Edge cases (empty strings, invalid input, large content) Token Utilities (4 tests): - Token counting with tiktoken - Cost calculation - Fallback behavior when tiktoken unavailable Version Utilities (7 tests): - Semantic version comparison (equal, less, greater, prerelease) - Installed package version retrieval - GitHub version fetching with URL validation Context Builder (12 tests): - ContextItem and ContextConfig creation - Builder initialization with various parameters - Priority sorting and deduplication - Token-based truncation - Response formatting - Source and notebook context building - Convenience functions **Graphs Module Tests (20 tests)** Model Provisioning (4 tests): - Default model selection - Large context model triggering (>105k tokens) - Specific model ID selection - Kwargs pass-through Tools (3 tests): - Current timestamp format validation - Timestamp validity checking - Tool decoration verification Prompt Graph (5 tests): - PatternChainState structure - Model calling with/without parser - Graph compilation and execution Transformation Graph (8 tests): - TransformationState structure - Transformation with source objects - Transformation with direct input text - Thinking content cleaning - Content validation - Graph compilation and execution - Default prompt integration All tests use proper mocking to avoid external dependencies (network, database) and validate both success paths and error handling. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * improve tests --------- Co-authored-by: Claude <noreply@anthropic.com>
99 lines
2.4 KiB
TOML
99 lines
2.4 KiB
TOML
[project]
|
|
name = "open-notebook"
|
|
version = "1.0.11"
|
|
description = "An open source implementation of a research assistant, inspired by Google Notebook LM"
|
|
authors = [
|
|
{name = "Luis Novo", email = "lfnovo@gmail.com"}
|
|
]
|
|
readme = "README.md"
|
|
classifiers = [
|
|
"License :: OSI Approved :: MIT License",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.11",
|
|
]
|
|
requires-python = ">=3.11,<3.13"
|
|
dependencies = [
|
|
"fastapi>=0.104.0",
|
|
"uvicorn>=0.24.0",
|
|
"pydantic>=2.9.2",
|
|
"loguru>=0.7.2",
|
|
"langchain>=0.3.3",
|
|
"langgraph>=0.2.38",
|
|
"tiktoken>=0.8.0",
|
|
"langgraph-checkpoint-sqlite>=2.0.0",
|
|
"langchain-community>=0.3.3",
|
|
"langchain-openai>=0.2.3",
|
|
"langchain-anthropic>=0.2.3",
|
|
"langchain-ollama>=0.2.0",
|
|
"langchain-google-genai>=2.1.10",
|
|
"langchain-groq>=0.2.1",
|
|
"langchain_mistralai>=0.2.1",
|
|
"langchain_deepseek>=0.1.3",
|
|
"tomli>=2.0.2",
|
|
"groq>=0.12.0",
|
|
"python-dotenv>=1.0.1",
|
|
"httpx[socks]>=0.27.0",
|
|
"nest-asyncio>=1.6.0",
|
|
"content-core>=1.0.2",
|
|
"ai-prompter>=0.3",
|
|
"esperanto>=2.4.1",
|
|
"langchain-google-vertexai>=2.0.28",
|
|
"surrealdb>=1.0.4",
|
|
"surreal-commands>=1.0.13",
|
|
"podcast-creator>=0.7.0",
|
|
]
|
|
|
|
[tool.setuptools]
|
|
package-dir = {"open_notebook" = "open_notebook"}
|
|
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"ipykernel>=6.29.5",
|
|
"ruff>=0.5.5",
|
|
"mypy>=1.11.1",
|
|
"types-requests>=2.32.0.20241016",
|
|
"ipywidgets>=8.1.5",
|
|
"pre-commit>=4.0.1",
|
|
"pytest>=8.0.0",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=61.0"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pre-commit>=4.1.0",
|
|
"pytest-asyncio>=1.2.0",
|
|
"types-requests>=2.32.4.20250913",
|
|
]
|
|
|
|
[tool.isort]
|
|
profile = "black"
|
|
line_length = 88
|
|
|
|
[tool.ruff]
|
|
line-length = 88
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I"]
|
|
ignore = [
|
|
"E501", # line too long
|
|
"E402", # module level import not at top of file (Streamlit requires this pattern)
|
|
"E722", # do not use bare except (legacy code pattern)
|
|
"F401", # imported but unused (may be used in type hints or re-exports)
|
|
"F541", # f-string without placeholders
|
|
"F841", # local variable assigned but never used
|
|
]
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
# Streamlit files need nest_asyncio.apply() before imports
|
|
"app_home.py" = ["E402"]
|
|
"pages/**/*.py" = ["E402"]
|
|
|
|
[tool.mypy]
|
|
# Exclude Streamlit UI pages from type checking
|
|
[[tool.mypy.overrides]]
|
|
module = "pages.*"
|
|
ignore_errors = true
|