From cb73c2309b7cb90f4f14d2e84d2401db04c30462 Mon Sep 17 00:00:00 2001 From: dev_team Date: Thu, 23 Jul 2026 12:31:43 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=ED=84=B0=EB=AF=B8=EB=84=90=20D-day?= =?UTF-8?q?=20=EC=B9=B4=EC=9A=B4=ED=84=B0=20CLI(dday.py)=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 목표 날짜(YYYY-MM-DD)를 받아 오늘 기준 D-N/D+N/D-DAY를 출력하는 CLI. 인자 없음/잘못된 날짜 형식은 stderr 안내 후 크래시 없이 종료. Co-Authored-By: Claude Sonnet 5 --- dday.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 dday.py diff --git a/dday.py b/dday.py new file mode 100644 index 0000000..88743c4 --- /dev/null +++ b/dday.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Terminal D-day counter CLI. + +Given a target date (YYYY-MM-DD), prints how many days remain until it, +have passed since it, or whether it's today. + +Examples: + python dday.py 2026-12-25 # D-155 (future date) + python dday.py 2020-01-01 # D+N (past date) + python dday.py 2026-07-23 # D-DAY (today) +""" + +import argparse +import sys +from datetime import date, datetime + + +def parse_date(text): + """Parse a 'YYYY-MM-DD' string into a date object.""" + return datetime.strptime(text, "%Y-%m-%d").date() + + +def format_dday(target): + """Format the day difference between today and `target` as D-N/D+N/D-DAY.""" + diff = (target - date.today()).days + if diff > 0: + return f"D-{diff}" + if diff < 0: + return f"D+{-diff}" + return "D-DAY" + + +def build_parser(): + parser = argparse.ArgumentParser( + prog="dday.py", + description="터미널 D-day 카운터", + ) + parser.add_argument( + "target_date", + help="목표 날짜 (형식: YYYY-MM-DD)", + ) + return parser + + +def main(): + parser = build_parser() + args = parser.parse_args() + + try: + target = parse_date(args.target_date) + except ValueError: + print( + f"오류: '{args.target_date}'는 올바른 날짜 형식이 아닙니다. YYYY-MM-DD 형식으로 입력하세요. " + "예: python dday.py 2026-12-25", + file=sys.stderr, + ) + return + + print(format_dday(target)) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n중단됨") + sys.exit(130) From 3c91387bb4d6f5329a779afe503379ea206e03f0 Mon Sep 17 00:00:00 2001 From: dev_team Date: Thu, 23 Jul 2026 14:13:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=ED=84=B0=EB=AF=B8=EB=84=90=20?= =?UTF-8?q?=EB=AC=B4=EC=9E=91=EC=9C=84=20=EB=AA=85=EC=96=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20CLI(quote.py)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 24개 명언 중 무작위로 하나를 골라 출력하는 CLI. 인자 없이 실행하면 바로 출력되며, 명언 목록이 비어 있어도 크래시 없이 안내 후 종료. Co-Authored-By: Claude Sonnet 5 --- quote.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 quote.py diff --git a/quote.py b/quote.py new file mode 100644 index 0000000..a954ba1 --- /dev/null +++ b/quote.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +"""Terminal random quote CLI. + +Prints one randomly chosen quote from a local list each time it runs. + +Examples: + python quote.py +""" + +import argparse +import random +import sys + + +QUOTES = [ + ("성공은 열정을 잃지 않고 실패를 거듭할 수 있는 능력이다.", "윈스턴 처칠"), + ("삶이 있는 한 희망은 있다.", "키케로"), + ("시작이 반이다.", "아리스토텔레스"), + ("배움에는 지름길이 없다.", "속담"), + ("최고의 복수는 큰 성공이다.", "프랭크 시나트라"), + ("어제로부터 배우고, 오늘을 위해 살고, 내일을 위해 희망하라.", "알버트 아인슈타인"), + ("길이 없으면 만들면 된다.", "한니발"), + ("천 리 길도 한 걸음부터.", "노자"), + ("실패는 성공의 어머니다.", "속담"), + ("피할 수 없으면 즐겨라.", "로버트 엘리엇"), + ("행동하지 않으면 아무 일도 일어나지 않는다.", "요한 볼프강 폰 괴테"), + ("오늘 할 수 있는 일을 내일로 미루지 마라.", "벤저민 프랭클린"), + ("지혜의 시작은 자신이 모른다는 것을 아는 것이다.", "소크라테스"), + ("당신이 할 수 있다고 믿든 할 수 없다고 믿든, 믿는 대로 될 것이다.", "헨리 포드"), + ("위대한 일은 갑자기 이루어지지 않는다.", "에픽테토스"), + ("실패를 두려워하지 마라. 시도하지 않는 것을 두려워하라.", "속담"), + ("자신을 아는 것이 모든 지혜의 시작이다.", "아리스토텔레스"), + ("인생은 자전거를 타는 것과 같다. 균형을 잡으려면 계속 움직여야 한다.", "알버트 아인슈타인"), + ("변화를 두려워하지 마라. 정체를 두려워하라.", "속담"), + ("좋은 습관은 평범한 사람을 비범하게 만든다.", "속담"), + ("포기하지 않는 한 실패한 것이 아니다.", "속담"), + ("가장 어두운 밤도 끝나고 해가 뜬다.", "빅토르 위고"), + ("당신의 시간은 한정되어 있다. 다른 사람의 삶을 사느라 낭비하지 마라.", "스티브 잡스"), + ("작은 발걸음이 큰 여정을 만든다.", "속담"), +] + + +def load_quotes(): + """Return the list of (quote, author) tuples, or empty list if unavailable.""" + return QUOTES + + +def pick_quote(quotes): + """Randomly select one (quote, author) tuple from `quotes`.""" + return random.choice(quotes) + + +def build_parser(): + parser = argparse.ArgumentParser( + prog="quote.py", + description="터미널 무작위 명언 출력 CLI", + ) + return parser + + +def main(): + parser = build_parser() + parser.parse_args() + + quotes = load_quotes() + if not quotes: + print("안내: 표시할 명언이 없습니다. 명언 목록이 비어 있습니다.", file=sys.stderr) + return + + text, author = pick_quote(quotes) + print(f'"{text}" — {author}') + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n중단됨") + sys.exit(130)