Skip to content

Commit 1ca693b

Browse files
committed
refacto app.py & conftest
1 parent 6519da6 commit 1ca693b

File tree

3 files changed

+171
-85
lines changed

3 files changed

+171
-85
lines changed

app.py

Lines changed: 0 additions & 79 deletions
This file was deleted.

src/opengeodeweb_back/app.py

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
"""Packages"""
2+
3+
import argparse
4+
import os
5+
import time
6+
7+
import flask
8+
import flask_cors
9+
from flask_cors import cross_origin
10+
from werkzeug.exceptions import HTTPException
11+
12+
from src.opengeodeweb_back import utils_functions, app_config
13+
from src.opengeodeweb_back.routes import blueprint_routes
14+
from src.opengeodeweb_back.routes.models import blueprint_models
15+
from opengeodeweb_microservice.database.connection import init_database
16+
17+
18+
""" Global config """
19+
app = flask.Flask(__name__)
20+
21+
""" Config variables """
22+
FLASK_DEBUG = True if os.environ.get("FLASK_DEBUG", default=None) == "True" else False
23+
24+
if FLASK_DEBUG == False:
25+
app.config.from_object(app_config.ProdConfig)
26+
else:
27+
app.config.from_object(app_config.DevConfig)
28+
29+
DEFAULT_HOST = app.config.get("DEFAULT_HOST")
30+
DEFAULT_PORT = int(app.config.get("DEFAULT_PORT"))
31+
DEFAULT_DATA_FOLDER_PATH = app.config.get("DEFAULT_DATA_FOLDER_PATH")
32+
ORIGINS = app.config.get("ORIGINS")
33+
TIMEOUT = int(app.config.get("MINUTES_BEFORE_TIMEOUT"))
34+
SSL = app.config.get("SSL")
35+
SECONDS_BETWEEN_SHUTDOWNS = float(app.config.get("SECONDS_BETWEEN_SHUTDOWNS"))
36+
37+
38+
def get_db_path_from_config():
39+
database_uri = f"{os.path.abspath(
40+
os.path.join(app.config.get('DATA_FOLDER_PATH'), app.config.get('DATABASE_FILENAME'))
41+
)}"
42+
return database_uri
43+
44+
45+
app.register_blueprint(
46+
blueprint_routes.routes,
47+
url_prefix="/opengeodeweb_back",
48+
name="opengeodeweb_back",
49+
)
50+
51+
app.register_blueprint(
52+
blueprint_models.routes,
53+
url_prefix="/opengeodeweb_back/models",
54+
name="opengeodeweb_models",
55+
)
56+
57+
if FLASK_DEBUG == False:
58+
utils_functions.set_interval(
59+
utils_functions.kill_task, SECONDS_BETWEEN_SHUTDOWNS, app
60+
)
61+
62+
63+
@app.errorhandler(HTTPException)
64+
def errorhandler(e):
65+
return utils_functions.handle_exception(e)
66+
67+
68+
@app.route("/", methods=["POST"])
69+
@cross_origin()
70+
def root():
71+
return flask.make_response({}, 200)
72+
73+
74+
@app.route("/kill", methods=["POST"])
75+
@cross_origin()
76+
def kill() -> None:
77+
print("Manual server kill, shutting down...", flush=True)
78+
os._exit(0)
79+
80+
81+
def run_server():
82+
parser = argparse.ArgumentParser(
83+
prog="OpenGeodeWeb-Back", description="Backend server for OpenGeodeWeb"
84+
)
85+
parser.add_argument("--host", type=str, default=DEFAULT_HOST, help="Host to run on")
86+
parser.add_argument(
87+
"-p", "--port", type=int, default=DEFAULT_PORT, help="Port to listen on"
88+
)
89+
parser.add_argument(
90+
"-d",
91+
"--debug",
92+
default=FLASK_DEBUG,
93+
help="Whether to run in debug mode",
94+
action="store_true",
95+
)
96+
parser.add_argument(
97+
"-dfp",
98+
"--data_folder_path",
99+
type=str,
100+
default=DEFAULT_DATA_FOLDER_PATH,
101+
help="Path to the folder where data is stored",
102+
)
103+
parser.add_argument(
104+
"-ufp",
105+
"--upload_folder_path",
106+
type=str,
107+
default=DEFAULT_DATA_FOLDER_PATH,
108+
help="Path to the folder where uploads are stored",
109+
)
110+
parser.add_argument(
111+
"-origins",
112+
"--allowed_origins",
113+
default=ORIGINS,
114+
help="Origins that are allowed to connect to the server",
115+
)
116+
parser.add_argument(
117+
"-t",
118+
"--timeout",
119+
default=TIMEOUT,
120+
help="Number of minutes before the server times out",
121+
)
122+
args = parser.parse_args()
123+
124+
app.config.update(DATA_FOLDER_PATH=args.data_folder_path)
125+
app.config.update(UPLOAD_FOLDER=args.upload_folder_path)
126+
app.config.update(MINUTES_BEFORE_TIMEOUT=args.timeout)
127+
128+
flask_cors.CORS(app, origins=args.allowed_origins)
129+
130+
print(
131+
f"Host: {args.host}, Port: {args.port}, Debug: {args.debug}, "
132+
f"Data folder path: {args.data_folder_path}, Timeout: {args.timeout}, "
133+
f"Origins: {args.allowed_origins}",
134+
flush=True,
135+
)
136+
137+
db_path = get_db_path_from_config()
138+
print("db_path", db_path, flush=True)
139+
if db_path:
140+
db_dir = os.path.dirname(db_path)
141+
if db_dir and not os.path.exists(db_dir):
142+
os.makedirs(db_dir, exist_ok=True)
143+
init_database(db_path)
144+
print(f"Database initialized at: {db_path}")
145+
146+
app.run(debug=args.debug, host=args.host, port=args.port, ssl_context=SSL)
147+
148+
149+
# ''' Main '''
150+
if __name__ == "__main__":
151+
run_server()

