{"id":16577446,"url":"https://github.com/alchemine/base-project","last_synced_at":"2026-05-10T05:35:28.032Z","repository":{"id":157530346,"uuid":"633476381","full_name":"alchemine/base-project","owner":"alchemine","description":"base-project: Basic Project Environment for Python Development","archived":false,"fork":false,"pushed_at":"2025-03-26T17:10:41.000Z","size":264,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2025-03-26T18:25:18.301Z","etag":null,"topics":["docker","fastapi","logging","python","timer"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alchemine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-27T15:22:50.000Z","updated_at":"2025-03-26T17:10:45.000Z","dependencies_parsed_at":"2023-11-24T08:28:49.978Z","dependency_job_id":"2628ccc8-ead3-438d-9265-b9ce19f3b596","html_url":"https://github.com/alchemine/base-project","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alchemine/base-project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alchemine%2Fbase-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alchemine%2Fbase-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alchemine%2Fbase-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alchemine%2Fbase-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alchemine","download_url":"https://codeload.github.com/alchemine/base-project/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alchemine%2Fbase-project/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260866219,"owners_count":23074781,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","fastapi","logging","python","timer"],"created_at":"2024-10-11T22:10:53.952Z","updated_at":"2026-05-10T05:35:28.027Z","avatar_url":"https://github.com/alchemine.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# base-project: Python 개발을 위한 기본 프로젝트 환경\n\n본 프로젝트는 여러가지 유용한 도구들을 기반으로 하는 Python 프로젝트 환경 구축을 목표로 하고 있습니다.\n\n## 0. 빠른 시작\n\n- 의존성 및 테스트 환경 설치\n  ```bash\n  conda create -n base-project python=3.12 -y\n  conda activate base-project\n  pip install -r requirements.txt -r tests/requirements.txt\n  ```\n- 테스트 실행\n  ```bash\n  pytest -q\n  ```\n- 애플리케이션 실행 (FastAPI)\n  ```bash\n  python -m app.main\n  # 또는\n  uvicorn app:application --host 0.0.0.0 --port 8000 --reload\n  ```\n  - 실행 후 브라우저에서 `http://localhost:8000/docs` 접속\n\n## 1. 개발 환경\n\n다양한 플랫폼에서 일관성 있는 개발 경험을 제공하기 위해 다음과 같은 환경을 설정했습니다.\n\n- **Dev Container**: Visual Studio Code의 Dev Containers를 활용하여 일관된 개발 환경을 제공합니다.\n  - 설정 파일: `.devcontainer/devcontainer.json`\n- **Docker**: 배포 및 테스트를 위한 컨테이너화를 지원합니다.\n  - 설정 파일: `Dockerfile`, `docker-compose.yml`\n- **Python**:\n  - 프로젝트 설정: `pyproject.toml`\n  - 의존성 관리: `requirements.txt`\n\n## 2. 코어 유틸리티\n\n`src/common/` 디렉토리에는 개발 생산성을 높이기 위한 여러 유틸리티 모듈이 포함되어 있습니다.\n\n### 2.1 Timer\n\n코드 실행 시간을 측정하는 기능을 제공합니다.\n\n1. **Context manager**\n\n   ```python\n   from time import sleep\n   from src.common.timer import Timer\n\n   with Timer(\"Task 1\"):\n       # Here is code snippet\n       sleep(1)\n   ```\n\n   출력:\n\n   ```\n   * Task 1        | 1.00s (0.02m)\n   ```\n\n2. **Decorator**\n\n   ```python\n   from time import sleep\n   from src.common.timer import Timer, T\n\n   @Timer(\"Task 1\")\n   def fn1():\n       sleep(1)\n\n   @T\n   def fn2():\n       sleep(1)\n\n   fn1()\n   fn2()\n   ```\n\n   출력:\n\n   ```\n   2025-08-09 00:19:37 | service_name | INFO     | [START]   Task 1\n   2025-08-09 00:19:38 | service_name | INFO     | [SUCCESS] Task 1 (0.02m)\n   2025-08-09 00:19:38 | service_name | INFO     | [START]   fn2\n   2025-08-09 00:19:39 | service_name | INFO     | [SUCCESS] fn2 (0.02m)\n   ```\n\n### 2.2 Depth logging\n\n함수 호출 스택을 시각화하고, 실행 시간을 측정하는 기능을 제공합니다.\n\n```python\nfrom src.common.depth_logging import D\n\n@D\ndef main():\n    main1()\n    main2()\n\n@D\ndef main1():\n    main11()\n    main12()\n\n@D\ndef main11():\n    return\n\n@D\ndef main12():\n    return\n\n@D\ndef main2():\n    main21()\n\n@D\ndef main21():\n    return\n\nmain()\n```\n\n출력:\n\n```\n2025-08-09 00:03:53 | service_name | INFO     | [START]   1.1              | main()\n2025-08-09 00:03:53 | service_name | INFO     | [START]   1.1.1            | main1()\n2025-08-09 00:03:53 | service_name | INFO     | [START]   1.1.1.1          | main11()\n2025-08-09 00:03:53 | service_name | INFO     | [SUCCESS] 1.1.1.1          | main11() (0.00m)\n2025-08-09 00:03:53 | service_name | INFO     | [START]   1.1.2.1          | main12()\n2025-08-09 00:03:53 | service_name | INFO     | [SUCCESS] 1.1.2.1          | main12() (0.00m)\n2025-08-09 00:03:53 | service_name | INFO     | [SUCCESS] 1.1.1            | main1() (0.00m)\n2025-08-09 00:03:53 | service_name | INFO     | [START]   1.2.1            | main2()\n2025-08-09 00:03:53 | service_name | INFO     | [START]   1.2.1.1          | main21()\n2025-08-09 00:03:53 | service_name | INFO     | [SUCCESS] 1.2.1.1          | main21() (0.00m)\n2025-08-09 00:03:53 | service_name | INFO     | [SUCCESS] 1.2.1            | main2() (0.00m)\n2025-08-09 00:03:53 | service_name | INFO     | [SUCCESS] 1.1              | main() (0.00m)\n```\n\n### 2.3 Logging\n\nConsole과 file에 log를 기록합니다. \\\nLog는 `logs/YYYY-MM-DD.log` 파일에 저장되어 쉽게 추적하고 디버깅할 수 있습니다. \\\n유틸리티 함수를 이용하면 간편하게 사용할 수 있습니다.\n\n```python\nfrom src.common.logger import (\n    slog,\n    log_info,\n    log_success,\n    log_error,\n    log_warning,\n    log_api,\n    STYLES,\n)\n\nlog_info(\"This is an info message.\")\nlog_success(\"This is a success message.\")\nlog_error(\"This is an error message.\")\nlog_warning(\"This is a warning message.\")\nlog_api(\"This is an API message.\")\nfor style in STYLES:\n    slog(f\"This is a {style} message.\", style=style)\n```\n\n![alt text](assets/image.png)\n\n### 2.4 Safe HTTP requests\n\nError handling 및 logging을 포함하여 HTTP 요청을 안전하게 수행할 수 있습니다.\n\n동기 방식:\n\n```python\nfrom src.common.request_utils import safe_request\n\nurl = \"https://httpbin.org/post\"\npayload = {\"key\": \"value\"}\nresponse = safe_request(url, json=payload, method=\"post\")\n```\n\n비동기 방식:\n\n```python\nimport aiohttp\nfrom src.common.request_utils import async_safe_request\n\nasync with aiohttp.ClientSession() as session:\n    url = \"https://httpbin.org/post\"\n    payload = {\"key\": \"value\"}\n    response = await async_safe_request(session, url, json=payload, method=\"post\")\n```\n\n---\n\n## 3. Playground\n\n- 간단한 실행/시연 스크립트는 `playground/` 디렉터리에서 확인할 수 있습니다.\n  - 예: `playground/chore_add-tests-for-common-utils/verify_tests.py`\n\n이 프로젝트가 여러분의 Python 개발 경험을 향상시키는 데 도움이 되기를 바랍니다!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falchemine%2Fbase-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falchemine%2Fbase-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falchemine%2Fbase-project/lists"}