파일마다 포맷 폭이 달라(≈80 대 100) 한 줄만 고쳐도 포맷터가 무관한 줄을 대량 재포맷했음. 사용자 지시로 전체를 한 번에 맞춤. 코드 동작 변경 없음 — 포맷만. - 프론트엔드 `.ts/.css/.html` → 저장소 prettier (`.prettierrc`, printWidth 100) - `B07_DesignDetail/openwebcad/**` → 자체 biome (tab 들여쓰기·single quote·lineWidth 100). `biome format` 만 사용 — `biome lint --write` 는 포맷 아닌 코드 수정까지 하므로 제외 - 파이썬 → `ruff format` (엔진 코드는 이미 정합, resources·scratch 스크립트 24개만 변경) 두 포맷터가 서로 되돌리지 않도록 `.prettierignore` 신규 — openwebcad 와 빌드·산출물 폴더를 prettier 대상에서 뺌. `.prettierrc` 에 `endOfLine: "auto"` 추가 — 기본값 `lf` 가 `core.autocrlf=true` 로 받은 CRLF 파일을 매번 전부 다시 써서 `--list-different` 가 실제 포맷 차이를 가리고 있었음. 검증: `tsc --noEmit` 통과(루트·openwebcad 둘 다), pytest 349 passed / 17 skipped / 0 failed, CAD vitest 87건 중 81 passed / 6 failed(laptop-sub 기준선과 동일, 회귀 없음). 포맷터 재실행 시 prettier·biome 모두 변경 0건. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
314 lines
11 KiB
Python
314 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""lawapi.json에서 정확명 매칭 행을 뽑아 시행일/개정일 맵 생성 + 수동 보정."""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
import os as _os
|
|
from pathlib import Path as _P
|
|
|
|
# 이 스크립트는 original/_pipeline/ 에 위치. 코퍼스 루트 = 상위 폴더.
|
|
ROOT_DIR = _P(__file__).resolve().parent.parent # ...\original
|
|
DATA_DIR = _P(__file__).resolve().parent / "data" # 생성 데이터(JSON)
|
|
|
|
|
|
# API 키: 커밋 금지 파일(law/.secrets.local.md) 또는 환경변수에서 읽는다.
|
|
def _load_key(name):
|
|
v = _os.environ.get(name)
|
|
if v:
|
|
return v.strip()
|
|
sec = ROOT_DIR.parent / ".secrets.local.md"
|
|
if sec.exists():
|
|
import re as _re
|
|
|
|
for pat in (r"KCSC[\s\S]*?`([A-Za-z0-9]{20,})`", r"인증키[:\s]*`?([A-Za-z0-9]{30,})`?"):
|
|
m = _re.search(pat, sec.read_text(encoding="utf-8"))
|
|
if m:
|
|
return m.group(1)
|
|
return ""
|
|
|
|
|
|
OUT = Path(str(DATA_DIR))
|
|
api = json.load(open(OUT / "lawapi.json", encoding="utf-8"))
|
|
|
|
# 목록상 명칭 -> API 조회명 (다르면 매핑)
|
|
Q = {
|
|
"산림자원의 조성 및 관리에 관한 법률": "산림자원의 조성 및 관리에 관한 법률",
|
|
"산림자원의 조성 및 관리에 관한 법률 시행령": "산림자원의 조성 및 관리에 관한 법률 시행령",
|
|
"산림자원의 조성 및 관리에 관한 법률 시행규칙": "산림자원의 조성 및 관리에 관한 법률 시행규칙",
|
|
"산림기술 진흥 및 관리에 관한 법률": "산림기술 진흥 및 관리에 관한 법률",
|
|
"산림기술 진흥 및 관리에 관한 법률 시행령": "산림기술 진흥 및 관리에 관한 법률 시행령",
|
|
"산림보호법": "산림보호법",
|
|
"산지관리법": "산지관리법",
|
|
"자연환경보전법": "자연환경보전법",
|
|
"자연재해대책법": "자연재해대책법",
|
|
"환경영향평가법": "환경영향평가법",
|
|
"보조금 관리에 관한 법률": "보조금 관리에 관한 법률",
|
|
"국가를 당사자로 하는 계약에 관한 법률": "국가를 당사자로 하는 계약에 관한 법률",
|
|
"국가를 당사자로 하는 계약에 관한 법률 시행령": "국가를 당사자로 하는 계약에 관한 법률 시행령",
|
|
"지방자치단체를 당사자로 하는 계약에 관한 법률": "지방자치단체를 당사자로 하는 계약에 관한 법률",
|
|
"지방자치단체를 당사자로 하는 계약에 관한 법률 시행령": "지방자치단체를 당사자로 하는 계약에 관한 법률 시행령",
|
|
"도로법": "도로법",
|
|
"농어촌도로정비법": "농어촌도로 정비법",
|
|
"국토의 계획 및 이용에 관한 법률": "국토의 계획 및 이용에 관한 법률",
|
|
"도로명주소법": "도로명주소법",
|
|
"도로명주소법 시행령": "도로명주소법 시행령",
|
|
"측량ㆍ수로조사 및 지적에 관한 법률": "공간정보의 구축 및 관리 등에 관한 법률",
|
|
"산업안전보건법": "산업안전보건법",
|
|
"산업재해보상보험법": "산업재해보상보험법",
|
|
"고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률": "고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률",
|
|
"고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률 시행령": "고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률 시행령",
|
|
"고용보험법 시행령": "고용보험법 시행령",
|
|
"국민건강보험법": "국민건강보험법",
|
|
"국민연금법": "국민연금법",
|
|
"노인장기요양보험법": "노인장기요양보험법",
|
|
"노인장기요양보험법 시행령": "노인장기요양보험법 시행령",
|
|
"부가가치세법": "부가가치세법",
|
|
"근로기준법": "근로기준법",
|
|
"산업표준화법": "산업표준화법",
|
|
"전자서명법": "전자서명법",
|
|
"공동주택관리법": "공동주택관리법",
|
|
"임도설치 및 관리 등에 관한 규정": "임도설치 및 관리 등에 관한 규정",
|
|
"훈령ㆍ예규 등의 발령 및 관리에 관한 규정": "훈령·예규 등의 발령 및 관리에 관한 규정",
|
|
"사업종류별 산재보험료율 고시": "사업종류별 산재보험료율",
|
|
"건설업 산업안전보건관리비 계상 및 사용기준": "건설업 산업안전보건관리비 계상 및 사용기준",
|
|
"(국토교통부) 사회보험의 보험료 적용기준": "사회보험의 보험료 적용기준",
|
|
"엔지니어링사업대가의 기준": "엔지니어링사업대가의 기준",
|
|
}
|
|
# 조회명이 목록명과 다른 경우 실제 API 반환명 지정
|
|
EXACT = {
|
|
"농어촌도로정비법": "농어촌도로 정비법",
|
|
"측량ㆍ수로조사 및 지적에 관한 법률": "공간정보의 구축 및 관리 등에 관한 법률",
|
|
"훈령ㆍ예규 등의 발령 및 관리에 관한 규정": "훈령ㆍ예규 등의 발령 및 관리에 관한 규정",
|
|
"사업종류별 산재보험료율 고시": "2026년도 사업종류별 산재보험료율",
|
|
"(국토교통부) 사회보험의 보험료 적용기준": "(국토교통부) 사회보험의 보험료 적용기준",
|
|
}
|
|
|
|
SRC_LAW = "국가법령정보센터"
|
|
m = {}
|
|
for name, q in Q.items():
|
|
rows = api.get(q, {}).get("rows", [])
|
|
want = EXACT.get(name, name)
|
|
hit = next((r for r in rows if r["명"] == want), None) or next(
|
|
(r for r in rows if r["명"].startswith(want)), None
|
|
)
|
|
if not hit:
|
|
print("!! 미매칭", name, "|", [r["명"] for r in rows][:3])
|
|
continue
|
|
m[name] = {
|
|
"시행": hit["시행"],
|
|
"개정": hit["공포"],
|
|
"구분": hit["제개정"],
|
|
"호수": hit["번호"],
|
|
"종류": hit["종류"],
|
|
"출처": SRC_LAW,
|
|
"실명": hit["명"],
|
|
}
|
|
|
|
# ── 2·3차 조회 결과 및 별표·비수록 항목 수동 등록 ──
|
|
MANUAL = {
|
|
"국가균형발전특별법": (
|
|
"2026.07.01",
|
|
"2026.03.05",
|
|
"일부개정",
|
|
"21447",
|
|
"법률",
|
|
SRC_LAW,
|
|
"폐지·승계 → 「지방자치분권 및 균형성장에 관한 특별법」",
|
|
),
|
|
"수치지도 작성 작업규칙": (
|
|
"2015.06.04",
|
|
"2015.06.04",
|
|
"일부개정",
|
|
"00209",
|
|
"국토교통부령",
|
|
SRC_LAW,
|
|
"",
|
|
),
|
|
"재난구호 및 재난복구 비용 부담기준 등에 관한 규정": (
|
|
"2025.11.28",
|
|
"2025.11.27",
|
|
"일부개정",
|
|
"35875",
|
|
"대통령령",
|
|
SRC_LAW,
|
|
"「자연재난 구호 및 복구 비용…규정」으로 분리 (사회재난분 별도 35876)",
|
|
),
|
|
"임도 품셈 적용기준 / 임도표준품셈": (
|
|
"2026.01.01",
|
|
"2025.11.26",
|
|
"전부개정",
|
|
"2025-82",
|
|
"고시",
|
|
SRC_LAW,
|
|
"현 「산림사업 표준품셈」(산림청 고시)",
|
|
),
|
|
"건설공사 감독자 업무 지침": (
|
|
"2026.07.08",
|
|
"2026.07.08",
|
|
"일부개정",
|
|
"2026-360",
|
|
"고시",
|
|
SRC_LAW,
|
|
"현 「건설공사 사업관리방식 검토기준 및 업무수행지침」",
|
|
),
|
|
"공사장의 비산분진 발생원 시설관리기준": (
|
|
"2026.07.15",
|
|
"2026.07.15",
|
|
"일부개정",
|
|
"00049",
|
|
"환경부령",
|
|
SRC_LAW,
|
|
"「대기환경보전법 시행규칙」 별표에 수록",
|
|
),
|
|
"국가지점번호판 규격 등 고시": (
|
|
"2024.07.05",
|
|
"2024.07.05",
|
|
"제정",
|
|
"2024-56",
|
|
"고시",
|
|
SRC_LAW,
|
|
"「국가지점번호의 표기 및 국가지점번호판의 설치 확인에 관한 업무 위탁 고시」",
|
|
),
|
|
"국가지점번호 부여기준 및 방법": (
|
|
"2012.12.18",
|
|
"2012.12.12",
|
|
"제정",
|
|
"2012-55",
|
|
"고시",
|
|
SRC_LAW,
|
|
"「국가지점번호 기준점 고시」",
|
|
),
|
|
"입찰유의서(계약예규)": (
|
|
"2025.12.31",
|
|
"2025.12.31",
|
|
"일부개정",
|
|
"",
|
|
"계약예규",
|
|
SRC_LAW,
|
|
"「(계약예규) 공사입찰유의서」",
|
|
),
|
|
"콘크리트 표준시방서": (
|
|
"2025.01.05",
|
|
"2024.12.30",
|
|
"일부개정",
|
|
"2025-879",
|
|
"고시",
|
|
"국가건설기준센터",
|
|
"KCS 14 20 00 (국토교통부 고시로도 수록)",
|
|
),
|
|
"도로공사 표준시방서": (
|
|
"2023.01.12",
|
|
"2023.01.06",
|
|
"일부개정",
|
|
"2023-907",
|
|
"고시",
|
|
"국가건설기준센터",
|
|
"KCS 44 00 00",
|
|
),
|
|
"토목공사 표준시방서": (
|
|
"2023.01.25",
|
|
"2023.01.19",
|
|
"일부개정",
|
|
"2023-48",
|
|
"고시",
|
|
"국가건설기준센터",
|
|
"현 KCS 10 00 00 공통공사 표준시방서로 재편",
|
|
),
|
|
"건설공사 표준시방서": (
|
|
"2018.08.09",
|
|
"2018.08.03",
|
|
"제정",
|
|
"2018-468",
|
|
"고시",
|
|
"국가건설기준센터",
|
|
"건설기준 코드(KDS/KCS) 체계로 통합",
|
|
),
|
|
"건설공사 비탈면 표준시방서": (
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"국가건설기준센터",
|
|
"KCS 11 70 00 비탈면 (법령정보센터 미수록)",
|
|
),
|
|
"임도시설공사 표준시방서": (
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"산림청",
|
|
"법령정보센터·건설기준센터 모두 미수록",
|
|
),
|
|
"산림관리기반시설의 설계 및 시설기준": (
|
|
"2026.02.01",
|
|
"2026.02.01",
|
|
"",
|
|
"",
|
|
"별표",
|
|
SRC_LAW,
|
|
"「산림자원법 시행규칙」 별표2에 수록",
|
|
),
|
|
"산림관리기반시설의 범위 및 기준": (
|
|
"2026.02.01",
|
|
"2026.02.01",
|
|
"",
|
|
"",
|
|
"별표",
|
|
SRC_LAW,
|
|
"「산림자원법 시행규칙」 별표1에 수록",
|
|
),
|
|
"산림관리기반시설의 타당성평가 항목별 기준 및 방법": (
|
|
"2026.02.01",
|
|
"2026.02.01",
|
|
"",
|
|
"",
|
|
"별표",
|
|
SRC_LAW,
|
|
"「산림자원법 시행규칙」 별표1의2에 수록",
|
|
),
|
|
"지방산림청과 자연휴양림관리소와의 자연휴양림업무 처리지침": (
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"지침",
|
|
"산림청",
|
|
"법령정보센터 미수록",
|
|
),
|
|
"중기운용관리예규 / 차량관리예규": ("", "", "", "", "예규", "산림청", "법령정보센터 미수록"),
|
|
"예산편성기준": (
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"지침",
|
|
"기획재정부",
|
|
"「예산안 편성 및 기금운용계획안 작성지침」 — 법령정보센터 미수록, 기재부 연간 배포",
|
|
),
|
|
"토목공사원가계산 제비율 적용기준": (
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"기준",
|
|
"조달청",
|
|
"법령정보센터 미수록, 조달청 연간 발표",
|
|
),
|
|
}
|
|
for k, v in MANUAL.items():
|
|
m[k] = {
|
|
"시행": v[0],
|
|
"개정": v[1],
|
|
"구분": v[2],
|
|
"호수": v[3],
|
|
"종류": v[4],
|
|
"출처": v[5],
|
|
"실명": "",
|
|
"추가": v[6],
|
|
}
|
|
|
|
json.dump(m, open(OUT / "srcmap.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)
|
|
print(f"매핑 {len(m)}건 생성")
|