Skip to content

Commit 04538b4

Browse files
committed
fix: Fix merge conflicts with develop branch
2 parents 0caf7bd + 4cffd09 commit 04538b4

18 files changed

Lines changed: 169 additions & 129 deletions

File tree

app/modules/auth/tests/test_unit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def test_confirm_user_active_user(test_client):
221221

222222
url = url_for("confirmemail.confirm_user", token=token, _external=False)
223223
response = test_client.get(url, follow_redirects=True)
224-
assert response.request.path == url_for("auth.show_signup_form", _external=False)
224+
assert response.request.path == url_for("public.index", _external=False)
225225

226226
user = UserRepository().get_by_email(user.email)
227227
assert user.active is True

app/modules/confirmemail/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from app import db
2+
3+
4+
class Confirmemail():
5+
id = db.Column(db.Integer, primary_key=True)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from app.modules.confirmemail.models import Confirmemail
2+
from core.repositories.BaseRepository import BaseRepository
3+
4+
5+
class ConfirmemailRepository(BaseRepository):
6+
def __init__(self):
7+
super().__init__(Confirmemail)

app/modules/confirmemail/services.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dotenv import load_dotenv
66

77
from app import mail_service
8+
from app.modules.confirmemail.repositories import ConfirmemailRepository
89
from core.services.BaseService import BaseService
910

1011

@@ -16,6 +17,8 @@
1617

1718
class ConfirmemailService(BaseService):
1819
def __init__(self):
20+
super().__init__(ConfirmemailRepository())
21+
self.repository = ConfirmemailRepository()
1922
self.CONFIRM_EMAIL_SALT = os.getenv('CONFIRM_EMAIL_SALT', 'sample_salt')
2023
self.CONFIRM_EMAIL_TOKEN_MAX_AGE = os.getenv('CONFIRM_EMAIL_TOKEN_MAX_AGE', 3600)
2124

app/modules/dataset/routes.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import json
55
import shutil
6+
import tempfile
67

78
from flask import (
89
abort,
@@ -221,15 +222,24 @@ def download_dataset(dataset_id):
221222

222223
@dataset_bp.route("/dataset/download/all", methods=["GET"])
223224
def download_all_dataset():
224-
zip_path = dataset_service.zip_all_datasets()
225+
# Crear un directorio temporal
226+
temp_dir = tempfile.mkdtemp()
227+
zip_path = os.path.join(temp_dir, "all_datasets.zip")
225228

226-
# Obtener la fecha actual en el formato deseado (por ejemplo, YYYYMMDD)
227-
current_date = datetime.now().strftime("%Y_%m_%d")
228-
229-
# Crear el nombre del archivo con la fecha
230-
zip_filename = f"uvlhub_bulk_{current_date}.zip"
231-
232-
return send_file(zip_path, as_attachment=True, download_name=zip_filename)
229+
try:
230+
# Generar el archivo ZIP
231+
dataset_service.zip_all_datasets(zip_path)
232+
233+
# Crear el nombre del archivo con la fecha
234+
current_date = datetime.now().strftime("%Y_%m_%d")
235+
zip_filename = f"uvlhub_bulk_{current_date}.zip"
236+
237+
# Enviar el archivo como respuesta
238+
return send_file(zip_path, as_attachment=True, download_name=zip_filename)
239+
finally:
240+
# Asegurar que la carpeta temporal se elimine después de que Flask sirva el archivo
241+
if os.path.exists(temp_dir):
242+
shutil.rmtree(temp_dir)
233243

234244

235245
@dataset_bp.route("/doi/<path:doi>/", methods=["GET"])

app/modules/dataset/services.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,7 @@ def zip_dataset(self, dataset: DataSet) -> str:
326326

327327
return temp_dir
328328

329-
def zip_all_datasets(self) -> str:
330-
temp_dir = tempfile.mkdtemp()
331-
zip_path = os.path.join(temp_dir, "all_datasets.zip")
332-
329+
def zip_all_datasets(self, zip_path: str):
333330
with ZipFile(zip_path, "w") as zipf:
334331
for user_dir in os.listdir("uploads"):
335332
user_path = os.path.join("uploads", user_dir)
@@ -351,7 +348,6 @@ def zip_all_datasets(self) -> str:
351348
full_path,
352349
arcname=os.path.join(dataset_dir, relative_path),
353350
)
354-
return zip_path
355351

356352

357353
class AuthorService(BaseService):

