[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", ]