Skip to content
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

feat: Add metadata viewer as napari widget #1195

Merged
merged 5 commits into from
Sep 20, 2024
Merged

feat: Add metadata viewer as napari widget #1195

merged 5 commits into from
Sep 20, 2024

Conversation

Czaki
Copy link
Collaborator

@Czaki Czaki commented Sep 20, 2024

Summary by Sourcery

Add a new LayerMetadata widget to the napari viewer for displaying layer metadata, update the DictViewer class to use a set_data method, and include tests for the new widget.

New Features:

  • Introduce a new LayerMetadata widget for viewing metadata of layers in the napari viewer.

Enhancements:

  • Modify the DictViewer class to use a set_data method for initializing data.

Tests:

  • Add tests for the LayerMetadata widget to verify its initialization and functionality with and without layers.

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced the "View Layer Metadata" feature in the Napari interface, allowing users to view metadata associated with image layers.
    • Added a new LayerMetadata widget for selecting layers and displaying their metadata.
  • Bug Fixes

    • Enhanced metadata handling for image layers, ensuring relevant information is included in layer configurations.
  • Tests

    • Added a new test class for the LayerMetadata widget to ensure proper functionality during initialization and layer updates.

@Czaki Czaki added this to the 0.15.4 milestone Sep 20, 2024
Copy link
Contributor

sourcery-ai bot commented Sep 20, 2024

Reviewer's Guide by Sourcery

This pull request adds a new feature to display metadata for layers in napari as a widget. The implementation includes a new LayerMetadata class, updates to existing files to support this feature, and corresponding test cases.

File-Level Changes

Change Details Files
Implement LayerMetadata widget
  • Create LayerMetadata class with layer selection and metadata display
  • Use DictViewer to show metadata content
  • Implement update_metadata and reset_choices methods
package/PartSeg/plugins/napari_widgets/metadata_wiewer.py
Add tests for LayerMetadata widget
  • Test widget initialization
  • Test initialization with a layer containing metadata
  • Test adding a layer after widget initialization
package/tests/test_PartSeg/test_napari_widgets.py
Update napari.yaml configuration
  • Add LayerMetadata widget to contributions
  • Include Layer Metadata in display names
package/PartSeg/napari.yaml
Modify existing files to support metadata viewing
  • Update DictViewer to use set_data method in constructor
  • Add LayerMetadata to all in napari_widgets init.py
  • Include metadata when converting image to layers in loader.py
package/PartSeg/common_gui/dict_viewer.py
package/PartSeg/plugins/napari_widgets/__init__.py
package/PartSegCore/napari_plugins/loader.py

Tips
  • Trigger a new Sourcery review by commenting @sourcery-ai review on the pull request.
  • Continue your discussion with Sourcery by replying directly to review comments.
  • You can change your review settings at any time by accessing your dashboard:
    • Enable or disable the Sourcery-generated pull request summary or reviewer's guide;
    • Change the review language;
  • You can always contact us if you have any questions or feedback.

Copy link
Contributor

coderabbitai bot commented Sep 20, 2024

Walkthrough

The changes involve several enhancements to the PartSeg package, including the introduction of a new LayerMetadata widget for viewing layer metadata in Napari, modifications to the data handling within the dict_viewer.py file, and updates to the configuration files to support these new features. Additionally, new tests have been added to ensure the functionality of the LayerMetadata widget, validating its behavior during initialization and when layers are added.

Changes

Files Change Summary
package/PartSeg/common_gui/dict_viewer.py Modified the class initialization to use a new method set_data for handling the data parameter instead of direct assignment.
package/PartSeg/napari.yaml Added a new contribution for "View Layer Metadata" linked to the LayerMetadata widget and a corresponding command for displaying it.
package/PartSeg/plugins/napari_widgets/__init__.py Introduced a new import statement for the LayerMetadata widget, making it available for use in the module.
package/PartSeg/plugins/napari_widgets/metadata_viewer.py Created a new file defining the LayerMetadata class, which facilitates the display and interaction with metadata associated with image layers in a Napari viewer context.
package/PartSegCore/napari_plugins/loader.py Modified the _image_to_layers function to include image metadata in the layer's configuration.
package/tests/test_PartSeg/test_napari_widgets.py Added a new test class TestLayerMetadata with methods to validate the functionality of the LayerMetadata widget during initialization and when layers are added.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Napari
    participant LayerMetadata

    User->>Napari: Open viewer
    Napari->>LayerMetadata: Initialize LayerMetadata
    LayerMetadata->>LayerMetadata: Create layer selector
    LayerMetadata->>LayerMetadata: Populate metadata
    User->>LayerMetadata: Select image layer
    LayerMetadata->>LayerMetadata: Update displayed metadata
