Commits

Mikhail Korobov committed c7a8ff1

Убрана зависимость от BeautifulSoup и добавлены тесты правильности разбора ответа геокодера

Comments (0)

Files changed (5)

 Лицензия MIT.
 
 Для работы в settings.py нужно добавить переменную YANDEX_MAPS_API_KEY
-со своим ключом API от яндекса. Для работы нужна также библиотека BeautifulSoup.
+со своим ключом API от яндекса.
 
       author_email='kmike84@gmail.com',
       url='http://bitbucket.org/kmike/django-yandex-maps/',
 
-      description = 'Django app for work with Yandex Maps service.',
+      description = 'Django app for Yandex Maps integration.',
       license = 'MIT license',
       packages=['yandex_maps', 'yandex_maps.templatetags'],
 
       package_data={'yandex_maps': ['templates/yandex_maps/*']},
 
-      requires = ['django (>=1.0)', 'BeautifulSoup'],
+      requires = ['django (>=1.0)'],
       long_description = open('README.rst').read().decode('utf8'),
 
       classifiers=[

yandex_maps/tests.py

+#coding: utf-8
+from unittest import TestCase
+from yandex_maps.utils import _parse_response
+
+RESPONSE = u"""<?xml version="1.0" encoding="utf-8"?>
+<ymaps xmlns="http://maps.yandex.ru/ymaps/1.x" xmlns:x="http://www.yandex.ru/xscript">
+  <GeoObjectCollection>
+    <metaDataProperty xmlns="http://www.opengis.net/gml">
+      <GeocoderResponseMetaData xmlns="http://maps.yandex.ru/geocoder/1.x">
+        <request>Екатеринбург, Свердлова 27</request>
+        <found>1</found>
+        <results>10</results>
+      </GeocoderResponseMetaData>
+    </metaDataProperty>
+    <featureMember xmlns="http://www.opengis.net/gml">
+      <GeoObject xmlns="http://maps.yandex.ru/ymaps/1.x">
+        <metaDataProperty xmlns="http://www.opengis.net/gml">
+          <GeocoderMetaData xmlns="http://maps.yandex.ru/geocoder/1.x">
+            <kind>house</kind>
+            <text>Россия, Свердловская область, Екатеринбург, улица Свердлова, 27</text>
+            <precision>number</precision>
+            <AddressDetails xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
+              <Country>
+                <CountryName>Россия</CountryName>
+                <AdministrativeArea>
+                  <AdministrativeAreaName>Свердловская область</AdministrativeAreaName>
+                  <Locality>
+                    <LocalityName>Екатеринбург</LocalityName>
+                    <Thoroughfare>
+                      <ThoroughfareName>улица Свердлова</ThoroughfareName>
+                      <Premise>
+                        <PremiseNumber>27</PremiseNumber>
+                      </Premise>
+                    </Thoroughfare>
+                  </Locality>
+                </AdministrativeArea>
+              </Country>
+            </AddressDetails>
+          </GeocoderMetaData>
+        </metaDataProperty>
+        <boundedBy xmlns="http://www.opengis.net/gml">
+          <Envelope>
+            <lowerCorner>60.599720 56.852332</lowerCorner>
+            <upperCorner>60.607931 56.856830</upperCorner>
+          </Envelope>
+        </boundedBy>
+        <Point xmlns="http://www.opengis.net/gml">
+          <pos>60.603826 56.854581</pos>
+        </Point>
+      </GeoObject>
+    </featureMember>
+  </GeoObjectCollection>
+</ymaps>
+""".encode('utf8')
+
+UNKNOWN_ADDRESS = u'''<?xml version="1.0" encoding="utf-8"?>
+<ymaps xmlns="http://maps.yandex.ru/ymaps/1.x" xmlns:x="http://www.yandex.ru/xscript">
+  <GeoObjectCollection>
+    <metaDataProperty xmlns="http://www.opengis.net/gml">
+      <GeocoderResponseMetaData xmlns="http://maps.yandex.ru/geocoder/1.x">
+        <request>Екатеринбург, Свердлова 87876</request>
+        <found>0</found>
+        <results>10</results>
+      </GeocoderResponseMetaData>
+    </metaDataProperty>
+  </GeoObjectCollection>
+</ymaps>
+'''.encode('utf8')
+
+class GeocodeParsingTest(TestCase):
+
+    def test_parsing(self):
+        self.assertEqual(_parse_response(RESPONSE), [u'60.603826', u'56.854581'])
+
+    def test_unknown(self):
+        self.assertEqual(_parse_response(UNKNOWN_ADDRESS), (None, None,))

yandex_maps/utils.py

 #coding: utf-8
-
-from BeautifulSoup import BeautifulSoup
-import urllib
+import xml.dom.minidom
+import urllib2
 from django.utils.http import urlencode
 
 def get_map_url(API_key, longtitude, latitude, zoom, width, height):
 def geocode(API_key, address):
     url = u'http://geocode-maps.yandex.ru/1.x/?'
     params = urlencode({'geocode':address,'key':API_key})
-
     try:
-        response = urllib.urlopen(url+params).read()
+        response = urllib2.urlopen(url+params).read()
     except IOError:
         return (None, None,)
+    return _parse_response(response)
 
+def _parse_response(response):
     try:
-        data = BeautifulSoup(response).find('pos').string.split()
-    except AttributeError:
-        data = (None,None,)
-    return data
+        dom = xml.dom.minidom.parseString(response)
+        pos_elem = dom.getElementsByTagName('pos')[0]
+        pos_data = pos_elem.childNodes[0].data
+        return pos_data.split()
+    except IndexError:
+        return None, None

yandex_maps_tests/settings.py

 sys.path.insert(0, os.path.abspath(os.path.join(PROJECT_ROOT, '..')))
 
 DATABASE_ENGINE = 'sqlite3'
+DATABASE_NAME = ':memory:'
 ROOT_URLCONF = 'urls'
 TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, 'templates'),)