Repository: snakemake/snakemake-wrappers
Pull request #3689: feat: add `overturemaps` cli wrapper
Author: login: irm-codebase
Created: 2025-03-06T14:05:17Z | Merged: 2025-03-06T15:22:12Z

<!-- Ensure that the PR title follows conventional commit style (<type>: <description>)-->
<!-- Possible types are here: https://github.com/commitizen/conventional-commit-types/blob/master/index.json -->

<!-- Add a description of your PR here-->

A small wrapper enabling [overturemaps](https://github.com/OvertureMaps/overturemaps-py) usage in snakemake.
It's a CLI used to download detailed geospatial data.

I've also created a new `geospatial/` section for this stuff.

### QC
<!-- Make sure that you can tick the boxes below. -->

* [x] I confirm that I have followed the [documentation for contributing to `snakemake-wrappers`](https://snakemake-wrappers.readthedocs.io/en/stable/contributing.html).

While the contributions guidelines are more extensive, please particularly ensure that:
* [x] `test.py` was updated to call any added or updated example rules in a `Snakefile`
* [x] `input:` and `output:` file paths in the rules can be chosen arbitrarily
* [ ] wherever possible, command line arguments are inferred and set automatically (e.g. based on file extensions in `input:` or `output:`)
* [ ] temporary files are either written to a unique hidden folder in the working directory, or (better) stored where the Python function `tempfile.gettempdir()` points to 
* [x] the `meta.yaml` contains a link to the documentation of the respective tool or command under `url:`
* [x] conda environments use a minimal amount of channels and packages, in recommended ordering


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
	- Introduced a command-line download tool for open geospatial map data with customizable parameters (format, data type, and optional geographic bounding box).
	- Integrated a workflow rule to manage the data download process.
- **Tests**
	- Added a new test to verify that the geospatial data download functionality operates as expected.
- **Chores**
	- Implemented configuration files to lock dependency versions and ensure a consistent environment setup on Linux, including specific package URLs and channels.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/geo/overturemaps/download/environment.linux-64.pin.txt b/geo/overturemaps/download/environment.linux-64.pin.txt
new file mode 100644
index 00000000000..f977cea5e35
--- /dev/null
+++ b/geo/overturemaps/download/environment.linux-64.pin.txt
@@ -0,0 +1,108 @@
+# This file may be used to create an environment using:
+# $ conda create --name <env> --file <this file>
+# platform: linux-64
+# created-by: conda 25.1.1
+@EXPLICIT
+https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81
+https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52
+https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712
+https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6
+https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260
+https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04
+https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d
+https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda#d7d4680337a14001b0e043e96529409b
+https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23
+https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c
+https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026
+https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693
+https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087
+https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb
+https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda#db63358239cbe1ff86242406d440e44a
+https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0
+https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h4c51ac1_0.conda#aeccfff2806ae38430638ffbb4be9610
+https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8
+https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7
+https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48
+https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda#55a8561fdbbbd34f50f57d9be12ed084
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda#3f4c1197462a6df2be6dc8241828fe93
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda#dcd498d493818b776a77fbc242fbf8e4
+https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda#74e8c3e4df4ceae34aa2959df4b28101
+https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553
+https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66
+https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda#d411fc29e338efb48c5fd4576d71d881
+https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3
+https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda#488f260ccda0afaf08acb286db439c2f
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401
+https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de
+https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b
+https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055
+https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d
+https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3
+https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.51-hbd13f7d_1.conda#168cc19c031482f83b23c4eebbb94e26
+https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7
+https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8
+https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7
+https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b
+https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b
+https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc
+https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393
+https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446
+https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.11-h072c03f_0.conda#5e8060d52f676a40edef0006a75c718f
+https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf
+https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc
+https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h173a860_6.conda#9a063178f1af0a898526cc24ba7be486
+https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca
+https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3
+https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368
+https://conda.anaconda.org/conda-forge/linux-64/libcap-2.71-h39aace5_0.conda#dd19e4e3043f6948bd7454b946ee0983
+https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400
+https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-lib-1.11.0-hb9d3cd8_2.conda#e55712ff40a054134d51b89afca57dbc
+https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b
+https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12
+https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda#d8703f1ffe5a06356f06467f1d0b9464
+https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda#b2fede24428726dd867611664fb372e8
+https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda#dcb95c0a98ba9ff737f7ae482aef7833
+https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda#d82342192dfc9145185190e651065aa9
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda#9b3fb60fe57925a92f399bc3fc42eccf
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda#5ce4df662d32d3123ea8da15571b6f51
+https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3
+https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916
+https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e
+https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.3-h3dc2cb9_0.conda#df057752e83bd254f6d65646eb67cd2e
+https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.3-h9a4d06a_0.conda#e7817c912b25f7599a50eba270e1a463
+https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604
+https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda#4f6f9f3f80354ad185e276c120eac3f0
+https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda#e84ddf12bde691e8ec894b00ea829ddf
+https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61
+https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.1-h205f482_0.conda#9c500858e88df50af3cc883d194de78a
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda#96c3e0221fa2da97619ee82faa341a73
+https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9
+https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_2.conda#bfcedaf5f9b003029cc6abe9431f66bf
+https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f
+https://conda.anaconda.org/conda-forge/linux-64/libllvm17-17.0.6-ha7bfdaf_3.conda#ed3e154faccbf6393bf0bc9ea0423dce
+https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628
+https://conda.anaconda.org/conda-forge/linux-64/rdma-core-56.0-h5888daf_0.conda#a73b3f6d529417fa78d64e8af82444b1
+https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.9-he1b24dc_1.conda#caafc32928a5f7f3f7ef67d287689144
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.34.0-h2b5623c_0.conda#2a5142c88dd6132eaa8079f99476e922
+https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f
+https://conda.anaconda.org/conda-forge/linux-64/ucx-1.17.0-h53fb5aa_4.conda#ba6c7ec20d51a27f60699f2125f00fef
+https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.9-he0e7f3f_2.conda#8a4e6fc8a3b285536202b5456a74a940
+https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.34.0-h0121fbd_0.conda#9f0c43225243c81c6991733edcaafff5
+https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h21f5128_1.conda#98d83a309c3f330793a7cc8d48c67f81
+https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.489-h4d475cb_0.conda#b775e9f46dfa94b228a81d8e8c6d8b1d
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-15.0.2-h2a2a254_55_cpu.conda#496ae3bef63070ad8ba2f1a2c50700d8
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-15.0.2-h7599340_55_cpu.conda#4bcfad0cf953591357d855e2c411ebbe
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-15.0.2-h1f524f1_55_cpu.conda#48ce5643eeab96ca2f767b44068a12ad
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-gandiva-15.0.2-ha6a4c6a_55_cpu.conda#6c116412f87fe67377f5c0eead3d4a8d
+https://conda.anaconda.org/conda-forge/linux-64/libparquet-15.0.2-h3fef80f_55_cpu.conda#1a4daf36ecfa45d510785cc24a3355ce
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-15.0.2-h7599340_55_cpu.conda#11f4047df28377c6efcf56fe8b32df69
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-flight-sql-15.0.2-h79716be_55_cpu.conda#f95377a27b32fb0a5dbc2d2d8eb1848f
+https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-15.0.2-h79716be_55_cpu.conda#6239eb676138395abe8cd99a88eb6928
+https://conda.anaconda.org/conda-forge/linux-64/pyarrow-15.0.2-py312h5169447_55_cpu.conda#dad6b3445325028b98e3a2fa680696f6
+https://conda.anaconda.org/conda-forge/noarch/overturemaps-0.12.0-pyhd8ed1ab_1.conda#f58b81c53606e6e7c3c74af6dd955081
diff --git a/geo/overturemaps/download/environment.yaml b/geo/overturemaps/download/environment.yaml
new file mode 100644
index 00000000000..ce5558a7030
--- /dev/null
+++ b/geo/overturemaps/download/environment.yaml
@@ -0,0 +1,5 @@
+channels:
+  - conda-forge
+  - nodefaults
+dependencies:
+  - overturemaps=0.12.0
diff --git a/geo/overturemaps/download/meta.yaml b/geo/overturemaps/download/meta.yaml
new file mode 100644
index 00000000000..6d7723accac
--- /dev/null
+++ b/geo/overturemaps/download/meta.yaml
@@ -0,0 +1,16 @@
+name: overturemaps-py
+url: https://github.com/overturemaps/overturemaps-py
+description: Command-line tool of the Overture Maps Foundation open geospatial map data
+authors:
+  - Ivan Ruiz Manuel
+output:
+  - path: Location of the output file.
+params:
+  - format: format of the output file. See overture maps website for avialable formats.
+  - type: data type to download. See overture maps website for available data types.
+  - bbox: >
+      Optional. West, south, east, north longitude and latitude coordinates.
+      When omitted the entire dataset will be downloaded.
+  - extra: Optional. Additional program arguments for future-proofing.
+notes: |
+  Read https://docs.overturemaps.org/ for data schema information of the downloaded datasets.
diff --git a/geo/overturemaps/download/test/Snakefile b/geo/overturemaps/download/test/Snakefile
new file mode 100644
index 00000000000..d587787ad1d
--- /dev/null
+++ b/geo/overturemaps/download/test/Snakefile
@@ -0,0 +1,16 @@
+rule download:
+    output:
+        # Overture maps datafile
+        path="results/division_boundary.parquet",
+    params:
+        # file format to request
+        format="geoparquet",
+        # Data type to request
+        type="division_boundary",
+        # bounding box in "west,south,east,north" format
+        bbox=[15.87, -19.02, 28.88, -9.66],  # optional
+    threads: 1
+    log:
+        "logs/overturemaps/download.log"
+    wrapper:
+        "master/geo/overturemaps/download"
diff --git a/geo/overturemaps/download/wrapper.py b/geo/overturemaps/download/wrapper.py
new file mode 100644
index 00000000000..3e3ac05da61
--- /dev/null
+++ b/geo/overturemaps/download/wrapper.py
@@ -0,0 +1,25 @@
+__author__ = "Ivan Ruiz Manuel"
+__copyright__ = "Copyright 2025, Ivan Ruiz Manuel"
+__email__ = "i.ruizmanuel@tudelft.nl"
+__license__ = "MIT"
+
+from snakemake.shell import shell
+
+log = snakemake.log_fmt_shell(stdout=True, stderr=True)
+
+extra = snakemake.params.get("extra", "")
+bbox = snakemake.params.get("bbox", "")
+if bbox:
+    if isinstance(bbox, list):
+        bbox = ",".join(map(str, bbox))
+    bbox = f"--bbox {bbox}"
+
+shell(
+    "overturemaps download"
+    f" -f {snakemake.params.format}"
+    f" --type {snakemake.params.type}"
+    f" {bbox}"
+    f" {extra}"
+    f" --output {snakemake.output.path}"
+    f" {log}"
+)
diff --git a/test_wrappers.py b/test_wrappers.py
index 003cacfbb1d..32ae10c2da4 100644
--- a/test_wrappers.py
+++ b/test_wrappers.py
@@ -6745,3 +6745,17 @@ def test_varlociraptor_control_fdr(run):
             "-F",
         ],
     )
