kkpy-cli 0.1.1__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 (42) hide show
  1. kkpy/__init__.py +0 -0
  2. kkpy/__version__.py +1 -0
  3. kkpy/poetry/install-poetry.py +831 -0
  4. kkpy/poetry/install.sh +22 -0
  5. kkpy/template.py +227 -0
  6. kkpy/templates/.editorconfig +23 -0
  7. kkpy/templates/.gitignore +54 -0
  8. kkpy/templates/.requirements-template.txt +4 -0
  9. kkpy/templates/.requirements-test.txt +3 -0
  10. kkpy/templates/Jenkinsfile +0 -0
  11. kkpy/templates/README.md +0 -0
  12. kkpy/templates/bin/start.py +33 -0
  13. kkpy/templates/bin/start.sh +9 -0
  14. kkpy/templates/src/__init__.py +11 -0
  15. kkpy/templates/src/configs/app.ini +9 -0
  16. kkpy/templates/src/configs/db.ini +5 -0
  17. kkpy/templates/src/configs/logging_config.ini +27 -0
  18. kkpy/templates/src/main.py +27 -0
  19. kkpy/templates/src/requirements.txt +0 -0
  20. kkpy/templates/src/utils/__init__.py +0 -0
  21. kkpy/templates/src/utils/utils.py +63 -0
  22. kkpy/templates/tests/__init__.py +0 -0
  23. kkpy/templates/tests/conftest.py +9 -0
  24. kkpy/templates/tests/test_sample.py +4 -0
  25. kkpy/templates/tox.ini +27 -0
  26. kkpy_cli/__init__.py +0 -0
  27. kkpy_cli/cli.py +197 -0
  28. kkpy_cli/commands/__init__.py +0 -0
  29. kkpy_cli/commands/build.py +34 -0
  30. kkpy_cli/commands/clean.py +19 -0
  31. kkpy_cli/commands/init.py +34 -0
  32. kkpy_cli/commands/install.py +22 -0
  33. kkpy_cli/commands/run.py +23 -0
  34. kkpy_cli/commands/test.py +15 -0
  35. kkpy_cli/utils/__init__.py +1 -0
  36. kkpy_cli/utils/cli_args.py +21 -0
  37. kkpy_cli/utils/exception.py +12 -0
  38. kkpy_cli-0.1.1.dist-info/METADATA +26 -0
  39. kkpy_cli-0.1.1.dist-info/RECORD +42 -0
  40. kkpy_cli-0.1.1.dist-info/WHEEL +5 -0
  41. kkpy_cli-0.1.1.dist-info/entry_points.txt +2 -0
  42. kkpy_cli-0.1.1.dist-info/top_level.txt +2 -0
