{"id":16589138,"url":"https://github.com/hanjinliu/napari-macrokit","last_synced_at":"2025-10-29T09:31:40.480Z","repository":{"id":65528689,"uuid":"592274808","full_name":"hanjinliu/napari-macrokit","owner":"hanjinliu","description":"Executable script generation for napari plugins","archived":false,"fork":false,"pushed_at":"2023-01-27T12:29:57.000Z","size":3038,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-02T00:31:45.352Z","etag":null,"topics":["napari","napari-plugin"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hanjinliu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2023-01-23T11:26:13.000Z","updated_at":"2024-03-04T09:39:03.000Z","dependencies_parsed_at":"2023-02-15T09:01:53.085Z","dependency_job_id":null,"html_url":"https://github.com/hanjinliu/napari-macrokit","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanjinliu%2Fnapari-macrokit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanjinliu%2Fnapari-macrokit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanjinliu%2Fnapari-macrokit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanjinliu%2Fnapari-macrokit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hanjinliu","download_url":"https://codeload.github.com/hanjinliu/napari-macrokit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238803209,"owners_count":19533269,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["napari","napari-plugin"],"created_at":"2024-10-11T23:07:55.120Z","updated_at":"2025-10-29T09:31:39.903Z","avatar_url":"https://github.com/hanjinliu.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# napari-macrokit\n\n[![License BSD-3](https://img.shields.io/pypi/l/napari-macrokit.svg?color=green)](https://github.com/hanjinliu/napari-macrokit/raw/main/LICENSE)\n[![PyPI](https://img.shields.io/pypi/v/napari-macrokit.svg?color=green)](https://pypi.org/project/napari-macrokit)\n[![Python Version](https://img.shields.io/pypi/pyversions/napari-macrokit.svg?color=green)](https://python.org)\n[![tests](https://github.com/hanjinliu/napari-macrokit/workflows/tests/badge.svg)](https://github.com/hanjinliu/napari-macrokit/actions)\n[![codecov](https://codecov.io/gh/hanjinliu/napari-macrokit/branch/main/graph/badge.svg)](https://codecov.io/gh/hanjinliu/napari-macrokit)\n[![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-macrokit)](https://napari-hub.org/plugins/napari-macrokit)\n\nExecutable script generation for napari plugins.\n\n![](https://github.com/hanjinliu/napari-macrokit/blob/main/images/example.gif)\n\u0026uarr; [Example](https://github.com/hanjinliu/napari-macrokit/blob/main/examples/regionprops.py) showing the real-time recording of GUI operation.\n\nThis napari plugin aims at making image analysis reproducible with arbitrary input/output types.\n\n## Usage\n\nCreate a macro object, decorate functions with `record` method and run!\n\n```python\nfrom napari_macrokit import get_macro\n\nmacro = get_macro(\"my-plugin-specifier\")  # get macro object\n\n# define a function\n@macro.record\ndef add(a: float, b: float) -\u003e float:\n    return a + b\n\n# run\nresult = add(3.2, 5.4)\nadd(result, 1.0)\n\nmacro\n\n# Out:\n# \u003e\u003e\u003e float0 = add(3.2, 5.4)\n# \u003e\u003e\u003e float1 = add(float0, 1.0)\n```\n\n## Record GUI Operations\n\nYou can use recordable functions in your widgets to keep tracks of GUI operations.\nMore simply, you can double-decorate functions with `record` and `magicgui`.\n\n```python\nimport numpy as np\nfrom magicgui import magicgui\nimport napari\nfrom napari.types import ImageData\nfrom napari_macrokit import get_macro\n\nmacro = get_macro(\"my-plugin-specifier\")  # get macro object\n\n# define recordable magicgui\n@magicgui\n@macro.record\ndef add(image: ImageData, b: float) -\u003e ImageData:\n    return image + b\n\nviewer = napari.Viewer()  # launch a viewer\nviewer.add_image(np.random.random((100, 100)))  # image data\nviewer.window.add_dock_widget(add)  # add magicgui to the viewer\n```\n\nRunning add twice in GUI and you'll find macro updated like below.\n\n```python\nmacro\n# Out\n# \u003e\u003e\u003e image0 = add(viewer.layers['Image'].data, 0.06)\n# \u003e\u003e\u003e image1 = add(image0, 0.12)\n```\n\n## Combining Plugins\n\nSuppose you have two modules that use `napari-macrokit`.\n\n```python\n# napari_module_0.py\n\nfrom napari.types import ImageData\nfrom scipy import ndimage as ndi\nfrom napari_macrokit import get_macro\n\nmacro = get_macro(\"napari-module-0\")\n\n@macro.record\ndef gaussian_filter(image: ImageData, sigma: float) -\u003e ImageData:\n    return ndi.gaussian_filter(image, sigma=sigma)\n\n@macro.record\ndef threshold(image: ImageData, value: float) -\u003e ImageData:\n    return image \u003e value\n```\n\n```python\n# napari_module_1.py\n\nfrom napari.types import ImageData\nimport numpy as np\nfrom napari_macrokit import get_macro\nmacro = get_macro(\"napari-module-1\")\n\n@macro.record\ndef estimate_background(image: ImageData) -\u003e float:\n    return np.percentile(image, 10.0)\n\n```\n\nYou can use functions from both modules to build an analysis workflow by collecting existing macro objects with `collect_macro` function. All the recordable actions in the modules will also be recorded to the returned macro object.\n\n```python\nimport numpy as np\nfrom napari_macrokit import collect_macro\nfrom napari_module_0 import gaussian_filter, threshold\nfrom napari_module_1 import estimate_background\n\n# global_macro will record all the macro available at this point\nglobal_macro = collect_macro()\n\n# start image analysis!\nimage = np.random.random((100, 100))\n\nout = gaussian_filter(image, 2.0)\nthresh = estimate_background(out)\nbinary = threshold(out, thresh)\n\nmacro\n# Out\n# \u003e\u003e\u003e image0 = gaussian_filter(arr0, 2.0)\n# \u003e\u003e\u003e float0 = estimate_background(image0)\n# \u003e\u003e\u003e image1 = threshold(image1, float0)\n```\n\n---------------------------------\n\nThis [napari] plugin was generated with [Cookiecutter] using [@napari]'s [cookiecutter-napari-plugin] template.\n\n## Installation\n\nYou can install `napari-macrokit` via [pip]:\n\n    pip install napari-macrokit\n\n\n\nTo install latest development version :\n\n    pip install git+https://github.com/hanjinliu/napari-macrokit.git\n\n\n## Contributing\n\nContributions are very welcome. Tests can be run with [tox], please ensure\nthe coverage at least stays the same before you submit a pull request.\n\n## License\n\nDistributed under the terms of the [BSD-3] license,\n\"napari-macrokit\" is free and open source software\n\n## Issues\n\nIf you encounter any problems, please [file an issue] along with a detailed description.\n\n[napari]: https://github.com/napari/napari\n[Cookiecutter]: https://github.com/audreyr/cookiecutter\n[@napari]: https://github.com/napari\n[MIT]: http://opensource.org/licenses/MIT\n[BSD-3]: http://opensource.org/licenses/BSD-3-Clause\n[GNU GPL v3.0]: http://www.gnu.org/licenses/gpl-3.0.txt\n[GNU LGPL v3.0]: http://www.gnu.org/licenses/lgpl-3.0.txt\n[Apache Software License 2.0]: http://www.apache.org/licenses/LICENSE-2.0\n[Mozilla Public License 2.0]: https://www.mozilla.org/media/MPL/2.0/index.txt\n[cookiecutter-napari-plugin]: https://github.com/napari/cookiecutter-napari-plugin\n\n[file an issue]: https://github.com/hanjinliu/napari-macrokit/issues\n\n[napari]: https://github.com/napari/napari\n[tox]: https://tox.readthedocs.io/en/latest/\n[pip]: https://pypi.org/project/pip/\n[PyPI]: https://pypi.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhanjinliu%2Fnapari-macrokit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhanjinliu%2Fnapari-macrokit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhanjinliu%2Fnapari-macrokit/lists"}