software-submission icon indicating copy to clipboard operation
software-submission copied to clipboard

Fluidimage submission

Open paugier opened this issue 1 year ago • 44 comments

Submitting Author: Pierre Augier (@paugier) All current maintainers: (@paugier) Package Name: Fluidimage One-Line Description of Package: "Fluidimage: a Python framework to study flows from images" Repository Link: https://foss.heptapod.net/fluiddyn/fluidimage Version submitted: 0.5.3 EIC: @Batalex Editor: @cmarmo Reviewer 1: @leahmendelson Reviewer 2: @Kai-Striega Reviewer 3: @emmylia321 Archive: TBD JOSS DOI: TBD Version accepted: TBD Date accepted (month/day/year): TBD


Code of Conduct & Commitment to Maintain Package

Description

  • Include a brief paragraph describing what your package does:

FluidImage is a free and open-source Python framework to process images of fluids (in particular with PIV), and analyse the resulting fields.

Fluidimage has now grown into a clean software reimplementing in modern Python algorithms and ideas taken from UVmat, OpenPIV, PIVlab and PIVmat with a focus on performance, usability and maintanability. However, Fluidimage is not restricted to Particle Image Velocimetry computations (PIV, i.e. displacements of pattern obtained by correlations of cropped images) and can be used to (i) display and pre-process images, (ii) compute displacement or velocity fields with PIV, Background-Oriented Schlieren (BOS) and optical flow, and (iii) analyze and display vector and scalar fields.

Scope

  • Please indicate which category or categories. Check out our package scope page to learn more about our scope. (If you are unsure of which category you fit, we suggest you make a pre-submission inquiry):

    • [ ] Data retrieval
    • [ ] Data extraction
    • [x] Data processing/munging
    • [ ] Data deposition
    • [ ] Data validation and testing
    • [x] Data visualization[^1]
    • [ ] Workflow automation
    • [ ] Citation management and bibliometrics
    • [ ] Scientific software wrappers
    • [ ] Database interoperability
  • For all submissions, explain how and why the package falls under the categories you indicated above. In your explanation, please address the following points (briefly, 1-2 sentences for each):

    • Who is the target audience and what are scientific applications of this package?

      The target audience is students, scientists, researchers and engineers working with images of fluids. Fluidimage can be used to process images, compute vectors and scalar fields and analyze them.

    • Are there other Python packages that accomplish the same thing? If so, how does yours differ?

      OpenPIV can be used to compute vectors with various PIV algorithms. Fluidimage is not restricted to PIV. It has a very different API than OpenPIV. Fluidimage has more focus on performance, with in particular compiled extensions produced with Transonic-Pythran and an asynchronous/parallel framework to describe "topologies" of computations and compute then in parallel.

Technical checks

For details about the pyOpenSci packaging requirements, see our packaging guide. Confirm each of the following by checking the box. This package:

  • [x] does not violate the Terms of Service of any service it interacts with.
  • [x] uses an OSI approved license.
  • [x] contains a README with instructions for installing the development version.
  • [x] includes documentation with examples for all functions.
  • [x] contains a tutorial with examples of its essential functions and uses.
  • [x] has a test suite.
  • [x] has continuous integration setup, such as GitHub Actions CircleCI, and/or others.

Publication Options

I tend to think that Fluidimage is not yet ready for a paper in JOSS. We need more time to get a stronger community and to implement few more features before submitting to JOSS.

JOSS Checks
  • [x] The package has an obvious research application according to JOSS's definition in their submission requirements. Be aware that completing the pyOpenSci review process does not guarantee acceptance to JOSS. Be sure to read their submission requirements (linked above) if you are interested in submitting to JOSS.
  • [x] The package is not a "minor utility" as defined by JOSS's submission requirements: "Minor ‘utility’ packages, including ‘thin’ API clients, are not acceptable." pyOpenSci welcomes these packages under "Data Retrieval", but JOSS has slightly different criteria.
  • [ ] The package contains a paper.md matching JOSS's requirements with a high-level description in the package root or in inst/.
  • [x] The package is deposited in a long-term repository with the DOI:

Note: JOSS accepts our review as theirs. You will NOT need to go through another full review. JOSS will only review your paper.md file. Be sure to link to this pyOpenSci issue when a JOSS issue is opened for your package. Also be sure to tell the JOSS editor that this is a pyOpenSci reviewed package once you reach this step.

Are you OK with Reviewers Submitting Issues and/or pull requests to your Repo Directly?

This option will allow reviewers to open smaller issues that can then be linked to PR's rather than submitting a more dense text based review. It will also allow you to demonstrate addressing the issue via PR links.

  • [x] Yes I am OK with reviewers submitting requested changes as issues to my repo. Reviewers will then link to the issues in their submitted review.

Note that Fluidimage development is done on https://foss.heptapod.net/fluiddyn/fluidimage and that issues have to be filled on this website. Pull requests are of course very welcome. Note that with Heptapod/Mercurial, one should not fork the repo to submit a PR (see https://fluiddyn.readthedocs.io/en/latest/mercurial_heptapod.html).

Confirm each of the following by checking the box.

  • [x] I have read the author guide.
  • [x] I expect to maintain this package for at least 2 years and can help find a replacement for the maintainer (team) if needed.

Please fill out our survey

P.S. Have feedback/comments about our review process? Leave a comment here

Editor and Review Templates

The editor template can be found here.

The review template can be found here.

paugier avatar May 30 '24 12:05 paugier

Editor in Chief checks

Hi there! Thank you for submitting your package for pyOpenSci review. Below are the basic checks that your package needs to pass to begin our review. If some of these are missing, we will ask you to work on them before the review process begins.