+
+
+def test_overturemaps_download(run):
+    run(
+        "geo/overturemaps/download",
+        [
+            "snakemake",
+            "--cores",
+            "2",
+            "--use-conda",
+            "-F",
+            "results/division_boundary.parquet",
+        ],
+    )
\ No newline at end of file


Reviews:
user: login: fgvieira
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T14:07:09Z
user: login: fgvieira
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T14:08:17Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 3**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>geospatial/overturemaps/download/wrapper.py (1)</summary><blockquote>

`16-21`: **The bbox parameter handling can be improved.**

The current implementation correctly checks if the bbox parameter exists and handles lists by joining them into a comma-separated string. However, a small improvement could ensure the command is properly formatted with spaces.


```diff
bbox = snakemake.params.get("bbox", "")
if bbox:
    if isinstance(bbox, list):
        bbox = ",".join(map(str, bbox))
-   command += f"--bbox {bbox}"
+   command += f" --bbox {bbox} "
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

16-16: Undefined name `snakemake`

(F821)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 6dc1f839c349285f251c1b601145e0ccad6bb94e and ae5e5b2bbc5f7905dc98cf815e28210627da1726.

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `geospatial/overturemaps/download/environment.yaml` (1 hunks)
* `geospatial/overturemaps/download/meta.yaml` (1 hunks)
* `geospatial/overturemaps/download/test/Snakefile` (1 hunks)
* `geospatial/overturemaps/download/wrapper.py` (1 hunks)
* `test_wrappers.py` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (2)</summary>

* geospatial/overturemaps/download/environment.yaml
* geospatial/overturemaps/download/meta.yaml

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (2)</summary>

<details>
<summary>`**/*.py`: Do not try to improve formatting.
Do not suggest ...</summary>

> `**/*.py`: Do not try to improve formatting.
> Do not suggest type annotations for functions that are defined inside of functions or methods.
> Do not suggest type annotation of the `self` argument of methods.
> Do not suggest type annotation of the `cls` argument of classmethods.
> Do not suggest return type annotation if a function or method does not contain a `return` statement.

- `geospatial/overturemaps/download/wrapper.py`
- `test_wrappers.py`

</details>
<details>
<summary>`**/wrapper.py`: Do not complain about use of undefined vari...</summary>

> `**/wrapper.py`: Do not complain about use of undefined variable called `snakemake`.

- `geospatial/overturemaps/download/wrapper.py`

</details>

</details><details>
<summary>🪛 Ruff (0.8.2)</summary>

<details>
<summary>geospatial/overturemaps/download/wrapper.py</summary>

8-8: Undefined name `snakemake`

(F821)

---

11-11: Undefined name `snakemake`

(F821)

---

12-12: Undefined name `snakemake`

(F821)

---

13-13: Undefined name `snakemake`

(F821)

---

16-16: Undefined name `snakemake`

(F821)

</details>

</details>
<details>
<summary>🪛 GitHub Actions: Code quality</summary>

<details>
<summary>geospatial/overturemaps/download/test/Snakefile</summary>

[warning] 1-1: No log directive defined: Without a log directive, all output will be printed to the terminal. In distributed environments, this means that errors are harder to discover.

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: docs
* GitHub Check: testing
* GitHub Check: Summary

</details>

<details>
<summary>🔇 Additional comments (1)</summary><blockquote>

<details>
<summary>test_wrappers.py (1)</summary>

`6748-6761`: **Properly implemented test function for the new overturemaps wrapper.**

The test function correctly follows the established pattern of other tests in this file with appropriate parameters for testing the new geospatial wrapper. The use of 2 cores and Parquet output format is consistent with the functionality being tested.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T14:09:01Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>geospatial/overturemaps/download/meta.yaml (1)</summary><blockquote>

`9-9`: **Fix typo in format description**

There's a typo in the description of the format parameter.

```diff
-  - format: format of the output file. See overture maps website for avialable formats.
+  - format: format of the output file. See overture maps website for available formats.
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 780d97e9867ae183ccc60ec784697c0e030eaf5b and c330c2dcafe984081346ead8770bc9778992b105.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `geospatial/overturemaps/download/meta.yaml` (1 hunks)
* `geospatial/overturemaps/download/test/Snakefile` (1 hunks)
* `geospatial/overturemaps/download/wrapper.py` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* geospatial/overturemaps/download/test/Snakefile

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (2)</summary>

