From 36381bd86a19d4ba5d92b0d2d2d0c7bcee803d1f Mon Sep 17 00:00:00 2001 From: mini Date: Sat, 5 Jul 2025 17:27:16 +0900 Subject: [PATCH 01/31] =?UTF-8?q?feat:=20Poetry=EB=A1=9C=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EC=B4=88=EA=B8=B0=ED=99=94=20#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 17 ++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 .gitignore create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4f2f6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# Python 생성 파일 +__pycache__/ # 파이썬 캐시 디렉토리 +**/__pycache__/ +*.pyc # 컴파일된 바이트코드 파일 +*.pyo +*.pyd +.Python # 가상환경 관련 숨김 파일 + +# 가상환경 폴더 (Poetry, venv 등) +env/ +venv/ +.venv/ # Poetry가 생성하는 가상환경 폴더 + +# IDE 설정 파일 +.vscode/ # VSCode 개인 설정 + +# Poetry +# poetry.lock은 반드시 공유 +*.lock +!poetry.lock + +# 데이터베이스 파일 +*.db +*.sqlite +*.sqlite3 + +# 로그 및 임시 파일 +*.log +*.tmp +tmp/ +temp/ + +# 운영체제 및 기타 불필요한 파일 +.DS_Store # macOS에서 생성되는 메타파일 +Thumbs.db # Windows에서 생성되는 파일 +desktop.ini # Windows 바탕화면 설정 파일 + +# 테스트 커버리지 리포트 +htmlcov/ +.tox/ +.coverage +.cache/ +.pytest_cache/ + +# 빌드/배포 디렉토리 +dist/ +build/ +*.egg-info/ + +# 환경 변수 파일 (보안 이슈) +.env # 환경 변수 파일 +.env.* + +# Jupyter Notebook 체크포인트 (혹시 사용 시) +#.ipynb_checkpoints/ diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..06baa5e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "askql-api" +version = "0.1.0" +description = "" +authors = [ + {name = "AskQL Team"} +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ +] + + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" From a3f86a2eb227368b53a637b5c568db45ffb77c9c Mon Sep 17 00:00:00 2001 From: mini Date: Sat, 5 Jul 2025 17:33:39 +0900 Subject: [PATCH 02/31] =?UTF-8?q?chore:=20FastAPI=20Uvicorn=20=EC=84=A4?= =?UTF-8?q?=EC=B9=98=20#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 326 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 2 + 2 files changed, 328 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..c01d591 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,326 @@ +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.9.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, + {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "click" +version = "8.2.1" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, + {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "fastapi" +version = "0.115.14" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca"}, + {file = "fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.47.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "pydantic" +version = "2.11.7" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "starlette" +version = "0.46.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, + {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, + {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, + {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + +[[package]] +name = "uvicorn" +version = "0.35.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a"}, + {file = "uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.11" +content-hash = "5a269e036ff20de0a024da0abbd1b34660515370a1dc0138e573b5452d1eaf38" diff --git a/pyproject.toml b/pyproject.toml index 06baa5e..3c1e016 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,8 @@ license = {text = "MIT"} readme = "README.md" requires-python = ">=3.11" dependencies = [ + "fastapi (>=0.115.14,<0.116.0)", + "uvicorn (>=0.35.0,<0.36.0)" ] From 4f6ebed229103aac700e292ea86b97ff42f95ff1 Mon Sep 17 00:00:00 2001 From: mini Date: Sat, 5 Jul 2025 18:15:31 +0900 Subject: [PATCH 03/31] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20FastAPI=20?= =?UTF-8?q?=EC=95=B1=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=97=AC=EC=8A=A4?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..d98e2b5 --- /dev/null +++ b/main.py @@ -0,0 +1,14 @@ +# main.py +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"message": "Hello, FastAPI Backend!"} + + +@app.get("/health") +async def health_check(): + return {"status": "ok", "message": "Service is healthy"} \ No newline at end of file From 36c90f22cd6030c5914b29a16fefe11b9addfd0d Mon Sep 17 00:00:00 2001 From: mini Date: Sat, 5 Jul 2025 19:11:57 +0900 Subject: [PATCH 04/31] =?UTF-8?q?feat(dev-deps):=20Ruff,=20Black,=20pre-co?= =?UTF-8?q?mmit=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=84=A4=EC=A0=95=20#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pre-commit-config.yaml | 12 ++ poetry.lock | 303 +++++++++++++++++++++++++++++++++++++++- pyproject.toml | 33 +++++ 3 files changed, 345 insertions(+), 3 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5977fee --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,12 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.12.2" # ruff 버전에 맞게 수정 + hooks: + - id: ruff + args: ["--fix"] # 자동 수정 적용 + + - repo: https://github.com/psf/black + rev: "25.1.0" # black 버전에 맞게 + hooks: + - id: black + language_version: python3.11 diff --git a/poetry.lock b/poetry.lock index c01d591..a53b93f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -34,13 +34,70 @@ doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] trio = ["trio (>=0.26.1)"] +[[package]] +name = "black" +version = "25.1.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, + {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, + {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, + {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, + {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, + {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, + {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, + {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, + {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, + {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, + {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, + {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, + {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, + {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, + {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, + {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, + {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, + {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, + {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, + {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, + {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, + {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + [[package]] name = "click" version = "8.2.1" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, @@ -55,13 +112,25 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] +groups = ["main", "dev"] markers = "platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "distlib" +version = "0.3.9" +description = "Distribution utilities" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, +] + [[package]] name = "fastapi" version = "0.115.14" @@ -83,6 +152,23 @@ typing-extensions = ">=4.8.0" all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +[[package]] +name = "filelock" +version = "3.18.0" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] + [[package]] name = "h11" version = "0.16.0" @@ -95,6 +181,21 @@ files = [ {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +[[package]] +name = "identify" +version = "2.6.12" +description = "File identification library for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"}, + {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"}, +] + +[package.extras] +license = ["ukkonen"] + [[package]] name = "idna" version = "3.10" @@ -110,6 +211,90 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "mypy-extensions" +version = "1.1.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, + {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] + +[[package]] +name = "pre-commit" +version = "4.2.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd"}, + {file = "pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + [[package]] name = "pydantic" version = "2.11.7" @@ -244,6 +429,97 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "ruff" +version = "0.12.2" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be"}, + {file = "ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e"}, + {file = "ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9"}, + {file = "ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da"}, + {file = "ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce"}, + {file = "ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d"}, + {file = "ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04"}, + {file = "ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342"}, + {file = "ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a"}, + {file = "ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639"}, + {file = "ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12"}, + {file = "ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e"}, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -320,7 +596,28 @@ h11 = ">=0.8" [package.extras] standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "virtualenv" +version = "20.31.2" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11"}, + {file = "virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] + [metadata] lock-version = "2.1" python-versions = ">=3.11" -content-hash = "5a269e036ff20de0a024da0abbd1b34660515370a1dc0138e573b5452d1eaf38" +content-hash = "e54004b02e05488fd95954ee3ee726e4e33735dfdcc6c8469e410b804e1e3419" diff --git a/pyproject.toml b/pyproject.toml index 3c1e016..796985a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,3 +17,36 @@ dependencies = [ [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" + +[tool.poetry.group.dev.dependencies] +ruff = "^0.12.2" +black = "^25.1.0" +pre-commit = "^4.2.0" + + +# ---------------------------- +# Ruff 설정 +# ---------------------------- +[tool.ruff] +line-length = 120 +exclude = [ + ".git", + "__pycache__", + "tests/*" +] + +[tool.ruff.lint] +ignore = ["E501"] # 줄 길이 경고는 Black이 관리 +select = ["I", "E", "F", "W", "C90", "B", "UP"] + +# ---------------------------- +# Black 설정 +# ---------------------------- +[tool.black] +line-length = 120 +target-version = ["py311"] + +# ---------------------------- +# Pre-commit 설정은 별도 파일에 +# ---------------------------- +# `.pre-commit-config.yaml` 파일도 함께 작성해야 동작합니다. \ No newline at end of file From f8529f66218e0861d4a242cc24d488dc9bd15084 Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 12:34:10 +0900 Subject: [PATCH 05/31] =?UTF-8?q?chore(ci):=20OS=EB=B3=84=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=ED=8C=8C=EC=9D=BC=20=EC=9E=90=EB=8F=99=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EB=B0=8F=20=EB=B0=B0=ED=8F=AC=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20#2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build_deploy_executables.yml | 91 ++++++++++++ poetry.lock | 132 +++++++++++++++++- pyproject.toml | 1 + 3 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build_deploy_executables.yml diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml new file mode 100644 index 0000000..9360273 --- /dev/null +++ b/.github/workflows/build_deploy_executables.yml @@ -0,0 +1,91 @@ +# .github/workflows/build_deploy_executables.yml + +name: Build and Deploy Executables + +on: + release: + types: [published] # Release가 'published' 상태가 될 때 트리거 + +jobs: + # 1단계: 각 OS에서 실행 파일을 빌드하는 잡 + build: + strategy: + matrix: + os: [macos-latest, windows-latest] # macOS와 Windows 환경에서 각각 빌드 + runs-on: ${{ matrix.os }} # 매트릭스에서 선택된 OS에서 잡 실행 + + steps: + # 1. Git 리포지토리의 소스 코드를 가져옵니다. + - name: Checkout code + uses: actions/checkout@v4 + + # 2. Poetry를 사용하여 파이썬 환경을 설정합니다. + - name: Set up Python with Poetry + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "poetry" + + # 3. Poetry 의존성(PyInstaller 포함)을 설치합니다. + - name: Install Poetry dependencies + run: poetry install --no-root + + # 4. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. + - name: Set executable name + id: set_name + shell: bash + run: | + if [ "${{ runner.os }}" == "macOS" ]; then + echo "EXE_NAME=askql-ai" >> $GITHUB_ENV + elif [ "${{ runner.os }}" == "Windows" ]; then + echo "EXE_NAME=askql-ai.exe" >> $GITHUB_ENV + fi + + # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. + - name: Build executable with PyInstaller + run: pyinstaller src/main.py --name ${{ env.EXE_NAME }} --onefile --noconsole + + # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: executable-${{ runner.os }} + path: dist/${{ env.EXE_NAME }} + retention-days: 1 # 아티팩트 보관 기간 (하루) + + # 2단계: 빌드된 실행 파일들을 Front 리포지토리에 배포하는 잡 + deploy: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Checkout Front Repository + uses: actions/checkout@v4 + with: + repository: AskQL/askql_app + token: ${{ secrets.PAT_FOR_FRONT_REPO }} + ref: develop + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Organize files + run: | + mkdir -p resources/mac resources/win + mv artifacts/executable-macOS/askql-api resources/mac/ + mv artifacts/executable-Windows/askql-api.exe resources/win/ + + - name: Commit and push changes + run: | + git config --global user.name 'github-actions' + git config --global user.email 'github-actions@github.com' + git add . + # 변경 사항이 있을 때만 커밋 및 푸시 + if git diff-index --quiet HEAD; then + echo "No changes to commit to AskQL APP repository." + else + git commit -m "feat: API 실행 파일 업데이트 (${{ github.ref_name }})" + git push + fi diff --git a/poetry.lock b/poetry.lock index a53b93f..ff51991 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,18 @@ # This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. +[[package]] +name = "altgraph" +version = "0.17.4" +description = "Python graph (network) package" +optional = false +python-versions = "*" +groups = ["dev"] +markers = "python_version < \"3.14\"" +files = [ + {file = "altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff"}, + {file = "altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406"}, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -211,6 +224,22 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "macholib" +version = "1.16.3" +description = "Mach-O header analysis and editing" +optional = false +python-versions = "*" +groups = ["dev"] +markers = "python_version < \"3.14\" and sys_platform == \"darwin\"" +files = [ + {file = "macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c"}, + {file = "macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30"}, +] + +[package.dependencies] +altgraph = ">=0.17" + [[package]] name = "mypy-extensions" version = "1.1.0" @@ -259,6 +288,19 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "pefile" +version = "2023.2.7" +description = "Python PE parsing module" +optional = false +python-versions = ">=3.6.0" +groups = ["dev"] +markers = "python_version < \"3.14\" and sys_platform == \"win32\"" +files = [ + {file = "pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6"}, + {file = "pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc"}, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -429,6 +471,72 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pyinstaller" +version = "6.14.2" +description = "PyInstaller bundles a Python application and all its dependencies into a single package." +optional = false +python-versions = "<3.14,>=3.8" +groups = ["dev"] +markers = "python_version < \"3.14\"" +files = [ + {file = "pyinstaller-6.14.2-py3-none-macosx_10_13_universal2.whl", hash = "sha256:d77d18bf5343a1afef2772393d7a489d4ec2282dee5bca549803fc0d74b78330"}, + {file = "pyinstaller-6.14.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3fa0c391e1300a9fd7752eb1ffe2950112b88fba9d2743eee2ef218a15f4705f"}, + {file = "pyinstaller-6.14.2-py3-none-manylinux2014_i686.whl", hash = "sha256:077efb2d01d16d9c8fdda3ad52788f0fead2791c5cec9ed6ce058af7e26eb74b"}, + {file = "pyinstaller-6.14.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:fdd2bd020a18736806a6bd5d3c4352f1209b427a96ad6c459d88aec1d90c4f21"}, + {file = "pyinstaller-6.14.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:03862c6b3cf7b16843d24b529f89cd4077cbe467883cd54ce7a81940d6da09d3"}, + {file = "pyinstaller-6.14.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:78827a21ada2a848e98671852d20d74b2955b6e2aaf2359ed13a462e1a603d84"}, + {file = "pyinstaller-6.14.2-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:185710ab1503dfdfa14c43237d394d96ac183422d588294be42531480dfa6c38"}, + {file = "pyinstaller-6.14.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:6c673a7e761bd4a2560cfd5dbe1ccdcfe2dff304b774e6e5242fc5afed953661"}, + {file = "pyinstaller-6.14.2-py3-none-win32.whl", hash = "sha256:1697601aa788e3a52f0b5e620b4741a34b82e6f222ec6e1318b3a1349f566bb2"}, + {file = "pyinstaller-6.14.2-py3-none-win_amd64.whl", hash = "sha256:e10e0e67288d6dcb5898a917dd1d4272aa0ff33f197ad49a0e39618009d63ed9"}, + {file = "pyinstaller-6.14.2-py3-none-win_arm64.whl", hash = "sha256:69fd11ca57e572387826afaa4a1b3d4cb74927d76f231f0308c0bd7872ca5ac1"}, + {file = "pyinstaller-6.14.2.tar.gz", hash = "sha256:142cce0719e79315f0cc26400c2e5c45d9b6b17e7e0491fee444a9f8f16f4917"}, +] + +[package.dependencies] +altgraph = "*" +macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""} +packaging = ">=22.0" +pefile = {version = ">=2022.5.30,<2024.8.26 || >2024.8.26", markers = "sys_platform == \"win32\""} +pyinstaller-hooks-contrib = ">=2025.5" +pywin32-ctypes = {version = ">=0.2.1", markers = "sys_platform == \"win32\""} +setuptools = ">=42.0.0" + +[package.extras] +completion = ["argcomplete"] +hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] + +[[package]] +name = "pyinstaller-hooks-contrib" +version = "2025.5" +description = "Community maintained hooks for PyInstaller" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.14\"" +files = [ + {file = "pyinstaller_hooks_contrib-2025.5-py3-none-any.whl", hash = "sha256:ebfae1ba341cb0002fb2770fad0edf2b3e913c2728d92df7ad562260988ca373"}, + {file = "pyinstaller_hooks_contrib-2025.5.tar.gz", hash = "sha256:707386770b8fe066c04aad18a71bc483c7b25e18b4750a756999f7da2ab31982"}, +] + +[package.dependencies] +packaging = ">=22.0" +setuptools = ">=42.0.0" + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +markers = "python_version < \"3.14\" and sys_platform == \"win32\"" +files = [ + {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, + {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -520,6 +628,28 @@ files = [ {file = "ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e"}, ] +[[package]] +name = "setuptools" +version = "80.9.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version < \"3.14\"" +files = [ + {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, + {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] + [[package]] name = "sniffio" version = "1.3.1" @@ -620,4 +750,4 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [metadata] lock-version = "2.1" python-versions = ">=3.11" -content-hash = "e54004b02e05488fd95954ee3ee726e4e33735dfdcc6c8469e410b804e1e3419" +content-hash = "3b5b7454d461acc6cfb10bd75966c73b99fada86f142d8aa3b6b1d16463c6c30" diff --git a/pyproject.toml b/pyproject.toml index 796985a..6117fc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ build-backend = "poetry.core.masonry.api" ruff = "^0.12.2" black = "^25.1.0" pre-commit = "^4.2.0" +pyinstaller = {version = "^6.14.2", python = ">=3.11,<3.14"} # ---------------------------- From 4a83e484d59846850ed37e98d6a6a28c3a612cdf Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 12:42:07 +0900 Subject: [PATCH 06/31] =?UTF-8?q?chore(ci):=20workfolws=EC=97=90=EC=84=9C?= =?UTF-8?q?=20poetry=20=EC=84=A4=EC=B9=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index 9360273..c3885fd 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -26,11 +26,17 @@ jobs: python-version: "3.11" cache: "poetry" - # 3. Poetry 의존성(PyInstaller 포함)을 설치합니다. + # 3. Poetry 설치 + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3.11 - + echo "$HOME/.local/bin" >> $GITHUB_PATH + + # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. - name: Install Poetry dependencies run: poetry install --no-root - # 4. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. + # 5. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. - name: Set executable name id: set_name shell: bash From 87f588705b13925111d06ebe79ddf41bd1c87adb Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 12:47:32 +0900 Subject: [PATCH 07/31] =?UTF-8?q?chore(ci):=20poetry=20=EC=84=A4=EC=B9=98?= =?UTF-8?q?=20=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index c3885fd..d740d7e 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -29,7 +29,7 @@ jobs: # 3. Poetry 설치 - name: Install Poetry run: | - curl -sSL https://install.python-poetry.org | python3.11 - + curl -sSL https://install.python-poetry.org | python3 - echo "$HOME/.local/bin" >> $GITHUB_PATH # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. From bf4efb6a46abaa6e1829da4ed8d9714c375c5933 Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 12:53:48 +0900 Subject: [PATCH 08/31] =?UTF-8?q?chore(ci):=20poetry=20=EC=84=A4=EC=B9=98?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=20=EB=94=94=EB=B2=84=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index d740d7e..88c2f4b 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -26,12 +26,21 @@ jobs: python-version: "3.11" cache: "poetry" - # 3. Poetry 설치 + # 3. Poetry 설치 (디버깅 출력 추가) - name: Install Poetry run: | - curl -sSL https://install.python-poetry.org | python3 - + echo "Installing Poetry..." + curl -sSL https://install.python-poetry.org | python3 - + echo 'Poetry 설치 완료' + + # 환경변수 경로에 Poetry 추가 echo "$HOME/.local/bin" >> $GITHUB_PATH + # 디버깅을 위해 Poetry 경로와 버전 출력 + echo "Poetry 위치: $(which poetry || echo 'Poetry not found')" + echo "Poetry 버전:" + $HOME/.local/bin/poetry --version || echo 'Poetry 실행 실패' + # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. - name: Install Poetry dependencies run: poetry install --no-root From c7f540e7e7eb3d243a18b4ea2413b3723790922d Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 13:05:16 +0900 Subject: [PATCH 09/31] =?UTF-8?q?chore(ci):=20poetry=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EA=B2=BD=EB=A1=9C=20=EC=A7=81=EC=A0=91?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20#2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index 88c2f4b..c865489 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -33,8 +33,8 @@ jobs: curl -sSL https://install.python-poetry.org | python3 - echo 'Poetry 설치 완료' - # 환경변수 경로에 Poetry 추가 - echo "$HOME/.local/bin" >> $GITHUB_PATH + # PATH에 직접 추가 + echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV # 디버깅을 위해 Poetry 경로와 버전 출력 echo "Poetry 위치: $(which poetry || echo 'Poetry not found')" From bd21f431011bcd14adefd44ede8c6343e646e57a Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 13:10:30 +0900 Subject: [PATCH 10/31] =?UTF-8?q?chore(ci):=20poetry=20=EC=84=A4=EC=B9=98?= =?UTF-8?q?=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD=20#2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index c865489..a9c715e 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -19,14 +19,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - # 2. Poetry를 사용하여 파이썬 환경을 설정합니다. - - name: Set up Python with Poetry - uses: actions/setup-python@v5 - with: - python-version: "3.11" - cache: "poetry" - - # 3. Poetry 설치 (디버깅 출력 추가) + # 2. Poetry 설치 (디버깅 출력 추가) - name: Install Poetry run: | echo "Installing Poetry..." @@ -41,6 +34,13 @@ jobs: echo "Poetry 버전:" $HOME/.local/bin/poetry --version || echo 'Poetry 실행 실패' + # 3. Poetry를 사용하여 파이썬 환경을 설정합니다. + - name: Set up Python with Poetry + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "poetry" + # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. - name: Install Poetry dependencies run: poetry install --no-root From 69cc21d08a86e7579b7fa8d1964cfa65b57c7f3a Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 13:13:08 +0900 Subject: [PATCH 11/31] =?UTF-8?q?chore(ci):=20pyinstaller=20=EC=84=A4?= =?UTF-8?q?=EC=B9=98=20=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index a9c715e..4ec3309 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -58,7 +58,7 @@ jobs: # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. - name: Build executable with PyInstaller - run: pyinstaller src/main.py --name ${{ env.EXE_NAME }} --onefile --noconsole + run: poetry run pyinstaller src/main.py --name ${{ env.EXE_NAME }} --onefile --noconsole # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. - name: Upload artifact From 285be15b0a1285d41e05c715b929cc1ba0daafc0 Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 13:16:46 +0900 Subject: [PATCH 12/31] =?UTF-8?q?fix(ci):=20main.py=20=EA=B2=BD=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EC=9C=BC=EB=A1=9C=20PyInstaller=20?= =?UTF-8?q?=EB=B9=8C=EB=93=9C=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index 4ec3309..7e98633 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -51,14 +51,14 @@ jobs: shell: bash run: | if [ "${{ runner.os }}" == "macOS" ]; then - echo "EXE_NAME=askql-ai" >> $GITHUB_ENV + echo "EXE_NAME=askql-api" >> $GITHUB_ENV elif [ "${{ runner.os }}" == "Windows" ]; then - echo "EXE_NAME=askql-ai.exe" >> $GITHUB_ENV + echo "EXE_NAME=askql-api.exe" >> $GITHUB_ENV fi # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. - name: Build executable with PyInstaller - run: poetry run pyinstaller src/main.py --name ${{ env.EXE_NAME }} --onefile --noconsole + run: poetry run pyinstaller main.py --name ${{ env.EXE_NAME }} --onefile --noconsole # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. - name: Upload artifact From 02f589de7c7a12b31a19180081c30bc81da403cc Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 13:21:04 +0900 Subject: [PATCH 13/31] =?UTF-8?q?fix(ci):=20windows=EC=97=90=EC=84=9C=20Po?= =?UTF-8?q?etry=20=EC=84=A4=EC=B9=98=20=EC=8B=9C=20=20bash=20shell=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20#2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index 7e98633..3a7290e 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -21,6 +21,7 @@ jobs: # 2. Poetry 설치 (디버깅 출력 추가) - name: Install Poetry + shell: bash run: | echo "Installing Poetry..." curl -sSL https://install.python-poetry.org | python3 - From a5a3f1b6675dd3ed12d58ca0933ae2b0b3f22bd4 Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 13:23:19 +0900 Subject: [PATCH 14/31] =?UTF-8?q?chore(ci):=20OS=EB=B3=84=20poetry=20?= =?UTF-8?q?=EC=84=A4=EC=B9=98=20=ED=99=98=EA=B2=BD=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_deploy_executables.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml index 3a7290e..df7eb80 100644 --- a/.github/workflows/build_deploy_executables.yml +++ b/.github/workflows/build_deploy_executables.yml @@ -24,16 +24,20 @@ jobs: shell: bash run: | echo "Installing Poetry..." - curl -sSL https://install.python-poetry.org | python3 - + curl -sSL https://install.python-poetry.org | python3 - echo 'Poetry 설치 완료' - # PATH에 직접 추가 - echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV + # OS별 Poetry 경로를 PATH에 추가 + if [[ "$RUNNER_OS" == "Windows" ]]; then + echo "C:/Users/runneradmin/AppData/Roaming/Python/Scripts" >> $GITHUB_PATH + else + echo "$HOME/.local/bin" >> $GITHUB_PATH + fi - # 디버깅을 위해 Poetry 경로와 버전 출력 + # 디버깅 출력 echo "Poetry 위치: $(which poetry || echo 'Poetry not found')" echo "Poetry 버전:" - $HOME/.local/bin/poetry --version || echo 'Poetry 실행 실패' + poetry --version || echo 'Poetry 실행 실패' # 3. Poetry를 사용하여 파이썬 환경을 설정합니다. - name: Set up Python with Poetry From 70dd28fca106acefa70c32f3be1e8669943facad Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 15:24:43 +0900 Subject: [PATCH 15/31] =?UTF-8?q?feat(ci):=20Uvicorn=20=EB=8F=99=EC=A0=81?= =?UTF-8?q?=20=ED=8F=AC=ED=8A=B8=20=ED=95=A0=EB=8B=B9=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20#2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index d98e2b5..ea2ecbe 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,8 @@ # main.py +import os +import socket # 소켓 모듈 임포트 + +import uvicorn from fastapi import FastAPI app = FastAPI() @@ -11,4 +15,25 @@ async def read_root(): @app.get("/health") async def health_check(): - return {"status": "ok", "message": "Service is healthy"} \ No newline at end of file + return {"status": "ok", "message": "Service is healthy"} + + +# 이 부분이 추가된 동적 포트 할당 로직입니다. +if __name__ == "__main__": + # 1. 환경 변수 'PORT'가 있으면 해당 포트를 사용합니다. + # 2. 없으면 사용 가능한 임시 포트를 찾습니다. + port_from_env = os.getenv("PORT") + + if port_from_env: + port = int(port_from_env) + print(f"Using port from environment variable: {port}") + else: + # 시스템에서 사용 가능한 임시 포트를 찾습니다. + # 포트 0을 바인딩하면 운영체제가 사용 가능한 포트를 할당해 줍니다. + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("0.0.0.0", 0)) # 0.0.0.0에 포트 0을 바인딩 + port = s.getsockname()[1] # 할당된 포트 번호 가져오기 + print(f"Dynamically assigned port: {port}") + + # Uvicorn 서버를 시작합니다. + uvicorn.run(app, host="0.0.0.0", port=port) From 737ad556b6094fb55bbcefcc1cc3ca5734e14660 Mon Sep 17 00:00:00 2001 From: mini Date: Sun, 6 Jul 2025 16:29:50 +0900 Subject: [PATCH 16/31] =?UTF-8?q?docs:=20README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 162 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c5b5b2f..c06cf6f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,162 @@ -# askql_api -AskQL의 Backend repo입니다. +# AskQL API + +이 프로젝트는 AskQL 서비스의 백엔드 API를 제공합니다. FastAPI를 기반으로 구축되었으며, 효율적이고 확장 가능한 API를 목표로 합니다. + +--- + +## 🚀 시작하기 + +### **개발 환경 설정** + +이 프로젝트는 [Poetry](https://python-poetry.org/)를 사용하여 종속성 관리를 합니다. + +1. **Poetry 설치** + + 아직 Poetry가 설치되어 있지 않다면, 다음 명령어를 사용하여 설치하세요. + + ```bash + curl -sSL https://install.python-poetry.org | python3 - + + # PATH 설정 (macOS기준) + export PATH="$HOME/.local/bin:$PATH" + source ~/.zshrc + ``` + + 설치 후 버전을 확인하여 정상적으로 설치되었는지 확인합니다. + + ```bash + poetry --version + ``` + +2. **저장소 복제** + + ```bash + git clone https://github.com/AskQL/askql_api.git + cd askql_api # 복제된 저장소 디렉토리로 이동 + ``` + +3. **Poetry 프로젝트 초기화 및 종속성 설치** + + 다음 명령어를 실행하여 Poetry 프로젝트를 초기화하고 필요한 모든 종속성을 설치합니다.(선택 사항) + + ```bash + poetry init # 질문에 대한 답변은 아래 예시를 따르세요. + ``` + + **Poetry `init` 시 질문에 대한 답변:** + + - `Package name`: `askql-api` + - `Version`: `0.1.0` + - `Description`: `""` + - `Author`: `AskQL Team` + - `License`: `MIT` + - `Compatible Python versions`: `>=3.11` + - `Would you like to define your main dependencies interactively?`: `no` + - `Would you like to define your dev dependencies interactively?`: `no` + - `Do you confirm the generation?`: `yes` + + 초기화 후 FastAPI 및 Uvicorn을 설치합니다.(선택 사항) + + ```bash + poetry add fastapi uvicorn + ``` + + **모든 종속성을 설치합니다.(필수)** + + ```bash + poetry install + ``` + +### **프로젝트 구성** + +이 프로젝트는 3-Tier 아키텍처를 기반으로 구성됩니다. 현재 폴더 구조 생성은 진행 예정입니다. + +### **FastAPI 앱 실행** + +1. **`Poetry shell` 플러그인 설치**(선택 사항) + + Poetry shell을 이용한 가상환경 활성화를 하기 위해선 `poetry shell` 플러그인을 설치합니다. + + ```bash + poetry self add poetry-plugin-shell + ``` + +2. **가상환경 생성 및 활성화** + + Poetry 가상 환경 내에서 Uvicorn을 사용하여 앱을 실행합니다. + + ```bash + poetry shell + uvicorn main:app --reload + ``` + + 또는 Poetry Run을 사용하여 직접 실행할 수 있습니다. + + ```bash + poetry run uvicorn main:app --reload + ``` + +### **코드 컨벤션 (PEP 8, Ruff, Black)** + +프로젝트는 일관된 코드 스타일을 위해 **PEP 8**을 준수하며, **Ruff** (Linter)와 **Black** (Formatter)을 사용합니다. `pre-commit` 훅을 통해 커밋 전에 자동으로 코드 포맷팅 및 린팅을 적용할 수 있습니다. + +1. **Pre-commit 훅 설치** + + ```bash + poetry run pre-commit install + ``` + + 이제 커밋할 때마다 Ruff와 Black이 자동으로 실행되어 코드 스타일을 검사하고 수정합니다. + +--- + +## 📦 배포 방법 + +이 프로젝트는 GitHub Actions를 통해 실행 파일 빌드 및 배포가 자동화되어 있습니다. GitHub에서 새로운 태그를 발행하면 파이프라인이 자동으로 실행됩니다. + +**태그 예시:** `v1.2.3` + +- `1`: 큰 버전 (기존에 없던 새로운 도메인 추가) +- `2`: 중간 버전 (기존 도메인에 새로운 기능 추가) +- `3`: 패치 버전 (버그 수정, 코드 개선 등) + +**배포 절차:** + +1. 모든 기능 개발과 테스트가 완료된 코드를 `main` 브랜치에 병합(Merge)합니다. +2. 레포지토리에서 **Releases** 탭으로 이동하여 **Create a new release** 버튼을 클릭합니다. +3. **Choose a tag** 항목을 클릭한 후 **Find or create a new tag** 부분에 버전(예: `v1.0.0`)과 같이 새로운 버전 태그를 입력하고 아래 **Create new tag**를 클릭하여 태그를 생성합니다. +4. ⭐**중요)** **Target** 드롭다운 메뉴에서 반드시 `main` 브랜치를 선택합니다. +5. 제목에 버전을 입력하고 릴리즈 노트를 작성합니다. +6. 🚨**주의)** **Publish release** 버튼을 클릭합니다. + 릴리즈 발행은 되돌릴 수 없습니다. 잘못된 릴리즈는 서비스에 직접적인 영향을 줄 수 있으니, 반드시 팀의 승인을 받고 신중하게 진행해 주십시오. +7. **Actions** 탭에 들어가 파이프라인을 확인 후 정상 배포되었다면 App 레포에 `develop` 브랜치에서 실행 파일을 확인합니다. +8. 만약 실패하였다면 인프라 담당자에게 문의해주세요. + +--- + +## 👨‍⚕️🩺 접속 및 헬스체크 확인 + +이 레포지토리에는 간단한 헬스체크 엔드포인트가 포함되어 있습니다. FastAPI 앱이 실행 중일 때 브라우저나 `curl`을 사용하여 다음 URL에 접속하여 앱이 정상적으로 실행되는지 확인합니다. + +1. **브라우저 확인** + + - 기본 루트 엔드포인트: + - 헬스 체크 엔드포인트: + - API 문서: + +2. **CLI로 접속 확인하기** + + FastAPI 앱이 poetry run uvicorn main:app --reload 명령어로 실행 중인 상태에서, 새로운 터미널을 열고 다음 curl 명령어를 입력하여 각 엔드포인트의 응답을 확인할 수 있습니다. + + - 기본 루트 엔드포인트: + ```bash + curl http://localhost:8000/ + ``` + - 헬스 체크 엔드포인트: + ```bash + curl http://localhost:8000/health + ``` + - API 문서: + ```bash + curl http://localhost:8000/openapi.json + ``` From ac7e642682e3c3fc3c6591e4e9d20e84db739e61 Mon Sep 17 00:00:00 2001 From: mini Date: Thu, 10 Jul 2025 23:45:20 +0900 Subject: [PATCH 17/31] =?UTF-8?q?fix:=20poetry=20install=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0=EC=9A=A9=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=ED=8F=B4=EB=8D=94=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=ED=8C=80=EB=AA=85=20=EC=88=98=EC=A0=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9Cpyproject.toml=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py => app/main.py | 0 pyproject.toml | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename main.py => app/main.py (100%) diff --git a/main.py b/app/main.py similarity index 100% rename from main.py rename to app/main.py diff --git a/pyproject.toml b/pyproject.toml index 6117fc2..e13ea88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ [project] -name = "askql-api" +name = "app" version = "0.1.0" description = "" authors = [ - {name = "AskQL Team"} + {name = "Queryus"} ] license = {text = "MIT"} readme = "README.md" From 0c5b87e9792edf50dd2b2b2f7ee1a81d20eecc4c Mon Sep 17 00:00:00 2001 From: mini Date: Thu, 10 Jul 2025 23:45:45 +0900 Subject: [PATCH 18/31] =?UTF-8?q?docs:=20README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c06cf6f..15e0a0b 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,9 @@ 2. **저장소 복제** ```bash - git clone https://github.com/AskQL/askql_api.git - cd askql_api # 복제된 저장소 디렉토리로 이동 + git clone https://github.com/Queryus/QGenie_api.git + cd app # 복제된 저장소 디렉토리로 이동 + ``` 3. **Poetry 프로젝트 초기화 및 종속성 설치** From 1662eaf6fc65ac43dc4c47a51b8347befc6fe8a7 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Thu, 17 Jul 2025 22:27:13 +0900 Subject: [PATCH 19/31] =?UTF-8?q?feat:=20discord=20=EB=B4=87=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85(pr,=20=EB=B0=B0=ED=8F=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build_deploy_executables.yml | 111 ------------ .../workflows/build_release_and_notify.yml | 159 ++++++++++++++++++ .github/workflows/pr_bot.yml | 69 ++++++++ 3 files changed, 228 insertions(+), 111 deletions(-) delete mode 100644 .github/workflows/build_deploy_executables.yml create mode 100644 .github/workflows/build_release_and_notify.yml create mode 100644 .github/workflows/pr_bot.yml diff --git a/.github/workflows/build_deploy_executables.yml b/.github/workflows/build_deploy_executables.yml deleted file mode 100644 index df7eb80..0000000 --- a/.github/workflows/build_deploy_executables.yml +++ /dev/null @@ -1,111 +0,0 @@ -# .github/workflows/build_deploy_executables.yml - -name: Build and Deploy Executables - -on: - release: - types: [published] # Release가 'published' 상태가 될 때 트리거 - -jobs: - # 1단계: 각 OS에서 실행 파일을 빌드하는 잡 - build: - strategy: - matrix: - os: [macos-latest, windows-latest] # macOS와 Windows 환경에서 각각 빌드 - runs-on: ${{ matrix.os }} # 매트릭스에서 선택된 OS에서 잡 실행 - - steps: - # 1. Git 리포지토리의 소스 코드를 가져옵니다. - - name: Checkout code - uses: actions/checkout@v4 - - # 2. Poetry 설치 (디버깅 출력 추가) - - name: Install Poetry - shell: bash - run: | - echo "Installing Poetry..." - curl -sSL https://install.python-poetry.org | python3 - - echo 'Poetry 설치 완료' - - # OS별 Poetry 경로를 PATH에 추가 - if [[ "$RUNNER_OS" == "Windows" ]]; then - echo "C:/Users/runneradmin/AppData/Roaming/Python/Scripts" >> $GITHUB_PATH - else - echo "$HOME/.local/bin" >> $GITHUB_PATH - fi - - # 디버깅 출력 - echo "Poetry 위치: $(which poetry || echo 'Poetry not found')" - echo "Poetry 버전:" - poetry --version || echo 'Poetry 실행 실패' - - # 3. Poetry를 사용하여 파이썬 환경을 설정합니다. - - name: Set up Python with Poetry - uses: actions/setup-python@v5 - with: - python-version: "3.11" - cache: "poetry" - - # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. - - name: Install Poetry dependencies - run: poetry install --no-root - - # 5. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. - - name: Set executable name - id: set_name - shell: bash - run: | - if [ "${{ runner.os }}" == "macOS" ]; then - echo "EXE_NAME=askql-api" >> $GITHUB_ENV - elif [ "${{ runner.os }}" == "Windows" ]; then - echo "EXE_NAME=askql-api.exe" >> $GITHUB_ENV - fi - - # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. - - name: Build executable with PyInstaller - run: poetry run pyinstaller main.py --name ${{ env.EXE_NAME }} --onefile --noconsole - - # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: executable-${{ runner.os }} - path: dist/${{ env.EXE_NAME }} - retention-days: 1 # 아티팩트 보관 기간 (하루) - - # 2단계: 빌드된 실행 파일들을 Front 리포지토리에 배포하는 잡 - deploy: - needs: build - runs-on: ubuntu-latest - - steps: - - name: Checkout Front Repository - uses: actions/checkout@v4 - with: - repository: AskQL/askql_app - token: ${{ secrets.PAT_FOR_FRONT_REPO }} - ref: develop - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Organize files - run: | - mkdir -p resources/mac resources/win - mv artifacts/executable-macOS/askql-api resources/mac/ - mv artifacts/executable-Windows/askql-api.exe resources/win/ - - - name: Commit and push changes - run: | - git config --global user.name 'github-actions' - git config --global user.email 'github-actions@github.com' - git add . - # 변경 사항이 있을 때만 커밋 및 푸시 - if git diff-index --quiet HEAD; then - echo "No changes to commit to AskQL APP repository." - else - git commit -m "feat: API 실행 파일 업데이트 (${{ github.ref_name }})" - git push - fi diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml new file mode 100644 index 0000000..8fe6f1f --- /dev/null +++ b/.github/workflows/build_release_and_notify.yml @@ -0,0 +1,159 @@ +# .github/workflows/build_release_and_notify.yml + +name: Build and Deploy Executables + +on: + release: + types: [published] # Release가 'published' 상태가 될 때 트리거 + +jobs: + # ================================== + # 파이프라인 시작 알림 + # ================================== + start: + runs-on: ubuntu-latest + steps: + - name: Send Pipeline Start Notification + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + color: "#31a6f5" # 노란색 + username: "파이프라인 봇" + description: "🔷🔷🔷 **${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다. 🔷🔷🔷" + # ================================== + # 실행 파일 빌드 + # ================================== + build: + needs: start + strategy: + matrix: + os: [macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + + steps: + # 1. Git 리포지토리의 소스 코드를 가져옵니다. + - name: Checkout code + uses: actions/checkout@v4 + + # 2. Poetry 설치 (디버깅 출력 추가) + - name: Install Poetry + shell: bash + run: | + curl -sSL https://install.python-poetry.org | python3 - + if [[ "$RUNNER_OS" == "Windows" ]]; then + echo "C:/Users/runneradmin/AppData/Roaming/Python/Scripts" >> $GITHUB_PATH + else + echo "$HOME/.local/bin" >> $GITHUB_PATH + fi + + # 3. Poetry를 사용하여 파이썬 환경을 설정합니다. + - name: Set up Python with Poetry + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "poetry" + + # 4. Poetry 의존성(PyInstaller 포함)을 설치합니다. + - name: Install Poetry dependencies + run: poetry install --no-root + + # 5. OS에 따라 실행 파일의 이름(.exe 확장자 등)을 결정합니다. + - name: Set executable name + id: set_name + shell: bash + run: | + if [ "${{ runner.os }}" == "macOS" ]; then + echo "EXE_NAME=qgenie-api" >> $GITHUB_ENV + elif [ "${{ runner.os }}" == "Windows" ]; then + echo "EXE_NAME=qgenie-api.exe" >> $GITHUB_ENV + fi + + # 6. PyInstaller를 사용해 파이썬 코드를 실행 파일로 만듭니다. + - name: Build executable with PyInstaller + run: poetry run pyinstaller main.py --name ${{ env.EXE_NAME }} --onefile --noconsole + + # 7. 빌드된 실행 파일을 다음 단계(deploy)에서 사용할 수 있도록 아티팩트로 업로드합니다. + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: executable-${{ runner.os }} + path: dist/${{ env.EXE_NAME }} + retention-days: 1 + + # ================================== + # 배포 + # ================================== + deploy: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Checkout App Repository + uses: actions/checkout@v4 + with: + repository: Queryus/QGenie_app + token: ${{ secrets.PAT_FOR_FRONT_REPO }} + ref: develop + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Organize files + run: | + mkdir -p resources/mac resources/win + mv artifacts/executable-macOS/qgenie-api resources/mac/ + mv artifacts/executable-Windows/qgenie-api.exe resources/win/ + + - name: Commit and push changes + run: | + git config --global user.name 'github-actions' + git config --global user.email 'github-actions@github.com' + git add . + if git diff-index --quiet HEAD; then + echo "No changes to commit to QGenie APP repository." + else + git commit -m "feat: API 실행 파일 업데이트 (${{ github.ref_name }})" + git push + fi + + # ================================== + # 파이프라인 최종 결과 알림 + # ================================== + finish: + needs: deploy + runs-on: ubuntu-latest + if: always() + + steps: + - name: Send Success Notification + if: needs.deploy.result == 'success' + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + color: "#2ecc71" # 초록색 + username: "파이프라인 봇" + title: "🎉 New Release: ${{ github.ref_name }}" + url: ${{ github.event.release.html_url }} + description: "✅✅✅ **${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다! ✅✅✅" + + - name: Send Failure Notification + if: needs.deploy.result == 'failure' + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + color: "#e74c3c" # 빨간색 + username: "파이프라인 봇" + description: "❌❌❌ **${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다. ❌❌❌" + url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + + - name: Send Skipped or Cancelled Notification + if: needs.deploy.result == 'skipped' || needs.deploy.result == 'cancelled' + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + color: "#fcf56f" # 노란색 + username: "파이프라인 봇" + description: "🟡🟡🟡 **${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: `${{ needs.deploy.result }}`)\n이전 단계(Build)에서 문제가 발생했을 수 있습니다. 🟡🟡🟡" + url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml new file mode 100644 index 0000000..5b850db --- /dev/null +++ b/.github/workflows/pr_bot.yml @@ -0,0 +1,69 @@ +# .github/workflows/pr_bot.yml +name: Pull Request Bot + +on: + # Pull Request 관련 이벤트 발생 시 + pull_request: + types: [opened, closed, reopened, synchronize] + issue_comment: + types: [created] + +jobs: + notify: + runs-on: ubuntu-latest + steps: + # ------------------------- + # 생성/동기화 알림 + # ------------------------- + - name: Send PR Created Notification + if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'synchronize') + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + title: "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}" + url: ${{ github.event.pull_request.html_url }} + color: "#31a6f5" # 파란색 + username: "GitHub PR 봇" + description: "🔷🔷🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. 🔷🔷🔷" + + # ------------------------- + # 댓글 알림 + # ------------------------- + - name: Send PR Comment Notification + if: github.event_name == 'issue_comment' && github.event.issue.pull_request + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + title: "New Comment on PR #${{ github.event.issue.number }}" + url: ${{ github.event.comment.html_url }} + color: "#e67e22" # 주황색 + username: "GitHub 댓글 봇" + description: "🟠🟠🟠 **${{ github.actor }}**님의 새 댓글: \n${{ github.event.comment.body }} 🟠🟠🟠" + + # ------------------------- + # 머지(Merge) 알림 + # ------------------------- + - name: Send PR Merged Notification + if: github.event.action == 'closed' && github.event.pull_request.merged == true + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + title: "Pull Request #${{ github.event.pull_request.number }} Merged!" + url: ${{ github.event.pull_request.html_url }} + color: "#4ed971" # 초록색 + username: "GitHub Merge 봇" + description: "✅✅✅ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다. ✅✅✅" + + # ------------------------- + # 닫힘(Close) 알림 + # ------------------------- + - name: Send PR Closed Notification + if: github.event.action == 'closed' && github.event.pull_request.merged == false + uses: tsg-bot/discord-webhook-action@v1.1.1 + with: + webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} + title: "Pull Request #${{ github.event.pull_request.number }} Closed" + url: ${{ github.event.pull_request.html_url }} + color: "#e62410" # 빨간색 + username: "GitHub PR 봇" + description: "❌❌❌ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다. ❌❌❌" From 8347ec8ee3f92b9c76b7e1953cc69d1792626f48 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Thu, 17 Jul 2025 22:39:07 +0900 Subject: [PATCH 20/31] =?UTF-8?q?fix:=20=EC=95=A1=EC=85=98=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=EB=A5=BC=20=EC=B0=B8=EC=A1=B0=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EB=AA=BB=ED=95=B4=20=EC=A3=BC=EC=86=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_release_and_notify.yml | 8 ++++---- .github/workflows/pr_bot.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml index 8fe6f1f..a21e9bb 100644 --- a/.github/workflows/build_release_and_notify.yml +++ b/.github/workflows/build_release_and_notify.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Send Pipeline Start Notification - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} color: "#31a6f5" # 노란색 @@ -129,7 +129,7 @@ jobs: steps: - name: Send Success Notification if: needs.deploy.result == 'success' - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} color: "#2ecc71" # 초록색 @@ -140,7 +140,7 @@ jobs: - name: Send Failure Notification if: needs.deploy.result == 'failure' - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} color: "#e74c3c" # 빨간색 @@ -150,7 +150,7 @@ jobs: - name: Send Skipped or Cancelled Notification if: needs.deploy.result == 'skipped' || needs.deploy.result == 'cancelled' - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} color: "#fcf56f" # 노란색 diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index 5b850db..7def2b1 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -17,7 +17,7 @@ jobs: # ------------------------- - name: Send PR Created Notification if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'synchronize') - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} title: "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}" @@ -31,7 +31,7 @@ jobs: # ------------------------- - name: Send PR Comment Notification if: github.event_name == 'issue_comment' && github.event.issue.pull_request - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} title: "New Comment on PR #${{ github.event.issue.number }}" @@ -45,7 +45,7 @@ jobs: # ------------------------- - name: Send PR Merged Notification if: github.event.action == 'closed' && github.event.pull_request.merged == true - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} title: "Pull Request #${{ github.event.pull_request.number }} Merged!" @@ -59,7 +59,7 @@ jobs: # ------------------------- - name: Send PR Closed Notification if: github.event.action == 'closed' && github.event.pull_request.merged == false - uses: tsg-bot/discord-webhook-action@v1.1.1 + uses: antoinezanardi/discord-webhook-action@v2 with: webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} title: "Pull Request #${{ github.event.pull_request.number }} Closed" From c2dbc7b67287373ff3dbbb5bd03b010bf0dad66d Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Thu, 17 Jul 2025 22:47:46 +0900 Subject: [PATCH 21/31] =?UTF-8?q?fix:=20=EC=99=B8=EB=B6=80=20=EC=95=A1?= =?UTF-8?q?=EC=85=98=20=EC=A0=9C=EC=99=B8=ED=95=98=EA=B3=A0=20=EC=9E=90?= =?UTF-8?q?=EC=B2=B4=EC=A0=81=EC=9C=BC=EB=A1=9C=20=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build_release_and_notify.yml | 78 +++++++++++------- .github/workflows/pr_bot.yml | 82 +++++++++++-------- 2 files changed, 98 insertions(+), 62 deletions(-) diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml index a21e9bb..0c942d8 100644 --- a/.github/workflows/build_release_and_notify.yml +++ b/.github/workflows/build_release_and_notify.yml @@ -14,12 +14,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Send Pipeline Start Notification - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - color: "#31a6f5" # 노란색 - username: "파이프라인 봇" - description: "🔷🔷🔷 **${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다. 🔷🔷🔷" + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "파이프라인 봇", + "embeds": [{ + "description": "🔷🔷🔷 **${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다. 🔷🔷🔷", + "color": 3253045 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} # ================================== # 실행 파일 빌드 # ================================== @@ -129,31 +133,45 @@ jobs: steps: - name: Send Success Notification if: needs.deploy.result == 'success' - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - color: "#2ecc71" # 초록색 - username: "파이프라인 봇" - title: "🎉 New Release: ${{ github.ref_name }}" - url: ${{ github.event.release.html_url }} - description: "✅✅✅ **${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다! ✅✅✅" + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "파이프라인 봇", + "embeds": [{ + "title": "🎉 New Release: ${{ github.ref_name }}", + "url": "${{ github.event.release.html_url }}", + "description": "✅✅✅ **${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다! ✅✅✅", + "color": 3066993 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} - name: Send Failure Notification - if: needs.deploy.result == 'failure' - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - color: "#e74c3c" # 빨간색 - username: "파이프라인 봇" - description: "❌❌❌ **${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다. ❌❌❌" - url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + if: contains(needs.*.result, 'failure') + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "파이프라인 봇", + "embeds": [{ + "title": "릴리즈 배포 실패", + "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", + "description": "❌❌❌ **${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다. ❌❌❌", + "color": 15158332 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} - name: Send Skipped or Cancelled Notification - if: needs.deploy.result == 'skipped' || needs.deploy.result == 'cancelled' - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - color: "#fcf56f" # 노란색 - username: "파이프라인 봇" - description: "🟡🟡🟡 **${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: `${{ needs.deploy.result }}`)\n이전 단계(Build)에서 문제가 발생했을 수 있습니다. 🟡🟡🟡" - url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + if: contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "파이프라인 봇", + "embeds": [{ + "title": "릴리즈 배포 미완료", + "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", + "description": "🟡🟡🟡 **${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다. 🟡🟡🟡", + "color": 16577903 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index 7def2b1..023f41e 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -17,53 +17,71 @@ jobs: # ------------------------- - name: Send PR Created Notification if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'synchronize') - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - title: "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}" - url: ${{ github.event.pull_request.html_url }} - color: "#31a6f5" # 파란색 - username: "GitHub PR 봇" - description: "🔷🔷🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. 🔷🔷🔷" + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "GitHub PR 봇", + "embeds": [{ + "title": "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}", + "description": "🔷🔷🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. �🔷🔷", + "url": "${{ github.event.pull_request.html_url }}", + "color": 3253045 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} # ------------------------- # 댓글 알림 # ------------------------- - name: Send PR Comment Notification if: github.event_name == 'issue_comment' && github.event.issue.pull_request - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - title: "New Comment on PR #${{ github.event.issue.number }}" - url: ${{ github.event.comment.html_url }} - color: "#e67e22" # 주황색 - username: "GitHub 댓글 봇" - description: "🟠🟠🟠 **${{ github.actor }}**님의 새 댓글: \n${{ github.event.comment.body }} 🟠🟠🟠" + run: | + COMMENT_BODY=$(echo "${{ github.event.comment.body }}" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') + curl -X POST -H "Content-Type: application/json" \ + -d "{ + \"username\": \"GitHub 댓글 봇\", + \"embeds\": [{ + \"title\": \"New Comment on PR #${{ github.event.issue.number }}\", + \"description\": \"🟠🟠🟠 **${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY} 🟠🟠🟠\", + \"url\": \"${{ github.event.comment.html_url }}\", + \"color\": 15105634 + }] + }" \ + ${{ secrets.DISCORD_WEBHOOK_URL }} # ------------------------- # 머지(Merge) 알림 # ------------------------- - name: Send PR Merged Notification if: github.event.action == 'closed' && github.event.pull_request.merged == true - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - title: "Pull Request #${{ github.event.pull_request.number }} Merged!" - url: ${{ github.event.pull_request.html_url }} - color: "#4ed971" # 초록색 - username: "GitHub Merge 봇" - description: "✅✅✅ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다. ✅✅✅" + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "GitHub Merge 봇", + "embeds": [{ + "title": "Pull Request #${{ github.event.pull_request.number }} Merged!", + "description": "✅✅✅ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다. ✅✅✅", + "url": "${{ github.event.pull_request.html_url }}", + "color": 5167665 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} # ------------------------- # 닫힘(Close) 알림 # ------------------------- - name: Send PR Closed Notification if: github.event.action == 'closed' && github.event.pull_request.merged == false - uses: antoinezanardi/discord-webhook-action@v2 - with: - webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }} - title: "Pull Request #${{ github.event.pull_request.number }} Closed" - url: ${{ github.event.pull_request.html_url }} - color: "#e62410" # 빨간색 - username: "GitHub PR 봇" - description: "❌❌❌ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다. ❌❌❌" + run: | + curl -X POST -H "Content-Type: application/json" \ + -d '{ + "username": "GitHub PR 봇", + "embeds": [{ + "title": "Pull Request #${{ github.event.pull_request.number }} Closed", + "description": "❌❌❌ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다. ❌❌❌", + "url": "${{ github.event.pull_request.html_url }}", + "color": 15082698 + }] + }' \ + ${{ secrets.DISCORD_WEBHOOK_URL }} + � \ No newline at end of file From c0e2272728504271af338b114550460e0fa83083 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Thu, 17 Jul 2025 21:06:04 +0900 Subject: [PATCH 22/31] =?UTF-8?q?chore:=20=ED=88=B4=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20=EC=9D=B4=EA=B7=B8=EB=85=B8=EC=96=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e4f2f6a..9a167d1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,8 @@ temp/ .DS_Store # macOS에서 생성되는 메타파일 Thumbs.db # Windows에서 생성되는 파일 desktop.ini # Windows 바탕화면 설정 파일 +.idea +.vscode # 테스트 커버리지 리포트 htmlcov/ From 96d187de946c8573f368637c343b3ff0511055b0 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Thu, 17 Jul 2025 23:05:14 +0900 Subject: [PATCH 23/31] =?UTF-8?q?fix:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_bot.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index 023f41e..85d80fd 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -84,4 +84,3 @@ jobs: }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} - � \ No newline at end of file From ea895f7d05e2bc7c090e5c0ca33904d812ec05f5 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Thu, 17 Jul 2025 23:11:21 +0900 Subject: [PATCH 24/31] =?UTF-8?q?refactor:=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index 85d80fd..d9e6bf2 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -23,7 +23,7 @@ jobs: "username": "GitHub PR 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}", - "description": "🔷🔷🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. �🔷🔷", + "description": "🔷🔷🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. 🔷🔷🔷", "url": "${{ github.event.pull_request.html_url }}", "color": 3253045 }] From 0b4ecbdfcf06de5f2aedb364f6036be0f8fc3c13 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 12:21:26 +0900 Subject: [PATCH 25/31] =?UTF-8?q?style:=20=EB=94=94=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B4=87=20=EC=95=8C=EB=9E=8C=20=ED=98=95=EC=8B=9D?= =?UTF-8?q?=20=EB=B0=8F=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build_release_and_notify.yml | 16 +++++------ .github/workflows/pr_bot.yml | 28 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml index 0c942d8..92f1beb 100644 --- a/.github/workflows/build_release_and_notify.yml +++ b/.github/workflows/build_release_and_notify.yml @@ -19,8 +19,8 @@ jobs: -d '{ "username": "파이프라인 봇", "embeds": [{ - "description": "🔷🔷🔷 **${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다. 🔷🔷🔷", - "color": 3253045 + "description": "🔷 **${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다. 🔷", + "color": 2243312 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} @@ -140,8 +140,8 @@ jobs: "embeds": [{ "title": "🎉 New Release: ${{ github.ref_name }}", "url": "${{ github.event.release.html_url }}", - "description": "✅✅✅ **${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다! ✅✅✅", - "color": 3066993 + "description": "✅ **${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다! ✅", + "color": 5167473 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} @@ -155,8 +155,8 @@ jobs: "embeds": [{ "title": "릴리즈 배포 실패", "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "description": "❌❌❌ **${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다. ❌❌❌", - "color": 15158332 + "description": "❌ **${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다. ❌", + "color": 15219495 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} @@ -170,8 +170,8 @@ jobs: "embeds": [{ "title": "릴리즈 배포 미완료", "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "description": "🟡🟡🟡 **${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다. 🟡🟡🟡", - "color": 16577903 + "description": "🟡 **${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다. 🟡", + "color": 16577629 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index d9e6bf2..f09d7ad 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -23,9 +23,9 @@ jobs: "username": "GitHub PR 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}", - "description": "🔷🔷🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. 🔷🔷🔷", + "description": "🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. 🔷", "url": "${{ github.event.pull_request.html_url }}", - "color": 3253045 + "color": 2243312 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} @@ -38,15 +38,15 @@ jobs: run: | COMMENT_BODY=$(echo "${{ github.event.comment.body }}" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') curl -X POST -H "Content-Type: application/json" \ - -d "{ - \"username\": \"GitHub 댓글 봇\", - \"embeds\": [{ - \"title\": \"New Comment on PR #${{ github.event.issue.number }}\", - \"description\": \"🟠🟠🟠 **${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY} 🟠🟠🟠\", - \"url\": \"${{ github.event.comment.html_url }}\", - \"color\": 15105634 + -d '{ + "username": "GitHub 댓글 봇", + "embeds": [{ + "title": "New Comment on PR #${{ github.event.issue.number }}", + "description": "🟠 **${{ github.actor }}**님의 새 댓글: \n${COMMENT_BODY} 🟠", + "url": "${{ github.event.comment.html_url }}", + "color": 15105570 }] - }" \ + }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} # ------------------------- @@ -60,9 +60,9 @@ jobs: "username": "GitHub Merge 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }} Merged!", - "description": "✅✅✅ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다. ✅✅✅", + "description": "✅ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다. ✅", "url": "${{ github.event.pull_request.html_url }}", - "color": 5167665 + "color": 5167473 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} @@ -78,9 +78,9 @@ jobs: "username": "GitHub PR 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }} Closed", - "description": "❌❌❌ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다. ❌❌❌", + "description": "❌ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다. ❌", "url": "${{ github.event.pull_request.html_url }}", - "color": 15082698 + "color": 15219495 }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} From 67d560779126f03f254c47b5ed81e2e6b1170c3a Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 12:37:09 +0900 Subject: [PATCH 26/31] =?UTF-8?q?style:=20=EB=94=94=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B4=87=20=EC=95=8C=EB=9E=8C=20=ED=98=95=EC=8B=9D?= =?UTF-8?q?=20=EB=B0=8F=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_release_and_notify.yml | 8 ++++---- .github/workflows/pr_bot.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml index 92f1beb..29f4a9d 100644 --- a/.github/workflows/build_release_and_notify.yml +++ b/.github/workflows/build_release_and_notify.yml @@ -19,7 +19,7 @@ jobs: -d '{ "username": "파이프라인 봇", "embeds": [{ - "description": "🔷 **${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다. 🔷", + "description": "**${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다.", "color": 2243312 }] }' \ @@ -140,7 +140,7 @@ jobs: "embeds": [{ "title": "🎉 New Release: ${{ github.ref_name }}", "url": "${{ github.event.release.html_url }}", - "description": "✅ **${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다! ✅", + "description": "**${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다!", "color": 5167473 }] }' \ @@ -155,7 +155,7 @@ jobs: "embeds": [{ "title": "릴리즈 배포 실패", "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "description": "❌ **${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다. ❌", + "description": "**${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다.", "color": 15219495 }] }' \ @@ -170,7 +170,7 @@ jobs: "embeds": [{ "title": "릴리즈 배포 미완료", "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "description": "🟡 **${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다. 🟡", + "description": "**${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다.", "color": 16577629 }] }' \ diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index f09d7ad..d260921 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -23,7 +23,7 @@ jobs: "username": "GitHub PR 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}", - "description": "🔷 **${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다. 🔷", + "description": "**${{ github.actor }}**님이 Pull Request를 생성하거나 업데이트했습니다.", "url": "${{ github.event.pull_request.html_url }}", "color": 2243312 }] @@ -42,7 +42,7 @@ jobs: "username": "GitHub 댓글 봇", "embeds": [{ "title": "New Comment on PR #${{ github.event.issue.number }}", - "description": "🟠 **${{ github.actor }}**님의 새 댓글: \n${COMMENT_BODY} 🟠", + "description": "**${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY}", "url": "${{ github.event.comment.html_url }}", "color": 15105570 }] @@ -60,7 +60,7 @@ jobs: "username": "GitHub Merge 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }} Merged!", - "description": "✅ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다. ✅", + "description": "**${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 머지했습니다.", "url": "${{ github.event.pull_request.html_url }}", "color": 5167473 }] @@ -78,7 +78,7 @@ jobs: "username": "GitHub PR 봇", "embeds": [{ "title": "Pull Request #${{ github.event.pull_request.number }} Closed", - "description": "❌ **${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다. ❌", + "description": "**${{ github.actor }}**님이 **${{ github.event.pull_request.title }}** PR을 닫았습니다.", "url": "${{ github.event.pull_request.html_url }}", "color": 15219495 }] From fa9901ab9c77668d85c56762e8b73dc00a074c8c Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 12:40:48 +0900 Subject: [PATCH 27/31] =?UTF-8?q?fix:=20=EB=8C=93=EA=B8=80=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B1=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_bot.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index d260921..3d955c1 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -38,15 +38,15 @@ jobs: run: | COMMENT_BODY=$(echo "${{ github.event.comment.body }}" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') curl -X POST -H "Content-Type: application/json" \ - -d '{ - "username": "GitHub 댓글 봇", - "embeds": [{ - "title": "New Comment on PR #${{ github.event.issue.number }}", - "description": "**${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY}", - "url": "${{ github.event.comment.html_url }}", - "color": 15105570 + -d "{ + \"username\": \"GitHub 댓글 봇\", + \"embeds\": [{ + \"title\": \"New Comment on PR #${{ github.event.issue.number }}\", + \"description\": \"**${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY}\", + \"url\": \"${{ github.event.comment.html_url }}\", + \"color\": 15105634 }] - }' \ + }" \ ${{ secrets.DISCORD_WEBHOOK_URL }} # ------------------------- From 55ea92a60f7afca0ffe54a666d0bab32cdb46c2a Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 12:46:04 +0900 Subject: [PATCH 28/31] =?UTF-8?q?style:=20=EB=8C=93=EA=B8=80=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_bot.yml b/.github/workflows/pr_bot.yml index 3d955c1..22daee4 100644 --- a/.github/workflows/pr_bot.yml +++ b/.github/workflows/pr_bot.yml @@ -44,7 +44,7 @@ jobs: \"title\": \"New Comment on PR #${{ github.event.issue.number }}\", \"description\": \"**${{ github.actor }}**님의 새 댓글: \\n${COMMENT_BODY}\", \"url\": \"${{ github.event.comment.html_url }}\", - \"color\": 15105634 + \"color\": 15105570 }] }" \ ${{ secrets.DISCORD_WEBHOOK_URL }} From e8f03262491151ea292327f503139084b5cb4bff Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 12:26:07 +0900 Subject: [PATCH 29/31] =?UTF-8?q?docs:=20Askql=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 15e0a0b..66ea4cd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# AskQL API +# QGenie API -이 프로젝트는 AskQL 서비스의 백엔드 API를 제공합니다. FastAPI를 기반으로 구축되었으며, 효율적이고 확장 가능한 API를 목표로 합니다. +이 프로젝트는 QGenie 서비스의 백엔드 API를 제공합니다. FastAPI를 기반으로 구축되었으며, 효율적이고 확장 가능한 API를 목표로 합니다. --- @@ -46,10 +46,10 @@ **Poetry `init` 시 질문에 대한 답변:** - - `Package name`: `askql-api` + - `Package name`: `QGenie-api` - `Version`: `0.1.0` - `Description`: `""` - - `Author`: `AskQL Team` + - `Author`: `Queryus` - `License`: `MIT` - `Compatible Python versions`: `>=3.11` - `Would you like to define your main dependencies interactively?`: `no` From 0f659ebee20958f392d2d1f5b892536e52e56b7e Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 12:38:42 +0900 Subject: [PATCH 30/31] =?UTF-8?q?style:=20=EB=94=94=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A4=84=EB=B0=94=EA=BF=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 66ea4cd..2f093e9 100644 --- a/README.md +++ b/README.md @@ -161,3 +161,4 @@ ```bash curl http://localhost:8000/openapi.json ``` + From 1e595ad64c7f2afe8dd1d4f1a608ee66d0c5c5c5 Mon Sep 17 00:00:00 2001 From: ChoiseU Date: Fri, 18 Jul 2025 20:24:43 +0900 Subject: [PATCH 31/31] =?UTF-8?q?style:=20=EB=85=B8=EC=B6=9C=20=EB=A9=98?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build_release_and_notify.yml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_release_and_notify.yml b/.github/workflows/build_release_and_notify.yml index 29f4a9d..558fea7 100644 --- a/.github/workflows/build_release_and_notify.yml +++ b/.github/workflows/build_release_and_notify.yml @@ -17,9 +17,9 @@ jobs: run: | curl -X POST -H "Content-Type: application/json" \ -d '{ - "username": "파이프라인 봇", + "username": "API 배포 봇", "embeds": [{ - "description": "**${{ github.ref_name }}** 릴리즈 배포 파이프라인을 시작합니다.", + "description": "**${{ github.ref_name }}** API 배포를 시작합니다.", "color": 2243312 }] }' \ @@ -136,11 +136,11 @@ jobs: run: | curl -X POST -H "Content-Type: application/json" \ -d '{ - "username": "파이프라인 봇", + "username": "API 배포 봇", "embeds": [{ - "title": "🎉 New Release: ${{ github.ref_name }}", + "title": "New API Release: ${{ github.ref_name }}", "url": "${{ github.event.release.html_url }}", - "description": "**${{ github.ref_name }}** 릴리즈 배포가 성공적으로 완료되었습니다!", + "description": "**${{ github.ref_name }}** API 배포가 성공적으로 완료되었습니다!", "color": 5167473 }] }' \ @@ -151,11 +151,11 @@ jobs: run: | curl -X POST -H "Content-Type: application/json" \ -d '{ - "username": "파이프라인 봇", + "username": "API 배포 봇", "embeds": [{ - "title": "릴리즈 배포 실패", + "title": "API 배포 실패", "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "description": "**${{ github.ref_name }}** 릴리즈 배포 중 오류가 발생했습니다.", + "description": "**${{ github.ref_name }}** API 배포 중 오류가 발생했습니다.", "color": 15219495 }] }' \ @@ -166,11 +166,11 @@ jobs: run: | curl -X POST -H "Content-Type: application/json" \ -d '{ - "username": "파이프라인 봇", + "username": "API 배포 봇", "embeds": [{ - "title": "릴리즈 배포 미완료", + "title": "API 배포 미완료", "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", - "description": "**${{ github.ref_name }}** 릴리즈 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다.", + "description": "**${{ github.ref_name }}** API 배포가 완료되지 않았습니다. (상태: 취소 또는 건너뜀)\n이전 단계에서 문제가 발생했을 수 있습니다.", "color": 16577629 }] }' \