Loading

🐇 In the garden, hopping with glee,
New widgets and features, oh what a spree!
Metadata layers, all shiny and bright,
In Napari's embrace, they take flight.
With tests to ensure they work just right,
PartSeg's magic is a joyful sight! 🌼

Possibly related PRs

  • feat: Add preview of image metadata #1154: The changes in this PR involve modifications to the dict_viewer.py file, which is directly related to the main PR's changes in the same file, specifically regarding how data is managed and displayed.

Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 48f82c1 and 17cd104.

Files selected for processing (6)
  • package/PartSeg/common_gui/dict_viewer.py (1 hunks)
  • package/PartSeg/napari.yaml (2 hunks)
  • package/PartSeg/plugins/napari_widgets/init.py (2 hunks)
  • package/PartSeg/plugins/napari_widgets/metadata_viewer.py (1 hunks)
  • package/PartSegCore/napari_plugins/loader.py (1 hunks)
  • package/tests/test_PartSeg/test_napari_widgets.py (2 hunks)
Additional comments not posted (15)
package/PartSeg/plugins/napari_widgets/metadata_viewer.py (4)

9-29: LGTM!

The LayerMetadata class is well-structured and follows the expected pattern for a QWidget subclass. The UI components are properly initialized, and the necessary methods are implemented to handle user interactions and update the displayed metadata.


10-21: LGTM!

The __init__ method is well-implemented and follows the expected pattern for initializing a QWidget subclass. The necessary UI components are properly initialized, and the layout is set up correctly. The update_metadata method is called to initialize the displayed metadata, and the changed signal of the layer_selector is connected to the update_metadata method to ensure that the metadata is updated whenever the selected layer changes.


23-24: LGTM!

The reset_choices method is a simple wrapper that calls the reset_choices method of the layer_selector widget. This is likely done to provide a public method that can be called from outside the class to reset the choices in the layer_selector.


26-29: LGTM!

The update_metadata method is well-implemented and follows the expected logic for updating the displayed metadata based on the selected layer. The method first checks if a layer is selected by checking if the value attribute of the layer_selector is None. If no layer is selected, the method returns without doing anything, which is the correct behavior. If a layer is selected, the method calls the set_data method of the _dict_viewer with the metadata attribute of the selected layer, which updates the displayed metadata in the _dict_viewer to match the metadata of the selected layer.

package/PartSeg/plugins/napari_widgets/__init__.py (2)

15-15: LGTM!

The import statement for LayerMetadata is correctly added, following the package structure.


31-31: LGTM!

Adding LayerMetadata to __all__ is consistent with the import statement and makes it available as a public entity of the module.

package/PartSeg/common_gui/dict_viewer.py (2)

19-19: LGTM!

The change to call the set_data method instead of directly assigning the data parameter is a good refactoring that promotes encapsulation and improves the structure of the code.


Line range hint 21-27: LGTM!

The new set_data method is implemented correctly. It handles the case where the input data is None, clears the existing data in the tree widget, and fills it with the new data using the fill_tree method.

package/PartSegCore/napari_plugins/loader.py (1)

29-29: LGTM!

The addition of the "metadata": project_info.image.metadata key-value pair to the layer configuration dictionary is a valuable enhancement. It incorporates the metadata associated with the image into the layer definition, providing additional contextual information.

This change improves the functionality without altering the declarations of exported or public entities.

package/PartSeg/napari.yaml (2)

77-79: LGTM!

The new contribution for viewing layer metadata is correctly defined and enhances the functionality of the PartSeg package.


163-164: LGTM!

The new command for displaying the layer metadata feature is correctly defined and complements the new contribution.

package/tests/test_PartSeg/test_napari_widgets.py (4)

604-609: LGTM!

