Skip to content

Commit 8b4f389

Browse files
committed
PEP8 the code + flake8 tests.
1 parent 1d52280 commit 8b4f389

25 files changed

+421
-288
lines changed

.travis.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ before_install:
1616
- conda update --yes --all
1717
- travis_retry conda create --yes -n test python=$PYTHON --file requirements.txt
1818
- source activate test
19-
- travis_retry conda install --yes pytest pandas vincent
19+
- conda install --yes --file requirements-dev.txt
20+
- travis_retry conda install --yes pytest pandas vincent flake8
2021
- if [[ "$PYTHON" != "3.5" ]]; then
2122
travis_retry conda install --yes mock ;
2223
fi
2324
- travis_retry pip install
2425

2526
script:
2627
- python setup.py test
28+
- find ./folium -type f -name "*.py" | xargs flake8 --max-line-length=100
29+
- find ./tests -type f -name "*.py" | xargs flake8 --max-line-length=100

folium/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from __future__ import absolute_import
44

5-
__version__ = '0.2.0.dev'
6-
75
from folium.folium import Map, initialize_notebook, CircleMarker
86

97
from folium.map import (FeatureGroup, FitBounds, Icon, LayerControl, Marker,
@@ -14,6 +12,8 @@
1412
MarkerCluster, MultiPolyLine, PolyLine, Vega,
1513
RegularPolygonMarker, TopoJson, WmsTileLayer)
1614