tests/conftest.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,48 @@
11
# Standard library imports
22
import time
33
import shutil
4+
import os
5+
from pathlib import Path
6+
from typing import Generator
47

58
# Third party imports
6-
import os
79
import pytest
810

911
# Local application imports
10-
from app import app
12+
from src.opengeodeweb_back.app import app
13+
from src.opengeodeweb_back import app_config
1114
from opengeodeweb_microservice.database.connection import init_database
1215

1316
TEST_ID = "1"
1417

1518

1619
@pytest.fixture(scope="session", autouse=True)
17-
def copy_data():
20+
def configure_test_environment() -> Generator[None, None, None]:
21+
base_path = Path(__file__).parent
22+
test_data_path = base_path / "data"
23+
1824
shutil.rmtree("./data", ignore_errors=True)
19-
shutil.copytree("./tests/data/", f"./data/{TEST_ID}/", dirs_exist_ok=True)
25+
shutil.copytree(test_data_path, f"./data/{TEST_ID}/", dirs_exist_ok=True)
26+
2027
app.config["TESTING"] = True
2128
app.config["SERVER_NAME"] = "TEST"
2229
app.config["DATA_FOLDER_PATH"] = "./data/"
2330
app.config["UPLOAD_FOLDER"] = "./tests/data/"
24-
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
25-
db_path = os.path.join(BASE_DIR, "data", "project.db")
31+
32+
db_path = os.path.join(base_path, "data", "project.db")
2633
app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
2734

2835
print("Current working directory:", os.getcwd())
2936
print("Directory contents:", os.listdir("."))
3037

3138
init_database(db_path)
39+
os.environ["TEST_DB_PATH"] = str(db_path)
40+
41+
yield
42+
tmp_data_path = app.config.get("DATA_FOLDER_PATH")
43+
if tmp_data_path and os.path.exists(tmp_data_path):
44+
shutil.rmtree(tmp_data_path, ignore_errors=True)
45+
print(f"Cleaned up test data folder: {tmp_data_path}", flush=True)
3246

3347

3448
@pytest.fixture

0 commit comments

Comments
 (0)