als-finder 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. als_finder-1.0.1/.agents/CONVERSATION_DUMP_Phase2.md +21 -0
  2. als_finder-1.0.1/.agents/rules.md +123 -0
  3. als_finder-1.0.1/.agents/workflows/docker_build.md +22 -0
  4. als_finder-1.0.1/.agents/workflows/local_setup.md +23 -0
  5. als_finder-1.0.1/.agents/workflows/qa_checks.md +21 -0
  6. als_finder-1.0.1/.dockerignore +14 -0
  7. als_finder-1.0.1/.env.template +1 -0
  8. als_finder-1.0.1/.github/workflows/docker-publish.yml +49 -0
  9. als_finder-1.0.1/.github/workflows/pypi-publish.yml +36 -0
  10. als_finder-1.0.1/.gitignore +42 -0
  11. als_finder-1.0.1/ARCHITECTURE.md +29 -0
  12. als_finder-1.0.1/Dockerfile +36 -0
  13. als_finder-1.0.1/LICENSE +21 -0
  14. als_finder-1.0.1/MANIFEST.in +4 -0
  15. als_finder-1.0.1/PKG-INFO +682 -0
  16. als_finder-1.0.1/README.md +645 -0
  17. als_finder-1.0.1/STATUS.md +20 -0
  18. als_finder-1.0.1/docs/PLAN.md +100 -0
  19. als_finder-1.0.1/environment.yml +21 -0
  20. als_finder-1.0.1/examples/ltbmu_boundary.gpkg +0 -0
  21. als_finder-1.0.1/requirements.txt +12 -0
  22. als_finder-1.0.1/scripts/test_docker.sh +16 -0
  23. als_finder-1.0.1/scripts/test_noaa_fast_stac.py +39 -0
  24. als_finder-1.0.1/scripts/test_noaa_index.py +58 -0
  25. als_finder-1.0.1/scripts/test_noaa_stac.py +60 -0
  26. als_finder-1.0.1/setup.cfg +4 -0
  27. als_finder-1.0.1/setup.py +39 -0
  28. als_finder-1.0.1/src/als_finder/__init__.py +4 -0
  29. als_finder-1.0.1/src/als_finder/__main__.py +0 -0
  30. als_finder-1.0.1/src/als_finder/cli.py +632 -0
  31. als_finder-1.0.1/src/als_finder/core/__init__.py +0 -0
  32. als_finder-1.0.1/src/als_finder/core/input_manager.py +95 -0
  33. als_finder-1.0.1/src/als_finder/core/normalization.py +116 -0
  34. als_finder-1.0.1/src/als_finder/core/quicklooks.py +219 -0
  35. als_finder-1.0.1/src/als_finder/core/stac_generator.py +126 -0
  36. als_finder-1.0.1/src/als_finder/download.py +227 -0
  37. als_finder-1.0.1/src/als_finder/providers/__init__.py +6 -0
  38. als_finder-1.0.1/src/als_finder/providers/base.py +46 -0
  39. als_finder-1.0.1/src/als_finder/providers/noaa.py +261 -0
  40. als_finder-1.0.1/src/als_finder/providers/opentopography.py +292 -0
  41. als_finder-1.0.1/src/als_finder/providers/usgs.py +100 -0
  42. als_finder-1.0.1/src/als_finder.egg-info/PKG-INFO +682 -0
  43. als_finder-1.0.1/src/als_finder.egg-info/SOURCES.txt +45 -0
  44. als_finder-1.0.1/src/als_finder.egg-info/dependency_links.txt +1 -0
  45. als_finder-1.0.1/src/als_finder.egg-info/entry_points.txt +2 -0
  46. als_finder-1.0.1/src/als_finder.egg-info/requires.txt +13 -0
  47. als_finder-1.0.1/src/als_finder.egg-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
