Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
7c0653d
[1488] Support frequency nominal dim in consolidate functions and upd…
dbashford-NOAA Jul 30, 2025
2e1c814
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 30, 2025
cb25040
[1486] Support computing MVBS with frequency_nominal and fix some tes…
dbashford-NOAA Jul 31, 2025
a84334e
chore(deps): bump actions/download-artifact from 4 to 5 (#1529)
dependabot[bot] Aug 13, 2025
a75a56c
chore(deps): bump actions/checkout from 4 to 5 (#1528)
dependabot[bot] Aug 13, 2025
85ce376
chore(deps): bump actions/cache from 4.2.3 to 4.2.4 (#1527)
dependabot[bot] Aug 13, 2025
f0c95e8
[pre-commit.ci] pre-commit autoupdate (#1526)
pre-commit-ci[bot] Aug 13, 2025
102cb9d
Update pr.yaml to run full test suite for all PR (#1524)
LOCEANlloydizard Aug 13, 2025
ed6c267
[1488] Create consolidate tests that include dim swapping
dbashford-NOAA Sep 4, 2025
ec182f1
chore(deps): bump pypa/gh-action-pypi-publish in /.github/workflows (…
dependabot[bot] Sep 21, 2025
b55552d
chore(deps): bump actions/setup-python from 5.5.0 to 6.0.0 (#1535)
dependabot[bot] Sep 21, 2025
bb33278
[pre-commit.ci] pre-commit autoupdate (#1538)
pre-commit-ci[bot] Sep 23, 2025
cdbf6f8
Add weill to codespell ignore list (#1543)
LOCEANlloydizard Sep 25, 2025
a48f3a2
Implementations of basic seafloor detection in mask subpackage [all t…
LOCEANlloydizard Sep 25, 2025
ff2638e
[1488] Swap beam group dims in consolidate functions if needed
dbashford-NOAA Sep 26, 2025
cb78b56
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 26, 2025
0a6842f
[1488] Fix f-string placeholder error
dbashford-NOAA Sep 26, 2025
df6c82d
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 26, 2025
1b9dc99
[1541] Remove python 3.10 support (#1546)
dbashford-NOAA Sep 26, 2025
46fcb67
chore(deps): bump actions/cache from 4.2.4 to 4.3.0 (#1547)
dependabot[bot] Sep 30, 2025
3ffe8f3
Add Fielding and Matecho-like transient noise removal methods (#1544)
LOCEANlloydizard Sep 30, 2025
0dffd51
Shoals detection implementation [all tests ci] (#1525)
LOCEANlloydizard Sep 30, 2025
a2cfade
Modifications to match xarray update to v2025.9.1 (#1550)
LOCEANlloydizard Oct 1, 2025
29e6153
[1488] Re add ed ds compare for add_depth
dbashford-NOAA Oct 2, 2025
4d7c8cc
Update docstrings for transient noise and shoal detection functions
LOCEANlloydizard Oct 6, 2025
7dbcf5b
[pre-commit.ci] pre-commit autoupdate (#1555)
pre-commit-ci[bot] Oct 7, 2025
f95f7a4
fix(ci): free disk space to resolve "No space left on device" during …
LOCEANlloydizard Oct 7, 2025
058333e
[1542] Support python 3.13 (#1553)
dbashford-NOAA Oct 7, 2025
c5a1373
Merge remote-tracking branch 'upstream/main'
LOCEANlloydizard Oct 14, 2025
47f9cb2
Apply suggestions from code review
LOCEANlloydizard Oct 14, 2025
daf3b17
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 14, 2025
2d08598
[pre-commit.ci] pre-commit autoupdate (#1559)
pre-commit-ci[bot] Oct 14, 2025
faa3936
chore(deps): bump actions/setup-python from 5.5.0 to 6.0.0 (#1560)
dependabot[bot] Oct 14, 2025
bb2cd25
Updated after review
LOCEANlloydizard Oct 14, 2025
71b67ab
[1428/1512] Migrate to numpy v2 and zarr v3 with updated test_data pa…
dbashford-NOAA Oct 14, 2025
be1ea10
Review Blackwell docstring: fix indentation and replace 'clamp' with …
LOCEANlloydizard Oct 15, 2025
f479cf3
small tweak re adaptive Sv threshold
leewujung Oct 15, 2025
be8b60c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2025
98bed9f
Update docstrings for transient noise and shoal detection functions (…
LOCEANlloydizard Oct 15, 2025
39e3de2
CI: Pooch assets + Windows fixes, HTTP/S3 test setup, Windows runner …
LOCEANlloydizard Oct 18, 2025
e0d9d4c
Restore small comments from original pr.yaml
LOCEANlloydizard Oct 20, 2025
3600e47
CI: switch to Pooch-managed GitHub assets and remove local test_data …
LOCEANlloydizard Oct 22, 2025
0ea9350
add push to main to tests workflow in additional to PR
leewujung Oct 22, 2025
2c9b49f
update build.yaml to use pooch
leewujung Oct 22, 2025
d917fb9
test data endpoint
leewujung Oct 22, 2025
7fd42ff
remove trailing white space
leewujung Oct 22, 2025
9f5f575
change name back to test PR
leewujung Oct 22, 2025
e2d06da
Merge pull request #1566 from leewujung/push_workflow_patch
LOCEANlloydizard Oct 23, 2025
778833f
Merge branch 'main' of https://github.com/OSOceanAcoustics/echopype
LOCEANlloydizard Oct 23, 2025
2fd76b1
ci: fix Pooch asset cache key mismatch in build workflow
LOCEANlloydizard Oct 23, 2025
d48eb6e
Update pr.yaml
LOCEANlloydizard Oct 23, 2025
253c437
Merge from latest upstream
LOCEANlloydizard Oct 23, 2025
5ab10d6
Update conftest.py
LOCEANlloydizard Oct 24, 2025
a26f069
Merge pull request #1567 from LOCEANlloydizard/ci/fix-asset-cache-key
LOCEANlloydizard Oct 27, 2025
e6374c7
Merge pull request #1563 from LOCEANlloydizard/CI_windows
LOCEANlloydizard Oct 27, 2025
f96a149
chore(deps): bump actions/download-artifact from 5 to 6 (#1568)
dependabot[bot] Nov 5, 2025
ebe1d44
chore(deps): bump actions/upload-artifact from 4 to 5 (#1569)
dependabot[bot] Nov 5, 2025
12dee97
Update test_ecs_integration.py (#1575)
LOCEANlloydizard Nov 25, 2025
520914c
Use official http image and using Pooch to pull data to http server (…
leewujung Nov 25, 2025
175aec7
chore(deps): bump actions/checkout from 5 to 6 (#1576)
dependabot[bot] Nov 25, 2025
72a9bf5
Setup python_requires >=3.11 in setup.cfg (#1561)
leewujung Dec 1, 2025
4275947
chore(deps): bump actions/setup-python from 6.0.0 to 6.1.0
dependabot[bot] Dec 2, 2025
e9ab229
Merge pull request #1580 from OSOceanAcoustics/dependabot/github_acti…
LOCEANlloydizard Dec 2, 2025
d371686
update azfp6 sha256 and version tag
leewujung Dec 6, 2025
82925a1
Merge pull request #1582 from leewujung/update_azfp6_asset
LOCEANlloydizard Dec 6, 2025
1f26305
[pre-commit.ci] pre-commit autoupdate (#1583)
pre-commit-ci[bot] Dec 8, 2025
527ab56
chore(deps): bump actions/download-artifact from 6 to 7
dependabot[bot] Dec 15, 2025
74e00b6
chore(deps): bump actions/upload-artifact from 5 to 6
dependabot[bot] Dec 15, 2025
20c0674
chore(deps): bump actions/cache from 4 to 5
dependabot[bot] Dec 15, 2025
0495644
Merge pull request #1584 from OSOceanAcoustics/dependabot/github_acti…
LOCEANlloydizard Dec 16, 2025
fc1ff8c
Merge pull request #1585 from OSOceanAcoustics/dependabot/github_acti…
LOCEANlloydizard Dec 16, 2025
9165ca4
Merge pull request #1586 from OSOceanAcoustics/dependabot/github_acti…
LOCEANlloydizard Dec 16, 2025
8b46763
Update test_commongrid_api.py
LOCEANlloydizard Dec 25, 2025
4ee7e06
Update conftest.py
LOCEANlloydizard Dec 25, 2025
a604ef0
Merge branch 'main' into fix_numpy_update_2.4
LOCEANlloydizard Dec 25, 2025
889ece3
Update conftest.py
LOCEANlloydizard Dec 25, 2025
3f9ee07
Merge branch 'fix_numpy_update_2.4' of https://github.com/LOCEANlloyd…
LOCEANlloydizard Dec 25, 2025
f6dbf48
Update pr.yaml
LOCEANlloydizard Dec 25, 2025
c5053d2
Update pr.yaml
LOCEANlloydizard Dec 25, 2025
632f3ef
Update conftest.py
LOCEANlloydizard Dec 25, 2025
50998eb
change data version
LOCEANlloydizard Dec 26, 2025
6e7a17e
trigger test run after restoring v0.11.1a1 azfp.zip
leewujung Dec 26, 2025
822bc84
Update AZFP test data in v0.11.1a2 assets (#1593)
leewujung Dec 26, 2025
8505ec9
Merge branch 'main-upstream' into fix_numpy_update_2.4
leewujung Dec 26, 2025
fcee56d
Merge pull request #1591 from LOCEANlloydizard/fix_numpy_update_2.4
LOCEANlloydizard Dec 27, 2025
04c5a58
chore(deps): bump tj-actions/changed-files from 45 to 47
dependabot[bot] Dec 29, 2025
b476498
Merge pull request #1594 from OSOceanAcoustics/dependabot/github_acti…
LOCEANlloydizard Dec 30, 2025
4243633
Investigating the disk space failure in CI (#1592)
LOCEANlloydizard Jan 1, 2026
6e2e496
[1488] Support frequency nominal dim in consolidate functions and upd…
dbashford-NOAA Jul 30, 2025
625ed49
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 30, 2025
c3c0e15
[1488] Create consolidate tests that include dim swapping
dbashford-NOAA Sep 4, 2025
4af91e1
[1488] Swap beam group dims in consolidate functions if needed
dbashford-NOAA Sep 26, 2025
db61d00
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 26, 2025
e42aaf3
[1488] Fix f-string placeholder error
dbashford-NOAA Sep 26, 2025
4b36e0e
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Sep 26, 2025
1cf0f4a
[1488] Re add ed ds compare for add_depth
dbashford-NOAA Oct 2, 2025
2801cdf
Merge remote-tracking branch 'origin/1488_support_frequency_nominal_i…
dbashford-NOAA Jan 7, 2026
cfbb966
[1488] Remove dim_0 switching inside functions and refine testing for…
dbashford-NOAA Jan 16, 2026
1b30b30
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions .ci_helpers/docker/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@ services:
volumes:
- echopype_miniodata:/data
httpserver:
# NOTE ====================================
# For httpserver test data,
# it needs to be copied to the docker container
# docker cp -L docker_httpserver_1:/usr/local/apache2/htdocs/data ./echopype/test_data
# =====================================
image: cormorack/http:latest
image: httpd:2.4
ports:
- 8080:80
networks:
Expand Down
4 changes: 0 additions & 4 deletions .ci_helpers/docker/http.dockerfile

This file was deleted.

104 changes: 73 additions & 31 deletions .ci_helpers/docker/setup-services.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@

import argparse
import logging
import shutil
import os
import subprocess
import sys
from pathlib import Path
from typing import Dict, List

import fsspec
import pooch

logger = logging.getLogger("setup-services")
streamHandler = logging.StreamHandler(sys.stdout)
Expand All @@ -24,7 +25,18 @@
HERE = Path(".").absolute()
BASE = Path(__file__).parent.absolute()
COMPOSE_FILE = BASE / "docker-compose.yaml"
TEST_DATA_PATH = HERE / "echopype" / "test_data"


def get_pooch_data_path() -> Path:
"""Return path to the Pooch test data cache."""
ver = os.getenv("ECHOPYPE_DATA_VERSION", "v0.11.1a2")
cache_dir = Path(pooch.os_cache("echopype")) / ver
if not cache_dir.exists():
raise FileNotFoundError(
f"Pooch cache directory not found: {cache_dir}\n"
"Make sure test data was fetched via conftest.py"
)
return cache_dir


def parse_args():
Expand Down Expand Up @@ -77,36 +89,70 @@ def run_commands(commands: List[Dict]) -> None:


def load_s3(*args, **kwargs) -> None:
"""Populate MinIO with test data from the Pooch cache (skip .zip files)."""
pooch_path = get_pooch_data_path()
common_storage_options = dict(
client_kwargs=dict(endpoint_url="http://localhost:9000/"),
key="minioadmin",
secret="minioadmin",
)
bucket_name = "ooi-raw-data"
fs = fsspec.filesystem(
"s3",
**common_storage_options,
)
bucket_name = "echo-test-data"
fs = fsspec.filesystem("s3", **common_storage_options)
test_data = "data"

if not fs.exists(test_data):
fs.mkdir(test_data)

if not fs.exists(bucket_name):
fs.mkdir(bucket_name)

# Load test data into bucket
for d in TEST_DATA_PATH.iterdir():
source_path = f"echopype/test_data/{d.name}"
fs.put(source_path, f"{test_data}/{d.name}", recursive=True)
for d in pooch_path.iterdir():
if d.suffix == ".zip": # skip zip archives to cut redundant I/O
continue
source_path = str(d)
target_path = f"{test_data}/{d.name}"
logger.info(f"Copying {source_path} → {target_path}")
fs.put(source_path, target_path, recursive=True)


def load_http_server(http_server_id) -> None:
"""Copy test data from Pooch cache to HTTP server container."""
pooch_path = get_pooch_data_path()

# Create the data directory in the container
mkdir_result = subprocess.run(
["docker", "exec", http_server_id, "sh", "-c", "mkdir -p /usr/local/apache2/htdocs/data"],
capture_output=True,
text=True,
)
if mkdir_result.returncode == 0:
logger.info("Created /usr/local/apache2/htdocs/data directory")
else:
logger.warning(f"mkdir warning (may be harmless): {mkdir_result.stderr}")

# Copy all dataset directories directly to /usr/local/apache2/htdocs/data/
for d in pooch_path.iterdir():
if d.suffix == ".zip": # skip zip archives
continue
source_path = str(d)
dataset_name = d.name

# Copy directly to the data directory
target_path = f"/usr/local/apache2/htdocs/data/{dataset_name}"
cmd = ["docker", "cp", source_path, f"{http_server_id}:{target_path}"]
logger.info(f"Copying {source_path} → {target_path}")
result = subprocess.run(cmd, capture_output=True, text=True)

if result.returncode != 0:
logger.error(f"Failed to copy {dataset_name}: {result.stderr}")


if __name__ == "__main__":
args = parse_args()
commands = []

if all([args.deploy, args.tear_down]):
print("Cannot have both --deploy and --tear-down. Exiting.")
sys.exit(1)

if not any([args.deploy, args.tear_down]):
print("Please provide either --deploy or --tear-down flags. For more help use --help flag.")
sys.exit(0)
Expand Down Expand Up @@ -136,33 +182,29 @@ def load_s3(*args, **kwargs) -> None:
}
)

if TEST_DATA_PATH.exists():
commands.append(
{
"msg": f"Deleting old test folder at {TEST_DATA_PATH} ...",
"cmd": shutil.rmtree,
"args": TEST_DATA_PATH,
}
)
pooch_path = get_pooch_data_path()
commands.append({"msg": f"Using Pooch test data at {pooch_path}", "cmd": None})

commands.append(
{
"msg": "Copying new test folder from http service ...",
"cmd": [
"docker",
"cp",
"-L",
f"{args.http_server}:/usr/local/apache2/htdocs/data",
TEST_DATA_PATH,
],
"msg": "Setting up MinIO S3 bucket with Pooch test data ...",
"cmd": load_s3,
}
)

commands.append({"msg": "Setting up minio s3 bucket ...", "cmd": load_s3})
commands.append(
{
"msg": f"Setting up HTTP server {args.http_server} with Pooch test data ...",
"cmd": load_http_server,
"args": args.http_server,
}
)

if args.tear_down:
command = ["docker-compose", "-f", COMPOSE_FILE, "down", "--remove-orphans", "--volumes"]
if args.images:
command = command + ["--rmi", "all"]
command += ["--rmi", "all"]
commands.append({"msg": "Stopping test services deployment ...", "cmd": command})

commands.append({"msg": "Done.", "cmd": ["docker", "ps", "--last", "2"]})
run_commands(commands)
2 changes: 1 addition & 1 deletion .ci_helpers/py3.10.yaml → .ci_helpers/py3.13.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: echopype
channels:
- conda-forge
dependencies:
- python=3.10
- python=3.13
- pip
- pip:
- -r ../requirements.txt
195 changes: 195 additions & 0 deletions .ci_helpers/setup-services-windows.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# .ci_helpers/setup-services-windows.py
"""
Spin up local services for Windows CI without Docker:
- Start a MinIO server on localhost:9000
- Seed S3 from the Pooch cache (unzipped test bundles)
- Start a simple HTTP server on :8080 that exposes ./data (mirrors Linux job)
- Write PID files for clean teardown

Usage:
python .ci_helpers/setup-services-windows.py start [--no-http]
python .ci_helpers/setup-services-windows.py stop
"""

import argparse
import os
import pathlib
import shutil
import subprocess
import sys
import time
from urllib.request import urlretrieve

import fsspec
import pooch

MINIO_URL = "https://dl.min.io/server/minio/release/windows-amd64/minio.exe"
MINIO_BIN = pathlib.Path(".ci_helpers") / "minio.exe"
STATE_DIR = pathlib.Path(".ci_helpers") / ".state"
STATE_DIR.mkdir(parents=True, exist_ok=True)
MINIO_PID = STATE_DIR / "minio.pid"
HTTP_PID = STATE_DIR / "http.pid"

# Use localhost everywhere to match tests (which hit http://localhost:9000/...)
MINIO_ENDPOINT = "http://localhost:9000/"
MINIO_USER = "minioadmin"
MINIO_PASS = "minioadmin"


def get_pooch_cache() -> pathlib.Path:
"""Return the Pooch cache dir for the configured dataset version."""
ver = os.getenv("ECHOPYPE_DATA_VERSION", "v0.11.1a2")
root = pathlib.Path(pooch.os_cache("echopype"))
path = root / ver
path.mkdir(parents=True, exist_ok=True)
return path


def ensure_minio_downloaded() -> None:
if MINIO_BIN.exists():
return
MINIO_BIN.parent.mkdir(parents=True, exist_ok=True)
print(f"Downloading MinIO -> {MINIO_BIN}", flush=True)
urlretrieve(MINIO_URL, MINIO_BIN)
MINIO_BIN.chmod(0o755)


def start_minio() -> None:
"""Start MinIO on localhost:9000 and wait until ready."""
ensure_minio_downloaded()
data_dir = pathlib.Path(os.getenv("USERPROFILE", str(pathlib.Path.home()))) / "minio" / "data"
data_dir.mkdir(parents=True, exist_ok=True)

env = os.environ.copy()
env["MINIO_ROOT_USER"] = MINIO_USER
env["MINIO_ROOT_PASSWORD"] = MINIO_PASS

print(f"Starting MinIO on {MINIO_ENDPOINT} (data: {data_dir})", flush=True)
proc = subprocess.Popen(
[
str(MINIO_BIN),
"server",
str(data_dir),
"--address=localhost:9000",
"--console-address=localhost:9001",
],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
env=env,
)
MINIO_PID.write_text(str(proc.pid))

# Wait for readiness
import urllib.request

for _ in range(60):
try:
with urllib.request.urlopen(MINIO_ENDPOINT + "minio/health/ready", timeout=1):
break
except Exception:
time.sleep(1)
else:
raise RuntimeError("MinIO did not become ready on :9000")


def seed_s3_from_pooch() -> None:
"""Upload unzipped Pooch bundles into MinIO under the 'data/' prefix,
and also mirror a local ./data/ folder for the HTTP server."""
cache = get_pooch_cache()

# Seed S3 (MinIO)
fs = fsspec.filesystem(
"s3",
client_kwargs=dict(endpoint_url=MINIO_ENDPOINT),
key=MINIO_USER,
secret=MINIO_PASS,
)

for base in ("data", "ooi-raw-data"):
try:
fs.mkdir(base)
except Exception:
pass

for d in cache.iterdir():
if d.suffix == ".zip":
continue
tgt = f"data/{d.name}"
print(f"Uploading {d} -> {tgt}", flush=True)
fs.put(str(d), tgt, recursive=True)

# Build local ./data for HTTP tests that hit http://localhost:8080/data/...
local_data = pathlib.Path("data")
local_data.mkdir(exist_ok=True)
for d in cache.iterdir():
if d.suffix == ".zip":
continue
dst = local_data / d.name
if not dst.exists():
if d.is_dir():
shutil.copytree(d, dst)
else:
shutil.copy2(d, dst)


def start_http_server() -> None:
"""Serve the repository root so /data/... exists on :8080."""
root = pathlib.Path(".").absolute()
print(f"Starting local HTTP server on :8080 (root={root})", flush=True)
proc = subprocess.Popen(
[sys.executable, "-m", "http.server", "8080", "--directory", str(root)],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
HTTP_PID.write_text(str(proc.pid))


def stop_pid_file(path: pathlib.Path) -> None:
try:
pid = int(path.read_text().strip())
except Exception:
return
try:
if sys.platform.startswith("win"):
subprocess.run(["taskkill", "/PID", str(pid), "/F"], check=False)
else:
os.kill(pid, 9)
except Exception:
pass
try:
path.unlink(missing_ok=True)
except Exception:
pass


def cmd_start(no_http: bool) -> None:
# Ensure cache exists (prefetch step should have populated it)
_ = get_pooch_cache()
start_minio()
seed_s3_from_pooch()
if not no_http:
start_http_server()
print("Services up.", flush=True)


def cmd_stop() -> None:
stop_pid_file(HTTP_PID)
stop_pid_file(MINIO_PID)
print("Services stopped.", flush=True)


def main() -> None:
ap = argparse.ArgumentParser()
sub = ap.add_subparsers(dest="cmd", required=True)
s = sub.add_parser("start")
s.add_argument("--no-http", action="store_true", help="Do not start the local HTTP server")
sub.add_parser("stop")
args = ap.parse_args()
if args.cmd == "start":
cmd_start(no_http=args.no_http)
else:
cmd_stop()


if __name__ == "__main__":
main()
4 changes: 0 additions & 4 deletions .github/actions/gdrive-rclone/Dockerfile

This file was deleted.

Loading
Loading