<details>
<summary>`**/*.py`: Do not try to improve formatting.
Do not suggest ...</summary>

> `**/*.py`: Do not try to improve formatting.
> Do not suggest type annotations for functions that are defined inside of functions or methods.
> Do not suggest type annotation of the `self` argument of methods.
> Do not suggest type annotation of the `cls` argument of classmethods.
> Do not suggest return type annotation if a function or method does not contain a `return` statement.

- `geospatial/overturemaps/download/wrapper.py`

</details>
<details>
<summary>`**/wrapper.py`: Do not complain about use of undefined vari...</summary>

> `**/wrapper.py`: Do not complain about use of undefined variable called `snakemake`.

- `geospatial/overturemaps/download/wrapper.py`

</details>

</details><details>
<summary>🪛 Ruff (0.8.2)</summary>

<details>
<summary>geospatial/overturemaps/download/wrapper.py</summary>

8-8: Undefined name `snakemake`

(F821)

---

10-10: Undefined name `snakemake`

(F821)

---

18-18: Undefined name `snakemake`

(F821)

---

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

22-22: Undefined name `snakemake`

(F821)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: Summary

</details>

<details>
<summary>🔇 Additional comments (7)</summary><blockquote>

<details>
<summary>geospatial/overturemaps/download/wrapper.py (4)</summary>