Please check our Python packaging guide for more information on the elements below.

  • [x] Installation The package can be installed from a community repository such as PyPI (preferred), and/or a community channel on conda (e.g. conda-forge, bioconda).
    • [x] The package imports properly into a standard Python environment import package.
  • [x] Fit The package meets criteria for fit and overlap.
  • [x] Documentation The package has sufficient online documentation to allow us to evaluate package function and scope without installing the package. This includes:
    • [x] User-facing documentation that overviews how to install and start using the package.
    • [x] Short tutorials that help a user understand how to use the package and what it can do for them.
    • [x] API documentation (documentation for your code's functions, classes, methods and attributes): this includes clearly written docstrings with variables defined using a standard docstring format.
  • [x] Core GitHub repository Files
    • [x] README The package has a README.md file with clear explanation of what the package does, instructions on how to install it, and a link to development instructions.
    • [x] Contributing File The package has a CONTRIBUTING.md file that details how to install and contribute to the package.
    • [ ] Code of Conduct The package has a CODE_OF_CONDUCT.md file. There is a dedicated section on the website, I think we're good to go.
    • [x] License The package has an OSI approved license. NOTE: We prefer that you have development instructions in your documentation too.
  • [x] Issue Submission Documentation All of the information is filled out in the YAML header of the issue (located at the top of the issue template).
  • [x] Automated tests Package has a testing suite and is tested via a Continuous Integration service.
  • [x] Repository The repository link resolves correctly.
  • [x] Package overlap The package doesn't entirely overlap with the functionality of other packages that have already been submitted to pyOpenSci.
  • [ ] Archive (JOSS only, may be post-review): The repository DOI resolves correctly.
  • [ ] Version (JOSS only, may be post-review): Does the release version given match the GitHub release (v1.0.0)?

  • [x] Initial onboarding survey was filled out We appreciate each maintainer of the package filling out this survey individually. :raised_hands: Thank you authors in advance for setting aside five to ten minutes to do this. It truly helps our organization. :raised_hands:


Editor comments

Hello @paugier, and welcome to pyOpenSci! Sorry it took me so long to get back to you, I have been sitting on these checks for a while now. fluidimage is truly an interesting project, even from a code structure perspective. I never used mercurial, and I think it's a first for pyOpenSci in general. Same for the licence, never encountered it before! I'll get started on finding an editor. Thank you for your patience.

Batalex avatar Jun 22 '24 08:06 Batalex

Hello @paugier I'm Chiara, following up as editor in chief during those summer months. I just want to let you know that you haven't been forgotten ... hope to find an editor for Fluidimage soon 🤞.

cmarmo avatar Aug 13 '24 21:08 cmarmo

Hello @paugier we are very sorry for making you wait so long! If you are still interested in our review process (I hope so! :innocent:), I'm starting looking for reviewers for your submission.

Thanks a lot for your patience! :pray:

cmarmo avatar Oct 01 '24 17:10 cmarmo

Hello @paugier , I am glad to announce that we have two reviewers for Fluidimage. :tada:

@leahmendelson and @stefanv kindly accepted to take care of this submission: thank you so much to you both! :pray:

Leah, Stefan, before beginning your review, please fill out our pre-review survey. This helps us improve all aspects of our review and better understand our community. No personal data will be shared from this survey - it will only be used in an aggregated format by our Executive Director to improve our processes and programs.

  • [ ] reviewer 1 survey completed.
  • [x] reviewer 2 survey completed.

The following resources will help you complete your review:

  1. Here is the reviewers guide. This guide contains all of the steps and information needed to complete your review.
  2. Here is the review template that you will need to fill out and submit here as a comment, once your review is complete.

Please get in touch with any questions or concerns! This review went already a bit out of schedule, I hope a three weeks deadline is ok for you both. Otherwise please let me know, so we can keep track.

This review is then due on November 10th.

Thank you so much again to you both and to Pierre for his patience!

Happy review to all of you!

cmarmo avatar Oct 20 '24 15:10 cmarmo

@leahmendelson, I almost forgot.... Do you mind confirming the github handle of your student, so I can add them to the review acknowledgment? Thank you!

cmarmo avatar Oct 20 '24 16:10 cmarmo

@emmylia321 is the student who will be co-reviewing with me

leahmendelson avatar Oct 22 '24 00:10 leahmendelson

Thank you Leah! And welcome @emmylia321! :wave:

cmarmo avatar Oct 22 '24 07:10 cmarmo

@emmylia321, @leahmendelson and @stefanv, just to tell you that I've just released a new version of fluidimage (0.5.4) with a small fix of a bug with a new version of Matplotlib. There are also wheels for Python 3.13, but in practice they should not be used before scikit-image 0.25 is really released (only 0.25.0rc1 is available right now).

paugier avatar Nov 07 '24 12:11 paugier

Hello dear reviewers, just checking if you had time to move forward with review. Please let us know! If you need more time I totally understand, I just need to have an insight on the schedule. @emmylia321, @leahmendelson and @stefanv , thank you for your collaboration!

cmarmo avatar Nov 10 '24 16:11 cmarmo

Hi @paugier! Thanks for your submission. Today, I worked on installing the package from source, and here's an initial set of notes I took while doing so:


The README has a broken link to https://en.wikipedia.org/wiki/Particle_image_velocimetry_(PIV) Same for docs frontpage.

CeCILL license is, of course fine and choice of the developers, but worth noting that it is more restrictive than the BSD license used by most of the scientific Python ecosystem.

Package minimal dependency for scikit-image is very old; consider updating? See, e.g., SPEC0

Like with the license, Mercurial is fully the developers' choice, but may exclude significant part of ecosystem developers (I used to use Mercurial, but have no idea how to anymore :man_shrugging:).

Consider shipping example images in separate repository—they really blow up the repo size. See, e.g. pooch.

Consider adding an INSTALL.md or similar with build-from-source instructions; can simply be a link to: https://fluidimage.readthedocs.io/en/latest/build-from-source.html. Many developers will clone repo and look there for how to proceed.

The installation instructions suggest that pdm install --no-self would create a new virtual env, but instead:

$ pdm install --no-self

INFO: Inside an active virtualenv /home/stefan/envs/py312, reusing it.
Set env var PDM_IGNORE_ACTIVE_VENV to ignore it.

When compiling, lots of Pythran warnings, may be worth reporting to Serge:

  src/fluidimage/calcul/interpolate/__pythran__/thin_plate_spline.cpp:288:13: warning: possibly dangling reference to a temporary [-Wdangling-reference]

skimage now has thin plate splines, btw: https://scikit-image.org/docs/stable/auto_examples/transform/plot_tps_deformation.html Not sure if that implementation is useful or good enough for this application, but we'd love feedback :)

make tests resulted in a traceback with:

ModuleNotFoundError: No module named 'coverage.results'
  • Upgrading from coverage 7.6.4 to 7.6.7 worked.
  • Next, psutil was not found. Huh, something wrong with my psutil install? Reinstalling it fixed the problem.
  • Next ERROR src/fluidimage - AttributeError: module 'cv2' has no attribute 'imread'.
  • Reinstalling opencv-python did the trick. OK, at this point I'm thinking pdm may have done something to mess up my environment.
  • Also reinstalled pillow, scipy, kiwisolver, pyyaml to fix import errors.

Yay, test suite passed! Some warnings to resolve:

src/fluidimage/gui/test_monitor.py: 4 warnings
src/fluidimage/test_run_from_xml.py: 4 warnings
src/fluidimage/topologies/test_bos.py: 2 warnings
src/fluidimage/topologies/test_example.py: 11 warnings
src/fluidimage/topologies/test_image2image.py: 10 warnings
src/fluidimage/topologies/test_mean.py: 6 warnings
src/fluidimage/topologies/test_optical_flow.py: 8 warnings
src/fluidimage/topologies/test_piv.py: 12 warnings
src/fluidimage/topologies/test_preproc.py: 8 warnings
  /usr/lib64/python3.12/multiprocessing/popen_fork.py:66: DeprecationWarning: This process (pid=891926) is multi-threaded, use of fork() may lead to deadlocks in the child.
    self.pid = os.fork()

Will pick up from here soon!

stefanv avatar Nov 20 '24 05:11 stefanv

@stefanv thanks for looking at this. I'm going to answer in more details and fix things, but it is clear that PDM did not do what it should do in particular because you run it from a virtual env used for something else.

I guess things are going to work much better if you don't do that. PDM should create a dedicated environment in /.../fluidimage/.venv

paugier avatar Nov 20 '24 09:11 paugier

Thanks @stefanv for your notes. I worked on a merge request to improve the situation (https://foss.heptapod.net/fluiddyn/fluidimage/-/merge_requests/116) and opened two issues related to two of your remarks.

The README has a broken link to https://en.wikipedia.org/wiki/Particle_image_velocimetry_(PIV) Same for docs frontpage.

Fixed in https://foss.heptapod.net/fluiddyn/fluidimage/-/merge_requests/116/diffs?commit_id=eaa510beea8938743010f6ef2add5fd2a9e230be

CeCILL license is, of course fine and choice of the developers, but worth noting that it is more restrictive than the BSD license used by most of the scientific Python ecosystem.

CeCILL is equivalent (or better in terms of European laws) than GPL. I wonder how it would be possible than users of a software like fluidimage could be restricted in practice by GPL. However, I asked to the developers if they agree to change to BSD.

Package minimal dependency for scikit-image is very old; consider updating? See, e.g., SPEC0

I updated few minimal dependencies in https://foss.heptapod.net/fluiddyn/fluidimage/-/merge_requests/116/diffs?commit_id=17347a3dca48900011283f2a868b177490d83e52

Like with the license, Mercurial is fully the developers' choice, but may exclude significant part of ecosystem developers (I used to use Mercurial, but have no idea how to anymore 🤷‍♂️).

I have to admit that I doubt that Mercurial could be a barrier for anyone really wanting to contribute to Fluidimage.

  • for beginners, Mercurial is still simpler than Git
  • for people used to Git, we have documentation (accessible in particular from our file CONTRIBUTING.md) and our workflow is really simple.

I tend to think that people knowing Git will be able after 2 minutes of reading to run

hg clone ...
cd fluidimage
hg topic my-great-topic-name
hg status
hg commit -m "..."
hg push

More generally, I really think that too much uniformity in tech is bad. For version control, the Git quasi monopoly for open-source is bad. For some aspects, Git is nice, but for some others, it is really bad and old. For example, it is really unfortunate that people cannot safely share history edition and need to push with --force or --force-with-lease. Also the need to use a lot git commit -a is really unfortunate.

Therefore, I consider that it is part of my research tasks to work on one of the alternatives for version control. Mercurial, still used internally at Meta (actually a fork), Google (only the client) and Mozilla, is interesting.

Consider shipping example images in separate repository—they really blow up the repo size. See, e.g. pooch.

This is indeed interesting. A newly cloned repo (cloned in ~ 5 s so it is still fine) has a size of a bit less than 100MB, which is too much. I opened an issue on this https://foss.heptapod.net/fluiddyn/fluidimage/-/issues/42

Consider adding an INSTALL.md or similar with build-from-source instructions; can simply be a link to: https://fluidimage.readthedocs.io/en/latest/build-from-source.html. Many developers will clone repo and look there for how to proceed.

Done in https://foss.heptapod.net/fluiddyn/fluidimage/-/merge_requests/116/diffs?commit_id=677bd1af0f23fa800eac9466a803a629cdf7cb38

The installation instructions suggest that pdm install --no-self would create a new virtual env, but instead:

$ pdm install --no-self

INFO: Inside an active virtualenv /home/stefan/envs/py312, reusing it.
Set env var PDM_IGNORE_ACTIVE_VENV to ignore it.

This is really unfortunate that you experienced such problems! Especially because we use good modern tools and everything works well for us with PDM (and also Pixi).

I updated our documentation to avoid your install issue in https://foss.heptapod.net/fluiddyn/fluidimage/-/merge_requests/116/diffs?commit_id=08b63f2c392d4c5a1e2999f527b2531929cbc568

When compiling, lots of Pythran warnings, may be worth reporting to Serge:

With a virtual env correctly setup with PDM, we also have few warnings related to Pythran, but not the same as you! Anyway, I'm going to report this in https://github.com/serge-sans-paille/pythran/

skimage now has thin plate splines, btw: https://scikit-image.org/docs/stable/auto_examples/transform/plot_tps_deformation.html Not sure if that implementation is useful or good enough for this application, but we'd love feedback :)

I'm going to look at that.

make tests resulted in a traceback with:

Yay, test suite passed! Some warnings to resolve:

All these issues are related to your broken environment. With a correct environment created with PDM, Fluidimage tests pass without warning.

paugier avatar Nov 20 '24 12:11 paugier

All these issues are related to your broken environment. With a correct environment created with PDM, Fluidimage tests pass without warning.

Great, thanks @paugier! I will rebuild a dedicated virtual environment and re-test. The new documentation says:

You should not run the following commands from a virtual environment not related to Fluidimage.

I think a lot of people start from an existing environment, and after decades of using virtual envs of never tried to get out of one! There is no deactivate command, so not sure how to do that. Looks like pdm --venv .venv or similar may do the trick, though.

Re: the hg and license comments, those were merely observations / data points; totally fine for the project to make opinionated choices, of course. I understand the motivation for libre licenses; one practical issue in our ecosystem is that code cannot flow from GPL packages into BSD libraries. E.g., say you had a good thin-plate splines implementation that we wanted to adopt into scikit-image. But, I'm not pushing you to change the license.

I want to make very clear that my goal with this review is to help the project as much as I can, and to provide some ecosystem context where useful. None of the comments are meant as criticism!

stefanv avatar Nov 20 '24 18:11 stefanv

Hello @leahmendelson @emmylia321 @stefanv , I wonder if we can have the reviews in before Christmas? Please let me know if you need any help / info.

Thank you so much for volunteering your time for pyOpenSci.

cmarmo avatar Dec 07 '24 22:12 cmarmo

Hello everybody and happy new year to all of you! I hope you enjoyed some holiday break, we are now back to business and I wondering if we can set a timeline for the reviews. @leahmendelson @emmylia321 @stefanv do you mind letting me know if you are able to finalize your review? Otherwise I can also look for someone else... everyone is busy and this is a volunteer job, so I totally understand if you have issues in moving forward. Please just let us know so we can take the necessary actions.

Thank you so much for your work!

cmarmo avatar Jan 11 '25 13:01 cmarmo

Hello! Sorry, for the late response. I believe I can finish the review before January 19th. If that works well for you, I will send it in then.

Best, Emmelia Hoorn

On Sat, Jan 11, 2025 at 5:48 AM Chiara Marmo @.***> wrote:

Hello everybody and happy new year to all of you! I hope you enjoyed some holiday break, we are now back to business and I wondering if we can set a timeline for the reviews. @leahmendelson https://github.com/leahmendelson @emmylia321 https://github.com/emmylia321 @stefanv https://github.com/stefanv do you mind letting me know if you are able to finalize your review? Otherwise I can also look for someone else... everyone is busy and this is a volunteer job, so I totally understand if you have issues in moving forward. Please just let us know so we can take the necessary actions.

Thank you so much for your work!

— Reply to this email directly, view it on GitHub https://github.com/pyOpenSci/software-submission/issues/194#issuecomment-2585275159, or unsubscribe https://github.com/notifications/unsubscribe-auth/BICG5LTTW64M5XPUPPT6KQL2KEOMVAVCNFSM6AAAAABIQ34K2WVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDKOBVGI3TKMJVHE . You are receiving this because you were mentioned.Message ID: @.***>

emmylia321 avatar Jan 14 '25 19:01 emmylia321

Sorry for the delays - we should be able to close this out within this and next week.

leahmendelson avatar Jan 23 '25 21:01 leahmendelson

Package Review (updated 4/2/25)

Please check off boxes as applicable, and elaborate in comments below. Your review is not limited to these topics, as described in the reviewer guide

  • [x] As the reviewer I confirm that there are no conflicts of interest for me to review this work (If you are unsure whether you are in conflict, please speak to your editor before starting your review).

Documentation

The package includes all the following forms of documentation:

  • [x] A statement of need clearly stating problems the software is designed to solve and its target audience in README.
  • [x] Installation instructions: for the development version of the package and any non-standard dependencies in README.
  • [ ] Vignette(s) demonstrating major functionality that runs successfully locally.
  • [ ] Function Documentation: for all user-facing functions.
  • [ ] Examples for all user-facing functions.
  • [x] Community guidelines including contribution guidelines in the README or CONTRIBUTING.
  • [x] Metadata including author(s), author e-mail(s), a url, and any other relevant metadata e.g., in a pyproject.toml file or elsewhere.

Readme file requirements The package meets the readme requirements below:

  • [x] Package has a README.md file in the root directory.

The README should include, from top to bottom:

  • [x] The package name
  • [ ] Badges for:
    • [x] Continuous integration and test coverage,
    • [x] Docs building (if you have a documentation website),
    • [ ] A repostatus.org badge,
    • [x] Python versions supported,
    • [x] Current package version (on PyPI / Conda).

NOTE: If the README has many more badges, you might want to consider using a table for badges: see this example. Such a table should be more wide than high. (Note that the a badge for pyOpenSci peer-review will be provided upon acceptance.)

  • [x] Short description of package goals.
  • [ ] Package installation instructions
  • [ ] Any additional setup required to use the package (authentication tokens, etc.)
  • [x] Descriptive links to all vignettes. If the package is small, there may only be a need for one vignette which could be placed in the README.md file.
    • [ ] Brief demonstration of package usage (as it makes sense - links to vignettes could also suffice here if package description is clear)
  • [x] Link to your documentation website.
  • [x] If applicable, how the package compares to other similar packages and/or how it relates to other packages in the scientific ecosystem.
  • [ ] Citation information

Usability

Reviewers are encouraged to submit suggestions (or pull requests) that will improve the usability of the package as a whole. Package structure should follow general community best-practices. In general please consider whether:

  • [ ] Package documentation is clear and easy to find and use.
  • [x] The need for the package is clear
  • [ ] All functions have documentation and associated examples for use
  • [x] The package is easy to install

Functionality

  • [x] Installation: Installation succeeds as documented.
  • [ ] Functionality: Any functional claims of the software been confirmed.
  • [ ] Performance: Any performance claims of the software been confirmed.
  • [ ] Automated tests:
    • [ ] All tests pass on the reviewer's local machine for the package version submitted by the author. Ideally this should be a tagged version making it easy for reviewers to install.
    • [ ] Tests cover essential functions of the package and a reasonable range of inputs and conditions.
  • [x] Continuous Integration: Has continuous integration setup (We suggest using Github actions but any CI platform is acceptable for review)
  • [x] Packaging guidelines: The package conforms to the pyOpenSci packaging guidelines. A few notable highlights to look at:
    • [x] Package supports modern versions of Python and not End of life versions.
    • [x] Code format is standard throughout package and follows PEP 8 guidelines (CI tests for linting pass)

Final approval (post-review)

  • [ ] The author has responded to my review and made changes to my satisfaction. I recommend approving this package.

Estimated hours spent reviewing: 8

Review Comments

For context, I tested a pre-built install on Windows 11 and a built from source install on ubuntu. I'm holding off on checking off a few items due to the cumulative list of bugs and issues described below.

  • [ ] Missing repostatus.org badge
  • [ ] README includes a general link to the docs but does not mention installation specifically. It would also likely be worth calling out Mercurial here since it's less common and takes some additional setup.
  • [ ] README is missing citation information
  • [ ] It would be helpful to provide operating system specific directions where needed (e.g. for venv commands)
  • [ ] Broken link on the Build from Source docs page to "fully setup Mercurial with these extensions and learn a bit of Mercurial"
  • [ ] A few missing dependencies could be called out in advance (nothing particularly surprising, but always better to be complete): xsimd, opencv-python, pkg-config, pytest
  • [ ] Tutorials and examples using get_path_image_samples() all failed when using the pre-compiled install. Maybe something in the precomplied paths didn't generalize? There was limited documentation for me to debug anything that calls this function. This function worked fine in a built from source version on ubuntu, so possibly something with paths and operating systems?
  • [ ] Test scripts are all over the place in the repo and don't all run successfully locally. test_image2image.py failed to run locally for me. Looked to be just a typo in the version on the repo. Beyond the test functions in src and the one in examples I couldn't follow the complete set of tests for the package and the tests that exist don't look comprehensive. Is there something buried I'm missing?
  • [ ] Example scripts don't all run successfully locally. surface_tracking.py threw attribute errors in particular.

@emmylia321 also had the following notes (running on macOS)

  • [ ] Tutorial could be slightly more explicit in parts, though it is generally understandable: E.g. midpage it said, “Let’s go!”, I was not sure if this was a celebration or an instruction to run the file.
  • [ ] Got the following error, even though this variable was correctly set to 1 using the instructed code: “SystemError: For performance reason,the environment variable OMP_NUM_THREADS has to be set to "1" before executing a Fluidimage topology.” Fixed this by setting the variable directly in the terminal using: export OMP_NUM_THREADS=1 (I also ran into this when I worked through the PIV computation example).
  • [ ] Couldn't display the final field displays, fixed this with result.display(show_correl=False, hist=True. in the script, which makes sense, but it could've been clearer in the tutorial

leahmendelson avatar Jan 23 '25 23:01 leahmendelson

Hello! Just checking in ... @stefanv , @leahmendelson , @emmylia321 , I hope you are doing well.

Let us know if you have some ideas about a timeline for your review.

Thank you so much for your time!

cmarmo avatar Feb 17 '25 18:02 cmarmo

@cmarmo @paugier Apologies again for the delays. I've updated my previous partial review comment above and am going to call this round of review (from myself and @emmylia321) complete enough. Looking forward to seeing the revisions.

leahmendelson avatar Apr 02 '25 20:04 leahmendelson

Thank you @leahmendelson and @emmylia321 for all your work! @paugier, feel free to start working on the improvements and your answer to this first round of reviews.

I hope the second one will come soon.

cmarmo avatar Apr 03 '25 05:04 cmarmo

Hello everybody, hope you are all doing well. @stefanv do you think you might be able to finalize this review, or should I look for someone else? @paugier , in the meanwhile feel free to start addressing Leah and Emily's comments, so we can move forward this review. Thanks a lot to you all for your work so far!

cmarmo avatar Apr 29 '25 15:04 cmarmo

@paugier , unfortunately @stefanv could not finalize his review because of too much previous engagements. @Kai-Striega is kindly willing to take over. Thank you so much Kai! We may have a second review by the end of the month.

cmarmo avatar May 07 '25 08:05 cmarmo

Hi folks.

I've spent a few hours looking at the project and it looks interesting!

I don't have enough for a full review yet (I'll get there) but I wanted to mention that I'm having significant problems installing fluidimage using pdm (I've never used pdm before so this may be a user error).