The test correctly verifies the initialization of the LayerMetadata widget when no layers are present. The assertion on the empty _data dictionary is appropriate.


611-622: LGTM!

The test correctly verifies the initialization of the LayerMetadata widget when an image layer with metadata is already present in the viewer. The assertions on layer_selector.value and the _data dictionary are appropriate.


624-636: LGTM!

The test correctly verifies the behavior of the LayerMetadata widget when a layer is added after the widget has been initialized. The assertions on the initial empty _data dictionary and the updated _data dictionary after adding the layer are appropriate.


638-640: LGTM!

The test correctly verifies that the string representations of the enum members contain a space character.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    -- I pushed a fix in commit <commit_id>, please review it.
    -- Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    -- @coderabbitai generate unit testing code for this file.
    -- @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    -- @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    -- @coderabbitai read src/utils.ts and generate unit testing code.
    -- @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    -- @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @Czaki - I've reviewed your changes - here's some feedback:

Overall Comments:

  • There's a typo in the filename 'metadata_wiewer.py'. It should be 'metadata_viewer.py'.
Here's what I looked at during the review
  • 🟡 General issues: 3 issues found
  • 🟢 Security: all looks good
  • 🟡 Testing: 3 issues found
  • 🟢 Complexity: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment to tell me if it was helpful.

@@ -0,0 +1,29 @@
import napari
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (typo): Fix typo in filename: 'metadata_wiewer.py' should be 'metadata_viewer.py'

Ensure consistency in naming across the project. This typo should be corrected in all references to this file, including import statements and documentation.

def reset_choices(self):
self.layer_selector.reset_choices()

def update_metadata(self):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Consider adding error handling and user feedback in update_metadata method

The method could benefit from handling cases where the selected layer has no metadata. Consider adding a check and displaying a message to the user if no metadata is available.

    def update_metadata(self):
        if self.layer_selector.value is None:
            return
        try:
            metadata = self.layer_selector.value.metadata
            if not metadata:
                raise ValueError("No metadata available")
            # Process metadata here
        except (AttributeError, ValueError) as e:
            # Handle the error (e.g., display a message to the user)
            print(f"Error updating metadata: {str(e)}")


self.setLayout(layout)
self.update_metadata()
self.layer_selector.changed.connect(self.update_metadata)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (performance): Evaluate performance impact of updating metadata on every layer change

For large metadata sets, updating on every layer change could potentially cause UI lag. Consider implementing a debounce mechanism or updating only when the metadata view is active.

from functools import debounce

# ... (in the __init__ method)
self.layer_selector.changed.connect(self.debounced_update_metadata)

@debounce(0.3)
def debounced_update_metadata(self):
    self.update_metadata()

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no debounce in funtols

Comment on lines +602 to +607
class TestLayerMetadata:
def test_init(self, make_napari_viewer, qtbot):
viewer = make_napari_viewer()
widget = LayerMetadata(viewer)
qtbot.addWidget(widget)
assert widget._dict_viewer._data == {}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Test case for empty metadata initialization

This test case checks the initialization of LayerMetadata with an empty viewer. Consider adding assertions to verify the initial state of other widget components, such as the layer_selector.

Suggested change
class TestLayerMetadata:
def test_init(self, make_napari_viewer, qtbot):
viewer = make_napari_viewer()
widget = LayerMetadata(viewer)
qtbot.addWidget(widget)
assert widget._dict_viewer._data == {}
class TestLayerMetadata:
def test_init(self, make_napari_viewer, qtbot):
viewer = make_napari_viewer()
widget = LayerMetadata(viewer)
qtbot.addWidget(widget)
assert widget._dict_viewer._data == {}
assert widget.layer_selector.count() == 0
assert widget.layer_selector.currentText() == ""
assert not widget.metadata_table.rowCount()

Comment on lines 609 to 618
def test_init_with_layer(self, make_napari_viewer, qtbot):
viewer = make_napari_viewer()
viewer.add_image(
np.ones((10, 10)),
contrast_limits=[0, 1],
metadata={"foo": "bar"},
)
widget = LayerMetadata(viewer)
qtbot.addWidget(widget)
assert widget._dict_viewer._data == {"foo": "bar"}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Test case for initialization with a layer