`1-5`: **LGTM - Good metadata setup**

The metadata header is properly formatted with all necessary fields including author, copyright, email, and license information.

---

`8-15`: **LGTM - Good handling of bounding box parameter**

The implementation properly handles the `bbox` parameter by:
1. Checking if it exists
2. Converting from list to comma-separated string if needed
3. Formatting it correctly for the CLI command

This approach is flexible and user-friendly.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

8-8: Undefined name `snakemake`

(F821)

---

10-10: Undefined name `snakemake`

(F821)

</details>

</details>

---

`16-23`: **LGTM - Command construction looks good**

The command construction properly includes all necessary parameters:
- Format
- Type
- Output path
- Bounding box (when provided)
- Extra parameters (for future-proofing)

This implementation aligns well with the Overture Maps CLI interface.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

18-18: Undefined name `snakemake`

(F821)

---

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

22-22: Undefined name `snakemake`

(F821)

</details>

</details>

---

`25-25`: **LGTM - Proper log handling**

The command is executed with proper log handling by enclosing the command in parentheses and appending the log directive.

</details>
<details>
<summary>geospatial/overturemaps/download/meta.yaml (3)</summary>

`1-6`: **LGTM - Metadata is well structured**

The basic metadata for the wrapper is properly defined with name, URL, description, and author information.

---

`11-13`: **LGTM - Good bbox parameter documentation**

The bounding box parameter is well documented with clear instructions about its format and behavior when omitted.

---

`15-16`: **LGTM - Helpful documentation link**

Including the link to the Overture Maps documentation is valuable for users to understand the data schema they'll be working with.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T14:38:38Z
user: login: fgvieira
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T14:42:13Z
user: login: fgvieira
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T14:46:20Z
user: login: fgvieira
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T14:50:15Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (4)</summary><blockquote>

<details>
<summary>geo/overturemaps/download/test/Snakefile (1)</summary><blockquote>

`1-16`: **Implementation looks good, but consider making paths relative to workflow directory**

The rule implementation is clear and well-commented. It specifies the necessary parameters for the Overture Maps download operation with good documentation.



Consider using relative paths with respect to the workflow directory for the output and log paths, such as:

```diff
-        path="results/division_boundary.parquet",
+        path="{outdir}/division_boundary.parquet",
```

```diff
-        "logs/overturemaps/download.log"
+        "{logdir}/overturemaps/download.log"
```

This would make the rule more flexible when integrated into different workflows with different directory structures.

</blockquote></details>
<details>
<summary>geo/overturemaps/download/wrapper.py (1)</summary><blockquote>

`16-23`: **Command construction looks good, but consider input validation**

The command construction is clear and well-formatted. It properly incorporates all the necessary parameters.


Consider adding validation for required parameters to provide more helpful error messages:

```diff
+ required_params = ["format", "type"]
+ for param in required_params:
+     if not hasattr(snakemake.params, param) or not getattr(snakemake.params, param):
+         raise ValueError(f"Parameter '{param}' is required but not provided")
+
command = (
    "overturemaps download "
    f"-f {snakemake.params.format} "
    f"--type={snakemake.params.type} "
    f"-o {snakemake.output.path} "
    f"{bbox} "
    f"{snakemake.params.get("extra", "")} "
)
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

18-18: Undefined name `snakemake`

(F821)

---

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

22-22: Undefined name `snakemake`

(F821)

</details>

</details>

</blockquote></details>
<details>
<summary>geo/overturemaps/download/meta.yaml (2)</summary><blockquote>

`9-9`: **Fix typo in documentation**

There's a typo in the documentation for format parameter.


```diff
- - format: format of the output file. See overture maps website for avialable formats.
+ - format: format of the output file. See overture maps website for available formats.
```

---

`15-16`: **Consider adding more specific documentation links**

The notes section provides a general link to the Overture Maps documentation, which is good.


Consider adding more specific links to the relevant sections of the documentation, especially for the format and type parameters mentioned earlier:

```diff
notes: |
  Read https://docs.overturemaps.org/ for data schema information of the downloaded datasets.
