FastAPI-fastkit 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. fastapi_fastkit/__init__.py +10 -0
  2. fastapi_fastkit/__main__.py +8 -0
  3. fastapi_fastkit/backend.py +112 -0
  4. fastapi_fastkit/cli.py +432 -0
  5. fastapi_fastkit/core/__init__.py +0 -0
  6. fastapi_fastkit/core/exceptions.py +27 -0
  7. fastapi_fastkit/core/settings.py +107 -0
  8. fastapi_fastkit/fastapi_project_template/PROJECT_README_TEMPLATE.md +66 -0
  9. fastapi_fastkit/fastapi_project_template/README.md +20 -0
  10. fastapi_fastkit/fastapi_project_template/__init__.py +0 -0
  11. fastapi_fastkit/fastapi_project_template/fastapi-default/.env.test-tpl +3 -0
  12. fastapi_fastkit/fastapi_project_template/fastapi-default/.gitignore-tpl +191 -0
  13. fastapi_fastkit/fastapi_project_template/fastapi-default/README.md-tpl +17 -0
  14. fastapi_fastkit/fastapi_project_template/fastapi-default/main.py-tpl +21 -0
  15. fastapi_fastkit/fastapi_project_template/fastapi-default/requirements.txt-tpl +47 -0
  16. fastapi_fastkit/fastapi_project_template/fastapi-default/script/run-server.sh-tpl +2 -0
  17. fastapi_fastkit/fastapi_project_template/fastapi-default/script/run-test.sh-tpl +2 -0
  18. fastapi_fastkit/fastapi_project_template/fastapi-default/setup.cfg-tpl +13 -0
  19. fastapi_fastkit/fastapi_project_template/fastapi-default/setup.py-tpl +35 -0
  20. fastapi_fastkit/fastapi_project_template/fastapi-default/src/.DS_Store +0 -0
  21. fastapi_fastkit/fastapi_project_template/fastapi-default/src/__init__.py-tpl +88 -0
  22. fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/__init__.py-tpl +0 -0
  23. fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/settings.py-tpl +96 -0
  24. fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/__init__.py-tpl +0 -0
  25. fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/_base.py-tpl +92 -0
  26. fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/user.py-tpl +44 -0
  27. fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/__init__.py-tpl +0 -0
  28. fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/exceptions.py-tpl +94 -0
  29. fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/global_data.py-tpl +33 -0
  30. fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/logging.py-tpl +25 -0
  31. fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/pagination.py-tpl +71 -0
  32. fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/__init__.py-tpl +0 -0
  33. fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/mock_users.json-tpl +17 -0
  34. fastapi_fastkit/fastapi_project_template/fastapi-default/src/router/__init__.py-tpl +48 -0
  35. fastapi_fastkit/fastapi_project_template/fastapi-default/src/router/user.py-tpl +126 -0
  36. fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/__init__.py-tpl +48 -0
  37. fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/user.py-tpl +81 -0
  38. fastapi_fastkit/fastapi_project_template/fastapi-default/src/templates/index.html-tpl +27 -0
  39. fastapi_fastkit/fastapi_project_template/fastapi-default/src/utils/__init__.py-tpl +0 -0
  40. fastapi_fastkit/fastapi_project_template/fastapi-default/src/utils/documents.py-tpl +20 -0
  41. fastapi_fastkit/fastapi_project_template/fastapi-default/test/__init__.py-tpl +0 -0
  42. fastapi_fastkit/fastapi_project_template/fastapi-default/test/conftest.py-tpl +22 -0
  43. fastapi_fastkit/fastapi_project_template/fastapi-default/test/routes/__init__.py-tpl +0 -0
  44. fastapi_fastkit/fastapi_project_template/fastapi-default/test/routes/test_user.py-tpl +112 -0
  45. fastapi_fastkit/fastapi_project_template/fastapi-dockerized/__init__.py-tpl +0 -0
  46. fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/__init__.py-tpl +0 -0
  47. fastapi_fastkit/py.typed +0 -0
  48. fastapi_fastkit/utils/__init__.py +0 -0
  49. fastapi_fastkit/utils/inspector.py +15 -0
  50. fastapi_fastkit/utils/logging.py +33 -0
  51. fastapi_fastkit/utils/transducer.py +70 -0
  52. fastapi_fastkit-0.1.0.dist-info/METADATA +46 -0
  53. fastapi_fastkit-0.1.0.dist-info/RECORD +56 -0
  54. fastapi_fastkit-0.1.0.dist-info/WHEEL +4 -0
  55. fastapi_fastkit-0.1.0.dist-info/entry_points.txt +5 -0
  56. fastapi_fastkit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>FastAPI Test Project</title>
