Gemini CLI 예제
Gemini CLI를 어디서부터 시작해야 할지 모르시겠나요? 이 문서에서는 다양한 작업에 Gemini CLI를 사용하는 방법에 대한 예제를 다룹니다.
참고: 결과는 잠재적인 사용 사례를 보여주기 위한 예시입니다. 실제 결과는 다를 수 있습니다.
내용을 기반으로 사진 이름 바꾸기
시나리오: 다음 파일이 포함된 폴더가 있습니다.
photos/photo1.png
photos/photo2.png
photos/photo3.pngGemini에 다음 프롬프트를 입력하세요.
"photos" 디렉터리에 있는 사진의 이름을 내용을 기반으로 변경해 주세요.결과: Gemini가 파일 이름 변경 권한을 요청합니다.
Allow once를 선택하면 파일 이름이 변경됩니다.
photos/yellow_flowers.png
photos/antique_dresser.png
photos/green_android_robot.png코드를 읽어 리포지토리 설명하기
시나리오: 단순히 README만 보는 것이 아니라 코드를 검사하여 인기 있는 오픈 소스 유틸리티가 어떻게 작동하는지 이해하고 싶습니다.
Gemini CLI에 다음 프롬프트를 입력하세요.
https://github.com/chalk/chalk에서 'chalk' 리포지토리를 복제하고, 주요 소스 파일을 읽고, 어떻게 작동하는지 설명해 주세요.결과: Gemini는 요청에 응답하기 위해 일련의 작업을 수행합니다.
- 먼저
git clone을 실행하여 리포지토리를 다운로드할 수 있는 권한을 요청합니다. - 다음으로 중요한 소스 파일을 찾고 이를 읽을 수 있는 권한을 요청합니다.
- 마지막으로 코드를 분석한 후 요약을 제공합니다.
Gemini CLI는 실제 소스 코드를 기반으로 한 설명을 반환합니다.
`chalk` 라이브러리는 색상으로 터미널 출력을 스타일링하기 위한 인기 있는 npm 패키지입니다. 소스 코드를 분석한 결과, 작동 방식은 다음과 같습니다.
- **핵심 기능:** 기본 파일은 체인 가능한 API를 설정합니다. 각 색상이나 수정자(예: `bold` 또는 `italic`)는 해당 ANSI 이스케이프 코드를 내부 스택에 추가하는 getter입니다.
- **체인 가능한 API:** `chalk.red.bold('Hello')`를 호출하면 getter에 액세스하는 것입니다. `red` getter는 빨간색 코드를 추가하고 `bold` getter는 굵게 코드를 추가합니다.
- **출력 생성:** 체인이 문자열로 처리될 때(예: `console.log`에서) 최종 `toString()` 메서드가 호출됩니다. 이 메서드는 저장된 모든 ANSI 코드를 결합하고 입력 문자열('Hello')을 감싸고 끝에 재설정 코드를 추가합니다. 이렇게 하면 터미널이 렌더링할 수 있는 최종 스타일 문자열이 생성됩니다.두 개의 스프레드시트를 하나의 스프레드시트로 결합하기
시나리오: Revenue - 2023.csv와 Revenue - 2024.csv라는 두 개의 .csv 파일이 있습니다. 각 파일에는 다음과 같은 월별 수익 수치가 포함되어 있습니다.
January,0
February,0
March,0
April,900
May,1000
June,1000
July,1200
August,1800
September,2000
October,2400
November,3400
December,2100이 두 개의 .csv 파일을 하나의 .csv 파일로 결합하고 싶습니다.
Gemini CLI에 다음 프롬프트를 입력하세요.
두 개의 .csv 파일을 하나의 .csv 파일로 결합하고 각 연도를 다른 열로 만드세요.결과: Gemini CLI가 각 파일을 읽은 다음 새 파일을 쓸 수 있는 권한을 요청합니다. 권한을 제공하면 Gemini CLI가 다음 .csv를 제공합니다.
Month,2023,2024
January,0,1000
February,0,1200
March,0,2400
April,900,500
May,1000,800
June,1000,900
July,1200,1000
August,1800,400
September,2000,2000
October,2400,3400
November,3400,1800
December,2100,9000단위 테스트 실행
시나리오: 간단한 로그인 페이지를 작성했습니다. 로그인 페이지에 코드 커버리지가 있는지 확인하기 위해 단위 테스트를 작성하려고 합니다.
Gemini CLI에 다음 프롬프트를 입력하세요.
Login.js에 대한 단위 테스트를 작성해 주세요.결과: Gemini CLI가 새 파일을 쓸 수 있는 권한을 요청하고 로그인 페이지에 대한 테스트를 만듭니다.
import React from 'react';
import { render, fireEvent, waitFor } from '@testing-library/react';
import Login from './Login';
// Mock the API call for login
jest.mock('./api', () => ({
login: jest.fn(),
}));
describe('Login component', () => {
it('renders the login form correctly', () => {
const { getByLabelText, getByText } = render(<Login />);
expect(getByLabelText('Username')).toBeInTheDocument();
expect(getByLabelText('Password')).toBeInTheDocument();
expect(getByText('Login')).toBeInTheDocument();
});
it('shows an error message with invalid credentials', async () => {
const { getByLabelText, getByText, findByText } = render(<Login />);
const usernameInput = getByLabelText('Username');
const passwordInput = getByLabelText('Password');
const loginButton = getByText('Login');
// Mock the API to return an error
require('./api').login.mockRejectedValue(new Error('Invalid credentials'));
fireEvent.change(usernameInput, { target: { value: 'testuser' } });
fireEvent.change(passwordInput, { target: { value: 'wrongpassword' } });
fireEvent.click(loginButton);
const errorMessage = await findByText('Invalid credentials');
expect(errorMessage).toBeInTheDocument();
});
it('logs in successfully with valid credentials', async () => {
const onLoginSuccess = jest.fn();
const { getByLabelText, getByText } = render(
<Login onLoginSuccess={onLoginSuccess} />,
);
const usernameInput = getByLabelText('Username');
const passwordInput = getByLabelText('Password');
const loginButton = getByText('Login');
// Mock the API to return a success message
require('./api').login.mockResolvedValue({ success: true });
fireEvent.change(usernameInput, { target: { value: 'testuser' } });
fireEvent.change(passwordInput, { target: { value: 'correctpassword' } });
fireEvent.click(loginButton);
await waitFor(() => {
expect(onLoginSuccess).toHaveBeenCalled();
});
});
it('disables the submit button while submitting', async () => {
const { getByLabelText, getByText } = render(<Login />);
const usernameInput = getByLabelText('Username');
const passwordInput = getByLabelText('Password');
const loginButton = getByText('Login');
// Mock the API to have a delay
require('./api').login.mockImplementation(
() =>
new Promise((resolve) =>
setTimeout(() => resolve({ success: true }), 1000),
),
);
fireEvent.change(usernameInput, { target: { value: 'testuser' } });
fireEvent.change(passwordInput, { target: { value: 'correctpassword' } });
fireEvent.click(loginButton);
expect(loginButton).toBeDisabled();
await waitFor(() => {
expect(loginButton).not.toBeDisabled();
});
});
});