This test verifies the initialization of LayerMetadata with a viewer containing a layer with metadata. Consider adding assertions to check if the layer_selector is properly populated and if the correct layer is selected.

def test_init_with_layer(self, make_napari_viewer, qtbot):
    viewer = make_napari_viewer()
    layer = viewer.add_image(
        np.ones((10, 10)),
        contrast_limits=[0, 1],
        metadata={"foo": "bar"},
    )
    widget = LayerMetadata(viewer)
    qtbot.addWidget(widget)
    assert widget._dict_viewer._data == {"foo": "bar"}
    assert widget.layer_selector.count() == 1
    assert widget.layer_selector.currentText() == layer.name

)
widget = LayerMetadata(viewer)
qtbot.addWidget(widget)
assert widget._dict_viewer._data == {"foo": "bar"}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Test case for adding a layer after initialization

This test checks the behavior when a layer is added after the widget is initialized. Consider adding a test to verify the behavior when multiple layers are added or when layers are removed.

def test_multiple_layers(self, make_napari_viewer, qtbot):
    viewer = make_napari_viewer()
    widget = LayerMetadata(viewer)
    qtbot.addWidget(widget)
    viewer.add_image(np.ones((10, 10)), metadata={"foo": "bar"})
    viewer.add_image(np.zeros((5, 5)), metadata={"baz": "qux"})
    widget.reset_choices()
    assert "foo" in widget._dict_viewer._data
    assert "baz" in widget._dict_viewer._data

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Outside diff range and nitpick comments (2)
package/PartSeg/plugins/napari_widgets/metadata_wiewer.py (1)

26-29: Consider using a guard clause to simplify the update_metadata method.

The update_metadata method can be slightly refactored to use a guard clause, which can improve readability and reduce nesting.

Apply this diff to refactor the method:

 def update_metadata(self):
-    if self.layer_selector.value is None:
-        return
-    self._dict_viewer.set_data(self.layer_selector.value.metadata)
+    if self.layer_selector.value is not None:
+        self._dict_viewer.set_data(self.layer_selector.value.metadata)
package/tests/test_PartSeg/test_napari_widgets.py (1)

633-636: Please clarify the purpose of this test.

The test_enum function checks if the string representation of CompareType.lower_threshold and FlowType.dark_center enums contains a space character. It would be helpful to understand the significance of this check and why the presence of a space character is important. Consider adding comments to explain the reasoning behind this test.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a7ab81f and 83dfdf8.

Files selected for processing (6)
  • package/PartSeg/common_gui/dict_viewer.py (1 hunks)
  • package/PartSeg/napari.yaml (2 hunks)
  • package/PartSeg/plugins/napari_widgets/init.py (2 hunks)
  • package/PartSeg/plugins/napari_widgets/metadata_wiewer.py (1 hunks)
  • package/PartSegCore/napari_plugins/loader.py (1 hunks)
  • package/tests/test_PartSeg/test_napari_widgets.py (2 hunks)
Additional comments not posted (10)
package/PartSeg/plugins/napari_widgets/metadata_wiewer.py (1)

9-29: LGTM!

The LayerMetadata class is well-structured and follows good practices:

  • The class is properly initialized with a Napari viewer.
  • The UI is set up using a QVBoxLayout with a layer selector and a dictionary viewer.
  • The reset_choices method provides a way to reset the layer selector choices.
  • The update_metadata method updates the dictionary viewer with the metadata of the selected layer.
package/PartSeg/plugins/napari_widgets/__init__.py (2)

15-15: LGTM!

The new import statement for LayerMetadata is consistent with the existing imports and follows the correct syntax and naming conventions. The AI-generated summary confirms that this change is intentional and enhances the module's functionality by making the LayerMetadata widget available for use.


31-31: LGTM!

The addition of LayerMetadata to the __all__ list is consistent with the new import statement added earlier. The AI-generated summary confirms that this change is intentional and reflects the addition of the LayerMetadata widget to the list of exported entities.

package/PartSeg/common_gui/dict_viewer.py (1)

19-19: LGTM!

The change to use a dedicated method set_data for setting the input data is a good practice for encapsulation. It allows for better control over the data assignment logic and provides a centralized place for handling the input data, including the case when it is None.