1
+ # Antigravity State Dump: Phase 2 Execution Completion
2
+
3
+ ## Core Summary
4
+ Completed the fundamental integration of **OpenTopography** handling alongside deep CLI parameter unification and Dry-Run `download` payload extraction tracking. The system is structurally completely ready to begin the **PDAL Normalization Pipeline (Phase 3)** smoothly bridging arrays globally.
5
+
6
+ ## Finalized Matrices
7
+ 1. **Double Date Drop Bug**: Fixed `cli.py` dropping generic temporal subset boundaries erroneously by moving `sort_date` tracking definitions directly prior to logical `<` and `>` exclusions natively cleanly opening subset extraction structurally `/2020-01-01`.
8
+ 2. **Tabular Size Render**: Re-coded `download.py` transforming strict iterative text output logs into beautiful explicit ASCII reporting geometries tracking `Tiles`, `True Size`, and native `Format` physically aggregating into formal estimates prior to active physical retrieval.
9
+ 3. **HTTP HEAD Parsing**: Intercepted OpenTopography Mode B bounding geometries naturally routing all indices natively through concurrent `ThreadPoolExecutor` abstractions probing the S3 `requests.head` to calculate literal sizes matching standard `Mode A` natively!
10
+ 4. **README Consistency**: Rewrote parameter sequences tracking CLI matrices enforcing identical arrays globally (`--roi`, `--name`, `--workspace`) replacing literal texts seamlessly. Cleanly explicitly scoped target Point Density `--density 2/10`. Expanded "federal registries" clause structurally to logically encompass generic "public multi-origin LiDAR repositories".
11
+ 5. **Distribution Infrastructure**: Established cross-platform robust package delivery explicitly.
12
+ - **PyPI**: Integrated automated Trusted Publishing via `.github/workflows/pypi-publish.yml` dynamically bridging GitHub Releases to PyPI directly natively.
13
+ - **Conda-Forge**: Finalized PR `#33018` for `als-finder-feedstock` via `staged-recipes`, comprehensively navigating pure Python `noarch` cross-platform edge-cases (implementing native `build.sh` and `bld.bat` explicitly fixing Windows `cmd.exe` limitations executing inline Bash environment variables resolving `SETUPTOOLS_SCM_PRETEND_VERSION`).
14
+ ## Current Project Space
15
+ - `git` was fully synchronized and pushed cleanly under `feat: robust tabular payload tracking on dry-runs natively & OT HTTP HEAD evaluations`.
16
+ - `scratch/` workspace was completely expunged securely.
17
+ - **GitHub Issue**: Sourced a tracking PR explicitly bounding the dry-run CLI additions under Milestone `v1.1 (Big-Data Architecture)`.
18
+
19
+ ## Next Objective (Phase 3)
20
+ 1. Read the newly tracked parameters and verify `src/als_finder/` structures.
21
+ 2. Formally initiate native Phase 3 protocols tracking `.laz` normalization integrations gracefully (handling CRS Projections natively leveraging PDAL pipelines). We must natively map formats globally resolving variable geometries!
@@ -0,0 +1,123 @@
1
+ ---
2
+ description: Documentation Maintenance Rules
3
+ ---
4
+
5
+ # Documentation Rules
6
+
7
+ ## 1. Sync Logic
8
+ - **Code ↔ Docs**: If you change the code behavior (arguments, features, outputs), you MUST update the corresponding documentation immediately.
9
+ - **PLAN.md**: This is a living document. Mark tasks as `[x]` when completed. Add new constraints or steps as they are discovered.
10
+
11
+ ## 2. Required Documentation
12
+ - **README.md**: Must contain:
13
+ - Project Title & Description
14
+ - Installation Instructions (Docker & Local)
15
+ - Basic Usage Examples
16
+ - Current Status/badges
17
+ - **docs/**:
18
+ - `PLAN.md`: Implementation roadmap.
19
+ - `API.md`: (Future) Auto-generated or manual API reference.
20
+ - `Architecture.md`: (Optional) Diagram/text explaining the provider -> download flow.
21
+
22
+ ## 3. Docstrings
23
+ - Code is not "done" until it is documented.
24
+ - See `python_standards.md` for format.
25
+ ---
26
+ description: Rules for Version Control and Checkpointing
27
+ ---
28
+
29
+ # Git & Checkpointing Rules
30
+
31
+ ## 1. Commit Granularity
32
+ - **Atomic Commits**: Commit one logical change at a time. Do not bundle refactors with feature additions.
33
+ - **Frequency**: "Checkpoint" (commit) often. Ideally, after every successful step or file creation/modification that reaches a stable state.
34
+ - **Safety**: Always commit before attempting a risky operation (e.g., large refactor, file deletion).
35
+
36
+ ## 2. Commit Message Convention
37
+ Follow the Conventional Commits specification:
38
+ `type(scope): description`
39
+
40
+ - **Types**:
41
+ - `feat`: A new feature
42
+ - `fix`: A bug fix
43
+ - `docs`: Documentation only changes
44
+ - `style`: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
45
+ - `refactor`: A code change that neither fixes a bug nor adds a feature
46
+ - `perf`: A code change that improves performance
47
+ - `test`: Adding missing tests or correcting existing tests
48
+ - `chore`: Changes to the build process or auxiliary tools and libraries
49
+ - `wip`: Work in progress (use sparingly, amend later if possible)
50
+
51
+ - **Example**:
52
+ - `feat(opentopo): implement search function for global datasets`
53
+ - `docs(readme): update installation instructions`
54
+ - `chore(deps): add pdal to requirements`
55
+
56
+ ## 3. Branching (If applicable)
57
+ - Main development happens on the current branch unless instructed otherwise.
58
+ - If experimenting, creating a temporary branch is encouraged.
59
+ ---
60
+ description: Python Development Guidelines and Standards
61
+ ---
62
+
63
+ # Python Development Rules
64
+
65
+ ## 1. Code Style & Formatting
66
+ - **Formatter**: Use `black` for code formatting.
67
+ - **Linter**: Use `ruff` or `flake8` for linting.
68
+ - **Imports**: Sort imports using `isort` (or `ruff`'s import sorting).
69
+ - **Line Length**: 88 characters (Black default).
70
+
71
+ ## 2. Type Hinting
72
+ - **Mandatory**: All function signatures (arguments and return types) MUST have type hints.
73
+ - **Static Analysis**: Code must pass `mypy` strict mode checks.
74
+ - **Variables**: Type hint complex variables where inference is ambiguous.
75
+
76
+ ## 3. Documentation
77
+ - **Docstrings**: All modules, classes, and public functions must have Google-style docstrings.
78
+ - *Example*:
79
+ ```python
80
+ def fetch_data(roi: dict) -> pd.DataFrame:
81
+ """Fetches data for a given region.
82
+
83
+ Args:
84
+ roi (dict): The region of interest geometry.
85
+
86
+ Returns:
87
+ pd.DataFrame: Metadata of found datasets.
88
+ """
89
+ ```
90
+ - **Comments**: Use comments to explain *why*, not *what*.
91
+
92
+ ## 4. Testing
93
+ - **Framework**: Use `pytest`.
94
+ - **Coverage**: Aim for high test coverage, particularly for core logic in `providers/`.
95
+ - **Fixtures**: Use `conftest.py` for shared fixtures (e.g., sample ROIs).
96
+
97
+ ## 5. File Handling
98
+ - **Pathlib**: ALWAYS use `pathlib.Path` instead of `os.path` for file manipulation.
99
+ - **Context Managers**: Use `with` statements for opening files.
100
+ ---
101
+ description: Project Directory Structure and Organization
102
+ ---
103
+
104
+ # Project Structure
105
+
106
+ ## Top Level
107
+ - `src/`: **Source Code**. All application logic resides here.
108
+ - `als_finder/`: The main package.
109
+ - `docs/`: **Documentation**. Plans, API docs, architecture notes.
110
+ - `.agent/`: **Agent Configuration**. Rules and workflows for the AI assistant.
111
+ - `scratch/`: **Scratch Space**. (Gitignored) Primary workspace for debugging scripts and local `tests/`.
112
+ - `data/`: **Local Data**. (Gitignored) Place to store input ROIs or output data during dev.
113
+ - `output/`: **Results**. (Gitignored) Default download destination.
114
+
115
+ ## Configuration Files
116
+ - `Dockerfile`: Container definition.
117
+ - `setup.py`: Package installation metadata.
118
+ - `requirements.txt`: Pinned dependencies.
119
+ - `.env`: (Gitignored) Secrets and keys.
120
+
121
+ ## Rules
122
+ 1. **No Logic at Root**: Do not put python scripts at the top level. Use `src/` or `scripts/`.
123
+ 2. **Clean Root**: Only standard config files (`.gitignore`, `README.md`, etc.) belong at the root.
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: Build and test the Docker container
3
+ ---
4
+
5
+ # Docker Build Workflow
6
+
7
+ ## Steps
8
+
9
+ 1. **Validate Requirements**
10
+ - Ensure `requirements.txt` is up to date.
11
+ - Ensure `Dockerfile` exists.
12
+
13
+ 2. **Build Image**
14
+ - Run: `docker build -t als-finder:latest .`
15
+
16
+ 3. **Test Run**
17
+ - Run help command to verify entrypoint:
18
+ `docker run --rm als-finder:latest --help`
19
+
20
+ 4. **Integration Test (Optional)**
21
+ - Run a small search to verify connectivity (requires API key):
22
+ `docker run --rm --env-file .env als-finder:latest search --roi tests/sample_roi.json`
@@ -0,0 +1,23 @@
1
+ ---
2
+ description: Setup local development environment
3
+ ---
4
+
5
+ # Local Development Setup
6
+
7
+ ## 1. Create Virtual Environment
8
+ We use a specific venv named `als-finder-env` to avoid conflicts.
9
+
10
+ ```bash
11
+ python3 -m venv als-finder-env
12
+ source als-finder-env/bin/activate
13
+ pip install --upgrade pip
14
+ ```
15
+
16
+ ## 2. Install Dependencies
17
+ ```bash
18
+ pip install -r requirements.txt
19
+ pip install -e . # Install package in editable mode
20
+ ```
21
+
22
+ ## 3. VS Code Configuration
23
+ Select the interpreter path: `./als-finder-env/bin/python`
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Run code quality checks and tests
3
+ ---
4
+
5
+ # Test & Lint Workflow
6
+
7
+ ## Steps
8
+
9
+ 1. **Format**
10
+ - `black src/ tests/`
11
+
12
+ 2. **Lint**
13
+ - `ruff check src/ tests/`
14
+
15
+ 3. **Type Check**
16
+ - `mypy src/`
17
+
18
+ 4. **Unit Tests**
19
+ - `pytest tests/`
20
+
21
+ // turbo-all
@@ -0,0 +1,14 @@
1
+ __pycache__
2
+ *.pyc
3
+ *.pyo
4
+ *.pyd
5
+ .Python
6
+ env/
7
+ venv/
8
+ .env
9
+ .pytest_cache/
10
+ .mypy_cache/
11
+ .git/
12
+ .vscode/
13
+ output/
14
+ data/
@@ -0,0 +1 @@
1
+ OPENTOPOGRAPHY_API_KEY=your_api_key_here
@@ -0,0 +1,49 @@
1
+ name: Docker Build and Publish
2
+
3
+ on:
4
+ push:
5
+ branches: [ "main" ]
6
+ pull_request:
7
+ branches: [ "main" ]
8
+
9
+ env:
10
+ REGISTRY: ghcr.io
11
+ IMAGE_NAME: ${{ github.repository }}
12
+
13
+ jobs:
14
+ build-and-push-image:
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ contents: read
18
+ packages: write
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Log in to the Container registry
25
+ uses: docker/login-action@v3
26
+ with:
27
+ registry: ${{ env.REGISTRY }}
28
+ username: ${{ github.actor }}
29
+ password: ${{ secrets.GITHUB_TOKEN }}
30
+
31
+ - name: Extract metadata (tags, labels) for Docker
32
+ id: meta
33
+ uses: docker/metadata-action@v5
34
+ with:
35
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
36
+ tags: |
37
+ type=raw,value=latest,enable={{is_default_branch}}
38
+ type=ref,event=branch
39
+
40
+ - name: Set up Docker Buildx
41
+ uses: docker/setup-buildx-action@v3
42
+
43
+ - name: Build and push Docker image
44
+ uses: docker/build-push-action@v5
45
+ with:
46
+ context: .
47
+ push: ${{ github.event_name != 'pull_request' }}
48
+ tags: ${{ steps.meta.outputs.tags }}
49
+ labels: ${{ steps.meta.outputs.labels }}
@@ -0,0 +1,36 @@
1
+ name: Upload Python Package to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ pypi-publish:
9
+ name: Build and publish to PyPI
10
+ runs-on: ubuntu-latest
11
+
12
+ # Specifies that the job requires permission to request an OIDC token
13
+ permissions:
14
+ id-token: write
15
+ contents: read
16
+
17
+ steps:
18
+ - name: Check out repository
19
+ uses: actions/checkout@v4
20
+ with:
21
+ fetch-depth: 0 # Required for setuptools_scm to get git tags
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.10"
27
+
28
+ - name: Install build tools
29
+ run: python -m pip install --upgrade pip build
30
+
31
+ - name: Build sdist and wheel
32
+ run: python -m build
33
+
34
+ - name: Publish package to PyPI
35
+ uses: pypa/gh-action-pypi-publish@release/v1
36
+ # No password or username needed. It uses Trusted Publishing (OIDC).
@@ -0,0 +1,42 @@
1
+ # Python
2
+ __pycache__/
3
+ *.pyc
4
+ *.pyo
5
+ *.pyd
6
+ .Python
7
+ env/
8
+ venv/
9
+ .venv/
10
+ als-finder-env/
11
+ .env
12
+
13
+ # Build Artifacts
14
+ build/
15
+ develop-eggs/
16
+ dist/
17
+ downloads/
18
+ eggs/
19
+ .eggs/
20
+ lib/
21
+ lib64/
22
+ parts/
23
+ sdist/
24
+ var/
25
+ wheels/
26
+ *.egg-info/
27
+ .installed.cfg
28
+ *.egg
29
+ MANIFEST
30
+
31
+ # Testing
32
+ .pytest_cache/
33
+ .mypy_cache/
34
+ .tox/
35
+ .coverage
36
+ htmlcov/
37
+
38
+ # Local Workspaces
39
+ scratch/
40
+ data/
41
+ output/
42
+ test_workspace/
@@ -0,0 +1,29 @@
1
+ # ALS-Finder Architecture Roadmap
2
+
3
+ **Purpose**: An API extraction engine designed to search, deduplicate, and securely download high-resolution LiDAR Point clouds (`.laz`) natively across isolated federal boundaries. Acts as the geospatial ingestion stage for the downstream `als-downscaler` HPC orchestration pipeline.
4
+
5
+ ***
6
+
7
+ ## Workflow A: Geospatial Search (`cli.py search`)
8
+ - **Inputs**:
9
+ - Local GeoJSON Region of Interest boundaries (`--roi`).
10
+ - Explicit permitted query providers (USGS STAC, OpenTopography, NOAA).
11
+ - **Core Execution**:
12
+ 1. Translates the ROI limits into raw `shapely.geometry` spatial intersections.
13
+ 2. Dispatches asynchronous, federated API payload queries across the Microsoft Planetary Computer STAC (USGS 3DEP), NOAA AWS S3 Entwine index catalogs, and OpenTopography JSON-LD spatial environments.
14
+ 3. Homogenizes resulting heterogeneous JSON responses natively into an internal python schema array.
15
+ 4. Extracts dataset aliases to isolate and natively suppress functionally identical targets (Currently strictly bounded to literal string matching).
16
+ - **Outputs**:
17
+ - A highly structured JSON configuration manifest (`manifest.json`) securely mapping all mathematically viable `.laz` download arrays across the designated bounding box.
18
+
19
+ ***
20
+
21
+ ## Workflow B: Target Extraction (`cli.py download`)
22
+ - **Inputs**:
23
+ - The upstream generated JSON architecture manifest, or dynamic `--tile-url` injection parameters.
24
+ - **Core Execution**:
25
+ 1. Spools the native HTTP extraction clients to map against targeted provider logic (e.g., `USGSProvider`).
26
+ 2. Actively probes the payload structures: if native Azure Blob URLs block access (`409 Public Access Blocked`), proactively dispatches identical authentication queries into the Microsoft Planetary `sas` overlay to construct an ephemeral **Shared Access Signature (SAS)** API bypass token.
27
+ 3. Instantiates parallel or successive byte stream downloads into local scratch volumes.
28
+ - **Outputs**:
29
+ - Localized, uncompressed `.copc.laz` or legacy point cloud layers structured rigidly onto the `$SCRATCH` partitions for HPC intersection.
@@ -0,0 +1,36 @@
1
+ # Use Micromamba to handle complex geospatial C++ dependencies (GDAL, PDAL) smoothly
2
+ FROM mambaorg/micromamba:1.5-jammy
3
+
4
+ # Set environment variables
5
+ ENV PYTHONDONTWRITEBYTECODE=1 \
6
+ PYTHONUNBUFFERED=1
7
+
8
+ # Copy requirements and install them via conda-forge
9
+ COPY --chown=$MAMBA_USER:$MAMBA_USER requirements.txt /tmp/requirements.txt
10
+ RUN micromamba install -y -n base -c conda-forge \
11
+ python=3.11 \
12
+ gdal \
13
+ pdal \
14
+ python-pdal \
15
+ --file /tmp/requirements.txt && \
16
+ micromamba clean --all --yes
17
+
18
+ # Set the working directory in the container
19
+ WORKDIR /app
20
+
21
+ # Copy the application code
22
+ COPY --chown=$MAMBA_USER:$MAMBA_USER src/ src/
23
+ COPY --chown=$MAMBA_USER:$MAMBA_USER .agent/ .agent/
24
+ COPY --chown=$MAMBA_USER:$MAMBA_USER docs/ docs/
25
+ COPY --chown=$MAMBA_USER:$MAMBA_USER README.md .
26
+ COPY --chown=$MAMBA_USER:$MAMBA_USER setup.py .
27
+
28
+ # Install the package itself in editable mode via pip (since micromamba provides pip)
29
+ # We use the micromamba python interpreter
30
+ ARG MAMBA_DOCKERFILE_ACTIVATE=1
31
+ ENV SETUPTOOLS_SCM_PRETEND_VERSION=0.1.0
32
+ RUN pip install --no-cache-dir -e .
33
+
34
+ # Define the entrypoint
35
+ ENTRYPOINT ["/usr/local/bin/_entrypoint.sh", "python", "-m", "als_finder.cli"]
36
+ CMD ["--help"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jonathan Greenberg / University of Nevada, Reno
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,4 @@
1
+ include README.md
2
+ include LICENSE
3
+ recursive-include examples *
4
+ recursive-include src/als_finder/data *