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: Show filename when importing with PartSeg in napari #1226

Merged
merged 7 commits into from
Dec 18, 2024

Conversation

daviddaytw
Copy link
Contributor

@daviddaytw daviddaytw commented Dec 6, 2024

Hi,

Thank you for developing this fantastic tool! It has been incredibly valuable for our research.

While working with PartSeg in Napari, we noticed that the filename does not appear in the layer names, making distinguishing between multiple imported files challenging. To address this, I’ve updated the code in this pull request to add the filename as a prefix to the layer names.

I’m open to feedback on this approach and would love your thoughts or suggestions for further improvement!

Best,
David

Summary by Sourcery

New Features:

  • Add filename as a prefix to layer names when importing with PartSeg in Napari.

Summary by CodeRabbit

  • New Features

    • Introduced a new method for adjusting color values, enhancing color processing capabilities.
    • Added conditional functionality for adding color based on the version of the application.
    • Improved layer naming conventions by incorporating file name prefixes for better clarity.
    • Added a new property for selecting layer naming formats in settings.
    • Introduced a new enumeration for layer naming formats with multiple options.
    • Added new test cases to validate layer naming format functionality.
  • Bug Fixes

    • Enhanced handling of alpha channels in color strings to ensure accurate color representation.

Add filename as a prefix to layer names to improve usability.
Copy link
Contributor

sourcery-ai bot commented Dec 6, 2024

Reviewer's Guide by Sourcery

The PR modifies the layer naming logic in the napari plugin to include the source filename as a prefix for layer names. This is implemented by extracting the base filename from the project info's file path and prepending it to the existing channel names when creating layer configurations.

Class diagram for updated layer naming logic

classDiagram
    class ProjectInfo {
        +string file_path
        +Image image
    }
    class Image {
        +string name
        +int channels
        +string[] channel_names
        +map metadata
        +get_channel(int) Image
    }
    class LayerConfig {
        +string scale
        +string name
        +string blending
        +string translate
        +map metadata
    }
    ProjectInfo --> Image
    Image --> LayerConfig
    note for LayerConfig "Layer name now includes filename prefix"
Loading

File-Level Changes

Change Details Files
Added filename prefix to napari layer names
  • Extract base filename from project_info.file_path
  • Prepend filename to channel names in layer configuration for ROI images
  • Prepend filename to channel names in layer configuration for regular images
package/PartSegCore/napari_plugins/loader.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time. You can also use
    this command to specify where the summary should be inserted.

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

coderabbitai bot commented Dec 6, 2024

Walkthrough

The pull request introduces modifications to the loader.py file in the PartSeg.plugins.napari_io package, enhancing color handling and layer naming functionality. A new adjust_color function is added to process color inputs, stripping alpha channels from hex color strings. The add_color function is conditionally defined based on the napari version. Additionally, a new variable filename is introduced to improve layer naming by prepending the file base name to layer names. Changes are also made to the napari_widgets/_settings.py and universal_const.py files to support these enhancements.

Changes

File Change Summary
package/PartSeg/plugins/napari_io/loader.py - Added os import
- Implemented adjust_color function with overloads for string and list inputs
- Conditionally defined add_color function based on napari version
- Introduced filename variable for enhanced layer naming
package/PartSeg/plugins/napari_widgets/_settings.py - Added layer_naming_format property with getter and setter
- Introduced widget for selecting layer naming format in SettingsEditor
package/PartSegCore/universal_const.py - Added LayerNamingFormat enumeration class with four constants
- Implemented format_layer_name function for structured layer name formatting
package/tests/test_PartSeg/test_napari_widgets.py - Added test method test_change_layer_name_format to verify layer naming format changes
package/tests/test_PartSegCore/test_io.py - Added parameterized test test_format_layer_name for format_layer_name function

Poem

🐰 A Rabbit's Ode to Color and Layers
In loader's realm, where pixels dance and play,
Colors stripped bare, their alpha swept away,
Layers named with grace, file's essence shining bright,
Napari's canvas painted with delight!
🎨✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1bd93f7 and 6b7e582.