+ For available formats, see: https://docs.overturemaps.org/reference/data-access/download
+ For available data types, see: https://docs.overturemaps.org/overview/datasets
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 79d0806f527298b2a8be69af0a15f42395334494 and 8755687ee5577b542e4294fc206e3998fa261522.

</details>

<details>
<summary>📒 Files selected for processing (6)</summary>

* `geo/overturemaps/download/environment.linux-64.pin.txt` (1 hunks)
* `geo/overturemaps/download/environment.yaml` (1 hunks)
* `geo/overturemaps/download/meta.yaml` (1 hunks)
* `geo/overturemaps/download/test/Snakefile` (1 hunks)
* `geo/overturemaps/download/wrapper.py` (1 hunks)
* `test_wrappers.py` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (2)</summary>

* geo/overturemaps/download/environment.yaml
* geo/overturemaps/download/environment.linux-64.pin.txt

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (2)</summary>

<details>
<summary>`**/*.py`: Do not try to improve formatting.
Do not suggest ...</summary>

> `**/*.py`: Do not try to improve formatting.
> Do not suggest type annotations for functions that are defined inside of functions or methods.
> Do not suggest type annotation of the `self` argument of methods.
> Do not suggest type annotation of the `cls` argument of classmethods.
> Do not suggest return type annotation if a function or method does not contain a `return` statement.

- `geo/overturemaps/download/wrapper.py`
- `test_wrappers.py`

</details>
<details>
<summary>`**/wrapper.py`: Do not complain about use of undefined vari...</summary>

> `**/wrapper.py`: Do not complain about use of undefined variable called `snakemake`.

- `geo/overturemaps/download/wrapper.py`

</details>

</details><details>
<summary>🪛 Ruff (0.8.2)</summary>

<details>
<summary>geo/overturemaps/download/wrapper.py</summary>

8-8: Undefined name `snakemake`

(F821)

---

10-10: Undefined name `snakemake`

(F821)

---

18-18: Undefined name `snakemake`

(F821)

---

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

22-22: Undefined name `snakemake`

(F821)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: Summary

</details>

<details>
<summary>🔇 Additional comments (4)</summary><blockquote>

<details>
<summary>test_wrappers.py (1)</summary>

`6749-6761`: **Looks good! The test function follows the established pattern.**

The `test_overturemaps_download` function is well-structured and consistent with other test functions in the file. It correctly uses the `run` fixture to test the new wrapper at "geo/overturemaps/download" and properly specifies the expected output file.

</details>
<details>
<summary>geo/overturemaps/download/wrapper.py (2)</summary>

`10-14`: **Good handling of bbox parameter with correct type checking**

The code correctly handles the bbox parameter, including converting it from a list to a string format. This is a robust implementation.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

10-10: Undefined name `snakemake`

(F821)

</details>

</details>

---

`25-25`: **Command execution looks good**

The command is properly executed using the shell function with the appropriate logging configuration.

</details>
<details>
<summary>geo/overturemaps/download/meta.yaml (1)</summary>

`11-14`: **Good documentation of bbox parameter**

The documentation for the bbox parameter is clear and informative, properly explaining its purpose and what happens when it's omitted.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T14:56:29Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>geo/overturemaps/download/wrapper.py (2)</summary><blockquote>

`10-15`: **Add validation to prevent duplicate --bbox prefix.**

The code correctly handles the bbox parameter, including converting lists to comma-separated strings. However, if the user provides a string that already contains the `--bbox` prefix, line 15 would create a duplicate prefix.


Consider this improvement:

```diff
if bbox:
    if isinstance(bbox, list):
        bbox = ",".join(map(str, bbox))
-    bbox = f"--bbox {bbox}"
+    bbox = f"--bbox {bbox}" if not str(bbox).strip().startswith("--bbox") else bbox
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

10-10: Undefined name `snakemake`

(F821)

---

11-11: Undefined name `snakemake`

(F821)

</details>

</details>

---

`17-25`: **Consider quoting parameter values to handle spaces.**

The current command construction might have issues if parameter values contain spaces.


Consider this improvement:

```diff
shell(
    "overturemaps download"
-    f" -f {snakemake.params.format}"
-    f" --type {snakemake.params.type}"
+    f" -f '{snakemake.params.format}'"
+    f" --type '{snakemake.params.type}'"
    f" {bbox}"
    f" {extra}"
-    f" --output {snakemake.output.path}"
+    f" --output '{snakemake.output.path}'"
    f" {log}"
)
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

23-23: Undefined name `snakemake`

(F821)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8755687ee5577b542e4294fc206e3998fa261522 and 3baaaaab1c2f8949b86a4447b1c0bb88f49b55b8.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `geo/overturemaps/download/wrapper.py` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (2)</summary>

<details>
<summary>`**/*.py`: Do not try to improve formatting.
Do not suggest ...</summary>

> `**/*.py`: Do not try to improve formatting.
> Do not suggest type annotations for functions that are defined inside of functions or methods.
> Do not suggest type annotation of the `self` argument of methods.
> Do not suggest type annotation of the `cls` argument of classmethods.
> Do not suggest return type annotation if a function or method does not contain a `return` statement.

- `geo/overturemaps/download/wrapper.py`

</details>
<details>
<summary>`**/wrapper.py`: Do not complain about use of undefined vari...</summary>

> `**/wrapper.py`: Do not complain about use of undefined variable called `snakemake`.