5
+ <style>
6
+ body {
7
+ font-family: Arial, sans-serif;
8
+ margin: 40px auto;
9
+ max-width: 800px;
10
+ padding: 0 20px;
11
+ }
12
+ h1 {
13
+ color: #333;
14
+ text-align: center;
15
+ }
16
+ .description {
17
+ color: #666;
18
+ text-align: center;
19
+ }
20
+ </style>
21
+ </head>
22
+ <body>
23
+ <h1>Welcome to FastAPI Test Project</h1>
24
+ <p class="description">This is a test project using FastAPI framework.</p>
25
+ <p class="description">API Documentation: <a href="/docs">Swagger UI</a> | <a href="/redoc">ReDoc</a></p>
26
+ </body>
27
+ </html>
@@ -0,0 +1,20 @@
1
+ # --------------------------------------------------------------------------
2
+ # The module defines API docs content that OpenAPI generator can read.
3
+ # --------------------------------------------------------------------------
4
+ from fastapi import FastAPI
5
+
6
+
7
+ def add_description_at_api_tags(app: FastAPI):
8
+ tag_descriptions = {
9
+ "user": "User API. Performs user login/logout/get informations/etc...",
10
+ # put routers' description here after create and connect them.
11
+ }
12
+
13
+ openapi_tags = [
14
+ {"name": tag, "description": desc} for tag, desc in tag_descriptions.items()
15
+ ]
16
+
17
+ if app.openapi_tags:
18
+ app.openapi_tags.extend(openapi_tags)
19
+ else:
20
+ app.openapi_tags = openapi_tags
@@ -0,0 +1,22 @@
1
+ # --------------------------------------------------------------------------
2
+ # The module configures pytest runtime options.
3
+ # --------------------------------------------------------------------------
4
+ import pytest_asyncio
5
+
6
+ from httpx import AsyncClient, ASGITransport
7
+
8
+ from src import create_app
9
+ from src.core.settings import AppSettings
10
+
11
+
12
+ app_settings = AppSettings(_env_file=".env.test")
13
+
14
+
15
+ class BaseTestRouter:
16
+ @pytest_asyncio.fixture(scope="function")
17
+ async def client(self):
18
+ app = create_app(app_settings)
19
+ async with AsyncClient(
20
+ transport=ASGITransport(app=app), base_url="http://test"
21
+ ) as c:
22
+ yield c
@@ -0,0 +1,112 @@
1
+ # --------------------------------------------------------------------------
2
+ # User router testcases
3
+ # --------------------------------------------------------------------------
4
+ import pytest
5
+ import pytest_asyncio
6
+
7
+ from fastapi import status
8
+ from uuid import UUID
9
+ from httpx import AsyncClient
10
+
11
+ from test.conftest import BaseTestRouter
12
+
13
+
14
+ @pytest.mark.asyncio
15
+ class TestUserAPI(BaseTestRouter):
16
+
17
+ @pytest_asyncio.fixture(autouse=True)
18
+ async def setup(self, client: AsyncClient):
19
+ self.MOCK_USER_ID = UUID("123e4567-e89b-12d3-a456-426614174000")
20
+ self.INVALID_USER_ID = UUID("123e4567-e89b-12d3-a456-426614174999")
21
+ self.base_url = "/user"
22
+
23
+ async def test_create_user(self, client: AsyncClient):
24
+ # given
25
+ user_data = {
26
+ "username": "testuser",
27
+ "email": "testuser@example.com",
28
+ }
29
+
30
+ # when
31
+ response = await client.post(f"{self.base_url}/", json=user_data)
32
+
33
+ # then
34
+ assert response.status_code == status.HTTP_201_CREATED
35
+ json_response = response.json()
36
+ assert json_response["message"]["username"] == "testuser"
37
+ assert json_response["message"]["email"] == "testuser@example.com"
38
+
39
+ async def test_get_user_valid(self, client: AsyncClient):
40
+ # given
41
+ user_id = self.MOCK_USER_ID
42
+
43
+ # when
44
+ response = await client.get(f"{self.base_url}/{user_id}")
45
+
46
+ # then
47
+ assert response.status_code == status.HTTP_200_OK
48
+ json_response = response.json()
49
+ assert json_response["status"] == 200
50
+ assert json_response["code"] == "HTTP-200"
51
+ assert json_response["message"]["id"] == str(user_id)
52
+
53
+ async def test_get_user_invalid(self, client: AsyncClient):
54
+ # given
55
+ invalid_user_id = self.INVALID_USER_ID
56
+
57
+ # when
58
+ response = await client.get(f"{self.base_url}/{invalid_user_id}")
59
+
60
+ # then
61
+ assert response.status_code == status.HTTP_404_NOT_FOUND
62
+
63
+ async def test_update_user_valid(self, client: AsyncClient):
64
+ # given
65
+ user_id = self.MOCK_USER_ID
66
+ update_data = {
67
+ "username": "updateduser",
68
+ "email": "updateduser@example.com",
69
+ }
70
+
71
+ # when
72
+ response = await client.patch(f"{self.base_url}/{user_id}", json=update_data)
73
+
74
+ # then
75
+ assert response.status_code == status.HTTP_200_OK
76
+ json_response = response.json()
77
+ assert json_response["message"]["username"] == "updateduser"
78
+ assert json_response["message"]["email"] == "updateduser@example.com"
79
+
80
+ async def test_update_user_invalid(self, client: AsyncClient):
81
+ # given
82
+ invalid_user_id = self.INVALID_USER_ID
83
+ update_data = {
84
+ "username": "invaliduser",
85
+ "email": "invaliduser@example.com",
86
+ }
87
+
88
+ # when
89
+ response = await client.patch(f"{self.base_url}/{invalid_user_id}", json=update_data)
90
+
91
+ # then
92
+ assert response.status_code == status.HTTP_404_NOT_FOUND
93
+
94
+ async def test_delete_user_valid(self, client: AsyncClient):
95
+ # given
96
+ user_id = self.MOCK_USER_ID
97
+
98
+ # when
99
+ response = await client.delete(f"{self.base_url}/{user_id}")
100
+
101
+ # then
102
+ assert response.status_code == status.HTTP_204_NO_CONTENT
103
+
104
+ async def test_delete_user_invalid(self, client: AsyncClient):
105
+ # given
106
+ invalid_user_id = self.INVALID_USER_ID
107
+
108
+ # when
109
+ response = await client.delete(f"{self.base_url}/{invalid_user_id}")
110
+
111
+ # then
112
+ assert response.status_code == status.HTTP_404_NOT_FOUND
File without changes
File without changes
@@ -0,0 +1,15 @@
1
+ # TODO : add inspect operation target template is valid FastAPI application.
2
+ # --------------------------------------------------------------------------
3
+ # The Module inspect FastAPI template is appropriate
4
+ #
5
+ # This module will be read by Github Action when contributor
6
+ # makes a PR of adding new FastAPI template.
7
+ #
8
+ # @author bnbong
9
+ # --------------------------------------------------------------------------
10
+ import shutil
11
+
12
+
13
+ def delete_project(project_dir: str) -> None:
14
+ # TODO : add checking step -> preventing 'template' folder deletion.
15
+ shutil.rmtree(project_dir)
@@ -0,0 +1,33 @@
1
+ # --------------------------------------------------------------------------
2
+ # The Module defines console logging operations.
3
+ #
4
+ # @author bnbong bbbong9@gmail.com
5
+ # --------------------------------------------------------------------------
6
+ import logging
7
+ from typing import Union
8
+
9
+ from rich.console import Console
10
+ from rich.logging import RichHandler
11
+
12
+ from fastapi_fastkit.core.settings import FastkitConfig
13
+
14
+
15
+ def setup_logging(
16
+ settings: FastkitConfig, terminal_width: Union[int, None] = None
17
+ ) -> None:
18
+ logger = logging.getLogger("fastapi-fastkit")
19
+ console = Console(width=terminal_width) if terminal_width else None
20
+ formatter = logging.Formatter("%(message)s")
21
+
22
+ rich_handler = RichHandler(
23
+ show_time=False,
24
+ rich_tracebacks=True,
25
+ tracebacks_show_locals=True,
26
+ markup=True,
27
+ show_path=False,
28
+ console=console,
29
+ )
30
+ rich_handler.setFormatter(formatter)
31
+
32
+ logger.setLevel(settings.LOGGING_LEVEL)
33
+ logger.propagate = False
@@ -0,0 +1,70 @@
1
+ # --------------------------------------------------------------------------
2
+ # The Module transduces .*-tpl extension files to their respective file extensions
3
+ # and copies them to user's local directory.
4
+ #
5
+ # This will handle .py-tpl, .txt-tpl, .md-tpl, etc.
6
+ #
7
+ # @author bnbong
8
+ # --------------------------------------------------------------------------
9
+ import os
10
+ import shutil
11
+
12
+
13
+ def _convert_tpl_to_real_extension(file_path: str) -> str:
14
+ """
15
+ Converts a file ending in `.*-tpl` to its respective file extension by removing the `-tpl` suffix.
16
+
17
+ :param file_path: The full path of the `.*-tpl` file.
18
+ :type file_path: str
19
+ :return: The new path of the file with the `-tpl` suffix removed.
20
+ """
21
+ # Remove the '-tpl' suffix from any file extension
22
+ if file_path.endswith("-tpl"):
23
+ new_file_path = file_path.replace("-tpl", "")
24
+ os.rename(file_path, new_file_path)
25
+ return new_file_path
26
+ return file_path
27
+
28
+
29
+ def copy_and_convert_template(
30
+ template_dir: str, target_dir: str, project_name: str = ""
31
+ ) -> None:
32
+ """
33
+ Copies all files from the template directory to the target directory,
34
+ converting any files ending in `.*-tpl` during the copy process.
35
+
36
+ :param project_name: name of new project user defined at CLI.
37
+ :param template_dir: The source directory containing the template files.
38
+ :type template_dir: str
39
+ :param target_dir: The destination directory where files will be copied.
40
+ :type target_dir: str
41
+ """
42
+ template_name = os.path.basename(template_dir)
43
+ if project_name is None:
44
+ project_name = template_name
45
+ target_path = os.path.join(target_dir, project_name)
46
+ os.makedirs(target_path, exist_ok=True)
47
+
48
+ for root, dirs, files in os.walk(template_dir):
49
+ relative_path = os.path.relpath(root, template_dir)
50
+ destination_dir = os.path.join(target_path, relative_path)
51
+
52
+ if not os.path.exists(destination_dir):
53
+ os.makedirs(destination_dir)
54
+
55
+ for file in files:
56
+ src_file = os.path.join(root, file)
57
+
58
+ if file.endswith("-tpl"):
59
+ dst_file = os.path.join(destination_dir, file.replace("-tpl", ""))
60
+ shutil.copy2(src_file, dst_file)
61
+ _convert_tpl_to_real_extension(dst_file)
62
+ else:
63
+ dst_file = os.path.join(destination_dir, file)
64
+ shutil.copy2(src_file, dst_file)
65
+
66
+
67
+ def _convert_real_extension_to_tpl() -> None:
68
+ # TODO : impl this for converting runnable FastAPI app code to template - debugging operation for contributors
69
+ # this will be used at inspector module, not package user's runtime.
70
+ pass
@@ -0,0 +1,46 @@
1
+ Metadata-Version: 2.1
2
+ Name: FastAPI-fastkit
3
+ Version: 0.1.0
4
+ Summary: Fast, easy-to-use starter kit for new users of Python and FastAPI
5
+ Author-Email: bnbong <bbbong9@gmail.com>
6
+ License: MIT
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: click>=8.1.7
9
+ Requires-Dist: rich>=13.9.2
10
+ Requires-Dist: fastapi-cli>=0.0.5
11
+ Provides-Extra: dev
12
+ Requires-Dist: pytest>=8.3.3; extra == "dev"
13
+ Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
14
+ Requires-Dist: black>=24.10.0; extra == "dev"
15
+ Requires-Dist: pre-commit>=4.0.1; extra == "dev"
16
+ Requires-Dist: mypy>=1.12.0; extra == "dev"
17
+ Requires-Dist: isort>=5.13.2; extra == "dev"
18
+ Description-Content-Type: text/markdown
19
+
20
+ <p align="center">
21
+ <img align="top" width="70%" src=".github/FastAPI-fastkit_logo/fastkit_general_logo.png" alt="FastAPI-fastkit"/>
22
+ </p>
23
+ <p align="center">
24
+ <em><b>FastAPI-fastkit</b>: Fast, easy-to-use starter kit for new users of Python and FastAPI</em>
25
+ </p>
26
+ <p align="center">
27
+ <a href="https://pypi.org/project/fastapi-fastkit" target="_blank">
28
+ <img src="https://img.shields.io/pypi/v/fastapi-fastkit" alt="PyPI - Version">
29
+ </a>
30
+ <a href="https://img.shields.io/github/v/release/bnbong/FastAPI-fastkit" target="_blank">
31
+ <img src="https://img.shields.io/github/v/release/bnbong/FastAPI-fastkit" alt="GitHub Release">
32
+ </a>
33
+ </p>
34
+
35
+ ---
36
+
37
+ This project was created to speed up the configuration of the development environment needed to develop Python-based web apps for new users of Python and [FastAPI](https://github.com/fastapi/fastapi).
38
+
39
+ This project was inspired by the `SpringBoot initializer` of the JAVA ecosystem & Python Django's `django-admin` cli operation.
40
+
41
+ ---
42
+
43
+ (other content will be updated later)
44
+
45
+ ---
46
+ @author bnbong bbbong9@gmail.com
@@ -0,0 +1,56 @@
1
+ fastapi_fastkit-0.1.0.dist-info/METADATA,sha256=KFan31hfTNl9iYZtKu1Su-KRxHVCO_0Pzq4sV4PX39k,1698
2
+ fastapi_fastkit-0.1.0.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
+ fastapi_fastkit-0.1.0.dist-info/entry_points.txt,sha256=IONmgb7zWPnJWsCOcpF3u1yP6AWnPjrgWIv49mr1DZE,76
4
+ fastapi_fastkit-0.1.0.dist-info/licenses/LICENSE,sha256=HeeLr8J4jIuyAxFxQ1HJpa1KX4iQkoyBIJDSg4o2w90,1087
5
+ fastapi_fastkit/__init__.py,sha256=FsOU1bIVzJvKtK5qTn6YyF8vdunLpRt27prRGcIXAZ4,175
6
+ fastapi_fastkit/__main__.py,sha256=-FS9yUe4IEgDbJjFC1xso-pFCxRzUJ447j6bYpsBTBM,271
7
+ fastapi_fastkit/backend.py,sha256=xKk3qwMoz96J-HRLg6jjO0hI0A3W1Igp49w_caVImgE,3682
8
+ fastapi_fastkit/cli.py,sha256=RG-R2-BZhZ-GIAG9Yru9AxSTdSnG3GDQYVU0odl4ntM,12546
9
+ fastapi_fastkit/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ fastapi_fastkit/core/exceptions.py,sha256=v5dOaG4xMlUD-payXtPq-35HM4U8NzH-nz8NcKiKW8c,583
11
+ fastapi_fastkit/core/settings.py,sha256=q9tHSqCjdAFiGsw00bPS3rIhbz9AjqVNIlIio6ksQEk,4010
12
+ fastapi_fastkit/fastapi_project_template/PROJECT_README_TEMPLATE.md,sha256=5lT_ZY1QItTDbhKYNY6KlOoGlbSTBSrs9DJthcle3D4,1529
13
+ fastapi_fastkit/fastapi_project_template/README.md,sha256=bgJjzcVeTJQTSDN57lNId5ttbatrGfiI3Ba8XrXr9zg,952
14
+ fastapi_fastkit/fastapi_project_template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ fastapi_fastkit/fastapi_project_template/fastapi-default/.env.test-tpl,sha256=P4IIxRZWreWfqBjYA7pTukRoeq_tif8iZjN06L-O0is,109
16
+ fastapi_fastkit/fastapi_project_template/fastapi-default/.gitignore-tpl,sha256=II4jyvXxkvLovcVNfTBDgLTclePuoM3Zr1dXuSgN5OA,3489
17
+ fastapi_fastkit/fastapi_project_template/fastapi-default/README.md-tpl,sha256=5I_BRqfFbl4Uh5_eoIkFenZGRxUr5zPjuyMOEJQSxE8,403
18
+ fastapi_fastkit/fastapi_project_template/fastapi-default/main.py-tpl,sha256=W7Kf2ANtoxNtdvFX15XyjlI_mXrUsVgFNYALggN4ikk,557
19
+ fastapi_fastkit/fastapi_project_template/fastapi-default/requirements.txt-tpl,sha256=0TyxHR7q73r_wPxgfChCsMs9FhKFfRl3UTMSbazWAJ0,828
20
+ fastapi_fastkit/fastapi_project_template/fastapi-default/script/run-server.sh-tpl,sha256=D7B2IX-NL39OoNPKr7lLE7Gho8hKEVZ_NpL81lwXAkA,47
21
+ fastapi_fastkit/fastapi_project_template/fastapi-default/script/run-test.sh-tpl,sha256=TQOvrbVJdEz2GU_dGX8n5_s8HbsMs40avD6rxkoy10I,45
22
+ fastapi_fastkit/fastapi_project_template/fastapi-default/setup.cfg-tpl,sha256=LfQjDw1UNpgv54cq0KcNOhWpIbvWN9iAkvO5LGNbsMo,177
23
+ fastapi_fastkit/fastapi_project_template/fastapi-default/setup.py-tpl,sha256=7YIWZIB6s_LVRkhwAP-bvg2341INOEbz8I3KCG5yTkk,1035
24
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/.DS_Store,sha256=G56MfjcaPDrmO_-I9z_LWxjtEm3FtWPBc35laos4nM8,6148
25
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/__init__.py-tpl,sha256=m1UtpIv63_xyx4SaKuyRtQNCj72axv1W8_6oAa5_DQw,2741
26
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/core/settings.py-tpl,sha256=CaZa3gsggjbPanZOkP2o3zH3DozuDakbXtbmp7N-s88,3144
28
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/_base.py-tpl,sha256=2Hlu1N9Tc1Ia053Sr0Rc6wlyLdPsUFldpDXHdO_xGHA,2712
30
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/crud/user.py-tpl,sha256=u_oG2oN-z88wpblPWvWuSLJ5ssGnWxLWykv0r_lsclc,1428
31
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/exceptions.py-tpl,sha256=wu_6snWqKE0469xdXy1QBHX-KzmVkscqjwnhTdLi-FQ,3106
33
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/global_data.py-tpl,sha256=t0rdLrCBKL9fjRTbPbQVukQLRKReE46l_apVVyASEv4,1196
34
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/logging.py-tpl,sha256=tT0OGEfhQn3PyAv9DEin1SHc6tStROxdRePzpUiD1Cg,710
35
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/helper/pagination.py-tpl,sha256=vjiFe_3yM1QYYLOJ24vOlRWfMEEodLUYe9NtiYgbKSA,2473
36
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/mocks/mock_users.json-tpl,sha256=q6IGY4ty_FHgNZb6eCfAnBY192ju-_qdaLY6EuqKGP8,421
38
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/router/__init__.py-tpl,sha256=WlZEKdqA_RM2-7iD0mevyCdteAfcimKQqlvTdA2DPSg,1352
39
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/router/user.py-tpl,sha256=UQg7fm61PcItwOHzCs_5XnuFU7OJl0Jky_lH5EG37oo,3730
40
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/__init__.py-tpl,sha256=4NpcztEw_XQT08V5HAVHZFMMAkQ5quyp5napKcnSK5E,1580
41
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/schemas/user.py-tpl,sha256=bmHW1aveQQtvKDFZb26i1aUSKg182OmKWHCbliU05OQ,2931
42
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/templates/index.html-tpl,sha256=hLYHWwrW0GGBykjqkWbtr_IwEJeiJVJvWQp85gKDOTI,689
43
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/utils/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ fastapi_fastkit/fastapi_project_template/fastapi-default/src/utils/documents.py-tpl,sha256=nNR38MGarXRq9G3KkWiD3LovXCMIuqK3tsumIwtYYZY,719
45
+ fastapi_fastkit/fastapi_project_template/fastapi-default/test/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ fastapi_fastkit/fastapi_project_template/fastapi-default/test/conftest.py-tpl,sha256=rAMzO51CkLir3cPAbVYOzMWH5xEreATa0aWC1XwEWtw,666
47
+ fastapi_fastkit/fastapi_project_template/fastapi-default/test/routes/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ fastapi_fastkit/fastapi_project_template/fastapi-default/test/routes/test_user.py-tpl,sha256=-FQIOfmVG73L_rQLZKrQgrUnm9OCxtfkrld1caMtja8,3609
49
+ fastapi_fastkit/fastapi_project_template/fastapi-dockerized/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ fastapi_fastkit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ fastapi_fastkit/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ fastapi_fastkit/utils/inspector.py,sha256=ohR4O0IDapM3bpXKeoF7KvCH-IiQIeRwDwfYPwpd0u8,579
54
+ fastapi_fastkit/utils/logging.py,sha256=Pb7qd6H5O3o6VsBB2kK7lKTOFBV2ju1KqqTnS28eOEE,997
55
+ fastapi_fastkit/utils/transducer.py,sha256=83B_IxFmlTA0JDczZgzDthCXs9sXGuSvdkohg6OkeR8,2659
56
+ fastapi_fastkit-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: pdm-backend (2.4.3)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ fastkit = fastapi_fastkit.cli:fastkit_cli
3
+
4
+ [gui_scripts]
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 이준혁
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.