# crawler-lib-ruby (rubycrawler)
AI Summary
Purpose:
- RubyGems 라이브러리/버전/라이선스 크롤러.
LANGUAGE='ruby',REPOSITORY='RUBYGEMS'.
Key points:
- Local path:
~/labrador/crawler/crawler-lib-ruby. Entry:src/ai/labradorlabs/app/main.py(RubyCralwer().run()), resync:main_resync.py. - 운영 DB:
config.iniDbUrl =211.115.125.165:43316/gatheringdb. version/product =labradordb.TB_COMP_LIB_VERSION_RUBY/labradordb.TB_COMP_LIB_PRODUCT, license =gatheringdb.TB_LICENSE_V2, license record =gatheringdb.TB_COMP_LIB_LICENSE_RUBY. - PRODUCT_KEY = 평문 gem 이름(composer 류, 암호화 없음). 버전 정렬 = Java
sort-gen-0.5.0-lib.jar(jpype). - 발견:
api/v1/timeframe_versions.json(버전 게시 시각 7일 윈도우, 2009-07-24부터). 상세:api/v1/versions/{gem}.json+api/v2/rubygems/{gem}/versions/{version}.json. - 누락 안전망:
~/labrador/tool/rubygems_missing_products(finder+backfill, names 인덱스 전수 대조). - 2026-06-11 (미커밋): util/db 레이어의 비누락 error 7곳(licenseeUtil 5 + db/base 2)
warning 강등 — 크롤러 본류는 기존 정리대로 error 2곳(피드 윈도우 스킵, 행 insert skip)만 유지. 시크릿 분리 완료(fb22fc7): GitHub 토큰 2곳 + libraries.io api_key(데드코드) → config.ini[COMMON]/GithubToken·LibrariesApiKey. config 에는 빈 placeholder 만 커밋, 빈 값이면 무인증 폴백. ⚠ 기존 토큰 rotate + 배포 환경 config 주입 필요.
Relevant when:
- 루비 크롤러 누락/라이선스 이슈 진단, 수정.
Do not read full document unless:
- 크롤러 코드를 직접 수정/리뷰할 때.
Linked documents:
ai/worklog/2026/2026-W24.mdai/workspace/repos.md
Open Questions
- 수정본(branch
fix/ruby-crawler-missing-data)은 운영 환경 스모크(1윈도우) 미실시 — 이 머신은versionSort가/workspacejar로 JVM을 띄워 전체 실행 불가. 컨테이너/CI에서 1윈도우 검증 필요. TB_COMP_LIB_LICENSE_RUBY의LIBRARIES컬럼은 이제 항상 NULL(소스 제거). 다운스트림 의존 여부 확인 권장.
Details
누락(데이터 미수집) 원인 — 2026-06-09 분석
- 발견 페이지/윈도우 유실 (A):
getJsonRequests가 200이 아니면(429/5xx/timeout)None반환.run()이 이를 "윈도우 끝"과 구분 못 해, 일시 실패 시 다음 7일 윈도우로 건너뛰고 진척을 STATUS에 기록 → 그 윈도우 잔여 페이지의 gem 전부 영구 누락. - 레이트리밋 무방비 (B): 429/Retry-After 미처리(3회·백오프 없음) → A를 유발하는 실질 트리거.
- 조기 종료 (B): 최근 윈도우에서 빈/실패 응답이면 크롤러 전체 return.
- 패키지 단위 예외 드롭 (C):
dataCrawlingper-package try/except가 예외 시 gem을 통째로 skip. 발생원: github clone/licensee/libraries.io 네트워크,getPythonReleaseDate의strptime예외(try/except 없음 +[:find('.')-1]초 손상). - 배치 insert 무폴백 (D):
executeSql가 예외를 삼키고,setInsertIntoDB가 행별 폴백 없음 → 불량행 1개로 1000건 청크 전체 유실. - 전체 reconciliation 부재 (E): 시간 윈도우 전진형 증분만 존재, names 전수 대조 안전망 없음 → 한번 놓치면 resync 전까지 영구.
수정 (branch fix/ruby-crawler-missing-data, commit a52d550)
데이터 포맷(컬럼/JSON 구조/값 산출)은 불변. coverage·라이선스 출처 우선순위·libraries 제거만 변경.
- A·B
common.pygetJsonRequestsStatus(429 Retry-After/5xx/timeout 지수 백오프,(json, ok)),run()일시오류 시 같은 페이지 재시도(상한 10회, 초과 시 로그 후 진행). 404/410=정상 종료. - C(날짜)
getPythonReleaseDate견고 ISO 파싱 + 예외 미발생(실패 None). 초 손상 해소. - C(보강)
dataCrawling/fetchMissingVersions: 코어 version 행 먼저 append, 라이선스/정렬 보강은 try/except 격리 → 실패해도 코어 유지. - D
cdbvdb.executeSql예외 raise +baseCralwer._insertChunked행별 폴백(불량행만 skip). - 라이선스 체인 재구성: libraries.io 제거.
component.resolveStandardLicense= rubygems API → licensee(클론+detect) → github(클론 LICENSE 파일 원문 SPDX 매칭). rubygems에서 찾으면 클론/licensee/github 생략(성능+우선순위). github repo URL은 rubygems 메타에서만 취득.LICENSE_AI유지. - 검증: 5개 파일
py_compileOK; 순수함수 단위 테스트(날짜 7케이스, fetch 200/404/429→200/503×6/empty, SPDX 텍스트매칭 MIT→[247]·Apache→[32], chain step1 no-clone, per-row 폴백 시뮬). 운영 전체 실행은 JVM jar 경로(/workspace) 의존으로 이 머신 불가.