- `geo/overturemaps/download/wrapper.py`

</details>

</details><details>
<summary>🪛 Ruff (0.8.2)</summary>

<details>
<summary>geo/overturemaps/download/wrapper.py</summary>

8-8: Undefined name `snakemake`

(F821)

---

10-10: Undefined name `snakemake`

(F821)

---

11-11: Undefined name `snakemake`

(F821)

---

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

23-23: Undefined name `snakemake`

(F821)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: Summary

</details>

<details>
<summary>🔇 Additional comments (2)</summary><blockquote>

<details>
<summary>geo/overturemaps/download/wrapper.py (2)</summary>

`1-4`: **LGTM on metadata!**

The author, copyright, email, and license information are properly defined.

---

`8-8`: **Good logging setup.**

Setting up logging to capture both stdout and stderr ensures comprehensive logging of the command execution.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

8-8: Undefined name `snakemake`

(F821)

</details>

</details>

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T15:02:08Z
user: login: fgvieira
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T15:15:25Z
user: login: fgvieira
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-06T15:16:21Z

Review comments:
diff_hunk: @@ -0,0 +1,16 @@
+name: "overturemaps-py"
+url: https://github.com/overturemaps/overturemaps-py
+description: Command-line tool of the Overture Maps Foundation open geospatial map data
+authors:
+  - Ivan Ruiz Manuel
+input:
path: geospatial/overturemaps/download/meta.yaml
user: login: fgvieira
body: ```suggestion
```
created_at: 2025-03-06T14:07:09Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,16 @@
+name: "overturemaps-py"
+url: https://github.com/overturemaps/overturemaps-py
+description: Command-line tool of the Overture Maps Foundation open geospatial map data
+authors:
+  - Ivan Ruiz Manuel
+input:
+output:
+  - path: Location of the output file.
+params:
+  - format: format of the output file. See overture maps website for avialable formats.
+  - type: data type to download. See overture maps website for available data types.
+  - bbox: >
+      Optional. West, south, east, north longitude and latitude coordinates.
+      When omitted the entire dataset will be downloaded.
+notes: |
path: geospatial/overturemaps/download/meta.yaml
user: login: fgvieira
body: ```suggestion
  - extra: additional program arguments
notes: |
```
created_at: 2025-03-06T14:08:17Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,16 @@
+rule download:
+    output:
+        # Overture maps datafile
+        path="results/division_boundary.parquet",
+    params:
+        # file format to request
+        format="geoparquet",
+        # Data type to request
+        type="division_boundary",
+        # bounding box in "west,south,east,north" format
+        bbox=[15.87, -19.02, 28.88, -9.66],  # optional
+        # optional parameters
+        extra="-i 1,2",
+    threads: 1
+    wrapper:
+        "master/geospatial/overturemaps/download"
path: geospatial/overturemaps/download/test/Snakefile
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Add a log directive to the Snakefile rule.**

The pipeline flag correctly identified that there's no log directive defined in this rule. In a distributed environment, this makes errors harder to discover as all output will be printed to the terminal.


Add a log directive to store command outputs and errors:

```diff
rule download:
    output:
        # Overture maps datafile
        path="results/division_boundary.parquet",
    params:
        # file format to request
        format="geoparquet",
        # Data type to request
        type="division_boundary",
        # bounding box in "west,south,east,north" format
        bbox=[15.87, -19.02, 28.88, -9.66],  # optional
        # optional parameters
        extra="-i 1,2",
    threads: 1
+   log:
+       "logs/overturemaps/download.log"
    wrapper:
        "master/geospatial/overturemaps/download"
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
rule download:
    output:
        # Overture maps datafile
        path="results/division_boundary.parquet",
    params:
        # file format to request
        format="geoparquet",
        # Data type to request
        type="division_boundary",
        # bounding box in "west,south,east,north" format
        bbox=[15.87, -19.02, 28.88, -9.66],  # optional
        # optional parameters
        extra="-i 1,2",
    threads: 1
    log:
        "logs/overturemaps/download.log"
    wrapper:
        "master/geospatial/overturemaps/download"
`````

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 GitHub Actions: Code quality</summary>

[warning] 1-1: No log directive defined: Without a log directive, all output will be printed to the terminal. In distributed environments, this means that errors are harder to discover.

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-06T14:09:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,22 @@
+__author__ = "Ivan Ruiz Manuel"
+__copyright__ = "Copyright 2025, Ivan Ruiz Manuel"
+__email__ = "i.ruizmanuel@tudelft.nl"
+__license__ = "MIT"
+
+from snakemake.shell import shell
+
+log = snakemake.log_fmt_shell(stdout=True, stderr=True)
+command = (
+    "overturemaps download "
+    f"-f {snakemake.params.format} "
+    f"--type={snakemake.params.type} "
+    f"-o {snakemake.output.path} "
+)
+
+bbox = snakemake.params.get("bbox", "")
+if bbox:
+    if isinstance(bbox, list):
+        bbox = ",".join(map(str, bbox))
+    command += f"--bbox {bbox}"
+
+shell(command)
path: geospatial/overturemaps/download/wrapper.py
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Include the log directive in the shell command.**

The log directive set up earlier isn't being used in the shell command execution.