I'm trying to follow this section/ When I run the command pdm sync --no-self --clean inside a clean virtual environment, I get a long list of errors from trying to install compiled packages without Cython/Pybind11/pythran. I've also tried ignoring the clean virtual env by setting the PDM_IGNORE_ACTIVE_VENV environment variable. Here is the full log of the command PDM_IGNORE_ACTIVE_VENV=1 pdm sync --no-self --clean, the errors are the same with or without PDM_IGNORE_ACTIVE_VENV set.

Details

$ PDM_IGNORE_ACTIVE_VENV=1 pdm sync --no-self --clean
WARNING: Project requires a python version of >=3.9, The virtualenv is being created for you as it cannot be matched to the right version.
INFO: python.use_venv is on, creating a virtualenv for this project...
Virtualenv is created successfully at /home/kai/Projects/fluidimage/.venv
Synchronizing working set with resolved packages: 194 to add, 0 to update, 0 to remove

   Install pip 24.1.2 successful
   Install setuptools 71.1.0 successful
   Install aiosignal 1.3.1 successful
   Install cloudpickle 3.0.0 successful
   Install autopep8 2.3.1 successful
   Install defusedxml 0.7.1 successful
   Install dill 0.3.8 successful
   Install distro 1.9.0 successful
   Install attrs 23.2.0 successful
   Install async-lru 2.0.4 successful
   Install certifi 2024.7.4 successful
   Install debugpy 1.8.2 successful
   Install fonttools 4.53.1 successful
   Install docutils 0.21.2 successful
   Install arrow 1.3.0 successful
   Install aiohttp 3.9.5 successful
   Install decorator 5.1.1 successful
   Install frozenlist 1.4.1 successful
   Install executing 2.0.1 successful
   Install beniget 0.4.2.post1 successful
   Install asttokens 2.4.1 successful
   Install cycler 0.12.1 successful
   Install comm 0.2.2 successful
   Install alabaster 0.7.16 successful
   Install anyio 4.4.0 successful
   Install click 8.1.7 successful
   Install bleach 6.1.0 successful
   Install argon2-cffi-bindings 21.2.0 successful
   Install beautifulsoup4 4.12.3 successful
   Install accessible-pygments 0.0.5 successful
   Install astroid 3.2.4 successful
   Install argon2-cffi 23.1.0 successful
   Install dask 2024.7.1 successful
   Install black 24.4.2 successful
   Install charset-normalizer 3.3.2 successful
   Install h5py 3.11.0 failed
   Install coverage 7.6.0 successful
   Install babel 2.15.0 successful
   Install contourpy 1.2.1 failed
   Install cffi 1.16.0 failed
   Install httpcore 1.0.5 successful
   Install fqdn 1.5.1 successful
   Install jsonschema-specifications 2023.12.1 successful
   Install fluiddyn 0.6.4 successful
   Install h5netcdf 1.3.0 successful
   Install importlib-metadata 8.2.0 successful
   Install httpx 0.27.0 successful
   Install idna 3.7 successful
   Install fsspec 2024.6.1 successful
   Install jsonschema 4.23.0 successful
   Install gast 0.5.5 successful
   Install imagesize 1.4.1 successful
   Install jupyter-cache 1.0.0 successful
   Install gprof2dot 2024.6.6 successful
   Install fastjsonschema 2.20.0 successful
   Install jupyter-client 8.6.2 successful
   Install imageio 2.34.2 successful
   Install h11 0.14.0 successful
   Install jupyter-core 5.7.2 successful
   Install jinja2 3.1.4 successful
   Install markdown-it-py 3.0.0 successful
   Install iniconfig 2.0.0 successful
   Install jupyterlab 4.2.4 successful
   Install jupyter-events 0.10.0 successful
   Install jupyterlab-server 2.27.3 successful
   Install jupyter-server 2.14.2 successful
   Install jupyter-lsp 2.2.5 successful
   Install jupytext 1.16.3 successful
   Install ipykernel 6.29.5 successful
   Install ipython 8.18.1 successful
    Installing ipdb 0.13.13...                   Downloading... 100%
   Install ipdb 0.13.13 successful
   Install isoduration 20.11.0 successful
   Install isort 5.13.2 successful
   Install jedi 0.19.1 successful
   Install json5 0.9.25 successful
   Install jsonpointer 3.0.0 successful
   Install mdurl 0.1.2 successful
   Install mdit-py-plugins 0.4.1 successful
   Install markupsafe 2.1.5 successful
   Install jupyterlab-myst 2.4.2 successful
   Install networkx 3.2.1 successful
   Install jupyterlab-pygments 0.3.0 successful
   Install overrides 7.7.0 successful
   Install jupyter-server-terminals 0.5.3 successful
   Install lazy-loader 0.4 successful
   Install meson 1.5.0 successful
   Install matplotlib-inline 0.1.7 successful
   Install mccabe 0.7.0 successful
   Install matplotlib 3.9.1 failed
   Install numpy 2.0.1 failed
   Install mistune 3.0.2 successful
   Install msgpack 1.0.8 successful
   Install kiwisolver 1.4.5 failed
   Install pandas 2.2.2 failed
   Install locket 1.0.0 successful
   Install linkify-it-py 2.0.3 successful
   Install prometheus-client 0.20.0 successful
   Install ply 3.11 successful
   Install pure-eval 0.2.3 successful
   Install myst-nb 1.1.1 successful
   Install mypy-extensions 1.0.0 successful
   Install pycparser 2.22 successful
   Install meson-python 0.16.0 successful
   Install pyfftw 0.14.0 failed
   Install ptyprocess 0.7.0 successful
   Install multidict 6.0.5 successful
   Install nbclient 0.10.0 successful
   Install nbconvert 7.16.4 successful
   Install nbformat 5.10.4 successful
   Install nest-asyncio 1.6.0 successful
   Install myst-parser 3.0.1 successful
   Install pyparsing 3.1.2 successful
   Install ninja 1.11.1.1 successful
   Install notebook-shim 0.2.4 successful
   Install pygments 2.18.0 successful
   Install numpydoc 1.7.0 successful
   Install opencv-python 4.10.0.84 successful
   Install outcome 1.3.0.post0 successful
   Install pyzmq 26.0.3 failed
   Install packaging 24.1 successful
   Install pillow 10.4.0 successful
   Install pandocfilters 1.5.1 successful
   Install parso 0.8.4 successful
   Install referencing 0.35.1 successful
   Install pytest-asyncio 0.23.8 successful
   Install partd 1.4.2 successful
   Install scipy 1.13.1 failed
   Install pathspec 0.12.1 successful
   Install pytest 8.3.1 successful
   Install pexpect 4.9.0 successful
   Install pims 0.7 successful
   Install platformdirs 4.2.2 successful
   Install pylint 3.2.6 successful
   Install pluggy 1.5.0 successful
   Install psutil 6.0.0 successful
   Install pycodestyle 2.12.0 successful
   Install sortedcontainers 2.4.0 successful
   Install prompt-toolkit 3.0.47 successful
   Install rpds-py 0.19.1 successful
   Install pytest-cov 5.0.0 successful
   Install python-dateutil 2.9.0.post0 successful
   Install six 1.16.0 successful
   Install pyproject-metadata 0.8.0 successful
   Install pytz 2024.1 successful
   Install pydata-sphinx-theme 0.15.4 successful
   Install sphinxcontrib-htmlhelp 2.0.6 successful
   Install tabulate 0.9.0 successful
   Install python-json-logger 2.0.7 successful
   Install pyinstrument 4.6.2 successful
   Install textual 0.73.0 successful
   Install sphinx-copybutton 0.5.2 successful
   Install tomlkit 0.13.0 successful
   Install rich 13.7.1 successful
   Install pythran 0.16.1 successful
   Install pyyaml 6.0.1 successful
   Install trio 0.26.0 successful
   Install requests 2.32.3 successful
   Install sniffio 1.3.1 successful
   Install stack-data 0.6.3 successful
   Install rfc3339-validator 0.1.4 successful
   Install rfc3986-validator 0.1.1 successful
   Install sphinxcontrib-applehelp 1.0.8 successful
   Install terminado 0.18.1 successful
   Install scikit-image 0.24.0 failed
   Install send2trash 1.8.3 successful
   Install simpleeval 0.9.13 successful
   Install sphinxcontrib-serializinghtml 1.1.10 successful
   Install slicerator 1.1.0 successful
   Install snowballstemmer 2.2.0 successful
   Install sqlalchemy 2.0.31 successful
   Install soupsieve 2.5 successful
   Install wcwidth 0.2.13 successful
   Install sphinx 7.4.7 successful
   Install websocket-client 1.8.0 successful
   Install toolz 0.12.1 successful
   Install traitlets 5.14.3 successful
   Install sphinxcontrib-devhelp 1.0.6 successful
   Install transonic 0.7.0 successful
   Install sphinxcontrib-jsmath 1.0.1 successful
   Install textual-dev 1.5.1 successful
   Install zipp 3.19.2 successful
   Install tifffile 2024.7.24 successful
   Install tinycss2 1.3.0 successful
   Install typing-extensions 4.12.2 successful
   Install sphinxcontrib-qthelp 1.0.8 successful
   Install uc-micro-py 1.0.3 successful
   Install tornado 6.4.1 successful
   Install uri-template 1.3.0 successful
   Install webencodings 0.5.1 successful
   Install webcolors 24.6.0 successful
   Install urllib3 2.2.2 successful
   Install types-python-dateutil 2.9.0.20240316 successful
   Install tzdata 2024.1 successful
   Install yarl 1.9.4 successful
   Install pyzmq 26.0.3 failed
   Install kiwisolver 1.4.5 failed
   Install h5py 3.11.0 failed
   Install pyfftw 0.14.0 failed
   Install cffi 1.16.0 failed
   Install matplotlib 3.9.1 failed
   Install scipy 1.13.1 failed
   Install pandas 2.2.2 failed
   Install scikit-image 0.24.0 failed
   Install numpy 2.0.1 failed
   Install contourpy 1.2.1 failed

