Skip to content

Commit e5e783e

Browse files
committed
Changes type checks to use a Protocol for JsCode
and JsCode like objects that come from external sources.
1 parent 97fdf95 commit e5e783e

File tree

5 files changed

+35
-8
lines changed

5 files changed

+35
-8
lines changed

folium/elements.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
)
1010

1111
from folium.template import Template
12-
from folium.utilities import JsCode
12+
from folium.utilities import TypeJsCode
1313

1414

1515
class JSCSSMixin(MacroElement):
@@ -121,7 +121,7 @@ class EventHandler(MacroElement):
121121
"""
122122
)
123123

124-
def __init__(self, event: str, handler: JsCode, once: bool = False):
124+
def __init__(self, event: str, handler: TypeJsCode, once: bool = False):
125125
super().__init__()
126126
self._name = "EventHandler"
127127
self.event = event

folium/plugins/timeline.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from folium.features import GeoJson
77
from folium.folium import Map
88
from folium.template import Template
9-
from folium.utilities import JsCode, get_bounds, remove_empty
9+
from folium.utilities import JsCode, TypeJsCode, get_bounds, remove_empty
1010

1111

1212
class Timeline(GeoJson):
@@ -108,7 +108,7 @@ class Timeline(GeoJson):
108108
def __init__(
109109
self,
110110
data: Union[dict, str, TextIO],
111-
get_interval: Optional[JsCode] = None,
111+
get_interval: Optional[TypeJsCode] = None,
112112
**kwargs
113113
):
114114
super().__init__(data)

folium/template.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
import jinja2
55
from branca.element import Element
66

7-
from folium.utilities import JsCode, TypeJsonValue, camelize
7+
from folium.utilities import TypeJsCode, TypeJsonValue, camelize
88

99

10-
def tojavascript(obj: Union[str, JsCode, dict, list, Element]) -> str:
11-
if isinstance(obj, JsCode):
10+
def tojavascript(obj: Union[str, TypeJsCode, dict, list, Element]) -> str:
11+
if isinstance(obj, TypeJsCode):
1212
return obj.js_code
1313
elif isinstance(obj, Element):
1414
return obj.get_name()

folium/utilities.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
Iterator,
1818
List,
1919
Optional,
20+
Protocol,
2021
Sequence,
2122
Tuple,
2223
Type,
2324
Union,
25+
runtime_checkable,
2426
)
2527
from urllib.parse import urlparse, uses_netloc, uses_params, uses_relative
2628

@@ -35,7 +37,6 @@
3537
none_min,
3638
write_png,
3739
)
38-
from js_loader import JsCode # noqa: F401
3940

4041
try:
4142
import pandas as pd
@@ -65,6 +66,25 @@
6566
_VALID_URLS.add("data")
6667

6768

69+
@runtime_checkable
70+
class TypeJsCode(Protocol):
71+
# we only care about this attribute.
72+
js_code: str
73+
74+
75+
class JsCode(TypeJsCode):
76+
"""Wrapper around Javascript code."""
77+
78+
def __init__(self, js_code: Union[str, "JsCode"]):
79+
if isinstance(js_code, JsCode):
80+
self.js_code: str = js_code.js_code
81+
else:
82+
self.js_code = js_code
83+
84+
def __str__(self):
85+
return self.js_code
86+
87+
6888
def validate_location(location: Sequence[float]) -> List[float]:
6989
"""Validate a single lat/lon coordinate pair and convert to a list
7090

tests/test_utilities.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import numpy as np
22
import pandas as pd
33
import pytest
4+
from js_loader import JsCode as external_JsCode
45

56
from folium import FeatureGroup, Map, Marker, Popup
67
from folium.utilities import (
78
JsCode,
9+
TypeJsCode,
810
_is_url,
911
camelize,
1012
deep_copy,
@@ -248,6 +250,11 @@ def test_js_code_init_js_code():
248250
assert isinstance(js_code_2.js_code, str)
249251

250252

253+
def test_external_js_code():
254+
js_code = external_JsCode("hi")
255+
assert isinstance(js_code, TypeJsCode)
256+
257+
251258
@pytest.mark.parametrize(
252259
"value,expected",
253260
[

0 commit comments

Comments
 (0)