```diff
-shell(command)
+shell(f"{command} {log}")
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
shell(f"{command} {log}")
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-06T14:09:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,22 @@
+__author__ = "Ivan Ruiz Manuel"
+__copyright__ = "Copyright 2025, Ivan Ruiz Manuel"
+__email__ = "i.ruizmanuel@tudelft.nl"
+__license__ = "MIT"
+
+from snakemake.shell import shell
+
+log = snakemake.log_fmt_shell(stdout=True, stderr=True)
+command = (
+    "overturemaps download "
+    f"-f {snakemake.params.format} "
+    f"--type={snakemake.params.type} "
+    f"-o {snakemake.output.path} "
+)
path: geospatial/overturemaps/download/wrapper.py
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Add proper error handling and include log directive in the shell command.**

The current implementation sets up the log formatting but doesn't use it in the shell command. Also, the `extra` parameter from the Snakefile is not being used in the command.


```diff
log = snakemake.log_fmt_shell(stdout=True, stderr=True)
command = (
    "overturemaps download "
    f"-f {snakemake.params.format} "
    f"--type={snakemake.params.type} "
    f"-o {snakemake.output.path} "
+   f"{snakemake.params.get('extra', '')} "
)
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
log = snakemake.log_fmt_shell(stdout=True, stderr=True)
command = (
    "overturemaps download "
    f"-f {snakemake.params.format} "
    f"--type={snakemake.params.type} "
    f"-o {snakemake.output.path} "
    f"{snakemake.params.get('extra', '')} "
)
`````

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

8-8: Undefined name `snakemake`

(F821)

---

11-11: Undefined name `snakemake`

(F821)

---

12-12: Undefined name `snakemake`

(F821)

---

13-13: Undefined name `snakemake`

(F821)

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-06T14:09:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,5 @@
+channels:
+  - conda-forge
+  - nodefaults
+dependencies:
+  - overturemaps=0.12
path: geospatial/overturemaps/download/environment.yaml
user: login: fgvieira
body: ```suggestion
  - overturemaps=0.12.0
```
created_at: 2025-03-06T14:42:12Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,25 @@
+__author__ = "Ivan Ruiz Manuel"
+__copyright__ = "Copyright 2025, Ivan Ruiz Manuel"
+__email__ = "i.ruizmanuel@tudelft.nl"
+__license__ = "MIT"
+
+from snakemake.shell import shell
+
+log = snakemake.log_fmt_shell(stdout=True, stderr=True)
path: geospatial/overturemaps/download/wrapper.py
user: login: fgvieira
body: ```suggestion
extra = snakemake.params.get("extra", "")
log = snakemake.log_fmt_shell(stdout=True, stderr=True)
```
created_at: 2025-03-06T14:46:20Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,25 @@
+__author__ = "Ivan Ruiz Manuel"
+__copyright__ = "Copyright 2025, Ivan Ruiz Manuel"
+__email__ = "i.ruizmanuel@tudelft.nl"
+__license__ = "MIT"
+
+from snakemake.shell import shell
+
+log = snakemake.log_fmt_shell(stdout=True, stderr=True)
+
+bbox = snakemake.params.get("bbox", "")
+if bbox:
+    if isinstance(bbox, list):
+        bbox = ",".join(map(str, bbox))
+    bbox = f"--bbox {bbox}"
+
+command = (
+    "overturemaps download "
+    f"-f {snakemake.params.format} "
+    f"--type={snakemake.params.type} "
+    f"-o {snakemake.output.path} "
+    f"{bbox} "
+    f"{snakemake.params.get("extra", "")} "
+)
+
+shell(f"({command}) {log}")
path: geospatial/overturemaps/download/wrapper.py
user: login: fgvieira
body: ```suggestion
shell(
    "overturemaps download"
    " -f {snakemake.params.format}"
    " --type {snakemake.params.type}"
    " {bbox}"
    " {extra}"
    " --output {snakemake.output.path}"
    " {log}"
)
```
created_at: 2025-03-06T14:50:15Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,25 @@
+__author__ = "Ivan Ruiz Manuel"
+__copyright__ = "Copyright 2025, Ivan Ruiz Manuel"
+__email__ = "i.ruizmanuel@tudelft.nl"
+__license__ = "MIT"
+
+from snakemake.shell import shell
+
+log = snakemake.log_fmt_shell(stdout=True, stderr=True)
+
+extra = snakemake.params.get("extra", "")
+bbox = snakemake.params.get("bbox", "")
+if bbox:
+    if isinstance(bbox, list):
+        bbox = ",".join(map(str, bbox))
+    bbox = f"--bbox {bbox}"
+
+shell(
+    "overturemaps download"
+    f" -f {snakemake.params.format}"
+    f" --type {snakemake.params.type}"
+    f" {bbox}"
+    f" {extra}"
+    f" --output {snakemake.output.path}"
+    f" {log}"
+)
path: geo/overturemaps/download/wrapper.py
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Add validation for required parameters.**

The shell command construction assumes that `snakemake.params.format`, `snakemake.params.type`, and `snakemake.output.path` are always defined. If any of these are missing, the script will fail with an attribute error.


Consider adding validation before constructing the command:

```diff
+ # Validate required parameters
+ if not hasattr(snakemake.params, "format"):
+     raise ValueError("Parameter 'format' is required")
+ if not hasattr(snakemake.params, "type"):
+     raise ValueError("Parameter 'type' is required")
+ if not hasattr(snakemake.output, "path"):
+     raise ValueError("Output 'path' is required")