ERRORS:
add pyzmq failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 402, in _call_hook
    raise BackendUnavailable(
    ...<4 lines>...
    )
pyproject_hooks._impl.BackendUnavailable: Cannot import 'scikit_build_core.build'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 86, in wrapper
    raise BuildError(str(e)) from e
pdm.exceptions.BuildError: Cannot import 'scikit_build_core.build'
add kiwisolver failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
    )
    ^
  File "/home/kai/Projects/fluidimage/.venv/lib/python3.13/site-packages/setuptools/build_meta.py", line 397, in _build_with_temp_dir
    self.run_setup()
    ~~~~~~~~~~~~~~^^
  File "/home/kai/Projects/fluidimage/.venv/lib/python3.13/site-packages/setuptools/build_meta.py", line 313, in run_setup
    exec(code, locals())
    ~~~~^^^^^^^^^^^^^^^^
  File "<string>", line 15, in <module>
RuntimeError: Missing setup required dependencies: cppy. Installing through pip as recommended ensure one never hits this issue.
add h5py failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Module 'Cython' is missing, please make sure it is specified in the 'build-system.requires' section. If it is 
not possible, add it to the project and use '--no-isolation' option.
Showing the last 10 lines of the build output:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/home/kai/Projects/fluidimage/.venv/lib/python3.13/site-packages/setuptools/dist.py", line 956, in run_command
    super().run_command(command)
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/home/kai/Projects/fluidimage/.venv/lib/python3.13/site-packages/setuptools/_distutils/dist.py", line 989, in run_command
    cmd_obj.run()
    ~~~~~~~~~~~^^
  File "/tmp/pdm-build-6tkklu1y/setup_build.py", line 128, in run
    from Cython import __version__ as cython_version