The method also ensures that the widget state is consistent with the input data by clearing the tree and filling it with the new data.

Overall, this change enhances the structure of the code and does not introduce any apparent issues.

package/PartSegCore/napari_plugins/loader.py (1)

29-29: LGTM!

The change looks good. Adding the image metadata to the layer configuration can provide useful contextual information for further processing or display.

package/PartSeg/napari.yaml (2)

77-79: LGTM!

The new contribution entry for the "View Layer Metadata" feature is properly defined, and the python_name field correctly references the LayerMetadata widget in the PartSeg.plugins.napari_widgets module.


163-164: LGTM!

The new command entry in the widgets section for the "View Layer Metadata" feature is properly defined, and the command field correctly references the corresponding contribution entry with the id PartSeg.Metadata.

package/tests/test_PartSeg/test_napari_widgets.py (3)

603-608: LGTM!

The test_init method correctly tests the initialization of LayerMetadata widget when no layers are present in the viewer. The assertion verifies the expected behavior.


609-619: LGTM!

The test_init_with_layer method correctly tests the initialization of LayerMetadata widget when an image layer with metadata is present in the viewer. The assertion verifies that the widget's internal data dictionary reflects the layer's metadata.


620-632: LGTM!

The test_add_layer_post_init method correctly tests the behavior of LayerMetadata widget when a layer is added after the widget initialization. The assertions verify that the widget's internal data dictionary is initially empty and updates correctly to reflect the metadata of the newly added image layer after calling widget.reset_choices().

Copy link

sonarcloud bot commented Sep 20, 2024

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Outside diff range and nitpick comments (1)
package/PartSeg/plugins/napari_widgets/metadata_viewer.py (1)

9-29: LGTM! The LayerMetadata class is well-designed and implemented.

The class provides a useful feature to display layer metadata in the napari viewer. It integrates well with the existing napari viewer and layer system, and the use of magicgui and qtpy widgets ensures a consistent UI experience.

To further improve the code quality, consider adding the following:

  1. Type hints for the layer_selector and _dict_viewer attributes:
from magicgui.widgets import Widget
from PartSeg.common_gui.dict_viewer import DictViewer

class LayerMetadata(QWidget):
    def __init__(self, viewer: napari.Viewer):
        ...
        self.layer_selector: Widget = create_widget(annotation=NapariImage, label="Layer", options={})
        self._dict_viewer: DictViewer = DictViewer()
        ...
  1. Docstrings for the class and its methods:
class LayerMetadata(QWidget):
    """A widget to display the metadata of a selected layer in a napari viewer."""

    def __init__(self, viewer: napari.Viewer):
        """Initialize the LayerMetadata widget.

        Parameters
        ----------
        viewer : napari.Viewer
            The napari viewer instance.
        """
        ...

    def reset_choices(self):
        """Reset the choices in the layer selector widget."""
        ...

    def update_metadata(self):
        """Update the displayed metadata based on the selected layer."""
        ...
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 83dfdf8 and 17cd104.

Files selected for processing (3)
  • package/PartSeg/plugins/napari_widgets/init.py (2 hunks)
  • package/PartSeg/plugins/napari_widgets/metadata_viewer.py (1 hunks)
  • package/tests/test_PartSeg/test_napari_widgets.py (2 hunks)
Files skipped from review as they are similar to previous changes (2)
  • package/PartSeg/plugins/napari_widgets/init.py
  • package/tests/test_PartSeg/test_napari_widgets.py

Copy link

codecov bot commented Sep 20, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 93.08%. Comparing base (48f82c1) to head (17cd104).
Report is 1 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #1195      +/-   ##
===========================================
+ Coverage    93.07%   93.08%   +0.01%     
===========================================
  Files          209      210       +1     
  Lines        32927    32974      +47     
===========================================
+ Hits         30646    30694      +48     
+ Misses        2281     2280       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@Czaki
Copy link
Collaborator Author

Czaki commented Sep 20, 2024

@coderabbitai full review

Copy link
Contributor

coderabbitai bot commented Sep 20, 2024

Actions performed

Full review triggered.

@Czaki Czaki merged commit 6ee3209 into develop Sep 20, 2024
56 checks passed
@Czaki Czaki deleted the metadata_viewer branch September 20, 2024 10:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant