From b9a3a81f4d3d68697cedcddf2225987d33b7b295 Mon Sep 17 00:00:00 2001 From: Max Jones <14077947+maxrjones@users.noreply.github.com> Date: Mon, 18 May 2026 13:35:04 -0400 Subject: [PATCH 1/2] refactor: depend on shared reporting infrastructure --- .github/workflows/update-reports.yml | 4 +- README.md | 4 + ...-26.1.png => pi-26.1-authored-commits.png} | Bin ...-26.2.png => pi-26.2-authored-commits.png} | Bin docs/images/pi-26.3-authored-commits.png | Bin 0 -> 115965 bytes docs/images/pi-26.3-resolved-issues-prs.png | Bin 0 -> 111682 bytes docs/objectives.md | 51 ++-- reports/README.md | 28 +-- reports/_objectives_data.py | 7 +- reports/generate_config.py | 149 ++--------- reports/generate_docs.py | 159 +++--------- reports/main.py | 182 ++------------ reports/objectives.py | 59 +---- reports/output/pi-26.3-authored-commits.csv | 122 +++++++++ .../output/pi-26.3-resolved-issues-prs.csv | 110 ++++++++ reports/output/pi-26.3.csv | 43 ---- reports/plot.py | 238 ++---------------- reports/pyproject.toml | 6 +- reports/settings.py | 32 +-- 19 files changed, 378 insertions(+), 816 deletions(-) rename docs/images/{pi-26.1.png => pi-26.1-authored-commits.png} (100%) rename docs/images/{pi-26.2.png => pi-26.2-authored-commits.png} (100%) create mode 100644 docs/images/pi-26.3-authored-commits.png create mode 100644 docs/images/pi-26.3-resolved-issues-prs.png create mode 100644 reports/output/pi-26.3-authored-commits.csv create mode 100644 reports/output/pi-26.3-resolved-issues-prs.csv delete mode 100644 reports/output/pi-26.3.csv diff --git a/.github/workflows/update-reports.yml b/.github/workflows/update-reports.yml index 8570353..13b2289 100644 --- a/.github/workflows/update-reports.yml +++ b/.github/workflows/update-reports.yml @@ -42,14 +42,14 @@ jobs: working-directory: reports env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_ODD_PAT: ${{ secrets.GH_ODD_PAT }} + GH_PAT: ${{ secrets.GH_PAT }} run: uv run generate_config.py - name: Generate commit data working-directory: reports env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_ODD_PAT: ${{ secrets.GH_ODD_PAT }} + GH_PAT: ${{ secrets.GH_PAT }} run: uv run main.py - name: Generate plot diff --git a/README.md b/README.md index f5376a6..6033a5d 100644 --- a/README.md +++ b/README.md @@ -12,3 +12,7 @@ uv run -- mkdocs serve ``` The documentation is deployed automatically via GitHub pages and the [deploy workflow](.github/workflows/deploy.yml). + +## Reports + +See [reports/README.md](reports/README.md) for the OSS commit statistics tooling that generates the charts and tables on the objectives page. diff --git a/docs/images/pi-26.1.png b/docs/images/pi-26.1-authored-commits.png similarity index 100% rename from docs/images/pi-26.1.png rename to docs/images/pi-26.1-authored-commits.png diff --git a/docs/images/pi-26.2.png b/docs/images/pi-26.2-authored-commits.png similarity index 100% rename from docs/images/pi-26.2.png rename to docs/images/pi-26.2-authored-commits.png diff --git a/docs/images/pi-26.3-authored-commits.png b/docs/images/pi-26.3-authored-commits.png new file mode 100644 index 0000000000000000000000000000000000000000..105c17625bcf8e1169e7bce6d17341bdbb88a3c4 GIT binary patch literal 115965 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ǣ$`iVQo_qbS=wN$+Lcw9My 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 b%e|?^iiV7?f)#I1k?*|C80fU2ZP-5n8nU+k literal 0 HcmV?d00001 diff --git a/docs/images/pi-26.3-resolved-issues-prs.png b/docs/images/pi-26.3-resolved-issues-prs.png new file mode 100644 index 0000000000000000000000000000000000000000..18dc5c1be5af843d7c4998df678a7b4bbb17365b GIT binary patch literal 111682 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 F{{Xo{r9A)u literal 0 HcmV?d00001 diff --git a/docs/objectives.md b/docs/objectives.md index f55ca25..dfe040b 100644 --- a/docs/objectives.md +++ b/docs/objectives.md @@ -1,16 +1,16 @@ # Quarterly Objectives -This page tracks quarterly objectives and their related repositories across Program Increments (PIs). - -The commits per repository chart for each PI uses color-coding to show which objective each repo contributes to. Repos that contribute to multiple objectives are shown with split bars. +This page tracks quarterly objectives for the VEDA/EODC ODD team and the open-source repositories they touch across Program Increments (PIs). ## Current PI: 26.3 -![PI-26.3 Commits per Repository](images/pi-26.3.png) +![PI-26.3 authored commits](images/pi-26.3-authored-commits.png) + +![PI-26.3 resolved issues and PRs](images/pi-26.3-resolved-issues-prs.png) | # | Objective | Contributors | Repos | |---|-----------|--------------|-------| -| [#307](https://github.com/NASA-IMPACT/veda-odd/issues/307) | 📈 Finalize Design for Zarr + VirtualiZarr Time Series API [C... | hrodmn | titiler, titiler-lambda-layer, titiler-md-demo | +| [#307](https://github.com/NASA-IMPACT/veda-odd/issues/307) | 📈 Finalize Design for Zarr + VirtualiZarr Time Series API... | hrodmn | titiler, titiler-lambda-layer, titiler-md-demo | | [#346](https://github.com/NASA-IMPACT/veda-odd/issues/346) | 🤖 Develop + Maintain the Virtual Zarr Ecosystem | maxrjones, tylanderson, HarshiniGirish | virtualizarr, virtual-tiff, icechunk, virtualzarr.cloud | | [#347](https://github.com/NASA-IMPACT/veda-odd/issues/347) | 🌳 Evolve the Zarr Ecosystem | d-v-b, chuckwondo, maxrjones | geozarr-spec, zarr-python, multiscales, geo-proj, spatial, zarr-specs, zarr-extensions, geozarr-toolkit, numcodecs, geozarr-site, zarr-developers.github.io | | [#348](https://github.com/NASA-IMPACT/veda-odd/issues/348) | 📝 Cloud-Optimized Data Guidance | abarciauskas-bgse, hrodmn, siddharth0248 | - | @@ -28,15 +28,15 @@ The commits per repository chart for each PI uses color-coding to show which obj | # | Objective | State | Contributors | |---|-----------|-------|--------------| -| [#304](https://github.com/NASA-IMPACT/veda-odd/issues/304) | 🤖Create virtual Zarr stores for high priority data... | closed | tylanderson | +| [#304](https://github.com/NASA-IMPACT/veda-odd/issues/304) | 🤖Create virtual Zarr stores for high priority d... | closed | tylanderson | | [#305](https://github.com/NASA-IMPACT/veda-odd/issues/305) | 🛠️ TiTiler-CMR maintenance + performance | open | chuckwondo, hrodmn | -| [#306](https://github.com/NASA-IMPACT/veda-odd/issues/306) | 🤗 Support community adoption of the technologies i... | closed | chuckwondo, maxrjones, abarciauskas-bgse | -| [#308](https://github.com/NASA-IMPACT/veda-odd/issues/308) | 🤪 Expand virtualization support for quirky dataset... | closed | maxrjones | -| [#309](https://github.com/NASA-IMPACT/veda-odd/issues/309) | 🛰️ Propose unified strategy for virtualization of ... | open | sharkinsspatial, maxrjones, hrodmn | +| [#306](https://github.com/NASA-IMPACT/veda-odd/issues/306) | 🤗 Support community adoption of the technologie... | closed | chuckwondo, maxrjones, abarciauskas-bgse | +| [#308](https://github.com/NASA-IMPACT/veda-odd/issues/308) | 🤪 Expand virtualization support for quirky data... | closed | maxrjones | +| [#309](https://github.com/NASA-IMPACT/veda-odd/issues/309) | 🛰️ Propose unified strategy for virtualization ... | open | sharkinsspatial, maxrjones, hrodmn | | [#319](https://github.com/NASA-IMPACT/veda-odd/issues/319) | 🌐 Client-side raster rendering (deck.gl-raster) | closed | kylebarron | | [#331](https://github.com/NASA-IMPACT/veda-odd/issues/331) | WASM chunk codec research and PoC | open | jkeifer | -![PI-26.2 Commits per Repository](images/pi-26.2.png) +![PI-26.2 authored commits](images/pi-26.2-authored-commits.png) @@ -45,13 +45,13 @@ The commits per repository chart for each PI uses color-coding to show which obj | # | Objective | State | Contributors | |---|-----------|-------|--------------| -| [#244](https://github.com/NASA-IMPACT/veda-odd/issues/244) | 🗺️ Add dynamic tiling and timeseries support for V... | open | jbusecke, hrodmn | -| [#245](https://github.com/NASA-IMPACT/veda-odd/issues/245) | 🌍 Add dynamic tiling and timeseries support for da... | open | abarciauskas-bgse, hrodmn | -| [#246](https://github.com/NASA-IMPACT/veda-odd/issues/246) | 🤖 Support virtualization of additional data produc... | closed | sharkinsspatial, maxrjones, jbusecke | -| [#247](https://github.com/NASA-IMPACT/veda-odd/issues/247) | 🛰 Explore scalable, cloud native approaches for se... | closed | sharkinsspatial, kylebarron | -| [#248](https://github.com/NASA-IMPACT/veda-odd/issues/248) | 🤗 Support community adoption of the technologies i... | closed | sharkinsspatial, chuckwondo, maxrjones, abarciauskas-bgse | +| [#244](https://github.com/NASA-IMPACT/veda-odd/issues/244) | 🗺️ Add dynamic tiling and timeseries support fo... | open | jbusecke, hrodmn | +| [#245](https://github.com/NASA-IMPACT/veda-odd/issues/245) | 🌍 Add dynamic tiling and timeseries support for... | open | abarciauskas-bgse, hrodmn | +| [#246](https://github.com/NASA-IMPACT/veda-odd/issues/246) | 🤖 Support virtualization of additional data pro... | closed | sharkinsspatial, maxrjones, jbusecke | +| [#247](https://github.com/NASA-IMPACT/veda-odd/issues/247) | 🛰 Explore scalable, cloud native approaches for... | closed | sharkinsspatial, kylebarron | +| [#248](https://github.com/NASA-IMPACT/veda-odd/issues/248) | 🤗 Support community adoption of the technologie... | closed | sharkinsspatial, chuckwondo, maxrjones, abarciauskas-bgse | -![PI-26.1 Commits per Repository](images/pi-26.1.png) +![PI-26.1 authored commits](images/pi-26.1-authored-commits.png) @@ -60,15 +60,16 @@ The commits per repository chart for each PI uses color-coding to show which obj | # | Objective | State | Contributors | |---|-----------|-------|--------------| -| [#121](https://github.com/NASA-IMPACT/veda-odd/issues/121) | Visualize Web-Optimized Zarr (WOZ) in VEDA (previe... | closed | maxrjones | -| [#122](https://github.com/NASA-IMPACT/veda-odd/issues/122) | Research, develop and document methods for Zarr an... | closed | maxrjones, kylebarron | +| [#121](https://github.com/NASA-IMPACT/veda-odd/issues/121) | Visualize Web-Optimized Zarr (WOZ) in VEDA (pre... | closed | maxrjones | +| [#122](https://github.com/NASA-IMPACT/veda-odd/issues/122) | Research, develop and document methods for Zarr... | closed | maxrjones, kylebarron | | [#197](https://github.com/NASA-IMPACT/veda-odd/issues/197) | 🎬 TiTiler-CMR is production ready | open | abarciauskas-bgse, hrodmn | | [#198](https://github.com/NASA-IMPACT/veda-odd/issues/198) | 🚀 Dataset support for VEDA instances | closed | maxrjones, jbusecke | -| [#203](https://github.com/NASA-IMPACT/veda-odd/issues/203) | 🗺️Research, develop and document methods for Zarr ... | closed | maxrjones | +| [#203](https://github.com/NASA-IMPACT/veda-odd/issues/203) | 🗺️Research, develop and document methods for Za... | closed | maxrjones | | [#204](https://github.com/NASA-IMPACT/veda-odd/issues/204) | 🛠️ Zarr Development | closed | d-v-b, maxrjones | | [#205](https://github.com/NASA-IMPACT/veda-odd/issues/205) | 🤗 Community engagement | closed | sharkinsspatial, chuckwondo, maxrjones, abarciauskas-bgse | | [#206](https://github.com/NASA-IMPACT/veda-odd/issues/206) | 📦 Obstore outreach | closed | chuckwondo, kylebarron | +