ModuleNotFoundError: No module named 'Cython'
add pyfftw failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Module 'numpy' is missing, please make sure it is specified in the 'build-system.requires' section. If it is not
possible, add it to the project and use '--no-isolation' option.
Showing the last 10 lines of the build output:
    ~~~~~~~~~~~~~~^^^^^^
  File "/home/kai/Projects/fluidimage/.venv/lib/python3.13/site-packages/setuptools/_distutils/command/build_ext.py", line 359, in run
    self.build_extensions()
    ~~~~~~~~~~~~~~~~~~~~~^^
  File "<string>", line 640, in build_extensions
  File "<string>", line 588, in make_sniffer
  File "<string>", line 572, in __init__
  File "<string>", line 171, in __init__
  File "<string>", line 90, in get_include_dirs
ModuleNotFoundError: No module named 'numpy'
add cffi failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
running build
running build_py
running build_ext
building '_cffi_backend' extension
cc -pthread -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -g -O3 -Wall -fPIC -fPIC -DFFI_BUILDING=1 -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE 
-I/usr/include/ffi -I/usr/include/libffi -I/home/kai/Projects/fluidimage/.venv/include 
-I/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/include/python3.13 -c src/c/_cffi_backend.c -o 
build/temp.linux-x86_64-cpython-313/src/c/_cffi_backend.o
src/c/_cffi_backend.c:15:10: fatal error: ffi.h: No such file or directory
   15 | #include <ffi.h>
      |          ^~~~~~~