15+
__version__ = '0.2.0.dev'
16+
1717
__all__ = ['Map',
1818
'initialize_notebook',
1919
'CircleMarker',

folium/colormap.py

Lines changed: 173 additions & 135 deletions
Large diffs are not rendered by default.

folium/element.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def _get_self_bounds(self):
4444
"""Computes the bounds of the object itself (not including it's children)
4545
in the form [[lat_min, lon_min], [lat_max, lon_max]]
4646
"""
47-
return [[None,None],[None,None]]
47+
return [[None, None], [None, None]]
4848

4949
def get_bounds(self):
5050
"""Computes the bounds of the object and all it's children
@@ -480,8 +480,10 @@ def _repr_html_(self, **kwargs):
480480
out = self._parent._repr_html_(**kwargs)
481481
return out
482482

483+
483484
class IFrame(Element):
484-
def __init__(self, html=None, width="100%", height=None, ratio="60%", figsize=None):
485+
def __init__(self, html=None, width="100%", height=None, ratio="60%",
486+
figsize=None):
485487
"""Create a Figure object, to plot things into it.
486488
487489
Parameters
@@ -525,16 +527,16 @@ def render(self, **kwargs):
525527
----------
526528
527529
"""
528-
html = super(IFrame,self).render(**kwargs)
530+
html = super(IFrame, self).render(**kwargs)
529531
html = "data:text/html;base64," + base64.b64encode(html.encode('utf8')).decode('utf8') # noqa
530532

531533
if self.height is None:
532534
iframe = (
533535
'<div style="width:{width};">'
534-
'<div style="position:relative;width:100%;height:0;padding-bottom:{ratio};">'
535-
'<iframe src="{html}" style="position:absolute;width:100%;height:100%;left:0;top:0;">'
536+
'<div style="position:relative;width:100%;height:0;padding-bottom:{ratio};">' # noqa
537+
'<iframe src="{html}" style="position:absolute;width:100%;height:100%;left:0;top:0;">' # noqa
536538
'</iframe>'
537-
'</div></div>').format # noqa
539+
'</div></div>').format
538540
iframe = iframe(html=html,
539541
width=self.width,
540542
ratio=self.ratio)
@@ -544,6 +546,7 @@ def render(self, **kwargs):
544546
iframe = iframe(html=html, width=self.width, height=self.height)
545547
return iframe
546548

549+
547550
class MacroElement(Element):
548551
"""This is a parent class for Elements defined by a macro template.
549552
To compute your own element, all you have to do is:

folium/features.py

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from .element import Element, Figure, JavascriptLink, CssLink, MacroElement
1818
from .map import Layer, Icon, Marker, Popup
1919

20+
2021
class WmsTileLayer(Layer):
2122
def __init__(self, url, name=None,
2223
format=None, layers=None, transparent=True,
@@ -49,6 +50,7 @@ def __init__(self, url, name=None,
4950
{% endmacro %}
5051
""") # noqa
5152

53+
5254
class RegularPolygonMarker(Marker):
5355
def __init__(self, location, color='black', opacity=1, weight=2,
5456
fill_color='blue', fill_opacity=1,
@@ -128,6 +130,7 @@ def render(self, **kwargs):
128130
JavascriptLink("https://cdnjs.cloudflare.com/ajax/libs/leaflet-dvf/0.2/leaflet-dvf.markers.min.js"), # noqa
129131
name='dvf_js')
130132

133+
131134
class Vega(Element):
132135
def __init__(self, data, width=None, height=None,
133136
left="0%", top="0%", position='relative'):
@@ -137,13 +140,16 @@ def __init__(self, data, width=None, height=None,
137140
"""
138141
super(Vega, self).__init__()
139142
self._name = 'Vega'
140-
self.data = data.to_json() if hasattr(data,'to_json') else data
141-
if isinstance(self.data,text_type) or isinstance(data,binary_type):
143+
self.data = data.to_json() if hasattr(data, 'to_json') else data
144+
# FIXME:
145+
if isinstance(self.data, text_type) or isinstance(data, binary_type):
142146
self.data = json.loads(self.data)
143147

144148
# Size Parameters.
145-
self.width = _parse_size(self.data.get('width','100%') if width is None else width)
146-
self.height = _parse_size(self.data.get('height','100%') if height is None else height)
149+
self.width = _parse_size(self.data.get('width', '100%') if
150+
width is None else width)
151+
self.height = _parse_size(self.data.get('height', '100%') if
152+
height is None else height)
147153
self.left = _parse_size(left)
148154
self.top = _parse_size(top)
149155
self.position = position
@@ -191,6 +197,7 @@ def render(self, **kwargs):
191197
vg.parse.spec(spec, function(chart) { chart({el:div}).update(); });}"""), # noqa
192198
name='vega_parse')
193199

200+
194201
class GeoJson(MacroElement):
195202
def __init__(self, data, style_function=None):
196203
"""
@@ -220,20 +227,22 @@ def __init__(self, data, style_function=None):
220227
>>> # Providing string.
221228
>>> GeoJson(open('foo.json').read())
222229
223-
>>> # Providing a style_function that put all states in green, but Alabama in blue.
224-
>>> style_function=lambda x: {'fillColor': '#0000ff' if x['properties']['name']=='Alabama' else '#00ff00'}
230+
>>> # Provide a style_function that color all states green but Alabama.
231+
>>> style_function = lambda x: {'fillColor': '#0000ff' if
232+
... x['properties']['name']=='Alabama' else
233+
... '#00ff00'}
225234
>>> GeoJson(geojson, style_function=style_function)
226235
"""
227236
super(GeoJson, self).__init__()
228237
self._name = 'GeoJson'
229-
if hasattr(data,'read'):
238+
if hasattr(data, 'read'):
230239
self.embed = True
231240
self.data = json.load(data)
232-
elif isinstance(data,dict):
241+
elif isinstance(data, dict):
233242
self.embed = True
234243
self.data = data
235244
elif isinstance(data, text_type) or isinstance(data, binary_type):
236-
if data.lstrip()[0] in '[{': # This is a GeoJSON inline string
245+
if data.lstrip()[0] in '[{': # This is a GeoJSON inline string
237246
self.embed = True
238247
self.data = json.loads(data)
239248
else: # This is a filename
@@ -242,18 +251,19 @@ def __init__(self, data, style_function=None):
242251
elif data.__class__.__name__ in ['GeoDataFrame', 'GeoSeries']:
243252
self.embed = True
244253
if hasattr(data, '__geo_interface__'):
245-
# We have a GeoPandas 0.2 object
246-
self.data = json.loads(json.dumps(data.to_crs(epsg='4326').__geo_interface__))
254+
# We have a GeoPandas 0.2 object.
255+
self.data = json.loads(json.dumps(data.to_crs(epsg='4326').__geo_interface__)) # noqa
247256
elif hasattr(data, 'columns'):
248257
# We have a GeoDataFrame 0.1
249258
self.data = json.loads(data.to_crs(epsg='4326').to_json())
250259
else:
251-
raise ValueError('Unable to transform this object to a GeoJSON.')
260+
msg = 'Unable to transform this object to a GeoJSON.'
261+
raise ValueError(msg)
252262
else:
253263
raise ValueError('Unhandled object {!r}.'.format(data))
254264

255265
if style_function is None:
256-
style_function = lambda x: {}
266+
def style_function(x): return {}
257267
self.style_function = style_function
258268

259269
self._template = Template(u"""
@@ -268,14 +278,13 @@ def __init__(self, data, style_function=None):
268278
def style_data(self):
269279
if 'features' not in self.data.keys():
270280
# Catch case when GeoJSON is just a single Feature or a geometry.
271-
if not (isinstance(self.data, dict) and 'geometry' in self.data.keys()):
281+
if not (isinstance(self.data, dict) and 'geometry' in self.data.keys()): # noqa
272282
# Catch case when GeoJSON is just a geometry.
273-
self.data = {'type' : 'Feature', 'geometry' : self.data}
274-
self.data = {'type' : 'FeatureCollection', 'features' : [self.data]}
283+
self.data = {'type': 'Feature', 'geometry': self.data}
284+
self.data = {'type': 'FeatureCollection', 'features': [self.data]}
275285

276286
for feature in self.data['features']:
277-
feature.setdefault('properties',{}).setdefault('style',{}).update(
278-
self.style_function(feature))
287+
feature.setdefault('properties', {}).setdefault('style', {}).update(self.style_function(feature)) # noqa
279288
return json.dumps(self.data, sort_keys=True)
280289

281290
def _get_self_bounds(self):
@@ -287,14 +296,14 @@ def _get_self_bounds(self):
287296

288297
if 'features' not in self.data.keys():
289298
# Catch case when GeoJSON is just a single Feature or a geometry.
290-
if not (isinstance(self.data, dict) and 'geometry' in self.data.keys()):
299+
if not (isinstance(self.data, dict) and 'geometry' in self.data.keys()): # noqa
291300
# Catch case when GeoJSON is just a geometry.
292-
self.data = {'type' : 'Feature', 'geometry' : self.data}
293-
self.data = {'type' : 'FeatureCollection', 'features' : [self.data]}
301+
self.data = {'type': 'Feature', 'geometry': self.data}
302+
self.data = {'type': 'FeatureCollection', 'features': [self.data]}
294303

295-
bounds = [[None,None],[None,None]]
304+
bounds = [[None, None], [None, None]]
296305
for feature in self.data['features']:
297-
for point in iter_points(feature.get('geometry',{}).get('coordinates',{})):
306+
for point in iter_points(feature.get('geometry', {}).get('coordinates', {})): # noqa
298307
bounds = [
299308
[
300309
none_min(bounds[0][0], point[1]),
@@ -307,6 +316,7 @@ def _get_self_bounds(self):
307316
]
308317
return bounds
309318

319+
310320
class TopoJson(MacroElement):
311321
def __init__(self, data, object_path, style_function=None):
312322
"""
@@ -328,7 +338,7 @@ def __init__(self, data, object_path, style_function=None):
328338
self.object_path = object_path
329339

330340
if style_function is None:
331-
style_function = lambda x: {}
341+
def style_function(x): return {}
332342
self.style_function = style_function
333343

334344
self._template = Template(u"""
@@ -341,18 +351,17 @@ def __init__(self, data, object_path, style_function=None):
341351
{{this.get_name()}}.setStyle(function(feature) {return feature.properties.style;});
342352
343353
{% endmacro %}
344-
""")
354+
""") # noqa
345355

346356
def style_data(self):
347357
def recursive_get(data, keys):
348358
if len(keys):
349359
return recursive_get(data.get(keys[0]), keys[1:])
350360
else:
351361
return data
352-
geometries = recursive_get(self.data, self.object_path.split('.'))['geometries']
362+
geometries = recursive_get(self.data, self.object_path.split('.'))['geometries'] # noqa
353363
for feature in geometries:
354-
feature.setdefault('properties',{}).setdefault('style',{}).update(
355-
self.style_function(feature))
364+
feature.setdefault('properties', {}).setdefault('style', {}).update(self.style_function(feature)) # noqa
356365
return json.dumps(self.data, sort_keys=True)
357366

358367
def render(self, **kwargs):
@@ -373,10 +382,10 @@ def _get_self_bounds(self):
373382
if not self.embed:
374383
raise ValueError('Cannot compute bounds of non-embedded TopoJSON.')
375384

376-
xmin,xmax,ymin,ymax = None, None, None, None
385+
xmin, xmax, ymin, ymax = None, None, None, None
377386

378387
for arc in self.data['arcs']:
379-
x,y = 0,0
388+
x, y = 0, 0
380389
for dx, dy in arc:
381390
x += dx
382391
y += dy
@@ -386,16 +395,17 @@ def _get_self_bounds(self):
386395
ymax = none_max(y, ymax)
387396
return [
388397
[
389-
self.data['transform']['translate'][0] + self.data['transform']['scale'][0] * xmin,
390-
self.data['transform']['translate'][1] + self.data['transform']['scale'][1] * ymin,
398+
self.data['transform']['translate'][0] + self.data['transform']['scale'][0] * xmin, # noqa
399+
self.data['transform']['translate'][1] + self.data['transform']['scale'][1] * ymin, # noqa
391400
],
392401
[
393-
self.data['transform']['translate'][0] + self.data['transform']['scale'][0] * xmax,
394-
self.data['transform']['translate'][1] + self.data['transform']['scale'][1] * ymax,
402+
self.data['transform']['translate'][0] + self.data['transform']['scale'][0] * xmax, # noqa
403+
self.data['transform']['translate'][1] + self.data['transform']['scale'][1] * ymax, # noqa
395404
]
396405

397406
]
398407

408+
399409
class ColorScale(MacroElement):
400410
def __init__(self, color_domain, color_code, caption=""):
401411
"""
@@ -425,6 +435,7 @@ def render(self, **kwargs):
425435
JavascriptLink("https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"), # noqa
426436
name='d3')
427437

438+
428439
class MarkerCluster(Layer):
429440
"""Adds a MarkerCluster layer on the map."""
430441
def __init__(self, overlay=True, control=True):
@@ -549,6 +560,7 @@ def __init__(self, location, radius=500, color='black',
549560
{% endmacro %}
550561
""")
551562

563+
552564
class LatLngPopup(MacroElement):
553565
def __init__(self):
554566
"""
@@ -667,6 +679,7 @@ def _get_self_bounds(self):
667679
]
668680
return bounds
669681

682+
670683
class MultiPolyLine(MacroElement):
671684
def __init__(self, locations, color=None, weight=None,
672685
opacity=None, latlon=True, popup=None):
@@ -713,6 +726,7 @@ def __init__(self, locations, color=None, weight=None,
713726
{{this._parent.get_name()}}.addLayer({{this.get_name()}});
714727
{% endmacro %}
715728
""") # noqa
729+
716730
def _get_self_bounds(self):
717731
"""Computes the bounds of the object itself (not including it's children)
718732
in the form [[lat_min, lon_min], [lat_max, lon_max]]
@@ -731,6 +745,7 @@ def _get_self_bounds(self):
731745
]
732746
return bounds
733747

748+
734749
class CustomIcon(Icon):
735750
def __init__(self, icon_image, icon_size=None, icon_anchor=None,
736751
shadow_image=None, shadow_size=None, shadow_anchor=None,

0 commit comments

Comments
 (0)