app/modules/flamapy/routes.py

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2,77 +2,12 @@
22
from app.modules.hubfile.services import HubfileService
33
from flask import send_file, jsonify
44
from app.modules.flamapy import flamapy_bp
5-
from flamapy.interfaces.python.flamapy_feature_model import FLAMAFeatureModel
6-
from flamapy.core.exceptions import FlamaException
75
import os
86

9-
from antlr4 import CommonTokenStream, FileStream
10-
from uvl.UVLCustomLexer import UVLCustomLexer
11-
from uvl.UVLPythonParser import UVLPythonParser
12-
from antlr4.error.ErrorListener import ErrorListener
13-
147
logger = logging.getLogger(__name__)
158

169

17-
@flamapy_bp.route("/flamapy/check_uvl/<int:file_id>", methods=["GET"])
18-
def check_uvl(file_id):
19-
class CustomErrorListener(ErrorListener):
20-
def __init__(self):
21-
self.errors = []
22-
23-
def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
24-
if "\\t" in msg:
25-
warning_message = (
26-
f"The UVL has the following warning that prevents reading it: "
27-
f"Line {line}:{column} - {msg}"
28-
)
29-
print(warning_message)
30-
self.errors.append(warning_message)
31-
else:
32-
error_message = (
33-
f"The UVL has the following error that prevents reading it: "
34-
f"Line {line}:{column} - {msg}"
35-
)
36-
self.errors.append(error_message)
37-
38-
try:
39-
hubfile = HubfileService().get_by_id(file_id)
40-
input_stream = FileStream(hubfile.get_path())
41-
lexer = UVLCustomLexer(input_stream)
42-
43-
error_listener = CustomErrorListener()
44-
45-
lexer.removeErrorListeners()
46-
lexer.addErrorListener(error_listener)
47-
48-
stream = CommonTokenStream(lexer)
49-
parser = UVLPythonParser(stream)
50-
51-
parser.removeErrorListeners()
52-
parser.addErrorListener(error_listener)
53-
54-
# Optional: Commented out for now
55-
# tree = parser.featureModel()
56-
57-
if error_listener.errors:
58-
return jsonify({"errors": error_listener.errors}), 400
59-
60-
# After parsing, try transforming the model
61-
try:
62-
# Assuming some logic here like loading and validating the model
63-
# This part should contain your logic for using the Flamapy transformation
64-
FLAMAFeatureModel(hubfile.get_path()) # Example usage
65-
# You can optionally print or process the model here
66-
return jsonify({"message": "Valid Model"}), 200
67-
68-
except FlamaException as fe:
69-
return jsonify({"error": f"Model transformation failed: {str(fe)}"}), 400
70-
71-
except Exception as e:
72-
return jsonify({"error": str(e)}), 500
73-
74-
75-
@flamapy_bp.route("/flamapy/valid/<int:file_id>", methods=["GET"])
10+
@flamapy_bp.route('/flamapy/valid/<int:file_id>', methods=['GET'])
7611
def valid(file_id):
7712
return jsonify({"success": True, "file_id": file_id})
7813

@@ -104,7 +39,7 @@ def to_glencoe(file_id):
10439
return download_transformed_file(file_id, '.json', 'glencoe')
10540

10641

107-
@flamapy_bp.route("/flamapy/to_cnf/<int:file_id>", methods=["GET"])
42+
@flamapy_bp.route('/flamapy/to_cnf/<int:file_id>', methods=['GET'])
10843
def to_cnf(file_id):
10944
return download_transformed_file(file_id, '.cnf', 'dimacs')
11045

app/modules/flamapy/services.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
import logging
33
from app.modules.flamapy.repositories import FlamapyRepository
44
from core.services.BaseService import BaseService
5+
from flamapy.interfaces.python.flamapy_feature_model import FLAMAFeatureModel
6+
from flamapy.core.exceptions import FlamaException
7+
8+
from antlr4 import CommonTokenStream, FileStream
9+
from uvl.UVLCustomLexer import UVLCustomLexer
10+
from uvl.UVLPythonParser import UVLPythonParser
11+
from antlr4.error.ErrorListener import ErrorListener
512