compilation terminated.
error: command '/usr/bin/cc' failed with exit code 1
add matplotlib failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
The Meson build system
Version: 1.5.0
Source dir: /tmp/pdm-build-31lnetgt
Build dir: /tmp/pdm-build-31lnetgt/.mesonpy-16mw_iqw
Build type: native build
Program python3 found: YES (/home/kai/Projects/fluidimage/.venv/bin/python3)

../meson.build:4:11: ERROR: Command `/home/kai/Projects/fluidimage/.venv/bin/python3 -m setuptools_scm` failed with status 1.

A full log can be found at /tmp/pdm-build-31lnetgt/.mesonpy-16mw_iqw/meson-logs/meson-log.txt
add scipy failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
C linker for the host machine: cc ld.bfd 2.42
C++ compiler for the host machine: c++ (gcc 13.3.0 "c++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0")
C++ linker for the host machine: c++ ld.bfd 2.42

../meson.build:1:0: ERROR: Unknown compiler(s): [['cython'], ['cython3']]
The following exception(s) were encountered:
Running `cython -V` gave "[Errno 2] No such file or directory: 'cython'"
Running `cython3 -V` gave "[Errno 2] No such file or directory: 'cython3'"

A full log can be found at /tmp/pdm-build-4urbyc8e/.mesonpy-zik1ecsu/meson-logs/meson-log.txt
add pandas failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
+ meson setup /tmp/pdm-build-gkkjcf6w /tmp/pdm-build-gkkjcf6w/.mesonpy-nuc2w_2e -Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md --vsenv 
--native-file=/tmp/pdm-build-gkkjcf6w/.mesonpy-nuc2w_2e/meson-python-native-file.ini
The Meson build system
Version: 1.5.0
Source dir: /tmp/pdm-build-gkkjcf6w
Build dir: /tmp/pdm-build-gkkjcf6w/.mesonpy-nuc2w_2e
Build type: native build

