Skip to content

Commit 11b87bd

Browse files
authored
Merge pull request #4 from TatraDev/venv_logic
add virtualenv_logic
2 parents 0435ff2 + 9a901d6 commit 11b87bd

File tree

15 files changed

+456
-187
lines changed

15 files changed

+456
-187
lines changed

main.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from piper.services import TestMessageAdder, StringValue, TesseractRecognizer, SpacyNER
2-
from piper.envs import CurrentEnv, DockerEnv
2+
from piper.envs import CurrentEnv, DockerEnv, VirtualEnv
33
from piper.configurations import get_configuration
44
import time
55
import asyncio
@@ -34,6 +34,11 @@
3434
result = loop.run_until_complete(recognizer())
3535
logger.info(f'result of recognition is {result}')
3636

37+
with VirtualEnv() as env:
38+
env.copy_struct_project()
39+
env.create_files_for_venv()
40+
env.create_files_for_tests()
41+
3742
# sys.exit()
3843

3944
# sn = SpacyNER()

piper/base/backend/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import jinja2
21
import os
32

3+
import jinja2
4+
45

56
def render_fast_api_backend(**kwargs):
67
"""

piper/base/docker/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
23
import jinja2
34

45

piper/base/virtualenv/__init__.py

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env bash
2+
3+
source {{ name_venv }}/bin/activate
4+
pip3 install pytest
5+
6+
python3 -m pytest
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/usr/bin/env bash
2+
3+
NAMEVENV={{ name_path }}{{ name_venv }}
4+
5+
pip3 install virtualenv
6+
7+
python3 -m virtualenv $NAMEVENV
8+
source $NAMEVENV/bin/activate
9+
10+
pip3 install -r {{ name_path }}requirements.txt
11+
12+
python3 {{ name_path }}main.py {{ number }}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import pytest
2+
3+
from piper_new_out.main import sum_factorial
4+
5+
6+
def test_base_func_from_main():
7+
res_from_main = sum_factorial({{ number }})
8+
assert res_from_main == 4037913
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import argparse
2+
3+
4+
def sum_factorial(number: int) -> int:
5+
partial_factorial = 1
6+
partial_sum = 0
7+
for i in range(1, number + 1):
8+
partial_factorial *= i
9+
partial_sum += partial_factorial
10+
return partial_sum
11+
12+
13+
if __name__ == "__main__":
14+
parser = argparse.ArgumentParser()
15+
parser.add_argument("number", type=int)
16+
args = parser.parse_args()
17+
if args.number:
18+
print(f'Sum of factorial to {args.number} = {sum_factorial(args.number)}')
19+
else:
20+
print('No positional arguments in cli')

piper/base/virtualenv/utils.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import os
2+
3+
import jinja2
4+
5+
from piper.utils.logger_utils import logger
6+
7+
8+
class VenvPython:
9+
10+
def __init__(
11+
self,
12+
name_path: str,
13+
name_venv: str,
14+
number: int,
15+
):
16+
self.name_path = name_path
17+
self.name_venv = name_venv
18+
self.number = number
19+
20+
def render_venv_bash(self):
21+
"""
22+
Render bash script for create and activate venv
23+
"""
24+
logger.info('Render bash script for create and activate venv')
25+
26+
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
27+
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir),
28+
trim_blocks=True,
29+
lstrip_blocks=True)
30+
template = jinja_env.get_template('bash-create-venv.j2')
31+
return template.render(
32+
name_path=self.name_path,
33+
name_venv=self.name_venv,
34+
number=self.number,
35+
)
36+
37+
@staticmethod
38+
def render_venv_python():
39+
"""
40+
Render main file for virtual env logic
41+
"""
42+
logger.info('Render main file for virtual env logic')
43+
44+
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
45+
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir),
46+
trim_blocks=True,
47+
lstrip_blocks=True)
48+
template = jinja_env.get_template('python-script-venv.j2')
49+
return template.render()
50+
51+
def render_tests_bash(self):
52+
"""
53+
Render bash script for create and activate venv
54+
"""
55+
logger.info('Render bash script for create and activate venv')
56+
57+
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
58+
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir),
59+
trim_blocks=True,
60+
lstrip_blocks=True)
61+
template = jinja_env.get_template('bash-create-tests.j2')
62+
return template.render(
63+
name_venv=self.name_venv,
64+
)
65+
66+
def render_tests_python(self):
67+
"""
68+
Render bash script for create and activate venv
69+
"""
70+
logger.info('Render bash script for create and activate venv')
71+
72+
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
73+
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir),
74+
trim_blocks=True,
75+
lstrip_blocks=True)
76+
template = jinja_env.get_template('python-script-tests.j2')
77+
return template.render(
78+
number=self.number,
79+
)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import inspect
2+
import os
3+
import subprocess
4+
from typing import Dict
5+
6+
from piper.base.virtualenv.utils import VenvPython
7+
from piper.configurations import get_configuration
8+
from piper.utils.logger_utils import logger
9+
10+
11+
def copy_piper(path: str):
12+
cfg = get_configuration()
13+
from distutils.dir_util import copy_tree
14+
copy_tree(cfg.piper_path, f"{path}/piper")
15+
16+
17+
def copy_scripts(path: str, scripts: Dict[str, str]):
18+
for script_name, script_path in scripts.items():
19+
with open(f"{path}/{script_name}.py", "w") as output:
20+
with open(script_path, "r") as current_file:
21+
output.write(current_file.read())
22+
23+
24+
def write_requirements(path, requirements):
25+
with open(f"{path}/requirements.txt", "w") as output:
26+
output.write("\n".join(requirements))
27+
28+
29+
class VirtualEnvExecutor:
30+
requirements = ["gunicorn", "fastapi", "uvicorn", "aiohttp", "docker", "Jinja2", "pydantic", "loguru"]
31+
32+
def __init__(self):
33+
logger.info('VirtualEnvExecutor init with is_virtual_env()')
34+
35+
cfg = get_configuration()
36+
self.project_output_path = cfg.path
37+
self.name_venv = cfg.name_venv
38+
self.number = cfg.number
39+
40+
def scripts(self):
41+
return {"service": inspect.getfile(self.__class__)}
42+
43+
def copy_struct_project(self):
44+
copy_piper(self.project_output_path)
45+
copy_scripts(self.project_output_path, self.scripts())
46+
47+
def create_files_for_venv(self):
48+
logger.info('VirtualEnvExecutor create_fast_api_files_venv()')
49+
50+
venv_python_image = VenvPython(
51+
name_path=self.project_output_path,
52+
name_venv=self.name_venv,
53+
number=self.number,
54+
)
55+
56+
venv_main = venv_python_image.render_venv_python()
57+
with open(f"{self.project_output_path}/main.py", "w") as output:
58+
output.write(venv_main)
59+
60+
venv_bash = venv_python_image.render_venv_bash()
61+
with open(f"{self.project_output_path}/create_venv.sh", "w") as output:
62+
output.write(venv_bash)
63+
64+
write_requirements(self.project_output_path, self.requirements)
65+
66+
process_chmod = subprocess.run(f'chmod +x {self.project_output_path}create_venv.sh', shell=True)
67+
process_run = subprocess.run(f'{self.project_output_path}create_venv.sh', shell=True)
68+
69+
def create_files_for_tests(self):
70+
logger.info('VirtualEnvExecutor create_files_for_tests()')
71+
72+
with open(f"{self.project_output_path}/__init__.py", "w") as output:
73+
pass
74+
75+
tests_directory = f"{self.project_output_path}/tests"
76+
if not os.path.exists(tests_directory):
77+
os.makedirs(tests_directory)
78+
79+
with open(f"{self.project_output_path}/tests/__init__.py", "w") as output:
80+
pass
81+
82+
venv_python_image = VenvPython(
83+
name_path=self.project_output_path,
84+
name_venv=self.name_venv,
85+
number=self.number,
86+
)
87+
88+
test_main = venv_python_image.render_tests_python()
89+
with open(f"{self.project_output_path}/tests/test_main.py", "w") as output:
90+
output.write(test_main)
91+
92+
test_bash = venv_python_image.render_tests_bash()
93+
with open(f"{self.project_output_path}/test_venv.sh", "w") as output:
94+
output.write(test_bash)

0 commit comments

Comments
 (0)