-
Notifications
You must be signed in to change notification settings - Fork 6
Athena: Support Apollon v4 model
#329
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
WalkthroughAdds a SchemaConverter that centralizes normalization of Apollon schemas (v2/v3/v4) into v3 and updates the transformer to use it; switches the playground Apollon dependency and client-side dynamic imports/CSS; adds an example exercise JSON; updates two Dockerfiles (one adds a redundant poetry install, the other bumps protobuf-dev); and adjusts playground viewer/submission components and props handling. Changes
Sequence DiagramsequenceDiagram
participant Client
participant Transformer as apollon_json_transformer
participant Converter as SchemaConverter
participant Parser as Apollon (importDiagram / editor)
Client->>Transformer: transform_json(model_dict)
Transformer->>Converter: normalize_to_v3(model_dict)
alt input is v3
Converter-->>Transformer: v3 schema
else input is v2
Converter-->>Transformer: convert_v2_to_v3 -> v3 schema
else input is v4
Converter-->>Transformer: convert_v4_to_v3 -> v3 schema
end
Transformer->>Parser: importDiagram(v3 schema) / create editor model
Parser-->>Transformer: parsed/editor model
Transformer-->>Client: transformed/parsed result
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🔇 Additional comments (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
Athena: Support Apollon v4 model
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
athena/modules/modeling/module_modeling_llm/Dockerfile(1 hunks)athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/apollon_json_transformer.py(3 hunks)athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/apollon_json_transformer.py (1)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py (2)
SchemaConverter(9-187)normalize_to_v3(171-187)
🪛 Ruff (0.14.3)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py
95-95: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
113-113: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
| if "attributes" in node_data and node_data["attributes"]: | ||
| attribute_ids: list[str] = [] | ||
| for attr in node_data["attributes"]: | ||
| attr_id = attr.get("id", f"{element_id}_attr_{len(attribute_ids)}") | ||
| attribute_ids.append(attr_id) | ||
|
|
||
| # Create separate attribute element | ||
| v3_data["elements"][attr_id] = { | ||
| "id": attr_id, | ||
| "name": attr.get("name", ""), | ||
| "type": "ClassAttribute", | ||
| "owner": element_id, | ||
| "bounds": {"x": 0, "y": 0, "width": 0, "height": 0} | ||
| } | ||
|
|
||
| element["attributes"] = attribute_ids | ||
|
|
||
| # Handle methods (convert from embedded objects to ID references) | ||
| if "methods" in node_data and node_data["methods"]: | ||
| method_ids: list[str] = [] | ||
| for method in node_data["methods"]: | ||
| method_id = method.get("id", f"{element_id}_method_{len(method_ids)}") | ||
| method_ids.append(method_id) | ||
|
|
||
| # Create separate method element | ||
| v3_data["elements"][method_id] = { | ||
| "id": method_id, | ||
| "name": method.get("name", ""), | ||
| "type": "ClassMethod", | ||
| "owner": element_id, | ||
| "bounds": {"x": 0, "y": 0, "width": 0, "height": 0} | ||
| } | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Preserve attribute/method metadata during v4 → v3 conversion
Line 102 and Line 120 currently create placeholder ClassAttribute/ClassMethod elements that keep nothing but the name. Apollon v4 attribute/method objects include metadata such as visibility, type, static, parameters, and returnType, and UMLParser depends on those fields to render correct notation. Dropping everything but the name means diagrams like + foo(): String collapse to plain foo, so feedback produced from v4 payloads will be wrong. Please merge the original attribute/method dictionaries into the converted elements instead of discarding their contents.
@@
- v3_data["elements"][attr_id] = {
- "id": attr_id,
- "name": attr.get("name", ""),
- "type": "ClassAttribute",
- "owner": element_id,
- "bounds": {"x": 0, "y": 0, "width": 0, "height": 0}
- }
+ attr_element = attr.copy()
+ attribute_type = attr_element.pop("type", None)
+ attr_element.update({
+ "id": attr_id,
+ "type": "ClassAttribute",
+ "owner": element_id,
+ "bounds": attr_element.get(
+ "bounds", {"x": 0, "y": 0, "width": 0, "height": 0}
+ ),
+ })
+ if attribute_type is not None:
+ attr_element["attributeType"] = attribute_type
+ v3_data["elements"][attr_id] = attr_element
@@
- v3_data["elements"][method_id] = {
- "id": method_id,
- "name": method.get("name", ""),
- "type": "ClassMethod",
- "owner": element_id,
- "bounds": {"x": 0, "y": 0, "width": 0, "height": 0}
- }
+ method_element = method.copy()
+ method_kind = method_element.pop("type", None)
+ method_element.update({
+ "id": method_id,
+ "type": "ClassMethod",
+ "owner": element_id,
+ "bounds": method_element.get(
+ "bounds", {"x": 0, "y": 0, "width": 0, "height": 0}
+ ),
+ })
+ if method_kind is not None:
+ method_element["methodKind"] = method_kind
+ v3_data["elements"][method_id] = method_element🧰 Tools
🪛 Ruff (0.14.3)
95-95: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
113-113: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
🤖 Prompt for AI Agents
In
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py
around lines 95 to 127, the converter currently creates placeholder
ClassAttribute/ClassMethod elements containing only id, name, type, owner and
bounds, dropping all original attribute/method metadata; update the conversion
to merge the original attribute/method dict into the new element so fields like
visibility, type, static, parameters and returnType are preserved (while still
ensuring id, name, type, owner and bounds are set/overridden as needed), i.e.
construct the v3 element by taking the original dict and then enforcing/adding
the required keys (id, type -> ClassAttribute/ClassMethod, owner, bounds) before
assigning into v3_data["elements"] and keep
element["attributes"]/element["methods"] as the ID lists.
FelixTJDietrich
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code looks good and also was tested with Artemis via test server
| # Project files | ||
| COPY . ./ | ||
|
|
||
| RUN poetry install --no-interaction --no-ansi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if this is necessary but it fixed a build issue
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
|
There hasn't been any activity on this pull request recently. Therefore, this pull request has been automatically marked as stale and will be closed if no further activity occurs within seven days. Thank you for your contributions. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py (1)
132-165: Attribute and method metadata is still being lost during v4 → v3 conversion.Lines 139-145 and 157-163 create placeholder
ClassAttributeandClassMethodelements that preserve onlyid,name,type,owner, andbounds, discarding all other metadata from the v4 attributes and methods. This includes critical fields likevisibility,type,static,parameters, andreturnTypethatUMLParserdepends on for correct diagram rendering.As noted in the previous review, this causes diagrams like
+ foo(): Stringto collapse to plainfoo, producing incorrect feedback for v4 models.The previous review provided a detailed fix—please merge the original attribute/method dictionaries into the converted elements instead of creating minimal placeholders.
🧹 Nitpick comments (3)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py (1)
132-132: Optional: Simplify key checks withdict.get.The conditions
if "attributes" in node_data and node_data["attributes"]:(line 132) andif "methods" in node_data and node_data["methods"]:(line 150) can be simplified toif node_data.get("attributes"):andif node_data.get("methods"):respectively for more concise code.Apply this diff:
- if "attributes" in node_data and node_data["attributes"]: + if node_data.get("attributes"): attribute_ids: list[str] = []- if "methods" in node_data and node_data["methods"]: + if node_data.get("methods"): method_ids: list[str] = []Also applies to: 150-150
athena/playground/src/components/details/exercise_detail/modeling.tsx (1)
24-38: Dynamic Apollon setup works; consider a few small robustness tweaks.The dynamic import and editor init pattern looks fine, and the separate
editor?.destroy()effect gives you a clean tear‑down. Two optional improvements you might consider:
- Skip the import/editor init entirely when there is no
exercise.example_solution, instead of relying onJSON.parse(exercise.example_solution || "{}"), to avoid unnecessary work and potential library‑side errors on{}.- Add a simple guard/cancellation flag so that if the component unmounts before the import resolves, you don’t end up calling
setEditoron an unmounted component, and optionally handle a rejected import (e.g., log or show a fallback).These are non‑blocking but would make the integration a bit more resilient.
athena/playground/src/components/details/submission_detail/modeling.tsx (1)
27-29: ReuseunreferencedFeedbacksfor rendering to avoid redundant classification.You already compute
unreferencedFeedbacks(lines 27–29) and then re‑derive the same subset by callinggetFeedbackReferenceTypeagain inside thefeedbacks?.map. Functionally this is fine, but you can simplify and avoid duplicate work by mapping overunreferencedFeedbacksdirectly:-const unreferencedFeedbacks = feedbacks?.filter( - (feedback) => getFeedbackReferenceType(feedback) === "unreferenced" -); +const unreferencedFeedbacks = + feedbacks?.filter( + (feedback) => getFeedbackReferenceType(feedback) === "unreferenced", + ) ?? []; ... - {((unreferencedFeedbacks && unreferencedFeedbacks.length > 0) || - onFeedbacksChange) && ( + {((unreferencedFeedbacks.length > 0) || onFeedbacksChange) && ( <div className="space-y-2 mt-5"> <h3 className="ml-2 text-lg font-medium">Unreferenced Feedback</h3> - {feedbacks?.map( - (feedback) => - getFeedbackReferenceType(feedback) === "unreferenced" && ( + {unreferencedFeedbacks.map((feedback) => ( <InlineFeedback key={feedback.id} feedback={feedback} manualRating={manualRatings?.find( (manualRating) => manualRating.feedbackId === feedback.id )}This keeps the render logic clearer and avoids repeatedly calling
getFeedbackReferenceTypefor the same array.Also applies to: 57-80
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
athena/playground/package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (7)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/apollon_json_transformer.py(2 hunks)athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py(1 hunks)athena/playground/data/example/exercise-7.json(1 hunks)athena/playground/package.json(1 hunks)athena/playground/src/components/details/exercise_detail/modeling.tsx(1 hunks)athena/playground/src/components/details/submission_detail/modeling.tsx(2 hunks)athena/playground/src/pages/_app.tsx(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- athena/playground/src/pages/_app.tsx
🧰 Additional context used
🧬 Code graph analysis (3)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/apollon_json_transformer.py (1)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py (2)
SchemaConverter(9-228)normalize_to_v3(208-228)
athena/playground/src/components/details/submission_detail/modeling.tsx (2)
athena/playground/src/model/feedback.ts (3)
getFeedbackReferenceType(144-171)createFeedbackItemUpdater(184-201)createNewFeedback(209-221)athena/playground/src/model/manual_rating.ts (1)
createManualRatingItemUpdater(17-41)
athena/playground/src/components/details/exercise_detail/modeling.tsx (1)
athena/playground/scripts/artemis/4_link_programming_repositories.mjs (1)
exercise(15-15)
🪛 Ruff (0.14.7)
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py
132-132: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
150-150: Unnecessary key check before dictionary access
Replace with dict.get
(RUF019)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
- GitHub Check: build_image (athena/modules/programming/module_programming_llm)
- GitHub Check: build_image (athena/playground)
- GitHub Check: build_image (athena/modules/programming/module_programming_winnowing)
- GitHub Check: build_image (athena/modules/text/module_text_cofee)
- GitHub Check: build_image (athena/log_viewer)
- GitHub Check: build_image (athena/modules/text/module_text_llm)
- GitHub Check: build_image (athena/modules/programming/module_programming_themisml)
- GitHub Check: build_image (athena/modules/programming/module_example)
- GitHub Check: build_image (athena/assessment_module_manager)
- GitHub Check: build_image (athena/modules/modeling/module_modeling_llm)
- GitHub Check: build_image (athena/modules/programming/module_programming_apted)
- GitHub Check: prospector
- GitHub Check: test
🔇 Additional comments (5)
athena/playground/data/example/exercise-7.json (3)
1-12: Comprehensive test coverage and well-structured exercise metadata.The exercise is thoughtfully designed with clear grading instructions, a realistic problem statement, and a well-formed example solution. The metadata aligns with the Apollon v4 modeling workflow.
12-103: High-quality test scenarios covering common BPMN modeling defects.The six submissions cover a representative range of modeling errors:
- Correct solution (submission 1)
- Missing critical elements: start event, end event (submissions 2–3)
- Missing tasks: two out of three required tasks (submissions 4–5)
- Sequence error with all elements present (submission 6)
Feedback descriptions are specific, actionable, and tied to precise credit adjustments. This provides strong grounding for LLM-based grading and schema validation during the modeling assessment workflow.
10-10: The model structure differences between example_solution and submissions are intentional, not inconsistent. The example_solution includes metadata fields (idandtitle) because it represents a complete model reference, while all submission models (submissions 1–6) intentionally omit these fields, which is the correct pattern for student submissions. This structure aligns with typical grading systems where example solutions and student submissions have different schemas. No changes are needed.Likely an incorrect or invalid review comment.
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/apollon_json_transformer.py (1)
4-4: LGTM! Conversion logic successfully centralized.The refactor addresses the previous review feedback by moving all schema conversion logic into the
SchemaConverterclass. The import, updated docstring, and usage ofSchemaConverter.normalize_to_v3are all correct and improve maintainability.Also applies to: 14-14, 23-24
athena/playground/package.json (1)
25-27: Confirm @tumaet/[email protected] peer dependency compatibility before merging.The dependency addition is consistent with the codebase (React 18.3.1, Next 14.2.33 in use). Verify that @tumaet/[email protected] declares compatible peer dependencies for your React and Next versions—check the package's peer dependency requirements in its npm entry or documentation.
| @staticmethod | ||
| def is_v3_schema(data: dict) -> bool: | ||
| """ | ||
| Check if the data is in v3.0.0 schema format. | ||
| :param data: The schema data to check | ||
| :return: True if v3 schema, False otherwise | ||
| """ | ||
| return "model" in data |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fragile v3 detection logic.
The is_v3_schema method only checks for the presence of a "model" key, which is fragile:
- It doesn't verify the actual v3 structure or version field
- It could false-positive if v2 or v4 schemas happen to contain a
"model"key - Line 221 in
normalize_to_v3blindly accessesdata["model"]without checking if the key exists, risking aKeyError
Consider strengthening the check:
@staticmethod
def is_v3_schema(data: dict) -> bool:
"""
Check if the data is in v3.0.0 schema format.
:param data: The schema data to check
:return: True if v3 schema, False otherwise
"""
- return "model" in data
+ # v3 schema wraps the model in a "model" key with version 3.0.0
+ if "model" not in data:
+ return False
+ model = data.get("model", {})
+ return isinstance(model, dict) and model.get("version") == "3.0.0"And add error handling in normalize_to_v3:
# If it's already v3 with nested model, extract it
if SchemaConverter.is_v3_schema(data):
- return data["model"]
+ return data.get("model", data)🤖 Prompt for AI Agents
In
athena/modules/modeling/module_modeling_llm/module_modeling_llm/apollon_transformer/schema_converter.py
around lines 22 to 30, the is_v3_schema function is too fragile because it only
checks for a "model" key; update it to verify the schema version or required v3
structure (e.g., check for a top-level "version" equal to "3.0.0" or validate
presence/types of multiple v3-specific keys) and avoid relying on a single key,
and in normalize_to_v3 add guarded access to data["model"] (use .get or explicit
key-check), validate the retrieved value before using it, and raise or return a
clear, descriptive error when the expected v3 structure is missing instead of
letting a KeyError propagate.
| const editorRef = useRef<HTMLDivElement>(null); | ||
|
|
||
| const [editor, setEditor] = useState<any>(); | ||
|
|
||
| // Initialize Apollon editor once | ||
| useEffect(() => { | ||
| const { ApollonEditor } = require("@ls1intum/apollon"); | ||
|
|
||
| if (!editorRef.current) return; | ||
|
|
||
| const modelObject = JSON.parse(submission.model); | ||
|
|
||
| const newEditor = new ApollonEditor(editorRef.current, { | ||
| model: modelObject, | ||
| readonly: true, | ||
| mode: "Assessment", | ||
| scale: 0.8, | ||
| }); | ||
|
|
||
| setEditor(newEditor); | ||
| if (!editorRef?.current) { | ||
| return; | ||
| } | ||
|
|
||
| }, [submission]); | ||
|
|
||
| // Update assessments when feedbacks change | ||
| useEffect(() => { | ||
| if (!editor) return; | ||
|
|
||
| const { addOrUpdateAssessment } = require("@ls1intum/apollon"); | ||
| const modelObject = JSON.parse(submission.model); | ||
|
|
||
| const referencedFeedbacks = feedbacks.filter( | ||
| (f) => getFeedbackReferenceType(f) === "referenced" | ||
| ); | ||
|
|
||
| referencedFeedbacks.forEach((feedback) => { | ||
| const modelingFeedback = feedback as ModelingFeedback; | ||
| const [referenceType, referenceId] = | ||
| modelingFeedback.reference?.split(":") ?? []; | ||
|
|
||
| addOrUpdateAssessment(modelObject, { | ||
| modelElementId: referenceId, | ||
| elementType: referenceType as UMLElementType | UMLRelationshipType, | ||
| score: modelingFeedback.credits, | ||
| feedback: modelingFeedback.description, | ||
| // Dynamically import both ApollonEditor and importDiagram to avoid SSR issues | ||
| import('@tumaet/apollon').then(({ ApollonEditor, importDiagram }) => { | ||
| setEditor(new ApollonEditor(editorRef.current!, { | ||
| model: importDiagram(JSON.parse(submission.model)), | ||
| readonly: true, | ||
| scale: 0.8 | ||
| })); | ||
| }); | ||
| }); | ||
|
|
||
| (async () => { | ||
| const renderDone = editor.nextRender; | ||
| editor.model = modelObject; | ||
| await renderDone; | ||
| })(); | ||
| }, [feedbacks, submission, editor]); | ||
|
|
||
| // Filter unreferenced feedbacks once | ||
| const unreferencedFeedbacks = feedbacks.filter( | ||
| (f) => getFeedbackReferenceType(f) === "unreferenced" | ||
| ); | ||
| }, [editorRef, submission]); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
find . -type f -name "modeling.tsx" | head -20Repository: ls1intum/edutelligence
Length of output: 211
🏁 Script executed:
wc -l ./athena/playground/src/components/details/submission_detail/modeling.tsx ./athena/playground/src/components/details/exercise_detail/modeling.tsxRepository: ls1intum/edutelligence
Length of output: 232
🏁 Script executed:
cat -n ./athena/playground/src/components/details/submission_detail/modeling.tsxRepository: ls1intum/edutelligence
Length of output: 4086
🏁 Script executed:
cat -n ./athena/playground/src/components/details/exercise_detail/modeling.tsxRepository: ls1intum/edutelligence
Length of output: 2023
Add cleanup for the Apollon editor instance to prevent resource leaks.
The editor instance in state is never destroyed when the component unmounts or submission changes. In exercise_detail/modeling.tsx (lines 18–22), a separate useEffect explicitly calls editor?.destroy() on cleanup; without this here, old editor instances and their listeners leak into memory.
Add a cleanup effect mirroring the exercise detail pattern:
const [editor, setEditor] = useState<any>();
useEffect(() => {
if (!editorRef?.current) {
return;
}
import('@tumaet/apollon').then(({ ApollonEditor, importDiagram }) => {
setEditor(new ApollonEditor(editorRef.current!, {
model: importDiagram(JSON.parse(submission.model)),
readonly: true,
scale: 0.8
}));
});
}, [editorRef, submission]);
+ useEffect(() => {
+ return () => {
+ editor?.destroy();
+ };
+ }, [editor]);Optional improvements:
- Wrap
JSON.parse(submission.model)in try/catch to handle malformed models gracefully. - Add a cancellation flag inside the import effect so
setEditoris skipped if the component unmounts before the promise resolves.
🤖 Prompt for AI Agents
In athena/playground/src/components/details/submission_detail/modeling.tsx
around lines 31 to 50, the Apollon editor created in the useEffect is never
cleaned up and can leak resources; update the effect to create a mounted/cancel
flag, wrap JSON.parse(submission.model) in try/catch to handle malformed models,
and after the dynamic import skip setEditor if unmounted; return a cleanup
function that calls editor?.destroy() (or the instance's destroy method) and
clears the mounted flag so old editor instances and listeners are properly torn
down when submission changes or the component unmounts.
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
FelixTJDietrich
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code looks good
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
|
Athena Test Results Summary
Failing Tests Summary
|
||||||||||||||
📊 Detailed Coverage TableCombining 3 coverage files... 📊 Combined Coverage Summary:
Total packages: 31 Note: Coverage thresholds: ✅ (≥70%), ❌ (<70%) |
Athena:
Support Apollon v3 and v4 model for modeling assessment
Summary by CodeRabbit
New Features
Improvements
Chores
✏️ Tip: You can customize this high-level summary in your review settings.