Skip to content

Commit

Permalink
validate basemap style is a url (#497)
Browse files Browse the repository at this point in the history
### Change list

- Add validation that the basemap style input is a HTTP url

Closes #485
  • Loading branch information
kylebarron authored May 2, 2024
1 parent 1d71f97 commit 8e6a53a
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
8 changes: 4 additions & 4 deletions lonboard/_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from lonboard._layer import BaseLayer
from lonboard._viewport import compute_view
from lonboard.basemap import CartoBasemap
from lonboard.traits import DEFAULT_INITIAL_VIEW_STATE, ViewStateTrait
from lonboard.traits import DEFAULT_INITIAL_VIEW_STATE, BasemapUrl, ViewStateTrait
from lonboard.types.map import MapKwargs

if TYPE_CHECKING:
Expand Down Expand Up @@ -156,13 +156,13 @@ def __init__(
- Default: `5`
"""

basemap_style = traitlets.Unicode(CartoBasemap.PositronNoLabels).tag(sync=True)
basemap_style = BasemapUrl(CartoBasemap.PositronNoLabels)
"""
A MapLibre-compatible basemap style.
A URL to a MapLibre-compatible basemap style.
Various styles are provided in [`lonboard.basemap`](https://developmentseed.org/lonboard/latest/api/basemap/).
- Type: `str`
- Type: `str`, holding a URL hosting a basemap style.
- Default
[`lonboard.basemap.CartoBasemap.PositronNoLabels`][lonboard.basemap.CartoBasemap.PositronNoLabels]
"""
Expand Down
24 changes: 24 additions & 0 deletions lonboard/traits.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import warnings
from typing import Any, List, Optional, Set, Tuple, Union, cast
from urllib.parse import urlparse

import matplotlib as mpl
import numpy as np
Expand Down Expand Up @@ -968,3 +969,26 @@ def validate(

self.error(obj, value)
assert False


class BasemapUrl(traitlets.Unicode):
def __init__(
self: TraitType,
*args,
**kwargs: Any,
) -> None:
super().__init__(*args, **kwargs)
self.tag(sync=True)

def validate(self, obj: Any, value: Any) -> Any:
value = super().validate(obj, value)

try:
parsed = urlparse(value)
except: # noqa
self.error(obj, value, info="to be a URL")

if not parsed.scheme.startswith("http"):
self.error(obj, value, info="to be a HTTP(s) URL")
else:
return value
6 changes: 6 additions & 0 deletions tests/test_map.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import geopandas as gpd
import pytest
import shapely
from traitlets import TraitError

from lonboard import Map, ScatterplotLayer, SolidPolygonLayer

Expand All @@ -27,3 +28,8 @@ def allow_single_layer():

layer = SolidPolygonLayer.from_geopandas(gdf)
_m = Map(layer)


def test_map_basemap_non_url():
with pytest.raises(TraitError, match=r"expected to be a HTTP\(s\) URL"):
_m = Map([], basemap_style="hello world")

0 comments on commit 8e6a53a

Please sign in to comment.