../meson.build:5:13: ERROR: Command `/home/kai/Projects/fluidimage/.venv/bin/python /tmp/pdm-build-gkkjcf6w/generate_version.py --print` failed with status 1.

A full log can be found at /tmp/pdm-build-gkkjcf6w/.mesonpy-nuc2w_2e/meson-logs/meson-log.txt
add scikit-image failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
Host machine cpu family: x86_64
Host machine cpu: x86_64
Compiler for C supports arguments -Wno-unused-function: YES 
Library m found: YES
Checking if "-Wl,--version-script" : links: YES 
Program cython found: NO

../meson.build:59:9: ERROR: Program 'cython' not found or not executable

A full log can be found at /tmp/pdm-build-worsyebe/.mesonpy-btmpe_pn/meson-logs/meson-log.txt
add numpy failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
C linker for the host machine: cc ld.bfd 2.42
C++ compiler for the host machine: c++ (gcc 13.3.0 "c++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0")
C++ linker for the host machine: c++ ld.bfd 2.42

../meson.build:1:0: ERROR: Unknown compiler(s): [['cython'], ['cython3']]
The following exception(s) were encountered:
Running `cython -V` gave "[Errno 2] No such file or directory: 'cython'"
Running `cython3 -V` gave "[Errno 2] No such file or directory: 'cython3'"

A full log can be found at /tmp/pdm-build-d5qunklm/.mesonpy-sf25hauo/meson-logs/meson-log.txt
add contourpy failed:
Traceback (most recent call last):
  File "/home/kai/.local/share/uv/python/cpython-3.13.2-linux-x86_64-gnu/lib/python3.13/concurrent/futures/thread.py", line 59, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/synchronizers.py", line 29, in install_candidate
    self.manager.install(can)
    ~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/installers/manager.py", line 33, in install
    prepared.build(),
    ~~~~~~~~~~~~~~^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/models/candidates.py", line 417, in build
    self._cached = Path(builder.build(build_dir, metadata_directory=self._metadata_dir))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 84, in wrapper
    return func(*args, **kwargs)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/wheel.py", line 26, in build
    filename = self._hook.build_wheel(out_dir, self.config_settings, metadata_directory)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 256, in build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "build_wheel",
        ^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pyproject_hooks/_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 281, in subprocess_runner
    return log_subprocessor(cmd, cwd, extra_environ=env)
  File "/home/kai/.local/share/uv/tools/pdm/lib/python3.13/site-packages/pdm/builders/base.py", line 128, in log_subprocessor
    raise build_error(e) from None
pdm.exceptions.BuildError: Build backend raised error: Showing the last 10 lines of the build output:
Host machine cpu: x86_64
Program python found: YES (/home/kai/Projects/fluidimage/.venv/bin/python)
Found pkg-config: YES (/usr/bin/pkg-config) 1.8.1
pybind11-config found: NO
Found CMake: /usr/bin/cmake (3.28.3)
Run-time dependency pybind11 found: NO (tried pkgconfig, config-tool and cmake)

../meson.build:23:15: ERROR: Dependency "pybind11" not found, tried pkgconfig, config-tool and cmake

A full log can be found at /tmp/pdm-build-rxzar10f/.mesonpy-57djard7/meson-logs/meson-log.txt

  0:04:56  Some package operations failed. 11/11
See /home/kai/.local/state/pdm/log/pdm-install-79cbyo58.log for detailed debug log.
[InstallationError]: Some package operations failed.
WARNING: Add '-v' to see the detailed traceback

I've tried installing the packages inside the virtual environment (I don't want them installed globally), however then pdm removes them during the sync. Does this mean that I have to install them globally for pdm to find them?

Kai-Striega avatar May 11 '25 03:05 Kai-Striega