613
from flamapy.metamodels.fm_metamodel.models import FeatureModel
714
from flamapy.metamodels.fm_metamodel.operations import FMMetrics
@@ -29,3 +36,52 @@ def get_metrics(self, fm_model: FeatureModel) -> list[dict[str, Any]]:
2936
def get_analysis_results(self, fm_model: FeatureModel) -> list[dict[str, Any]]:
3037
fm_results = BDDMetrics().execute(fm_model).get_result()
3138
return fm_results
39+
40+
def check_uvl(self, filepath: str):
41+
42+
class CustomErrorListener(ErrorListener):
43+
44+
def __init__(self):
45+
self.errors = []
46+
47+
def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
48+
if "\\t" in msg:
49+
warning_message = (
50+
f"The UVL has the following warning that prevents reading it: "
51+
f"Line {line}:{column} - {msg}"
52+
)
53+
self.errors.append(warning_message)
54+
else:
55+
error_message = (
56+
f"The UVL has the following error that prevents reading it: "
57+
f"Line {line}:{column} - {msg}"
58+
)
59+
self.errors.append(error_message)
60+
61+
try:
62+
input_stream = FileStream(filepath)
63+
lexer = UVLCustomLexer(input_stream)
64+
65+
error_listener = CustomErrorListener()
66+
67+
lexer.removeErrorListeners()
68+
lexer.addErrorListener(error_listener)
69+
70+
stream = CommonTokenStream(lexer)
71+
parser = UVLPythonParser(stream)
72+
73+
parser.removeErrorListeners()
74+
parser.addErrorListener(error_listener)
75+
76+
if error_listener.errors:
77+
return {"errors": error_listener.errors}, 400
78+
79+
try:
80+
FLAMAFeatureModel(filepath)
81+
return {"message": "Valid Model"}, 200
82+
83+
except FlamaException as fe:
84+
return {"error": f"Model transformation failed: {str(fe)}"}, 400
85+
86+
except Exception as e:
87+
return {"error": str(e)}, 500

app/modules/hubfile/assets/js/scripts.js

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,46 +33,55 @@ let dropzone = Dropzone.options.myDropzone = {
3333
let ext = file.name.split('.').pop();
3434
if (ext !== 'uvl') {
3535
this.removeFile(file);
36-
36+
3737
let alert = document.createElement('p');
3838
alert.textContent = 'Invalid file extension: ' + file.name;
3939
alerts.appendChild(alert);
4040
alerts.style.display = 'block';
41-
} else {
41+
} else {
4242
// Read the file as text to pass it to the UVL parser
4343
let reader = new FileReader();
4444
reader.onload = function(event) {
4545
const fileContent = event.target.result; // This contains the UVL file content
46-
46+
4747
// Now, use uvl-parser to parse the content
4848
try {
4949
const featureModel = new FeatureModel(fileContent);
5050
const tree = featureModel.getFeatureModel(); // This is your parsed UVL tree
51-
51+
5252
console.log("Parsed UVL Feature Model:", tree);
5353
valid = true;
54-
54+
55+
5556
// You can now manipulate `tree` or display it in the UI as needed
5657
} catch (error) {
57-
if (error instanceof TypeError) {
58-
console.error("Caught a TypeError:", error.message);
58+
// Verificar si el error es debido a `Error.captureStackTrace`
59+
if (error.message.includes("Error.captureStackTrace is not a function")) {
60+
console.warn("Error.captureStackTrace is not supported in this environment.");
61+
valid = false;
62+
let alert = document.createElement('p');
63+
alert.innerHTML = 'Syntax error in <b>' + file.name + '</b>';
64+
alerts.appendChild(alert);
65+
alerts.style.display = 'block';
5966
} else {
67+
// Si es un error de sintaxis en el UVL, mostrar mensaje personalizado
6068
valid = false;
6169
console.error("Error parsing UVL file:", error.message);
62-
invalid_uvl_message = error.message
70+
invalid_uvl_message = error.message;
71+
72+
// Muestra el mensaje de error de sintaxis en el UI
6373
let alert = document.createElement('p');
6474
alert.innerHTML = 'Syntax error in <b>' + file.name + '</b><br>&nbsp;>&nbsp;>&nbsp;>&nbsp;' + error.message;
6575
alerts.appendChild(alert);
6676
alerts.style.display = 'block';
6777
}
68-
6978
}
7079
};
7180
reader.readAsText(file); // Read the file as text
7281
}
73-
82+
7483
});
75-
84+
7685
this.on('error', function (file, response) {
7786
console.error("Error uploading file: ", response);
7887
let alert = document.createElement('p');
@@ -81,7 +90,6 @@ let dropzone = Dropzone.options.myDropzone = {
8190
alerts.style.display = 'block';
8291
});
8392

84-
8593
this.on('success', function (file, response) {
8694

8795
if(valid){

0 commit comments

Comments
 (0)