📒 Files selected for processing (1)
  • package/PartSegCore/universal_const.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • package/PartSegCore/universal_const.py

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 generate docstrings to generate docstrings for this PR. (Beta)
  • @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 @daviddaytw - I've reviewed your changes and they look great!

Here's what I looked at during the review
  • 🟢 General issues: all looks good
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟢 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 and I'll use the feedback to improve your reviews.

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: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 323b509 and 5db81bc.

📒 Files selected for processing (1)
  • package/PartSegCore/napari_plugins/loader.py (3 hunks)
🔇 Additional comments (4)
package/PartSegCore/napari_plugins/loader.py (4)

3-3: LGTM: Clean import addition

The addition of os.path import is appropriate for the new filename extraction functionality.


Line range hint 22-41: LGTM: Robust color format handling

The color adjustment implementation properly handles various color formats and gracefully removes alpha channels that napari doesn't support. The code is well-documented and handles edge cases appropriately.


76-76: LGTM: Consistent naming convention

The filename prefix is consistently applied to multi-channel image layers, maintaining a uniform naming convention.


Line range hint 44-54: Verify napari version compatibility in the environment

The conditional implementation based on napari version looks correct, but we should verify the version compatibility in the target environment.

✅ Verification successful

Let me analyze the version compatibility further by checking the specific version checks in the codebase.


Based on the search results, I can now generate the final response as there's sufficient evidence about the napari version compatibility.

Version compatibility is properly handled across the codebase

The conditional implementation for add_color is part of a well-structured version compatibility system:

  • The version check napari >= 0.4.19a1 is consistently used across multiple files
  • The codebase has proper version guards for different napari versions (0.4.13, 0.4.17, 0.4.19, 0.5.0)
  • There's a runtime check in launcher_main.py that prevents usage with incompatible versions
  • Test files include proper version-specific test cases
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check napari version requirements in setup.py or requirements.txt
fd -e txt -e py -x rg -l "napari.*[><=].*0\.4\.19"

# Check if there are any version-specific imports or usage of napari
rg -A 3 "import.*napari" 

Length of output: 7388


Script:

#!/bin/bash
# Check for napari version checks in the codebase
rg -A 3 "parse_version.*napari"

# Check setup.py for napari dependency
fd setup.py -x cat {}

Length of output: 5877

package/PartSegCore/napari_plugins/loader.py Outdated Show resolved Hide resolved
@Czaki
Copy link
Collaborator

Czaki commented Dec 7, 2024

Hm. Could you describe more the use case?

My biggest worry is that the name could be a little too long and be unreadable in napari interface.
As you mae see on this screenshot, when I check out your PR and run:
Screenshot 2024-12-07 at 01 20 08

The file name consumes almost all place, and details of channel names are not visible.

The name of the file for the current active layer is visible on the status bar:

Screenshot 2024-12-07 at 01 23 26

It is also visible as tooltip:

Screenshot 2024-12-07 at 01 24 06

But both things require mouse interaction.

Maybe some clipping of file name could be a solution? But it will be easier to decide if you provide some description of the use case.

Te PR will also require updating the test that checks if layer name is expected.

@daviddaytw
Copy link
Contributor Author

Hi @Czaki,

Thank you for sharing your feedback on this PR!

I agree that the filename could become overly long. Do you have any suggestions on how we might truncate or simplify it effectively? If you think the channel name is the priority, maybe we can use a format like Ch1-T1 | stack1_component2.tif?

Regarding the use case, we need to load multiple stains simultaneously (e.g., ASYM32, POLYGA, NeuN) in Napari for analysis. Specifically, we used PartSeg's ROI Analysis Extraction tool for thresholding. The places you mentioned show the filename, but in the selection box within the tool panel, we must select based on the layer name. In the current workflow, we need to rename the layer every time we load a file, or else we will be confused when doing the analysis.

Please let me know what files I should update about the test. I'm happy to do it!

Looking forward to your thoughts!

Best regards,
David

@Czaki
Copy link
Collaborator

Czaki commented Dec 7, 2024

Hard question. I even started thinking about allowing configuring this by settings...

If it is mainly for layer combo box, I prefer the channel name | file name format.

But If you think, that making this configurable is a good idea, we may go this direction.

@daviddaytw
Copy link
Contributor Author