shell(
    "overturemaps download"
    f" -f {snakemake.params.format}"
    f" --type {snakemake.params.type}"
    f" {bbox}"
    f" {extra}"
    f" --output {snakemake.output.path}"
    f" {log}"
)
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
# Validate required parameters
if not hasattr(snakemake.params, "format"):
    raise ValueError("Parameter 'format' is required")
if not hasattr(snakemake.params, "type"):
    raise ValueError("Parameter 'type' is required")
if not hasattr(snakemake.output, "path"):
    raise ValueError("Output 'path' is required")

shell(
    "overturemaps download"
    f" -f {snakemake.params.format}"
    f" --type {snakemake.params.type}"
    f" {bbox}"
    f" {extra}"
    f" --output {snakemake.output.path}"
    f" {log}"
)
`````

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Ruff (0.8.2)</summary>

19-19: Undefined name `snakemake`

(F821)

---

20-20: Undefined name `snakemake`

(F821)

---

23-23: Undefined name `snakemake`

(F821)

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-06T15:02:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,16 @@
+name: "overturemaps-py"
path: geo/overturemaps/download/meta.yaml
user: login: fgvieira
body: ```suggestion
name: overturemaps-py
```
created_at: 2025-03-06T15:15:25Z
author_association: COLLABORATOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-03-06T14:05:25Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

"""
## Walkthrough
This pull request introduces new functionality to download geospatial Overture Maps data using Snakemake. It adds a new test function in the testing suite to verify the download process, several environment configuration files for reproducible Conda setups, and project metadata. Additionally, a new Snakefile rule along with an associated Python wrapper script is implemented to facilitate the download command execution using Snakemake’s shell functionality.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `test_wrappers.py` | Added test function `test_overturemaps_download` that uses the `run` fixture to trigger a Snakemake command for downloading geospatial data. |
| `geo/overturemaps/download/environment.linux-64.pin.txt`,<br>`geo/overturemaps/download/environment.yaml`,<br>`geo/overturemaps/download/meta.yaml` | Introduced new files for environment setup and project metadata: the pin file specifies explicit package versions, the YAML file defines channels and dependencies, and the meta file provides metadata for the `overturemaps-py` tool. |
| `geo/overturemaps/download/test/Snakefile`,<br>`geo/overturemaps/download/wrapper.py` | Added a new Snakefile rule named `download` and an accompanying Python wrapper to construct and execute the download command via Snakemake. |

## Sequence Diagram(s)
```mermaid
sequenceDiagram
    participant T as Test Runner
    participant S as Snakemake
    participant D as Download Rule
    participant W as Wrapper Script
    participant Sh as Shell

    T->>S: Execute test_overturemaps_download
    S->>D: Trigger rule download
    D->>W: Call wrapper to process parameters and construct command
    W->>Sh: Execute shell command for data download
    Sh-->>W: Return command output/logs
    W-->>D: Return execution status
    D-->>S: Complete rule execution
    S-->>T: Return test result
```

## Possibly related PRs
- **snakemake/snakemake-wrappers#3502**: Adds a test function (`test_ngsbits_sampleancestry`) in the same file, enhancing the testing framework.
"""

</details>

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 3baaaaab1c2f8949b86a4447b1c0bb88f49b55b8 and d09422e5fd8af46eb2b86277368e2056219c848d.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `geo/overturemaps/download/meta.yaml` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* geo/overturemaps/download/meta.yaml

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: testing
* GitHub Check: docs
* GitHub Check: Summary

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=snakemake/snakemake-wrappers&utm_content=3689):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: fgvieira
created_at: 2025-03-06T14:13:23Z
body: Thanks for the wrapper!
Can you also include the software pin file?
author_association: COLLABORATOR
user: login: irm-codebase
created_at: 2025-03-06T14:35:19Z
body: @fgvieira no problem!

I am trying to, but I get the following:

```
❯ snakedeploy pin-conda-envs geospatial/overturemaps/download/environment.yaml 
Pinning geospatial/overturemaps/download/environment.yaml...
Failed for conda env geospatial/overturemaps/download/environment.yaml:
error    libmamba Non-conda folder exists at prefix
critical libmamba Aborting.
```
author_association: CONTRIBUTOR
user: login: fgvieira
created_at: 2025-03-06T14:41:22Z
body: Try:
```
cd geospatial/overturemaps/download
snakedeploy pin-conda-envs environment.yaml
```
author_association: COLLABORATOR
user: login: irm-codebase
created_at: 2025-03-06T14:41:38Z
body: @fgvieira got it to work by using conda instead of mamba.
Should be ready for the review!
author_association: CONTRIBUTOR
user: login: fgvieira
created_at: 2025-03-06T14:44:04Z
body: Instead of `geospatial`, maybe we could call it just `geo`. To keep it shorter and more general.
author_association: COLLABORATOR
user: login: fgvieira
created_at: 2025-03-06T15:23:19Z
body: Thanks for contributing! :smile: 
author_association: COLLABORATOR
user: login: irm-codebase
created_at: 2025-03-06T16:22:42Z
body: Thanks for the super fast merge!
author_association: CONTRIBUTOR