diff --git a/backend/app/routes/regex_routes.py b/backend/app/routes/regex_routes.py
index 1e7e3bb..ad08e75 100644
--- a/backend/app/routes/regex_routes.py
+++ b/backend/app/routes/regex_routes.py
@@ -14,15 +14,37 @@ def regex101_proxy():
logging.debug(f"Received data from frontend: {request.json}")
# Validate the request data before sending
- required_fields = ['regex', 'flags', 'delimiter', 'flavor']
+ required_fields = ['regex', 'delimiter', 'flavor']
for field in required_fields:
if field not in request.json:
logging.error(f"Missing required field: {field}")
return jsonify({"error": f"Missing required field: {field}"}), 400
- # Ensure testString is present
- if 'testString' not in request.json or not request.json['testString']:
- request.json['testString'] = "Sample test string" # Add a default test string
+ # Set default flags to 'gmi' for global, multiline, and case-insensitive matching
+ request.json['flags'] = 'gmi'
+
+ # Include a separate test string if not provided
+ if 'testString' not in request.json:
+ request.json['testString'] = "Sample test string"
+
+ # Always include unit tests with every request
+ request.json['unitTests'] = [
+ {
+ "description": "Sample DOES_MATCH test",
+ "testString": request.json['testString'], # Use the main test string
+ "criteria": "DOES_MATCH",
+ "target": "REGEX"
+ },
+ {
+ "description": "Sample DOES_NOT_MATCH test",
+ "testString": "Non-matching string", # This should not match the regex
+ "criteria": "DOES_NOT_MATCH",
+ "target": "REGEX"
+ }
+ ]
+
+ # Log the complete payload before sending
+ logging.debug(f"Final payload being sent to Regex101 API: {json.dumps(request.json, indent=2)}")
# Construct the data payload for curl
data = json.dumps(request.json)
@@ -45,6 +67,8 @@ def regex101_proxy():
logging.error(f"An unexpected error occurred: {str(e)}")
return jsonify({"error": "An unexpected error occurred"}), 500
+
+
@bp.route('', methods=['GET', 'POST'])
def handle_items():
if request.method == 'POST':
diff --git a/backend/regex_patterns/3_d-z0n3.yml b/backend/regex_patterns/3_d-z0n3.yml
index d8a16f5..c57ddef 100644
--- a/backend/regex_patterns/3_d-z0n3.yml
+++ b/backend/regex_patterns/3_d-z0n3.yml
@@ -5,6 +5,6 @@ tags:
- Release Group
- HDB Internal
pattern: (?<=^|[\s.-])D-Z0N3\b
-regex101Link: ''
+regex101Link: https://regex101.com/r/OWv3R9
date_created: '2024-08-15T15:37:02.733456'
-date_modified: '2024-08-15T15:38:23.541760'
+date_modified: '2024-08-15T16:24:11.809191'
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 718f176..5644bae 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -27,6 +27,7 @@ function App() {
{activeTab === 'regex' ? : }
+
);
}
diff --git a/frontend/src/components/regex/RegexModal.jsx b/frontend/src/components/regex/RegexModal.jsx
index 9962f95..626d4cb 100644
--- a/frontend/src/components/regex/RegexModal.jsx
+++ b/frontend/src/components/regex/RegexModal.jsx
@@ -11,6 +11,7 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) {
const [newTag, setNewTag] = useState('');
const [regex101Link, setRegex101Link] = useState('');
const [error, setError] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
const initialRegexRef = useRef(regex);
useEffect(() => {
@@ -31,41 +32,72 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) {
}
setError('');
setNewTag('');
+ setIsLoading(false);
}
}, [regex, isOpen]);
const handleCreateRegex101Link = async () => {
+ if (!pattern.trim()) {
+ setError('Please provide a regex pattern before creating tests.');
+ return;
+ }
+
+ // Define your unit tests here
+ const unitTests = [
+ {
+ description: "Test if 'D-Z0N3' is detected correctly",
+ testString: "Test D-Z0N3 pattern",
+ criteria: "DOES_MATCH",
+ target: "REGEX"
+ },
+ {
+ description: "Test if 'random text' does not match",
+ testString: "random text",
+ criteria: "DOES_NOT_MATCH",
+ target: "REGEX"
+ }
+ // Add more unit tests as needed
+ ];
+
+ setIsLoading(true);
try {
- const response = await createRegex101Link({
- regex: pattern,
- flavor: 'pcre',
- flags: 'gm',
- delimiter: '/',
- });
- const permalinkFragment = response.permalinkFragment;
+ const response = await createRegex101Link({
+ regex: pattern,
+ flavor: 'pcre',
+ flags: 'gmi',
+ delimiter: '/',
+ unitTests: unitTests
+ });
+ const permalinkFragment = response.permalinkFragment;
- const regex101Link = `https://regex101.com/r/${permalinkFragment}`;
- setRegex101Link(regex101Link);
+ const regex101Link = `https://regex101.com/r/${permalinkFragment}`;
+ setRegex101Link(regex101Link);
- await saveRegex({
- id: regex ? regex.id : 0,
- name,
- pattern,
- description,
- tags,
- regex101Link,
- });
+ await saveRegex({
+ id: regex ? regex.id : 0,
+ name,
+ pattern,
+ description,
+ tags,
+ regex101Link,
+ });
- window.open(regex101Link, '_blank');
- onSave(); // Refresh the list after saving
- setError('');
+ window.open(regex101Link, '_blank');
+ onSave(); // Refresh the list after saving
+ setError('');
} catch (error) {
- console.error('Error creating regex101 link:', error);
- setError('Failed to create regex101 link. Please try again.');
+ console.error('Error creating regex101 link:', error);
+ setError('Failed to create regex101 link. Please try again.');
+ } finally {
+ setIsLoading(false);
}
};
const handleRemoveRegex101Link = async () => {
+ const confirmRemoval = window.confirm("Are you sure you want to remove this Regex101 link?");
+ if (!confirmRemoval) return;
+
+ setIsLoading(true);
setRegex101Link(''); // Clear the regex101Link in state
try {
@@ -83,12 +115,14 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) {
} catch (error) {
console.error('Error removing regex101 link:', error);
setError('Failed to remove regex101 link. Please try again.');
+ } finally {
+ setIsLoading(false);
}
};
const handleSave = async () => {
- if (!name.trim() || !pattern.trim() || !description.trim()) {
- setError('Name, pattern, and description are all required.');
+ if (!name.trim() || !pattern.trim()) {
+ setError('Name and pattern are required.');
return;
}
try {
@@ -109,15 +143,16 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) {
};
const handleDelete = async () => {
- if (regex && regex.id) {
- try {
- await deleteRegex(regex.id);
- onSave();
- onClose();
- } catch (error) {
- console.error('Error deleting regex:', error);
- setError('Failed to delete regex. Please try again.');
- }
+ const confirmDeletion = window.confirm("Are you sure you want to delete this regex?");
+ if (!confirmDeletion) return;
+
+ try {
+ await deleteRegex(regex.id);
+ onSave();
+ onClose();
+ } catch (error) {
+ console.error('Error deleting regex:', error);
+ setError('Failed to delete regex. Please try again.');
}
};
@@ -165,7 +200,7 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) {
{regex101Link ? (
<>
-
-
- Open in Regex101
-
-
-
+
+
+
+
+
+
>
) : (
)}