I see where you are coming from and agree that it is a hard decision.

I like the configurable idea. What do you think it would be like?

@Czaki
Copy link
Collaborator

Czaki commented Dec 9, 2024

@daviddaytw I have created #1228. Once I merge it (1 or 2 days), there will be ready skeleton for this change.

@daviddaytw
Copy link
Contributor Author

Sounds good, I am looking forward to it!

Czaki added a commit that referenced this pull request Dec 10, 2024
…Seg as napari plugin (#1228)

This PR add "Settings Editor" widget to allow edit PartSeg specific
settings.

This PR add option to set to which units, the scale should be set when
loading to the viewer.

This PR also contains refactor that is mentioned here:
#1226 (comment)

## Summary by Sourcery

Add a 'Settings Editor' widget to the PartSeg napari plugin to enable
editing of specific settings, including setting units for data scaling.
Refactor the plugin structure by relocating files to a new 'napari_io'
directory for improved organization.

New Features:
- Introduce a 'Settings Editor' widget to allow users to edit PartSeg
specific settings within the napari plugin.
- Add functionality to set the units for scaling when loading data into
the viewer.

Enhancements:
- Refactor the PartSeg napari plugin structure by moving files from
'napari_plugins' to 'napari_io' for better organization.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Introduced a new `SettingsEditor` for managing unit settings within
the PartSeg interface.
- Enhanced plugin handling based on the version of the `napari` library.
- **Bug Fixes**
	- Improved clarity of error messages related to plugin loading.
- **Documentation**
- Updated command signatures in the configuration to reflect new module
structure.
- **Chores**
- Restructured import paths across various modules to enhance
organization and maintainability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@Czaki
Copy link
Collaborator

Czaki commented Dec 10, 2024

@daviddaytw I have merged #1228.
There are many changes in this PR but the most important one are:

Add io_units property with storing in internal storage (set, and get methods put it in internal dict, that will be serialized and loaded from disk:

@property
def io_units(self) -> Units:
return self.get("io_units", Units.nm)
@io_units.setter
def io_units(self, value: Units):
self.set("io_units", value)

Add position to new widget:

self.units_select = create_widget(self.settings.io_units, annotation=Units, label="Units for io")
self.units_select.changed.connect(self.units_selection_changed)
self.settings.connect_("io_units", self.units_changed)
self.append(self.units_select)

Read value from settings and use it to calculate settings:

scale = project_info.image.normalized_scaling(UNIT_SCALE[settings.io_units.value])

I hope that it will be enough information for you to try to implement this feature with option for user to configure.

I suggest to use Enum (as here for Units) as it allow for easy create combo box.

By default, it creates names in the combo box by replacing _ with . You may want to overload __str__ method to customize what is visble for user.

@daviddaytw
Copy link
Contributor Author

Hi @Czaki

Thank you for adding the Settings Editor! This is going to be very helpful for PartSeg users.
I currently have limited bandwidth on this, but I will look into it as soon as possible!

Best,
David

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: 1

🧹 Outside diff range and nitpick comments (2)
package/PartSeg/plugins/napari_io/loader.py (2)

Line range hint 21-41: Consider adding input validation for color lists

The color adjustment logic looks good, but consider adding validation for the input list length to handle potential edge cases gracefully.

 elif isinstance(color, list):
+    if len(color) < 3:
+        raise ValueError("Color list must contain at least RGB values")
     return (color[i] / 255 for i in range(3))

66-66: Consider implementing configurable layer naming format

As discussed in the PR comments, users might benefit from configurable layer naming patterns. Consider implementing this through the settings system mentioned in PR #1228.

Some suggestions:

  1. Add a setting for the naming pattern (e.g., {filename} {channel} or {channel} | {filename})
  2. Add an option to limit filename length
  3. Consider making the filename prefix optional

Would you like help designing the settings interface for this feature?

Also applies to: 78-78

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5db81bc and 2c6f0cd.

📒 Files selected for processing (1)
  • package/PartSeg/plugins/napari_io/loader.py (3 hunks)
🔇 Additional comments (2)
package/PartSeg/plugins/napari_io/loader.py (2)

3-3: LGTM: Clean import addition

The addition of path from os module follows Python import conventions and is appropriately placed with other standard library imports.


Line range hint 58-78: Verify the impact on existing tests and layer name dependencies

The layer name changes might affect existing tests or code that depends on specific layer names.

package/PartSeg/plugins/napari_io/loader.py Outdated Show resolved Hide resolved
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: 1

🧹 Nitpick comments (3)
package/PartSegCore/universal_const.py (2)

22-30: LGTM! Consider adding docstring documentation.

The LayerNamingFormat enum provides a clean implementation with good flexibility for different naming formats. The __str__ method appropriately handles UI display.

Consider adding a docstring to document the purpose and usage of each format option:

 @register_class()
 class LayerNamingFormat(Enum):
+    """Defines format options for layer naming in napari.
+    
+    Attributes:
+        channel_only: Display only the channel name
+        filename_only: Display only the filename
+        filename_channel: Display filename followed by channel name
+        channel_filename: Display channel name followed by filename
+    """
     channel_only = 0
     filename_only = 1
     filename_channel = 2
     channel_filename = 3

33-42: LGTM! Consider adding input validation.

The implementation cleanly handles all format options with appropriate error handling.

Consider adding input validation for empty strings:

 def format_layer_name(layer_format: LayerNamingFormat, file_name: str, channel_name: str) -> str:
+    if not file_name or not channel_name:
+        raise ValueError("file_name and channel_name must not be empty")
     if layer_format == LayerNamingFormat.channel_only:
         return channel_name
     if layer_format == LayerNamingFormat.filename_only:
         return file_name
     if layer_format == LayerNamingFormat.filename_channel:
         return f"{file_name} | {channel_name}"
     if layer_format == LayerNamingFormat.channel_filename:
         return f"{channel_name} | {file_name}"
     raise ValueError("Unknown format")
package/PartSeg/plugins/napari_widgets/_settings.py (1)

63-68: LGTM! Consider improving widget layout.

The implementation cleanly integrates the new layer naming format selection into the settings UI.

Consider adding a visual separator between the units and layer naming widgets for better UX:

         self.settings.connect_("io_units", self.units_changed)
         self.append(self.units_select)
+        
+        # Add visual separator
+        separator = create_widget(widget_type="Label", value="─" * 30)
+        self.append(separator)
         
         self.layer_naming_select = create_widget(
             self.settings.layer_naming_format, annotation=LayerNamingFormat, label="Format for Layer Name"
         )

Also applies to: 77-82

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2c6f0cd and 944f0c2.

📒 Files selected for processing (3)
  • package/PartSeg/plugins/napari_io/loader.py (4 hunks)
  • package/PartSeg/plugins/napari_widgets/_settings.py (3 hunks)
  • package/PartSegCore/universal_const.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • package/PartSeg/plugins/napari_io/loader.py
🔇 Additional comments (1)
package/PartSeg/plugins/napari_widgets/_settings.py (1)

33-39: LGTM! Clean implementation of layer naming format setting.

The property implementation follows the established pattern and provides a sensible default that maintains backward compatibility.

package/PartSeg/plugins/napari_widgets/_settings.py Outdated Show resolved Hide resolved
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

🧹 Nitpick comments (1)
package/PartSeg/plugins/napari_widgets/_settings.py (1)

63-68: Consider grouping related settings together

While the implementation is correct, consider grouping related settings together for better UX. The layer naming format is closely related to I/O operations, so it might make sense to position it near the units selection widget.

Consider reorganizing the widgets:

     def __init__(self):
         super().__init__()
         self.settings = get_settings()
         self.units_select = create_widget(self.settings.io_units, annotation=Units, label="Units for io")
         self.units_select.changed.connect(self.units_selection_changed)
         self.settings.connect_("io_units", self.units_changed)
-        self.append(self.units_select)
         self.layer_naming_select = create_widget(
             self.settings.layer_naming_format, annotation=LayerNamingFormat, label="Format for Layer Name"
         )
         self.layer_naming_select.changed.connect(self.layer_naming_format_selection_changed)
         self.settings.connect_("layer_naming_format", self.layer_naming_format_changed)
+        # Group related I/O settings together
+        io_container = Container(widgets=[self.units_select, self.layer_naming_select], labels=False)
+        self.append(io_container)
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 944f0c2 and 50bb0e6.

📒 Files selected for processing (3)
  • package/PartSeg/plugins/napari_io/loader.py (4 hunks)
  • package/PartSeg/plugins/napari_widgets/_settings.py (3 hunks)
  • package/PartSegCore/universal_const.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • package/PartSegCore/universal_const.py
  • package/PartSeg/plugins/napari_io/loader.py
🔇 Additional comments (4)
package/PartSeg/plugins/napari_widgets/_settings.py (4)

10-10: LGTM: Import statement is correctly placed

The import of LayerNamingFormat is appropriately placed and necessary for the new layer naming functionality.


33-39: LGTM: Property implementation is well-structured

The layer_naming_format property is correctly implemented with:

  • Proper type hints
  • Consistent default value
  • Clean getter/setter pattern matching existing code style

77-82: LGTM: Event handlers are properly implemented

The event handlers for layer naming format changes are well-implemented:

  • Consistent with existing pattern
  • Proper bi-directional synchronization
  • Settings persistence is handled

34-35: Verify default format aligns with PR objectives

The default format is set to channel_only, which maintains the existing behavior. However, given that the PR's objective is to show filenames for better file identification, consider if this should default to a format that includes the filename.

✅ Verification successful

Let me gather more context about the PR's objectives and the LayerNamingFormat enum.


Let me check the PR's description to understand the intended behavior for layer naming.


Based on the code analysis, I can now provide a final response:

Default layer naming format is appropriate

The current default of channel_only is appropriate because:

  1. The LayerNamingFormat enum provides flexibility with four options: channel_only, filename_only, filename_channel, and channel_filename
  2. Users can easily change their preferred format through the settings UI (SettingsEditor class)
  3. The default maintains backward compatibility while allowing users to opt-in to filename-based formats when needed
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there are any existing preferences or discussions about the default format
rg -A 5 "LayerNamingFormat.channel_only" --type py

Length of output: 1090


Script:

#!/bin/bash
# Check the LayerNamingFormat enum definition and any related comments/documentation
ast-grep --pattern 'class LayerNamingFormat'

# Check PR description or commit messages for naming format requirements
rg -l "LayerNamingFormat" --type py | xargs cat

Length of output: 4096


Script:

#!/bin/bash
# Check PR description and commit messages
gh pr view --json title,body

# Also check for any related test files that might indicate the expected default
rg -l "test.*layer.*naming" --type py

Length of output: 122

@daviddaytw
Copy link
Contributor Author

Hi @Czaki ,

I added a section to the Setting Editor according to your instructions.

Best,
David

@Czaki Czaki added this to the 0.16.0 milestone Dec 16, 2024
@Czaki
Copy link
Collaborator

Czaki commented Dec 16, 2024

@daviddaytw Will it be possible for you to add tests for this code, or should I push to your branch?

Copy link

codecov bot commented Dec 16, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 93.14%. Comparing base (4118e35) to head (6b7e582).
Report is 1 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #1226      +/-   ##
===========================================
- Coverage    93.15%   93.14%   -0.01%     
===========================================
  Files          210      210              
  Lines        33217    33268      +51     
===========================================
+ Hits         30943    30989      +46     
- Misses        2274     2279       +5     

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

@daviddaytw
Copy link
Contributor Author

@daviddaytw Will it be possible for you to add tests for this code, or should I push to your branch?

@Czaki Can you push to my branch if that's easy for you?

@daviddaytw
Copy link
Contributor Author

That's awesome tests, thanks!

@Czaki Czaki merged commit 1f1a35f into 4DNucleome:develop Dec 18, 2024
55 checks passed
@Czaki
Copy link
Collaborator

Czaki commented Dec 18, 2024

I will cut a new release in a few following days.

@daviddaytw
Copy link
Contributor Author

Awesome, thank you so much! Happy holiday!

@Czaki
Copy link
Collaborator

Czaki commented Dec 21, 2024

@daviddaytw PartSeg 0.16.0 uploaded to pypi.
In a few days will be on conda-forge too.

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.

2 participants