kkpy_cli/cli.py ADDED
@@ -0,0 +1,197 @@
1
+ import os
2
+ import sys
3
+ import logging
4
+
5
+ import click
6
+ import coloredlogs
7
+
8
+ from kkpy.template import Template, TemplateEnv, TemplateVirtualEnv
9
+ from kkpy_cli.utils import (
10
+ cli_args,
11
+ NotADirectory
12
+ )
13
+
14
+ coloredlogs.install()
15
+ logging.basicConfig(
16
+ level=logging.DEBUG,
17
+ format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s',
18
+ stream=sys.stdout
19
+ )
20
+
21
+ here = os.path.abspath(os.path.dirname(__file__))
22
+
23
+ @click.group()
24
+ @click.version_option(package_name='kkpy-cli')
25
+ def commands():
26
+ pass
27
+
28
+ @commands.command('init')
29
+ @click.option('-d', '--dir_path', metavar='PATH', help='Specify directory to save the template files. ')
30
+ @cli_args.ENV_OPTS
31
+ @cli_args.PYTHON_VERSION
32
+ def init(env, dir_path, python):
33
+ """
34
+ Initialize a python template for development.
35
+ """
36
+
37
+ # check the directory
38
+ if not dir_path:
39
+ dir_path = os.getcwd()
40
+
41
+ if not os.path.exists(dir_path):
42
+ os.makedirs(dir_path, exist_ok=True)
43
+ elif not os.path.isdir(dir_path):
44
+ raise NotADirectory(dir_path)
45
+
46
+ # set the target directory path to env KKPY_PROJECT_HOME
47
+ project_home = os.path.abspath(dir_path)
48
+
49
+ from kkpy_cli.commands.init import init_project
50
+ init_project(env=env, project_home=project_home, python_version=python)
51
+
52
+ @commands.command('build')
53
+ @cli_args.ENV_OPTS
54
+ @cli_args.PYTHON_VERSION
55
+ def build(env, python):
56
+ """
57
+ Build from an existing python template for development.
58
+ """
59
+
60
+ # check the template files is exist.
61
+ if not os.path.isfile(os.path.join(os.getcwd(), TemplateVirtualEnv.TEMPLATE_REQUIREMENTS)):
62
+ print(f"""
63
+ \033[91mCommand execute failed, because it can't find template files.\033[0m
64
+
65
+ \033[94mPlease check\033[0m \033[1m2\033[0m \033[94mitems:\033[0m
66
+
67
+ 1. switch directory to project root directory.
68
+ 2. ensure the template files exists in project root directory.
69
+ """)
70
+
71
+ exit(-1)
72
+
73
+ # set the target directory path to env KKPY_PROJECT_HOME
74
+ project_home = os.path.abspath(os.getcwd())
75
+
76
+ from kkpy_cli.commands.build import build_project
77
+ build_project(env=env, project_home=project_home, python_version=python)
78
+
79
+ @commands.command('install')
80
+ def install():
81
+ """
82
+ Install dependency from requirements.txt.
83
+ """
84
+
85
+ # check the template files is exist.
86
+ if not os.path.isfile(os.path.join(os.getcwd(), TemplateVirtualEnv.TEMPLATE_REQUIREMENTS)):
87
+ print(f"""
88
+ \033[91mCommand execute failed, because it can't find template files.\033[0m
89
+
90
+ \033[94mPlease check\033[0m \033[1m2\033[0m \033[94mitems:\033[0m
91
+
92
+ 1. switch directory to project root directory.
93
+ 2. ensure the template files exists in project root directory.
94
+ """)
95
+
96
+ exit(-1)
97
+
98
+ # set the target directory path to env KKPY_PROJECT_HOME
99
+ project_home = os.path.abspath(os.getcwd())
100
+
101
+ from kkpy_cli.commands.install import install_dependency
102
+ install_dependency(project_home=project_home)
103
+
104
+ @commands.command('test')
105
+ @cli_args.ARGS
106
+ def test(args):
107
+ """
108
+ Start unit test tasks to test src.
109
+
110
+ Any arguments which base on \033[1mtox\033[0m can be passed, e.g. \033[94mkkpy test -- "--recreate --skip-pkg-install"\033[0m
111
+ """
112
+
113
+ if not args:
114
+ args = ''
115
+
116
+ # load env file from project root path
117
+ load_env_file()
118
+
119
+ from kkpy_cli.commands.test import test_project
120
+ code = test_project(tox_args=args)
121
+
122
+ if code != 0:
123
+ sys.exit(f'test error with exit code:{code}')
124
+
125
+ @commands.command('run')
126
+ @cli_args.ARGS
127
+ def run(args):
128
+ """
129
+ Run python procress from project which using the kkpy template.
130
+
131
+ Any arguments can be passed, if you already dinfine input args in bin/start.py , e.g. \033[94mkkpy run -- "--exec_date 2021-01-01"\033[0m
132
+ """
133
+
134
+ if not args:
135
+ args = ''
136
+
137
+ # load env file from project root path
138
+ load_env_file()
139
+
140
+ from kkpy_cli.commands.run import run_project
141
+ code = run_project(args=args)
142
+
143
+ if code != 0:
144
+ sys.exit(f'run error with exit code:{code}')
145
+
146
+ @commands.command('clean')
147
+ def clean():
148
+ """
149
+ Clean project directory, it will remove .venv and .env.
150
+ """
151
+
152
+ # load env file from project root path
153
+ load_env_file()
154
+
155
+ from kkpy_cli.commands.clean import clean_project
156
+ clean_project()
157
+
158
+ @commands.command('env')
159
+ def env():
160
+ """
161
+ Display information about the current project environment.
162
+ """
163
+
164
+ load_env_file()
165
+
166
+ print(f"""
167
+ \033[95mConfigure Information From\033[0m: {os.environ['KKPY_ENV_PATH']}
168
+
169
+ \033[1mEnvironment\033[0m
170
+ \033[94mName\033[0m: {os.environ['KKPY_ENV']}
171
+
172
+ \033[1mProject\033[0m
173
+ \033[94mName\033[0m: {os.environ['KKPY_PROJECT_NAME']}
174
+ \033[94mHome\033[0m: {os.environ['KKPY_PROJECT_HOME']}
175
+
176
+ \033[1mVirtualenv\033[0m
177
+ \033[94mPython\033[0m: {os.environ['KKPY_PYTHON_VERSION']} ({os.environ['KKPY_VIRTUALENV_PATH']}/bin/python)
178
+ \033[94mPath\033[0m: {os.environ['KKPY_VIRTUALENV_PATH']}
179
+ """)
180
+
181
+ def load_env_file(env_directory=os.getcwd()):
182
+ env_is_exist = TemplateEnv.check_is_exist(env_directory=env_directory)
183
+ if not env_is_exist:
184
+ # alert and hint
185
+ print(f"""
186
+ \033[91mCommand execute failed, because it can't find .env file.\033[0m
187
+
188
+ \033[94mPlease check\033[0m \033[1m2\033[0m \033[94mitems:\033[0m
189
+
190
+ 1. switch directory to project root directory.
191
+ 2. ensure the .env file exists in project root directory.
192
+ """)
193
+
194
+ exit(-1)
195
+ else:
196
+ templ_env = TemplateEnv(template_home=env_directory)
197
+ templ_env.load_to_env_vars()
File without changes
@@ -0,0 +1,34 @@
1
+ import os
2
+ import logging
3
+
4
+ from kkpy.template import Template, TemplateEnv, TemplateVirtualEnv
5
+
6
+
7
+ def build_project(env, project_home, python_version):
8
+ # check .env
9
+ env_is_exist = TemplateEnv.check_is_exist(env_directory=project_home)
10
+ if env_is_exist:
11
+ # target folder already initialize before
12
+ print(f"""
13
+ \033[91mIt has already been initialized.\033[0m
14
+ \033[91mIf you want to re-init, please use `kkpy clean` and `kkpy build`.\033[0m
15
+ """)
16
+ exit(-1)
17
+ else:
18
+ templ_env = TemplateEnv(template_home=project_home)
19
+ templ_env.env = env
20
+
21
+ logging.info(f"start to initialize: {os.path.basename(project_home)}")
22
+
23
+ # create template without generate
24
+ templ = Template(template_home=project_home)
25
+
26
+ # create virtualenv
27
+ templ_venv = TemplateVirtualEnv(template_home=project_home,
28
+ python_version=python_version)
29
+ templ_venv.build()
30
+ templ_env.py_ver = templ_venv.py_ver
31
+ templ_env.venv_path = templ_venv.path
32
+
33
+ # create .env file in project root directory
34
+ templ_env.create()
@@ -0,0 +1,19 @@
1
+ import logging
2
+ import os
3
+ import shutil
4
+
5
+
6
+ def clean_project():
7
+ logging.info(f"clean project at: {os.environ.get('KKPY_PROJECT_HOME')}")
8
+
9
+ # remove .venv
10
+ venv_conf_path = os.environ.get('KKPY_VIRTUALENV_CONF_PATH')
11
+ if os.path.exists(venv_conf_path):
12
+ logging.info(f"remove virtualenv conf dir: {venv_conf_path}")
13
+ shutil.rmtree(venv_conf_path)
14
+
15
+ # remove .env
16
+ env_path = os.environ.get('KKPY_ENV_PATH')
17
+ if os.path.isfile(env_path):
18
+ logging.info(f"remove env file: {env_path}")
19
+ os.remove(env_path)
@@ -0,0 +1,34 @@
1
+ import os
2
+ import logging
3
+
4
+ from kkpy.template import Template, TemplateEnv, TemplateVirtualEnv
5
+
6
+ def init_project(env, project_home, python_version):
7
+ # check .env
8
+ env_is_exist = TemplateEnv.check_is_exist(env_directory=project_home)
9
+ if env_is_exist:
10
+ # target folder already initialize before
11
+ print(f"""
12
+ \033[91mIt has already been initialized.\033[0m
13
+ \033[91mIf you want to re-init, please use `kkpy clean` and `kkpy build`.\033[0m
14
+ """)
15
+ exit(-1)
16
+ else:
17
+ templ_env = TemplateEnv(template_home=project_home)
18
+ templ_env.env = env
19
+
20
+ logging.info(f"start to initialize: {os.path.basename(project_home)}")
21
+
22
+ # create template
23
+ templ = Template(template_home=project_home)
24
+ templ.generate()
25
+
26
+ # create virtualenv
27
+ templ_venv = TemplateVirtualEnv(template_home=project_home,
28
+ python_version=python_version)
29
+ templ_venv.build()
30
+ templ_env.py_ver = templ_venv.py_ver
31
+ templ_env.venv_path = templ_venv.path
32
+
33
+ # create .env file in project root directory
34
+ templ_env.create()
@@ -0,0 +1,22 @@
1
+ import os
2
+ import logging
3
+
4
+ from kkpy.template import TemplateEnv, TemplateVirtualEnv
5
+
6
+
7
+ def install_dependency(project_home):
8
+ # check .env
9
+ env_is_exist = TemplateEnv.check_is_exist(env_directory=project_home)
10
+ if not env_is_exist:
11
+ # target folder already initialize before
12
+ print(f"""
13
+ \033[91mIt has not been initialized.\033[0m
14
+ \033[91mIf you want to install dependency, please use `kkpy init` or `kkpy build`.\033[0m
15
+ """)
16
+ exit(-1)
17
+
18
+ logging.info(f"start to install dependency")
19
+
20
+ # create virtualenv and install
21
+ templ_venv = TemplateVirtualEnv(template_home=project_home)
22
+ templ_venv.install()
@@ -0,0 +1,23 @@
1
+ import logging
2
+ import os
3
+ import platform
4
+
5
+ def run_project(args=''):
6
+ os_name = platform.system().lower()
7
+ if os_name == 'linux':
8
+ exec_command = 'bash'
9
+ elif os_name == 'darwin':
10
+ exec_command = 'sh'
11
+ else:
12
+ # Don't support windows
13
+ logging.error('Unidentified Operating System.')
14
+ exit(-1)
15
+
16
+ exec_command += f" {os.environ.get('KKPY_PROJECT_HOME')}/bin/start.sh {args}"
17
+
18
+ if os.environ.get('KKPY_VIRTUALENV_PATH'):
19
+ code = os.system(f". {os.environ.get('KKPY_VIRTUALENV_PATH')}/bin/activate; {exec_command}")
20
+ else:
21
+ code = os.system(f". {exec_command}")
22
+
23
+ return code
@@ -0,0 +1,15 @@
1
+ import os
2
+ import logging
3
+
4
+ def test_project(**kwargs):
5
+ logging.info('================= [pytest] Start ==================')
6
+
7
+ tox_args = kwargs.get('tox_args', '')
8
+
9
+ exec_command = f"tox {tox_args}"
10
+ logging.info(f"exec command: {exec_command}")
11
+ code = os.system(f'. {os.environ.get("KKPY_VIRTUALENV_PATH")}/bin/activate; {exec_command}')
12
+
13
+ logging.info('================= [pytest] End ==================')
14
+
15
+ return code
@@ -0,0 +1 @@
1
+ from kkpy_cli.utils.exception import *
@@ -0,0 +1,21 @@
1
+ import click
2
+
3
+ ENV_OPTS = click.option(
4
+ '-e',
5
+ '--env',
6
+ type=click.Choice(['dev', 'sit', 'stage', 'prod']),
7
+ default='dev',
8
+ show_default=True,
9
+ help=''
10
+ )
11
+
12
+ PYTHON_VERSION = click.option(
13
+ '-p',
14
+ '--python',
15
+ help='Specify the full python version, e.g 3.6.10. '
16
+ )
17
+
18
+ ARGS = click.argument(
19
+ 'args',
20
+ required=False
21
+ )
@@ -0,0 +1,12 @@
1
+ import platform
2
+
3
+ __all__ = ['NotADirectory']
4
+
5
+
6
+ class BuilderException(Exception):
7
+ pass
8
+
9
+
10
+ class NotADirectory(BuilderException):
11
+ def __init__(self, path):
12
+ super(NotADirectory, self).__init__("Path '{}' is not a directory.".format(path))
@@ -0,0 +1,26 @@
1
+ Metadata-Version: 2.4
2
+ Name: kkpy-cli
3
+ Version: 0.1.1
4
+ Summary: A CLI to scaffold, build, test and run Python projects from a project template.
5
+ Keywords: Python,Template,CLI
6
+ Classifier: Programming Language :: Python :: 3.6
7
+ Classifier: Programming Language :: Python :: 3.7
8
+ Classifier: Programming Language :: Python :: 3.8
9
+ Requires-Python: >=3.6
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: setuptools==57.0.0
12
+ Requires-Dist: wheel==0.36.2
13
+ Requires-Dist: virtualenv==20.4.7
14
+ Requires-Dist: click==8.0.1
15
+ Requires-Dist: python-dotenv==0.18.0
16
+ Requires-Dist: coloredlogs==15.0.1
17
+ Requires-Dist: importlib-metadata==3.10.1
18
+ Dynamic: classifier
19
+ Dynamic: description
20
+ Dynamic: description-content-type
21
+ Dynamic: keywords
22
+ Dynamic: requires-dist
23
+ Dynamic: requires-python
24
+ Dynamic: summary
25
+
26
+ # kkpy-cli
@@ -0,0 +1,42 @@
1
+ kkpy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ kkpy/__version__.py,sha256=ls1camlIoMxEZz9gSkZ1OJo-MXqHWwKPtdPbZJmwp7E,22
3
+ kkpy/template.py,sha256=nGsSC38iuhnR-4jwf5F2P_KwG7qtiMeQlMuLiawxAV8,8020
4
+ kkpy/poetry/install-poetry.py,sha256=s10Fm-bzQ6wfBa5W6Oqq67NNqMkkJO4AEzgh1_EeOpw,23368
5
+ kkpy/poetry/install.sh,sha256=LL3_HfiUbgGHdpP5nTiQIBqHpBmSlDLd2H9kxAaQTas,572
6
+ kkpy/templates/.editorconfig,sha256=Pn1rDsfqMHfafXD88ypjWhkI0ocsBXiNEpMq-3OZdV8,263
7
+ kkpy/templates/.gitignore,sha256=24wMnt7Kw2Fw_lXxkSv9cMiwTK07EtE-K_GRYkiHqUk,558
8
+ kkpy/templates/.requirements-template.txt,sha256=uxmFYEgbpRy0lCSHEoBKCgIDq4fHdbQ6I3Go2EC6whQ,60
9
+ kkpy/templates/.requirements-test.txt,sha256=Qav-C9STi3theJJoE27sGT3noTo-BEq_VgLZwyodAX4,45
10
+ kkpy/templates/Jenkinsfile,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ kkpy/templates/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ kkpy/templates/tox.ini,sha256=vAb2mbZDzU1bEAaJcTtCiH_Xi8Xv5jeeA_cJuHkdDjY,466
13
+ kkpy/templates/bin/start.py,sha256=5wB5gzEKHi_KCrDTrYV3iBir05STNmxxVQseOMHbleI,827
14
+ kkpy/templates/bin/start.sh,sha256=hpj9Dt5-WsO_V7heVR8NEw4QMm2gzbOaX3qYhAlYNDs,182
15
+ kkpy/templates/src/__init__.py,sha256=Go2xZ6bNLIqO1aJ7Emf0qwRpe4FvAdMBT_LWOWwNFWI,278
16
+ kkpy/templates/src/main.py,sha256=IwjaMORkgyZiUIXdruK-boha-VrQkUklDx5WYxYZeLw,579
17
+ kkpy/templates/src/requirements.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ kkpy/templates/src/configs/app.ini,sha256=R1fhxAMADISFU_mixVbH9RoNak7V3qvGQoZ2da31SCA,90
19
+ kkpy/templates/src/configs/db.ini,sha256=_YT9sa8JG3ncAey51l_Pvpxe6qLwL3pYlj6tbIYNm28,105
20
+ kkpy/templates/src/configs/logging_config.ini,sha256=4KKVK3uzs67QzmzHPu56oPd-qmUNdsMJGXIcXSkHaJE,504
21
+ kkpy/templates/src/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ kkpy/templates/src/utils/utils.py,sha256=vRagEzUIQJnqPRHc8N_4HJV4UM4c_eKUhARhs2h1nsc,2044
23
+ kkpy/templates/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ kkpy/templates/tests/conftest.py,sha256=uaA70g4x-g2M79GV8H6i1rRdwUfs92qm-wEAYTkUixk,140
25
+ kkpy/templates/tests/test_sample.py,sha256=I8Nf447swmFpcAW_cjaD3_CABP9zwaICBA-98O__AAs,79
26
+ kkpy_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ kkpy_cli/cli.py,sha256=924u_99wQnCK92gP6hZQyOPHepkP9KGwp95_WOU_wLM,5429
28
+ kkpy_cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ kkpy_cli/commands/build.py,sha256=2b_OewvRrQOxuszYNMRsEh94qC5DwEGQ2uoqhxlCfRw,1088
30
+ kkpy_cli/commands/clean.py,sha256=cqnrPr2IKV4Ff0FeemlNhSEgNGmosTa9I1K80m4Mjco,551
31
+ kkpy_cli/commands/init.py,sha256=OGSUpo92bDytEPa8htiRmZ4mli8UHLupJkUftaw_J6g,1089
32
+ kkpy_cli/commands/install.py,sha256=EYp7sFR1B_gfE_IXggXYCPpLHd4Dx7J2zblMQ4sPpuk,649
33
+ kkpy_cli/commands/run.py,sha256=FSR3f-65ZFdsbcyqf1W2U1hVT_sRMLsd2B-sFzshP5Q,643
34
+ kkpy_cli/commands/test.py,sha256=EQRWOnYQQY35_mg_u8VOYZTWip2Hjui8LAA4b342SZc,442
35
+ kkpy_cli/utils/__init__.py,sha256=KR9-qCuqRtSkr_6DCdDkcgf--AwvhcFumz4wohvKTzA,39
36
+ kkpy_cli/utils/cli_args.py,sha256=eZG1jD477GJMNR1J6wkBf4gY7nnWqcMhlCpHralf4vA,348
37
+ kkpy_cli/utils/exception.py,sha256=XLJp99V4Kp37-Hq3q92tdp2jL9qOSWwDP31xuROkOfw,252
38
+ kkpy_cli-0.1.1.dist-info/METADATA,sha256=RZlIWhGwBtpG1Qh9SDVTky5bfz62OQ1Kfl1wfQ70ns4,793
39
+ kkpy_cli-0.1.1.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
40
+ kkpy_cli-0.1.1.dist-info/entry_points.txt,sha256=LruZj9XTLYR8HK7wfPRQdfSrkZSflNT1OAQRjJhFZaM,47
41
+ kkpy_cli-0.1.1.dist-info/top_level.txt,sha256=PBiXT0uh18I6ig18qu4FdfBfmgq2ODL0hlh6iDN0d6c,14
42
+ kkpy_cli-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ kkpy = kkpy_cli.cli:commands
@@ -0,0 +1,2 @@
1
+ kkpy
2
+ kkpy_cli