# ============================================================================= # pyproject.toml — 패키지 메타 · 의존성 · 진입점 · 테스트 설정 # ============================================================================= # 런타임 의존성은 3개로 고정한다(아키텍처 §8). 의존성 하나는 곧 # "6개월 뒤 pip install 이 실패할 확률 하나" 다. # ▸ pandas · openpyxl · PyYAML · requests · pydantic 은 명시적으로 기각했다. # ▸ 설정(tomllib) · DB(sqlite3) · GUI(tkinter) · 암호화(ctypes+DPAPI) · # 락(msvcrt) · CLI(argparse) 는 전부 표준 라이브러리로 해결한다. # ============================================================================= [build-system] requires = ["setuptools>=68"] build-backend = "setuptools.build_meta" [project] name = "dmf-crawler" version = "0.1.0" description = "식약처 원료의약품등록(DMF) 현황을 매일 수집해 변경을 탐지하고 엑셀 리포트를 만드는 무인 도구" readme = "README.md" requires-python = ">=3.11" license = { text = "Proprietary" } keywords = ["dmf", "mfds", "pharma", "crawler", "xlsx", "korea"] classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Operating System :: Microsoft :: Windows :: Windows 11", "Natural Language :: Korean", "Private :: Do Not Upload", ] # 런타임 의존성 3개. 상한을 고정해 상위 버전의 파괴적 변경으로부터 무인 실행을 지킨다. dependencies = [ "httpx>=0.27,<1.0", # 유일한 HTTP 창구. 연결/읽기 타임아웃 분리가 가능하다 "XlsxWriter>=3.2,<4.0", # xlsx 생성 전담. 스파크라인·수식 캐시값은 이 라이브러리에만 있다 "jsonschema>=4.21,<5.0", # agy 응답 자체 검증. 손으로 짜면 반드시 틀리는 부분 ] [project.optional-dependencies] dev = [ "pytest>=8.0,<9.0", ] [project.scripts] dmf = "dmf_crawler.cli:main" [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] # 마이그레이션 SQL 은 패키지 안에 있으므로 함께 배포한다. "dmf_crawler.storage" = ["migrations/*.sql"] [tool.pytest.ini_options] minversion = "8.0" testpaths = ["tests"] pythonpath = ["src"] addopts = "-ra --strict-markers --strict-config" filterwarnings = ["error::DeprecationWarning"] markers = [ "slow: 실행이 오래 걸리는 테스트", "windows: Windows 에서만 의미가 있는 테스트(DPAPI·msvcrt·작업 스케줄러)", "network: 실제 네트워크가 필요한 테스트. 기본 실행에서는 제외한다", ]