@@ -83,6 +84,7 @@ The commits per repository chart for each PI uses color-coding to show which obj | [#127](https://github.com/NASA-IMPACT/veda-odd/issues/127) | Community Involvement | closed | maxrjones, abarciauskas-bgse, hrodmn | | [#165](https://github.com/NASA-IMPACT/veda-odd/issues/165) | Foundational Zarr-Python and Xarray Contributions | closed | d-v-b, maxrjones | +
@@ -92,20 +94,21 @@ The commits per repository chart for each PI uses color-coding to show which obj |---|-----------|-------|--------------| | [#31](https://github.com/NASA-IMPACT/veda-odd/issues/31) | Increase data format support in VirtualiZarr | closed | chuckwondo, maxrjones | | [#34](https://github.com/NASA-IMPACT/veda-odd/issues/34) | Visualize OCO-3 Datasets in VEDA | closed | abarciauskas-bgse | -| [#35](https://github.com/NASA-IMPACT/veda-odd/issues/35) | Deliver Virtual Zarr Stores for NASA Datasets Usin... | closed | abarciauskas-bgse | -| [#36](https://github.com/NASA-IMPACT/veda-odd/issues/36) | Support for Modernizing VirtualiZarr to use zarr-p... | closed | sharkinsspatial, abarciauskas-bgse | +| [#35](https://github.com/NASA-IMPACT/veda-odd/issues/35) | Deliver Virtual Zarr Stores for NASA Datasets U... | closed | abarciauskas-bgse | +| [#36](https://github.com/NASA-IMPACT/veda-odd/issues/36) | Support for Modernizing VirtualiZarr to use zar... | closed | sharkinsspatial, abarciauskas-bgse | | [#37](https://github.com/NASA-IMPACT/veda-odd/issues/37) | Support CMR Modernization | closed | sharkinsspatial, kylebarron | -| [#40](https://github.com/NASA-IMPACT/veda-odd/issues/40) | Upgrade titiler and titiler-xarray to zarr-Python ... | closed | maxrjones | +| [#40](https://github.com/NASA-IMPACT/veda-odd/issues/40) | Upgrade titiler and titiler-xarray to zarr-Pyth... | closed | maxrjones | | [#41](https://github.com/NASA-IMPACT/veda-odd/issues/41) | Draft Web-Optimized Zarr (WOZ) Standard | closed | maxrjones | | [#76](https://github.com/NASA-IMPACT/veda-odd/issues/76) | Demonstrate how to tile HLS using titiler-cmr | closed | hrodmn | +
--- ## Configuration -Objectives data lives in [`reports/_objectives_data.py`](https://github.com/NASA-IMPACT/veda-odd/blob/main/reports/_objectives_data.py) (auto-generated from GitHub issues; helpers in [`reports/objectives.py`](https://github.com/NASA-IMPACT/veda-odd/blob/main/reports/objectives.py)). +Objectives data lives in [`reports/_objectives_data.py`](https://github.com/NASA-IMPACT/veda-odd/blob/main/reports/_objectives_data.py) — auto-generated from GitHub issues by `dse_oss_reports.generator.ObjectivesGenerator`. To regenerate this page: @@ -113,5 +116,3 @@ To regenerate this page: cd reports uv run generate_docs.py ``` - -See [FY26 Roadmap](./fy26-roadmap.md) for the broader context of these objectives. \ No newline at end of file diff --git a/reports/README.md b/reports/README.md index 7a98b89..9bcf5af 100644 --- a/reports/README.md +++ b/reports/README.md @@ -12,32 +12,22 @@ - `objectives.py`: helper functions over `OBJECTIVES` — import from here. - `constants.py`: `PI_DATES` and the `get_time_range` / `get_current_pi` helpers. -### Regenerating objectives from GitHub +## Run the full pipeline -To fetch the latest objectives from GitHub issues: +This mirrors the [update-reports workflow](../.github/workflows/update-reports.yml) — regenerates objectives, fetches commit data, plots charts, and rewrites the objectives docs page: ```bash -uv run generate_config.py +uv run generate_config.py && uv run main.py && uv run plot.py && uv run generate_docs.py ``` -This regenerates `_objectives_data.py` with objectives and contributors from issues labeled `pi-*-objective`. Repos for each objective come from `repo:org/name` labels on the same issues. +`TIME_RANGE` / PI defaults to the current fiscal quarter (Q1: Oct-Dec, Q2: Jan-Mar, Q3: Apr-Jun, Q4: Jul-Sep). Pass `--pi pi-26.2` to `main.py` / `plot.py` to target a specific PI. -## Generating data +## Running individual steps -1. Run `uv run main.py` (uses 10 parallel workers by default) -2. Run `uv run plot.py` - -`TIME_RANGE` is automatically set to the current fiscal quarter (Q1: Oct-Dec, Q2: Jan-Mar, Q3: Apr-Jun, Q4: Jul-Sep). - -The generated chart colors bars by PI objective (see the objectives page on the deployed site for details). - -### Regenerating docs/objectives.md - -To regenerate the objectives documentation page from config: - -```bash -uv run generate_docs.py -``` +- `uv run generate_config.py` — refresh `_objectives_data.py` from GitHub issues labeled `pi-*-objective`. +- `uv run main.py` — fetch authored commits and resolved issues/PRs (10 parallel workers by default). +- `uv run plot.py` — render charts (colored by PI objective). +- `uv run generate_docs.py` — regenerate `docs/objectives.md` from `OBJECTIVES`. ## Performance diff --git a/reports/_objectives_data.py b/reports/_objectives_data.py index f33c140..45b8a03 100644 --- a/reports/_objectives_data.py +++ b/reports/_objectives_data.py @@ -1,6 +1,5 @@ # Quarterly objectives with repos and contributors per objective -# Auto-generated by `uv run generate_config.py` from GitHub issues. Do not edit by hand. -# PI date ranges are maintained separately in constants.py +# Auto-generated by dse_oss_reports.generator. Do not edit by hand. # - Objectives: Issues with pi-X.Y-objective labels # - Contributors: Issue assignees # - Repos: Labels matching repo:org/repo-name @@ -440,7 +439,9 @@ "contributors": [ ("Jarrett Keifer", "jkeifer"), ], - "repos": [], + "repos": [ + ("cylf-dev", "chonkle"), + ], }, ], "pi-26.3": [ diff --git a/reports/generate_config.py b/reports/generate_config.py index d5a73ef..8e21a8c 100644 --- a/reports/generate_config.py +++ b/reports/generate_config.py @@ -1,146 +1,27 @@ #!/usr/bin/env python3 -""" -Generate OBJECTIVES config from GitHub issues with pi-*-objective labels. - -Data sources: -- Objectives: Issues with `pi-X.Y-objective` labels -- Contributors: Issue assignees -- Repos: Labels matching `repo:org/repo-name` pattern - -Usage: - uv run generate_config.py -""" +"""Generate _objectives_data.py from GitHub issues with pi-*-objective labels.""" +import argparse +import logging import os -import re -from github import Github, Auth -from settings import REPO_FULL_NAME, TOKEN_ENV_VAR - - -def get_objective_issues(g: Github, repo_name: str = REPO_FULL_NAME): - """Fetch all issues with pi-*-objective labels using search API.""" - objectives_by_pi = {} - - # Use search API - much faster than iterating all issues - # Search for issues with any pi-*-objective label - query = f"repo:{repo_name} is:issue label:pi-25.2-objective,pi-25.3-objective,pi-25.4-objective,pi-26.1-objective,pi-26.2-objective,pi-26.3-objective,pi-26.4-objective" - issues = g.search_issues(query) - - if issues.totalCount < 1: - raise (ValueError, "No PI issue found") - for issue in issues: - pi = None - repos = [] - - for label in issue.labels: - # Check for PI objective label - match = re.match(r"pi-(\d+\.\d+)-objective", label.name) - if match: - pi = f"pi-{match.group(1)}" - - # Check for repo label (format: repo:org/repo-name) - if label.name.startswith("repo:"): - repo_str = label.name[5:] # Remove "repo:" prefix - if "/" in repo_str: - org, repo_name_part = repo_str.split("/", 1) - repos.append((org, repo_name_part)) - - if pi: - if pi not in objectives_by_pi: - objectives_by_pi[pi] = [] - - # Get assignees - contributors = [ - (assignee.name or assignee.login, assignee.login) - for assignee in issue.assignees - ] - - objectives_by_pi[pi].append( - { - "issue_number": issue.number, - "title": issue.title, - "contributors": contributors, - "state": issue.state, - "repos": repos, - } - ) - - return objectives_by_pi - -def generate_config(objectives_by_pi: dict) -> str: - """Generate Python data module code from objectives data.""" - lines = [ - "# Quarterly objectives with repos and contributors per objective", - "# Auto-generated by `uv run generate_config.py` from GitHub issues. Do not edit by hand.", - "# PI date ranges are maintained separately in constants.py", - "# - Objectives: Issues with pi-X.Y-objective labels", - "# - Contributors: Issue assignees", - "# - Repos: Labels matching repo:org/repo-name", - "OBJECTIVES = {", - ] +from dse_oss_reports.cli import run_generate_config - # Sort PIs chronologically - sorted_pis = sorted(objectives_by_pi.keys(), key=lambda x: float(x.split("-")[1])) +from settings import TEAM_SETTINGS, TOKEN_ENV_VAR - for pi in sorted_pis: - objectives = objectives_by_pi[pi] - lines.append(f' "{pi}": [') - # Sort objectives by issue number - for obj in sorted(objectives, key=lambda x: x["issue_number"]): - lines.append(" {") - lines.append(f' "issue_number": {obj["issue_number"]},') - title = obj["title"].replace('"', '\\"') - lines.append(f' "title": "{title}",') - lines.append(f' "state": "{obj["state"]}",') - lines.append(' "contributors": [') - for name, username in obj["contributors"]: - name = (name or username).replace('"', '\\"') - lines.append(f' ("{name}", "{username}"),') - lines.append(" ],") - lines.append(' "repos": [') - for org, repo in obj.get("repos", []): - lines.append(f' ("{org}", "{repo}"),') - lines.append(" ],") - lines.append(" },") - - lines.append(" ],") - - lines.append("}") - lines.append("") - - return "\n".join(lines) +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("-v", "--verbose", action="store_true") + args = parser.parse_args() + logging.basicConfig( + level=logging.INFO if args.verbose else logging.WARNING, + format="%(message)s", + ) -def main(): token = os.environ.get(TOKEN_ENV_VAR) or os.environ.get("GITHUB_TOKEN") if not token: - raise ValueError(f"Set {TOKEN_ENV_VAR} or GITHUB_TOKEN environment variable") - - auth = Auth.Token(token) - g = Github(auth=auth) - - print("Fetching objective issues from GitHub (using search API)...") - objectives_by_pi = get_objective_issues(g) + raise SystemExit(f"Set {TOKEN_ENV_VAR} or GITHUB_TOKEN environment variable") - g.close() - - print(f"Found {len(objectives_by_pi)} PIs:") - for pi, objs in sorted(objectives_by_pi.items()): - repos_count = sum(len(o["repos"]) for o in objs) - print(f" {pi}: {len(objs)} objectives, {repos_count} repo mappings") - - config_code = generate_config(objectives_by_pi) - - output_file = "_objectives_data.py" - with open(output_file, "w") as f: - f.write(config_code) - print(f"\nGenerated data module written to {output_file}") - print("\nTo add repos to an objective, add labels like:") - print(" repo:zarr-developers/VirtualiZarr") - print(" repo:developmentseed/titiler-cmr") - - -if __name__ == "__main__": - main() + run_generate_config(token, TEAM_SETTINGS, long_org_name_mapping={}) diff --git a/reports/generate_docs.py b/reports/generate_docs.py index d532b52..e0c3de1 100644 --- a/reports/generate_docs.py +++ b/reports/generate_docs.py @@ -1,143 +1,42 @@ #!/usr/bin/env python3 -""" -Generate docs/objectives.md from the OBJECTIVES dataset. - -Usage: - uv run generate_docs.py -""" +"""Render docs/objectives.md from the OBJECTIVES dataset.""" +import argparse +import logging +import re from pathlib import Path -from objectives import OBJECTIVES -from settings import REPO_URL - -DOCS_IMAGES_DIR = Path(__file__).parent.parent / "docs" / "images" - - -def has_plot(pi: str) -> bool: - return (DOCS_IMAGES_DIR / f"{pi}.png").exists() - - -def generate_objectives_md() -> str: - """Generate markdown content for objectives page.""" - lines = [ - "# Quarterly Objectives", - "", - "This page tracks quarterly objectives and their related repositories across Program Increments (PIs).", - "", - "The commits per repository chart for each PI uses color-coding to show which objective each repo contributes to. Repos that contribute to multiple objectives are shown with split bars.", - "", - ] - - # Sort PIs reverse chronologically (newest first) - sorted_pis = sorted( - OBJECTIVES.keys(), key=lambda x: float(x.split("-")[1]), reverse=True - ) - - for i, pi in enumerate(sorted_pis): - objectives = OBJECTIVES[pi] - pi_upper = pi.upper().replace("-", " ") - - if i == 0: - # Current PI - show full details - lines.append(f"## Current PI: {pi.split('-')[1]}") - lines.append("") - if has_plot(pi): - lines.append(f"![{pi.upper()} Commits per Repository](images/{pi}.png)") - lines.append("") - lines.append("| # | Objective | Contributors | Repos |") - lines.append("|---|-----------|--------------|-------|") - - for obj in sorted(objectives, key=lambda x: x["issue_number"]): - num = obj["issue_number"] - # Clean up title (remove PI prefix if present) - title = obj["title"] - if "Objective" in title and ":" in title: - title = title.split(":", 1)[1].strip() - title = title[:60] + "..." if len(title) > 60 else title - - contributors = ", ".join(u for _, u in obj["contributors"]) - repos = ", ".join(r for _, r in obj["repos"]) if obj["repos"] else "-" +from dse_oss_reports.cli import run_generate_docs - lines.append( - f"| [#{num}]({REPO_URL}/issues/{num}) | {title} | {contributors} | {repos} |" - ) - - lines.append("") - lines.append("---") - lines.append("") - else: - # Historical PIs - collapsible - if i == 1: - lines.append("## Past PIs") - lines.append("") - closed_count = sum(1 for o in objectives if o["state"] == "closed") +from objectives import OBJECTIVES +from settings import TEAM_SETTINGS - lines.append("
") - lines.append( - f"{pi_upper} ({len(objectives)} objectives, {closed_count} closed)" - ) - lines.append("") - lines.append("| # | Objective | State | Contributors |") - lines.append("|---|-----------|-------|--------------|") +# Drops past-PI image references whose target file was never generated +# (e.g. PIs that predate the per-PI chart tooling). The upstream generator +# emits an image link for every PI unconditionally. +_IMAGE_LINE_RE = re.compile(r"^!\[[^\]]*\]\((images/[^)]+)\)\s*$") - for obj in sorted(objectives, key=lambda x: x["issue_number"]): - num = obj["issue_number"] - title = obj["title"] - if "Objective" in title and ":" in title: - title = title.split(":", 1)[1].strip() - title = title[:50] + "..." if len(title) > 50 else title - state = obj["state"] - contributors = ", ".join(u for _, u in obj["contributors"]) +def _strip_missing_image_lines(md_path: Path) -> None: + docs_dir = md_path.parent + kept = [] + for line in md_path.read_text().splitlines(): + match = _IMAGE_LINE_RE.match(line) + if match and not (docs_dir / match.group(1)).exists(): + continue + kept.append(line) + md_path.write_text("\n".join(kept) + "\n") - lines.append( - f"| [#{num}]({REPO_URL}/issues/{num}) | {title} | {state} | {contributors} |" - ) - lines.append("") - if has_plot(pi): - lines.append(f"![{pi.upper()} Commits per Repository](images/{pi}.png)") - lines.append("") - lines.append("
") - lines.append("") +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("-v", "--verbose", action="store_true") + args = parser.parse_args() - lines.append("---") - lines.append("") - lines.append("## Configuration") - lines.append("") - lines.append( - f"Objectives data lives in [`reports/_objectives_data.py`]({REPO_URL}/blob/main/reports/_objectives_data.py) " - f"(auto-generated from GitHub issues; helpers in [`reports/objectives.py`]({REPO_URL}/blob/main/reports/objectives.py))." + logging.basicConfig( + level=logging.INFO if args.verbose else logging.WARNING, + format="%(message)s", ) - lines.append("") - lines.append("To regenerate this page:") - lines.append("") - lines.append("```bash") - lines.append("cd reports") - lines.append("uv run generate_docs.py") - lines.append("```") - lines.append("") - lines.append( - "See [FY26 Roadmap](./fy26-roadmap.md) for the broader context of these objectives." - ) - - return "\n".join(lines) - -def main(): - content = generate_objectives_md() - - output_file = "../docs/objectives.md" - with open(output_file, "w") as f: - f.write(content) - - print(f"Generated {output_file}") - - # Print summary - total_objectives = sum(len(objs) for objs in OBJECTIVES.values()) - print(f" {len(OBJECTIVES)} PIs, {total_objectives} total objectives") - - -if __name__ == "__main__": - main() + output_path = run_generate_docs(TEAM_SETTINGS, OBJECTIVES) + _strip_missing_image_lines(output_path) diff --git a/reports/main.py b/reports/main.py index 15e6b97..0911549 100644 --- a/reports/main.py +++ b/reports/main.py @@ -1,171 +1,35 @@ #!/usr/bin/env python3 -""" -Query GitHub API for commits to repositories in parallel. -""" +"""Fetch authored commits and resolved issues/PRs for one PI.""" import argparse -from github import Github, Auth -from datetime import datetime -from typing import List -from concurrent.futures import ThreadPoolExecutor, as_completed +import logging import os -import pandas as pd -from objectives import ( - get_repos_for_pi, - get_contributors_for_pi, -) -from constants import get_time_range, get_current_pi -from settings import TOKEN_ENV_VAR +from dse_oss_reports.cli import run_commits_report -def get_commits_for_repo_author( - g: Github, - owner: str, - repo: str, - author: str, - start_date: datetime, - end_date: datetime, -) -> List[dict]: - """ - Query GitHub API for commits by a specific author in a repo. - - Returns list of commit detail dicts (not commit objects) to avoid - thread safety issues with PyGithub objects. - """ - try: - repository = g.get_repo(f"{owner}/{repo}") - commits = repository.get_commits( - author=author, since=start_date, until=end_date - ) - - # Group commits by PR - prs = [] - pr_commits = [] - standalone_commits = [] - - for commit in commits: - pulls = commit.get_pulls() - if pulls.totalCount == 1: - if (number := pulls[0].number) not in prs: - pr_commits.append(commit) - prs.append(number) - elif pulls.totalCount == 0: - standalone_commits.append(commit) - - # Extract details immediately (avoid returning PyGithub objects) - results = [] - for commit in pr_commits + standalone_commits: - results.append( - { - "sha": commit.sha, - "message": commit.commit.message.split("\n")[0], - "author": commit.commit.author.name, - "committer": commit.commit.committer.name, - "url": commit.html_url, - "total_changes": commit.stats.total if commit.stats else 0, - "organization": owner, - "repository": repo, - } - ) - return results - except Exception as e: - print(f" Error processing {owner}/{repo} for {author}: {e}") - return [] - - -def main(token: str = None, pi: str = None, max_workers: int = 3): - """ - Query GitHub for commits using parallel requests. - - Args: - token: GitHub personal access token - pi: Optional PI to filter repos/contributors (e.g., "pi-26.1"). - If None, uses current PI based on today's date. - max_workers: Number of parallel threads (default 10) - """ - # Default to current PI if not specified - if pi is None: - pi = get_current_pi() - - time_range = get_time_range(pi) - if not time_range: - raise ValueError(f"No date range found for PI: {pi}") - - time_start = datetime.strptime(time_range[0], "%Y%m%d") - time_end = datetime.strptime(time_range[1], "%Y%m%d") - - # Get repos and contributors for the PI - repos = get_repos_for_pi(pi) - contributors = get_contributors_for_pi(pi) - print( - f"PI: {pi} ({time_start.strftime('%Y-%m-%d')} to {time_end.strftime('%Y-%m-%d')})" - ) - print(f" {len(repos)} repos, {len(contributors)} contributors") - - if len(contributors) < 1: - raise ValueError("No contributors found in config.") - - # Build list of (repo, contributor) tasks - tasks = [] - for owner, repo in repos: - for name, username in contributors: - tasks.append((owner, repo, username)) - - print( - f"Querying {len(tasks)} repo×contributor combinations with {max_workers} workers..." - ) - - all_commits = [] - - # Use thread pool for parallel API calls - # Each thread gets its own Github client to avoid rate limit issues - def process_task(task): - owner, repo, username = task - if token: - auth = Auth.Token(token) - g = Github(auth=auth) - else: - g = Github() - try: - return get_commits_for_repo_author( - g, owner, repo, username, time_start, time_end - ) - finally: - g.close() - - completed = 0 - with ThreadPoolExecutor(max_workers=max_workers) as executor: - futures = {executor.submit(process_task, task): task for task in tasks} - for future in as_completed(futures): - completed += 1 - if completed % 50 == 0: - print(f" Progress: {completed}/{len(tasks)}") - commits = future.result() - all_commits.extend(commits) - - print(f"Found {len(all_commits)} commits") - - df = pd.DataFrame(all_commits) - csv_filename = f"output/{pi}.csv" - df.to_csv(csv_filename, index=False) - print(f"Saved to {csv_filename}") - - return df +from constants import PI_DATES +from objectives import OBJECTIVES +from settings import TEAM_SETTINGS, TOKEN_ENV_VAR if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument( - "--pi", - help="PI name (e.g. pi-26.2). Defaults to the current PI.", - ) - parser.add_argument( - "--max-workers", - type=int, - default=3, - help="Parallel API workers (default 3). Raise cautiously — GitHub's " - "secondary rate limit triggers on bursty concurrent requests.", - ) + parser.add_argument("--pi", help="PI name (e.g. pi-26.2). Defaults to current PI.") + parser.add_argument("--max-workers", type=int, default=3) + parser.add_argument("-v", "--verbose", action="store_true") args = parser.parse_args() + + logging.basicConfig( + level=logging.INFO if args.verbose else logging.WARNING, + format="%(message)s", + ) + token = os.environ.get(TOKEN_ENV_VAR) or os.environ.get("GITHUB_TOKEN") - main(token=token, pi=args.pi, max_workers=args.max_workers) + run_commits_report( + token, + TEAM_SETTINGS, + PI_DATES, + OBJECTIVES, + pi=args.pi, + max_workers=args.max_workers, + ) diff --git a/reports/objectives.py b/reports/objectives.py index bee35a5..13943ce 100644 --- a/reports/objectives.py +++ b/reports/objectives.py @@ -1,60 +1,9 @@ -"""Public API for accessing the OBJECTIVES dataset. +"""Re-export of the OBJECTIVES dataset from the auto-generated data module. -The raw data lives in the auto-generated `_objectives_data` module -(regenerated via `uv run generate_config.py`). Import from here, not from -the `_objectives_data` module directly. +Helpers (get_repos_for_pi, get_contributors_for_pi, etc.) live in +`dse_oss_reports.objectives` — import from there. """ from _objectives_data import OBJECTIVES -__all__ = [ - "OBJECTIVES", - "get_all_repos", - "get_all_contributors", - "get_repos_for_pi", - "get_contributors_for_pi", -] - - -def get_all_repos(): - """Derive unique repos from all objectives.""" - repos = set() - for pi_objectives in OBJECTIVES.values(): - for obj in pi_objectives: - for repo in obj["repos"]: - repos.add(repo) - return sorted(repos) - - -def get_all_contributors(): - """Derive unique contributors from all objectives.""" - contributors = {} - for pi_objectives in OBJECTIVES.values(): - for obj in pi_objectives: - for name, username in obj["contributors"]: - contributors[username] = name - return [ - (name, username) - for username, name in sorted(contributors.items(), key=lambda x: x[1]) - ] - - -def get_repos_for_pi(pi: str): - """Get all repos for a specific PI.""" - repos = set() - for obj in OBJECTIVES.get(pi, []): - for repo in obj["repos"]: - repos.add(repo) - return sorted(repos) - - -def get_contributors_for_pi(pi: str): - """Get all contributors for a specific PI.""" - contributors = {} - for obj in OBJECTIVES.get(pi, []): - for name, username in obj["contributors"]: - contributors[username] = name - return [ - (name, username) - for username, name in sorted(contributors.items(), key=lambda x: x[1]) - ] +__all__ = ["OBJECTIVES"] diff --git a/reports/output/pi-26.3-authored-commits.csv b/reports/output/pi-26.3-authored-commits.csv new file mode 100644 index 0000000..181f18f --- /dev/null +++ b/reports/output/pi-26.3-authored-commits.csv @@ -0,0 +1,122 @@ +sha,message,author,committer,url,total_changes,organization,repository +fb7282af3847fbb398a65e2824987ca251d328dd,refactor: Use upstream deck.gl-raster `RasterTileLayer` (#1183),Kyle Barron,GitHub,https://github.com/developmentseed/lonboard/commit/fb7282af3847fbb398a65e2824987ca251d328dd,298,developmentseed,lonboard +66c50b98a3894064a5ade29f03f746d35eed83c7,chore: Switch to pnpm (#1181),Kyle Barron,GitHub,https://github.com/developmentseed/lonboard/commit/66c50b98a3894064a5ade29f03f746d35eed83c7,22614,developmentseed,lonboard +dbfcfa2b05359ad5de1597dec2ed79a189cc6d28,Bump python release tag. (#56),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/dbfcfa2b05359ad5de1597dec2ed79a189cc6d28,2,developmentseed,zarr-datafusion-search +bd66d1db786a50e92a04a0038ebda0b21475fd95,Add project logo. (#55),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/bd66d1db786a50e92a04a0038ebda0b21475fd95,8,developmentseed,zarr-datafusion-search +70864161312f0ac493f6c01c2316c9b9d8a7eafa,Stac writer (#54),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/70864161312f0ac493f6c01c2316c9b9d8a7eafa,28416,developmentseed,zarr-datafusion-search +b7396be2e36eae7157ef399e8f019d6f430bc6d8,Upgrade to zarrs 0.23.10. (#53),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/b7396be2e36eae7157ef399e8f019d6f430bc6d8,642,developmentseed,zarr-datafusion-search +933699838a6decb7ecd3378dcd7cdfcf0435b669,Doc updates (#49),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/933699838a6decb7ecd3378dcd7cdfcf0435b669,21,developmentseed,zarr-datafusion-search +394d38ec90e7e6922da1ee95cbbe6bcf88851da4,Example notebooks (#47),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/394d38ec90e7e6922da1ee95cbbe6bcf88851da4,31994,developmentseed,zarr-datafusion-search +ec40d70eec67a620a63241b19371f98e875986a7,Add link to lightning talks (#126),Max Jones,GitHub,https://github.com/pangeo-data/pangeo.io/commit/ec40d70eec67a620a63241b19371f98e875986a7,2,pangeo-data,pangeo.io +e1b2668af80d84ae0be921fe9026856a84a13c36,Remove cancelled talk (#125),Max Jones,GitHub,https://github.com/pangeo-data/pangeo.io/commit/e1b2668af80d84ae0be921fe9026856a84a13c36,14,pangeo-data,pangeo.io +1f66381582b13a73084fbe24f35709aecfc8ee3e,fix: eagerly load spatial coords to avoid mismatch in sel operations (#57),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/1f66381582b13a73084fbe24f35709aecfc8ee3e,106,developmentseed,lazycogs +c98610024787d823deac7fe0d84dff861a9a8030,chore: docs updates (#56),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/c98610024787d823deac7fe0d84dff861a9a8030,577,developmentseed,lazycogs +420d705d8352635f7de23ec381358f887abe9047,chore: fix a few cells in the new notebook (#55),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/420d705d8352635f7de23ec381358f887abe9047,138,developmentseed,lazycogs +56f66a8acffebca67fd7e0277cf6c8e9a3dd3e20,chore: add some more example notebooks (#54),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/56f66a8acffebca67fd7e0277cf6c8e9a3dd3e20,4568,developmentseed,lazycogs +a7abd22b4e68d53d93438921de5fc20f8f0573f2,chore: fix a few issues in the docs (#53),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/a7abd22b4e68d53d93438921de5fc20f8f0573f2,10,developmentseed,lazycogs +0f02cc24f43bc3c9028d9ce33c1f595ce4c9de94,feat: use rasterix to handle x/y dimensions (#52),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/0f02cc24f43bc3c9028d9ce33c1f595ce4c9de94,1307,developmentseed,lazycogs +6ab2fd8ca9e3778bfd3cde88bf9f95fc428bba2b,chore: spec out rasterix integration (#49),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/6ab2fd8ca9e3778bfd3cde88bf9f95fc428bba2b,278,developmentseed,lazycogs +e7a501caeecee7f9cc2c0fb104fd7af2a03172ad,feat: implement xarray async capability (#46),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/e7a501caeecee7f9cc2c0fb104fd7af2a03172ad,133,developmentseed,lazycogs +31e195206f2bb8490766373694afd8ee9e8cc7b6,feat: add run_chunk_async and run_chunk for direct non-xarray access pattern (#45),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/31e195206f2bb8490766373694afd8ee9e8cc7b6,948,developmentseed,lazycogs +39c6dc35410375c93d47d1119f059e5316c5451f,chore: correctly describe dimension order in docs (#44),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/39c6dc35410375c93d47d1119f059e5316c5451f,18,developmentseed,lazycogs +1fb1844ba9f600edf36986b72ca835fd58f9e360,chore: write specs for a few features (#43),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/1fb1844ba9f600edf36986b72ca835fd58f9e360,626,developmentseed,lazycogs +dede83cff9594576e04e47a08e943ce9a3527dab,fix: remove unnecessary lock on duckdb searches (#39),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/dede83cff9594576e04e47a08e943ce9a3527dab,95,developmentseed,lazycogs +cf07318c0c2414bf47251de72fde9c2189263d31,fix: rip out fake-async open_async (#37),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/cf07318c0c2414bf47251de72fde9c2189263d31,500,developmentseed,lazycogs +5e1964793ec2ddf5bb76944ec1696b8ccc9247ed,"chore: use ALL ruff rules, ignore a few (#34)",Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/5e1964793ec2ddf5bb76944ec1696b8ccc9247ed,1285,developmentseed,lazycogs +e7c7c3311c6bc9e709c682ce8e3f5ed5980e8ad8,"ci: run tests on Python 3.12, 3.13, 3.14 (#33)",Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/e7c7c3311c6bc9e709c682ce8e3f5ed5980e8ad8,8,developmentseed,lazycogs +691986a26fea48b1604a02fd2871135f87dee75d,chore: fix broken link,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/691986a26fea48b1604a02fd2871135f87dee75d,4,developmentseed,lazycogs +2932f6e726d045cb4ce67bf209a9d5599b203027,"chore: add png logo, add badges",hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/2932f6e726d045cb4ce67bf209a9d5599b203027,7,developmentseed,lazycogs +48c0a826aa38f1ab90154a0951176bbdf9578d48,docs: update installation instructions,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/48c0a826aa38f1ab90154a0951176bbdf9578d48,4,developmentseed,lazycogs +d522ba6ab70dcb588318868261f025719c3b487a,docs: update links in README,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/d522ba6ab70dcb588318868261f025719c3b487a,8,developmentseed,lazycogs +4b5241d24653a28791f07759a4660d7582f2330c,feat: initial release,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/4b5241d24653a28791f07759a4660d7582f2330c,4,developmentseed,lazycogs +c358f2dbe7446f0c564501561c98e9253191392e,chore: set up publishing and automated releases,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/c358f2dbe7446f0c564501561c98e9253191392e,222,developmentseed,lazycogs +114eac8b1d2c7bf5ada8a7ede641f49d5216b657,chore: update repo location,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/114eac8b1d2c7bf5ada8a7ede641f49d5216b657,24,developmentseed,lazycogs +577205da970457c10dfeb9cccc69c8e68d480419,docs: reorganize docs site (#22),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/577205da970457c10dfeb9cccc69c8e68d480419,19204,developmentseed,lazycogs +cd401ce62eae6612abb1ac0e72aa59041d0778aa,Require uuid in ZCM objects (#26),Max Jones,GitHub,https://github.com/zarr-conventions/multiscales/commit/cd401ce62eae6612abb1ac0e72aa59041d0778aa,12,zarr-conventions,multiscales +9d952019cc59432af86de827116365d03f0dddcf,refactor: remove conversion to async-tiff store (#101),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/9d952019cc59432af86de827116365d03f0dddcf,33,virtual-zarr,virtual-tiff +0f8c9266effcd1c4989fbffb3b8ba61720b5fbec,docs: more clearly explain purpose of Virtual-TIFF (#98),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/0f8c9266effcd1c4989fbffb3b8ba61720b5fbec,272,virtual-zarr,virtual-tiff +20f905fa81f5a38f978d78d796f578e0d0c63ff6,chore!: bump async-tiff min version to v0.5.0 (#103),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/20f905fa81f5a38f978d78d796f578e0d0c63ff6,34,virtual-zarr,virtual-tiff +f6eb23432c35b88fa3cbf97b1e60b3e8282d8449,fix: properly store attributes (#97),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/f6eb23432c35b88fa3cbf97b1e60b3e8282d8449,24,virtual-zarr,virtual-tiff +e323d9e35db54b781dc2d9689f01c86d285f7804,chore: mark xfail on masking failures (#100),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/e323d9e35db54b781dc2d9689f01c86d285f7804,12,virtual-zarr,virtual-tiff +3dbaae9e7c5d343c88b4d073fe8eded29b8571c1,chore: change source for geotiff-test-data (#99),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/3dbaae9e7c5d343c88b4d073fe8eded29b8571c1,8,virtual-zarr,virtual-tiff +71e4d0d765bde3403a7fe39c6cbf8c70bf2b85af,"Fix ambiguous (i, j) notation in transform formula to use (col_index, row_index) (#9)",Max Jones,GitHub,https://github.com/zarr-conventions/spatial/commit/71e4d0d765bde3403a7fe39c6cbf8c70bf2b85af,14,zarr-conventions,spatial +9a14d0fcc741a4e9534abf6219350707d443a77f,fix: edit this page links 404 (#14),Max Jones,GitHub,https://github.com/zarr-developers/geozarr-site/commit/9a14d0fcc741a4e9534abf6219350707d443a77f,2,zarr-developers,geozarr-site +ead5616ef297861fb44cdc9984df25c51f737207,docs: add minutes to the website (#13),Max Jones,GitHub,https://github.com/zarr-developers/geozarr-site/commit/ead5616ef297861fb44cdc9984df25c51f737207,510,zarr-developers,geozarr-site +42276cf318566be187e33f17d867007466f0fcb9,fix: correct banner date/time for SWG meeting (#12),Max Jones,GitHub,https://github.com/zarr-developers/geozarr-site/commit/42276cf318566be187e33f17d867007466f0fcb9,11,zarr-developers,geozarr-site +8d7c33a979925909c566b78ed9b415c13c061432,docs: add guidance on fill value + scale/offset to custom parsers (#974),Max Jones,GitHub,https://github.com/zarr-developers/VirtualiZarr/commit/8d7c33a979925909c566b78ed9b415c13c061432,237,zarr-developers,virtualizarr +2f04001db8661d480e448255a8c268192efd9a72,docs: add release notes for v2.6.1 (#986),Max Jones,GitHub,https://github.com/zarr-developers/VirtualiZarr/commit/2f04001db8661d480e448255a8c268192efd9a72,37,zarr-developers,virtualizarr +ab88a2fbc872f9bdec32705eed42c4dabc16143d,chore: update typing for internal changes in Zarr-Python 3.2.0 (#985),Max Jones,GitHub,https://github.com/zarr-developers/VirtualiZarr/commit/ab88a2fbc872f9bdec32705eed42c4dabc16143d,12,zarr-developers,virtualizarr +036f6f14e91d1e059fd952be3d16657c004d9b2c,fixed-length utf32 (numpy `U`) (#59),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-extensions/commit/036f6f14e91d1e059fd952be3d16657c004d9b2c,198,zarr-developers,zarr-extensions +7c2f372f21b2555e11b2ab52f0e659a0306e5741,chore: fix ability to run mypy via hatch (#3952),Chuck Daniels,GitHub,https://github.com/zarr-developers/zarr-python/commit/7c2f372f21b2555e11b2ab52f0e659a0306e5741,5,zarr-developers,zarr-python +14450013f843c0021c17c95a44457107d8688f20,Fix V3 time types (#3955),Chuck Daniels,GitHub,https://github.com/zarr-developers/zarr-python/commit/14450013f843c0021c17c95a44457107d8688f20,14,zarr-developers,zarr-python +6af3ea49d6c10137c0044a9f78813d79c71b0ac4,"Allow s3 testing in face of ""ambient"" AWS creds (#3947)",Chuck Daniels,GitHub,https://github.com/zarr-developers/zarr-python/commit/6af3ea49d6c10137c0044a9f78813d79c71b0ac4,23,zarr-developers,zarr-python +488790435e4d47a0c136d533b4a86fd365adf43c,fix: Remove NAIP Mosaic caching override (#554),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/488790435e4d47a0c136d533b4a86fd365adf43c,1,developmentseed,deck.gl-raster +57e2389662f72acab936466303d0d44570218ace,docs: Small blog wording (#553),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/57e2389662f72acab936466303d0d44570218ace,4,developmentseed,deck.gl-raster +3ed9d79e6bd4250aa9f631e77988bb546788082c,ci: Fix docs publish by skipping example dirs without a build script (#552),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/3ed9d79e6bd4250aa9f631e77988bb546788082c,5,developmentseed,deck.gl-raster +21016c12db0b288223e688bb40137b7f7f2ac99e,chore: prepare 0.7 (#544),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/21016c12db0b288223e688bb40137b7f7f2ac99e,180,developmentseed,deck.gl-raster +d26d038cb5d9f660e2e0c57d4fdd0381cd307231,refactor: Rename `MosaicSource.key` to `MosaicSource.id` (#551),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/d26d038cb5d9f660e2e0c57d4fdd0381cd307231,51,developmentseed,deck.gl-raster +f11f22601ecfd1c7ed35ccfbd5e8791aa8642984,refactor!: Make MosaicTileset2D private (#550),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/f11f22601ecfd1c7ed35ccfbd5e8791aa8642984,567,developmentseed,deck.gl-raster +07d8504d79e366c203819fdd020c366eb6abaa77,"chore: Remove old, unexported GeoTIFFLayer from deck.gl-geotiff package (#549)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/07d8504d79e366c203819fdd020c366eb6abaa77,233,developmentseed,deck.gl-raster +157e6feba46bd0a0e28837ce7607c5ffa3c02547,feat: Spiral out loading (#477),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/157e6feba46bd0a0e28837ce7607c5ffa3c02547,708,developmentseed,deck.gl-raster +8bdcbe97cc7fafa2dfe793838727e3e21b4ba7ea,chore: Move historical zarr plan into dev-docs folder (#548),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/8bdcbe97cc7fafa2dfe793838727e3e21b4ba7ea,0,developmentseed,deck.gl-raster +cf189ccc03bca3759ab31f92fa89a3e1a6b9fa20,chore!: Rename TilesetDescriptor to RasterTilesetDescriptor (#547),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/cf189ccc03bca3759ab31f92fa89a3e1a6b9fa20,298,developmentseed,deck.gl-raster +ac672e9ae3c06dc89132af45769c5a6308daf8bd,feat: Expose onTile callbacks through raster tile layers (#546),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/ac672e9ae3c06dc89132af45769c5a6308daf8bd,96,developmentseed,deck.gl-raster +06c366837c4ccc34384497dbbbb1bc1d3be7468a,perf(raster-layer): avoid re-compiling shader Model as much as possible (#540),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/06c366837c4ccc34384497dbbbb1bc1d3be7468a,168,developmentseed,deck.gl-raster +9480a2627f57be9d124284fecee4b0fbe4088907,perf(raster-tileset): Reduce re-renders of RasterLayer for same per-tile transforms (#543),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/9480a2627f57be9d124284fecee4b0fbe4088907,86,developmentseed,deck.gl-raster +3e05a599686410ee597711df2043b1ff9b475115,fix: `PlanarConfiguration` TIFF tag is not required (#542),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/3e05a599686410ee597711df2043b1ff9b475115,16,developmentseed,deck.gl-raster +3cc97f9520ed023dfa2eb6a1af2a1fb526463980,ci: Explicitly unset NODE_AUTH_TOKEN during publishing (#538),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/3cc97f9520ed023dfa2eb6a1af2a1fb526463980,5,developmentseed,deck.gl-raster +021f946fd27a143050c6812c3b3f787615a4d4eb,ci: Revert version changes to release.yml since 0.6.1 release (#536),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/021f946fd27a143050c6812c3b3f787615a4d4eb,8,developmentseed,deck.gl-raster +c56a4238e29589a771fe458133ca5fc66c942088,ci: Avoid npm caching in publish workflow (#535),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/c56a4238e29589a771fe458133ca5fc66c942088,3,developmentseed,deck.gl-raster +5cea2e3e1fe2d3204515d85bd7968427b226e020,chore: Bump to 0.7.0-beta.1 (#534),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/5cea2e3e1fe2d3204515d85bd7968427b226e020,24,developmentseed,deck.gl-raster +fbd9080c2b0d690e62c0340ab1357729c31fd3b4,feat(mosaic): add explicit `key?: string` to mosaic sources (#533),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/fbd9080c2b0d690e62c0340ab1357729c31fd3b4,99,developmentseed,deck.gl-raster +78b18d96cbcd1658c3864222d6fe14b7211a704e,"feat(geotiff): route fetchTiles through batched, range-coalescing getTiles (#531)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/78b18d96cbcd1658c3864222d6fe14b7211a704e,396,developmentseed,deck.gl-raster +7b2bc8016010fdbc2fbc200d5cb4d3d1589a0ed5,"feat(geotiff): New internal method to fetch multiple tiles concurrently, with range coalescing (#530)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/7b2bc8016010fdbc2fbc200d5cb4d3d1589a0ed5,763,developmentseed,deck.gl-raster +22a7ddb74c5afc5ac613f0564a12c8db413c99df,perf(geotiff)!: block-aligned LRU header cache; lazy tile metadata (#529),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/22a7ddb74c5afc5ac613f0564a12c8db413c99df,499,developmentseed,deck.gl-raster +f750047f6bd9c6c0e9c01f4618b17a0abe9f9433,fix(geotiff): Turn off HTTP request bounds checking (#527),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/f750047f6bd9c6c0e9c01f4618b17a0abe9f9433,124,developmentseed,deck.gl-raster +6f2a009fa8145c71dd829ff40dbbe6c2242f3e91,fix(raster-tileset): memoize tile bounding volumes across traversals (#525),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/6f2a009fa8145c71dd829ff40dbbe6c2242f3e91,679,developmentseed,deck.gl-raster +728244fd399a7d886fbc8fdda7d0ea8fabc58c55,feat(examples): migrate remaining examples to the shared component package (#521),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/728244fd399a7d886fbc8fdda7d0ea8fabc58c55,6791,developmentseed,deck.gl-raster +c2625343e63b88b0b6d138b1646f1530449da46a,fix(examples): correct NDVI range filter in naip-mosaic (#522),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/c2625343e63b88b0b6d138b1646f1530449da46a,29,developmentseed,deck.gl-raster +274ff2b2da965d8a5e9053cd5b510c7ae648299f,feat(examples): shared component package + migrate cog-basic & sentinel-2 (#520),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/274ff2b2da965d8a5e9053cd5b510c7ae648299f,2628,developmentseed,deck.gl-raster +6dd1dad6624f476c5f7e2d5edc1e5856ba922116,feat(geotiff): thread AbortSignal through GeoTIFF open/fromUrl (#515),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/6dd1dad6624f476c5f7e2d5edc1e5856ba922116,124,developmentseed,deck.gl-raster +220e02ccc3806f7acadcc6965cdadb978393a8ec,fix(mosaic-layer): make sources prop reactive to updates (#511),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/220e02ccc3806f7acadcc6965cdadb978393a8ec,435,developmentseed,deck.gl-raster +4c0ae8eeac4f475c26ebd19f89f11007063f9557,fix!: Default to linear sampling for non-paletted COGs (#514),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/4c0ae8eeac4f475c26ebd19f89f11007063f9557,19,developmentseed,deck.gl-raster +4f3e5d0e8bf4b34a3481b235580d926ea81caf0c,feat: Use `devicePixelRatio` for level of detail computation in tile traversal (#513),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/4f3e5d0e8bf4b34a3481b235580d926ea81caf0c,493,developmentseed,deck.gl-raster +8adf3e9063d5d14fd1a3bac89a65ea7cdb599b83,feat: Update land-cover example to have filterable categories (#506),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/8adf3e9063d5d14fd1a3bac89a65ea7cdb599b83,1087,developmentseed,deck.gl-raster +c54ed062a3dad33a22896e088dcb42f8a5f296ee,refactor: make `MultiCOGLayer` extend `RasterTileLayer` (#499),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/c54ed062a3dad33a22896e088dcb42f8a5f296ee,639,developmentseed,deck.gl-raster +76ef6e1bc06fe15752f277965dc22e18e62e1c5c,feat: Vermont open data example (#502),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/76ef6e1bc06fe15752f277965dc22e18e62e1c5c,1656,developmentseed,deck.gl-raster +9f731b3b4e897f4cfd9ca71d3b3c33c25c8091b7,"fix: In `RasterTileLayer`, allow `renderTile` to return `null` to avoid rendering a layer (#489)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/9f731b3b4e897f4cfd9ca71d3b3c33c25c8091b7,39,developmentseed,deck.gl-raster +d93c69633a96d703d2bfe9cd93072f03ad026b09,fix: Try to fix plausible script injection (#488),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/d93c69633a96d703d2bfe9cd93072f03ad026b09,2,developmentseed,deck.gl-raster +186ceae3f7014236eb75726a90e1b575043b5c7a,chore: prepare for 0.6 release (#487),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/186ceae3f7014236eb75726a90e1b575043b5c7a,971,developmentseed,deck.gl-raster +0d63817fc05e8a789749f928034e04712c4943ff,docs: Expose Zarr package through docs site (#486),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/0d63817fc05e8a789749f928034e04712c4943ff,2455,developmentseed,deck.gl-raster +a6445fe1871d3d3ef2f1bd9fce9abeda906dfe5b,fix: Allow `MinimalTileData` to be `null` in RasterTileLayer (#484),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/a6445fe1871d3d3ef2f1bd9fce9abeda906dfe5b,6,developmentseed,deck.gl-raster +322d92afe85aea8f2f9ce6408cde6d1a76e6e50a,feat: Brainstorming for COG GCPs support (#485),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/322d92afe85aea8f2f9ce6408cde6d1a76e6e50a,364,developmentseed,deck.gl-raster +e9e927f64b70faf95aa52edaf829914458a57781,perf: Don't dynamic-import builtin deflate decoder (#483),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/e9e927f64b70faf95aa52edaf829914458a57781,48,developmentseed,deck.gl-raster +c741866358434e0f7e34b68d52674859e3039a57,chore: Bump to 0.6.0-beta.1 (#482),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/c741866358434e0f7e34b68d52674859e3039a57,22,developmentseed,deck.gl-raster +dfabc6ed8fb255c8395fa4cf2f8a13b9584946d5,"chore: Fix `clean` script, fix lockfile (#481)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/dfabc6ed8fb255c8395fa4cf2f8a13b9584946d5,730,developmentseed,deck.gl-raster +afb3dd0e17cffa2b2c454284f72061f7277cf039,feat: Split COG tile traversal off TileMatrixSet (#480),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/afb3dd0e17cffa2b2c454284f72061f7277cf039,1199,developmentseed,deck.gl-raster +6f3f1e2b565a19ab695f400d23b79a9e7e9ce60b,chore: Bump vite to v8 (#479),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/6f3f1e2b565a19ab695f400d23b79a9e7e9ce60b,607,developmentseed,deck.gl-raster +b4ce0e9547288bf87234756cd57c8382a40cf7d6,ci: run all of xarray's tests in downstream workflow (#3940),Max Jones,GitHub,https://github.com/zarr-developers/zarr-python/commit/b4ce0e9547288bf87234756cd57c8382a40cf7d6,18,zarr-developers,zarr-python +ac667c1a7f25e6fed3b3cd63ac3c241d1ea30cb1,chore: automate more of the release process (#3896),Max Jones,GitHub,https://github.com/zarr-developers/zarr-python/commit/ac667c1a7f25e6fed3b3cd63ac3c241d1ea30cb1,246,zarr-developers,zarr-python +a82c94ba6ba891dfe861e49f8844f33c9a809256,fix: dark mode logos,Max Jones,Max Jones,https://github.com/zarr-developers/zarr-developers.github.io/commit/a82c94ba6ba891dfe861e49f8844f33c9a809256,35,zarr-developers,zarr-developers.github.io +837e2c5f10294d20f035a9e8ee6e1960ef8d3f7e,Read RTD canonical URL to set VitePress base path for sub-path deploys,Max Jones,Max Jones,https://github.com/zarr-developers/zarr-developers.github.io/commit/837e2c5f10294d20f035a9e8ee6e1960ef8d3f7e,8,zarr-developers,zarr-developers.github.io +8bfcc66ebe173d10e810a057a2deb57f3944999f,docs: update link to developer chat (#3980),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/8bfcc66ebe173d10e810a057a2deb57f3944999f,2,zarr-developers,zarr-python +51033fb32f5abe4912db2a22f0fe575d54088981,refactor(sharding): store chunks_per_shard explicitly in _ShardIndex (#3975),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/51033fb32f5abe4912db2a22f0fe575d54088981,122,zarr-developers,zarr-python +cdb5846c33fdc217c4ac743a5cdb3e5c54b1868c,perf: cache default ArraySpec for regular chunk grids (#3908),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/cdb5846c33fdc217c4ac743a5cdb3e5c54b1868c,31,zarr-developers,zarr-python +f2321ec20949bd9b052f116e50e6972e1dd3b1e6,chore: cd workflow (#3935),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/f2321ec20949bd9b052f116e50e6972e1dd3b1e6,179,zarr-developers,zarr-python +be160fdf3ed66f9cb2d65b864b7e4c9d56d5abc9,misc(zarr-metadata): typed constants and fixes (#3978),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/be160fdf3ed66f9cb2d65b864b7e4c9d56d5abc9,112,zarr-developers,zarr-python +2e58a7a44c5388ebfa81100fb94f6c215e584dce,chore: remove warning on fixed length utf32 (#3979),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/2e58a7a44c5388ebfa81100fb94f6c215e584dce,22,zarr-developers,zarr-python +b740cf2637588bc4f853a9fa58204265b38f245c,feat:get_ranges (#3925),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/b740cf2637588bc4f853a9fa58204265b38f245c,1254,zarr-developers,zarr-python +7e58df003f528470f06d6fc689099c4f04ef0c95,chore: run mypy from developer environment (#3972),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/7e58df003f528470f06d6fc689099c4f04ef0c95,4268,zarr-developers,zarr-python +eac9c86ba48e0de174581be519f219339b16a5ef,fix(zarr-metadata): model stored metadata more closely (#3962),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/eac9c86ba48e0de174581be519f219339b16a5ef,4189,zarr-developers,zarr-python +c79425ef5d286e2f13da6035cacc1a39dd54fae1,deprecate blosc enums (#3963),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/c79425ef5d286e2f13da6035cacc1a39dd54fae1,350,zarr-developers,zarr-python +6e7f2f3f1c104bd26ac84ec6ee51fef9ee59f9ad,refactor: simplify internal chunk representation (#3899),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/6e7f2f3f1c104bd26ac84ec6ee51fef9ee59f9ad,896,zarr-developers,zarr-python +f9c53d5de48c35ee9c35d91e822040e60e409db9,chore(zarr-metadata): bump version to 0.1.1 (#3949),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/f9c53d5de48c35ee9c35d91e822040e60e409db9,4,zarr-developers,zarr-python +85890b3bb404fd1d401267c508a2694f5734559e,release : 3.2.1 release notes (#3942),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/85890b3bb404fd1d401267c508a2694f5734559e,33,zarr-developers,zarr-python +37ae37b3f5b4c9c5f3577de7dab2f628ffa753f9,fix: defer to fsspec for memory url scheme (#3944),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/37ae37b3f5b4c9c5f3577de7dab2f628ffa753f9,18,zarr-developers,zarr-python +021662c87acfd145f87f72fc340dd686d1b375ae,fix: use contextual arrayspec when validating / evolving codecs (#3941),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/021662c87acfd145f87f72fc340dd686d1b375ae,90,zarr-developers,zarr-python +ad374b5e8e4a07947b8ca5d72d72887010a7e151,cast_value data type validation was checking the source data type instead of the target data type in the (#3938),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/ad374b5e8e4a07947b8ca5d72d72887010a7e151,67,zarr-developers,zarr-python +f8c0c5d97b32f97c1bd231af27078b4efc7e2a1b,feat:metadata package (#3919),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/f8c0c5d97b32f97c1bd231af27078b4efc7e2a1b,8298,zarr-developers,zarr-python +3ede5e830e03c76d57da5d78775dfbac0f5ea170,docs: build 3.2.0 release notes (#3932),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/3ede5e830e03c76d57da5d78775dfbac0f5ea170,106,zarr-developers,zarr-python +870fabd0f2f94df84698fef1e7f20f59d02d0634,chore/3.2.0 release notes (#3927),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/870fabd0f2f94df84698fef1e7f20f59d02d0634,3,zarr-developers,zarr-python +23e96350b83079b7ef8c31fe5430024ef4a66d50,feat: add cast_value and scale_offset codecs (#3874),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/23e96350b83079b7ef8c31fe5430024ef4a66d50,1732,zarr-developers,zarr-python +279d400a19d510df6384bb1e93c4817dc867072b,fix(storage): preserve leading slashes in FsspecStore.path (#3926),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/279d400a19d510df6384bb1e93c4817dc867072b,190,zarr-developers,zarr-python diff --git a/reports/output/pi-26.3-resolved-issues-prs.csv b/reports/output/pi-26.3-resolved-issues-prs.csv new file mode 100644 index 0000000..8d8ef78 --- /dev/null +++ b/reports/output/pi-26.3-resolved-issues-prs.csv @@ -0,0 +1,110 @@ +number,title,type,state,author,url,created_at,updated_at,organization,repository,contributor +64,Support pixel density adjustment,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/64,2025-12-17T23:09:28+00:00,2026-05-07T19:18:55+00:00,developmentseed,deck.gl-raster,kylebarron +90,virtualizarr store backend for zarrita.js,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/90,2025-12-21T20:42:19+00:00,2026-05-05T03:24:55+00:00,developmentseed,deck.gl-raster,kylebarron +129,COGLayer: User-provided callback for managing file-wide state?,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/129,2026-01-01T22:04:33+00:00,2026-05-05T03:25:33+00:00,developmentseed,deck.gl-raster,kylebarron +158,Landcover exapmle: Side-by-side view,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/158,2026-01-06T04:21:15+00:00,2026-05-05T03:26:17+00:00,developmentseed,deck.gl-raster,kylebarron +170,Reading requester pays aws data,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/170,2026-01-09T03:58:39+00:00,2026-05-05T03:28:39+00:00,developmentseed,deck.gl-raster,kylebarron +173,Reading private COGs / Zarr,Issue,closed,samsammurphy,https://github.com/developmentseed/deck.gl-raster/issues/173,2026-01-09T18:14:48+00:00,2026-05-05T03:27:22+00:00,developmentseed,deck.gl-raster,kylebarron +186,"""Minimal proj.db""?",Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/186,2026-01-15T19:20:10+00:00,2026-05-12T19:43:39+00:00,developmentseed,deck.gl-raster,kylebarron +210,Where should zarr-multiscale-metadata package live?,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/210,2026-01-30T16:28:43+00:00,2026-05-05T03:29:26+00:00,developmentseed,deck.gl-raster,kylebarron +292,Restore AbortSignal support in naip-mosaic example for opening COG headers,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/292,2026-03-02T23:55:52+00:00,2026-05-07T20:31:12+00:00,developmentseed,deck.gl-raster,kylebarron +302,geotiff: Implement request coalescing / fetch_tiles,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/302,2026-03-03T23:40:11+00:00,2026-05-05T03:32:10+00:00,developmentseed,deck.gl-raster,kylebarron +327,Support COGs with rotated transforms,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/327,2026-03-11T15:01:12+00:00,2026-04-27T16:51:04+00:00,developmentseed,deck.gl-raster,kylebarron +375,Failing rendering with non-square pixels,Issue,closed,cbdj,https://github.com/developmentseed/deck.gl-raster/issues/375,2026-03-27T15:11:49+00:00,2026-04-28T05:42:43+00:00,developmentseed,deck.gl-raster,kylebarron +407,geotiff: Implement fetch coalescing for GeoTIFF `fetchTiles`,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/407,2026-04-09T22:14:31+00:00,2026-05-12T21:13:12+00:00,developmentseed,deck.gl-raster,kylebarron +428,geotiff: Don't dynamic import tiny decompressors?,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/428,2026-04-15T19:45:23+00:00,2026-04-27T17:47:35+00:00,developmentseed,deck.gl-raster,kylebarron +444,feat: temperature anomaly deck.gl-raster zarr example,PR,closed,wrynearson,https://github.com/developmentseed/deck.gl-raster/pull/444,2026-04-20T11:12:03+00:00,2026-05-01T07:39:10+00:00,developmentseed,deck.gl-raster,kylebarron +450,"Load tiles from center of the viewport and spiraling out, instead of starting from the top left",Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/450,2026-04-20T17:37:43+00:00,2026-05-14T21:39:14+00:00,developmentseed,deck.gl-raster,kylebarron +456,Split off COG tile traversal from TileMatrixSet,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/456,2026-04-21T14:29:45+00:00,2026-04-27T16:51:05+00:00,developmentseed,deck.gl-raster,kylebarron +468,chore: Update to uuid v14,PR,closed,jcoyne,https://github.com/developmentseed/deck.gl-raster/pull/468,2026-04-24T18:03:05+00:00,2026-04-27T14:35:06+00:00,developmentseed,deck.gl-raster,kylebarron +500,geotiff: multiplier for HTTP range sizes for header metadata,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/500,2026-05-01T20:32:08+00:00,2026-05-12T19:43:36+00:00,developmentseed,deck.gl-raster,kylebarron +501,geotiff: Helper to get byte length of header,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/501,2026-05-01T21:25:39+00:00,2026-05-12T19:43:37+00:00,developmentseed,deck.gl-raster,kylebarron +505,COGLayer: Whether to use linear or nearest sampling by default,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/505,2026-05-05T03:45:29+00:00,2026-05-07T19:35:26+00:00,developmentseed,deck.gl-raster,kylebarron +519,Make shared components across examples,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/519,2026-05-08T21:08:18+00:00,2026-05-11T19:11:18+00:00,developmentseed,deck.gl-raster,kylebarron +523,Tile traversal regression: getTileIndices ~12 ms/frame on HiDPI (no cross-frame memoization),Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/523,2026-05-11T19:10:23+00:00,2026-05-11T20:21:37+00:00,developmentseed,deck.gl-raster,kylebarron +524,SourceError: Request outside of bounds,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/524,2026-05-11T19:21:14+00:00,2026-05-11T21:01:33+00:00,developmentseed,deck.gl-raster,kylebarron +528,geotiff: Reduce latency for visualizing large COGs,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/528,2026-05-12T16:47:24+00:00,2026-05-12T19:43:37+00:00,developmentseed,deck.gl-raster,kylebarron +532,Add explicit `key?: string` to `sources` input in MosaicLayer,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/532,2026-05-13T02:14:08+00:00,2026-05-13T16:30:43+00:00,developmentseed,deck.gl-raster,kylebarron +537,Failing publish of 0.7.0-beta.1,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/537,2026-05-13T19:44:53+00:00,2026-05-13T20:09:36+00:00,developmentseed,deck.gl-raster,kylebarron +539,[Bug] TIFF PlanarConfiguration is not a required tag,Issue,closed,kylebarron,https://github.com/developmentseed/deck.gl-raster/issues/539,2026-05-13T21:27:52+00:00,2026-05-14T14:20:44+00:00,developmentseed,deck.gl-raster,kylebarron +24,chore(main): release 0.1.1,PR,closed,ds-release-bot[bot],https://github.com/developmentseed/lazycogs/pull/24,2026-04-27T17:51:50+00:00,2026-04-27T18:01:20+00:00,developmentseed,lazycogs,hrodmn +26,Why have `open_async`?,Issue,closed,kylebarron,https://github.com/developmentseed/lazycogs/issues/26,2026-04-27T21:58:07+00:00,2026-04-29T14:07:30+00:00,developmentseed,lazycogs,hrodmn +48,Explore rasterix integration,Issue,closed,hrodmn,https://github.com/developmentseed/lazycogs/issues/48,2026-05-05T01:11:44+00:00,2026-05-07T02:18:06+00:00,developmentseed,lazycogs,hrodmn +175,fix: avoid duplicating GranuleSearch params in timeseries requests,PR,closed,hrodmn,https://github.com/developmentseed/titiler-cmr/pull/175,2026-05-05T17:25:04+00:00,2026-05-06T14:50:42+00:00,developmentseed,titiler-cmr,chuckwondo +176,chore: ci upgrades and security fixes,PR,closed,hrodmn,https://github.com/developmentseed/titiler-cmr/pull/176,2026-05-08T13:43:32+00:00,2026-05-08T14:36:26+00:00,developmentseed,titiler-cmr,chuckwondo +177,chore: replace dynamic versioning with release-please,PR,closed,hrodmn,https://github.com/developmentseed/titiler-cmr/pull/177,2026-05-08T15:08:43+00:00,2026-05-08T17:16:28+00:00,developmentseed,titiler-cmr,chuckwondo +48,Add documentation describing poor deserialization performance of vlen data.,Issue,closed,sharkinsspatial,https://github.com/developmentseed/zarr-datafusion-search/issues/48,2026-04-27T22:42:50+00:00,2026-04-29T21:47:42+00:00,developmentseed,zarr-datafusion-search,sharkinsspatial +52,Build rustac utility to load STAC queries into datafusion schema,Issue,closed,abarciauskas-bgse,https://github.com/developmentseed/zarr-datafusion-search/issues/52,2026-05-05T01:02:39+00:00,2026-05-14T14:25:46+00:00,developmentseed,zarr-datafusion-search,sharkinsspatial +1549,Way to fetch location of inlined chunk,Issue,closed,TomNicholas,https://github.com/earth-mover/icechunk/issues/1549,2026-01-09T20:28:11+00:00,2026-05-13T18:56:08+00:00,earth-mover,icechunk,maxrjones +96,[docs/bug] notebook link broken,Issue,closed,norlandrhagen,https://github.com/virtual-zarr/virtual-tiff/issues/96,2026-04-13T20:38:45+00:00,2026-04-29T21:37:15+00:00,virtual-zarr,virtual-tiff,maxrjones +26,Require uuid in ZCM objects,PR,closed,maxrjones,https://github.com/zarr-conventions/multiscales/pull/26,2025-12-12T17:13:17+00:00,2026-05-03T17:46:42+00:00,zarr-conventions,multiscales,d-v-b +10,Proper handling of the Z dimension,Issue,closed,maxrjones,https://github.com/zarr-conventions/spatial/issues/10,2026-04-03T01:43:48+00:00,2026-05-14T19:57:16+00:00,zarr-conventions,spatial,maxrjones +22,Make `dimension_names` mandatory at array level,Issue,closed,vincentsarago,https://github.com/zarr-conventions/spatial/issues/22,2026-05-13T10:10:58+00:00,2026-05-17T20:11:24+00:00,zarr-conventions,spatial,maxrjones +24,Restrict spatial: convention to 2D (X/Y) only,PR,closed,emmanuelmathot,https://github.com/zarr-conventions/spatial/pull/24,2026-05-13T20:33:53+00:00,2026-05-14T19:57:16+00:00,zarr-conventions,spatial,maxrjones +25,Refine spatial:dimensions: array-required + link dimension_names,PR,closed,emmanuelmathot,https://github.com/zarr-conventions/spatial/pull/25,2026-05-13T21:18:54+00:00,2026-05-18T08:00:07+00:00,zarr-conventions,spatial,maxrjones +26,Add FAQ: spatial: provides implicit coordinates,PR,closed,emmanuelmathot,https://github.com/zarr-conventions/spatial/pull/26,2026-05-13T21:29:25+00:00,2026-05-14T15:50:09+00:00,zarr-conventions,spatial,maxrjones +27,Drop trailing colon from convention name,PR,closed,emmanuelmathot,https://github.com/zarr-conventions/spatial/pull/27,2026-05-13T21:35:31+00:00,2026-05-14T15:39:49+00:00,zarr-conventions,spatial,maxrjones +6,implementations: update GDAL to Full,PR,closed,wietzesuijker,https://github.com/zarr-developers/geozarr-site/pull/6,2026-03-06T02:57:23+00:00,2026-05-14T15:18:29+00:00,zarr-developers,geozarr-site,maxrjones +7,"""Edit this page on GitHub"" links result in 404s",Issue,closed,tylere,https://github.com/zarr-developers/geozarr-site/issues/7,2026-03-16T16:48:54+00:00,2026-05-14T15:23:46+00:00,zarr-developers,geozarr-site,maxrjones +10,implementations: expand compatibility matrix and add implementation details,PR,closed,emmanuelmathot,https://github.com/zarr-developers/geozarr-site/pull/10,2026-04-02T12:24:17+00:00,2026-05-14T15:17:29+00:00,zarr-developers,geozarr-site,maxrjones +11,Link to eopf data-model leads to 404,Issue,closed,felixcremer,https://github.com/zarr-developers/geozarr-site/issues/11,2026-04-20T08:03:49+00:00,2026-05-14T15:23:19+00:00,zarr-developers,geozarr-site,maxrjones +814,"Documentation cleanup: fix typos, grammar, and naming consistency",PR,closed,DimitriPapadopoulos,https://github.com/zarr-developers/numcodecs/pull/814,2026-02-08T10:13:06+00:00,2026-05-14T08:00:20+00:00,zarr-developers,numcodecs,d-v-b +839,CI: Fix Meson mixup between Conda and system Python headers,PR,closed,DimitriPapadopoulos,https://github.com/zarr-developers/numcodecs/pull/839,2026-04-18T13:32:09+00:00,2026-05-14T07:48:37+00:00,zarr-developers,numcodecs,d-v-b +172,feat: redesign website,PR,closed,maxrjones,https://github.com/zarr-developers/zarr-developers.github.io/pull/172,2026-05-08T14:07:49+00:00,2026-05-08T16:24:34+00:00,zarr-developers,zarr-developers.github.io,d-v-b +173,add earthmover logo to adopters and datasets pages,PR,closed,jhamman,https://github.com/zarr-developers/zarr-developers.github.io/pull/173,2026-05-08T20:56:36+00:00,2026-05-11T15:55:48+00:00,zarr-developers,zarr-developers.github.io,maxrjones +18,numpy `S*` and `V*` dtypes,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-extensions/issues/18,2025-06-07T15:41:25+00:00,2026-05-16T11:08:26+00:00,zarr-developers,zarr-extensions,d-v-b +486,How to prevent Zarr from returning NaN for missing chunks?,Issue,closed,willirath,https://github.com/zarr-developers/zarr-python/issues/486,2019-10-19T11:52:54+00:00,2026-04-30T22:32:56+00:00,zarr-developers,zarr-python,d-v-b +1118,Adding GitHub release publishing step (when tagging),Issue,closed,jakirkham,https://github.com/zarr-developers/zarr-python/issues/1118,2022-09-01T16:36:04+00:00,2026-05-13T13:45:26+00:00,zarr-developers,zarr-python,maxrjones +1266,Release note workflow,Issue,closed,jakirkham,https://github.com/zarr-developers/zarr-python/issues/1266,2022-11-15T21:35:42+00:00,2026-05-13T13:19:32+00:00,zarr-developers,zarr-python,maxrjones +2022,Fix indexing bug when reading past the first chunk in a shard,PR,closed,darsnack,https://github.com/zarr-developers/zarr-python/pull/2022,2024-07-10T12:58:43+00:00,2026-05-14T17:16:38+00:00,zarr-developers,zarr-python,d-v-b +2181,Explain why N5Store is being removed,Issue,closed,dstansby,https://github.com/zarr-developers/zarr-python/issues/2181,2024-09-13T13:10:40+00:00,2026-05-13T13:20:57+00:00,zarr-developers,zarr-python,d-v-b +2419,Review TODOs before v3?,Issue,closed,DimitriPapadopoulos,https://github.com/zarr-developers/zarr-python/issues/2419,2024-10-20T12:37:47+00:00,2026-05-13T13:46:33+00:00,zarr-developers,zarr-python,maxrjones +3006,DOC: release-notes missing for 3.0.7 release,Issue,closed,TomAugspurger,https://github.com/zarr-developers/zarr-python/issues/3006,2025-04-22T17:26:27+00:00,2026-04-29T18:36:18+00:00,zarr-developers,zarr-python,d-v-b +3355,add modules for types,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3355,2025-08-06T15:03:26+00:00,2026-05-01T22:15:45+00:00,zarr-developers,zarr-python,maxrjones +3452,Feature: support uvloop as a faster alternative to Python's default IO loop,PR,closed,jhamman,https://github.com/zarr-developers/zarr-python/pull/3452,2025-09-14T03:22:08+00:00,2026-05-06T13:50:17+00:00,zarr-developers,zarr-python,d-v-b +3534,Feature: support rectilinear chunk grid extension ,PR,closed,jhamman,https://github.com/zarr-developers/zarr-python/pull/3534,2025-10-20T12:36:21+00:00,2026-05-06T13:50:01+00:00,zarr-developers,zarr-python,d-v-b +3751,Cannot write a 0 dimensional array with sharding,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3751,2026-03-08T19:27:29+00:00,2026-05-14T11:01:40+00:00,zarr-developers,zarr-python,chuckwondo +3861,Document kwargs in zarr.create,PR,closed,Osaidgit,https://github.com/zarr-developers/zarr-python/pull/3861,2026-04-01T09:13:13+00:00,2026-04-26T08:41:14+00:00,zarr-developers,zarr-python,d-v-b +3867,"zarr v3 scale-offset codec, and should the codec API be defined upstream",Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3867,2026-04-03T09:04:41+00:00,2026-04-30T20:40:13+00:00,zarr-developers,zarr-python,d-v-b +3874,feat: add cast_value and scale_offset codecs,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3874,2026-04-06T12:20:13+00:00,2026-04-30T20:42:46+00:00,zarr-developers,zarr-python,maxrjones +3888,Release Zarr-Python v3.2.0,Issue,closed,maxrjones,https://github.com/zarr-developers/zarr-python/issues/3888,2026-04-08T20:11:51+00:00,2026-04-30T22:33:40+00:00,zarr-developers,zarr-python,maxrjones +3896,chore: automate more of the release process,PR,closed,maxrjones,https://github.com/zarr-developers/zarr-python/pull/3896,2026-04-09T16:49:56+00:00,2026-04-30T21:06:39+00:00,zarr-developers,zarr-python,d-v-b +3898,"given shape=(s,) chunks=(-1,) should mean (s,)",Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3898,2026-04-10T16:13:48+00:00,2026-05-07T19:28:48+00:00,zarr-developers,zarr-python,d-v-b +3899,refactor: simplify internal chunk representation,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3899,2026-04-12T12:27:10+00:00,2026-05-07T19:28:51+00:00,zarr-developers,zarr-python,maxrjones +3908,perf: cache default ArraySpec for regular chunk grids,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3908,2026-04-15T09:24:26+00:00,2026-05-17T21:57:16+00:00,zarr-developers,zarr-python,maxrjones +3919,feat:metadata package,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3919,2026-04-21T22:26:27+00:00,2026-05-01T22:16:13+00:00,zarr-developers,zarr-python,maxrjones +3925,feat:get_ranges,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3925,2026-04-24T19:06:38+00:00,2026-05-15T21:34:57+00:00,zarr-developers,zarr-python,chuckwondo +3926,fix(storage): preserve leading slashes in FsspecStore.path,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3926,2026-04-27T11:15:20+00:00,2026-04-29T18:13:51+00:00,zarr-developers,zarr-python,maxrjones +3927,chore/3.2.0 release notes,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3927,2026-04-27T12:55:42+00:00,2026-04-30T21:29:46+00:00,zarr-developers,zarr-python,maxrjones +3928,Use f-strings,PR,closed,DimitriPapadopoulos,https://github.com/zarr-developers/zarr-python/pull/3928,2026-04-28T11:42:50+00:00,2026-04-29T12:42:47+00:00,zarr-developers,zarr-python,d-v-b +3930,chore(deps): bump the actions group across 1 directory with 12 updates,PR,closed,dependabot[bot],https://github.com/zarr-developers/zarr-python/pull/3930,2026-04-30T04:39:32+00:00,2026-05-06T03:08:02+00:00,zarr-developers,zarr-python,d-v-b +3932,docs: build 3.2.0 release notes,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3932,2026-04-30T21:42:21+00:00,2026-04-30T22:04:53+00:00,zarr-developers,zarr-python,maxrjones +3935,chore: cd workflow,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3935,2026-05-02T14:40:53+00:00,2026-05-17T21:34:56+00:00,zarr-developers,zarr-python,maxrjones +3936,CastValue wrap validation bug,Issue,closed,LDeakin,https://github.com/zarr-developers/zarr-python/issues/3936,2026-05-03T12:37:32+00:00,2026-05-03T15:08:56+00:00,zarr-developers,zarr-python,d-v-b +3937,CastValue endianness bug,Issue,closed,LDeakin,https://github.com/zarr-developers/zarr-python/issues/3937,2026-05-03T12:39:20+00:00,2026-05-04T00:39:42+00:00,zarr-developers,zarr-python,d-v-b +3938,fix: CastValue wrap validation bug ,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3938,2026-05-03T12:59:13+00:00,2026-05-03T15:10:22+00:00,zarr-developers,zarr-python,maxrjones +3939,"`memory://` URL scheme no longer routes to fsspec, breaking interop with `MemoryFileSystem`",Issue,closed,maxrjones,https://github.com/zarr-developers/zarr-python/issues/3939,2026-05-03T14:13:33+00:00,2026-05-05T04:36:49+00:00,zarr-developers,zarr-python,d-v-b +3940,ci: run all of xarray's tests in downstream workflow,PR,closed,maxrjones,https://github.com/zarr-developers/zarr-python/pull/3940,2026-05-03T14:22:58+00:00,2026-05-06T02:46:29+00:00,zarr-developers,zarr-python,d-v-b +3941,fix: use contextual arrayspec when validating / evolving codecs,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3941,2026-05-03T15:13:16+00:00,2026-05-04T00:39:27+00:00,zarr-developers,zarr-python,maxrjones +3942,release : 3.2.1 release notes,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3942,2026-05-04T16:01:34+00:00,2026-05-05T12:14:21+00:00,zarr-developers,zarr-python,maxrjones +3943,chore: update pre-commit hooks,PR,closed,pre-commit-ci[bot],https://github.com/zarr-developers/zarr-python/pull/3943,2026-05-04T19:09:20+00:00,2026-05-06T18:44:50+00:00,zarr-developers,zarr-python,d-v-b +3944,fix: defer to fsspec for memory url scheme,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3944,2026-05-04T22:45:08+00:00,2026-05-05T09:13:27+00:00,zarr-developers,zarr-python,maxrjones +3945,Release Zarr-Python v3.2.1,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3945,2026-05-05T12:21:25+00:00,2026-05-11T07:01:53+00:00,zarr-developers,zarr-python,d-v-b +3946,Run-Length Encoding input is not properly supported by RectilinearChunkGrid,Issue,closed,maxrjones,https://github.com/zarr-developers/zarr-python/issues/3946,2026-05-05T13:41:22+00:00,2026-05-11T18:30:25+00:00,zarr-developers,zarr-python,d-v-b +3947,Allow s3 testing in face of ambient AWS credentials,PR,closed,chuckwondo,https://github.com/zarr-developers/zarr-python/pull/3947,2026-05-05T23:31:09+00:00,2026-05-06T02:20:30+00:00,zarr-developers,zarr-python,d-v-b +3951,chore(deps): bump the actions group with 5 updates,PR,closed,dependabot[bot],https://github.com/zarr-developers/zarr-python/pull/3951,2026-05-07T04:41:27+00:00,2026-05-10T21:56:49+00:00,zarr-developers,zarr-python,d-v-b +3952,chore: fix ability to run mypy via hatch,PR,closed,chuckwondo,https://github.com/zarr-developers/zarr-python/pull/3952,2026-05-07T14:24:31+00:00,2026-05-08T10:05:58+00:00,zarr-developers,zarr-python,maxrjones +3954,Consolidated Metadata Not Passed Down,Issue,closed,ilan-gold,https://github.com/zarr-developers/zarr-python/issues/3954,2026-05-07T17:15:04+00:00,2026-05-12T14:09:35+00:00,zarr-developers,zarr-python,d-v-b +3955,Fix V3 time types,PR,closed,chuckwondo,https://github.com/zarr-developers/zarr-python/pull/3955,2026-05-07T22:39:58+00:00,2026-05-07T23:01:07+00:00,zarr-developers,zarr-python,d-v-b +3957,Fix minor typos,PR,closed,kabilar,https://github.com/zarr-developers/zarr-python/pull/3957,2026-05-09T03:44:28+00:00,2026-05-10T10:08:50+00:00,zarr-developers,zarr-python,chuckwondo +3958,zarr 3.2.x breaks kerchunk,Issue,closed,avalentino,https://github.com/zarr-developers/zarr-python/issues/3958,2026-05-09T10:04:48+00:00,2026-05-11T13:54:18+00:00,zarr-developers,zarr-python,d-v-b +3959,bug(zarr-metadata): `attributes` missing from `GroupMetadataV2`,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3959,2026-05-10T08:22:47+00:00,2026-05-13T21:37:10+00:00,zarr-developers,zarr-python,d-v-b +3962,fix(zarr-metadata): model stored metadata more closely,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3962,2026-05-10T19:03:20+00:00,2026-05-12T20:22:29+00:00,zarr-developers,zarr-python,chuckwondo +3963,deprecate blosc enums,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3963,2026-05-10T21:26:50+00:00,2026-05-11T20:16:13+00:00,zarr-developers,zarr-python,maxrjones +3965,chore: remove uv.lock,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3965,2026-05-11T14:38:00+00:00,2026-05-13T13:15:44+00:00,zarr-developers,zarr-python,d-v-b +3966,fix: allow writing to 0-dimensional arrays with sharding,PR,closed,NIK-TIGER-BILL,https://github.com/zarr-developers/zarr-python/pull/3966,2026-05-11T23:16:19+00:00,2026-05-14T11:01:39+00:00,zarr-developers,zarr-python,chuckwondo +3969,what is the right environment for type checking,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3969,2026-05-13T20:44:47+00:00,2026-05-15T21:38:23+00:00,zarr-developers,zarr-python,d-v-b +3970,chore(deps): bump the actions group with 2 updates,PR,closed,dependabot[bot],https://github.com/zarr-developers/zarr-python/pull/3970,2026-05-14T04:39:01+00:00,2026-05-14T12:36:40+00:00,zarr-developers,zarr-python,d-v-b +3972,chore: run mypy from developer environment,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3972,2026-05-14T09:20:34+00:00,2026-05-15T15:37:29+00:00,zarr-developers,zarr-python,chuckwondo +3974,explicitly encode chunk grid shape in _ShardIndex,Issue,closed,d-v-b,https://github.com/zarr-developers/zarr-python/issues/3974,2026-05-14T11:58:14+00:00,2026-05-18T09:49:13+00:00,zarr-developers,zarr-python,d-v-b +3980,docs: update link to developer chat,PR,closed,d-v-b,https://github.com/zarr-developers/zarr-python/pull/3980,2026-05-18T09:56:05+00:00,2026-05-18T15:07:00+00:00,zarr-developers,zarr-python,maxrjones diff --git a/reports/output/pi-26.3.csv b/reports/output/pi-26.3.csv deleted file mode 100644 index 98ad450..0000000 --- a/reports/output/pi-26.3.csv +++ /dev/null @@ -1,43 +0,0 @@ -sha,message,author,committer,url,total_changes,organization,repository -c5a96ef0dfff1a64b2f28c0152a1f793e5e29546,feat: add SumMethod to mosaic methods (#922),Henry Rodman,GitHub,https://github.com/cogeotiff/rio-tiler/commit/c5a96ef0dfff1a64b2f28c0152a1f793e5e29546,53,cogeotiff,rio-tiler -fb7282af3847fbb398a65e2824987ca251d328dd,refactor: Use upstream deck.gl-raster `RasterTileLayer` (#1183),Kyle Barron,GitHub,https://github.com/developmentseed/lonboard/commit/fb7282af3847fbb398a65e2824987ca251d328dd,298,developmentseed,lonboard -66c50b98a3894064a5ade29f03f746d35eed83c7,chore: Switch to pnpm (#1181),Kyle Barron,GitHub,https://github.com/developmentseed/lonboard/commit/66c50b98a3894064a5ade29f03f746d35eed83c7,22614,developmentseed,lonboard -9f731b3b4e897f4cfd9ca71d3b3c33c25c8091b7,"fix: In `RasterTileLayer`, allow `renderTile` to return `null` to avoid rendering a layer (#489)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/9f731b3b4e897f4cfd9ca71d3b3c33c25c8091b7,39,developmentseed,deck.gl-raster -d93c69633a96d703d2bfe9cd93072f03ad026b09,fix: Try to fix plausible script injection (#488),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/d93c69633a96d703d2bfe9cd93072f03ad026b09,2,developmentseed,deck.gl-raster -186ceae3f7014236eb75726a90e1b575043b5c7a,chore: prepare for 0.6 release (#487),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/186ceae3f7014236eb75726a90e1b575043b5c7a,971,developmentseed,deck.gl-raster -0d63817fc05e8a789749f928034e04712c4943ff,docs: Expose Zarr package through docs site (#486),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/0d63817fc05e8a789749f928034e04712c4943ff,2455,developmentseed,deck.gl-raster -a6445fe1871d3d3ef2f1bd9fce9abeda906dfe5b,fix: Allow `MinimalTileData` to be `null` in RasterTileLayer (#484),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/a6445fe1871d3d3ef2f1bd9fce9abeda906dfe5b,6,developmentseed,deck.gl-raster -322d92afe85aea8f2f9ce6408cde6d1a76e6e50a,feat: Brainstorming for COG GCPs support (#485),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/322d92afe85aea8f2f9ce6408cde6d1a76e6e50a,364,developmentseed,deck.gl-raster -e9e927f64b70faf95aa52edaf829914458a57781,perf: Don't dynamic-import builtin deflate decoder (#483),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/e9e927f64b70faf95aa52edaf829914458a57781,48,developmentseed,deck.gl-raster -c741866358434e0f7e34b68d52674859e3039a57,chore: Bump to 0.6.0-beta.1 (#482),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/c741866358434e0f7e34b68d52674859e3039a57,22,developmentseed,deck.gl-raster -dfabc6ed8fb255c8395fa4cf2f8a13b9584946d5,"chore: Fix `clean` script, fix lockfile (#481)",Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/dfabc6ed8fb255c8395fa4cf2f8a13b9584946d5,730,developmentseed,deck.gl-raster -afb3dd0e17cffa2b2c454284f72061f7277cf039,feat: Split COG tile traversal off TileMatrixSet (#480),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/afb3dd0e17cffa2b2c454284f72061f7277cf039,1199,developmentseed,deck.gl-raster -6f3f1e2b565a19ab695f400d23b79a9e7e9ce60b,chore: Bump vite to v8 (#479),Kyle Barron,GitHub,https://github.com/developmentseed/deck.gl-raster/commit/6f3f1e2b565a19ab695f400d23b79a9e7e9ce60b,607,developmentseed,deck.gl-raster -39c6dc35410375c93d47d1119f059e5316c5451f,chore: correctly describe dimension order in docs (#44),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/39c6dc35410375c93d47d1119f059e5316c5451f,18,developmentseed,lazycogs -1fb1844ba9f600edf36986b72ca835fd58f9e360,chore: write specs for a few features (#43),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/1fb1844ba9f600edf36986b72ca835fd58f9e360,626,developmentseed,lazycogs -dede83cff9594576e04e47a08e943ce9a3527dab,fix: remove unnecessary lock on duckdb searches (#39),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/dede83cff9594576e04e47a08e943ce9a3527dab,95,developmentseed,lazycogs -cf07318c0c2414bf47251de72fde9c2189263d31,fix: rip out fake-async open_async (#37),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/cf07318c0c2414bf47251de72fde9c2189263d31,500,developmentseed,lazycogs -5e1964793ec2ddf5bb76944ec1696b8ccc9247ed,"chore: use ALL ruff rules, ignore a few (#34)",Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/5e1964793ec2ddf5bb76944ec1696b8ccc9247ed,1285,developmentseed,lazycogs -e7c7c3311c6bc9e709c682ce8e3f5ed5980e8ad8,"ci: run tests on Python 3.12, 3.13, 3.14 (#33)",Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/e7c7c3311c6bc9e709c682ce8e3f5ed5980e8ad8,8,developmentseed,lazycogs -577205da970457c10dfeb9cccc69c8e68d480419,docs: reorganize docs site (#22),Henry Rodman,GitHub,https://github.com/developmentseed/lazycogs/commit/577205da970457c10dfeb9cccc69c8e68d480419,19204,developmentseed,lazycogs -691986a26fea48b1604a02fd2871135f87dee75d,chore: fix broken link,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/691986a26fea48b1604a02fd2871135f87dee75d,4,developmentseed,lazycogs -2932f6e726d045cb4ce67bf209a9d5599b203027,"chore: add png logo, add badges",hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/2932f6e726d045cb4ce67bf209a9d5599b203027,7,developmentseed,lazycogs -48c0a826aa38f1ab90154a0951176bbdf9578d48,docs: update installation instructions,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/48c0a826aa38f1ab90154a0951176bbdf9578d48,4,developmentseed,lazycogs -d522ba6ab70dcb588318868261f025719c3b487a,docs: update links in README,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/d522ba6ab70dcb588318868261f025719c3b487a,8,developmentseed,lazycogs -4b5241d24653a28791f07759a4660d7582f2330c,feat: initial release,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/4b5241d24653a28791f07759a4660d7582f2330c,4,developmentseed,lazycogs -c358f2dbe7446f0c564501561c98e9253191392e,chore: set up publishing and automated releases,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/c358f2dbe7446f0c564501561c98e9253191392e,222,developmentseed,lazycogs -114eac8b1d2c7bf5ada8a7ede641f49d5216b657,chore: update repo location,hrodmn,hrodmn,https://github.com/developmentseed/lazycogs/commit/114eac8b1d2c7bf5ada8a7ede641f49d5216b657,24,developmentseed,lazycogs -933699838a6decb7ecd3378dcd7cdfcf0435b669,Doc updates (#49),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/933699838a6decb7ecd3378dcd7cdfcf0435b669,21,developmentseed,zarr-datafusion-search -394d38ec90e7e6922da1ee95cbbe6bcf88851da4,Example notebooks (#47),Sean Harkins,GitHub,https://github.com/developmentseed/zarr-datafusion-search/commit/394d38ec90e7e6922da1ee95cbbe6bcf88851da4,31994,developmentseed,zarr-datafusion-search -e1b2668af80d84ae0be921fe9026856a84a13c36,Remove cancelled talk (#125),Max Jones,GitHub,https://github.com/pangeo-data/pangeo.io/commit/e1b2668af80d84ae0be921fe9026856a84a13c36,14,pangeo-data,pangeo.io -9d952019cc59432af86de827116365d03f0dddcf,refactor: remove conversion to async-tiff store (#101),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/9d952019cc59432af86de827116365d03f0dddcf,33,virtual-zarr,virtual-tiff -0f8c9266effcd1c4989fbffb3b8ba61720b5fbec,docs: more clearly explain purpose of Virtual-TIFF (#98),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/0f8c9266effcd1c4989fbffb3b8ba61720b5fbec,272,virtual-zarr,virtual-tiff -20f905fa81f5a38f978d78d796f578e0d0c63ff6,chore!: bump async-tiff min version to v0.5.0 (#103),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/20f905fa81f5a38f978d78d796f578e0d0c63ff6,34,virtual-zarr,virtual-tiff -f6eb23432c35b88fa3cbf97b1e60b3e8282d8449,fix: properly store attributes (#97),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/f6eb23432c35b88fa3cbf97b1e60b3e8282d8449,24,virtual-zarr,virtual-tiff -e323d9e35db54b781dc2d9689f01c86d285f7804,chore: mark xfail on masking failures (#100),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/e323d9e35db54b781dc2d9689f01c86d285f7804,12,virtual-zarr,virtual-tiff -3dbaae9e7c5d343c88b4d073fe8eded29b8571c1,chore: change source for geotiff-test-data (#99),Max Jones,GitHub,https://github.com/virtual-zarr/virtual-tiff/commit/3dbaae9e7c5d343c88b4d073fe8eded29b8571c1,8,virtual-zarr,virtual-tiff -ac667c1a7f25e6fed3b3cd63ac3c241d1ea30cb1,chore: automate more of the release process (#3896),Max Jones,GitHub,https://github.com/zarr-developers/zarr-python/commit/ac667c1a7f25e6fed3b3cd63ac3c241d1ea30cb1,246,zarr-developers,zarr-python -3ede5e830e03c76d57da5d78775dfbac0f5ea170,docs: build 3.2.0 release notes (#3932),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/3ede5e830e03c76d57da5d78775dfbac0f5ea170,106,zarr-developers,zarr-python -870fabd0f2f94df84698fef1e7f20f59d02d0634,chore/3.2.0 release notes (#3927),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/870fabd0f2f94df84698fef1e7f20f59d02d0634,3,zarr-developers,zarr-python -23e96350b83079b7ef8c31fe5430024ef4a66d50,feat: add cast_value and scale_offset codecs (#3874),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/23e96350b83079b7ef8c31fe5430024ef4a66d50,1732,zarr-developers,zarr-python -279d400a19d510df6384bb1e93c4817dc867072b,fix(storage): preserve leading slashes in FsspecStore.path (#3926),Davis Bennett,GitHub,https://github.com/zarr-developers/zarr-python/commit/279d400a19d510df6384bb1e93c4817dc867072b,190,zarr-developers,zarr-python diff --git a/reports/plot.py b/reports/plot.py index e97306f..0d388b3 100644 --- a/reports/plot.py +++ b/reports/plot.py @@ -1,231 +1,25 @@ +#!/usr/bin/env python3 +"""Render per-PI charts for authored commits and resolved issues/PRs.""" + import argparse -import re -from pathlib import Path +import logging -import pandas as pd -import matplotlib.pyplot as plt -from matplotlib.patches import Patch -from matplotlib.ticker import MaxNLocator +from dse_oss_reports.cli import run_plot_report +from constants import PI_DATES from objectives import OBJECTIVES -from constants import get_current_pi -from settings import TEAM_NAME, TEAM_DISPLAY_NAME, OBJECTIVES_PAGE_URL - - -# Color palette for objectives (cycles if more than 10 objectives) -COLORS = [ - "#e74c3c", # red - "#3498db", # blue - "#2ecc71", # green - "#9b59b6", # purple - "#f39c12", # orange - "#1abc9c", # teal - "#e91e63", # pink - "#00bcd4", # cyan - "#ff5722", # deep orange - "#607d8b", # blue grey -] - - -def get_repo_objectives(pi: str) -> dict: - """ - Build a mapping from repo to list of objectives it belongs to. - - Returns: - Dict mapping "org/repo" to list of (issue_number, title) tuples - """ - repo_to_objectives = {} - for obj in OBJECTIVES.get(pi, []): - for org, repo in obj["repos"]: - key = f"{org}/{repo}" - if key not in repo_to_objectives: - repo_to_objectives[key] = [] - repo_to_objectives[key].append((obj["issue_number"], obj["title"])) - return repo_to_objectives - - -def get_objective_colors(pi: str) -> dict: - """Generate color mapping for objectives in a PI.""" - objectives = OBJECTIVES.get(pi, []) - return { - obj["issue_number"]: COLORS[i % len(COLORS)] for i, obj in enumerate(objectives) - } - - -def get_objective_titles(pi: str) -> dict: - """Get short titles for objectives (strip PI prefix and emojis).""" - objectives = OBJECTIVES.get(pi, []) - titles = {} - length = 100 - for obj in objectives: - title = obj["title"] - # Strip "TEAM PI X.Y Objective N: " prefix if present - if ": " in title: - title = title.split(": ", 1)[1] - # Strip emojis (unicode emoji ranges) - title = re.sub(r"[\U0001F300-\U0001F9FF]", "", title).strip() - # Truncate if too long - if len(title) > length: - title = title[: length - 3] + "..." - titles[obj["issue_number"]] = title - return titles - - -def main(pi: str = None, show_labels: bool = False): - # Default to current PI if not specified - if pi is None: - pi = get_current_pi() - - csv_filename = Path(f"output/{pi}.csv") - if not csv_filename.exists(): - print( - f"No commit data for {pi} ({csv_filename} not found). " - f"Run `uv run main.py --pi {pi}` first; nothing to plot." - ) - return - - try: - df = pd.read_csv(csv_filename) - except pd.errors.EmptyDataError: - df = pd.DataFrame() - - required_cols = {"organization", "repository"} - if df.empty or not required_cols.issubset(df.columns): - print( - f"{csv_filename} has no commits — likely no repos/contributors are " - f"configured for {pi}, or no commits landed in this PI's time range. " - f"Skipping plot." - ) - return - - # Build repo to objectives mapping and colors - repo_to_objectives = get_repo_objectives(pi) - objective_colors = get_objective_colors(pi) - - # Get commits per repo with full path - df["full_repo"] = df["organization"] + "/" + df["repository"] - commits_per_repo = df["repository"].value_counts() - full_repo_map = df.groupby("repository")["full_repo"].first().to_dict() +from settings import TEAM_SETTINGS - fig, ax = plt.subplots(1, 1, figsize=(16, 10)) - # Plot bars with objective-based coloring - for i, (repo, count) in enumerate(commits_per_repo.items()): - full_repo = full_repo_map.get(repo, repo) - objectives = repo_to_objectives.get(full_repo, []) - - if len(objectives) == 0: - # No objective mapping - gray - ax.barh( - i, count, color="#95a5a6", alpha=0.8, edgecolor="black", linewidth=1.2 - ) - elif len(objectives) == 1: - # Single objective - solid color - color = objective_colors.get(objectives[0][0], "#95a5a6") - ax.barh(i, count, color=color, alpha=0.8, edgecolor="black", linewidth=1.2) - else: - # Multiple objectives - split bar by color - width_per_obj = count / len(objectives) - current_x = 0 - for j, (issue_num, _) in enumerate(objectives): - color = objective_colors.get(issue_num, "#95a5a6") - ax.barh( - i, - width_per_obj, - left=current_x, - color=color, - alpha=0.8, - edgecolor="black", - linewidth=1.2, - ) - current_x += width_per_obj - - ax.set_yticks(range(len(commits_per_repo))) - ax.set_yticklabels(commits_per_repo.index) - ax.set_xlabel("Number of Commits", fontsize=16, loc="left") - ax.tick_params(axis="y", labelsize=13) - ax.xaxis.set_major_locator(MaxNLocator(integer=True)) - ax.grid(axis="x", alpha=0.3) - - # Add value labels if requested - if show_labels: - for i, v in enumerate(commits_per_repo.values): - ax.text( - v + 0.5, - i, - str(v), - ha="left", - va="center", - fontweight="bold", - fontsize=11, - ) - - plt.subplots_adjust(left=0.3) - - ax.set_title( - f"{pi.upper()} {TEAM_NAME}'s commits to the default branch", - fontsize=24, - fontweight="bold", - ) - - # Legend for objectives with titles (skip when no objectives are configured) - if objective_colors: - objective_titles = get_objective_titles(pi) - legend_elements = [ - Patch( - facecolor=color, - edgecolor="black", - label=objective_titles.get(num, f"#{num}"), - ) - for num, color in objective_colors.items() - ] - ax.legend( - handles=legend_elements, - loc="upper right", - fontsize=9, - title=f"{pi.upper()} Objectives", - title_fontsize=10, - ) - - # Caveats and link in bottom right of plot area - caveats = ( - "Caveats:\n" - "- Only community-governed open source repositories are tracked\n" - "- Merged PRs counted as one commit\n" - "- Individual changes may span multiple PRs\n" - "- Split bars indicate repos in multiple objectives\n" - f"- Includes all open source work by {TEAM_DISPLAY_NAME} team members\n\n" - f"Objective details: {OBJECTIVES_PAGE_URL.removeprefix('https://')}" - ) - ax.text( - 1.0, - -0.06, - caveats, - fontsize=8, - style="italic", - horizontalalignment="right", - verticalalignment="top", - transform=ax.transAxes, - bbox=dict( - boxstyle="round,pad=0.3", facecolor="white", edgecolor="gray", alpha=0.8 - ), - ) +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--pi", help="PI name (e.g. pi-26.2). Defaults to current PI.") + parser.add_argument("-v", "--verbose", action="store_true") + args = parser.parse_args() - # Save to docs for website - docs_images = Path(__file__).parent.parent / "docs" / "images" - docs_images.mkdir(exist_ok=True) - plt.savefig( - docs_images / f"{pi}.png", - bbox_inches="tight", - dpi=150, + logging.basicConfig( + level=logging.INFO if args.verbose else logging.WARNING, + format="%(message)s", ) - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--pi", - help="PI name (e.g. pi-26.2). Defaults to the current PI.", - ) - args = parser.parse_args() - main(pi=args.pi) + run_plot_report(TEAM_SETTINGS, OBJECTIVES, pi=args.pi, pi_dates=PI_DATES) diff --git a/reports/pyproject.toml b/reports/pyproject.toml index 658d52e..d6bf813 100644 --- a/reports/pyproject.toml +++ b/reports/pyproject.toml @@ -3,9 +3,7 @@ name = "reports" version = "0.1.0" description = "Quarterly reporting utilities for the VEDA ODD team" readme = "README.md" -requires-python = ">=3.11" +requires-python = ">=3.12" dependencies = [ - "matplotlib>=3.10.3", - "pandas>=2.3.0", - "pygithub>=2.6.1", + "dse-oss-reports @ git+https://github.com/NASA-IMPACT/dse-oss-reports.git@main", ] diff --git a/reports/settings.py b/reports/settings.py index 2e506b3..75f3250 100644 --- a/reports/settings.py +++ b/reports/settings.py @@ -1,23 +1,15 @@ -""" -Team-specific settings for the reporting system. +"""Team-specific settings for the VEDA ODD reporting system.""" -When adopting this reporting structure for a new team, edit the values -below. These are the ONLY values you need to change in the Python -scripts. See docs/adopting.md for the full adoption guide. -""" +from dse_oss_reports.settings import TeamSettings -# ── Core identifiers ────────────────────────────────────────────── -GITHUB_ORG = "NASA-IMPACT" -GITHUB_REPO = "veda-odd" # repo where objective issues live -TEAM_NAME = "ODD" # short name, used in chart titles -TEAM_DISPLAY_NAME = "VEDA/EODC ODD" # full name, used in chart caveats -SITE_URL = "nasa-impact.github.io/veda-odd" # GitHub Pages URL (no https://) +TOKEN_ENV_VAR = "GH_PAT" -# ── Authentication ──────────────────────────────────────────────── -TOKEN_ENV_VAR = "GH_ODD_PAT" # env var name for the GitHub PAT -# Also update the secret name in .github/workflows/update-reports.yml - -# ── Derived values (do not edit) ────────────────────────────────── -REPO_FULL_NAME = f"{GITHUB_ORG}/{GITHUB_REPO}" -REPO_URL = f"https://github.com/{GITHUB_ORG}/{GITHUB_REPO}" -OBJECTIVES_PAGE_URL = f"https://{SITE_URL}/objectives" +TEAM_SETTINGS = TeamSettings( + team_name="ODD", + team_display_name="VEDA/EODC ODD", + github_org="NASA-IMPACT", + github_repo="veda-odd", + site_url="nasa-impact.github.io/veda-odd", + objectives_page_url="https://nasa-impact.github.io/veda-odd/objectives", + token_env_var=TOKEN_ENV_VAR, +) From 363aed72ad732ac1f28c302055722ce2b43e367c Mon Sep 17 00:00:00 2001 From: Max Jones <14077947+maxrjones@users.noreply.github.com> Date: Mon, 18 May 2026 13:56:56 -0400 Subject: [PATCH 2/2] Update env variable --- .github/workflows/update-reports.yml | 4 ++-- reports/settings.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update-reports.yml b/.github/workflows/update-reports.yml index 13b2289..8570353 100644 --- a/.github/workflows/update-reports.yml +++ b/.github/workflows/update-reports.yml @@ -42,14 +42,14 @@ jobs: working-directory: reports env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_PAT: ${{ secrets.GH_PAT }} + GH_ODD_PAT: ${{ secrets.GH_ODD_PAT }} run: uv run generate_config.py - name: Generate commit data working-directory: reports env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_PAT: ${{ secrets.GH_PAT }} + GH_ODD_PAT: ${{ secrets.GH_ODD_PAT }} run: uv run main.py - name: Generate plot diff --git a/reports/settings.py b/reports/settings.py index 75f3250..333afee 100644 --- a/reports/settings.py +++ b/reports/settings.py @@ -2,7 +2,7 @@ from dse_oss_reports.settings import TeamSettings -TOKEN_ENV_VAR = "GH_PAT" +TOKEN_ENV_VAR = "GH_ODD_PAT" TEAM_SETTINGS = TeamSettings( team_name="ODD",