여러 줄 주석이 설명보다 경위(예전·실측·지적)를 적고 있어 읽는 사람이 결론을 찾기 어려웠다. - ts·tsx·js·mjs·css·py 478개: 여러 줄 주석은 첫 문장 한 줄로, 과거형·날짜 문장은 삭제 - 주석 위치는 TypeScript 파서·파이썬 tokenize/ast 로 찾는다 — 문자열 안의 # · /* 는 건드리지 않는다 - eslint·ts·noqa·type: ignore 같은 지시 주석은 그대로 둔다 파이썬 275개 정리 전후 AST 동일, TS 298개 주석 뺀 토큰 동일(빈 JSX 주석 10곳만 차이). site·frontend·admin tsc, site vitest 105 passed Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
"""Google 로그인 설정과 분리한다."""
|
|
import os
|
|
from dataclasses import dataclass
|
|
from urllib.parse import urlsplit
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SearchConsoleSettings:
|
|
property_url: str
|
|
credentials_file: str
|
|
alert_url: str = ""
|
|
alert_days: int = 7
|
|
|
|
|
|
def load_settings() -> SearchConsoleSettings | None:
|
|
if os.environ.get("GSC_ENABLED") != "1":
|
|
return None
|
|
prop = os.environ.get("GSC_PROPERTY_URL", "").strip()
|
|
key_file = os.environ.get("GSC_CREDENTIALS_FILE", "").strip()
|
|
if not prop or not key_file:
|
|
raise ValueError("GSC_CONFIG_MISSING")
|
|
parsed = urlsplit(prop)
|
|
domain_property = prop.startswith("sc-domain:") and bool(prop.removeprefix("sc-domain:"))
|
|
root_property = (parsed.scheme == "https" and parsed.hostname and parsed.path == "/"
|
|
and not parsed.query and not parsed.fragment and not parsed.username)
|
|
if not domain_property and not root_property:
|
|
raise ValueError("GSC_PROPERTY_INVALID")
|
|
days = int(os.environ.get("GSC_ALERT_DAYS", "7"))
|
|
if days < 1:
|
|
raise ValueError("GSC_ALERT_DAYS_INVALID")
|
|
return SearchConsoleSettings(prop, key_file, os.environ.get("GSC_ALERT_WEBHOOK_URL", ""), days)
|
|
|
|
|
|
def belongs_to_property(page_url: str, property_url: str) -> bool:
|
|
parsed = urlsplit(page_url)
|
|
if parsed.scheme != "https" or not parsed.hostname or parsed.username or parsed.password:
|
|
return False
|
|
if parsed.query or parsed.fragment:
|
|
return False
|
|
if property_url.startswith("sc-domain:"):
|
|
domain = property_url.removeprefix("sc-domain:").lower()
|
|
return bool(domain) and (parsed.hostname == domain or parsed.hostname.endswith("." + domain))
|
|
return page_url.startswith(property_url)
|