Skip to content

feat: 파이썬 분석 엔진에 CSV 형식의 큐시트 추출 기능 추가#689

Open
seonghobae wants to merge 2 commits into
developfrom
feature/csv-export-11423156772664678875
Open

feat: 파이썬 분석 엔진에 CSV 형식의 큐시트 추출 기능 추가#689
seonghobae wants to merge 2 commits into
developfrom
feature/csv-export-11423156772664678875

Conversation

@seonghobae

Copy link
Copy Markdown
Collaborator

파이썬 분석 엔진(services/analysis-engine) 내에 곡 페이로드를 입력받아 구조화된 CSV 텍스트로 변환하는 기능을 추가했습니다.

변경 내용

  • bandscope_analysis/exports/csv_export.py 모듈 신규 추가
    • build_csv_text 함수를 통해 RehearsalSong을 인메모리 버퍼 기반의 CSV 문자열로 안전하게 직렬화.
    • CSV 포뮬러 인젝션 공격 방어를 위한 선행 특수문자(=, +, -, @) 필터링 이스케이프 로직 적용.
  • bandscope_analysis/exports/__init__.py__all__에 새 모듈 추가
  • services/analysis-engine/tests/test_csv_export.py를 통한 100% 테스트 커버리지 달성
    • 성공적인 엣지 케이스, None 및 빈 매핑 구조 방어 테스트 포함.
    • 보안을 위한 인젝션 완화 메커니즘 테스트 케이스 포함.
  • CHANGELOG.md 에 업데이트 내용 기록

모든 검증 스크립트(quickcheck.sh)와 pre-commit 단계를 완료하였으며, 코드 리뷰 및 메모리 기록 또한 반영되었습니다.


PR created automatically by Jules for task 11423156772664678875 started by @seonghobae

@google-labs-jules

Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copilot AI review requested due to automatic review settings July 21, 2026 21:56

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a CSV cue-sheet export path to the Python analysis engine (services/analysis-engine) so a RehearsalSong-shaped payload can be serialized into a structured CSV text output suitable for downstream use (e.g., cue sheets), with explicit formula-injection mitigation and test coverage.

Changes:

  • Introduces build_csv_text() in a new bandscope_analysis.exports.csv_export module to emit an in-memory CSV string from cue-sheet rows, including CSV formula-injection escaping.
  • Exposes the new export via bandscope_analysis.exports package exports.
  • Adds a dedicated test suite covering success cases, malformed input behavior, and injection mitigation; updates CHANGELOG.md.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
services/analysis-engine/src/bandscope_analysis/exports/csv_export.py New CSV export builder with formula-injection escaping and safe handling of malformed/empty input.
services/analysis-engine/src/bandscope_analysis/exports/init.py Re-exports build_csv_text via the exports package surface.
services/analysis-engine/tests/test_csv_export.py Adds tests for CSV output shape, edge cases, and injection mitigation behavior.
CHANGELOG.md Documents the new CSV cue-sheet export feature.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copilot AI review requested due to automatic review settings July 21, 2026 22:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated 1 comment.

Comment on lines +58 to +64
[
_escape_csv_field(row.get("section", "")),
_escape_csv_field(row.get("start", "")),
_escape_csv_field(row.get("end", "")),
_escape_csv_field(row.get("cue", "")),
_escape_csv_field(", ".join(row.get("roles", []))),
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants