dartlab / pyproject.toml
eddmpython's picture
deploy: dartlab API + MCP server
3b7138e verified
[project]
name = "dartlab"
version = "0.9.6"
description = "DART μ „μžκ³΅μ‹œ + EDGAR κ³΅μ‹œλ₯Ό ν•˜λ‚˜μ˜ νšŒμ‚¬ 맡으둜 β€” Python 재무 뢄석 라이브러리"
readme = "README.md"
license = {file = "LICENSE"}
requires-python = ">=3.12"
authors = [
{name = "eddmpython"}
]
keywords = [
"dart",
"edgar",
"sec",
"financial-statements",
"korea",
"disclosure",
"accounting",
"polars",
"sections",
"mcp",
"ai-analysis",
"annual-report",
"10-k",
"xbrl",
"μ „μžκ³΅μ‹œ",
"μž¬λ¬΄μ œν‘œ",
"μ‚¬μ—…λ³΄κ³ μ„œ",
"κ³΅μ‹œλΆ„μ„",
"λ‹€νŠΈ",
]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"Intended Audience :: Financial and Insurance Industry",
"Intended Audience :: End Users/Desktop",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Office/Business :: Financial",
"Topic :: Office/Business :: Financial :: Accounting",
"Topic :: Office/Business :: Financial :: Investment",
"Topic :: Scientific/Engineering :: Information Analysis",
"Natural Language :: Korean",
"Natural Language :: English",
"Typing :: Typed",
]
dependencies = [
# core
"beautifulsoup4>=4.14.3,<5",
"lxml>=6.0.2,<7",
"httpx>=0.28.1,<1",
"polars>=1.0.0,<2",
"rich>=14.3.3,<15",
"huggingface-hub>=0.20.0,<1",
"openpyxl>=3.1.5,<4",
"diff-match-patch>=20230430",
"numpy>=1.26.0,<3",
"marimo>=0.22.0",
# ai providers
"openai>=1.0.0,<3",
"google-genai>=1.0.0,<2",
"anthropic>=0.30.0,<2",
# server (dartlab ai)
"fastapi>=0.135.1,<1",
"uvicorn[standard]>=0.30.0,<1",
"sse-starlette>=2.0.0,<3",
"mcp[cli]>=1.0",
"qrcode>=7.0,<9",
# viz
"plotly>=5.0.0,<6",
]
[project.scripts]
dartlab = "dartlab.cli.main:main"
[project.entry-points."dartlab.plugins"]
[project.urls]
Homepage = "https://eddmpython.github.io/dartlab/"
Repository = "https://github.com/eddmpython/dartlab"
Documentation = "https://eddmpython.github.io/dartlab/docs/"
Issues = "https://github.com/eddmpython/dartlab/issues"
Changelog = "https://eddmpython.github.io/dartlab/docs/changelog"
Demo = "https://huggingface.co/spaces/eddmpython/dartlab"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/dartlab"]
artifacts = [
"src/dartlab/ui/build/**",
]
exclude = [
"**/_reference/**",
"src/dartlab/engines/edinet/**",
"src/dartlab/engines/esg/**",
"src/dartlab/engines/event/**",
"src/dartlab/engines/supply/**",
"src/dartlab/engines/watch/**",
]
[tool.hatch.build.targets.sdist]
include = [
"src/dartlab/**/*.py",
"src/dartlab/**/*.json",
"src/dartlab/**/*.parquet",
"src/dartlab/ui/build/**",
"README.md",
"LICENSE",
]
exclude = [
"**/_reference/**",
"src/dartlab/engines/edinet/**",
"src/dartlab/engines/esg/**",
"src/dartlab/engines/event/**",
"src/dartlab/engines/supply/**",
"src/dartlab/engines/watch/**",
]
[tool.ruff]
target-version = "py312"
line-length = 120
exclude = ["experiments", "*/_reference"]
[tool.ruff.lint]
select = ["E", "F", "I"]
ignore = ["E402", "E501", "E741", "F841"]
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py", "bench_*.py"]
addopts = "-v --tb=short"
asyncio_mode = "auto"
markers = [
"requires_data: 둜컬 parquet 데이터 ν•„μš” (CIμ—μ„œ skip)",
"unit: 순수 둜직/mock만 β€” 데이터 λ‘œλ“œ μ—†μŒ, 병렬 μ•ˆμ „",
"integration: Company 1개 λ‘œλ”© ν•„μš” β€” 쀑간 무게",
"heavy: λŒ€λŸ‰ 데이터 λ‘œλ“œ β€” 단독 μ‹€ν–‰ ν•„μˆ˜",
]
[tool.coverage.run]
source = ["dartlab"]
omit = [
"src/dartlab/engines/ai/providers/*",
"src/dartlab/review/*",
]
[tool.coverage.report]
show_missing = true
skip_empty = true
exclude_lines = [
"pragma: no cover",
"if __name__",
"raise NotImplementedError",
]
fail_under = 30
[tool.pyright]
pythonVersion = "3.12"
typeCheckingMode = "basic"
include = ["src/dartlab"]
exclude = [
"src/dartlab/engines/ai/providers/**",
"ui/**",
"experiments/**",
]
reportMissingTypeStubs = false
reportUnknownParameterType = false
reportUnknownMemberType = false
reportUnknownVariableType = false
[tool.bandit]
exclude_dirs = ["experiments", "tests"]
skips = ["B101"]
[tool.deptry]
# μ˜΅μ…”λ„ 톡합 μ˜μ‘΄μ„± β€” μ‚¬μš©μžκ°€ 별도 μ„€μΉ˜ν•  λ•Œλ§Œ λ™μž‘ (λŸ°νƒ€μž„ ImportError κ°€λ“œ 있음)
extend_exclude = [
"src/dartlab/.*/_reference/.*", # ν•™μŠ΅/μ‹€ν—˜ μ½”λ“œ, λŸ°νƒ€μž„ λ―Έμ‚¬μš©
]
[tool.deptry.per_rule_ignores]
DEP001 = [
# ── channel μ–΄λŒ‘ν„° (μ™ΈλΆ€ λ©”μ‹ μ € μ˜΅μ…”λ„) ──
"discord", "slack_bolt", "telegram",
# ── CLI μΈν„°λž™ν‹°λΈŒ μ˜΅μ…”λ„ ──
"prompt_toolkit",
# ── display μ˜΅μ…”λ„ ──
"great_tables", "itables", "IPython",
# ── gather μ˜΅μ…”λ„ ──
"FinanceDataReader", "tavily",
# ── _reference ν•™μŠ΅/μ‹€ν—˜ ──
"agents", "owlready2", "rapidfuzz", "edgar",
# ── transitive deps (λ‹€λ₯Έ νŒ¨ν‚€μ§€κ°€ λŒμ–΄μ˜΄) ──
"dotenv", # python-dotenv
"google", # google-genai
"yaml", # pyyaml
"bs4", # beautifulsoup4
"starlette", # fastapiκ°€ λŒμ–΄μ˜΄
"pydantic", # fastapiκ°€ λŒμ–΄μ˜΄
]
DEP002 = [
"beautifulsoup4", # bs4 직접 import
"google-genai", # google.genai μ‚¬μš© (gemini provider)
"marimo", # λ…ΈνŠΈλΆ 컴파일/배포 도ꡬ
]
[dependency-groups]
dev = [
"build>=1.4.0",
"dartlab[all]",
"hatchling>=1.29.0",
"hypothesis>=6.100.0",
"pillow>=12.1.1",
"pre-commit>=4.0.0",
"pyright>=1.1.0",
"pytest>=9.0.2",
"pytest-asyncio>=0.24.0",
"pytest-benchmark>=5.0.0",
"pytest-cov>=6.0.0",
"radon>=6.0.0",
"vulture>=2.0",
]