{"@attributes":{"version":"2.0"},"channel":{"title":"ISciNumPy.dev","link":"https:\/\/iscinumpy.dev\/","description":"Recent content on ISciNumPy.dev","generator":"Hugo","language":"en-us","managingEditor":"henryfs@princeton.edu (Henry Schreiner)","webMaster":"henryfs@princeton.edu (Henry Schreiner)","item":[{"title":"\ud83c\udfa1 cibuildwheel 4.0","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-4-0-0\/","pubDate":"Sun, 07 Jun 2026 12:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-4-0-0\/","description":"<p><a href=\"https:\/\/cibuildwheel.pypa.io\">cibuildwheel<\/a> 4.0.0 is out, with some very big additions. We&rsquo;ve added\n<a href=\"https:\/\/peps.python.org\/pep-0783\">pyemscripten<\/a> 3.13 wheels (uploadable to PyPI!), Python 3.15 (and 3.15t)\nbetas, and much more! We&rsquo;ve got a new stage: <code>audit<\/code>, which applies\n<a href=\"https:\/\/github.com\/pypa\/abi3audit\"><code>abi3audit<\/code><\/a> to stable ABI wheels. We now default to running\n<a href=\"https:\/\/github.com\/adang1345\/delvewheel\">delvewheel<\/a> to repair Windows wheels. We now have <code>{project}<\/code> and <code>{package}<\/code>\nplaceholders for <code>config-settings<\/code>, and we set <code>CIBUILDWHEEL_BUILD_IDENTIFIER<\/code>\nin the build step. We&rsquo;ve also made some nice Android improvements. We&rsquo;ve removed\nsupport for Python 3.8, Python 3.13t, GraalPy 3.11, and Cirrus CI.<\/p>"},{"title":"My Projects","link":"https:\/\/iscinumpy.dev\/page\/projects\/","pubDate":"Sun, 17 May 2026 10:00:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/projects\/","description":"<div class=\"tabs-shortcode\" id=\"tabs-1\" data-tabs-group=\"tabs-auto-1\">\n <ul class=\"nav nav-tabs\" id=\"tabs-1-tablist\" role=\"tablist\"><li class=\"nav-item\" role=\"presentation\">\n <button\n class=\"nav-link active\"\n id=\"tabs-auto-1-pane-1-tab\"\n type=\"button\"\n role=\"tab\"\n data-bs-toggle=\"tab\"\n data-bs-target=\"#tabs-auto-1-pane-1\"\n aria-controls=\"tabs-auto-1-pane-1\"\n aria-selected=\"true\">Overview<\/button>\n <\/li><li class=\"nav-item\" role=\"presentation\">\n <button\n class=\"nav-link\"\n id=\"tabs-auto-1-pane-2-tab\"\n type=\"button\"\n role=\"tab\"\n data-bs-toggle=\"tab\"\n data-bs-target=\"#tabs-auto-1-pane-2\"\n aria-controls=\"tabs-auto-1-pane-2\"\n aria-selected=\"false\">Tooling<\/button>\n <\/li><\/ul>\n\n <div class=\"tab-content\" id=\"tabs-1-content\">\n <div\n class=\"tab-pane fade show active\"\n id=\"tabs-auto-1-pane-1\"\n role=\"tabpanel\"\n aria-labelledby=\"tabs-auto-1-pane-1-tab\"\n tabindex=\"0\"><div class=\"project-table-wrapper\">\n<table class=\"project-table\">\n <thead>\n <tr><th data-sort=\"name\">Name<\/th><th class=\"col-data\" data-sort=\"downloads\">Downloads<\/th><th class=\"col-data\">Version<\/th><th class=\"col-data\" data-sort=\"date\">Release<\/th><th class=\"col-data\" data-sort=\"date\">Last Commit<\/th><th class=\"col-data\" data-sort=\"stars\">Stars<\/th><\/tr>\n <\/thead>\n <tbody>\n<tr data-project=\"pypa\/packaging\">\n <td><a href=\"https:\/\/github.com\/pypa\/packaging\">packaging<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"63656528\">\n <a href=\"https:\/\/pepy.tech\/projects\/packaging\"><span class=\"badge badge-green\">1,909,695,846\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/packaging\"><span class=\"badge badge-blue\">26.2<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777061722\"><a href=\"https:\/\/pypi.org\/project\/packaging\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-24T20:15:22Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780841307\"><a href=\"https:\/\/github.com\/pypa\/packaging\/commits\"><span class=\"badge badge-green has-tip\">4 hours ago<span class=\"tip\">2026-06-07T14:08:27Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"732\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pypa\/packaging\/stargazers\">732<\/a> <a href=\"https:\/\/www.star-history.com\/#pypa\/packaging\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pypa\/cibuildwheel\">\n <td><a href=\"https:\/\/github.com\/pypa\/cibuildwheel\">cibuildwheel<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"25797\">\n <a href=\"https:\/\/pepy.tech\/projects\/cibuildwheel\"><span class=\"badge badge-green\">773,926\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/cibuildwheel\"><span class=\"badge badge-blue\">3.4.1<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1775138339\"><a href=\"https:\/\/pypi.org\/project\/cibuildwheel\/#history\"><span class=\"badge badge-green has-tip\">2 months ago<span class=\"tip\">2026-04-02T13:58:59Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780856671\"><a href=\"https:\/\/github.com\/pypa\/cibuildwheel\/commits\"><span class=\"badge badge-green has-tip\">14 minutes ago<span class=\"tip\">2026-06-07T18:24:31Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"2238\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pypa\/cibuildwheel\/stargazers\">2,238<\/a> <a href=\"https:\/\/www.star-history.com\/#pypa\/cibuildwheel\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pypa\/build\">\n <td><a href=\"https:\/\/github.com\/pypa\/build\">build<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"4984749\">\n <a href=\"https:\/\/pepy.tech\/projects\/build\"><span class=\"badge badge-green\">149,542,475\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/build\"><span class=\"badge badge-blue\">1.5.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777519103\"><a href=\"https:\/\/pypi.org\/project\/build\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-30T03:18:23Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780756758\"><a href=\"https:\/\/github.com\/pypa\/build\/commits\"><span class=\"badge badge-green has-tip\">1 day ago<span class=\"tip\">2026-06-06T14:39:18Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"847\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pypa\/build\/stargazers\">847<\/a> <a href=\"https:\/\/www.star-history.com\/#pypa\/build\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pypa\/pipx\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/pypa\/pipx\">pipx<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"216631\">\n <a href=\"https:\/\/pepy.tech\/projects\/pipx\"><span class=\"badge badge-green\">6,498,947\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/pipx\"><span class=\"badge badge-blue\">1.14.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780550693\"><a href=\"https:\/\/pypi.org\/project\/pipx\/#history\"><span class=\"badge badge-green has-tip\">3 days ago<span class=\"tip\">2026-06-04T05:24:53Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780646045\"><a href=\"https:\/\/github.com\/pypa\/pipx\/commits\"><span class=\"badge badge-green has-tip\">2 days ago<span class=\"tip\">2026-06-05T07:54:05Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"12827\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pypa\/pipx\/stargazers\">12,827<\/a> <a href=\"https:\/\/www.star-history.com\/#pypa\/pipx\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pypa\/dependency-groups\">\n <td><a href=\"https:\/\/github.com\/pypa\/dependency-groups\">dependency-groups<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"215559\">\n <a href=\"https:\/\/pepy.tech\/projects\/dependency-groups\"><span class=\"badge badge-green\">6,466,796\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/dependency-groups\"><span class=\"badge badge-blue\">1.3.1<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1746146067\"><a href=\"https:\/\/pypi.org\/project\/dependency-groups\/#history\"><span class=\"badge badge-red has-tip\">1 year ago<span class=\"tip\">2025-05-02T00:34:27Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779762533\"><a href=\"https:\/\/github.com\/pypa\/dependency-groups\/commits\"><span class=\"badge badge-green has-tip\">12 days ago<span class=\"tip\">2026-05-26T02:28:53Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"14\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pypa\/dependency-groups\/stargazers\">14<\/a> <a href=\"https:\/\/www.star-history.com\/#pypa\/dependency-groups\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pypa\/pyproject-metadata\">\n <td><a href=\"https:\/\/github.com\/pypa\/pyproject-metadata\">pyproject-metadata<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"534496\">\n <a href=\"https:\/\/pepy.tech\/projects\/pyproject-metadata\"><span class=\"badge badge-green\">16,034,904\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/pyproject-metadata\"><span class=\"badge badge-blue\">0.11.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1770664369\"><a href=\"https:\/\/pypi.org\/project\/pyproject-metadata\/#history\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-02-09T19:12:49Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779976488\"><a href=\"https:\/\/github.com\/pypa\/pyproject-metadata\/commits\"><span class=\"badge badge-green has-tip\">10 days ago<span class=\"tip\">2026-05-28T13:54:48Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"44\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pypa\/pyproject-metadata\/stargazers\">44<\/a> <a href=\"https:\/\/www.star-history.com\/#pypa\/pyproject-metadata\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-build\/scikit-build-core\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/scikit-build-core\">scikit-build-core<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"348033\">\n <a href=\"https:\/\/pepy.tech\/projects\/scikit-build-core\"><span class=\"badge badge-green\">10,440,991\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/scikit-build-core\"><span class=\"badge badge-blue\">0.12.2<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1772735156\"><a href=\"https:\/\/pypi.org\/project\/scikit-build-core\/#history\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-03-05T18:25:56Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780447955\"><a href=\"https:\/\/github.com\/scikit-build\/scikit-build-core\/commits\"><span class=\"badge badge-green has-tip\">4 days ago<span class=\"tip\">2026-06-03T00:52:35Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"472\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-build\/scikit-build-core\/stargazers\">472<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-build\/scikit-build-core\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-build\/scikit-build\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/scikit-build\">scikit-build<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"42036\">\n <a href=\"https:\/\/pepy.tech\/projects\/scikit-build\"><span class=\"badge badge-green\">1,261,103\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/scikit-build\"><span class=\"badge badge-blue\">0.19.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1772554814\"><a href=\"https:\/\/pypi.org\/project\/scikit-build\/#history\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-03-03T16:20:14Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777924749\"><a href=\"https:\/\/github.com\/scikit-build\/scikit-build\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-05-04T19:59:09Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"534\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-build\/scikit-build\/stargazers\">534<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-build\/scikit-build\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-build\/cmake-python-distributions\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\">cmake (on PyPI)<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"632009\">\n <a href=\"https:\/\/pepy.tech\/projects\/cmake\"><span class=\"badge badge-green\">18,960,297\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/cmake\"><span class=\"badge badge-blue\">4.3.2<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1776981016\"><a href=\"https:\/\/pypi.org\/project\/cmake\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-23T21:50:16Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779458570\"><a href=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\/commits\"><span class=\"badge badge-green has-tip\">16 days ago<span class=\"tip\">2026-05-22T14:02:50Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"134\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\/stargazers\">134<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-build\/cmake-python-distributions\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-build\/ninja-python-distributions\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\">ninja (on PyPI)<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"1070821\">\n <a href=\"https:\/\/pepy.tech\/projects\/ninja\"><span class=\"badge badge-green\">32,124,642\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/ninja\"><span class=\"badge badge-blue\">1.13.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1754924990\"><a href=\"https:\/\/pypi.org\/project\/ninja\/#history\"><span class=\"badge badge-yellow has-tip\">10 months ago<span class=\"tip\">2025-08-11T15:09:50Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777440595\"><a href=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-29T05:29:55Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"88\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\/stargazers\">88<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-build\/ninja-python-distributions\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-build\/moderncmakedomain\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\">moderncmakedomain<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"656\">\n <a href=\"https:\/\/pepy.tech\/projects\/sphinxcontrib-moderncmakedomain\"><span class=\"badge badge-green\">19,698\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/sphinxcontrib-moderncmakedomain\"><span class=\"badge badge-blue\">3.29.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1716351295\"><a href=\"https:\/\/pypi.org\/project\/sphinxcontrib-moderncmakedomain\/#history\"><span class=\"badge badge-red has-tip\">2 years ago<span class=\"tip\">2024-05-22T04:14:55Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1776030027\"><a href=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-12T21:40:27Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"32\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\/stargazers\">32<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-build\/moderncmakedomain\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"wntrblm\/nox\">\n <td><a href=\"https:\/\/github.com\/wntrblm\/nox\">nox<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"182578\">\n <a href=\"https:\/\/pepy.tech\/projects\/nox\"><span class=\"badge badge-green\">5,477,360\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/nox\"><span class=\"badge badge-blue\">2026.4.10<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1775842960\"><a href=\"https:\/\/pypi.org\/project\/nox\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-10T17:42:40Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777265505\"><a href=\"https:\/\/github.com\/wntrblm\/nox\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-27T04:51:45Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1522\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/wntrblm\/nox\/stargazers\">1,522<\/a> <a href=\"https:\/\/www.star-history.com\/#wntrblm\/nox\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"abravalheri\/validate-pyproject\">\n <td><a href=\"https:\/\/github.com\/abravalheri\/validate-pyproject\">validate-pyproject<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"8182\">\n <a href=\"https:\/\/pepy.tech\/projects\/validate-pyproject\"><span class=\"badge badge-green\">245,475\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/validate-pyproject\"><span class=\"badge badge-blue\">0.25<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1770053465\"><a href=\"https:\/\/pypi.org\/project\/validate-pyproject\/#history\"><span class=\"badge badge-green has-tip\">4 months ago<span class=\"tip\">2026-02-02T17:31:05Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780332806\"><a href=\"https:\/\/github.com\/abravalheri\/validate-pyproject\/commits\"><span class=\"badge badge-green has-tip\">6 days ago<span class=\"tip\">2026-06-01T16:53:26Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"207\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/abravalheri\/validate-pyproject\/stargazers\">207<\/a> <a href=\"https:\/\/www.star-history.com\/#abravalheri\/validate-pyproject\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"henryiii\/validate-pyproject-schema-store\">\n <td><a href=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\">validate-pyproject-schema-store<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"2261\">\n <a href=\"https:\/\/pepy.tech\/projects\/validate-pyproject-schema-store\"><span class=\"badge badge-green\">67,857\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/validate-pyproject-schema-store\"><span class=\"badge badge-blue\">2026.5.28<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779968999\"><a href=\"https:\/\/pypi.org\/project\/validate-pyproject-schema-store\/#history\"><span class=\"badge badge-green has-tip\">10 days ago<span class=\"tip\">2026-05-28T11:49:59Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779968936\"><a href=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\/commits\"><span class=\"badge badge-green has-tip\">10 days ago<span class=\"tip\">2026-05-28T11:48:56Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"6\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\/stargazers\">6<\/a> <a href=\"https:\/\/www.star-history.com\/#henryiii\/validate-pyproject-schema-store\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pybind\/pybind11\">\n <td><a href=\"https:\/\/github.com\/pybind\/pybind11\">pybind11<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"875363\">\n <a href=\"https:\/\/pepy.tech\/projects\/pybind11\"><span class=\"badge badge-green\">26,260,903\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/pybind11\"><span class=\"badge badge-blue\">3.0.4<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1776568094\"><a href=\"https:\/\/pypi.org\/project\/pybind11\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-19T03:08:14Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780769205\"><a href=\"https:\/\/github.com\/pybind\/pybind11\/commits\"><span class=\"badge badge-green has-tip\">1 day ago<span class=\"tip\">2026-06-06T18:06:45Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"17896\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pybind\/pybind11\/stargazers\">17,896<\/a> <a href=\"https:\/\/www.star-history.com\/#pybind\/pybind11\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pybind\/python_example\">\n <td><a href=\"https:\/\/github.com\/pybind\/python_example\">pybind\/python_example<\/a><\/td><td class=\"col-data\"><\/td><td class=\"col-data\"><\/td><td class=\"col-data\" data-value=\"0\"><\/td><td class=\"col-data\" data-value=\"1780673967\"><a href=\"https:\/\/github.com\/pybind\/python_example\/commits\"><span class=\"badge badge-green has-tip\">2 days ago<span class=\"tip\">2026-06-05T15:39:27Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"531\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pybind\/python_example\/stargazers\">531<\/a> <a href=\"https:\/\/www.star-history.com\/#pybind\/python_example\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pybind\/scikit_build_example\">\n <td><a href=\"https:\/\/github.com\/pybind\/scikit_build_example\">pybind\/scikit_build_example<\/a><\/td><td class=\"col-data\"><\/td><td class=\"col-data\"><\/td><td class=\"col-data\" data-value=\"0\"><\/td><td class=\"col-data\" data-value=\"1780724271\"><a href=\"https:\/\/github.com\/pybind\/scikit_build_example\/commits\"><span class=\"badge badge-green has-tip\">1 day ago<span class=\"tip\">2026-06-06T05:37:51Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"145\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pybind\/scikit_build_example\/stargazers\">145<\/a> <a href=\"https:\/\/www.star-history.com\/#pybind\/scikit_build_example\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"mesonbuild\/meson-python\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/mesonbuild\/meson-python\">meson-python<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"575678\">\n <a href=\"https:\/\/pepy.tech\/projects\/meson-python\"><span class=\"badge badge-green\">17,270,368\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/meson-python\"><span class=\"badge badge-blue\">0.19.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1768485163\"><a href=\"https:\/\/pypi.org\/project\/meson-python\/#history\"><span class=\"badge badge-green has-tip\">4 months ago<span class=\"tip\">2026-01-15T13:52:43Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1772486862\"><a href=\"https:\/\/github.com\/mesonbuild\/meson-python\/commits\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-03-02T21:27:42Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"179\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/mesonbuild\/meson-python\/stargazers\">179<\/a> <a href=\"https:\/\/www.star-history.com\/#mesonbuild\/meson-python\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/boost-histogram\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\">boost-histogram<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"131756\">\n <a href=\"https:\/\/pepy.tech\/projects\/boost-histogram\"><span class=\"badge badge-green\">3,952,692\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/boost-histogram\"><span class=\"badge badge-blue\">1.7.2<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1775873914\"><a href=\"https:\/\/pypi.org\/project\/boost-histogram\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-11T02:18:34Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780353156\"><a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\/commits\"><span class=\"badge badge-green has-tip\">5 days ago<span class=\"tip\">2026-06-01T22:32:36Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"162\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\/stargazers\">162<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/boost-histogram\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/hist\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/hist\">hist<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"125491\">\n <a href=\"https:\/\/pepy.tech\/projects\/hist\"><span class=\"badge badge-green\">3,764,747\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/hist\"><span class=\"badge badge-blue\">2.10.1<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1770309843\"><a href=\"https:\/\/pypi.org\/project\/hist\/#history\"><span class=\"badge badge-green has-tip\">4 months ago<span class=\"tip\">2026-02-05T16:44:03Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1778190150\"><a href=\"https:\/\/github.com\/scikit-hep\/hist\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-05-07T21:42:30Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"139\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/hist\/stargazers\">139<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/hist\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/uhi\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/uhi\">uhi<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"124238\">\n <a href=\"https:\/\/pepy.tech\/projects\/uhi\"><span class=\"badge badge-green\">3,727,169\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/uhi\"><span class=\"badge badge-blue\">1.1.1<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777177324\"><a href=\"https:\/\/pypi.org\/project\/uhi\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-26T04:22:04Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1777994266\"><a href=\"https:\/\/github.com\/scikit-hep\/uhi\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-05-05T15:17:46Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"21\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/uhi\/stargazers\">21<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/uhi\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/vector\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/vector\">vector<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"6778\">\n <a href=\"https:\/\/pepy.tech\/projects\/vector\"><span class=\"badge badge-green\">203,368\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/vector\"><span class=\"badge badge-blue\">1.8.1<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779373750\"><a href=\"https:\/\/pypi.org\/project\/vector\/#history\"><span class=\"badge badge-green has-tip\">17 days ago<span class=\"tip\">2026-05-21T14:29:10Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780377357\"><a href=\"https:\/\/github.com\/scikit-hep\/vector\/commits\"><span class=\"badge badge-green has-tip\">5 days ago<span class=\"tip\">2026-06-02T05:15:57Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"99\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/vector\/stargazers\">99<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/vector\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/uproot-browser\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/uproot-browser\">uproot-browser<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"5\">\n <a href=\"https:\/\/pepy.tech\/projects\/uproot-browser\"><span class=\"badge badge-green\">179\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/uproot-browser\"><span class=\"badge badge-blue\">0.8.4<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1753987106\"><a href=\"https:\/\/pypi.org\/project\/uproot-browser\/#history\"><span class=\"badge badge-yellow has-tip\">10 months ago<span class=\"tip\">2025-07-31T18:38:26Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1776054290\"><a href=\"https:\/\/github.com\/scikit-hep\/uproot-browser\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-13T04:24:50Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"76\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/uproot-browser\/stargazers\">76<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/uproot-browser\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/particle\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/particle\">particle<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"121370\">\n <a href=\"https:\/\/pepy.tech\/projects\/particle\"><span class=\"badge badge-green\">3,641,105\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/particle\"><span class=\"badge badge-blue\">0.26.2<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1776367783\"><a href=\"https:\/\/pypi.org\/project\/particle\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-16T19:29:43Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780483631\"><a href=\"https:\/\/github.com\/scikit-hep\/particle\/commits\"><span class=\"badge badge-green has-tip\">4 days ago<span class=\"tip\">2026-06-03T10:47:11Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"164\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/particle\/stargazers\">164<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/particle\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scikit-hep\/DecayLanguage\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\">DecayLanguage<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"128\">\n <a href=\"https:\/\/pepy.tech\/projects\/decaylanguage\"><span class=\"badge badge-green\">3,850\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/decaylanguage\"><span class=\"badge badge-blue\">0.20.4<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1776356977\"><a href=\"https:\/\/pypi.org\/project\/decaylanguage\/#history\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-16T16:29:37Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780380139\"><a href=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\/commits\"><span class=\"badge badge-green has-tip\">5 days ago<span class=\"tip\">2026-06-02T06:02:19Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"44\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\/stargazers\">44<\/a> <a href=\"https:\/\/www.star-history.com\/#scikit-hep\/DecayLanguage\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scientific-python\/repo-review\">\n <td><a href=\"https:\/\/github.com\/scientific-python\/repo-review\">repo-review<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"418\">\n <a href=\"https:\/\/pepy.tech\/projects\/repo-review\"><span class=\"badge badge-green\">12,558\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/repo-review\"><span class=\"badge badge-blue\">1.1.3<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779983329\"><a href=\"https:\/\/pypi.org\/project\/repo-review\/#history\"><span class=\"badge badge-green has-tip\">10 days ago<span class=\"tip\">2026-05-28T15:48:49Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1779983202\"><a href=\"https:\/\/github.com\/scientific-python\/repo-review\/commits\"><span class=\"badge badge-green has-tip\">10 days ago<span class=\"tip\">2026-05-28T15:46:42Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"87\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scientific-python\/repo-review\/stargazers\">87<\/a> <a href=\"https:\/\/www.star-history.com\/#scientific-python\/repo-review\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"scientific-python\/cookie\">\n <td><a href=\"https:\/\/github.com\/scientific-python\/cookie\">cookie<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"168\">\n <a href=\"https:\/\/pepy.tech\/projects\/sp-repo-review\"><span class=\"badge badge-green\">5,061\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/sp-repo-review\"><span class=\"badge badge-blue\">2026.4.4<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1775240561\"><a href=\"https:\/\/pypi.org\/project\/sp-repo-review\/#history\"><span class=\"badge badge-green has-tip\">2 months ago<span class=\"tip\">2026-04-03T18:22:41Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780543844\"><a href=\"https:\/\/github.com\/scientific-python\/cookie\/commits\"><span class=\"badge badge-green has-tip\">3 days ago<span class=\"tip\">2026-06-04T03:30:44Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"398\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/scientific-python\/cookie\/stargazers\">398<\/a> <a href=\"https:\/\/www.star-history.com\/#scientific-python\/cookie\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"tomerfiliba\/plumbum\">\n <td><a href=\"https:\/\/github.com\/tomerfiliba\/plumbum\">plumbum<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"160572\">\n <a href=\"https:\/\/pepy.tech\/projects\/plumbum\"><span class=\"badge badge-green\">4,817,163\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/plumbum\"><span class=\"badge badge-blue\">2.0.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780535437\"><a href=\"https:\/\/pypi.org\/project\/plumbum\/#history\"><span class=\"badge badge-green has-tip\">3 days ago<span class=\"tip\">2026-06-04T01:10:37Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780547504\"><a href=\"https:\/\/github.com\/tomerfiliba\/plumbum\/commits\"><span class=\"badge badge-green has-tip\">3 days ago<span class=\"tip\">2026-06-04T04:31:44Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"3046\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/tomerfiliba\/plumbum\/stargazers\">3,046<\/a> <a href=\"https:\/\/www.star-history.com\/#tomerfiliba\/plumbum\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"henryiii\/flake8-errmsg\">\n <td><a href=\"https:\/\/github.com\/henryiii\/flake8-errmsg\">flake8-errmsg<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"1349\">\n <a href=\"https:\/\/pepy.tech\/projects\/flake8-errmsg\"><span class=\"badge badge-green\">40,497\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/flake8-errmsg\"><span class=\"badge badge-blue\">0.6.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1756782217\"><a href=\"https:\/\/pypi.org\/project\/flake8-errmsg\/#history\"><span class=\"badge badge-yellow has-tip\">9 months ago<span class=\"tip\">2025-09-02T03:03:37Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1775971185\"><a href=\"https:\/\/github.com\/henryiii\/flake8-errmsg\/commits\"><span class=\"badge badge-green has-tip\">1 month ago<span class=\"tip\">2026-04-12T05:19:45Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"17\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/henryiii\/flake8-errmsg\/stargazers\">17<\/a> <a href=\"https:\/\/www.star-history.com\/#henryiii\/flake8-errmsg\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"henryiii\/flake8-lazy\">\n <td><a href=\"https:\/\/github.com\/henryiii\/flake8-lazy\">flake8-lazy<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"33\">\n <a href=\"https:\/\/pepy.tech\/projects\/flake8-lazy\"><span class=\"badge badge-green\">1,016\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/flake8-lazy\"><span class=\"badge badge-blue\">0.8.1<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780330064\"><a href=\"https:\/\/pypi.org\/project\/flake8-lazy\/#history\"><span class=\"badge badge-green has-tip\">6 days ago<span class=\"tip\">2026-06-01T16:07:44Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780328867\"><a href=\"https:\/\/github.com\/henryiii\/flake8-lazy\/commits\"><span class=\"badge badge-green has-tip\">6 days ago<span class=\"tip\">2026-06-01T15:47:47Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"18\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/henryiii\/flake8-lazy\/stargazers\">18<\/a> <a href=\"https:\/\/www.star-history.com\/#henryiii\/flake8-lazy\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"henryiii\/check-sdist\">\n <td><a href=\"https:\/\/github.com\/henryiii\/check-sdist\">check-sdist<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"382\">\n <a href=\"https:\/\/pepy.tech\/projects\/check-sdist\"><span class=\"badge badge-green\">11,465\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/check-sdist\"><span class=\"badge badge-blue\">1.4.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1772571363\"><a href=\"https:\/\/pypi.org\/project\/check-sdist\/#history\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-03-03T20:56:03Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780343539\"><a href=\"https:\/\/github.com\/henryiii\/check-sdist\/commits\"><span class=\"badge badge-green has-tip\">5 days ago<span class=\"tip\">2026-06-01T19:52:19Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"12\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/henryiii\/check-sdist\/stargazers\">12<\/a> <a href=\"https:\/\/www.star-history.com\/#henryiii\/check-sdist\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"pytest-dev\/pytest-github-actions-annotate-failures\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\">pytest GHA annotate-failures<\/a><\/td><td class=\"dl-cell col-data\" data-value=\"103650\">\n <a href=\"https:\/\/pepy.tech\/projects\/pytest-github-actions-annotate-failures\"><span class=\"badge badge-green\">3,109,515\/mo<\/span><\/a>\n <\/td><td class=\"col-data\"><a href=\"https:\/\/pypi.org\/project\/pytest-github-actions-annotate-failures\"><span class=\"badge badge-blue\">0.4.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1772477859\"><a href=\"https:\/\/pypi.org\/project\/pytest-github-actions-annotate-failures\/#history\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-03-02T18:57:39Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1778871505\"><a href=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\/commits\"><span class=\"badge badge-green has-tip\">22 days ago<span class=\"tip\">2026-05-15T18:58:25Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"178\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\/stargazers\">178<\/a> <a href=\"https:\/\/www.star-history.com\/#pytest-dev\/pytest-github-actions-annotate-failures\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"goofit\/GooFit\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/goofit\/GooFit\">GooFit<\/a><\/td><td class=\"col-data\"><\/td><td class=\"col-data\"><a href=\"https:\/\/github.com\/goofit\/GooFit\/releases\"><span class=\"badge badge-blue\">2.3.0<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1653299647\"><a href=\"https:\/\/github.com\/goofit\/GooFit\/releases\"><span class=\"badge badge-red has-tip\">4 years ago<span class=\"tip\">2022-05-23T09:54:07Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1731596620\"><a href=\"https:\/\/github.com\/goofit\/GooFit\/commits\"><span class=\"badge badge-red has-tip\">1 year ago<span class=\"tip\">2024-11-14T15:03:40Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"144\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/goofit\/GooFit\/stargazers\">144<\/a> <a href=\"https:\/\/www.star-history.com\/#goofit\/GooFit\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"CLIUtils\/CLI11\">\n <td><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a><\/td><td class=\"col-data\"><\/td><td class=\"col-data\"><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/releases\"><span class=\"badge badge-blue\">2.6.2<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1772117065\"><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/releases\"><span class=\"badge badge-green has-tip\">3 months ago<span class=\"tip\">2026-02-26T14:44:25Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1780448456\"><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/commits\"><span class=\"badge badge-green has-tip\">4 days ago<span class=\"tip\">2026-06-03T01:00:56Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"4313\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/stargazers\">4,313<\/a> <a href=\"https:\/\/www.star-history.com\/#CLIUtils\/CLI11\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<tr data-project=\"iris-hep\/jekyll-indico\">\n <td><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\">jekyll-indico<\/a><\/td><td class=\"col-data\"><\/td><td class=\"col-data\"><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/releases\"><span class=\"badge badge-blue\">0.4.5<\/span><\/a><\/td><td class=\"col-data\" data-value=\"1643814650\"><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/releases\"><span class=\"badge badge-red has-tip\">4 years ago<span class=\"tip\">2022-02-02T15:10:50Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1728328288\"><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/commits\"><span class=\"badge badge-red has-tip\">1 year ago<span class=\"tip\">2024-10-07T19:11:28Z<\/span><\/span><\/a><\/td><td class=\"col-data\" data-value=\"1\">\n <span class=\"badge badge-yellow\"><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/stargazers\">1<\/a> <a href=\"https:\/\/www.star-history.com\/#iris-hep\/jekyll-indico\">\u2605<\/a><\/span>\n <\/td><\/tr>\n<\/tbody>\n <tfoot>\n <tr><th data-sort=\"name\">Name<\/th><th class=\"col-data\" data-sort=\"downloads\">Downloads<\/th><th class=\"col-data\">Version<\/th><th class=\"col-data\" data-sort=\"date\">Release<\/th><th class=\"col-data\" data-sort=\"date\">Last Commit<\/th><th class=\"col-data\" data-sort=\"stars\">Stars<\/th><\/tr>\n <\/tfoot>\n<\/table>\n<\/div>\n<script src=\"https:\/\/iscinumpy.dev\/js\/project-table.js\" defer><\/script>\n<\/div>\n<div\n class=\"tab-pane fade\"\n id=\"tabs-auto-1-pane-2\"\n role=\"tabpanel\"\n aria-labelledby=\"tabs-auto-1-pane-2-tab\"\n tabindex=\"0\"><div class=\"project-table-wrapper\">\n<table class=\"project-table\">\n <thead>\n <tr><th data-sort=\"name\">Name<\/th><th class=\"col-data\" data-sort=\"hooks\" title=\"pre-commit hooks\">Hooks<\/th><th class=\"col-data\" data-sort=\"issues\" title=\"Issues\/Pull Requests\">Issues\/PRs<\/th><\/tr>\n <\/thead>\n <tbody>\n<tr data-project=\"pypa\/packaging\">\n <td><a href=\"https:\/\/github.com\/pypa\/packaging\">packaging<\/a><\/td><td class=\"col-data\" data-value=\"15\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-toml&#34;,&#34;check-yaml&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3e8a8703264a2f4a69428a0aa4dcb512790b2c8c&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;5e2fb545eba1ea9dc051f6f962d52fe8f76a9794&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;3a6eb0fadf60b3cccfd80bad9dbb6fae7e47b316&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;d2823d321df3af8f878f7ee3414dc94d037145b9&#34;},{&#34;hooks&#34;:[&#34;typos&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/crate-ci\/typos&#34;,&#34;rev&#34;:&#34;631208b7aac2daa8b707f55e7331f9112b0e062d&#34;},{&#34;hooks&#34;:[&#34;zizmor&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/zizmorcore\/zizmor-pre-commit&#34;,&#34;rev&#34;:&#34;9257c6050c0261b8c57e712f632dc4a8010109a9&#34;},{&#34;hooks&#34;:[&#34;actionlint&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rhysd\/actionlint&#34;,&#34;rev&#34;:&#34;914e7df21a07ef503a81201c76d2b11c789d3fca&#34;},{&#34;hooks&#34;:[&#34;check-frozen-revs&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;}]\" data-config-url=\"https:\/\/github.com\/pypa\/packaging\/blob\/main\/.pre-commit-config.yaml\">15<\/button>\n <\/td><td class=\"col-data\" data-value=\"108\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pypa\/packaging\/issues\">76<\/a>\/<a href=\"https:\/\/github.com\/pypa\/packaging\/pulls\">32<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pypa\/cibuildwheel\">\n <td><a href=\"https:\/\/github.com\/pypa\/cibuildwheel\">cibuildwheel<\/a><\/td><td class=\"col-data\" data-value=\"24\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-yaml&#34;,&#34;check-toml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3e8a8703264a2f4a69428a0aa4dcb512790b2c8c&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;0671d8ab202c4ac093b78433ae5baf74f3fc7246&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;,&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;d2823d321df3af8f878f7ee3414dc94d037145b9&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;745eface02aef23e168a8afb6b5737818efbea95&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;,&#34;cog&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-actions&#34;,&#34;check-github-workflows&#34;,&#34;check-gitlab-ci&#34;,&#34;check-readthedocs&#34;,&#34;check-travis&#34;,&#34;check-jsonschema&#34;,&#34;check-metaschema&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;943377262562a12b57292fc98fabd7dbf81451fe&#34;}]\" data-config-url=\"https:\/\/github.com\/pypa\/cibuildwheel\/blob\/main\/.pre-commit-config.yaml\">24<\/button>\n <\/td><td class=\"col-data\" data-value=\"84\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pypa\/cibuildwheel\/issues\">72<\/a>\/<a href=\"https:\/\/github.com\/pypa\/cibuildwheel\/pulls\">12<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pypa\/build\">\n <td><a href=\"https:\/\/github.com\/pypa\/build\">build<\/a><\/td><td class=\"col-data\" data-value=\"22\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-ast&#34;,&#34;check-builtin-literals&#34;,&#34;check-docstring-first&#34;,&#34;check-merge-conflict&#34;,&#34;check-yaml&#34;,&#34;check-toml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3e8a8703264a2f4a69428a0aa4dcb512790b2c8c&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/abravalheri\/validate-pyproject&#34;,&#34;rev&#34;:&#34;4b2e70d08cb2ccd26d1fba73588de41c7a5d50b7&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;dda8db18cfc68df532abf33b185ecd12d5b7b326&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;515f543f5718ebfd6ce22e16708bb32c68ff96e1&#34;},{&#34;hooks&#34;:[&#34;docstrfmt&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/LilSpazJoekp\/docstrfmt&#34;,&#34;rev&#34;:&#34;7653faa707cb660bc80cef0e8433932363b43504&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;0671d8ab202c4ac093b78433ae5baf74f3fc7246&#34;},{&#34;hooks&#34;:[&#34;flake8-lazy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/flake8-lazy&#34;,&#34;rev&#34;:&#34;1e661c3087909adc5c1603b304848b02641facdc&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;3a6eb0fadf60b3cccfd80bad9dbb6fae7e47b316&#34;},{&#34;hooks&#34;:[&#34;zizmor&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/zizmorcore\/zizmor-pre-commit&#34;,&#34;rev&#34;:&#34;9257c6050c0261b8c57e712f632dc4a8010109a9&#34;},{&#34;hooks&#34;:[&#34;changelog-filenames&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;}]\" data-config-url=\"https:\/\/github.com\/pypa\/build\/blob\/main\/.pre-commit-config.yaml\">22<\/button>\n <\/td><td class=\"col-data\" data-value=\"18\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pypa\/build\/issues\">8<\/a>\/<a href=\"https:\/\/github.com\/pypa\/build\/pulls\">10<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pypa\/pipx\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/pypa\/pipx\">pipx<\/a><\/td><td class=\"col-data\" data-value=\"12\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;end-of-file-fixer&#34;,&#34;check-added-large-files&#34;,&#34;trailing-whitespace&#34;,&#34;check-merge-conflict&#34;,&#34;check-case-conflict&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;yamlfmt&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/google\/yamlfmt&#34;,&#34;rev&#34;:&#34;v0.21.0&#34;},{&#34;hooks&#34;:[&#34;mdformat&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/hukkin\/mdformat&#34;,&#34;rev&#34;:&#34;1.0.0&#34;},{&#34;hooks&#34;:[&#34;pyproject-fmt&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/tox-dev\/pyproject-fmt&#34;,&#34;rev&#34;:&#34;v2.23.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;}]\" data-config-url=\"https:\/\/github.com\/pypa\/pipx\/blob\/main\/.pre-commit-config.yaml\">12<\/button>\n <\/td><td class=\"col-data\" data-value=\"102\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pypa\/pipx\/issues\">97<\/a>\/<a href=\"https:\/\/github.com\/pypa\/pipx\/pulls\">5<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pypa\/dependency-groups\">\n <td><a href=\"https:\/\/github.com\/pypa\/dependency-groups\">dependency-groups<\/a><\/td><td class=\"col-data\" data-value=\"11\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-merge-conflict&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v5.0.0&#34;},{&#34;hooks&#34;:[&#34;lint-dependency-groups&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/sirosen\/dependency-groups&#34;,&#34;rev&#34;:&#34;1.3.0&#34;},{&#34;hooks&#34;:[&#34;check-github-workflows&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.31.0&#34;},{&#34;hooks&#34;:[&#34;pyupgrade&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/asottile\/pyupgrade&#34;,&#34;rev&#34;:&#34;v3.19.1&#34;},{&#34;hooks&#34;:[&#34;black&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/psf\/black-pre-commit-mirror&#34;,&#34;rev&#34;:&#34;24.10.0&#34;},{&#34;hooks&#34;:[&#34;flake8&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/PyCQA\/flake8&#34;,&#34;rev&#34;:&#34;7.1.1&#34;},{&#34;hooks&#34;:[&#34;isort&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/PyCQA\/isort&#34;,&#34;rev&#34;:&#34;5.13.2&#34;},{&#34;hooks&#34;:[&#34;slyp&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/sirosen\/slyp&#34;,&#34;rev&#34;:&#34;0.8.1&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.3.0&#34;},{&#34;hooks&#34;:[&#34;check-sdist&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/check-sdist&#34;,&#34;rev&#34;:&#34;v1.2.0&#34;}]\" data-config-url=\"https:\/\/github.com\/pypa\/dependency-groups\/blob\/main\/.pre-commit-config.yaml\">11<\/button>\n <\/td><td class=\"col-data\" data-value=\"3\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pypa\/dependency-groups\/issues\">2<\/a>\/<a href=\"https:\/\/github.com\/pypa\/dependency-groups\/pulls\">1<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pypa\/pyproject-metadata\">\n <td><a href=\"https:\/\/github.com\/pypa\/pyproject-metadata\">pyproject-metadata<\/a><\/td><td class=\"col-data\" data-value=\"25\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-ast&#34;,&#34;check-builtin-literals&#34;,&#34;check-docstring-first&#34;,&#34;check-merge-conflict&#34;,&#34;check-yaml&#34;,&#34;check-toml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.12&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;check-sdist&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/check-sdist&#34;,&#34;rev&#34;:&#34;v1.4.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.11.0.1&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/validate-pyproject-schema-store&#34;,&#34;rev&#34;:&#34;2026.04.26&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;,&#34;check-metaschema&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.2&#34;},{&#34;hooks&#34;:[&#34;sp-repo-review&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/scientific-python\/cookie&#34;,&#34;rev&#34;:&#34;2026.04.04&#34;}]\" data-config-url=\"https:\/\/github.com\/pypa\/pyproject-metadata\/blob\/main\/.pre-commit-config.yaml\">25<\/button>\n <\/td><td class=\"col-data\" data-value=\"11\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pypa\/pyproject-metadata\/issues\">7<\/a>\/<a href=\"https:\/\/github.com\/pypa\/pyproject-metadata\/pulls\">4<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-build\/scikit-build-core\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/scikit-build-core\">scikit-build-core<\/a><\/td><td class=\"col-data\" data-value=\"34\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;name-tests-test&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3e8a8703264a2f4a69428a0aa4dcb512790b2c8c&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;0671d8ab202c4ac093b78433ae5baf74f3fc7246&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;3a6eb0fadf60b3cccfd80bad9dbb6fae7e47b316&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;dda8db18cfc68df532abf33b185ecd12d5b7b326&#34;},{&#34;hooks&#34;:[&#34;cmake-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/cheshirekow\/cmake-format-precommit&#34;,&#34;rev&#34;:&#34;e2c2116d86a80e72e7146a06e68b7c228afc6319&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;515f543f5718ebfd6ce22e16708bb32c68ff96e1&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;d2823d321df3af8f878f7ee3414dc94d037145b9&#34;},{&#34;hooks&#34;:[&#34;check-sdist&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/check-sdist&#34;,&#34;rev&#34;:&#34;8d786ae74939ac1d9b12681bc43f72a0980283dd&#34;},{&#34;hooks&#34;:[&#34;typos&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/crate-ci\/typos&#34;,&#34;rev&#34;:&#34;0758ccd3261dc7b0594e9b698113eb08d3ba25b5&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;745eface02aef23e168a8afb6b5737818efbea95&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;,&#34;disallow-expressions&#34;,&#34;cog&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/validate-pyproject-schema-store&#34;,&#34;rev&#34;:&#34;a4ec1952e236bbc3b6ec29909724a33ff9d83327&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;,&#34;check-metaschema&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;943377262562a12b57292fc98fabd7dbf81451fe&#34;},{&#34;hooks&#34;:[&#34;validate-cff&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/citation-file-format\/cffconvert&#34;,&#34;rev&#34;:&#34;b6045d78aac9e02b039703b030588d54d53262ac&#34;},{&#34;hooks&#34;:[&#34;zizmor&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/zizmorcore\/zizmor-pre-commit&#34;,&#34;rev&#34;:&#34;9257c6050c0261b8c57e712f632dc4a8010109a9&#34;},{&#34;hooks&#34;:[&#34;sp-repo-review&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/scientific-python\/cookie&#34;,&#34;rev&#34;:&#34;04d0e44c1d3b036e9714aca375d965504ba5ea4a&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-build\/scikit-build-core\/blob\/main\/.pre-commit-config.yaml\">34<\/button>\n <\/td><td class=\"col-data\" data-value=\"151\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-build\/scikit-build-core\/issues\">133<\/a>\/<a href=\"https:\/\/github.com\/scikit-build\/scikit-build-core\/pulls\">18<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-build\/scikit-build\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/scikit-build\">scikit-build<\/a><\/td><td class=\"col-data\" data-value=\"22\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-toml&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;fix-ligatures&#34;,&#34;fix-smartquotes&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/sirosen\/texthooks&#34;,&#34;rev&#34;:&#34;0.7.1&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.12&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;check-sdist&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/check-sdist&#34;,&#34;rev&#34;:&#34;v1.4.0&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.20.2&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-build\/scikit-build\/blob\/main\/.pre-commit-config.yaml\">22<\/button>\n <\/td><td class=\"col-data\" data-value=\"187\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-build\/scikit-build\/issues\">166<\/a>\/<a href=\"https:\/\/github.com\/scikit-build\/scikit-build\/pulls\">21<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-build\/cmake-python-distributions\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\">cmake (on PyPI)<\/a><\/td><td class=\"col-data\" data-value=\"11\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.12&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.20.2&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\/blob\/main\/.pre-commit-config.yaml\">11<\/button>\n <\/td><td class=\"col-data\" data-value=\"27\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\/issues\">23<\/a>\/<a href=\"https:\/\/github.com\/scikit-build\/cmake-python-distributions\/pulls\">4<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-build\/ninja-python-distributions\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\">ninja (on PyPI)<\/a><\/td><td class=\"col-data\" data-value=\"15\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.14.5&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.18.2&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/abravalheri\/validate-pyproject&#34;,&#34;rev&#34;:&#34;v0.24.1&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.35.0&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\/blob\/master\/.pre-commit-config.yaml\">15<\/button>\n <\/td><td class=\"col-data\" data-value=\"10\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\/issues\">7<\/a>\/<a href=\"https:\/\/github.com\/scikit-build\/ninja-python-distributions\/pulls\">3<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-build\/moderncmakedomain\">\n <td><a href=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\">moderncmakedomain<\/a><\/td><td class=\"col-data\" data-value=\"17\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;name-tests-test&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.9&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/validate-pyproject-schema-store&#34;,&#34;rev&#34;:&#34;2026.04.03&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.1&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\/blob\/main\/.pre-commit-config.yaml\">17<\/button>\n <\/td><td class=\"col-data\" data-value=\"6\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\/issues\">3<\/a>\/<a href=\"https:\/\/github.com\/scikit-build\/moderncmakedomain\/pulls\">3<\/a><\/span><\/td><\/tr>\n<tr data-project=\"wntrblm\/nox\">\n <td><a href=\"https:\/\/github.com\/wntrblm\/nox\">nox<\/a><\/td><td class=\"col-data\" data-value=\"20\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;pyproject-fmt&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/tox-dev\/pyproject-fmt&#34;,&#34;rev&#34;:&#34;v2.12.1&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.0&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.19.1&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.1&#34;},{&#34;hooks&#34;:[&#34;python-no-eval&#34;,&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;zizmor&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/zizmorcore\/zizmor-pre-commit&#34;,&#34;rev&#34;:&#34;v1.22.0&#34;}]\" data-config-url=\"https:\/\/github.com\/wntrblm\/nox\/blob\/main\/.pre-commit-config.yaml\">20<\/button>\n <\/td><td class=\"col-data\" data-value=\"83\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/wntrblm\/nox\/issues\">70<\/a>\/<a href=\"https:\/\/github.com\/wntrblm\/nox\/pulls\">13<\/a><\/span><\/td><\/tr>\n<tr data-project=\"abravalheri\/validate-pyproject\">\n <td><a href=\"https:\/\/github.com\/abravalheri\/validate-pyproject\">validate-pyproject<\/a><\/td><td class=\"col-data\" data-value=\"25\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-ast&#34;,&#34;check-json&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-toml&#34;,&#34;check-xml&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;,&#34;mixed-line-ending&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;check-metaschema&#34;,&#34;check-readthedocs&#34;,&#34;check-github-workflows&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.2&#34;},{&#34;hooks&#34;:[&#34;sp-repo-review&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/scientific-python\/cookie&#34;,&#34;rev&#34;:&#34;2026.04.04&#34;}]\" data-config-url=\"https:\/\/github.com\/abravalheri\/validate-pyproject\/blob\/main\/.pre-commit-config.yaml\">25<\/button>\n <\/td><td class=\"col-data\" data-value=\"11\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/abravalheri\/validate-pyproject\/issues\">8<\/a>\/<a href=\"https:\/\/github.com\/abravalheri\/validate-pyproject\/pulls\">3<\/a><\/span><\/td><\/tr>\n<tr data-project=\"henryiii\/validate-pyproject-schema-store\">\n <td><a href=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\">validate-pyproject-schema-store<\/a><\/td><td class=\"col-data\" data-value=\"24\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;name-tests-test&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.1&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.9&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.20.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.11.0.1&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/abravalheri\/validate-pyproject&#34;,&#34;rev&#34;:&#34;v0.25&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.1&#34;},{&#34;hooks&#34;:[&#34;sp-repo-review&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/scientific-python\/cookie&#34;,&#34;rev&#34;:&#34;2026.04.04&#34;}]\" data-config-url=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\/blob\/main\/.pre-commit-config.yaml\">24<\/button>\n <\/td><td class=\"col-data\" data-value=\"6\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\/issues\">4<\/a>\/<a href=\"https:\/\/github.com\/henryiii\/validate-pyproject-schema-store\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pybind\/pybind11\">\n <td><a href=\"https:\/\/github.com\/pybind\/pybind11\">pybind11<\/a><\/td><td class=\"col-data\" data-value=\"32\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;clang-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-clang-format&#34;,&#34;rev&#34;:&#34;v22.1.5&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;cmake-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/cheshirekow\/cmake-format-precommit&#34;,&#34;rev&#34;:&#34;v0.6.13&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-docstring-first&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-toml&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;remove-tabs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/Lucas-C\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v1.5.6&#34;},{&#34;hooks&#34;:[&#34;fix-ligatures&#34;,&#34;fix-smartquotes&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/sirosen\/texthooks&#34;,&#34;rev&#34;:&#34;0.7.1&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;typos&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adhtruong\/mirrors-typos&#34;,&#34;rev&#34;:&#34;v1.47.0&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.11.0.1&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;pylint&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/PyCQA\/pylint&#34;,&#34;rev&#34;:&#34;v4.0.5&#34;},{&#34;hooks&#34;:[&#34;check-readthedocs&#34;,&#34;check-github-workflows&#34;,&#34;check-dependabot&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.2&#34;}]\" data-config-url=\"https:\/\/github.com\/pybind\/pybind11\/blob\/master\/.pre-commit-config.yaml\">32<\/button>\n <\/td><td class=\"col-data\" data-value=\"730\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pybind\/pybind11\/issues\">630<\/a>\/<a href=\"https:\/\/github.com\/pybind\/pybind11\/pulls\">100<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pybind\/python_example\">\n <td><a href=\"https:\/\/github.com\/pybind\/python_example\">pybind\/python_example<\/a><\/td><td class=\"col-data\" data-value=\"13\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;remove-tabs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/Lucas-C\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v1.5.6&#34;}]\" data-config-url=\"https:\/\/github.com\/pybind\/python_example\/blob\/master\/.pre-commit-config.yaml\">13<\/button>\n <\/td><td class=\"col-data\" data-value=\"18\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pybind\/python_example\/issues\">17<\/a>\/<a href=\"https:\/\/github.com\/pybind\/python_example\/pulls\">1<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pybind\/scikit_build_example\">\n <td><a href=\"https:\/\/github.com\/pybind\/scikit_build_example\">pybind\/scikit_build_example<\/a><\/td><td class=\"col-data\" data-value=\"14\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.7&#34;},{&#34;hooks&#34;:[&#34;remove-tabs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/Lucas-C\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v1.5.6&#34;},{&#34;hooks&#34;:[&#34;cmake-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/cheshirekow\/cmake-format-precommit&#34;,&#34;rev&#34;:&#34;v0.6.13&#34;}]\" data-config-url=\"https:\/\/github.com\/pybind\/scikit_build_example\/blob\/master\/.pre-commit-config.yaml\">14<\/button>\n <\/td><td class=\"col-data\" data-value=\"11\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pybind\/scikit_build_example\/issues\">9<\/a>\/<a href=\"https:\/\/github.com\/pybind\/scikit_build_example\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"mesonbuild\/meson-python\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/mesonbuild\/meson-python\">meson-python<\/a><\/td><td class=\"col-data\" data-value=\"12\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-ast&#34;,&#34;check-builtin-literals&#34;,&#34;check-docstring-first&#34;,&#34;check-merge-conflict&#34;,&#34;check-yaml&#34;,&#34;check-toml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v5.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.6.9&#34;},{&#34;hooks&#34;:[&#34;reuse&#34;,&#34;reuse&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/fsfe\/reuse-tool&#34;,&#34;rev&#34;:&#34;v4.0.3&#34;}]\" data-config-url=\"https:\/\/github.com\/mesonbuild\/meson-python\/blob\/main\/.pre-commit-config.yaml\">12<\/button>\n <\/td><td class=\"col-data\" data-value=\"61\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/mesonbuild\/meson-python\/issues\">46<\/a>\/<a href=\"https:\/\/github.com\/mesonbuild\/meson-python\/pulls\">15<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/boost-histogram\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\">boost-histogram<\/a><\/td><td class=\"col-data\" data-value=\"24\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;cmake-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/cheshirekow\/cmake-format-precommit&#34;,&#34;rev&#34;:&#34;v0.6.13&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;clang-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-clang-format&#34;,&#34;rev&#34;:&#34;v22.1.5&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;check-readthedocs&#34;,&#34;check-github-workflows&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.2&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/validate-pyproject-schema-store&#34;,&#34;rev&#34;:&#34;2026.05.28&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/boost-histogram\/blob\/develop\/.pre-commit-config.yaml\">24<\/button>\n <\/td><td class=\"col-data\" data-value=\"29\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\/issues\">22<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\/pulls\">7<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/hist\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/hist\">hist<\/a><\/td><td class=\"col-data\" data-value=\"20\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.12&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.20.2&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;python-use-type-annotations&#34;,&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.11.0.1&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/hist\/blob\/main\/.pre-commit-config.yaml\">20<\/button>\n <\/td><td class=\"col-data\" data-value=\"85\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/hist\/issues\">76<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/hist\/pulls\">9<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/uhi\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/uhi\">uhi<\/a><\/td><td class=\"col-data\" data-value=\"24\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.12&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.20.2&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;check-readthedocs&#34;,&#34;check-github-workflows&#34;,&#34;check-metaschema&#34;,&#34;check-jsonschema&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.2&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/validate-pyproject-schema-store&#34;,&#34;rev&#34;:&#34;2026.04.26&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/uhi\/blob\/main\/.pre-commit-config.yaml\">24<\/button>\n <\/td><td class=\"col-data\" data-value=\"17\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/uhi\/issues\">13<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/uhi\/pulls\">4<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/vector\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/vector\">vector<\/a><\/td><td class=\"col-data\" data-value=\"20\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;python-check-blanket-type-ignore&#34;,&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/vector\/blob\/main\/.pre-commit-config.yaml\">20<\/button>\n <\/td><td class=\"col-data\" data-value=\"29\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/vector\/issues\">24<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/vector\/pulls\">5<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/uproot-browser\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/uproot-browser\">uproot-browser<\/a><\/td><td class=\"col-data\" data-value=\"15\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.14.10&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.19.1&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.1&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/uproot-browser\/blob\/main\/.pre-commit-config.yaml\">15<\/button>\n <\/td><td class=\"col-data\" data-value=\"11\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/uproot-browser\/issues\">9<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/uproot-browser\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/particle\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/particle\">particle<\/a><\/td><td class=\"col-data\" data-value=\"19\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;,&#34;check-merge-conflict&#34;,&#34;check-case-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;requirements-txt-fixer&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/particle\/blob\/main\/.pre-commit-config.yaml\">19<\/button>\n <\/td><td class=\"col-data\" data-value=\"8\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/particle\/issues\">6<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/particle\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scikit-hep\/DecayLanguage\">\n <td><a href=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\">DecayLanguage<\/a><\/td><td class=\"col-data\" data-value=\"18\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;,&#34;check-merge-conflict&#34;,&#34;check-case-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;requirements-txt-fixer&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;}]\" data-config-url=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\/blob\/main\/.pre-commit-config.yaml\">18<\/button>\n <\/td><td class=\"col-data\" data-value=\"5\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\/issues\">4<\/a>\/<a href=\"https:\/\/github.com\/scikit-hep\/DecayLanguage\/pulls\">1<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scientific-python\/repo-review\">\n <td><a href=\"https:\/\/github.com\/scientific-python\/repo-review\">repo-review<\/a><\/td><td class=\"col-data\" data-value=\"27\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;fda77690955e9b63c6687d8806bafd56a526e45f&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;0671d8ab202c4ac093b78433ae5baf74f3fc7246&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;515f543f5718ebfd6ce22e16708bb32c68ff96e1&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3e8a8703264a2f4a69428a0aa4dcb512790b2c8c&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;3a6eb0fadf60b3cccfd80bad9dbb6fae7e47b316&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;d2823d321df3af8f878f7ee3414dc94d037145b9&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;745eface02aef23e168a8afb6b5737818efbea95&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/validate-pyproject-schema-store&#34;,&#34;rev&#34;:&#34;a4ec1952e236bbc3b6ec29909724a33ff9d83327&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;f805888065fdb6162e1f800e50bb9460cbd223d6&#34;},{&#34;hooks&#34;:[&#34;zizmor&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/zizmorcore\/zizmor-pre-commit&#34;,&#34;rev&#34;:&#34;9257c6050c0261b8c57e712f632dc4a8010109a9&#34;},{&#34;hooks&#34;:[&#34;actionlint&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rhysd\/actionlint&#34;,&#34;rev&#34;:&#34;914e7df21a07ef503a81201c76d2b11c789d3fca&#34;}]\" data-config-url=\"https:\/\/github.com\/scientific-python\/repo-review\/blob\/main\/.pre-commit-config.yaml\">27<\/button>\n <\/td><td class=\"col-data\" data-value=\"2\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scientific-python\/repo-review\/issues\">0<\/a>\/<a href=\"https:\/\/github.com\/scientific-python\/repo-review\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"scientific-python\/cookie\">\n <td><a href=\"https:\/\/github.com\/scientific-python\/cookie\">cookie<\/a><\/td><td class=\"col-data\" data-value=\"24\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;name-tests-test&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.14&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;typos&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/crate-ci\/typos&#34;,&#34;rev&#34;:&#34;v1.46.3&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;,&#34;disallow-words&#34;,&#34;disallow-bad-permalinks&#34;,&#34;cog&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;}]\" data-config-url=\"https:\/\/github.com\/scientific-python\/cookie\/blob\/main\/.pre-commit-config.yaml\">24<\/button>\n <\/td><td class=\"col-data\" data-value=\"32\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/scientific-python\/cookie\/issues\">25<\/a>\/<a href=\"https:\/\/github.com\/scientific-python\/cookie\/pulls\">7<\/a><\/span><\/td><\/tr>\n<tr data-project=\"tomerfiliba\/plumbum\">\n <td><a href=\"https:\/\/github.com\/tomerfiliba\/plumbum\">plumbum<\/a><\/td><td class=\"col-data\" data-value=\"19\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.5&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.19.1&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/abravalheri\/validate-pyproject&#34;,&#34;rev&#34;:&#34;v0.25&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;flake8-lazy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/flake8-lazy&#34;,&#34;rev&#34;:&#34;v0.8.1&#34;}]\" data-config-url=\"https:\/\/github.com\/tomerfiliba\/plumbum\/blob\/master\/.pre-commit-config.yaml\">19<\/button>\n <\/td><td class=\"col-data\" data-value=\"136\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/tomerfiliba\/plumbum\/issues\">133<\/a>\/<a href=\"https:\/\/github.com\/tomerfiliba\/plumbum\/pulls\">3<\/a><\/span><\/td><\/tr>\n<tr data-project=\"henryiii\/flake8-errmsg\">\n <td><a href=\"https:\/\/github.com\/henryiii\/flake8-errmsg\">flake8-errmsg<\/a><\/td><td class=\"col-data\" data-value=\"25\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;python-check-blanket-noqa&#34;,&#34;python-check-blanket-type-ignore&#34;,&#34;python-no-eval&#34;,&#34;python-use-type-annotations&#34;,&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.1&#34;},{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;1.20.0&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.9&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v1.20.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.11.0.1&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;}]\" data-config-url=\"https:\/\/github.com\/henryiii\/flake8-errmsg\/blob\/main\/.pre-commit-config.yaml\">25<\/button>\n <\/td><td class=\"col-data\" data-value=\"3\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/henryiii\/flake8-errmsg\/issues\">1<\/a>\/<a href=\"https:\/\/github.com\/henryiii\/flake8-errmsg\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"henryiii\/flake8-lazy\">\n <td><a href=\"https:\/\/github.com\/henryiii\/flake8-lazy\">flake8-lazy<\/a><\/td><td class=\"col-data\" data-value=\"30\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;blacken-docs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/adamchainz\/blacken-docs&#34;,&#34;rev&#34;:&#34;fda77690955e9b63c6687d8806bafd56a526e45f&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;name-tests-test&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3e8a8703264a2f4a69428a0aa4dcb512790b2c8c&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;3a6eb0fadf60b3cccfd80bad9dbb6fae7e47b316&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;515f543f5718ebfd6ce22e16708bb32c68ff96e1&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;5e2fb545eba1ea9dc051f6f962d52fe8f76a9794&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;d2823d321df3af8f878f7ee3414dc94d037145b9&#34;},{&#34;hooks&#34;:[&#34;pyrefly-check&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/facebook\/pyrefly-pre-commit&#34;,&#34;rev&#34;:&#34;ef09b1b600419b206ac1a8c6ba4ab224a9ed58c3&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;745eface02aef23e168a8afb6b5737818efbea95&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;validate-pyproject&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/abravalheri\/validate-pyproject&#34;,&#34;rev&#34;:&#34;4b2e70d08cb2ccd26d1fba73588de41c7a5d50b7&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-readthedocs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;f805888065fdb6162e1f800e50bb9460cbd223d6&#34;},{&#34;hooks&#34;:[&#34;check-sdist&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/check-sdist&#34;,&#34;rev&#34;:&#34;8d786ae74939ac1d9b12681bc43f72a0980283dd&#34;},{&#34;hooks&#34;:[&#34;sp-repo-review&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/scientific-python\/cookie&#34;,&#34;rev&#34;:&#34;04d0e44c1d3b036e9714aca375d965504ba5ea4a&#34;},{&#34;hooks&#34;:[&#34;zizmor&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/zizmorcore\/zizmor-pre-commit&#34;,&#34;rev&#34;:&#34;a4727cbbcd26d7098e96b9cb738169b59711ae51&#34;}]\" data-config-url=\"https:\/\/github.com\/henryiii\/flake8-lazy\/blob\/main\/.pre-commit-config.yaml\">30<\/button>\n <\/td><td class=\"col-data\" data-value=\"4\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/henryiii\/flake8-lazy\/issues\">2<\/a>\/<a href=\"https:\/\/github.com\/henryiii\/flake8-lazy\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"henryiii\/check-sdist\">\n <td><a href=\"https:\/\/github.com\/henryiii\/check-sdist\">check-sdist<\/a><\/td><td class=\"col-data\" data-value=\"25\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;name-tests-test&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;ruff-check&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.15.15&#34;},{&#34;hooks&#34;:[&#34;mypy&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-mypy&#34;,&#34;rev&#34;:&#34;v2.1.0&#34;},{&#34;hooks&#34;:[&#34;check-sdist&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/henryiii\/check-sdist&#34;,&#34;rev&#34;:&#34;v1.4.0&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.11.0.1&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;check-dependabot&#34;,&#34;check-github-workflows&#34;,&#34;check-metaschema&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/python-jsonschema\/check-jsonschema&#34;,&#34;rev&#34;:&#34;0.37.2&#34;}]\" data-config-url=\"https:\/\/github.com\/henryiii\/check-sdist\/blob\/main\/.pre-commit-config.yaml\">25<\/button>\n <\/td><td class=\"col-data\" data-value=\"2\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/henryiii\/check-sdist\/issues\">1<\/a>\/<a href=\"https:\/\/github.com\/henryiii\/check-sdist\/pulls\">1<\/a><\/span><\/td><\/tr>\n<tr data-project=\"pytest-dev\/pytest-github-actions-annotate-failures\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\">pytest GHA annotate-failures<\/a><\/td><td class=\"col-data\" data-value=\"12\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v5.0.0&#34;},{&#34;hooks&#34;:[&#34;ruff&#34;,&#34;ruff-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.9.2&#34;}]\" data-config-url=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\/blob\/main\/.pre-commit-config.yaml\">12<\/button>\n <\/td><td class=\"col-data\" data-value=\"3\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\/issues\">1<\/a>\/<a href=\"https:\/\/github.com\/pytest-dev\/pytest-github-actions-annotate-failures\/pulls\">2<\/a><\/span><\/td><\/tr>\n<tr data-project=\"goofit\/GooFit\" class=\"noncore\">\n <td><a href=\"https:\/\/github.com\/goofit\/GooFit\">GooFit<\/a><\/td><td class=\"col-data\" data-value=\"20\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;black&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/psf\/black-pre-commit-mirror&#34;,&#34;rev&#34;:&#34;23.7.0&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;debug-statements&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;requirements-txt-fixer&#34;,&#34;trailing-whitespace&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v4.4.0&#34;},{&#34;hooks&#34;:[&#34;ruff&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/astral-sh\/ruff-pre-commit&#34;,&#34;rev&#34;:&#34;v0.0.272&#34;},{&#34;hooks&#34;:[&#34;cmake-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/cheshirekow\/cmake-format-precommit&#34;,&#34;rev&#34;:&#34;v0.6.13&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.2.4&#34;},{&#34;hooks&#34;:[&#34;rst-backticks&#34;,&#34;rst-directive-colons&#34;,&#34;rst-inline-touching-normal&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pygrep-hooks&#34;,&#34;rev&#34;:&#34;v1.10.0&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;clang-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-clang-format&#34;,&#34;rev&#34;:&#34;v16.0.4&#34;},{&#34;hooks&#34;:[&#34;shellcheck&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/shellcheck-py\/shellcheck-py&#34;,&#34;rev&#34;:&#34;v0.9.0.5&#34;}]\" data-config-url=\"https:\/\/github.com\/goofit\/GooFit\/blob\/master\/.pre-commit-config.yaml\">20<\/button>\n <\/td><td class=\"col-data\" data-value=\"38\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/goofit\/GooFit\/issues\">23<\/a>\/<a href=\"https:\/\/github.com\/goofit\/GooFit\/pulls\">15<\/a><\/span><\/td><\/tr>\n<tr data-project=\"CLIUtils\/CLI11\">\n <td><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a><\/td><td class=\"col-data\" data-value=\"23\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;black&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/psf\/black-pre-commit-mirror&#34;,&#34;rev&#34;:&#34;26.5.1&#34;},{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;check-case-conflict&#34;,&#34;check-merge-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;,&#34;check-toml&#34;,&#34;check-json&#34;,&#34;end-of-file-fixer&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;,&#34;check-illegal-windows-names&#34;,&#34;check-shebang-scripts-are-executable&#34;,&#34;check-executables-have-shebangs&#34;,&#34;debug-statements&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v6.0.0&#34;},{&#34;hooks&#34;:[&#34;clang-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/mirrors-clang-format&#34;,&#34;rev&#34;:&#34;v22.1.5&#34;},{&#34;hooks&#34;:[&#34;cmake-format&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/cheshirekow\/cmake-format-precommit&#34;,&#34;rev&#34;:&#34;v0.6.13&#34;},{&#34;hooks&#34;:[&#34;prettier&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/rbubley\/mirrors-prettier&#34;,&#34;rev&#34;:&#34;v3.8.3&#34;},{&#34;hooks&#34;:[&#34;script-must-have-extension&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/jumanjihouse\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;3.0.0&#34;},{&#34;hooks&#34;:[&#34;markdownlint-cli2&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/DavidAnson\/markdownlint-cli2&#34;,&#34;rev&#34;:&#34;v0.22.1&#34;},{&#34;hooks&#34;:[&#34;disallow-caps&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;avoid-msvc-macro&#34;],&#34;repo&#34;:&#34;local&#34;,&#34;rev&#34;:&#34;&#34;},{&#34;hooks&#34;:[&#34;codespell&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/codespell-project\/codespell&#34;,&#34;rev&#34;:&#34;v2.4.2&#34;}]\" data-config-url=\"https:\/\/github.com\/CLIUtils\/CLI11\/blob\/main\/.pre-commit-config.yaml\">23<\/button>\n <\/td><td class=\"col-data\" data-value=\"66\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/issues\">58<\/a>\/<a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/pulls\">8<\/a><\/span><\/td><\/tr>\n<tr data-project=\"iris-hep\/jekyll-indico\">\n <td><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\">jekyll-indico<\/a><\/td><td class=\"col-data\" data-value=\"9\">\n <button type=\"button\" class=\"badge badge-gray hooks-badge\" title=\"Click to see pre-commit hooks\" data-hook-groups=\"[{&#34;hooks&#34;:[&#34;check-added-large-files&#34;,&#34;mixed-line-ending&#34;,&#34;trailing-whitespace&#34;,&#34;check-merge-conflict&#34;,&#34;check-case-conflict&#34;,&#34;check-symlinks&#34;,&#34;check-yaml&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/pre-commit\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v5.0.0&#34;},{&#34;hooks&#34;:[&#34;remove-crlf&#34;,&#34;forbid-tabs&#34;],&#34;repo&#34;:&#34;https:\/\/github.com\/Lucas-C\/pre-commit-hooks&#34;,&#34;rev&#34;:&#34;v1.5.5&#34;}]\" data-config-url=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/blob\/main\/.pre-commit-config.yaml\">9<\/button>\n <\/td><td class=\"col-data\" data-value=\"2\"><span class=\"badge badge-gray\"><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/issues\">1<\/a>\/<a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\/pulls\">1<\/a><\/span><\/td><\/tr>\n<\/tbody>\n <tfoot>\n <tr><th data-sort=\"name\">Name<\/th><th class=\"col-data\" data-sort=\"hooks\" title=\"pre-commit hooks\">Hooks<\/th><th class=\"col-data\" data-sort=\"issues\" title=\"Issues\/Pull Requests\">Issues\/PRs<\/th><\/tr>\n <\/tfoot>\n<\/table>\n<\/div>\n<\/div>\n\n <\/div>\n<\/div>\n<p>Idea and code inspiration stolen with permission from\n<a href=\"https:\/\/bernat.tech\/about\">Bern\u00e1t G\u00e1bor<\/a>. Greyed out projects are ones I can\ncommit to but only help out occasionally.<\/p>"},{"title":"Python 3.15","link":"https:\/\/iscinumpy.dev\/post\/python-315\/","pubDate":"Wed, 06 May 2026 12:00:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-315\/","description":"<p>Python 3.15 beta 1 is out! This is a really impactful release, with some really\nbig additions. A new lazy import system, a powerful sampling profiler, not one\nbut two new builtins, the usual color\/types\/errors updates, and lots of key\nchanges for developers.<\/p>"},{"title":"Starting With Agentic AI","link":"https:\/\/iscinumpy.dev\/post\/starting-with-agentic-ai\/","pubDate":"Tue, 05 May 2026 20:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/starting-with-agentic-ai\/","description":"<p>AI suddenly passed the &ldquo;more time saved than spent&rdquo; point around December 2025.\nA little late, I&rsquo;ve finally started using agentic AI in various places over the\nlast 2-3 months, and wanted to jot down my thoughts on what works, what doesn&rsquo;t\n(yet?), and what the future might look like. If you are curious about AI for\nprogramming, or have been skeptical in the past, if &ldquo;AI slop&rdquo; is the first thing\nthat comes to mind, this post will show you some ways that AI can be really\nhelpful. Certain tasks have been completely transformed. Notice, I said &ldquo;some&rdquo;,\nnot &ldquo;all&rdquo;! But it is a lot.<\/p>"},{"title":"Repo Review 1.0","link":"https:\/\/iscinumpy.dev\/post\/repo-review-1\/","pubDate":"Sat, 04 Apr 2026 10:52:51 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/repo-review-1\/","description":"<p>I&rsquo;ve just released <a href=\"https:\/\/github.com\/scientific-python\/repo-review\">repo-review<\/a> 1.0 with a huge update to the WebApp, along\nwith some other solid improvements in speed, simplicity, and stability.\nRepo-review&rsquo;s two most popular plugins, <a href=\"https:\/\/github.com\/scientific-python\/cookie\">sp-repo-review<\/a> and\n<a href=\"https:\/\/validate-pyproject.readthedocs.io\">validate-pyproject<\/a>, can take full advantage of the new asynchronous fetching\nmechanism. And if you use the upcoming Python 3.15, the CLI is more responsive\nthan ever thanks to lazy loading!<\/p>"},{"title":"Working to make Python lazy","link":"https:\/\/iscinumpy.dev\/post\/flake8-lazy\/","pubDate":"Tue, 24 Mar 2026 09:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/flake8-lazy\/","description":"<p>Python 3.15a7, which is now just a <code>uv python install 3.15<\/code> away on all major\nplatforms, has lazy imports! This exciting feature, proposed in <a href=\"https:\/\/peps.python.org\/pep-0810\">PEP 810<\/a>,\npromises to make CLI applications faster (especially when using flags like\n<code>--help<\/code>), and could make a lot of large code with lots of imports that don&rsquo;t\nalways get used faster too. Unlike the earlier, failed attempt, this requires\nlibraries to put in some work. I&rsquo;ve developed a helper tool to make it easy; I&rsquo;d\nlike to cover what lazy imports are and how to use my tool. Since this is the\nfirst library that I used AI heavily in developing, the second half of the post\nwill cover how my experience with AI for a task like this went.<\/p>\n<p>TL;DR: run <code>uvx flake8-lazy --apply=list<\/code> to make your code magically faster on\nPython 3.15!<\/p>"},{"title":"New in boost-histogram 1.7 \/ Hist 2.10","link":"https:\/\/iscinumpy.dev\/post\/hist-2-10\/","pubDate":"Fri, 06 Feb 2026 17:16:40 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/hist-2-10\/","description":"<figure class=\"transparent\">\n <img src=\"https:\/\/iscinumpy.dev\/post\/boost-histogram-06\/images\/BoostHistogramPythonLogo.png\" alt=\"boost-histogram logo\" width=\"405\" \/>\n<\/figure>\n\n\n<p>I&rsquo;ve just released <a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\/releases\/tag\/v1.7.0\">boost-histogram 1.7<\/a> and <a href=\"https:\/\/github.com\/scikit-hep\/hist\/releases\/tag\/v2.10.0\">hist 2.10<\/a>, with a major new\nfeature and a big typing improvement! I&rsquo;d like to quickly outline what&rsquo;s new\nhere. Python 3.10+ is now required.<\/p>"},{"title":"Tools to help you write better code","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2026-01-16-sqat\/","pubDate":"Fri, 16 Jan 2026 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2026-01-16-sqat\/","description":{}},{"title":"How we made Python's packaging library 3x faster","link":"https:\/\/iscinumpy.dev\/post\/packaging-faster\/","pubDate":"Fri, 09 Jan 2026 13:30:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/packaging-faster\/","description":"<p>Along with a <a href=\"https:\/\/github.com\/pypa\/pip\">pip<\/a> (and now <a href=\"https:\/\/github.com\/pypa\/packaging\">packaging<\/a>) maintainer, Damian Shaw, I have\nbeen working on making <a href=\"https:\/\/github.com\/pypa\/packaging\">packaging<\/a>, the library behind almost all packaging\nrelated tools, faster at reading versions and specifiers, something tools like\npip have to do thousands of times during resolution. Using Python 3.15&rsquo;s new\nstatistical profiler and metadata from every package ever uploaded to PyPI, I\nmeasured and improved core Packaging constructs while keeping the code readable\nand simple. Reading in <code>Version<\/code>s can be up to 2x faster and <code>SpecifierSet<\/code>s can\nbe up to 3x faster in <a href=\"https:\/\/github.com\/pypa\/packaging\/releases\/tag\/26.0\">packaging <code>26.0<\/code><\/a>, now released! Other\noperations have been optimized, as well, up to 5x in some cases. See the\n<a href=\"https:\/\/discuss.python.org\/t\/announcement-packaging-26-0rc1-released\/105631\">announcement<\/a> and <a href=\"https:\/\/packaging.pypa.io\/en\/stable\/changelog.html\">release notes<\/a> too; this post will focus on the\nperformance work only.<\/p>"},{"title":"Advent of Code 2025 in Typescript","link":"https:\/\/iscinumpy.dev\/post\/aoc-2025\/","pubDate":"Wed, 24 Dec 2025 00:09:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/aoc-2025\/","description":"<p>After two years of <a href=\"https:\/\/adventofcode.com\">Advent of Code<\/a> in <a href=\"https:\/\/rust-lang.org\">Rust<\/a>, I thought I&rsquo;d try\n<a href=\"https:\/\/www.typescriptlang.org\">TypeScript<\/a>. I&rsquo;ve always wanted to improve <a href=\"https:\/\/repo-review.readthedocs.io\/en\/latest\">repo-review<\/a>&rsquo;s\n<a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/repo-review\">webapp<\/a>, and that requires knowledge of the packaging\nsystems for JavaScript, so I thought I&rsquo;d try TypeScript this year. I also used\nthis as an opportunity to learn more AI tooling too, mostly CoPilot in\n<a href=\"https:\/\/code.visualstudio.com\">VSCode<\/a> &amp; <a href=\"https:\/\/chatgpt.com\">ChatGPT<\/a>. I&rsquo;d like to share my experience and thoughts! My code\nis at <a href=\"https:\/\/github.com\/henryiii\/aoc2025\">aoc2025<\/a> (and <a href=\"https:\/\/github.com\/henryiii\/aoc2024\">aoc2024<\/a>, <a href=\"https:\/\/github.com\/henryiii\/aoc2023\">aoc2023<\/a>).<\/p>"},{"title":"What's new in Python \u03c0","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-11-24-rse\/","pubDate":"Mon, 24 Nov 2025 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-11-24-rse\/","description":{}},{"title":"Python Histograms","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-11-12-rse\/","pubDate":"Wed, 12 Nov 2025 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-11-12-rse\/","description":{}},{"title":"Using Venvs","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-09-19-hsf-india\/","pubDate":"Fri, 19 Sep 2025 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-09-19-hsf-india\/","description":{}},{"title":"UHI 1.0: histogram serialization","link":"https:\/\/iscinumpy.dev\/post\/uhi-1-0\/","pubDate":"Wed, 20 Aug 2025 16:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/uhi-1-0\/","description":"<p><a href=\"https:\/\/github.com\/scikit-hep\/uhi\/releases\/tag\/v1.0.0\">UHI 1.0<\/a> is out, with a major new feature: a new histogram serialization\nspec! This spec supports multiple formats (HDF5, zip, and JSON initially), and\ncan be supported by multiple libraries (Boost-histogram\/hist initially). There&rsquo;s\nalso a new test suite helper for libraries targeting the UHI indexing spec.<\/p>"},{"title":"pybind11 3.0.0","link":"https:\/\/iscinumpy.dev\/post\/pybind11-3-0-0\/","pubDate":"Thu, 10 Jul 2025 00:13:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/pybind11-3-0-0\/","description":"<figure class=\"transparent\">\n <img src=\"https:\/\/iscinumpy.dev\/post\/pybind11-2-6-0\/images\/pybind11-logo.png\" alt=\"pybind11 logo\" width=\"405\" \/>\n<\/figure>\n\n\n<p>Pybind11 3.0 has been released! I would like to highlight some of the key\nchanges below; be sure to check out the <a href=\"https:\/\/pybind11.readthedocs.io\/en\/latest\/changelog.html\">changelog<\/a> and <a href=\"https:\/\/pybind11.readthedocs.io\/en\/latest\/upgrade.html\">upgrade guide<\/a> for\nmore information! This release includes an ABI bump, the first required bump in\nmany years on Unix (Windows has had required bumps more often). This release\ncontains the multi-year smart-holder branch, multi-phase init and subinterpreter\nsupport, <code>py::native_enum<\/code>, an interface to warnings, typing improvements, and\nmore. CMake now defaults to <a href=\"https:\/\/cmake.org\/cmake\/help\/latest\/module\/FindPython.html\">FindPython<\/a> mode.<\/p>\n<p>Support for Python 3.14, 3.14t, GraalPy, PyPy 3.11, and iOS have been added,\nwhile legacy support for Python 3.7, PyPy 3.8\/3.9, and CMake &lt;3.15 has been\nremoved. Most deprecated features have been kept for this release, but anything\nproducing a warning in 3.0 may be removed in a future 3.x version.<\/p>"},{"title":"Packaging a Scientific Python Project","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-0709-scipy\/","pubDate":"Wed, 09 Jul 2025 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-0709-scipy\/","description":{}},{"title":"\ud83c\udfa1 cibuildwheel 3.0","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-3-0-0\/","pubDate":"Thu, 05 Jun 2025 01:54:45 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-3-0-0\/","description":"<p><a href=\"https:\/\/cibuildwheel.pypa.io\">cibuildwheel<\/a> 3.0.0 is out, with some very big additions. We&rsquo;ve added\nGraalPy, Python 3.14 (and 3.14t) betas, and iOS support! We&rsquo;ve got several new\noptions: <code>test-sources<\/code>, <code>test-environment<\/code>, and (experimental)\n<code>pyodide-version<\/code>. We now fully use <code>enable<\/code> (and PyPy requires using it), and\nwe no longer inject setuptools and wheel in build environments. Defaults have\nchanged, too: <code>build<\/code> is now the default frontend, <code>manylinux_2_28<\/code> is the\ndefault manylinux image, with 32-bit linux now being opt-in. We&rsquo;ve removed\nsupport for Python 3.6 and 3.7, we now require 3.11+ to run cibuildwheel itself,\nand EoL manylinux\/musllinux images now need to be fully specified.<\/p>\n<p>We&rsquo;ve had some fantastic releases of cibuildwheel since my last post over 2.19,\nso I&rsquo;ll include a few of the new features from those releases, too. I&rsquo;ll also\nnote a few of the features being worked on for future releases.<\/p>"},{"title":"Python \u03c0","link":"https:\/\/iscinumpy.dev\/post\/python-314\/","pubDate":"Thu, 08 May 2025 09:05:54 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-314\/","description":"<p>Python \u03c0 (3.14) is out! The big feature this time around is template strings.\nFree-threading is no longer experimental. There&rsquo;s also lots more color\n(including syntax highlighting in the REPL!), remote debugging, deferred\nevaluation of annotations, and the usual error message and performance\nimprovements. Subintepreters are now accessible without the C-API (finally!),\nand free-threaded Python is no longer experimental.<\/p>"},{"title":"Building Python Packages","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-03-19-rse\/","pubDate":"Wed, 19 Mar 2025 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-03-19-rse\/","description":{}},{"title":"Tools to help you write better code","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-01-22-sqat\/","pubDate":"Wed, 22 Jan 2025 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2025-01-22-sqat\/","description":{}},{"title":"scikit-build-core 0.10","link":"https:\/\/iscinumpy.dev\/post\/scikit-build-core-0-10\/","pubDate":"Mon, 05 Aug 2024 23:09:13 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/scikit-build-core-0-10\/","description":"<p>Scikit-build-core 0.10 is out, and it is one of the largest releases we&rsquo;ve\nproduced in terms of new configuration options. It automatically reads your\nminimum CMake version, you can tell it to read your scikit-build-core\nminimum-version, and there are settings for many of the advanced things users\nused to do with scikit-build (classic), like rebuilds or pure Python fallbacks\non build failures.<\/p>"},{"title":"The two flavors of Python 3.13","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-07-01-pyhep\/","pubDate":"Mon, 01 Jul 2024 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-07-01-pyhep\/","description":{}},{"title":"\ud83c\udfa1 cibuildwheel 2.19","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-19-0\/","pubDate":"Mon, 10 Jun 2024 12:05:51 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-19-0\/","description":"<p><a href=\"https:\/\/cibuildwheel.pypa.io\">cibuildwheel<\/a> 2.19 is out, with some very big additions. A new platform,\n<a href=\"https:\/\/pyodide.org\">Pyodide<\/a>, has been added for building WebAssembly wheels. We&rsquo;ve added CPython\n3.13 free-threaded builds, now on all OS&rsquo;s. And we have an opt-in speed\nimprovement with the <code>build[uv]<\/code> build-frontend option.<\/p>\n<p>We&rsquo;ve had some fantastic releases of cibuildwheel since my last post over 2.10,\nso I&rsquo;ll include a few of the new features from those releases, too, with a\nhighlight on a larger feature that can use more explaining: <code>inherit<\/code> for\noverrides.<\/p>"},{"title":"Modern binary build systems","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-05-17-pycon\/","pubDate":"Fri, 17 May 2024 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-05-17-pycon\/","description":{}},{"title":"Python 3.13","link":"https:\/\/iscinumpy.dev\/post\/python-313\/","pubDate":"Thu, 09 May 2024 15:33:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-313\/","description":"<p>Python 3.13 betas are out (Edit: 3.13.0 is out!), which means the features are\nlocked in. For the first time in thirty years, Python has a new, more colorful\nREPL! There&rsquo;s also a no-GIL compile-time option (free-threaded), an optional\nJIT, some new typing features, and better error messages (again).<\/p>"},{"title":"Software Quality Assurance Tooling","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-01-23-sqat\/","pubDate":"Tue, 23 Jan 2024 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-01-23-sqat\/","description":{}},{"title":"Learning Rust with Advent of Code 2023","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-01-10-rust\/","pubDate":"Wed, 10 Jan 2024 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2024-01-10-rust\/","description":{}},{"title":"Inline run dependencies in pipx 1.4.2","link":"https:\/\/iscinumpy.dev\/post\/pep723\/","pubDate":"Mon, 04 Dec 2023 15:00:06 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/pep723\/","description":"<p>While it can also do much more, Python is a fantastic language for writing small\nscripts and utilities with it&rsquo;s expressive syntax and batteries-included\nstandard library. But what if you need just a bit more? PyPI is one of the best\npackage repositories for any language, and being able to access it <em>without<\/em>\nhaving to write a multi-file library and setting up virtual environments would\nbe a dream - one that is becoming reality. Pipx 1.4.2 has an experimental\nimplementation of the <del>provisionally<\/del> accepted <a href=\"https:\/\/peps.python.org\/pep-0723\">PEP 723<\/a>, and I&rsquo;d like to\nshow it off here, as it&rsquo;s tremendously useful for simple scripts &amp; utilities.\nSupport is also available in Nox 2024.04.15 and Hatch 1.10.<\/p>"},{"title":"Project report - henryiii","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2023-11-13-rsepeer\/","pubDate":"Mon, 13 Nov 2023 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2023-11-13-rsepeer\/","description":{}},{"title":"Software Quality Assurance Tooling","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2023-10-27-sqat\/","pubDate":"Fri, 27 Oct 2023 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2023-10-27-sqat\/","description":{}},{"title":"C++23","link":"https:\/\/iscinumpy.dev\/post\/cpp-23\/","pubDate":"Mon, 23 Oct 2023 11:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cpp-23\/","description":"<!-- rumdl-disable-file MD024 -->\n<p>C++23 is complete and pretty much finalized, so let&rsquo;s explore the new features\nin C++, from a data science point of view. This is not as large of a release as\nC++20 or C++11, but it&rsquo;s still a hefty release with lots of nice new features -\nlarger than C++17.<\/p>\n<p>Some of the major new features are building on themes from C++20, such as vastly\nexpanded ranges and views, more <code>constexpr<\/code>\/<code>consteval<\/code>, module support for the\nstandard library, <code>std::print<\/code> to supplement <code>std::format<\/code>, and a\n<code>std::generator<\/code> to support coroutines. There are also several general features,\nlambdas and classes get along much better now, there are new preprocessor\nadditions (!), a stacktrace library, flat maps\/sets, and new <code>std::optional<\/code>\nmonadics, deducing <code>this<\/code>, and many various additions.<\/p>"},{"title":"The Scientific Python Development Guide","link":"https:\/\/iscinumpy.dev\/post\/cookie\/","pubDate":"Fri, 14 Jul 2023 00:45:32 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cookie\/","description":"<p>One outcome of the\n<a href=\"https:\/\/scientific-python.org\/summits\/developer\/2023\/\">2023 Scientific Python Developer Summit<\/a>\nwas the <a href=\"https:\/\/learn.scientific-python.org\/development\">Scientific Python Development Guide<\/a>, a comprehensive guide to modern\nPython package development, complete with a <a href=\"https:\/\/github.com\/scientific-python\/cookie\">new project template<\/a>\nsupporting 12 build backends and a <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/repo-review\">WebAssembly-powered checker<\/a>\nwith checks linked to the guide. The guide covers topics like <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/packaging-simple\/\">modern<\/a>,\n<a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/packaging-compiled\/\">compiled<\/a>, and <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/packaging-classic\/\">classic<\/a> packaging, <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/style\/\">style<\/a> checks, <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/mypy\/\">type\nchecking<\/a>, <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/docs\/\">docs<\/a>, <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/tasks\/\">task runners<\/a>, <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/gha-basic\/\">CI<\/a>, <a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/pytest\/\">tests<\/a>,\nand much more! There also are sections of <a href=\"https:\/\/learn.scientific-python.org\/development\/tutorials\/\">tutorials<\/a>, <a href=\"https:\/\/learn.scientific-python.org\/development\/principles\/\">principles<\/a>, and\nsome common <a href=\"https:\/\/learn.scientific-python.org\/development\/patterns\/\">patterns<\/a>.<\/p>\n<p>This guide (along with cookie &amp; repo-review) started in <a href=\"https:\/\/scikit-hep.org\">Scikit-HEP<\/a> in 2020.\nDuring the summit, it was merged with the <a href=\"https:\/\/nsls-ii.github.io\/\">NSLS-II<\/a> guidelines, which provided\nthe basis for the <a href=\"https:\/\/learn.scientific-python.org\/development\/principles\/\">principles<\/a> section. I&rsquo;d like to thank and acknowledge Dan\nAllan and Gregory Lee for working tirelessly during the summit to rework,\nrewrite, merge, and fix the guide, including writing most of the <a href=\"https:\/\/learn.scientific-python.org\/development\/tutorials\/\">tutorials<\/a>\npages and first <a href=\"https:\/\/learn.scientific-python.org\/development\/patterns\/\">patterns<\/a> page, and rewriting the <a href=\"https:\/\/learn.scientific-python.org\/development\/tutorials\/dev-environment\/\">environment<\/a> page as a\ntutorial.<\/p>"},{"title":"Introducing repo-review","link":"https:\/\/iscinumpy.dev\/post\/repo-review\/","pubDate":"Thu, 13 Jul 2023 22:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/repo-review\/","description":"<p>I&rsquo;ve released a new<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup> toolkit for running checks, similar to Ruff and Flake8\nbut designed to check configuration, called <a href=\"https:\/\/repo-review.readthedocs.io\">repo-review<\/a>. It requires Python\n3.10+<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote-ref\" role=\"doc-noteref\">2<\/a><\/sup> to run and has no built-in checks, but is easy to write plugins for. A\nset of checks based on the <a href=\"https:\/\/learn.scientific-python.org\/development\">Scientific Python Development Guide<\/a> (which I also\n<a href=\"https:\/\/iscinumpy.dev\/post\/cookie\">have a post about<\/a>!) are available as a plugin, <code>sp-repo-review<\/code>.\nYou can run <code>repo-review<\/code> in WebAssembly (via Pyodide), or in pre-commit, or as\na GitHub Action. It supports multiple output formats, including Rich, HTML, and\nJSON. The system is based on fixtures (like pytest) and topologically sorts\nrequirements. You don&rsquo;t need to depend on repo-review to add a repo-review\nplugin. You can see a live version using sp-repo-review\n<a href=\"https:\/\/learn.scientific-python.org\/development\/guides\/repo-review\/\">in-place here<\/a>\nor <a href=\"https:\/\/scientific-python.github.io\/repo-review\/\">standalone here<\/a>.<\/p>"},{"title":"Python 3.12","link":"https:\/\/iscinumpy.dev\/post\/python-312\/","pubDate":"Mon, 19 Jun 2023 17:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-312\/","description":"<p>Python 3.12&rsquo;s beta&rsquo;s are out, which means the features are locked in. The theme\nthis year has been cleanup and typing. <code>distutils<\/code> has been removed, and\nsetuptools is no longer present in default environments.<\/p>"},{"title":"Software Quality Assurance Tooling","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2023-01-23-sqat\/","pubDate":"Mon, 23 Jan 2023 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2023-01-23-sqat\/","description":{}},{"title":"Setup Windows","link":"https:\/\/iscinumpy.dev\/post\/setup-windows\/","pubDate":"Mon, 12 Dec 2022 11:54:16 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/setup-windows\/","description":"<p>I set up an ARM DevKit recently, so I wanted to catalog what I do to setup\nWindows here. This is not as polished or complete as my macOS setups, because\nthis is not something I use as a daily driver. But it might be useful, and I&rsquo;m\nopen to suggestions to improve it. This should work for Intel or ARM Windows.<\/p>\n<p>Also see <a href=\"https:\/\/iscinumpy.dev\/post\/setup-a-new-mac\">macOS<\/a> <a href=\"https:\/\/iscinumpy.dev\/post\/setup-apple-silicon\">(AS)<\/a>.<\/p>"},{"title":"What's new in Python 3.11","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-10-19-rse\/","pubDate":"Wed, 19 Oct 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-10-19-rse\/","description":{}},{"title":"\ud83c\udfa1 cibuildwheel 2.10","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-10-0\/","pubDate":"Tue, 13 Sep 2022 08:42:26 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-10-0\/","description":"<p><a href=\"https:\/\/github.com\/pypa\/cibuildwheel\">cibuildwheel<\/a> 2.10 is out, with some important additions. PEP 517 config\nsettings added, <code>--only<\/code> (which has an interesting use in GHA), and Cirrus CI\nsupport (including our first Apple Silicon native runner!) are highlights. We\nalso support Python 3.11 now (as of 2.11.2, RC&rsquo;s in older releases).<\/p>\n<p>We&rsquo;ve had some fantastic releases of cibuildwheel this year, including some very\npowerful features you might be interested in using, and I haven&rsquo;t covered\nreleases since 2.2, so let&rsquo;s take an in-depth look at what&rsquo;s new for this and\nthe last few releases!<\/p>"},{"title":"Everything you didn't know you needed","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-08-05-codas-hep\/","pubDate":"Fri, 05 Aug 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-08-05-codas-hep\/","description":{}},{"title":"Python 3.10","link":"https:\/\/iscinumpy.dev\/post\/python-310\/","pubDate":"Sat, 23 Jul 2022 10:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-310\/","description":"<p>Python 3.10 is out (and has been for a while, I&rsquo;m late posting this), with new\nfeatures and changes. The big new language feature this update is pattern\nmatching. We get much better errors, the always-present typing improvements, and\nfinally some real usage of the new PEG parser from 3.9.<\/p>"},{"title":"Building binary extensions with pybind11, scikit build, and cibuildwheel","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-07-15-scipy\/","pubDate":"Fri, 15 Jul 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-07-15-scipy\/","description":{}},{"title":"Awkward Packaging: building Scikit-HEP","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-07-14-scipy\/","pubDate":"Thu, 14 Jul 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-07-14-scipy\/","description":{}},{"title":"Python 3.11","link":"https:\/\/iscinumpy.dev\/post\/python-311\/","pubDate":"Wed, 11 May 2022 16:11:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-311\/","description":"<p>Python 3.11 has hit the beta (now released!) stage, which means no more new\nfeatures. It&rsquo;s a perfect time to play with it! The themes in this update are the\nstandard ones: The faster CPython project is now fully going (3.11 is 25% faster\non average), along with improved error messages, typing, and asyncio. Beyond\nthis, the only major new feature is a library for reading TOML files; this\nprobably only exciting if you are involved in Python packaging (but I am, so I&rsquo;m\nexcited!).<\/p>"},{"title":"Scikit-HEP Developer Pages: Guidelines for modern packaging","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-04-30-pycon\/","pubDate":"Sat, 30 Apr 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-04-30-pycon\/","description":{}},{"title":"Building Binary Packages","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-04-29-pycon\/","pubDate":"Fri, 29 Apr 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-04-29-pycon\/","description":{}},{"title":"Digital RSE: Automatic Code Quality Checks","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-03-09-rse\/","pubDate":"Tue, 08 Mar 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-03-09-rse\/","description":{}},{"title":"boost-histogram \/ Hist","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-03-02-pyhep\/","pubDate":"Wed, 02 Mar 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-03-02-pyhep\/","description":{}},{"title":"CMake best practices","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-02-02-sc\/","pubDate":"Wed, 02 Feb 2022 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2022-02-02-sc\/","description":{}},{"title":"Python 3.7","link":"https:\/\/iscinumpy.dev\/post\/python-37\/","pubDate":"Sat, 15 Jan 2022 22:41:05 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-37\/","description":"<p>Python 3.7 has been out for a while. In fact, it&rsquo;s the oldest version of Python\nstill receiving support when this was written. I&rsquo;d still like to write a &ldquo;what&rsquo;s\nnew&rdquo;, targeting users who are upgrading to a Python 3.7+ only codebase, and want\nto know what to take advantage of!<\/p>"},{"title":"Poetry Versions","link":"https:\/\/iscinumpy.dev\/post\/poetry-versions\/","pubDate":"Thu, 09 Dec 2021 11:00:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/poetry-versions\/","description":"<p><a href=\"https:\/\/python-poetry.org\">Poetry<\/a> provides a all in one solution to Python packaging. I want to focus\non why I was quite hard on Poetry in my last post, specifically on its default\nversion capping and solver quirks, and also a few other negative things. This is\na followup to\n<a href=\"https:\/\/iscinumpy.dev\/post\/bound-version-constraints\">Should you have upper version bounds<\/a>, which\nyou should read before this post.<\/p>"},{"title":"Should You Use Upper Bound Version Constraints?","link":"https:\/\/iscinumpy.dev\/post\/bound-version-constraints\/","pubDate":"Thu, 09 Dec 2021 10:00:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/bound-version-constraints\/","description":"<p>Bound version constraints (upper caps) are starting to show up in the Python\necosystem. This is causing <a href=\"https:\/\/github.com\/scikit-hep\/pyhf\/discussions\/1595\">real world problems<\/a> with\nlibraries following this recommendation, and is likely to <a href=\"https:\/\/github.com\/pypa\/packaging\/pull\/482#issuecomment-963030131\">continue to get\nworse<\/a>; this practice does not scale to large numbers\nof libraries or large numbers of users. In this discussion I would like to\nexplain why <em>always<\/em> providing an upper limit causes far more harm than good\n<em>even for true SemVer libraries<\/em>, why libraries that pin upper limits require\n<em>more frequent<\/em> updates rather than less, and why it is not scalable. After\nreading this, hopefully you will always consider every cap you add, you will\nknow the (few) places where pinning an upper limit is reasonable, and will\npossibly even avoid using libraries that pin upper limits needlessly until the\nauthor updates them to remove these pins.<\/p>\n<p>If this 10,000 word behemoth is a bit long for you, then skip around using the\ntable of contents, or see the <a href=\"#tldr\">TL;DR<\/a> section at the end, or read\n<a href=\"https:\/\/bernat.tech\/posts\/version-numbers\">version numbers by Bern\u00e1t G\u00e1bor<\/a>, which is shorter but is a\nfantastic read with good examples and cute dog pictures. Or\n<a href=\"https:\/\/hynek.me\/articles\/semver-will-not-save-you\/\">Hynek&rsquo;s Semantic Versioning Will Not Save You<\/a>\nBe sure to check at least\n<a href=\"#analysis-of-a-javascript-project\">the JavaScript project analysis<\/a> before you\nleave!<\/p>\n<p>Also be warned, I pick on <a href=\"https:\/\/python-poetry.org\">Poetry<\/a> quite a bit. The rising popularity of\n<a href=\"https:\/\/python-poetry.org\">Poetry<\/a> is likely due to the simplicity of having one tool vs. many for\npackaging, but it happens to also have a special dependency solver, a new upper\nbound syntax, and a <a href=\"https:\/\/python-poetry.org\/docs\/faq\/#why-are-unbound-version-constraints-a-bad-idea\">strong recommendation to always limit upper\nversions<\/a> - in direct opposition to <a href=\"https:\/\/snarky.ca\/why-i-dont-like-semver\/\">members of the\nPython core developer team<\/a> and PyPA developers. Not\nall libraries with excessive version capping are Poetry projects (like\nTensorFlow), but many, many of them are. To be clear, Poetry doesn&rsquo;t force\nversion pinning on you, but it does push you really, really hard to always\nversion cap, and it&rsquo;s targeting new Python users that don&rsquo;t know any better yet\nthan to accept bad recommendations. And these affect the whole ecosystem,\nincluding users who do not use poetry, but want to depend on libraries that do!\nI do really like other aspects of Poetry, and would like to\n<a href=\"https:\/\/iscinumpy.dev\/post\/scikit-build-proposal\">eventually<\/a> help it build binary packages with Scikit-build\n(CMake) via a plugin, and it has some great developers. If I don&rsquo;t pick on\nPoetry enough for you, don&rsquo;t worry, I have a\n<a href=\"https:\/\/iscinumpy.dev\/post\/poetry-versions\">follow-up post<\/a> that picks on it in much more detail.\nAlso, check out <a href=\"https:\/\/pdm.fming.dev\">pdm<\/a>, which gives many of the benefits of Poetry while\nfollowing PEP standards. Also <a href=\"https:\/\/pixi.sh\">pixi<\/a>, which works with the Conda ecosystem.<\/p>\n<p>If you come across something that can&rsquo;t be solved, try using\n<code>--exclude-newer &lt;DATE&gt;<\/code> in <a href=\"https:\/\/github.com\/astral-sh\/uv\">uv<\/a> and <a href=\"https:\/\/pdm.fming.dev\">pdm<\/a>. This limits the solve by\nignoring packages newer than some date.<\/p>\n<!-- prettier-ignore-start -->\n<!-- prettier-ignore-end -->"},{"title":"App vs Library","link":"https:\/\/iscinumpy.dev\/post\/app-vs-library\/","pubDate":"Thu, 09 Dec 2021 09:00:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/app-vs-library\/","description":"<p>What is the difference between an app and a library? This seemingly simple\nquestion confuses some, and it turns out to be a harder question to answer than\nyou might expect. While the actual distinction between these common terms will\nalways be muddled in practice, I propose a specific definition to be used when\nconsidering dependencies. This distinction is important when\n<a href=\"https:\/\/iscinumpy.dev\/posts\/bound-version-constraints\">discussing bound version constraints<\/a> in the\nnext post.<\/p>"},{"title":"Scikit Build Proposal","link":"https:\/\/iscinumpy.dev\/post\/scikit-build-proposal\/","pubDate":"Wed, 27 Oct 2021 08:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/scikit-build-proposal\/","description":"<p>I&rsquo;ve spent the last few years trying to make it easy for anyone to extend Python\nwith compiled languages. I&rsquo;ve worked on <a href=\"https:\/\/github.com\/pybind\/pybind11\">pybind11<\/a>, a powerful C++ library\nthat allows users to write advanced Python extensions using just C++11, used by\nsome of the largest projects, SciPy, PyTorch, Google, LLVM, and tens of\nthousands of other libraries, down to very small extensions. I also work on\n<a href=\"https:\/\/github.com\/pypa\/cibuildwheel\">cibuildwheel<\/a>, which makes building binaries (called wheels) on continuous\nintegration (CI) simple. It is again powerful enough to used by huge projects,\nlike Scikit-learn, matplotlib, mypy; and is simple enough to be used by hundreds\nof other packages. Recently it was accepted into the Python Packaging Authority\n(PyPA). There is one missing piece, though, to complete this picture of compiled\nextensions that easy to use for small projects, and powerful enough for large\nprojects: the build system. I believe the solution to that is <a href=\"https:\/\/github.com\/scikit-build\/scikit-build\">scikit-build<\/a>,\nand I&rsquo;d like to work on it over the next three years.<\/p>\n<p>Scikit-build is a tool for integrating a package with a CMake build system into\nPython. You can utilize the vast collection of packages and projects using CMake\nalready, and you have access to modern building features, like multithreaded\nbuilds, library discovery, superb compiler and IDE support, and all sorts of\nextended tooling. Modern CMake is quite pleasant to write compared to times\npast; I have written <a href=\"https:\/\/cliutils.gitlab.io\/modern-cmake\/\">a book<\/a> and <a href=\"https:\/\/hsf-training.github.io\/hsf-training-cmake-webpage\">training course<\/a> on it. We\nship up-to-date <code>cmake<\/code> and <code>ninja<\/code> wheels for all binary platforms.<\/p>\n<p>Update: Funded! I&rsquo;ll be working on this starting August 1, 2022!<\/p>\n<p>I wrote a proposal for an NSF CSSI Elements project containing three parts. The\nfirst part will cover core development on Scikit-build to address the current\nshortcomings and to prepare it for a post-distutils (Python 3.12+) world. The\nsecond part would cover assisting libraries with a science use case in either\ntransitioning to scikit-build (ideally from an existing CMake build system with\nPython bindings, but I can help mentor developers in writing bindings (ideally\npybind11), setting up CI, and writing CMake code as well (see my book or\nworkshop on Modern CMake, and I&rsquo;m happy to help old scikit-build projects\ntransition to better practices). As part of this, I would be building up the\nexamples and documentation, leading into the third part of the proposal: A\nseries of training events and training material, including plans for something\nalongside SciPy.<\/p>\n<p>You can also see an outline at\n<a href=\"https:\/\/github.com\/scikit-build\/scikit-build\/wiki\">scikit-build\/scikit-build\/wiki<\/a>\nor at the end of this post.<\/p>\n<p>Thank you for all the projects! The proposal was submitted Dec 8, 2021; mid year\nwe should find out if it was accepted!<\/p>"},{"title":"Useful Links","link":"https:\/\/iscinumpy.dev\/page\/useful-links\/","pubDate":"Fri, 22 Oct 2021 15:44:45 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/useful-links\/","description":"<h2 id=\"python\">Python<\/h2>\n<h3 id=\"learning-materials\">Learning materials<\/h3>\n<ul>\n<li><a href=\"https:\/\/hepsoftwarefoundation.org\/training\/curriculum.html\">HSF training curriculum (Python, bash, git, docker, and more)<\/a><\/li>\n<\/ul>\n<h3 id=\"topical-articles\">Topical articles<\/h3>\n<h4 id=\"cpython-core-developers\">CPython core developers<\/h4>\n<p><strong>Brett Cannon<\/strong> is a CPython core developer, and is very interested in\nstandardizing packaging. <a href=\"https:\/\/snarky.ca\">https:\/\/snarky.ca<\/a><\/p>\n<ul>\n<li><a href=\"https:\/\/snarky.ca\/why-i-dont-like-semver\/\">Why I don&rsquo;t like SemVer anymore<\/a>:\nA great resource to make you think about what SemVer means and where it falls\nshort.<\/li>\n<li><a href=\"https:\/\/snarky.ca\/what-the-heck-is-pyproject-toml\/\">What the heck is pyproject.toml<\/a>:\nA intro to modern Python packaging<\/li>\n<li><a href=\"https:\/\/snarky.ca\/a-quick-and-dirty-guide-on-how-to-install-packages-for-python\/\">A quick-and-dirty guide on how to install packages for Python<\/a>:\nThis showw the &ldquo;correct&rdquo; way to throw together packages (pre-pipx).<\/li>\n<\/ul>\n<p><strong>Paul Ganssle<\/strong> is CPython core developer, and maintains zoneinfo.\n<a href=\"https:\/\/blog.ganssle.io\">https:\/\/blog.ganssle.io<\/a><\/p>"},{"title":"\ud83c\udfa1 cibuildwheel 2.2","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-2-0\/","pubDate":"Wed, 20 Oct 2021 11:27:29 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-2-0\/","description":"<p>Another great release from <a href=\"https:\/\/cibuildwheel.readthedocs.io\">cibuildwheel<\/a>, <a href=\"https:\/\/github.com\/pypa\/cibuildwheel\/releases\/tag\/v2.2.0\">2.2.0<\/a>, is out! There are a few\nimportant additions in this release that you should be aware of, so I will\noutline the major changes here. We will cover the new musllinux wheels, overload\nconfiguration, and incoming changes to pip and PyPy expected in the next\nrelease. As always, it is recommended that you pin your cibuildwheel version and\nthen provide some automated way to keep the pin up-to-date, such as GitHub&rsquo;s\ndependabot. You should be updating just before you make a release, as well, but\nyou probably don&rsquo;t want to be surprised by new wheels during your release\nprocess!<\/p>"},{"title":"\ud83c\udfa1 cibuildwheel 2.0","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-0\/","pubDate":"Fri, 16 Jul 2021 12:23:20 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-2-0\/","description":"<p>The <a href=\"https:\/\/cibuildwheel.readthedocs.io\">cibuildwheel<\/a> package has just had a major release with some fantastic\nfeatures. Python 2.7 and 3.5 support has been removed (and PyPy3.6), allowing us\nto update to the latest manylinux and auditwheel versions, and support the newly\nunified manylinux PyPy3.7 images. We now allow users to select <code>pypa\/build<\/code> as a\nbuild frontend. We now have a custom option to enable pre-release Pythons (3.10\ncurrently) for testing before they are ABI stable (please don&rsquo;t release wheels\nuntil that happens). Maybe most exciting, cibuildwheel now supports\nconfiguration in <code>pyproject.toml<\/code>, allowing you to be even further isolated from\ndependence on your CI system; you can easily produce Linux and Windows wheels\nlocally (macOS still installs to system locations). And, since my\n<a href=\"https:\/\/iscinumpy.dev\/posts\/cibuildwheel-1-9-0\">last post<\/a> and\n<a href=\"https:\/\/iscinumpy.dev\/posts\/overview-of-cibuildwheel\">introduction post<\/a>, cibuildwheel is now part\nof the PyPA!<\/p>"},{"title":"pybind11","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-16-scipy\/","pubDate":"Fri, 16 Jul 2021 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-16-scipy\/","description":{}},{"title":"Announcing CLI11 2.0","link":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-20\/","pubDate":"Wed, 14 Jul 2021 14:34:02 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-20\/","description":"<p><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a>, a powerful library for writing beautiful command line interfaces in\nC++11, has <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/releases\/tag\/v2.0.0\">been updated to 2.0<\/a>. A lot of deprecated things have been\nremoved, and there was a lot of cleanup under-the-hood; making CLI11 simpler. A\nfew defaults have changed slightly, like better TOML support by default.<\/p>\n<p>CLI11 does a better job than ever understanding any sort of container you\nprovide - complex numbers are natively supported, along with atomic types. A\nlong requested feature, simple version flags, has been added. Subcommands are\nmore customizable. And there have been quite a few bugfixes for rare issues.<\/p>"},{"title":"Powerful Python Packaging for Scientific Codes","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-08-pyhep\/","pubDate":"Thu, 08 Jul 2021 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-08-pyhep\/","description":{}},{"title":"High-Performance Histogramming for HEP Analysis","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-07-pyhep\/","pubDate":"Wed, 07 Jul 2021 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-07-pyhep\/","description":{}},{"title":"Level Up Your Python (part 2)","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-06-pyhep\/","pubDate":"Tue, 06 Jul 2021 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-06-pyhep\/","description":{}},{"title":"Level Up Your Python (part 1)","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-05-pyhep\/","pubDate":"Mon, 05 Jul 2021 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-07-05-pyhep\/","description":{}},{"title":"Python 3.9","link":"https:\/\/iscinumpy.dev\/post\/python-39\/","pubDate":"Fri, 12 Feb 2021 12:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-39\/","description":"<p>Python 3.9 is out (and has been for a while, I&rsquo;m late posting this), with new\nfeatures and changes. The themes for this release have been heavily internal\nimprovements, such as a new more powerful parser, and the usual static typing\nimprovements, along with a several bits new-user facing new syntax. This makes\n3.9 a smaller release, but still it has some nice features of note.<\/p>"},{"title":"Setup an Apple Silicon Mac","link":"https:\/\/iscinumpy.dev\/post\/setup-apple-silicon\/","pubDate":"Thu, 11 Feb 2021 17:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/setup-apple-silicon\/","description":"<p>I recently got an M1 mac, and I&rsquo;ll be cataloging my experience with using it for\nscientific software development. I&rsquo;ll be returning to update this page\nperiodically, and will eventually have a focused recommendation for Apple\nSilicon setup, similar to <a href=\"https:\/\/iscinumpy.dev\/post\/setup-a-new-mac\">my Intel setup<\/a>.<\/p>"},{"title":"\ud83c\udfa1 cibuildwheel 1.8.0 and 1.9.0","link":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-1-9-0\/","pubDate":"Sun, 07 Feb 2021 20:13:41 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cibuildwheel-1-9-0\/","description":"<p><a href=\"https:\/\/cibuildwheel.readthedocs.io\"><code>cibuildwheel<\/code><\/a> has just had two back-to-back releases, two weeks apart,\nrepresenting several months of hard work and some exciting few features! I will\nbe covering both releases at once, so we will discuss Apple Silicon support,\narchitecture emulation on Linux, integrated PEP 621 Requires-Python support, the\nnative GitHub Action, extended build and test controls, and more!<\/p>\n<p>If you are following the releases, 1.7.0 came out last November (2020), and\nincluded the fantastic output folding feature, which makes logs much easier to\nread on CI systems that support folding, and makes it much easier to see how\nlong each step takes. The 1.7.x series also included the addition of the\n<a href=\"https:\/\/cibuildwheel.readthedocs.io\/en\/stable\/working-examples\/\">working examples section<\/a> of the documentation, which tracks\nsome known projects using <code>cibuildwheel<\/code>, such as scikit-learn, Matlotlib, and\nMyPy; it is a great place to go to look into how other projects have integrated\n<a href=\"https:\/\/cibuildwheel.readthedocs.io\"><code>cibuildwheel<\/code><\/a> into their workflow.<\/p>\n<p>I have an <a href=\"https:\/\/iscinumpy.dev\/posts\/overview-of-cibuildwheel\">general overview post<\/a> as well. Now\nlet&rsquo;s look at what&rsquo;s new! Update: cibuildwheel is now an official package of the\nPyPA!<\/p>"},{"title":"Overview of cibuildwheel \ud83c\udfa1","link":"https:\/\/iscinumpy.dev\/post\/overview-of-cibuildwheel\/","pubDate":"Sat, 06 Feb 2021 20:58:16 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/overview-of-cibuildwheel\/","description":"<p>This is the first of two posts on <a href=\"https:\/\/cibuildwheel.readthedocs.io\"><code>cibuildwheel<\/code><\/a>, a fantastic project I\njoined after switching to it from my own <a href=\"https:\/\/github.com\/scikit-hep\/azure-wheel-helpers\">azure-wheel-helpers<\/a>, which I&rsquo;ve\nblogged about <a href=\"https:\/\/iscinumpy.dev\/post\/azure-devops-python-wheels\/\">here before<\/a>. It is the best wheelbuilding\nsystem available for Python today, and can make something that is normally a\npain to setup and a headache to maintain a breeze (by forcing all the headaches\non us, of course, as maintainers, but it&rsquo;s better to solve issues centrally!\nObviously we rather like solving these problems. Or we are just crazy, which is\nalso possible ;) ).<\/p>\n<p>Be sure to checkout\n<a href=\"https:\/\/iscinumpy.dev\/posts\/cibuildwheel-1-9-0\">the followup post over new features in 1.8.0 and 1.9.0<\/a>,\ntoo! Also, <code>cibuildwheel<\/code> was recently accepted into the PyPA!<\/p>"},{"title":"CMake: Best Practices","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-02-02-scrt\/","pubDate":"Tue, 02 Feb 2021 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2021-02-02-scrt\/","description":{}},{"title":"pybind11 2.6.0","link":"https:\/\/iscinumpy.dev\/post\/pybind11-2-6-0\/","pubDate":"Wed, 21 Oct 2020 15:00:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/pybind11-2-6-0\/","description":"<figure class=\"transparent\">\n <img src=\"https:\/\/iscinumpy.dev\/post\/pybind11-2-6-0\/images\/pybind11-logo.png\" alt=\"pybind11 logo\" width=\"405\" \/>\n<\/figure>\n\n\n<p>I am pleased to announce the release of <a href=\"https:\/\/github.com\/pybind\/pybind11\/releases\/tag\/v2.6.0\">pybind11 2.6.0<\/a>! This is the largest\nrelease since 2.2 (released over three years ago). I would like to highlight\nsome of the key changes below; be sure to check out the <a href=\"https:\/\/pybind11.readthedocs.io\/en\/latest\/changelog.html\">changelog<\/a> and\n<a href=\"https:\/\/pybind11.readthedocs.io\/en\/latest\/upgrade.html\">upgrade guide<\/a> for more information! The focus of this release was stability,\npackaging, and supporting more platforms, though there are a lot of small\nfeatures and useful additions, covered by <a href=\"https:\/\/pybind11.readthedocs.io\">newly expanded docs<\/a>.<\/p>"},{"title":"Making of SciPy 2020's High Performance Histograms as Objects","link":"https:\/\/iscinumpy.dev\/post\/making-of-scipy-2020\/","pubDate":"Thu, 13 Aug 2020 12:05:13 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/making-of-scipy-2020\/","description":"<figure class=\"transparent\">\n <img src=\"https:\/\/www.youtube.com\/watch?v=ERraTfHkPd0\" alt=\"Screenshot of SciPy video showing overlay effect\" width=\"80%\" \/>\n<\/figure>\n\n\n<p>Now that SciPy 2020 is over, I would like to share the process I used to create\nthe talk video. The effect was designed to recreate the feeling of watching an\nactual in-person talk. I will first cover parts, detailing what I got and some\ngeneral suggestions, then I&rsquo;ll discuss the filming process, and finally, I will\ncover the post-process procedure and software. The entire process took about a\nday and a half, with an overnight render, and cost about $200 (best compared to\nthe cost of registration of a live conference).<\/p>"},{"title":"The boost-histogram Package","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2020-07-17-pyhep\/","pubDate":"Fri, 17 Jul 2020 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2020-07-17-pyhep\/","description":{}},{"title":"boost-histogram: High-performance histograms as objects","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2020-07-07-scipy\/","pubDate":"Tue, 07 Jul 2020 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2020-07-07-scipy\/","description":{}},{"title":"Johns Hopkins COVID-19 Dataset in Pandas","link":"https:\/\/iscinumpy.dev\/post\/johns-hopkins-covid\/","pubDate":"Mon, 30 Mar 2020 15:30:00 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/johns-hopkins-covid\/","description":"<p>COVID-19 is ravaging the globe. Let&rsquo;s look at the excellent Johns Hopkins\ndataset using Pandas. This will serve both as a guideline for getting the data\nand exploring on your own, as well as an example of Pandas multi-indexing in an easy\nto understand situation. I am currently involved in <a href=\"https:\/\/science-responds.org\">science-responds<\/a>.<\/p>"},{"title":"Python, NumPy, and Pandas","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2020-01-28-rdm\/","pubDate":"Tue, 28 Jan 2020 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2020-01-28-rdm\/","description":{}},{"title":"The boost-histogram beta release","link":"https:\/\/iscinumpy.dev\/post\/boost-histogram-06\/","pubDate":"Fri, 13 Dec 2019 11:00:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/boost-histogram-06\/","description":"<figure class=\"transparent\">\n <img src=\"https:\/\/iscinumpy.dev\/post\/boost-histogram-06\/images\/BoostHistogramPythonLogo.png\" alt=\"boost-histogram logo\" width=\"405\" \/>\n<\/figure>\n\n\n<p>The foundational histogramming package for Python, <a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\">boost-histogram<\/a>, hit beta\nstatus with version 0.6! This is a major update to the new <a href=\"https:\/\/github.com\/boostorg\/histogram\">Boost.Histogram<\/a>\nbindings. Since I have not written about boost-histogram yet here, I will\nintroduce the library in its current state. Version 0.6.2 was based on the\nrecently released <a href=\"https:\/\/www.boost.org\">Boost C++ Libraries<\/a> <a href=\"https:\/\/www.boost.org\/users\/history\/version_1_72_0.html\">1.72<\/a> Histogram\npackage. Feel free to <a href=\"https:\/\/boost-histogram.readthedocs.io\/en\/latest\/\">visit the docs<\/a>, or keep reading\nthis post.<\/p>\n<p>This Python library is part of a larger picture in the <a href=\"https:\/\/scikit-hep.org\">Scikit-HEP<\/a> ecosystem\nof tools for Particle Physics and is funded by <a href=\"https:\/\/diana-hep.org\">DIANA\/HEP<\/a> and <a href=\"https:\/\/iris-hep.org\">IRIS-HEP<\/a>.\nIt is the core library for making and manipulating histograms. Other packages\nare under development to provide a complete set of tools to work with and\nvisualize histograms. The <a href=\"https:\/\/github.com\/scikit-hep\/aghast\">Aghast<\/a> package is designed to convert between\npopular histogram formats, and the Hist package will be designed to make common\nanalysis tasks simple, like plotting via tools such as the <a href=\"https:\/\/github.com\/scikit-hep\/mplhep\">mplhep<\/a> package.\nHist and Aghast will be initially driven by HEP (High Energy Physics and\nParticle Physics) needs, but outside issues and contributions are welcome and\nencouraged.<\/p>"},{"title":"High-Performance Python: GPUs","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-12-05-minicourse\/","pubDate":"Thu, 05 Dec 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-12-05-minicourse\/","description":{}},{"title":"High-Performance Python: CPUs","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-11-20-minicourse\/","pubDate":"Wed, 20 Nov 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-11-20-minicourse\/","description":{}},{"title":"Recent developments in histogram libraries","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-11-07-chep\/","pubDate":"Thu, 07 Nov 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-11-07-chep\/","description":{}},{"title":"Python 3.8","link":"https:\/\/iscinumpy.dev\/post\/python-38\/","pubDate":"Fri, 25 Oct 2019 14:11:20 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-38\/","description":"<p>Python 3.8 is out, with new features and changes. The themes for this release\nhave been performance, ABI\/internals, and static typing, along with a smattering\nof new syntax. Given the recent\n<a href=\"https:\/\/numpy.org\/neps\/nep-0029-deprecation_policy.html\">community statement on Python support<\/a>,\nwe should be staying up to date with the current changes in Python. As Python 2\nsunsets, we are finally in an era where we can hope to someday use the features\nwe see coming out of Python release again!<\/p>"},{"title":"Python 3.8: What's new","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-10-17-pyhep-python38\/","pubDate":"Thu, 17 Oct 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-10-17-pyhep-python38\/","description":{}},{"title":"Python Histogramming Packages","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-10-17-pyhep-hist\/","pubDate":"Thu, 17 Oct 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-10-17-pyhep-hist\/","description":{}},{"title":"Boost Histogram Roadmap","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-09-12-irisretreat\/","pubDate":"Thu, 12 Sep 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-09-12-irisretreat\/","description":{}},{"title":"Modern CMake Workshop","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-08-20-atlas\/","pubDate":"Tue, 20 Aug 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-08-20-atlas\/","description":{}},{"title":"Modern CMake","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-08-14-picscie\/","pubDate":"Wed, 14 Aug 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-08-14-picscie\/","description":{}},{"title":"C++20","link":"https:\/\/iscinumpy.dev\/post\/cpp-20\/","pubDate":"Sat, 20 Jul 2019 22:42:21 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cpp-20\/","description":"<p>The final meeting for new features in C++ is over, so let&rsquo;s explore the new\nfeatures in C++, from a data science point of view. This is the largest release\nof C++ since C++11, and when you consider C++14 and C++17 to be interim\nreleases, the entire 9 year cycle is possibly the largest yet! It may not feel\nquite as massive as C++11, since we didn&rsquo;t have interim releases for C++11 and\nbecause C++11 is a much more complete, useful language than C++03, but this is\nstill a really impactful release! This is also the first version to include\nevery major feature from Bjarne Stroustrup&rsquo;s &ldquo;The design and Evolution of C++&rdquo;,\nalso known as D&amp;E, from 1994!<\/p>\n<p>Let&rsquo;s look at the major new features, as well as collections of smaller ones.<\/p>"},{"title":"Setup a New Mac","link":"https:\/\/iscinumpy.dev\/post\/setup-a-new-mac\/","pubDate":"Thu, 18 Jul 2019 11:01:06 -0400","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/setup-a-new-mac\/","description":"<p>Here is a list of my favorite things to do to properly setup macOS for\nscientific work. I periodically update it; feel free to leave a comment if\nsomething breaks. This should work on macOS 11 on Intel; see\n<a href=\"https:\/\/iscinumpy.dev\/post\/setup-apple-silicon\">my post on Apple Silicon<\/a> to track progress on a\nsimilar setup.<\/p>"},{"title":"AmpGen & Particle\/DecayLanguage","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-06-19-iris-apd\/","pubDate":"Wed, 19 Jun 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-06-19-iris-apd\/","description":{}},{"title":"Histograms","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-06-19-iris-hist\/","pubDate":"Wed, 19 Jun 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-06-19-iris-hist\/","description":{}},{"title":"Azure DevOps: Python Wheels","link":"https:\/\/iscinumpy.dev\/post\/azure-devops-python-wheels\/","pubDate":"Tue, 07 May 2019 22:00:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/azure-devops-python-wheels\/","description":"<p>Note: I now <em>highly<\/em> recommend <a href=\"https:\/\/cibuildwheel.readthedocs.io\">cibuildwheel<\/a> instead of custom binary wheels.\nSee <a href=\"https:\/\/scikit-hep.org\/developer\/gha_pure\">GHA Pure Python Wheels<\/a> and <a href=\"https:\/\/scikit-hep.org\/developer\/gha_wheels\">GHA Binary Wheels<\/a> for modern methods to\nproduce wheels on GitHub Actions (directly applicable to Azure, as well, with\nminor changes; cibuildwheel works on all most major CI providers).\n<a href=\"https:\/\/iscinumpy.dev\/tags\/cibuildwheel\/\">See my new posts on cibuildwheel!<\/a><\/p>\n<p>This is the third post in <a href=\"https:\/\/iscinumpy.dev\/categories\/azure-devops\">a series<\/a> about Azure\nDevOps. This one is about making Python wheels. If you <a href=\"https:\/\/pythonwheels.com\">want to play\nnice<\/a> with Python users, or you have a complex build, this will\nmake your package far more accessible to users. They are faster to install and\nto use and more secure. We will quickly cover making universal wheels, then we\nwill move on to fully compiled binaries, including C++14, manylinux2010, and\nother hot topics. This series was developed to update the testing and releasing\nof Python packages for <a href=\"http:\/\/scikit-hep.org\">Scikit-HEP<\/a>. The results of this tutorial can be seen\nin the <a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\">boost-histogram<\/a> repository, under the <code>.ci<\/code> folder.<\/p>"},{"title":"Azure DevOps: Releases","link":"https:\/\/iscinumpy.dev\/post\/azure-devops-releases\/","pubDate":"Tue, 07 May 2019 21:00:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/azure-devops-releases\/","description":"<p>This is the second post in <a href=\"https:\/\/iscinumpy.dev\/categories\/azure-devops\">a series<\/a> about Azure\nDevOps. This one is about release pipelines; if you use Azure to build packages\n(like binaries, etc.), how do you push them to a final endpoint? In this\nexample, we will be building a simple pure Python package, and pushing the\nresult to Test-PyPI. You can adapt it to your situation, however. The\n<a href=\"https:\/\/iscinumpy.dev\/post\/azure-devops-python-wheels\">third post<\/a> will cover building Python\nbinaries. This series was developed to update the testing and releasing of\nPython packages for <a href=\"http:\/\/scikit-hep.org\">Scikit-HEP<\/a>. Several of the projects in SciKit-HEP are\nusing release pipelines, include <a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\">boost-histogram<\/a> and <a href=\"https:\/\/github.com\/scikit-hep\/particle\">Particle<\/a>.<\/p>\n<p>Note: I now highly recommend GitHub Actions, which is almost &ldquo;Azure 2.0&rdquo;. You\ncan read my tutorials on GitHub Actions on the <a href=\"https:\/\/scikit-hep.org\/developer\/gha_basic\">Scikit-HEP developer pages<\/a>.\nThe release process, in particular, is simpler, and you still get the benefit of\nartifacts.<\/p>"},{"title":"Azure DevOps: Introduction","link":"https:\/\/iscinumpy.dev\/post\/azure-devops-intro\/","pubDate":"Tue, 07 May 2019 20:00:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/azure-devops-intro\/","description":"<p>Continuous Integration (CI) is fantastic for software development and\ndeployment. One of the newest entries into the CI market<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup> is Microsoft&rsquo;s\n[Azure DevOps][]. Their Open Source support is impressive; it is likely part of\nthe recent push<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote-ref\" role=\"doc-noteref\">2<\/a><\/sup> by Microsoft to be more Open Source friendly. Open Source\nprojects get 10 parallel builds, unlimited build minutes, 6 hour job timeouts,\nand incredibly fast jobs on macOS, Linux, and Windows, all via a single\nplatform. Quite a few major projects<sup id=\"fnref:3\"><a href=\"#fn:3\" class=\"footnote-ref\" role=\"doc-noteref\">3<\/a><\/sup> have been moving to Azure since the\ninitial release in December 2018. The configuration of DevOps is second only to\nGitLab CI in ease of use and possibly the most expressive system available. The\nmultiple pipeline support also scales well to complicated procedures.<\/p>\n<p>This is the first in <a href=\"https:\/\/iscinumpy.dev\/categories\/azure-devops\">a series<\/a> of posts covering an\nintroduction to setting up projects in Azure DevOps, developed to update the\ntesting and releasing of Python packages for [Scikit-HEP][], a project for a\ncoherent High Energy Physics Python analysis toolset. The\n<a href=\"https:\/\/iscinumpy.dev\/post\/azure-devops-releases\">second post<\/a> covers release pipelines, and the\n<a href=\"https:\/\/iscinumpy.dev\/post\/azure-devops-python-wheels\">third<\/a> covers building binary Python packages\nusing DevOps.<\/p>\n<p>Note: I now highly recommend GitHub Actions, which is almost &ldquo;Azure 2.0&rdquo;, if you\nare interested in setting up CI. The language is very similar, although\nsimplified, with some non-backward compatible bugfixes (such as multiline\nexpressions will error if any line files, instead of just on the last line in\nAzure). You can read my tutorials on GitHub Actions on the <a href=\"https:\/\/scikit-hep.org\/developer\/gha_basic\">Scikit-HEP developer\npages<\/a>.<\/p>"},{"title":"A hybrid deep learning approach to vertexing","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-04-17-iml\/","pubDate":"Wed, 17 Apr 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-04-17-iml\/","description":{}},{"title":"boost-histogram and hist","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-04-15-iris\/","pubDate":"Mon, 15 Apr 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-04-15-iris\/","description":{}},{"title":"A hybrid deep learning approach to vertexing","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-04-03-ctd\/","pubDate":"Wed, 03 Apr 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-04-03-ctd\/","description":{}},{"title":"Conda: a complete reproducible ROOT environment in under 5 minutes","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-03-21-how-conda\/","pubDate":"Thu, 21 Mar 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-03-21-how-conda\/","description":{}},{"title":"Machine Learning for the Primary Vertex reconstruction","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-03-20-how-ml\/","pubDate":"Wed, 20 Mar 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-03-20-how-ml\/","description":{}},{"title":"A hybrid deep learning approach to vertexing","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-03-11-acat\/","pubDate":"Mon, 11 Mar 2019 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2019-03-11-acat\/","description":{}},{"title":"ROOT on Conda Forge","link":"https:\/\/iscinumpy.dev\/post\/root-conda\/","pubDate":"Wed, 13 Feb 2019 10:18:37 +0100","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/root-conda\/","description":"<p>For High Energy Physics, the go-to framework for big data analysis has been\nCERN&rsquo;s <a href=\"https:\/\/root.cern\">ROOT<\/a> framework. ROOT is a massive C++ library that even predates the\nSTL in some areas. It is<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup> <em>also<\/em> a JIT C++ interpreter called Cling, probably\nthe best in the business. If you have\n<a href=\"https:\/\/andersy005.github.io\/blog\/2018\/01\/20\/play-interactively-with-cpp-getting-started-with-xeus-cling\/\">heard of<\/a>\nthe <a href=\"https:\/\/github.com\/QuantStack\/xeus-cling\">Xeus<\/a> C++ Kernel for Jupyter, that is built on top of Cling. ROOT has\neverything a HEP physicist could want: math, plotting, histograms, tuple and\ntree structures, a very powerful file format for IO, machine learning, Python\nbindings, and more. It also does things like dictionary generation and arbitrary\nclass serialization (other large frameworks like <a href=\"https:\/\/qt.io\">Qt<\/a> have similar generation\ntools).<\/p>\n<p>You may already be guessing one of the most common problems for ROOT. It is huge\nand difficult to install &ndash; if you build from source, that&rsquo;s a several hour task\non a single core. It has gotten <a href=\"https:\/\/root.cern\/install\/\">much better<\/a> in the\nlast 6 years, and there are several places you can find ROOT, but there are\nstill areas where it is challenging. This is especially true for Python; ROOT is\nlinked to your distro&rsquo;s Python (both python2 and python3 if your distro supports\nit, as of ROOT 6.22); but the common rule for using Python is &ldquo;don&rsquo;t touch your\nsystem Python&rdquo; - so modern Python users should be in a virtual environment, and\nfor that ROOT requires the system site-packages option be enabled, which is not\nalways ideal. And, if you use the <a href=\"https:\/\/www.anaconda.com\/distribution\/\">Anaconda Python distribution<\/a>,\nwhich is the most popular scientific distribution of Python and massively\nsuccessful for ML frameworks, the general rule even for people who build ROOT\nthemselves has been: don&rsquo;t. But now, you can get a fully featured ROOT binary\npackage for macOS or Linux, Python 2.7, 3.6, 3.7, or 3.8 from <a href=\"https:\/\/conda-forge.org\">Conda-Forge<\/a>,\nthe most popular Anaconda community channel! Many more HEP recipes have now been\nadded to Conda-Forge, as well! ROOT now also provides a <a href=\"https:\/\/root.cern\/new-docker-images\/\">conda docker image<\/a>,\ntoo!<\/p>"},{"title":"ROOT Install Options","link":"https:\/\/iscinumpy.dev\/post\/root-install\/","pubDate":"Mon, 04 Feb 2019 10:44:37 +0100","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/root-install\/","description":"<p>For particle physicists, ROOT is one of the most important toolkits around. It\nis a huge suite of tools that predates the C++ standard library, and has almost\nanything a particle physicist could want. It has driven developments in other\nareas too. ROOT&rsquo;s current C++ interpreter, CLING, is the most powerful C++\ninterpreter available and is used by the Xeus project for Jupyter. The Python\nwork has helped PyPy, with CPPYY also coming from ROOT. However, due to the\nsize, complexity, and age of some parts of ROOT, it can be a bit challenging to\ninstall; and it is even more challenging when you want it to talk to Python. I\nwould like to point to the brand-new Conda-Forge ROOT package for Linux and\nmacOS, and point out a few other options for macOS installs. Note for Windows\nusers: Due to the fact that ROOT expects the type <code>long<\/code> to match the system\npointer size, 64-bit Windows cannot be supported for quite some time. While you\ncan use it in 32 bit form, this is generally impossible to connect to Python,\nwhich usually will be a 64-bit build.<\/p>"},{"title":"Illustrations and videos","link":"https:\/\/iscinumpy.dev\/page\/illustrations\/","pubDate":"Mon, 10 Dec 2018 11:32:00 +0100","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/illustrations\/","description":"<p>These are some illustrations and videos that I have made over the years.<\/p>"},{"title":"Histogram Speeds in Python","link":"https:\/\/iscinumpy.dev\/post\/histogram-speeds-in-python\/","pubDate":"Thu, 01 Nov 2018 14:58:09 +0100","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/histogram-speeds-in-python\/","description":"<p>Let&rsquo;s compare several ways of making Histograms. I&rsquo;m going to assume you would\nlike to end up with a nice OO histogram interface, so all the 2D methods will\nfill a Physt histogram. We will be using a 2 x 1,000,000 element array and\nfilling a 2D histogram, or 10,000,000 elemends in a 1D histogram. Binnings are\nregular.<\/p>\n<h2 id=\"1d-10000000-item-histogram\">1D 10,000,000 item histogram<\/h2>\n<table>\n <thead>\n <tr>\n <th>Example<\/th>\n <th>KNL<\/th>\n <th>MBP<\/th>\n <th>X24<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>NumPy: histogram<\/td>\n <td>704 ms<\/td>\n <td>147 ms<\/td>\n <td>114 ms<\/td>\n <\/tr>\n <tr>\n <td>NumPy: bincount<\/td>\n <td>432 ms<\/td>\n <td>110 ms<\/td>\n <td>117 ms<\/td>\n <\/tr>\n <tr>\n <td>fast-histogram<\/td>\n <td>337 ms<\/td>\n <td>45.9 ms<\/td>\n <td>45.7 ms<\/td>\n <\/tr>\n <tr>\n <td>Numba<\/td>\n <td>312 ms<\/td>\n <td>58.8 ms<\/td>\n <td>60.7 ms<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"2d-1000000-item-histogram\">2D 1,000,000 item histogram<\/h3>\n<table>\n <thead>\n <tr>\n <th>Example<\/th>\n <th>KNL<\/th>\n <th>MBP<\/th>\n <th>X24<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>Physt<\/td>\n <td>1.21 s<\/td>\n <td>293 ms<\/td>\n <td>246 ms<\/td>\n <\/tr>\n <tr>\n <td>NumPy: histogram2d<\/td>\n <td>456 ms<\/td>\n <td>114 ms<\/td>\n <td>88.3 ms<\/td>\n <\/tr>\n <tr>\n <td>NumPy: add.at<\/td>\n <td>247 ms<\/td>\n <td>62.7 ms<\/td>\n <td>49.7 ms<\/td>\n <\/tr>\n <tr>\n <td>NumPy: bincount<\/td>\n <td>81.7 ms<\/td>\n <td>23.3 ms<\/td>\n <td>20.3 ms<\/td>\n <\/tr>\n <tr>\n <td>fast-histogram<\/td>\n <td>53.7 ms<\/td>\n <td>10.4 ms<\/td>\n <td>7.31 ms<\/td>\n <\/tr>\n <tr>\n <td>fast-hist threaded 0.5<\/td>\n <td>(6) 62.5 ms<\/td>\n <td>9.78 ms<\/td>\n <td>(6) 15.4 ms<\/td>\n <\/tr>\n <tr>\n <td>fast-hist threaded (m)<\/td>\n <td>62.3 ms<\/td>\n <td>4.89 ms<\/td>\n <td>3.71 ms<\/td>\n <\/tr>\n <tr>\n <td>Numba<\/td>\n <td>41.8 ms<\/td>\n <td>10.2 ms<\/td>\n <td>9.73 ms<\/td>\n <\/tr>\n <tr>\n <td>Numba threaded<\/td>\n <td>(6) 49.2 ms<\/td>\n <td>4.23 ms<\/td>\n <td>(6) 4.12 ms<\/td>\n <\/tr>\n <tr>\n <td>Cython<\/td>\n <td>112 ms<\/td>\n <td>12.2 ms<\/td>\n <td>11.2 ms<\/td>\n <\/tr>\n <tr>\n <td>Cython threaded<\/td>\n <td>(6) 128 ms<\/td>\n <td>5.68 ms<\/td>\n <td>(8) 4.89 ms<\/td>\n <\/tr>\n <tr>\n <td>pybind11 sequential<\/td>\n <td>93.9 ms<\/td>\n <td>9.20 ms<\/td>\n <td>17.8 ms<\/td>\n <\/tr>\n <tr>\n <td>pybind11 OpenMP atomic<\/td>\n <td>4.06 ms<\/td>\n <td>6.87 ms<\/td>\n <td>1.91 ms<\/td>\n <\/tr>\n <tr>\n <td>pybind11 C++11 atomic<\/td>\n <td>(32) 10.7 ms<\/td>\n <td>7.08 ms<\/td>\n <td>(48) 2.65 ms<\/td>\n <\/tr>\n <tr>\n <td>pybind11 C++11 merge<\/td>\n <td>(32) 23.0 ms<\/td>\n <td>6.03 ms<\/td>\n <td>(48) 4.79 ms<\/td>\n <\/tr>\n <tr>\n <td>pybind11 OpenMP merge<\/td>\n <td>8.74 ms<\/td>\n <td>5.04 ms<\/td>\n <td>1.79 ms<\/td>\n <\/tr>\n <\/tbody>\n<\/table>"},{"title":"PV finding with CNNs","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-09-26-lhcb\/","pubDate":"Wed, 26 Sep 2018 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-09-26-lhcb\/","description":{}},{"title":"iminuit: interactive python wrapper around MINUIT2","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-09-12-root\/","pubDate":"Wed, 12 Sep 2018 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-09-12-root\/","description":{}},{"title":"A Python upgrade to the GooFit package for parallel fitting","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-07-09-chep\/","pubDate":"Mon, 09 Jul 2018 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-07-09-chep\/","description":{}},{"title":"Binding Minuit2","link":"https:\/\/iscinumpy.dev\/post\/binding-minuit2\/","pubDate":"Sat, 07 Jul 2018 21:00:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/binding-minuit2\/","description":"<p>Let&rsquo;s try a non-trivial example of a binding: Minuit2 (6.14.0 standalone\nedition).<\/p>"},{"title":"Tools to Bind to Python","link":"https:\/\/iscinumpy.dev\/post\/tools-to-bind-to-python\/","pubDate":"Sat, 07 Jul 2018 21:00:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/tools-to-bind-to-python\/","description":"<p>This was originally given as a PyHEP 2018 talk, It is designed to be\ninteractive, and can be run in SWAN if you have a CERN account. If you want to\nrun it manually, just download the repository:\n<a href=\"https:\/\/github.com\/henryiii\/pybindings_cc\">github.com\/henryiii\/pybindings_cc<\/a>.\nIt is easy to run in Anaconda.<\/p>"},{"title":"Tools to bind to Python","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-07-07-pyhep2018\/","pubDate":"Sat, 07 Jul 2018 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-07-07-pyhep2018\/","description":{}},{"title":"Announcing CLI11 1.6","link":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-16\/","pubDate":"Wed, 27 Jun 2018 14:44:40 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-16\/","description":"<p><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a>, a powerful library for writing beautiful command line interfaces in\nC++11, has <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/releases\">been updated to 1.6<\/a>, the largest update ever. CLI11\noutput is more customizable than ever, and has a better functionality separation\nunder the hood.<\/p>\n<p>CLI11 has had the formatting system completely redesigned, with minor or\ncomplete customization of the output possible. Configuration files reading and\nwriting also can be configured; a new example with json instead of ini\nformatting is included. Validators (finally) have custom help output, as well.\nMany odd corner cases have been made possible, such as interleaving options.<\/p>"},{"title":"CMake 3.11","link":"https:\/\/iscinumpy.dev\/post\/cmake-311\/","pubDate":"Mon, 02 Apr 2018 11:16:57 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cmake-311\/","description":"<p>CMake 3.11 was just released; this is particularly exciting release for CMake.\nI&rsquo;d like to give a quick and friendly introduction to the new features that\nmight make the largest difference for CMake users.<\/p>"},{"title":"Announcing GooFit 2.1","link":"https:\/\/iscinumpy.dev\/post\/announcing-goofit-21\/","pubDate":"Thu, 07 Dec 2017 03:20:00 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/announcing-goofit-21\/","description":"<!-- prettier-ignore-start -->\n<p class=\"white\"><img src=\"https:\/\/iscinumpy.dev\/images\/post\/2017\/GooFitLogo21small.png\" alt=\"GooFit logo\"><\/p>\n<!-- prettier-ignore-end -->\n<p>GooFit 2.1 introduces the full-featured Python bindings to GooFit. These\nbindings mimic the C++ usage of GooFit, including bindings for all PDFs, and\nalso provide NumPy-centric conversions, live Jupyter notebook printing, pip\ninstall, and more. Most of the examples in C++ are provided in Python form, as\nwell.<\/p>\n<p>Several other API changes were made. Observables are now distinguished from\nVariables and provided as a separate class. Both these classes are now passed\naround by copy everywhere.<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup> The three and four body amplitude classes have\nbeen refactored and simplified. OpenMP is now supported via homebrew on macOS;\nGooFit is one of the only packages that currently can build with OpenMP on the\ndefault macOS compiler. Eigen is now available, and <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a> has been updated to\nversion 1.3.<\/p>\n<p>GooFit 2.1 will receive continuing support while development on GooFit 2.2\npresses on with a new indexing scheme for PDFs.<\/p>"},{"title":"My Software","link":"https:\/\/iscinumpy.dev\/page\/software\/","pubDate":"Wed, 06 Dec 2017 13:17:33 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/software\/","description":"<h2 id=\"my-projects\">My projects<\/h2>\n<p>Besides being an admin at <a href=\"https:\/\/scikit-hep.org\">Scikit-HEP<\/a>, and active in conda-forge and\nhomebrew, these are some of the projects I work on directly:<\/p>\n<table>\n <thead>\n <tr>\n <th>Name<\/th>\n <th>Description<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"https:\/\/pybind11.readthedocs.io\">pybind11<\/a><\/td>\n <td>Binding C++11+ and Python beautifully.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/cibuildwheel.readthedocs.io\">cibuildwheel<\/a><\/td>\n <td>Create Python wheels beautifully.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/scikit-hep\/boost-histogram\">boost-histogram<\/a><\/td>\n <td>Histograms in Python based on Boost.Histogram for C++14.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a><\/td>\n <td>A powerful but easy to use C++11 command line interface parser.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/scikit-hep\/particle\">Particle<\/a><\/td>\n <td>Particle descriptions in Python.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/scikit-hep\/decaylanguage\">DecayLanguage<\/a><\/td>\n <td>Decay chains in Python.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/plumbum.readthedocs.io\/en\/latest\">Plumbum<\/a><\/td>\n <td>A shell tools library for Python, with color, ssh, paths, cli, and more.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/GooFit\/GooFit\">GooFit<\/a><\/td>\n <td>An OpenMP\/CUDA powered fitting library.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/iris-hep\/jekyll-indico\">Jekyll-Indico<\/a><\/td>\n <td>A plugin to collect Indico meetings for Jekyll, written in Ruby.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/conda-forge\/root-feedstock\">Conda-Forge ROOT<\/a><\/td>\n <td>A project that did the impossible: make ROOT a conda package!<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/utgwkk\/pytest-github-actions-annotate-failures\">pytest-github-actions-annotate-failures<\/a><\/td>\n <td>A utility to convert pytest errors to annotations in GitHub Actions.<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<p>Classic or smaller historic projects:<\/p>"},{"title":"Include What You Use","link":"https:\/\/iscinumpy.dev\/post\/include-what-you-use\/","pubDate":"Tue, 05 Dec 2017 14:06:35 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/include-what-you-use\/","description":"<p>Include-what-you-use is a promising little tool for cleaning up a codebase. It\ndidn&rsquo;t end up working for the use I had for it, but it still could be useful.\nHere is a quick guideline on installing it on macOS.<\/p>"},{"title":"Comparing CLI11 and Boost PO","link":"https:\/\/iscinumpy.dev\/post\/comparing-cli11-and-boostpo\/","pubDate":"Sun, 03 Dec 2017 16:31:50 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/comparing-cli11-and-boostpo\/","description":"<p>CLI11 started years ago as a set of tools built on Boost Program Options (PO),\nand has since matured into the powerful, easy-to-use stand-alone library it is\navailable today. If you would like to see the original inspiration for CLI11,\nlook at\n<a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/blob\/v0.1\/include\/Program.hpp\">Program.hpp in CLI11 0.1<\/a>.\nThe rest of the post will focus on a comparison between making a CLI app in the\ntwo libraries. I am going to assume that you are preparing fairly basic but\nnon-trivial programs in the following comparison.<\/p>\n<p><strong>TL;DR:<\/strong> CLI11 is more concise, and provides more control with better defaults\nin many cases, but was inspired by Boost PO.<\/p>"},{"title":"Announcing CLI11 1.3","link":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-13\/","pubDate":"Fri, 01 Dec 2017 09:03:50 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-13\/","description":"<p><a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a>, a powerful library for writing beautiful command line interfaces in\nC++11, has <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/releases\">been updated to 1.3<\/a>, the largest update ever. CLI11 is\nmore powerful than ever, and has simpler and more consistent parsing under the\nhood.<\/p>\n<p>This version focused on refactoring several key systems to ensure correct\nbehavior in the interaction of different settings. Most caveats about features\nonly working on the main App have been addressed, and extra arguments have been\nreworked. Inheritance of defaults makes configuring CLI11 much easier without\nhaving to subclass. Policies add new ways to handle multiple arguments to match\nyour favorite CLI programs. Error messages and help messages are better and more\nflexible. Several bugs and odd behaviors in the parser have been fixed.<\/p>"},{"title":"Watching GitHub Releases","link":"https:\/\/iscinumpy.dev\/post\/watching-github-releases\/","pubDate":"Tue, 28 Nov 2017 16:54:14 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/watching-github-releases\/","description":"<p>If you use an RSS feed reader, you can watch all your favorite GitHub\nrepositories for new releases! Just follow:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-text\" data-lang=\"text\"><span class=\"line\"><span class=\"cl\">https:\/\/github.com\/USER\/REPO\/releases.atom\n<\/span><\/span><\/code><\/pre><\/div><p>You can see a long discussion with other options\n<a href=\"https:\/\/github.com\/isaacs\/github\/issues\/410#issuecomment-163761492\">here<\/a>.<\/p>"},{"title":"OpenMP on High Sierra","link":"https:\/\/iscinumpy.dev\/post\/omp-on-high-sierra\/","pubDate":"Mon, 13 Nov 2017 15:41:35 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/omp-on-high-sierra\/","description":"<p>Building OpenMP code is actually possible using Apple Clang that comes default\nwith macOS&rsquo;s Xcode! Although Apple does not build the OpenMP library, the\ncompiler still supports it. In this post, I demonstrate the procedure necessary\nto include OpenMP in your build, both with the new support in CMake 3.12, as\nwell as how it would be done without it.<\/p>"},{"title":"Writing","link":"https:\/\/iscinumpy.dev\/page\/writing\/","pubDate":"Fri, 10 Nov 2017 22:08:21 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/writing\/","description":"<h2 id=\"gitjupyter-books\">Git\/Jupyter Books<\/h2>\n<p>Here is a list of GitBooks that I have either written or helped write:<\/p>\n<table>\n <thead>\n <tr>\n <th>Name<\/th>\n <th>Description<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"https:\/\/henryiii.github.io\/level-up-your-python\">Level Up Your Python<\/a><\/td>\n <td>Intermediate to advanced Python, for a Princeton Research Computing Workshop.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/cliutils.gitlab.io\/modern-cmake\/\">Modern CMake<\/a><\/td>\n <td>A fantastic, up-to-date resource for CMake the way it should be.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/henryiii\/compclass\">CompClass<\/a><\/td>\n <td>Computational Science in Python course given at the University of Cincinnati, Fall 2018.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/lhcb.github.io\/developkit-lessons\/first-development-steps\/\">DevelopKit<\/a><\/td>\n <td>Developing software in LHCb&rsquo;s Run 3.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/cliutils.gitlab.io\/plugin-term\">GitBook Plugin - Term<\/a><\/td>\n <td>A powerful terminal formatting plugin (used in other GitBooks).<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/cliutils.github.io\/CLI11\/book\/\">CLI11 Tutorial<\/a><\/td>\n <td>Command line parsing made beautiful.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/goofit.gitlab.io\/root-tutorial\">UC ROOT Tutorial<\/a><\/td>\n <td>Basic ROOT for HEP, conversion from old material.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/goofit.gitlab.io\/Goo2Torial\">GooFit 2Torial<\/a><\/td>\n <td>Using GooFit, writing GooFit.<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"tutorials-and-workshops\">Tutorials and workshops<\/h2>\n<table>\n <thead>\n <tr>\n <th>Name<\/th>\n <th>Description<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"https:\/\/hsf-training.github.io\/hsf-training-cmake-webpage\/\">HSF Modern CMake workshop<\/a><\/td>\n <td>Workshop on CMake for ATLAS students at LBNL.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/henryiii\/python-performance-minicourse\">Python CPU minicourse<\/a><\/td>\n <td>Minicourse for high-performance CPU programming.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/henryiii\/pygpu-minicourse\">Python GPU minicourse<\/a><\/td>\n <td>Minicourse for GPU programming.<\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/henryiii\/pandas-notebook\">Pandas demo<\/a><\/td>\n <td>Demo of Pandas.<\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"websites\">Websites<\/h2>\n<p>These are websites I have either created or worked on.<\/p>"},{"title":"About the author","link":"https:\/\/iscinumpy.dev\/page\/about\/","pubDate":"Tue, 10 Oct 2017 14:17:15 -0500","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/about\/","description":"<p>Henry Schreiner is a Computational Physicist \/ Research Software Engineer in\nHigh Energy Physics at Princeton University. He specializes in the interface\nbetween high-performance compiled codes and interactive computation in Python,\nin software distribution, and in interface design. He has previously worked on\ncomputational cosmic-ray tomography for archaeology and high performance GPU\nmodel fitting. He is currently a member of the IRIS-HEP project, developing\ntools for the next era of the Large Hadron Collider (LHC).<\/p>"},{"title":"Goofit 2.0","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-08-22-acat2017\/","pubDate":"Tue, 22 Aug 2017 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-08-22-acat2017\/","description":{}},{"title":"Recent developments in GooFit","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-02-12-diana-goofit\/","pubDate":"Tue, 22 Aug 2017 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2018-02-12-diana-goofit\/","description":{}},{"title":"GPUs in LHCb for Analysis","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-08-03-dpf2017\/","pubDate":"Thu, 03 Aug 2017 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-08-03-dpf2017\/","description":{}},{"title":"Modernizing GooFit: A Case Study","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-07-12-pearc17\/","pubDate":"Wed, 12 Jul 2017 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-07-12-pearc17\/","description":{}},{"title":"Announcing GooFit 2.0","link":"https:\/\/iscinumpy.dev\/post\/announcing-goofit-20\/","pubDate":"Thu, 08 Jun 2017 17:54:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/announcing-goofit-20\/","description":"<p>The next version of the premier CUDA\/OpenMP fitting program for HEP analysis,\nGooFit 2.0, <a href=\"GooFit\">has been released<\/a>. GooFit is now easy to build on a wide\nvariety of Unix systems, and supports debuggers and IDEs. GooFit is faster, has\nunit tests, and working examples. More PDFs and examples have been added, as\nwell as newly released example datasets that are downloaded automatically.\nGooFit now has built in support for MPI, and can use that to deploy to multiple\ngraphics cards on the same machine. A new command line parser (<a href=\"https:\/\/github.com\/CLIUtils\/CLI11\">CLI11<\/a>) and\ndrastically improved logging and errors have made code easier to write and\ndebug. Usage of GooFit specific terminology is now reduced, using standard\nThrust or CUDA terms when possible, lowering the barrier for new developers. A\nnew Python script has been added to assist users converting from pre 2.0 code.<\/p>\n<p>The file structure of GooFit and the build system have been completely revamped.\nThe fake <code>nvcc<\/code> features have been removed, as have the <code>rootstuff<\/code> copies of\nROOT classes. PDFs are now organized by type and compile and link separately.\nMultiple PDF caching support has improved. The build system now uses CMake and\nmanages external libraries.<\/p>\n<p>A new feature of the CMake build system is GooFit Packages, which are complete\npackages that can be added to GooFit and built, allowing analysis code to live\nin a separate location from GooFit, rather than the old method of simply forking\nGooFit and adding your analysis manually. A GooFit Package can be made into an\nexample trivially. See <a href=\"https:\/\/github.com\/maddocbf\/goofit_KKPiPi\">this package<\/a>\nfor an example.<\/p>\n<p>GooFit 2.0 will receive continuing support while development on GooFit 2.1\npresses on.<\/p>\n<h2 id=\"links\">Links<\/h2>\n<p><a href=\"https:\/\/github.com\/GooFit\/GooFit\">GooFit on GitHub<\/a> \u2022 <a href=\"https:\/\/GooFit.github.io\">GooFit webpage<\/a> \u2022\u00a0<a href=\"https:\/\/GooFit.github.io\/GooFit\">API documentation<\/a><\/p>"},{"title":"Announcing CLI11 Version 1.0","link":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-10\/","pubDate":"Thu, 01 Jun 2017 14:05:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/announcing-cli11-10\/","description":"<p>CLI11, a powerful library for writing command line interfaces in C++11, has just\nbeen released. There are no requirements beyond C++11 support (and even\n<code>&lt;regex&gt;<\/code> support not required). It works on Mac, Linux, and Windows, and has\n100% test coverage on all three systems. You can simply drop in a single header\nfile (<code>CLI11.hpp<\/code> available in <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/releases\">releases<\/a>) to use CLI11 in your own application.\nOther ways to integrate it into a build system are listed in the <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/blob\/master\/README.md\">README<\/a>.<\/p>\n<p>The library was inspired the Python libraries <a href=\"http:\/\/plumbum.readthedocs.io\/en\/latest\/\">Plumbum<\/a> and <a href=\"http:\/\/click.pocoo.org\/5\/\">Click<\/a>, and\nincorporates many of their user friendly features. The library is extensively\ndocumented, with a <a href=\"https:\/\/github.com\/CLIUtils\/CLI11\/blob\/master\/README.md\">friendly introduction<\/a>, a tutorial filled (in\nprogress) <a href=\"https:\/\/cliutils.gitlab.io\/CLI11\">GitBook<\/a>, and more technical <a href=\"https:\/\/cliutils.github.io\/CLI11\">API docs<\/a>.<\/p>"},{"title":"CLI11","link":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-04-24-diana-cli11\/","pubDate":"Mon, 24 Apr 2017 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/presentations\/2017-04-24-diana-cli11\/","description":{}},{"title":"Perfect forwarding for methods","link":"https:\/\/iscinumpy.dev\/post\/perfect-forwarding-for-methods\/","pubDate":"Fri, 17 Mar 2017 10:43:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/perfect-forwarding-for-methods\/","description":"<p>I often see perfect forwarding listed for constructor arguments, but not usually\nfor functions with a return or methods. Here is my solution for an method method\nof class <code>Cls<\/code>:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-cpp\" data-lang=\"cpp\"><span class=\"line\"><span class=\"cl\"><span class=\"k\">template<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typename<\/span> <span class=\"p\">...<\/span><span class=\"n\">Args<\/span><span class=\"o\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">static<\/span> <span class=\"k\">auto<\/span> <span class=\"n\">method<\/span><span class=\"p\">(<\/span><span class=\"n\">Cls<\/span><span class=\"o\">*<\/span> <span class=\"n\">cls<\/span><span class=\"p\">,<\/span> <span class=\"n\">Args<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"p\">...<\/span><span class=\"n\">args<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"o\">-&gt;<\/span> <span class=\"k\">typename<\/span> <span class=\"n\">std<\/span><span class=\"o\">::<\/span><span class=\"n\">result_of<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">decltype<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">Cls<\/span><span class=\"o\">::<\/span><span class=\"n\">method<\/span><span class=\"p\">)(<\/span><span class=\"n\">Cls<\/span><span class=\"p\">,<\/span> <span class=\"n\">Args<\/span><span class=\"p\">...)<\/span><span class=\"o\">&gt;::<\/span><span class=\"n\">type<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> <span class=\"k\">return<\/span> <span class=\"n\">cls<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">method<\/span><span class=\"p\">(<\/span><span class=\"n\">std<\/span><span class=\"o\">::<\/span><span class=\"n\">forward<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Args<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"p\">)...);<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>This is useful if you want to call protected classes from a \u201chelper\u201d friend\nclass, for example, to expose them to tests without having to require\nGoogleTest\/GoogleMock to be available for regular users.<\/p>"},{"title":"Setting up SSH forwarding","link":"https:\/\/iscinumpy.dev\/post\/setting-up-ssh-forwarding\/","pubDate":"Wed, 01 Mar 2017 10:49:33 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/setting-up-ssh-forwarding\/","description":"<p>SSH forwarding can improve your security along with reducing the need to type\npasswords and have multiple keys linked to your GitHub\/GitLab instance. The\nprocedure is:<\/p>"},{"title":"Lua Environment Modules","link":"https:\/\/iscinumpy.dev\/post\/lua-environment-modules\/","pubDate":"Wed, 11 Jan 2017 06:08:00 -0800","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/lua-environment-modules\/","description":"<p>This is a guide to setting up Lmod (lua environment modules) on a CentOS system.\nI&rsquo;ve used a similar procedure to set them up on a Mac, as well, so this is still\na useful guide to the workings of Lmod if you use a different system; mostly\npaths will change. On a Mac, you&rsquo;ll want to install <code>Lmod<\/code> from the <code>science<\/code>\ntap in <code>brew<\/code>. There are several good pages covering environment modules (TCL\nversion), but not many that use the newer Lua syntax. This document aims to fill\nthat roll.<\/p>"},{"title":"Python 3 upgrade","link":"https:\/\/iscinumpy.dev\/post\/python-3-upgrade\/","pubDate":"Wed, 12 Oct 2016 08:30:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/python-3-upgrade\/","description":"<p>About ten years ago, Guido Van Rossum, the Python author and Benevolent Dictator\nfor Life (BDFL), along with the Python community, decided to make several\nconcurrent backward incompatible changes to Python 2.5 and release a new\nversion, Python 3.0.<\/p>"},{"title":"C++17","link":"https:\/\/iscinumpy.dev\/post\/cpp-17\/","pubDate":"Sat, 10 Sep 2016 08:30:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cpp-17\/","description":"<p>The every-three-year cycle has changed the development of C++; we are now\ngetting consistent releases somewhere in-between the major and minor releases of\nold. The 2017 release may be called minor by some, with a huge portion of the\nplanned improvements being pushed back another 3-6 years, but there were several\nsubstantial changes in useful areas; it is much more impactful than C++14, for\nexample. This almost feels like a lead-in release to C++20.<\/p>\n<p>The <code>std::variant<\/code>, <code>std::optional<\/code>, and <code>std::any<\/code> additions to the standard\nlibrary are huge, and can restructure the way you program (and are available for\nolder C++ releases through Boost and other libraries).<\/p>"},{"title":"C++14","link":"https:\/\/iscinumpy.dev\/post\/cpp-14\/","pubDate":"Fri, 09 Sep 2016 08:30:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cpp-14\/","description":"<p>Unlike C++11, this is a minor release, focused mostly on improvements on top of\nC++11 changes, with very little that one could call &ldquo;new&rdquo;. C++14 feels a little\nmore natural than C++11 by expanding the usage of features and implementing\ncommon sense additions that were missed in the original C++11 release. There\nwere also quite a few bug fixes; several of these were backported into C++11\nmode in compilers.<\/p>\n<p>Also, while C++11 is always available in ROOT 6, C++14 requires a flag and\ncompatible compiler, so C++14 features are often unavailable. The Conda-Forge\nROOT package has C++17 enabled.<\/p>"},{"title":"C++11","link":"https:\/\/iscinumpy.dev\/post\/cpp-11\/","pubDate":"Thu, 08 Sep 2016 08:30:00 +0200","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cpp-11\/","description":"<p>C++11 was the largest change ever made to C++; and due to the changed release\nschedule, probably will remain the largest single change. It is a well thought\nout, mostly backward-compatible change that can cause you to completely rethink\nthe way you write code in C++. It is best thought of as almost a new language, a\nsort of (C++)++ language. There are too many changes to list here, and there are\nexcellent resources available, so this is meant to just give you a taste of some\nof the most useful changes.<\/p>\n<p>Many of the features work best together, or are related. There already are great\nresources for learning about C++11 (listed at the bottom of this lesson), and\nC++11 is already in use in most software. Therefore, the remainder of this\nlesson will cover a few of the common idioms in C++11 that a programmer\nexperienced with the older C++ might not immediately think of.<\/p>"},{"title":"GoogleTest and CMake","link":"https:\/\/iscinumpy.dev\/post\/googletest-and-cmake\/","pubDate":"Fri, 25 Mar 2016 16:12:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/googletest-and-cmake\/","description":"<p>This is a quick recipe for setting up CMake to use googletest in your projects.\nFirst, make a <code>tests<\/code> folder in the root of your project. Then, add\n<code>add_subdirectory(tests)<\/code> to your <code>CMakeLists.txt<\/code>, after you&rsquo;ve finished adding\nthe libraries in your project. Note that the way I&rsquo;ve written this probably\nrequires CMake 3.4+.<\/p>"},{"title":"A simple introduction to asyncio","link":"https:\/\/iscinumpy.dev\/post\/a-simple-introduction-to-asyncio\/","pubDate":"Thu, 19 Nov 2015 09:46:00 -0800","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/a-simple-introduction-to-asyncio\/","description":"<p>This is a simple explanation of the <code>asyncio<\/code> module and new supporting language\nfeatures in Python 3.5. Even though the new keywords <code>async<\/code> and <code>await<\/code> are new\nlanguage constructs, they are mostly<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup> useless without an event loop, and that\nis supplied in the standard library as <code>asyncio<\/code>. Also, you need awaitable\nfunctions, which are only supplied by <code>asyncio<\/code> (or in the growing set of async\nlibraries, like <code>asyncssh<\/code>, <code>quamash<\/code> etc.).<\/p>"},{"title":"A little example of how asyncio works","link":"https:\/\/iscinumpy.dev\/post\/a-little-example-of-how-asyncio-works\/","pubDate":"Thu, 19 Nov 2015 09:43:00 -0800","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/a-little-example-of-how-asyncio-works\/","description":"<p>This is a simple example to show how Asyncio works without using Asyncio itself,\ninstead using a basic and poorly written event loop. This is only meant to give\na flavor of what Asyncio does behind the curtains. I&rsquo;m avoiding most details of\nthe library design, like callbacks, just to keep this simple. Since this is\nwritten as an illustration, rather than real code, I&rsquo;m going to dispense with\ntrying to keep it 2.7 compatible.<\/p>"},{"title":"Feynman Diagrams in Tikz","link":"https:\/\/iscinumpy.dev\/post\/feynman-diagrams-in-tikz\/","pubDate":"Fri, 30 Oct 2015 07:02:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/feynman-diagrams-in-tikz\/","description":"<p>There is a package for making Feynman diagrams in LaTeX. Unfortunately, it is\nold and <code>dvi<\/code> latex only. If you are using pdflatex or lualatex, as you should\nbe, it does not work. Even in regular LaTeX, it&rsquo;s a bit of a pain. Why is there\nnot a new package for pdflatex? Turns out, you don&rsquo;t need one. Due to the\npowerful drawing library Tikz, you can create any diagram easily, and can\ncustomize it completely. For example:<\/p>\n\n \n<figure class=\"center white\">\n <img src=\"https:\/\/iscinumpy.dev\/images\/post\/2015\/fd_color.png\" alt=\"Example diagram\" width=\"50%\" \/>\n<\/figure>"},{"title":"Including CRY cosmic ray generator in CMake","link":"https:\/\/iscinumpy.dev\/post\/cry-cosmic-ray-generator-in-cmake\/","pubDate":"Mon, 19 Oct 2015 09:07:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/cry-cosmic-ray-generator-in-cmake\/","description":"<p>I realized that CRY did not have a CMake based install option, so including it\nin a GEANT4 cmake project might not be obvious. This is how you would do it in\nyour CMakeLists.txt:<\/p>"},{"title":"GTest Submodule","link":"https:\/\/iscinumpy.dev\/post\/gtest-submodule\/","pubDate":"Wed, 07 Oct 2015 06:43:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/gtest-submodule\/","description":"<blockquote>\n<p>Note: There is a better way to do this described\n<a href=\"https:\/\/iscinumpy.dev\/post\/googletest-and-cmake\">here<\/a>.<\/p>\n<\/blockquote>\n<p>If you&rsquo;ve ever tried <code>apt-get<\/code> or <code>brew<\/code> to try to install gtest, you are\nprobably familiar with the fact that gtest is not &ldquo;recommend&rdquo; for global install\non your system. As an alternative, the recommendation is that you make it part\nof your project. The process for making gtest part of your project, however, is\nnot well documented, at least for modern git projects. What follows is the\nprocedure I used to do so.<\/p>"},{"title":"Slots in Python","link":"https:\/\/iscinumpy.dev\/post\/slots-in-python\/","pubDate":"Thu, 06 Aug 2015 16:01:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/slots-in-python\/","description":"<p>Slots seem to be poorly documented. What they do is simple, but whether they are\nused is tricky. This is a little mini-post on slots.<\/p>"},{"title":"Basics of metaclasses","link":"https:\/\/iscinumpy.dev\/post\/basics-of-metaclasses\/","pubDate":"Thu, 06 Aug 2015 15:59:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/basics-of-metaclasses\/","description":"<p>This is a quick tutorial over the basics of what metaclasses do.<\/p>\n<h2 id=\"the-metaclass\">The Metaclass<\/h2>\n<p>Metaclasses, while seemingly a complex topic, really just do something very\nsimple. They control what happens when you have code that turns into a class\nobject. The normal place they are executed is right after the class statement.\nLet&rsquo;s see that in action by using print as our metaclass.<\/p>"},{"title":"Factory classmethods in Python","link":"https:\/\/iscinumpy.dev\/post\/factory-classmethods-in-python\/","pubDate":"Wed, 29 Jul 2015 09:13:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/factory-classmethods-in-python\/","description":"<p>I haven&rsquo;t seen a great deal of practical documentation about using classmethods\nas factories in Python (which is arguably the most important use of a\nclassmethod, IMO). This post hopes to fill in that gap.<\/p>"},{"title":"Making an autoload extension for IPython","link":"https:\/\/iscinumpy.dev\/post\/making-an-autoload-extension-for-ipython\/","pubDate":"Fri, 24 Jul 2015 07:06:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/making-an-autoload-extension-for-ipython\/","description":"<p>I recently decided to try my hand at making an auto-load extension for Python\nand Plumbum. I was planning to suggest it as a new feature, then I thought it\nmight be an experimental feature, and now it&rsquo;s just a blog post. But it was an\ninteresting idea and didn&rsquo;t seem to be well documented process on the web. So,\nhere it is.<\/p>\n<p>The plan was to make commands like this:<\/p>"},{"title":"Uncertainty extension for IPython","link":"https:\/\/iscinumpy.dev\/post\/uncertainty-extension-for-ipython\/","pubDate":"Fri, 24 Jul 2015 06:45:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/uncertainty-extension-for-ipython\/","description":"<p>Wouldn&rsquo;t it be nice if we had uncertainty with a nice notation in IPython? The\ncurrent method would be to use raw Python,<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-python\" data-lang=\"python\"><span class=\"line\"><span class=\"cl\"><span class=\"kn\">from<\/span> <span class=\"nn\">uncertainties<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">ufloat<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nb\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">ufloat<\/span><span class=\"p\">(<\/span><span class=\"mf\">12.34<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.01<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><\/code><\/pre><\/div><pre class=\"output\">\n12.340+\/-0.010\n<\/pre>\n<p>Let&rsquo;s use the infix library to make the notation easier. We&rsquo;ll define <code>|pm|<\/code> to\nmean <code>+\/-<\/code>.<\/p>"},{"title":"Plumbum color","link":"https:\/\/iscinumpy.dev\/post\/plumbum-color-post\/","pubDate":"Wed, 22 Jul 2015 12:25:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/plumbum-color-post\/","description":"<p>I&rsquo;ve been working on a color addition to Plumbum for a little while, and I&rsquo;d\nlike to share the basics of using it with you now. This library was originally\nbuilt around a special <code>str<\/code> subclass, but now is built on the new <code>Styles<\/code>\nrepresentation and is far more powerful than the first implementation. It safely\ndoes nothing if you do not have a color-compatible systems (posix + tty\ncurrently), but can be forced if need be. It is included with Plumbum, so you\ndon&rsquo;t have to add a requirement for your scripts that is non-essential (as color\noften is). It is integrated with <code>plumbum.cli<\/code>, too. Also, I&rsquo;ve managed to\naccelerate the color selection algorithms about 8x, allowing near game-like\nspeeds. (see the <code>fullcolor.py<\/code> example).<\/p>"},{"title":"University of Texas Doctoral Thesis Template","link":"https:\/\/iscinumpy.dev\/post\/univerity-of-texas-thesis\/","pubDate":"Sun, 12 Jul 2015 17:05:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/univerity-of-texas-thesis\/","description":"<p>I have created a thesis class file for a UT Thesis in LaTeX. It has already been\nused for at least one passing thesis, so it does meet the current UT guidelines.\n(Please let me know if there are any issues!)<\/p>\n<p>Since I use Bitbucket for all my private repositories (like my thesis itself),\nthe code is in a Bitbucket repository rather than GitHub. Here is the link if\nyou want to create a pull request or want to compile the class and documentation\nfrom the source .dtx file.<\/p>"},{"title":"Plumbum scripting","link":"https:\/\/iscinumpy.dev\/post\/plumbum-scripting\/","pubDate":"Sun, 12 Jul 2015 14:07:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/plumbum-scripting\/","description":"<p>Scripting in Bash is a pain. Bash can do almost anything, and is unbeatable for\nsmall scripts, but it struggles when scaling up to doing anything close to a\nreal world scripting problem. Python is a natural choice, especially for the\nscientist who already is using it for analysis. But, it&rsquo;s much harder to do\nbasic tasks in Python. So you are left with scripts starting out as Bash\nscripts, and then becoming a mess, then being (usually poorly) ported to Python,\nor even worse, being run by a Python script. I&rsquo;ve seen countless Python scripts\nthat run Bash scripts that run real programs. I&rsquo;ve even written one or two. It&rsquo;s\nnot pretty.<\/p>\n<p>I recently came (back) across a really powerful library for doing efficient\ncommand line scripts in Python. It contains a set of tools that makes the four\n(five with color) main tasks of command line scripts simple and powerful. I will\nalso go over the one main drawback of the library (and the possible\nenhancement!).<\/p>"},{"title":"Simple Overloading in Python","link":"https:\/\/iscinumpy.dev\/post\/simple-operator-overloading-in-python\/","pubDate":"Tue, 07 Jul 2015 09:45:00 -0700","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/post\/simple-operator-overloading-in-python\/","description":"<p>This is intended as an example to demonstrate the use of overloading in object\noriented programming. This was written as a Jupyter notebook (aka IPython) in\nPython 3. To run in Python 2, simply rename the variables that have unicode\nnames, and replace <code>truediv<\/code> with <code>div<\/code>.<\/p>\n<p>While there are several nice Python libraries that support uncertainty (for\nexample, the powerful\n<a href=\"https:\/\/pypi.python.org\/pypi\/uncertainties\/\">uncertainties<\/a> package and the\nrelated units and uncertainties package\n<a href=\"http:\/\/pint.readthedocs.org\/en\/0.6\/\">pint<\/a>), they usually use standard error\ncombination rules. For a beginning physics class, often &lsquo;maximum error&rsquo;\ncombination is used. Here, instead of using a standard deviation based error and\nusing combination rules based on uncorrelated statistical distributions, we\nassume a simple maximum error and simply add errors.<\/p>\n<p>To implement this, let&rsquo;s build a Python class and use overloading to implement\nalgebraic operations.<\/p>"},{"title":"Archives","link":"https:\/\/iscinumpy.dev\/page\/archive\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","author":"henryfs@princeton.edu (Henry Schreiner)","guid":"https:\/\/iscinumpy.dev\/page\/archive\/","description":{}}]}}