Thanks @Kai-Striega for looking at this!

PDM will never install things globally. No need to use PDM_IGNORE_ACTIVE_VENV. Just deactivate all virtual environment and use it. PDM is going to create a local venv for you. (Note that it is also UV's behavior.)

I don't know why PDM tries to build so many things. Numpy in particular. It might be because the lock file was a bit old and you use Python 3.13. I relocked to update the lock file so it might work better now.

You can try again with

hg pull
hg up default
rm -rf .venv
# deactivate all venvs
pdm sync --clean -v

I also update the documentation on building from source with PDM.

paugier avatar May 12 '25 08:05 paugier

Thanks @paugier. I've been able to build fluidimage and get the tests to pass. The problem with this is that I'm now testing fluidimage 0.5.4, not 0.5.3 - the version submitted for review. I'm not sure if that's going to be an issue (the code itself looks mostly the same).

With regards to a timeline for the review. I've got a few notes, but I'll need some time to actually collect them into a review. I'll try to get the draft done next weekend, and submit a full review the weekend after that. However, given how large the project is, it may take me an extra weekend.

Kai-Striega avatar May 17 '25 05:05 Kai-Striega

@paugier I've spent the last few hours going through this. I'll have the formal review by tomorrow. Before that, I've got a couple of questions for @cmarmo:

  1. Are we assuming to test with free threaded Python?
  2. I'm currently reviewing fluidimage 0.5.4, not the version that was submitted (0.5.3). Will this be a problem? AFAIK the differences are minimal - it's only that some changes have been made for me to build it more easily

Kai-Striega avatar Jun 07 '25 01:06 Kai-Striega

Thank you @Kai-Striega for all your work!

1. Are we assuming to test with free threaded Python?

Unless specific claims in the documentation about the behavior of the package under the free threaded compilation I would say no need for that ... For some reason the documentation is not accessible for me right now, so please forgive the vagueness of my answer...

2. I'm currently reviewing fluidimage 0.5.4, not the version that was submitted (0.5.3). Will this be a problem? AFAIK the differences are minimal - it's only that some changes have been made for me to build it more easily

Nope this is not an issue.

Also, I hope you don't mind I took the liberty to edit your answer pinging the author of the package.

cmarmo avatar Jun 07 '25 16:06 cmarmo

@Kai-Striega I've checked the documentation and there are no specific claims about compiling against free threaded cpython.

cmarmo avatar Jun 07 '25 16:06 cmarmo

Package Review

Please check off boxes as applicable, and elaborate in comments below. Your review is not limited to these topics, as described in the reviewer guide

  • [x] As the reviewer I confirm that there are no conflicts of interest for me to review this work (If you are unsure whether you are in conflict, please speak to your editor before starting your review).

Documentation

The package includes all the following forms of documentation:

  • [x] A statement of need clearly stating problems the software is designed to solve and its target audience in README.
  • [x] Installation instructions: for the development version of the package and any non-standard dependencies in README.
  • [ ] Vignette(s) demonstrating major functionality that runs successfully locally.
  • [ ] Function Documentation: for all user-facing functions.
  • [ ] Examples for all user-facing functions.
  • [x] Community guidelines including contribution guidelines in the README or CONTRIBUTING.
  • [x] Metadata including author(s), author e-mail(s), a url, and any other relevant metadata e.g., in a pyproject.toml file or elsewhere.

Readme file requirements The package meets the readme requirements below:

  • [x] Package has a README.md file in the root directory.

The README should include, from top to bottom:

  • [x] The package name
  • [ ] Badges for:
    • [x] Continuous integration and test coverage,
    • [x] Docs building (if you have a documentation website),
    • [ ] A repostatus.org badge,
    • [x] Python versions supported,
    • [x] Current package version (on PyPI / Conda).

NOTE: If the README has many more badges, you might want to consider using a table for badges: see this example. Such a table should be more wide than high. (Note that the a badge for pyOpenSci peer-review will be provided upon acceptance.)

  • [x] Short description of package goals.
  • [x] Package installation instructions
  • [x] Any additional setup required to use the package (authentication tokens, etc.)
  • [ ] Descriptive links to all vignettes. If the package is small, there may only be a need for one vignette which could be placed in the README.md file.
    • [ ] Brief demonstration of package usage (as it makes sense - links to vignettes could also suffice here if package description is clear)
  • [x] Link to your documentation website.
  • [x] If applicable, how the package compares to other similar packages and/or how it relates to other packages in the scientific ecosystem.
  • [ ] Citation information

Usability

Reviewers are encouraged to submit suggestions (or pull requests) that will improve the usability of the package as a whole. Package structure should follow general community best-practices. In general please consider whether:

  • [ ] Package documentation is clear and easy to find and use.
  • [x] The need for the package is clear
  • [ ] All functions have documentation and associated examples for use
  • [x] The package is easy to install

Functionality

  • [x] Installation: Installation succeeds as documented.
  • [x] Functionality: Any functional claims of the software been confirmed.
  • [x] Performance: Any performance claims of the software been confirmed.
  • [ ] Automated tests:
    • [x] All tests pass on the reviewer's local machine for the package version submitted by the author. Ideally this should be a tagged version making it easy for reviewers to install.
    • [ ] Tests cover essential functions of the package and a reasonable range of inputs and conditions.
  • [x] Continuous Integration: Has continuous integration setup (We suggest using Github actions but any CI platform is acceptable for review)
  • [x] Packaging guidelines: The package conforms to the pyOpenSci packaging guidelines. A few notable highlights to look at:
    • [x] Package supports modern versions of Python and not End of life versions.
    • [x] Code format is standard throughout package and follows PEP 8 guidelines (CI tests for linting pass)

For packages also submitting to JOSS

  • [ ] The package has an obvious research application according to JOSS's definition in their submission requirements.

Note: Be sure to check this carefully, as JOSS's submission requirements and scope differ from pyOpenSci's in terms of what types of packages are accepted.

The package contains a paper.md matching JOSS's requirements with:

  • [ ] A short summary describing the high-level functionality of the software
  • [ ] Authors: A list of authors with their affiliations
  • [ ] A statement of need clearly stating problems the software is designed to solve and its target audience.
  • [ ] References: With DOIs for all those that have one (e.g. papers, datasets, software).

Final approval (post-review)

  • [ ] The author has responded to my review and made changes to my satisfaction. I recommend approving this package.

Estimated hours spent reviewing: 10


Review Comments

The package author has obviously invested a significant amount of time and effort into this package. And it shows in the scale and complexity of the project. After having some initial issues building the project (due to myself not being experienced with pdm) I managed to get the test suite and benchmarks to run, in addition to playing around with some of the functionality locally. Talking about tests, they are interleaved with the source code, I usually prefer to have a distinct test/ directory, however that is a matter of preference.

Kai-Striega avatar Jun 10 '25 03:06 Kai-Striega